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

Phar::mapPhar('phpstan.phar');

require 'phar://phpstan.phar/bin/phpstan';

__HALT_COMPILER(); ?>
~-                  bin/phpstan  x\  '         conf/config.level2.neon  x\  zl         conf/config.level3.neon  x\  ö         conf/config.level4.neon  x\  \LӐ         conf/config.neonG  x\G  	hж         conf/config.levelmax.neon    x\    /         conf/bleedingEdge.neon   x\            conf/config.level5.neonv   x\v   <ض         conf/config.level6.neonX   x\X   E         conf/config.level7.neonC   x\C   ^         conf/config.level0.neonD  x\D  u˶         conf/config.level1.neon   x\   o=         vendor/autoload.php  x\        *   vendor/phpstan/phpdoc-parser/composer.json  x\        0   vendor/phpstan/phpdoc-parser/src/Lexer/Lexer.php  x\  %3ڶ      ;   vendor/phpstan/phpdoc-parser/src/Parser/ParserException.php  x\  Q      8   vendor/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php4  x\4  ]      ;   vendor/phpstan/phpdoc-parser/src/Parser/ConstExprParser.phpR  x\R  Hh      6   vendor/phpstan/phpdoc-parser/src/Parser/TypeParser.php*#  x\*#  q      9   vendor/phpstan/phpdoc-parser/src/Parser/TokenIterator.phpt  x\t  X      D   vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.php  x\  0p      B   vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.phpi  x\i  }      B   vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagValueNode.php   x\   =E      >   vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTextNode.phpt  x\t  @ƶ      :   vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocNode.php  x\  R      C   vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.php  x\  oŉG      B   vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.phpi  x\i  ()      K   vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php9  x\9  ~jI      C   vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.phpD  x\D        ?   vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.php  x\  ].      =   vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php  x\  Cf      D   vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php  x\   ~      ?   vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocChildNode.php   x\   ,6      A   vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.php  x\  ϶      B   vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php  x\  3z      F   vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.php  x\  ht      A   vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstFetchNode.php  x\  >ap      E   vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php  x\  s4      @   vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNode.php   x\   I?      F   vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprStringNode.php  x\  5%      D   vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprTrueNode.php   x\   CҶ      G   vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.php  x\        E   vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFalseNode.php   x\   C`      I   vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayItemNode.php  x\  {~	      D   vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNullNode.php   x\   Ĵж      E   vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFloatNode.php  x\  /      -   vendor/phpstan/phpdoc-parser/src/Ast/Node.php   x\   Զ      ;   vendor/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php  x\  YW$      B   vendor/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php  x\  yiƟ      @   vendor/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.phpm  x\m  rبԶ      G   vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.phpu  x\u  ö      >   vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php0  x\0  }      6   vendor/phpstan/phpdoc-parser/src/Ast/Type/TypeNode.php   x\   Cƶ      :   vendor/phpstan/phpdoc-parser/src/Ast/Type/ThisTypeNode.php   x\   @      >   vendor/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php  x\  I      =   vendor/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.phpJ  x\J        ;   vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php  x\  a      3   vendor/jean85/pretty-package-versions/composer.json  x\  $      5   vendor/jean85/pretty-package-versions/src/Version.php  x\  x0      <   vendor/jean85/pretty-package-versions/src/PrettyVersions.php  x\  8+6      (   vendor/dg/composer-cleaner/composer.json  x\  3T2      9   vendor/dg/composer-cleaner/src/ComposerCleaner/Plugin.php  x\  L      :   vendor/dg/composer-cleaner/src/ComposerCleaner/Cleaner.php  x\  1         vendor/nikic/php-parser/LICENSE  x\  *գ      %   vendor/nikic/php-parser/bin/php-parse  x\  뫷      5   vendor/nikic/php-parser/lib/PhpParser/NameContext.phpI(  x\I(  0u      =   vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php  x\  8      5   vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.php  x\  Y      8   vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php$  x\$  㮶      D   vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php  x\  
uJ      B   vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php/"  x\/"  v      I   vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php  x\  oj      D   vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php  x\  jl      0   vendor/nikic/php-parser/lib/PhpParser/Parser.php  x\  PVR      F   vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.phpW   x\W   "      9   vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php   x\   MR      T   vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulatorInterface.phpy  x\y  (      M   vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php  x\  ҉      W   vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php  x\  UL      5   vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.phph   x\h   y      @   vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php  x\  h؊      1   vendor/nikic/php-parser/lib/PhpParser/Builder.php   x\         <   vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.phpG&  x\G&  YҶ      ;   vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php/  x\/        9   vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php  x\  '>;      L   vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php  x\  k      >   vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.phpa  x\a  n(      4   vendor/nikic/php-parser/lib/PhpParser/NodeDumper.phph  x\h  _ж      8   vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php  x\  ¶      7   vendor/nikic/php-parser/lib/PhpParser/ParserFactory.phpY  x\Y  _h      7   vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php  x\  f1      9   vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php  x\  i2c      5   vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php x\ WX      5   vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php: x\: ){?0      6   vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php  x\  3k      .   vendor/nikic/php-parser/lib/PhpParser/Node.php  x\  ꦶ      ?   vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php  x\  8u      A   vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php  x\  ׫      5   vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php  x\  Ϙ      /   vendor/nikic/php-parser/lib/PhpParser/Error.php  x\  %b&      1   vendor/nikic/php-parser/lib/PhpParser/Comment.php  x\  C׶      /   vendor/nikic/php-parser/lib/PhpParser/Lexer.php;  x\;  +P+#      6   vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php2  x\2  L      >   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php  x\  I      :   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php  x\  vٍw      ;   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php  x\  g      >   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php  x\  .%      <   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php  x\  3s      Q   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.phpk  x\k  0      L   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.phpR  x\R  Ŷ      :   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.phpS  x\S  %      :   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php  x\        :   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php  x\  c      D   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php  x\          9   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php  x\  6ƶ      =   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php  x\  9      9   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.phpg  x\g  t      =   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php  x\        ?   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php-  x\-  j      :   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php  x\  e{9      F   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php  x\  fs6Ķ      <   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php  x\  u1      >   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.phpX  x\X  v      9   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php  x\  E}      :   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.phpK  x\K  ս      @   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php  x\  c¾      B   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php  x\  U      9   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php  x\  x      ;   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php  x\  c	      ;   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php  x\  p-      <   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php5  x\5  A1;      9   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php  x\  C~      <   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php  x\  m&      <   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php  x\  49      :   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php  x\  eۋY      7   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php@  x\@  ؓnȶ      :   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php  x\  !      =   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php  x\  {4      ;   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php;  x\;  .!:      <   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php  x\  (B      8   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php9  x\9  r`      7   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.phpH  x\H  si      <   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php'  x\'  cq      =   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.phpC  x\C  Da      8   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.phpl  x\l  hO      >   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php  x\  c      >   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.phpb  x\b  =$=      ;   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.phpO  x\O  7      7   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php;  x\;  "      :   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.phpv  x\v  E      ;   vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php  x\  >      9   vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.php  x\  2      4   vendor/nikic/php-parser/lib/PhpParser/Node/Param.php  x\  #      <   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php  x\  Wۨ      9   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php  x\  	5      =   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php  x\  (l      >   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php  x\  7      8   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.phpQ  x\Q  y~      <   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php  x\  yLO4      G   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php&  x\&  Ob      <   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php  x\  hL      :   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php  x\  6      :   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php  x\  Җ
L      >   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php  x\  J      =   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php  x\  /+      ;   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.phpk	  x\k	  y6      =   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php   x\         @   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php   x\   o      ?   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php  x\  V      @   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php   x\   %}      ?   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php   x\   DF7      >   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php   x\   ~      ?   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php   x\   2      ;   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php  x\  e       >   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php  x\  \vc      C   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php  x\  $      >   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php  x\  Lն      A   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php  x\        A   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.phpw  x\w  -Ͷ      9   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php  x\    ̶      A   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.phpm  x\m  tؗ      >   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php  x\  F
      A   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php  x\  FUkv      A   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php   x\         G   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php  x\  ϶      @   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php   x\   ,Ѱ-      @   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php   x\         F   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php  x\  B9      B   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php   x\   Z      @   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php   x\   ۯ      @   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php   x\   h'      C   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php   x\   隆      F   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php  x\  'ɶ      G   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php  x\  J      E   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php  x\  Wx(      G   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php  x\  C޶      A   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.phpI  x\I        D   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.phpO  x\O  C8Z      F   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.phpT  x\T  .'Z      F   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.phpU  x\U  KW      D   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.phpO  x\O  Ӷ      G   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.phpV  x\V  i7      F   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.phpT  x\T  UĶ      G   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.phpW  x\W  "Rw      B   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.phpL  x\L  
      I   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php[  x\[  p(鉶      K   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php^  x\^  k      G   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.phpV  x\V  GZö      @   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.phpG  x\G  )      G   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.phpW  x\W  a      @   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.phpG  x\G        F   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.phpS  x\S  Kۭ      B   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.phpK  x\K  HW      F   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.phpU  x\U  ؼ      K   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php^  x\^  Z%<      @   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.phpH  x\H  4#      @   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.phpG  x\G        C   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.phpM  x\M  4.ȶ      F   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.phpT  x\T  X;      G   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.phpU  x\U  l=      E   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.phpR  x\R   qy      E   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.phpR  x\R  4      G   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.phpU  x\U   =      :   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php7  x\7  c#u      ;   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php  x\  |      9   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php  x\  aL      =   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php  x\  s      ;   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php  x\  1      :   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php  x\  /
      8   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php  x\  |*a      :   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php|  x\|  Z;9      9   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php  x\  >      <   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php  x\  t      ?   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.phpi  x\i  U      <   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.phpj  x\j  ̄ك      >   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php  x\         :   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php  x\  G!      :   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php  x\  CHD      =   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php  x\  u2^      :   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php*  x\*  Ŷ      =   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.phph  x\h  ^Ո      :   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php  x\  6      >   vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php  x\  #      3   vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php   x\   \1)y      5   vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.phps   x\s   uQ      5   vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php  x\  i      ;   vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php  x\   qx      <   vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php  x\  ħJ      B   vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php  x\  !      @   vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php  x\  T.      3   vendor/nikic/php-parser/lib/PhpParser/Node/Name.php  x\  .b      =   vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php'  x\'  {5ն      =   vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.phpI  x\I  E@0      K   vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.phpg  x\g  )}      G   vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php[  x\[  PQj      D   vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.phpT  x\T  s      E   vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.phpW  x\W  ܠu-      G   vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php]  x\]  {      J   vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.phpd  x\d  hoJ      E   vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.phpW  x\W  6      G   vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php[  x\[        @   vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.phpc  x\c  Ȱo      =   vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php	  x\	  `      H   vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php  x\  '      >   vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php  x\  Jֶ      3   vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php   x\   ~y      2   vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php+  x\+  NK¶      4   vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php	  x\	  rCն      7   vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php'  x\'  k      <   vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.phpK  x\K  A      :   vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php{  x\{  n      8   vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php  x\        7   vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php	  x\	  {      D   vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php  x\  H      8   vendor/nikic/php-parser/lib/PhpParser/Builder/Method.phpt  x\t  Lk;      <   vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php  x\  SY      :   vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php  x\  5ȶ      =   vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php  x\  g      ;   vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php  x\  '      6   vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php  x\  σɶ      >   vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php  x\  Ι-      8   vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php*  x\*  GȮ      ?   vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php  x\  k܄      @   vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php  x\  J      8   vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php(  x\(  H&      %   vendor/nikic/php-parser/composer.json  x\  !U      '   vendor/composer/autoload_namespaces.php   x\   t!׶      &   vendor/composer/xdebug-handler/LICENSE)  x\)  #;^      ,   vendor/composer/xdebug-handler/composer.json  x\  l      0   vendor/composer/xdebug-handler/src/PhpConfig.php0  x\0  u(      -   vendor/composer/xdebug-handler/src/Status.phpO  x\O  gX      4   vendor/composer/xdebug-handler/src/XdebugHandler.php@C  x\@C  ʕ?      .   vendor/composer/xdebug-handler/src/Process.php  x\  5&ݶ         vendor/composer/LICENSE,  x\,  Vg         vendor/composer/ClassLoader.phpn4  x\n4  ;      !   vendor/composer/autoload_psr4.php  x\  g      %   vendor/composer/autoload_classmap.php x\ #      #   vendor/composer/autoload_static.php x\ j(e      !   vendor/composer/autoload_real.php7  x\7  j<      "   vendor/composer/autoload_files.phpM  x\M  +N`         vendor/nette/di/license.md
  x\
  .<         vendor/nette/di/composer.json  x\  gx      $   vendor/nette/di/src/DI/Container.php%  x\%  l.      #   vendor/nette/di/src/DI/Resolver.phpa  x\a  YHce      +   vendor/nette/di/src/DI/DynamicParameter.php  x\  @n&      (   vendor/nette/di/src/DI/Config/Loader.php  x\  n      2   vendor/nette/di/src/DI/Config/DefinitionSchema.php(  x\(  [      5   vendor/nette/di/src/DI/Config/Adapters/PhpAdapter.php,  x\,  hG{      6   vendor/nette/di/src/DI/Config/Adapters/NeonAdapter.phpg  x\g  .л      )   vendor/nette/di/src/DI/Config/Adapter.php  x\  r      )   vendor/nette/di/src/DI/Config/Helpers.php  x\  eg      ,   vendor/nette/di/src/DI/CompilerExtension.php  x\  HX      +   vendor/nette/di/src/DI/ContainerBuilder.php/  x\/  %C      '   vendor/nette/di/src/DI/PhpGenerator.php  x\  `ݶ      8   vendor/nette/di/src/DI/Extensions/ConstantsExtension.php  x\  ѥ7      1   vendor/nette/di/src/DI/Extensions/DIExtension.php  x\  H      9   vendor/nette/di/src/DI/Extensions/ParametersExtension.php  x\  U      5   vendor/nette/di/src/DI/Extensions/SearchExtension.php  x\  b|      2   vendor/nette/di/src/DI/Extensions/PhpExtension.php  x\  9      7   vendor/nette/di/src/DI/Extensions/ServicesExtension.php!  x\!  Ejɵ      8   vendor/nette/di/src/DI/Extensions/DecoratorExtension.php
  x\
        9   vendor/nette/di/src/DI/Extensions/ExtensionsExtension.php  x\  w      5   vendor/nette/di/src/DI/Extensions/InjectExtension.php  x\  vH      ,   vendor/nette/di/src/DI/DependencyChecker.php   x\   y-y      %   vendor/nette/di/src/DI/Autowiring.php,  x\,  +V      "   vendor/nette/di/src/DI/Helpers.php  x\  >      %   vendor/nette/di/src/DI/exceptions.php  x\         9   vendor/nette/di/src/DI/Definitions/AccessorDefinition.php  x\  aq\      8   vendor/nette/di/src/DI/Definitions/LocatorDefinition.php
  x\
  ܍h      8   vendor/nette/di/src/DI/Definitions/ServiceDefinition.php!  x\!  :      8   vendor/nette/di/src/DI/Definitions/FactoryDefinition.php^+  x\^+  8      0   vendor/nette/di/src/DI/Definitions/Reference.php  x\  ZRG      1   vendor/nette/di/src/DI/Definitions/Definition.php)  x\)  7$F      0   vendor/nette/di/src/DI/Definitions/Statement.php  x\  n\϶      9   vendor/nette/di/src/DI/Definitions/ImportedDefinition.php"  x\"  ۚ
ɶ      *   vendor/nette/di/src/DI/ContainerLoader.php  x\  B      #   vendor/nette/di/src/DI/Compiler.phpv'  x\v'  [0?      6   vendor/nette/di/src/Bridges/DITracy/ContainerPanel.php	  x\	  &nf^      F   vendor/nette/di/src/Bridges/DITracy/templates/ContainerPanel.tab.phtml  x\   QJ      H   vendor/nette/di/src/Bridges/DITracy/templates/ContainerPanel.panel.phtml  x\  -      %   vendor/nette/di/src/compatibility.phpV  x\V  <      !   vendor/nette/bootstrap/license.md
  x\
  .<      $   vendor/nette/bootstrap/composer.json  x\  )DL      5   vendor/nette/bootstrap/src/Bootstrap/Configurator.php	*  x\	*  ж      %   vendor/nette/php-generator/license.md
  x\
  .<      (   vendor/nette/php-generator/composer.json  x\        8   vendor/nette/php-generator/src/PhpGenerator/Constant.php  x\  4      7   vendor/nette/php-generator/src/PhpGenerator/Factory.php  x\  PW      :   vendor/nette/php-generator/src/PhpGenerator/PsrPrinter.php  x\  m      :   vendor/nette/php-generator/src/PhpGenerator/PhpLiteral.php  x\  0      7   vendor/nette/php-generator/src/PhpGenerator/PhpFile.php  x\  YBE      <   vendor/nette/php-generator/src/PhpGenerator/PhpNamespace.php  x\  [	$      C   vendor/nette/php-generator/src/PhpGenerator/Traits/CommentAware.php  x\        F   vendor/nette/php-generator/src/PhpGenerator/Traits/VisibilityAware.php  x\  C%      @   vendor/nette/php-generator/src/PhpGenerator/Traits/NameAware.php  x\        C   vendor/nette/php-generator/src/PhpGenerator/Traits/FunctionLike.php  x\  i|      7   vendor/nette/php-generator/src/PhpGenerator/Closure.php9  x\9  Ԋ      6   vendor/nette/php-generator/src/PhpGenerator/Method.php   x\         9   vendor/nette/php-generator/src/PhpGenerator/ClassType.php.  x\.        8   vendor/nette/php-generator/src/PhpGenerator/Property.php  x\  D$.      >   vendor/nette/php-generator/src/PhpGenerator/GlobalFunction.php  x\  aXu      7   vendor/nette/php-generator/src/PhpGenerator/Helpers.php#  x\#  FF      7   vendor/nette/php-generator/src/PhpGenerator/Printer.php #  x\ #        9   vendor/nette/php-generator/src/PhpGenerator/Parameter.phpM  x\M  L+         vendor/nette/utils/license.md
  x\
  .<          vendor/nette/utils/composer.json^  x\^  ?\      )   vendor/nette/utils/src/Utils/DateTime.php$  x\$  }9      ,   vendor/nette/utils/src/Utils/StaticClass.php  x\  8      *   vendor/nette/utils/src/Utils/ArrayList.php
  x\
  S6      ,   vendor/nette/utils/src/Utils/IHtmlString.phpF  x\F  ;hp      %   vendor/nette/utils/src/Utils/Json.php  x\  9-      *   vendor/nette/utils/src/Utils/Paginator.php  x\  `jKV      '   vendor/nette/utils/src/Utils/Arrays.phpc   x\c   .l       +   vendor/nette/utils/src/Utils/FileSystem.php  x\  ?      *   vendor/nette/utils/src/Utils/ArrayHash.php  x\  V1      .   vendor/nette/utils/src/Utils/ObjectHelpers.phpb  x\b        +   vendor/nette/utils/src/Utils/Reflection.php'  x\'  B      (   vendor/nette/utils/src/Utils/Strings.phpZ=  x\Z=  @R      '   vendor/nette/utils/src/Utils/Random.php  x\        ,   vendor/nette/utils/src/Utils/ITranslator.php  x\  z^      ,   vendor/nette/utils/src/Utils/SmartObject.php^  x\^  TJԶ      %   vendor/nette/utils/src/Utils/Html.php9  x\9  ;\      +   vendor/nette/utils/src/Utils/Validators.php[(  x\[(  J      ,   vendor/nette/utils/src/Utils/ObjectMixin.phpO  x\O  |F      +   vendor/nette/utils/src/Utils/exceptions.php?  x\?  k
R      )   vendor/nette/utils/src/Utils/Callback.php  x\  %~      &   vendor/nette/utils/src/Utils/Image.phpT  x\T  1S      +   vendor/nette/utils/src/Iterators/Mapper.php  x\  h9      4   vendor/nette/utils/src/Iterators/CachingIterator.php   x\         $   vendor/nette/robot-loader/license.md
  x\
  .<      '   vendor/nette/robot-loader/composer.jsone  x\e        9   vendor/nette/robot-loader/src/RobotLoader/RobotLoader.php7  x\7  {^         vendor/nette/schema/license.md
  x\
  .<      !   vendor/nette/schema/composer.json  x\  O      )   vendor/nette/schema/src/Schema/Expect.php*  x\*        3   vendor/nette/schema/src/Schema/DynamicParameter.php   x\   ϵ      6   vendor/nette/schema/src/Schema/ValidationException.php  x\  l`      0   vendor/nette/schema/src/Schema/Elements/Type.php  x\  k{      5   vendor/nette/schema/src/Schema/Elements/Structure.phpY  x\Y  V      0   vendor/nette/schema/src/Schema/Elements/Base.php  x\  fX      1   vendor/nette/schema/src/Schema/Elements/AnyOf.php  x\  F      *   vendor/nette/schema/src/Schema/Context.php  x\  ޖ      ,   vendor/nette/schema/src/Schema/Processor.php	  x\	  6&L      )   vendor/nette/schema/src/Schema/Schema.php  x\  J
y      *   vendor/nette/schema/src/Schema/Helpers.php4
  x\4
  wnö         vendor/nette/finder/license.md
  x\
  .<      !   vendor/nette/finder/composer.json  x\  3讶      (   vendor/nette/finder/src/Utils/Finder.php*  x\*  pf         vendor/nette/neon/license.md
  x\
  .<         vendor/nette/neon/composer.json  x\  i<QK      &   vendor/nette/neon/src/Neon/Encoder.php
  x\
  \Ͷ      &   vendor/nette/neon/src/Neon/Decoder.php8  x\8  +bV      (   vendor/nette/neon/src/Neon/Exception.php;  x\;  E6!      %   vendor/nette/neon/src/Neon/Entity.php  x\  q      #   vendor/nette/neon/src/Neon/Neon.php{  x\{  ,Ѷ         vendor/nette/neon/src/neon.php  x\  sP      (   vendor/ocramius/package-versions/LICENSE!  x\!        .   vendor/ocramius/package-versions/composer.json  x\  I      A   vendor/ocramius/package-versions/src/PackageVersions/Versions.php	  x\	  zਸ਼      I   vendor/ocramius/package-versions/src/PackageVersions/FallbackVersions.php
  x\
  YE      B   vendor/ocramius/package-versions/src/PackageVersions/Installer.phpH  x\H           vendor/psr/log/LICENSE=  x\=  pO      /   vendor/psr/log/Psr/Log/LoggerAwareInterface.php`  x\`  l      #   vendor/psr/log/Psr/Log/LogLevel.phpP  x\P  Ļ      3   vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php  x\  _Զ      *   vendor/psr/log/Psr/Log/Test/TestLogger.php  x\  .6r      +   vendor/psr/log/Psr/Log/LoggerAwareTrait.php  x\  cݶ      3   vendor/psr/log/Psr/Log/InvalidArgumentException.phpw   x\w   }      %   vendor/psr/log/Psr/Log/NullLogger.php  x\  2;      *   vendor/psr/log/Psr/Log/LoggerInterface.php  x\  42j      &   vendor/psr/log/Psr/Log/LoggerTrait.php.  x\.        )   vendor/psr/log/Psr/Log/AbstractLogger.php@  x\@  ܰ         vendor/psr/log/composer.jsonp  x\p  0u      %   vendor/symfony/finder/SplFileInfo.php  x\  N      5   vendor/symfony/finder/Comparator/NumberComparator.phpm
  x\m
        /   vendor/symfony/finder/Comparator/Comparator.php  x\  N      3   vendor/symfony/finder/Comparator/DateComparator.php  x\  /          vendor/symfony/finder/Finder.phpR  x\R  c~         vendor/symfony/finder/LICENSE)  x\)  Ƕ      "   vendor/symfony/finder/CHANGELOG.md  x\  /!         vendor/symfony/finder/Glob.php  x\  "         vendor/symfony/finder/README.md  x\  #L      <   vendor/symfony/finder/Iterator/FilecontentFilterIterator.php  x\  0      =   vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php  x\  )f      :   vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php  x\  9S      9   vendor/symfony/finder/Iterator/FilenameFilterIterator.php+  x\+        :   vendor/symfony/finder/Iterator/DateRangeFilterIterator.php	  x\	  5j      7   vendor/symfony/finder/Iterator/CustomFilterIterator.php7  x\7  eV      =   vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php  x\        A   vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php	  x\	  ]      3   vendor/symfony/finder/Iterator/SortableIterator.php2
  x\2
  Df      1   vendor/symfony/finder/Iterator/FilterIterator.php  x\  V      ;   vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php  x\  }      9   vendor/symfony/finder/Iterator/FileTypeFilterIterator.php  x\  Yv      5   vendor/symfony/finder/Iterator/PathFilterIterator.php  x\  K      &   vendor/symfony/finder/phpunit.xml.distA  x\A  +      9   vendor/symfony/finder/Exception/AccessDeniedException.php  x\  Gg      6   vendor/symfony/finder/Exception/ExceptionInterface.php8  x\8  /3q      #   vendor/symfony/finder/composer.json-  x\-  悯         vendor/symfony/debug/LICENSE)  x\)  Ƕ      !   vendor/symfony/debug/CHANGELOG.mdA  x\A  gc      -   vendor/symfony/debug/Resources/ext/config.w32Y  x\Y  ¬      6   vendor/symfony/debug/Resources/ext/php_symfony_debug.hK  x\K  oK      1   vendor/symfony/debug/Resources/ext/tests/002.phpt  x\  w~      1   vendor/symfony/debug/Resources/ext/tests/003.phpt*  x\*  G{      3   vendor/symfony/debug/Resources/ext/tests/002_1.phpt  x\  e/      1   vendor/symfony/debug/Resources/ext/tests/001.phpt\
  x\\
  T      ,   vendor/symfony/debug/Resources/ext/README.md  x\  36      ,   vendor/symfony/debug/Resources/ext/config.m4  x\  s_`      2   vendor/symfony/debug/Resources/ext/symfony_debug.c  x\  j         vendor/symfony/debug/Debug.php#  x\#  C[4         vendor/symfony/debug/README.md  x\  F@      M   vendor/symfony/debug/FatalErrorHandler/UndefinedFunctionFatalErrorHandler.php  x\  L8      E   vendor/symfony/debug/FatalErrorHandler/FatalErrorHandlerInterface.php%  x\%  pO      K   vendor/symfony/debug/FatalErrorHandler/UndefinedMethodFatalErrorHandler.php	  x\	        I   vendor/symfony/debug/FatalErrorHandler/ClassNotFoundFatalErrorHandler.php8  x\8  !̶      )   vendor/symfony/debug/ExceptionHandler.phphc  x\hc  q]      )   vendor/symfony/debug/DebugClassLoader.php@  x\@  d^      (   vendor/symfony/debug/BufferingLogger.php%  x\%  B      %   vendor/symfony/debug/phpunit.xml.dist  x\  <      %   vendor/symfony/debug/ErrorHandler.phpy  x\y  KYض      6   vendor/symfony/debug/Exception/FatalThrowableError.phpV  x\V        7   vendor/symfony/debug/Exception/OutOfMemoryException.php  x\  :sv      3   vendor/symfony/debug/Exception/FlattenException.phpc  x\c  n۶      ;   vendor/symfony/debug/Exception/UndefinedMethodException.php7  x\7  h      =   vendor/symfony/debug/Exception/UndefinedFunctionException.php<  x\<  tƶ      6   vendor/symfony/debug/Exception/FatalErrorException.phpv  x\v  5      7   vendor/symfony/debug/Exception/SilencedErrorContext.php&  x\&  ]$      9   vendor/symfony/debug/Exception/ClassNotFoundException.phpM  x\M  Y q      8   vendor/symfony/debug/Exception/ContextErrorException.php_  x\_  Z{.      "   vendor/symfony/debug/composer.json  x\  ~      (   vendor/symfony/console/ConsoleEvents.php4  x\4  U󟛶      &   vendor/symfony/console/Application.phpt  x\t  9z\      /   vendor/symfony/console/Logger/ConsoleLogger.phpp  x\p  ٶ         vendor/symfony/console/LICENSE)  x\)  Ƕ      #   vendor/symfony/console/CHANGELOG.md  x\  d>      9   vendor/symfony/console/Input/StreamableInputInterface.php  x\  uɶ      +   vendor/symfony/console/Input/ArrayInput.php  x\  NӶ      *   vendor/symfony/console/Input/ArgvInput.phph1  x\h1  #      .   vendor/symfony/console/Input/InputArgument.php;  x\;  4.      4   vendor/symfony/console/Input/InputAwareInterface.php  x\  >!g      ,   vendor/symfony/console/Input/InputOption.php  x\  º      0   vendor/symfony/console/Input/InputDefinition.php.  x\.        ,   vendor/symfony/console/Input/StringInput.php 
  x\ 
  HĶ      &   vendor/symfony/console/Input/Input.php  x\        /   vendor/symfony/console/Input/InputInterface.php!  x\!  p      #   vendor/symfony/console/Terminal.phpj  x\j  J      4   vendor/symfony/console/Resources/bin/hiddeninput.exe $  x\ $  v      8   vendor/symfony/console/Output/ConsoleOutputInterface.phpe  x\e  !'˶      0   vendor/symfony/console/Output/BufferedOutput.php  x\        1   vendor/symfony/console/Output/OutputInterface.phpk  x\k  B̯      (   vendor/symfony/console/Output/Output.phpG  x\G  k      /   vendor/symfony/console/Output/ConsoleOutput.php  x\  z      ,   vendor/symfony/console/Output/NullOutput.php]	  x\]	  3Aڶ      .   vendor/symfony/console/Output/StreamOutput.phpF  x\F  Ķ      ,   vendor/symfony/console/Style/OutputStyle.php  x\        -   vendor/symfony/console/Style/SymfonyStyle.php4  x\4  r      /   vendor/symfony/console/Style/StyleInterface.phpU  x\U        2   vendor/symfony/console/Question/ChoiceQuestion.php  x\  L      ,   vendor/symfony/console/Question/Question.php	  x\	  Ş      8   vendor/symfony/console/Question/ConfirmationQuestion.phpp  x\p  |V;}          vendor/symfony/console/README.md  x\  !'k      9   vendor/symfony/console/Formatter/OutputFormatterStyle.php|  x\|        B   vendor/symfony/console/Formatter/OutputFormatterStyleInterface.phpH  x\H  gܶ      =   vendor/symfony/console/Formatter/OutputFormatterInterface.php  x\  7      4   vendor/symfony/console/Formatter/OutputFormatter.php  x\  HlY      >   vendor/symfony/console/Formatter/OutputFormatterStyleStack.php>  x\>  Q/      ?   vendor/symfony/console/CommandLoader/CommandLoaderInterface.php  x\  ʹ      ?   vendor/symfony/console/CommandLoader/ContainerCommandLoader.php:  x\:  
u|      =   vendor/symfony/console/CommandLoader/FactoryCommandLoader.php  x\        4   vendor/symfony/console/Descriptor/TextDescriptor.php6  x\6  SԘ      <   vendor/symfony/console/Descriptor/ApplicationDescription.php  x\  ù       3   vendor/symfony/console/Descriptor/XmlDescriptor.php]'  x\]'  ,q      9   vendor/symfony/console/Descriptor/DescriptorInterface.php>  x\>  "\      0   vendor/symfony/console/Descriptor/Descriptor.phpb  x\b  I      4   vendor/symfony/console/Descriptor/JsonDescriptor.php  x\  kX      8   vendor/symfony/console/Descriptor/MarkdownDescriptor.php  x\  ƢE      /   vendor/symfony/console/Tester/CommandTester.php  x\  ^      3   vendor/symfony/console/Tester/ApplicationTester.php  x\  {U      '   vendor/symfony/console/phpunit.xml.dist  x\  mG      0   vendor/symfony/console/Command/LockableTrait.php  x\  S      .   vendor/symfony/console/Command/HelpCommand.php  x\  ]W      .   vendor/symfony/console/Command/ListCommand.php`  x\`  j      *   vendor/symfony/console/Command/Command.phpCQ  x\CQ  	W4      ,   vendor/symfony/console/Helper/TableStyle.php  x\  _p      7   vendor/symfony/console/Helper/SymfonyQuestionHelper.php  x\  ix      1   vendor/symfony/console/Helper/HelperInterface.php  x\  R      +   vendor/symfony/console/Helper/TableCell.php  x\  ɶ      /   vendor/symfony/console/Helper/ProcessHelper.php  x\  Έ      0   vendor/symfony/console/Helper/TableSeparator.phpb  x\b  C      1   vendor/symfony/console/Helper/FormatterHelper.php,  x\,  PeN      -   vendor/symfony/console/Helper/ProgressBar.phpE  x\E  *i      6   vendor/symfony/console/Helper/DebugFormatterHelper.php  x\  K      +   vendor/symfony/console/Helper/HelperSet.php
  x\
  b瞶      2   vendor/symfony/console/Helper/InputAwareHelper.php  x\  @11i      0   vendor/symfony/console/Helper/QuestionHelper.phpTI  x\TI  h      (   vendor/symfony/console/Helper/Helper.php0  x\0  idP      '   vendor/symfony/console/Helper/Table.phpU  x\U  9       3   vendor/symfony/console/Helper/ProgressIndicator.php   x\   և      2   vendor/symfony/console/Helper/DescriptorHelper.phpS  x\S        D   vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.phpz  x\z  Զ      3   vendor/symfony/console/Exception/LogicException.php  x\  8      ;   vendor/symfony/console/Exception/InvalidOptionException.phpN  x\N  [u      7   vendor/symfony/console/Exception/ExceptionInterface.php  x\  tj      5   vendor/symfony/console/Exception/RuntimeException.php   x\   N#      =   vendor/symfony/console/Exception/InvalidArgumentException.php  x\  pS&      =   vendor/symfony/console/Exception/CommandNotFoundException.php  x\        6   vendor/symfony/console/Event/ConsoleTerminateEvent.phpS  x\S  \      2   vendor/symfony/console/Event/ConsoleErrorEvent.phpQ
  x\Q
  MA      4   vendor/symfony/console/Event/ConsoleCommandEvent.phpr  x\r  p      -   vendor/symfony/console/Event/ConsoleEvent.php  x\  j      6   vendor/symfony/console/Event/ConsoleExceptionEvent.php  x\  3      $   vendor/symfony/console/composer.json  x\  8'̶      6   vendor/symfony/console/EventListener/ErrorListener.php  x\  K      (   vendor/symfony/polyfill-mbstring/LICENSE)  x\)  \      @   vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.phpA  x\A  b      F   vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php  x\  gn      @   vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.phpA  x\A  ,6      -   vendor/symfony/polyfill-mbstring/Mbstring.phpPg  x\Pg  Y      .   vendor/symfony/polyfill-mbstring/bootstrap.phpv  x\v  Ƕ      *   vendor/symfony/polyfill-mbstring/README.mds  x\s  !wg      .   vendor/symfony/polyfill-mbstring/composer.json  x\  oY      !   src/PhpDoc/TypeStringResolver.php  x\  7(      -   src/PhpDoc/TypeNodeResolverAwareExtension.php   x\   :v      #   src/PhpDoc/PhpDocStringResolver.php  x\           src/PhpDoc/PhpDocBlock.php  x\  ƠZ      &   src/PhpDoc/TypeNodeResolverFactory.phpe  x\e  5      "   src/PhpDoc/ResolvedPhpDocBlock.php
  x\
  b_      (   src/PhpDoc/TypeNodeResolverExtension.php  x\  zfe         src/PhpDoc/TypeNodeResolver.php6  x\6           src/PhpDoc/Tag/ThrowsTag.php%  x\%  	         src/PhpDoc/Tag/MethodTag.php%  x\%  l      %   src/PhpDoc/Tag/MethodTagParameter.phpu  x\u  w         src/PhpDoc/Tag/ParamTag.php  x\  bz         src/PhpDoc/Tag/VarTag.php  x\  E         src/PhpDoc/Tag/PropertyTag.php  x\  '%         src/PhpDoc/Tag/ReturnTag.php%  x\%  u          src/PhpDoc/Tag/DeprecatedTag.php  x\  6f      !   src/PhpDoc/PhpDocNodeResolver.php#  x\#  ߁         src/Broker/BrokerFactory.php?  x\?  ᧩      (   src/Broker/ClassAutoloadingException.php  x\  a         src/Broker/Broker.php-Z  x\-Z  M      (   src/Broker/FunctionNotFoundException.php$  x\$  `      %   src/Broker/ClassNotFoundException.php  x\  ZV      '   src/Broker/AnonymousClassNameHelper.php  x\   ה         src/Cache/FileCacheStorage.php  x\  f.|          src/Cache/MemoryCacheStorage.php)  x\)  u!ö         src/Cache/Cache.phpm  x\m  JX         src/Cache/CacheStorage.phpN  x\N  ٙ      %   src/File/SimpleRelativePathHelper.php  x\  Th4         src/File/FileFinder.phpY  x\Y  j         src/File/FileExcluder.php  x\  \         src/File/FileHelper.phpj  x\j  nh)         src/File/FileFinderResult.phpZ  x\Z         $   src/File/FuzzyRelativePathHelper.php  x\  I         src/File/RelativePathHelper.php   x\   Ƭ      "   src/File/PathNotFoundException.php  x\  P      ?   src/Internal/UnionTypeGetInternalDynamicReturnTypeExtension.php6  x\6        4   src/Internal/ContainerDynamicReturnTypeExtension.php  x\  ;o6      6   src/Internal/ScopeIsInClassTypeSpecifyingExtension.php	  x\	  y_      #   src/Dependency/DependencyDumper.php  x\  WWb      %   src/Dependency/DependencyResolver.php?-  x\?-  O         src/Parser/Parser.phpy  x\y  A\         src/Parser/DirectParser.php  x\  V׶      *   src/Parser/FunctionCallStatementFinder.php  x\  И      $   src/Parser/ParserErrorsException.php  x\  @ k         src/Parser/CachedParser.php  x\  *         src/Testing/LevelsTestCase.php  x\  G         src/Testing/RuleTestCase.php  x\  oR         src/Testing/TestCase.php6  x\6        8   src/Type/StringAlwaysAcceptingObjectWithToStringType.php  x\  +V         src/Type/TypeWithClassName.php   x\   
!         src/Type/ConstantScalarType.php   x\   󿜌         src/Type/Type.php  x\  cɶ      3   src/Type/DynamicStaticMethodReturnTypeExtension.php8  x\8  /         src/Type/ResourceType.phpC  x\C  H{         src/Type/ClosureType.php  x\  K^      -   src/Type/Traits/UndecidedBooleanTypeTrait.php   x\   S      *   src/Type/Traits/MaybeIterableTypeTrait.php  x\  a8      *   src/Type/Traits/MaybeCallableTypeTrait.php  x\  !d臶      2   src/Type/Traits/MaybeOffsetAccessibleTypeTrait.php  x\  3CZ      (   src/Type/Traits/MaybeObjectTypeTrait.php  x\  B      *   src/Type/Traits/FalseyBooleanTypeTrait.php>  x\>  5      +   src/Type/Traits/ConstantScalarTypeTrait.php  x\  N¶      0   src/Type/Traits/NonOffsetAccessibleTypeTrait.php  x\  i      *   src/Type/Traits/TruthyBooleanTypeTrait.php=  x\=        (   src/Type/Traits/NonCallableTypeTrait.php  x\  -7      #   src/Type/Traits/ObjectTypeTrait.phpl  x\l  7La      &   src/Type/Traits/NonObjectTypeTrait.php  x\  e?      (   src/Type/Traits/NonIterableTypeTrait.php  x\  Xm0      -   src/Type/DynamicMethodReturnTypeExtension.php&  x\&  4b         src/Type/ErrorType.php  x\  c,m         src/Type/CompoundTypeHelper.php  x\  boڶ         src/Type/SubtractableType.php  x\        /   src/Type/DynamicFunctionReturnTypeExtension.php  x\  P}         src/Type/VerbosityLevel.php  x\  k۶         src/Type/TypeUtils.php  x\  ֿ鹶      ,   src/Type/FunctionTypeSpecifyingExtension.php  x\  K         src/Type/CompoundType.php   x\   Ƣٖ         src/Type/CommentHelper.phpL  x\L  HC         src/Type/RecursionGuard.phpG  x\G  C         src/Type/ConstantType.php   x\   
         src/Type/BooleanType.php	  x\	  PO         src/Type/NullType.phpG  x\G  wq5         src/Type/TypehintHelper.php  x\  ײ.      *   src/Type/MethodTypeSpecifyingExtension.php  x\  OrQ         src/Type/ArrayType.php$  x\$  n32      <   src/Type/Php/VarExportFunctionDynamicReturnTypeExtension.php  x\  mR      8   src/Type/Php/ArrayKeyFirstDynamicReturnTypeExtension.php  x\  NM      ;   src/Type/Php/JsonThrowOnErrorDynamicReturnTypeExtension.phpo  x\o  &N      8   src/Type/Php/IsObjectFunctionTypeSpecifyingExtension.phpM  x\M  i      >   src/Type/Php/ArrayKeyExistsFunctionTypeSpecifyingExtension.php  x\  =      :   src/Type/Php/SprintfFunctionDynamicReturnTypeExtension.phpI  x\I  ޽      @   src/Type/Php/ArrayPointerFunctionsDynamicReturnTypeExtension.php	  x\	  2q      7   src/Type/Php/DefinedConstantTypeSpecifyingExtension.php1  x\1  Cڮ      6   src/Type/Php/PropertyExistsTypeSpecifyingExtension.php  x\  j1      :   src/Type/Php/IsIterableFunctionTypeSpecifyingExtension.php  x\  cӶ      ;   src/Type/Php/PathinfoFunctionDynamicReturnTypeExtension.phpY  x\Y        /   src/Type/Php/StatDynamicReturnTypeExtension.php	  x\	  &      6   src/Type/Php/DefineConstantTypeSpecifyingExtension.phpI  x\I  U<      <   src/Type/Php/ArrayKeysFunctionDynamicReturnTypeExtension.php  x\  q      9   src/Type/Php/ArgumentBasedFunctionReturnTypeExtension.php  x\  ߶      ,   src/Type/Php/CurlInitReturnTypeExtension.php  x\  T      ;   src/Type/Php/IsCountableFunctionTypeSpecifyingExtension.php  x\  j      6   src/Type/Php/ArrayShiftFunctionReturnTypeExtension.phpA  x\A  \Mζ      :   src/Type/Php/ExplodeFunctionDynamicReturnTypeExtension.php  x\  ᒴ      7   src/Type/Php/IsFloatFunctionTypeSpecifyingExtension.phpZ  x\Z  {Wt      5   src/Type/Php/ArrayFillFunctionReturnTypeExtension.php,
  x\,
  j      =   src/Type/Php/ArrayMergeFunctionDynamicReturnTypeExtension.phpC  x\C  ,d      8   src/Type/Php/IsScalarFunctionTypeSpecifyingExtension.php  x\  xж      7   src/Type/Php/ArrayReduceFunctionReturnTypeExtension.php	  x\	  ʙ      4   src/Type/Php/ArrayMapFunctionReturnTypeExtension.php	  x\	  ?      >   src/Type/Php/ArrayValuesFunctionDynamicReturnTypeExtension.php  x\  Ѷ      1   src/Type/Php/RangeFunctionReturnTypeExtension.php$  x\$  	      4   src/Type/Php/FilterVarDynamicReturnTypeExtension.phpD  x\D  ŏ'      6   src/Type/Php/IsNullFunctionTypeSpecifyingExtension.php-  x\-  ,c      9   src/Type/Php/ArrayFillKeysFunctionReturnTypeExtension.phpz  x\z  6Q3D      3   src/Type/Php/ArrayKeyDynamicReturnTypeExtension.php  x\  9      6   src/Type/Php/IsBoolFunctionTypeSpecifyingExtension.php3  x\3  Pz      2   src/Type/Php/MinMaxFunctionReturnTypeExtension.php  x\  ?      ;   src/Type/Php/ParseUrlFunctionDynamicReturnTypeExtension.php  x\        ?   src/Type/Php/GettimeofdayDynamicFunctionReturnTypeExtension.php  x\        9   src/Type/Php/IsNumericFunctionTypeSpecifyingExtension.phpP  x\P        ;   src/Type/Php/ReplaceFunctionsDynamicReturnTypeExtension.php  x\  E8s      >   src/Type/Php/ArraySearchFunctionDynamicReturnTypeExtension.phpf  x\f  {i.      :   src/Type/Php/IsCallableFunctionTypeSpecifyingExtension.php=  x\=         4   src/Type/Php/StrSplitFunctionReturnTypeExtension.phpN  x\N  VV      5   src/Type/Php/MicrotimeFunctionReturnTypeExtension.php;  x\;  js>      :   src/Type/Php/DioStatDynamicFunctionReturnTypeExtension.phpS  x\S   S5      A   src/Type/Php/GetParentClassDynamicFunctionReturnTypeExtension.php  x\        5   src/Type/Php/StrtotimeFunctionReturnTypeExtension.php-  x\-  a?~      A   src/Type/Php/VersionCompareFunctionDynamicReturnTypeExtension.php  x\  R      A   src/Type/Php/ArrayFilterFunctionReturnTypeReturnTypeExtension.phpJ  x\J  Βq      6   src/Type/Php/ArraySliceFunctionReturnTypeExtension.php  x\  S\n      B   src/Type/Php/TypeSpecifyingFunctionsDynamicReturnTypeExtension.php
  x\
  -      5   src/Type/Php/CountFunctionTypeSpecifyingExtension.php  x\  >      4   src/Type/Php/ArrayPopFunctionReturnTypeExtension.phpV  x\V  kն      3   src/Type/Php/IsAFunctionTypeSpecifyingExtension.php  x\  &|      /   src/Type/Php/MbFunctionsReturnTypeExtension.php  x\  (       <   src/Type/Php/IsSubclassOfFunctionTypeSpecifyingExtension.php  x\  n      6   src/Type/Php/AssertFunctionTypeSpecifyingExtension.php  x\  Gi޶      7   src/Type/Php/InArrayFunctionTypeSpecifyingExtension.php  x\  le      2   src/Type/Php/HrtimeFunctionReturnTypeExtension.php  x\  ۬      4   src/Type/Php/MethodExistsTypeSpecifyingExtension.php  x\  ۉ      7   src/Type/Php/ArrayKeyLastDynamicReturnTypeExtension.php-  x\-  Uﻶ      1   src/Type/Php/CountFunctionReturnTypeExtension.phpg  x\g  3      5   src/Type/Php/IsIntFunctionTypeSpecifyingExtension.php[  x\[  WgT      7   src/Type/Php/IsArrayFunctionTypeSpecifyingExtension.php  x\  t%Ҷ      8   src/Type/Php/IsStringFunctionTypeSpecifyingExtension.php5  x\5  霶      :   src/Type/Php/IsResourceFunctionTypeSpecifyingExtension.php=  x\=  X         src/Type/ObjectType.php[  x\[        !   src/Type/StaticResolvableType.php  x\  v+H          src/Type/BenevolentUnionType.php  x\  ,,Mx         src/Type/FileTypeMapper.php+  x\+  ]eƶ         src/Type/CallableType.phpV  x\V  +         src/Type/IntegerType.php  x\  Sj         src/Type/UnionTypeHelper.php  x\  T      '   src/Type/NonexistentParentClassType.php  x\  j         src/Type/ThisType.php  x\  ~eF      )   src/Type/Constant/ConstantBooleanType.phpP  x\P  D      0   src/Type/Constant/ConstantArrayTypeAndMethod.php  x\  pI*      2   src/Type/Constant/ConstantScalarToBooleanTrait.php$  x\$  'Q      '   src/Type/Constant/ConstantFloatType.phpX	  x\X	  Z}      '   src/Type/Constant/ConstantArrayType.php>  x\>  ܵ\˶      (   src/Type/Constant/ConstantStringType.php4  x\4  ̇y      .   src/Type/Constant/ConstantArrayTypeBuilder.php^  x\^  N      )   src/Type/Constant/ConstantIntegerType.phpj  x\j        "   src/Type/JustNullableTypeTrait.phpm  x\m  P`         src/Type/UnionType.phpC  x\C  "T         src/Type/NeverType.php  x\  VUMu      0   src/Type/StaticMethodTypeSpecifyingExtension.php  x\  Ҷ         src/Type/StaticType.phpd  x\d  E         src/Type/FloatType.phpY  x\Y  xP         src/Type/CallableTypeHelper.php  x\        ,   src/Type/OperatorTypeSpecifyingExtension.phpv  x\v  $/      #   src/Type/ObjectWithoutClassType.phpu  x\u  @X         src/Type/TypeCombinator.phpP  x\P  joǶ         src/Type/VoidType.phpp  x\p  \w      $   src/Type/Accessory/AccessoryType.php   x\   Iɦ      $   src/Type/Accessory/HasOffsetType.php  x\  }v      (   src/Type/Accessory/NonEmptyArrayType.php  x\  ׾Ƕ      $   src/Type/Accessory/HasMethodType.php  x\  {      &   src/Type/Accessory/HasPropertyType.phpV
  x\V
  Ο         src/Type/IntersectionType.php.  x\.  `1'         src/Type/StringType.php  x\  @(2         src/Type/MixedType.php  x\           src/Type/IterableType.php7  x\7  [9      ,   src/Analyser/TypeSpecifierAwareExtension.php   x\   ]      "   src/Analyser/NodeScopeResolver.php x\ M         src/Analyser/ScopeFactory.php  x\  ?ޤ         src/Analyser/TypeSpecifier.phpGk  x\Gk  KI         src/Analyser/SpecifiedTypes.php
  x\
  ׀A          src/Analyser/OutOfClassScope.php
  x\
  1N      %   src/Analyser/TypeSpecifierFactory.php^  x\^  G         src/Analyser/Scope.php x\ J;v      +   src/Analyser/UndefinedVariableException.php  x\  `J      6   src/Analyser/EnsuredNonNullabilityResultExpression.php  x\  І,      !   src/Analyser/ExpressionResult.php  x\  b      #   src/Analyser/StatementExitPoint.phpG  x\G  [Ejض      #   src/Analyser/VariableTypeHolder.php  x\  3Ӷ         src/Analyser/ScopeContext.php@  x\@  ,)         src/Analyser/Error.phpP  x\P  "t      "   src/Analyser/ExpressionContext.php  x\  1      %   src/Analyser/TypeSpecifierContext.php  x\  8i         src/Analyser/Analyser.php3  x\3  lwȶ         src/Analyser/NameScope.php  x\  ۈn          src/Analyser/StatementResult.phpr
  x\r
  Pض         src/Analyser/IgnoredError.php  x\  Pݶ      ,   src/Analyser/EnsuredNonNullabilityResult.php<  x\<  X§      )   src/Rules/FunctionCallParametersCheck.phpC  x\C  gC         src/Rules/FileRuleError.php   x\   pX      /   src/Rules/PhpDoc/IncompatiblePhpDocTypeRule.php  x\  /޴y      7   src/Rules/PhpDoc/IncompatiblePropertyPhpDocTypeRule.php  x\  Ғ      1   src/Rules/PhpDoc/InvalidThrowsPhpDocValueRule.php9  x\9  J      .   src/Rules/PhpDoc/InvalidPhpDocTagValueRule.phpX  x\X  $"      -   src/Rules/RuleErrors/RuleErrorWithMessage.php  x\  ΅=      4   src/Rules/RuleErrors/RuleErrorWithMessageAndFile.php;  x\;  h^6      4   src/Rules/RuleErrors/RuleErrorWithMessageAndLine.php2  x\2  ^       ;   src/Rules/RuleErrors/RuleErrorWithMessageAndLineAndFile.php  x\  *      '   src/Rules/ClassCaseSensitivityCheck.phpP  x\P        4   src/Rules/Methods/ExistingClassesInTypehintsRule.phpc  x\c        $   src/Rules/Methods/ReturnTypeRule.phpg  x\g  gV      )   src/Rules/Methods/MethodSignatureRule.php  x\  gj      +   src/Rules/Methods/CallStaticMethodsRule.php"  x\"  Ytȯ      %   src/Rules/Methods/CallMethodsRule.php  x\  ]iE      :   src/Rules/Methods/IncompatibleDefaultParameterTypeRule.phpr  x\r  |n1r      1   src/Rules/Regexp/RegularExpressionPatternRule.phpT  x\T  i         src/Rules/RuleLevelHelper.phpp  x\p  @      2   src/Rules/Operators/InvalidIncDecOperationRule.phpo  x\o  B       1   src/Rules/Operators/InvalidUnaryOperationRule.php  x\  M`,      6   src/Rules/Operators/InvalidComparisonOperationRule.php  x\  E      2   src/Rules/Operators/InvalidBinaryOperationRule.php  x\  MXa         src/Rules/Rule.php  x\  f      %   src/Rules/FunctionReturnTypeCheck.php  x\  f:Z         src/Rules/LineRuleError.php   x\         .   src/Rules/Classes/ImpossibleInstanceOfRule.phpv  x\v  Z$&      1   src/Rules/Classes/ExistingClassInTraitUseRule.php  x\  5϶      3   src/Rules/Classes/ExistingClassInInstanceOfRule.php  x\  ޶      '   src/Rules/Classes/ClassConstantRule.php  x\  EwS      ;   src/Rules/Classes/ExistingClassesInInterfaceExtendsRule.php  x\  9      :   src/Rules/Classes/ExistingClassesInClassImplementsRule.php  x\  Ev      '   src/Rules/Classes/InstantiationRule.phpT  x\T  ;      5   src/Rules/Classes/ExistingClassInClassExtendsRule.php|  x\|  CB      5   src/Rules/Classes/UnusedConstructorParametersRule.phpi  x\i  Df      4   src/Rules/Classes/RequireParentConstructCallRule.php  x\  ~b      2   src/Rules/Classes/ClassConstantDeclarationRule.php]  x\]  <ƶ         src/Rules/Cast/PrintRule.php  x\  Xb      2   src/Rules/Cast/InvalidPartOfEncapsedStringRule.php  x\        "   src/Rules/Cast/InvalidCastRule.phpH  x\H  w          src/Rules/Cast/EchoRule.php  x\  >GI         src/Rules/RuleError.php~   x\~   Eڒ      $   src/Rules/Constants/ConstantRule.php  x\  Unk         src/Rules/Registry.php  x\  S	A         src/Rules/ClassNameNodePair.php  x\  fڄ      <   src/Rules/Missing/MissingClosureNativeReturnTypehintRule.php5  x\5  sH      '   src/Rules/Missing/MissingReturnRule.php  x\        &   src/Rules/Exceptions/DeadCatchRule.php  x\  3ȶ      5   src/Rules/Exceptions/CaughtExceptionExistenceRule.php<	  x\<	  vP         src/Rules/RegistryFactory.php  x\  Jy      /   src/Rules/Namespaces/ExistingNamesInUseRule.phpL  x\L  1h      4   src/Rules/Namespaces/ExistingNamesInGroupUseRule.php  x\  _LM         src/Rules/RuleErrorBuilder.php%  x\%  v      -   src/Rules/Properties/AccessPropertiesRule.php  x\  TE      8   src/Rules/Properties/ExistingClassesInPropertiesRule.php
  x\
  `{      +   src/Rules/Properties/PropertyDescriptor.phpl  x\l  _      7   src/Rules/Properties/ReadingWriteOnlyPropertiesRule.php  x\  F}z?      6   src/Rules/Properties/TypesAssignedToPropertiesRule.php
  x\
   Y      B   src/Rules/Properties/DefaultValueTypesAssignedToPropertiesRule.phpF  x\F        3   src/Rules/Properties/AccessStaticPropertiesRule.php  x\  k      5   src/Rules/Properties/AccessPropertiesInAssignRule.php  x\  .с      8   src/Rules/Properties/WritingToReadOnlyPropertiesRule.php
  x\
  B      1   src/Rules/Properties/PropertyReflectionFinder.php  x\  8      ;   src/Rules/Properties/AccessStaticPropertiesInAssignRule.phpG  x\G  w      /   src/Rules/DeadCode/UnreachableStatementRule.php  x\  }ߏ         src/Rules/DeadCode/NoopRule.php  x\  F@޶      4   src/Rules/Variables/VariableCertaintyInIssetRule.php  x\  g      (   src/Rules/Variables/ThisVariableRule.php  x\  W      +   src/Rules/Variables/VariableCloningRule.php  x\  2      %   src/Rules/Variables/ThrowTypeRule.php  x\  OJ      +   src/Rules/Variables/DefinedVariableRule.php  x\  ƶ      A   src/Rules/Variables/DefinedVariableInAnonymousFunctionUseRule.php  x\  	      -   src/Rules/Arrays/AppendedArrayKeyTypeRule.php
  x\
  @      .   src/Rules/Arrays/InvalidKeyInArrayItemRule.php  x\  65      2   src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.phpH  x\H  9,      9   src/Rules/Arrays/OffsetAccessWithoutDimForReadingRule.php  x\  4QW      -   src/Rules/Arrays/OffsetAccessAssignOpRule.php
  x\
  J      /   src/Rules/Arrays/OffsetAccessAssignmentRule.php	  x\	  N!      .   src/Rules/Arrays/AppendedArrayItemTypeRule.php
  x\
  ?i      5   src/Rules/Arrays/DuplicateKeysInLiteralArraysRule.php  x\  ܘh      *   src/Rules/Arrays/AllowedArrayKeysTypes.php8  x\8        9   src/Rules/Arrays/NonexistentOffsetInArrayDimFetchRule.php  x\  1鄶      $   src/Rules/Arrays/DeadForeachRule.php(  x\(  Ȉb@      *   src/Rules/Arrays/IterableInForeachRule.php  x\  k;      4   src/Rules/Functions/CallToFunctionParametersRule.php  x\  q      )   src/Rules/Functions/InnerFunctionRule.phpy  x\y  &      6   src/Rules/Functions/ExistingClassesInTypehintsRule.phpS  x\S  z,B      -   src/Rules/Functions/UnusedClosureUsesRule.php  x\  {      &   src/Rules/Functions/ReturnTypeRule.phpL  x\L  ~a      )   src/Rules/Functions/CallCallablesRule.phpj  x\j  l_      6   src/Rules/Functions/NonExistentDefinedFunctionRule.php  x\  X.      -   src/Rules/Functions/ClosureReturnTypeRule.php  x\  /      =   src/Rules/Functions/ExistingClassesInClosureTypehintsRule.php  x\  b      ,   src/Rules/Functions/PrintfParametersRule.phpc  x\c  @U      5   src/Rules/Functions/CallToNonExistentFunctionRule.php  x\        <   src/Rules/Functions/IncompatibleDefaultParameterTypeRule.php<	  x\<	  ޵E         src/Rules/FoundTypeResult.php/  x\/        @   src/Rules/Comparison/ImpossibleCheckTypeStaticMethodCallRule.php~  x\~  ل(      2   src/Rules/Comparison/UnreachableIfBranchesRule.php#  x\#  }      :   src/Rules/Comparison/ImpossibleCheckTypeMethodCallRule.php	  x\	  "      2   src/Rules/Comparison/ImpossibleCheckTypeHelper.php!  x\!  6{/      9   src/Rules/Comparison/UnreachableTernaryElseBranchRule.php^  x\^  ESb      =   src/Rules/Comparison/StrictComparisonOfDifferentTypesRule.php	  x\	  wO      0   src/Rules/Comparison/IfConstantConditionRule.php  x\  ~r      8   src/Rules/Comparison/BooleanAndConstantConditionRule.php  x\  <!      4   src/Rules/Comparison/ElseIfConstantConditionRule.php  x\  u      4   src/Rules/Comparison/ConstantConditionRuleHelper.php  x\  /s      8   src/Rules/Comparison/BooleanNotConstantConditionRule.php  x\  X      <   src/Rules/Comparison/ImpossibleCheckTypeFunctionCallRule.php  x\  $      7   src/Rules/Comparison/BooleanOrConstantConditionRule.php  x\  NӶ      =   src/Rules/Comparison/TernaryOperatorConstantConditionRule.php  x\  |      &   src/Rules/Generators/YieldTypeRule.phpu
  x\u
  x      *   src/Rules/Generators/YieldFromTypeRule.php  x\  }      -   src/Rules/Generators/YieldInGeneratorRule.php  x\        %   src/Rules/FunctionDefinitionCheck.php(  x\(  Pd      +   src/Rules/UnusedFunctionParametersCheck.php  x\  ['          src/ShouldNotHappenException.php   x\   .         src/AnalysedCodeException.phpq   x\q   !z t      "   src/Command/ErrorsConsoleStyle.phpr  x\r  ^15         src/Command/CommandHelper.phpJH  x\JH  )      1   src/Command/ErrorFormatter/JsonErrorFormatter.php  x\  !f      0   src/Command/ErrorFormatter/RawErrorFormatter.php  x\  Uy      2   src/Command/ErrorFormatter/TableErrorFormatter.php	  x\	  l[      -   src/Command/ErrorFormatter/ErrorFormatter.php#  x\#  TQy      7   src/Command/ErrorFormatter/CheckstyleErrorFormatter.php  x\  	         src/Command/AnalysisResult.phpi  x\i           src/Command/AnalyseCommand.php  x\  "hS      /   src/Command/InceptionNotSuccessfulException.phpz   x\z   e>      '   src/Command/DumpDependenciesCommand.php  x\  6       "   src/Command/AnalyseApplication.php  x\           src/Command/InceptionResult.php	  x\	  -j         src/Node/InClassMethodNode.php  x\  Mt      (   src/Node/ClosureReturnStatementsNode.phpk  x\k  ]         src/Node/ReturnStatement.php  x\  U2ܶ         src/Node/VirtualNode.php   x\   *9T         src/Node/LiteralArrayNode.phps  x\s  0         src/Node/LiteralArrayItem.php  x\  Щ%      %   src/Node/UnreachableStatementNode.php  x\  r䚶         src/Node/ExecutionEndNode.php  x\  JH      *   src/DependencyInjection/RulesExtension.php$  x\$  N      ,   src/DependencyInjection/ContainerFactory.php0  x\0  oS      %   src/DependencyInjection/Container.phpZ  x\Z  v˅      )   src/DependencyInjection/LoaderFactory.php  x\  |VŶ      5   src/DependencyInjection/ParametersSchemaExtension.php  x\  PXF      0   src/DependencyInjection/Nette/NetteContainer.php  x\  +~      4   src/DependencyInjection/ConditionalTagsExtension.php	  x\	  ]      (   src/DependencyInjection/Configurator.php  x\  o`         src/TrinaryLogic.php:  x\:  Hֶ      %   src/Reflection/ParametersAcceptor.php  x\        -   src/Reflection/FunctionVariantWithPhpDocs.php  x\  R      &   src/Reflection/ParameterReflection.phpx  x\x  V      -   src/Reflection/ParametersAcceptorSelector.php
  x\
  B      .   src/Reflection/Dummy/DummyMethodReflection.php	  x\	  h`      0   src/Reflection/Dummy/DummyConstantReflection.php$  x\$  $y      0   src/Reflection/Dummy/DummyPropertyReflection.php  x\  \      4   src/Reflection/SignatureMap/SignatureMapProvider.php  x\  i%J      1   src/Reflection/SignatureMap/FunctionSignature.phpU  x\U  FS      +   src/Reflection/SignatureMap/functionMap.phpM x\M Zw      2   src/Reflection/SignatureMap/ParameterSignature.php  x\  ض      2   src/Reflection/SignatureMap/SignatureMapParser.php  x\  2      "   src/Reflection/ClassReflection.phpT@  x\T@  Y      2   src/Reflection/Native/NativeFunctionReflection.phpk  x\k  t      3   src/Reflection/Native/NativeParameterReflection.phpV  x\V  D      0   src/Reflection/Native/NativeMethodReflection.php?  x\?  "      7   src/Reflection/MissingMethodFromReflectionException.php  x\        8   src/Reflection/PhpDefect/PhpDefectPropertyReflection.php  x\  |      >   src/Reflection/PhpDefect/PhpDefectClassReflectionExtension.php>  x\>  \|d      %   src/Reflection/ConstantReflection.php   x\   au      '   src/Reflection/BrokerAwareExtension.php   x\   [O      ,   src/Reflection/ClassMemberAccessAnswerer.php  x\  h      %   src/Reflection/FunctionReflection.php  x\  nIO      #   src/Reflection/MethodReflection.php|  x\|  cj^      2   src/Reflection/MethodsClassReflectionExtension.phpn  x\n         ,   src/Reflection/Php/PhpFunctionReflection.php  x\  O~      .   src/Reflection/Php/BuiltinMethodReflection.php  x\  e϶      %   src/Reflection/Php/DummyParameter.php  x\  ,      -   src/Reflection/Php/PhpParameterReflection.phpR
  x\R
  y*v      3   src/Reflection/Php/UniversalObjectCrateProperty.phpv  x\v  
      1   src/Reflection/Php/PhpMethodReflectionFactory.php  x\  $+      D   src/Reflection/Php/UniversalObjectCratesClassReflectionExtension.php  x\  L/%      2   src/Reflection/Php/PhpClassReflectionExtension.phpM  x\M  9      ,   src/Reflection/Php/PhpPropertyReflection.php	  x\	        4   src/Reflection/Php/NativeBuiltinMethodReflection.php   x\   L}      8   src/Reflection/Php/PhpMethodFromParserNodeReflection.php  x\  s      ;   src/Reflection/Php/PhpParameterFromParserNodeReflection.phpD
  x\D
  ?      *   src/Reflection/Php/PhpMethodReflection.php2  x\2  /w      :   src/Reflection/Php/PhpFunctionFromParserNodeReflection.php  x\  u      2   src/Reflection/Php/FakeBuiltinMethodReflection.php(  x\(  s      ,   src/Reflection/MethodPrototypeReflection.php  x\  l{      I   src/Reflection/Annotations/AnnotationsMethodsClassReflectionExtension.php  x\        C   src/Reflection/Annotations/AnnotationsMethodParameterReflection.phpo  x\o  ]Z[      ;   src/Reflection/Annotations/AnnotationPropertyReflection.php  x\  ~j      9   src/Reflection/Annotations/AnnotationMethodReflection.phpN	  x\N	  X      L   src/Reflection/Annotations/AnnotationsPropertiesClassReflectionExtension.php/  x\/  uՓ      *   src/Reflection/ClassConstantReflection.php  x\  a      )   src/Reflection/ReflectionWithFilename.php   x\         0   src/Reflection/ParametersAcceptorWithPhpDocs.php  x\  @q      %   src/Reflection/InaccessibleMethod.phpq  x\q  ɵ      ,   src/Reflection/TrivialParametersAcceptor.php$  x\$  s;      '   src/Reflection/InternableReflection.php   x\   	ER      (   src/Reflection/ClassMemberReflection.php)  x\)  "H1      (   src/Reflection/FinalizableReflection.php   x\   pT      &   src/Reflection/ThrowableReflection.php   x\   cb      9   src/Reflection/MissingConstantFromReflectionException.php  x\  '	      $   src/Reflection/PassedByReference.php  x\  E{      ,   src/Reflection/FunctionReflectionFactory.php  x\  j      )   src/Reflection/DeprecatableReflection.php   x\   9      1   src/Reflection/ParameterReflectionWithPhpDocs.php(  x\(  XIͶ      "   src/Reflection/FunctionVariant.php  x\  P/      5   src/Reflection/PropertiesClassReflectionExtension.php{  x\{  gj:      9   src/Reflection/MissingPropertyFromReflectionException.php   x\   RLW      %   src/Reflection/PropertyReflection.php0  x\0  ^ڶ      6   src/Reflection/BrokerAwareClassReflectionExtension.php   x\   
      <?php

declare (strict_types=1);
namespace _HumbugBoxb94336daae36;

use _HumbugBoxb94336daae36\Composer\XdebugHandler\XdebugHandler;
use PHPStan\Command\AnalyseCommand;
use PHPStan\Command\DumpDependenciesCommand;
\gc_disable();
// performance boost
\define('__PHPSTAN_RUNNING__', \true);
$autoloaderInWorkingDirectory = \getcwd() . '/vendor/autoload.php';
if (\is_file($autoloaderInWorkingDirectory)) {
    require_once $autoloaderInWorkingDirectory;
}
$autoloadProjectAutoloaderFile = function (string $file) : void {
    $path = \dirname(__DIR__) . $file;
    if (!\extension_loaded('phar')) {
        if (\is_file($path)) {
            require_once $path;
        }
    } else {
        $pharPath = \Phar::running(\false);
        if ($pharPath === '') {
            if (\is_file($path)) {
                require_once $path;
            }
        } else {
            $path = \dirname($pharPath) . $file;
            if (\is_file($path)) {
                require_once $path;
            }
        }
    }
};
$autoloadProjectAutoloaderFile('/../../autoload.php');
$devOrPharAutoloadFile = 'phar://phpstan.phar/vendor/autoload.php';
if (\is_file($devOrPharAutoloadFile)) {
    require_once $devOrPharAutoloadFile;
}
$xdebug = new \_HumbugBoxb94336daae36\Composer\XdebugHandler\XdebugHandler('phpstan', '--ansi');
$xdebug->check();
unset($xdebug);
$version = 'Version unknown';
try {
    $version = \_HumbugBoxb94336daae36\Jean85\PrettyVersions::getVersion('phpstan/phpstan')->getPrettyVersion();
} catch (\OutOfBoundsException $e) {
}
$application = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Application('PHPStan - PHP Static Analysis Tool', $version);
$application->add(new \PHPStan\Command\AnalyseCommand());
$application->add(new \PHPStan\Command\DumpDependenciesCommand());
$application->run();
includes:
	- config.level1.neon

parameters:
	checkClassCaseSensitivity: true
	checkThisOnly: false
	checkPhpDocMissingReturn: true

rules:
	- PHPStan\Rules\Cast\EchoRule
	- PHPStan\Rules\Cast\InvalidCastRule
	- PHPStan\Rules\Cast\InvalidPartOfEncapsedStringRule
	- PHPStan\Rules\Cast\PrintRule
	- PHPStan\Rules\Functions\IncompatibleDefaultParameterTypeRule
	- PHPStan\Rules\Methods\IncompatibleDefaultParameterTypeRule
	- PHPStan\Rules\Operators\InvalidBinaryOperationRule
	- PHPStan\Rules\Operators\InvalidUnaryOperationRule
	- PHPStan\Rules\Operators\InvalidComparisonOperationRule
	- PHPStan\Rules\PhpDoc\IncompatiblePhpDocTypeRule
	- PHPStan\Rules\PhpDoc\IncompatiblePropertyPhpDocTypeRule
	- PHPStan\Rules\PhpDoc\InvalidPhpDocTagValueRule
	- PHPStan\Rules\PhpDoc\InvalidThrowsPhpDocValueRule

services:
	-
		class: PHPStan\Rules\Functions\CallCallablesRule
		arguments:
			reportMaybes: %reportMaybes%
		tags:
			- phpstan.rules.rule
includes:
	- config.level2.neon

rules:
	- PHPStan\Rules\Arrays\AppendedArrayItemTypeRule
	- PHPStan\Rules\Arrays\IterableInForeachRule
	- PHPStan\Rules\Arrays\OffsetAccessAssignmentRule
	- PHPStan\Rules\Arrays\OffsetAccessAssignOpRule
	- PHPStan\Rules\Functions\ClosureReturnTypeRule
	- PHPStan\Rules\Functions\ReturnTypeRule
	- PHPStan\Rules\Methods\ReturnTypeRule
	- PHPStan\Rules\Properties\DefaultValueTypesAssignedToPropertiesRule
	- PHPStan\Rules\Properties\TypesAssignedToPropertiesRule
	- PHPStan\Rules\Variables\ThrowTypeRule
	- PHPStan\Rules\Variables\VariableCloningRule

parameters:
	featureToggles:
		yieldRules: false

conditionalTags:
	PHPStan\Rules\Generators\YieldFromTypeRule:
		phpstan.rules.rule: %featureToggles.yieldRules%
	PHPStan\Rules\Generators\YieldInGeneratorRule:
		phpstan.rules.rule: %featureToggles.yieldRules%
	PHPStan\Rules\Generators\YieldTypeRule:
		phpstan.rules.rule: %featureToggles.yieldRules%

services:
	-
		class: PHPStan\Rules\Arrays\AppendedArrayKeyTypeRule
		arguments:
			checkUnionTypes: %checkUnionTypes%
		tags:
			- phpstan.rules.rule

	-
		class: PHPStan\Rules\Arrays\InvalidKeyInArrayDimFetchRule
		arguments:
			reportMaybes: %reportMaybes%
		tags:
			- phpstan.rules.rule

	-
		class: PHPStan\Rules\Arrays\InvalidKeyInArrayItemRule
		arguments:
			reportMaybes: %reportMaybes%
		tags:
			- phpstan.rules.rule

	-
		class: PHPStan\Rules\Arrays\NonexistentOffsetInArrayDimFetchRule
		arguments:
			reportMaybes: %reportMaybes%
		tags:
			- phpstan.rules.rule

	-
		class: PHPStan\Rules\Generators\YieldFromTypeRule
		arguments:
			reportMaybes: %reportMaybes%

	-
		class: PHPStan\Rules\Generators\YieldInGeneratorRule
		arguments:
			reportMaybes: %reportMaybes%

	-
		class: PHPStan\Rules\Generators\YieldTypeRule

	-
		class: PHPStan\Rules\Methods\MethodSignatureRule
		arguments:
			reportMaybes: %reportMaybesInMethodSignatures%
			reportStatic: %reportStaticMethodSignatures%
		tags:
			- phpstan.rules.rule
includes:
	- config.level3.neon

rules:
	- PHPStan\Rules\Arrays\DeadForeachRule
	- PHPStan\Rules\Comparison\BooleanAndConstantConditionRule
	- PHPStan\Rules\Comparison\BooleanNotConstantConditionRule
	- PHPStan\Rules\Comparison\BooleanOrConstantConditionRule
	- PHPStan\Rules\Comparison\ElseIfConstantConditionRule
	- PHPStan\Rules\Comparison\IfConstantConditionRule
	- PHPStan\Rules\Comparison\TernaryOperatorConstantConditionRule
	- PHPStan\Rules\Comparison\UnreachableIfBranchesRule
	- PHPStan\Rules\Comparison\UnreachableTernaryElseBranchRule

parameters:
	featureToggles:
		deadCatchesRule: false
		noopRule: false
		unreachableStatement: false

conditionalTags:
	PHPStan\Rules\Exceptions\DeadCatchRule:
		phpstan.rules.rule: %featureToggles.deadCatchesRule%
	PHPStan\Rules\DeadCode\NoopRule:
		phpstan.rules.rule: %featureToggles.noopRule%
	PHPStan\Rules\DeadCode\UnreachableStatementRule:
		phpstan.rules.rule: %featureToggles.unreachableStatement%

services:
	-
		class: PHPStan\Rules\Classes\ImpossibleInstanceOfRule
		arguments:
			checkAlwaysTrueInstanceof: %checkAlwaysTrueInstanceof%
		tags:
			- phpstan.rules.rule

	-
		class: PHPStan\Rules\Comparison\ImpossibleCheckTypeFunctionCallRule
		arguments:
			checkAlwaysTrueCheckTypeFunctionCall: %checkAlwaysTrueCheckTypeFunctionCall%
		tags:
			- phpstan.rules.rule

	-
		class: PHPStan\Rules\Comparison\ImpossibleCheckTypeMethodCallRule
		arguments:
			checkAlwaysTrueCheckTypeFunctionCall: %checkAlwaysTrueCheckTypeFunctionCall%
		tags:
			- phpstan.rules.rule

	-
		class: PHPStan\Rules\Comparison\ImpossibleCheckTypeStaticMethodCallRule
		arguments:
			checkAlwaysTrueCheckTypeFunctionCall: %checkAlwaysTrueCheckTypeFunctionCall%
		tags:
			- phpstan.rules.rule

	-
		class: PHPStan\Rules\Comparison\StrictComparisonOfDifferentTypesRule
		arguments:
			checkAlwaysTrueStrictComparison: %checkAlwaysTrueStrictComparison%
		tags:
			- phpstan.rules.rule

	-
		class: PHPStan\Rules\Exceptions\DeadCatchRule

	-
		class: PHPStan\Rules\DeadCode\NoopRule

	-
		class: PHPStan\Rules\DeadCode\UnreachableStatementRule
parameters:
	bootstrap: null
	excludes_analyse: []
	autoload_directories: []
	autoload_files: []
	level: null
	paths: []
	featureToggles:
		subtractableTypes: false
		validateParameters: false
	fileExtensions:
		- php
	checkAlwaysTrueCheckTypeFunctionCall: false
	checkAlwaysTrueInstanceof: false
	checkAlwaysTrueStrictComparison: false
	checkClassCaseSensitivity: false
	checkFunctionArgumentTypes: false
	checkFunctionNameCase: false
	checkArgumentsPassedByReference: false
	checkMaybeUndefinedVariables: false
	checkNullables: false
	checkThisOnly: true
	checkUnionTypes: false
	checkExplicitMixedMissingReturn: false
	checkPhpDocMissingReturn: false
	reportMaybes: false
	reportMaybesInMethodSignatures: false
	reportStaticMethodSignatures: false
	polluteScopeWithLoopInitialAssignments: true
	polluteScopeWithAlwaysIterableForeach: true
	polluteCatchScopeWithTryAssignments: false
	reportMagicMethods: false
	reportMagicProperties: false
	ignoreErrors: []
	internalErrorsCountLimit: 50
	cache:
	    nodesByFileCountMax: 512
	    nodesByStringCountMax: 512
	reportUnmatchedIgnoredErrors: true
	scopeClass: PHPStan\Analyser\Scope
	universalObjectCratesClasses:
		- stdClass
		- SimpleXMLElement
	earlyTerminatingMethodCalls: []
	memoryLimitFile: %tmpDir%/.memory_limit
	benchmarkFile: null
	dynamicConstantNames:
		- ICONV_IMPL
		- PHP_VERSION
		- PHP_MAJOR_VERSION
		- PHP_MINOR_VERSION
		- PHP_RELEASE_VERSION
		- PHP_VERSION_ID
		- PHP_EXTRA_VERSION
		- PHP_ZTS
		- PHP_DEBUG
		- PHP_MAXPATHLEN
		- PHP_OS
		- PHP_OS_FAMILY
		- PHP_SAPI
		- PHP_EOL
		- PHP_INT_MAX
		- PHP_INT_MIN
		- PHP_INT_SIZE
		- PHP_FLOAT_DIG
		- PHP_FLOAT_EPSILON
		- PHP_FLOAT_MIN
		- PHP_FLOAT_MAX
		- DEFAULT_INCLUDE_PATH
		- PEAR_INSTALL_DIR
		- PEAR_EXTENSION_DIR
		- PHP_EXTENSION_DIR
		- PHP_PREFIX
		- PHP_BINDIR
		- PHP_BINARY
		- PHP_MANDIR
		- PHP_LIBDIR
		- PHP_DATADIR
		- PHP_SYSCONFDIR
		- PHP_LOCALSTATEDIR
		- PHP_CONFIG_FILE_PATH
		- PHP_CONFIG_FILE_SCAN_DIR
		- PHP_SHLIB_SUFFIX
		- PHP_FD_SETSIZE

extensions:
	rules: PHPStan\DependencyInjection\RulesExtension
	conditionalTags: PHPStan\DependencyInjection\ConditionalTagsExtension
	parametersSchema: PHPStan\DependencyInjection\ParametersSchemaExtension

parametersSchema:
	bootstrap: schema(string(), nullable())
	excludes_analyse: listOf(string())
	autoload_directories: listOf(string())
	autoload_files: listOf(string())
	level: schema(anyOf(int(), string()), nullable())
	paths: listOf(string())
	featureToggles: arrayOf(bool())
	fileExtensions: listOf(string())
	checkAlwaysTrueCheckTypeFunctionCall: bool()
	checkAlwaysTrueInstanceof: bool()
	checkAlwaysTrueStrictComparison: bool()
	checkClassCaseSensitivity: bool()
	checkFunctionArgumentTypes: bool()
	checkFunctionNameCase: bool()
	checkArgumentsPassedByReference: bool()
	checkMaybeUndefinedVariables: bool()
	checkNullables: bool()
	checkThisOnly: bool()
	checkUnionTypes: bool()
	checkExplicitMixedMissingReturn: bool()
	checkPhpDocMissingReturn: bool()
	reportMaybes: bool()
	reportMaybesInMethodSignatures: bool()
	reportStaticMethodSignatures: bool()
	polluteScopeWithLoopInitialAssignments: bool()
	polluteScopeWithAlwaysIterableForeach: bool()
	polluteCatchScopeWithTryAssignments: bool()
	reportMagicMethods: bool()
	reportMagicProperties: bool()
	ignoreErrors: listOf(
		anyOf(
			string(),
			structure([
				message: string()
				path: string()
			]),
			structure([
				message: string()
				paths: listOf(string())
			])
		)
	)
	internalErrorsCountLimit: int()
	cache: structure([
		nodesByFileCountMax: int()
		nodesByStringCountMax: int()
	])
	reportUnmatchedIgnoredErrors: bool()
	scopeClass: string()
	universalObjectCratesClasses: listOf(string())
	earlyTerminatingMethodCalls: arrayOf(listOf(string()))
	memoryLimitFile: string()
	benchmarkFile: schema(string(), nullable())
	dynamicConstantNames: listOf(string())
	customRulesetUsed: bool()
	rootDir: string()
	tmpDir: string()
	currentWorkingDirectory: string()
	cliArgumentsVariablesRegistered: bool()

	# irrelevant Nette parameters
	debugMode: bool()
	productionMode: bool()
	tempDir: string()

services:
	-
		class: PhpParser\BuilderFactory

	-
		class: PhpParser\Lexer

	-
		class: PhpParser\NodeTraverser
		setup:
			- addVisitor(@PhpParser\NodeVisitor\NameResolver)

	-
		class: PhpParser\NodeVisitor\NameResolver

	-
		class: PhpParser\Parser\Php7

	-
		class: PhpParser\PrettyPrinter\Standard

	-
		class: PHPStan\Broker\AnonymousClassNameHelper
		arguments:
			relativePathHelper: @simpleRelativePathHelper

	-
		class: PHPStan\PhpDocParser\Lexer\Lexer

	-
		class: PHPStan\PhpDocParser\Parser\TypeParser

	-
		class: PHPStan\PhpDocParser\Parser\ConstExprParser

	-
		class: PHPStan\PhpDocParser\Parser\PhpDocParser

	-
		class: PHPStan\PhpDoc\PhpDocNodeResolver

	-
		class: PHPStan\PhpDoc\PhpDocStringResolver

	-
		class: PHPStan\PhpDoc\TypeNodeResolver
		factory: @typeNodeResolverFactory::create

	-
		class: PHPStan\PhpDoc\TypeStringResolver

	-
		class: PHPStan\Analyser\Analyser
		arguments:
			ignoreErrors: %ignoreErrors%
			reportUnmatchedIgnoredErrors: %reportUnmatchedIgnoredErrors%
			internalErrorsCountLimit: %internalErrorsCountLimit%
			benchmarkFile: %benchmarkFile%

	-
		class: PHPStan\Analyser\ScopeFactory
		arguments:
			scopeClass: %scopeClass%

	-
		class: PHPStan\Analyser\NodeScopeResolver
		arguments:
			polluteScopeWithLoopInitialAssignments: %polluteScopeWithLoopInitialAssignments%
			polluteCatchScopeWithTryAssignments: %polluteCatchScopeWithTryAssignments%
			polluteScopeWithAlwaysIterableForeach: %polluteScopeWithAlwaysIterableForeach%
			earlyTerminatingMethodCalls: %earlyTerminatingMethodCalls%

	-
		class: PHPStan\Cache\Cache
		arguments:
			storage: @cacheStorage

	-
		class: PHPStan\Command\AnalyseApplication
		arguments:
			memoryLimitFile: %memoryLimitFile%
			currentWorkingDirectory: %currentWorkingDirectory%

	-
		class: PHPStan\Dependency\DependencyDumper

	-
		class: PHPStan\Dependency\DependencyResolver

	-
		class: PHPStan\DependencyInjection\Container
		factory: PHPStan\DependencyInjection\Nette\NetteContainer

	-
		class: PHPStan\File\FileHelper
		arguments:
			workingDirectory: %currentWorkingDirectory%

	-
		class: PHPStan\File\FileExcluder
		arguments:
			analyseExcludes: %excludes_analyse%

	-
		class: PHPStan\File\FileFinder
		arguments:
			fileExtensions: %fileExtensions%

	-
		class: PHPStan\Parser\CachedParser
		arguments:
			originalParser: @directParser
			cachedNodesByFileCountMax: %cache.nodesByFileCountMax%
			cachedNodesByStringCountMax: %cache.nodesByStringCountMax%

	-
		class: PHPStan\Parser\FunctionCallStatementFinder

	-
		implement: PHPStan\Reflection\FunctionReflectionFactory

	-
		class: PHPStan\Reflection\Annotations\AnnotationsMethodsClassReflectionExtension

	-
		class: PHPStan\Reflection\Annotations\AnnotationsPropertiesClassReflectionExtension

	-
		class: PHPStan\Reflection\Php\PhpClassReflectionExtension

	-
		class: PHPStan\Reflection\PhpDefect\PhpDefectClassReflectionExtension

	-
		implement: PHPStan\Reflection\Php\PhpMethodReflectionFactory

	-
		class: PHPStan\Reflection\Php\UniversalObjectCratesClassReflectionExtension
		tags:
			- phpstan.broker.propertiesClassReflectionExtension
		arguments:
			classes: %universalObjectCratesClasses%

	-
		class: PHPStan\Reflection\SignatureMap\SignatureMapParser

	-
		class: PHPStan\Reflection\SignatureMap\SignatureMapProvider

	-
		class: PHPStan\Rules\ClassCaseSensitivityCheck

	-
		class: PHPStan\Rules\Comparison\ConstantConditionRuleHelper

	-
		class: PHPStan\Rules\Comparison\ImpossibleCheckTypeHelper

	-
		class: PHPStan\Rules\FunctionCallParametersCheck
		arguments:
			checkArgumentTypes: %checkFunctionArgumentTypes%
			checkArgumentsPassedByReference: %checkArgumentsPassedByReference%

	-
		class: PHPStan\Rules\FunctionDefinitionCheck
		arguments:
			checkClassCaseSensitivity: %checkClassCaseSensitivity%
			checkThisOnly: %checkThisOnly%

	-
		class: PHPStan\Rules\FunctionReturnTypeCheck

	-
		class: PHPStan\Rules\Properties\PropertyDescriptor

	-
		class: PHPStan\Rules\Properties\PropertyReflectionFinder

	-
		class: PHPStan\Rules\RegistryFactory

	-
		class: PHPStan\Rules\RuleLevelHelper
		arguments:
			checkNullables: %checkNullables%
			checkThisOnly: %checkThisOnly%
			checkUnionTypes: %checkUnionTypes%

	-
		class: PHPStan\Rules\UnusedFunctionParametersCheck

	-
		class: PHPStan\Type\FileTypeMapper

	-
		class: PHPStan\Type\Php\ArgumentBasedFunctionReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\ArrayFillFunctionReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\ArrayFillKeysFunctionReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\ArrayFilterFunctionReturnTypeReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\ArrayKeyDynamicReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\ArrayKeyExistsFunctionTypeSpecifyingExtension
		tags:
			- phpstan.typeSpecifier.functionTypeSpecifyingExtension

	-
		class: PHPStan\Type\Php\ArrayKeyFirstDynamicReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\ArrayKeyLastDynamicReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\ArrayKeysFunctionDynamicReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\ArrayMapFunctionReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\ArrayMergeFunctionDynamicReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\ArrayPopFunctionReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\ArrayReduceFunctionReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\ArrayShiftFunctionReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\ArraySliceFunctionReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\ArraySearchFunctionDynamicReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\ArrayValuesFunctionDynamicReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\CountFunctionReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\CountFunctionTypeSpecifyingExtension
		tags:
			- phpstan.typeSpecifier.functionTypeSpecifyingExtension

	-
		class: PHPStan\Type\Php\CurlInitReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\DioStatDynamicFunctionReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\ExplodeFunctionDynamicReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\FilterVarDynamicReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\GetParentClassDynamicFunctionReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\GettimeofdayDynamicFunctionReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\StatDynamicReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension
			- phpstan.broker.dynamicMethodReturnTypeExtension

	-
		class: PHPStan\Type\Php\MethodExistsTypeSpecifyingExtension
		tags:
			- phpstan.typeSpecifier.functionTypeSpecifyingExtension

	-
		class: PHPStan\Type\Php\PropertyExistsTypeSpecifyingExtension
		tags:
			- phpstan.typeSpecifier.functionTypeSpecifyingExtension

	-
		class: PHPStan\Type\Php\MinMaxFunctionReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\PathinfoFunctionDynamicReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\ReplaceFunctionsDynamicReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\ArrayPointerFunctionsDynamicReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\VarExportFunctionDynamicReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\MbFunctionsReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\MicrotimeFunctionReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\HrtimeFunctionReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\ParseUrlFunctionDynamicReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\VersionCompareFunctionDynamicReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\StrtotimeFunctionReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\RangeFunctionReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\AssertFunctionTypeSpecifyingExtension
		tags:
			- phpstan.typeSpecifier.functionTypeSpecifyingExtension

	-
		class: PHPStan\Type\Php\DefineConstantTypeSpecifyingExtension
		tags:
			- phpstan.typeSpecifier.functionTypeSpecifyingExtension

	-
		class: PHPStan\Type\Php\DefinedConstantTypeSpecifyingExtension
		tags:
			- phpstan.typeSpecifier.functionTypeSpecifyingExtension

	-
		class: PHPStan\Type\Php\InArrayFunctionTypeSpecifyingExtension
		tags:
			- phpstan.typeSpecifier.functionTypeSpecifyingExtension

	-
		class: PHPStan\Type\Php\IsIntFunctionTypeSpecifyingExtension
		tags:
			- phpstan.typeSpecifier.functionTypeSpecifyingExtension

	-
		class: PHPStan\Type\Php\IsFloatFunctionTypeSpecifyingExtension
		tags:
			- phpstan.typeSpecifier.functionTypeSpecifyingExtension

	-
		class: PHPStan\Type\Php\IsNullFunctionTypeSpecifyingExtension
		tags:
			- phpstan.typeSpecifier.functionTypeSpecifyingExtension

	-
		class: PHPStan\Type\Php\IsArrayFunctionTypeSpecifyingExtension
		tags:
			- phpstan.typeSpecifier.functionTypeSpecifyingExtension

	-
		class: PHPStan\Type\Php\IsBoolFunctionTypeSpecifyingExtension
		tags:
			- phpstan.typeSpecifier.functionTypeSpecifyingExtension

	-
		class: PHPStan\Type\Php\IsCallableFunctionTypeSpecifyingExtension
		tags:
			- phpstan.typeSpecifier.functionTypeSpecifyingExtension

	-
		class: PHPStan\Type\Php\IsCountableFunctionTypeSpecifyingExtension
		tags:
			- phpstan.typeSpecifier.functionTypeSpecifyingExtension

	-
		class: PHPStan\Type\Php\IsResourceFunctionTypeSpecifyingExtension
		tags:
			- phpstan.typeSpecifier.functionTypeSpecifyingExtension

	-
		class: PHPStan\Type\Php\IsIterableFunctionTypeSpecifyingExtension
		tags:
			- phpstan.typeSpecifier.functionTypeSpecifyingExtension

	-
		class: PHPStan\Type\Php\IsStringFunctionTypeSpecifyingExtension
		tags:
			- phpstan.typeSpecifier.functionTypeSpecifyingExtension

	-
		class: PHPStan\Type\Php\IsSubclassOfFunctionTypeSpecifyingExtension
		tags:
			- phpstan.typeSpecifier.functionTypeSpecifyingExtension

	-
		class: PHPStan\Type\Php\IsObjectFunctionTypeSpecifyingExtension
		tags:
			- phpstan.typeSpecifier.functionTypeSpecifyingExtension

	-
		class: PHPStan\Type\Php\IsNumericFunctionTypeSpecifyingExtension
		tags:
			- phpstan.typeSpecifier.functionTypeSpecifyingExtension

	-
		class: PHPStan\Type\Php\IsScalarFunctionTypeSpecifyingExtension
		tags:
			- phpstan.typeSpecifier.functionTypeSpecifyingExtension

	-
		class: PHPStan\Type\Php\IsAFunctionTypeSpecifyingExtension
		tags:
			- phpstan.typeSpecifier.functionTypeSpecifyingExtension

	-
		class: PHPStan\Type\Php\JsonThrowOnErrorDynamicReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\TypeSpecifyingFunctionsDynamicReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\StrSplitFunctionReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	-
		class: PHPStan\Type\Php\SprintfFunctionDynamicReturnTypeExtension
		tags:
			- phpstan.broker.dynamicFunctionReturnTypeExtension

	typeSpecifier:
		class: PHPStan\Analyser\TypeSpecifier
		factory: @typeSpecifierFactory::create

	typeSpecifierFactory:
		class: PHPStan\Analyser\TypeSpecifierFactory

	relativePathHelper:
		class: PHPStan\File\RelativePathHelper
		dynamic: true
		autowired: true

	simpleRelativePathHelper:
		class: PHPStan\File\RelativePathHelper
		factory: PHPStan\File\SimpleRelativePathHelper
		arguments:
			currentWorkingDirectory: %currentWorkingDirectory%
		autowired: false

	broker:
		class: PHPStan\Broker\Broker
		factory: @brokerFactory::create

	brokerFactory:
		class: PHPStan\Broker\BrokerFactory

	cacheStorage:
		class: PHPStan\Cache\FileCacheStorage
		arguments:
			directory: %tmpDir%/cache/PHPStan
		autowired: no

	directParser:
		class: PHPStan\Parser\DirectParser
		autowired: no

	registry:
		class: PHPStan\Rules\Registry
		factory: @PHPStan\Rules\RegistryFactory::create

	typeNodeResolverFactory:
		class: PHPStan\PhpDoc\TypeNodeResolverFactory

	errorFormatter.raw:
		class: PHPStan\Command\ErrorFormatter\RawErrorFormatter

	errorFormatter.table:
		class: PHPStan\Command\ErrorFormatter\TableErrorFormatter

	errorFormatter.checkstyle:
		class: PHPStan\Command\ErrorFormatter\CheckstyleErrorFormatter
		arguments:
			relativePathHelper: @simpleRelativePathHelper

	errorFormatter.json:
		class: PHPStan\Command\ErrorFormatter\JsonErrorFormatter
		arguments:
			pretty: false

	errorFormatter.prettyJson:
		class: PHPStan\Command\ErrorFormatter\JsonErrorFormatter
		arguments:
			pretty: true
includes:
	- config.level7.neon
parameters:
	featureToggles:
		deadCatchesRule: true
		missingReturnRule: true
		noopRule: true
		subtractableTypes: true
		unreachableStatement: true
		yieldRules: true
		validateParameters: true
includes:
	- config.level4.neon

parameters:
	checkFunctionArgumentTypes: true
	checkArgumentsPassedByReference: true
includes:
	- config.level5.neon

parameters:
	checkUnionTypes: true
	reportMaybes: true
includes:
	- config.level6.neon

parameters:
	checkNullables: true
parameters:
	customRulesetUsed: false
	featureToggles:
		missingReturnRule: false
		missingClosureNativeReturnTypehintRule: false
	missingClosureNativeReturnCheckObjectTypehint: false

conditionalTags:
	PHPStan\Rules\Missing\MissingClosureNativeReturnTypehintRule:
		phpstan.rules.rule: %featureToggles.missingClosureNativeReturnTypehintRule%
	PHPStan\Rules\Missing\MissingReturnRule:
		phpstan.rules.rule: %featureToggles.missingReturnRule%

parametersSchema:
	missingClosureNativeReturnCheckObjectTypehint: bool()

rules:
	- PHPStan\Rules\Arrays\DuplicateKeysInLiteralArraysRule
	- PHPStan\Rules\Arrays\OffsetAccessWithoutDimForReadingRule
	- PHPStan\Rules\Classes\ClassConstantDeclarationRule
	- PHPStan\Rules\Classes\ClassConstantRule
	- PHPStan\Rules\Classes\ExistingClassesInClassImplementsRule
	- PHPStan\Rules\Classes\ExistingClassesInInterfaceExtendsRule
	- PHPStan\Rules\Classes\ExistingClassInClassExtendsRule
	- PHPStan\Rules\Classes\ExistingClassInTraitUseRule
	- PHPStan\Rules\Classes\InstantiationRule
	- PHPStan\Rules\Classes\RequireParentConstructCallRule
	- PHPStan\Rules\Classes\UnusedConstructorParametersRule
	- PHPStan\Rules\Functions\CallToFunctionParametersRule
	- PHPStan\Rules\Functions\ExistingClassesInClosureTypehintsRule
	- PHPStan\Rules\Functions\ExistingClassesInTypehintsRule
	- PHPStan\Rules\Functions\InnerFunctionRule
	- PHPStan\Rules\Functions\NonExistentDefinedFunctionRule
	- PHPStan\Rules\Functions\PrintfParametersRule
	- PHPStan\Rules\Functions\UnusedClosureUsesRule
	- PHPStan\Rules\Methods\ExistingClassesInTypehintsRule
	- PHPStan\Rules\Properties\AccessPropertiesInAssignRule
	- PHPStan\Rules\Properties\AccessStaticPropertiesInAssignRule
	- PHPStan\Rules\Variables\ThisVariableRule

services:
	-
		class: PHPStan\Rules\Classes\ExistingClassInInstanceOfRule
		tags:
			- phpstan.rules.rule
		arguments:
			checkClassCaseSensitivity: %checkClassCaseSensitivity%

	-
		class: PHPStan\Rules\Exceptions\CaughtExceptionExistenceRule
		tags:
			- phpstan.rules.rule
		arguments:
			checkClassCaseSensitivity: %checkClassCaseSensitivity%

	-
		class: PHPStan\Rules\Functions\CallToNonExistentFunctionRule
		tags:
			- phpstan.rules.rule
		arguments:
			checkFunctionNameCase: %checkFunctionNameCase%

	-
		class: PHPStan\Rules\Methods\CallMethodsRule
		tags:
			- phpstan.rules.rule
		arguments:
			checkFunctionNameCase: %checkFunctionNameCase%
			reportMagicMethods: %reportMagicMethods%

	-
		class: PHPStan\Rules\Methods\CallStaticMethodsRule
		tags:
			- phpstan.rules.rule
		arguments:
			checkFunctionNameCase: %checkFunctionNameCase%
			reportMagicMethods: %reportMagicMethods%

	-
		class: PHPStan\Rules\Missing\MissingClosureNativeReturnTypehintRule
		arguments:
			checkObjectTypehint: %missingClosureNativeReturnCheckObjectTypehint%

	-
		class: PHPStan\Rules\Missing\MissingReturnRule
		arguments:
			checkExplicitMixedMissingReturn: %checkExplicitMixedMissingReturn%
			checkPhpDocMissingReturn: %checkPhpDocMissingReturn%

	-
		class: PHPStan\Rules\Namespaces\ExistingNamesInGroupUseRule
		tags:
			- phpstan.rules.rule
		arguments:
			checkFunctionNameCase: %checkFunctionNameCase%

	-
		class: PHPStan\Rules\Namespaces\ExistingNamesInUseRule
		tags:
			- phpstan.rules.rule
		arguments:
			checkFunctionNameCase: %checkFunctionNameCase%

	-
		class: PHPStan\Rules\Operators\InvalidIncDecOperationRule
		tags:
			- phpstan.rules.rule
		arguments:
			checkThisOnly: %checkThisOnly%

	-
		class: PHPStan\Rules\Properties\AccessPropertiesRule
		tags:
			- phpstan.rules.rule
		arguments:
			reportMagicProperties: %reportMagicProperties%

	-
		class: PHPStan\Rules\Properties\AccessStaticPropertiesRule
		tags:
			- phpstan.rules.rule

	-
		class: PHPStan\Rules\Properties\ExistingClassesInPropertiesRule
		tags:
			- phpstan.rules.rule
		arguments:
			checkClassCaseSensitivity: %checkClassCaseSensitivity%

	-
		class: PHPStan\Rules\Properties\WritingToReadOnlyPropertiesRule
		arguments:
			checkThisOnly: %checkThisOnly%
		tags:
			- phpstan.rules.rule

	-
		class: PHPStan\Rules\Properties\ReadingWriteOnlyPropertiesRule
		arguments:
			checkThisOnly: %checkThisOnly%
		tags:
			- phpstan.rules.rule

	-
		class: PHPStan\Rules\Variables\DefinedVariableRule
		arguments:
			cliArgumentsVariablesRegistered: %cliArgumentsVariablesRegistered%
			checkMaybeUndefinedVariables: %checkMaybeUndefinedVariables%
		tags:
			- phpstan.rules.rule

	-
		class: PHPStan\Rules\Variables\DefinedVariableInAnonymousFunctionUseRule
		arguments:
			checkMaybeUndefinedVariables: %checkMaybeUndefinedVariables%
		tags:
			- phpstan.rules.rule

	-
		class: PHPStan\Rules\Regexp\RegularExpressionPatternRule
		tags:
			- phpstan.rules.rule
includes:
	- config.level0.neon

parameters:
	checkMaybeUndefinedVariables: true
	reportMagicMethods: true
	reportMagicProperties: true

rules:
	- PHPStan\Rules\Constants\ConstantRule
	- PHPStan\Rules\Variables\VariableCertaintyInIssetRule
<?php

// @generated by Humbug Box

// autoload.php @generated by Composer

require_once __DIR__ . '/composer/autoload_real.php';

$loader = ComposerAutoloaderInit6dce0c234fc32484ec6b4f3a33bb4a6f::getLoader();

// Aliases for the whitelisted classes. For more information see:
// https://github.com/humbug/php-scoper/blob/master/README.md#class-whitelisting
class_exists('_HumbugBoxb94336daae36\ComposerAutoloaderInit6dce0c234fc32484ec6b4f3a33bb4a6f');

// Functions whitelisting. For more information see:
// https://github.com/humbug/php-scoper/blob/master/README.md#functions-whitelisting
if (!function_exists('formatErrorMessage')) {
    function formatErrorMessage() {
        return \_HumbugBoxb94336daae36\formatErrorMessage(...func_get_args());
    }
}
if (!function_exists('showHelp')) {
    function showHelp() {
        return \_HumbugBoxb94336daae36\showHelp(...func_get_args());
    }
}
if (!function_exists('parseArgs')) {
    function parseArgs() {
        return \_HumbugBoxb94336daae36\parseArgs(...func_get_args());
    }
}
if (!function_exists('composerRequire6dce0c234fc32484ec6b4f3a33bb4a6f')) {
    function composerRequire6dce0c234fc32484ec6b4f3a33bb4a6f() {
        return \_HumbugBoxb94336daae36\composerRequire6dce0c234fc32484ec6b4f3a33bb4a6f(...func_get_args());
    }
}
if (!function_exists('mb_convert_encoding')) {
    function mb_convert_encoding() {
        return \_HumbugBoxb94336daae36\mb_convert_encoding(...func_get_args());
    }
}
if (!function_exists('mb_decode_mimeheader')) {
    function mb_decode_mimeheader() {
        return \_HumbugBoxb94336daae36\mb_decode_mimeheader(...func_get_args());
    }
}
if (!function_exists('mb_encode_mimeheader')) {
    function mb_encode_mimeheader() {
        return \_HumbugBoxb94336daae36\mb_encode_mimeheader(...func_get_args());
    }
}
if (!function_exists('mb_decode_numericentity')) {
    function mb_decode_numericentity() {
        return \_HumbugBoxb94336daae36\mb_decode_numericentity(...func_get_args());
    }
}
if (!function_exists('mb_encode_numericentity')) {
    function mb_encode_numericentity() {
        return \_HumbugBoxb94336daae36\mb_encode_numericentity(...func_get_args());
    }
}
if (!function_exists('mb_convert_case')) {
    function mb_convert_case() {
        return \_HumbugBoxb94336daae36\mb_convert_case(...func_get_args());
    }
}
if (!function_exists('mb_internal_encoding')) {
    function mb_internal_encoding() {
        return \_HumbugBoxb94336daae36\mb_internal_encoding(...func_get_args());
    }
}
if (!function_exists('mb_language')) {
    function mb_language() {
        return \_HumbugBoxb94336daae36\mb_language(...func_get_args());
    }
}
if (!function_exists('mb_list_encodings')) {
    function mb_list_encodings() {
        return \_HumbugBoxb94336daae36\mb_list_encodings(...func_get_args());
    }
}
if (!function_exists('mb_encoding_aliases')) {
    function mb_encoding_aliases() {
        return \_HumbugBoxb94336daae36\mb_encoding_aliases(...func_get_args());
    }
}
if (!function_exists('mb_check_encoding')) {
    function mb_check_encoding() {
        return \_HumbugBoxb94336daae36\mb_check_encoding(...func_get_args());
    }
}
if (!function_exists('mb_detect_encoding')) {
    function mb_detect_encoding() {
        return \_HumbugBoxb94336daae36\mb_detect_encoding(...func_get_args());
    }
}
if (!function_exists('mb_detect_order')) {
    function mb_detect_order() {
        return \_HumbugBoxb94336daae36\mb_detect_order(...func_get_args());
    }
}
if (!function_exists('mb_parse_str')) {
    function mb_parse_str() {
        return \_HumbugBoxb94336daae36\mb_parse_str(...func_get_args());
    }
}
if (!function_exists('mb_strlen')) {
    function mb_strlen() {
        return \_HumbugBoxb94336daae36\mb_strlen(...func_get_args());
    }
}
if (!function_exists('mb_strpos')) {
    function mb_strpos() {
        return \_HumbugBoxb94336daae36\mb_strpos(...func_get_args());
    }
}
if (!function_exists('mb_strtolower')) {
    function mb_strtolower() {
        return \_HumbugBoxb94336daae36\mb_strtolower(...func_get_args());
    }
}
if (!function_exists('mb_strtoupper')) {
    function mb_strtoupper() {
        return \_HumbugBoxb94336daae36\mb_strtoupper(...func_get_args());
    }
}
if (!function_exists('mb_substitute_character')) {
    function mb_substitute_character() {
        return \_HumbugBoxb94336daae36\mb_substitute_character(...func_get_args());
    }
}
if (!function_exists('mb_substr')) {
    function mb_substr() {
        return \_HumbugBoxb94336daae36\mb_substr(...func_get_args());
    }
}
if (!function_exists('mb_stripos')) {
    function mb_stripos() {
        return \_HumbugBoxb94336daae36\mb_stripos(...func_get_args());
    }
}
if (!function_exists('mb_stristr')) {
    function mb_stristr() {
        return \_HumbugBoxb94336daae36\mb_stristr(...func_get_args());
    }
}
if (!function_exists('mb_strrchr')) {
    function mb_strrchr() {
        return \_HumbugBoxb94336daae36\mb_strrchr(...func_get_args());
    }
}
if (!function_exists('mb_strrichr')) {
    function mb_strrichr() {
        return \_HumbugBoxb94336daae36\mb_strrichr(...func_get_args());
    }
}
if (!function_exists('mb_strripos')) {
    function mb_strripos() {
        return \_HumbugBoxb94336daae36\mb_strripos(...func_get_args());
    }
}
if (!function_exists('mb_strrpos')) {
    function mb_strrpos() {
        return \_HumbugBoxb94336daae36\mb_strrpos(...func_get_args());
    }
}
if (!function_exists('mb_strstr')) {
    function mb_strstr() {
        return \_HumbugBoxb94336daae36\mb_strstr(...func_get_args());
    }
}
if (!function_exists('mb_get_info')) {
    function mb_get_info() {
        return \_HumbugBoxb94336daae36\mb_get_info(...func_get_args());
    }
}
if (!function_exists('mb_http_output')) {
    function mb_http_output() {
        return \_HumbugBoxb94336daae36\mb_http_output(...func_get_args());
    }
}
if (!function_exists('mb_strwidth')) {
    function mb_strwidth() {
        return \_HumbugBoxb94336daae36\mb_strwidth(...func_get_args());
    }
}
if (!function_exists('mb_substr_count')) {
    function mb_substr_count() {
        return \_HumbugBoxb94336daae36\mb_substr_count(...func_get_args());
    }
}
if (!function_exists('mb_output_handler')) {
    function mb_output_handler() {
        return \_HumbugBoxb94336daae36\mb_output_handler(...func_get_args());
    }
}
if (!function_exists('mb_http_input')) {
    function mb_http_input() {
        return \_HumbugBoxb94336daae36\mb_http_input(...func_get_args());
    }
}
if (!function_exists('mb_convert_variables')) {
    function mb_convert_variables() {
        return \_HumbugBoxb94336daae36\mb_convert_variables(...func_get_args());
    }
}
if (!function_exists('mb_ord')) {
    function mb_ord() {
        return \_HumbugBoxb94336daae36\mb_ord(...func_get_args());
    }
}
if (!function_exists('mb_chr')) {
    function mb_chr() {
        return \_HumbugBoxb94336daae36\mb_chr(...func_get_args());
    }
}
if (!function_exists('mb_scrub')) {
    function mb_scrub() {
        return \_HumbugBoxb94336daae36\mb_scrub(...func_get_args());
    }
}

return $loader;
{
    "name": "phpstan\/phpdoc-parser",
    "description": "PHPDoc parser with support for nullable, intersection and generic types",
    "license": "MIT",
    "require": {
        "php": "~7.1"
    },
    "require-dev": {
        "consistence\/coding-standard": "^3.5",
        "jakub-onderka\/php-parallel-lint": "^0.9.2",
        "phing\/phing": "^2.16.0",
        "phpstan\/phpstan": "^0.10",
        "phpunit\/phpunit": "^6.3",
        "slevomat\/coding-standard": "^4.7.2",
        "squizlabs\/php_codesniffer": "^3.3.2",
        "symfony\/process": "^3.4 || ^4.0"
    },
    "autoload": {
        "psr-4": {
            "PHPStan\\PhpDocParser\\": [
                "src\/"
            ]
        }
    },
    "autoload-dev": {
        "psr-4": {
            "PHPStan\\PhpDocParser\\": [
                "tests\/PHPStan"
            ]
        }
    },
    "extra": {
        "branch-alias": {
            "dev-master": "0.3-dev"
        }
    }
}<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Lexer;

/**
 * Implementation based on Nette Tokenizer (New BSD License; https://github.com/nette/tokenizer)
 */
class Lexer
{
    public const TOKEN_REFERENCE = 0;
    public const TOKEN_UNION = 1;
    public const TOKEN_INTERSECTION = 2;
    public const TOKEN_NULLABLE = 3;
    public const TOKEN_OPEN_PARENTHESES = 4;
    public const TOKEN_CLOSE_PARENTHESES = 5;
    public const TOKEN_OPEN_ANGLE_BRACKET = 6;
    public const TOKEN_CLOSE_ANGLE_BRACKET = 7;
    public const TOKEN_OPEN_SQUARE_BRACKET = 8;
    public const TOKEN_CLOSE_SQUARE_BRACKET = 9;
    public const TOKEN_COMMA = 10;
    public const TOKEN_COLON = 29;
    public const TOKEN_VARIADIC = 11;
    public const TOKEN_DOUBLE_COLON = 12;
    public const TOKEN_DOUBLE_ARROW = 13;
    public const TOKEN_EQUAL = 14;
    public const TOKEN_OPEN_PHPDOC = 15;
    public const TOKEN_CLOSE_PHPDOC = 16;
    public const TOKEN_PHPDOC_TAG = 17;
    public const TOKEN_PHPDOC_EOL = 26;
    public const TOKEN_FLOAT = 18;
    public const TOKEN_INTEGER = 19;
    public const TOKEN_SINGLE_QUOTED_STRING = 20;
    public const TOKEN_DOUBLE_QUOTED_STRING = 21;
    public const TOKEN_IDENTIFIER = 22;
    public const TOKEN_THIS_VARIABLE = 23;
    public const TOKEN_VARIABLE = 24;
    public const TOKEN_HORIZONTAL_WS = 25;
    public const TOKEN_OTHER = 27;
    public const TOKEN_END = 28;
    public const TOKEN_LABELS = [self::TOKEN_REFERENCE => '\'&\'', self::TOKEN_UNION => '\'|\'', self::TOKEN_INTERSECTION => '\'&\'', self::TOKEN_NULLABLE => '\'?\'', self::TOKEN_OPEN_PARENTHESES => '\'(\'', self::TOKEN_CLOSE_PARENTHESES => '\')\'', self::TOKEN_OPEN_ANGLE_BRACKET => '\'<\'', self::TOKEN_CLOSE_ANGLE_BRACKET => '\'>\'', self::TOKEN_OPEN_SQUARE_BRACKET => '\'[\'', self::TOKEN_CLOSE_SQUARE_BRACKET => '\']\'', self::TOKEN_COMMA => '\',\'', self::TOKEN_COLON => '\':\'', self::TOKEN_VARIADIC => '\'...\'', self::TOKEN_DOUBLE_COLON => '\'::\'', self::TOKEN_DOUBLE_ARROW => '\'=>\'', self::TOKEN_EQUAL => '\'=\'', self::TOKEN_OPEN_PHPDOC => '\'/**\'', self::TOKEN_CLOSE_PHPDOC => '\'*/\'', self::TOKEN_PHPDOC_TAG => 'TOKEN_PHPDOC_TAG', self::TOKEN_PHPDOC_EOL => 'TOKEN_PHPDOC_EOL', self::TOKEN_FLOAT => 'TOKEN_FLOAT', self::TOKEN_INTEGER => 'TOKEN_INTEGER', self::TOKEN_SINGLE_QUOTED_STRING => 'TOKEN_SINGLE_QUOTED_STRING', self::TOKEN_DOUBLE_QUOTED_STRING => 'TOKEN_DOUBLE_QUOTED_STRING', self::TOKEN_IDENTIFIER => 'TOKEN_IDENTIFIER', self::TOKEN_THIS_VARIABLE => '\'$this\'', self::TOKEN_VARIABLE => 'TOKEN_VARIABLE', self::TOKEN_HORIZONTAL_WS => 'TOKEN_HORIZONTAL_WS', self::TOKEN_OTHER => 'TOKEN_OTHER', self::TOKEN_END => 'TOKEN_END'];
    public const VALUE_OFFSET = 0;
    public const TYPE_OFFSET = 1;
    /** @var string|null */
    private $regexp;
    /** @var int[]|null */
    private $types;
    public function tokenize(string $s) : array
    {
        if ($this->regexp === null || $this->types === null) {
            $this->initialize();
        }
        \assert($this->regexp !== null);
        \assert($this->types !== null);
        \preg_match_all($this->regexp, $s, $tokens, \PREG_SET_ORDER);
        $count = \count($this->types);
        foreach ($tokens as &$match) {
            for ($i = 1; $i <= $count; $i++) {
                if ($match[$i] !== null && $match[$i] !== '') {
                    $match = [$match[0], $this->types[$i - 1]];
                    break;
                }
            }
        }
        $tokens[] = ['', self::TOKEN_END];
        return $tokens;
    }
    private function initialize() : void
    {
        $patterns = [
            // '&' followed by TOKEN_VARIADIC, TOKEN_VARIABLE, TOKEN_EQUAL, TOKEN_EQUAL or TOKEN_CLOSE_PARENTHESES
            self::TOKEN_REFERENCE => '&(?=\\s*+(?:[.,=)]|(?:\\$(?!this(?![0-9a-z_\\x80-\\xFF])))))',
            self::TOKEN_UNION => '\\|',
            self::TOKEN_INTERSECTION => '&',
            self::TOKEN_NULLABLE => '\\?',
            self::TOKEN_OPEN_PARENTHESES => '\\(',
            self::TOKEN_CLOSE_PARENTHESES => '\\)',
            self::TOKEN_OPEN_ANGLE_BRACKET => '<',
            self::TOKEN_CLOSE_ANGLE_BRACKET => '>',
            self::TOKEN_OPEN_SQUARE_BRACKET => '\\[',
            self::TOKEN_CLOSE_SQUARE_BRACKET => '\\]',
            self::TOKEN_COMMA => ',',
            self::TOKEN_VARIADIC => '\\.\\.\\.',
            self::TOKEN_DOUBLE_COLON => '::',
            self::TOKEN_DOUBLE_ARROW => '=>',
            self::TOKEN_EQUAL => '=',
            self::TOKEN_COLON => ':',
            self::TOKEN_OPEN_PHPDOC => '/\\*\\*(?=\\s)',
            self::TOKEN_CLOSE_PHPDOC => '\\*/',
            self::TOKEN_PHPDOC_TAG => '@[a-z-]++',
            self::TOKEN_PHPDOC_EOL => '\\r?+\\n[\\x09\\x20]*+(?:\\*(?!/))?',
            self::TOKEN_FLOAT => '(?:-?[0-9]++\\.[0-9]*+(?:e-?[0-9]++)?)|(?:-?[0-9]*+\\.[0-9]++(?:e-?[0-9]++)?)|(?:-?[0-9]++e-?[0-9]++)',
            self::TOKEN_INTEGER => '-?(?:(?:0b[0-1]++)|(?:0o[0-7]++)|(?:0x[0-9a-f]++)|(?:[0-9]++))',
            self::TOKEN_SINGLE_QUOTED_STRING => '\'(?:\\\\[^\\r\\n]|[^\'\\r\\n\\\\])*+\'',
            self::TOKEN_DOUBLE_QUOTED_STRING => '"(?:\\\\[^\\r\\n]|[^"\\r\\n\\\\])*+"',
            self::TOKEN_IDENTIFIER => '(?:[\\\\]?+[a-z_\\x80-\\xFF][0-9a-z_\\x80-\\xFF]*+)++',
            self::TOKEN_THIS_VARIABLE => '\\$this(?![0-9a-z_\\x80-\\xFF])',
            self::TOKEN_VARIABLE => '\\$[a-z_\\x80-\\xFF][0-9a-z_\\x80-\\xFF]*+',
            self::TOKEN_HORIZONTAL_WS => '[\\x09\\x20]++',
            // anything but TOKEN_CLOSE_PHPDOC or TOKEN_HORIZONTAL_WS or TOKEN_EOL
            self::TOKEN_OTHER => '(?:(?!\\*/)[^\\s])++',
        ];
        $this->regexp = '~(' . \implode(')|(', $patterns) . ')~Asi';
        $this->types = \array_keys($patterns);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Parser;

use PHPStan\PhpDocParser\Lexer\Lexer;
class ParserException extends \Exception
{
    /** @var string */
    private $currentTokenValue;
    /** @var int */
    private $currentTokenType;
    /** @var int */
    private $currentOffset;
    /** @var int */
    private $expectedTokenType;
    public function __construct(string $currentTokenValue, int $currentTokenType, int $currentOffset, int $expectedTokenType)
    {
        $this->currentTokenValue = $currentTokenValue;
        $this->currentTokenType = $currentTokenType;
        $this->currentOffset = $currentOffset;
        $this->expectedTokenType = $expectedTokenType;
        $json = \json_encode($currentTokenValue, \JSON_UNESCAPED_UNICODE | \JSON_UNESCAPED_SLASHES);
        \assert($json !== \false);
        parent::__construct(\sprintf('Unexpected token %s, expected %s at offset %d', $json, \PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_LABELS[$expectedTokenType], $currentOffset));
    }
    public function getCurrentTokenValue() : string
    {
        return $this->currentTokenValue;
    }
    public function getCurrentTokenType() : int
    {
        return $this->currentTokenType;
    }
    public function getCurrentOffset() : int
    {
        return $this->currentOffset;
    }
    public function getExpectedTokenType() : int
    {
        return $this->expectedTokenType;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Parser;

use PHPStan\PhpDocParser\Ast;
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
use PHPStan\PhpDocParser\Lexer\Lexer;
class PhpDocParser
{
    private const DISALLOWED_DESCRIPTION_START_TOKENS = [\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_UNION, \PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_INTERSECTION, \PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_ANGLE_BRACKET];
    /** @var TypeParser */
    private $typeParser;
    /** @var ConstExprParser */
    private $constantExprParser;
    public function __construct(\PHPStan\PhpDocParser\Parser\TypeParser $typeParser, \PHPStan\PhpDocParser\Parser\ConstExprParser $constantExprParser)
    {
        $this->typeParser = $typeParser;
        $this->constantExprParser = $constantExprParser;
    }
    public function parse(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode
    {
        $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_PHPDOC);
        $tokens->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_PHPDOC_EOL);
        $children = [];
        if (!$tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_CLOSE_PHPDOC)) {
            $children[] = $this->parseChild($tokens);
            while ($tokens->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_PHPDOC_EOL) && !$tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_CLOSE_PHPDOC)) {
                $children[] = $this->parseChild($tokens);
            }
        }
        $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_CLOSE_PHPDOC);
        return new \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode(\array_values($children));
    }
    private function parseChild(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocChildNode
    {
        if ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_PHPDOC_TAG)) {
            return $this->parseTag($tokens);
        }
        return $this->parseText($tokens);
    }
    private function parseText(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTextNode
    {
        $text = '';
        while (\true) {
            // If we received a Lexer::TOKEN_PHPDOC_EOL, exit early to prevent
            // them from being processed.
            if ($tokens->currentTokenType() === \PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_PHPDOC_EOL) {
                break;
            }
            $text .= $tokens->joinUntil(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_PHPDOC_EOL, \PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_CLOSE_PHPDOC, \PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_END);
            $text = \rtrim($text, " \t");
            // If we joined until TOKEN_PHPDOC_EOL, peak at the next tokens to see
            // if we have a multiline string to join.
            if ($tokens->currentTokenType() !== \PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_PHPDOC_EOL) {
                break;
            }
            // Peek at the next token to determine if it is more text that needs
            // to be combined.
            $tokens->pushSavePoint();
            $tokens->next();
            if ($tokens->currentTokenType() !== \PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_IDENTIFIER) {
                $tokens->rollback();
                break;
            }
            // There's more text on a new line, ensure spacing.
            $text .= "\n";
        }
        $text = \trim($text, " \t");
        return new \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTextNode($text);
    }
    public function parseTag(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode
    {
        $tag = $tokens->currentTokenValue();
        $tokens->next();
        $value = $this->parseTagValue($tokens, $tag);
        return new \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode($tag, $value);
    }
    public function parseTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens, string $tag) : \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode
    {
        try {
            $tokens->pushSavePoint();
            switch ($tag) {
                case '@param':
                    $tagValue = $this->parseParamTagValue($tokens);
                    break;
                case '@var':
                    $tagValue = $this->parseVarTagValue($tokens);
                    break;
                case '@return':
                    $tagValue = $this->parseReturnTagValue($tokens);
                    break;
                case '@throws':
                    $tagValue = $this->parseThrowsTagValue($tokens);
                    break;
                case '@deprecated':
                    $tagValue = $this->parseDeprecatedTagValue($tokens);
                    break;
                case '@property':
                case '@property-read':
                case '@property-write':
                    $tagValue = $this->parsePropertyTagValue($tokens);
                    break;
                case '@method':
                    $tagValue = $this->parseMethodTagValue($tokens);
                    break;
                case '@template':
                    $tagValue = $this->parseTemplateTagValue($tokens);
                    break;
                default:
                    $tagValue = new \PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode($this->parseOptionalDescription($tokens));
                    break;
            }
            $tokens->dropSavePoint();
        } catch (\PHPStan\PhpDocParser\Parser\ParserException $e) {
            $tokens->rollback();
            $tagValue = new \PHPStan\PhpDocParser\Ast\PhpDoc\InvalidTagValueNode($this->parseOptionalDescription($tokens), $e);
        }
        return $tagValue;
    }
    private function parseParamTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : \PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode
    {
        $type = $this->typeParser->parse($tokens);
        $isVariadic = $tokens->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_VARIADIC);
        $parameterName = $this->parseRequiredVariableName($tokens);
        $description = $this->parseOptionalDescription($tokens);
        return new \PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode($type, $isVariadic, $parameterName, $description);
    }
    private function parseVarTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : \PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode
    {
        $type = $this->typeParser->parse($tokens);
        $variableName = $this->parseOptionalVariableName($tokens);
        $description = $this->parseOptionalDescription($tokens, $variableName === '');
        return new \PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode($type, $variableName, $description);
    }
    private function parseReturnTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : \PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode
    {
        $type = $this->typeParser->parse($tokens);
        $description = $this->parseOptionalDescription($tokens, \true);
        return new \PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode($type, $description);
    }
    private function parseThrowsTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : \PHPStan\PhpDocParser\Ast\PhpDoc\ThrowsTagValueNode
    {
        $type = $this->typeParser->parse($tokens);
        $description = $this->parseOptionalDescription($tokens, \true);
        return new \PHPStan\PhpDocParser\Ast\PhpDoc\ThrowsTagValueNode($type, $description);
    }
    private function parseDeprecatedTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : \PHPStan\PhpDocParser\Ast\PhpDoc\DeprecatedTagValueNode
    {
        $description = $this->parseOptionalDescription($tokens);
        return new \PHPStan\PhpDocParser\Ast\PhpDoc\DeprecatedTagValueNode($description);
    }
    private function parsePropertyTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : \PHPStan\PhpDocParser\Ast\PhpDoc\PropertyTagValueNode
    {
        $type = $this->typeParser->parse($tokens);
        $parameterName = $this->parseRequiredVariableName($tokens);
        $description = $this->parseOptionalDescription($tokens);
        return new \PHPStan\PhpDocParser\Ast\PhpDoc\PropertyTagValueNode($type, $parameterName, $description);
    }
    private function parseMethodTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : \PHPStan\PhpDocParser\Ast\PhpDoc\MethodTagValueNode
    {
        $isStatic = $tokens->tryConsumeTokenValue('static');
        $returnTypeOrMethodName = $this->typeParser->parse($tokens);
        if ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_IDENTIFIER)) {
            $returnType = $returnTypeOrMethodName;
            $methodName = $tokens->currentTokenValue();
            $tokens->next();
        } elseif ($returnTypeOrMethodName instanceof \PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode) {
            $returnType = $isStatic ? new \PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode('static') : null;
            $methodName = $returnTypeOrMethodName->name;
            $isStatic = \false;
        } else {
            $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_IDENTIFIER);
            // will throw exception
            exit;
        }
        $parameters = [];
        $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_PARENTHESES);
        if (!$tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_CLOSE_PARENTHESES)) {
            $parameters[] = $this->parseMethodTagValueParameter($tokens);
            while ($tokens->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_COMMA)) {
                $parameters[] = $this->parseMethodTagValueParameter($tokens);
            }
        }
        $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_CLOSE_PARENTHESES);
        $description = $this->parseOptionalDescription($tokens);
        return new \PHPStan\PhpDocParser\Ast\PhpDoc\MethodTagValueNode($isStatic, $returnType, $methodName, $parameters, $description);
    }
    private function parseMethodTagValueParameter(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : \PHPStan\PhpDocParser\Ast\PhpDoc\MethodTagValueParameterNode
    {
        switch ($tokens->currentTokenType()) {
            case \PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_IDENTIFIER:
            case \PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_PARENTHESES:
            case \PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_NULLABLE:
                $parameterType = $this->typeParser->parse($tokens);
                break;
            default:
                $parameterType = null;
        }
        $isReference = $tokens->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_REFERENCE);
        $isVariadic = $tokens->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_VARIADIC);
        $parameterName = $tokens->currentTokenValue();
        $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_VARIABLE);
        if ($tokens->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_EQUAL)) {
            $defaultValue = $this->constantExprParser->parse($tokens);
        } else {
            $defaultValue = null;
        }
        return new \PHPStan\PhpDocParser\Ast\PhpDoc\MethodTagValueParameterNode($parameterType, $isReference, $isVariadic, $parameterName, $defaultValue);
    }
    private function parseTemplateTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : \PHPStan\PhpDocParser\Ast\PhpDoc\TemplateTagValueNode
    {
        $name = $tokens->currentTokenValue();
        $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_IDENTIFIER);
        if ($tokens->tryConsumeTokenValue('of')) {
            $bound = $this->typeParser->parse($tokens);
        } else {
            $bound = new \PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode('mixed');
        }
        $description = $this->parseOptionalDescription($tokens);
        return new \PHPStan\PhpDocParser\Ast\PhpDoc\TemplateTagValueNode($name, $bound, $description);
    }
    private function parseOptionalVariableName(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : string
    {
        if ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_VARIABLE)) {
            $parameterName = $tokens->currentTokenValue();
            $tokens->next();
        } else {
            $parameterName = '';
        }
        return $parameterName;
    }
    private function parseRequiredVariableName(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : string
    {
        $parameterName = $tokens->currentTokenValue();
        $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_VARIABLE);
        return $parameterName;
    }
    private function parseOptionalDescription(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens, bool $limitStartToken = \false) : string
    {
        if ($limitStartToken) {
            foreach (self::DISALLOWED_DESCRIPTION_START_TOKENS as $disallowedStartToken) {
                if (!$tokens->isCurrentTokenType($disallowedStartToken)) {
                    continue;
                }
                $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OTHER);
                // will throw exception
            }
        }
        return $this->parseText($tokens)->text;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Parser;

use PHPStan\PhpDocParser\Ast;
use PHPStan\PhpDocParser\Lexer\Lexer;
class ConstExprParser
{
    public function parse(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode
    {
        if ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_FLOAT)) {
            $value = $tokens->currentTokenValue();
            $tokens->next();
            return new \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprFloatNode($value);
        } elseif ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_INTEGER)) {
            $value = $tokens->currentTokenValue();
            $tokens->next();
            return new \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprIntegerNode($value);
        } elseif ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_SINGLE_QUOTED_STRING)) {
            $value = $tokens->currentTokenValue();
            $tokens->next();
            return new \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprStringNode($value);
        } elseif ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_DOUBLE_QUOTED_STRING)) {
            $value = $tokens->currentTokenValue();
            $tokens->next();
            return new \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprStringNode($value);
        } elseif ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_IDENTIFIER)) {
            $identifier = $tokens->currentTokenValue();
            $tokens->next();
            switch (\strtolower($identifier)) {
                case 'true':
                    return new \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprTrueNode();
                case 'false':
                    return new \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprFalseNode();
                case 'null':
                    return new \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNullNode();
                case 'array':
                    $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_PARENTHESES);
                    return $this->parseArray($tokens, \PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_CLOSE_PARENTHESES);
            }
            if ($tokens->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_DOUBLE_COLON)) {
                $classConstantName = $tokens->currentTokenValue();
                $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_IDENTIFIER);
                return new \PHPStan\PhpDocParser\Ast\ConstExpr\ConstFetchNode($identifier, $classConstantName);
            }
            return new \PHPStan\PhpDocParser\Ast\ConstExpr\ConstFetchNode('', $identifier);
        } elseif ($tokens->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_SQUARE_BRACKET)) {
            return $this->parseArray($tokens, \PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_CLOSE_SQUARE_BRACKET);
        }
        throw new \LogicException($tokens->currentTokenValue());
    }
    private function parseArray(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens, int $endToken) : \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprArrayNode
    {
        $items = [];
        if (!$tokens->tryConsumeTokenType($endToken)) {
            do {
                $items[] = $this->parseArrayItem($tokens);
            } while ($tokens->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_COMMA) && !$tokens->isCurrentTokenType($endToken));
            $tokens->consumeTokenType($endToken);
        }
        return new \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprArrayNode($items);
    }
    private function parseArrayItem(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprArrayItemNode
    {
        $expr = $this->parse($tokens);
        if ($tokens->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_DOUBLE_ARROW)) {
            $key = $expr;
            $value = $this->parse($tokens);
        } else {
            $key = null;
            $value = $expr;
        }
        return new \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprArrayItemNode($key, $value);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Parser;

use PHPStan\PhpDocParser\Ast;
use PHPStan\PhpDocParser\Lexer\Lexer;
class TypeParser
{
    public function parse(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : \PHPStan\PhpDocParser\Ast\Type\TypeNode
    {
        if ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_NULLABLE)) {
            $type = $this->parseNullable($tokens);
        } else {
            $type = $this->parseAtomic($tokens);
            if ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_UNION)) {
                $type = $this->parseUnion($tokens, $type);
            } elseif ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_INTERSECTION)) {
                $type = $this->parseIntersection($tokens, $type);
            }
        }
        return $type;
    }
    private function parseAtomic(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : \PHPStan\PhpDocParser\Ast\Type\TypeNode
    {
        if ($tokens->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_PARENTHESES)) {
            $type = $this->parse($tokens);
            $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_CLOSE_PARENTHESES);
            if ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_SQUARE_BRACKET)) {
                $type = $this->tryParseArray($tokens, $type);
            }
        } elseif ($tokens->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_THIS_VARIABLE)) {
            return new \PHPStan\PhpDocParser\Ast\Type\ThisTypeNode();
        } else {
            $type = new \PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode($tokens->currentTokenValue());
            $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_IDENTIFIER);
            if ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_ANGLE_BRACKET)) {
                $type = $this->parseGeneric($tokens, $type);
            } elseif ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_PARENTHESES)) {
                $type = $this->tryParseCallable($tokens, $type);
            } elseif ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_SQUARE_BRACKET)) {
                $type = $this->tryParseArray($tokens, $type);
            }
        }
        return $type;
    }
    private function parseUnion(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens, \PHPStan\PhpDocParser\Ast\Type\TypeNode $type) : \PHPStan\PhpDocParser\Ast\Type\TypeNode
    {
        $types = [$type];
        while ($tokens->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_UNION)) {
            $types[] = $this->parseAtomic($tokens);
        }
        return new \PHPStan\PhpDocParser\Ast\Type\UnionTypeNode($types);
    }
    private function parseIntersection(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens, \PHPStan\PhpDocParser\Ast\Type\TypeNode $type) : \PHPStan\PhpDocParser\Ast\Type\TypeNode
    {
        $types = [$type];
        while ($tokens->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_INTERSECTION)) {
            $types[] = $this->parseAtomic($tokens);
        }
        return new \PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode($types);
    }
    private function parseNullable(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : \PHPStan\PhpDocParser\Ast\Type\TypeNode
    {
        $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_NULLABLE);
        $type = new \PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode($tokens->currentTokenValue());
        $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_IDENTIFIER);
        if ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_ANGLE_BRACKET)) {
            $type = $this->parseGeneric($tokens, $type);
        }
        return new \PHPStan\PhpDocParser\Ast\Type\NullableTypeNode($type);
    }
    private function parseGeneric(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens, \PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode $baseType) : \PHPStan\PhpDocParser\Ast\Type\TypeNode
    {
        $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_ANGLE_BRACKET);
        $genericTypes[] = $this->parse($tokens);
        while ($tokens->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_COMMA)) {
            $genericTypes[] = $this->parse($tokens);
        }
        $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_CLOSE_ANGLE_BRACKET);
        return new \PHPStan\PhpDocParser\Ast\Type\GenericTypeNode($baseType, $genericTypes);
    }
    private function parseCallable(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens, \PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode $identifier) : \PHPStan\PhpDocParser\Ast\Type\TypeNode
    {
        $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_PARENTHESES);
        $parameters = [];
        if (!$tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_CLOSE_PARENTHESES)) {
            $parameters[] = $this->parseCallableParameter($tokens);
            while ($tokens->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_COMMA)) {
                $parameters[] = $this->parseCallableParameter($tokens);
            }
        }
        $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_CLOSE_PARENTHESES);
        $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_COLON);
        $returnType = $this->parseCallableReturnType($tokens);
        return new \PHPStan\PhpDocParser\Ast\Type\CallableTypeNode($identifier, $parameters, $returnType);
    }
    private function parseCallableParameter(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : \PHPStan\PhpDocParser\Ast\Type\CallableTypeParameterNode
    {
        $type = $this->parse($tokens);
        $isReference = $tokens->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_REFERENCE);
        $isVariadic = $tokens->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_VARIADIC);
        if ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_VARIABLE)) {
            $parameterName = $tokens->currentTokenValue();
            $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_VARIABLE);
        } else {
            $parameterName = '';
        }
        $isOptional = $tokens->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_EQUAL);
        return new \PHPStan\PhpDocParser\Ast\Type\CallableTypeParameterNode($type, $isReference, $isVariadic, $parameterName, $isOptional);
    }
    private function parseCallableReturnType(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : \PHPStan\PhpDocParser\Ast\Type\TypeNode
    {
        if ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_NULLABLE)) {
            $type = $this->parseNullable($tokens);
        } elseif ($tokens->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_PARENTHESES)) {
            $type = $this->parse($tokens);
            $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_CLOSE_PARENTHESES);
        } else {
            $type = new \PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode($tokens->currentTokenValue());
            $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_IDENTIFIER);
            if ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_ANGLE_BRACKET)) {
                $type = $this->parseGeneric($tokens, $type);
            }
        }
        return $type;
    }
    private function tryParseCallable(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens, \PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode $identifier) : \PHPStan\PhpDocParser\Ast\Type\TypeNode
    {
        try {
            $tokens->pushSavePoint();
            $type = $this->parseCallable($tokens, $identifier);
            $tokens->dropSavePoint();
        } catch (\PHPStan\PhpDocParser\Parser\ParserException $e) {
            $tokens->rollback();
            $type = $identifier;
        }
        return $type;
    }
    private function tryParseArray(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens, \PHPStan\PhpDocParser\Ast\Type\TypeNode $type) : \PHPStan\PhpDocParser\Ast\Type\TypeNode
    {
        try {
            while ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_SQUARE_BRACKET)) {
                $tokens->pushSavePoint();
                $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_SQUARE_BRACKET);
                $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_CLOSE_SQUARE_BRACKET);
                $tokens->dropSavePoint();
                $type = new \PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode($type);
            }
        } catch (\PHPStan\PhpDocParser\Parser\ParserException $e) {
            $tokens->rollback();
        }
        return $type;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Parser;

use PHPStan\PhpDocParser\Lexer\Lexer;
class TokenIterator
{
    /** @var mixed[][] */
    private $tokens;
    /** @var int */
    private $index;
    /** @var int[] */
    private $savePoints = [];
    public function __construct(array $tokens, int $index = 0)
    {
        $this->tokens = $tokens;
        $this->index = $index;
        if ($this->tokens[$this->index][\PHPStan\PhpDocParser\Lexer\Lexer::TYPE_OFFSET] !== \PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_HORIZONTAL_WS) {
            return;
        }
        $this->index++;
    }
    public function currentTokenValue() : string
    {
        return $this->tokens[$this->index][\PHPStan\PhpDocParser\Lexer\Lexer::VALUE_OFFSET];
    }
    public function currentTokenType() : int
    {
        return $this->tokens[$this->index][\PHPStan\PhpDocParser\Lexer\Lexer::TYPE_OFFSET];
    }
    public function currentTokenOffset() : int
    {
        $offset = 0;
        for ($i = 0; $i < $this->index; $i++) {
            $offset += \strlen($this->tokens[$i][\PHPStan\PhpDocParser\Lexer\Lexer::VALUE_OFFSET]);
        }
        return $offset;
    }
    public function isCurrentTokenValue(string $tokenValue) : bool
    {
        return $this->tokens[$this->index][\PHPStan\PhpDocParser\Lexer\Lexer::VALUE_OFFSET] === $tokenValue;
    }
    public function isCurrentTokenType(int $tokenType) : bool
    {
        return $this->tokens[$this->index][\PHPStan\PhpDocParser\Lexer\Lexer::TYPE_OFFSET] === $tokenType;
    }
    /**
     * @param  int $tokenType
     * @throws \PHPStan\PhpDocParser\Parser\ParserException
     */
    public function consumeTokenType(int $tokenType) : void
    {
        if ($this->tokens[$this->index][\PHPStan\PhpDocParser\Lexer\Lexer::TYPE_OFFSET] !== $tokenType) {
            $this->throwError($tokenType);
        }
        $this->index++;
        if (($this->tokens[$this->index][\PHPStan\PhpDocParser\Lexer\Lexer::TYPE_OFFSET] ?? -1) !== \PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_HORIZONTAL_WS) {
            return;
        }
        $this->index++;
    }
    public function tryConsumeTokenValue(string $tokenValue) : bool
    {
        if ($this->tokens[$this->index][\PHPStan\PhpDocParser\Lexer\Lexer::VALUE_OFFSET] !== $tokenValue) {
            return \false;
        }
        $this->index++;
        if ($this->tokens[$this->index][\PHPStan\PhpDocParser\Lexer\Lexer::TYPE_OFFSET] === \PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_HORIZONTAL_WS) {
            $this->index++;
        }
        return \true;
    }
    public function tryConsumeTokenType(int $tokenType) : bool
    {
        if ($this->tokens[$this->index][\PHPStan\PhpDocParser\Lexer\Lexer::TYPE_OFFSET] !== $tokenType) {
            return \false;
        }
        $this->index++;
        if ($this->tokens[$this->index][\PHPStan\PhpDocParser\Lexer\Lexer::TYPE_OFFSET] === \PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_HORIZONTAL_WS) {
            $this->index++;
        }
        return \true;
    }
    public function getSkippedHorizontalWhiteSpaceIfAny() : string
    {
        if ($this->tokens[$this->index - 1][\PHPStan\PhpDocParser\Lexer\Lexer::TYPE_OFFSET] === \PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_HORIZONTAL_WS) {
            return $this->tokens[$this->index - 1][\PHPStan\PhpDocParser\Lexer\Lexer::VALUE_OFFSET];
        }
        return '';
    }
    public function joinUntil(int ...$tokenType) : string
    {
        $s = '';
        while (!\in_array($this->tokens[$this->index][\PHPStan\PhpDocParser\Lexer\Lexer::TYPE_OFFSET], $tokenType, \true)) {
            $s .= $this->tokens[$this->index++][\PHPStan\PhpDocParser\Lexer\Lexer::VALUE_OFFSET];
        }
        return $s;
    }
    public function next() : void
    {
        $this->index++;
        if ($this->tokens[$this->index][\PHPStan\PhpDocParser\Lexer\Lexer::TYPE_OFFSET] !== \PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_HORIZONTAL_WS) {
            return;
        }
        $this->index++;
    }
    public function pushSavePoint() : void
    {
        $this->savePoints[] = $this->index;
    }
    public function dropSavePoint() : void
    {
        \array_pop($this->savePoints);
    }
    public function rollback() : void
    {
        $index = \array_pop($this->savePoints);
        \assert($index !== null);
        $this->index = $index;
    }
    /**
     * @param  int $expectedTokenType
     * @throws \PHPStan\PhpDocParser\Parser\ParserException
     */
    private function throwError(int $expectedTokenType) : void
    {
        throw new \PHPStan\PhpDocParser\Parser\ParserException($this->currentTokenValue(), $this->currentTokenType(), $this->currentTokenOffset(), $expectedTokenType);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\PhpDoc;

use PHPStan\PhpDocParser\Ast\Type\TypeNode;
class TemplateTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode
{
    /** @var string */
    public $name;
    /** @var TypeNode */
    public $bound;
    /** @var string (may be empty) */
    public $description;
    public function __construct(string $name, \PHPStan\PhpDocParser\Ast\Type\TypeNode $bound, string $description)
    {
        $this->name = $name;
        $this->bound = $bound;
        $this->description = $description;
    }
    public function __toString() : string
    {
        return \trim("{$this->name} of {$this->bound} {$this->description}");
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\PhpDoc;

use PHPStan\PhpDocParser\Ast\Type\TypeNode;
class ThrowsTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode
{
    /** @var TypeNode */
    public $type;
    /** @var string (may be empty) */
    public $description;
    public function __construct(\PHPStan\PhpDocParser\Ast\Type\TypeNode $type, string $description)
    {
        $this->type = $type;
        $this->description = $description;
    }
    public function __toString() : string
    {
        return \trim("{$this->type} {$this->description}");
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\PhpDoc;

use PHPStan\PhpDocParser\Ast\Node;
interface PhpDocTagValueNode extends \PHPStan\PhpDocParser\Ast\Node
{
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\PhpDoc;

class PhpDocTextNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocChildNode
{
    /** @var string */
    public $text;
    public function __construct(string $text)
    {
        $this->text = $text;
    }
    public function __toString() : string
    {
        return $this->text;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\PhpDoc;

use PHPStan\PhpDocParser\Ast\Node;
class PhpDocNode implements \PHPStan\PhpDocParser\Ast\Node
{
    /** @var PhpDocChildNode[] */
    public $children;
    /**
     * @param PhpDocChildNode[] $children
     */
    public function __construct(array $children)
    {
        $this->children = $children;
    }
    /**
     * @return PhpDocTagNode[]
     */
    public function getTags() : array
    {
        return \array_filter($this->children, static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocChildNode $child) : bool {
            return $child instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode;
        });
    }
    /**
     * @param  string $tagName
     * @return PhpDocTagNode[]
     */
    public function getTagsByName(string $tagName) : array
    {
        return \array_filter($this->getTags(), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode $tag) use($tagName) : bool {
            return $tag->name === $tagName;
        });
    }
    /**
     * @return VarTagValueNode[]
     */
    public function getVarTagValues() : array
    {
        return \array_column(\array_filter($this->getTagsByName('@var'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode $tag) : bool {
            return $tag->value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode;
        }), 'value');
    }
    /**
     * @return ParamTagValueNode[]
     */
    public function getParamTagValues() : array
    {
        return \array_column(\array_filter($this->getTagsByName('@param'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode $tag) : bool {
            return $tag->value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode;
        }), 'value');
    }
    /**
     * @return TemplateTagValueNode[]
     */
    public function getTemplateTagValues() : array
    {
        return \array_column(\array_filter($this->getTagsByName('@template'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode $tag) : bool {
            return $tag->value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\TemplateTagValueNode;
        }), 'value');
    }
    /**
     * @return ReturnTagValueNode[]
     */
    public function getReturnTagValues() : array
    {
        return \array_column(\array_filter($this->getTagsByName('@return'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode $tag) : bool {
            return $tag->value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode;
        }), 'value');
    }
    /**
     * @return ThrowsTagValueNode[]
     */
    public function getThrowsTagValues() : array
    {
        return \array_column(\array_filter($this->getTagsByName('@throws'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode $tag) : bool {
            return $tag->value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ThrowsTagValueNode;
        }), 'value');
    }
    /**
     * @return \PHPStan\PhpDocParser\Ast\PhpDoc\DeprecatedTagValueNode[]
     */
    public function getDeprecatedTagValues() : array
    {
        return \array_column(\array_filter($this->getTagsByName('@deprecated'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode $tag) : bool {
            return $tag->value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\DeprecatedTagValueNode;
        }), 'value');
    }
    /**
     * @return PropertyTagValueNode[]
     */
    public function getPropertyTagValues() : array
    {
        return \array_column(\array_filter($this->getTagsByName('@property'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode $tag) : bool {
            return $tag->value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\PropertyTagValueNode;
        }), 'value');
    }
    /**
     * @return PropertyTagValueNode[]
     */
    public function getPropertyReadTagValues() : array
    {
        return \array_column(\array_filter($this->getTagsByName('@property-read'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode $tag) : bool {
            return $tag->value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\PropertyTagValueNode;
        }), 'value');
    }
    /**
     * @return PropertyTagValueNode[]
     */
    public function getPropertyWriteTagValues() : array
    {
        return \array_column(\array_filter($this->getTagsByName('@property-write'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode $tag) : bool {
            return $tag->value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\PropertyTagValueNode;
        }), 'value');
    }
    /**
     * @return MethodTagValueNode[]
     */
    public function getMethodTagValues() : array
    {
        return \array_column(\array_filter($this->getTagsByName('@method'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode $tag) : bool {
            return $tag->value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\MethodTagValueNode;
        }), 'value');
    }
    public function __toString() : string
    {
        return "/**\n * " . \implode("\n * ", $this->children) . '*/';
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\PhpDoc;

class GenericTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode
{
    /** @var string (may be empty) */
    public $value;
    public function __construct(string $value)
    {
        $this->value = $value;
    }
    public function __toString() : string
    {
        return $this->value;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\PhpDoc;

use PHPStan\PhpDocParser\Ast\Type\TypeNode;
class ReturnTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode
{
    /** @var TypeNode */
    public $type;
    /** @var string (may be empty) */
    public $description;
    public function __construct(\PHPStan\PhpDocParser\Ast\Type\TypeNode $type, string $description)
    {
        $this->type = $type;
        $this->description = $description;
    }
    public function __toString() : string
    {
        return \trim("{$this->type} {$this->description}");
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\PhpDoc;

use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode;
use PHPStan\PhpDocParser\Ast\Node;
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
class MethodTagValueParameterNode implements \PHPStan\PhpDocParser\Ast\Node
{
    /** @var TypeNode|null */
    public $type;
    /** @var bool */
    public $isReference;
    /** @var bool */
    public $isVariadic;
    /** @var string */
    public $parameterName;
    /** @var ConstExprNode|null */
    public $defaultValue;
    public function __construct(?\PHPStan\PhpDocParser\Ast\Type\TypeNode $type, bool $isReference, bool $isVariadic, string $parameterName, ?\PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode $defaultValue)
    {
        $this->type = $type;
        $this->isReference = $isReference;
        $this->isVariadic = $isVariadic;
        $this->parameterName = $parameterName;
        $this->defaultValue = $defaultValue;
    }
    public function __toString() : string
    {
        $type = $this->type ? "{$this->type} " : '';
        $isReference = $this->isReference ? '&' : '';
        $isVariadic = $this->isVariadic ? '...' : '';
        $default = $this->defaultValue ? " = {$this->defaultValue}" : '';
        return "{$type}{$isReference}{$isVariadic}{$this->parameterName}{$default}";
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\PhpDoc;

class InvalidTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode
{
    /** @var string (may be empty) */
    public $value;
    /** @var \PHPStan\PhpDocParser\Parser\ParserException */
    public $exception;
    public function __construct(string $value, \PHPStan\PhpDocParser\Parser\ParserException $exception)
    {
        $this->value = $value;
        $this->exception = $exception;
    }
    public function __toString() : string
    {
        return $this->value;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\PhpDoc;

use PHPStan\PhpDocParser\Ast\Type\TypeNode;
class VarTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode
{
    /** @var TypeNode */
    public $type;
    /** @var string (may be empty) */
    public $variableName;
    /** @var string (may be empty) */
    public $description;
    public function __construct(\PHPStan\PhpDocParser\Ast\Type\TypeNode $type, string $variableName, string $description)
    {
        $this->type = $type;
        $this->variableName = $variableName;
        $this->description = $description;
    }
    public function __toString() : string
    {
        return \trim("{$this->type} " . \trim("{$this->variableName} {$this->description}"));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\PhpDoc;

class PhpDocTagNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocChildNode
{
    /** @var string */
    public $name;
    /** @var PhpDocTagValueNode */
    public $value;
    public function __construct(string $name, \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value)
    {
        $this->name = $name;
        $this->value = $value;
    }
    public function __toString() : string
    {
        return \trim("{$this->name} {$this->value}");
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\PhpDoc;

use PHPStan\PhpDocParser\Ast\Type\TypeNode;
class PropertyTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode
{
    /** @var TypeNode */
    public $type;
    /** @var string */
    public $propertyName;
    /** @var string (may be empty) */
    public $description;
    public function __construct(\PHPStan\PhpDocParser\Ast\Type\TypeNode $type, string $propertyName, string $description)
    {
        $this->type = $type;
        $this->propertyName = $propertyName;
        $this->description = $description;
    }
    public function __toString() : string
    {
        return \trim("{$this->type} {$this->propertyName} {$this->description}");
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\PhpDoc;

use PHPStan\PhpDocParser\Ast\Node;
interface PhpDocChildNode extends \PHPStan\PhpDocParser\Ast\Node
{
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\PhpDoc;

use PHPStan\PhpDocParser\Ast\Type\TypeNode;
class ParamTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode
{
    /** @var TypeNode */
    public $type;
    /** @var bool */
    public $isVariadic;
    /** @var string */
    public $parameterName;
    /** @var string (may be empty) */
    public $description;
    public function __construct(\PHPStan\PhpDocParser\Ast\Type\TypeNode $type, bool $isVariadic, string $parameterName, string $description)
    {
        $this->type = $type;
        $this->isVariadic = $isVariadic;
        $this->parameterName = $parameterName;
        $this->description = $description;
    }
    public function __toString() : string
    {
        $variadic = $this->isVariadic ? '...' : '';
        return \trim("{$this->type} {$variadic}{$this->parameterName} {$this->description}");
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\PhpDoc;

use PHPStan\PhpDocParser\Ast\Type\TypeNode;
class MethodTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode
{
    /** @var bool */
    public $isStatic;
    /** @var TypeNode|null */
    public $returnType;
    /** @var string */
    public $methodName;
    /** @var MethodTagValueParameterNode[] */
    public $parameters;
    /** @var string (may be empty) */
    public $description;
    public function __construct(bool $isStatic, ?\PHPStan\PhpDocParser\Ast\Type\TypeNode $returnType, string $methodName, array $parameters, string $description)
    {
        $this->isStatic = $isStatic;
        $this->returnType = $returnType;
        $this->methodName = $methodName;
        $this->parameters = $parameters;
        $this->description = $description;
    }
    public function __toString() : string
    {
        $static = $this->isStatic ? 'static ' : '';
        $returnType = $this->returnType ? "{$this->returnType} " : '';
        $parameters = \implode(', ', $this->parameters);
        $description = $this->description !== '' ? " {$this->description}" : '';
        return "{$static}{$returnType}{$this->methodName}({$parameters}){$description}";
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\PhpDoc;

class DeprecatedTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode
{
    /** @var string (may be empty) */
    public $description;
    public function __construct(string $description)
    {
        $this->description = $description;
    }
    public function __toString() : string
    {
        return \trim($this->description);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\ConstExpr;

class ConstFetchNode implements \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode
{
    /** @var string class name for class constants or empty string for non-class constants */
    public $className;
    /** @var string */
    public $name;
    public function __construct(string $className, string $name)
    {
        $this->className = $className;
        $this->name = $name;
    }
    public function __toString() : string
    {
        if ($this->className === '') {
            return $this->name;
        }
        return "{$this->className}::{$this->name}";
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\ConstExpr;

class ConstExprArrayNode implements \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode
{
    /** @var ConstExprArrayItemNode[] */
    public $items;
    /**
     * @param ConstExprArrayItemNode[] $items
     */
    public function __construct(array $items)
    {
        $this->items = $items;
    }
    public function __toString() : string
    {
        return '[' . \implode(', ', $this->items) . ']';
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\ConstExpr;

use PHPStan\PhpDocParser\Ast\Node;
interface ConstExprNode extends \PHPStan\PhpDocParser\Ast\Node
{
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\ConstExpr;

class ConstExprStringNode implements \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode
{
    /** @var string */
    public $value;
    public function __construct(string $value)
    {
        $this->value = $value;
    }
    public function __toString() : string
    {
        return $this->value;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\ConstExpr;

class ConstExprTrueNode implements \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode
{
    public function __toString() : string
    {
        return 'true';
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\ConstExpr;

class ConstExprIntegerNode implements \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode
{
    /** @var string */
    public $value;
    public function __construct(string $value)
    {
        $this->value = $value;
    }
    public function __toString() : string
    {
        return $this->value;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\ConstExpr;

class ConstExprFalseNode implements \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode
{
    public function __toString() : string
    {
        return 'false';
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\ConstExpr;

class ConstExprArrayItemNode implements \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode
{
    /** @var ConstExprNode|null */
    public $key;
    /** @var ConstExprNode */
    public $value;
    public function __construct(?\PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode $key, \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode $value)
    {
        $this->key = $key;
        $this->value = $value;
    }
    public function __toString() : string
    {
        if ($this->key !== null) {
            return "{$this->key} => {$this->value}";
        }
        return "{$this->value}";
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\ConstExpr;

class ConstExprNullNode implements \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode
{
    public function __toString() : string
    {
        return 'null';
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\ConstExpr;

class ConstExprFloatNode implements \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode
{
    /** @var string */
    public $value;
    public function __construct(string $value)
    {
        $this->value = $value;
    }
    public function __toString() : string
    {
        return $this->value;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast;

interface Node
{
    public function __toString() : string;
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\Type;

class UnionTypeNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode
{
    /** @var TypeNode[] */
    public $types;
    public function __construct(array $types)
    {
        $this->types = $types;
    }
    public function __toString() : string
    {
        return '(' . \implode(' | ', $this->types) . ')';
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\Type;

class IntersectionTypeNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode
{
    /** @var TypeNode[] */
    public $types;
    public function __construct(array $types)
    {
        $this->types = $types;
    }
    public function __toString() : string
    {
        return '(' . \implode(' & ', $this->types) . ')';
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\Type;

class IdentifierTypeNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode
{
    /** @var string */
    public $name;
    public function __construct(string $name)
    {
        $this->name = $name;
    }
    public function __toString() : string
    {
        return $this->name;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\Type;

use PHPStan\PhpDocParser\Ast\Node;
class CallableTypeParameterNode implements \PHPStan\PhpDocParser\Ast\Node
{
    /** @var TypeNode */
    public $type;
    /** @var bool */
    public $isReference;
    /** @var bool */
    public $isVariadic;
    /** @var string (may be empty) */
    public $parameterName;
    /** @var bool */
    public $isOptional;
    public function __construct(\PHPStan\PhpDocParser\Ast\Type\TypeNode $type, bool $isReference, bool $isVariadic, string $parameterName, bool $isOptional)
    {
        $this->type = $type;
        $this->isReference = $isReference;
        $this->isVariadic = $isVariadic;
        $this->parameterName = $parameterName;
        $this->isOptional = $isOptional;
    }
    public function __toString() : string
    {
        $type = "{$this->type} ";
        $isReference = $this->isReference ? '&' : '';
        $isVariadic = $this->isVariadic ? '...' : '';
        $default = $this->isOptional ? ' = default' : '';
        return "{$type}{$isReference}{$isVariadic}{$this->parameterName}{$default}";
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\Type;

class CallableTypeNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode
{
    /** @var IdentifierTypeNode */
    public $identifier;
    /** @var CallableTypeParameterNode[] */
    public $parameters;
    /** @var TypeNode */
    public $returnType;
    public function __construct(\PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode $identifier, array $parameters, \PHPStan\PhpDocParser\Ast\Type\TypeNode $returnType)
    {
        $this->identifier = $identifier;
        $this->parameters = $parameters;
        $this->returnType = $returnType;
    }
    public function __toString() : string
    {
        $parameters = \implode(', ', $this->parameters);
        return "{$this->identifier}({$parameters}): {$this->returnType}";
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\Type;

use PHPStan\PhpDocParser\Ast\Node;
interface TypeNode extends \PHPStan\PhpDocParser\Ast\Node
{
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\Type;

class ThisTypeNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode
{
    public function __toString() : string
    {
        return '$this';
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\Type;

class NullableTypeNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode
{
    /** @var TypeNode */
    public $type;
    public function __construct(\PHPStan\PhpDocParser\Ast\Type\TypeNode $type)
    {
        $this->type = $type;
    }
    public function __toString() : string
    {
        return '?' . $this->type;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\Type;

class GenericTypeNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode
{
    /** @var IdentifierTypeNode */
    public $type;
    /** @var TypeNode[] */
    public $genericTypes;
    public function __construct(\PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode $type, array $genericTypes)
    {
        $this->type = $type;
        $this->genericTypes = $genericTypes;
    }
    public function __toString() : string
    {
        return $this->type . '<' . \implode(', ', $this->genericTypes) . '>';
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\Type;

class ArrayTypeNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode
{
    /** @var TypeNode */
    public $type;
    public function __construct(\PHPStan\PhpDocParser\Ast\Type\TypeNode $type)
    {
        $this->type = $type;
    }
    public function __toString() : string
    {
        return $this->type . '[]';
    }
}
{
    "name": "jean85\/pretty-package-versions",
    "description": "A wrapper for ocramius\/package-versions to get pretty versions strings",
    "type": "library",
    "require": {
        "php": "^7.0",
        "ocramius\/package-versions": "^1.2.0"
    },
    "require-dev": {
        "phpunit\/phpunit": "^6.0"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "Alessandro Lai",
            "email": "alessandro.lai85@gmail.com"
        }
    ],
    "support": {
        "issues": "https:\/\/github.com\/Jean85\/pretty-package-versions\/issues"
    },
    "keywords": [
        "package",
        "versions",
        "composer",
        "release"
    ],
    "extra": {
        "branch-alias": {
            "dev-master": "1.x-dev"
        }
    },
    "autoload": {
        "psr-4": {
            "_HumbugBoxb94336daae36\\Jean85\\": "src\/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "_HumbugBoxb94336daae36\\Tests\\": "tests"
        }
    }
}<?php

namespace _HumbugBoxb94336daae36\Jean85;

class Version
{
    const SHORT_COMMIT_LENGTH = 7;
    /** @var string */
    private $packageName;
    /** @var string */
    private $shortVersion;
    /** @var string */
    private $commitHash;
    /** @var bool */
    private $versionIsTagged;
    /**
     * Version constructor.
     * @param string $packageName
     * @param string $version
     */
    public function __construct(string $packageName, string $version)
    {
        $this->packageName = $packageName;
        $splittedVersion = \explode('@', $version);
        $this->shortVersion = $splittedVersion[0];
        $this->commitHash = $splittedVersion[1];
        $this->versionIsTagged = \preg_match('/[^v\\d\\.]/', $this->getShortVersion()) === 0;
    }
    public function getPrettyVersion() : string
    {
        if ($this->versionIsTagged) {
            return $this->getShortVersion();
        }
        return $this->getVersionWithShortCommit();
    }
    public function getFullVersion() : string
    {
        return $this->getShortVersion() . '@' . $this->getCommitHash();
    }
    public function getVersionWithShortCommit() : string
    {
        return $this->getShortVersion() . '@' . $this->getShortCommitHash();
    }
    public function getPackageName() : string
    {
        return $this->packageName;
    }
    public function getShortVersion() : string
    {
        return $this->shortVersion;
    }
    public function getCommitHash() : string
    {
        return $this->commitHash;
    }
    public function getShortCommitHash() : string
    {
        return \substr($this->commitHash, 0, self::SHORT_COMMIT_LENGTH);
    }
    public function __toString() : string
    {
        return $this->getPrettyVersion();
    }
}
<?php

namespace _HumbugBoxb94336daae36\Jean85;

use _HumbugBoxb94336daae36\PackageVersions\Versions;
class PrettyVersions
{
    const SHORT_COMMIT_LENGTH = 7;
    public static function getVersion(string $packageName) : \_HumbugBoxb94336daae36\Jean85\Version
    {
        return new \_HumbugBoxb94336daae36\Jean85\Version($packageName, \_HumbugBoxb94336daae36\PackageVersions\Versions::getVersion($packageName));
    }
}
{
    "name": "dg\/composer-cleaner",
    "type": "composer-plugin",
    "description": "Victor The Cleaner: removes unnecessary files from vendor directory.",
    "keywords": [
        "composer"
    ],
    "license": [
        "BSD-3-Clause"
    ],
    "authors": [
        {
            "name": "David Grudl",
            "homepage": "https:\/\/davidgrudl.com"
        }
    ],
    "require": {
        "php": ">=5.4.0",
        "composer-plugin-api": "^1.0"
    },
    "require-dev": {
        "nette\/tester": "^1.7"
    },
    "autoload": {
        "classmap": [
            "src\/"
        ]
    },
    "extra": {
        "class": "DG\\ComposerCleaner\\Plugin"
    }
}<?php

namespace _HumbugBoxb94336daae36\DG\ComposerCleaner;

use _HumbugBoxb94336daae36\Composer\Composer;
use _HumbugBoxb94336daae36\Composer\EventDispatcher\EventSubscriberInterface;
use _HumbugBoxb94336daae36\Composer\IO\IOInterface;
use _HumbugBoxb94336daae36\Composer\Plugin\PluginInterface;
use _HumbugBoxb94336daae36\Composer\Script\Event;
use _HumbugBoxb94336daae36\Composer\Script\ScriptEvents;
use _HumbugBoxb94336daae36\Composer\Util\Filesystem;
use _HumbugBoxb94336daae36\Composer\Util\ProcessExecutor;
class Plugin implements \_HumbugBoxb94336daae36\Composer\Plugin\PluginInterface, \_HumbugBoxb94336daae36\Composer\EventDispatcher\EventSubscriberInterface
{
    public function activate(\_HumbugBoxb94336daae36\Composer\Composer $composer, \_HumbugBoxb94336daae36\Composer\IO\IOInterface $io)
    {
    }
    public static function getSubscribedEvents()
    {
        return [\_HumbugBoxb94336daae36\Composer\Script\ScriptEvents::POST_UPDATE_CMD => 'clean', \_HumbugBoxb94336daae36\Composer\Script\ScriptEvents::POST_INSTALL_CMD => 'clean'];
    }
    public function clean(\_HumbugBoxb94336daae36\Composer\Script\Event $event)
    {
        $vendorDir = $event->getComposer()->getConfig()->get('vendor-dir');
        $extra = $event->getComposer()->getPackage()->getExtra();
        $ignorePaths = isset($extra['cleaner-ignore']) ? $extra['cleaner-ignore'] : (array) $event->getComposer()->getConfig()->get('cleaner-ignore');
        $fileSystem = new \_HumbugBoxb94336daae36\Composer\Util\Filesystem(new \_HumbugBoxb94336daae36\Composer\Util\ProcessExecutor($event->getIO()));
        $cleaner = new \_HumbugBoxb94336daae36\DG\ComposerCleaner\Cleaner($event->getIO(), $fileSystem);
        $cleaner->clean($vendorDir, $ignorePaths);
    }
}
<?php

/**
 * Victor The Cleaner for Composer.
 *
 * Copyright (c) 2015 David Grudl (https://davidgrudl.com)
 */
namespace _HumbugBoxb94336daae36\DG\ComposerCleaner;

use _HumbugBoxb94336daae36\Composer\IO\IOInterface;
use _HumbugBoxb94336daae36\Composer\Util\Filesystem;
use FilesystemIterator;
use stdClass;
class Cleaner
{
    /** @var IOInterface */
    private $io;
    /** @var Filesystem */
    private $fileSystem;
    /** @var int */
    private $removedCount = 0;
    /** @var array */
    private static $allowedComposerTypes = [null, 'library', 'composer-plugin'];
    /** @var string[] */
    private static $alwaysIgnore = ['composer.json', 'license*', 'LICENSE*', '.phpstorm.meta.php'];
    public function __construct(\_HumbugBoxb94336daae36\Composer\IO\IOInterface $io, \_HumbugBoxb94336daae36\Composer\Util\Filesystem $fileSystem)
    {
        $this->io = $io;
        $this->fileSystem = $fileSystem;
    }
    /**
     * @return void
     */
    public function clean($vendorDir, array $ignorePaths = [])
    {
        foreach (new \FilesystemIterator($vendorDir) as $packageVendor) {
            if (!$packageVendor->isDir()) {
                continue;
            }
            foreach (new \FilesystemIterator($packageVendor) as $packageName) {
                if (!$packageName->isDir()) {
                    continue;
                }
                $name = $packageVendor->getFileName() . '/' . $packageName->getFileName();
                $ignore = isset($ignorePaths[$name]) ? $ignorePaths[$name] : null;
                if ($ignore === \true) {
                    $this->io->write("Composer cleaner: Skipped package {$name}", \true, \_HumbugBoxb94336daae36\Composer\IO\IOInterface::VERBOSE);
                } else {
                    $this->io->write("Composer cleaner: Package {$name}", \true, \_HumbugBoxb94336daae36\Composer\IO\IOInterface::VERBOSE);
                    $this->processPackage((string) $packageName, (array) $ignore);
                }
            }
        }
        $this->io->write("Composer cleaner: Removed {$this->removedCount} files or directories.");
    }
    /**
     * @return void
     */
    private function processPackage($packageDir, array $ignoreFiles)
    {
        $data = $this->loadComposerJson($packageDir);
        $type = isset($data->type) ? $data->type : null;
        if (!$data || !\in_array($type, self::$allowedComposerTypes, \true)) {
            return;
        }
        foreach ($this->getExcludes($data) as $exclude) {
            $dir = \trim(\ltrim($exclude, '.'), '/');
            if ($dir && \strpos($dir, '..') === \false && !self::matchMask($dir, $ignoreFiles)) {
                $path = $packageDir . '/' . $dir;
                $this->io->write("Composer cleaner: Removing {$path}", \true, \_HumbugBoxb94336daae36\Composer\IO\IOInterface::VERBOSE);
                $this->fileSystem->remove($path);
                $this->removedCount++;
            }
        }
        foreach ($this->getSources($data) as $source) {
            $dir = \strstr(\ltrim(\ltrim($source, '.'), '/') . '/', '/', \true);
            $ignoreFiles[] = $dir;
        }
        if (!$ignoreFiles || self::matchMask('', $ignoreFiles)) {
            return;
        }
        $ignoreFiles = \array_merge($ignoreFiles, self::$alwaysIgnore);
        foreach (new \FilesystemIterator($packageDir) as $path) {
            $fileName = $path->getFileName();
            if (!self::matchMask($fileName, $ignoreFiles)) {
                $this->io->write("Composer cleaner: Removing {$path}", \true, \_HumbugBoxb94336daae36\Composer\IO\IOInterface::VERBOSE);
                $this->fileSystem->remove($path);
                $this->removedCount++;
            }
        }
    }
    /**
     * @param  string
     * @param  string[]
     * @return bool
     */
    public static function matchMask($fileName, array $patterns)
    {
        foreach ($patterns as $pattern) {
            if (\fnmatch($pattern, $fileName)) {
                return \true;
            }
        }
        return \false;
    }
    /**
     * @return string[]
     */
    private function getSources(\stdClass $data)
    {
        if (empty($data->autoload)) {
            return [];
        }
        $sources = isset($data->bin) ? (array) $data->bin : [];
        foreach ($data->autoload as $type => $items) {
            if ($type === 'psr-0') {
                foreach ($items as $namespace => $paths) {
                    $namespace = \strtr($namespace, '\\_', '//');
                    foreach ((array) $paths as $path) {
                        $sources[] = \rtrim($path, '\\/') . '/' . $namespace;
                    }
                }
            } elseif ($type === 'psr-4') {
                foreach ($items as $namespace => $paths) {
                    $sources = \array_merge($sources, (array) $paths);
                }
            } elseif ($type === 'classmap' || $type === 'files') {
                $sources = \array_merge($sources, (array) $items);
            } elseif ($type === 'exclude-from-classmap') {
                // ignore
            } else {
                $this->io->writeError("unknown autoload type {$type}");
                return [];
            }
        }
        return $sources;
    }
    /**
     * @return string[]
     */
    private function getExcludes(\stdClass $data)
    {
        return empty($data->autoload->{'exclude-from-classmap'}) ? [] : (array) $data->autoload->{'exclude-from-classmap'};
    }
    /**
     * @return stdClass|null
     */
    public function loadComposerJson($dir)
    {
        $file = $dir . '/composer.json';
        if (!\is_file($file)) {
            $this->io->writeError("Composer cleaner: File {$file} not found.", \true, \_HumbugBoxb94336daae36\Composer\IO\IOInterface::VERBOSE);
            return;
        }
        $data = \json_decode(\file_get_contents($file));
        if (!$data instanceof \stdClass) {
            $this->io->writeError("Composer cleaner: Invalid {$file}.");
            return;
        }
        return $data;
    }
}
Copyright (c) 2011-2018 by Nikita Popov.

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

    * The names of the contributors may not 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
OWNER 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.
#!/usr/bin/env php
<?php 
namespace _HumbugBoxb94336daae36;

foreach ([__DIR__ . '/../../../autoload.php', __DIR__ . '/../vendor/autoload.php'] as $file) {
    if (\file_exists($file)) {
        require $file;
        break;
    }
}
\ini_set('xdebug.max_nesting_level', 3000);
// Disable XDebug var_dump() output truncation
\ini_set('xdebug.var_display_max_children', -1);
\ini_set('xdebug.var_display_max_data', -1);
\ini_set('xdebug.var_display_max_depth', -1);
list($operations, $files, $attributes) = \_HumbugBoxb94336daae36\parseArgs($argv);
/* Dump nodes by default */
if (empty($operations)) {
    $operations[] = 'dump';
}
if (empty($files)) {
    \_HumbugBoxb94336daae36\showHelp("Must specify at least one file.");
}
$lexer = new \PhpParser\Lexer\Emulative(['usedAttributes' => ['startLine', 'endLine', 'startFilePos', 'endFilePos', 'comments']]);
$parser = (new \PhpParser\ParserFactory())->create(\PhpParser\ParserFactory::PREFER_PHP7, $lexer);
$dumper = new \PhpParser\NodeDumper(['dumpComments' => \true, 'dumpPositions' => $attributes['with-positions']]);
$prettyPrinter = new \PhpParser\PrettyPrinter\Standard();
$traverser = new \PhpParser\NodeTraverser();
$traverser->addVisitor(new \PhpParser\NodeVisitor\NameResolver());
foreach ($files as $file) {
    if (\strpos($file, '<?php') === 0) {
        $code = $file;
        \fwrite(\STDERR, "====> Code {$code}\n");
    } else {
        if (!\file_exists($file)) {
            \fwrite(\STDERR, "File {$file} does not exist.\n");
            exit(1);
        }
        $code = \file_get_contents($file);
        \fwrite(\STDERR, "====> File {$file}:\n");
    }
    if ($attributes['with-recovery']) {
        $errorHandler = new \PhpParser\ErrorHandler\Collecting();
        $stmts = $parser->parse($code, $errorHandler);
        foreach ($errorHandler->getErrors() as $error) {
            $message = \_HumbugBoxb94336daae36\formatErrorMessage($error, $code, $attributes['with-column-info']);
            \fwrite(\STDERR, $message . "\n");
        }
        if (null === $stmts) {
            continue;
        }
    } else {
        try {
            $stmts = $parser->parse($code);
        } catch (\PhpParser\Error $error) {
            $message = \_HumbugBoxb94336daae36\formatErrorMessage($error, $code, $attributes['with-column-info']);
            \fwrite(\STDERR, $message . "\n");
            exit(1);
        }
    }
    foreach ($operations as $operation) {
        if ('dump' === $operation) {
            \fwrite(\STDERR, "==> Node dump:\n");
            echo $dumper->dump($stmts, $code), "\n";
        } elseif ('pretty-print' === $operation) {
            \fwrite(\STDERR, "==> Pretty print:\n");
            echo $prettyPrinter->prettyPrintFile($stmts), "\n";
        } elseif ('json-dump' === $operation) {
            \fwrite(\STDERR, "==> JSON dump:\n");
            echo \json_encode($stmts, \JSON_PRETTY_PRINT), "\n";
        } elseif ('var-dump' === $operation) {
            \fwrite(\STDERR, "==> var_dump():\n");
            \var_dump($stmts);
        } elseif ('resolve-names' === $operation) {
            \fwrite(\STDERR, "==> Resolved names.\n");
            $stmts = $traverser->traverse($stmts);
        }
    }
}
function formatErrorMessage(\PhpParser\Error $e, $code, $withColumnInfo)
{
    if ($withColumnInfo && $e->hasColumnInfo()) {
        return $e->getMessageWithColumnInfo($code);
    } else {
        return $e->getMessage();
    }
}
function showHelp($error = '')
{
    if ($error) {
        \fwrite(\STDERR, $error . "\n\n");
    }
    \fwrite($error ? \STDERR : \STDOUT, <<<OUTPUT
Usage: php-parse [operations] file1.php [file2.php ...]
   or: php-parse [operations] "<?php code"
Turn PHP source code into an abstract syntax tree.

Operations is a list of the following options (--dump by default):

    -d, --dump              Dump nodes using NodeDumper
    -p, --pretty-print      Pretty print file using PrettyPrinter\\Standard
    -j, --json-dump         Print json_encode() result
        --var-dump          var_dump() nodes (for exact structure)
    -N, --resolve-names     Resolve names using NodeVisitor\\NameResolver
    -c, --with-column-info  Show column-numbers for errors (if available)
    -P, --with-positions    Show positions in node dumps
    -r, --with-recovery     Use parsing with error recovery
    -h, --help              Display this page

Example:
    php-parse -d -p -N -d file.php

    Dumps nodes, pretty prints them, then resolves names and dumps them again.


OUTPUT
);
    exit($error ? 1 : 0);
}
function parseArgs($args)
{
    $operations = [];
    $files = [];
    $attributes = ['with-column-info' => \false, 'with-positions' => \false, 'with-recovery' => \false];
    \array_shift($args);
    $parseOptions = \true;
    foreach ($args as $arg) {
        if (!$parseOptions) {
            $files[] = $arg;
            continue;
        }
        switch ($arg) {
            case '--dump':
            case '-d':
                $operations[] = 'dump';
                break;
            case '--pretty-print':
            case '-p':
                $operations[] = 'pretty-print';
                break;
            case '--json-dump':
            case '-j':
                $operations[] = 'json-dump';
                break;
            case '--var-dump':
                $operations[] = 'var-dump';
                break;
            case '--resolve-names':
            case '-N':
                $operations[] = 'resolve-names';
                break;
            case '--with-column-info':
            case '-c':
                $attributes['with-column-info'] = \true;
                break;
            case '--with-positions':
            case '-P':
                $attributes['with-positions'] = \true;
                break;
            case '--with-recovery':
            case '-r':
                $attributes['with-recovery'] = \true;
                break;
            case '--help':
            case '-h':
                \_HumbugBoxb94336daae36\showHelp();
                break;
            case '--':
                $parseOptions = \false;
                break;
            default:
                if ($arg[0] === '-') {
                    \_HumbugBoxb94336daae36\showHelp("Invalid operation {$arg}.");
                } else {
                    $files[] = $arg;
                }
        }
    }
    return [$operations, $files, $attributes];
}
<?php

declare (strict_types=1);
namespace PhpParser;

use PhpParser\Node\Name;
use PhpParser\Node\Name\FullyQualified;
use PhpParser\Node\Stmt;
class NameContext
{
    /** @var null|Name Current namespace */
    protected $namespace;
    /** @var Name[][] Map of format [aliasType => [aliasName => originalName]] */
    protected $aliases = [];
    /** @var Name[][] Same as $aliases but preserving original case */
    protected $origAliases = [];
    /** @var ErrorHandler Error handler */
    protected $errorHandler;
    /**
     * Create a name context.
     *
     * @param ErrorHandler $errorHandler Error handling used to report errors
     */
    public function __construct(\PhpParser\ErrorHandler $errorHandler)
    {
        $this->errorHandler = $errorHandler;
    }
    /**
     * Start a new namespace.
     *
     * This also resets the alias table.
     *
     * @param Name|null $namespace Null is the global namespace
     */
    public function startNamespace(\PhpParser\Node\Name $namespace = null)
    {
        $this->namespace = $namespace;
        $this->origAliases = $this->aliases = [\PhpParser\Node\Stmt\Use_::TYPE_NORMAL => [], \PhpParser\Node\Stmt\Use_::TYPE_FUNCTION => [], \PhpParser\Node\Stmt\Use_::TYPE_CONSTANT => []];
    }
    /**
     * Add an alias / import.
     *
     * @param Name   $name        Original name
     * @param string $aliasName   Aliased name
     * @param int    $type        One of Stmt\Use_::TYPE_*
     * @param array  $errorAttrs Attributes to use to report an error
     */
    public function addAlias(\PhpParser\Node\Name $name, string $aliasName, int $type, array $errorAttrs = [])
    {
        // Constant names are case sensitive, everything else case insensitive
        if ($type === \PhpParser\Node\Stmt\Use_::TYPE_CONSTANT) {
            $aliasLookupName = $aliasName;
        } else {
            $aliasLookupName = \strtolower($aliasName);
        }
        if (isset($this->aliases[$type][$aliasLookupName])) {
            $typeStringMap = [\PhpParser\Node\Stmt\Use_::TYPE_NORMAL => '', \PhpParser\Node\Stmt\Use_::TYPE_FUNCTION => 'function ', \PhpParser\Node\Stmt\Use_::TYPE_CONSTANT => 'const '];
            $this->errorHandler->handleError(new \PhpParser\Error(\sprintf('Cannot use %s%s as %s because the name is already in use', $typeStringMap[$type], $name, $aliasName), $errorAttrs));
            return;
        }
        $this->aliases[$type][$aliasLookupName] = $name;
        $this->origAliases[$type][$aliasName] = $name;
    }
    /**
     * Get current namespace.
     *
     * @return null|Name Namespace (or null if global namespace)
     */
    public function getNamespace()
    {
        return $this->namespace;
    }
    /**
     * Get resolved name.
     *
     * @param Name $name Name to resolve
     * @param int  $type One of Stmt\Use_::TYPE_{FUNCTION|CONSTANT}
     *
     * @return null|Name Resolved name, or null if static resolution is not possible
     */
    public function getResolvedName(\PhpParser\Node\Name $name, int $type)
    {
        // don't resolve special class names
        if ($type === \PhpParser\Node\Stmt\Use_::TYPE_NORMAL && $name->isSpecialClassName()) {
            if (!$name->isUnqualified()) {
                $this->errorHandler->handleError(new \PhpParser\Error(\sprintf("'\\%s' is an invalid class name", $name->toString()), $name->getAttributes()));
            }
            return $name;
        }
        // fully qualified names are already resolved
        if ($name->isFullyQualified()) {
            return $name;
        }
        // Try to resolve aliases
        if (null !== ($resolvedName = $this->resolveAlias($name, $type))) {
            return $resolvedName;
        }
        if ($type !== \PhpParser\Node\Stmt\Use_::TYPE_NORMAL && $name->isUnqualified()) {
            if (null === $this->namespace) {
                // outside of a namespace unaliased unqualified is same as fully qualified
                return new \PhpParser\Node\Name\FullyQualified($name, $name->getAttributes());
            }
            // Cannot resolve statically
            return null;
        }
        // if no alias exists prepend current namespace
        return \PhpParser\Node\Name\FullyQualified::concat($this->namespace, $name, $name->getAttributes());
    }
    /**
     * Get resolved class name.
     *
     * @param Name $name Class ame to resolve
     *
     * @return Name Resolved name
     */
    public function getResolvedClassName(\PhpParser\Node\Name $name) : \PhpParser\Node\Name
    {
        return $this->getResolvedName($name, \PhpParser\Node\Stmt\Use_::TYPE_NORMAL);
    }
    /**
     * Get possible ways of writing a fully qualified name (e.g., by making use of aliases).
     *
     * @param string $name Fully-qualified name (without leading namespace separator)
     * @param int    $type One of Stmt\Use_::TYPE_*
     *
     * @return Name[] Possible representations of the name
     */
    public function getPossibleNames(string $name, int $type) : array
    {
        $lcName = \strtolower($name);
        if ($type === \PhpParser\Node\Stmt\Use_::TYPE_NORMAL) {
            // self, parent and static must always be unqualified
            if ($lcName === "self" || $lcName === "parent" || $lcName === "static") {
                return [new \PhpParser\Node\Name($name)];
            }
        }
        // Collect possible ways to write this name, starting with the fully-qualified name
        $possibleNames = [new \PhpParser\Node\Name\FullyQualified($name)];
        if (null !== ($nsRelativeName = $this->getNamespaceRelativeName($name, $lcName, $type))) {
            // Make sure there is no alias that makes the normally namespace-relative name
            // into something else
            if (null === $this->resolveAlias($nsRelativeName, $type)) {
                $possibleNames[] = $nsRelativeName;
            }
        }
        // Check for relevant namespace use statements
        foreach ($this->origAliases[\PhpParser\Node\Stmt\Use_::TYPE_NORMAL] as $alias => $orig) {
            $lcOrig = $orig->toLowerString();
            if (0 === \strpos($lcName, $lcOrig . '\\')) {
                $possibleNames[] = new \PhpParser\Node\Name($alias . \substr($name, \strlen($lcOrig)));
            }
        }
        // Check for relevant type-specific use statements
        foreach ($this->origAliases[$type] as $alias => $orig) {
            if ($type === \PhpParser\Node\Stmt\Use_::TYPE_CONSTANT) {
                // Constants are are complicated-sensitive
                $normalizedOrig = $this->normalizeConstName($orig->toString());
                if ($normalizedOrig === $this->normalizeConstName($name)) {
                    $possibleNames[] = new \PhpParser\Node\Name($alias);
                }
            } else {
                // Everything else is case-insensitive
                if ($orig->toLowerString() === $lcName) {
                    $possibleNames[] = new \PhpParser\Node\Name($alias);
                }
            }
        }
        return $possibleNames;
    }
    /**
     * Get shortest representation of this fully-qualified name.
     *
     * @param string $name Fully-qualified name (without leading namespace separator)
     * @param int    $type One of Stmt\Use_::TYPE_*
     *
     * @return Name Shortest representation
     */
    public function getShortName(string $name, int $type) : \PhpParser\Node\Name
    {
        $possibleNames = $this->getPossibleNames($name, $type);
        // Find shortest name
        $shortestName = null;
        $shortestLength = \INF;
        foreach ($possibleNames as $possibleName) {
            $length = \strlen($possibleName->toCodeString());
            if ($length < $shortestLength) {
                $shortestName = $possibleName;
                $shortestLength = $length;
            }
        }
        return $shortestName;
    }
    private function resolveAlias(\PhpParser\Node\Name $name, $type)
    {
        $firstPart = $name->getFirst();
        if ($name->isQualified()) {
            // resolve aliases for qualified names, always against class alias table
            $checkName = \strtolower($firstPart);
            if (isset($this->aliases[\PhpParser\Node\Stmt\Use_::TYPE_NORMAL][$checkName])) {
                $alias = $this->aliases[\PhpParser\Node\Stmt\Use_::TYPE_NORMAL][$checkName];
                return \PhpParser\Node\Name\FullyQualified::concat($alias, $name->slice(1), $name->getAttributes());
            }
        } elseif ($name->isUnqualified()) {
            // constant aliases are case-sensitive, function aliases case-insensitive
            $checkName = $type === \PhpParser\Node\Stmt\Use_::TYPE_CONSTANT ? $firstPart : \strtolower($firstPart);
            if (isset($this->aliases[$type][$checkName])) {
                // resolve unqualified aliases
                return new \PhpParser\Node\Name\FullyQualified($this->aliases[$type][$checkName], $name->getAttributes());
            }
        }
        // No applicable aliases
        return null;
    }
    private function getNamespaceRelativeName(string $name, string $lcName, int $type)
    {
        if (null === $this->namespace) {
            return new \PhpParser\Node\Name($name);
        }
        if ($type === \PhpParser\Node\Stmt\Use_::TYPE_CONSTANT) {
            // The constants true/false/null always resolve to the global symbols, even inside a
            // namespace, so they may be used without qualification
            if ($lcName === "true" || $lcName === "false" || $lcName === "null") {
                return new \PhpParser\Node\Name($name);
            }
        }
        $namespacePrefix = \strtolower($this->namespace . '\\');
        if (0 === \strpos($lcName, $namespacePrefix)) {
            return new \PhpParser\Node\Name(\substr($name, \strlen($namespacePrefix)));
        }
        return null;
    }
    private function normalizeConstName(string $name)
    {
        $nsSep = \strrpos($name, '\\');
        if (\false === $nsSep) {
            return $name;
        }
        // Constants have case-insensitive namespace and case-sensitive short-name
        $ns = \substr($name, 0, $nsSep);
        $shortName = \substr($name, $nsSep + 1);
        return \strtolower($ns) . '\\' . $shortName;
    }
}
<?php

declare (strict_types=1);
namespace PhpParser;

/**
 * @codeCoverageIgnore
 */
class NodeVisitorAbstract implements \PhpParser\NodeVisitor
{
    public function beforeTraverse(array $nodes)
    {
        return null;
    }
    public function enterNode(\PhpParser\Node $node)
    {
        return null;
    }
    public function leaveNode(\PhpParser\Node $node)
    {
        return null;
    }
    public function afterTraverse(array $nodes)
    {
        return null;
    }
}
<?php

declare (strict_types=1);
namespace PhpParser;

interface NodeVisitor
{
    /**
     * Called once before traversal.
     *
     * Return value semantics:
     *  * null:      $nodes stays as-is
     *  * otherwise: $nodes is set to the return value
     *
     * @param Node[] $nodes Array of nodes
     *
     * @return null|Node[] Array of nodes
     */
    public function beforeTraverse(array $nodes);
    /**
     * Called when entering a node.
     *
     * Return value semantics:
     *  * null
     *        => $node stays as-is
     *  * NodeTraverser::DONT_TRAVERSE_CHILDREN
     *        => Children of $node are not traversed. $node stays as-is
     *  * NodeTraverser::STOP_TRAVERSAL
     *        => Traversal is aborted. $node stays as-is
     *  * otherwise
     *        => $node is set to the return value
     *
     * @param Node $node Node
     *
     * @return null|int|Node Replacement node (or special return value)
     */
    public function enterNode(\PhpParser\Node $node);
    /**
     * Called when leaving a node.
     *
     * Return value semantics:
     *  * null
     *        => $node stays as-is
     *  * NodeTraverser::REMOVE_NODE
     *        => $node is removed from the parent array
     *  * NodeTraverser::STOP_TRAVERSAL
     *        => Traversal is aborted. $node stays as-is
     *  * array (of Nodes)
     *        => The return value is merged into the parent array (at the position of the $node)
     *  * otherwise
     *        => $node is set to the return value
     *
     * @param Node $node Node
     *
     * @return null|int|Node|Node[] Replacement node (or special return value)
     */
    public function leaveNode(\PhpParser\Node $node);
    /**
     * Called once after traversal.
     *
     * Return value semantics:
     *  * null:      $nodes stays as-is
     *  * otherwise: $nodes is set to the return value
     *
     * @param Node[] $nodes Array of nodes
     *
     * @return null|Node[] Array of nodes
     */
    public function afterTraverse(array $nodes);
}
<?php

declare (strict_types=1);
namespace PhpParser;

use PhpParser\Node\Expr;
use PhpParser\Node\Identifier;
use PhpParser\Node\Name;
use PhpParser\Node\NullableType;
use PhpParser\Node\Scalar;
use PhpParser\Node\Stmt;
/**
 * This class defines helpers used in the implementation of builders. Don't use it directly.
 *
 * @internal
 */
final class BuilderHelpers
{
    /**
     * Normalizes a node: Converts builder objects to nodes.
     *
     * @param Node|Builder $node The node to normalize
     *
     * @return Node The normalized node
     */
    public static function normalizeNode($node) : \PhpParser\Node
    {
        if ($node instanceof \PhpParser\Builder) {
            return $node->getNode();
        } elseif ($node instanceof \PhpParser\Node) {
            return $node;
        }
        throw new \LogicException('Expected node or builder object');
    }
    /**
     * Normalizes a node to a statement.
     *
     * Expressions are wrapped in a Stmt\Expression node.
     *
     * @param Node|Builder $node The node to normalize
     *
     * @return Stmt The normalized statement node
     */
    public static function normalizeStmt($node) : \PhpParser\Node\Stmt
    {
        $node = self::normalizeNode($node);
        if ($node instanceof \PhpParser\Node\Stmt) {
            return $node;
        }
        if ($node instanceof \PhpParser\Node\Expr) {
            return new \PhpParser\Node\Stmt\Expression($node);
        }
        throw new \LogicException('Expected statement or expression node');
    }
    /**
     * Normalizes strings to Identifier.
     *
     * @param string|Identifier $name The identifier to normalize
     *
     * @return Identifier The normalized identifier
     */
    public static function normalizeIdentifier($name) : \PhpParser\Node\Identifier
    {
        if ($name instanceof \PhpParser\Node\Identifier) {
            return $name;
        }
        if (\is_string($name)) {
            return new \PhpParser\Node\Identifier($name);
        }
        throw new \LogicException('_HumbugBoxb94336daae36\\Expected string or instance of Node\\Identifier');
    }
    /**
     * Normalizes strings to Identifier, also allowing expressions.
     *
     * @param string|Identifier|Expr $name The identifier to normalize
     *
     * @return Identifier|Expr The normalized identifier or expression
     */
    public static function normalizeIdentifierOrExpr($name)
    {
        if ($name instanceof \PhpParser\Node\Identifier || $name instanceof \PhpParser\Node\Expr) {
            return $name;
        }
        if (\is_string($name)) {
            return new \PhpParser\Node\Identifier($name);
        }
        throw new \LogicException('_HumbugBoxb94336daae36\\Expected string or instance of Node\\Identifier or Node\\Expr');
    }
    /**
     * Normalizes a name: Converts string names to Name nodes.
     *
     * @param Name|string $name The name to normalize
     *
     * @return Name The normalized name
     */
    public static function normalizeName($name) : \PhpParser\Node\Name
    {
        return self::normalizeNameCommon($name, \false);
    }
    /**
     * Normalizes a name: Converts string names to Name nodes, while also allowing expressions.
     *
     * @param Expr|Name|string $name The name to normalize
     *
     * @return Name|Expr The normalized name or expression
     */
    public static function normalizeNameOrExpr($name)
    {
        return self::normalizeNameCommon($name, \true);
    }
    /**
     * Normalizes a name: Converts string names to Name nodes, optionally allowing expressions.
     *
     * @param Expr|Name|string $name      The name to normalize
     * @param bool             $allowExpr Whether to also allow expressions
     *
     * @return Name|Expr The normalized name, or expression (if allowed)
     */
    private static function normalizeNameCommon($name, bool $allowExpr)
    {
        if ($name instanceof \PhpParser\Node\Name) {
            return $name;
        } elseif (\is_string($name)) {
            if (!$name) {
                throw new \LogicException('Name cannot be empty');
            }
            if ($name[0] === '\\') {
                return new \PhpParser\Node\Name\FullyQualified(\substr($name, 1));
            } elseif (0 === \strpos($name, 'namespace\\')) {
                return new \PhpParser\Node\Name\Relative(\substr($name, \strlen('namespace\\')));
            } else {
                return new \PhpParser\Node\Name($name);
            }
        }
        if ($allowExpr) {
            if ($name instanceof \PhpParser\Node\Expr) {
                return $name;
            }
            throw new \LogicException('_HumbugBoxb94336daae36\\Name must be a string or an instance of Node\\Name or Node\\Expr');
        } else {
            throw new \LogicException('_HumbugBoxb94336daae36\\Name must be a string or an instance of Node\\Name');
        }
    }
    /**
     * Normalizes a type: Converts plain-text type names into proper AST representation.
     *
     * In particular, builtin types become Identifiers, custom types become Names and nullables
     * are wrapped in NullableType nodes.
     *
     * @param string|Name|Identifier|NullableType $type The type to normalize
     *
     * @return Name|Identifier|NullableType The normalized type
     */
    public static function normalizeType($type)
    {
        if (!\is_string($type)) {
            if (!$type instanceof \PhpParser\Node\Name && !$type instanceof \PhpParser\Node\Identifier && !$type instanceof \PhpParser\Node\NullableType) {
                throw new \LogicException('Type must be a string, or an instance of Name, Identifier or NullableType');
            }
            return $type;
        }
        $nullable = \false;
        if (\strlen($type) > 0 && $type[0] === '?') {
            $nullable = \true;
            $type = \substr($type, 1);
        }
        $builtinTypes = ['array', 'callable', 'string', 'int', 'float', 'bool', 'iterable', 'void', 'object'];
        $lowerType = \strtolower($type);
        if (\in_array($lowerType, $builtinTypes)) {
            $type = new \PhpParser\Node\Identifier($lowerType);
        } else {
            $type = self::normalizeName($type);
        }
        if ($nullable && (string) $type === 'void') {
            throw new \LogicException('void type cannot be nullable');
        }
        return $nullable ? new \PhpParser\Node\NullableType($type) : $type;
    }
    /**
     * Normalizes a value: Converts nulls, booleans, integers,
     * floats, strings and arrays into their respective nodes
     *
     * @param Node\Expr|bool|null|int|float|string|array $value The value to normalize
     *
     * @return Expr The normalized value
     */
    public static function normalizeValue($value) : \PhpParser\Node\Expr
    {
        if ($value instanceof \PhpParser\Node\Expr) {
            return $value;
        } elseif (\is_null($value)) {
            return new \PhpParser\Node\Expr\ConstFetch(new \PhpParser\Node\Name('null'));
        } elseif (\is_bool($value)) {
            return new \PhpParser\Node\Expr\ConstFetch(new \PhpParser\Node\Name($value ? 'true' : 'false'));
        } elseif (\is_int($value)) {
            return new \PhpParser\Node\Scalar\LNumber($value);
        } elseif (\is_float($value)) {
            return new \PhpParser\Node\Scalar\DNumber($value);
        } elseif (\is_string($value)) {
            return new \PhpParser\Node\Scalar\String_($value);
        } elseif (\is_array($value)) {
            $items = [];
            $lastKey = -1;
            foreach ($value as $itemKey => $itemValue) {
                // for consecutive, numeric keys don't generate keys
                if (null !== $lastKey && ++$lastKey === $itemKey) {
                    $items[] = new \PhpParser\Node\Expr\ArrayItem(self::normalizeValue($itemValue));
                } else {
                    $lastKey = null;
                    $items[] = new \PhpParser\Node\Expr\ArrayItem(self::normalizeValue($itemValue), self::normalizeValue($itemKey));
                }
            }
            return new \PhpParser\Node\Expr\Array_($items);
        } else {
            throw new \LogicException('Invalid value');
        }
    }
    /**
     * Normalizes a doc comment: Converts plain strings to PhpParser\Comment\Doc.
     *
     * @param Comment\Doc|string $docComment The doc comment to normalize
     *
     * @return Comment\Doc The normalized doc comment
     */
    public static function normalizeDocComment($docComment) : \PhpParser\Comment\Doc
    {
        if ($docComment instanceof \PhpParser\Comment\Doc) {
            return $docComment;
        } elseif (\is_string($docComment)) {
            return new \PhpParser\Comment\Doc($docComment);
        } else {
            throw new \LogicException('_HumbugBoxb94336daae36\\Doc comment must be a string or an instance of PhpParser\\Comment\\Doc');
        }
    }
    /**
     * Adds a modifier and returns new modifier bitmask.
     *
     * @param int $modifiers Existing modifiers
     * @param int $modifier  Modifier to set
     *
     * @return int New modifiers
     */
    public static function addModifier(int $modifiers, int $modifier) : int
    {
        \PhpParser\Node\Stmt\Class_::verifyModifier($modifiers, $modifier);
        return $modifiers | $modifier;
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\NodeVisitor;

use PhpParser\Node;
use PhpParser\NodeVisitorAbstract;
/**
 * This visitor can be used to find and collect all nodes satisfying some criterion determined by
 * a filter callback.
 */
class FindingVisitor extends \PhpParser\NodeVisitorAbstract
{
    /** @var callable Filter callback */
    protected $filterCallback;
    /** @var Node[] Found nodes */
    protected $foundNodes;
    public function __construct(callable $filterCallback)
    {
        $this->filterCallback = $filterCallback;
    }
    /**
     * Get found nodes satisfying the filter callback.
     *
     * Nodes are returned in pre-order.
     *
     * @return Node[] Found nodes
     */
    public function getFoundNodes() : array
    {
        return $this->foundNodes;
    }
    public function beforeTraverse(array $nodes)
    {
        $this->foundNodes = [];
        return null;
    }
    public function enterNode(\PhpParser\Node $node)
    {
        $filterCallback = $this->filterCallback;
        if ($filterCallback($node)) {
            $this->foundNodes[] = $node;
        }
        return null;
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\NodeVisitor;

use PhpParser\ErrorHandler;
use PhpParser\NameContext;
use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\Name;
use PhpParser\Node\Name\FullyQualified;
use PhpParser\Node\Stmt;
use PhpParser\NodeVisitorAbstract;
class NameResolver extends \PhpParser\NodeVisitorAbstract
{
    /** @var NameContext Naming context */
    protected $nameContext;
    /** @var bool Whether to preserve original names */
    protected $preserveOriginalNames;
    /** @var bool Whether to replace resolved nodes in place, or to add resolvedNode attributes */
    protected $replaceNodes;
    /**
     * Constructs a name resolution visitor.
     *
     * Options:
     *  * preserveOriginalNames (default false): An "originalName" attribute will be added to
     *    all name nodes that underwent resolution.
     *  * replaceNodes (default true): Resolved names are replaced in-place. Otherwise, a
     *    resolvedName attribute is added. (Names that cannot be statically resolved receive a
     *    namespacedName attribute, as usual.)
     *
     * @param ErrorHandler|null $errorHandler Error handler
     * @param array $options Options
     */
    public function __construct(\PhpParser\ErrorHandler $errorHandler = null, array $options = [])
    {
        $this->nameContext = new \PhpParser\NameContext($errorHandler ?? new \PhpParser\ErrorHandler\Throwing());
        $this->preserveOriginalNames = $options['preserveOriginalNames'] ?? \false;
        $this->replaceNodes = $options['replaceNodes'] ?? \true;
    }
    /**
     * Get name resolution context.
     *
     * @return NameContext
     */
    public function getNameContext() : \PhpParser\NameContext
    {
        return $this->nameContext;
    }
    public function beforeTraverse(array $nodes)
    {
        $this->nameContext->startNamespace();
        return null;
    }
    public function enterNode(\PhpParser\Node $node)
    {
        if ($node instanceof \PhpParser\Node\Stmt\Namespace_) {
            $this->nameContext->startNamespace($node->name);
        } elseif ($node instanceof \PhpParser\Node\Stmt\Use_) {
            foreach ($node->uses as $use) {
                $this->addAlias($use, $node->type, null);
            }
        } elseif ($node instanceof \PhpParser\Node\Stmt\GroupUse) {
            foreach ($node->uses as $use) {
                $this->addAlias($use, $node->type, $node->prefix);
            }
        } elseif ($node instanceof \PhpParser\Node\Stmt\Class_) {
            if (null !== $node->extends) {
                $node->extends = $this->resolveClassName($node->extends);
            }
            foreach ($node->implements as &$interface) {
                $interface = $this->resolveClassName($interface);
            }
            if (null !== $node->name) {
                $this->addNamespacedName($node);
            }
        } elseif ($node instanceof \PhpParser\Node\Stmt\Interface_) {
            foreach ($node->extends as &$interface) {
                $interface = $this->resolveClassName($interface);
            }
            $this->addNamespacedName($node);
        } elseif ($node instanceof \PhpParser\Node\Stmt\Trait_) {
            $this->addNamespacedName($node);
        } elseif ($node instanceof \PhpParser\Node\Stmt\Function_) {
            $this->addNamespacedName($node);
            $this->resolveSignature($node);
        } elseif ($node instanceof \PhpParser\Node\Stmt\ClassMethod || $node instanceof \PhpParser\Node\Expr\Closure) {
            $this->resolveSignature($node);
        } elseif ($node instanceof \PhpParser\Node\Stmt\Property) {
            if (null !== $node->type) {
                $node->type = $this->resolveType($node->type);
            }
        } elseif ($node instanceof \PhpParser\Node\Stmt\Const_) {
            foreach ($node->consts as $const) {
                $this->addNamespacedName($const);
            }
        } elseif ($node instanceof \PhpParser\Node\Expr\StaticCall || $node instanceof \PhpParser\Node\Expr\StaticPropertyFetch || $node instanceof \PhpParser\Node\Expr\ClassConstFetch || $node instanceof \PhpParser\Node\Expr\New_ || $node instanceof \PhpParser\Node\Expr\Instanceof_) {
            if ($node->class instanceof \PhpParser\Node\Name) {
                $node->class = $this->resolveClassName($node->class);
            }
        } elseif ($node instanceof \PhpParser\Node\Stmt\Catch_) {
            foreach ($node->types as &$type) {
                $type = $this->resolveClassName($type);
            }
        } elseif ($node instanceof \PhpParser\Node\Expr\FuncCall) {
            if ($node->name instanceof \PhpParser\Node\Name) {
                $node->name = $this->resolveName($node->name, \PhpParser\Node\Stmt\Use_::TYPE_FUNCTION);
            }
        } elseif ($node instanceof \PhpParser\Node\Expr\ConstFetch) {
            $node->name = $this->resolveName($node->name, \PhpParser\Node\Stmt\Use_::TYPE_CONSTANT);
        } elseif ($node instanceof \PhpParser\Node\Stmt\TraitUse) {
            foreach ($node->traits as &$trait) {
                $trait = $this->resolveClassName($trait);
            }
            foreach ($node->adaptations as $adaptation) {
                if (null !== $adaptation->trait) {
                    $adaptation->trait = $this->resolveClassName($adaptation->trait);
                }
                if ($adaptation instanceof \PhpParser\Node\Stmt\TraitUseAdaptation\Precedence) {
                    foreach ($adaptation->insteadof as &$insteadof) {
                        $insteadof = $this->resolveClassName($insteadof);
                    }
                }
            }
        }
        return null;
    }
    private function addAlias(\PhpParser\Node\Stmt\UseUse $use, $type, \PhpParser\Node\Name $prefix = null)
    {
        // Add prefix for group uses
        $name = $prefix ? \PhpParser\Node\Name::concat($prefix, $use->name) : $use->name;
        // Type is determined either by individual element or whole use declaration
        $type |= $use->type;
        $this->nameContext->addAlias($name, (string) $use->getAlias(), $type, $use->getAttributes());
    }
    /** @param Stmt\Function_|Stmt\ClassMethod|Expr\Closure $node */
    private function resolveSignature($node)
    {
        foreach ($node->params as $param) {
            $param->type = $this->resolveType($param->type);
        }
        $node->returnType = $this->resolveType($node->returnType);
    }
    private function resolveType($node)
    {
        if ($node instanceof \PhpParser\Node\NullableType) {
            $node->type = $this->resolveType($node->type);
            return $node;
        }
        if ($node instanceof \PhpParser\Node\Name) {
            return $this->resolveClassName($node);
        }
        return $node;
    }
    /**
     * Resolve name, according to name resolver options.
     *
     * @param Name $name Function or constant name to resolve
     * @param int  $type One of Stmt\Use_::TYPE_*
     *
     * @return Name Resolved name, or original name with attribute
     */
    protected function resolveName(\PhpParser\Node\Name $name, int $type) : \PhpParser\Node\Name
    {
        if (!$this->replaceNodes) {
            $resolvedName = $this->nameContext->getResolvedName($name, $type);
            if (null !== $resolvedName) {
                $name->setAttribute('resolvedName', $resolvedName);
            } else {
                $name->setAttribute('namespacedName', \PhpParser\Node\Name\FullyQualified::concat($this->nameContext->getNamespace(), $name, $name->getAttributes()));
            }
            return $name;
        }
        if ($this->preserveOriginalNames) {
            // Save the original name
            $originalName = $name;
            $name = clone $originalName;
            $name->setAttribute('originalName', $originalName);
        }
        $resolvedName = $this->nameContext->getResolvedName($name, $type);
        if (null !== $resolvedName) {
            return $resolvedName;
        }
        // unqualified names inside a namespace cannot be resolved at compile-time
        // add the namespaced version of the name as an attribute
        $name->setAttribute('namespacedName', \PhpParser\Node\Name\FullyQualified::concat($this->nameContext->getNamespace(), $name, $name->getAttributes()));
        return $name;
    }
    protected function resolveClassName(\PhpParser\Node\Name $name)
    {
        return $this->resolveName($name, \PhpParser\Node\Stmt\Use_::TYPE_NORMAL);
    }
    protected function addNamespacedName(\PhpParser\Node $node)
    {
        $node->namespacedName = \PhpParser\Node\Name::concat($this->nameContext->getNamespace(), (string) $node->name);
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\NodeVisitor;

use PhpParser\Node;
use PhpParser\NodeTraverser;
use PhpParser\NodeVisitorAbstract;
/**
 * This visitor can be used to find the first node satisfying some criterion determined by
 * a filter callback.
 */
class FirstFindingVisitor extends \PhpParser\NodeVisitorAbstract
{
    /** @var callable Filter callback */
    protected $filterCallback;
    /** @var null|Node Found node */
    protected $foundNode;
    public function __construct(callable $filterCallback)
    {
        $this->filterCallback = $filterCallback;
    }
    /**
     * Get found node satisfying the filter callback.
     *
     * Returns null if no node satisfies the filter callback.
     *
     * @return null|Node Found node (or null if not found)
     */
    public function getFoundNode()
    {
        return $this->foundNode;
    }
    public function beforeTraverse(array $nodes)
    {
        $this->foundNode = null;
        return null;
    }
    public function enterNode(\PhpParser\Node $node)
    {
        $filterCallback = $this->filterCallback;
        if ($filterCallback($node)) {
            $this->foundNode = $node;
            return \PhpParser\NodeTraverser::STOP_TRAVERSAL;
        }
        return null;
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\NodeVisitor;

use PhpParser\Node;
use PhpParser\NodeVisitorAbstract;
/**
 * Visitor cloning all nodes and linking to the original nodes using an attribute.
 *
 * This visitor is required to perform format-preserving pretty prints.
 */
class CloningVisitor extends \PhpParser\NodeVisitorAbstract
{
    public function enterNode(\PhpParser\Node $origNode)
    {
        $node = clone $origNode;
        $node->setAttribute('origNode', $origNode);
        return $node;
    }
}
<?php

declare (strict_types=1);
namespace PhpParser;

interface Parser
{
    /**
     * Parses PHP code into a node tree.
     *
     * @param string $code The source code to parse
     * @param ErrorHandler|null $errorHandler Error handler to use for lexer/parser errors, defaults
     *                                        to ErrorHandler\Throwing.
     *
     * @return Node\Stmt[]|null Array of statements (or null non-throwing error handler is used and
     *                          the parser was unable to recover from an error).
     */
    public function parse(string $code, \PhpParser\ErrorHandler $errorHandler = null);
}
<?php

namespace PhpParser;

class ConstExprEvaluationException extends \Exception
{
}
<?php

declare (strict_types=1);
namespace PhpParser\Lexer;

use PhpParser\Error;
use PhpParser\ErrorHandler;
use PhpParser\Lexer;
use PhpParser\Lexer\TokenEmulator\CoaleseEqualTokenEmulator;
use PhpParser\Lexer\TokenEmulator\FnTokenEmulator;
use PhpParser\Lexer\TokenEmulator\TokenEmulatorInterface;
class Emulative extends \PhpParser\Lexer
{
    const PHP_7_3 = '7.3.0dev';
    const PHP_7_4 = '7.4.0dev';
    const FLEXIBLE_DOC_STRING_REGEX = <<<'REGEX'
/<<<[ \t]*(['"]?)([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*)\1\r?\n
(?:.*\r?\n)*?
(?<indentation>\h*)\2(?![a-zA-Z_\x80-\xff])(?<separator>(?:;?[\r\n])?)/x
REGEX;
    /** @var mixed[] Patches used to reverse changes introduced in the code */
    private $patches = [];
    /** @var TokenEmulatorInterface[] */
    private $tokenEmulators = [];
    /**
     * @param mixed[] $options
     */
    public function __construct(array $options = [])
    {
        parent::__construct($options);
        // prepare token emulators
        $this->tokenEmulators[] = new \PhpParser\Lexer\TokenEmulator\FnTokenEmulator();
        $this->tokenEmulators[] = new \PhpParser\Lexer\TokenEmulator\CoaleseEqualTokenEmulator();
        // add emulated tokens here
        foreach ($this->tokenEmulators as $emulativeToken) {
            $this->tokenMap[$emulativeToken->getTokenId()] = $emulativeToken->getParserTokenId();
        }
    }
    public function startLexing(string $code, \PhpParser\ErrorHandler $errorHandler = null)
    {
        $this->patches = [];
        if ($this->isEmulationNeeded($code) === \false) {
            // Nothing to emulate, yay
            parent::startLexing($code, $errorHandler);
            return;
        }
        $collector = new \PhpParser\ErrorHandler\Collecting();
        // 1. emulation of heredoc and nowdoc new syntax
        $preparedCode = $this->processHeredocNowdoc($code);
        parent::startLexing($preparedCode, $collector);
        // add token emulation
        foreach ($this->tokenEmulators as $emulativeToken) {
            if ($emulativeToken->isEmulationNeeded($code)) {
                $this->tokens = $emulativeToken->emulate($code, $this->tokens);
            }
        }
        $this->fixupTokens();
        $errors = $collector->getErrors();
        if (!empty($errors)) {
            $this->fixupErrors($errors);
            foreach ($errors as $error) {
                $errorHandler->handleError($error);
            }
        }
    }
    private function isHeredocNowdocEmulationNeeded(string $code) : bool
    {
        // skip version where this works without emulation
        if (\version_compare(\PHP_VERSION, self::PHP_7_3, '>=')) {
            return \false;
        }
        return \strpos($code, '<<<') !== \false;
    }
    private function processHeredocNowdoc(string $code) : string
    {
        if ($this->isHeredocNowdocEmulationNeeded($code) === \false) {
            return $code;
        }
        if (!\preg_match_all(self::FLEXIBLE_DOC_STRING_REGEX, $code, $matches, \PREG_SET_ORDER | \PREG_OFFSET_CAPTURE)) {
            // No heredoc/nowdoc found
            return $code;
        }
        // Keep track of how much we need to adjust string offsets due to the modifications we
        // already made
        $posDelta = 0;
        foreach ($matches as $match) {
            $indentation = $match['indentation'][0];
            $indentationStart = $match['indentation'][1];
            $separator = $match['separator'][0];
            $separatorStart = $match['separator'][1];
            if ($indentation === '' && $separator !== '') {
                // Ordinary heredoc/nowdoc
                continue;
            }
            if ($indentation !== '') {
                // Remove indentation
                $indentationLen = \strlen($indentation);
                $code = \substr_replace($code, '', $indentationStart + $posDelta, $indentationLen);
                $this->patches[] = [$indentationStart + $posDelta, 'add', $indentation];
                $posDelta -= $indentationLen;
            }
            if ($separator === '') {
                // Insert newline as separator
                $code = \substr_replace($code, "\n", $separatorStart + $posDelta, 0);
                $this->patches[] = [$separatorStart + $posDelta, 'remove', "\n"];
                $posDelta += 1;
            }
        }
        return $code;
    }
    private function isEmulationNeeded(string $code) : bool
    {
        foreach ($this->tokenEmulators as $emulativeToken) {
            if ($emulativeToken->isEmulationNeeded($code)) {
                return \true;
            }
        }
        return $this->isHeredocNowdocEmulationNeeded($code);
    }
    private function fixupTokens()
    {
        if (\count($this->patches) === 0) {
            return;
        }
        // Load first patch
        $patchIdx = 0;
        list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx];
        // We use a manual loop over the tokens, because we modify the array on the fly
        $pos = 0;
        for ($i = 0, $c = \count($this->tokens); $i < $c; $i++) {
            $token = $this->tokens[$i];
            if (\is_string($token)) {
                // We assume that patches don't apply to string tokens
                $pos += \strlen($token);
                continue;
            }
            $len = \strlen($token[1]);
            $posDelta = 0;
            while ($patchPos >= $pos && $patchPos < $pos + $len) {
                $patchTextLen = \strlen($patchText);
                if ($patchType === 'remove') {
                    if ($patchPos === $pos && $patchTextLen === $len) {
                        // Remove token entirely
                        \array_splice($this->tokens, $i, 1, []);
                        $i--;
                        $c--;
                    } else {
                        // Remove from token string
                        $this->tokens[$i][1] = \substr_replace($token[1], '', $patchPos - $pos + $posDelta, $patchTextLen);
                        $posDelta -= $patchTextLen;
                    }
                } elseif ($patchType === 'add') {
                    // Insert into the token string
                    $this->tokens[$i][1] = \substr_replace($token[1], $patchText, $patchPos - $pos + $posDelta, 0);
                    $posDelta += $patchTextLen;
                } else {
                    \assert(\false);
                }
                // Fetch the next patch
                $patchIdx++;
                if ($patchIdx >= \count($this->patches)) {
                    // No more patches, we're done
                    return;
                }
                list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx];
                // Multiple patches may apply to the same token. Reload the current one to check
                // If the new patch applies
                $token = $this->tokens[$i];
            }
            $pos += $len;
        }
        // A patch did not apply
        \assert(\false);
    }
    /**
     * Fixup line and position information in errors.
     *
     * @param Error[] $errors
     */
    private function fixupErrors(array $errors)
    {
        foreach ($errors as $error) {
            $attrs = $error->getAttributes();
            $posDelta = 0;
            $lineDelta = 0;
            foreach ($this->patches as $patch) {
                list($patchPos, $patchType, $patchText) = $patch;
                if ($patchPos >= $attrs['startFilePos']) {
                    // No longer relevant
                    break;
                }
                if ($patchType === 'add') {
                    $posDelta += \strlen($patchText);
                    $lineDelta += \substr_count($patchText, "\n");
                } else {
                    $posDelta -= \strlen($patchText);
                    $lineDelta -= \substr_count($patchText, "\n");
                }
            }
            $attrs['startFilePos'] += $posDelta;
            $attrs['endFilePos'] += $posDelta;
            $attrs['startLine'] += $lineDelta;
            $attrs['endLine'] += $lineDelta;
            $error->setAttributes($attrs);
        }
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Lexer\TokenEmulator;

interface TokenEmulatorInterface
{
    public function getTokenId() : int;
    public function getParserTokenId() : int;
    public function isEmulationNeeded(string $code) : bool;
    /**
     * @return array Modified Tokens
     */
    public function emulate(string $code, array $tokens) : array;
}
<?php

declare (strict_types=1);
namespace PhpParser\Lexer\TokenEmulator;

use PhpParser\Lexer\Emulative;
use PhpParser\Parser\Tokens;
final class FnTokenEmulator implements \PhpParser\Lexer\TokenEmulator\TokenEmulatorInterface
{
    const T_FN = 1008;
    public function getTokenId() : int
    {
        return self::T_FN;
    }
    public function getParserTokenId() : int
    {
        return \PhpParser\Parser\Tokens::T_FN;
    }
    public function isEmulationNeeded(string $code) : bool
    {
        // skip version where this is supported
        if (\version_compare(\PHP_VERSION, \PhpParser\Lexer\Emulative::PHP_7_4, '>=')) {
            return \false;
        }
        return \strpos($code, 'fn') !== \false;
    }
    public function emulate(string $code, array $tokens) : array
    {
        // We need to manually iterate and manage a count because we'll change
        // the tokens array on the way
        foreach ($tokens as $i => $token) {
            if ($token[0] === \T_STRING && $token[1] === 'fn') {
                $previousNonSpaceToken = $this->getPreviousNonSpaceToken($tokens, $i);
                if ($previousNonSpaceToken !== null && $previousNonSpaceToken[0] === \T_OBJECT_OPERATOR) {
                    continue;
                }
                $tokens[$i][0] = self::T_FN;
            }
        }
        return $tokens;
    }
    /**
     * @param mixed[] $tokens
     * @return mixed[]|null
     */
    private function getPreviousNonSpaceToken(array $tokens, int $start)
    {
        for ($i = $start - 1; $i >= 0; --$i) {
            if ($tokens[$i][0] === \T_WHITESPACE) {
                continue;
            }
            return $tokens[$i];
        }
        return null;
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Lexer\TokenEmulator;

use PhpParser\Lexer\Emulative;
use PhpParser\Parser\Tokens;
final class CoaleseEqualTokenEmulator implements \PhpParser\Lexer\TokenEmulator\TokenEmulatorInterface
{
    const T_COALESCE_EQUAL = 1007;
    public function getTokenId() : int
    {
        return self::T_COALESCE_EQUAL;
    }
    public function getParserTokenId() : int
    {
        return \PhpParser\Parser\Tokens::T_COALESCE_EQUAL;
    }
    public function isEmulationNeeded(string $code) : bool
    {
        // skip version where this is supported
        if (\version_compare(\PHP_VERSION, \PhpParser\Lexer\Emulative::PHP_7_4, '>=')) {
            return \false;
        }
        return \strpos($code, '??=') !== \false;
    }
    public function emulate(string $code, array $tokens) : array
    {
        // We need to manually iterate and manage a count because we'll change
        // the tokens array on the way
        $line = 1;
        for ($i = 0, $c = \count($tokens); $i < $c; ++$i) {
            if (isset($tokens[$i + 1])) {
                if ($tokens[$i][0] === \T_COALESCE && $tokens[$i + 1] === '=') {
                    \array_splice($tokens, $i, 2, [[self::T_COALESCE_EQUAL, '??=', $line]]);
                    $c--;
                    continue;
                }
            }
            if (\is_array($tokens[$i])) {
                $line += \substr_count($tokens[$i][1], "\n");
            }
        }
        return $tokens;
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Comment;

class Doc extends \PhpParser\Comment
{
}
<?php

declare (strict_types=1);
namespace PhpParser\PrettyPrinter;

use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\AssignOp;
use PhpParser\Node\Expr\BinaryOp;
use PhpParser\Node\Expr\Cast;
use PhpParser\Node\Name;
use PhpParser\Node\Scalar;
use PhpParser\Node\Scalar\MagicConst;
use PhpParser\Node\Stmt;
use PhpParser\PrettyPrinterAbstract;
class Standard extends \PhpParser\PrettyPrinterAbstract
{
    // Special nodes
    protected function pParam(\PhpParser\Node\Param $node)
    {
        return ($node->type ? $this->p($node->type) . ' ' : '') . ($node->byRef ? '&' : '') . ($node->variadic ? '...' : '') . $this->p($node->var) . ($node->default ? ' = ' . $this->p($node->default) : '');
    }
    protected function pArg(\PhpParser\Node\Arg $node)
    {
        return ($node->byRef ? '&' : '') . ($node->unpack ? '...' : '') . $this->p($node->value);
    }
    protected function pConst(\PhpParser\Node\Const_ $node)
    {
        return $node->name . ' = ' . $this->p($node->value);
    }
    protected function pNullableType(\PhpParser\Node\NullableType $node)
    {
        return '?' . $this->p($node->type);
    }
    protected function pIdentifier(\PhpParser\Node\Identifier $node)
    {
        return $node->name;
    }
    protected function pVarLikeIdentifier(\PhpParser\Node\VarLikeIdentifier $node)
    {
        return '$' . $node->name;
    }
    // Names
    protected function pName(\PhpParser\Node\Name $node)
    {
        return \implode('\\', $node->parts);
    }
    protected function pName_FullyQualified(\PhpParser\Node\Name\FullyQualified $node)
    {
        return '\\' . \implode('\\', $node->parts);
    }
    protected function pName_Relative(\PhpParser\Node\Name\Relative $node)
    {
        return 'namespace\\' . \implode('\\', $node->parts);
    }
    // Magic Constants
    protected function pScalar_MagicConst_Class(\PhpParser\Node\Scalar\MagicConst\Class_ $node)
    {
        return '__CLASS__';
    }
    protected function pScalar_MagicConst_Dir(\PhpParser\Node\Scalar\MagicConst\Dir $node)
    {
        return '__DIR__';
    }
    protected function pScalar_MagicConst_File(\PhpParser\Node\Scalar\MagicConst\File $node)
    {
        return '__FILE__';
    }
    protected function pScalar_MagicConst_Function(\PhpParser\Node\Scalar\MagicConst\Function_ $node)
    {
        return '__FUNCTION__';
    }
    protected function pScalar_MagicConst_Line(\PhpParser\Node\Scalar\MagicConst\Line $node)
    {
        return '__LINE__';
    }
    protected function pScalar_MagicConst_Method(\PhpParser\Node\Scalar\MagicConst\Method $node)
    {
        return '__METHOD__';
    }
    protected function pScalar_MagicConst_Namespace(\PhpParser\Node\Scalar\MagicConst\Namespace_ $node)
    {
        return '__NAMESPACE__';
    }
    protected function pScalar_MagicConst_Trait(\PhpParser\Node\Scalar\MagicConst\Trait_ $node)
    {
        return '__TRAIT__';
    }
    // Scalars
    protected function pScalar_String(\PhpParser\Node\Scalar\String_ $node)
    {
        $kind = $node->getAttribute('kind', \PhpParser\Node\Scalar\String_::KIND_SINGLE_QUOTED);
        switch ($kind) {
            case \PhpParser\Node\Scalar\String_::KIND_NOWDOC:
                $label = $node->getAttribute('docLabel');
                if ($label && !$this->containsEndLabel($node->value, $label)) {
                    if ($node->value === '') {
                        return "<<<'{$label}'\n{$label}" . $this->docStringEndToken;
                    }
                    return "<<<'{$label}'\n{$node->value}\n{$label}" . $this->docStringEndToken;
                }
            /* break missing intentionally */
            case \PhpParser\Node\Scalar\String_::KIND_SINGLE_QUOTED:
                return $this->pSingleQuotedString($node->value);
            case \PhpParser\Node\Scalar\String_::KIND_HEREDOC:
                $label = $node->getAttribute('docLabel');
                if ($label && !$this->containsEndLabel($node->value, $label)) {
                    if ($node->value === '') {
                        return "<<<{$label}\n{$label}" . $this->docStringEndToken;
                    }
                    $escaped = $this->escapeString($node->value, null);
                    return "<<<{$label}\n" . $escaped . "\n{$label}" . $this->docStringEndToken;
                }
            /* break missing intentionally */
            case \PhpParser\Node\Scalar\String_::KIND_DOUBLE_QUOTED:
                return '"' . $this->escapeString($node->value, '"') . '"';
        }
        throw new \Exception('Invalid string kind');
    }
    protected function pScalar_Encapsed(\PhpParser\Node\Scalar\Encapsed $node)
    {
        if ($node->getAttribute('kind') === \PhpParser\Node\Scalar\String_::KIND_HEREDOC) {
            $label = $node->getAttribute('docLabel');
            if ($label && !$this->encapsedContainsEndLabel($node->parts, $label)) {
                if (\count($node->parts) === 1 && $node->parts[0] instanceof \PhpParser\Node\Scalar\EncapsedStringPart && $node->parts[0]->value === '') {
                    return "<<<{$label}\n{$label}" . $this->docStringEndToken;
                }
                return "<<<{$label}\n" . $this->pEncapsList($node->parts, null) . "\n{$label}" . $this->docStringEndToken;
            }
        }
        return '"' . $this->pEncapsList($node->parts, '"') . '"';
    }
    protected function pScalar_LNumber(\PhpParser\Node\Scalar\LNumber $node)
    {
        if ($node->value === -\PHP_INT_MAX - 1) {
            // PHP_INT_MIN cannot be represented as a literal,
            // because the sign is not part of the literal
            return '(-' . \PHP_INT_MAX . '-1)';
        }
        $kind = $node->getAttribute('kind', \PhpParser\Node\Scalar\LNumber::KIND_DEC);
        if (\PhpParser\Node\Scalar\LNumber::KIND_DEC === $kind) {
            return (string) $node->value;
        }
        $sign = $node->value < 0 ? '-' : '';
        $str = (string) $node->value;
        switch ($kind) {
            case \PhpParser\Node\Scalar\LNumber::KIND_BIN:
                return $sign . '0b' . \base_convert($str, 10, 2);
            case \PhpParser\Node\Scalar\LNumber::KIND_OCT:
                return $sign . '0' . \base_convert($str, 10, 8);
            case \PhpParser\Node\Scalar\LNumber::KIND_HEX:
                return $sign . '0x' . \base_convert($str, 10, 16);
        }
        throw new \Exception('Invalid number kind');
    }
    protected function pScalar_DNumber(\PhpParser\Node\Scalar\DNumber $node)
    {
        if (!\is_finite($node->value)) {
            if ($node->value === \INF) {
                return '\\INF';
            } elseif ($node->value === -\INF) {
                return '-\\INF';
            } else {
                return '\\NAN';
            }
        }
        // Try to find a short full-precision representation
        $stringValue = \sprintf('%.16G', $node->value);
        if ($node->value !== (double) $stringValue) {
            $stringValue = \sprintf('%.17G', $node->value);
        }
        // %G is locale dependent and there exists no locale-independent alternative. We don't want
        // mess with switching locales here, so let's assume that a comma is the only non-standard
        // decimal separator we may encounter...
        $stringValue = \str_replace(',', '.', $stringValue);
        // ensure that number is really printed as float
        return \preg_match('/^-?[0-9]+$/', $stringValue) ? $stringValue . '.0' : $stringValue;
    }
    protected function pScalar_EncapsedStringPart(\PhpParser\Node\Scalar\EncapsedStringPart $node)
    {
        throw new \LogicException('Cannot directly print EncapsedStringPart');
    }
    // Assignments
    protected function pExpr_Assign(\PhpParser\Node\Expr\Assign $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\Assign::class, $node->var, ' = ', $node->expr);
    }
    protected function pExpr_AssignRef(\PhpParser\Node\Expr\AssignRef $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\AssignRef::class, $node->var, ' =& ', $node->expr);
    }
    protected function pExpr_AssignOp_Plus(\PhpParser\Node\Expr\AssignOp\Plus $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\AssignOp\Plus::class, $node->var, ' += ', $node->expr);
    }
    protected function pExpr_AssignOp_Minus(\PhpParser\Node\Expr\AssignOp\Minus $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\AssignOp\Minus::class, $node->var, ' -= ', $node->expr);
    }
    protected function pExpr_AssignOp_Mul(\PhpParser\Node\Expr\AssignOp\Mul $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\AssignOp\Mul::class, $node->var, ' *= ', $node->expr);
    }
    protected function pExpr_AssignOp_Div(\PhpParser\Node\Expr\AssignOp\Div $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\AssignOp\Div::class, $node->var, ' /= ', $node->expr);
    }
    protected function pExpr_AssignOp_Concat(\PhpParser\Node\Expr\AssignOp\Concat $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\AssignOp\Concat::class, $node->var, ' .= ', $node->expr);
    }
    protected function pExpr_AssignOp_Mod(\PhpParser\Node\Expr\AssignOp\Mod $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\AssignOp\Mod::class, $node->var, ' %= ', $node->expr);
    }
    protected function pExpr_AssignOp_BitwiseAnd(\PhpParser\Node\Expr\AssignOp\BitwiseAnd $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\AssignOp\BitwiseAnd::class, $node->var, ' &= ', $node->expr);
    }
    protected function pExpr_AssignOp_BitwiseOr(\PhpParser\Node\Expr\AssignOp\BitwiseOr $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\AssignOp\BitwiseOr::class, $node->var, ' |= ', $node->expr);
    }
    protected function pExpr_AssignOp_BitwiseXor(\PhpParser\Node\Expr\AssignOp\BitwiseXor $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\AssignOp\BitwiseXor::class, $node->var, ' ^= ', $node->expr);
    }
    protected function pExpr_AssignOp_ShiftLeft(\PhpParser\Node\Expr\AssignOp\ShiftLeft $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\AssignOp\ShiftLeft::class, $node->var, ' <<= ', $node->expr);
    }
    protected function pExpr_AssignOp_ShiftRight(\PhpParser\Node\Expr\AssignOp\ShiftRight $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\AssignOp\ShiftRight::class, $node->var, ' >>= ', $node->expr);
    }
    protected function pExpr_AssignOp_Pow(\PhpParser\Node\Expr\AssignOp\Pow $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\AssignOp\Pow::class, $node->var, ' **= ', $node->expr);
    }
    protected function pExpr_AssignOp_Coalesce(\PhpParser\Node\Expr\AssignOp\Coalesce $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\AssignOp\Coalesce::class, $node->var, ' ??= ', $node->expr);
    }
    // Binary expressions
    protected function pExpr_BinaryOp_Plus(\PhpParser\Node\Expr\BinaryOp\Plus $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\Plus::class, $node->left, ' + ', $node->right);
    }
    protected function pExpr_BinaryOp_Minus(\PhpParser\Node\Expr\BinaryOp\Minus $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\Minus::class, $node->left, ' - ', $node->right);
    }
    protected function pExpr_BinaryOp_Mul(\PhpParser\Node\Expr\BinaryOp\Mul $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\Mul::class, $node->left, ' * ', $node->right);
    }
    protected function pExpr_BinaryOp_Div(\PhpParser\Node\Expr\BinaryOp\Div $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\Div::class, $node->left, ' / ', $node->right);
    }
    protected function pExpr_BinaryOp_Concat(\PhpParser\Node\Expr\BinaryOp\Concat $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\Concat::class, $node->left, ' . ', $node->right);
    }
    protected function pExpr_BinaryOp_Mod(\PhpParser\Node\Expr\BinaryOp\Mod $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\Mod::class, $node->left, ' % ', $node->right);
    }
    protected function pExpr_BinaryOp_BooleanAnd(\PhpParser\Node\Expr\BinaryOp\BooleanAnd $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\BooleanAnd::class, $node->left, ' && ', $node->right);
    }
    protected function pExpr_BinaryOp_BooleanOr(\PhpParser\Node\Expr\BinaryOp\BooleanOr $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\BooleanOr::class, $node->left, ' || ', $node->right);
    }
    protected function pExpr_BinaryOp_BitwiseAnd(\PhpParser\Node\Expr\BinaryOp\BitwiseAnd $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\BitwiseAnd::class, $node->left, ' & ', $node->right);
    }
    protected function pExpr_BinaryOp_BitwiseOr(\PhpParser\Node\Expr\BinaryOp\BitwiseOr $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\BitwiseOr::class, $node->left, ' | ', $node->right);
    }
    protected function pExpr_BinaryOp_BitwiseXor(\PhpParser\Node\Expr\BinaryOp\BitwiseXor $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\BitwiseXor::class, $node->left, ' ^ ', $node->right);
    }
    protected function pExpr_BinaryOp_ShiftLeft(\PhpParser\Node\Expr\BinaryOp\ShiftLeft $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\ShiftLeft::class, $node->left, ' << ', $node->right);
    }
    protected function pExpr_BinaryOp_ShiftRight(\PhpParser\Node\Expr\BinaryOp\ShiftRight $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\ShiftRight::class, $node->left, ' >> ', $node->right);
    }
    protected function pExpr_BinaryOp_Pow(\PhpParser\Node\Expr\BinaryOp\Pow $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\Pow::class, $node->left, ' ** ', $node->right);
    }
    protected function pExpr_BinaryOp_LogicalAnd(\PhpParser\Node\Expr\BinaryOp\LogicalAnd $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\LogicalAnd::class, $node->left, ' and ', $node->right);
    }
    protected function pExpr_BinaryOp_LogicalOr(\PhpParser\Node\Expr\BinaryOp\LogicalOr $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\LogicalOr::class, $node->left, ' or ', $node->right);
    }
    protected function pExpr_BinaryOp_LogicalXor(\PhpParser\Node\Expr\BinaryOp\LogicalXor $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\LogicalXor::class, $node->left, ' xor ', $node->right);
    }
    protected function pExpr_BinaryOp_Equal(\PhpParser\Node\Expr\BinaryOp\Equal $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\Equal::class, $node->left, ' == ', $node->right);
    }
    protected function pExpr_BinaryOp_NotEqual(\PhpParser\Node\Expr\BinaryOp\NotEqual $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\NotEqual::class, $node->left, ' != ', $node->right);
    }
    protected function pExpr_BinaryOp_Identical(\PhpParser\Node\Expr\BinaryOp\Identical $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\Identical::class, $node->left, ' === ', $node->right);
    }
    protected function pExpr_BinaryOp_NotIdentical(\PhpParser\Node\Expr\BinaryOp\NotIdentical $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\NotIdentical::class, $node->left, ' !== ', $node->right);
    }
    protected function pExpr_BinaryOp_Spaceship(\PhpParser\Node\Expr\BinaryOp\Spaceship $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\Spaceship::class, $node->left, ' <=> ', $node->right);
    }
    protected function pExpr_BinaryOp_Greater(\PhpParser\Node\Expr\BinaryOp\Greater $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\Greater::class, $node->left, ' > ', $node->right);
    }
    protected function pExpr_BinaryOp_GreaterOrEqual(\PhpParser\Node\Expr\BinaryOp\GreaterOrEqual $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\GreaterOrEqual::class, $node->left, ' >= ', $node->right);
    }
    protected function pExpr_BinaryOp_Smaller(\PhpParser\Node\Expr\BinaryOp\Smaller $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\Smaller::class, $node->left, ' < ', $node->right);
    }
    protected function pExpr_BinaryOp_SmallerOrEqual(\PhpParser\Node\Expr\BinaryOp\SmallerOrEqual $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\SmallerOrEqual::class, $node->left, ' <= ', $node->right);
    }
    protected function pExpr_BinaryOp_Coalesce(\PhpParser\Node\Expr\BinaryOp\Coalesce $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\BinaryOp\Coalesce::class, $node->left, ' ?? ', $node->right);
    }
    protected function pExpr_Instanceof(\PhpParser\Node\Expr\Instanceof_ $node)
    {
        return $this->pInfixOp(\PhpParser\Node\Expr\Instanceof_::class, $node->expr, ' instanceof ', $node->class);
    }
    // Unary expressions
    protected function pExpr_BooleanNot(\PhpParser\Node\Expr\BooleanNot $node)
    {
        return $this->pPrefixOp(\PhpParser\Node\Expr\BooleanNot::class, '!', $node->expr);
    }
    protected function pExpr_BitwiseNot(\PhpParser\Node\Expr\BitwiseNot $node)
    {
        return $this->pPrefixOp(\PhpParser\Node\Expr\BitwiseNot::class, '~', $node->expr);
    }
    protected function pExpr_UnaryMinus(\PhpParser\Node\Expr\UnaryMinus $node)
    {
        if ($node->expr instanceof \PhpParser\Node\Expr\UnaryMinus || $node->expr instanceof \PhpParser\Node\Expr\PreDec) {
            // Enforce -(-$expr) instead of --$expr
            return '-(' . $this->p($node->expr) . ')';
        }
        return $this->pPrefixOp(\PhpParser\Node\Expr\UnaryMinus::class, '-', $node->expr);
    }
    protected function pExpr_UnaryPlus(\PhpParser\Node\Expr\UnaryPlus $node)
    {
        if ($node->expr instanceof \PhpParser\Node\Expr\UnaryPlus || $node->expr instanceof \PhpParser\Node\Expr\PreInc) {
            // Enforce +(+$expr) instead of ++$expr
            return '+(' . $this->p($node->expr) . ')';
        }
        return $this->pPrefixOp(\PhpParser\Node\Expr\UnaryPlus::class, '+', $node->expr);
    }
    protected function pExpr_PreInc(\PhpParser\Node\Expr\PreInc $node)
    {
        return $this->pPrefixOp(\PhpParser\Node\Expr\PreInc::class, '++', $node->var);
    }
    protected function pExpr_PreDec(\PhpParser\Node\Expr\PreDec $node)
    {
        return $this->pPrefixOp(\PhpParser\Node\Expr\PreDec::class, '--', $node->var);
    }
    protected function pExpr_PostInc(\PhpParser\Node\Expr\PostInc $node)
    {
        return $this->pPostfixOp(\PhpParser\Node\Expr\PostInc::class, $node->var, '++');
    }
    protected function pExpr_PostDec(\PhpParser\Node\Expr\PostDec $node)
    {
        return $this->pPostfixOp(\PhpParser\Node\Expr\PostDec::class, $node->var, '--');
    }
    protected function pExpr_ErrorSuppress(\PhpParser\Node\Expr\ErrorSuppress $node)
    {
        return $this->pPrefixOp(\PhpParser\Node\Expr\ErrorSuppress::class, '@', $node->expr);
    }
    protected function pExpr_YieldFrom(\PhpParser\Node\Expr\YieldFrom $node)
    {
        return $this->pPrefixOp(\PhpParser\Node\Expr\YieldFrom::class, 'yield from ', $node->expr);
    }
    protected function pExpr_Print(\PhpParser\Node\Expr\Print_ $node)
    {
        return $this->pPrefixOp(\PhpParser\Node\Expr\Print_::class, 'print ', $node->expr);
    }
    // Casts
    protected function pExpr_Cast_Int(\PhpParser\Node\Expr\Cast\Int_ $node)
    {
        return $this->pPrefixOp(\PhpParser\Node\Expr\Cast\Int_::class, '(int) ', $node->expr);
    }
    protected function pExpr_Cast_Double(\PhpParser\Node\Expr\Cast\Double $node)
    {
        $kind = $node->getAttribute('kind', \PhpParser\Node\Expr\Cast\Double::KIND_DOUBLE);
        if ($kind === \PhpParser\Node\Expr\Cast\Double::KIND_DOUBLE) {
            $cast = '(double)';
        } elseif ($kind === \PhpParser\Node\Expr\Cast\Double::KIND_FLOAT) {
            $cast = '(float)';
        } elseif ($kind === \PhpParser\Node\Expr\Cast\Double::KIND_REAL) {
            $cast = '(real)';
        }
        return $this->pPrefixOp(\PhpParser\Node\Expr\Cast\Double::class, $cast . ' ', $node->expr);
    }
    protected function pExpr_Cast_String(\PhpParser\Node\Expr\Cast\String_ $node)
    {
        return $this->pPrefixOp(\PhpParser\Node\Expr\Cast\String_::class, '(string) ', $node->expr);
    }
    protected function pExpr_Cast_Array(\PhpParser\Node\Expr\Cast\Array_ $node)
    {
        return $this->pPrefixOp(\PhpParser\Node\Expr\Cast\Array_::class, '(array) ', $node->expr);
    }
    protected function pExpr_Cast_Object(\PhpParser\Node\Expr\Cast\Object_ $node)
    {
        return $this->pPrefixOp(\PhpParser\Node\Expr\Cast\Object_::class, '(object) ', $node->expr);
    }
    protected function pExpr_Cast_Bool(\PhpParser\Node\Expr\Cast\Bool_ $node)
    {
        return $this->pPrefixOp(\PhpParser\Node\Expr\Cast\Bool_::class, '(bool) ', $node->expr);
    }
    protected function pExpr_Cast_Unset(\PhpParser\Node\Expr\Cast\Unset_ $node)
    {
        return $this->pPrefixOp(\PhpParser\Node\Expr\Cast\Unset_::class, '(unset) ', $node->expr);
    }
    // Function calls and similar constructs
    protected function pExpr_FuncCall(\PhpParser\Node\Expr\FuncCall $node)
    {
        return $this->pCallLhs($node->name) . '(' . $this->pMaybeMultiline($node->args) . ')';
    }
    protected function pExpr_MethodCall(\PhpParser\Node\Expr\MethodCall $node)
    {
        return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name) . '(' . $this->pMaybeMultiline($node->args) . ')';
    }
    protected function pExpr_StaticCall(\PhpParser\Node\Expr\StaticCall $node)
    {
        return $this->pDereferenceLhs($node->class) . '::' . ($node->name instanceof \PhpParser\Node\Expr ? $node->name instanceof \PhpParser\Node\Expr\Variable ? $this->p($node->name) : '{' . $this->p($node->name) . '}' : $node->name) . '(' . $this->pMaybeMultiline($node->args) . ')';
    }
    protected function pExpr_Empty(\PhpParser\Node\Expr\Empty_ $node)
    {
        return 'empty(' . $this->p($node->expr) . ')';
    }
    protected function pExpr_Isset(\PhpParser\Node\Expr\Isset_ $node)
    {
        return 'isset(' . $this->pCommaSeparated($node->vars) . ')';
    }
    protected function pExpr_Eval(\PhpParser\Node\Expr\Eval_ $node)
    {
        return 'eval(' . $this->p($node->expr) . ')';
    }
    protected function pExpr_Include(\PhpParser\Node\Expr\Include_ $node)
    {
        static $map = [\PhpParser\Node\Expr\Include_::TYPE_INCLUDE => 'include', \PhpParser\Node\Expr\Include_::TYPE_INCLUDE_ONCE => 'include_once', \PhpParser\Node\Expr\Include_::TYPE_REQUIRE => 'require', \PhpParser\Node\Expr\Include_::TYPE_REQUIRE_ONCE => 'require_once'];
        return $map[$node->type] . ' ' . $this->p($node->expr);
    }
    protected function pExpr_List(\PhpParser\Node\Expr\List_ $node)
    {
        return 'list(' . $this->pCommaSeparated($node->items) . ')';
    }
    // Other
    protected function pExpr_Error(\PhpParser\Node\Expr\Error $node)
    {
        throw new \LogicException('Cannot pretty-print AST with Error nodes');
    }
    protected function pExpr_Variable(\PhpParser\Node\Expr\Variable $node)
    {
        if ($node->name instanceof \PhpParser\Node\Expr) {
            return '${' . $this->p($node->name) . '}';
        } else {
            return '$' . $node->name;
        }
    }
    protected function pExpr_Array(\PhpParser\Node\Expr\Array_ $node)
    {
        $syntax = $node->getAttribute('kind', $this->options['shortArraySyntax'] ? \PhpParser\Node\Expr\Array_::KIND_SHORT : \PhpParser\Node\Expr\Array_::KIND_LONG);
        if ($syntax === \PhpParser\Node\Expr\Array_::KIND_SHORT) {
            return '[' . $this->pMaybeMultiline($node->items, \true) . ']';
        } else {
            return 'array(' . $this->pMaybeMultiline($node->items, \true) . ')';
        }
    }
    protected function pExpr_ArrayItem(\PhpParser\Node\Expr\ArrayItem $node)
    {
        return (null !== $node->key ? $this->p($node->key) . ' => ' : '') . ($node->byRef ? '&' : '') . ($node->unpack ? '...' : '') . $this->p($node->value);
    }
    protected function pExpr_ArrayDimFetch(\PhpParser\Node\Expr\ArrayDimFetch $node)
    {
        return $this->pDereferenceLhs($node->var) . '[' . (null !== $node->dim ? $this->p($node->dim) : '') . ']';
    }
    protected function pExpr_ConstFetch(\PhpParser\Node\Expr\ConstFetch $node)
    {
        return $this->p($node->name);
    }
    protected function pExpr_ClassConstFetch(\PhpParser\Node\Expr\ClassConstFetch $node)
    {
        return $this->p($node->class) . '::' . $this->p($node->name);
    }
    protected function pExpr_PropertyFetch(\PhpParser\Node\Expr\PropertyFetch $node)
    {
        return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name);
    }
    protected function pExpr_StaticPropertyFetch(\PhpParser\Node\Expr\StaticPropertyFetch $node)
    {
        return $this->pDereferenceLhs($node->class) . '::$' . $this->pObjectProperty($node->name);
    }
    protected function pExpr_ShellExec(\PhpParser\Node\Expr\ShellExec $node)
    {
        return '`' . $this->pEncapsList($node->parts, '`') . '`';
    }
    protected function pExpr_Closure(\PhpParser\Node\Expr\Closure $node)
    {
        return ($node->static ? 'static ' : '') . 'function ' . ($node->byRef ? '&' : '') . '(' . $this->pCommaSeparated($node->params) . ')' . (!empty($node->uses) ? ' use(' . $this->pCommaSeparated($node->uses) . ')' : '') . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') . ' {' . $this->pStmts($node->stmts) . $this->nl . '}';
    }
    protected function pExpr_ArrowFunction(\PhpParser\Node\Expr\ArrowFunction $node)
    {
        return ($node->static ? 'static ' : '') . 'fn' . ($node->byRef ? '&' : '') . '(' . $this->pCommaSeparated($node->params) . ')' . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '') . ' => ' . $this->p($node->expr);
    }
    protected function pExpr_ClosureUse(\PhpParser\Node\Expr\ClosureUse $node)
    {
        return ($node->byRef ? '&' : '') . $this->p($node->var);
    }
    protected function pExpr_New(\PhpParser\Node\Expr\New_ $node)
    {
        if ($node->class instanceof \PhpParser\Node\Stmt\Class_) {
            $args = $node->args ? '(' . $this->pMaybeMultiline($node->args) . ')' : '';
            return 'new ' . $this->pClassCommon($node->class, $args);
        }
        return 'new ' . $this->p($node->class) . '(' . $this->pMaybeMultiline($node->args) . ')';
    }
    protected function pExpr_Clone(\PhpParser\Node\Expr\Clone_ $node)
    {
        return 'clone ' . $this->p($node->expr);
    }
    protected function pExpr_Ternary(\PhpParser\Node\Expr\Ternary $node)
    {
        // a bit of cheating: we treat the ternary as a binary op where the ?...: part is the operator.
        // this is okay because the part between ? and : never needs parentheses.
        return $this->pInfixOp(\PhpParser\Node\Expr\Ternary::class, $node->cond, ' ?' . (null !== $node->if ? ' ' . $this->p($node->if) . ' ' : '') . ': ', $node->else);
    }
    protected function pExpr_Exit(\PhpParser\Node\Expr\Exit_ $node)
    {
        $kind = $node->getAttribute('kind', \PhpParser\Node\Expr\Exit_::KIND_DIE);
        return ($kind === \PhpParser\Node\Expr\Exit_::KIND_EXIT ? 'exit' : 'die') . (null !== $node->expr ? '(' . $this->p($node->expr) . ')' : '');
    }
    protected function pExpr_Yield(\PhpParser\Node\Expr\Yield_ $node)
    {
        if ($node->value === null) {
            return 'yield';
        } else {
            // this is a bit ugly, but currently there is no way to detect whether the parentheses are necessary
            return '(yield ' . ($node->key !== null ? $this->p($node->key) . ' => ' : '') . $this->p($node->value) . ')';
        }
    }
    // Declarations
    protected function pStmt_Namespace(\PhpParser\Node\Stmt\Namespace_ $node)
    {
        if ($this->canUseSemicolonNamespaces) {
            return 'namespace ' . $this->p($node->name) . ';' . $this->nl . $this->pStmts($node->stmts, \false);
        } else {
            return 'namespace' . (null !== $node->name ? ' ' . $this->p($node->name) : '') . ' {' . $this->pStmts($node->stmts) . $this->nl . '}';
        }
    }
    protected function pStmt_Use(\PhpParser\Node\Stmt\Use_ $node)
    {
        return 'use ' . $this->pUseType($node->type) . $this->pCommaSeparated($node->uses) . ';';
    }
    protected function pStmt_GroupUse(\PhpParser\Node\Stmt\GroupUse $node)
    {
        return 'use ' . $this->pUseType($node->type) . $this->pName($node->prefix) . '\\{' . $this->pCommaSeparated($node->uses) . '};';
    }
    protected function pStmt_UseUse(\PhpParser\Node\Stmt\UseUse $node)
    {
        return $this->pUseType($node->type) . $this->p($node->name) . (null !== $node->alias ? ' as ' . $node->alias : '');
    }
    protected function pUseType($type)
    {
        return $type === \PhpParser\Node\Stmt\Use_::TYPE_FUNCTION ? 'function ' : ($type === \PhpParser\Node\Stmt\Use_::TYPE_CONSTANT ? 'const ' : '');
    }
    protected function pStmt_Interface(\PhpParser\Node\Stmt\Interface_ $node)
    {
        return 'interface ' . $node->name . (!empty($node->extends) ? ' extends ' . $this->pCommaSeparated($node->extends) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}';
    }
    protected function pStmt_Class(\PhpParser\Node\Stmt\Class_ $node)
    {
        return $this->pClassCommon($node, ' ' . $node->name);
    }
    protected function pStmt_Trait(\PhpParser\Node\Stmt\Trait_ $node)
    {
        return 'trait ' . $node->name . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}';
    }
    protected function pStmt_TraitUse(\PhpParser\Node\Stmt\TraitUse $node)
    {
        return 'use ' . $this->pCommaSeparated($node->traits) . (empty($node->adaptations) ? ';' : ' {' . $this->pStmts($node->adaptations) . $this->nl . '}');
    }
    protected function pStmt_TraitUseAdaptation_Precedence(\PhpParser\Node\Stmt\TraitUseAdaptation\Precedence $node)
    {
        return $this->p($node->trait) . '::' . $node->method . ' insteadof ' . $this->pCommaSeparated($node->insteadof) . ';';
    }
    protected function pStmt_TraitUseAdaptation_Alias(\PhpParser\Node\Stmt\TraitUseAdaptation\Alias $node)
    {
        return (null !== $node->trait ? $this->p($node->trait) . '::' : '') . $node->method . ' as' . (null !== $node->newModifier ? ' ' . \rtrim($this->pModifiers($node->newModifier), ' ') : '') . (null !== $node->newName ? ' ' . $node->newName : '') . ';';
    }
    protected function pStmt_Property(\PhpParser\Node\Stmt\Property $node)
    {
        return (0 === $node->flags ? 'var ' : $this->pModifiers($node->flags)) . ($node->type ? $this->p($node->type) . ' ' : '') . $this->pCommaSeparated($node->props) . ';';
    }
    protected function pStmt_PropertyProperty(\PhpParser\Node\Stmt\PropertyProperty $node)
    {
        return '$' . $node->name . (null !== $node->default ? ' = ' . $this->p($node->default) : '');
    }
    protected function pStmt_ClassMethod(\PhpParser\Node\Stmt\ClassMethod $node)
    {
        return $this->pModifiers($node->flags) . 'function ' . ($node->byRef ? '&' : '') . $node->name . '(' . $this->pCommaSeparated($node->params) . ')' . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') . (null !== $node->stmts ? $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}' : ';');
    }
    protected function pStmt_ClassConst(\PhpParser\Node\Stmt\ClassConst $node)
    {
        return $this->pModifiers($node->flags) . 'const ' . $this->pCommaSeparated($node->consts) . ';';
    }
    protected function pStmt_Function(\PhpParser\Node\Stmt\Function_ $node)
    {
        return 'function ' . ($node->byRef ? '&' : '') . $node->name . '(' . $this->pCommaSeparated($node->params) . ')' . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}';
    }
    protected function pStmt_Const(\PhpParser\Node\Stmt\Const_ $node)
    {
        return 'const ' . $this->pCommaSeparated($node->consts) . ';';
    }
    protected function pStmt_Declare(\PhpParser\Node\Stmt\Declare_ $node)
    {
        return 'declare (' . $this->pCommaSeparated($node->declares) . ')' . (null !== $node->stmts ? ' {' . $this->pStmts($node->stmts) . $this->nl . '}' : ';');
    }
    protected function pStmt_DeclareDeclare(\PhpParser\Node\Stmt\DeclareDeclare $node)
    {
        return $node->key . '=' . $this->p($node->value);
    }
    // Control flow
    protected function pStmt_If(\PhpParser\Node\Stmt\If_ $node)
    {
        return 'if (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}' . ($node->elseifs ? ' ' . $this->pImplode($node->elseifs, ' ') : '') . (null !== $node->else ? ' ' . $this->p($node->else) : '');
    }
    protected function pStmt_ElseIf(\PhpParser\Node\Stmt\ElseIf_ $node)
    {
        return 'elseif (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}';
    }
    protected function pStmt_Else(\PhpParser\Node\Stmt\Else_ $node)
    {
        return 'else {' . $this->pStmts($node->stmts) . $this->nl . '}';
    }
    protected function pStmt_For(\PhpParser\Node\Stmt\For_ $node)
    {
        return 'for (' . $this->pCommaSeparated($node->init) . ';' . (!empty($node->cond) ? ' ' : '') . $this->pCommaSeparated($node->cond) . ';' . (!empty($node->loop) ? ' ' : '') . $this->pCommaSeparated($node->loop) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}';
    }
    protected function pStmt_Foreach(\PhpParser\Node\Stmt\Foreach_ $node)
    {
        return 'foreach (' . $this->p($node->expr) . ' as ' . (null !== $node->keyVar ? $this->p($node->keyVar) . ' => ' : '') . ($node->byRef ? '&' : '') . $this->p($node->valueVar) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}';
    }
    protected function pStmt_While(\PhpParser\Node\Stmt\While_ $node)
    {
        return 'while (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}';
    }
    protected function pStmt_Do(\PhpParser\Node\Stmt\Do_ $node)
    {
        return 'do {' . $this->pStmts($node->stmts) . $this->nl . '} while (' . $this->p($node->cond) . ');';
    }
    protected function pStmt_Switch(\PhpParser\Node\Stmt\Switch_ $node)
    {
        return 'switch (' . $this->p($node->cond) . ') {' . $this->pStmts($node->cases) . $this->nl . '}';
    }
    protected function pStmt_Case(\PhpParser\Node\Stmt\Case_ $node)
    {
        return (null !== $node->cond ? 'case ' . $this->p($node->cond) : 'default') . ':' . $this->pStmts($node->stmts);
    }
    protected function pStmt_TryCatch(\PhpParser\Node\Stmt\TryCatch $node)
    {
        return 'try {' . $this->pStmts($node->stmts) . $this->nl . '}' . ($node->catches ? ' ' . $this->pImplode($node->catches, ' ') : '') . ($node->finally !== null ? ' ' . $this->p($node->finally) : '');
    }
    protected function pStmt_Catch(\PhpParser\Node\Stmt\Catch_ $node)
    {
        return 'catch (' . $this->pImplode($node->types, '|') . ' ' . $this->p($node->var) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}';
    }
    protected function pStmt_Finally(\PhpParser\Node\Stmt\Finally_ $node)
    {
        return 'finally {' . $this->pStmts($node->stmts) . $this->nl . '}';
    }
    protected function pStmt_Break(\PhpParser\Node\Stmt\Break_ $node)
    {
        return 'break' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';';
    }
    protected function pStmt_Continue(\PhpParser\Node\Stmt\Continue_ $node)
    {
        return 'continue' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';';
    }
    protected function pStmt_Return(\PhpParser\Node\Stmt\Return_ $node)
    {
        return 'return' . (null !== $node->expr ? ' ' . $this->p($node->expr) : '') . ';';
    }
    protected function pStmt_Throw(\PhpParser\Node\Stmt\Throw_ $node)
    {
        return 'throw ' . $this->p($node->expr) . ';';
    }
    protected function pStmt_Label(\PhpParser\Node\Stmt\Label $node)
    {
        return $node->name . ':';
    }
    protected function pStmt_Goto(\PhpParser\Node\Stmt\Goto_ $node)
    {
        return 'goto ' . $node->name . ';';
    }
    // Other
    protected function pStmt_Expression(\PhpParser\Node\Stmt\Expression $node)
    {
        return $this->p($node->expr) . ';';
    }
    protected function pStmt_Echo(\PhpParser\Node\Stmt\Echo_ $node)
    {
        return 'echo ' . $this->pCommaSeparated($node->exprs) . ';';
    }
    protected function pStmt_Static(\PhpParser\Node\Stmt\Static_ $node)
    {
        return 'static ' . $this->pCommaSeparated($node->vars) . ';';
    }
    protected function pStmt_Global(\PhpParser\Node\Stmt\Global_ $node)
    {
        return 'global ' . $this->pCommaSeparated($node->vars) . ';';
    }
    protected function pStmt_StaticVar(\PhpParser\Node\Stmt\StaticVar $node)
    {
        return $this->p($node->var) . (null !== $node->default ? ' = ' . $this->p($node->default) : '');
    }
    protected function pStmt_Unset(\PhpParser\Node\Stmt\Unset_ $node)
    {
        return 'unset(' . $this->pCommaSeparated($node->vars) . ');';
    }
    protected function pStmt_InlineHTML(\PhpParser\Node\Stmt\InlineHTML $node)
    {
        $newline = $node->getAttribute('hasLeadingNewline', \true) ? "\n" : '';
        return '?>' . $newline . $node->value . '<?php ';
    }
    protected function pStmt_HaltCompiler(\PhpParser\Node\Stmt\HaltCompiler $node)
    {
        return '__halt_compiler();' . $node->remaining;
    }
    protected function pStmt_Nop(\PhpParser\Node\Stmt\Nop $node)
    {
        return '';
    }
    // Helpers
    protected function pClassCommon(\PhpParser\Node\Stmt\Class_ $node, $afterClassToken)
    {
        return $this->pModifiers($node->flags) . 'class' . $afterClassToken . (null !== $node->extends ? ' extends ' . $this->p($node->extends) : '') . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}';
    }
    protected function pObjectProperty($node)
    {
        if ($node instanceof \PhpParser\Node\Expr) {
            return '{' . $this->p($node) . '}';
        } else {
            return $node;
        }
    }
    protected function pEncapsList(array $encapsList, $quote)
    {
        $return = '';
        foreach ($encapsList as $element) {
            if ($element instanceof \PhpParser\Node\Scalar\EncapsedStringPart) {
                $return .= $this->escapeString($element->value, $quote);
            } else {
                $return .= '{' . $this->p($element) . '}';
            }
        }
        return $return;
    }
    protected function pSingleQuotedString(string $string)
    {
        return '\'' . \addcslashes($string, '\'\\') . '\'';
    }
    protected function escapeString($string, $quote)
    {
        if (null === $quote) {
            // For doc strings, don't escape newlines
            $escaped = \addcslashes($string, "\t\f\v\$\\");
        } else {
            $escaped = \addcslashes($string, "\n\r\t\f\v\$" . $quote . "\\");
        }
        // Escape other control characters
        return \preg_replace_callback('/([\\0-\\10\\16-\\37])(?=([0-7]?))/', function ($matches) {
            $oct = \decoct(\ord($matches[1]));
            if ($matches[2] !== '') {
                // If there is a trailing digit, use the full three character form
                return '\\' . \str_pad($oct, 3, '0', \STR_PAD_LEFT);
            }
            return '\\' . $oct;
        }, $escaped);
    }
    protected function containsEndLabel($string, $label, $atStart = \true, $atEnd = \true)
    {
        $start = $atStart ? '(?:^|[\\r\\n])' : '[\\r\\n]';
        $end = $atEnd ? '(?:$|[;\\r\\n])' : '[;\\r\\n]';
        return \false !== \strpos($string, $label) && \preg_match('/' . $start . $label . $end . '/', $string);
    }
    protected function encapsedContainsEndLabel(array $parts, $label)
    {
        foreach ($parts as $i => $part) {
            $atStart = $i === 0;
            $atEnd = $i === \count($parts) - 1;
            if ($part instanceof \PhpParser\Node\Scalar\EncapsedStringPart && $this->containsEndLabel($part->value, $label, $atStart, $atEnd)) {
                return \true;
            }
        }
        return \false;
    }
    protected function pDereferenceLhs(\PhpParser\Node $node)
    {
        if (!$this->dereferenceLhsRequiresParens($node)) {
            return $this->p($node);
        } else {
            return '(' . $this->p($node) . ')';
        }
    }
    protected function pCallLhs(\PhpParser\Node $node)
    {
        if (!$this->callLhsRequiresParens($node)) {
            return $this->p($node);
        } else {
            return '(' . $this->p($node) . ')';
        }
    }
    /**
     * @param Node[] $nodes
     * @return bool
     */
    private function hasNodeWithComments(array $nodes)
    {
        foreach ($nodes as $node) {
            if ($node && $node->getComments()) {
                return \true;
            }
        }
        return \false;
    }
    private function pMaybeMultiline(array $nodes, $trailingComma = \false)
    {
        if (!$this->hasNodeWithComments($nodes)) {
            return $this->pCommaSeparated($nodes);
        } else {
            return $this->pCommaSeparatedMultiline($nodes, $trailingComma) . $this->nl;
        }
    }
}
<?php

declare (strict_types=1);
namespace PhpParser;

interface Builder
{
    /**
     * Returns the built node.
     *
     * @return Node The built node
     */
    public function getNode() : \PhpParser\Node;
}
<?php

namespace PhpParser;

use PhpParser\Node\Expr;
use PhpParser\Node\Scalar;
/**
 * Evaluates constant expressions.
 *
 * This evaluator is able to evaluate all constant expressions (as defined by PHP), which can be
 * evaluated without further context. If a subexpression is not of this type, a user-provided
 * fallback evaluator is invoked. To support all constant expressions that are also supported by
 * PHP (and not already handled by this class), the fallback evaluator must be able to handle the
 * following node types:
 *
 *  * All Scalar\MagicConst\* nodes.
 *  * Expr\ConstFetch nodes. Only null/false/true are already handled by this class.
 *  * Expr\ClassConstFetch nodes.
 *
 * The fallback evaluator should throw ConstExprEvaluationException for nodes it cannot evaluate.
 *
 * The evaluation is dependent on runtime configuration in two respects: Firstly, floating
 * point to string conversions are affected by the precision ini setting. Secondly, they are also
 * affected by the LC_NUMERIC locale.
 */
class ConstExprEvaluator
{
    private $fallbackEvaluator;
    /**
     * Create a constant expression evaluator.
     *
     * The provided fallback evaluator is invoked whenever a subexpression cannot be evaluated. See
     * class doc comment for more information.
     *
     * @param callable|null $fallbackEvaluator To call if subexpression cannot be evaluated
     */
    public function __construct(callable $fallbackEvaluator = null)
    {
        $this->fallbackEvaluator = $fallbackEvaluator ?? function (\PhpParser\Node\Expr $expr) {
            throw new \PhpParser\ConstExprEvaluationException("Expression of type {$expr->getType()} cannot be evaluated");
        };
    }
    /**
     * Silently evaluates a constant expression into a PHP value.
     *
     * Thrown Errors, warnings or notices will be converted into a ConstExprEvaluationException.
     * The original source of the exception is available through getPrevious().
     *
     * If some part of the expression cannot be evaluated, the fallback evaluator passed to the
     * constructor will be invoked. By default, if no fallback is provided, an exception of type
     * ConstExprEvaluationException is thrown.
     *
     * See class doc comment for caveats and limitations.
     *
     * @param Expr $expr Constant expression to evaluate
     * @return mixed Result of evaluation
     *
     * @throws ConstExprEvaluationException if the expression cannot be evaluated or an error occurred
     */
    public function evaluateSilently(\PhpParser\Node\Expr $expr)
    {
        \set_error_handler(function ($num, $str, $file, $line) {
            throw new \ErrorException($str, 0, $num, $file, $line);
        });
        try {
            return $this->evaluate($expr);
        } catch (\Throwable $e) {
            if (!$e instanceof \PhpParser\ConstExprEvaluationException) {
                $e = new \PhpParser\ConstExprEvaluationException("An error occurred during constant expression evaluation", 0, $e);
            }
            throw $e;
        } finally {
            \restore_error_handler();
        }
    }
    /**
     * Directly evaluates a constant expression into a PHP value.
     *
     * May generate Error exceptions, warnings or notices. Use evaluateSilently() to convert these
     * into a ConstExprEvaluationException.
     *
     * If some part of the expression cannot be evaluated, the fallback evaluator passed to the
     * constructor will be invoked. By default, if no fallback is provided, an exception of type
     * ConstExprEvaluationException is thrown.
     *
     * See class doc comment for caveats and limitations.
     *
     * @param Expr $expr Constant expression to evaluate
     * @return mixed Result of evaluation
     *
     * @throws ConstExprEvaluationException if the expression cannot be evaluated
     */
    public function evaluateDirectly(\PhpParser\Node\Expr $expr)
    {
        return $this->evaluate($expr);
    }
    private function evaluate(\PhpParser\Node\Expr $expr)
    {
        if ($expr instanceof \PhpParser\Node\Scalar\LNumber || $expr instanceof \PhpParser\Node\Scalar\DNumber || $expr instanceof \PhpParser\Node\Scalar\String_) {
            return $expr->value;
        }
        if ($expr instanceof \PhpParser\Node\Expr\Array_) {
            return $this->evaluateArray($expr);
        }
        // Unary operators
        if ($expr instanceof \PhpParser\Node\Expr\UnaryPlus) {
            return +$this->evaluate($expr->expr);
        }
        if ($expr instanceof \PhpParser\Node\Expr\UnaryMinus) {
            return -$this->evaluate($expr->expr);
        }
        if ($expr instanceof \PhpParser\Node\Expr\BooleanNot) {
            return !$this->evaluate($expr->expr);
        }
        if ($expr instanceof \PhpParser\Node\Expr\BitwiseNot) {
            return ~$this->evaluate($expr->expr);
        }
        if ($expr instanceof \PhpParser\Node\Expr\BinaryOp) {
            return $this->evaluateBinaryOp($expr);
        }
        if ($expr instanceof \PhpParser\Node\Expr\Ternary) {
            return $this->evaluateTernary($expr);
        }
        if ($expr instanceof \PhpParser\Node\Expr\ArrayDimFetch && null !== $expr->dim) {
            return $this->evaluate($expr->var)[$this->evaluate($expr->dim)];
        }
        if ($expr instanceof \PhpParser\Node\Expr\ConstFetch) {
            return $this->evaluateConstFetch($expr);
        }
        return ($this->fallbackEvaluator)($expr);
    }
    private function evaluateArray(\PhpParser\Node\Expr\Array_ $expr)
    {
        $array = [];
        foreach ($expr->items as $item) {
            if (null !== $item->key) {
                $array[$this->evaluate($item->key)] = $this->evaluate($item->value);
            } else {
                $array[] = $this->evaluate($item->value);
            }
        }
        return $array;
    }
    private function evaluateTernary(\PhpParser\Node\Expr\Ternary $expr)
    {
        if (null === $expr->if) {
            return $this->evaluate($expr->cond) ?: $this->evaluate($expr->else);
        }
        return $this->evaluate($expr->cond) ? $this->evaluate($expr->if) : $this->evaluate($expr->else);
    }
    private function evaluateBinaryOp(\PhpParser\Node\Expr\BinaryOp $expr)
    {
        if ($expr instanceof \PhpParser\Node\Expr\BinaryOp\Coalesce && $expr->left instanceof \PhpParser\Node\Expr\ArrayDimFetch) {
            // This needs to be special cased to respect BP_VAR_IS fetch semantics
            return $this->evaluate($expr->left->var)[$this->evaluate($expr->left->dim)] ?? $this->evaluate($expr->right);
        }
        // The evaluate() calls are repeated in each branch, because some of the operators are
        // short-circuiting and evaluating the RHS in advance may be illegal in that case
        $l = $expr->left;
        $r = $expr->right;
        switch ($expr->getOperatorSigil()) {
            case '&':
                return $this->evaluate($l) & $this->evaluate($r);
            case '|':
                return $this->evaluate($l) | $this->evaluate($r);
            case '^':
                return $this->evaluate($l) ^ $this->evaluate($r);
            case '&&':
                return $this->evaluate($l) && $this->evaluate($r);
            case '||':
                return $this->evaluate($l) || $this->evaluate($r);
            case '??':
                return $this->evaluate($l) ?? $this->evaluate($r);
            case '.':
                return $this->evaluate($l) . $this->evaluate($r);
            case '/':
                return $this->evaluate($l) / $this->evaluate($r);
            case '==':
                return $this->evaluate($l) == $this->evaluate($r);
            case '>':
                return $this->evaluate($l) > $this->evaluate($r);
            case '>=':
                return $this->evaluate($l) >= $this->evaluate($r);
            case '===':
                return $this->evaluate($l) === $this->evaluate($r);
            case 'and':
                return $this->evaluate($l) and $this->evaluate($r);
            case 'or':
                return $this->evaluate($l) or $this->evaluate($r);
            case 'xor':
                return $this->evaluate($l) xor $this->evaluate($r);
            case '-':
                return $this->evaluate($l) - $this->evaluate($r);
            case '%':
                return $this->evaluate($l) % $this->evaluate($r);
            case '*':
                return $this->evaluate($l) * $this->evaluate($r);
            case '!=':
                return $this->evaluate($l) != $this->evaluate($r);
            case '!==':
                return $this->evaluate($l) !== $this->evaluate($r);
            case '+':
                return $this->evaluate($l) + $this->evaluate($r);
            case '**':
                return $this->evaluate($l) ** $this->evaluate($r);
            case '<<':
                return $this->evaluate($l) << $this->evaluate($r);
            case '>>':
                return $this->evaluate($l) >> $this->evaluate($r);
            case '<':
                return $this->evaluate($l) < $this->evaluate($r);
            case '<=':
                return $this->evaluate($l) <= $this->evaluate($r);
            case '<=>':
                return $this->evaluate($l) <=> $this->evaluate($r);
        }
        throw new \Exception('Should not happen');
    }
    private function evaluateConstFetch(\PhpParser\Node\Expr\ConstFetch $expr)
    {
        $name = $expr->name->toLowerString();
        switch ($name) {
            case 'null':
                return null;
            case 'false':
                return \false;
            case 'true':
                return \true;
        }
        return ($this->fallbackEvaluator)($expr);
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Internal;

/**
 * @internal
 */
class DiffElem
{
    const TYPE_KEEP = 0;
    const TYPE_REMOVE = 1;
    const TYPE_ADD = 2;
    const TYPE_REPLACE = 3;
    /** @var int One of the TYPE_* constants */
    public $type;
    /** @var mixed Is null for add operations */
    public $old;
    /** @var mixed Is null for remove operations */
    public $new;
    public function __construct(int $type, $old, $new)
    {
        $this->type = $type;
        $this->old = $old;
        $this->new = $new;
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Internal;

/**
 * Implements the Myers diff algorithm.
 *
 * Myers, Eugene W. "An O (ND) difference algorithm and its variations."
 * Algorithmica 1.1 (1986): 251-266.
 *
 * @internal
 */
class Differ
{
    private $isEqual;
    /**
     * Create differ over the given equality relation.
     *
     * @param callable $isEqual Equality relation with signature function($a, $b) : bool
     */
    public function __construct(callable $isEqual)
    {
        $this->isEqual = $isEqual;
    }
    /**
     * Calculate diff (edit script) from $old to $new.
     *
     * @param array $old Original array
     * @param array $new New array
     *
     * @return DiffElem[] Diff (edit script)
     */
    public function diff(array $old, array $new)
    {
        list($trace, $x, $y) = $this->calculateTrace($old, $new);
        return $this->extractDiff($trace, $x, $y, $old, $new);
    }
    /**
     * Calculate diff, including "replace" operations.
     *
     * If a sequence of remove operations is followed by the same number of add operations, these
     * will be coalesced into replace operations.
     *
     * @param array $old Original array
     * @param array $new New array
     *
     * @return DiffElem[] Diff (edit script), including replace operations
     */
    public function diffWithReplacements(array $old, array $new)
    {
        return $this->coalesceReplacements($this->diff($old, $new));
    }
    private function calculateTrace(array $a, array $b)
    {
        $n = \count($a);
        $m = \count($b);
        $max = $n + $m;
        $v = [1 => 0];
        $trace = [];
        for ($d = 0; $d <= $max; $d++) {
            $trace[] = $v;
            for ($k = -$d; $k <= $d; $k += 2) {
                if ($k === -$d || $k !== $d && $v[$k - 1] < $v[$k + 1]) {
                    $x = $v[$k + 1];
                } else {
                    $x = $v[$k - 1] + 1;
                }
                $y = $x - $k;
                while ($x < $n && $y < $m && ($this->isEqual)($a[$x], $b[$y])) {
                    $x++;
                    $y++;
                }
                $v[$k] = $x;
                if ($x >= $n && $y >= $m) {
                    return [$trace, $x, $y];
                }
            }
        }
        throw new \Exception('Should not happen');
    }
    private function extractDiff(array $trace, int $x, int $y, array $a, array $b)
    {
        $result = [];
        for ($d = \count($trace) - 1; $d >= 0; $d--) {
            $v = $trace[$d];
            $k = $x - $y;
            if ($k === -$d || $k !== $d && $v[$k - 1] < $v[$k + 1]) {
                $prevK = $k + 1;
            } else {
                $prevK = $k - 1;
            }
            $prevX = $v[$prevK];
            $prevY = $prevX - $prevK;
            while ($x > $prevX && $y > $prevY) {
                $result[] = new \PhpParser\Internal\DiffElem(\PhpParser\Internal\DiffElem::TYPE_KEEP, $a[$x - 1], $b[$y - 1]);
                $x--;
                $y--;
            }
            if ($d === 0) {
                break;
            }
            while ($x > $prevX) {
                $result[] = new \PhpParser\Internal\DiffElem(\PhpParser\Internal\DiffElem::TYPE_REMOVE, $a[$x - 1], null);
                $x--;
            }
            while ($y > $prevY) {
                $result[] = new \PhpParser\Internal\DiffElem(\PhpParser\Internal\DiffElem::TYPE_ADD, null, $b[$y - 1]);
                $y--;
            }
        }
        return \array_reverse($result);
    }
    /**
     * Coalesce equal-length sequences of remove+add into a replace operation.
     *
     * @param DiffElem[] $diff
     * @return DiffElem[]
     */
    private function coalesceReplacements(array $diff)
    {
        $newDiff = [];
        $c = \count($diff);
        for ($i = 0; $i < $c; $i++) {
            $diffType = $diff[$i]->type;
            if ($diffType !== \PhpParser\Internal\DiffElem::TYPE_REMOVE) {
                $newDiff[] = $diff[$i];
                continue;
            }
            $j = $i;
            while ($j < $c && $diff[$j]->type === \PhpParser\Internal\DiffElem::TYPE_REMOVE) {
                $j++;
            }
            $k = $j;
            while ($k < $c && $diff[$k]->type === \PhpParser\Internal\DiffElem::TYPE_ADD) {
                $k++;
            }
            if ($j - $i === $k - $j) {
                $len = $j - $i;
                for ($n = 0; $n < $len; $n++) {
                    $newDiff[] = new \PhpParser\Internal\DiffElem(\PhpParser\Internal\DiffElem::TYPE_REPLACE, $diff[$i + $n]->old, $diff[$j + $n]->new);
                }
            } else {
                for (; $i < $k; $i++) {
                    $newDiff[] = $diff[$i];
                }
            }
            $i = $k - 1;
        }
        return $newDiff;
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Internal;

use PhpParser\Node;
use PhpParser\Node\Expr;
/**
 * This node is used internally by the format-preserving pretty printer to print anonymous classes.
 *
 * The normal anonymous class structure violates assumptions about the order of token offsets.
 * Namely, the constructor arguments are part of the Expr\New_ node and follow the class node, even
 * though they are actually interleaved with them. This special node type is used temporarily to
 * restore a sane token offset order.
 *
 * @internal
 */
class PrintableNewAnonClassNode extends \PhpParser\Node\Expr
{
    /** @var Node\Arg[] Arguments */
    public $args;
    /** @var null|Node\Name Name of extended class */
    public $extends;
    /** @var Node\Name[] Names of implemented interfaces */
    public $implements;
    /** @var Node\Stmt[] Statements */
    public $stmts;
    public function __construct(array $args, \PhpParser\Node\Name $extends = null, array $implements, array $stmts, array $attributes)
    {
        parent::__construct($attributes);
        $this->args = $args;
        $this->extends = $extends;
        $this->implements = $implements;
        $this->stmts = $stmts;
    }
    public static function fromNewNode(\PhpParser\Node\Expr\New_ $newNode)
    {
        $class = $newNode->class;
        \assert($class instanceof \PhpParser\Node\Stmt\Class_);
        // We don't assert that $class->name is null here, to allow consumers to assign unique names
        // to anonymous classes for their own purposes. We simplify ignore the name here.
        return new self($newNode->args, $class->extends, $class->implements, $class->stmts, $newNode->getAttributes());
    }
    public function getType() : string
    {
        return 'Expr_PrintableNewAnonClass';
    }
    public function getSubNodeNames() : array
    {
        return ['args', 'extends', 'implements', 'stmts'];
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Internal;

/**
 * Provides operations on token streams, for use by pretty printer.
 *
 * @internal
 */
class TokenStream
{
    /** @var array Tokens (in token_get_all format) */
    private $tokens;
    /** @var int[] Map from position to indentation */
    private $indentMap;
    /**
     * Create token stream instance.
     *
     * @param array $tokens Tokens in token_get_all() format
     */
    public function __construct(array $tokens)
    {
        $this->tokens = $tokens;
        $this->indentMap = $this->calcIndentMap();
    }
    /**
     * Whether the given position is immediately surrounded by parenthesis.
     *
     * @param int $startPos Start position
     * @param int $endPos   End position
     *
     * @return bool
     */
    public function haveParens(int $startPos, int $endPos) : bool
    {
        return $this->haveTokenImmediativelyBefore($startPos, '(') && $this->haveTokenImmediatelyAfter($endPos, ')');
    }
    /**
     * Whether the given position is immediately surrounded by braces.
     *
     * @param int $startPos Start position
     * @param int $endPos   End position
     *
     * @return bool
     */
    public function haveBraces(int $startPos, int $endPos) : bool
    {
        return $this->haveTokenImmediativelyBefore($startPos, '{') && $this->haveTokenImmediatelyAfter($endPos, '}');
    }
    /**
     * Check whether the position is directly preceded by a certain token type.
     *
     * During this check whitespace and comments are skipped.
     *
     * @param int        $pos               Position before which the token should occur
     * @param int|string $expectedTokenType Token to check for
     *
     * @return bool Whether the expected token was found
     */
    public function haveTokenImmediativelyBefore(int $pos, $expectedTokenType) : bool
    {
        $tokens = $this->tokens;
        $pos--;
        for (; $pos >= 0; $pos--) {
            $tokenType = $tokens[$pos][0];
            if ($tokenType === $expectedTokenType) {
                return \true;
            }
            if ($tokenType !== \T_WHITESPACE && $tokenType !== \T_COMMENT && $tokenType !== \T_DOC_COMMENT) {
                break;
            }
        }
        return \false;
    }
    /**
     * Check whether the position is directly followed by a certain token type.
     *
     * During this check whitespace and comments are skipped.
     *
     * @param int        $pos               Position after which the token should occur
     * @param int|string $expectedTokenType Token to check for
     *
     * @return bool Whether the expected token was found
     */
    public function haveTokenImmediatelyAfter(int $pos, $expectedTokenType) : bool
    {
        $tokens = $this->tokens;
        $pos++;
        for (; $pos < \count($tokens); $pos++) {
            $tokenType = $tokens[$pos][0];
            if ($tokenType === $expectedTokenType) {
                return \true;
            }
            if ($tokenType !== \T_WHITESPACE && $tokenType !== \T_COMMENT && $tokenType !== \T_DOC_COMMENT) {
                break;
            }
        }
        return \false;
    }
    public function skipLeft(int $pos, $skipTokenType)
    {
        $tokens = $this->tokens;
        $pos = $this->skipLeftWhitespace($pos);
        if ($skipTokenType === \T_WHITESPACE) {
            return $pos;
        }
        if ($tokens[$pos][0] !== $skipTokenType) {
            // Shouldn't happen. The skip token MUST be there
            throw new \Exception('Encountered unexpected token');
        }
        $pos--;
        return $this->skipLeftWhitespace($pos);
    }
    public function skipRight(int $pos, $skipTokenType)
    {
        $tokens = $this->tokens;
        $pos = $this->skipRightWhitespace($pos);
        if ($skipTokenType === \T_WHITESPACE) {
            return $pos;
        }
        if ($tokens[$pos][0] !== $skipTokenType) {
            // Shouldn't happen. The skip token MUST be there
            throw new \Exception('Encountered unexpected token');
        }
        $pos++;
        return $this->skipRightWhitespace($pos);
    }
    /**
     * Return first non-whitespace token position smaller or equal to passed position.
     *
     * @param int $pos Token position
     * @return int Non-whitespace token position
     */
    public function skipLeftWhitespace(int $pos)
    {
        $tokens = $this->tokens;
        for (; $pos >= 0; $pos--) {
            $type = $tokens[$pos][0];
            if ($type !== \T_WHITESPACE && $type !== \T_COMMENT && $type !== \T_DOC_COMMENT) {
                break;
            }
        }
        return $pos;
    }
    /**
     * Return first non-whitespace position greater or equal to passed position.
     *
     * @param int $pos Token position
     * @return int Non-whitespace token position
     */
    public function skipRightWhitespace(int $pos)
    {
        $tokens = $this->tokens;
        for ($count = \count($tokens); $pos < $count; $pos++) {
            $type = $tokens[$pos][0];
            if ($type !== \T_WHITESPACE && $type !== \T_COMMENT && $type !== \T_DOC_COMMENT) {
                break;
            }
        }
        return $pos;
    }
    public function findRight($pos, $findTokenType)
    {
        $tokens = $this->tokens;
        for ($count = \count($tokens); $pos < $count; $pos++) {
            $type = $tokens[$pos][0];
            if ($type === $findTokenType) {
                return $pos;
            }
        }
        return -1;
    }
    /**
     * Get indentation before token position.
     *
     * @param int $pos Token position
     *
     * @return int Indentation depth (in spaces)
     */
    public function getIndentationBefore(int $pos) : int
    {
        return $this->indentMap[$pos];
    }
    /**
     * Get the code corresponding to a token offset range, optionally adjusted for indentation.
     *
     * @param int $from   Token start position (inclusive)
     * @param int $to     Token end position (exclusive)
     * @param int $indent By how much the code should be indented (can be negative as well)
     *
     * @return string Code corresponding to token range, adjusted for indentation
     */
    public function getTokenCode(int $from, int $to, int $indent) : string
    {
        $tokens = $this->tokens;
        $result = '';
        for ($pos = $from; $pos < $to; $pos++) {
            $token = $tokens[$pos];
            if (\is_array($token)) {
                $type = $token[0];
                $content = $token[1];
                if ($type === \T_CONSTANT_ENCAPSED_STRING || $type === \T_ENCAPSED_AND_WHITESPACE) {
                    $result .= $content;
                } else {
                    // TODO Handle non-space indentation
                    if ($indent < 0) {
                        $result .= \str_replace("\n" . \str_repeat(" ", -$indent), "\n", $content);
                    } elseif ($indent > 0) {
                        $result .= \str_replace("\n", "\n" . \str_repeat(" ", $indent), $content);
                    } else {
                        $result .= $content;
                    }
                }
            } else {
                $result .= $token;
            }
        }
        return $result;
    }
    /**
     * Precalculate the indentation at every token position.
     *
     * @return int[] Token position to indentation map
     */
    private function calcIndentMap()
    {
        $indentMap = [];
        $indent = 0;
        foreach ($this->tokens as $token) {
            $indentMap[] = $indent;
            if ($token[0] === \T_WHITESPACE) {
                $content = $token[1];
                $newlinePos = \strrpos($content, "\n");
                if (\false !== $newlinePos) {
                    $indent = \strlen($content) - $newlinePos - 1;
                }
            }
        }
        // Add a sentinel for one past end of the file
        $indentMap[] = $indent;
        return $indentMap;
    }
}
<?php

declare (strict_types=1);
namespace PhpParser;

use PhpParser\Node\Expr\Include_;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\GroupUse;
use PhpParser\Node\Stmt\Use_;
use PhpParser\Node\Stmt\UseUse;
class NodeDumper
{
    private $dumpComments;
    private $dumpPositions;
    private $code;
    /**
     * Constructs a NodeDumper.
     *
     * Supported options:
     *  * bool dumpComments: Whether comments should be dumped.
     *  * bool dumpPositions: Whether line/offset information should be dumped. To dump offset
     *                        information, the code needs to be passed to dump().
     *
     * @param array $options Options (see description)
     */
    public function __construct(array $options = [])
    {
        $this->dumpComments = !empty($options['dumpComments']);
        $this->dumpPositions = !empty($options['dumpPositions']);
    }
    /**
     * Dumps a node or array.
     *
     * @param array|Node  $node Node or array to dump
     * @param string|null $code Code corresponding to dumped AST. This only needs to be passed if
     *                          the dumpPositions option is enabled and the dumping of node offsets
     *                          is desired.
     *
     * @return string Dumped value
     */
    public function dump($node, string $code = null) : string
    {
        $this->code = $code;
        return $this->dumpRecursive($node);
    }
    protected function dumpRecursive($node)
    {
        if ($node instanceof \PhpParser\Node) {
            $r = $node->getType();
            if ($this->dumpPositions && null !== ($p = $this->dumpPosition($node))) {
                $r .= $p;
            }
            $r .= '(';
            foreach ($node->getSubNodeNames() as $key) {
                $r .= "\n    " . $key . ': ';
                $value = $node->{$key};
                if (null === $value) {
                    $r .= 'null';
                } elseif (\false === $value) {
                    $r .= 'false';
                } elseif (\true === $value) {
                    $r .= 'true';
                } elseif (\is_scalar($value)) {
                    if ('flags' === $key || 'newModifier' === $key) {
                        $r .= $this->dumpFlags($value);
                    } elseif ('type' === $key && $node instanceof \PhpParser\Node\Expr\Include_) {
                        $r .= $this->dumpIncludeType($value);
                    } elseif ('type' === $key && ($node instanceof \PhpParser\Node\Stmt\Use_ || $node instanceof \PhpParser\Node\Stmt\UseUse || $node instanceof \PhpParser\Node\Stmt\GroupUse)) {
                        $r .= $this->dumpUseType($value);
                    } else {
                        $r .= $value;
                    }
                } else {
                    $r .= \str_replace("\n", "\n    ", $this->dumpRecursive($value));
                }
            }
            if ($this->dumpComments && ($comments = $node->getComments())) {
                $r .= "\n    comments: " . \str_replace("\n", "\n    ", $this->dumpRecursive($comments));
            }
        } elseif (\is_array($node)) {
            $r = 'array(';
            foreach ($node as $key => $value) {
                $r .= "\n    " . $key . ': ';
                if (null === $value) {
                    $r .= 'null';
                } elseif (\false === $value) {
                    $r .= 'false';
                } elseif (\true === $value) {
                    $r .= 'true';
                } elseif (\is_scalar($value)) {
                    $r .= $value;
                } else {
                    $r .= \str_replace("\n", "\n    ", $this->dumpRecursive($value));
                }
            }
        } elseif ($node instanceof \PhpParser\Comment) {
            return $node->getReformattedText();
        } else {
            throw new \InvalidArgumentException('Can only dump nodes and arrays.');
        }
        return $r . "\n)";
    }
    protected function dumpFlags($flags)
    {
        $strs = [];
        if ($flags & \PhpParser\Node\Stmt\Class_::MODIFIER_PUBLIC) {
            $strs[] = 'MODIFIER_PUBLIC';
        }
        if ($flags & \PhpParser\Node\Stmt\Class_::MODIFIER_PROTECTED) {
            $strs[] = 'MODIFIER_PROTECTED';
        }
        if ($flags & \PhpParser\Node\Stmt\Class_::MODIFIER_PRIVATE) {
            $strs[] = 'MODIFIER_PRIVATE';
        }
        if ($flags & \PhpParser\Node\Stmt\Class_::MODIFIER_ABSTRACT) {
            $strs[] = 'MODIFIER_ABSTRACT';
        }
        if ($flags & \PhpParser\Node\Stmt\Class_::MODIFIER_STATIC) {
            $strs[] = 'MODIFIER_STATIC';
        }
        if ($flags & \PhpParser\Node\Stmt\Class_::MODIFIER_FINAL) {
            $strs[] = 'MODIFIER_FINAL';
        }
        if ($strs) {
            return \implode(' | ', $strs) . ' (' . $flags . ')';
        } else {
            return $flags;
        }
    }
    protected function dumpIncludeType($type)
    {
        $map = [\PhpParser\Node\Expr\Include_::TYPE_INCLUDE => 'TYPE_INCLUDE', \PhpParser\Node\Expr\Include_::TYPE_INCLUDE_ONCE => 'TYPE_INCLUDE_ONCE', \PhpParser\Node\Expr\Include_::TYPE_REQUIRE => 'TYPE_REQUIRE', \PhpParser\Node\Expr\Include_::TYPE_REQUIRE_ONCE => 'TYPE_REQUIRE_ONCE'];
        if (!isset($map[$type])) {
            return $type;
        }
        return $map[$type] . ' (' . $type . ')';
    }
    protected function dumpUseType($type)
    {
        $map = [\PhpParser\Node\Stmt\Use_::TYPE_UNKNOWN => 'TYPE_UNKNOWN', \PhpParser\Node\Stmt\Use_::TYPE_NORMAL => 'TYPE_NORMAL', \PhpParser\Node\Stmt\Use_::TYPE_FUNCTION => 'TYPE_FUNCTION', \PhpParser\Node\Stmt\Use_::TYPE_CONSTANT => 'TYPE_CONSTANT'];
        if (!isset($map[$type])) {
            return $type;
        }
        return $map[$type] . ' (' . $type . ')';
    }
    /**
     * Dump node position, if possible.
     *
     * @param Node $node Node for which to dump position
     *
     * @return string|null Dump of position, or null if position information not available
     */
    protected function dumpPosition(\PhpParser\Node $node)
    {
        if (!$node->hasAttribute('startLine') || !$node->hasAttribute('endLine')) {
            return null;
        }
        $start = $node->getStartLine();
        $end = $node->getEndLine();
        if ($node->hasAttribute('startFilePos') && $node->hasAttribute('endFilePos') && null !== $this->code) {
            $start .= ':' . $this->toColumn($this->code, $node->getStartFilePos());
            $end .= ':' . $this->toColumn($this->code, $node->getEndFilePos());
        }
        return "[{$start} - {$end}]";
    }
    // Copied from Error class
    private function toColumn($code, $pos)
    {
        if ($pos > \strlen($code)) {
            throw new \RuntimeException('Invalid position information');
        }
        $lineStartPos = \strrpos($code, "\n", $pos - \strlen($code));
        if (\false === $lineStartPos) {
            $lineStartPos = -1;
        }
        return $pos - $lineStartPos;
    }
}
<?php

declare (strict_types=1);
namespace PhpParser;

/*
 * This parser is based on a skeleton written by Moriyoshi Koizumi, which in
 * turn is based on work by Masato Bito.
 */
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\Cast\Double;
use PhpParser\Node\Name;
use PhpParser\Node\Param;
use PhpParser\Node\Scalar\Encapsed;
use PhpParser\Node\Scalar\LNumber;
use PhpParser\Node\Scalar\String_;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassConst;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Interface_;
use PhpParser\Node\Stmt\Namespace_;
use PhpParser\Node\Stmt\Property;
use PhpParser\Node\Stmt\TryCatch;
use PhpParser\Node\Stmt\UseUse;
use PhpParser\Node\VarLikeIdentifier;
abstract class ParserAbstract implements \PhpParser\Parser
{
    const SYMBOL_NONE = -1;
    /*
     * The following members will be filled with generated parsing data:
     */
    /** @var int Size of $tokenToSymbol map */
    protected $tokenToSymbolMapSize;
    /** @var int Size of $action table */
    protected $actionTableSize;
    /** @var int Size of $goto table */
    protected $gotoTableSize;
    /** @var int Symbol number signifying an invalid token */
    protected $invalidSymbol;
    /** @var int Symbol number of error recovery token */
    protected $errorSymbol;
    /** @var int Action number signifying default action */
    protected $defaultAction;
    /** @var int Rule number signifying that an unexpected token was encountered */
    protected $unexpectedTokenRule;
    protected $YY2TBLSTATE;
    /** @var int Number of non-leaf states */
    protected $numNonLeafStates;
    /** @var int[] Map of lexer tokens to internal symbols */
    protected $tokenToSymbol;
    /** @var string[] Map of symbols to their names */
    protected $symbolToName;
    /** @var array Names of the production rules (only necessary for debugging) */
    protected $productions;
    /** @var int[] Map of states to a displacement into the $action table. The corresponding action for this
        *             state/symbol pair is $action[$actionBase[$state] + $symbol]. If $actionBase[$state] is 0, the
                      action is defaulted, i.e. $actionDefault[$state] should be used instead. */
    protected $actionBase;
    /** @var int[] Table of actions. Indexed according to $actionBase comment. */
    protected $action;
    /** @var int[] Table indexed analogously to $action. If $actionCheck[$actionBase[$state] + $symbol] != $symbol
     *             then the action is defaulted, i.e. $actionDefault[$state] should be used instead. */
    protected $actionCheck;
    /** @var int[] Map of states to their default action */
    protected $actionDefault;
    /** @var callable[] Semantic action callbacks */
    protected $reduceCallbacks;
    /** @var int[] Map of non-terminals to a displacement into the $goto table. The corresponding goto state for this
     *             non-terminal/state pair is $goto[$gotoBase[$nonTerminal] + $state] (unless defaulted) */
    protected $gotoBase;
    /** @var int[] Table of states to goto after reduction. Indexed according to $gotoBase comment. */
    protected $goto;
    /** @var int[] Table indexed analogously to $goto. If $gotoCheck[$gotoBase[$nonTerminal] + $state] != $nonTerminal
     *             then the goto state is defaulted, i.e. $gotoDefault[$nonTerminal] should be used. */
    protected $gotoCheck;
    /** @var int[] Map of non-terminals to the default state to goto after their reduction */
    protected $gotoDefault;
    /** @var int[] Map of rules to the non-terminal on their left-hand side, i.e. the non-terminal to use for
     *             determining the state to goto after reduction. */
    protected $ruleToNonTerminal;
    /** @var int[] Map of rules to the length of their right-hand side, which is the number of elements that have to
     *             be popped from the stack(s) on reduction. */
    protected $ruleToLength;
    /*
     * The following members are part of the parser state:
     */
    /** @var Lexer Lexer that is used when parsing */
    protected $lexer;
    /** @var mixed Temporary value containing the result of last semantic action (reduction) */
    protected $semValue;
    /** @var array Semantic value stack (contains values of tokens and semantic action results) */
    protected $semStack;
    /** @var array[] Start attribute stack */
    protected $startAttributeStack;
    /** @var array[] End attribute stack */
    protected $endAttributeStack;
    /** @var array End attributes of last *shifted* token */
    protected $endAttributes;
    /** @var array Start attributes of last *read* token */
    protected $lookaheadStartAttributes;
    /** @var ErrorHandler Error handler */
    protected $errorHandler;
    /** @var int Error state, used to avoid error floods */
    protected $errorState;
    /**
     * Initialize $reduceCallbacks map.
     */
    protected abstract function initReduceCallbacks();
    /**
     * Creates a parser instance.
     *
     * Options: Currently none.
     *
     * @param Lexer $lexer A lexer
     * @param array $options Options array.
     */
    public function __construct(\PhpParser\Lexer $lexer, array $options = [])
    {
        $this->lexer = $lexer;
        if (isset($options['throwOnError'])) {
            throw new \LogicException('"throwOnError" is no longer supported, use "errorHandler" instead');
        }
        $this->initReduceCallbacks();
    }
    /**
     * Parses PHP code into a node tree.
     *
     * If a non-throwing error handler is used, the parser will continue parsing after an error
     * occurred and attempt to build a partial AST.
     *
     * @param string $code The source code to parse
     * @param ErrorHandler|null $errorHandler Error handler to use for lexer/parser errors, defaults
     *                                        to ErrorHandler\Throwing.
     *
     * @return Node\Stmt[]|null Array of statements (or null non-throwing error handler is used and
     *                          the parser was unable to recover from an error).
     */
    public function parse(string $code, \PhpParser\ErrorHandler $errorHandler = null)
    {
        $this->errorHandler = $errorHandler ?: new \PhpParser\ErrorHandler\Throwing();
        $this->lexer->startLexing($code, $this->errorHandler);
        $result = $this->doParse();
        // Clear out some of the interior state, so we don't hold onto unnecessary
        // memory between uses of the parser
        $this->startAttributeStack = [];
        $this->endAttributeStack = [];
        $this->semStack = [];
        $this->semValue = null;
        return $result;
    }
    protected function doParse()
    {
        // We start off with no lookahead-token
        $symbol = self::SYMBOL_NONE;
        // The attributes for a node are taken from the first and last token of the node.
        // From the first token only the startAttributes are taken and from the last only
        // the endAttributes. Both are merged using the array union operator (+).
        $startAttributes = [];
        $endAttributes = [];
        $this->endAttributes = $endAttributes;
        // Keep stack of start and end attributes
        $this->startAttributeStack = [];
        $this->endAttributeStack = [$endAttributes];
        // Start off in the initial state and keep a stack of previous states
        $state = 0;
        $stateStack = [$state];
        // Semantic value stack (contains values of tokens and semantic action results)
        $this->semStack = [];
        // Current position in the stack(s)
        $stackPos = 0;
        $this->errorState = 0;
        for (;;) {
            //$this->traceNewState($state, $symbol);
            if ($this->actionBase[$state] === 0) {
                $rule = $this->actionDefault[$state];
            } else {
                if ($symbol === self::SYMBOL_NONE) {
                    // Fetch the next token id from the lexer and fetch additional info by-ref.
                    // The end attributes are fetched into a temporary variable and only set once the token is really
                    // shifted (not during read). Otherwise you would sometimes get off-by-one errors, when a rule is
                    // reduced after a token was read but not yet shifted.
                    $tokenId = $this->lexer->getNextToken($tokenValue, $startAttributes, $endAttributes);
                    // map the lexer token id to the internally used symbols
                    $symbol = $tokenId >= 0 && $tokenId < $this->tokenToSymbolMapSize ? $this->tokenToSymbol[$tokenId] : $this->invalidSymbol;
                    if ($symbol === $this->invalidSymbol) {
                        throw new \RangeException(\sprintf('The lexer returned an invalid token (id=%d, value=%s)', $tokenId, $tokenValue));
                    }
                    // This is necessary to assign some meaningful attributes to /* empty */ productions. They'll get
                    // the attributes of the next token, even though they don't contain it themselves.
                    $this->startAttributeStack[$stackPos + 1] = $startAttributes;
                    $this->endAttributeStack[$stackPos + 1] = $endAttributes;
                    $this->lookaheadStartAttributes = $startAttributes;
                    //$this->traceRead($symbol);
                }
                $idx = $this->actionBase[$state] + $symbol;
                if (($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol || $state < $this->YY2TBLSTATE && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $symbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol) && ($action = $this->action[$idx]) !== $this->defaultAction) {
                    /*
                     * >= numNonLeafStates: shift and reduce
                     * > 0: shift
                     * = 0: accept
                     * < 0: reduce
                     * = -YYUNEXPECTED: error
                     */
                    if ($action > 0) {
                        /* shift */
                        //$this->traceShift($symbol);
                        ++$stackPos;
                        $stateStack[$stackPos] = $state = $action;
                        $this->semStack[$stackPos] = $tokenValue;
                        $this->startAttributeStack[$stackPos] = $startAttributes;
                        $this->endAttributeStack[$stackPos] = $endAttributes;
                        $this->endAttributes = $endAttributes;
                        $symbol = self::SYMBOL_NONE;
                        if ($this->errorState) {
                            --$this->errorState;
                        }
                        if ($action < $this->numNonLeafStates) {
                            continue;
                        }
                        /* $yyn >= numNonLeafStates means shift-and-reduce */
                        $rule = $action - $this->numNonLeafStates;
                    } else {
                        $rule = -$action;
                    }
                } else {
                    $rule = $this->actionDefault[$state];
                }
            }
            for (;;) {
                if ($rule === 0) {
                    /* accept */
                    //$this->traceAccept();
                    return $this->semValue;
                } elseif ($rule !== $this->unexpectedTokenRule) {
                    /* reduce */
                    //$this->traceReduce($rule);
                    try {
                        $this->reduceCallbacks[$rule]($stackPos);
                    } catch (\PhpParser\Error $e) {
                        if (-1 === $e->getStartLine() && isset($startAttributes['startLine'])) {
                            $e->setStartLine($startAttributes['startLine']);
                        }
                        $this->emitError($e);
                        // Can't recover from this type of error
                        return null;
                    }
                    /* Goto - shift nonterminal */
                    $lastEndAttributes = $this->endAttributeStack[$stackPos];
                    $stackPos -= $this->ruleToLength[$rule];
                    $nonTerminal = $this->ruleToNonTerminal[$rule];
                    $idx = $this->gotoBase[$nonTerminal] + $stateStack[$stackPos];
                    if ($idx >= 0 && $idx < $this->gotoTableSize && $this->gotoCheck[$idx] === $nonTerminal) {
                        $state = $this->goto[$idx];
                    } else {
                        $state = $this->gotoDefault[$nonTerminal];
                    }
                    ++$stackPos;
                    $stateStack[$stackPos] = $state;
                    $this->semStack[$stackPos] = $this->semValue;
                    $this->endAttributeStack[$stackPos] = $lastEndAttributes;
                } else {
                    /* error */
                    switch ($this->errorState) {
                        case 0:
                            $msg = $this->getErrorMessage($symbol, $state);
                            $this->emitError(new \PhpParser\Error($msg, $startAttributes + $endAttributes));
                        // Break missing intentionally
                        case 1:
                        case 2:
                            $this->errorState = 3;
                            // Pop until error-expecting state uncovered
                            while (!(($idx = $this->actionBase[$state] + $this->errorSymbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $this->errorSymbol || $state < $this->YY2TBLSTATE && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $this->errorSymbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $this->errorSymbol) || ($action = $this->action[$idx]) === $this->defaultAction) {
                                // Not totally sure about this
                                if ($stackPos <= 0) {
                                    // Could not recover from error
                                    return null;
                                }
                                $state = $stateStack[--$stackPos];
                                //$this->tracePop($state);
                            }
                            //$this->traceShift($this->errorSymbol);
                            ++$stackPos;
                            $stateStack[$stackPos] = $state = $action;
                            // We treat the error symbol as being empty, so we reset the end attributes
                            // to the end attributes of the last non-error symbol
                            $this->endAttributeStack[$stackPos] = $this->endAttributeStack[$stackPos - 1];
                            $this->endAttributes = $this->endAttributeStack[$stackPos - 1];
                            break;
                        case 3:
                            if ($symbol === 0) {
                                // Reached EOF without recovering from error
                                return null;
                            }
                            //$this->traceDiscard($symbol);
                            $symbol = self::SYMBOL_NONE;
                            break 2;
                    }
                }
                if ($state < $this->numNonLeafStates) {
                    break;
                }
                /* >= numNonLeafStates means shift-and-reduce */
                $rule = $state - $this->numNonLeafStates;
            }
        }
        throw new \RuntimeException('Reached end of parser loop');
    }
    protected function emitError(\PhpParser\Error $error)
    {
        $this->errorHandler->handleError($error);
    }
    /**
     * Format error message including expected tokens.
     *
     * @param int $symbol Unexpected symbol
     * @param int $state  State at time of error
     *
     * @return string Formatted error message
     */
    protected function getErrorMessage(int $symbol, int $state) : string
    {
        $expectedString = '';
        if ($expected = $this->getExpectedTokens($state)) {
            $expectedString = ', expecting ' . \implode(' or ', $expected);
        }
        return 'Syntax error, unexpected ' . $this->symbolToName[$symbol] . $expectedString;
    }
    /**
     * Get limited number of expected tokens in given state.
     *
     * @param int $state State
     *
     * @return string[] Expected tokens. If too many, an empty array is returned.
     */
    protected function getExpectedTokens(int $state) : array
    {
        $expected = [];
        $base = $this->actionBase[$state];
        foreach ($this->symbolToName as $symbol => $name) {
            $idx = $base + $symbol;
            if ($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol || $state < $this->YY2TBLSTATE && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $symbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol) {
                if ($this->action[$idx] !== $this->unexpectedTokenRule && $this->action[$idx] !== $this->defaultAction && $symbol !== $this->errorSymbol) {
                    if (\count($expected) === 4) {
                        /* Too many expected tokens */
                        return [];
                    }
                    $expected[] = $name;
                }
            }
        }
        return $expected;
    }
    /*
     * Tracing functions used for debugging the parser.
     */
    /*
    protected function traceNewState($state, $symbol) {
        echo '% State ' . $state
            . ', Lookahead ' . ($symbol == self::SYMBOL_NONE ? '--none--' : $this->symbolToName[$symbol]) . "\n";
    }
    
    protected function traceRead($symbol) {
        echo '% Reading ' . $this->symbolToName[$symbol] . "\n";
    }
    
    protected function traceShift($symbol) {
        echo '% Shift ' . $this->symbolToName[$symbol] . "\n";
    }
    
    protected function traceAccept() {
        echo "% Accepted.\n";
    }
    
    protected function traceReduce($n) {
        echo '% Reduce by (' . $n . ') ' . $this->productions[$n] . "\n";
    }
    
    protected function tracePop($state) {
        echo '% Recovering, uncovered state ' . $state . "\n";
    }
    
    protected function traceDiscard($symbol) {
        echo '% Discard ' . $this->symbolToName[$symbol] . "\n";
    }
    */
    /*
     * Helper functions invoked by semantic actions
     */
    /**
     * Moves statements of semicolon-style namespaces into $ns->stmts and checks various error conditions.
     *
     * @param Node\Stmt[] $stmts
     * @return Node\Stmt[]
     */
    protected function handleNamespaces(array $stmts) : array
    {
        $hasErrored = \false;
        $style = $this->getNamespacingStyle($stmts);
        if (null === $style) {
            // not namespaced, nothing to do
            return $stmts;
        } elseif ('brace' === $style) {
            // For braced namespaces we only have to check that there are no invalid statements between the namespaces
            $afterFirstNamespace = \false;
            foreach ($stmts as $stmt) {
                if ($stmt instanceof \PhpParser\Node\Stmt\Namespace_) {
                    $afterFirstNamespace = \true;
                } elseif (!$stmt instanceof \PhpParser\Node\Stmt\HaltCompiler && !$stmt instanceof \PhpParser\Node\Stmt\Nop && $afterFirstNamespace && !$hasErrored) {
                    $this->emitError(new \PhpParser\Error('No code may exist outside of namespace {}', $stmt->getAttributes()));
                    $hasErrored = \true;
                    // Avoid one error for every statement
                }
            }
            return $stmts;
        } else {
            // For semicolon namespaces we have to move the statements after a namespace declaration into ->stmts
            $resultStmts = [];
            $targetStmts =& $resultStmts;
            $lastNs = null;
            foreach ($stmts as $stmt) {
                if ($stmt instanceof \PhpParser\Node\Stmt\Namespace_) {
                    if ($lastNs !== null) {
                        $this->fixupNamespaceAttributes($lastNs);
                    }
                    if ($stmt->stmts === null) {
                        $stmt->stmts = [];
                        $targetStmts =& $stmt->stmts;
                        $resultStmts[] = $stmt;
                    } else {
                        // This handles the invalid case of mixed style namespaces
                        $resultStmts[] = $stmt;
                        $targetStmts =& $resultStmts;
                    }
                    $lastNs = $stmt;
                } elseif ($stmt instanceof \PhpParser\Node\Stmt\HaltCompiler) {
                    // __halt_compiler() is not moved into the namespace
                    $resultStmts[] = $stmt;
                } else {
                    $targetStmts[] = $stmt;
                }
            }
            if ($lastNs !== null) {
                $this->fixupNamespaceAttributes($lastNs);
            }
            return $resultStmts;
        }
    }
    private function fixupNamespaceAttributes(\PhpParser\Node\Stmt\Namespace_ $stmt)
    {
        // We moved the statements into the namespace node, as such the end of the namespace node
        // needs to be extended to the end of the statements.
        if (empty($stmt->stmts)) {
            return;
        }
        // We only move the builtin end attributes here. This is the best we can do with the
        // knowledge we have.
        $endAttributes = ['endLine', 'endFilePos', 'endTokenPos'];
        $lastStmt = $stmt->stmts[\count($stmt->stmts) - 1];
        foreach ($endAttributes as $endAttribute) {
            if ($lastStmt->hasAttribute($endAttribute)) {
                $stmt->setAttribute($endAttribute, $lastStmt->getAttribute($endAttribute));
            }
        }
    }
    /**
     * Determine namespacing style (semicolon or brace)
     *
     * @param Node[] $stmts Top-level statements.
     *
     * @return null|string One of "semicolon", "brace" or null (no namespaces)
     */
    private function getNamespacingStyle(array $stmts)
    {
        $style = null;
        $hasNotAllowedStmts = \false;
        foreach ($stmts as $i => $stmt) {
            if ($stmt instanceof \PhpParser\Node\Stmt\Namespace_) {
                $currentStyle = null === $stmt->stmts ? 'semicolon' : 'brace';
                if (null === $style) {
                    $style = $currentStyle;
                    if ($hasNotAllowedStmts) {
                        $this->emitError(new \PhpParser\Error('Namespace declaration statement has to be the very first statement in the script', $stmt->getLine()));
                    }
                } elseif ($style !== $currentStyle) {
                    $this->emitError(new \PhpParser\Error('Cannot mix bracketed namespace declarations with unbracketed namespace declarations', $stmt->getLine()));
                    // Treat like semicolon style for namespace normalization
                    return 'semicolon';
                }
                continue;
            }
            /* declare(), __halt_compiler() and nops can be used before a namespace declaration */
            if ($stmt instanceof \PhpParser\Node\Stmt\Declare_ || $stmt instanceof \PhpParser\Node\Stmt\HaltCompiler || $stmt instanceof \PhpParser\Node\Stmt\Nop) {
                continue;
            }
            /* There may be a hashbang line at the very start of the file */
            if ($i === 0 && $stmt instanceof \PhpParser\Node\Stmt\InlineHTML && \preg_match('/\\A#!.*\\r?\\n\\z/', $stmt->value)) {
                continue;
            }
            /* Everything else if forbidden before namespace declarations */
            $hasNotAllowedStmts = \true;
        }
        return $style;
    }
    /**
     * Fix up parsing of static property calls in PHP 5.
     *
     * In PHP 5 A::$b[c][d] and A::$b[c][d]() have very different interpretation. The former is
     * interpreted as (A::$b)[c][d], while the latter is the same as A::{$b[c][d]}(). We parse the
     * latter as the former initially and this method fixes the AST into the correct form when we
     * encounter the "()".
     *
     * @param  Node\Expr\StaticPropertyFetch|Node\Expr\ArrayDimFetch $prop
     * @param  Node\Arg[] $args
     * @param  array      $attributes
     *
     * @return Expr\StaticCall
     */
    protected function fixupPhp5StaticPropCall($prop, array $args, array $attributes) : \PhpParser\Node\Expr\StaticCall
    {
        if ($prop instanceof \PhpParser\Node\Expr\StaticPropertyFetch) {
            $name = $prop->name instanceof \PhpParser\Node\VarLikeIdentifier ? $prop->name->toString() : $prop->name;
            $var = new \PhpParser\Node\Expr\Variable($name, $prop->name->getAttributes());
            return new \PhpParser\Node\Expr\StaticCall($prop->class, $var, $args, $attributes);
        } elseif ($prop instanceof \PhpParser\Node\Expr\ArrayDimFetch) {
            $tmp = $prop;
            while ($tmp->var instanceof \PhpParser\Node\Expr\ArrayDimFetch) {
                $tmp = $tmp->var;
            }
            /** @var Expr\StaticPropertyFetch $staticProp */
            $staticProp = $tmp->var;
            // Set start attributes to attributes of innermost node
            $tmp = $prop;
            $this->fixupStartAttributes($tmp, $staticProp->name);
            while ($tmp->var instanceof \PhpParser\Node\Expr\ArrayDimFetch) {
                $tmp = $tmp->var;
                $this->fixupStartAttributes($tmp, $staticProp->name);
            }
            $name = $staticProp->name instanceof \PhpParser\Node\VarLikeIdentifier ? $staticProp->name->toString() : $staticProp->name;
            $tmp->var = new \PhpParser\Node\Expr\Variable($name, $staticProp->name->getAttributes());
            return new \PhpParser\Node\Expr\StaticCall($staticProp->class, $prop, $args, $attributes);
        } else {
            throw new \Exception();
        }
    }
    protected function fixupStartAttributes(\PhpParser\Node $to, \PhpParser\Node $from)
    {
        $startAttributes = ['startLine', 'startFilePos', 'startTokenPos'];
        foreach ($startAttributes as $startAttribute) {
            if ($from->hasAttribute($startAttribute)) {
                $to->setAttribute($startAttribute, $from->getAttribute($startAttribute));
            }
        }
    }
    protected function handleBuiltinTypes(\PhpParser\Node\Name $name)
    {
        $scalarTypes = ['bool' => \true, 'int' => \true, 'float' => \true, 'string' => \true, 'iterable' => \true, 'void' => \true, 'object' => \true];
        if (!$name->isUnqualified()) {
            return $name;
        }
        $lowerName = $name->toLowerString();
        if (!isset($scalarTypes[$lowerName])) {
            return $name;
        }
        return new \PhpParser\Node\Identifier($lowerName, $name->getAttributes());
    }
    /**
     * Get combined start and end attributes at a stack location
     *
     * @param int $pos Stack location
     *
     * @return array Combined start and end attributes
     */
    protected function getAttributesAt(int $pos) : array
    {
        return $this->startAttributeStack[$pos] + $this->endAttributeStack[$pos];
    }
    protected function getFloatCastKind(string $cast) : int
    {
        $cast = \strtolower($cast);
        if (\strpos($cast, 'float') !== \false) {
            return \PhpParser\Node\Expr\Cast\Double::KIND_FLOAT;
        }
        if (\strpos($cast, 'real') !== \false) {
            return \PhpParser\Node\Expr\Cast\Double::KIND_REAL;
        }
        return \PhpParser\Node\Expr\Cast\Double::KIND_DOUBLE;
    }
    protected function parseLNumber($str, $attributes, $allowInvalidOctal = \false)
    {
        try {
            return \PhpParser\Node\Scalar\LNumber::fromString($str, $attributes, $allowInvalidOctal);
        } catch (\PhpParser\Error $error) {
            $this->emitError($error);
            // Use dummy value
            return new \PhpParser\Node\Scalar\LNumber(0, $attributes);
        }
    }
    /**
     * Parse a T_NUM_STRING token into either an integer or string node.
     *
     * @param string $str        Number string
     * @param array  $attributes Attributes
     *
     * @return LNumber|String_ Integer or string node.
     */
    protected function parseNumString(string $str, array $attributes)
    {
        if (!\preg_match('/^(?:0|-?[1-9][0-9]*)$/', $str)) {
            return new \PhpParser\Node\Scalar\String_($str, $attributes);
        }
        $num = +$str;
        if (!\is_int($num)) {
            return new \PhpParser\Node\Scalar\String_($str, $attributes);
        }
        return new \PhpParser\Node\Scalar\LNumber($num, $attributes);
    }
    protected function stripIndentation(string $string, int $indentLen, string $indentChar, bool $newlineAtStart, bool $newlineAtEnd, array $attributes)
    {
        if ($indentLen === 0) {
            return $string;
        }
        $start = $newlineAtStart ? '(?:(?<=\\n)|\\A)' : '(?<=\\n)';
        $end = $newlineAtEnd ? '(?:(?=[\\r\\n])|\\z)' : '(?=[\\r\\n])';
        $regex = '/' . $start . '([ \\t]*)(' . $end . ')?/';
        return \preg_replace_callback($regex, function ($matches) use($indentLen, $indentChar, $attributes) {
            $prefix = \substr($matches[1], 0, $indentLen);
            if (\false !== \strpos($prefix, $indentChar === " " ? "\t" : " ")) {
                $this->emitError(new \PhpParser\Error('Invalid indentation - tabs and spaces cannot be mixed', $attributes));
            } elseif (\strlen($prefix) < $indentLen && !isset($matches[2])) {
                $this->emitError(new \PhpParser\Error('Invalid body indentation level ' . '(expecting an indentation level of at least ' . $indentLen . ')', $attributes));
            }
            return \substr($matches[0], \strlen($prefix));
        }, $string);
    }
    protected function parseDocString(string $startToken, $contents, string $endToken, array $attributes, array $endTokenAttributes, bool $parseUnicodeEscape)
    {
        $kind = \strpos($startToken, "'") === \false ? \PhpParser\Node\Scalar\String_::KIND_HEREDOC : \PhpParser\Node\Scalar\String_::KIND_NOWDOC;
        $regex = '/\\A[bB]?<<<[ \\t]*[\'"]?([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*)[\'"]?(?:\\r\\n|\\n|\\r)\\z/';
        $result = \preg_match($regex, $startToken, $matches);
        \assert($result === 1);
        $label = $matches[1];
        $result = \preg_match('/\\A[ \\t]*/', $endToken, $matches);
        \assert($result === 1);
        $indentation = $matches[0];
        $attributes['kind'] = $kind;
        $attributes['docLabel'] = $label;
        $attributes['docIndentation'] = $indentation;
        $indentHasSpaces = \false !== \strpos($indentation, " ");
        $indentHasTabs = \false !== \strpos($indentation, "\t");
        if ($indentHasSpaces && $indentHasTabs) {
            $this->emitError(new \PhpParser\Error('Invalid indentation - tabs and spaces cannot be mixed', $endTokenAttributes));
            // Proceed processing as if this doc string is not indented
            $indentation = '';
        }
        $indentLen = \strlen($indentation);
        $indentChar = $indentHasSpaces ? " " : "\t";
        if (\is_string($contents)) {
            if ($contents === '') {
                return new \PhpParser\Node\Scalar\String_('', $attributes);
            }
            $contents = $this->stripIndentation($contents, $indentLen, $indentChar, \true, \true, $attributes);
            $contents = \preg_replace('~(\\r\\n|\\n|\\r)\\z~', '', $contents);
            if ($kind === \PhpParser\Node\Scalar\String_::KIND_HEREDOC) {
                $contents = \PhpParser\Node\Scalar\String_::parseEscapeSequences($contents, null, $parseUnicodeEscape);
            }
            return new \PhpParser\Node\Scalar\String_($contents, $attributes);
        } else {
            \assert(\count($contents) > 0);
            if (!$contents[0] instanceof \PhpParser\Node\Scalar\EncapsedStringPart) {
                // If there is no leading encapsed string part, pretend there is an empty one
                $this->stripIndentation('', $indentLen, $indentChar, \true, \false, $contents[0]->getAttributes());
            }
            $newContents = [];
            foreach ($contents as $i => $part) {
                if ($part instanceof \PhpParser\Node\Scalar\EncapsedStringPart) {
                    $isLast = $i === \count($contents) - 1;
                    $part->value = $this->stripIndentation($part->value, $indentLen, $indentChar, $i === 0, $isLast, $part->getAttributes());
                    $part->value = \PhpParser\Node\Scalar\String_::parseEscapeSequences($part->value, null, $parseUnicodeEscape);
                    if ($isLast) {
                        $part->value = \preg_replace('~(\\r\\n|\\n|\\r)\\z~', '', $part->value);
                    }
                    if ('' === $part->value) {
                        continue;
                    }
                }
                $newContents[] = $part;
            }
            return new \PhpParser\Node\Scalar\Encapsed($newContents, $attributes);
        }
    }
    /**
     * Create attributes for a zero-length node with the given start attributes.
     *
     * @param array $startAttributes
     * @return array
     */
    protected function createZeroLengthAttributes(array $startAttributes)
    {
        $attributes = $startAttributes;
        if (isset($startAttributes['startLine'])) {
            $attributes['endLine'] = $startAttributes['startLine'];
        }
        if (isset($startAttributes['startTokenPos'])) {
            $attributes['endTokenPos'] = $startAttributes['startTokenPos'] - 1;
        }
        if (isset($startAttributes['startFilePos'])) {
            $attributes['endFilePos'] = $startAttributes['startFilePos'] - 1;
        }
        return $attributes;
    }
    protected function checkModifier($a, $b, $modifierPos)
    {
        // Jumping through some hoops here because verifyModifier() is also used elsewhere
        try {
            \PhpParser\Node\Stmt\Class_::verifyModifier($a, $b);
        } catch (\PhpParser\Error $error) {
            $error->setAttributes($this->getAttributesAt($modifierPos));
            $this->emitError($error);
        }
    }
    protected function checkParam(\PhpParser\Node\Param $node)
    {
        if ($node->variadic && null !== $node->default) {
            $this->emitError(new \PhpParser\Error('Variadic parameter cannot have a default value', $node->default->getAttributes()));
        }
    }
    protected function checkTryCatch(\PhpParser\Node\Stmt\TryCatch $node)
    {
        if (empty($node->catches) && null === $node->finally) {
            $this->emitError(new \PhpParser\Error('Cannot use try without catch or finally', $node->getAttributes()));
        }
    }
    protected function checkNamespace(\PhpParser\Node\Stmt\Namespace_ $node)
    {
        if ($node->name && $node->name->isSpecialClassName()) {
            $this->emitError(new \PhpParser\Error(\sprintf('Cannot use \'%s\' as namespace name', $node->name), $node->name->getAttributes()));
        }
        if (null !== $node->stmts) {
            foreach ($node->stmts as $stmt) {
                if ($stmt instanceof \PhpParser\Node\Stmt\Namespace_) {
                    $this->emitError(new \PhpParser\Error('Namespace declarations cannot be nested', $stmt->getAttributes()));
                }
            }
        }
    }
    protected function checkClass(\PhpParser\Node\Stmt\Class_ $node, $namePos)
    {
        if (null !== $node->name && $node->name->isSpecialClassName()) {
            $this->emitError(new \PhpParser\Error(\sprintf('Cannot use \'%s\' as class name as it is reserved', $node->name), $this->getAttributesAt($namePos)));
        }
        if ($node->extends && $node->extends->isSpecialClassName()) {
            $this->emitError(new \PhpParser\Error(\sprintf('Cannot use \'%s\' as class name as it is reserved', $node->extends), $node->extends->getAttributes()));
        }
        foreach ($node->implements as $interface) {
            if ($interface->isSpecialClassName()) {
                $this->emitError(new \PhpParser\Error(\sprintf('Cannot use \'%s\' as interface name as it is reserved', $interface), $interface->getAttributes()));
            }
        }
    }
    protected function checkInterface(\PhpParser\Node\Stmt\Interface_ $node, $namePos)
    {
        if (null !== $node->name && $node->name->isSpecialClassName()) {
            $this->emitError(new \PhpParser\Error(\sprintf('Cannot use \'%s\' as class name as it is reserved', $node->name), $this->getAttributesAt($namePos)));
        }
        foreach ($node->extends as $interface) {
            if ($interface->isSpecialClassName()) {
                $this->emitError(new \PhpParser\Error(\sprintf('Cannot use \'%s\' as interface name as it is reserved', $interface), $interface->getAttributes()));
            }
        }
    }
    protected function checkClassMethod(\PhpParser\Node\Stmt\ClassMethod $node, $modifierPos)
    {
        if ($node->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_STATIC) {
            switch ($node->name->toLowerString()) {
                case '__construct':
                    $this->emitError(new \PhpParser\Error(\sprintf('Constructor %s() cannot be static', $node->name), $this->getAttributesAt($modifierPos)));
                    break;
                case '__destruct':
                    $this->emitError(new \PhpParser\Error(\sprintf('Destructor %s() cannot be static', $node->name), $this->getAttributesAt($modifierPos)));
                    break;
                case '__clone':
                    $this->emitError(new \PhpParser\Error(\sprintf('Clone method %s() cannot be static', $node->name), $this->getAttributesAt($modifierPos)));
                    break;
            }
        }
    }
    protected function checkClassConst(\PhpParser\Node\Stmt\ClassConst $node, $modifierPos)
    {
        if ($node->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_STATIC) {
            $this->emitError(new \PhpParser\Error("Cannot use 'static' as constant modifier", $this->getAttributesAt($modifierPos)));
        }
        if ($node->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_ABSTRACT) {
            $this->emitError(new \PhpParser\Error("Cannot use 'abstract' as constant modifier", $this->getAttributesAt($modifierPos)));
        }
        if ($node->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_FINAL) {
            $this->emitError(new \PhpParser\Error("Cannot use 'final' as constant modifier", $this->getAttributesAt($modifierPos)));
        }
    }
    protected function checkProperty(\PhpParser\Node\Stmt\Property $node, $modifierPos)
    {
        if ($node->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_ABSTRACT) {
            $this->emitError(new \PhpParser\Error('Properties cannot be declared abstract', $this->getAttributesAt($modifierPos)));
        }
        if ($node->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_FINAL) {
            $this->emitError(new \PhpParser\Error('Properties cannot be declared final', $this->getAttributesAt($modifierPos)));
        }
    }
    protected function checkUseUse(\PhpParser\Node\Stmt\UseUse $node, $namePos)
    {
        if ($node->alias && $node->alias->isSpecialClassName()) {
            $this->emitError(new \PhpParser\Error(\sprintf('Cannot use %s as %s because \'%2$s\' is a special class name', $node->name, $node->alias), $this->getAttributesAt($namePos)));
        }
    }
}
<?php

declare (strict_types=1);
namespace PhpParser;

class ParserFactory
{
    const PREFER_PHP7 = 1;
    const PREFER_PHP5 = 2;
    const ONLY_PHP7 = 3;
    const ONLY_PHP5 = 4;
    /**
     * Creates a Parser instance, according to the provided kind.
     *
     * @param int        $kind  One of ::PREFER_PHP7, ::PREFER_PHP5, ::ONLY_PHP7 or ::ONLY_PHP5
     * @param Lexer|null $lexer Lexer to use. Defaults to emulative lexer when not specified
     * @param array      $parserOptions Parser options. See ParserAbstract::__construct() argument
     *
     * @return Parser The parser instance
     */
    public function create(int $kind, \PhpParser\Lexer $lexer = null, array $parserOptions = []) : \PhpParser\Parser
    {
        if (null === $lexer) {
            $lexer = new \PhpParser\Lexer\Emulative();
        }
        switch ($kind) {
            case self::PREFER_PHP7:
                return new \PhpParser\Parser\Multiple([new \PhpParser\Parser\Php7($lexer, $parserOptions), new \PhpParser\Parser\Php5($lexer, $parserOptions)]);
            case self::PREFER_PHP5:
                return new \PhpParser\Parser\Multiple([new \PhpParser\Parser\Php5($lexer, $parserOptions), new \PhpParser\Parser\Php7($lexer, $parserOptions)]);
            case self::ONLY_PHP7:
                return new \PhpParser\Parser\Php7($lexer, $parserOptions);
            case self::ONLY_PHP5:
                return new \PhpParser\Parser\Php5($lexer, $parserOptions);
            default:
                throw new \LogicException('Kind must be one of ::PREFER_PHP7, ::PREFER_PHP5, ::ONLY_PHP7 or ::ONLY_PHP5');
        }
    }
}
<?php

namespace PhpParser\Parser;

/* GENERATED file based on grammar/tokens.y */
final class Tokens
{
    const YYERRTOK = 256;
    const T_INCLUDE = 257;
    const T_INCLUDE_ONCE = 258;
    const T_EVAL = 259;
    const T_REQUIRE = 260;
    const T_REQUIRE_ONCE = 261;
    const T_LOGICAL_OR = 262;
    const T_LOGICAL_XOR = 263;
    const T_LOGICAL_AND = 264;
    const T_PRINT = 265;
    const T_YIELD = 266;
    const T_DOUBLE_ARROW = 267;
    const T_YIELD_FROM = 268;
    const T_PLUS_EQUAL = 269;
    const T_MINUS_EQUAL = 270;
    const T_MUL_EQUAL = 271;
    const T_DIV_EQUAL = 272;
    const T_CONCAT_EQUAL = 273;
    const T_MOD_EQUAL = 274;
    const T_AND_EQUAL = 275;
    const T_OR_EQUAL = 276;
    const T_XOR_EQUAL = 277;
    const T_SL_EQUAL = 278;
    const T_SR_EQUAL = 279;
    const T_POW_EQUAL = 280;
    const T_COALESCE_EQUAL = 281;
    const T_COALESCE = 282;
    const T_BOOLEAN_OR = 283;
    const T_BOOLEAN_AND = 284;
    const T_IS_EQUAL = 285;
    const T_IS_NOT_EQUAL = 286;
    const T_IS_IDENTICAL = 287;
    const T_IS_NOT_IDENTICAL = 288;
    const T_SPACESHIP = 289;
    const T_IS_SMALLER_OR_EQUAL = 290;
    const T_IS_GREATER_OR_EQUAL = 291;
    const T_SL = 292;
    const T_SR = 293;
    const T_INSTANCEOF = 294;
    const T_INC = 295;
    const T_DEC = 296;
    const T_INT_CAST = 297;
    const T_DOUBLE_CAST = 298;
    const T_STRING_CAST = 299;
    const T_ARRAY_CAST = 300;
    const T_OBJECT_CAST = 301;
    const T_BOOL_CAST = 302;
    const T_UNSET_CAST = 303;
    const T_POW = 304;
    const T_NEW = 305;
    const T_CLONE = 306;
    const T_EXIT = 307;
    const T_IF = 308;
    const T_ELSEIF = 309;
    const T_ELSE = 310;
    const T_ENDIF = 311;
    const T_LNUMBER = 312;
    const T_DNUMBER = 313;
    const T_STRING = 314;
    const T_STRING_VARNAME = 315;
    const T_VARIABLE = 316;
    const T_NUM_STRING = 317;
    const T_INLINE_HTML = 318;
    const T_CHARACTER = 319;
    const T_BAD_CHARACTER = 320;
    const T_ENCAPSED_AND_WHITESPACE = 321;
    const T_CONSTANT_ENCAPSED_STRING = 322;
    const T_ECHO = 323;
    const T_DO = 324;
    const T_WHILE = 325;
    const T_ENDWHILE = 326;
    const T_FOR = 327;
    const T_ENDFOR = 328;
    const T_FOREACH = 329;
    const T_ENDFOREACH = 330;
    const T_DECLARE = 331;
    const T_ENDDECLARE = 332;
    const T_AS = 333;
    const T_SWITCH = 334;
    const T_ENDSWITCH = 335;
    const T_CASE = 336;
    const T_DEFAULT = 337;
    const T_BREAK = 338;
    const T_CONTINUE = 339;
    const T_GOTO = 340;
    const T_FUNCTION = 341;
    const T_FN = 342;
    const T_CONST = 343;
    const T_RETURN = 344;
    const T_TRY = 345;
    const T_CATCH = 346;
    const T_FINALLY = 347;
    const T_THROW = 348;
    const T_USE = 349;
    const T_INSTEADOF = 350;
    const T_GLOBAL = 351;
    const T_STATIC = 352;
    const T_ABSTRACT = 353;
    const T_FINAL = 354;
    const T_PRIVATE = 355;
    const T_PROTECTED = 356;
    const T_PUBLIC = 357;
    const T_VAR = 358;
    const T_UNSET = 359;
    const T_ISSET = 360;
    const T_EMPTY = 361;
    const T_HALT_COMPILER = 362;
    const T_CLASS = 363;
    const T_TRAIT = 364;
    const T_INTERFACE = 365;
    const T_EXTENDS = 366;
    const T_IMPLEMENTS = 367;
    const T_OBJECT_OPERATOR = 368;
    const T_LIST = 369;
    const T_ARRAY = 370;
    const T_CALLABLE = 371;
    const T_CLASS_C = 372;
    const T_TRAIT_C = 373;
    const T_METHOD_C = 374;
    const T_FUNC_C = 375;
    const T_LINE = 376;
    const T_FILE = 377;
    const T_COMMENT = 378;
    const T_DOC_COMMENT = 379;
    const T_OPEN_TAG = 380;
    const T_OPEN_TAG_WITH_ECHO = 381;
    const T_CLOSE_TAG = 382;
    const T_WHITESPACE = 383;
    const T_START_HEREDOC = 384;
    const T_END_HEREDOC = 385;
    const T_DOLLAR_OPEN_CURLY_BRACES = 386;
    const T_CURLY_OPEN = 387;
    const T_PAAMAYIM_NEKUDOTAYIM = 388;
    const T_NAMESPACE = 389;
    const T_NS_C = 390;
    const T_DIR = 391;
    const T_NS_SEPARATOR = 392;
    const T_ELLIPSIS = 393;
}
<?php

declare (strict_types=1);
namespace PhpParser\Parser;

use PhpParser\Error;
use PhpParser\ErrorHandler;
use PhpParser\Parser;
class Multiple implements \PhpParser\Parser
{
    /** @var Parser[] List of parsers to try, in order of preference */
    private $parsers;
    /**
     * Create a parser which will try multiple parsers in an order of preference.
     *
     * Parsers will be invoked in the order they're provided to the constructor. If one of the
     * parsers runs without throwing, it's output is returned. Otherwise the exception that the
     * first parser generated is thrown.
     *
     * @param Parser[] $parsers
     */
    public function __construct(array $parsers)
    {
        $this->parsers = $parsers;
    }
    public function parse(string $code, \PhpParser\ErrorHandler $errorHandler = null)
    {
        if (null === $errorHandler) {
            $errorHandler = new \PhpParser\ErrorHandler\Throwing();
        }
        list($firstStmts, $firstError) = $this->tryParse($this->parsers[0], $errorHandler, $code);
        if ($firstError === null) {
            return $firstStmts;
        }
        for ($i = 1, $c = \count($this->parsers); $i < $c; ++$i) {
            list($stmts, $error) = $this->tryParse($this->parsers[$i], $errorHandler, $code);
            if ($error === null) {
                return $stmts;
            }
        }
        throw $firstError;
    }
    private function tryParse(\PhpParser\Parser $parser, \PhpParser\ErrorHandler $errorHandler, $code)
    {
        $stmts = null;
        $error = null;
        try {
            $stmts = $parser->parse($code, $errorHandler);
        } catch (\PhpParser\Error $error) {
        }
        return [$stmts, $error];
    }
}
<?php

namespace PhpParser\Parser;

use PhpParser\Error;
use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\Name;
use PhpParser\Node\Scalar;
use PhpParser\Node\Stmt;
/* This is an automatically GENERATED file, which should not be manually edited.
 * Instead edit one of the following:
 *  * the grammar files grammar/php5.y or grammar/php7.y
 *  * the skeleton file grammar/parser.template
 *  * the preprocessing script grammar/rebuildParsers.php
 */
class Php7 extends \PhpParser\ParserAbstract
{
    protected $tokenToSymbolMapSize = 394;
    protected $actionTableSize = 964;
    protected $gotoTableSize = 508;
    protected $invalidSymbol = 159;
    protected $errorSymbol = 1;
    protected $defaultAction = -32766;
    protected $unexpectedTokenRule = 32767;
    protected $YY2TBLSTATE = 348;
    protected $numNonLeafStates = 602;
    protected $symbolToName = array("EOF", "error", "T_INCLUDE", "T_INCLUDE_ONCE", "T_EVAL", "T_REQUIRE", "T_REQUIRE_ONCE", "','", "T_LOGICAL_OR", "T_LOGICAL_XOR", "T_LOGICAL_AND", "T_PRINT", "T_YIELD", "T_DOUBLE_ARROW", "T_YIELD_FROM", "'='", "T_PLUS_EQUAL", "T_MINUS_EQUAL", "T_MUL_EQUAL", "T_DIV_EQUAL", "T_CONCAT_EQUAL", "T_MOD_EQUAL", "T_AND_EQUAL", "T_OR_EQUAL", "T_XOR_EQUAL", "T_SL_EQUAL", "T_SR_EQUAL", "T_POW_EQUAL", "T_COALESCE_EQUAL", "'?'", "':'", "T_COALESCE", "T_BOOLEAN_OR", "T_BOOLEAN_AND", "'|'", "'^'", "'&'", "T_IS_EQUAL", "T_IS_NOT_EQUAL", "T_IS_IDENTICAL", "T_IS_NOT_IDENTICAL", "T_SPACESHIP", "'<'", "T_IS_SMALLER_OR_EQUAL", "'>'", "T_IS_GREATER_OR_EQUAL", "T_SL", "T_SR", "'+'", "'-'", "'.'", "'*'", "'/'", "'%'", "'!'", "T_INSTANCEOF", "'~'", "T_INC", "T_DEC", "T_INT_CAST", "T_DOUBLE_CAST", "T_STRING_CAST", "T_ARRAY_CAST", "T_OBJECT_CAST", "T_BOOL_CAST", "T_UNSET_CAST", "'@'", "T_POW", "'['", "T_NEW", "T_CLONE", "T_EXIT", "T_IF", "T_ELSEIF", "T_ELSE", "T_ENDIF", "T_LNUMBER", "T_DNUMBER", "T_STRING", "T_STRING_VARNAME", "T_VARIABLE", "T_NUM_STRING", "T_INLINE_HTML", "T_ENCAPSED_AND_WHITESPACE", "T_CONSTANT_ENCAPSED_STRING", "T_ECHO", "T_DO", "T_WHILE", "T_ENDWHILE", "T_FOR", "T_ENDFOR", "T_FOREACH", "T_ENDFOREACH", "T_DECLARE", "T_ENDDECLARE", "T_AS", "T_SWITCH", "T_ENDSWITCH", "T_CASE", "T_DEFAULT", "T_BREAK", "T_CONTINUE", "T_GOTO", "T_FUNCTION", "T_FN", "T_CONST", "T_RETURN", "T_TRY", "T_CATCH", "T_FINALLY", "T_THROW", "T_USE", "T_INSTEADOF", "T_GLOBAL", "T_STATIC", "T_ABSTRACT", "T_FINAL", "T_PRIVATE", "T_PROTECTED", "T_PUBLIC", "T_VAR", "T_UNSET", "T_ISSET", "T_EMPTY", "T_HALT_COMPILER", "T_CLASS", "T_TRAIT", "T_INTERFACE", "T_EXTENDS", "T_IMPLEMENTS", "T_OBJECT_OPERATOR", "T_LIST", "T_ARRAY", "T_CALLABLE", "T_CLASS_C", "T_TRAIT_C", "T_METHOD_C", "T_FUNC_C", "T_LINE", "T_FILE", "T_START_HEREDOC", "T_END_HEREDOC", "T_DOLLAR_OPEN_CURLY_BRACES", "T_CURLY_OPEN", "T_PAAMAYIM_NEKUDOTAYIM", "T_NAMESPACE", "T_NS_C", "T_DIR", "T_NS_SEPARATOR", "T_ELLIPSIS", "';'", "'{'", "'}'", "'('", "')'", "'`'", "']'", "'\"'", "'\$'");
    protected $tokenToSymbol = array(0, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 54, 157, 159, 158, 53, 36, 159, 153, 154, 51, 48, 7, 49, 50, 52, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 30, 150, 42, 15, 44, 29, 66, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 68, 159, 156, 35, 159, 155, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 151, 34, 152, 56, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 31, 32, 33, 37, 38, 39, 40, 41, 43, 45, 46, 47, 55, 57, 58, 59, 60, 61, 62, 63, 64, 65, 67, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 159, 159, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 159, 159, 159, 159, 159, 159, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149);
    protected $action = array(607, 608, 609, 610, 611, 685, 612, 613, 614, 650, 651, 0, 32, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, -32767, -32767, -32767, -32767, 94, 95, 96, 97, 98, -32766, -32766, -32766, 687, 491, -497, 904, 905, 906, 903, 902, 901, 904, 905, 906, 903, 902, 901, 615, 938, 940, -32766, 9, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, 616, 617, 618, 619, 620, 621, 622, 333, 1104, 683, -32766, -32766, -32766, 846, 1103, 119, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 653, 654, 655, 656, 657, 645, 646, 647, 675, 648, 649, 634, 635, 636, 637, 638, 639, 640, 677, 678, 679, 680, 681, 682, 641, 642, 643, 644, 674, 665, 663, 664, 660, 661, 402, 652, 658, 659, 666, 667, 669, 668, 670, 671, 45, 46, 421, 47, 48, 662, 673, 672, 27, 49, 50, 233, 51, -32766, -32766, -32766, 96, 97, 98, 24, -32766, -32766, -32766, -458, 261, 121, 1023, -32766, -32766, -32766, 1091, 1073, -32766, -32766, -32766, 1039, -32766, -32766, -32766, -32766, -32766, -32766, -496, -32766, -32766, -32766, 52, 53, -32766, -497, -32766, -32766, 54, 687, 55, 231, 232, 56, 57, 58, 59, 60, 61, 62, 63, 1016, 24, 242, 64, 369, -32766, -32766, -32766, 226, 1040, 1041, 423, 1076, 1073, -493, 880, 508, 1039, 436, 1023, -458, 768, 1073, 239, 333, -500, -32766, -500, -32766, -32766, -32766, -32766, 856, 253, -458, 276, 378, 372, 786, 68, 1073, -458, 685, -461, 278, 1126, 403, 289, 1127, 288, 99, 100, 101, 303, 252, 433, 434, 822, -32766, 69, 261, 237, 850, 851, 435, 436, 102, 1045, 1046, 1047, 1048, 1042, 1043, 256, 1016, -456, -456, 306, 444, 1049, 1044, 375, 133, 561, -239, 363, 66, 237, 268, 692, 273, 278, 422, -137, -137, -137, -4, 768, 1073, 310, 278, 1035, 757, 687, 362, 37, 20, 424, -137, 425, -137, 426, -137, 427, -137, 127, 428, -295, 278, -295, 38, 39, 370, 371, -496, 271, 40, 429, 277, 687, 65, 261, 1016, 302, 896, 430, 431, -456, -456, 333, -494, 432, 44, 42, 743, 791, 373, 374, -457, -234, 562, -456, -456, 375, -32766, -32766, -32766, 882, -456, -456, 124, -493, 75, 850, 851, 333, -273, -260, 422, 768, 770, 576, -137, 261, 125, -32766, 278, 823, 757, 857, 1073, 37, 20, 424, 240, 425, -178, 426, 589, 427, 393, 503, 428, 687, 235, 241, 38, 39, 370, 371, 125, 354, 40, 429, 260, 259, 65, 267, 687, 302, -457, 430, 431, -296, -177, -296, 24, 432, 305, 365, 700, 791, 373, 374, -457, 120, 118, 24, 1073, 30, 366, -457, 1039, -460, 850, 851, 687, 367, 691, 1073, 422, 291, 768, 1039, 333, -83, 770, 576, -4, 467, 757, 126, 368, 37, 20, 424, -92, 425, 278, 426, 444, 427, 1016, 375, 428, -219, -219, -219, 38, 39, 370, 371, 333, 1016, 40, 429, 850, 851, 65, 435, 436, 302, 236, 430, 431, 225, 708, -494, 709, 432, 435, 436, 743, 791, 373, 374, 690, 387, 136, 1117, 578, 68, 413, 238, 8, 33, 278, 1053, 227, 708, 687, 709, 68, 422, -260, 535, 21, 278, 770, 576, -219, 550, 551, 757, 687, 116, 37, 20, 424, 117, 425, 358, 426, -178, 427, 132, 328, 428, -218, -218, -218, 38, 39, 370, 371, 687, 333, 40, 429, 122, 768, 65, 383, 384, 302, 123, 430, 431, 29, 234, 333, -177, 432, 528, 529, 743, 791, 373, 374, 129, 850, 851, 135, 76, 77, 78, 1092, 881, 599, 582, 254, 333, 137, 138, 782, 590, 593, 293, 767, 131, 252, 770, 576, -218, 31, 102, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 43, 252, 422, 558, 768, 687, 690, -32766, 471, 130, 476, 685, 757, 102, 553, 37, 20, 424, 526, 425, 688, 426, 272, 427, 910, 1016, 428, 792, 1128, 793, 38, 39, 370, 583, 269, 570, 40, 429, 536, 1052, 65, 275, 1055, 302, -415, 541, 270, -81, 10, 391, 768, 432, 542, 554, 784, 594, 5, 0, 12, 577, 0, 0, 304, 0, 0, 0, 0, 336, 342, 0, 0, 0, 0, 0, 0, 422, 0, 0, 0, 584, 770, 576, 0, 0, 0, 757, 0, 0, 37, 20, 424, 343, 425, 0, 426, 0, 427, 768, 0, 428, 0, 0, 0, 38, 39, 370, 347, 387, 473, 40, 429, 359, 360, 65, 744, 35, 302, 36, 597, 598, 748, 422, 825, 809, 432, 816, 587, 876, 877, 806, 817, 757, 746, 804, 37, 20, 424, 885, 425, 888, 426, 889, 427, 768, 886, 428, 887, 893, -485, 38, 39, 370, 579, 770, 576, 40, 429, 581, 585, 65, 586, 588, 302, 592, 286, 287, 352, 353, 422, 580, 432, 1123, 591, 1125, 703, 790, 702, 712, 757, 789, 713, 37, 20, 424, 710, 425, 1124, 426, 788, 427, 768, 1004, 428, 711, 777, 785, 38, 39, 370, 808, 576, -483, 40, 429, 775, 814, 65, 815, 1122, 302, 1074, 1067, 1081, 1086, 422, 1089, -237, 432, -461, -460, -459, 23, 25, 28, 757, 34, 41, 37, 20, 424, 67, 425, 70, 426, 71, 427, 72, 73, 428, 74, 128, 134, 38, 39, 370, 139, 770, 576, 40, 429, 229, 230, 65, 246, 247, 302, 248, 249, 250, 251, 290, 422, 355, 432, 357, -427, -235, -234, 14, 15, 16, 757, 17, 19, 37, 20, 424, 325, 425, 404, 426, 406, 427, 409, 411, 428, 412, 419, 567, 38, 39, 370, 770, 576, 1027, 40, 429, 977, 1037, 65, 858, 1008, 302, -32766, -32766, -32766, -92, 13, 18, 22, 432, 263, 324, 501, 522, 569, 981, 978, 0, 994, 0, 1036, 1065, 1066, -32766, 1080, -32766, -32766, -32766, -32766, -32766, -32766, -32767, -32767, -32767, -32767, -32767, 1120, 532, 770, 576, 1054);
    protected $actionCheck = array(2, 3, 4, 5, 6, 78, 8, 9, 10, 11, 12, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 42, 43, 44, 45, 46, 47, 48, 49, 50, 8, 9, 10, 78, 79, 7, 114, 115, 116, 117, 118, 119, 114, 115, 116, 117, 118, 119, 55, 57, 58, 29, 7, 31, 32, 33, 34, 35, 36, 8, 9, 10, 69, 70, 71, 72, 73, 74, 75, 114, 1, 78, 8, 9, 10, 1, 7, 13, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 30, 131, 132, 133, 134, 135, 136, 137, 138, 139, 2, 3, 4, 5, 6, 145, 146, 147, 7, 11, 12, 36, 14, 8, 9, 10, 48, 49, 50, 68, 8, 9, 10, 68, 29, 7, 1, 8, 9, 10, 1, 80, 8, 9, 29, 84, 31, 32, 33, 34, 35, 29, 7, 31, 32, 33, 48, 49, 29, 154, 31, 32, 54, 78, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 114, 68, 69, 70, 71, 8, 9, 10, 13, 76, 77, 78, 1, 80, 7, 1, 49, 84, 132, 1, 130, 1, 80, 7, 114, 154, 29, 156, 31, 32, 33, 34, 1, 7, 144, 7, 103, 104, 1, 153, 80, 151, 78, 153, 158, 78, 151, 114, 81, 7, 51, 52, 53, 7, 55, 122, 123, 30, 8, 149, 29, 36, 132, 133, 131, 132, 67, 134, 135, 136, 137, 138, 139, 140, 114, 68, 68, 7, 145, 146, 147, 148, 13, 78, 154, 125, 153, 36, 155, 1, 157, 158, 72, 73, 74, 75, 0, 1, 80, 7, 158, 1, 82, 78, 7, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 151, 96, 103, 158, 105, 100, 101, 102, 103, 154, 111, 106, 107, 68, 78, 110, 29, 114, 113, 120, 115, 116, 130, 130, 114, 7, 121, 68, 68, 124, 125, 126, 127, 68, 154, 145, 144, 144, 148, 8, 9, 10, 152, 151, 151, 30, 154, 151, 132, 133, 114, 152, 7, 72, 1, 150, 151, 152, 29, 149, 29, 158, 150, 82, 154, 80, 85, 86, 87, 36, 89, 7, 91, 151, 93, 130, 1, 96, 78, 36, 36, 100, 101, 102, 103, 149, 105, 106, 107, 130, 130, 110, 111, 78, 113, 130, 115, 116, 103, 7, 105, 68, 121, 144, 7, 124, 125, 126, 127, 144, 151, 151, 68, 80, 7, 7, 151, 84, 153, 132, 133, 78, 7, 150, 80, 72, 145, 1, 84, 114, 30, 150, 151, 152, 83, 82, 151, 7, 85, 86, 87, 154, 89, 158, 91, 145, 93, 114, 148, 96, 97, 98, 99, 100, 101, 102, 103, 114, 114, 106, 107, 132, 133, 110, 131, 132, 113, 36, 115, 116, 95, 103, 154, 105, 121, 131, 132, 124, 125, 126, 127, 80, 148, 13, 83, 151, 153, 103, 36, 105, 13, 158, 141, 13, 103, 78, 105, 153, 72, 154, 73, 74, 158, 150, 151, 152, 73, 74, 82, 78, 15, 85, 86, 87, 15, 89, 148, 91, 154, 93, 98, 99, 96, 97, 98, 99, 100, 101, 102, 103, 78, 114, 106, 107, 15, 1, 110, 103, 104, 113, 15, 115, 116, 142, 143, 114, 154, 121, 108, 109, 124, 125, 126, 127, 15, 132, 133, 15, 8, 9, 10, 154, 150, 151, 30, 30, 114, 15, 15, 36, 30, 30, 34, 30, 30, 55, 150, 151, 152, 29, 67, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 68, 55, 72, 75, 1, 78, 80, 83, 83, 68, 87, 78, 82, 67, 92, 85, 86, 87, 111, 89, 78, 91, 112, 93, 80, 114, 96, 125, 81, 125, 100, 101, 102, 30, 128, 90, 106, 107, 88, 141, 110, 128, 141, 113, 144, 94, 129, 95, 95, 95, 1, 121, 97, 97, 149, 152, 144, -1, 144, 151, -1, -1, 144, -1, -1, -1, -1, 148, 148, -1, -1, -1, -1, -1, -1, 72, -1, -1, -1, 30, 150, 151, -1, -1, -1, 82, -1, -1, 85, 86, 87, 148, 89, -1, 91, -1, 93, 1, -1, 96, -1, -1, -1, 100, 101, 102, 148, 148, 148, 106, 107, 148, 148, 110, 152, 150, 113, 150, 150, 150, 150, 72, 150, 150, 121, 150, 30, 150, 150, 150, 150, 82, 150, 150, 85, 86, 87, 150, 89, 150, 91, 150, 93, 1, 150, 96, 150, 150, 153, 100, 101, 102, 151, 150, 151, 106, 107, 151, 151, 110, 151, 151, 113, 151, 151, 151, 151, 151, 72, 151, 121, 152, 30, 152, 152, 152, 152, 152, 82, 152, 152, 85, 86, 87, 152, 89, 152, 91, 152, 93, 1, 152, 96, 152, 152, 152, 100, 101, 102, 150, 151, 153, 106, 107, 152, 152, 110, 152, 152, 113, 152, 152, 152, 152, 72, 152, 154, 121, 153, 153, 153, 153, 153, 153, 82, 153, 153, 85, 86, 87, 153, 89, 153, 91, 153, 93, 153, 153, 96, 153, 153, 153, 100, 101, 102, 153, 150, 151, 106, 107, 153, 153, 110, 153, 153, 113, 153, 153, 153, 153, 153, 72, 153, 121, 153, 155, 154, 154, 154, 154, 154, 82, 154, 154, 85, 86, 87, 154, 89, 154, 91, 154, 93, 154, 154, 96, 154, 154, 154, 100, 101, 102, 150, 151, 154, 106, 107, 154, 154, 110, 154, 154, 113, 8, 9, 10, 154, 154, 154, 154, 121, 154, 154, 154, 154, 154, 154, 154, -1, 155, -1, 156, 156, 156, 29, 156, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 156, 156, 150, 151, 157);
    protected $actionBase = array(0, 223, 299, 371, 444, 303, 208, 618, -2, -2, -73, -2, -2, 625, 718, 718, 764, 718, 552, 671, 811, 811, 811, 228, 113, 113, 113, 254, 361, -40, 361, 333, 449, 470, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 291, 291, 230, 393, 495, 779, 784, 781, 776, 775, 780, 785, 498, 678, 680, 562, 681, 682, 683, 685, 782, 804, 777, 783, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 253, 69, 162, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 349, 349, 349, 157, 210, 150, 200, 211, 143, 27, 917, 917, 917, 917, 917, -16, -16, -16, -16, 351, 351, 362, 217, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 163, 313, 106, 106, 133, 133, 133, 133, 133, 133, 221, 305, 234, 347, 369, 523, 806, 167, 167, 441, 93, 283, 202, 202, 202, 386, 547, 533, 533, 533, 533, 419, 419, 533, 533, 170, 214, 74, 211, 211, 277, 211, 211, 211, 409, 409, 409, 452, 318, 352, 546, 318, 619, 640, 577, 675, 578, 677, 278, 585, 145, 586, 145, 145, 145, 458, 445, 451, 774, 291, 522, 291, 291, 291, 291, 722, 291, 291, 291, 291, 291, 291, 98, 291, 79, 430, 230, 240, 240, 556, 240, 452, 538, 263, 635, 410, 425, 538, 538, 538, 636, 637, 336, 363, 198, 638, 382, 402, 173, 33, 549, 549, 555, 555, 566, 551, 549, 549, 549, 549, 549, 690, 690, 555, 548, 555, 566, 695, 555, 551, 551, 555, 555, 549, 555, 690, 551, 156, 415, 249, 273, 551, 551, 426, 528, 549, 535, 535, 433, 555, 219, 555, 139, 539, 690, 690, 539, 229, 551, 231, 590, 591, 529, 527, 553, 245, 553, 553, 300, 529, 553, 551, 553, 448, 50, 548, 295, 553, 11, 699, 701, 418, 703, 694, 705, 731, 706, 530, 524, 526, 719, 720, 708, 692, 691, 561, 582, 513, 517, 534, 554, 689, 581, 531, 531, 531, 554, 687, 531, 531, 531, 531, 531, 531, 531, 531, 787, 540, 545, 723, 537, 541, 576, 543, 623, 520, 582, 582, 584, 732, 786, 564, 722, 762, 709, 587, 557, 741, 725, 525, 542, 565, 726, 727, 745, 765, 628, 513, 766, 641, 563, 643, 582, 644, 531, 670, 617, 788, 789, 688, 791, 736, 747, 749, 580, 645, 569, 803, 646, 768, 629, 631, 589, 737, 684, 751, 647, 752, 754, 649, 592, 572, 734, 573, 733, 272, 729, 632, 650, 654, 656, 658, 661, 710, 594, 738, 544, 740, 735, 595, 597, 560, 663, 488, 599, 570, 571, 600, 714, 558, 550, 601, 602, 769, 664, 728, 604, 665, 756, 574, 581, 536, 532, 575, 567, 634, 755, 559, 605, 609, 611, 613, 674, 616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 136, 136, 136, -2, -2, -2, 0, 0, -2, 0, 0, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, -3, 568, 568, -3, 568, 568, 568, 568, 568, 568, 568, 202, 202, 202, 202, 318, 318, 318, -67, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, -67, 202, 202, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 419, 419, 419, 145, 145, 318, 0, 0, 0, 0, 0, 549, 419, 318, 318, 318, 318, 0, 0, 318, 318, 548, 145, 0, 0, 0, 0, 0, 0, 0, 549, 549, 549, 548, 0, 549, 419, 0, 240, 291, 440, 440, 440, 440, 0, 549, 0, 549, 0, 0, 0, 0, 0, 0, 551, 0, 690, 0, 0, 0, 0, 555, 0, 0, 0, 0, 0, 0, 0, 0, 548, 0, 0, 0, 0, 548, 0, 0, 531, 0, 564, 0, 0, 531, 531, 531, 564, 564, 0, 0, 0, 564);
    protected $actionDefault = array(3, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 92, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 510, 510, 510, 94, 499, 32767, 499, 32767, 32767, 32767, 314, 314, 314, 32767, 454, 454, 454, 454, 454, 454, 454, 32767, 32767, 32767, 32767, 32767, 394, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 92, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 506, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 377, 378, 380, 381, 313, 455, 509, 259, 505, 312, 130, 270, 261, 211, 243, 310, 134, 342, 395, 344, 393, 397, 343, 319, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 317, 318, 396, 398, 399, 374, 373, 372, 340, 316, 341, 345, 316, 347, 346, 363, 364, 361, 362, 365, 366, 367, 368, 369, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 94, 32767, 32767, 32767, 293, 354, 355, 250, 250, 250, 250, 250, 250, 32767, 250, 32767, 250, 32767, 32767, 32767, 32767, 32767, 32767, 448, 371, 349, 350, 348, 32767, 426, 32767, 32767, 32767, 32767, 32767, 428, 32767, 92, 32767, 32767, 32767, 337, 339, 420, 508, 320, 507, 32767, 32767, 94, 414, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 423, 32767, 32767, 92, 32767, 32767, 92, 174, 230, 232, 179, 32767, 431, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 414, 359, 517, 32767, 456, 32767, 351, 352, 353, 32767, 32767, 456, 456, 456, 32767, 456, 32767, 456, 456, 32767, 32767, 32767, 32767, 32767, 179, 32767, 32767, 32767, 32767, 94, 429, 429, 92, 92, 92, 92, 424, 32767, 179, 179, 32767, 32767, 32767, 32767, 32767, 179, 91, 91, 91, 91, 179, 179, 91, 194, 32767, 192, 192, 91, 32767, 93, 32767, 93, 196, 32767, 470, 196, 91, 179, 91, 216, 216, 405, 181, 252, 93, 252, 252, 93, 405, 252, 179, 252, 91, 91, 32767, 91, 252, 32767, 32767, 32767, 85, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 416, 32767, 436, 32767, 449, 468, 32767, 357, 358, 360, 32767, 458, 382, 383, 384, 385, 386, 387, 388, 390, 32767, 419, 32767, 32767, 32767, 87, 121, 269, 32767, 515, 87, 417, 32767, 515, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 87, 87, 32767, 32767, 32767, 32767, 32767, 495, 32767, 516, 32767, 456, 418, 32767, 356, 432, 475, 32767, 32767, 457, 32767, 32767, 32767, 32767, 87, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 436, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 456, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 456, 32767, 32767, 242, 32767, 32767, 32767, 309, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 85, 60, 32767, 289, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 136, 136, 3, 272, 3, 272, 136, 136, 136, 272, 272, 136, 136, 136, 136, 136, 136, 136, 169, 224, 227, 216, 216, 281, 136, 136);
    protected $goto = array(171, 144, 144, 144, 171, 152, 153, 152, 155, 187, 172, 168, 168, 168, 168, 169, 169, 169, 169, 169, 169, 169, 164, 165, 166, 167, 184, 182, 185, 445, 446, 334, 447, 450, 451, 452, 453, 454, 455, 456, 457, 924, 141, 145, 146, 147, 170, 148, 149, 143, 150, 151, 154, 181, 183, 186, 206, 209, 211, 212, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 244, 245, 264, 265, 266, 339, 340, 341, 496, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 156, 203, 157, 173, 174, 175, 207, 176, 158, 159, 160, 177, 161, 208, 142, 204, 162, 178, 205, 179, 180, 163, 563, 210, 463, 210, 516, 516, 1038, 572, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 468, 468, 468, 514, 537, 468, 297, 489, 521, 489, 498, 274, 533, 534, 698, 483, 258, 468, 448, 448, 448, 725, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 449, 449, 449, 699, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 1114, 1114, 734, 725, 899, 725, 315, 319, 475, 499, 500, 502, 1083, 1084, 468, 468, 760, 1114, 761, 900, 482, 506, 468, 468, 468, 329, 330, 686, 481, 545, 495, 332, 510, 596, 523, 525, 294, 469, 538, 556, 559, 835, 566, 574, 831, 765, 729, 717, 864, 494, 807, 868, 490, 860, 716, 716, 810, 697, 1013, 1105, 726, 726, 726, 728, 715, 840, 1093, 800, 824, 805, 805, 803, 805, 595, 313, 460, 833, 828, 459, 3, 4, 907, 733, 539, 1009, 487, 317, 461, 459, 497, 892, 575, 972, 474, 843, 557, 890, 1129, 484, 485, 505, 517, 519, 520, 568, 801, 801, 801, 801, 465, 855, 795, 802, 1002, 787, 405, 1003, 799, 327, 571, 356, 1082, 530, 1014, 848, 346, 540, 350, 11, 337, 337, 280, 281, 283, 493, 344, 284, 345, 285, 348, 524, 351, 1015, 1069, 1113, 1113, 543, 301, 298, 299, 721, 560, 838, 838, 1100, 295, 865, 718, 600, 323, 544, 1113, 1010, 1017, 511, 1005, 869, 849, 849, 849, 849, 849, 849, 1017, 849, 849, 849, 720, 730, 1116, 714, 812, 849, 1088, 1088, 909, 465, 398, 513, 414, 1017, 1017, 1017, 1017, 0, 1079, 1017, 1017, 0, 701, 0, 0, 0, 0, 0, 1079, 0, 0, 0, 0, 0, 773, 1090, 1090, 774, 706, 0, 756, 751, 752, 766, 0, 707, 753, 704, 754, 755, 705, 0, 759, 0, 1075, 0, 0, 0, 0, 0, 1012, 0, 0, 0, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 867, 0, 1077, 1077, 867, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 462, 478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 462, 0, 478, 0, 0, 316, 0, 0, 466, 386, 0, 388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 724, 0, 1121);
    protected $gotoCheck = array(33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 63, 56, 10, 56, 86, 86, 86, 8, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 10, 10, 10, 46, 46, 10, 80, 85, 73, 85, 97, 134, 73, 73, 17, 10, 134, 10, 135, 135, 135, 26, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 137, 137, 137, 18, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 148, 148, 36, 26, 111, 26, 49, 49, 49, 49, 49, 49, 141, 141, 10, 10, 55, 148, 55, 111, 10, 10, 10, 10, 10, 69, 69, 5, 39, 69, 2, 69, 2, 39, 39, 39, 69, 10, 39, 39, 39, 39, 39, 39, 39, 13, 14, 14, 14, 10, 40, 14, 136, 94, 26, 26, 14, 16, 92, 146, 26, 26, 26, 26, 26, 14, 143, 14, 16, 16, 16, 16, 16, 16, 52, 16, 16, 16, 75, 37, 37, 14, 14, 54, 14, 53, 65, 65, 75, 7, 7, 7, 118, 65, 88, 7, 7, 12, 65, 65, 68, 68, 68, 68, 68, 75, 75, 75, 75, 12, 90, 75, 75, 67, 67, 65, 67, 76, 76, 76, 89, 139, 24, 92, 91, 56, 56, 56, 65, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 92, 92, 147, 147, 12, 20, 80, 80, 30, 12, 85, 85, 85, 11, 96, 28, 82, 19, 23, 147, 127, 63, 15, 124, 99, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 15, 32, 147, 15, 79, 63, 8, 8, 114, 12, 71, 72, 122, 63, 63, 63, 63, -1, 97, 63, 63, -1, 13, -1, -1, -1, -1, -1, 97, -1, -1, -1, -1, -1, 63, 97, 97, 63, 13, -1, 13, 13, 13, 13, -1, 13, 13, 13, 13, 13, 13, -1, 13, -1, 97, -1, -1, -1, -1, -1, 12, -1, -1, -1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 97, -1, 97, 97, 97, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8, -1, 8, -1, -1, 8, -1, -1, 8, 8, -1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8, -1, 8);
    protected $gotoBase = array(0, 0, -358, 0, 0, 207, 0, 274, 114, 0, -148, 54, 10, 94, -144, -40, 245, 150, 174, 48, 70, 0, 0, -3, 25, 0, -108, 0, 44, 0, 52, 0, 3, -23, 0, 0, 183, -331, 0, -359, 221, 0, 0, 0, 0, 0, 106, 0, 0, 157, 0, 0, 227, 45, 47, 191, 90, 0, 0, 0, 0, 0, 0, 111, 0, -95, 0, -26, 43, -193, 0, -12, -20, -435, 0, 26, 37, 0, 0, 4, -259, 0, 20, 0, 0, 117, -104, 0, 31, 55, 46, 53, -64, 0, 216, 0, 40, 143, 0, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -34, 0, 0, 7, 0, 0, 0, 30, 0, 0, 0, -32, 0, -9, 0, 0, -5, 0, 0, 0, 0, 0, 0, -119, -69, 217, -52, 0, 51, 0, -102, 0, 226, 0, 0, 223, 77, -67, 0, 0);
    protected $gotoDefault = array(-32768, 420, 603, 2, 604, 676, 684, 548, 437, 573, 438, 464, 335, 758, 913, 778, 740, 741, 742, 320, 361, 311, 318, 531, 518, 410, 727, 381, 719, 407, 722, 380, 731, 140, 549, 416, 735, 1, 737, 470, 769, 308, 745, 309, 552, 747, 477, 749, 750, 314, 321, 322, 917, 486, 515, 762, 213, 479, 763, 307, 764, 772, 331, 312, 392, 417, 326, 894, 504, 527, 376, 395, 512, 507, 488, 1024, 797, 401, 390, 811, 296, 819, 601, 827, 830, 439, 440, 399, 842, 400, 853, 847, 1032, 394, 859, 382, 866, 1064, 385, 870, 228, 873, 255, 546, 349, 878, 879, 6, 884, 564, 565, 7, 243, 415, 908, 547, 379, 923, 364, 991, 993, 472, 408, 1006, 389, 555, 418, 1011, 1068, 377, 441, 396, 282, 300, 257, 442, 458, 262, 443, 397, 1071, 1078, 338, 1094, 279, 26, 1106, 1115, 292, 492, 509);
    protected $ruleToNonTerminal = array(0, 1, 3, 3, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 8, 9, 10, 10, 11, 12, 13, 13, 14, 14, 15, 15, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 20, 20, 21, 21, 21, 21, 23, 25, 25, 19, 27, 27, 24, 29, 29, 26, 26, 28, 28, 30, 30, 22, 31, 31, 32, 34, 35, 35, 36, 37, 37, 39, 38, 38, 38, 38, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 16, 16, 59, 59, 62, 62, 61, 60, 60, 53, 64, 64, 65, 65, 66, 66, 67, 67, 17, 18, 18, 18, 70, 70, 70, 71, 71, 74, 74, 72, 72, 76, 77, 77, 47, 47, 55, 55, 58, 58, 58, 57, 78, 78, 79, 48, 48, 48, 48, 80, 80, 81, 81, 82, 82, 45, 45, 41, 41, 83, 43, 43, 84, 42, 42, 44, 44, 54, 54, 54, 54, 68, 68, 87, 87, 88, 88, 88, 90, 90, 91, 91, 91, 89, 89, 69, 69, 69, 92, 92, 93, 93, 94, 94, 94, 50, 95, 95, 96, 51, 98, 98, 99, 99, 100, 100, 73, 101, 101, 101, 101, 101, 106, 106, 107, 107, 108, 108, 108, 108, 108, 109, 110, 110, 105, 105, 102, 102, 104, 104, 112, 112, 111, 111, 111, 111, 111, 111, 103, 113, 113, 115, 114, 114, 52, 116, 116, 46, 46, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 123, 117, 117, 122, 122, 125, 126, 126, 127, 128, 128, 128, 75, 75, 63, 63, 63, 118, 118, 118, 130, 130, 119, 119, 121, 121, 121, 124, 124, 135, 135, 135, 86, 137, 137, 137, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 49, 49, 133, 133, 133, 129, 129, 129, 138, 138, 138, 138, 138, 138, 56, 56, 56, 97, 97, 97, 97, 141, 140, 132, 132, 132, 132, 132, 132, 131, 131, 131, 139, 139, 139, 139, 85, 142, 142, 143, 143, 143, 143, 143, 143, 143, 136, 145, 145, 144, 144, 146, 146, 146, 146, 146, 146, 134, 134, 134, 134, 148, 149, 147, 147, 147, 147, 147, 147, 147, 150, 150, 150, 150);
    protected $ruleToLength = array(1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 3, 5, 4, 3, 4, 2, 3, 1, 1, 7, 8, 6, 7, 2, 3, 1, 2, 3, 1, 2, 3, 1, 1, 3, 1, 2, 1, 2, 2, 3, 1, 3, 2, 3, 1, 3, 2, 0, 1, 1, 1, 1, 1, 3, 7, 10, 5, 7, 9, 5, 3, 3, 3, 3, 3, 3, 1, 2, 5, 7, 9, 6, 5, 6, 3, 3, 2, 1, 1, 1, 0, 2, 1, 3, 8, 0, 4, 2, 1, 3, 0, 1, 0, 1, 3, 1, 8, 7, 6, 5, 1, 2, 2, 0, 2, 0, 2, 0, 2, 2, 1, 3, 1, 4, 1, 4, 1, 1, 4, 2, 1, 3, 3, 3, 4, 4, 5, 0, 2, 4, 3, 1, 1, 1, 4, 0, 2, 5, 0, 2, 6, 0, 2, 0, 3, 1, 2, 1, 1, 2, 0, 1, 3, 4, 6, 4, 1, 2, 1, 1, 1, 0, 1, 0, 2, 2, 2, 4, 1, 3, 1, 2, 2, 2, 3, 1, 1, 2, 3, 1, 1, 3, 2, 0, 1, 4, 4, 9, 3, 1, 1, 3, 0, 2, 4, 5, 4, 4, 4, 3, 1, 1, 1, 1, 1, 1, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 3, 2, 3, 1, 0, 1, 1, 3, 3, 3, 4, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 3, 4, 4, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 2, 1, 2, 4, 2, 8, 9, 8, 9, 7, 3, 2, 0, 4, 2, 1, 3, 2, 2, 2, 4, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 0, 3, 0, 1, 1, 0, 1, 1, 3, 3, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 3, 3, 0, 1, 1, 3, 1, 1, 3, 1, 1, 4, 4, 4, 1, 4, 1, 1, 3, 1, 4, 2, 2, 1, 3, 1, 4, 4, 3, 3, 3, 1, 3, 1, 1, 3, 1, 1, 4, 3, 1, 1, 2, 1, 3, 4, 3, 0, 1, 1, 1, 3, 1, 3, 1, 4, 2, 2, 0, 2, 2, 1, 2, 1, 1, 1, 4, 3, 3, 3, 6, 3, 1, 1, 2, 1);
    protected function initReduceCallbacks()
    {
        $this->reduceCallbacks = [0 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 1 => function ($stackPos) {
            $this->semValue = $this->handleNamespaces($this->semStack[$stackPos - (1 - 1)]);
        }, 2 => function ($stackPos) {
            if (\is_array($this->semStack[$stackPos - (2 - 2)])) {
                $this->semValue = \array_merge($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]);
            } else {
                $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)];
                $this->semValue = $this->semStack[$stackPos - (2 - 1)];
            }
        }, 3 => function ($stackPos) {
            $this->semValue = array();
        }, 4 => function ($stackPos) {
            $startAttributes = $this->lookaheadStartAttributes;
            if (isset($startAttributes['comments'])) {
                $nop = new \PhpParser\Node\Stmt\Nop($this->createZeroLengthAttributes($startAttributes));
            } else {
                $nop = null;
            }
            if ($nop !== null) {
                $this->semStack[$stackPos - (1 - 1)][] = $nop;
            }
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 5 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 6 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 7 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 8 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 9 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 10 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 11 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 12 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 13 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 14 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 15 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 16 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 17 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 18 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 19 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 20 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 21 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 22 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 23 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 24 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 25 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 26 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 27 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 28 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 29 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 30 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 31 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 32 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 33 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 34 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 35 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 36 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 37 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 38 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 39 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 40 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 41 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 42 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 43 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 44 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 45 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 46 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 47 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 48 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 49 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 50 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 51 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 52 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 53 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 54 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 55 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 56 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 57 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 58 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 59 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 60 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 61 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 62 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 63 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 64 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 65 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 66 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 67 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 68 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 69 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 70 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 71 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 72 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 73 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 74 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 75 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 76 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 77 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 78 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 79 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 80 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 81 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 82 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 83 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 84 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 85 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 86 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 87 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 88 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Variable(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 89 => function ($stackPos) {
            /* nothing */
        }, 90 => function ($stackPos) {
            /* nothing */
        }, 91 => function ($stackPos) {
            /* nothing */
        }, 92 => function ($stackPos) {
            $this->emitError(new \PhpParser\Error('A trailing comma is not allowed here', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes));
        }, 93 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 94 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 95 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 96 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 97 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 98 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\HaltCompiler($this->lexer->handleHaltCompiler(), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 99 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Namespace_($this->semStack[$stackPos - (3 - 2)], null, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
            $this->semValue->setAttribute('kind', \PhpParser\Node\Stmt\Namespace_::KIND_SEMICOLON);
            $this->checkNamespace($this->semValue);
        }, 100 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Namespace_($this->semStack[$stackPos - (5 - 2)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes);
            $this->semValue->setAttribute('kind', \PhpParser\Node\Stmt\Namespace_::KIND_BRACED);
            $this->checkNamespace($this->semValue);
        }, 101 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Namespace_(null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
            $this->semValue->setAttribute('kind', \PhpParser\Node\Stmt\Namespace_::KIND_BRACED);
            $this->checkNamespace($this->semValue);
        }, 102 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Use_($this->semStack[$stackPos - (3 - 2)], \PhpParser\Node\Stmt\Use_::TYPE_NORMAL, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 103 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Use_($this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 104 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 105 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Const_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 106 => function ($stackPos) {
            $this->semValue = \PhpParser\Node\Stmt\Use_::TYPE_FUNCTION;
        }, 107 => function ($stackPos) {
            $this->semValue = \PhpParser\Node\Stmt\Use_::TYPE_CONSTANT;
        }, 108 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\GroupUse(new \PhpParser\Node\Name($this->semStack[$stackPos - (7 - 3)], $this->startAttributeStack[$stackPos - (7 - 3)] + $this->endAttributeStack[$stackPos - (7 - 3)]), $this->semStack[$stackPos - (7 - 6)], $this->semStack[$stackPos - (7 - 2)], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes);
        }, 109 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\GroupUse(new \PhpParser\Node\Name($this->semStack[$stackPos - (8 - 4)], $this->startAttributeStack[$stackPos - (8 - 4)] + $this->endAttributeStack[$stackPos - (8 - 4)]), $this->semStack[$stackPos - (8 - 7)], $this->semStack[$stackPos - (8 - 2)], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes);
        }, 110 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\GroupUse(new \PhpParser\Node\Name($this->semStack[$stackPos - (6 - 2)], $this->startAttributeStack[$stackPos - (6 - 2)] + $this->endAttributeStack[$stackPos - (6 - 2)]), $this->semStack[$stackPos - (6 - 5)], \PhpParser\Node\Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes);
        }, 111 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\GroupUse(new \PhpParser\Node\Name($this->semStack[$stackPos - (7 - 3)], $this->startAttributeStack[$stackPos - (7 - 3)] + $this->endAttributeStack[$stackPos - (7 - 3)]), $this->semStack[$stackPos - (7 - 6)], \PhpParser\Node\Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes);
        }, 112 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 113 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 114 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 115 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 116 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 117 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 118 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 119 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 120 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 121 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\UseUse($this->semStack[$stackPos - (1 - 1)], null, \PhpParser\Node\Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
            $this->checkUseUse($this->semValue, $stackPos - (1 - 1));
        }, 122 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\UseUse($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], \PhpParser\Node\Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
            $this->checkUseUse($this->semValue, $stackPos - (3 - 3));
        }, 123 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 124 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 2)];
        }, 125 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
            $this->semValue->type = \PhpParser\Node\Stmt\Use_::TYPE_NORMAL;
        }, 126 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 2)];
            $this->semValue->type = $this->semStack[$stackPos - (2 - 1)];
        }, 127 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 128 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 129 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 130 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Const_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 131 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 132 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 133 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 134 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Const_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 135 => function ($stackPos) {
            if (\is_array($this->semStack[$stackPos - (2 - 2)])) {
                $this->semValue = \array_merge($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]);
            } else {
                $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)];
                $this->semValue = $this->semStack[$stackPos - (2 - 1)];
            }
        }, 136 => function ($stackPos) {
            $this->semValue = array();
        }, 137 => function ($stackPos) {
            $startAttributes = $this->lookaheadStartAttributes;
            if (isset($startAttributes['comments'])) {
                $nop = new \PhpParser\Node\Stmt\Nop($this->createZeroLengthAttributes($startAttributes));
            } else {
                $nop = null;
            }
            if ($nop !== null) {
                $this->semStack[$stackPos - (1 - 1)][] = $nop;
            }
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 138 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 139 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 140 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 141 => function ($stackPos) {
            throw new \PhpParser\Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 142 => function ($stackPos) {
            if ($this->semStack[$stackPos - (3 - 2)]) {
                $this->semValue = $this->semStack[$stackPos - (3 - 2)];
                $attrs = $this->startAttributeStack[$stackPos - (3 - 1)];
                $stmts = $this->semValue;
                if (!empty($attrs['comments'])) {
                    $stmts[0]->setAttribute('comments', \array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', [])));
                }
            } else {
                $startAttributes = $this->startAttributeStack[$stackPos - (3 - 1)];
                if (isset($startAttributes['comments'])) {
                    $this->semValue = new \PhpParser\Node\Stmt\Nop($startAttributes + $this->endAttributes);
                } else {
                    $this->semValue = null;
                }
                if (null === $this->semValue) {
                    $this->semValue = array();
                }
            }
        }, 143 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\If_($this->semStack[$stackPos - (7 - 3)], ['stmts' => \is_array($this->semStack[$stackPos - (7 - 5)]) ? $this->semStack[$stackPos - (7 - 5)] : array($this->semStack[$stackPos - (7 - 5)]), 'elseifs' => $this->semStack[$stackPos - (7 - 6)], 'else' => $this->semStack[$stackPos - (7 - 7)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes);
        }, 144 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\If_($this->semStack[$stackPos - (10 - 3)], ['stmts' => $this->semStack[$stackPos - (10 - 6)], 'elseifs' => $this->semStack[$stackPos - (10 - 7)], 'else' => $this->semStack[$stackPos - (10 - 8)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes);
        }, 145 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\While_($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes);
        }, 146 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Do_($this->semStack[$stackPos - (7 - 5)], \is_array($this->semStack[$stackPos - (7 - 2)]) ? $this->semStack[$stackPos - (7 - 2)] : array($this->semStack[$stackPos - (7 - 2)]), $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes);
        }, 147 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\For_(['init' => $this->semStack[$stackPos - (9 - 3)], 'cond' => $this->semStack[$stackPos - (9 - 5)], 'loop' => $this->semStack[$stackPos - (9 - 7)], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes);
        }, 148 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Switch_($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes);
        }, 149 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Break_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 150 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Continue_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 151 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Return_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 152 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Global_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 153 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Static_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 154 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Echo_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 155 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\InlineHTML($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 156 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Expression($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 157 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Unset_($this->semStack[$stackPos - (5 - 3)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes);
        }, 158 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Foreach_($this->semStack[$stackPos - (7 - 3)], $this->semStack[$stackPos - (7 - 5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos - (7 - 5)][1], 'stmts' => $this->semStack[$stackPos - (7 - 7)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes);
        }, 159 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Foreach_($this->semStack[$stackPos - (9 - 3)], $this->semStack[$stackPos - (9 - 7)][0], ['keyVar' => $this->semStack[$stackPos - (9 - 5)], 'byRef' => $this->semStack[$stackPos - (9 - 7)][1], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes);
        }, 160 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Foreach_($this->semStack[$stackPos - (6 - 3)], new \PhpParser\Node\Expr\Error($this->startAttributeStack[$stackPos - (6 - 4)] + $this->endAttributeStack[$stackPos - (6 - 4)]), ['stmts' => $this->semStack[$stackPos - (6 - 6)]], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes);
        }, 161 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Declare_($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes);
        }, 162 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\TryCatch($this->semStack[$stackPos - (6 - 3)], $this->semStack[$stackPos - (6 - 5)], $this->semStack[$stackPos - (6 - 6)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes);
            $this->checkTryCatch($this->semValue);
        }, 163 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Throw_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 164 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Goto_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 165 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Label($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 166 => function ($stackPos) {
            $this->semValue = array();
            /* means: no statement */
        }, 167 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 168 => function ($stackPos) {
            $startAttributes = $this->startAttributeStack[$stackPos - (1 - 1)];
            if (isset($startAttributes['comments'])) {
                $this->semValue = new \PhpParser\Node\Stmt\Nop($startAttributes + $this->endAttributes);
            } else {
                $this->semValue = null;
            }
            if ($this->semValue === null) {
                $this->semValue = array();
            }
            /* means: no statement */
        }, 169 => function ($stackPos) {
            $this->semValue = array();
        }, 170 => function ($stackPos) {
            $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)];
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 171 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 172 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 173 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Catch_($this->semStack[$stackPos - (8 - 3)], $this->semStack[$stackPos - (8 - 4)], $this->semStack[$stackPos - (8 - 7)], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes);
        }, 174 => function ($stackPos) {
            $this->semValue = null;
        }, 175 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Finally_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 176 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 177 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 178 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 179 => function ($stackPos) {
            $this->semValue = \false;
        }, 180 => function ($stackPos) {
            $this->semValue = \true;
        }, 181 => function ($stackPos) {
            $this->semValue = \false;
        }, 182 => function ($stackPos) {
            $this->semValue = \true;
        }, 183 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (3 - 2)];
        }, 184 => function ($stackPos) {
            $this->semValue = [];
        }, 185 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Function_($this->semStack[$stackPos - (8 - 3)], ['byRef' => $this->semStack[$stackPos - (8 - 2)], 'params' => $this->semStack[$stackPos - (8 - 5)], 'returnType' => $this->semStack[$stackPos - (8 - 7)], 'stmts' => $this->semStack[$stackPos - (8 - 8)]], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes);
        }, 186 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Class_($this->semStack[$stackPos - (7 - 2)], ['type' => $this->semStack[$stackPos - (7 - 1)], 'extends' => $this->semStack[$stackPos - (7 - 3)], 'implements' => $this->semStack[$stackPos - (7 - 4)], 'stmts' => $this->semStack[$stackPos - (7 - 6)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes);
            $this->checkClass($this->semValue, $stackPos - (7 - 2));
        }, 187 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Interface_($this->semStack[$stackPos - (6 - 2)], ['extends' => $this->semStack[$stackPos - (6 - 3)], 'stmts' => $this->semStack[$stackPos - (6 - 5)]], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes);
            $this->checkInterface($this->semValue, $stackPos - (6 - 2));
        }, 188 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Trait_($this->semStack[$stackPos - (5 - 2)], ['stmts' => $this->semStack[$stackPos - (5 - 4)]], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes);
        }, 189 => function ($stackPos) {
            $this->semValue = 0;
        }, 190 => function ($stackPos) {
            $this->semValue = \PhpParser\Node\Stmt\Class_::MODIFIER_ABSTRACT;
        }, 191 => function ($stackPos) {
            $this->semValue = \PhpParser\Node\Stmt\Class_::MODIFIER_FINAL;
        }, 192 => function ($stackPos) {
            $this->semValue = null;
        }, 193 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 2)];
        }, 194 => function ($stackPos) {
            $this->semValue = array();
        }, 195 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 2)];
        }, 196 => function ($stackPos) {
            $this->semValue = array();
        }, 197 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 2)];
        }, 198 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 199 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 200 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 201 => function ($stackPos) {
            $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]);
        }, 202 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (4 - 2)];
        }, 203 => function ($stackPos) {
            $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]);
        }, 204 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (4 - 2)];
        }, 205 => function ($stackPos) {
            $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]);
        }, 206 => function ($stackPos) {
            $this->semValue = null;
        }, 207 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (4 - 2)];
        }, 208 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 209 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 210 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 211 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\DeclareDeclare($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 212 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (3 - 2)];
        }, 213 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (4 - 3)];
        }, 214 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (4 - 2)];
        }, 215 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (5 - 3)];
        }, 216 => function ($stackPos) {
            $this->semValue = array();
        }, 217 => function ($stackPos) {
            $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)];
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 218 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Case_($this->semStack[$stackPos - (4 - 2)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 219 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Case_(null, $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 220 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 221 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 222 => function ($stackPos) {
            $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]);
        }, 223 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (4 - 2)];
        }, 224 => function ($stackPos) {
            $this->semValue = array();
        }, 225 => function ($stackPos) {
            $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)];
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 226 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\ElseIf_($this->semStack[$stackPos - (5 - 3)], \is_array($this->semStack[$stackPos - (5 - 5)]) ? $this->semStack[$stackPos - (5 - 5)] : array($this->semStack[$stackPos - (5 - 5)]), $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes);
        }, 227 => function ($stackPos) {
            $this->semValue = array();
        }, 228 => function ($stackPos) {
            $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)];
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 229 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\ElseIf_($this->semStack[$stackPos - (6 - 3)], $this->semStack[$stackPos - (6 - 6)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes);
        }, 230 => function ($stackPos) {
            $this->semValue = null;
        }, 231 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Else_(\is_array($this->semStack[$stackPos - (2 - 2)]) ? $this->semStack[$stackPos - (2 - 2)] : array($this->semStack[$stackPos - (2 - 2)]), $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 232 => function ($stackPos) {
            $this->semValue = null;
        }, 233 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Else_($this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 234 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false);
        }, 235 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (2 - 2)], \true);
        }, 236 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false);
        }, 237 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false);
        }, 238 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 239 => function ($stackPos) {
            $this->semValue = array();
        }, 240 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 241 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 242 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Param($this->semStack[$stackPos - (4 - 4)], null, $this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 2)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
            $this->checkParam($this->semValue);
        }, 243 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Param($this->semStack[$stackPos - (6 - 4)], $this->semStack[$stackPos - (6 - 6)], $this->semStack[$stackPos - (6 - 1)], $this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 3)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes);
            $this->checkParam($this->semValue);
        }, 244 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Param(new \PhpParser\Node\Expr\Error($this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes), null, $this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 2)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 245 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 246 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\NullableType($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 247 => function ($stackPos) {
            $this->semValue = $this->handleBuiltinTypes($this->semStack[$stackPos - (1 - 1)]);
        }, 248 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Identifier('array', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 249 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Identifier('callable', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 250 => function ($stackPos) {
            $this->semValue = null;
        }, 251 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 252 => function ($stackPos) {
            $this->semValue = null;
        }, 253 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 2)];
        }, 254 => function ($stackPos) {
            $this->semValue = null;
        }, 255 => function ($stackPos) {
            $this->semValue = array();
        }, 256 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (4 - 2)];
        }, 257 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 258 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 259 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Arg($this->semStack[$stackPos - (1 - 1)], \false, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 260 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Arg($this->semStack[$stackPos - (2 - 2)], \true, \false, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 261 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Arg($this->semStack[$stackPos - (2 - 2)], \false, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 262 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 263 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 264 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 265 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Variable($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 266 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 267 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 268 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 269 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\StaticVar($this->semStack[$stackPos - (1 - 1)], null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 270 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\StaticVar($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 271 => function ($stackPos) {
            if ($this->semStack[$stackPos - (2 - 2)] !== null) {
                $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)];
                $this->semValue = $this->semStack[$stackPos - (2 - 1)];
            }
        }, 272 => function ($stackPos) {
            $this->semValue = array();
        }, 273 => function ($stackPos) {
            $startAttributes = $this->lookaheadStartAttributes;
            if (isset($startAttributes['comments'])) {
                $nop = new \PhpParser\Node\Stmt\Nop($this->createZeroLengthAttributes($startAttributes));
            } else {
                $nop = null;
            }
            if ($nop !== null) {
                $this->semStack[$stackPos - (1 - 1)][] = $nop;
            }
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 274 => function ($stackPos) {
            $attrs = $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes;
            $this->semValue = new \PhpParser\Node\Stmt\Property($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $attrs, $this->semStack[$stackPos - (4 - 2)]);
            $this->checkProperty($this->semValue, $stackPos - (4 - 1));
        }, 275 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\ClassConst($this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 1)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
            $this->checkClassConst($this->semValue, $stackPos - (4 - 1));
        }, 276 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\ClassMethod($this->semStack[$stackPos - (9 - 4)], ['type' => $this->semStack[$stackPos - (9 - 1)], 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 6)], 'returnType' => $this->semStack[$stackPos - (9 - 8)], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes);
            $this->checkClassMethod($this->semValue, $stackPos - (9 - 1));
        }, 277 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\TraitUse($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 278 => function ($stackPos) {
            $this->semValue = null;
            /* will be skipped */
        }, 279 => function ($stackPos) {
            $this->semValue = array();
        }, 280 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (3 - 2)];
        }, 281 => function ($stackPos) {
            $this->semValue = array();
        }, 282 => function ($stackPos) {
            $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)];
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 283 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 284 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (5 - 1)][0], $this->semStack[$stackPos - (5 - 1)][1], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes);
        }, 285 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], $this->semStack[$stackPos - (4 - 3)], null, $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 286 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 287 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 288 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]);
        }, 289 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 290 => function ($stackPos) {
            $this->semValue = array(null, $this->semStack[$stackPos - (1 - 1)]);
        }, 291 => function ($stackPos) {
            $this->semValue = null;
        }, 292 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 293 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 294 => function ($stackPos) {
            $this->semValue = 0;
        }, 295 => function ($stackPos) {
            $this->semValue = 0;
        }, 296 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 297 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 298 => function ($stackPos) {
            $this->checkModifier($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2));
            $this->semValue = $this->semStack[$stackPos - (2 - 1)] | $this->semStack[$stackPos - (2 - 2)];
        }, 299 => function ($stackPos) {
            $this->semValue = \PhpParser\Node\Stmt\Class_::MODIFIER_PUBLIC;
        }, 300 => function ($stackPos) {
            $this->semValue = \PhpParser\Node\Stmt\Class_::MODIFIER_PROTECTED;
        }, 301 => function ($stackPos) {
            $this->semValue = \PhpParser\Node\Stmt\Class_::MODIFIER_PRIVATE;
        }, 302 => function ($stackPos) {
            $this->semValue = \PhpParser\Node\Stmt\Class_::MODIFIER_STATIC;
        }, 303 => function ($stackPos) {
            $this->semValue = \PhpParser\Node\Stmt\Class_::MODIFIER_ABSTRACT;
        }, 304 => function ($stackPos) {
            $this->semValue = \PhpParser\Node\Stmt\Class_::MODIFIER_FINAL;
        }, 305 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 306 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 307 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 308 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\VarLikeIdentifier(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 309 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\PropertyProperty($this->semStack[$stackPos - (1 - 1)], null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 310 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\PropertyProperty($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 311 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 312 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 313 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 314 => function ($stackPos) {
            $this->semValue = array();
        }, 315 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 316 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 317 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 318 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 319 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 320 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignRef($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 321 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 322 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Clone_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 323 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 324 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 325 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 326 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 327 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 328 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 329 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 330 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 331 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 332 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 333 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 334 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 335 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\Coalesce($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 336 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\PostInc($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 337 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\PreInc($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 338 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\PostDec($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 339 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\PreDec($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 340 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\BooleanOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 341 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 342 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\LogicalOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 343 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 344 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\LogicalXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 345 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 346 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 347 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 348 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 349 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 350 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 351 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 352 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 353 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 354 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 355 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 356 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 357 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\UnaryPlus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 358 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\UnaryMinus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 359 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BooleanNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 360 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BitwiseNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 361 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Identical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 362 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\NotIdentical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 363 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Equal($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 364 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\NotEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 365 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Spaceship($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 366 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Smaller($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 367 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 368 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Greater($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 369 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 370 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Instanceof_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 371 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (3 - 2)];
        }, 372 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Ternary($this->semStack[$stackPos - (5 - 1)], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes);
        }, 373 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Ternary($this->semStack[$stackPos - (4 - 1)], null, $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 374 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Coalesce($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 375 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Isset_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 376 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Empty_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 377 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Include_($this->semStack[$stackPos - (2 - 2)], \PhpParser\Node\Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 378 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Include_($this->semStack[$stackPos - (2 - 2)], \PhpParser\Node\Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 379 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Eval_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 380 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Include_($this->semStack[$stackPos - (2 - 2)], \PhpParser\Node\Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 381 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Include_($this->semStack[$stackPos - (2 - 2)], \PhpParser\Node\Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 382 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Cast\Int_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 383 => function ($stackPos) {
            $attrs = $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes;
            $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos - (2 - 1)]);
            $this->semValue = new \PhpParser\Node\Expr\Cast\Double($this->semStack[$stackPos - (2 - 2)], $attrs);
        }, 384 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Cast\String_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 385 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Cast\Array_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 386 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Cast\Object_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 387 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Cast\Bool_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 388 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Cast\Unset_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 389 => function ($stackPos) {
            $attrs = $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes;
            $attrs['kind'] = \strtolower($this->semStack[$stackPos - (2 - 1)]) === 'exit' ? \PhpParser\Node\Expr\Exit_::KIND_EXIT : \PhpParser\Node\Expr\Exit_::KIND_DIE;
            $this->semValue = new \PhpParser\Node\Expr\Exit_($this->semStack[$stackPos - (2 - 2)], $attrs);
        }, 390 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ErrorSuppress($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 391 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 392 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ShellExec($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 393 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Print_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 394 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Yield_(null, null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 395 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Yield_($this->semStack[$stackPos - (2 - 2)], null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 396 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Yield_($this->semStack[$stackPos - (4 - 4)], $this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 397 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\YieldFrom($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 398 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrowFunction(['static' => \false, 'byRef' => $this->semStack[$stackPos - (8 - 2)], 'params' => $this->semStack[$stackPos - (8 - 4)], 'returnType' => $this->semStack[$stackPos - (8 - 6)], 'expr' => $this->semStack[$stackPos - (8 - 8)]], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes);
        }, 399 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrowFunction(['static' => \true, 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 5)], 'returnType' => $this->semStack[$stackPos - (9 - 7)], 'expr' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes);
        }, 400 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Closure(['static' => \false, 'byRef' => $this->semStack[$stackPos - (8 - 2)], 'params' => $this->semStack[$stackPos - (8 - 4)], 'uses' => $this->semStack[$stackPos - (8 - 6)], 'returnType' => $this->semStack[$stackPos - (8 - 7)], 'stmts' => $this->semStack[$stackPos - (8 - 8)]], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes);
        }, 401 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Closure(['static' => \true, 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 5)], 'uses' => $this->semStack[$stackPos - (9 - 7)], 'returnType' => $this->semStack[$stackPos - (9 - 8)], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes);
        }, 402 => function ($stackPos) {
            $this->semValue = array(new \PhpParser\Node\Stmt\Class_(null, ['type' => 0, 'extends' => $this->semStack[$stackPos - (7 - 3)], 'implements' => $this->semStack[$stackPos - (7 - 4)], 'stmts' => $this->semStack[$stackPos - (7 - 6)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes), $this->semStack[$stackPos - (7 - 2)]);
            $this->checkClass($this->semValue[0], -1);
        }, 403 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\New_($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 404 => function ($stackPos) {
            list($class, $ctorArgs) = $this->semStack[$stackPos - (2 - 2)];
            $this->semValue = new \PhpParser\Node\Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 405 => function ($stackPos) {
            $this->semValue = array();
        }, 406 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (4 - 3)];
        }, 407 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 408 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 409 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 410 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ClosureUse($this->semStack[$stackPos - (2 - 2)], $this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 411 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 412 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 413 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\StaticCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 414 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 415 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 416 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 417 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Name\FullyQualified($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 418 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Name\Relative($this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 419 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 420 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 421 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Error($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
            $this->errorState = 2;
        }, 422 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 423 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 424 => function ($stackPos) {
            $this->semValue = null;
        }, 425 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (3 - 2)];
        }, 426 => function ($stackPos) {
            $this->semValue = array();
        }, 427 => function ($stackPos) {
            $this->semValue = array(new \PhpParser\Node\Scalar\EncapsedStringPart(\PhpParser\Node\Scalar\String_::parseEscapeSequences($this->semStack[$stackPos - (1 - 1)], '`'), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes));
        }, 428 => function ($stackPos) {
            foreach ($this->semStack[$stackPos - (1 - 1)] as $s) {
                if ($s instanceof \PhpParser\Node\Scalar\EncapsedStringPart) {
                    $s->value = \PhpParser\Node\Scalar\String_::parseEscapeSequences($s->value, '`', \true);
                }
            }
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 429 => function ($stackPos) {
            $this->semValue = array();
        }, 430 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 431 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ConstFetch($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 432 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ClassConstFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 433 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ClassConstFetch($this->semStack[$stackPos - (3 - 1)], new \PhpParser\Node\Expr\Error($this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)]), $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
            $this->errorState = 2;
        }, 434 => function ($stackPos) {
            $attrs = $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes;
            $attrs['kind'] = \PhpParser\Node\Expr\Array_::KIND_SHORT;
            $this->semValue = new \PhpParser\Node\Expr\Array_($this->semStack[$stackPos - (3 - 2)], $attrs);
        }, 435 => function ($stackPos) {
            $attrs = $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes;
            $attrs['kind'] = \PhpParser\Node\Expr\Array_::KIND_LONG;
            $this->semValue = new \PhpParser\Node\Expr\Array_($this->semStack[$stackPos - (4 - 3)], $attrs);
        }, 436 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 437 => function ($stackPos) {
            $attrs = $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes;
            $attrs['kind'] = $this->semStack[$stackPos - (1 - 1)][0] === "'" || $this->semStack[$stackPos - (1 - 1)][1] === "'" && ($this->semStack[$stackPos - (1 - 1)][0] === 'b' || $this->semStack[$stackPos - (1 - 1)][0] === 'B') ? \PhpParser\Node\Scalar\String_::KIND_SINGLE_QUOTED : \PhpParser\Node\Scalar\String_::KIND_DOUBLE_QUOTED;
            $this->semValue = new \PhpParser\Node\Scalar\String_(\PhpParser\Node\Scalar\String_::parse($this->semStack[$stackPos - (1 - 1)]), $attrs);
        }, 438 => function ($stackPos) {
            $this->semValue = $this->parseLNumber($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 439 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Scalar\DNumber(\PhpParser\Node\Scalar\DNumber::parse($this->semStack[$stackPos - (1 - 1)]), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 440 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Scalar\MagicConst\Line($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 441 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Scalar\MagicConst\File($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 442 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 443 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 444 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 445 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Scalar\MagicConst\Method($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 446 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 447 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 448 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 449 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 450 => function ($stackPos) {
            $this->semValue = $this->parseDocString($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)], \true);
        }, 451 => function ($stackPos) {
            $this->semValue = $this->parseDocString($this->semStack[$stackPos - (2 - 1)], '', $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (2 - 2)] + $this->endAttributeStack[$stackPos - (2 - 2)], \true);
        }, 452 => function ($stackPos) {
            $attrs = $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes;
            $attrs['kind'] = \PhpParser\Node\Scalar\String_::KIND_DOUBLE_QUOTED;
            foreach ($this->semStack[$stackPos - (3 - 2)] as $s) {
                if ($s instanceof \PhpParser\Node\Scalar\EncapsedStringPart) {
                    $s->value = \PhpParser\Node\Scalar\String_::parseEscapeSequences($s->value, '"', \true);
                }
            }
            $this->semValue = new \PhpParser\Node\Scalar\Encapsed($this->semStack[$stackPos - (3 - 2)], $attrs);
        }, 453 => function ($stackPos) {
            $this->semValue = $this->parseDocString($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)], \true);
        }, 454 => function ($stackPos) {
            $this->semValue = null;
        }, 455 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 456 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 457 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (3 - 2)];
        }, 458 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 459 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 460 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (3 - 2)];
        }, 461 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 462 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Variable($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 463 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 464 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 465 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 466 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 467 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\MethodCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 468 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 469 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 470 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 471 => function ($stackPos) {
            $this->semValue = \substr($this->semStack[$stackPos - (1 - 1)], 1);
        }, 472 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (4 - 3)];
        }, 473 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Variable($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 474 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Error($this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
            $this->errorState = 2;
        }, 475 => function ($stackPos) {
            $var = $this->semStack[$stackPos - (1 - 1)];
            $this->semValue = \is_string($var) ? new \PhpParser\Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes) : $var;
        }, 476 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\StaticPropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 477 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Variable($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 478 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 479 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 480 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 481 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\StaticPropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 482 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\StaticPropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 483 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 484 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (3 - 2)];
        }, 485 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Variable($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 486 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 487 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (3 - 2)];
        }, 488 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Variable($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 489 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Error($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
            $this->errorState = 2;
        }, 490 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\List_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 491 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 492 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 493 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 494 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayItem($this->semStack[$stackPos - (2 - 2)], null, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 495 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 496 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayItem($this->semStack[$stackPos - (3 - 3)], $this->semStack[$stackPos - (3 - 1)], \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 497 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayItem($this->semStack[$stackPos - (4 - 4)], $this->semStack[$stackPos - (4 - 1)], \true, $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 498 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayItem($this->semStack[$stackPos - (3 - 3)], $this->semStack[$stackPos - (3 - 1)], \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 499 => function ($stackPos) {
            $this->semValue = null;
        }, 500 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
            $end = \count($this->semValue) - 1;
            if ($this->semValue[$end] === null) {
                \array_pop($this->semValue);
            }
        }, 501 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 502 => function ($stackPos) {
            /* do nothing -- prevent default action of $$=$this->semStack[$1]. See $551. */
        }, 503 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 504 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 505 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayItem($this->semStack[$stackPos - (3 - 3)], $this->semStack[$stackPos - (3 - 1)], \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 506 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 507 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayItem($this->semStack[$stackPos - (4 - 4)], $this->semStack[$stackPos - (4 - 1)], \true, $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 508 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayItem($this->semStack[$stackPos - (2 - 2)], null, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 509 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayItem($this->semStack[$stackPos - (2 - 2)], null, \false, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 510 => function ($stackPos) {
            $this->semValue = null;
        }, 511 => function ($stackPos) {
            $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)];
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 512 => function ($stackPos) {
            $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)];
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 513 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 514 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]);
        }, 515 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Scalar\EncapsedStringPart($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 516 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Variable($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 517 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 518 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 519 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 520 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Variable($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 521 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Variable($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 522 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 4)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes);
        }, 523 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (3 - 2)];
        }, 524 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Scalar\String_($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 525 => function ($stackPos) {
            $this->semValue = $this->parseNumString($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 526 => function ($stackPos) {
            $this->semValue = $this->parseNumString('-' . $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 527 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }];
    }
}
<?php

namespace PhpParser\Parser;

use PhpParser\Error;
use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\Name;
use PhpParser\Node\Scalar;
use PhpParser\Node\Stmt;
/* This is an automatically GENERATED file, which should not be manually edited.
 * Instead edit one of the following:
 *  * the grammar files grammar/php5.y or grammar/php7.y
 *  * the skeleton file grammar/parser.template
 *  * the preprocessing script grammar/rebuildParsers.php
 */
class Php5 extends \PhpParser\ParserAbstract
{
    protected $tokenToSymbolMapSize = 394;
    protected $actionTableSize = 1079;
    protected $gotoTableSize = 650;
    protected $invalidSymbol = 159;
    protected $errorSymbol = 1;
    protected $defaultAction = -32766;
    protected $unexpectedTokenRule = 32767;
    protected $YY2TBLSTATE = 407;
    protected $numNonLeafStates = 676;
    protected $symbolToName = array("EOF", "error", "T_INCLUDE", "T_INCLUDE_ONCE", "T_EVAL", "T_REQUIRE", "T_REQUIRE_ONCE", "','", "T_LOGICAL_OR", "T_LOGICAL_XOR", "T_LOGICAL_AND", "T_PRINT", "T_YIELD", "T_DOUBLE_ARROW", "T_YIELD_FROM", "'='", "T_PLUS_EQUAL", "T_MINUS_EQUAL", "T_MUL_EQUAL", "T_DIV_EQUAL", "T_CONCAT_EQUAL", "T_MOD_EQUAL", "T_AND_EQUAL", "T_OR_EQUAL", "T_XOR_EQUAL", "T_SL_EQUAL", "T_SR_EQUAL", "T_POW_EQUAL", "T_COALESCE_EQUAL", "'?'", "':'", "T_COALESCE", "T_BOOLEAN_OR", "T_BOOLEAN_AND", "'|'", "'^'", "'&'", "T_IS_EQUAL", "T_IS_NOT_EQUAL", "T_IS_IDENTICAL", "T_IS_NOT_IDENTICAL", "T_SPACESHIP", "'<'", "T_IS_SMALLER_OR_EQUAL", "'>'", "T_IS_GREATER_OR_EQUAL", "T_SL", "T_SR", "'+'", "'-'", "'.'", "'*'", "'/'", "'%'", "'!'", "T_INSTANCEOF", "'~'", "T_INC", "T_DEC", "T_INT_CAST", "T_DOUBLE_CAST", "T_STRING_CAST", "T_ARRAY_CAST", "T_OBJECT_CAST", "T_BOOL_CAST", "T_UNSET_CAST", "'@'", "T_POW", "'['", "T_NEW", "T_CLONE", "T_EXIT", "T_IF", "T_ELSEIF", "T_ELSE", "T_ENDIF", "T_LNUMBER", "T_DNUMBER", "T_STRING", "T_STRING_VARNAME", "T_VARIABLE", "T_NUM_STRING", "T_INLINE_HTML", "T_ENCAPSED_AND_WHITESPACE", "T_CONSTANT_ENCAPSED_STRING", "T_ECHO", "T_DO", "T_WHILE", "T_ENDWHILE", "T_FOR", "T_ENDFOR", "T_FOREACH", "T_ENDFOREACH", "T_DECLARE", "T_ENDDECLARE", "T_AS", "T_SWITCH", "T_ENDSWITCH", "T_CASE", "T_DEFAULT", "T_BREAK", "T_CONTINUE", "T_GOTO", "T_FUNCTION", "T_FN", "T_CONST", "T_RETURN", "T_TRY", "T_CATCH", "T_FINALLY", "T_THROW", "T_USE", "T_INSTEADOF", "T_GLOBAL", "T_STATIC", "T_ABSTRACT", "T_FINAL", "T_PRIVATE", "T_PROTECTED", "T_PUBLIC", "T_VAR", "T_UNSET", "T_ISSET", "T_EMPTY", "T_HALT_COMPILER", "T_CLASS", "T_TRAIT", "T_INTERFACE", "T_EXTENDS", "T_IMPLEMENTS", "T_OBJECT_OPERATOR", "T_LIST", "T_ARRAY", "T_CALLABLE", "T_CLASS_C", "T_TRAIT_C", "T_METHOD_C", "T_FUNC_C", "T_LINE", "T_FILE", "T_START_HEREDOC", "T_END_HEREDOC", "T_DOLLAR_OPEN_CURLY_BRACES", "T_CURLY_OPEN", "T_PAAMAYIM_NEKUDOTAYIM", "T_NAMESPACE", "T_NS_C", "T_DIR", "T_NS_SEPARATOR", "T_ELLIPSIS", "';'", "'{'", "'}'", "'('", "')'", "'\$'", "'`'", "']'", "'\"'");
    protected $tokenToSymbol = array(0, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 54, 158, 159, 155, 53, 36, 159, 153, 154, 51, 48, 7, 49, 50, 52, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 30, 150, 42, 15, 44, 29, 66, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 68, 159, 157, 35, 159, 156, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 151, 34, 152, 56, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 31, 32, 33, 37, 38, 39, 40, 41, 43, 45, 46, 47, 55, 57, 58, 59, 60, 61, 62, 63, 64, 65, 67, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 159, 159, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 159, 159, 159, 159, 159, 159, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149);
    protected $action = array(681, 682, 683, 684, 685, 283, 686, 687, 688, 724, 725, 222, 223, 224, 225, 226, 227, 228, 229, 230, 0, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32767, -32767, -32767, -32767, 1052, 243, 244, -32766, -32766, -32766, -32766, -32766, 689, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32767, -32767, -32767, -32767, -32767, 690, 691, 692, 693, 694, 695, 696, 834, 27, 757, 959, 960, 961, 958, 957, 956, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 727, 728, 729, 730, 731, 719, 720, 721, 749, 722, 723, 708, 709, 710, 711, 712, 713, 714, 751, 752, 753, 754, 755, 756, 715, 716, 717, 718, 748, 739, 737, 738, 734, 735, 1188, 726, 732, 733, 740, 741, 743, 742, 744, 745, 54, 55, 426, 56, 57, 736, 747, 746, -220, 58, 59, 419, 60, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, 28, -32767, -32767, -32767, -32767, -32767, -32767, -32767, -32767, 97, 98, 99, 100, 101, 9, 906, 907, -32766, 1202, 761, 328, 764, 1188, 814, 61, 62, 52, 285, 500, 951, 63, 434, 64, 294, 295, 65, 66, 67, 68, 69, 70, 71, 72, 340, 25, 302, 73, 418, -32766, -32766, -32766, 882, 1103, 1104, 761, 1080, 764, -32766, -32766, -32766, 475, -255, 298, 825, 835, 759, 219, 220, 221, -32766, 36, -32766, -32766, -32766, -32766, -32766, -32766, 125, -32766, 438, -32766, -32766, -32766, -32766, -32766, 1052, 500, 206, 310, 434, 499, 423, 1052, 129, 439, 759, 336, 340, 483, 484, 10, 959, 960, 961, 958, 957, 956, 485, 486, 124, 1109, 1110, 1111, 1112, 1106, 1107, 313, -32766, -32766, -32766, -32766, 500, 1113, 1108, 434, 219, 220, 221, 425, 41, 764, 336, 324, 1222, 325, 427, -126, -126, -126, -4, 835, 474, -32766, -32766, -32766, 823, 206, 913, 40, 21, 428, -126, 476, -126, 477, -126, 478, -126, 123, 429, 219, 220, 221, 31, 32, 430, 431, 354, 130, 33, 479, 883, 336, 74, 1203, 128, 352, 353, 480, 481, 912, 206, 247, 301, 482, 210, 1052, 806, 853, 432, 433, 312, 30, 297, 35, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 421, 1052, 296, 427, 1154, 837, 647, -126, 835, 474, 102, 103, 104, 823, 304, 816, 40, 21, 428, 332, 476, 632, 477, 422, 478, 298, 105, 429, 991, 993, 20, 31, 32, 430, 431, 933, 409, 33, 479, 220, 221, 74, 323, -32766, 352, 353, 480, 481, -32766, -32766, -32766, 424, 482, 1052, 448, 768, 853, 432, 433, 206, -32766, -32766, -32766, 48, 906, 907, 1153, 1070, 339, -32766, 485, -32766, -32766, -32766, -32766, 1231, 337, 500, 1232, 427, 434, 837, 647, -4, 835, 474, -224, 1052, 633, 823, 49, 434, 40, 21, 428, 937, 476, 776, 477, 777, 478, -504, 820, 429, -205, -205, -205, 31, 32, 430, 431, -32766, -32766, 33, 479, 75, -32766, 74, -32766, 594, 352, 353, 480, 481, -32766, -32766, -32766, 119, 482, 526, 451, 806, 853, 432, 433, 240, 241, 242, 128, -32766, -32766, -32766, 411, 775, 51, -32766, 120, -32766, -32766, -32766, 500, 243, 244, 434, 552, 427, 417, 837, 647, -205, -32766, 474, -32766, -32766, 1052, 823, 821, 351, 40, 21, 428, 1052, 476, 121, 477, 449, 478, 1115, 211, 429, -204, -204, -204, 31, 32, 430, 431, 1115, 286, 33, 479, 818, 835, 74, 932, 299, 352, 353, 480, 481, 212, 219, 220, 221, 482, 335, 245, 806, 853, 432, 433, -32766, -32766, -32766, 213, 79, 80, 81, 99, 100, 101, 650, 206, 237, 238, 239, 444, 122, 776, 649, 777, 300, -32766, 837, 647, -204, 34, 248, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 1052, 304, 427, 221, 249, 835, 250, 78, 474, 206, 133, 336, 823, 105, 585, 40, 21, 428, 127, 476, -83, 477, 206, 478, -32766, -32766, 429, 219, 220, 221, 31, 32, 430, 316, 651, 658, 33, 479, 835, 661, 74, 243, 244, 352, 353, 458, 22, 833, 206, 463, 601, 482, 134, 362, 132, 608, 609, 769, 653, -32766, 948, 667, 936, 675, 846, 304, 105, 655, 43, 44, 45, 616, 761, 759, 46, 47, 427, 302, -274, 50, 837, 647, 474, 53, 131, 588, 823, 442, 468, 40, 21, 428, 762, 476, 606, 477, -32766, 478, 764, 447, 429, 964, 854, 532, 31, 32, 430, 855, 327, 427, 33, 479, 835, 641, 74, 474, 620, 352, 353, 823, -81, 628, 40, 21, 428, 482, 476, 11, 477, 450, 478, 282, 591, 429, 375, 605, 848, 31, 32, 430, 0, 659, 329, 33, 479, 835, 0, 74, 0, 0, 352, 353, 0, 0, 837, 647, -504, 0, 482, 326, 0, 331, 0, 0, 0, 0, 0, 0, 0, 309, 311, -505, 0, 485, 664, 0, 0, 0, 0, 0, 0, 0, 0, 427, 1114, 1160, 0, 869, 647, 474, -413, -405, 835, 823, 5, 6, 40, 21, 428, 12, 476, 14, 477, 361, 478, -414, 386, 429, 387, 24, 395, 31, 32, 430, 444, 534, 427, 33, 479, 412, 413, 74, 474, 38, 352, 353, 823, 39, 670, 40, 21, 428, 482, 476, 671, 477, 774, 478, 824, 832, 429, 811, 826, 885, 31, 32, 430, 876, 877, 809, 33, 479, 870, 867, 74, 865, 943, 352, 353, 944, 941, 837, 647, 427, 815, 482, 817, 819, 831, 474, 822, 940, 772, 823, 773, 942, 40, 21, 428, 78, 476, 648, 477, 652, 478, 654, 656, 429, 657, 246, 660, 31, 32, 430, 837, 647, 662, 33, 479, 663, 665, 74, 666, 126, 352, 353, 333, 214, 215, 334, 407, 408, 482, 216, 672, 217, 807, 1228, 1230, 771, 852, 770, 851, 1229, 850, 1066, 842, 208, 1054, 849, 1055, 840, 214, 215, 949, 1103, 1104, 874, 216, -32766, 217, 837, 647, 1105, 875, 462, 1227, 1196, 1194, 1179, 1192, 1094, 208, 924, 1200, 1190, 780, 781, 778, 779, 1103, 1104, 26, 29, -32766, 37, 42, 76, 1105, 77, 209, 284, 292, 293, 305, 306, 307, 308, 341, 410, 416, -32766, 0, -221, -220, 16, 17, 18, 380, 459, 466, 573, 467, 1109, 1110, 1111, 1112, 1106, 1107, 385, 472, 567, 638, 1057, 1060, 1113, 1108, 914, 1119, 1056, 1032, 577, 218, 287, -32766, 1031, 573, 1096, 1109, 1110, 1111, 1112, 1106, 1107, 385, -423, 1050, 0, 1061, 1063, 1113, 1108, 1062, 1065, 1064, 1079, 1193, 218, 1178, -32766, 1174, 0, 1191, 1093, 1225, 1120, 1173, 612, 0, 1159);
    protected $actionCheck = array(2, 3, 4, 5, 6, 13, 8, 9, 10, 11, 12, 32, 33, 34, 35, 36, 37, 38, 39, 40, 0, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 8, 9, 10, 32, 33, 34, 35, 36, 37, 38, 39, 40, 12, 67, 68, 32, 33, 34, 35, 36, 55, 29, 8, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 69, 70, 71, 72, 73, 74, 75, 1, 7, 78, 114, 115, 116, 117, 118, 119, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 80, 131, 132, 133, 134, 135, 136, 137, 138, 139, 2, 3, 4, 5, 6, 145, 146, 147, 154, 11, 12, 125, 14, 32, 33, 34, 35, 36, 37, 38, 39, 40, 7, 42, 43, 44, 45, 42, 43, 44, 45, 46, 47, 48, 49, 50, 105, 132, 133, 153, 1, 78, 111, 80, 80, 150, 48, 49, 68, 7, 145, 120, 54, 148, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 155, 68, 69, 70, 71, 8, 9, 10, 30, 76, 77, 78, 114, 80, 8, 9, 10, 84, 152, 36, 150, 1, 78, 8, 9, 10, 29, 13, 31, 32, 33, 34, 35, 36, 7, 29, 103, 31, 32, 33, 34, 35, 12, 145, 29, 130, 148, 114, 7, 12, 151, 153, 78, 155, 155, 122, 123, 7, 114, 115, 116, 117, 118, 119, 131, 132, 151, 134, 135, 136, 137, 138, 139, 140, 32, 33, 34, 35, 145, 146, 147, 148, 8, 9, 10, 7, 153, 80, 155, 156, 83, 158, 72, 73, 74, 75, 0, 1, 78, 8, 9, 10, 82, 29, 154, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 13, 96, 8, 9, 10, 100, 101, 102, 103, 7, 151, 106, 107, 150, 155, 110, 154, 149, 113, 114, 115, 116, 154, 29, 30, 36, 121, 7, 12, 124, 125, 126, 127, 7, 142, 143, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 7, 12, 36, 72, 154, 150, 151, 152, 1, 78, 51, 52, 53, 82, 55, 150, 85, 86, 87, 7, 89, 78, 91, 7, 93, 36, 67, 96, 57, 58, 154, 100, 101, 102, 103, 150, 105, 106, 107, 9, 10, 110, 111, 80, 113, 114, 115, 116, 8, 9, 10, 7, 121, 12, 30, 124, 125, 126, 127, 29, 32, 33, 34, 68, 132, 133, 157, 154, 68, 29, 131, 31, 32, 33, 34, 78, 145, 145, 81, 72, 148, 150, 151, 152, 1, 78, 154, 12, 145, 82, 68, 148, 85, 86, 87, 152, 89, 103, 91, 105, 93, 130, 150, 96, 97, 98, 99, 100, 101, 102, 103, 8, 9, 106, 107, 149, 153, 110, 155, 83, 113, 114, 115, 116, 8, 9, 10, 15, 121, 83, 130, 124, 125, 126, 127, 51, 52, 53, 149, 8, 9, 10, 148, 150, 68, 29, 151, 31, 32, 33, 145, 67, 68, 148, 79, 72, 7, 150, 151, 152, 29, 78, 31, 32, 12, 82, 150, 7, 85, 86, 87, 12, 89, 151, 91, 151, 93, 141, 15, 96, 97, 98, 99, 100, 101, 102, 103, 141, 36, 106, 107, 150, 1, 110, 150, 36, 113, 114, 115, 116, 15, 8, 9, 10, 121, 7, 13, 124, 125, 126, 127, 8, 9, 10, 15, 8, 9, 10, 48, 49, 50, 30, 29, 48, 49, 50, 148, 151, 103, 151, 105, 7, 29, 150, 151, 152, 29, 15, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 12, 55, 72, 10, 15, 1, 15, 151, 78, 29, 151, 155, 82, 67, 155, 85, 86, 87, 30, 89, 30, 91, 29, 93, 32, 33, 96, 8, 9, 10, 100, 101, 102, 30, 30, 30, 106, 107, 1, 30, 110, 67, 68, 113, 114, 73, 74, 30, 29, 73, 74, 121, 98, 99, 30, 108, 109, 150, 151, 32, 150, 151, 150, 151, 36, 55, 67, 30, 68, 68, 68, 75, 78, 78, 68, 68, 72, 69, 80, 68, 150, 151, 78, 68, 68, 88, 82, 103, 103, 85, 86, 87, 78, 89, 111, 91, 83, 93, 80, 87, 96, 80, 125, 83, 100, 101, 102, 125, 129, 72, 106, 107, 1, 90, 110, 78, 94, 113, 114, 82, 95, 92, 85, 86, 87, 121, 89, 95, 91, 95, 93, 95, 97, 96, 148, 97, 149, 100, 101, 102, -1, 30, 112, 106, 107, 1, -1, 110, -1, -1, 113, 114, -1, -1, 150, 151, 130, -1, 121, 128, -1, 128, -1, -1, -1, -1, -1, -1, -1, 130, 130, 130, -1, 131, 30, -1, -1, -1, -1, -1, -1, -1, -1, 72, 141, 141, -1, 150, 151, 78, 144, 144, 1, 82, 144, 144, 85, 86, 87, 144, 89, 144, 91, 144, 93, 144, 148, 96, 148, 153, 148, 100, 101, 102, 148, 148, 72, 106, 107, 148, 148, 110, 78, 150, 113, 114, 82, 150, 150, 85, 86, 87, 121, 89, 150, 91, 150, 93, 150, 150, 96, 150, 150, 150, 100, 101, 102, 150, 150, 150, 106, 107, 150, 150, 110, 150, 150, 113, 114, 150, 150, 150, 151, 72, 150, 121, 150, 150, 150, 78, 150, 150, 150, 82, 150, 150, 85, 86, 87, 151, 89, 151, 91, 151, 93, 151, 151, 96, 151, 30, 151, 100, 101, 102, 150, 151, 151, 106, 107, 151, 151, 110, 151, 151, 113, 114, 151, 48, 49, 151, 151, 151, 121, 54, 152, 56, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 68, 152, 152, 152, 152, 48, 49, 152, 76, 77, 152, 54, 80, 56, 150, 151, 84, 152, 152, 152, 152, 152, 152, 152, 152, 68, 152, 152, 152, 152, 152, 152, 152, 76, 77, 153, 153, 80, 153, 153, 153, 84, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, -1, 154, 154, 154, 154, 154, 154, 154, 154, 132, 154, 134, 135, 136, 137, 138, 139, 140, 154, 154, 154, 154, 154, 146, 147, 154, 154, 154, 154, 154, 153, 155, 155, 154, 132, 154, 134, 135, 136, 137, 138, 139, 140, 156, 156, -1, 157, 157, 146, 147, 157, 157, 157, 157, 157, 153, 157, 155, 157, -1, 157, 157, 157, 157, 157, 157, -1, 158);
    protected $actionBase = array(0, 223, 299, 375, 451, 102, 102, 311, 754, -2, -2, 147, -2, -2, -2, 633, 740, 773, 740, 559, 666, 820, 820, 820, 186, 334, 334, 334, 357, 892, 443, 33, 233, 409, 617, 520, 527, 240, 240, 240, 240, 136, 136, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 181, 73, 305, 217, 743, 745, 746, 747, 884, 665, 885, 823, 824, 653, 825, 826, 827, 828, 830, 822, 831, 919, 832, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 47, 561, 218, 312, 277, 471, 648, 648, 648, 648, 648, 648, 648, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 398, 571, 571, 571, 622, 888, 609, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 499, -21, -21, 484, 656, 408, 621, 209, 396, 200, 25, 25, 25, 25, 25, 245, 16, 4, 4, 4, 4, 339, 123, 123, 123, 123, 119, 119, 119, 119, 69, 307, 307, 671, 671, 637, 781, 538, 538, 543, 543, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 24, 627, 857, 300, 300, 300, 300, 177, 177, 177, 43, 414, 673, 920, 43, 327, 327, 327, 452, 452, 452, 362, 649, 210, 331, 331, 331, 331, 210, 331, 331, 493, 493, 493, 485, 446, 642, 365, 488, 373, 390, 664, 814, 667, 821, 541, 690, 118, 700, 701, 887, 613, 887, 601, 605, 576, 676, 392, 850, 48, 181, 539, 444, 639, 749, 361, 751, 320, 384, 368, 536, 363, 244, 784, 753, 886, 890, 180, 670, 639, 639, 639, 153, 404, 787, 788, 363, -8, 603, 603, 603, 603, 833, 789, 603, 603, 603, 603, 834, 835, 253, 412, 836, 281, 750, 623, 623, 624, 624, 623, 623, 623, 623, 650, 657, 623, 839, 685, 685, 624, 647, 624, 650, 657, 842, 842, 842, 842, 624, 657, 624, 624, 623, 624, 685, 685, 657, 637, 685, 68, 657, 660, 623, 662, 662, 842, 707, 713, 624, 624, 608, 685, 685, 685, 608, 657, 842, 612, 616, 338, 685, 842, 632, 647, 632, 612, 657, 632, 647, 647, 632, 20, 619, 629, 841, 843, 855, 759, 606, 611, 848, 849, 845, 847, 838, 646, 696, 715, 717, 480, 630, 631, 635, 636, 679, 640, 668, 613, 695, 628, 628, 628, 655, 680, 655, 628, 628, 628, 628, 628, 628, 628, 628, 900, 675, 688, 669, 641, 718, 531, 615, 663, 553, 761, 672, 696, 696, 793, 878, 863, 898, 899, 643, 850, 876, 655, 901, 702, 230, 567, 851, 791, 687, 689, 655, 852, 655, 763, 655, 879, 794, 645, 795, 696, 796, 628, 882, 904, 905, 906, 907, 908, 910, 912, 914, 644, 915, 720, 626, 864, 344, 846, 676, 684, 691, 721, 797, 380, 916, 798, 655, 655, 764, 757, 655, 766, 722, 706, 860, 726, 865, 917, 672, 867, 655, 614, 799, 918, 380, 634, 625, 858, 651, 727, 856, 883, 854, 768, 590, 618, 800, 801, 802, 638, 728, 861, 862, 859, 731, 774, 620, 777, 658, 803, 778, 853, 732, 805, 806, 877, 654, 695, 686, 659, 661, 652, 780, 807, 875, 734, 735, 738, 808, 739, 811, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 136, 136, 136, -2, -2, -2, -2, 0, 0, -2, 0, 0, 0, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 0, 0, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 575, -21, -21, -21, -21, 575, -21, -21, -21, -21, -21, -21, -21, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, -21, 575, 575, 575, -21, 101, -21, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 575, 0, 0, 575, -21, 575, -21, 575, -21, 575, 575, 575, 575, 575, 575, -21, -21, -21, -21, -21, -21, 0, 327, 327, 327, 327, -21, -21, -21, -21, -37, 101, 101, 101, 101, 101, 101, 327, 327, 452, 452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, -37, 101, 623, 623, 623, 623, 647, 647, 647, 623, 210, 210, 210, 623, 0, 0, 0, 0, 0, 0, 623, 210, 0, 101, 101, 101, 101, 0, 101, 101, 623, 623, 623, 647, 623, 210, 647, 647, 623, 685, 583, 583, 583, 583, 380, 363, 0, 623, 623, 647, 647, 647, 0, 0, 0, 685, 0, 624, 0, 0, 0, 0, 628, 230, 0, 528, 0, 0, 0, 0, 0, 0, 643, 528, 592, 592, 0, 644, 628, 628, 628, 0, 0, 643, 643, 0, 0, 0, 0, 0, 0, 566, 643, 0, 0, 0, 0, 566, 517, 0, 0, 517, 0, 380);
    protected $actionDefault = array(3, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 533, 533, 488, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 293, 293, 293, 32767, 32767, 32767, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 32767, 32767, 32767, 32767, 32767, 376, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 382, 538, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 357, 358, 360, 361, 292, 541, 522, 241, 383, 537, 291, 243, 321, 492, 32767, 32767, 32767, 323, 120, 252, 197, 491, 123, 290, 228, 375, 377, 322, 297, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 296, 448, 354, 353, 352, 450, 32767, 449, 485, 485, 488, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 319, 476, 475, 320, 446, 324, 447, 326, 451, 325, 342, 343, 340, 341, 344, 453, 452, 469, 470, 467, 468, 295, 345, 346, 347, 348, 471, 472, 473, 474, 276, 32767, 32767, 532, 532, 32767, 32767, 333, 334, 460, 461, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 277, 32767, 232, 232, 232, 232, 32767, 32767, 32767, 232, 32767, 32767, 32767, 32767, 328, 329, 327, 455, 456, 454, 32767, 422, 32767, 32767, 32767, 32767, 32767, 424, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 493, 32767, 32767, 32767, 32767, 32767, 506, 411, 32767, 32767, 32767, 404, 32767, 216, 218, 165, 479, 32767, 32767, 32767, 32767, 32767, 511, 338, 32767, 32767, 32767, 32767, 32767, 548, 32767, 506, 32767, 32767, 32767, 32767, 32767, 32767, 351, 330, 331, 332, 32767, 32767, 32767, 32767, 510, 504, 463, 464, 465, 466, 32767, 32767, 457, 458, 459, 462, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 169, 32767, 419, 425, 425, 32767, 32767, 32767, 32767, 169, 32767, 32767, 32767, 32767, 32767, 169, 32767, 32767, 32767, 32767, 509, 508, 169, 32767, 405, 487, 169, 182, 32767, 180, 180, 32767, 202, 202, 32767, 32767, 184, 480, 499, 32767, 184, 169, 32767, 393, 171, 487, 32767, 32767, 234, 32767, 234, 393, 169, 234, 32767, 32767, 234, 32767, 85, 429, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 406, 32767, 32767, 32767, 372, 373, 482, 495, 32767, 496, 32767, 404, 32767, 336, 337, 339, 316, 32767, 318, 362, 363, 364, 365, 366, 367, 368, 370, 32767, 409, 32767, 412, 32767, 32767, 32767, 87, 112, 251, 32767, 546, 87, 407, 32767, 32767, 300, 546, 32767, 32767, 32767, 32767, 540, 32767, 32767, 294, 32767, 32767, 32767, 87, 87, 247, 32767, 167, 32767, 530, 32767, 547, 32767, 504, 408, 32767, 335, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 505, 32767, 32767, 32767, 32767, 223, 32767, 442, 32767, 87, 32767, 32767, 183, 32767, 32767, 298, 242, 32767, 32767, 539, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 168, 32767, 32767, 32767, 185, 32767, 32767, 504, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 289, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 504, 32767, 32767, 227, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 85, 60, 32767, 270, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 125, 125, 3, 125, 125, 254, 3, 254, 125, 254, 254, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 210, 213, 202, 202, 162, 125, 125, 262);
    protected $goto = array(165, 138, 138, 138, 165, 143, 146, 139, 140, 141, 148, 186, 167, 162, 162, 162, 162, 143, 143, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 158, 159, 160, 161, 183, 137, 184, 501, 502, 365, 503, 507, 508, 509, 510, 511, 512, 513, 514, 977, 142, 163, 144, 145, 147, 170, 175, 185, 202, 251, 254, 256, 258, 260, 261, 262, 263, 264, 265, 273, 274, 275, 276, 288, 289, 317, 318, 319, 381, 382, 383, 557, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 149, 150, 151, 166, 152, 168, 153, 203, 169, 154, 155, 156, 204, 157, 135, 634, 575, 760, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 1116, 766, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 505, 505, 505, 505, 505, 505, 516, 642, 516, 767, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 517, 797, 517, 898, 898, 1207, 1207, 531, 589, 617, 862, 862, 862, 862, 173, 857, 863, 1092, 1091, 176, 177, 178, 390, 391, 392, 393, 172, 201, 205, 207, 255, 257, 259, 266, 267, 268, 269, 270, 271, 277, 278, 279, 280, 290, 291, 320, 321, 322, 396, 397, 398, 399, 174, 179, 252, 253, 180, 181, 182, 389, 619, 550, 550, 582, 546, 598, 765, 613, 614, 548, 548, 504, 506, 537, 554, 583, 586, 596, 603, 884, 866, 864, 866, 668, 828, 519, 893, 888, 574, 344, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 559, 560, 561, 562, 563, 564, 565, 566, 568, 599, 522, 558, 330, 315, 1219, 1219, 530, 592, 595, 640, 527, 527, 527, 868, 527, 600, 347, 406, 530, 530, 1219, 440, 440, 440, 440, 440, 440, 545, 527, 551, 954, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 1081, 1211, 1081, 905, 905, 905, 905, 3, 4, 623, 905, 955, 626, 556, 905, 363, 1185, 581, 1185, 916, 371, 371, 371, 366, 1081, 1081, 1081, 1081, 790, 1081, 1081, 371, 371, 1184, 607, 1184, 1177, 371, 1165, 471, 1201, 1201, 1201, 527, 527, 371, 1233, 544, 576, 527, 527, 618, 1074, 527, 1204, 790, 790, 378, 1025, 922, 524, 922, 518, 902, 518, 911, 350, 1183, 975, 400, 528, 543, 786, 669, 570, 372, 376, 920, 604, 784, 555, 895, 624, 625, 891, 629, 630, 637, 639, 644, 646, 453, 455, 947, 645, 673, 1097, 404, 1117, 627, 945, 1199, 1199, 1199, 1035, 19, 15, 359, 1218, 1218, 1067, 872, 783, 783, 794, 963, 791, 791, 791, 793, 1072, 925, 782, 456, 1218, 569, 345, 346, 360, 524, 1077, 1078, 1221, 1162, 1074, 535, 23, 587, 469, 547, 0, 615, 373, 373, 373, 0, 0, 1075, 1176, 1075, 0, 0, 542, 0, 460, 0, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 373, 0, 0, 622, 388, 0, 0, 0, 1073, 631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 521, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 521, 0, 541, 0, 0, 0, 0, 0, 536, 520, 0, 525, 443, 0, 445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 789, 1226);
    protected $gotoCheck = array(42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 56, 66, 5, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 124, 14, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 115, 115, 115, 115, 115, 115, 66, 8, 66, 15, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 28, 115, 74, 74, 74, 74, 99, 39, 39, 66, 66, 66, 66, 26, 66, 66, 122, 122, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 50, 50, 50, 50, 50, 50, 64, 13, 64, 64, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 13, 13, 13, 13, 13, 49, 13, 13, 13, 56, 69, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 10, 46, 123, 123, 140, 140, 46, 59, 59, 59, 10, 10, 10, 32, 10, 67, 67, 67, 46, 46, 140, 56, 56, 56, 56, 56, 56, 10, 10, 107, 95, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 138, 56, 56, 56, 56, 56, 29, 29, 60, 56, 95, 60, 2, 56, 60, 116, 2, 116, 81, 12, 12, 12, 45, 56, 56, 56, 56, 22, 56, 56, 12, 12, 117, 125, 117, 79, 12, 129, 56, 117, 117, 117, 10, 10, 12, 12, 10, 10, 10, 10, 48, 79, 10, 136, 22, 22, 47, 100, 12, 12, 12, 120, 76, 120, 78, 17, 117, 99, 21, 10, 31, 24, 31, 31, 11, 16, 82, 31, 23, 10, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 7, 7, 7, 7, 71, 33, 20, 7, 7, 7, 8, 8, 8, 33, 33, 33, 33, 139, 139, 111, 68, 22, 22, 25, 97, 22, 22, 22, 22, 113, 83, 22, 62, 139, 33, 69, 69, 57, 12, 79, 79, 139, 128, 79, 57, 33, 63, 106, 57, -1, 33, 121, 121, 121, -1, -1, 79, 79, 79, -1, -1, 8, -1, 57, -1, 79, -1, -1, -1, -1, -1, -1, -1, -1, 57, -1, -1, -1, 121, -1, -1, 12, 121, -1, -1, -1, 12, 12, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8, -1, 8, -1, -1, -1, -1, -1, 99, 8, -1, 8, 8, -1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8, 8);
    protected $gotoBase = array(0, 0, -230, 0, 0, 102, 0, 492, 198, 0, 42, 144, 113, 286, 156, 209, 132, 149, 0, 0, 95, 141, 111, 134, 143, 99, 30, 0, 213, -260, 0, -171, 358, 84, 0, 0, 0, 0, 0, 192, 0, 0, -24, 0, 0, 389, 342, 170, 174, 288, -1, 0, 0, 0, 0, 0, 104, 103, 0, 66, -51, 0, 83, 87, -367, 0, -94, 53, 94, -138, 0, 139, 0, 0, -57, 0, 157, 0, 155, 100, 0, 397, 129, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 0, 97, 0, 188, 160, 0, 0, 0, 0, 0, 77, 368, 311, 0, 0, 96, 0, 101, 0, -80, 120, 137, 0, 0, 166, 239, -71, 43, -49, 231, 0, 0, 78, 234, 0, 0, 0, 0, 0, 0, 175, 0, 380, 200, 55, 0, 0);
    protected $gotoDefault = array(-32768, 473, 677, 2, 678, 750, 758, 610, 487, 643, 488, 523, 1195, 803, 804, 805, 368, 414, 489, 367, 401, 394, 792, 785, 787, 795, 171, 402, 798, 1, 800, 529, 836, 1026, 355, 808, 356, 602, 810, 539, 812, 813, 136, 369, 370, 540, 490, 377, 590, 827, 272, 374, 829, 357, 830, 839, 358, 470, 465, 571, 621, 435, 452, 584, 578, 549, 1089, 579, 871, 343, 879, 674, 887, 890, 491, 572, 901, 457, 909, 1102, 384, 915, 921, 926, 281, 929, 415, 403, 597, 934, 935, 7, 939, 635, 636, 8, 303, 962, 611, 976, 420, 1045, 1047, 492, 493, 533, 464, 515, 538, 494, 1068, 446, 405, 1071, 495, 496, 436, 437, 1086, 349, 1170, 348, 454, 314, 1157, 593, 1121, 461, 1210, 1166, 342, 497, 498, 364, 1189, 379, 1205, 441, 1212, 1220, 338, 553, 580);
    protected $ruleToNonTerminal = array(0, 1, 3, 3, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 8, 9, 10, 10, 11, 12, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 17, 17, 18, 18, 18, 18, 20, 20, 16, 16, 21, 21, 22, 22, 23, 23, 24, 24, 19, 19, 25, 27, 27, 28, 29, 29, 31, 30, 30, 30, 30, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 13, 13, 53, 53, 55, 54, 54, 47, 47, 57, 57, 58, 58, 14, 15, 15, 15, 61, 61, 61, 62, 62, 65, 65, 63, 63, 67, 67, 40, 40, 49, 49, 52, 52, 52, 51, 51, 68, 41, 41, 41, 41, 69, 69, 70, 70, 71, 71, 38, 38, 34, 34, 72, 36, 36, 73, 35, 35, 37, 37, 48, 48, 48, 59, 59, 75, 75, 76, 76, 78, 78, 78, 77, 77, 60, 60, 79, 79, 79, 80, 80, 81, 81, 81, 43, 43, 82, 82, 82, 44, 44, 83, 83, 84, 84, 64, 85, 85, 85, 85, 90, 90, 91, 91, 92, 92, 92, 92, 92, 93, 94, 94, 89, 89, 86, 86, 88, 88, 96, 96, 95, 95, 95, 95, 95, 95, 87, 87, 98, 97, 97, 45, 45, 39, 39, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 33, 33, 46, 46, 103, 103, 104, 104, 104, 104, 110, 99, 99, 106, 106, 112, 112, 113, 114, 114, 114, 114, 114, 114, 66, 66, 56, 56, 56, 100, 100, 118, 118, 115, 115, 119, 119, 119, 119, 101, 101, 101, 105, 105, 105, 111, 111, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 26, 26, 26, 26, 26, 26, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 109, 109, 102, 102, 102, 102, 125, 125, 128, 128, 127, 127, 129, 129, 50, 50, 50, 50, 131, 131, 130, 130, 130, 130, 130, 132, 132, 117, 117, 120, 120, 116, 116, 134, 133, 133, 133, 133, 121, 121, 121, 121, 108, 108, 122, 122, 122, 122, 74, 135, 135, 136, 136, 136, 107, 107, 137, 137, 138, 138, 138, 138, 138, 123, 123, 123, 123, 140, 141, 139, 139, 139, 139, 139, 139, 139, 142, 142, 142);
    protected $ruleToLength = array(1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 5, 4, 3, 4, 2, 3, 1, 1, 7, 8, 6, 7, 3, 1, 3, 1, 3, 1, 1, 3, 1, 2, 1, 2, 3, 1, 3, 3, 1, 3, 2, 0, 1, 1, 1, 1, 1, 3, 5, 8, 3, 5, 9, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 1, 2, 2, 5, 7, 9, 5, 6, 3, 3, 2, 2, 1, 1, 1, 0, 2, 8, 0, 4, 1, 3, 0, 1, 0, 1, 10, 7, 6, 5, 1, 2, 2, 0, 2, 0, 2, 0, 2, 1, 3, 1, 4, 1, 4, 1, 1, 4, 1, 3, 3, 3, 4, 4, 5, 0, 2, 4, 3, 1, 1, 1, 4, 0, 2, 3, 0, 2, 4, 0, 2, 0, 3, 1, 2, 1, 1, 0, 1, 3, 4, 6, 1, 1, 1, 0, 1, 0, 2, 2, 3, 3, 1, 3, 1, 2, 2, 3, 1, 1, 2, 4, 3, 1, 1, 3, 2, 0, 1, 3, 3, 9, 3, 1, 3, 0, 2, 4, 5, 4, 4, 4, 3, 1, 1, 1, 3, 1, 1, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 3, 3, 1, 0, 1, 1, 3, 3, 4, 4, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 5, 4, 3, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 3, 2, 1, 2, 10, 11, 3, 3, 2, 4, 4, 3, 4, 4, 4, 4, 7, 3, 2, 0, 4, 1, 3, 2, 2, 4, 6, 2, 2, 4, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 3, 3, 4, 4, 0, 2, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 3, 1, 4, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 4, 3, 1, 3, 1, 1, 3, 3, 0, 2, 0, 1, 3, 1, 3, 1, 1, 1, 1, 1, 6, 4, 3, 4, 2, 4, 4, 1, 3, 1, 2, 1, 1, 4, 1, 1, 3, 6, 4, 4, 4, 4, 1, 4, 0, 1, 1, 3, 1, 1, 4, 3, 1, 1, 1, 0, 0, 2, 3, 1, 3, 1, 4, 2, 2, 2, 2, 1, 2, 1, 1, 1, 4, 3, 3, 3, 6, 3, 1, 1, 1);
    protected function initReduceCallbacks()
    {
        $this->reduceCallbacks = [0 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 1 => function ($stackPos) {
            $this->semValue = $this->handleNamespaces($this->semStack[$stackPos - (1 - 1)]);
        }, 2 => function ($stackPos) {
            if (\is_array($this->semStack[$stackPos - (2 - 2)])) {
                $this->semValue = \array_merge($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]);
            } else {
                $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)];
                $this->semValue = $this->semStack[$stackPos - (2 - 1)];
            }
        }, 3 => function ($stackPos) {
            $this->semValue = array();
        }, 4 => function ($stackPos) {
            $startAttributes = $this->lookaheadStartAttributes;
            if (isset($startAttributes['comments'])) {
                $nop = new \PhpParser\Node\Stmt\Nop($this->createZeroLengthAttributes($startAttributes));
            } else {
                $nop = null;
            }
            if ($nop !== null) {
                $this->semStack[$stackPos - (1 - 1)][] = $nop;
            }
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 5 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 6 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 7 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 8 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 9 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 10 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 11 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 12 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 13 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 14 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 15 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 16 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 17 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 18 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 19 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 20 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 21 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 22 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 23 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 24 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 25 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 26 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 27 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 28 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 29 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 30 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 31 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 32 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 33 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 34 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 35 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 36 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 37 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 38 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 39 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 40 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 41 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 42 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 43 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 44 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 45 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 46 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 47 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 48 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 49 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 50 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 51 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 52 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 53 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 54 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 55 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 56 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 57 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 58 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 59 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 60 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 61 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 62 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 63 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 64 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 65 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 66 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 67 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 68 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 69 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 70 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 71 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 72 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 73 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 74 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 75 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 76 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 77 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 78 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 79 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 80 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 81 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 82 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 83 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 84 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 85 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 86 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 87 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 88 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Variable(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 89 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 90 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 91 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 92 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\HaltCompiler($this->lexer->handleHaltCompiler(), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 93 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Namespace_($this->semStack[$stackPos - (3 - 2)], null, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
            $this->semValue->setAttribute('kind', \PhpParser\Node\Stmt\Namespace_::KIND_SEMICOLON);
            $this->checkNamespace($this->semValue);
        }, 94 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Namespace_($this->semStack[$stackPos - (5 - 2)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes);
            $this->semValue->setAttribute('kind', \PhpParser\Node\Stmt\Namespace_::KIND_BRACED);
            $this->checkNamespace($this->semValue);
        }, 95 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Namespace_(null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
            $this->semValue->setAttribute('kind', \PhpParser\Node\Stmt\Namespace_::KIND_BRACED);
            $this->checkNamespace($this->semValue);
        }, 96 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Use_($this->semStack[$stackPos - (3 - 2)], \PhpParser\Node\Stmt\Use_::TYPE_NORMAL, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 97 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Use_($this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 98 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 99 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Const_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 100 => function ($stackPos) {
            $this->semValue = \PhpParser\Node\Stmt\Use_::TYPE_FUNCTION;
        }, 101 => function ($stackPos) {
            $this->semValue = \PhpParser\Node\Stmt\Use_::TYPE_CONSTANT;
        }, 102 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\GroupUse(new \PhpParser\Node\Name($this->semStack[$stackPos - (7 - 3)], $this->startAttributeStack[$stackPos - (7 - 3)] + $this->endAttributeStack[$stackPos - (7 - 3)]), $this->semStack[$stackPos - (7 - 6)], $this->semStack[$stackPos - (7 - 2)], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes);
        }, 103 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\GroupUse(new \PhpParser\Node\Name($this->semStack[$stackPos - (8 - 4)], $this->startAttributeStack[$stackPos - (8 - 4)] + $this->endAttributeStack[$stackPos - (8 - 4)]), $this->semStack[$stackPos - (8 - 7)], $this->semStack[$stackPos - (8 - 2)], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes);
        }, 104 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\GroupUse(new \PhpParser\Node\Name($this->semStack[$stackPos - (6 - 2)], $this->startAttributeStack[$stackPos - (6 - 2)] + $this->endAttributeStack[$stackPos - (6 - 2)]), $this->semStack[$stackPos - (6 - 5)], \PhpParser\Node\Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes);
        }, 105 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\GroupUse(new \PhpParser\Node\Name($this->semStack[$stackPos - (7 - 3)], $this->startAttributeStack[$stackPos - (7 - 3)] + $this->endAttributeStack[$stackPos - (7 - 3)]), $this->semStack[$stackPos - (7 - 6)], \PhpParser\Node\Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes);
        }, 106 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 107 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 108 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 109 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 110 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 111 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 112 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\UseUse($this->semStack[$stackPos - (1 - 1)], null, \PhpParser\Node\Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
            $this->checkUseUse($this->semValue, $stackPos - (1 - 1));
        }, 113 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\UseUse($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], \PhpParser\Node\Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
            $this->checkUseUse($this->semValue, $stackPos - (3 - 3));
        }, 114 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 115 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 2)];
        }, 116 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
            $this->semValue->type = \PhpParser\Node\Stmt\Use_::TYPE_NORMAL;
        }, 117 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 2)];
            $this->semValue->type = $this->semStack[$stackPos - (2 - 1)];
        }, 118 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 119 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 120 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Const_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 121 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 122 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 123 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Const_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 124 => function ($stackPos) {
            if (\is_array($this->semStack[$stackPos - (2 - 2)])) {
                $this->semValue = \array_merge($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]);
            } else {
                $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)];
                $this->semValue = $this->semStack[$stackPos - (2 - 1)];
            }
        }, 125 => function ($stackPos) {
            $this->semValue = array();
        }, 126 => function ($stackPos) {
            $startAttributes = $this->lookaheadStartAttributes;
            if (isset($startAttributes['comments'])) {
                $nop = new \PhpParser\Node\Stmt\Nop($this->createZeroLengthAttributes($startAttributes));
            } else {
                $nop = null;
            }
            if ($nop !== null) {
                $this->semStack[$stackPos - (1 - 1)][] = $nop;
            }
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 127 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 128 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 129 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 130 => function ($stackPos) {
            throw new \PhpParser\Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 131 => function ($stackPos) {
            if ($this->semStack[$stackPos - (3 - 2)]) {
                $this->semValue = $this->semStack[$stackPos - (3 - 2)];
                $attrs = $this->startAttributeStack[$stackPos - (3 - 1)];
                $stmts = $this->semValue;
                if (!empty($attrs['comments'])) {
                    $stmts[0]->setAttribute('comments', \array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', [])));
                }
            } else {
                $startAttributes = $this->startAttributeStack[$stackPos - (3 - 1)];
                if (isset($startAttributes['comments'])) {
                    $this->semValue = new \PhpParser\Node\Stmt\Nop($startAttributes + $this->endAttributes);
                } else {
                    $this->semValue = null;
                }
                if (null === $this->semValue) {
                    $this->semValue = array();
                }
            }
        }, 132 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\If_($this->semStack[$stackPos - (5 - 2)], ['stmts' => \is_array($this->semStack[$stackPos - (5 - 3)]) ? $this->semStack[$stackPos - (5 - 3)] : array($this->semStack[$stackPos - (5 - 3)]), 'elseifs' => $this->semStack[$stackPos - (5 - 4)], 'else' => $this->semStack[$stackPos - (5 - 5)]], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes);
        }, 133 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\If_($this->semStack[$stackPos - (8 - 2)], ['stmts' => $this->semStack[$stackPos - (8 - 4)], 'elseifs' => $this->semStack[$stackPos - (8 - 5)], 'else' => $this->semStack[$stackPos - (8 - 6)]], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes);
        }, 134 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\While_($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 135 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Do_($this->semStack[$stackPos - (5 - 4)], \is_array($this->semStack[$stackPos - (5 - 2)]) ? $this->semStack[$stackPos - (5 - 2)] : array($this->semStack[$stackPos - (5 - 2)]), $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes);
        }, 136 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\For_(['init' => $this->semStack[$stackPos - (9 - 3)], 'cond' => $this->semStack[$stackPos - (9 - 5)], 'loop' => $this->semStack[$stackPos - (9 - 7)], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes);
        }, 137 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Switch_($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 138 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Break_(null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 139 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Break_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 140 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Continue_(null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 141 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Continue_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 142 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Return_(null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 143 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Return_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 144 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Global_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 145 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Static_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 146 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Echo_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 147 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\InlineHTML($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 148 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Expression($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 149 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Expression($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 150 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Unset_($this->semStack[$stackPos - (5 - 3)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes);
        }, 151 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Foreach_($this->semStack[$stackPos - (7 - 3)], $this->semStack[$stackPos - (7 - 5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos - (7 - 5)][1], 'stmts' => $this->semStack[$stackPos - (7 - 7)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes);
        }, 152 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Foreach_($this->semStack[$stackPos - (9 - 3)], $this->semStack[$stackPos - (9 - 7)][0], ['keyVar' => $this->semStack[$stackPos - (9 - 5)], 'byRef' => $this->semStack[$stackPos - (9 - 7)][1], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes);
        }, 153 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Declare_($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes);
        }, 154 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\TryCatch($this->semStack[$stackPos - (6 - 3)], $this->semStack[$stackPos - (6 - 5)], $this->semStack[$stackPos - (6 - 6)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes);
            $this->checkTryCatch($this->semValue);
        }, 155 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Throw_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 156 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Goto_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 157 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Label($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 158 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Expression($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 159 => function ($stackPos) {
            $this->semValue = array();
            /* means: no statement */
        }, 160 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 161 => function ($stackPos) {
            $startAttributes = $this->startAttributeStack[$stackPos - (1 - 1)];
            if (isset($startAttributes['comments'])) {
                $this->semValue = new \PhpParser\Node\Stmt\Nop($startAttributes + $this->endAttributes);
            } else {
                $this->semValue = null;
            }
            if ($this->semValue === null) {
                $this->semValue = array();
            }
            /* means: no statement */
        }, 162 => function ($stackPos) {
            $this->semValue = array();
        }, 163 => function ($stackPos) {
            $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)];
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 164 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Catch_(array($this->semStack[$stackPos - (8 - 3)]), $this->semStack[$stackPos - (8 - 4)], $this->semStack[$stackPos - (8 - 7)], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes);
        }, 165 => function ($stackPos) {
            $this->semValue = null;
        }, 166 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Finally_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 167 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 168 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 169 => function ($stackPos) {
            $this->semValue = \false;
        }, 170 => function ($stackPos) {
            $this->semValue = \true;
        }, 171 => function ($stackPos) {
            $this->semValue = \false;
        }, 172 => function ($stackPos) {
            $this->semValue = \true;
        }, 173 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Function_($this->semStack[$stackPos - (10 - 3)], ['byRef' => $this->semStack[$stackPos - (10 - 2)], 'params' => $this->semStack[$stackPos - (10 - 5)], 'returnType' => $this->semStack[$stackPos - (10 - 7)], 'stmts' => $this->semStack[$stackPos - (10 - 9)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes);
        }, 174 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Class_($this->semStack[$stackPos - (7 - 2)], ['type' => $this->semStack[$stackPos - (7 - 1)], 'extends' => $this->semStack[$stackPos - (7 - 3)], 'implements' => $this->semStack[$stackPos - (7 - 4)], 'stmts' => $this->semStack[$stackPos - (7 - 6)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes);
            $this->checkClass($this->semValue, $stackPos - (7 - 2));
        }, 175 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Interface_($this->semStack[$stackPos - (6 - 2)], ['extends' => $this->semStack[$stackPos - (6 - 3)], 'stmts' => $this->semStack[$stackPos - (6 - 5)]], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes);
            $this->checkInterface($this->semValue, $stackPos - (6 - 2));
        }, 176 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Trait_($this->semStack[$stackPos - (5 - 2)], ['stmts' => $this->semStack[$stackPos - (5 - 4)]], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes);
        }, 177 => function ($stackPos) {
            $this->semValue = 0;
        }, 178 => function ($stackPos) {
            $this->semValue = \PhpParser\Node\Stmt\Class_::MODIFIER_ABSTRACT;
        }, 179 => function ($stackPos) {
            $this->semValue = \PhpParser\Node\Stmt\Class_::MODIFIER_FINAL;
        }, 180 => function ($stackPos) {
            $this->semValue = null;
        }, 181 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 2)];
        }, 182 => function ($stackPos) {
            $this->semValue = array();
        }, 183 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 2)];
        }, 184 => function ($stackPos) {
            $this->semValue = array();
        }, 185 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 2)];
        }, 186 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 187 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 188 => function ($stackPos) {
            $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]);
        }, 189 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (4 - 2)];
        }, 190 => function ($stackPos) {
            $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]);
        }, 191 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (4 - 2)];
        }, 192 => function ($stackPos) {
            $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]);
        }, 193 => function ($stackPos) {
            $this->semValue = null;
        }, 194 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (4 - 2)];
        }, 195 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 196 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 197 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\DeclareDeclare($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 198 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (3 - 2)];
        }, 199 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (4 - 3)];
        }, 200 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (4 - 2)];
        }, 201 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (5 - 3)];
        }, 202 => function ($stackPos) {
            $this->semValue = array();
        }, 203 => function ($stackPos) {
            $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)];
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 204 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Case_($this->semStack[$stackPos - (4 - 2)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 205 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Case_(null, $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 206 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 207 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 208 => function ($stackPos) {
            $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]);
        }, 209 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (4 - 2)];
        }, 210 => function ($stackPos) {
            $this->semValue = array();
        }, 211 => function ($stackPos) {
            $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)];
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 212 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\ElseIf_($this->semStack[$stackPos - (3 - 2)], \is_array($this->semStack[$stackPos - (3 - 3)]) ? $this->semStack[$stackPos - (3 - 3)] : array($this->semStack[$stackPos - (3 - 3)]), $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 213 => function ($stackPos) {
            $this->semValue = array();
        }, 214 => function ($stackPos) {
            $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)];
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 215 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\ElseIf_($this->semStack[$stackPos - (4 - 2)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 216 => function ($stackPos) {
            $this->semValue = null;
        }, 217 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Else_(\is_array($this->semStack[$stackPos - (2 - 2)]) ? $this->semStack[$stackPos - (2 - 2)] : array($this->semStack[$stackPos - (2 - 2)]), $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 218 => function ($stackPos) {
            $this->semValue = null;
        }, 219 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Else_($this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 220 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false);
        }, 221 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (2 - 2)], \true);
        }, 222 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false);
        }, 223 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 224 => function ($stackPos) {
            $this->semValue = array();
        }, 225 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 226 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 227 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Param($this->semStack[$stackPos - (4 - 4)], null, $this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 2)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
            $this->checkParam($this->semValue);
        }, 228 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Param($this->semStack[$stackPos - (6 - 4)], $this->semStack[$stackPos - (6 - 6)], $this->semStack[$stackPos - (6 - 1)], $this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 3)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes);
            $this->checkParam($this->semValue);
        }, 229 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 230 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Identifier('array', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 231 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Identifier('callable', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 232 => function ($stackPos) {
            $this->semValue = null;
        }, 233 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 234 => function ($stackPos) {
            $this->semValue = null;
        }, 235 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 2)];
        }, 236 => function ($stackPos) {
            $this->semValue = array();
        }, 237 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (3 - 2)];
        }, 238 => function ($stackPos) {
            $this->semValue = array(new \PhpParser\Node\Arg($this->semStack[$stackPos - (3 - 2)], \false, \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes));
        }, 239 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 240 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 241 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Arg($this->semStack[$stackPos - (1 - 1)], \false, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 242 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Arg($this->semStack[$stackPos - (2 - 2)], \true, \false, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 243 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Arg($this->semStack[$stackPos - (2 - 2)], \false, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 244 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 245 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 246 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 247 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Variable($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 248 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Variable($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 249 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 250 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 251 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\StaticVar($this->semStack[$stackPos - (1 - 1)], null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 252 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\StaticVar($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 253 => function ($stackPos) {
            if ($this->semStack[$stackPos - (2 - 2)] !== null) {
                $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)];
                $this->semValue = $this->semStack[$stackPos - (2 - 1)];
            }
        }, 254 => function ($stackPos) {
            $this->semValue = array();
        }, 255 => function ($stackPos) {
            $startAttributes = $this->lookaheadStartAttributes;
            if (isset($startAttributes['comments'])) {
                $nop = new \PhpParser\Node\Stmt\Nop($this->createZeroLengthAttributes($startAttributes));
            } else {
                $nop = null;
            }
            if ($nop !== null) {
                $this->semStack[$stackPos - (1 - 1)][] = $nop;
            }
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 256 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\Property($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
            $this->checkProperty($this->semValue, $stackPos - (3 - 1));
        }, 257 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\ClassConst($this->semStack[$stackPos - (3 - 2)], 0, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 258 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\ClassMethod($this->semStack[$stackPos - (9 - 4)], ['type' => $this->semStack[$stackPos - (9 - 1)], 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 6)], 'returnType' => $this->semStack[$stackPos - (9 - 8)], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes);
            $this->checkClassMethod($this->semValue, $stackPos - (9 - 1));
        }, 259 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\TraitUse($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 260 => function ($stackPos) {
            $this->semValue = array();
        }, 261 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (3 - 2)];
        }, 262 => function ($stackPos) {
            $this->semValue = array();
        }, 263 => function ($stackPos) {
            $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)];
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 264 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 265 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (5 - 1)][0], $this->semStack[$stackPos - (5 - 1)][1], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes);
        }, 266 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], $this->semStack[$stackPos - (4 - 3)], null, $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 267 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 268 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 269 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]);
        }, 270 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 271 => function ($stackPos) {
            $this->semValue = array(null, $this->semStack[$stackPos - (1 - 1)]);
        }, 272 => function ($stackPos) {
            $this->semValue = null;
        }, 273 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (3 - 2)];
        }, 274 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 275 => function ($stackPos) {
            $this->semValue = 0;
        }, 276 => function ($stackPos) {
            $this->semValue = 0;
        }, 277 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 278 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 279 => function ($stackPos) {
            $this->checkModifier($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2));
            $this->semValue = $this->semStack[$stackPos - (2 - 1)] | $this->semStack[$stackPos - (2 - 2)];
        }, 280 => function ($stackPos) {
            $this->semValue = \PhpParser\Node\Stmt\Class_::MODIFIER_PUBLIC;
        }, 281 => function ($stackPos) {
            $this->semValue = \PhpParser\Node\Stmt\Class_::MODIFIER_PROTECTED;
        }, 282 => function ($stackPos) {
            $this->semValue = \PhpParser\Node\Stmt\Class_::MODIFIER_PRIVATE;
        }, 283 => function ($stackPos) {
            $this->semValue = \PhpParser\Node\Stmt\Class_::MODIFIER_STATIC;
        }, 284 => function ($stackPos) {
            $this->semValue = \PhpParser\Node\Stmt\Class_::MODIFIER_ABSTRACT;
        }, 285 => function ($stackPos) {
            $this->semValue = \PhpParser\Node\Stmt\Class_::MODIFIER_FINAL;
        }, 286 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 287 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 288 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\VarLikeIdentifier(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 289 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\PropertyProperty($this->semStack[$stackPos - (1 - 1)], null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 290 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Stmt\PropertyProperty($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 291 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 292 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 293 => function ($stackPos) {
            $this->semValue = array();
        }, 294 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 295 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 296 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 297 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 298 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignRef($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 299 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignRef($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 300 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 301 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Clone_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 302 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 303 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 304 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 305 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 306 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 307 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 308 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 309 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 310 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 311 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 312 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 313 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 314 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\AssignOp\Coalesce($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 315 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\PostInc($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 316 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\PreInc($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 317 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\PostDec($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 318 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\PreDec($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 319 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\BooleanOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 320 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 321 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\LogicalOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 322 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 323 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\LogicalXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 324 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 325 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 326 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 327 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 328 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 329 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 330 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 331 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 332 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 333 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 334 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 335 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 336 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\UnaryPlus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 337 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\UnaryMinus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 338 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BooleanNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 339 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BitwiseNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 340 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Identical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 341 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\NotIdentical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 342 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Equal($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 343 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\NotEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 344 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Spaceship($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 345 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Smaller($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 346 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 347 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Greater($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 348 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 349 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Instanceof_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 350 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 351 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (3 - 2)];
        }, 352 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Ternary($this->semStack[$stackPos - (5 - 1)], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes);
        }, 353 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Ternary($this->semStack[$stackPos - (4 - 1)], null, $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 354 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Coalesce($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 355 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Isset_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 356 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Empty_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 357 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Include_($this->semStack[$stackPos - (2 - 2)], \PhpParser\Node\Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 358 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Include_($this->semStack[$stackPos - (2 - 2)], \PhpParser\Node\Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 359 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Eval_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 360 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Include_($this->semStack[$stackPos - (2 - 2)], \PhpParser\Node\Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 361 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Include_($this->semStack[$stackPos - (2 - 2)], \PhpParser\Node\Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 362 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Cast\Int_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 363 => function ($stackPos) {
            $attrs = $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes;
            $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos - (2 - 1)]);
            $this->semValue = new \PhpParser\Node\Expr\Cast\Double($this->semStack[$stackPos - (2 - 2)], $attrs);
        }, 364 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Cast\String_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 365 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Cast\Array_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 366 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Cast\Object_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 367 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Cast\Bool_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 368 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Cast\Unset_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 369 => function ($stackPos) {
            $attrs = $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes;
            $attrs['kind'] = \strtolower($this->semStack[$stackPos - (2 - 1)]) === 'exit' ? \PhpParser\Node\Expr\Exit_::KIND_EXIT : \PhpParser\Node\Expr\Exit_::KIND_DIE;
            $this->semValue = new \PhpParser\Node\Expr\Exit_($this->semStack[$stackPos - (2 - 2)], $attrs);
        }, 370 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ErrorSuppress($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 371 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 372 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 373 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 374 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ShellExec($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 375 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Print_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 376 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Yield_(null, null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 377 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\YieldFrom($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 378 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Closure(['static' => \false, 'byRef' => $this->semStack[$stackPos - (10 - 2)], 'params' => $this->semStack[$stackPos - (10 - 4)], 'uses' => $this->semStack[$stackPos - (10 - 6)], 'returnType' => $this->semStack[$stackPos - (10 - 7)], 'stmts' => $this->semStack[$stackPos - (10 - 9)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes);
        }, 379 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Closure(['static' => \true, 'byRef' => $this->semStack[$stackPos - (11 - 3)], 'params' => $this->semStack[$stackPos - (11 - 5)], 'uses' => $this->semStack[$stackPos - (11 - 7)], 'returnType' => $this->semStack[$stackPos - (11 - 8)], 'stmts' => $this->semStack[$stackPos - (11 - 10)]], $this->startAttributeStack[$stackPos - (11 - 1)] + $this->endAttributes);
        }, 380 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (3 - 2)];
        }, 381 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (3 - 2)];
        }, 382 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Yield_($this->semStack[$stackPos - (2 - 2)], null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 383 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Yield_($this->semStack[$stackPos - (4 - 4)], $this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 384 => function ($stackPos) {
            $attrs = $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes;
            $attrs['kind'] = \PhpParser\Node\Expr\Array_::KIND_LONG;
            $this->semValue = new \PhpParser\Node\Expr\Array_($this->semStack[$stackPos - (4 - 3)], $attrs);
        }, 385 => function ($stackPos) {
            $attrs = $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes;
            $attrs['kind'] = \PhpParser\Node\Expr\Array_::KIND_SHORT;
            $this->semValue = new \PhpParser\Node\Expr\Array_($this->semStack[$stackPos - (3 - 2)], $attrs);
        }, 386 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 387 => function ($stackPos) {
            $attrs = $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes;
            $attrs['kind'] = $this->semStack[$stackPos - (4 - 1)][0] === "'" || $this->semStack[$stackPos - (4 - 1)][1] === "'" && ($this->semStack[$stackPos - (4 - 1)][0] === 'b' || $this->semStack[$stackPos - (4 - 1)][0] === 'B') ? \PhpParser\Node\Scalar\String_::KIND_SINGLE_QUOTED : \PhpParser\Node\Scalar\String_::KIND_DOUBLE_QUOTED;
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch(new \PhpParser\Node\Scalar\String_(\PhpParser\Node\Scalar\String_::parse($this->semStack[$stackPos - (4 - 1)]), $attrs), $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 388 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 389 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 390 => function ($stackPos) {
            $this->semValue = array(new \PhpParser\Node\Stmt\Class_(null, ['type' => 0, 'extends' => $this->semStack[$stackPos - (7 - 3)], 'implements' => $this->semStack[$stackPos - (7 - 4)], 'stmts' => $this->semStack[$stackPos - (7 - 6)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes), $this->semStack[$stackPos - (7 - 2)]);
            $this->checkClass($this->semValue[0], -1);
        }, 391 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\New_($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 392 => function ($stackPos) {
            list($class, $ctorArgs) = $this->semStack[$stackPos - (2 - 2)];
            $this->semValue = new \PhpParser\Node\Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 393 => function ($stackPos) {
            $this->semValue = array();
        }, 394 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (4 - 3)];
        }, 395 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 396 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 397 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ClosureUse($this->semStack[$stackPos - (2 - 2)], $this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 398 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 399 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\StaticCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 400 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\StaticCall($this->semStack[$stackPos - (6 - 1)], $this->semStack[$stackPos - (6 - 4)], $this->semStack[$stackPos - (6 - 6)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes);
        }, 401 => function ($stackPos) {
            $this->semValue = $this->fixupPhp5StaticPropCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 402 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 403 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 404 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 405 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 406 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 407 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Name\FullyQualified($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 408 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Name\Relative($this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 409 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 410 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 411 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 412 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 413 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 414 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 415 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 416 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 417 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 418 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 419 => function ($stackPos) {
            $this->semValue = null;
        }, 420 => function ($stackPos) {
            $this->semValue = null;
        }, 421 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 422 => function ($stackPos) {
            $this->semValue = array();
        }, 423 => function ($stackPos) {
            $this->semValue = array(new \PhpParser\Node\Scalar\EncapsedStringPart(\PhpParser\Node\Scalar\String_::parseEscapeSequences($this->semStack[$stackPos - (1 - 1)], '`', \false), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes));
        }, 424 => function ($stackPos) {
            foreach ($this->semStack[$stackPos - (1 - 1)] as $s) {
                if ($s instanceof \PhpParser\Node\Scalar\EncapsedStringPart) {
                    $s->value = \PhpParser\Node\Scalar\String_::parseEscapeSequences($s->value, '`', \false);
                }
            }
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 425 => function ($stackPos) {
            $this->semValue = array();
        }, 426 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 427 => function ($stackPos) {
            $this->semValue = $this->parseLNumber($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes, \true);
        }, 428 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Scalar\DNumber(\PhpParser\Node\Scalar\DNumber::parse($this->semStack[$stackPos - (1 - 1)]), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 429 => function ($stackPos) {
            $attrs = $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes;
            $attrs['kind'] = $this->semStack[$stackPos - (1 - 1)][0] === "'" || $this->semStack[$stackPos - (1 - 1)][1] === "'" && ($this->semStack[$stackPos - (1 - 1)][0] === 'b' || $this->semStack[$stackPos - (1 - 1)][0] === 'B') ? \PhpParser\Node\Scalar\String_::KIND_SINGLE_QUOTED : \PhpParser\Node\Scalar\String_::KIND_DOUBLE_QUOTED;
            $this->semValue = new \PhpParser\Node\Scalar\String_(\PhpParser\Node\Scalar\String_::parse($this->semStack[$stackPos - (1 - 1)], \false), $attrs);
        }, 430 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Scalar\MagicConst\Line($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 431 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Scalar\MagicConst\File($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 432 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 433 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 434 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 435 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Scalar\MagicConst\Method($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 436 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 437 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 438 => function ($stackPos) {
            $this->semValue = $this->parseDocString($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)], \false);
        }, 439 => function ($stackPos) {
            $this->semValue = $this->parseDocString($this->semStack[$stackPos - (2 - 1)], '', $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (2 - 2)] + $this->endAttributeStack[$stackPos - (2 - 2)], \false);
        }, 440 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 441 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ClassConstFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 442 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ConstFetch($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 443 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Array_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 444 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Array_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 445 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 446 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\BooleanOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 447 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 448 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\LogicalOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 449 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 450 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\LogicalXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 451 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 452 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 453 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 454 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 455 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 456 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 457 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 458 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 459 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 460 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 461 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 462 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 463 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\UnaryPlus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 464 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\UnaryMinus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 465 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BooleanNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 466 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BitwiseNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 467 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Identical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 468 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\NotIdentical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 469 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Equal($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 470 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\NotEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 471 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Smaller($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 472 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 473 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\Greater($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 474 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 475 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Ternary($this->semStack[$stackPos - (5 - 1)], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes);
        }, 476 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Ternary($this->semStack[$stackPos - (4 - 1)], null, $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 477 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 478 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (3 - 2)];
        }, 479 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ConstFetch($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 480 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ClassConstFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 481 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 482 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 483 => function ($stackPos) {
            $attrs = $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes;
            $attrs['kind'] = \PhpParser\Node\Scalar\String_::KIND_DOUBLE_QUOTED;
            foreach ($this->semStack[$stackPos - (3 - 2)] as $s) {
                if ($s instanceof \PhpParser\Node\Scalar\EncapsedStringPart) {
                    $s->value = \PhpParser\Node\Scalar\String_::parseEscapeSequences($s->value, '"', \true);
                }
            }
            $this->semValue = new \PhpParser\Node\Scalar\Encapsed($this->semStack[$stackPos - (3 - 2)], $attrs);
        }, 484 => function ($stackPos) {
            $this->semValue = $this->parseDocString($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)], \true);
        }, 485 => function ($stackPos) {
            $this->semValue = array();
        }, 486 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 487 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 488 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos];
        }, 489 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 490 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 491 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayItem($this->semStack[$stackPos - (3 - 3)], $this->semStack[$stackPos - (3 - 1)], \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 492 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 493 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 494 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 495 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 496 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 497 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 5)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes);
        }, 498 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 499 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 500 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\MethodCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 501 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 502 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 503 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 504 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 505 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (3 - 2)];
        }, 506 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 507 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Variable($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 508 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 509 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 510 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\StaticPropertyFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 511 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 512 => function ($stackPos) {
            $var = \substr($this->semStack[$stackPos - (1 - 1)], 1);
            $this->semValue = \is_string($var) ? new \PhpParser\Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes) : $var;
        }, 513 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\StaticPropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 514 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\StaticPropertyFetch($this->semStack[$stackPos - (6 - 1)], $this->semStack[$stackPos - (6 - 5)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes);
        }, 515 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 516 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 517 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 518 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 519 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 520 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Variable($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 521 => function ($stackPos) {
            $this->semValue = null;
        }, 522 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 523 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 524 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (3 - 2)];
        }, 525 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 526 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Error($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
            $this->errorState = 2;
        }, 527 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\List_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 528 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 529 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 530 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 531 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 532 => function ($stackPos) {
            $this->semValue = null;
        }, 533 => function ($stackPos) {
            $this->semValue = array();
        }, 534 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 535 => function ($stackPos) {
            $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)];
            $this->semValue = $this->semStack[$stackPos - (3 - 1)];
        }, 536 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 537 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayItem($this->semStack[$stackPos - (3 - 3)], $this->semStack[$stackPos - (3 - 1)], \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 538 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 539 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayItem($this->semStack[$stackPos - (4 - 4)], $this->semStack[$stackPos - (4 - 1)], \true, $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 540 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayItem($this->semStack[$stackPos - (2 - 2)], null, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 541 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayItem($this->semStack[$stackPos - (2 - 2)], null, \false, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes);
        }, 542 => function ($stackPos) {
            $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)];
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 543 => function ($stackPos) {
            $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)];
            $this->semValue = $this->semStack[$stackPos - (2 - 1)];
        }, 544 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (1 - 1)]);
        }, 545 => function ($stackPos) {
            $this->semValue = array($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]);
        }, 546 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Scalar\EncapsedStringPart($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 547 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Variable($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 548 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }, 549 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes);
        }, 550 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 551 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Variable($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 552 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\Variable($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes);
        }, 553 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Expr\ArrayDimFetch($this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 4)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes);
        }, 554 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (3 - 2)];
        }, 555 => function ($stackPos) {
            $this->semValue = new \PhpParser\Node\Scalar\String_($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 556 => function ($stackPos) {
            $this->semValue = $this->parseNumString($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes);
        }, 557 => function ($stackPos) {
            $this->semValue = $this->semStack[$stackPos - (1 - 1)];
        }];
    }
}
<?php

declare (strict_types=1);
namespace PhpParser;

abstract class NodeAbstract implements \PhpParser\Node, \JsonSerializable
{
    protected $attributes;
    /**
     * Creates a Node.
     *
     * @param array $attributes Array of attributes
     */
    public function __construct(array $attributes = [])
    {
        $this->attributes = $attributes;
    }
    /**
     * Gets line the node started in (alias of getStartLine).
     *
     * @return int Start line (or -1 if not available)
     */
    public function getLine() : int
    {
        return $this->attributes['startLine'] ?? -1;
    }
    /**
     * Gets line the node started in.
     *
     * Requires the 'startLine' attribute to be enabled in the lexer (enabled by default).
     *
     * @return int Start line (or -1 if not available)
     */
    public function getStartLine() : int
    {
        return $this->attributes['startLine'] ?? -1;
    }
    /**
     * Gets the line the node ended in.
     *
     * Requires the 'endLine' attribute to be enabled in the lexer (enabled by default).
     *
     * @return int End line (or -1 if not available)
     */
    public function getEndLine() : int
    {
        return $this->attributes['endLine'] ?? -1;
    }
    /**
     * Gets the token offset of the first token that is part of this node.
     *
     * The offset is an index into the array returned by Lexer::getTokens().
     *
     * Requires the 'startTokenPos' attribute to be enabled in the lexer (DISABLED by default).
     *
     * @return int Token start position (or -1 if not available)
     */
    public function getStartTokenPos() : int
    {
        return $this->attributes['startTokenPos'] ?? -1;
    }
    /**
     * Gets the token offset of the last token that is part of this node.
     *
     * The offset is an index into the array returned by Lexer::getTokens().
     *
     * Requires the 'endTokenPos' attribute to be enabled in the lexer (DISABLED by default).
     *
     * @return int Token end position (or -1 if not available)
     */
    public function getEndTokenPos() : int
    {
        return $this->attributes['endTokenPos'] ?? -1;
    }
    /**
     * Gets the file offset of the first character that is part of this node.
     *
     * Requires the 'startFilePos' attribute to be enabled in the lexer (DISABLED by default).
     *
     * @return int File start position (or -1 if not available)
     */
    public function getStartFilePos() : int
    {
        return $this->attributes['startFilePos'] ?? -1;
    }
    /**
     * Gets the file offset of the last character that is part of this node.
     *
     * Requires the 'endFilePos' attribute to be enabled in the lexer (DISABLED by default).
     *
     * @return int File end position (or -1 if not available)
     */
    public function getEndFilePos() : int
    {
        return $this->attributes['endFilePos'] ?? -1;
    }
    /**
     * Gets all comments directly preceding this node.
     *
     * The comments are also available through the "comments" attribute.
     *
     * @return Comment[]
     */
    public function getComments() : array
    {
        return $this->attributes['comments'] ?? [];
    }
    /**
     * Gets the doc comment of the node.
     *
     * The doc comment has to be the last comment associated with the node.
     *
     * @return null|Comment\Doc Doc comment object or null
     */
    public function getDocComment()
    {
        $comments = $this->getComments();
        if (!$comments) {
            return null;
        }
        $lastComment = $comments[\count($comments) - 1];
        if (!$lastComment instanceof \PhpParser\Comment\Doc) {
            return null;
        }
        return $lastComment;
    }
    /**
     * Sets the doc comment of the node.
     *
     * This will either replace an existing doc comment or add it to the comments array.
     *
     * @param Comment\Doc $docComment Doc comment to set
     */
    public function setDocComment(\PhpParser\Comment\Doc $docComment)
    {
        $comments = $this->getComments();
        $numComments = \count($comments);
        if ($numComments > 0 && $comments[$numComments - 1] instanceof \PhpParser\Comment\Doc) {
            // Replace existing doc comment
            $comments[$numComments - 1] = $docComment;
        } else {
            // Append new comment
            $comments[] = $docComment;
        }
        $this->setAttribute('comments', $comments);
    }
    public function setAttribute(string $key, $value)
    {
        $this->attributes[$key] = $value;
    }
    public function hasAttribute(string $key) : bool
    {
        return \array_key_exists($key, $this->attributes);
    }
    public function getAttribute(string $key, $default = null)
    {
        if (\array_key_exists($key, $this->attributes)) {
            return $this->attributes[$key];
        }
        return $default;
    }
    public function getAttributes() : array
    {
        return $this->attributes;
    }
    public function setAttributes(array $attributes)
    {
        $this->attributes = $attributes;
    }
    /**
     * @return array
     */
    public function jsonSerialize() : array
    {
        return ['nodeType' => $this->getType()] + \get_object_vars($this);
    }
}
<?php

declare (strict_types=1);
namespace PhpParser;

interface Node
{
    /**
     * Gets the type of the node.
     *
     * @return string Type of the node
     */
    public function getType() : string;
    /**
     * Gets the names of the sub nodes.
     *
     * @return array Names of sub nodes
     */
    public function getSubNodeNames() : array;
    /**
     * Gets line the node started in (alias of getStartLine).
     *
     * @return int Start line (or -1 if not available)
     */
    public function getLine() : int;
    /**
     * Gets line the node started in.
     *
     * Requires the 'startLine' attribute to be enabled in the lexer (enabled by default).
     *
     * @return int Start line (or -1 if not available)
     */
    public function getStartLine() : int;
    /**
     * Gets the line the node ended in.
     *
     * Requires the 'endLine' attribute to be enabled in the lexer (enabled by default).
     *
     * @return int End line (or -1 if not available)
     */
    public function getEndLine() : int;
    /**
     * Gets the token offset of the first token that is part of this node.
     *
     * The offset is an index into the array returned by Lexer::getTokens().
     *
     * Requires the 'startTokenPos' attribute to be enabled in the lexer (DISABLED by default).
     *
     * @return int Token start position (or -1 if not available)
     */
    public function getStartTokenPos() : int;
    /**
     * Gets the token offset of the last token that is part of this node.
     *
     * The offset is an index into the array returned by Lexer::getTokens().
     *
     * Requires the 'endTokenPos' attribute to be enabled in the lexer (DISABLED by default).
     *
     * @return int Token end position (or -1 if not available)
     */
    public function getEndTokenPos() : int;
    /**
     * Gets the file offset of the first character that is part of this node.
     *
     * Requires the 'startFilePos' attribute to be enabled in the lexer (DISABLED by default).
     *
     * @return int File start position (or -1 if not available)
     */
    public function getStartFilePos() : int;
    /**
     * Gets the file offset of the last character that is part of this node.
     *
     * Requires the 'endFilePos' attribute to be enabled in the lexer (DISABLED by default).
     *
     * @return int File end position (or -1 if not available)
     */
    public function getEndFilePos() : int;
    /**
     * Gets all comments directly preceding this node.
     *
     * The comments are also available through the "comments" attribute.
     *
     * @return Comment[]
     */
    public function getComments() : array;
    /**
     * Gets the doc comment of the node.
     *
     * The doc comment has to be the last comment associated with the node.
     *
     * @return null|Comment\Doc Doc comment object or null
     */
    public function getDocComment();
    /**
     * Sets the doc comment of the node.
     *
     * This will either replace an existing doc comment or add it to the comments array.
     *
     * @param Comment\Doc $docComment Doc comment to set
     */
    public function setDocComment(\PhpParser\Comment\Doc $docComment);
    /**
     * Sets an attribute on a node.
     *
     * @param string $key
     * @param mixed  $value
     */
    public function setAttribute(string $key, $value);
    /**
     * Returns whether an attribute exists.
     *
     * @param string $key
     *
     * @return bool
     */
    public function hasAttribute(string $key) : bool;
    /**
     * Returns the value of an attribute.
     *
     * @param string $key
     * @param mixed  $default
     *
     * @return mixed
     */
    public function getAttribute(string $key, $default = null);
    /**
     * Returns all the attributes of this node.
     *
     * @return array
     */
    public function getAttributes() : array;
    /**
     * Replaces all the attributes of this node.
     *
     * @param array $attributes
     */
    public function setAttributes(array $attributes);
}
<?php

declare (strict_types=1);
namespace PhpParser\ErrorHandler;

use PhpParser\Error;
use PhpParser\ErrorHandler;
/**
 * Error handler that handles all errors by throwing them.
 *
 * This is the default strategy used by all components.
 */
class Throwing implements \PhpParser\ErrorHandler
{
    public function handleError(\PhpParser\Error $error)
    {
        throw $error;
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\ErrorHandler;

use PhpParser\Error;
use PhpParser\ErrorHandler;
/**
 * Error handler that collects all errors into an array.
 *
 * This allows graceful handling of errors.
 */
class Collecting implements \PhpParser\ErrorHandler
{
    /** @var Error[] Collected errors */
    private $errors = [];
    public function handleError(\PhpParser\Error $error)
    {
        $this->errors[] = $error;
    }
    /**
     * Get collected errors.
     *
     * @return Error[]
     */
    public function getErrors() : array
    {
        return $this->errors;
    }
    /**
     * Check whether there are any errors.
     *
     * @return bool
     */
    public function hasErrors() : bool
    {
        return !empty($this->errors);
    }
    /**
     * Reset/clear collected errors.
     */
    public function clearErrors()
    {
        $this->errors = [];
    }
}
<?php

declare (strict_types=1);
namespace PhpParser;

class JsonDecoder
{
    /** @var \ReflectionClass[] Node type to reflection class map */
    private $reflectionClassCache;
    public function decode(string $json)
    {
        $value = \json_decode($json, \true);
        if (\json_last_error()) {
            throw new \RuntimeException('JSON decoding error: ' . \json_last_error_msg());
        }
        return $this->decodeRecursive($value);
    }
    private function decodeRecursive($value)
    {
        if (\is_array($value)) {
            if (isset($value['nodeType'])) {
                if ($value['nodeType'] === 'Comment' || $value['nodeType'] === 'Comment_Doc') {
                    return $this->decodeComment($value);
                }
                return $this->decodeNode($value);
            }
            return $this->decodeArray($value);
        }
        return $value;
    }
    private function decodeArray(array $array) : array
    {
        $decodedArray = [];
        foreach ($array as $key => $value) {
            $decodedArray[$key] = $this->decodeRecursive($value);
        }
        return $decodedArray;
    }
    private function decodeNode(array $value) : \PhpParser\Node
    {
        $nodeType = $value['nodeType'];
        if (!\is_string($nodeType)) {
            throw new \RuntimeException('Node type must be a string');
        }
        $reflectionClass = $this->reflectionClassFromNodeType($nodeType);
        /** @var Node $node */
        $node = $reflectionClass->newInstanceWithoutConstructor();
        if (isset($value['attributes'])) {
            if (!\is_array($value['attributes'])) {
                throw new \RuntimeException('Attributes must be an array');
            }
            $node->setAttributes($this->decodeArray($value['attributes']));
        }
        foreach ($value as $name => $subNode) {
            if ($name === 'nodeType' || $name === 'attributes') {
                continue;
            }
            $node->{$name} = $this->decodeRecursive($subNode);
        }
        return $node;
    }
    private function decodeComment(array $value) : \PhpParser\Comment
    {
        $className = $value['nodeType'] === 'Comment' ? \PhpParser\Comment::class : \PhpParser\Comment\Doc::class;
        if (!isset($value['text'])) {
            throw new \RuntimeException('Comment must have text');
        }
        return new $className($value['text'], $value['line'] ?? -1, $value['filePos'] ?? -1, $value['tokenPos'] ?? -1);
    }
    private function reflectionClassFromNodeType(string $nodeType) : \ReflectionClass
    {
        if (!isset($this->reflectionClassCache[$nodeType])) {
            $className = $this->classNameFromNodeType($nodeType);
            $this->reflectionClassCache[$nodeType] = new \ReflectionClass($className);
        }
        return $this->reflectionClassCache[$nodeType];
    }
    private function classNameFromNodeType(string $nodeType) : string
    {
        $className = 'PhpParser\\Node\\' . \strtr($nodeType, '_', '\\');
        if (\class_exists($className)) {
            return $className;
        }
        $className .= '_';
        if (\class_exists($className)) {
            return $className;
        }
        throw new \RuntimeException("Unknown node type \"{$nodeType}\"");
    }
}
<?php

declare (strict_types=1);
namespace PhpParser;

class Error extends \RuntimeException
{
    protected $rawMessage;
    protected $attributes;
    /**
     * Creates an Exception signifying a parse error.
     *
     * @param string    $message    Error message
     * @param array|int $attributes Attributes of node/token where error occurred
     *                              (or start line of error -- deprecated)
     */
    public function __construct(string $message, $attributes = [])
    {
        $this->rawMessage = $message;
        if (\is_array($attributes)) {
            $this->attributes = $attributes;
        } else {
            $this->attributes = ['startLine' => $attributes];
        }
        $this->updateMessage();
    }
    /**
     * Gets the error message
     *
     * @return string Error message
     */
    public function getRawMessage() : string
    {
        return $this->rawMessage;
    }
    /**
     * Gets the line the error starts in.
     *
     * @return int Error start line
     */
    public function getStartLine() : int
    {
        return $this->attributes['startLine'] ?? -1;
    }
    /**
     * Gets the line the error ends in.
     *
     * @return int Error end line
     */
    public function getEndLine() : int
    {
        return $this->attributes['endLine'] ?? -1;
    }
    /**
     * Gets the attributes of the node/token the error occurred at.
     *
     * @return array
     */
    public function getAttributes() : array
    {
        return $this->attributes;
    }
    /**
     * Sets the attributes of the node/token the error occurred at.
     *
     * @param array $attributes
     */
    public function setAttributes(array $attributes)
    {
        $this->attributes = $attributes;
        $this->updateMessage();
    }
    /**
     * Sets the line of the PHP file the error occurred in.
     *
     * @param string $message Error message
     */
    public function setRawMessage(string $message)
    {
        $this->rawMessage = $message;
        $this->updateMessage();
    }
    /**
     * Sets the line the error starts in.
     *
     * @param int $line Error start line
     */
    public function setStartLine(int $line)
    {
        $this->attributes['startLine'] = $line;
        $this->updateMessage();
    }
    /**
     * Returns whether the error has start and end column information.
     *
     * For column information enable the startFilePos and endFilePos in the lexer options.
     *
     * @return bool
     */
    public function hasColumnInfo() : bool
    {
        return isset($this->attributes['startFilePos'], $this->attributes['endFilePos']);
    }
    /**
     * Gets the start column (1-based) into the line where the error started.
     *
     * @param string $code Source code of the file
     * @return int
     */
    public function getStartColumn(string $code) : int
    {
        if (!$this->hasColumnInfo()) {
            throw new \RuntimeException('Error does not have column information');
        }
        return $this->toColumn($code, $this->attributes['startFilePos']);
    }
    /**
     * Gets the end column (1-based) into the line where the error ended.
     *
     * @param string $code Source code of the file
     * @return int
     */
    public function getEndColumn(string $code) : int
    {
        if (!$this->hasColumnInfo()) {
            throw new \RuntimeException('Error does not have column information');
        }
        return $this->toColumn($code, $this->attributes['endFilePos']);
    }
    /**
     * Formats message including line and column information.
     *
     * @param string $code Source code associated with the error, for calculation of the columns
     *
     * @return string Formatted message
     */
    public function getMessageWithColumnInfo(string $code) : string
    {
        return \sprintf('%s from %d:%d to %d:%d', $this->getRawMessage(), $this->getStartLine(), $this->getStartColumn($code), $this->getEndLine(), $this->getEndColumn($code));
    }
    /**
     * Converts a file offset into a column.
     *
     * @param string $code Source code that $pos indexes into
     * @param int    $pos  0-based position in $code
     *
     * @return int 1-based column (relative to start of line)
     */
    private function toColumn(string $code, int $pos) : int
    {
        if ($pos > \strlen($code)) {
            throw new \RuntimeException('Invalid position information');
        }
        $lineStartPos = \strrpos($code, "\n", $pos - \strlen($code));
        if (\false === $lineStartPos) {
            $lineStartPos = -1;
        }
        return $pos - $lineStartPos;
    }
    /**
     * Updates the exception message after a change to rawMessage or rawLine.
     */
    protected function updateMessage()
    {
        $this->message = $this->rawMessage;
        if (-1 === $this->getStartLine()) {
            $this->message .= ' on unknown line';
        } else {
            $this->message .= ' on line ' . $this->getStartLine();
        }
    }
}
<?php

declare (strict_types=1);
namespace PhpParser;

class Comment implements \JsonSerializable
{
    protected $text;
    protected $line;
    protected $filePos;
    protected $tokenPos;
    /**
     * Constructs a comment node.
     *
     * @param string $text          Comment text (including comment delimiters like /*)
     * @param int    $startLine     Line number the comment started on
     * @param int    $startFilePos  File offset the comment started on
     * @param int    $startTokenPos Token offset the comment started on
     */
    public function __construct(string $text, int $startLine = -1, int $startFilePos = -1, int $startTokenPos = -1)
    {
        $this->text = $text;
        $this->line = $startLine;
        $this->filePos = $startFilePos;
        $this->tokenPos = $startTokenPos;
    }
    /**
     * Gets the comment text.
     *
     * @return string The comment text (including comment delimiters like /*)
     */
    public function getText() : string
    {
        return $this->text;
    }
    /**
     * Gets the line number the comment started on.
     *
     * @return int Line number
     */
    public function getLine() : int
    {
        return $this->line;
    }
    /**
     * Gets the file offset the comment started on.
     *
     * @return int File offset
     */
    public function getFilePos() : int
    {
        return $this->filePos;
    }
    /**
     * Gets the token offset the comment started on.
     *
     * @return int Token offset
     */
    public function getTokenPos() : int
    {
        return $this->tokenPos;
    }
    /**
     * Gets the comment text.
     *
     * @return string The comment text (including comment delimiters like /*)
     */
    public function __toString() : string
    {
        return $this->text;
    }
    /**
     * Gets the reformatted comment text.
     *
     * "Reformatted" here means that we try to clean up the whitespace at the
     * starts of the lines. This is necessary because we receive the comments
     * without trailing whitespace on the first line, but with trailing whitespace
     * on all subsequent lines.
     *
     * @return mixed|string
     */
    public function getReformattedText()
    {
        $text = \trim($this->text);
        $newlinePos = \strpos($text, "\n");
        if (\false === $newlinePos) {
            // Single line comments don't need further processing
            return $text;
        } elseif (\preg_match('((*BSR_ANYCRLF)(*ANYCRLF)^.*(?:\\R\\s+\\*.*)+$)', $text)) {
            // Multi line comment of the type
            //
            //     /*
            //      * Some text.
            //      * Some more text.
            //      */
            //
            // is handled by replacing the whitespace sequences before the * by a single space
            return \preg_replace('(^\\s+\\*)m', ' *', $this->text);
        } elseif (\preg_match('(^/\\*\\*?\\s*[\\r\\n])', $text) && \preg_match('(\\n(\\s*)\\*/$)', $text, $matches)) {
            // Multi line comment of the type
            //
            //    /*
            //        Some text.
            //        Some more text.
            //    */
            //
            // is handled by removing the whitespace sequence on the line before the closing
            // */ on all lines. So if the last line is "    */", then "    " is removed at the
            // start of all lines.
            return \preg_replace('(^' . \preg_quote($matches[1]) . ')m', '', $text);
        } elseif (\preg_match('(^/\\*\\*?\\s*(?!\\s))', $text, $matches)) {
            // Multi line comment of the type
            //
            //     /* Some text.
            //        Some more text.
            //          Indented text.
            //        Even more text. */
            //
            // is handled by removing the difference between the shortest whitespace prefix on all
            // lines and the length of the "/* " opening sequence.
            $prefixLen = $this->getShortestWhitespacePrefixLen(\substr($text, $newlinePos + 1));
            $removeLen = $prefixLen - \strlen($matches[0]);
            return \preg_replace('(^\\s{' . $removeLen . '})m', '', $text);
        }
        // No idea how to format this comment, so simply return as is
        return $text;
    }
    /**
     * Get length of shortest whitespace prefix (at the start of a line).
     *
     * If there is a line with no prefix whitespace, 0 is a valid return value.
     *
     * @param string $str String to check
     * @return int Length in characters. Tabs count as single characters.
     */
    private function getShortestWhitespacePrefixLen(string $str) : int
    {
        $lines = \explode("\n", $str);
        $shortestPrefixLen = \INF;
        foreach ($lines as $line) {
            \preg_match('(^\\s*)', $line, $matches);
            $prefixLen = \strlen($matches[0]);
            if ($prefixLen < $shortestPrefixLen) {
                $shortestPrefixLen = $prefixLen;
            }
        }
        return $shortestPrefixLen;
    }
    /**
     * @return       array
     * @psalm-return array{nodeType:string, text:mixed, line:mixed, filePos:mixed}
     */
    public function jsonSerialize() : array
    {
        // Technically not a node, but we make it look like one anyway
        $type = $this instanceof \PhpParser\Comment\Doc ? 'Comment_Doc' : 'Comment';
        return ['nodeType' => $type, 'text' => $this->text, 'line' => $this->line, 'filePos' => $this->filePos, 'tokenPos' => $this->tokenPos];
    }
}
<?php

declare (strict_types=1);
namespace PhpParser;

use PhpParser\Parser\Tokens;
class Lexer
{
    protected $code;
    protected $tokens;
    protected $pos;
    protected $line;
    protected $filePos;
    protected $prevCloseTagHasNewline;
    protected $tokenMap;
    protected $dropTokens;
    private $attributeStartLineUsed;
    private $attributeEndLineUsed;
    private $attributeStartTokenPosUsed;
    private $attributeEndTokenPosUsed;
    private $attributeStartFilePosUsed;
    private $attributeEndFilePosUsed;
    private $attributeCommentsUsed;
    /**
     * Creates a Lexer.
     *
     * @param array $options Options array. Currently only the 'usedAttributes' option is supported,
     *                       which is an array of attributes to add to the AST nodes. Possible
     *                       attributes are: 'comments', 'startLine', 'endLine', 'startTokenPos',
     *                       'endTokenPos', 'startFilePos', 'endFilePos'. The option defaults to the
     *                       first three. For more info see getNextToken() docs.
     */
    public function __construct(array $options = [])
    {
        // map from internal tokens to PhpParser tokens
        $this->tokenMap = $this->createTokenMap();
        // map of tokens to drop while lexing (the map is only used for isset lookup,
        // that's why the value is simply set to 1; the value is never actually used.)
        $this->dropTokens = \array_fill_keys([\T_WHITESPACE, \T_OPEN_TAG, \T_COMMENT, \T_DOC_COMMENT], 1);
        $defaultAttributes = ['comments', 'startLine', 'endLine'];
        $usedAttributes = \array_fill_keys($options['usedAttributes'] ?? $defaultAttributes, \true);
        // Create individual boolean properties to make these checks faster.
        $this->attributeStartLineUsed = isset($usedAttributes['startLine']);
        $this->attributeEndLineUsed = isset($usedAttributes['endLine']);
        $this->attributeStartTokenPosUsed = isset($usedAttributes['startTokenPos']);
        $this->attributeEndTokenPosUsed = isset($usedAttributes['endTokenPos']);
        $this->attributeStartFilePosUsed = isset($usedAttributes['startFilePos']);
        $this->attributeEndFilePosUsed = isset($usedAttributes['endFilePos']);
        $this->attributeCommentsUsed = isset($usedAttributes['comments']);
    }
    /**
     * Initializes the lexer for lexing the provided source code.
     *
     * This function does not throw if lexing errors occur. Instead, errors may be retrieved using
     * the getErrors() method.
     *
     * @param string $code The source code to lex
     * @param ErrorHandler|null $errorHandler Error handler to use for lexing errors. Defaults to
     *                                        ErrorHandler\Throwing
     */
    public function startLexing(string $code, \PhpParser\ErrorHandler $errorHandler = null)
    {
        if (null === $errorHandler) {
            $errorHandler = new \PhpParser\ErrorHandler\Throwing();
        }
        $this->code = $code;
        // keep the code around for __halt_compiler() handling
        $this->pos = -1;
        $this->line = 1;
        $this->filePos = 0;
        // If inline HTML occurs without preceding code, treat it as if it had a leading newline.
        // This ensures proper composability, because having a newline is the "safe" assumption.
        $this->prevCloseTagHasNewline = \true;
        $scream = \ini_set('xdebug.scream', '0');
        \error_clear_last();
        $this->tokens = @\token_get_all($code);
        $this->handleErrors($errorHandler);
        if (\false !== $scream) {
            \ini_set('xdebug.scream', $scream);
        }
    }
    private function handleInvalidCharacterRange($start, $end, $line, \PhpParser\ErrorHandler $errorHandler)
    {
        for ($i = $start; $i < $end; $i++) {
            $chr = $this->code[$i];
            if ($chr === 'b' || $chr === 'B') {
                // HHVM does not treat b" tokens correctly, so ignore these
                continue;
            }
            if ($chr === "\0") {
                // PHP cuts error message after null byte, so need special case
                $errorMsg = 'Unexpected null byte';
            } else {
                $errorMsg = \sprintf('Unexpected character "%s" (ASCII %d)', $chr, \ord($chr));
            }
            $errorHandler->handleError(new \PhpParser\Error($errorMsg, ['startLine' => $line, 'endLine' => $line, 'startFilePos' => $i, 'endFilePos' => $i]));
        }
    }
    /**
     * Check whether comment token is unterminated.
     *
     * @return bool
     */
    private function isUnterminatedComment($token) : bool
    {
        return ($token[0] === \T_COMMENT || $token[0] === \T_DOC_COMMENT) && \substr($token[1], 0, 2) === '/*' && \substr($token[1], -2) !== '*/';
    }
    /**
     * Check whether an error *may* have occurred during tokenization.
     *
     * @return bool
     */
    private function errorMayHaveOccurred() : bool
    {
        if (\defined('HHVM_VERSION')) {
            // In HHVM token_get_all() does not throw warnings, so we need to conservatively
            // assume that an error occurred
            return \true;
        }
        return null !== \error_get_last();
    }
    protected function handleErrors(\PhpParser\ErrorHandler $errorHandler)
    {
        if (!$this->errorMayHaveOccurred()) {
            return;
        }
        // PHP's error handling for token_get_all() is rather bad, so if we want detailed
        // error information we need to compute it ourselves. Invalid character errors are
        // detected by finding "gaps" in the token array. Unterminated comments are detected
        // by checking if a trailing comment has a "*/" at the end.
        $filePos = 0;
        $line = 1;
        foreach ($this->tokens as $token) {
            $tokenValue = \is_string($token) ? $token : $token[1];
            $tokenLen = \strlen($tokenValue);
            if (\substr($this->code, $filePos, $tokenLen) !== $tokenValue) {
                // Something is missing, must be an invalid character
                $nextFilePos = \strpos($this->code, $tokenValue, $filePos);
                $this->handleInvalidCharacterRange($filePos, $nextFilePos, $line, $errorHandler);
                $filePos = (int) $nextFilePos;
            }
            $filePos += $tokenLen;
            $line += \substr_count($tokenValue, "\n");
        }
        if ($filePos !== \strlen($this->code)) {
            if (\substr($this->code, $filePos, 2) === '/*') {
                // Unlike PHP, HHVM will drop unterminated comments entirely
                $comment = \substr($this->code, $filePos);
                $errorHandler->handleError(new \PhpParser\Error('Unterminated comment', ['startLine' => $line, 'endLine' => $line + \substr_count($comment, "\n"), 'startFilePos' => $filePos, 'endFilePos' => $filePos + \strlen($comment)]));
                // Emulate the PHP behavior
                $isDocComment = isset($comment[3]) && $comment[3] === '*';
                $this->tokens[] = [$isDocComment ? \T_DOC_COMMENT : \T_COMMENT, $comment, $line];
            } else {
                // Invalid characters at the end of the input
                $this->handleInvalidCharacterRange($filePos, \strlen($this->code), $line, $errorHandler);
            }
            return;
        }
        if (\count($this->tokens) > 0) {
            // Check for unterminated comment
            $lastToken = $this->tokens[\count($this->tokens) - 1];
            if ($this->isUnterminatedComment($lastToken)) {
                $errorHandler->handleError(new \PhpParser\Error('Unterminated comment', ['startLine' => $line - \substr_count($lastToken[1], "\n"), 'endLine' => $line, 'startFilePos' => $filePos - \strlen($lastToken[1]), 'endFilePos' => $filePos]));
            }
        }
    }
    /**
     * Fetches the next token.
     *
     * The available attributes are determined by the 'usedAttributes' option, which can
     * be specified in the constructor. The following attributes are supported:
     *
     *  * 'comments'      => Array of PhpParser\Comment or PhpParser\Comment\Doc instances,
     *                       representing all comments that occurred between the previous
     *                       non-discarded token and the current one.
     *  * 'startLine'     => Line in which the node starts.
     *  * 'endLine'       => Line in which the node ends.
     *  * 'startTokenPos' => Offset into the token array of the first token in the node.
     *  * 'endTokenPos'   => Offset into the token array of the last token in the node.
     *  * 'startFilePos'  => Offset into the code string of the first character that is part of the node.
     *  * 'endFilePos'    => Offset into the code string of the last character that is part of the node.
     *
     * @param mixed $value           Variable to store token content in
     * @param mixed $startAttributes Variable to store start attributes in
     * @param mixed $endAttributes   Variable to store end attributes in
     *
     * @return int Token id
     */
    public function getNextToken(&$value = null, &$startAttributes = null, &$endAttributes = null) : int
    {
        $startAttributes = [];
        $endAttributes = [];
        while (1) {
            if (isset($this->tokens[++$this->pos])) {
                $token = $this->tokens[$this->pos];
            } else {
                // EOF token with ID 0
                $token = "\0";
            }
            if ($this->attributeStartLineUsed) {
                $startAttributes['startLine'] = $this->line;
            }
            if ($this->attributeStartTokenPosUsed) {
                $startAttributes['startTokenPos'] = $this->pos;
            }
            if ($this->attributeStartFilePosUsed) {
                $startAttributes['startFilePos'] = $this->filePos;
            }
            if (\is_string($token)) {
                $value = $token;
                if (isset($token[1])) {
                    // bug in token_get_all
                    $this->filePos += 2;
                    $id = \ord('"');
                } else {
                    $this->filePos += 1;
                    $id = \ord($token);
                }
            } elseif (!isset($this->dropTokens[$token[0]])) {
                $value = $token[1];
                $id = $this->tokenMap[$token[0]];
                if (\T_CLOSE_TAG === $token[0]) {
                    $this->prevCloseTagHasNewline = \false !== \strpos($token[1], "\n");
                } elseif (\T_INLINE_HTML === $token[0]) {
                    $startAttributes['hasLeadingNewline'] = $this->prevCloseTagHasNewline;
                }
                $this->line += \substr_count($value, "\n");
                $this->filePos += \strlen($value);
            } else {
                if (\T_COMMENT === $token[0] || \T_DOC_COMMENT === $token[0]) {
                    if ($this->attributeCommentsUsed) {
                        $comment = \T_DOC_COMMENT === $token[0] ? new \PhpParser\Comment\Doc($token[1], $this->line, $this->filePos, $this->pos) : new \PhpParser\Comment($token[1], $this->line, $this->filePos, $this->pos);
                        $startAttributes['comments'][] = $comment;
                    }
                }
                $this->line += \substr_count($token[1], "\n");
                $this->filePos += \strlen($token[1]);
                continue;
            }
            if ($this->attributeEndLineUsed) {
                $endAttributes['endLine'] = $this->line;
            }
            if ($this->attributeEndTokenPosUsed) {
                $endAttributes['endTokenPos'] = $this->pos;
            }
            if ($this->attributeEndFilePosUsed) {
                $endAttributes['endFilePos'] = $this->filePos - 1;
            }
            return $id;
        }
        throw new \RuntimeException('Reached end of lexer loop');
    }
    /**
     * Returns the token array for current code.
     *
     * The token array is in the same format as provided by the
     * token_get_all() function and does not discard tokens (i.e.
     * whitespace and comments are included). The token position
     * attributes are against this token array.
     *
     * @return array Array of tokens in token_get_all() format
     */
    public function getTokens() : array
    {
        return $this->tokens;
    }
    /**
     * Handles __halt_compiler() by returning the text after it.
     *
     * @return string Remaining text
     */
    public function handleHaltCompiler() : string
    {
        // text after T_HALT_COMPILER, still including ();
        $textAfter = \substr($this->code, $this->filePos);
        // ensure that it is followed by ();
        // this simplifies the situation, by not allowing any comments
        // in between of the tokens.
        if (!\preg_match('~^\\s*\\(\\s*\\)\\s*(?:;|\\?>\\r?\\n?)~', $textAfter, $matches)) {
            throw new \PhpParser\Error('__HALT_COMPILER must be followed by "();"');
        }
        // prevent the lexer from returning any further tokens
        $this->pos = \count($this->tokens);
        // return with (); removed
        return \substr($textAfter, \strlen($matches[0]));
    }
    /**
     * Creates the token map.
     *
     * The token map maps the PHP internal token identifiers
     * to the identifiers used by the Parser. Additionally it
     * maps T_OPEN_TAG_WITH_ECHO to T_ECHO and T_CLOSE_TAG to ';'.
     *
     * @return array The token map
     */
    protected function createTokenMap() : array
    {
        $tokenMap = [];
        // 256 is the minimum possible token number, as everything below
        // it is an ASCII value
        for ($i = 256; $i < 1000; ++$i) {
            if (\T_DOUBLE_COLON === $i) {
                // T_DOUBLE_COLON is equivalent to T_PAAMAYIM_NEKUDOTAYIM
                $tokenMap[$i] = \PhpParser\Parser\Tokens::T_PAAMAYIM_NEKUDOTAYIM;
            } elseif (\T_OPEN_TAG_WITH_ECHO === $i) {
                // T_OPEN_TAG_WITH_ECHO with dropped T_OPEN_TAG results in T_ECHO
                $tokenMap[$i] = \PhpParser\Parser\Tokens::T_ECHO;
            } elseif (\T_CLOSE_TAG === $i) {
                // T_CLOSE_TAG is equivalent to ';'
                $tokenMap[$i] = \ord(';');
            } elseif ('UNKNOWN' !== ($name = \token_name($i))) {
                if ('T_HASHBANG' === $name) {
                    // HHVM uses a special token for #! hashbang lines
                    $tokenMap[$i] = \PhpParser\Parser\Tokens::T_INLINE_HTML;
                } elseif (\defined($name = \PhpParser\Parser\Tokens::class . '::' . $name)) {
                    // Other tokens can be mapped directly
                    $tokenMap[$i] = \constant($name);
                }
            }
        }
        // HHVM uses a special token for numbers that overflow to double
        if (\defined('T_ONUMBER')) {
            $tokenMap[\T_ONUMBER] = \PhpParser\Parser\Tokens::T_DNUMBER;
        }
        // HHVM also has a separate token for the __COMPILER_HALT_OFFSET__ constant
        if (\defined('T_COMPILER_HALT_OFFSET')) {
            $tokenMap[\T_COMPILER_HALT_OFFSET] = \PhpParser\Parser\Tokens::T_STRING;
        }
        return $tokenMap;
    }
}
<?php

declare (strict_types=1);
namespace PhpParser;

interface ErrorHandler
{
    /**
     * Handle an error generated during lexing, parsing or some other operation.
     *
     * @param Error $error The error that needs to be handled
     */
    public function handleError(\PhpParser\Error $error);
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
/**
 * Represents statements of type "expr;"
 */
class Expression extends \PhpParser\Node\Stmt
{
    /** @var Node\Expr Expression */
    public $expr;
    /**
     * Constructs an expression statement.
     *
     * @param Node\Expr $expr       Expression
     * @param array     $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $expr, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }
    public function getSubNodeNames() : array
    {
        return ['expr'];
    }
    public function getType() : string
    {
        return 'Stmt_Expression';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
use PhpParser\Node\Identifier;
class UseUse extends \PhpParser\Node\Stmt
{
    /** @var int One of the Stmt\Use_::TYPE_* constants. Will only differ from TYPE_UNKNOWN for mixed group uses */
    public $type;
    /** @var Node\Name Namespace, class, function or constant to alias */
    public $name;
    /** @var Identifier|null Alias */
    public $alias;
    /**
     * Constructs an alias (use) node.
     *
     * @param Node\Name              $name       Namespace/Class to alias
     * @param null|string|Identifier $alias      Alias
     * @param int                    $type       Type of the use element (for mixed group use only)
     * @param array                  $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Name $name, $alias = null, int $type = \PhpParser\Node\Stmt\Use_::TYPE_UNKNOWN, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->type = $type;
        $this->name = $name;
        $this->alias = \is_string($alias) ? new \PhpParser\Node\Identifier($alias) : $alias;
    }
    public function getSubNodeNames() : array
    {
        return ['type', 'name', 'alias'];
    }
    /**
     * Get alias. If not explicitly given this is the last component of the used name.
     *
     * @return Identifier
     */
    public function getAlias() : \PhpParser\Node\Identifier
    {
        if (null !== $this->alias) {
            return $this->alias;
        }
        return new \PhpParser\Node\Identifier($this->name->getLast());
    }
    public function getType() : string
    {
        return 'Stmt_UseUse';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class Global_ extends \PhpParser\Node\Stmt
{
    /** @var Node\Expr[] Variables */
    public $vars;
    /**
     * Constructs a global variables list node.
     *
     * @param Node\Expr[] $vars       Variables to unset
     * @param array       $attributes Additional attributes
     */
    public function __construct(array $vars, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->vars = $vars;
    }
    public function getSubNodeNames() : array
    {
        return ['vars'];
    }
    public function getType() : string
    {
        return 'Stmt_Global';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class Namespace_ extends \PhpParser\Node\Stmt
{
    /* For use in the "kind" attribute */
    const KIND_SEMICOLON = 1;
    const KIND_BRACED = 2;
    /** @var null|Node\Name Name */
    public $name;
    /** @var Node\Stmt[] Statements */
    public $stmts;
    /**
     * Constructs a namespace node.
     *
     * @param null|Node\Name   $name       Name
     * @param null|Node\Stmt[] $stmts      Statements
     * @param array            $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Name $name = null, $stmts = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->name = $name;
        $this->stmts = $stmts;
    }
    public function getSubNodeNames() : array
    {
        return ['name', 'stmts'];
    }
    public function getType() : string
    {
        return 'Stmt_Namespace';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class TraitUse extends \PhpParser\Node\Stmt
{
    /** @var Node\Name[] Traits */
    public $traits;
    /** @var TraitUseAdaptation[] Adaptations */
    public $adaptations;
    /**
     * Constructs a trait use node.
     *
     * @param Node\Name[]          $traits      Traits
     * @param TraitUseAdaptation[] $adaptations Adaptations
     * @param array                $attributes  Additional attributes
     */
    public function __construct(array $traits, array $adaptations = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->traits = $traits;
        $this->adaptations = $adaptations;
    }
    public function getSubNodeNames() : array
    {
        return ['traits', 'adaptations'];
    }
    public function getType() : string
    {
        return 'Stmt_TraitUse';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt\TraitUseAdaptation;

use PhpParser\Node;
class Precedence extends \PhpParser\Node\Stmt\TraitUseAdaptation
{
    /** @var Node\Name[] Overwritten traits */
    public $insteadof;
    /**
     * Constructs a trait use precedence adaptation node.
     *
     * @param Node\Name              $trait       Trait name
     * @param string|Node\Identifier $method      Method name
     * @param Node\Name[]            $insteadof   Overwritten traits
     * @param array                  $attributes  Additional attributes
     */
    public function __construct(\PhpParser\Node\Name $trait, $method, array $insteadof, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->trait = $trait;
        $this->method = \is_string($method) ? new \PhpParser\Node\Identifier($method) : $method;
        $this->insteadof = $insteadof;
    }
    public function getSubNodeNames() : array
    {
        return ['trait', 'method', 'insteadof'];
    }
    public function getType() : string
    {
        return 'Stmt_TraitUseAdaptation_Precedence';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt\TraitUseAdaptation;

use PhpParser\Node;
class Alias extends \PhpParser\Node\Stmt\TraitUseAdaptation
{
    /** @var null|int New modifier */
    public $newModifier;
    /** @var null|Node\Identifier New name */
    public $newName;
    /**
     * Constructs a trait use precedence adaptation node.
     *
     * @param null|Node\Name              $trait       Trait name
     * @param string|Node\Identifier      $method      Method name
     * @param null|int                    $newModifier New modifier
     * @param null|string|Node\Identifier $newName     New name
     * @param array                       $attributes  Additional attributes
     */
    public function __construct($trait, $method, $newModifier, $newName, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->trait = $trait;
        $this->method = \is_string($method) ? new \PhpParser\Node\Identifier($method) : $method;
        $this->newModifier = $newModifier;
        $this->newName = \is_string($newName) ? new \PhpParser\Node\Identifier($newName) : $newName;
    }
    public function getSubNodeNames() : array
    {
        return ['trait', 'method', 'newModifier', 'newName'];
    }
    public function getType() : string
    {
        return 'Stmt_TraitUseAdaptation_Alias';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
use PhpParser\Node\Expr;
class Catch_ extends \PhpParser\Node\Stmt
{
    /** @var Node\Name[] Types of exceptions to catch */
    public $types;
    /** @var Expr\Variable Variable for exception */
    public $var;
    /** @var Node\Stmt[] Statements */
    public $stmts;
    /**
     * Constructs a catch node.
     *
     * @param Node\Name[]   $types      Types of exceptions to catch
     * @param Expr\Variable $var        Variable for exception
     * @param Node\Stmt[]   $stmts      Statements
     * @param array         $attributes Additional attributes
     */
    public function __construct(array $types, \PhpParser\Node\Expr\Variable $var, array $stmts = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->types = $types;
        $this->var = $var;
        $this->stmts = $stmts;
    }
    public function getSubNodeNames() : array
    {
        return ['types', 'var', 'stmts'];
    }
    public function getType() : string
    {
        return 'Stmt_Catch';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Error;
use PhpParser\Node;
class Class_ extends \PhpParser\Node\Stmt\ClassLike
{
    const MODIFIER_PUBLIC = 1;
    const MODIFIER_PROTECTED = 2;
    const MODIFIER_PRIVATE = 4;
    const MODIFIER_STATIC = 8;
    const MODIFIER_ABSTRACT = 16;
    const MODIFIER_FINAL = 32;
    const VISIBILITY_MODIFIER_MASK = 7;
    // 1 | 2 | 4
    /** @var int Type */
    public $flags;
    /** @var null|Node\Name Name of extended class */
    public $extends;
    /** @var Node\Name[] Names of implemented interfaces */
    public $implements;
    /**
     * Constructs a class node.
     *
     * @param string|Node\Identifier|null $name Name
     * @param array       $subNodes   Array of the following optional subnodes:
     *                                'flags'      => 0      : Flags
     *                                'extends'    => null   : Name of extended class
     *                                'implements' => array(): Names of implemented interfaces
     *                                'stmts'      => array(): Statements
     * @param array       $attributes Additional attributes
     */
    public function __construct($name, array $subNodes = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->flags = $subNodes['flags'] ?? $subNodes['type'] ?? 0;
        $this->name = \is_string($name) ? new \PhpParser\Node\Identifier($name) : $name;
        $this->extends = $subNodes['extends'] ?? null;
        $this->implements = $subNodes['implements'] ?? [];
        $this->stmts = $subNodes['stmts'] ?? [];
    }
    public function getSubNodeNames() : array
    {
        return ['flags', 'name', 'extends', 'implements', 'stmts'];
    }
    /**
     * Whether the class is explicitly abstract.
     *
     * @return bool
     */
    public function isAbstract() : bool
    {
        return (bool) ($this->flags & self::MODIFIER_ABSTRACT);
    }
    /**
     * Whether the class is final.
     *
     * @return bool
     */
    public function isFinal() : bool
    {
        return (bool) ($this->flags & self::MODIFIER_FINAL);
    }
    /**
     * Whether the class is anonymous.
     *
     * @return bool
     */
    public function isAnonymous() : bool
    {
        return null === $this->name;
    }
    /**
     * @internal
     */
    public static function verifyModifier($a, $b)
    {
        if ($a & self::VISIBILITY_MODIFIER_MASK && $b & self::VISIBILITY_MODIFIER_MASK) {
            throw new \PhpParser\Error('Multiple access type modifiers are not allowed');
        }
        if ($a & self::MODIFIER_ABSTRACT && $b & self::MODIFIER_ABSTRACT) {
            throw new \PhpParser\Error('Multiple abstract modifiers are not allowed');
        }
        if ($a & self::MODIFIER_STATIC && $b & self::MODIFIER_STATIC) {
            throw new \PhpParser\Error('Multiple static modifiers are not allowed');
        }
        if ($a & self::MODIFIER_FINAL && $b & self::MODIFIER_FINAL) {
            throw new \PhpParser\Error('Multiple final modifiers are not allowed');
        }
        if ($a & 48 && $b & 48) {
            throw new \PhpParser\Error('Cannot use the final modifier on an abstract class member');
        }
    }
    public function getType() : string
    {
        return 'Stmt_Class';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class Throw_ extends \PhpParser\Node\Stmt
{
    /** @var Node\Expr Expression */
    public $expr;
    /**
     * Constructs a throw node.
     *
     * @param Node\Expr $expr       Expression
     * @param array     $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $expr, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }
    public function getSubNodeNames() : array
    {
        return ['expr'];
    }
    public function getType() : string
    {
        return 'Stmt_Throw';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class PropertyProperty extends \PhpParser\Node\Stmt
{
    /** @var Node\VarLikeIdentifier Name */
    public $name;
    /** @var null|Node\Expr Default */
    public $default;
    /**
     * Constructs a class property node.
     *
     * @param string|Node\VarLikeIdentifier $name       Name
     * @param null|Node\Expr                $default    Default value
     * @param array                         $attributes Additional attributes
     */
    public function __construct($name, \PhpParser\Node\Expr $default = null, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->name = \is_string($name) ? new \PhpParser\Node\VarLikeIdentifier($name) : $name;
        $this->default = $default;
    }
    public function getSubNodeNames() : array
    {
        return ['name', 'default'];
    }
    public function getType() : string
    {
        return 'Stmt_PropertyProperty';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node\Identifier;
use PhpParser\Node\Stmt;
class Label extends \PhpParser\Node\Stmt
{
    /** @var Identifier Name */
    public $name;
    /**
     * Constructs a label node.
     *
     * @param string|Identifier $name       Name
     * @param array             $attributes Additional attributes
     */
    public function __construct($name, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->name = \is_string($name) ? new \PhpParser\Node\Identifier($name) : $name;
    }
    public function getSubNodeNames() : array
    {
        return ['name'];
    }
    public function getType() : string
    {
        return 'Stmt_Label';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
use PhpParser\Node\Expr;
class StaticVar extends \PhpParser\Node\Stmt
{
    /** @var Expr\Variable Variable */
    public $var;
    /** @var null|Node\Expr Default value */
    public $default;
    /**
     * Constructs a static variable node.
     *
     * @param Expr\Variable  $var         Name
     * @param null|Node\Expr $default    Default value
     * @param array          $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr\Variable $var, \PhpParser\Node\Expr $default = null, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->var = $var;
        $this->default = $default;
    }
    public function getSubNodeNames() : array
    {
        return ['var', 'default'];
    }
    public function getType() : string
    {
        return 'Stmt_StaticVar';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class Case_ extends \PhpParser\Node\Stmt
{
    /** @var null|Node\Expr Condition (null for default) */
    public $cond;
    /** @var Node\Stmt[] Statements */
    public $stmts;
    /**
     * Constructs a case node.
     *
     * @param null|Node\Expr $cond       Condition (null for default)
     * @param Node\Stmt[]    $stmts      Statements
     * @param array          $attributes Additional attributes
     */
    public function __construct($cond, array $stmts = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->cond = $cond;
        $this->stmts = $stmts;
    }
    public function getSubNodeNames() : array
    {
        return ['cond', 'stmts'];
    }
    public function getType() : string
    {
        return 'Stmt_Case';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class Continue_ extends \PhpParser\Node\Stmt
{
    /** @var null|Node\Expr Number of loops to continue */
    public $num;
    /**
     * Constructs a continue node.
     *
     * @param null|Node\Expr $num        Number of loops to continue
     * @param array          $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $num = null, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->num = $num;
    }
    public function getSubNodeNames() : array
    {
        return ['num'];
    }
    public function getType() : string
    {
        return 'Stmt_Continue';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
use PhpParser\Node\FunctionLike;
class ClassMethod extends \PhpParser\Node\Stmt implements \PhpParser\Node\FunctionLike
{
    /** @var int Flags */
    public $flags;
    /** @var bool Whether to return by reference */
    public $byRef;
    /** @var Node\Identifier Name */
    public $name;
    /** @var Node\Param[] Parameters */
    public $params;
    /** @var null|Node\Identifier|Node\Name|Node\NullableType Return type */
    public $returnType;
    /** @var Node\Stmt[]|null Statements */
    public $stmts;
    private static $magicNames = ['__construct' => \true, '__destruct' => \true, '__call' => \true, '__callstatic' => \true, '__get' => \true, '__set' => \true, '__isset' => \true, '__unset' => \true, '__sleep' => \true, '__wakeup' => \true, '__tostring' => \true, '__set_state' => \true, '__clone' => \true, '__invoke' => \true, '__debuginfo' => \true];
    /**
     * Constructs a class method node.
     *
     * @param string|Node\Identifier $name Name
     * @param array $subNodes   Array of the following optional subnodes:
     *                          'flags       => MODIFIER_PUBLIC: Flags
     *                          'byRef'      => false          : Whether to return by reference
     *                          'params'     => array()        : Parameters
     *                          'returnType' => null           : Return type
     *                          'stmts'      => array()        : Statements
     * @param array $attributes Additional attributes
     */
    public function __construct($name, array $subNodes = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->flags = $subNodes['flags'] ?? $subNodes['type'] ?? 0;
        $this->byRef = $subNodes['byRef'] ?? \false;
        $this->name = \is_string($name) ? new \PhpParser\Node\Identifier($name) : $name;
        $this->params = $subNodes['params'] ?? [];
        $returnType = $subNodes['returnType'] ?? null;
        $this->returnType = \is_string($returnType) ? new \PhpParser\Node\Identifier($returnType) : $returnType;
        $this->stmts = \array_key_exists('stmts', $subNodes) ? $subNodes['stmts'] : [];
    }
    public function getSubNodeNames() : array
    {
        return ['flags', 'byRef', 'name', 'params', 'returnType', 'stmts'];
    }
    public function returnsByRef() : bool
    {
        return $this->byRef;
    }
    public function getParams() : array
    {
        return $this->params;
    }
    public function getReturnType()
    {
        return $this->returnType;
    }
    public function getStmts()
    {
        return $this->stmts;
    }
    /**
     * Whether the method is explicitly or implicitly public.
     *
     * @return bool
     */
    public function isPublic() : bool
    {
        return ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_PUBLIC) !== 0 || ($this->flags & \PhpParser\Node\Stmt\Class_::VISIBILITY_MODIFIER_MASK) === 0;
    }
    /**
     * Whether the method is protected.
     *
     * @return bool
     */
    public function isProtected() : bool
    {
        return (bool) ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_PROTECTED);
    }
    /**
     * Whether the method is private.
     *
     * @return bool
     */
    public function isPrivate() : bool
    {
        return (bool) ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_PRIVATE);
    }
    /**
     * Whether the method is abstract.
     *
     * @return bool
     */
    public function isAbstract() : bool
    {
        return (bool) ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_ABSTRACT);
    }
    /**
     * Whether the method is final.
     * 
     * @return bool
     */
    public function isFinal() : bool
    {
        return (bool) ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_FINAL);
    }
    /**
     * Whether the method is static.
     *
     * @return bool
     */
    public function isStatic() : bool
    {
        return (bool) ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_STATIC);
    }
    /**
     * Whether the method is magic.
     *
     * @return bool
     */
    public function isMagic() : bool
    {
        return isset(self::$magicNames[$this->name->toLowerString()]);
    }
    public function getType() : string
    {
        return 'Stmt_ClassMethod';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class Unset_ extends \PhpParser\Node\Stmt
{
    /** @var Node\Expr[] Variables to unset */
    public $vars;
    /**
     * Constructs an unset node.
     *
     * @param Node\Expr[] $vars       Variables to unset
     * @param array       $attributes Additional attributes
     */
    public function __construct(array $vars, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->vars = $vars;
    }
    public function getSubNodeNames() : array
    {
        return ['vars'];
    }
    public function getType() : string
    {
        return 'Stmt_Unset';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
abstract class TraitUseAdaptation extends \PhpParser\Node\Stmt
{
    /** @var Node\Name|null Trait name */
    public $trait;
    /** @var Node\Identifier Method name */
    public $method;
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class Finally_ extends \PhpParser\Node\Stmt
{
    /** @var Node\Stmt[] Statements */
    public $stmts;
    /**
     * Constructs a finally node.
     *
     * @param Node\Stmt[] $stmts      Statements
     * @param array       $attributes Additional attributes
     */
    public function __construct(array $stmts = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->stmts = $stmts;
    }
    public function getSubNodeNames() : array
    {
        return ['stmts'];
    }
    public function getType() : string
    {
        return 'Stmt_Finally';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class Interface_ extends \PhpParser\Node\Stmt\ClassLike
{
    /** @var Node\Name[] Extended interfaces */
    public $extends;
    /**
     * Constructs a class node.
     *
     * @param string|Node\Identifier $name Name
     * @param array  $subNodes   Array of the following optional subnodes:
     *                           'extends' => array(): Name of extended interfaces
     *                           'stmts'   => array(): Statements
     * @param array  $attributes Additional attributes
     */
    public function __construct($name, array $subNodes = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->name = \is_string($name) ? new \PhpParser\Node\Identifier($name) : $name;
        $this->extends = $subNodes['extends'] ?? [];
        $this->stmts = $subNodes['stmts'] ?? [];
    }
    public function getSubNodeNames() : array
    {
        return ['name', 'extends', 'stmts'];
    }
    public function getType() : string
    {
        return 'Stmt_Interface';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class Else_ extends \PhpParser\Node\Stmt
{
    /** @var Node\Stmt[] Statements */
    public $stmts;
    /**
     * Constructs an else node.
     *
     * @param Node\Stmt[] $stmts      Statements
     * @param array       $attributes Additional attributes
     */
    public function __construct(array $stmts = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->stmts = $stmts;
    }
    public function getSubNodeNames() : array
    {
        return ['stmts'];
    }
    public function getType() : string
    {
        return 'Stmt_Else';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class While_ extends \PhpParser\Node\Stmt
{
    /** @var Node\Expr Condition */
    public $cond;
    /** @var Node\Stmt[] Statements */
    public $stmts;
    /**
     * Constructs a while node.
     *
     * @param Node\Expr   $cond       Condition
     * @param Node\Stmt[] $stmts      Statements
     * @param array       $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $cond, array $stmts = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->cond = $cond;
        $this->stmts = $stmts;
    }
    public function getSubNodeNames() : array
    {
        return ['cond', 'stmts'];
    }
    public function getType() : string
    {
        return 'Stmt_While';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node\Stmt;
class HaltCompiler extends \PhpParser\Node\Stmt
{
    /** @var string Remaining text after halt compiler statement. */
    public $remaining;
    /**
     * Constructs a __halt_compiler node.
     *
     * @param string $remaining  Remaining text after halt compiler statement.
     * @param array  $attributes Additional attributes
     */
    public function __construct(string $remaining, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->remaining = $remaining;
    }
    public function getSubNodeNames() : array
    {
        return ['remaining'];
    }
    public function getType() : string
    {
        return 'Stmt_HaltCompiler';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class DeclareDeclare extends \PhpParser\Node\Stmt
{
    /** @var Node\Identifier Key */
    public $key;
    /** @var Node\Expr Value */
    public $value;
    /**
     * Constructs a declare key=>value pair node.
     *
     * @param string|Node\Identifier $key        Key
     * @param Node\Expr              $value      Value
     * @param array                  $attributes Additional attributes
     */
    public function __construct($key, \PhpParser\Node\Expr $value, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->key = \is_string($key) ? new \PhpParser\Node\Identifier($key) : $key;
        $this->value = $value;
    }
    public function getSubNodeNames() : array
    {
        return ['key', 'value'];
    }
    public function getType() : string
    {
        return 'Stmt_DeclareDeclare';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node\Identifier;
use PhpParser\Node\Stmt;
class Goto_ extends \PhpParser\Node\Stmt
{
    /** @var Identifier Name of label to jump to */
    public $name;
    /**
     * Constructs a goto node.
     *
     * @param string|Identifier $name       Name of label to jump to
     * @param array             $attributes Additional attributes
     */
    public function __construct($name, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->name = \is_string($name) ? new \PhpParser\Node\Identifier($name) : $name;
    }
    public function getSubNodeNames() : array
    {
        return ['name'];
    }
    public function getType() : string
    {
        return 'Stmt_Goto';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node\Stmt;
class Static_ extends \PhpParser\Node\Stmt
{
    /** @var StaticVar[] Variable definitions */
    public $vars;
    /**
     * Constructs a static variables list node.
     *
     * @param StaticVar[] $vars       Variable definitions
     * @param array       $attributes Additional attributes
     */
    public function __construct(array $vars, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->vars = $vars;
    }
    public function getSubNodeNames() : array
    {
        return ['vars'];
    }
    public function getType() : string
    {
        return 'Stmt_Static';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class Return_ extends \PhpParser\Node\Stmt
{
    /** @var null|Node\Expr Expression */
    public $expr;
    /**
     * Constructs a return node.
     *
     * @param null|Node\Expr $expr       Expression
     * @param array          $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $expr = null, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }
    public function getSubNodeNames() : array
    {
        return ['expr'];
    }
    public function getType() : string
    {
        return 'Stmt_Return';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class TryCatch extends \PhpParser\Node\Stmt
{
    /** @var Node\Stmt[] Statements */
    public $stmts;
    /** @var Catch_[] Catches */
    public $catches;
    /** @var null|Finally_ Optional finally node */
    public $finally;
    /**
     * Constructs a try catch node.
     *
     * @param Node\Stmt[]   $stmts      Statements
     * @param Catch_[]      $catches    Catches
     * @param null|Finally_ $finally    Optionaly finally node
     * @param array         $attributes Additional attributes
     */
    public function __construct(array $stmts, array $catches, \PhpParser\Node\Stmt\Finally_ $finally = null, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->stmts = $stmts;
        $this->catches = $catches;
        $this->finally = $finally;
    }
    public function getSubNodeNames() : array
    {
        return ['stmts', 'catches', 'finally'];
    }
    public function getType() : string
    {
        return 'Stmt_TryCatch';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class Echo_ extends \PhpParser\Node\Stmt
{
    /** @var Node\Expr[] Expressions */
    public $exprs;
    /**
     * Constructs an echo node.
     *
     * @param Node\Expr[] $exprs      Expressions
     * @param array       $attributes Additional attributes
     */
    public function __construct(array $exprs, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->exprs = $exprs;
    }
    public function getSubNodeNames() : array
    {
        return ['exprs'];
    }
    public function getType() : string
    {
        return 'Stmt_Echo';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class Declare_ extends \PhpParser\Node\Stmt
{
    /** @var DeclareDeclare[] List of declares */
    public $declares;
    /** @var Node\Stmt[]|null Statements */
    public $stmts;
    /**
     * Constructs a declare node.
     *
     * @param DeclareDeclare[] $declares   List of declares
     * @param Node\Stmt[]|null $stmts      Statements
     * @param array            $attributes Additional attributes
     */
    public function __construct(array $declares, array $stmts = null, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->declares = $declares;
        $this->stmts = $stmts;
    }
    public function getSubNodeNames() : array
    {
        return ['declares', 'stmts'];
    }
    public function getType() : string
    {
        return 'Stmt_Declare';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
use PhpParser\Node\Identifier;
use PhpParser\Node\Name;
use PhpParser\Node\NullableType;
class Property extends \PhpParser\Node\Stmt
{
    /** @var int Modifiers */
    public $flags;
    /** @var PropertyProperty[] Properties */
    public $props;
    /** @var null|Identifier|Name|NullableType Type declaration */
    public $type;
    /**
     * Constructs a class property list node.
     *
     * @param int                                      $flags      Modifiers
     * @param PropertyProperty[]                       $props      Properties
     * @param array                                    $attributes Additional attributes
     * @param null|string|Identifier|Name|NullableType $type       Type declaration
     */
    public function __construct(int $flags, array $props, array $attributes = [], $type = null)
    {
        $this->attributes = $attributes;
        $this->flags = $flags;
        $this->props = $props;
        $this->type = \is_string($type) ? new \PhpParser\Node\Identifier($type) : $type;
    }
    public function getSubNodeNames() : array
    {
        return ['flags', 'type', 'props'];
    }
    /**
     * Whether the property is explicitly or implicitly public.
     *
     * @return bool
     */
    public function isPublic() : bool
    {
        return ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_PUBLIC) !== 0 || ($this->flags & \PhpParser\Node\Stmt\Class_::VISIBILITY_MODIFIER_MASK) === 0;
    }
    /**
     * Whether the property is protected.
     *
     * @return bool
     */
    public function isProtected() : bool
    {
        return (bool) ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_PROTECTED);
    }
    /**
     * Whether the property is private.
     *
     * @return bool
     */
    public function isPrivate() : bool
    {
        return (bool) ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_PRIVATE);
    }
    /**
     * Whether the property is static.
     *
     * @return bool
     */
    public function isStatic() : bool
    {
        return (bool) ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_STATIC);
    }
    public function getType() : string
    {
        return 'Stmt_Property';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class Break_ extends \PhpParser\Node\Stmt
{
    /** @var null|Node\Expr Number of loops to break */
    public $num;
    /**
     * Constructs a break node.
     *
     * @param null|Node\Expr $num        Number of loops to break
     * @param array          $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $num = null, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->num = $num;
    }
    public function getSubNodeNames() : array
    {
        return ['num'];
    }
    public function getType() : string
    {
        return 'Stmt_Break';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class If_ extends \PhpParser\Node\Stmt
{
    /** @var Node\Expr Condition expression */
    public $cond;
    /** @var Node\Stmt[] Statements */
    public $stmts;
    /** @var ElseIf_[] Elseif clauses */
    public $elseifs;
    /** @var null|Else_ Else clause */
    public $else;
    /**
     * Constructs an if node.
     *
     * @param Node\Expr $cond       Condition
     * @param array     $subNodes   Array of the following optional subnodes:
     *                              'stmts'   => array(): Statements
     *                              'elseifs' => array(): Elseif clauses
     *                              'else'    => null   : Else clause
     * @param array     $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $cond, array $subNodes = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->cond = $cond;
        $this->stmts = $subNodes['stmts'] ?? [];
        $this->elseifs = $subNodes['elseifs'] ?? [];
        $this->else = $subNodes['else'] ?? null;
    }
    public function getSubNodeNames() : array
    {
        return ['cond', 'stmts', 'elseifs', 'else'];
    }
    public function getType() : string
    {
        return 'Stmt_If';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class Const_ extends \PhpParser\Node\Stmt
{
    /** @var Node\Const_[] Constant declarations */
    public $consts;
    /**
     * Constructs a const list node.
     *
     * @param Node\Const_[] $consts     Constant declarations
     * @param array         $attributes Additional attributes
     */
    public function __construct(array $consts, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->consts = $consts;
    }
    public function getSubNodeNames() : array
    {
        return ['consts'];
    }
    public function getType() : string
    {
        return 'Stmt_Const';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
use PhpParser\Node\FunctionLike;
/**
 * @property Node\Name $namespacedName Namespaced name (if using NameResolver)
 */
class Function_ extends \PhpParser\Node\Stmt implements \PhpParser\Node\FunctionLike
{
    /** @var bool Whether function returns by reference */
    public $byRef;
    /** @var Node\Identifier Name */
    public $name;
    /** @var Node\Param[] Parameters */
    public $params;
    /** @var null|Node\Identifier|Node\Name|Node\NullableType Return type */
    public $returnType;
    /** @var Node\Stmt[] Statements */
    public $stmts;
    /**
     * Constructs a function node.
     *
     * @param string|Node\Identifier $name Name
     * @param array  $subNodes   Array of the following optional subnodes:
     *                           'byRef'      => false  : Whether to return by reference
     *                           'params'     => array(): Parameters
     *                           'returnType' => null   : Return type
     *                           'stmts'      => array(): Statements
     * @param array  $attributes Additional attributes
     */
    public function __construct($name, array $subNodes = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->byRef = $subNodes['byRef'] ?? \false;
        $this->name = \is_string($name) ? new \PhpParser\Node\Identifier($name) : $name;
        $this->params = $subNodes['params'] ?? [];
        $returnType = $subNodes['returnType'] ?? null;
        $this->returnType = \is_string($returnType) ? new \PhpParser\Node\Identifier($returnType) : $returnType;
        $this->stmts = $subNodes['stmts'] ?? [];
    }
    public function getSubNodeNames() : array
    {
        return ['byRef', 'name', 'params', 'returnType', 'stmts'];
    }
    public function returnsByRef() : bool
    {
        return $this->byRef;
    }
    public function getParams() : array
    {
        return $this->params;
    }
    public function getReturnType()
    {
        return $this->returnType;
    }
    /** @return Node\Stmt[] */
    public function getStmts() : array
    {
        return $this->stmts;
    }
    public function getType() : string
    {
        return 'Stmt_Function';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class Switch_ extends \PhpParser\Node\Stmt
{
    /** @var Node\Expr Condition */
    public $cond;
    /** @var Case_[] Case list */
    public $cases;
    /**
     * Constructs a case node.
     *
     * @param Node\Expr $cond       Condition
     * @param Case_[]   $cases      Case list
     * @param array     $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $cond, array $cases, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->cond = $cond;
        $this->cases = $cases;
    }
    public function getSubNodeNames() : array
    {
        return ['cond', 'cases'];
    }
    public function getType() : string
    {
        return 'Stmt_Switch';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class Foreach_ extends \PhpParser\Node\Stmt
{
    /** @var Node\Expr Expression to iterate */
    public $expr;
    /** @var null|Node\Expr Variable to assign key to */
    public $keyVar;
    /** @var bool Whether to assign value by reference */
    public $byRef;
    /** @var Node\Expr Variable to assign value to */
    public $valueVar;
    /** @var Node\Stmt[] Statements */
    public $stmts;
    /**
     * Constructs a foreach node.
     *
     * @param Node\Expr $expr       Expression to iterate
     * @param Node\Expr $valueVar   Variable to assign value to
     * @param array     $subNodes   Array of the following optional subnodes:
     *                              'keyVar' => null   : Variable to assign key to
     *                              'byRef'  => false  : Whether to assign value by reference
     *                              'stmts'  => array(): Statements
     * @param array     $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $expr, \PhpParser\Node\Expr $valueVar, array $subNodes = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->expr = $expr;
        $this->keyVar = $subNodes['keyVar'] ?? null;
        $this->byRef = $subNodes['byRef'] ?? \false;
        $this->valueVar = $valueVar;
        $this->stmts = $subNodes['stmts'] ?? [];
    }
    public function getSubNodeNames() : array
    {
        return ['expr', 'keyVar', 'byRef', 'valueVar', 'stmts'];
    }
    public function getType() : string
    {
        return 'Stmt_Foreach';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class For_ extends \PhpParser\Node\Stmt
{
    /** @var Node\Expr[] Init expressions */
    public $init;
    /** @var Node\Expr[] Loop conditions */
    public $cond;
    /** @var Node\Expr[] Loop expressions */
    public $loop;
    /** @var Node\Stmt[] Statements */
    public $stmts;
    /**
     * Constructs a for loop node.
     *
     * @param array $subNodes   Array of the following optional subnodes:
     *                          'init'  => array(): Init expressions
     *                          'cond'  => array(): Loop conditions
     *                          'loop'  => array(): Loop expressions
     *                          'stmts' => array(): Statements
     * @param array $attributes Additional attributes
     */
    public function __construct(array $subNodes = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->init = $subNodes['init'] ?? [];
        $this->cond = $subNodes['cond'] ?? [];
        $this->loop = $subNodes['loop'] ?? [];
        $this->stmts = $subNodes['stmts'] ?? [];
    }
    public function getSubNodeNames() : array
    {
        return ['init', 'cond', 'loop', 'stmts'];
    }
    public function getType() : string
    {
        return 'Stmt_For';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class Do_ extends \PhpParser\Node\Stmt
{
    /** @var Node\Stmt[] Statements */
    public $stmts;
    /** @var Node\Expr Condition */
    public $cond;
    /**
     * Constructs a do while node.
     *
     * @param Node\Expr   $cond       Condition
     * @param Node\Stmt[] $stmts      Statements
     * @param array       $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $cond, array $stmts = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->cond = $cond;
        $this->stmts = $stmts;
    }
    public function getSubNodeNames() : array
    {
        return ['stmts', 'cond'];
    }
    public function getType() : string
    {
        return 'Stmt_Do';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node\Name;
use PhpParser\Node\Stmt;
class GroupUse extends \PhpParser\Node\Stmt
{
    /** @var int Type of group use */
    public $type;
    /** @var Name Prefix for uses */
    public $prefix;
    /** @var UseUse[] Uses */
    public $uses;
    /**
     * Constructs a group use node.
     *
     * @param Name     $prefix     Prefix for uses
     * @param UseUse[] $uses       Uses
     * @param int      $type       Type of group use
     * @param array    $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Name $prefix, array $uses, int $type = \PhpParser\Node\Stmt\Use_::TYPE_NORMAL, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->type = $type;
        $this->prefix = $prefix;
        $this->uses = $uses;
    }
    public function getSubNodeNames() : array
    {
        return ['type', 'prefix', 'uses'];
    }
    public function getType() : string
    {
        return 'Stmt_GroupUse';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
/**
 * @property Node\Name $namespacedName Namespaced name (if using NameResolver)
 */
abstract class ClassLike extends \PhpParser\Node\Stmt
{
    /** @var Node\Identifier|null Name */
    public $name;
    /** @var Node\Stmt[] Statements */
    public $stmts;
    /**
     * Gets all methods defined directly in this class/interface/trait
     *
     * @return ClassMethod[]
     */
    public function getMethods() : array
    {
        $methods = [];
        foreach ($this->stmts as $stmt) {
            if ($stmt instanceof \PhpParser\Node\Stmt\ClassMethod) {
                $methods[] = $stmt;
            }
        }
        return $methods;
    }
    /**
     * Gets method with the given name defined directly in this class/interface/trait.
     *
     * @param string $name Name of the method (compared case-insensitively)
     *
     * @return ClassMethod|null Method node or null if the method does not exist
     */
    public function getMethod(string $name)
    {
        $lowerName = \strtolower($name);
        foreach ($this->stmts as $stmt) {
            if ($stmt instanceof \PhpParser\Node\Stmt\ClassMethod && $lowerName === $stmt->name->toLowerString()) {
                return $stmt;
            }
        }
        return null;
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node\Stmt;
class Use_ extends \PhpParser\Node\Stmt
{
    /**
     * Unknown type. Both Stmt\Use_ / Stmt\GroupUse and Stmt\UseUse have a $type property, one of them will always be
     * TYPE_UNKNOWN while the other has one of the three other possible types. For normal use statements the type on the
     * Stmt\UseUse is unknown. It's only the other way around for mixed group use declarations.
     */
    const TYPE_UNKNOWN = 0;
    /** Class or namespace import */
    const TYPE_NORMAL = 1;
    /** Function import */
    const TYPE_FUNCTION = 2;
    /** Constant import */
    const TYPE_CONSTANT = 3;
    /** @var int Type of alias */
    public $type;
    /** @var UseUse[] Aliases */
    public $uses;
    /**
     * Constructs an alias (use) list node.
     *
     * @param UseUse[] $uses       Aliases
     * @param int      $type       Type of alias
     * @param array    $attributes Additional attributes
     */
    public function __construct(array $uses, int $type = self::TYPE_NORMAL, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->type = $type;
        $this->uses = $uses;
    }
    public function getSubNodeNames() : array
    {
        return ['type', 'uses'];
    }
    public function getType() : string
    {
        return 'Stmt_Use';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node\Stmt;
class InlineHTML extends \PhpParser\Node\Stmt
{
    /** @var string String */
    public $value;
    /**
     * Constructs an inline HTML node.
     *
     * @param string $value      String
     * @param array  $attributes Additional attributes
     */
    public function __construct(string $value, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->value = $value;
    }
    public function getSubNodeNames() : array
    {
        return ['value'];
    }
    public function getType() : string
    {
        return 'Stmt_InlineHTML';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class ClassConst extends \PhpParser\Node\Stmt
{
    /** @var int Modifiers */
    public $flags;
    /** @var Node\Const_[] Constant declarations */
    public $consts;
    /**
     * Constructs a class const list node.
     *
     * @param Node\Const_[] $consts     Constant declarations
     * @param int           $flags      Modifiers
     * @param array         $attributes Additional attributes
     */
    public function __construct(array $consts, int $flags = 0, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->flags = $flags;
        $this->consts = $consts;
    }
    public function getSubNodeNames() : array
    {
        return ['flags', 'consts'];
    }
    /**
     * Whether constant is explicitly or implicitly public.
     *
     * @return bool
     */
    public function isPublic() : bool
    {
        return ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_PUBLIC) !== 0 || ($this->flags & \PhpParser\Node\Stmt\Class_::VISIBILITY_MODIFIER_MASK) === 0;
    }
    /**
     * Whether constant is protected.
     *
     * @return bool
     */
    public function isProtected() : bool
    {
        return (bool) ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_PROTECTED);
    }
    /**
     * Whether constant is private.
     *
     * @return bool
     */
    public function isPrivate() : bool
    {
        return (bool) ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_PRIVATE);
    }
    public function getType() : string
    {
        return 'Stmt_ClassConst';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class ElseIf_ extends \PhpParser\Node\Stmt
{
    /** @var Node\Expr Condition */
    public $cond;
    /** @var Node\Stmt[] Statements */
    public $stmts;
    /**
     * Constructs an elseif node.
     *
     * @param Node\Expr   $cond       Condition
     * @param Node\Stmt[] $stmts      Statements
     * @param array       $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $cond, array $stmts = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->cond = $cond;
        $this->stmts = $stmts;
    }
    public function getSubNodeNames() : array
    {
        return ['cond', 'stmts'];
    }
    public function getType() : string
    {
        return 'Stmt_ElseIf';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
/** Nop/empty statement (;). */
class Nop extends \PhpParser\Node\Stmt
{
    public function getSubNodeNames() : array
    {
        return [];
    }
    public function getType() : string
    {
        return 'Stmt_Nop';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Stmt;

use PhpParser\Node;
class Trait_ extends \PhpParser\Node\Stmt\ClassLike
{
    /**
     * Constructs a trait node.
     *
     * @param string|Node\Identifier $name Name
     * @param array  $subNodes   Array of the following optional subnodes:
     *                           'stmts' => array(): Statements
     * @param array  $attributes Additional attributes
     */
    public function __construct($name, array $subNodes = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->name = \is_string($name) ? new \PhpParser\Node\Identifier($name) : $name;
        $this->stmts = $subNodes['stmts'] ?? [];
    }
    public function getSubNodeNames() : array
    {
        return ['name', 'stmts'];
    }
    public function getType() : string
    {
        return 'Stmt_Trait';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node;

use PhpParser\NodeAbstract;
class NullableType extends \PhpParser\NodeAbstract
{
    /** @var Identifier|Name Type */
    public $type;
    /**
     * Constructs a nullable type (wrapping another type).
     *
     * @param string|Identifier|Name $type       Type
     * @param array                  $attributes Additional attributes
     */
    public function __construct($type, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->type = \is_string($type) ? new \PhpParser\Node\Identifier($type) : $type;
    }
    public function getSubNodeNames() : array
    {
        return ['type'];
    }
    public function getType() : string
    {
        return 'NullableType';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node;

use PhpParser\NodeAbstract;
/**
 * Represents a non-namespaced name. Namespaced names are represented using Name nodes.
 */
class Identifier extends \PhpParser\NodeAbstract
{
    /** @var string Identifier as string */
    public $name;
    private static $specialClassNames = ['self' => \true, 'parent' => \true, 'static' => \true];
    /**
     * Constructs an identifier node.
     *
     * @param string $name       Identifier as string
     * @param array  $attributes Additional attributes
     */
    public function __construct(string $name, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->name = $name;
    }
    public function getSubNodeNames() : array
    {
        return ['name'];
    }
    /**
     * Get identifier as string.
     *
     * @return string Identifier as string.
     */
    public function toString() : string
    {
        return $this->name;
    }
    /**
     * Get lowercased identifier as string.
     *
     * @return string Lowercased identifier as string
     */
    public function toLowerString() : string
    {
        return \strtolower($this->name);
    }
    /**
     * Checks whether the identifier is a special class name (self, parent or static).
     *
     * @return bool Whether identifier is a special class name
     */
    public function isSpecialClassName() : bool
    {
        return isset(self::$specialClassNames[\strtolower($this->name)]);
    }
    /**
     * Get identifier as string.
     *
     * @return string Identifier as string
     */
    public function __toString() : string
    {
        return $this->name;
    }
    public function getType() : string
    {
        return 'Identifier';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node;

use PhpParser\NodeAbstract;
class Param extends \PhpParser\NodeAbstract
{
    /** @var null|Identifier|Name|NullableType Type declaration */
    public $type;
    /** @var bool Whether parameter is passed by reference */
    public $byRef;
    /** @var bool Whether this is a variadic argument */
    public $variadic;
    /** @var Expr\Variable|Expr\Error Parameter variable */
    public $var;
    /** @var null|Expr Default value */
    public $default;
    /**
     * Constructs a parameter node.
     *
     * @param Expr\Variable|Expr\Error                 $var        Parameter variable
     * @param null|Expr                                $default    Default value
     * @param null|string|Identifier|Name|NullableType $type       Type declaration
     * @param bool                                     $byRef      Whether is passed by reference
     * @param bool                                     $variadic   Whether this is a variadic argument
     * @param array                                    $attributes Additional attributes
     */
    public function __construct($var, \PhpParser\Node\Expr $default = null, $type = null, bool $byRef = \false, bool $variadic = \false, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->type = \is_string($type) ? new \PhpParser\Node\Identifier($type) : $type;
        $this->byRef = $byRef;
        $this->variadic = $variadic;
        $this->var = $var;
        $this->default = $default;
    }
    public function getSubNodeNames() : array
    {
        return ['type', 'byRef', 'variadic', 'var', 'default'];
    }
    public function getType() : string
    {
        return 'Param';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
abstract class BinaryOp extends \PhpParser\Node\Expr
{
    /** @var Expr The left hand side expression */
    public $left;
    /** @var Expr The right hand side expression */
    public $right;
    /**
     * Constructs a binary operator node.
     *
     * @param Expr  $left       The left hand side expression
     * @param Expr  $right      The right hand side expression
     * @param array $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $left, \PhpParser\Node\Expr $right, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->left = $left;
        $this->right = $right;
    }
    public function getSubNodeNames() : array
    {
        return ['left', 'right'];
    }
    /**
     * Get the operator sigil for this binary operation.
     *
     * In the case there are multiple possible sigils for an operator, this method does not
     * necessarily return the one used in the parsed code.
     *
     * @return string
     */
    public abstract function getOperatorSigil() : string;
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class List_ extends \PhpParser\Node\Expr
{
    /** @var (ArrayItem|null)[] List of items to assign to */
    public $items;
    /**
     * Constructs a list() destructuring node.
     *
     * @param (ArrayItem|null)[] $items      List of items to assign to
     * @param array              $attributes Additional attributes
     */
    public function __construct(array $items, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->items = $items;
    }
    public function getSubNodeNames() : array
    {
        return ['items'];
    }
    public function getType() : string
    {
        return 'Expr_List';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class ShellExec extends \PhpParser\Node\Expr
{
    /** @var array Encapsed string array */
    public $parts;
    /**
     * Constructs a shell exec (backtick) node.
     *
     * @param array $parts      Encapsed string array
     * @param array $attributes Additional attributes
     */
    public function __construct(array $parts, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->parts = $parts;
    }
    public function getSubNodeNames() : array
    {
        return ['parts'];
    }
    public function getType() : string
    {
        return 'Expr_ShellExec';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
use PhpParser\Node\Name;
class ConstFetch extends \PhpParser\Node\Expr
{
    /** @var Name Constant name */
    public $name;
    /**
     * Constructs a const fetch node.
     *
     * @param Name  $name       Constant name
     * @param array $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Name $name, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->name = $name;
    }
    public function getSubNodeNames() : array
    {
        return ['name'];
    }
    public function getType() : string
    {
        return 'Expr_ConstFetch';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
abstract class Cast extends \PhpParser\Node\Expr
{
    /** @var Expr Expression */
    public $expr;
    /**
     * Constructs a cast node.
     *
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $expr, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }
    public function getSubNodeNames() : array
    {
        return ['expr'];
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class Include_ extends \PhpParser\Node\Expr
{
    const TYPE_INCLUDE = 1;
    const TYPE_INCLUDE_ONCE = 2;
    const TYPE_REQUIRE = 3;
    const TYPE_REQUIRE_ONCE = 4;
    /** @var Expr Expression */
    public $expr;
    /** @var int Type of include */
    public $type;
    /**
     * Constructs an include node.
     *
     * @param Expr  $expr       Expression
     * @param int   $type       Type of include
     * @param array $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $expr, int $type, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->expr = $expr;
        $this->type = $type;
    }
    public function getSubNodeNames() : array
    {
        return ['expr', 'type'];
    }
    public function getType() : string
    {
        return 'Expr_Include';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
use PhpParser\Node\Name;
use PhpParser\Node\VarLikeIdentifier;
class StaticPropertyFetch extends \PhpParser\Node\Expr
{
    /** @var Name|Expr Class name */
    public $class;
    /** @var VarLikeIdentifier|Expr Property name */
    public $name;
    /**
     * Constructs a static property fetch node.
     *
     * @param Name|Expr                     $class      Class name
     * @param string|VarLikeIdentifier|Expr $name       Property name
     * @param array                         $attributes Additional attributes
     */
    public function __construct($class, $name, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->class = $class;
        $this->name = \is_string($name) ? new \PhpParser\Node\VarLikeIdentifier($name) : $name;
    }
    public function getSubNodeNames() : array
    {
        return ['class', 'name'];
    }
    public function getType() : string
    {
        return 'Expr_StaticPropertyFetch';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class Variable extends \PhpParser\Node\Expr
{
    /** @var string|Expr Name */
    public $name;
    /**
     * Constructs a variable node.
     *
     * @param string|Expr $name       Name
     * @param array                      $attributes Additional attributes
     */
    public function __construct($name, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->name = $name;
    }
    public function getSubNodeNames() : array
    {
        return ['name'];
    }
    public function getType() : string
    {
        return 'Expr_Variable';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class Print_ extends \PhpParser\Node\Expr
{
    /** @var Expr Expression */
    public $expr;
    /**
     * Constructs an print() node.
     *
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $expr, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }
    public function getSubNodeNames() : array
    {
        return ['expr'];
    }
    public function getType() : string
    {
        return 'Expr_Print';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class PreInc extends \PhpParser\Node\Expr
{
    /** @var Expr Variable */
    public $var;
    /**
     * Constructs a pre increment node.
     *
     * @param Expr  $var        Variable
     * @param array $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $var, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->var = $var;
    }
    public function getSubNodeNames() : array
    {
        return ['var'];
    }
    public function getType() : string
    {
        return 'Expr_PreInc';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\Identifier;
class StaticCall extends \PhpParser\Node\Expr
{
    /** @var Node\Name|Expr Class name */
    public $class;
    /** @var Identifier|Expr Method name */
    public $name;
    /** @var Node\Arg[] Arguments */
    public $args;
    /**
     * Constructs a static method call node.
     *
     * @param Node\Name|Expr         $class      Class name
     * @param string|Identifier|Expr $name       Method name
     * @param Node\Arg[]             $args       Arguments
     * @param array                  $attributes Additional attributes
     */
    public function __construct($class, $name, array $args = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->class = $class;
        $this->name = \is_string($name) ? new \PhpParser\Node\Identifier($name) : $name;
        $this->args = $args;
    }
    public function getSubNodeNames() : array
    {
        return ['class', 'name', 'args'];
    }
    public function getType() : string
    {
        return 'Expr_StaticCall';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class YieldFrom extends \PhpParser\Node\Expr
{
    /** @var Expr Expression to yield from */
    public $expr;
    /**
     * Constructs an "yield from" node.
     *
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $expr, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }
    public function getSubNodeNames() : array
    {
        return ['expr'];
    }
    public function getType() : string
    {
        return 'Expr_YieldFrom';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\FunctionLike;
class Closure extends \PhpParser\Node\Expr implements \PhpParser\Node\FunctionLike
{
    /** @var bool Whether the closure is static */
    public $static;
    /** @var bool Whether to return by reference */
    public $byRef;
    /** @var Node\Param[] Parameters */
    public $params;
    /** @var ClosureUse[] use()s */
    public $uses;
    /** @var null|Node\Identifier|Node\Name|Node\NullableType Return type */
    public $returnType;
    /** @var Node\Stmt[] Statements */
    public $stmts;
    /**
     * Constructs a lambda function node.
     *
     * @param array $subNodes   Array of the following optional subnodes:
     *                          'static'     => false  : Whether the closure is static
     *                          'byRef'      => false  : Whether to return by reference
     *                          'params'     => array(): Parameters
     *                          'uses'       => array(): use()s
     *                          'returnType' => null   : Return type
     *                          'stmts'      => array(): Statements
     * @param array $attributes Additional attributes
     */
    public function __construct(array $subNodes = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->static = $subNodes['static'] ?? \false;
        $this->byRef = $subNodes['byRef'] ?? \false;
        $this->params = $subNodes['params'] ?? [];
        $this->uses = $subNodes['uses'] ?? [];
        $returnType = $subNodes['returnType'] ?? null;
        $this->returnType = \is_string($returnType) ? new \PhpParser\Node\Identifier($returnType) : $returnType;
        $this->stmts = $subNodes['stmts'] ?? [];
    }
    public function getSubNodeNames() : array
    {
        return ['static', 'byRef', 'params', 'uses', 'returnType', 'stmts'];
    }
    public function returnsByRef() : bool
    {
        return $this->byRef;
    }
    public function getParams() : array
    {
        return $this->params;
    }
    public function getReturnType()
    {
        return $this->returnType;
    }
    /** @return Node\Stmt[] */
    public function getStmts() : array
    {
        return $this->stmts;
    }
    public function getType() : string
    {
        return 'Expr_Closure';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\Cast;

use PhpParser\Node\Expr\Cast;
class Int_ extends \PhpParser\Node\Expr\Cast
{
    public function getType() : string
    {
        return 'Expr_Cast_Int';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\Cast;

use PhpParser\Node\Expr\Cast;
class Object_ extends \PhpParser\Node\Expr\Cast
{
    public function getType() : string
    {
        return 'Expr_Cast_Object';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\Cast;

use PhpParser\Node\Expr\Cast;
class Double extends \PhpParser\Node\Expr\Cast
{
    // For use in "kind" attribute
    const KIND_DOUBLE = 1;
    // "double" syntax
    const KIND_FLOAT = 2;
    // "float" syntax
    const KIND_REAL = 3;
    // "real" syntax
    public function getType() : string
    {
        return 'Expr_Cast_Double';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\Cast;

use PhpParser\Node\Expr\Cast;
class String_ extends \PhpParser\Node\Expr\Cast
{
    public function getType() : string
    {
        return 'Expr_Cast_String';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\Cast;

use PhpParser\Node\Expr\Cast;
class Unset_ extends \PhpParser\Node\Expr\Cast
{
    public function getType() : string
    {
        return 'Expr_Cast_Unset';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\Cast;

use PhpParser\Node\Expr\Cast;
class Bool_ extends \PhpParser\Node\Expr\Cast
{
    public function getType() : string
    {
        return 'Expr_Cast_Bool';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\Cast;

use PhpParser\Node\Expr\Cast;
class Array_ extends \PhpParser\Node\Expr\Cast
{
    public function getType() : string
    {
        return 'Expr_Cast_Array';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class PostDec extends \PhpParser\Node\Expr
{
    /** @var Expr Variable */
    public $var;
    /**
     * Constructs a post decrement node.
     *
     * @param Expr  $var        Variable
     * @param array $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $var, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->var = $var;
    }
    public function getSubNodeNames() : array
    {
        return ['var'];
    }
    public function getType() : string
    {
        return 'Expr_PostDec';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class UnaryMinus extends \PhpParser\Node\Expr
{
    /** @var Expr Expression */
    public $expr;
    /**
     * Constructs a unary minus node.
     *
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $expr, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }
    public function getSubNodeNames() : array
    {
        return ['expr'];
    }
    public function getType() : string
    {
        return 'Expr_UnaryMinus';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
use PhpParser\Node\Identifier;
use PhpParser\Node\Name;
class ClassConstFetch extends \PhpParser\Node\Expr
{
    /** @var Name|Expr Class name */
    public $class;
    /** @var Identifier|Error Constant name */
    public $name;
    /**
     * Constructs a class const fetch node.
     *
     * @param Name|Expr               $class      Class name
     * @param string|Identifier|Error $name       Constant name
     * @param array                   $attributes Additional attributes
     */
    public function __construct($class, $name, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->class = $class;
        $this->name = \is_string($name) ? new \PhpParser\Node\Identifier($name) : $name;
    }
    public function getSubNodeNames() : array
    {
        return ['class', 'name'];
    }
    public function getType() : string
    {
        return 'Expr_ClassConstFetch';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class BitwiseNot extends \PhpParser\Node\Expr
{
    /** @var Expr Expression */
    public $expr;
    /**
     * Constructs a bitwise not node.
     *
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $expr, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }
    public function getSubNodeNames() : array
    {
        return ['expr'];
    }
    public function getType() : string
    {
        return 'Expr_BitwiseNot';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class ErrorSuppress extends \PhpParser\Node\Expr
{
    /** @var Expr Expression */
    public $expr;
    /**
     * Constructs an error suppress node.
     *
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $expr, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }
    public function getSubNodeNames() : array
    {
        return ['expr'];
    }
    public function getType() : string
    {
        return 'Expr_ErrorSuppress';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\FunctionLike;
class ArrowFunction extends \PhpParser\Node\Expr implements \PhpParser\Node\FunctionLike
{
    /** @var bool */
    public $static;
    /** @var bool */
    public $byRef;
    /** @var Node\Param[] */
    public $params = [];
    /** @var null|Node\Identifier|Node\Name|Node\NullableType */
    public $returnType;
    /** @var Expr */
    public $expr;
    /**
     * @param array $subNodes   Array of the following optional subnodes:
     *                          'static'     => false   : Whether the closure is static
     *                          'byRef'      => false   : Whether to return by reference
     *                          'params'     => array() : Parameters
     *                          'returnType' => null    : Return type
     *                          'expr'       => Expr    : Expression body
     * @param array $attributes Additional attributes
     */
    public function __construct(array $subNodes = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->static = $subNodes['static'] ?? \false;
        $this->byRef = $subNodes['byRef'] ?? \false;
        $this->params = $subNodes['params'] ?? [];
        $returnType = $subNodes['returnType'] ?? null;
        $this->returnType = \is_string($returnType) ? new \PhpParser\Node\Identifier($returnType) : $returnType;
        $this->expr = $subNodes['expr'] ?? null;
    }
    public function getSubNodeNames() : array
    {
        return ['static', 'byRef', 'params', 'returnType', 'expr'];
    }
    public function returnsByRef() : bool
    {
        return $this->byRef;
    }
    public function getParams() : array
    {
        return $this->params;
    }
    public function getReturnType()
    {
        return $this->returnType;
    }
    /**
     * @return Node\Stmt\Return_[]
     */
    public function getStmts() : array
    {
        return [new \PhpParser\Node\Stmt\Return_($this->expr)];
    }
    public function getType() : string
    {
        return 'Expr_ArrowFunction';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class Eval_ extends \PhpParser\Node\Expr
{
    /** @var Expr Expression */
    public $expr;
    /**
     * Constructs an eval() node.
     *
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $expr, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }
    public function getSubNodeNames() : array
    {
        return ['expr'];
    }
    public function getType() : string
    {
        return 'Expr_Eval';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class ArrayDimFetch extends \PhpParser\Node\Expr
{
    /** @var Expr Variable */
    public $var;
    /** @var null|Expr Array index / dim */
    public $dim;
    /**
     * Constructs an array index fetch node.
     *
     * @param Expr      $var        Variable
     * @param null|Expr $dim        Array index / dim
     * @param array     $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $var, \PhpParser\Node\Expr $dim = null, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->var = $var;
        $this->dim = $dim;
    }
    public function getSubNodeNames() : array
    {
        return ['var', 'dim'];
    }
    public function getType() : string
    {
        return 'Expr_ArrayDimFetch';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Arg;
use PhpParser\Node\Expr;
use PhpParser\Node\Identifier;
class MethodCall extends \PhpParser\Node\Expr
{
    /** @var Expr Variable holding object */
    public $var;
    /** @var Identifier|Expr Method name */
    public $name;
    /** @var Arg[] Arguments */
    public $args;
    /**
     * Constructs a function call node.
     *
     * @param Expr                   $var        Variable holding object
     * @param string|Identifier|Expr $name       Method name
     * @param Arg[]                  $args       Arguments
     * @param array                  $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $var, $name, array $args = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->var = $var;
        $this->name = \is_string($name) ? new \PhpParser\Node\Identifier($name) : $name;
        $this->args = $args;
    }
    public function getSubNodeNames() : array
    {
        return ['var', 'name', 'args'];
    }
    public function getType() : string
    {
        return 'Expr_MethodCall';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
use PhpParser\Node\Identifier;
class PropertyFetch extends \PhpParser\Node\Expr
{
    /** @var Expr Variable holding object */
    public $var;
    /** @var Identifier|Expr Property name */
    public $name;
    /**
     * Constructs a function call node.
     *
     * @param Expr                   $var        Variable holding object
     * @param string|Identifier|Expr $name       Property name
     * @param array                  $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $var, $name, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->var = $var;
        $this->name = \is_string($name) ? new \PhpParser\Node\Identifier($name) : $name;
    }
    public function getSubNodeNames() : array
    {
        return ['var', 'name'];
    }
    public function getType() : string
    {
        return 'Expr_PropertyFetch';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;
class Plus extends \PhpParser\Node\Expr\AssignOp
{
    public function getType() : string
    {
        return 'Expr_AssignOp_Plus';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;
class ShiftRight extends \PhpParser\Node\Expr\AssignOp
{
    public function getType() : string
    {
        return 'Expr_AssignOp_ShiftRight';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;
class Div extends \PhpParser\Node\Expr\AssignOp
{
    public function getType() : string
    {
        return 'Expr_AssignOp_Div';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;
class Mod extends \PhpParser\Node\Expr\AssignOp
{
    public function getType() : string
    {
        return 'Expr_AssignOp_Mod';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;
class BitwiseOr extends \PhpParser\Node\Expr\AssignOp
{
    public function getType() : string
    {
        return 'Expr_AssignOp_BitwiseOr';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;
class Minus extends \PhpParser\Node\Expr\AssignOp
{
    public function getType() : string
    {
        return 'Expr_AssignOp_Minus';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;
class Pow extends \PhpParser\Node\Expr\AssignOp
{
    public function getType() : string
    {
        return 'Expr_AssignOp_Pow';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;
class Mul extends \PhpParser\Node\Expr\AssignOp
{
    public function getType() : string
    {
        return 'Expr_AssignOp_Mul';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;
class Concat extends \PhpParser\Node\Expr\AssignOp
{
    public function getType() : string
    {
        return 'Expr_AssignOp_Concat';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;
class ShiftLeft extends \PhpParser\Node\Expr\AssignOp
{
    public function getType() : string
    {
        return 'Expr_AssignOp_ShiftLeft';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;
class BitwiseXor extends \PhpParser\Node\Expr\AssignOp
{
    public function getType() : string
    {
        return 'Expr_AssignOp_BitwiseXor';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;
class Coalesce extends \PhpParser\Node\Expr\AssignOp
{
    public function getType() : string
    {
        return 'Expr_AssignOp_Coalesce';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;
class BitwiseAnd extends \PhpParser\Node\Expr\AssignOp
{
    public function getType() : string
    {
        return 'Expr_AssignOp_BitwiseAnd';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class Plus extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '+';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_Plus';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class Greater extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '>';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_Greater';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class LogicalOr extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return 'or';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_LogicalOr';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class Spaceship extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '<=>';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_Spaceship';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class Smaller extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '<';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_Smaller';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class ShiftRight extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '>>';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_ShiftRight';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class BooleanOr extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '||';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_BooleanOr';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class LogicalAnd extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return 'and';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_LogicalAnd';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class Equal extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '==';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_Equal';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class NotIdentical extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '!==';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_NotIdentical';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class SmallerOrEqual extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '<=';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_SmallerOrEqual';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class BooleanAnd extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '&&';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_BooleanAnd';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class Div extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '/';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_Div';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class LogicalXor extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return 'xor';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_LogicalXor';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class Mod extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '%';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_Mod';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class BitwiseOr extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '|';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_BitwiseOr';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class Minus extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '-';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_Minus';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class Identical extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '===';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_Identical';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class GreaterOrEqual extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '>=';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_GreaterOrEqual';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class Pow extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '**';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_Pow';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class Mul extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '*';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_Mul';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class Concat extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '.';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_Concat';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class ShiftLeft extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '<<';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_ShiftLeft';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class BitwiseXor extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '^';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_BitwiseXor';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class Coalesce extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '??';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_Coalesce';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class NotEqual extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '!=';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_NotEqual';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;
class BitwiseAnd extends \PhpParser\Node\Expr\BinaryOp
{
    public function getOperatorSigil() : string
    {
        return '&';
    }
    public function getType() : string
    {
        return 'Expr_BinaryOp_BitwiseAnd';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class Assign extends \PhpParser\Node\Expr
{
    /** @var Expr Variable */
    public $var;
    /** @var Expr Expression */
    public $expr;
    /**
     * Constructs an assignment node.
     *
     * @param Expr  $var        Variable
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $var, \PhpParser\Node\Expr $expr, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->var = $var;
        $this->expr = $expr;
    }
    public function getSubNodeNames() : array
    {
        return ['var', 'expr'];
    }
    public function getType() : string
    {
        return 'Expr_Assign';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class PostInc extends \PhpParser\Node\Expr
{
    /** @var Expr Variable */
    public $var;
    /**
     * Constructs a post increment node.
     *
     * @param Expr  $var        Variable
     * @param array $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $var, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->var = $var;
    }
    public function getSubNodeNames() : array
    {
        return ['var'];
    }
    public function getType() : string
    {
        return 'Expr_PostInc';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
/**
 * Error node used during parsing with error recovery.
 *
 * An error node may be placed at a position where an expression is required, but an error occurred.
 * Error nodes will not be present if the parser is run in throwOnError mode (the default).
 */
class Error extends \PhpParser\Node\Expr
{
    /**
     * Constructs an error node.
     *
     * @param array $attributes Additional attributes
     */
    public function __construct(array $attributes = [])
    {
        $this->attributes = $attributes;
    }
    public function getSubNodeNames() : array
    {
        return [];
    }
    public function getType() : string
    {
        return 'Expr_Error';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class UnaryPlus extends \PhpParser\Node\Expr
{
    /** @var Expr Expression */
    public $expr;
    /**
     * Constructs a unary plus node.
     *
     * @param Expr $expr       Expression
     * @param array               $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $expr, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }
    public function getSubNodeNames() : array
    {
        return ['expr'];
    }
    public function getType() : string
    {
        return 'Expr_UnaryPlus';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class Ternary extends \PhpParser\Node\Expr
{
    /** @var Expr Condition */
    public $cond;
    /** @var null|Expr Expression for true */
    public $if;
    /** @var Expr Expression for false */
    public $else;
    /**
     * Constructs a ternary operator node.
     *
     * @param Expr      $cond       Condition
     * @param null|Expr $if         Expression for true
     * @param Expr      $else       Expression for false
     * @param array                    $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $cond, $if, \PhpParser\Node\Expr $else, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->cond = $cond;
        $this->if = $if;
        $this->else = $else;
    }
    public function getSubNodeNames() : array
    {
        return ['cond', 'if', 'else'];
    }
    public function getType() : string
    {
        return 'Expr_Ternary';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class Empty_ extends \PhpParser\Node\Expr
{
    /** @var Expr Expression */
    public $expr;
    /**
     * Constructs an empty() node.
     *
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $expr, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }
    public function getSubNodeNames() : array
    {
        return ['expr'];
    }
    public function getType() : string
    {
        return 'Expr_Empty';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node;
use PhpParser\Node\Expr;
class New_ extends \PhpParser\Node\Expr
{
    /** @var Node\Name|Expr|Node\Stmt\Class_ Class name */
    public $class;
    /** @var Node\Arg[] Arguments */
    public $args;
    /**
     * Constructs a function call node.
     *
     * @param Node\Name|Expr|Node\Stmt\Class_ $class      Class name (or class node for anonymous classes)
     * @param Node\Arg[]                      $args       Arguments
     * @param array                           $attributes Additional attributes
     */
    public function __construct($class, array $args = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->class = $class;
        $this->args = $args;
    }
    public function getSubNodeNames() : array
    {
        return ['class', 'args'];
    }
    public function getType() : string
    {
        return 'Expr_New';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class Yield_ extends \PhpParser\Node\Expr
{
    /** @var null|Expr Key expression */
    public $key;
    /** @var null|Expr Value expression */
    public $value;
    /**
     * Constructs a yield expression node.
     *
     * @param null|Expr $value      Value expression
     * @param null|Expr $key        Key expression
     * @param array     $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $value = null, \PhpParser\Node\Expr $key = null, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->key = $key;
        $this->value = $value;
    }
    public function getSubNodeNames() : array
    {
        return ['key', 'value'];
    }
    public function getType() : string
    {
        return 'Expr_Yield';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class Exit_ extends \PhpParser\Node\Expr
{
    /* For use in "kind" attribute */
    const KIND_EXIT = 1;
    const KIND_DIE = 2;
    /** @var null|Expr Expression */
    public $expr;
    /**
     * Constructs an exit() node.
     *
     * @param null|Expr $expr       Expression
     * @param array                    $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $expr = null, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }
    public function getSubNodeNames() : array
    {
        return ['expr'];
    }
    public function getType() : string
    {
        return 'Expr_Exit';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
abstract class AssignOp extends \PhpParser\Node\Expr
{
    /** @var Expr Variable */
    public $var;
    /** @var Expr Expression */
    public $expr;
    /**
     * Constructs a compound assignment operation node.
     *
     * @param Expr  $var        Variable
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $var, \PhpParser\Node\Expr $expr, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->var = $var;
        $this->expr = $expr;
    }
    public function getSubNodeNames() : array
    {
        return ['var', 'expr'];
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
use PhpParser\Node\Name;
class Instanceof_ extends \PhpParser\Node\Expr
{
    /** @var Expr Expression */
    public $expr;
    /** @var Name|Expr Class name */
    public $class;
    /**
     * Constructs an instanceof check node.
     *
     * @param Expr      $expr       Expression
     * @param Name|Expr $class      Class name
     * @param array     $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $expr, $class, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->expr = $expr;
        $this->class = $class;
    }
    public function getSubNodeNames() : array
    {
        return ['expr', 'class'];
    }
    public function getType() : string
    {
        return 'Expr_Instanceof';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node;
use PhpParser\Node\Expr;
class FuncCall extends \PhpParser\Node\Expr
{
    /** @var Node\Name|Expr Function name */
    public $name;
    /** @var Node\Arg[] Arguments */
    public $args;
    /**
     * Constructs a function call node.
     *
     * @param Node\Name|Expr $name       Function name
     * @param Node\Arg[]     $args       Arguments
     * @param array          $attributes Additional attributes
     */
    public function __construct($name, array $args = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->name = $name;
        $this->args = $args;
    }
    public function getSubNodeNames() : array
    {
        return ['name', 'args'];
    }
    public function getType() : string
    {
        return 'Expr_FuncCall';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class BooleanNot extends \PhpParser\Node\Expr
{
    /** @var Expr Expression */
    public $expr;
    /**
     * Constructs a boolean not node.
     *
     * @param Expr $expr       Expression
     * @param array               $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $expr, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }
    public function getSubNodeNames() : array
    {
        return ['expr'];
    }
    public function getType() : string
    {
        return 'Expr_BooleanNot';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class Clone_ extends \PhpParser\Node\Expr
{
    /** @var Expr Expression */
    public $expr;
    /**
     * Constructs a clone node.
     *
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $expr, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }
    public function getSubNodeNames() : array
    {
        return ['expr'];
    }
    public function getType() : string
    {
        return 'Expr_Clone';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class PreDec extends \PhpParser\Node\Expr
{
    /** @var Expr Variable */
    public $var;
    /**
     * Constructs a pre decrement node.
     *
     * @param Expr  $var        Variable
     * @param array $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $var, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->var = $var;
    }
    public function getSubNodeNames() : array
    {
        return ['var'];
    }
    public function getType() : string
    {
        return 'Expr_PreDec';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class ArrayItem extends \PhpParser\Node\Expr
{
    /** @var null|Expr Key */
    public $key;
    /** @var Expr Value */
    public $value;
    /** @var bool Whether to assign by reference */
    public $byRef;
    /** @var bool Whether to unpack the argument */
    public $unpack;
    /**
     * Constructs an array item node.
     *
     * @param Expr      $value      Value
     * @param null|Expr $key        Key
     * @param bool      $byRef      Whether to assign by reference
     * @param array     $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $value, \PhpParser\Node\Expr $key = null, bool $byRef = \false, array $attributes = [], bool $unpack = \false)
    {
        $this->attributes = $attributes;
        $this->key = $key;
        $this->value = $value;
        $this->byRef = $byRef;
        $this->unpack = $unpack;
    }
    public function getSubNodeNames() : array
    {
        return ['key', 'value', 'byRef', 'unpack'];
    }
    public function getType() : string
    {
        return 'Expr_ArrayItem';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class Array_ extends \PhpParser\Node\Expr
{
    // For use in "kind" attribute
    const KIND_LONG = 1;
    // array() syntax
    const KIND_SHORT = 2;
    // [] syntax
    /** @var ArrayItem[] Items */
    public $items;
    /**
     * Constructs an array node.
     *
     * @param ArrayItem[] $items      Items of the array
     * @param array       $attributes Additional attributes
     */
    public function __construct(array $items = [], array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->items = $items;
    }
    public function getSubNodeNames() : array
    {
        return ['items'];
    }
    public function getType() : string
    {
        return 'Expr_Array';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class AssignRef extends \PhpParser\Node\Expr
{
    /** @var Expr Variable reference is assigned to */
    public $var;
    /** @var Expr Variable which is referenced */
    public $expr;
    /**
     * Constructs an assignment node.
     *
     * @param Expr  $var        Variable
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $var, \PhpParser\Node\Expr $expr, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->var = $var;
        $this->expr = $expr;
    }
    public function getSubNodeNames() : array
    {
        return ['var', 'expr'];
    }
    public function getType() : string
    {
        return 'Expr_AssignRef';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class Isset_ extends \PhpParser\Node\Expr
{
    /** @var Expr[] Variables */
    public $vars;
    /**
     * Constructs an array node.
     *
     * @param Expr[] $vars       Variables
     * @param array  $attributes Additional attributes
     */
    public function __construct(array $vars, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->vars = $vars;
    }
    public function getSubNodeNames() : array
    {
        return ['vars'];
    }
    public function getType() : string
    {
        return 'Expr_Isset';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
class ClosureUse extends \PhpParser\Node\Expr
{
    /** @var Expr\Variable Variable to use */
    public $var;
    /** @var bool Whether to use by reference */
    public $byRef;
    /**
     * Constructs a closure use node.
     *
     * @param Expr\Variable $var        Variable to use
     * @param bool          $byRef      Whether to use by reference
     * @param array         $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr\Variable $var, bool $byRef = \false, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->var = $var;
        $this->byRef = $byRef;
    }
    public function getSubNodeNames() : array
    {
        return ['var', 'byRef'];
    }
    public function getType() : string
    {
        return 'Expr_ClosureUse';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node;

use PhpParser\NodeAbstract;
abstract class Expr extends \PhpParser\NodeAbstract
{
}
<?php

declare (strict_types=1);
namespace PhpParser\Node;

abstract class Scalar extends \PhpParser\Node\Expr
{
}
<?php

declare (strict_types=1);
namespace PhpParser\Node;

use PhpParser\NodeAbstract;
/**
 * @property Name $namespacedName Namespaced name (for class constants, if using NameResolver)
 */
class Const_ extends \PhpParser\NodeAbstract
{
    /** @var Identifier Name */
    public $name;
    /** @var Expr Value */
    public $value;
    /**
     * Constructs a const node for use in class const and const statements.
     *
     * @param string|Identifier $name       Name
     * @param Expr              $value      Value
     * @param array             $attributes Additional attributes
     */
    public function __construct($name, \PhpParser\Node\Expr $value, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->name = \is_string($name) ? new \PhpParser\Node\Identifier($name) : $name;
        $this->value = $value;
    }
    public function getSubNodeNames() : array
    {
        return ['name', 'value'];
    }
    public function getType() : string
    {
        return 'Const';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node;

use PhpParser\Node;
interface FunctionLike extends \PhpParser\Node
{
    /**
     * Whether to return by reference
     *
     * @return bool
     */
    public function returnsByRef() : bool;
    /**
     * List of parameters
     *
     * @return Node\Param[]
     */
    public function getParams() : array;
    /**
     * Get the declared return type or null
     *
     * @return null|Identifier|Node\Name|Node\NullableType
     */
    public function getReturnType();
    /**
     * The function body
     *
     * @return Node\Stmt[]|null
     */
    public function getStmts();
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Name;

class Relative extends \PhpParser\Node\Name
{
    /**
     * Checks whether the name is unqualified. (E.g. Name)
     *
     * @return bool Whether the name is unqualified
     */
    public function isUnqualified() : bool
    {
        return \false;
    }
    /**
     * Checks whether the name is qualified. (E.g. Name\Name)
     *
     * @return bool Whether the name is qualified
     */
    public function isQualified() : bool
    {
        return \false;
    }
    /**
     * Checks whether the name is fully qualified. (E.g. \Name)
     *
     * @return bool Whether the name is fully qualified
     */
    public function isFullyQualified() : bool
    {
        return \false;
    }
    /**
     * Checks whether the name is explicitly relative to the current namespace. (E.g. namespace\Name)
     *
     * @return bool Whether the name is relative
     */
    public function isRelative() : bool
    {
        return \true;
    }
    public function toCodeString() : string
    {
        return 'namespace\\' . $this->toString();
    }
    public function getType() : string
    {
        return 'Name_Relative';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Name;

class FullyQualified extends \PhpParser\Node\Name
{
    /**
     * Checks whether the name is unqualified. (E.g. Name)
     *
     * @return bool Whether the name is unqualified
     */
    public function isUnqualified() : bool
    {
        return \false;
    }
    /**
     * Checks whether the name is qualified. (E.g. Name\Name)
     *
     * @return bool Whether the name is qualified
     */
    public function isQualified() : bool
    {
        return \false;
    }
    /**
     * Checks whether the name is fully qualified. (E.g. \Name)
     *
     * @return bool Whether the name is fully qualified
     */
    public function isFullyQualified() : bool
    {
        return \true;
    }
    /**
     * Checks whether the name is explicitly relative to the current namespace. (E.g. namespace\Name)
     *
     * @return bool Whether the name is relative
     */
    public function isRelative() : bool
    {
        return \false;
    }
    public function toCodeString() : string
    {
        return '\\' . $this->toString();
    }
    public function getType() : string
    {
        return 'Name_FullyQualified';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node;

/**
 * Represents a name that is written in source code with a leading dollar,
 * but is not a proper variable. The leading dollar is not stored as part of the name.
 *
 * Examples: Names in property declarations are formatted as variables. Names in static property
 * lookups are also formatted as variables.
 */
class VarLikeIdentifier extends \PhpParser\Node\Identifier
{
    public function getType() : string
    {
        return 'VarLikeIdentifier';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node;

use PhpParser\NodeAbstract;
class Name extends \PhpParser\NodeAbstract
{
    /** @var string[] Parts of the name */
    public $parts;
    private static $specialClassNames = ['self' => \true, 'parent' => \true, 'static' => \true];
    /**
     * Constructs a name node.
     *
     * @param string|string[]|self $name       Name as string, part array or Name instance (copy ctor)
     * @param array                $attributes Additional attributes
     */
    public function __construct($name, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->parts = self::prepareName($name);
    }
    public function getSubNodeNames() : array
    {
        return ['parts'];
    }
    /**
     * Gets the first part of the name, i.e. everything before the first namespace separator.
     *
     * @return string First part of the name
     */
    public function getFirst() : string
    {
        return $this->parts[0];
    }
    /**
     * Gets the last part of the name, i.e. everything after the last namespace separator.
     *
     * @return string Last part of the name
     */
    public function getLast() : string
    {
        return $this->parts[\count($this->parts) - 1];
    }
    /**
     * Checks whether the name is unqualified. (E.g. Name)
     *
     * @return bool Whether the name is unqualified
     */
    public function isUnqualified() : bool
    {
        return 1 === \count($this->parts);
    }
    /**
     * Checks whether the name is qualified. (E.g. Name\Name)
     *
     * @return bool Whether the name is qualified
     */
    public function isQualified() : bool
    {
        return 1 < \count($this->parts);
    }
    /**
     * Checks whether the name is fully qualified. (E.g. \Name)
     *
     * @return bool Whether the name is fully qualified
     */
    public function isFullyQualified() : bool
    {
        return \false;
    }
    /**
     * Checks whether the name is explicitly relative to the current namespace. (E.g. namespace\Name)
     *
     * @return bool Whether the name is relative
     */
    public function isRelative() : bool
    {
        return \false;
    }
    /**
     * Returns a string representation of the name itself, without taking taking the name type into
     * account (e.g., not including a leading backslash for fully qualified names).
     *
     * @return string String representation
     */
    public function toString() : string
    {
        return \implode('\\', $this->parts);
    }
    /**
     * Returns a string representation of the name as it would occur in code (e.g., including
     * leading backslash for fully qualified names.
     *
     * @return string String representation
     */
    public function toCodeString() : string
    {
        return $this->toString();
    }
    /**
     * Returns lowercased string representation of the name, without taking the name type into
     * account (e.g., no leading backslash for fully qualified names).
     *
     * @return string Lowercased string representation
     */
    public function toLowerString() : string
    {
        return \strtolower(\implode('\\', $this->parts));
    }
    /**
     * Checks whether the identifier is a special class name (self, parent or static).
     *
     * @return bool Whether identifier is a special class name
     */
    public function isSpecialClassName() : bool
    {
        return \count($this->parts) === 1 && isset(self::$specialClassNames[\strtolower($this->parts[0])]);
    }
    /**
     * Returns a string representation of the name by imploding the namespace parts with the
     * namespace separator.
     *
     * @return string String representation
     */
    public function __toString() : string
    {
        return \implode('\\', $this->parts);
    }
    /**
     * Gets a slice of a name (similar to array_slice).
     *
     * This method returns a new instance of the same type as the original and with the same
     * attributes.
     *
     * If the slice is empty, null is returned. The null value will be correctly handled in
     * concatenations using concat().
     *
     * Offset and length have the same meaning as in array_slice().
     *
     * @param int      $offset Offset to start the slice at (may be negative)
     * @param int|null $length Length of the slice (may be negative)
     *
     * @return static|null Sliced name
     */
    public function slice(int $offset, int $length = null)
    {
        $numParts = \count($this->parts);
        $realOffset = $offset < 0 ? $offset + $numParts : $offset;
        if ($realOffset < 0 || $realOffset > $numParts) {
            throw new \OutOfBoundsException(\sprintf('Offset %d is out of bounds', $offset));
        }
        if (null === $length) {
            $realLength = $numParts - $realOffset;
        } else {
            $realLength = $length < 0 ? $length + $numParts - $realOffset : $length;
            if ($realLength < 0 || $realLength > $numParts) {
                throw new \OutOfBoundsException(\sprintf('Length %d is out of bounds', $length));
            }
        }
        if ($realLength === 0) {
            // Empty slice is represented as null
            return null;
        }
        return new static(\array_slice($this->parts, $realOffset, $realLength), $this->attributes);
    }
    /**
     * Concatenate two names, yielding a new Name instance.
     *
     * The type of the generated instance depends on which class this method is called on, for
     * example Name\FullyQualified::concat() will yield a Name\FullyQualified instance.
     *
     * If one of the arguments is null, a new instance of the other name will be returned. If both
     * arguments are null, null will be returned. As such, writing
     *     Name::concat($namespace, $shortName)
     * where $namespace is a Name node or null will work as expected.
     *
     * @param string|string[]|self|null $name1      The first name
     * @param string|string[]|self|null $name2      The second name
     * @param array                     $attributes Attributes to assign to concatenated name
     *
     * @return static|null Concatenated name
     */
    public static function concat($name1, $name2, array $attributes = [])
    {
        if (null === $name1 && null === $name2) {
            return null;
        } elseif (null === $name1) {
            return new static(self::prepareName($name2), $attributes);
        } elseif (null === $name2) {
            return new static(self::prepareName($name1), $attributes);
        } else {
            return new static(\array_merge(self::prepareName($name1), self::prepareName($name2)), $attributes);
        }
    }
    /**
     * Prepares a (string, array or Name node) name for use in name changing methods by converting
     * it to an array.
     *
     * @param string|string[]|self $name Name to prepare
     *
     * @return string[] Prepared name
     */
    private static function prepareName($name) : array
    {
        if (\is_string($name)) {
            if ('' === $name) {
                throw new \InvalidArgumentException('Name cannot be empty');
            }
            return \explode('\\', $name);
        } elseif (\is_array($name)) {
            if (empty($name)) {
                throw new \InvalidArgumentException('Name cannot be empty');
            }
            return $name;
        } elseif ($name instanceof self) {
            return $name->parts;
        }
        throw new \InvalidArgumentException('Expected string, array of parts or Name instance');
    }
    public function getType() : string
    {
        return 'Name';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Scalar;

use PhpParser\Node\Scalar;
class DNumber extends \PhpParser\Node\Scalar
{
    /** @var float Number value */
    public $value;
    /**
     * Constructs a float number scalar node.
     *
     * @param float $value      Value of the number
     * @param array $attributes Additional attributes
     */
    public function __construct(float $value, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->value = $value;
    }
    public function getSubNodeNames() : array
    {
        return ['value'];
    }
    /**
     * @internal
     *
     * Parses a DNUMBER token like PHP would.
     *
     * @param string $str A string number
     *
     * @return float The parsed number
     */
    public static function parse(string $str) : float
    {
        // if string contains any of .eE just cast it to float
        if (\false !== \strpbrk($str, '.eE')) {
            return (double) $str;
        }
        // otherwise it's an integer notation that overflowed into a float
        // if it starts with 0 it's one of the special integer notations
        if ('0' === $str[0]) {
            // hex
            if ('x' === $str[1] || 'X' === $str[1]) {
                return \hexdec($str);
            }
            // bin
            if ('b' === $str[1] || 'B' === $str[1]) {
                return \bindec($str);
            }
            // oct
            // substr($str, 0, strcspn($str, '89')) cuts the string at the first invalid digit (8 or 9)
            // so that only the digits before that are used
            return \octdec(\substr($str, 0, \strcspn($str, '89')));
        }
        // dec
        return (double) $str;
    }
    public function getType() : string
    {
        return 'Scalar_DNumber';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Scalar;

use PhpParser\Error;
use PhpParser\Node\Scalar;
class String_ extends \PhpParser\Node\Scalar
{
    /* For use in "kind" attribute */
    const KIND_SINGLE_QUOTED = 1;
    const KIND_DOUBLE_QUOTED = 2;
    const KIND_HEREDOC = 3;
    const KIND_NOWDOC = 4;
    /** @var string String value */
    public $value;
    protected static $replacements = ['\\' => '\\', '$' => '$', 'n' => "\n", 'r' => "\r", 't' => "\t", 'f' => "\f", 'v' => "\v", 'e' => "\33"];
    /**
     * Constructs a string scalar node.
     *
     * @param string $value      Value of the string
     * @param array  $attributes Additional attributes
     */
    public function __construct(string $value, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->value = $value;
    }
    public function getSubNodeNames() : array
    {
        return ['value'];
    }
    /**
     * @internal
     *
     * Parses a string token.
     *
     * @param string $str String token content
     * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes
     *
     * @return string The parsed string
     */
    public static function parse(string $str, bool $parseUnicodeEscape = \true) : string
    {
        $bLength = 0;
        if ('b' === $str[0] || 'B' === $str[0]) {
            $bLength = 1;
        }
        if ('\'' === $str[$bLength]) {
            return \str_replace(['\\\\', '\\\''], ['\\', '\''], \substr($str, $bLength + 1, -1));
        } else {
            return self::parseEscapeSequences(\substr($str, $bLength + 1, -1), '"', $parseUnicodeEscape);
        }
    }
    /**
     * @internal
     *
     * Parses escape sequences in strings (all string types apart from single quoted).
     *
     * @param string      $str   String without quotes
     * @param null|string $quote Quote type
     * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes
     *
     * @return string String with escape sequences parsed
     */
    public static function parseEscapeSequences(string $str, $quote, bool $parseUnicodeEscape = \true) : string
    {
        if (null !== $quote) {
            $str = \str_replace('\\' . $quote, $quote, $str);
        }
        $extra = '';
        if ($parseUnicodeEscape) {
            $extra = '|u\\{([0-9a-fA-F]+)\\}';
        }
        return \preg_replace_callback('~\\\\([\\\\$nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3}' . $extra . ')~', function ($matches) {
            $str = $matches[1];
            if (isset(self::$replacements[$str])) {
                return self::$replacements[$str];
            } elseif ('x' === $str[0] || 'X' === $str[0]) {
                return \chr(\hexdec($str));
            } elseif ('u' === $str[0]) {
                return self::codePointToUtf8(\hexdec($matches[2]));
            } else {
                return \chr(\octdec($str));
            }
        }, $str);
    }
    /**
     * Converts a Unicode code point to its UTF-8 encoded representation.
     *
     * @param int $num Code point
     *
     * @return string UTF-8 representation of code point
     */
    private static function codePointToUtf8(int $num) : string
    {
        if ($num <= 0x7f) {
            return \chr($num);
        }
        if ($num <= 0x7ff) {
            return \chr(($num >> 6) + 0xc0) . \chr(($num & 0x3f) + 0x80);
        }
        if ($num <= 0xffff) {
            return \chr(($num >> 12) + 0xe0) . \chr(($num >> 6 & 0x3f) + 0x80) . \chr(($num & 0x3f) + 0x80);
        }
        if ($num <= 0x1fffff) {
            return \chr(($num >> 18) + 0xf0) . \chr(($num >> 12 & 0x3f) + 0x80) . \chr(($num >> 6 & 0x3f) + 0x80) . \chr(($num & 0x3f) + 0x80);
        }
        throw new \PhpParser\Error('Invalid UTF-8 codepoint escape sequence: Codepoint too large');
    }
    public function getType() : string
    {
        return 'Scalar_String';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Scalar\MagicConst;

use PhpParser\Node\Scalar\MagicConst;
class Namespace_ extends \PhpParser\Node\Scalar\MagicConst
{
    public function getName() : string
    {
        return '__NAMESPACE__';
    }
    public function getType() : string
    {
        return 'Scalar_MagicConst_Namespace';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Scalar\MagicConst;

use PhpParser\Node\Scalar\MagicConst;
class Class_ extends \PhpParser\Node\Scalar\MagicConst
{
    public function getName() : string
    {
        return '__CLASS__';
    }
    public function getType() : string
    {
        return 'Scalar_MagicConst_Class';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Scalar\MagicConst;

use PhpParser\Node\Scalar\MagicConst;
class Dir extends \PhpParser\Node\Scalar\MagicConst
{
    public function getName() : string
    {
        return '__DIR__';
    }
    public function getType() : string
    {
        return 'Scalar_MagicConst_Dir';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Scalar\MagicConst;

use PhpParser\Node\Scalar\MagicConst;
class File extends \PhpParser\Node\Scalar\MagicConst
{
    public function getName() : string
    {
        return '__FILE__';
    }
    public function getType() : string
    {
        return 'Scalar_MagicConst_File';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Scalar\MagicConst;

use PhpParser\Node\Scalar\MagicConst;
class Method extends \PhpParser\Node\Scalar\MagicConst
{
    public function getName() : string
    {
        return '__METHOD__';
    }
    public function getType() : string
    {
        return 'Scalar_MagicConst_Method';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Scalar\MagicConst;

use PhpParser\Node\Scalar\MagicConst;
class Function_ extends \PhpParser\Node\Scalar\MagicConst
{
    public function getName() : string
    {
        return '__FUNCTION__';
    }
    public function getType() : string
    {
        return 'Scalar_MagicConst_Function';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Scalar\MagicConst;

use PhpParser\Node\Scalar\MagicConst;
class Line extends \PhpParser\Node\Scalar\MagicConst
{
    public function getName() : string
    {
        return '__LINE__';
    }
    public function getType() : string
    {
        return 'Scalar_MagicConst_Line';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Scalar\MagicConst;

use PhpParser\Node\Scalar\MagicConst;
class Trait_ extends \PhpParser\Node\Scalar\MagicConst
{
    public function getName() : string
    {
        return '__TRAIT__';
    }
    public function getType() : string
    {
        return 'Scalar_MagicConst_Trait';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Scalar;

use PhpParser\Node\Scalar;
abstract class MagicConst extends \PhpParser\Node\Scalar
{
    /**
     * Constructs a magic constant node.
     *
     * @param array $attributes Additional attributes
     */
    public function __construct(array $attributes = [])
    {
        $this->attributes = $attributes;
    }
    public function getSubNodeNames() : array
    {
        return [];
    }
    /**
     * Get name of magic constant.
     *
     * @return string Name of magic constant
     */
    public abstract function getName() : string;
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Scalar;

use PhpParser\Error;
use PhpParser\Node\Scalar;
class LNumber extends \PhpParser\Node\Scalar
{
    /* For use in "kind" attribute */
    const KIND_BIN = 2;
    const KIND_OCT = 8;
    const KIND_DEC = 10;
    const KIND_HEX = 16;
    /** @var int Number value */
    public $value;
    /**
     * Constructs an integer number scalar node.
     *
     * @param int   $value      Value of the number
     * @param array $attributes Additional attributes
     */
    public function __construct(int $value, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->value = $value;
    }
    public function getSubNodeNames() : array
    {
        return ['value'];
    }
    /**
     * Constructs an LNumber node from a string number literal.
     *
     * @param string $str               String number literal (decimal, octal, hex or binary)
     * @param array  $attributes        Additional attributes
     * @param bool   $allowInvalidOctal Whether to allow invalid octal numbers (PHP 5)
     *
     * @return LNumber The constructed LNumber, including kind attribute
     */
    public static function fromString(string $str, array $attributes = [], bool $allowInvalidOctal = \false) : \PhpParser\Node\Scalar\LNumber
    {
        if ('0' !== $str[0] || '0' === $str) {
            $attributes['kind'] = \PhpParser\Node\Scalar\LNumber::KIND_DEC;
            return new \PhpParser\Node\Scalar\LNumber((int) $str, $attributes);
        }
        if ('x' === $str[1] || 'X' === $str[1]) {
            $attributes['kind'] = \PhpParser\Node\Scalar\LNumber::KIND_HEX;
            return new \PhpParser\Node\Scalar\LNumber(\hexdec($str), $attributes);
        }
        if ('b' === $str[1] || 'B' === $str[1]) {
            $attributes['kind'] = \PhpParser\Node\Scalar\LNumber::KIND_BIN;
            return new \PhpParser\Node\Scalar\LNumber(\bindec($str), $attributes);
        }
        if (!$allowInvalidOctal && \strpbrk($str, '89')) {
            throw new \PhpParser\Error('Invalid numeric literal', $attributes);
        }
        // use intval instead of octdec to get proper cutting behavior with malformed numbers
        $attributes['kind'] = \PhpParser\Node\Scalar\LNumber::KIND_OCT;
        return new \PhpParser\Node\Scalar\LNumber(\intval($str, 8), $attributes);
    }
    public function getType() : string
    {
        return 'Scalar_LNumber';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Scalar;

use PhpParser\Node\Scalar;
class EncapsedStringPart extends \PhpParser\Node\Scalar
{
    /** @var string String value */
    public $value;
    /**
     * Constructs a node representing a string part of an encapsed string.
     *
     * @param string $value      String value
     * @param array  $attributes Additional attributes
     */
    public function __construct(string $value, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->value = $value;
    }
    public function getSubNodeNames() : array
    {
        return ['value'];
    }
    public function getType() : string
    {
        return 'Scalar_EncapsedStringPart';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node\Scalar;

use PhpParser\Node\Expr;
use PhpParser\Node\Scalar;
class Encapsed extends \PhpParser\Node\Scalar
{
    /** @var Expr[] list of string parts */
    public $parts;
    /**
     * Constructs an encapsed string node.
     *
     * @param Expr[] $parts      Encaps list
     * @param array  $attributes Additional attributes
     */
    public function __construct(array $parts, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->parts = $parts;
    }
    public function getSubNodeNames() : array
    {
        return ['parts'];
    }
    public function getType() : string
    {
        return 'Scalar_Encapsed';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Node;

use PhpParser\NodeAbstract;
abstract class Stmt extends \PhpParser\NodeAbstract
{
}
<?php

declare (strict_types=1);
namespace PhpParser\Node;

use PhpParser\NodeAbstract;
class Arg extends \PhpParser\NodeAbstract
{
    /** @var Expr Value to pass */
    public $value;
    /** @var bool Whether to pass by ref */
    public $byRef;
    /** @var bool Whether to unpack the argument */
    public $unpack;
    /**
     * Constructs a function call argument node.
     *
     * @param Expr  $value      Value to pass
     * @param bool  $byRef      Whether to pass by ref
     * @param bool  $unpack     Whether to unpack the argument
     * @param array $attributes Additional attributes
     */
    public function __construct(\PhpParser\Node\Expr $value, bool $byRef = \false, bool $unpack = \false, array $attributes = [])
    {
        $this->attributes = $attributes;
        $this->value = $value;
        $this->byRef = $byRef;
        $this->unpack = $unpack;
    }
    public function getSubNodeNames() : array
    {
        return ['value', 'byRef', 'unpack'];
    }
    public function getType() : string
    {
        return 'Arg';
    }
}
<?php

declare (strict_types=1);
namespace PhpParser;

use PhpParser\NodeVisitor\FindingVisitor;
use PhpParser\NodeVisitor\FirstFindingVisitor;
class NodeFinder
{
    /**
     * Find all nodes satisfying a filter callback.
     *
     * @param Node|Node[] $nodes  Single node or array of nodes to search in
     * @param callable    $filter Filter callback: function(Node $node) : bool
     *
     * @return Node[] Found nodes satisfying the filter callback
     */
    public function find($nodes, callable $filter) : array
    {
        if (!\is_array($nodes)) {
            $nodes = [$nodes];
        }
        $visitor = new \PhpParser\NodeVisitor\FindingVisitor($filter);
        $traverser = new \PhpParser\NodeTraverser();
        $traverser->addVisitor($visitor);
        $traverser->traverse($nodes);
        return $visitor->getFoundNodes();
    }
    /**
     * Find all nodes that are instances of a certain class.
     *
     * @param Node|Node[] $nodes Single node or array of nodes to search in
     * @param string      $class Class name
     *
     * @return Node[] Found nodes (all instances of $class)
     */
    public function findInstanceOf($nodes, string $class) : array
    {
        return $this->find($nodes, function ($node) use($class) {
            return $node instanceof $class;
        });
    }
    /**
     * Find first node satisfying a filter callback.
     *
     * @param Node|Node[] $nodes  Single node or array of nodes to search in
     * @param callable    $filter Filter callback: function(Node $node) : bool
     *
     * @return null|Node Found node (or null if none found)
     */
    public function findFirst($nodes, callable $filter)
    {
        if (!\is_array($nodes)) {
            $nodes = [$nodes];
        }
        $visitor = new \PhpParser\NodeVisitor\FirstFindingVisitor($filter);
        $traverser = new \PhpParser\NodeTraverser();
        $traverser->addVisitor($visitor);
        $traverser->traverse($nodes);
        return $visitor->getFoundNode();
    }
    /**
     * Find first node that is an instance of a certain class.
     *
     * @param Node|Node[] $nodes  Single node or array of nodes to search in
     * @param string      $class Class name
     *
     * @return null|Node Found node, which is an instance of $class (or null if none found)
     */
    public function findFirstInstanceOf($nodes, string $class)
    {
        return $this->findFirst($nodes, function ($node) use($class) {
            return $node instanceof $class;
        });
    }
}
<?php

declare (strict_types=1);
namespace PhpParser;

class NodeTraverser implements \PhpParser\NodeTraverserInterface
{
    /**
     * If NodeVisitor::enterNode() returns DONT_TRAVERSE_CHILDREN, child nodes
     * of the current node will not be traversed for any visitors.
     *
     * For subsequent visitors enterNode() will still be called on the current
     * node and leaveNode() will also be invoked for the current node.
     */
    const DONT_TRAVERSE_CHILDREN = 1;
    /**
     * If NodeVisitor::enterNode() or NodeVisitor::leaveNode() returns
     * STOP_TRAVERSAL, traversal is aborted.
     *
     * The afterTraverse() method will still be invoked.
     */
    const STOP_TRAVERSAL = 2;
    /**
     * If NodeVisitor::leaveNode() returns REMOVE_NODE for a node that occurs
     * in an array, it will be removed from the array.
     *
     * For subsequent visitors leaveNode() will still be invoked for the
     * removed node.
     */
    const REMOVE_NODE = 3;
    /**
     * If NodeVisitor::enterNode() returns DONT_TRAVERSE_CURRENT_AND_CHILDREN, child nodes
     * of the current node will not be traversed for any visitors.
     *
     * For subsequent visitors enterNode() will not be called as well.
     * leaveNode() will be invoked for visitors that has enterNode() method invoked.
     */
    const DONT_TRAVERSE_CURRENT_AND_CHILDREN = 4;
    /** @var NodeVisitor[] Visitors */
    protected $visitors = [];
    /** @var bool Whether traversal should be stopped */
    protected $stopTraversal;
    public function __construct()
    {
        // for BC
    }
    /**
     * Adds a visitor.
     *
     * @param NodeVisitor $visitor Visitor to add
     */
    public function addVisitor(\PhpParser\NodeVisitor $visitor)
    {
        $this->visitors[] = $visitor;
    }
    /**
     * Removes an added visitor.
     *
     * @param NodeVisitor $visitor
     */
    public function removeVisitor(\PhpParser\NodeVisitor $visitor)
    {
        foreach ($this->visitors as $index => $storedVisitor) {
            if ($storedVisitor === $visitor) {
                unset($this->visitors[$index]);
                break;
            }
        }
    }
    /**
     * Traverses an array of nodes using the registered visitors.
     *
     * @param Node[] $nodes Array of nodes
     *
     * @return Node[] Traversed array of nodes
     */
    public function traverse(array $nodes) : array
    {
        $this->stopTraversal = \false;
        foreach ($this->visitors as $visitor) {
            if (null !== ($return = $visitor->beforeTraverse($nodes))) {
                $nodes = $return;
            }
        }
        $nodes = $this->traverseArray($nodes);
        foreach ($this->visitors as $visitor) {
            if (null !== ($return = $visitor->afterTraverse($nodes))) {
                $nodes = $return;
            }
        }
        return $nodes;
    }
    /**
     * Recursively traverse a node.
     *
     * @param Node $node Node to traverse.
     *
     * @return Node Result of traversal (may be original node or new one)
     */
    protected function traverseNode(\PhpParser\Node $node) : \PhpParser\Node
    {
        foreach ($node->getSubNodeNames() as $name) {
            $subNode =& $node->{$name};
            if (\is_array($subNode)) {
                $subNode = $this->traverseArray($subNode);
                if ($this->stopTraversal) {
                    break;
                }
            } elseif ($subNode instanceof \PhpParser\Node) {
                $traverseChildren = \true;
                $breakVisitorIndex = null;
                foreach ($this->visitors as $visitorIndex => $visitor) {
                    $return = $visitor->enterNode($subNode);
                    if (null !== $return) {
                        if ($return instanceof \PhpParser\Node) {
                            $this->ensureReplacementReasonable($subNode, $return);
                            $subNode = $return;
                        } elseif (self::DONT_TRAVERSE_CHILDREN === $return) {
                            $traverseChildren = \false;
                        } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) {
                            $traverseChildren = \false;
                            $breakVisitorIndex = $visitorIndex;
                            break;
                        } elseif (self::STOP_TRAVERSAL === $return) {
                            $this->stopTraversal = \true;
                            break 2;
                        } else {
                            throw new \LogicException('enterNode() returned invalid value of type ' . \gettype($return));
                        }
                    }
                }
                if ($traverseChildren) {
                    $subNode = $this->traverseNode($subNode);
                    if ($this->stopTraversal) {
                        break;
                    }
                }
                foreach ($this->visitors as $visitorIndex => $visitor) {
                    $return = $visitor->leaveNode($subNode);
                    if (null !== $return) {
                        if ($return instanceof \PhpParser\Node) {
                            $this->ensureReplacementReasonable($subNode, $return);
                            $subNode = $return;
                        } elseif (self::STOP_TRAVERSAL === $return) {
                            $this->stopTraversal = \true;
                            break 2;
                        } elseif (\is_array($return)) {
                            throw new \LogicException('leaveNode() may only return an array ' . 'if the parent structure is an array');
                        } else {
                            throw new \LogicException('leaveNode() returned invalid value of type ' . \gettype($return));
                        }
                    }
                    if ($breakVisitorIndex === $visitorIndex) {
                        break;
                    }
                }
            }
        }
        return $node;
    }
    /**
     * Recursively traverse array (usually of nodes).
     *
     * @param array $nodes Array to traverse
     *
     * @return array Result of traversal (may be original array or changed one)
     */
    protected function traverseArray(array $nodes) : array
    {
        $doNodes = [];
        foreach ($nodes as $i => &$node) {
            if ($node instanceof \PhpParser\Node) {
                $traverseChildren = \true;
                $breakVisitorIndex = null;
                foreach ($this->visitors as $visitorIndex => $visitor) {
                    $return = $visitor->enterNode($node);
                    if (null !== $return) {
                        if ($return instanceof \PhpParser\Node) {
                            $this->ensureReplacementReasonable($node, $return);
                            $node = $return;
                        } elseif (self::DONT_TRAVERSE_CHILDREN === $return) {
                            $traverseChildren = \false;
                        } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) {
                            $traverseChildren = \false;
                            $breakVisitorIndex = $visitorIndex;
                            break;
                        } elseif (self::STOP_TRAVERSAL === $return) {
                            $this->stopTraversal = \true;
                            break 2;
                        } else {
                            throw new \LogicException('enterNode() returned invalid value of type ' . \gettype($return));
                        }
                    }
                }
                if ($traverseChildren) {
                    $node = $this->traverseNode($node);
                    if ($this->stopTraversal) {
                        break;
                    }
                }
                foreach ($this->visitors as $visitorIndex => $visitor) {
                    $return = $visitor->leaveNode($node);
                    if (null !== $return) {
                        if ($return instanceof \PhpParser\Node) {
                            $this->ensureReplacementReasonable($node, $return);
                            $node = $return;
                        } elseif (\is_array($return)) {
                            $doNodes[] = [$i, $return];
                            break;
                        } elseif (self::REMOVE_NODE === $return) {
                            $doNodes[] = [$i, []];
                            break;
                        } elseif (self::STOP_TRAVERSAL === $return) {
                            $this->stopTraversal = \true;
                            break 2;
                        } elseif (\false === $return) {
                            throw new \LogicException('bool(false) return from leaveNode() no longer supported. ' . 'Return NodeTraverser::REMOVE_NODE instead');
                        } else {
                            throw new \LogicException('leaveNode() returned invalid value of type ' . \gettype($return));
                        }
                    }
                    if ($breakVisitorIndex === $visitorIndex) {
                        break;
                    }
                }
            } elseif (\is_array($node)) {
                throw new \LogicException('Invalid node structure: Contains nested arrays');
            }
        }
        if (!empty($doNodes)) {
            while (list($i, $replace) = \array_pop($doNodes)) {
                \array_splice($nodes, $i, 1, $replace);
            }
        }
        return $nodes;
    }
    private function ensureReplacementReasonable($old, $new)
    {
        if ($old instanceof \PhpParser\Node\Stmt && $new instanceof \PhpParser\Node\Expr) {
            throw new \LogicException("Trying to replace statement ({$old->getType()}) " . "with expression ({$new->getType()}). Are you missing a " . "Stmt_Expression wrapper?");
        }
        if ($old instanceof \PhpParser\Node\Expr && $new instanceof \PhpParser\Node\Stmt) {
            throw new \LogicException("Trying to replace expression ({$old->getType()}) " . "with statement ({$new->getType()})");
        }
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Builder;

use PhpParser;
use PhpParser\BuilderHelpers;
use PhpParser\Node;
use PhpParser\Node\Stmt;
class Namespace_ extends \PhpParser\Builder\Declaration
{
    private $name;
    private $stmts = [];
    /**
     * Creates a namespace builder.
     *
     * @param Node\Name|string|null $name Name of the namespace
     */
    public function __construct($name)
    {
        $this->name = null !== $name ? \PhpParser\BuilderHelpers::normalizeName($name) : null;
    }
    /**
     * Adds a statement.
     *
     * @param Node|PhpParser\Builder $stmt The statement to add
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addStmt($stmt)
    {
        $this->stmts[] = \PhpParser\BuilderHelpers::normalizeStmt($stmt);
        return $this;
    }
    /**
     * Returns the built node.
     *
     * @return Node The built node
     */
    public function getNode() : \PhpParser\Node
    {
        return new \PhpParser\Node\Stmt\Namespace_($this->name, $this->stmts, $this->attributes);
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Builder;

use PhpParser\Builder;
use PhpParser\BuilderHelpers;
use PhpParser\Node;
use PhpParser\Node\Stmt;
class TraitUse implements \PhpParser\Builder
{
    protected $traits = [];
    protected $adaptations = [];
    /**
     * Creates a trait use builder.
     *
     * @param Node\Name|string ...$traits Names of used traits
     */
    public function __construct(...$traits)
    {
        foreach ($traits as $trait) {
            $this->and($trait);
        }
    }
    /**
     * Adds used trait.
     *
     * @param Node\Name|string $trait Trait name
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function and($trait)
    {
        $this->traits[] = \PhpParser\BuilderHelpers::normalizeName($trait);
        return $this;
    }
    /**
     * Adds trait adaptation.
     *
     * @param Stmt\TraitUseAdaptation|Builder\TraitUseAdaptation $adaptation Trait adaptation
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function with($adaptation)
    {
        $adaptation = \PhpParser\BuilderHelpers::normalizeNode($adaptation);
        if (!$adaptation instanceof \PhpParser\Node\Stmt\TraitUseAdaptation) {
            throw new \LogicException('Adaptation must have type TraitUseAdaptation');
        }
        $this->adaptations[] = $adaptation;
        return $this;
    }
    /**
     * Returns the built node.
     *
     * @return Node The built node
     */
    public function getNode() : \PhpParser\Node
    {
        return new \PhpParser\Node\Stmt\TraitUse($this->traits, $this->adaptations);
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Builder;

use PhpParser;
use PhpParser\BuilderHelpers;
use PhpParser\Node\Name;
use PhpParser\Node\Stmt;
class Class_ extends \PhpParser\Builder\Declaration
{
    protected $name;
    protected $extends = null;
    protected $implements = [];
    protected $flags = 0;
    protected $uses = [];
    protected $constants = [];
    protected $properties = [];
    protected $methods = [];
    /**
     * Creates a class builder.
     *
     * @param string $name Name of the class
     */
    public function __construct(string $name)
    {
        $this->name = $name;
    }
    /**
     * Extends a class.
     *
     * @param Name|string $class Name of class to extend
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function extend($class)
    {
        $this->extends = \PhpParser\BuilderHelpers::normalizeName($class);
        return $this;
    }
    /**
     * Implements one or more interfaces.
     *
     * @param Name|string ...$interfaces Names of interfaces to implement
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function implement(...$interfaces)
    {
        foreach ($interfaces as $interface) {
            $this->implements[] = \PhpParser\BuilderHelpers::normalizeName($interface);
        }
        return $this;
    }
    /**
     * Makes the class abstract.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeAbstract()
    {
        $this->flags = \PhpParser\BuilderHelpers::addModifier($this->flags, \PhpParser\Node\Stmt\Class_::MODIFIER_ABSTRACT);
        return $this;
    }
    /**
     * Makes the class final.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeFinal()
    {
        $this->flags = \PhpParser\BuilderHelpers::addModifier($this->flags, \PhpParser\Node\Stmt\Class_::MODIFIER_FINAL);
        return $this;
    }
    /**
     * Adds a statement.
     *
     * @param Stmt|PhpParser\Builder $stmt The statement to add
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addStmt($stmt)
    {
        $stmt = \PhpParser\BuilderHelpers::normalizeNode($stmt);
        $targets = [\PhpParser\Node\Stmt\TraitUse::class => &$this->uses, \PhpParser\Node\Stmt\ClassConst::class => &$this->constants, \PhpParser\Node\Stmt\Property::class => &$this->properties, \PhpParser\Node\Stmt\ClassMethod::class => &$this->methods];
        $class = \get_class($stmt);
        if (!isset($targets[$class])) {
            throw new \LogicException(\sprintf('Unexpected node of type "%s"', $stmt->getType()));
        }
        $targets[$class][] = $stmt;
        return $this;
    }
    /**
     * Returns the built class node.
     *
     * @return Stmt\Class_ The built class node
     */
    public function getNode() : \PhpParser\Node
    {
        return new \PhpParser\Node\Stmt\Class_($this->name, ['flags' => $this->flags, 'extends' => $this->extends, 'implements' => $this->implements, 'stmts' => \array_merge($this->uses, $this->constants, $this->properties, $this->methods)], $this->attributes);
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Builder;

use PhpParser;
use PhpParser\BuilderHelpers;
use PhpParser\Node;
class Param implements \PhpParser\Builder
{
    protected $name;
    protected $default = null;
    /** @var string|Node\Name|Node\NullableType|null */
    protected $type = null;
    protected $byRef = \false;
    protected $variadic = \false;
    /**
     * Creates a parameter builder.
     *
     * @param string $name Name of the parameter
     */
    public function __construct(string $name)
    {
        $this->name = $name;
    }
    /**
     * Sets default value for the parameter.
     *
     * @param mixed $value Default value to use
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function setDefault($value)
    {
        $this->default = \PhpParser\BuilderHelpers::normalizeValue($value);
        return $this;
    }
    /**
     * Sets type for the parameter.
     *
     * @param string|Node\Name|Node\NullableType $type Parameter type
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function setType($type)
    {
        $this->type = \PhpParser\BuilderHelpers::normalizeType($type);
        if ($this->type == 'void') {
            throw new \LogicException('Parameter type cannot be void');
        }
        return $this;
    }
    /**
     * Sets type for the parameter.
     *
     * @param string|Node\Name|Node\NullableType $type Parameter type
     *
     * @return $this The builder instance (for fluid interface)
     *
     * @deprecated Use setType() instead
     */
    public function setTypeHint($type)
    {
        return $this->setType($type);
    }
    /**
     * Make the parameter accept the value by reference.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeByRef()
    {
        $this->byRef = \true;
        return $this;
    }
    /**
     * Make the parameter variadic
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeVariadic()
    {
        $this->variadic = \true;
        return $this;
    }
    /**
     * Returns the built parameter node.
     *
     * @return Node\Param The built parameter node
     */
    public function getNode() : \PhpParser\Node
    {
        return new \PhpParser\Node\Param(new \PhpParser\Node\Expr\Variable($this->name), $this->default, $this->type, $this->byRef, $this->variadic);
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Builder;

use PhpParser\Builder;
use PhpParser\BuilderHelpers;
use PhpParser\Node;
use PhpParser\Node\Stmt;
class TraitUseAdaptation implements \PhpParser\Builder
{
    const TYPE_UNDEFINED = 0;
    const TYPE_ALIAS = 1;
    const TYPE_PRECEDENCE = 2;
    /** @var int Type of building adaptation */
    protected $type;
    protected $trait;
    protected $method;
    protected $modifier = null;
    protected $alias = null;
    protected $insteadof = [];
    /**
     * Creates a trait use adaptation builder.
     *
     * @param Node\Name|string|null  $trait  Name of adaptated trait
     * @param Node\Identifier|string $method Name of adaptated method
     */
    public function __construct($trait, $method)
    {
        $this->type = self::TYPE_UNDEFINED;
        $this->trait = \is_null($trait) ? null : \PhpParser\BuilderHelpers::normalizeName($trait);
        $this->method = \PhpParser\BuilderHelpers::normalizeIdentifier($method);
    }
    /**
     * Sets alias of method.
     *
     * @param Node\Identifier|string $alias Alias for adaptated method
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function as($alias)
    {
        if ($this->type === self::TYPE_UNDEFINED) {
            $this->type = self::TYPE_ALIAS;
        }
        if ($this->type !== self::TYPE_ALIAS) {
            throw new \LogicException('Cannot set alias for not alias adaptation buider');
        }
        $this->alias = $alias;
        return $this;
    }
    /**
     * Sets adaptated method public.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makePublic()
    {
        $this->setModifier(\PhpParser\Node\Stmt\Class_::MODIFIER_PUBLIC);
        return $this;
    }
    /**
     * Sets adaptated method protected.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeProtected()
    {
        $this->setModifier(\PhpParser\Node\Stmt\Class_::MODIFIER_PROTECTED);
        return $this;
    }
    /**
     * Sets adaptated method private.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makePrivate()
    {
        $this->setModifier(\PhpParser\Node\Stmt\Class_::MODIFIER_PRIVATE);
        return $this;
    }
    /**
     * Adds overwritten traits.
     *
     * @param Node\Name|string ...$traits Traits for overwrite
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function insteadof(...$traits)
    {
        if ($this->type === self::TYPE_UNDEFINED) {
            if (\is_null($this->trait)) {
                throw new \LogicException('Precedence adaptation must have trait');
            }
            $this->type = self::TYPE_PRECEDENCE;
        }
        if ($this->type !== self::TYPE_PRECEDENCE) {
            throw new \LogicException('Cannot add overwritten traits for not precedence adaptation buider');
        }
        foreach ($traits as $trait) {
            $this->insteadof[] = \PhpParser\BuilderHelpers::normalizeName($trait);
        }
        return $this;
    }
    protected function setModifier(int $modifier)
    {
        if ($this->type === self::TYPE_UNDEFINED) {
            $this->type = self::TYPE_ALIAS;
        }
        if ($this->type !== self::TYPE_ALIAS) {
            throw new \LogicException('Cannot set access modifier for not alias adaptation buider');
        }
        if (\is_null($this->modifier)) {
            $this->modifier = $modifier;
        } else {
            throw new \LogicException('Multiple access type modifiers are not allowed');
        }
    }
    /**
     * Returns the built node.
     *
     * @return Node The built node
     */
    public function getNode() : \PhpParser\Node
    {
        switch ($this->type) {
            case self::TYPE_ALIAS:
                return new \PhpParser\Node\Stmt\TraitUseAdaptation\Alias($this->trait, $this->method, $this->modifier, $this->alias);
            case self::TYPE_PRECEDENCE:
                return new \PhpParser\Node\Stmt\TraitUseAdaptation\Precedence($this->trait, $this->method, $this->insteadof);
            default:
                throw new \LogicException('Type of adaptation is not defined');
        }
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Builder;

use PhpParser;
use PhpParser\BuilderHelpers;
use PhpParser\Node;
use PhpParser\Node\Stmt;
class Method extends \PhpParser\Builder\FunctionLike
{
    protected $name;
    protected $flags = 0;
    /** @var array|null */
    protected $stmts = [];
    /**
     * Creates a method builder.
     *
     * @param string $name Name of the method
     */
    public function __construct(string $name)
    {
        $this->name = $name;
    }
    /**
     * Makes the method public.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makePublic()
    {
        $this->flags = \PhpParser\BuilderHelpers::addModifier($this->flags, \PhpParser\Node\Stmt\Class_::MODIFIER_PUBLIC);
        return $this;
    }
    /**
     * Makes the method protected.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeProtected()
    {
        $this->flags = \PhpParser\BuilderHelpers::addModifier($this->flags, \PhpParser\Node\Stmt\Class_::MODIFIER_PROTECTED);
        return $this;
    }
    /**
     * Makes the method private.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makePrivate()
    {
        $this->flags = \PhpParser\BuilderHelpers::addModifier($this->flags, \PhpParser\Node\Stmt\Class_::MODIFIER_PRIVATE);
        return $this;
    }
    /**
     * Makes the method static.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeStatic()
    {
        $this->flags = \PhpParser\BuilderHelpers::addModifier($this->flags, \PhpParser\Node\Stmt\Class_::MODIFIER_STATIC);
        return $this;
    }
    /**
     * Makes the method abstract.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeAbstract()
    {
        if (!empty($this->stmts)) {
            throw new \LogicException('Cannot make method with statements abstract');
        }
        $this->flags = \PhpParser\BuilderHelpers::addModifier($this->flags, \PhpParser\Node\Stmt\Class_::MODIFIER_ABSTRACT);
        $this->stmts = null;
        // abstract methods don't have statements
        return $this;
    }
    /**
     * Makes the method final.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeFinal()
    {
        $this->flags = \PhpParser\BuilderHelpers::addModifier($this->flags, \PhpParser\Node\Stmt\Class_::MODIFIER_FINAL);
        return $this;
    }
    /**
     * Adds a statement.
     *
     * @param Node|PhpParser\Builder $stmt The statement to add
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addStmt($stmt)
    {
        if (null === $this->stmts) {
            throw new \LogicException('Cannot add statements to an abstract method');
        }
        $this->stmts[] = \PhpParser\BuilderHelpers::normalizeStmt($stmt);
        return $this;
    }
    /**
     * Returns the built method node.
     *
     * @return Stmt\ClassMethod The built method node
     */
    public function getNode() : \PhpParser\Node
    {
        return new \PhpParser\Node\Stmt\ClassMethod($this->name, ['flags' => $this->flags, 'byRef' => $this->returnByRef, 'params' => $this->params, 'returnType' => $this->returnType, 'stmts' => $this->stmts], $this->attributes);
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Builder;

use PhpParser;
use PhpParser\BuilderHelpers;
use PhpParser\Node\Name;
use PhpParser\Node\Stmt;
class Interface_ extends \PhpParser\Builder\Declaration
{
    protected $name;
    protected $extends = [];
    protected $constants = [];
    protected $methods = [];
    /**
     * Creates an interface builder.
     *
     * @param string $name Name of the interface
     */
    public function __construct(string $name)
    {
        $this->name = $name;
    }
    /**
     * Extends one or more interfaces.
     *
     * @param Name|string ...$interfaces Names of interfaces to extend
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function extend(...$interfaces)
    {
        foreach ($interfaces as $interface) {
            $this->extends[] = \PhpParser\BuilderHelpers::normalizeName($interface);
        }
        return $this;
    }
    /**
     * Adds a statement.
     *
     * @param Stmt|PhpParser\Builder $stmt The statement to add
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addStmt($stmt)
    {
        $stmt = \PhpParser\BuilderHelpers::normalizeNode($stmt);
        if ($stmt instanceof \PhpParser\Node\Stmt\ClassConst) {
            $this->constants[] = $stmt;
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\ClassMethod) {
            // we erase all statements in the body of an interface method
            $stmt->stmts = null;
            $this->methods[] = $stmt;
        } else {
            throw new \LogicException(\sprintf('Unexpected node of type "%s"', $stmt->getType()));
        }
        return $this;
    }
    /**
     * Returns the built interface node.
     *
     * @return Stmt\Interface_ The built interface node
     */
    public function getNode() : \PhpParser\Node
    {
        return new \PhpParser\Node\Stmt\Interface_($this->name, ['extends' => $this->extends, 'stmts' => \array_merge($this->constants, $this->methods)], $this->attributes);
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Builder;

use PhpParser;
use PhpParser\BuilderHelpers;
use PhpParser\Node\Identifier;
use PhpParser\Node\Name;
use PhpParser\Node\NullableType;
use PhpParser\Node\Stmt;
class Property implements \PhpParser\Builder
{
    protected $name;
    protected $flags = 0;
    protected $default = null;
    protected $attributes = [];
    /** @var null|Identifier|Name|NullableType */
    protected $type;
    /**
     * Creates a property builder.
     *
     * @param string $name Name of the property
     */
    public function __construct(string $name)
    {
        $this->name = $name;
    }
    /**
     * Makes the property public.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makePublic()
    {
        $this->flags = \PhpParser\BuilderHelpers::addModifier($this->flags, \PhpParser\Node\Stmt\Class_::MODIFIER_PUBLIC);
        return $this;
    }
    /**
     * Makes the property protected.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeProtected()
    {
        $this->flags = \PhpParser\BuilderHelpers::addModifier($this->flags, \PhpParser\Node\Stmt\Class_::MODIFIER_PROTECTED);
        return $this;
    }
    /**
     * Makes the property private.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makePrivate()
    {
        $this->flags = \PhpParser\BuilderHelpers::addModifier($this->flags, \PhpParser\Node\Stmt\Class_::MODIFIER_PRIVATE);
        return $this;
    }
    /**
     * Makes the property static.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeStatic()
    {
        $this->flags = \PhpParser\BuilderHelpers::addModifier($this->flags, \PhpParser\Node\Stmt\Class_::MODIFIER_STATIC);
        return $this;
    }
    /**
     * Sets default value for the property.
     *
     * @param mixed $value Default value to use
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function setDefault($value)
    {
        $this->default = \PhpParser\BuilderHelpers::normalizeValue($value);
        return $this;
    }
    /**
     * Sets doc comment for the property.
     *
     * @param PhpParser\Comment\Doc|string $docComment Doc comment to set
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function setDocComment($docComment)
    {
        $this->attributes = ['comments' => [\PhpParser\BuilderHelpers::normalizeDocComment($docComment)]];
        return $this;
    }
    /**
     * Sets the property type for PHP 7.4+.
     *
     * @param string|Name|NullableType|Identifier $type
     *
     * @return $this
     */
    public function setType($type)
    {
        $this->type = \PhpParser\BuilderHelpers::normalizeType($type);
        return $this;
    }
    /**
     * Returns the built class node.
     *
     * @return Stmt\Property The built property node
     */
    public function getNode() : \PhpParser\Node
    {
        return new \PhpParser\Node\Stmt\Property($this->flags !== 0 ? $this->flags : \PhpParser\Node\Stmt\Class_::MODIFIER_PUBLIC, [new \PhpParser\Node\Stmt\PropertyProperty($this->name, $this->default)], $this->attributes, $this->type);
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Builder;

use PhpParser;
use PhpParser\BuilderHelpers;
abstract class Declaration implements \PhpParser\Builder
{
    protected $attributes = [];
    public abstract function addStmt($stmt);
    /**
     * Adds multiple statements.
     *
     * @param array $stmts The statements to add
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addStmts(array $stmts)
    {
        foreach ($stmts as $stmt) {
            $this->addStmt($stmt);
        }
        return $this;
    }
    /**
     * Sets doc comment for the declaration.
     *
     * @param PhpParser\Comment\Doc|string $docComment Doc comment to set
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function setDocComment($docComment)
    {
        $this->attributes['comments'] = [\PhpParser\BuilderHelpers::normalizeDocComment($docComment)];
        return $this;
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Builder;

use PhpParser;
use PhpParser\BuilderHelpers;
use PhpParser\Node;
use PhpParser\Node\Stmt;
class Function_ extends \PhpParser\Builder\FunctionLike
{
    protected $name;
    protected $stmts = [];
    /**
     * Creates a function builder.
     *
     * @param string $name Name of the function
     */
    public function __construct(string $name)
    {
        $this->name = $name;
    }
    /**
     * Adds a statement.
     *
     * @param Node|PhpParser\Builder $stmt The statement to add
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addStmt($stmt)
    {
        $this->stmts[] = \PhpParser\BuilderHelpers::normalizeStmt($stmt);
        return $this;
    }
    /**
     * Returns the built function node.
     *
     * @return Stmt\Function_ The built function node
     */
    public function getNode() : \PhpParser\Node
    {
        return new \PhpParser\Node\Stmt\Function_($this->name, ['byRef' => $this->returnByRef, 'params' => $this->params, 'returnType' => $this->returnType, 'stmts' => $this->stmts], $this->attributes);
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Builder;

use PhpParser\Builder;
use PhpParser\BuilderHelpers;
use PhpParser\Node;
use PhpParser\Node\Stmt;
class Use_ implements \PhpParser\Builder
{
    protected $name;
    protected $type;
    protected $alias = null;
    /**
     * Creates a name use (alias) builder.
     *
     * @param Node\Name|string $name Name of the entity (namespace, class, function, constant) to alias
     * @param int              $type One of the Stmt\Use_::TYPE_* constants
     */
    public function __construct($name, int $type)
    {
        $this->name = \PhpParser\BuilderHelpers::normalizeName($name);
        $this->type = $type;
    }
    /**
     * Sets alias for used name.
     *
     * @param string $alias Alias to use (last component of full name by default)
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function as(string $alias)
    {
        $this->alias = $alias;
        return $this;
    }
    /**
     * Returns the built node.
     *
     * @return Node The built node
     */
    public function getNode() : \PhpParser\Node
    {
        return new \PhpParser\Node\Stmt\Use_([new \PhpParser\Node\Stmt\UseUse($this->name, $this->alias)], $this->type);
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Builder;

use PhpParser\BuilderHelpers;
use PhpParser\Node;
abstract class FunctionLike extends \PhpParser\Builder\Declaration
{
    protected $returnByRef = \false;
    protected $params = [];
    /** @var string|Node\Name|Node\NullableType|null */
    protected $returnType = null;
    /**
     * Make the function return by reference.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeReturnByRef()
    {
        $this->returnByRef = \true;
        return $this;
    }
    /**
     * Adds a parameter.
     *
     * @param Node\Param|Param $param The parameter to add
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addParam($param)
    {
        $param = \PhpParser\BuilderHelpers::normalizeNode($param);
        if (!$param instanceof \PhpParser\Node\Param) {
            throw new \LogicException(\sprintf('Expected parameter node, got "%s"', $param->getType()));
        }
        $this->params[] = $param;
        return $this;
    }
    /**
     * Adds multiple parameters.
     *
     * @param array $params The parameters to add
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addParams(array $params)
    {
        foreach ($params as $param) {
            $this->addParam($param);
        }
        return $this;
    }
    /**
     * Sets the return type for PHP 7.
     *
     * @param string|Node\Name|Node\NullableType $type One of array, callable, string, int, float,
     *                                                 bool, iterable, or a class/interface name.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function setReturnType($type)
    {
        $this->returnType = \PhpParser\BuilderHelpers::normalizeType($type);
        return $this;
    }
}
<?php

declare (strict_types=1);
namespace PhpParser\Builder;

use PhpParser;
use PhpParser\BuilderHelpers;
use PhpParser\Node\Stmt;
class Trait_ extends \PhpParser\Builder\Declaration
{
    protected $name;
    protected $uses = [];
    protected $properties = [];
    protected $methods = [];
    /**
     * Creates an interface builder.
     *
     * @param string $name Name of the interface
     */
    public function __construct(string $name)
    {
        $this->name = $name;
    }
    /**
     * Adds a statement.
     *
     * @param Stmt|PhpParser\Builder $stmt The statement to add
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addStmt($stmt)
    {
        $stmt = \PhpParser\BuilderHelpers::normalizeNode($stmt);
        if ($stmt instanceof \PhpParser\Node\Stmt\Property) {
            $this->properties[] = $stmt;
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\ClassMethod) {
            $this->methods[] = $stmt;
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\TraitUse) {
            $this->uses[] = $stmt;
        } else {
            throw new \LogicException(\sprintf('Unexpected node of type "%s"', $stmt->getType()));
        }
        return $this;
    }
    /**
     * Returns the built trait node.
     *
     * @return Stmt\Trait_ The built interface node
     */
    public function getNode() : \PhpParser\Node
    {
        return new \PhpParser\Node\Stmt\Trait_($this->name, ['stmts' => \array_merge($this->uses, $this->properties, $this->methods)], $this->attributes);
    }
}
<?php

declare (strict_types=1);
namespace PhpParser;

use PhpParser\Internal\DiffElem;
use PhpParser\Internal\PrintableNewAnonClassNode;
use PhpParser\Internal\TokenStream;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\AssignOp;
use PhpParser\Node\Expr\BinaryOp;
use PhpParser\Node\Expr\Cast;
use PhpParser\Node\Scalar;
use PhpParser\Node\Stmt;
abstract class PrettyPrinterAbstract
{
    const FIXUP_PREC_LEFT = 0;
    // LHS operand affected by precedence
    const FIXUP_PREC_RIGHT = 1;
    // RHS operand affected by precedence
    const FIXUP_CALL_LHS = 2;
    // LHS of call
    const FIXUP_DEREF_LHS = 3;
    // LHS of dereferencing operation
    const FIXUP_BRACED_NAME = 4;
    // Name operand that may require bracing
    const FIXUP_VAR_BRACED_NAME = 5;
    // Name operand that may require ${} bracing
    const FIXUP_ENCAPSED = 6;
    // Encapsed string part
    protected $precedenceMap = [
        // [precedence, associativity]
        // where for precedence -1 is %left, 0 is %nonassoc and 1 is %right
        \PhpParser\Node\Expr\BinaryOp\Pow::class => [0, 1],
        \PhpParser\Node\Expr\BitwiseNot::class => [10, 1],
        \PhpParser\Node\Expr\PreInc::class => [10, 1],
        \PhpParser\Node\Expr\PreDec::class => [10, 1],
        \PhpParser\Node\Expr\PostInc::class => [10, -1],
        \PhpParser\Node\Expr\PostDec::class => [10, -1],
        \PhpParser\Node\Expr\UnaryPlus::class => [10, 1],
        \PhpParser\Node\Expr\UnaryMinus::class => [10, 1],
        \PhpParser\Node\Expr\Cast\Int_::class => [10, 1],
        \PhpParser\Node\Expr\Cast\Double::class => [10, 1],
        \PhpParser\Node\Expr\Cast\String_::class => [10, 1],
        \PhpParser\Node\Expr\Cast\Array_::class => [10, 1],
        \PhpParser\Node\Expr\Cast\Object_::class => [10, 1],
        \PhpParser\Node\Expr\Cast\Bool_::class => [10, 1],
        \PhpParser\Node\Expr\Cast\Unset_::class => [10, 1],
        \PhpParser\Node\Expr\ErrorSuppress::class => [10, 1],
        \PhpParser\Node\Expr\Instanceof_::class => [20, 0],
        \PhpParser\Node\Expr\BooleanNot::class => [30, 1],
        \PhpParser\Node\Expr\BinaryOp\Mul::class => [40, -1],
        \PhpParser\Node\Expr\BinaryOp\Div::class => [40, -1],
        \PhpParser\Node\Expr\BinaryOp\Mod::class => [40, -1],
        \PhpParser\Node\Expr\BinaryOp\Plus::class => [50, -1],
        \PhpParser\Node\Expr\BinaryOp\Minus::class => [50, -1],
        \PhpParser\Node\Expr\BinaryOp\Concat::class => [50, -1],
        \PhpParser\Node\Expr\BinaryOp\ShiftLeft::class => [60, -1],
        \PhpParser\Node\Expr\BinaryOp\ShiftRight::class => [60, -1],
        \PhpParser\Node\Expr\BinaryOp\Smaller::class => [70, 0],
        \PhpParser\Node\Expr\BinaryOp\SmallerOrEqual::class => [70, 0],
        \PhpParser\Node\Expr\BinaryOp\Greater::class => [70, 0],
        \PhpParser\Node\Expr\BinaryOp\GreaterOrEqual::class => [70, 0],
        \PhpParser\Node\Expr\BinaryOp\Equal::class => [80, 0],
        \PhpParser\Node\Expr\BinaryOp\NotEqual::class => [80, 0],
        \PhpParser\Node\Expr\BinaryOp\Identical::class => [80, 0],
        \PhpParser\Node\Expr\BinaryOp\NotIdentical::class => [80, 0],
        \PhpParser\Node\Expr\BinaryOp\Spaceship::class => [80, 0],
        \PhpParser\Node\Expr\BinaryOp\BitwiseAnd::class => [90, -1],
        \PhpParser\Node\Expr\BinaryOp\BitwiseXor::class => [100, -1],
        \PhpParser\Node\Expr\BinaryOp\BitwiseOr::class => [110, -1],
        \PhpParser\Node\Expr\BinaryOp\BooleanAnd::class => [120, -1],
        \PhpParser\Node\Expr\BinaryOp\BooleanOr::class => [130, -1],
        \PhpParser\Node\Expr\BinaryOp\Coalesce::class => [140, 1],
        \PhpParser\Node\Expr\Ternary::class => [150, -1],
        // parser uses %left for assignments, but they really behave as %right
        \PhpParser\Node\Expr\Assign::class => [160, 1],
        \PhpParser\Node\Expr\AssignRef::class => [160, 1],
        \PhpParser\Node\Expr\AssignOp\Plus::class => [160, 1],
        \PhpParser\Node\Expr\AssignOp\Minus::class => [160, 1],
        \PhpParser\Node\Expr\AssignOp\Mul::class => [160, 1],
        \PhpParser\Node\Expr\AssignOp\Div::class => [160, 1],
        \PhpParser\Node\Expr\AssignOp\Concat::class => [160, 1],
        \PhpParser\Node\Expr\AssignOp\Mod::class => [160, 1],
        \PhpParser\Node\Expr\AssignOp\BitwiseAnd::class => [160, 1],
        \PhpParser\Node\Expr\AssignOp\BitwiseOr::class => [160, 1],
        \PhpParser\Node\Expr\AssignOp\BitwiseXor::class => [160, 1],
        \PhpParser\Node\Expr\AssignOp\ShiftLeft::class => [160, 1],
        \PhpParser\Node\Expr\AssignOp\ShiftRight::class => [160, 1],
        \PhpParser\Node\Expr\AssignOp\Pow::class => [160, 1],
        \PhpParser\Node\Expr\AssignOp\Coalesce::class => [160, 1],
        \PhpParser\Node\Expr\YieldFrom::class => [165, 1],
        \PhpParser\Node\Expr\Print_::class => [168, 1],
        \PhpParser\Node\Expr\BinaryOp\LogicalAnd::class => [170, -1],
        \PhpParser\Node\Expr\BinaryOp\LogicalXor::class => [180, -1],
        \PhpParser\Node\Expr\BinaryOp\LogicalOr::class => [190, -1],
        \PhpParser\Node\Expr\Include_::class => [200, -1],
    ];
    /** @var int Current indentation level. */
    protected $indentLevel;
    /** @var string Newline including current indentation. */
    protected $nl;
    /** @var string Token placed at end of doc string to ensure it is followed by a newline. */
    protected $docStringEndToken;
    /** @var bool Whether semicolon namespaces can be used (i.e. no global namespace is used) */
    protected $canUseSemicolonNamespaces;
    /** @var array Pretty printer options */
    protected $options;
    /** @var TokenStream Original tokens for use in format-preserving pretty print */
    protected $origTokens;
    /** @var Internal\Differ Differ for node lists */
    protected $nodeListDiffer;
    /** @var bool[] Map determining whether a certain character is a label character */
    protected $labelCharMap;
    /**
     * @var int[][] Map from token classes and subnode names to FIXUP_* constants. This is used
     *              during format-preserving prints to place additional parens/braces if necessary.
     */
    protected $fixupMap;
    /**
     * @var int[][] Map from "{$node->getType()}->{$subNode}" to ['left' => $l, 'right' => $r],
     *              where $l and $r specify the token type that needs to be stripped when removing
     *              this node.
     */
    protected $removalMap;
    /**
     * @var mixed[] Map from "{$node->getType()}->{$subNode}" to [$find, $beforeToken, $extraLeft, $extraRight].
     *              $find is an optional token after which the insertion occurs. $extraLeft/Right
     *              are optionally added before/after the main insertions.
     */
    protected $insertionMap;
    /**
     * @var string[] Map From "{$node->getType()}->{$subNode}" to string that should be inserted
     *               between elements of this list subnode.
     */
    protected $listInsertionMap;
    protected $emptyListInsertionMap;
    /** @var int[] Map from "{$node->getType()}->{$subNode}" to token before which the modifiers
     *             should be reprinted. */
    protected $modifierChangeMap;
    /**
     * Creates a pretty printer instance using the given options.
     *
     * Supported options:
     *  * bool $shortArraySyntax = false: Whether to use [] instead of array() as the default array
     *                                    syntax, if the node does not specify a format.
     *
     * @param array $options Dictionary of formatting options
     */
    public function __construct(array $options = [])
    {
        $this->docStringEndToken = '_DOC_STRING_END_' . \mt_rand();
        $defaultOptions = ['shortArraySyntax' => \false];
        $this->options = $options + $defaultOptions;
    }
    /**
     * Reset pretty printing state.
     */
    protected function resetState()
    {
        $this->indentLevel = 0;
        $this->nl = "\n";
        $this->origTokens = null;
    }
    /**
     * Set indentation level
     *
     * @param int $level Level in number of spaces
     */
    protected function setIndentLevel(int $level)
    {
        $this->indentLevel = $level;
        $this->nl = "\n" . \str_repeat(' ', $level);
    }
    /**
     * Increase indentation level.
     */
    protected function indent()
    {
        $this->indentLevel += 4;
        $this->nl .= '    ';
    }
    /**
     * Decrease indentation level.
     */
    protected function outdent()
    {
        \assert($this->indentLevel >= 4);
        $this->indentLevel -= 4;
        $this->nl = "\n" . \str_repeat(' ', $this->indentLevel);
    }
    /**
     * Pretty prints an array of statements.
     *
     * @param Node[] $stmts Array of statements
     *
     * @return string Pretty printed statements
     */
    public function prettyPrint(array $stmts) : string
    {
        $this->resetState();
        $this->preprocessNodes($stmts);
        return \ltrim($this->handleMagicTokens($this->pStmts($stmts, \false)));
    }
    /**
     * Pretty prints an expression.
     *
     * @param Expr $node Expression node
     *
     * @return string Pretty printed node
     */
    public function prettyPrintExpr(\PhpParser\Node\Expr $node) : string
    {
        $this->resetState();
        return $this->handleMagicTokens($this->p($node));
    }
    /**
     * Pretty prints a file of statements (includes the opening <?php tag if it is required).
     *
     * @param Node[] $stmts Array of statements
     *
     * @return string Pretty printed statements
     */
    public function prettyPrintFile(array $stmts) : string
    {
        if (!$stmts) {
            return "<?php\n\n";
        }
        $p = "<?php\n\n" . $this->prettyPrint($stmts);
        if ($stmts[0] instanceof \PhpParser\Node\Stmt\InlineHTML) {
            $p = \preg_replace('/^<\\?php\\s+\\?>\\n?/', '', $p);
        }
        if ($stmts[\count($stmts) - 1] instanceof \PhpParser\Node\Stmt\InlineHTML) {
            $p = \preg_replace('/<\\?php$/', '', \rtrim($p));
        }
        return $p;
    }
    /**
     * Preprocesses the top-level nodes to initialize pretty printer state.
     *
     * @param Node[] $nodes Array of nodes
     */
    protected function preprocessNodes(array $nodes)
    {
        /* We can use semicolon-namespaces unless there is a global namespace declaration */
        $this->canUseSemicolonNamespaces = \true;
        foreach ($nodes as $node) {
            if ($node instanceof \PhpParser\Node\Stmt\Namespace_ && null === $node->name) {
                $this->canUseSemicolonNamespaces = \false;
                break;
            }
        }
    }
    /**
     * Handles (and removes) no-indent and doc-string-end tokens.
     *
     * @param string $str
     * @return string
     */
    protected function handleMagicTokens(string $str) : string
    {
        // Replace doc-string-end tokens with nothing or a newline
        $str = \str_replace($this->docStringEndToken . ";\n", ";\n", $str);
        $str = \str_replace($this->docStringEndToken, "\n", $str);
        return $str;
    }
    /**
     * Pretty prints an array of nodes (statements) and indents them optionally.
     *
     * @param Node[] $nodes  Array of nodes
     * @param bool   $indent Whether to indent the printed nodes
     *
     * @return string Pretty printed statements
     */
    protected function pStmts(array $nodes, bool $indent = \true) : string
    {
        if ($indent) {
            $this->indent();
        }
        $result = '';
        foreach ($nodes as $node) {
            $comments = $node->getComments();
            if ($comments) {
                $result .= $this->nl . $this->pComments($comments);
                if ($node instanceof \PhpParser\Node\Stmt\Nop) {
                    continue;
                }
            }
            $result .= $this->nl . $this->p($node);
        }
        if ($indent) {
            $this->outdent();
        }
        return $result;
    }
    /**
     * Pretty-print an infix operation while taking precedence into account.
     *
     * @param string $class          Node class of operator
     * @param Node   $leftNode       Left-hand side node
     * @param string $operatorString String representation of the operator
     * @param Node   $rightNode      Right-hand side node
     *
     * @return string Pretty printed infix operation
     */
    protected function pInfixOp(string $class, \PhpParser\Node $leftNode, string $operatorString, \PhpParser\Node $rightNode) : string
    {
        list($precedence, $associativity) = $this->precedenceMap[$class];
        return $this->pPrec($leftNode, $precedence, $associativity, -1) . $operatorString . $this->pPrec($rightNode, $precedence, $associativity, 1);
    }
    /**
     * Pretty-print a prefix operation while taking precedence into account.
     *
     * @param string $class          Node class of operator
     * @param string $operatorString String representation of the operator
     * @param Node   $node           Node
     *
     * @return string Pretty printed prefix operation
     */
    protected function pPrefixOp(string $class, string $operatorString, \PhpParser\Node $node) : string
    {
        list($precedence, $associativity) = $this->precedenceMap[$class];
        return $operatorString . $this->pPrec($node, $precedence, $associativity, 1);
    }
    /**
     * Pretty-print a postfix operation while taking precedence into account.
     *
     * @param string $class          Node class of operator
     * @param string $operatorString String representation of the operator
     * @param Node   $node           Node
     *
     * @return string Pretty printed postfix operation
     */
    protected function pPostfixOp(string $class, \PhpParser\Node $node, string $operatorString) : string
    {
        list($precedence, $associativity) = $this->precedenceMap[$class];
        return $this->pPrec($node, $precedence, $associativity, -1) . $operatorString;
    }
    /**
     * Prints an expression node with the least amount of parentheses necessary to preserve the meaning.
     *
     * @param Node $node                Node to pretty print
     * @param int  $parentPrecedence    Precedence of the parent operator
     * @param int  $parentAssociativity Associativity of parent operator
     *                                  (-1 is left, 0 is nonassoc, 1 is right)
     * @param int  $childPosition       Position of the node relative to the operator
     *                                  (-1 is left, 1 is right)
     *
     * @return string The pretty printed node
     */
    protected function pPrec(\PhpParser\Node $node, int $parentPrecedence, int $parentAssociativity, int $childPosition) : string
    {
        $class = \get_class($node);
        if (isset($this->precedenceMap[$class])) {
            $childPrecedence = $this->precedenceMap[$class][0];
            if ($childPrecedence > $parentPrecedence || $parentPrecedence === $childPrecedence && $parentAssociativity !== $childPosition) {
                return '(' . $this->p($node) . ')';
            }
        }
        return $this->p($node);
    }
    /**
     * Pretty prints an array of nodes and implodes the printed values.
     *
     * @param Node[] $nodes Array of Nodes to be printed
     * @param string $glue  Character to implode with
     *
     * @return string Imploded pretty printed nodes
     */
    protected function pImplode(array $nodes, string $glue = '') : string
    {
        $pNodes = [];
        foreach ($nodes as $node) {
            if (null === $node) {
                $pNodes[] = '';
            } else {
                $pNodes[] = $this->p($node);
            }
        }
        return \implode($glue, $pNodes);
    }
    /**
     * Pretty prints an array of nodes and implodes the printed values with commas.
     *
     * @param Node[] $nodes Array of Nodes to be printed
     *
     * @return string Comma separated pretty printed nodes
     */
    protected function pCommaSeparated(array $nodes) : string
    {
        return $this->pImplode($nodes, ', ');
    }
    /**
     * Pretty prints a comma-separated list of nodes in multiline style, including comments.
     *
     * The result includes a leading newline and one level of indentation (same as pStmts).
     *
     * @param Node[] $nodes         Array of Nodes to be printed
     * @param bool   $trailingComma Whether to use a trailing comma
     *
     * @return string Comma separated pretty printed nodes in multiline style
     */
    protected function pCommaSeparatedMultiline(array $nodes, bool $trailingComma) : string
    {
        $this->indent();
        $result = '';
        $lastIdx = \count($nodes) - 1;
        foreach ($nodes as $idx => $node) {
            if ($node !== null) {
                $comments = $node->getComments();
                if ($comments) {
                    $result .= $this->nl . $this->pComments($comments);
                }
                $result .= $this->nl . $this->p($node);
            } else {
                $result .= $this->nl;
            }
            if ($trailingComma || $idx !== $lastIdx) {
                $result .= ',';
            }
        }
        $this->outdent();
        return $result;
    }
    /**
     * Prints reformatted text of the passed comments.
     *
     * @param Comment[] $comments List of comments
     *
     * @return string Reformatted text of comments
     */
    protected function pComments(array $comments) : string
    {
        $formattedComments = [];
        foreach ($comments as $comment) {
            $formattedComments[] = \str_replace("\n", $this->nl, $comment->getReformattedText());
        }
        return \implode($this->nl, $formattedComments);
    }
    /**
     * Perform a format-preserving pretty print of an AST.
     *
     * The format preservation is best effort. For some changes to the AST the formatting will not
     * be preserved (at least not locally).
     *
     * In order to use this method a number of prerequisites must be satisfied:
     *  * The startTokenPos and endTokenPos attributes in the lexer must be enabled.
     *  * The CloningVisitor must be run on the AST prior to modification.
     *  * The original tokens must be provided, using the getTokens() method on the lexer.
     *
     * @param Node[] $stmts      Modified AST with links to original AST
     * @param Node[] $origStmts  Original AST with token offset information
     * @param array  $origTokens Tokens of the original code
     *
     * @return string
     */
    public function printFormatPreserving(array $stmts, array $origStmts, array $origTokens) : string
    {
        $this->initializeNodeListDiffer();
        $this->initializeLabelCharMap();
        $this->initializeFixupMap();
        $this->initializeRemovalMap();
        $this->initializeInsertionMap();
        $this->initializeListInsertionMap();
        $this->initializeEmptyListInsertionMap();
        $this->initializeModifierChangeMap();
        $this->resetState();
        $this->origTokens = new \PhpParser\Internal\TokenStream($origTokens);
        $this->preprocessNodes($stmts);
        $pos = 0;
        $result = $this->pArray($stmts, $origStmts, $pos, 0, 'File', 'stmts', null);
        if (null !== $result) {
            $result .= $this->origTokens->getTokenCode($pos, \count($origTokens), 0);
        } else {
            // Fallback
            // TODO Add <?php properly
            $result = "<?php\n" . $this->pStmts($stmts, \false);
        }
        return \ltrim($this->handleMagicTokens($result));
    }
    protected function pFallback(\PhpParser\Node $node)
    {
        return $this->{'p' . $node->getType()}($node);
    }
    /**
     * Pretty prints a node.
     *
     * This method also handles formatting preservation for nodes.
     *
     * @param Node $node Node to be pretty printed
     * @param bool $parentFormatPreserved Whether parent node has preserved formatting
     *
     * @return string Pretty printed node
     */
    protected function p(\PhpParser\Node $node, $parentFormatPreserved = \false) : string
    {
        // No orig tokens means this is a normal pretty print without preservation of formatting
        if (!$this->origTokens) {
            return $this->{'p' . $node->getType()}($node);
        }
        /** @var Node $origNode */
        $origNode = $node->getAttribute('origNode');
        if (null === $origNode) {
            return $this->pFallback($node);
        }
        $class = \get_class($node);
        \assert($class === \get_class($origNode));
        $startPos = $origNode->getStartTokenPos();
        $endPos = $origNode->getEndTokenPos();
        \assert($startPos >= 0 && $endPos >= 0);
        $fallbackNode = $node;
        if ($node instanceof \PhpParser\Node\Expr\New_ && $node->class instanceof \PhpParser\Node\Stmt\Class_) {
            // Normalize node structure of anonymous classes
            $node = \PhpParser\Internal\PrintableNewAnonClassNode::fromNewNode($node);
            $origNode = \PhpParser\Internal\PrintableNewAnonClassNode::fromNewNode($origNode);
        }
        // InlineHTML node does not contain closing and opening PHP tags. If the parent formatting
        // is not preserved, then we need to use the fallback code to make sure the tags are
        // printed.
        if ($node instanceof \PhpParser\Node\Stmt\InlineHTML && !$parentFormatPreserved) {
            return $this->pFallback($fallbackNode);
        }
        $indentAdjustment = $this->indentLevel - $this->origTokens->getIndentationBefore($startPos);
        $type = $node->getType();
        $fixupInfo = $this->fixupMap[$class] ?? null;
        $result = '';
        $pos = $startPos;
        foreach ($node->getSubNodeNames() as $subNodeName) {
            $subNode = $node->{$subNodeName};
            $origSubNode = $origNode->{$subNodeName};
            if (!$subNode instanceof \PhpParser\Node && $subNode !== null || !$origSubNode instanceof \PhpParser\Node && $origSubNode !== null) {
                if ($subNode === $origSubNode) {
                    // Unchanged, can reuse old code
                    continue;
                }
                if (\is_array($subNode) && \is_array($origSubNode)) {
                    // Array subnode changed, we might be able to reconstruct it
                    $listResult = $this->pArray($subNode, $origSubNode, $pos, $indentAdjustment, $type, $subNodeName, $fixupInfo[$subNodeName] ?? null);
                    if (null === $listResult) {
                        return $this->pFallback($fallbackNode);
                    }
                    $result .= $listResult;
                    continue;
                }
                if (\is_int($subNode) && \is_int($origSubNode)) {
                    // Check if this is a modifier change
                    $key = $type . '->' . $subNodeName;
                    if (!isset($this->modifierChangeMap[$key])) {
                        return $this->pFallback($fallbackNode);
                    }
                    $findToken = $this->modifierChangeMap[$key];
                    $result .= $this->pModifiers($subNode);
                    $pos = $this->origTokens->findRight($pos, $findToken);
                    continue;
                }
                // If a non-node, non-array subnode changed, we don't be able to do a partial
                // reconstructions, as we don't have enough offset information. Pretty print the
                // whole node instead.
                return $this->pFallback($fallbackNode);
            }
            $extraLeft = '';
            $extraRight = '';
            if ($origSubNode !== null) {
                $subStartPos = $origSubNode->getStartTokenPos();
                $subEndPos = $origSubNode->getEndTokenPos();
                \assert($subStartPos >= 0 && $subEndPos >= 0);
            } else {
                if ($subNode === null) {
                    // Both null, nothing to do
                    continue;
                }
                // A node has been inserted, check if we have insertion information for it
                $key = $type . '->' . $subNodeName;
                if (!isset($this->insertionMap[$key])) {
                    return $this->pFallback($fallbackNode);
                }
                list($findToken, $beforeToken, $extraLeft, $extraRight) = $this->insertionMap[$key];
                if (null !== $findToken) {
                    $subStartPos = $this->origTokens->findRight($pos, $findToken) + (int) (!$beforeToken);
                } else {
                    $subStartPos = $pos;
                }
                if (null === $extraLeft && null !== $extraRight) {
                    // If inserting on the right only, skipping whitespace looks better
                    $subStartPos = $this->origTokens->skipRightWhitespace($subStartPos);
                }
                $subEndPos = $subStartPos - 1;
            }
            if (null === $subNode) {
                // A node has been removed, check if we have removal information for it
                $key = $type . '->' . $subNodeName;
                if (!isset($this->removalMap[$key])) {
                    return $this->pFallback($fallbackNode);
                }
                // Adjust positions to account for additional tokens that must be skipped
                $removalInfo = $this->removalMap[$key];
                if (isset($removalInfo['left'])) {
                    $subStartPos = $this->origTokens->skipLeft($subStartPos - 1, $removalInfo['left']) + 1;
                }
                if (isset($removalInfo['right'])) {
                    $subEndPos = $this->origTokens->skipRight($subEndPos + 1, $removalInfo['right']) - 1;
                }
            }
            $result .= $this->origTokens->getTokenCode($pos, $subStartPos, $indentAdjustment);
            if (null !== $subNode) {
                $result .= $extraLeft;
                $origIndentLevel = $this->indentLevel;
                $this->setIndentLevel($this->origTokens->getIndentationBefore($subStartPos) + $indentAdjustment);
                // If it's the same node that was previously in this position, it certainly doesn't
                // need fixup. It's important to check this here, because our fixup checks are more
                // conservative than strictly necessary.
                if (isset($fixupInfo[$subNodeName]) && $subNode->getAttribute('origNode') !== $origSubNode) {
                    $fixup = $fixupInfo[$subNodeName];
                    $res = $this->pFixup($fixup, $subNode, $class, $subStartPos, $subEndPos);
                } else {
                    $res = $this->p($subNode, \true);
                }
                $this->safeAppend($result, $res);
                $this->setIndentLevel($origIndentLevel);
                $result .= $extraRight;
            }
            $pos = $subEndPos + 1;
        }
        $result .= $this->origTokens->getTokenCode($pos, $endPos + 1, $indentAdjustment);
        return $result;
    }
    /**
     * Perform a format-preserving pretty print of an array.
     *
     * @param array       $nodes            New nodes
     * @param array       $origNodes        Original nodes
     * @param int         $pos              Current token position (updated by reference)
     * @param int         $indentAdjustment Adjustment for indentation
     * @param string      $parentNodeType   Type of the containing node.
     * @param string      $subNodeName      Name of array subnode.
     * @param null|int    $fixup            Fixup information for array item nodes
     *
     * @return null|string Result of pretty print or null if cannot preserve formatting
     */
    protected function pArray(array $nodes, array $origNodes, int &$pos, int $indentAdjustment, string $parentNodeType, string $subNodeName, $fixup)
    {
        $diff = $this->nodeListDiffer->diffWithReplacements($origNodes, $nodes);
        $mapKey = $parentNodeType . '->' . $subNodeName;
        $insertStr = $this->listInsertionMap[$mapKey] ?? null;
        $beforeFirstKeepOrReplace = \true;
        $delayedAdd = [];
        $lastElemIndentLevel = $this->indentLevel;
        $insertNewline = \false;
        if ($insertStr === "\n") {
            $insertStr = '';
            $insertNewline = \true;
        }
        if ($subNodeName === 'stmts' && \count($origNodes) === 1 && \count($nodes) !== 1) {
            $startPos = $origNodes[0]->getStartTokenPos();
            $endPos = $origNodes[0]->getEndTokenPos();
            \assert($startPos >= 0 && $endPos >= 0);
            if (!$this->origTokens->haveBraces($startPos, $endPos)) {
                // This was a single statement without braces, but either additional statements
                // have been added, or the single statement has been removed. This requires the
                // addition of braces. For now fall back.
                // TODO: Try to preserve formatting
                return null;
            }
        }
        $result = '';
        foreach ($diff as $i => $diffElem) {
            $diffType = $diffElem->type;
            /** @var Node|null $arrItem */
            $arrItem = $diffElem->new;
            /** @var Node|null $origArrItem */
            $origArrItem = $diffElem->old;
            if ($diffType === \PhpParser\Internal\DiffElem::TYPE_KEEP || $diffType === \PhpParser\Internal\DiffElem::TYPE_REPLACE) {
                $beforeFirstKeepOrReplace = \false;
                if ($origArrItem === null || $arrItem === null) {
                    // We can only handle the case where both are null
                    if ($origArrItem === $arrItem) {
                        continue;
                    }
                    return null;
                }
                if (!$arrItem instanceof \PhpParser\Node || !$origArrItem instanceof \PhpParser\Node) {
                    // We can only deal with nodes. This can occur for Names, which use string arrays.
                    return null;
                }
                $itemStartPos = $origArrItem->getStartTokenPos();
                $itemEndPos = $origArrItem->getEndTokenPos();
                \assert($itemStartPos >= 0 && $itemEndPos >= 0);
                if ($itemEndPos < $itemStartPos) {
                    // End can be before start for Nop nodes, because offsets refer to non-whitespace
                    // locations, which for an "empty" node might result in an inverted order.
                    \assert($origArrItem instanceof \PhpParser\Node\Stmt\Nop);
                    continue;
                }
                $origIndentLevel = $this->indentLevel;
                $lastElemIndentLevel = $this->origTokens->getIndentationBefore($itemStartPos) + $indentAdjustment;
                $this->setIndentLevel($lastElemIndentLevel);
                $comments = $arrItem->getComments();
                $origComments = $origArrItem->getComments();
                $commentStartPos = $origComments ? $origComments[0]->getTokenPos() : $itemStartPos;
                \assert($commentStartPos >= 0);
                $commentsChanged = $comments !== $origComments;
                if ($commentsChanged) {
                    // Remove old comments
                    $itemStartPos = $commentStartPos;
                }
                if (!empty($delayedAdd)) {
                    $result .= $this->origTokens->getTokenCode($pos, $commentStartPos, $indentAdjustment);
                    /** @var Node $delayedAddNode */
                    foreach ($delayedAdd as $delayedAddNode) {
                        if ($insertNewline) {
                            $delayedAddComments = $delayedAddNode->getComments();
                            if ($delayedAddComments) {
                                $result .= $this->pComments($delayedAddComments) . $this->nl;
                            }
                        }
                        $this->safeAppend($result, $this->p($delayedAddNode, \true));
                        if ($insertNewline) {
                            $result .= $insertStr . $this->nl;
                        } else {
                            $result .= $insertStr;
                        }
                    }
                    $result .= $this->origTokens->getTokenCode($commentStartPos, $itemStartPos, $indentAdjustment);
                    $delayedAdd = [];
                } else {
                    $result .= $this->origTokens->getTokenCode($pos, $itemStartPos, $indentAdjustment);
                }
                if ($commentsChanged && $comments) {
                    // Add new comments
                    $result .= $this->pComments($comments) . $this->nl;
                }
            } elseif ($diffType === \PhpParser\Internal\DiffElem::TYPE_ADD) {
                if (null === $insertStr) {
                    // We don't have insertion information for this list type
                    return null;
                }
                if ($insertStr === ', ' && $this->isMultiline($origNodes)) {
                    $insertStr = ',';
                    $insertNewline = \true;
                }
                if ($beforeFirstKeepOrReplace) {
                    // Will be inserted at the next "replace" or "keep" element
                    $delayedAdd[] = $arrItem;
                    continue;
                }
                $itemStartPos = $pos;
                $itemEndPos = $pos - 1;
                $origIndentLevel = $this->indentLevel;
                $this->setIndentLevel($lastElemIndentLevel);
                if ($insertNewline) {
                    $comments = $arrItem->getComments();
                    if ($comments) {
                        $result .= $this->nl . $this->pComments($comments);
                    }
                    $result .= $insertStr . $this->nl;
                } else {
                    $result .= $insertStr;
                }
            } elseif ($diffType === \PhpParser\Internal\DiffElem::TYPE_REMOVE) {
                if ($i === 0) {
                    // TODO Handle removal at the start
                    return null;
                }
                if (!$origArrItem instanceof \PhpParser\Node) {
                    // We only support removal for nodes
                    return null;
                }
                $itemEndPos = $origArrItem->getEndTokenPos();
                \assert($itemEndPos >= 0);
                $pos = $itemEndPos + 1;
                continue;
            } else {
                throw new \Exception("Shouldn't happen");
            }
            if (null !== $fixup && $arrItem->getAttribute('origNode') !== $origArrItem) {
                $res = $this->pFixup($fixup, $arrItem, null, $itemStartPos, $itemEndPos);
            } else {
                $res = $this->p($arrItem, \true);
            }
            $this->safeAppend($result, $res);
            $this->setIndentLevel($origIndentLevel);
            $pos = $itemEndPos + 1;
        }
        if (!empty($delayedAdd)) {
            if (!isset($this->emptyListInsertionMap[$mapKey])) {
                return null;
            }
            list($findToken, $extraLeft, $extraRight) = $this->emptyListInsertionMap[$mapKey];
            if (null !== $findToken) {
                $insertPos = $this->origTokens->findRight($pos, $findToken) + 1;
                $result .= $this->origTokens->getTokenCode($pos, $insertPos, $indentAdjustment);
                $pos = $insertPos;
            }
            $first = \true;
            $result .= $extraLeft;
            foreach ($delayedAdd as $delayedAddNode) {
                if (!$first) {
                    $result .= $insertStr;
                }
                $result .= $this->p($delayedAddNode, \true);
                $first = \false;
            }
            $result .= $extraRight;
        }
        return $result;
    }
    /**
     * Print node with fixups.
     *
     * Fixups here refer to the addition of extra parentheses, braces or other characters, that
     * are required to preserve program semantics in a certain context (e.g. to maintain precedence
     * or because only certain expressions are allowed in certain places).
     *
     * @param int         $fixup       Fixup type
     * @param Node        $subNode     Subnode to print
     * @param string|null $parentClass Class of parent node
     * @param int         $subStartPos Original start pos of subnode
     * @param int         $subEndPos   Original end pos of subnode
     *
     * @return string Result of fixed-up print of subnode
     */
    protected function pFixup(int $fixup, \PhpParser\Node $subNode, $parentClass, int $subStartPos, int $subEndPos) : string
    {
        switch ($fixup) {
            case self::FIXUP_PREC_LEFT:
            case self::FIXUP_PREC_RIGHT:
                if (!$this->origTokens->haveParens($subStartPos, $subEndPos)) {
                    list($precedence, $associativity) = $this->precedenceMap[$parentClass];
                    return $this->pPrec($subNode, $precedence, $associativity, $fixup === self::FIXUP_PREC_LEFT ? -1 : 1);
                }
                break;
            case self::FIXUP_CALL_LHS:
                if ($this->callLhsRequiresParens($subNode) && !$this->origTokens->haveParens($subStartPos, $subEndPos)) {
                    return '(' . $this->p($subNode) . ')';
                }
                break;
            case self::FIXUP_DEREF_LHS:
                if ($this->dereferenceLhsRequiresParens($subNode) && !$this->origTokens->haveParens($subStartPos, $subEndPos)) {
                    return '(' . $this->p($subNode) . ')';
                }
                break;
            case self::FIXUP_BRACED_NAME:
            case self::FIXUP_VAR_BRACED_NAME:
                if ($subNode instanceof \PhpParser\Node\Expr && !$this->origTokens->haveBraces($subStartPos, $subEndPos)) {
                    return ($fixup === self::FIXUP_VAR_BRACED_NAME ? '$' : '') . '{' . $this->p($subNode) . '}';
                }
                break;
            case self::FIXUP_ENCAPSED:
                if (!$subNode instanceof \PhpParser\Node\Scalar\EncapsedStringPart && !$this->origTokens->haveBraces($subStartPos, $subEndPos)) {
                    return '{' . $this->p($subNode) . '}';
                }
                break;
            default:
                throw new \Exception('Cannot happen');
        }
        // Nothing special to do
        return $this->p($subNode);
    }
    /**
     * Appends to a string, ensuring whitespace between label characters.
     *
     * Example: "echo" and "$x" result in "echo$x", but "echo" and "x" result in "echo x".
     * Without safeAppend the result would be "echox", which does not preserve semantics.
     *
     * @param string $str
     * @param string $append
     */
    protected function safeAppend(string &$str, string $append)
    {
        if ($str === "") {
            $str = $append;
            return;
        }
        if ($append === "") {
            return;
        }
        if (!$this->labelCharMap[$append[0]] || !$this->labelCharMap[$str[\strlen($str) - 1]]) {
            $str .= $append;
        } else {
            $str .= " " . $append;
        }
    }
    /**
     * Determines whether the LHS of a call must be wrapped in parenthesis.
     *
     * @param Node $node LHS of a call
     *
     * @return bool Whether parentheses are required
     */
    protected function callLhsRequiresParens(\PhpParser\Node $node) : bool
    {
        return !($node instanceof \PhpParser\Node\Name || $node instanceof \PhpParser\Node\Expr\Variable || $node instanceof \PhpParser\Node\Expr\ArrayDimFetch || $node instanceof \PhpParser\Node\Expr\FuncCall || $node instanceof \PhpParser\Node\Expr\MethodCall || $node instanceof \PhpParser\Node\Expr\StaticCall || $node instanceof \PhpParser\Node\Expr\Array_);
    }
    /**
     * Determines whether the LHS of a dereferencing operation must be wrapped in parenthesis.
     *
     * @param Node $node LHS of dereferencing operation
     *
     * @return bool Whether parentheses are required
     */
    protected function dereferenceLhsRequiresParens(\PhpParser\Node $node) : bool
    {
        return !($node instanceof \PhpParser\Node\Expr\Variable || $node instanceof \PhpParser\Node\Name || $node instanceof \PhpParser\Node\Expr\ArrayDimFetch || $node instanceof \PhpParser\Node\Expr\PropertyFetch || $node instanceof \PhpParser\Node\Expr\StaticPropertyFetch || $node instanceof \PhpParser\Node\Expr\FuncCall || $node instanceof \PhpParser\Node\Expr\MethodCall || $node instanceof \PhpParser\Node\Expr\StaticCall || $node instanceof \PhpParser\Node\Expr\Array_ || $node instanceof \PhpParser\Node\Scalar\String_ || $node instanceof \PhpParser\Node\Expr\ConstFetch || $node instanceof \PhpParser\Node\Expr\ClassConstFetch);
    }
    /**
     * Print modifiers, including trailing whitespace.
     *
     * @param int $modifiers Modifier mask to print
     *
     * @return string Printed modifiers
     */
    protected function pModifiers(int $modifiers)
    {
        return ($modifiers & \PhpParser\Node\Stmt\Class_::MODIFIER_PUBLIC ? 'public ' : '') . ($modifiers & \PhpParser\Node\Stmt\Class_::MODIFIER_PROTECTED ? 'protected ' : '') . ($modifiers & \PhpParser\Node\Stmt\Class_::MODIFIER_PRIVATE ? 'private ' : '') . ($modifiers & \PhpParser\Node\Stmt\Class_::MODIFIER_STATIC ? 'static ' : '') . ($modifiers & \PhpParser\Node\Stmt\Class_::MODIFIER_ABSTRACT ? 'abstract ' : '') . ($modifiers & \PhpParser\Node\Stmt\Class_::MODIFIER_FINAL ? 'final ' : '');
    }
    /**
     * Determine whether a list of nodes uses multiline formatting.
     *
     * @param (Node|null)[] $nodes Node list
     *
     * @return bool Whether multiline formatting is used
     */
    protected function isMultiline(array $nodes) : bool
    {
        if (\count($nodes) < 2) {
            return \false;
        }
        $pos = -1;
        foreach ($nodes as $node) {
            if (null === $node) {
                continue;
            }
            $endPos = $node->getEndTokenPos() + 1;
            if ($pos >= 0) {
                $text = $this->origTokens->getTokenCode($pos, $endPos, 0);
                if (\false === \strpos($text, "\n")) {
                    // We require that a newline is present between *every* item. If the formatting
                    // is inconsistent, with only some items having newlines, we don't consider it
                    // as multiline
                    return \false;
                }
            }
            $pos = $endPos;
        }
        return \true;
    }
    /**
     * Lazily initializes label char map.
     *
     * The label char map determines whether a certain character may occur in a label.
     */
    protected function initializeLabelCharMap()
    {
        if ($this->labelCharMap) {
            return;
        }
        $this->labelCharMap = [];
        for ($i = 0; $i < 256; $i++) {
            // Since PHP 7.1 The lower range is 0x80. However, we also want to support code for
            // older versions.
            $this->labelCharMap[\chr($i)] = $i >= 0x7f || \ctype_alnum($i);
        }
    }
    /**
     * Lazily initializes node list differ.
     *
     * The node list differ is used to determine differences between two array subnodes.
     */
    protected function initializeNodeListDiffer()
    {
        if ($this->nodeListDiffer) {
            return;
        }
        $this->nodeListDiffer = new \PhpParser\Internal\Differ(function ($a, $b) {
            if ($a instanceof \PhpParser\Node && $b instanceof \PhpParser\Node) {
                return $a === $b->getAttribute('origNode');
            }
            // Can happen for array destructuring
            return $a === null && $b === null;
        });
    }
    /**
     * Lazily initializes fixup map.
     *
     * The fixup map is used to determine whether a certain subnode of a certain node may require
     * some kind of "fixup" operation, e.g. the addition of parenthesis or braces.
     */
    protected function initializeFixupMap()
    {
        if ($this->fixupMap) {
            return;
        }
        $this->fixupMap = [\PhpParser\Node\Expr\PreInc::class => ['var' => self::FIXUP_PREC_RIGHT], \PhpParser\Node\Expr\PreDec::class => ['var' => self::FIXUP_PREC_RIGHT], \PhpParser\Node\Expr\PostInc::class => ['var' => self::FIXUP_PREC_LEFT], \PhpParser\Node\Expr\PostDec::class => ['var' => self::FIXUP_PREC_LEFT], \PhpParser\Node\Expr\Instanceof_::class => ['expr' => self::FIXUP_PREC_LEFT, 'class' => self::FIXUP_PREC_RIGHT], \PhpParser\Node\Expr\Ternary::class => ['cond' => self::FIXUP_PREC_LEFT, 'else' => self::FIXUP_PREC_RIGHT], \PhpParser\Node\Expr\FuncCall::class => ['name' => self::FIXUP_CALL_LHS], \PhpParser\Node\Expr\StaticCall::class => ['class' => self::FIXUP_DEREF_LHS], \PhpParser\Node\Expr\ArrayDimFetch::class => ['var' => self::FIXUP_DEREF_LHS], \PhpParser\Node\Expr\MethodCall::class => ['var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], \PhpParser\Node\Expr\StaticPropertyFetch::class => ['class' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_VAR_BRACED_NAME], \PhpParser\Node\Expr\PropertyFetch::class => ['var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], \PhpParser\Node\Scalar\Encapsed::class => ['parts' => self::FIXUP_ENCAPSED]];
        $binaryOps = [\PhpParser\Node\Expr\BinaryOp\Pow::class, \PhpParser\Node\Expr\BinaryOp\Mul::class, \PhpParser\Node\Expr\BinaryOp\Div::class, \PhpParser\Node\Expr\BinaryOp\Mod::class, \PhpParser\Node\Expr\BinaryOp\Plus::class, \PhpParser\Node\Expr\BinaryOp\Minus::class, \PhpParser\Node\Expr\BinaryOp\Concat::class, \PhpParser\Node\Expr\BinaryOp\ShiftLeft::class, \PhpParser\Node\Expr\BinaryOp\ShiftRight::class, \PhpParser\Node\Expr\BinaryOp\Smaller::class, \PhpParser\Node\Expr\BinaryOp\SmallerOrEqual::class, \PhpParser\Node\Expr\BinaryOp\Greater::class, \PhpParser\Node\Expr\BinaryOp\GreaterOrEqual::class, \PhpParser\Node\Expr\BinaryOp\Equal::class, \PhpParser\Node\Expr\BinaryOp\NotEqual::class, \PhpParser\Node\Expr\BinaryOp\Identical::class, \PhpParser\Node\Expr\BinaryOp\NotIdentical::class, \PhpParser\Node\Expr\BinaryOp\Spaceship::class, \PhpParser\Node\Expr\BinaryOp\BitwiseAnd::class, \PhpParser\Node\Expr\BinaryOp\BitwiseXor::class, \PhpParser\Node\Expr\BinaryOp\BitwiseOr::class, \PhpParser\Node\Expr\BinaryOp\BooleanAnd::class, \PhpParser\Node\Expr\BinaryOp\BooleanOr::class, \PhpParser\Node\Expr\BinaryOp\Coalesce::class, \PhpParser\Node\Expr\BinaryOp\LogicalAnd::class, \PhpParser\Node\Expr\BinaryOp\LogicalXor::class, \PhpParser\Node\Expr\BinaryOp\LogicalOr::class];
        foreach ($binaryOps as $binaryOp) {
            $this->fixupMap[$binaryOp] = ['left' => self::FIXUP_PREC_LEFT, 'right' => self::FIXUP_PREC_RIGHT];
        }
        $assignOps = [\PhpParser\Node\Expr\Assign::class, \PhpParser\Node\Expr\AssignRef::class, \PhpParser\Node\Expr\AssignOp\Plus::class, \PhpParser\Node\Expr\AssignOp\Minus::class, \PhpParser\Node\Expr\AssignOp\Mul::class, \PhpParser\Node\Expr\AssignOp\Div::class, \PhpParser\Node\Expr\AssignOp\Concat::class, \PhpParser\Node\Expr\AssignOp\Mod::class, \PhpParser\Node\Expr\AssignOp\BitwiseAnd::class, \PhpParser\Node\Expr\AssignOp\BitwiseOr::class, \PhpParser\Node\Expr\AssignOp\BitwiseXor::class, \PhpParser\Node\Expr\AssignOp\ShiftLeft::class, \PhpParser\Node\Expr\AssignOp\ShiftRight::class, \PhpParser\Node\Expr\AssignOp\Pow::class, \PhpParser\Node\Expr\AssignOp\Coalesce::class];
        foreach ($assignOps as $assignOp) {
            $this->fixupMap[$assignOp] = ['var' => self::FIXUP_PREC_LEFT, 'expr' => self::FIXUP_PREC_RIGHT];
        }
        $prefixOps = [\PhpParser\Node\Expr\BitwiseNot::class, \PhpParser\Node\Expr\BooleanNot::class, \PhpParser\Node\Expr\UnaryPlus::class, \PhpParser\Node\Expr\UnaryMinus::class, \PhpParser\Node\Expr\Cast\Int_::class, \PhpParser\Node\Expr\Cast\Double::class, \PhpParser\Node\Expr\Cast\String_::class, \PhpParser\Node\Expr\Cast\Array_::class, \PhpParser\Node\Expr\Cast\Object_::class, \PhpParser\Node\Expr\Cast\Bool_::class, \PhpParser\Node\Expr\Cast\Unset_::class, \PhpParser\Node\Expr\ErrorSuppress::class, \PhpParser\Node\Expr\YieldFrom::class, \PhpParser\Node\Expr\Print_::class, \PhpParser\Node\Expr\Include_::class];
        foreach ($prefixOps as $prefixOp) {
            $this->fixupMap[$prefixOp] = ['expr' => self::FIXUP_PREC_RIGHT];
        }
    }
    /**
     * Lazily initializes the removal map.
     *
     * The removal map is used to determine which additional tokens should be returned when a
     * certain node is replaced by null.
     */
    protected function initializeRemovalMap()
    {
        if ($this->removalMap) {
            return;
        }
        $stripBoth = ['left' => \T_WHITESPACE, 'right' => \T_WHITESPACE];
        $stripLeft = ['left' => \T_WHITESPACE];
        $stripRight = ['right' => \T_WHITESPACE];
        $stripDoubleArrow = ['right' => \T_DOUBLE_ARROW];
        $stripColon = ['left' => ':'];
        $stripEquals = ['left' => '='];
        $this->removalMap = ['Expr_ArrayDimFetch->dim' => $stripBoth, 'Expr_ArrayItem->key' => $stripDoubleArrow, 'Expr_ArrowFunction->returnType' => $stripColon, 'Expr_Closure->returnType' => $stripColon, 'Expr_Exit->expr' => $stripBoth, 'Expr_Ternary->if' => $stripBoth, 'Expr_Yield->key' => $stripDoubleArrow, 'Expr_Yield->value' => $stripBoth, 'Param->type' => $stripRight, 'Param->default' => $stripEquals, 'Stmt_Break->num' => $stripBoth, 'Stmt_ClassMethod->returnType' => $stripColon, 'Stmt_Class->extends' => ['left' => \T_EXTENDS], 'Expr_PrintableNewAnonClass->extends' => ['left' => \T_EXTENDS], 'Stmt_Continue->num' => $stripBoth, 'Stmt_Foreach->keyVar' => $stripDoubleArrow, 'Stmt_Function->returnType' => $stripColon, 'Stmt_If->else' => $stripLeft, 'Stmt_Namespace->name' => $stripLeft, 'Stmt_Property->type' => $stripRight, 'Stmt_PropertyProperty->default' => $stripEquals, 'Stmt_Return->expr' => $stripBoth, 'Stmt_StaticVar->default' => $stripEquals, 'Stmt_TraitUseAdaptation_Alias->newName' => $stripLeft, 'Stmt_TryCatch->finally' => $stripLeft];
    }
    protected function initializeInsertionMap()
    {
        if ($this->insertionMap) {
            return;
        }
        // TODO: "yield" where both key and value are inserted doesn't work
        // [$find, $beforeToken, $extraLeft, $extraRight]
        $this->insertionMap = [
            'Expr_ArrayDimFetch->dim' => ['[', \false, null, null],
            'Expr_ArrayItem->key' => [null, \false, null, ' => '],
            'Expr_ArrowFunction->returnType' => [')', \false, ' : ', null],
            'Expr_Closure->returnType' => [')', \false, ' : ', null],
            'Expr_Ternary->if' => ['?', \false, ' ', ' '],
            'Expr_Yield->key' => [\T_YIELD, \false, null, ' => '],
            'Expr_Yield->value' => [\T_YIELD, \false, ' ', null],
            'Param->type' => [null, \false, null, ' '],
            'Param->default' => [null, \false, ' = ', null],
            'Stmt_Break->num' => [\T_BREAK, \false, ' ', null],
            'Stmt_ClassMethod->returnType' => [')', \false, ' : ', null],
            'Stmt_Class->extends' => [null, \false, ' extends ', null],
            'Expr_PrintableNewAnonClass->extends' => [null, ' extends ', null],
            'Stmt_Continue->num' => [\T_CONTINUE, \false, ' ', null],
            'Stmt_Foreach->keyVar' => [\T_AS, \false, null, ' => '],
            'Stmt_Function->returnType' => [')', \false, ' : ', null],
            'Stmt_If->else' => [null, \false, ' ', null],
            'Stmt_Namespace->name' => [\T_NAMESPACE, \false, ' ', null],
            'Stmt_Property->type' => [\T_VARIABLE, \true, null, ' '],
            'Stmt_PropertyProperty->default' => [null, \false, ' = ', null],
            'Stmt_Return->expr' => [\T_RETURN, \false, ' ', null],
            'Stmt_StaticVar->default' => [null, \false, ' = ', null],
            //'Stmt_TraitUseAdaptation_Alias->newName' => [T_AS, false, ' ', null], // TODO
            'Stmt_TryCatch->finally' => [null, \false, ' ', null],
        ];
    }
    protected function initializeListInsertionMap()
    {
        if ($this->listInsertionMap) {
            return;
        }
        $this->listInsertionMap = [
            // special
            //'Expr_ShellExec->parts' => '', // TODO These need to be treated more carefully
            //'Scalar_Encapsed->parts' => '',
            'Stmt_Catch->types' => '|',
            'Stmt_If->elseifs' => ' ',
            'Stmt_TryCatch->catches' => ' ',
            // comma-separated lists
            'Expr_Array->items' => ', ',
            'Expr_ArrowFunction->params' => ', ',
            'Expr_Closure->params' => ', ',
            'Expr_Closure->uses' => ', ',
            'Expr_FuncCall->args' => ', ',
            'Expr_Isset->vars' => ', ',
            'Expr_List->items' => ', ',
            'Expr_MethodCall->args' => ', ',
            'Expr_New->args' => ', ',
            'Expr_PrintableNewAnonClass->args' => ', ',
            'Expr_StaticCall->args' => ', ',
            'Stmt_ClassConst->consts' => ', ',
            'Stmt_ClassMethod->params' => ', ',
            'Stmt_Class->implements' => ', ',
            'Expr_PrintableNewAnonClass->implements' => ', ',
            'Stmt_Const->consts' => ', ',
            'Stmt_Declare->declares' => ', ',
            'Stmt_Echo->exprs' => ', ',
            'Stmt_For->init' => ', ',
            'Stmt_For->cond' => ', ',
            'Stmt_For->loop' => ', ',
            'Stmt_Function->params' => ', ',
            'Stmt_Global->vars' => ', ',
            'Stmt_GroupUse->uses' => ', ',
            'Stmt_Interface->extends' => ', ',
            'Stmt_Property->props' => ', ',
            'Stmt_StaticVar->vars' => ', ',
            'Stmt_TraitUse->traits' => ', ',
            'Stmt_TraitUseAdaptation_Precedence->insteadof' => ', ',
            'Stmt_Unset->vars' => ', ',
            'Stmt_Use->uses' => ', ',
            // statement lists
            'Expr_Closure->stmts' => "\n",
            'Stmt_Case->stmts' => "\n",
            'Stmt_Catch->stmts' => "\n",
            'Stmt_Class->stmts' => "\n",
            'Expr_PrintableNewAnonClass->stmts' => "\n",
            'Stmt_Interface->stmts' => "\n",
            'Stmt_Trait->stmts' => "\n",
            'Stmt_ClassMethod->stmts' => "\n",
            'Stmt_Declare->stmts' => "\n",
            'Stmt_Do->stmts' => "\n",
            'Stmt_ElseIf->stmts' => "\n",
            'Stmt_Else->stmts' => "\n",
            'Stmt_Finally->stmts' => "\n",
            'Stmt_Foreach->stmts' => "\n",
            'Stmt_For->stmts' => "\n",
            'Stmt_Function->stmts' => "\n",
            'Stmt_If->stmts' => "\n",
            'Stmt_Namespace->stmts' => "\n",
            'Stmt_Switch->cases' => "\n",
            'Stmt_TraitUse->adaptations' => "\n",
            'Stmt_TryCatch->stmts' => "\n",
            'Stmt_While->stmts' => "\n",
            // dummy for top-level context
            'File->stmts' => "\n",
        ];
    }
    protected function initializeEmptyListInsertionMap()
    {
        if ($this->emptyListInsertionMap) {
            return;
        }
        // TODO Insertion into empty statement lists.
        // [$find, $extraLeft, $extraRight]
        $this->emptyListInsertionMap = ['Expr_ArrowFunction->params' => ['(', '', ''], 'Expr_Closure->uses' => [')', ' use(', ')'], 'Expr_Closure->params' => ['(', '', ''], 'Expr_FuncCall->args' => ['(', '', ''], 'Expr_MethodCall->args' => ['(', '', ''], 'Expr_New->args' => ['(', '', ''], 'Expr_PrintableNewAnonClass->args' => ['(', '', ''], 'Expr_PrintableNewAnonClass->implements' => [null, ' implements ', ''], 'Expr_StaticCall->args' => ['(', '', ''], 'Stmt_Class->implements' => [null, ' implements ', ''], 'Stmt_ClassMethod->params' => ['(', '', ''], 'Stmt_Interface->extends' => [null, ' extends ', ''], 'Stmt_Function->params' => ['(', '', '']];
    }
    protected function initializeModifierChangeMap()
    {
        if ($this->modifierChangeMap) {
            return;
        }
        $this->modifierChangeMap = ['Stmt_ClassConst->flags' => \T_CONST, 'Stmt_ClassMethod->flags' => \T_FUNCTION, 'Stmt_Class->flags' => \T_CLASS, 'Stmt_Property->flags' => \T_VARIABLE];
        // List of integer subnodes that are not modifiers:
        // Expr_Include->type
        // Stmt_GroupUse->type
        // Stmt_Use->type
        // Stmt_UseUse->type
    }
}
<?php

declare (strict_types=1);
namespace PhpParser;

interface NodeTraverserInterface
{
    /**
     * Adds a visitor.
     *
     * @param NodeVisitor $visitor Visitor to add
     */
    public function addVisitor(\PhpParser\NodeVisitor $visitor);
    /**
     * Removes an added visitor.
     *
     * @param NodeVisitor $visitor
     */
    public function removeVisitor(\PhpParser\NodeVisitor $visitor);
    /**
     * Traverses an array of nodes using the registered visitors.
     *
     * @param Node[] $nodes Array of nodes
     *
     * @return Node[] Traversed array of nodes
     */
    public function traverse(array $nodes) : array;
}
<?php

declare (strict_types=1);
namespace PhpParser;

use PhpParser\Node\Arg;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\BinaryOp\Concat;
use PhpParser\Node\Identifier;
use PhpParser\Node\Name;
use PhpParser\Node\Scalar\String_;
use PhpParser\Node\Stmt\Use_;
class BuilderFactory
{
    /**
     * Creates a namespace builder.
     *
     * @param null|string|Node\Name $name Name of the namespace
     *
     * @return Builder\Namespace_ The created namespace builder
     */
    public function namespace($name) : \PhpParser\Builder\Namespace_
    {
        return new \PhpParser\Builder\Namespace_($name);
    }
    /**
     * Creates a class builder.
     *
     * @param string $name Name of the class
     *
     * @return Builder\Class_ The created class builder
     */
    public function class(string $name) : \PhpParser\Builder\Class_
    {
        return new \PhpParser\Builder\Class_($name);
    }
    /**
     * Creates an interface builder.
     *
     * @param string $name Name of the interface
     *
     * @return Builder\Interface_ The created interface builder
     */
    public function interface(string $name) : \PhpParser\Builder\Interface_
    {
        return new \PhpParser\Builder\Interface_($name);
    }
    /**
     * Creates a trait builder.
     *
     * @param string $name Name of the trait
     *
     * @return Builder\Trait_ The created trait builder
     */
    public function trait(string $name) : \PhpParser\Builder\Trait_
    {
        return new \PhpParser\Builder\Trait_($name);
    }
    /**
     * Creates a trait use builder.
     *
     * @param Node\Name|string ...$traits Trait names
     *
     * @return Builder\TraitUse The create trait use builder
     */
    public function useTrait(...$traits) : \PhpParser\Builder\TraitUse
    {
        return new \PhpParser\Builder\TraitUse(...$traits);
    }
    /**
     * Creates a trait use adaptation builder.
     *
     * @param Node\Name|string|null  $trait  Trait name
     * @param Node\Identifier|string $method Method name
     *
     * @return Builder\TraitUseAdaptation The create trait use adaptation builder
     */
    public function traitUseAdaptation($trait, $method = null) : \PhpParser\Builder\TraitUseAdaptation
    {
        if ($method === null) {
            $method = $trait;
            $trait = null;
        }
        return new \PhpParser\Builder\TraitUseAdaptation($trait, $method);
    }
    /**
     * Creates a method builder.
     *
     * @param string $name Name of the method
     *
     * @return Builder\Method The created method builder
     */
    public function method(string $name) : \PhpParser\Builder\Method
    {
        return new \PhpParser\Builder\Method($name);
    }
    /**
     * Creates a parameter builder.
     *
     * @param string $name Name of the parameter
     *
     * @return Builder\Param The created parameter builder
     */
    public function param(string $name) : \PhpParser\Builder\Param
    {
        return new \PhpParser\Builder\Param($name);
    }
    /**
     * Creates a property builder.
     *
     * @param string $name Name of the property
     *
     * @return Builder\Property The created property builder
     */
    public function property(string $name) : \PhpParser\Builder\Property
    {
        return new \PhpParser\Builder\Property($name);
    }
    /**
     * Creates a function builder.
     *
     * @param string $name Name of the function
     *
     * @return Builder\Function_ The created function builder
     */
    public function function(string $name) : \PhpParser\Builder\Function_
    {
        return new \PhpParser\Builder\Function_($name);
    }
    /**
     * Creates a namespace/class use builder.
     *
     * @param Node\Name|string $name Name of the entity (namespace or class) to alias
     *
     * @return Builder\Use_ The created use builder
     */
    public function use($name) : \PhpParser\Builder\Use_
    {
        return new \PhpParser\Builder\Use_($name, \PhpParser\Node\Stmt\Use_::TYPE_NORMAL);
    }
    /**
     * Creates a function use builder.
     *
     * @param Node\Name|string $name Name of the function to alias
     *
     * @return Builder\Use_ The created use function builder
     */
    public function useFunction($name) : \PhpParser\Builder\Use_
    {
        return new \PhpParser\Builder\Use_($name, \PhpParser\Node\Stmt\Use_::TYPE_FUNCTION);
    }
    /**
     * Creates a constant use builder.
     *
     * @param Node\Name|string $name Name of the const to alias
     *
     * @return Builder\Use_ The created use const builder
     */
    public function useConst($name) : \PhpParser\Builder\Use_
    {
        return new \PhpParser\Builder\Use_($name, \PhpParser\Node\Stmt\Use_::TYPE_CONSTANT);
    }
    /**
     * Creates node a for a literal value.
     *
     * @param Expr|bool|null|int|float|string|array $value $value
     *
     * @return Expr
     */
    public function val($value) : \PhpParser\Node\Expr
    {
        return \PhpParser\BuilderHelpers::normalizeValue($value);
    }
    /**
     * Creates variable node.
     *
     * @param string|Expr $name Name
     *
     * @return Expr\Variable
     */
    public function var($name) : \PhpParser\Node\Expr\Variable
    {
        if (!\is_string($name) && !$name instanceof \PhpParser\Node\Expr) {
            throw new \LogicException('Variable name must be string or Expr');
        }
        return new \PhpParser\Node\Expr\Variable($name);
    }
    /**
     * Normalizes an argument list.
     *
     * Creates Arg nodes for all arguments and converts literal values to expressions.
     *
     * @param array $args List of arguments to normalize
     *
     * @return Arg[]
     */
    public function args(array $args) : array
    {
        $normalizedArgs = [];
        foreach ($args as $arg) {
            if ($arg instanceof \PhpParser\Node\Arg) {
                $normalizedArgs[] = $arg;
            } else {
                $normalizedArgs[] = new \PhpParser\Node\Arg(\PhpParser\BuilderHelpers::normalizeValue($arg));
            }
        }
        return $normalizedArgs;
    }
    /**
     * Creates a function call node.
     *
     * @param string|Name|Expr $name Function name
     * @param array            $args Function arguments
     *
     * @return Expr\FuncCall
     */
    public function funcCall($name, array $args = []) : \PhpParser\Node\Expr\FuncCall
    {
        return new \PhpParser\Node\Expr\FuncCall(\PhpParser\BuilderHelpers::normalizeNameOrExpr($name), $this->args($args));
    }
    /**
     * Creates a method call node.
     *
     * @param Expr                   $var  Variable the method is called on
     * @param string|Identifier|Expr $name Method name
     * @param array                  $args Method arguments
     *
     * @return Expr\MethodCall
     */
    public function methodCall(\PhpParser\Node\Expr $var, $name, array $args = []) : \PhpParser\Node\Expr\MethodCall
    {
        return new \PhpParser\Node\Expr\MethodCall($var, \PhpParser\BuilderHelpers::normalizeIdentifierOrExpr($name), $this->args($args));
    }
    /**
     * Creates a static method call node.
     *
     * @param string|Name|Expr       $class Class name
     * @param string|Identifier|Expr $name  Method name
     * @param array                  $args  Method arguments
     *
     * @return Expr\StaticCall
     */
    public function staticCall($class, $name, array $args = []) : \PhpParser\Node\Expr\StaticCall
    {
        return new \PhpParser\Node\Expr\StaticCall(\PhpParser\BuilderHelpers::normalizeNameOrExpr($class), \PhpParser\BuilderHelpers::normalizeIdentifierOrExpr($name), $this->args($args));
    }
    /**
     * Creates an object creation node.
     *
     * @param string|Name|Expr $class Class name
     * @param array            $args  Constructor arguments
     *
     * @return Expr\New_
     */
    public function new($class, array $args = []) : \PhpParser\Node\Expr\New_
    {
        return new \PhpParser\Node\Expr\New_(\PhpParser\BuilderHelpers::normalizeNameOrExpr($class), $this->args($args));
    }
    /**
     * Creates a constant fetch node.
     *
     * @param string|Name $name Constant name
     *
     * @return Expr\ConstFetch
     */
    public function constFetch($name) : \PhpParser\Node\Expr\ConstFetch
    {
        return new \PhpParser\Node\Expr\ConstFetch(\PhpParser\BuilderHelpers::normalizeName($name));
    }
    /**
     * Creates a property fetch node.
     *
     * @param Expr                   $var  Variable holding object
     * @param string|Identifier|Expr $name Property name
     *
     * @return Expr\PropertyFetch
     */
    public function propertyFetch(\PhpParser\Node\Expr $var, $name) : \PhpParser\Node\Expr\PropertyFetch
    {
        return new \PhpParser\Node\Expr\PropertyFetch($var, \PhpParser\BuilderHelpers::normalizeIdentifierOrExpr($name));
    }
    /**
     * Creates a class constant fetch node.
     *
     * @param string|Name|Expr  $class Class name
     * @param string|Identifier $name  Constant name
     *
     * @return Expr\ClassConstFetch
     */
    public function classConstFetch($class, $name) : \PhpParser\Node\Expr\ClassConstFetch
    {
        return new \PhpParser\Node\Expr\ClassConstFetch(\PhpParser\BuilderHelpers::normalizeNameOrExpr($class), \PhpParser\BuilderHelpers::normalizeIdentifier($name));
    }
    /**
     * Creates nested Concat nodes from a list of expressions.
     *
     * @param Expr|string ...$exprs Expressions or literal strings
     *
     * @return Concat
     */
    public function concat(...$exprs) : \PhpParser\Node\Expr\BinaryOp\Concat
    {
        $numExprs = \count($exprs);
        if ($numExprs < 2) {
            throw new \LogicException('Expected at least two expressions');
        }
        $lastConcat = $this->normalizeStringExpr($exprs[0]);
        for ($i = 1; $i < $numExprs; $i++) {
            $lastConcat = new \PhpParser\Node\Expr\BinaryOp\Concat($lastConcat, $this->normalizeStringExpr($exprs[$i]));
        }
        return $lastConcat;
    }
    /**
     * @param string|Expr $expr
     * @return Expr
     */
    private function normalizeStringExpr($expr) : \PhpParser\Node\Expr
    {
        if ($expr instanceof \PhpParser\Node\Expr) {
            return $expr;
        }
        if (\is_string($expr)) {
            return new \PhpParser\Node\Scalar\String_($expr);
        }
        throw new \LogicException('Expected string or Expr');
    }
}
{
    "name": "nikic\/php-parser",
    "type": "library",
    "description": "A PHP parser written in PHP",
    "keywords": [
        "php",
        "parser"
    ],
    "license": "BSD-3-Clause",
    "authors": [
        {
            "name": "Nikita Popov"
        }
    ],
    "require": {
        "php": ">=7.0",
        "ext-tokenizer": "*"
    },
    "require-dev": {
        "phpunit\/phpunit": "^6.5 || ^7.0"
    },
    "extra": {
        "branch-alias": {
            "dev-master": "4.2-dev"
        }
    },
    "autoload": {
        "psr-4": {
            "PhpParser\\": "lib\/PhpParser"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "PhpParser\\": "test\/PhpParser\/"
        }
    },
    "bin": [
        "bin\/php-parse"
    ]
}<?php

// autoload_namespaces.php @generated by Composer

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

return array(
);
MIT License

Copyright (c) 2017 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.
{
    "name": "composer\/xdebug-handler",
    "description": "Restarts a process without xdebug.",
    "type": "library",
    "license": "MIT",
    "keywords": [
        "xdebug",
        "performance"
    ],
    "authors": [
        {
            "name": "John Stevenson",
            "email": "john-stevenson@blueyonder.co.uk"
        }
    ],
    "support": {
        "irc": "irc:\/\/irc.freenode.org\/composer",
        "issues": "https:\/\/github.com\/composer\/xdebug-handler\/issues"
    },
    "require": {
        "php": "^5.3.2 || ^7.0",
        "psr\/log": "^1.0"
    },
    "require-dev": {
        "phpunit\/phpunit": "^4.8.35 || ^5.7 || ^6.5"
    },
    "autoload": {
        "psr-4": {
            "_HumbugBoxb94336daae36\\Composer\\XdebugHandler\\": "src"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "_HumbugBoxb94336daae36\\Composer\\XdebugHandler\\": "tests"
        }
    },
    "scripts": {
        "test": "phpunit"
    }
}<?php

/*
 * This file is part of composer/xdebug-handler.
 *
 * (c) Composer <https://github.com/composer>
 *
 * For the full copyright and license information, please view
 * the LICENSE file that was distributed with this source code.
 */
namespace _HumbugBoxb94336daae36\Composer\XdebugHandler;

/**
 * @author John Stevenson <john-stevenson@blueyonder.co.uk>
 */
class PhpConfig
{
    /**
     * Use the original PHP configuration
     *
     * @return array PHP cli options
     */
    public function useOriginal()
    {
        $this->getDataAndReset();
        return array();
    }
    /**
     * Use standard restart settings
     *
     * @return array PHP cli options
     */
    public function useStandard()
    {
        if ($data = $this->getDataAndReset()) {
            return array('-n', '-c', $data['tmpIni']);
        }
        return array();
    }
    /**
     * Use environment variables to persist settings
     *
     * @return array PHP cli options
     */
    public function usePersistent()
    {
        if ($data = $this->getDataAndReset()) {
            \_HumbugBoxb94336daae36\Composer\XdebugHandler\Process::setEnv('PHPRC', $data['tmpIni']);
            \_HumbugBoxb94336daae36\Composer\XdebugHandler\Process::setEnv('PHP_INI_SCAN_DIR', '');
        }
        return array();
    }
    /**
     * Returns restart data if available and resets the environment
     *
     * @return array|null
     */
    private function getDataAndReset()
    {
        if ($data = \_HumbugBoxb94336daae36\Composer\XdebugHandler\XdebugHandler::getRestartSettings()) {
            \_HumbugBoxb94336daae36\Composer\XdebugHandler\Process::setEnv('PHPRC', $data['phprc']);
            \_HumbugBoxb94336daae36\Composer\XdebugHandler\Process::setEnv('PHP_INI_SCAN_DIR', $data['scanDir']);
        }
        return $data;
    }
}
<?php

/*
 * This file is part of composer/xdebug-handler.
 *
 * (c) Composer <https://github.com/composer>
 *
 * For the full copyright and license information, please view
 * the LICENSE file that was distributed with this source code.
 */
namespace _HumbugBoxb94336daae36\Composer\XdebugHandler;

use _HumbugBoxb94336daae36\Psr\Log\LoggerInterface;
use _HumbugBoxb94336daae36\Psr\Log\LogLevel;
/**
 * @author John Stevenson <john-stevenson@blueyonder.co.uk>
 * @internal
 */
class Status
{
    const ENV_RESTART = 'XDEBUG_HANDLER_RESTART';
    const CHECK = 'Check';
    const ERROR = 'Error';
    const INFO = 'Info';
    const NORESTART = 'NoRestart';
    const RESTART = 'Restart';
    const RESTARTING = 'Restarting';
    const RESTARTED = 'Restarted';
    private $debug;
    private $envAllowXdebug;
    private $loaded;
    private $logger;
    private $time;
    /**
     * Constructor
     *
     * @param string $envAllowXdebug Prefixed _ALLOW_XDEBUG name
     * @param bool $debug Whether debug output is required
     */
    public function __construct($envAllowXdebug, $debug)
    {
        $start = \getenv(self::ENV_RESTART);
        \_HumbugBoxb94336daae36\Composer\XdebugHandler\Process::setEnv(self::ENV_RESTART);
        $this->time = $start ? \round((\microtime(\true) - $start) * 1000) : 0;
        $this->envAllowXdebug = $envAllowXdebug;
        $this->debug = $debug && \defined('STDERR');
    }
    /**
     * @param LoggerInterface $logger
     */
    public function setLogger(\_HumbugBoxb94336daae36\Psr\Log\LoggerInterface $logger)
    {
        $this->logger = $logger;
    }
    /**
     * Calls a handler method to report a message
     *
     * @param string $op The handler constant
     * @param null|string $data Data required by the handler
     */
    public function report($op, $data)
    {
        if ($this->logger || $this->debug) {
            \call_user_func(array($this, 'report' . $op), $data);
        }
    }
    /**
     * Outputs a status message
     *
     * @param string $text
     * @param string $level
     */
    private function output($text, $level = null)
    {
        if ($this->logger) {
            $this->logger->log($level ?: \_HumbugBoxb94336daae36\Psr\Log\LogLevel::DEBUG, $text);
        }
        if ($this->debug) {
            \fwrite(\STDERR, \sprintf('xdebug-handler[%d] %s', \getmypid(), $text . \PHP_EOL));
        }
    }
    private function reportCheck($loaded)
    {
        $this->loaded = $loaded;
        $this->output('Checking ' . $this->envAllowXdebug);
    }
    private function reportError($error)
    {
        $this->output(\sprintf('No restart (%s)', $error), \_HumbugBoxb94336daae36\Psr\Log\LogLevel::WARNING);
    }
    private function reportInfo($info)
    {
        $this->output($info);
    }
    private function reportNoRestart()
    {
        $this->output($this->getLoadedMessage());
        if ($this->loaded) {
            $text = \sprintf('No restart (%s)', $this->getEnvAllow());
            if (!\getenv($this->envAllowXdebug)) {
                $text .= ' Allowed by application';
            }
            $this->output($text);
        }
    }
    private function reportRestart()
    {
        $this->output($this->getLoadedMessage());
        \_HumbugBoxb94336daae36\Composer\XdebugHandler\Process::setEnv(self::ENV_RESTART, (string) \microtime(\true));
    }
    private function reportRestarted()
    {
        $loaded = $this->getLoadedMessage();
        $text = \sprintf('Restarted (%d ms). %s', $this->time, $loaded);
        $level = $this->loaded ? \_HumbugBoxb94336daae36\Psr\Log\LogLevel::WARNING : null;
        $this->output($text, $level);
    }
    private function reportRestarting($command)
    {
        $text = \sprintf('Process restarting (%s)', $this->getEnvAllow());
        $this->output($text);
        $text = 'Running ' . $command;
        $this->output($text);
    }
    /**
     * Returns the _ALLOW_XDEBUG environment variable as name=value
     *
     * @return string
     */
    private function getEnvAllow()
    {
        return $this->envAllowXdebug . '=' . \getenv($this->envAllowXdebug);
    }
    /**
     * Returns the xdebug status and version
     *
     * @return string
     */
    private function getLoadedMessage()
    {
        $loaded = $this->loaded ? \sprintf('loaded (%s)', $this->loaded) : 'not loaded';
        return 'The xdebug extension is ' . $loaded;
    }
}
<?php

/*
 * This file is part of composer/xdebug-handler.
 *
 * (c) Composer <https://github.com/composer>
 *
 * For the full copyright and license information, please view
 * the LICENSE file that was distributed with this source code.
 */
namespace _HumbugBoxb94336daae36\Composer\XdebugHandler;

use _HumbugBoxb94336daae36\Psr\Log\LoggerInterface;
/**
 * @author John Stevenson <john-stevenson@blueyonder.co.uk>
 */
class XdebugHandler
{
    const SUFFIX_ALLOW = '_ALLOW_XDEBUG';
    const SUFFIX_INIS = '_ORIGINAL_INIS';
    const RESTART_ID = 'internal';
    const RESTART_SETTINGS = 'XDEBUG_HANDLER_SETTINGS';
    const DEBUG = 'XDEBUG_HANDLER_DEBUG';
    /** @var string|null */
    protected $tmpIni;
    private static $inRestart;
    private static $name;
    private static $skipped;
    private $cli;
    private $colorOption;
    private $debug;
    private $envAllowXdebug;
    private $envOriginalInis;
    private $loaded;
    private $persistent;
    private $script;
    /** @var Status|null */
    private $statusWriter;
    /**
     * Constructor
     *
     * The $envPrefix is used to create distinct environment variables. It is
     * uppercased and prepended to the default base values. For example 'myapp'
     * would result in MYAPP_ALLOW_XDEBUG and MYAPP_ORIGINAL_INIS.
     *
     * @param string $envPrefix Value used in environment variables
     * @param string $colorOption Command-line long option to force color output
     * @throws \RuntimeException If a parameter is invalid
     */
    public function __construct($envPrefix, $colorOption = '')
    {
        if (!\is_string($envPrefix) || empty($envPrefix) || !\is_string($colorOption)) {
            throw new \RuntimeException('Invalid constructor parameter');
        }
        self::$name = \strtoupper($envPrefix);
        $this->envAllowXdebug = self::$name . self::SUFFIX_ALLOW;
        $this->envOriginalInis = self::$name . self::SUFFIX_INIS;
        $this->colorOption = $colorOption;
        if (\extension_loaded('xdebug')) {
            $ext = new \ReflectionExtension('xdebug');
            $this->loaded = $ext->getVersion() ?: 'unknown';
        }
        if ($this->cli = \PHP_SAPI === 'cli') {
            $this->debug = \getenv(self::DEBUG);
        }
        $this->statusWriter = new \_HumbugBoxb94336daae36\Composer\XdebugHandler\Status($this->envAllowXdebug, (bool) $this->debug);
    }
    /**
     * Activates status message output to a PSR3 logger
     *
     * @param LoggerInterface $logger
     *
     * @return $this
     */
    public function setLogger(\_HumbugBoxb94336daae36\Psr\Log\LoggerInterface $logger)
    {
        $this->statusWriter->setLogger($logger);
        return $this;
    }
    /**
     * Sets the main script location if it cannot be called from argv
     *
     * @param string $script
     *
     * @return $this
     */
    public function setMainScript($script)
    {
        $this->script = $script;
        return $this;
    }
    /**
     * Persist the settings to keep xdebug out of sub-processes
     *
     * @return $this
     */
    public function setPersistent()
    {
        $this->persistent = \true;
        return $this;
    }
    /**
     * Checks if xdebug is loaded and the process needs to be restarted
     *
     * This behaviour can be disabled by setting the MYAPP_ALLOW_XDEBUG
     * environment variable to 1. This variable is used internally so that
     * the restarted process is created only once.
     */
    public function check()
    {
        $this->notify(\_HumbugBoxb94336daae36\Composer\XdebugHandler\Status::CHECK, $this->loaded);
        $envArgs = \explode('|', (string) \getenv($this->envAllowXdebug));
        if (empty($envArgs[0]) && $this->requiresRestart((bool) $this->loaded)) {
            // Restart required
            $this->notify(\_HumbugBoxb94336daae36\Composer\XdebugHandler\Status::RESTART);
            if ($this->prepareRestart()) {
                $command = $this->getCommand();
                $this->notify(\_HumbugBoxb94336daae36\Composer\XdebugHandler\Status::RESTARTING, $command);
                $this->restart($command);
            }
            return;
        }
        if (self::RESTART_ID === $envArgs[0] && \count($envArgs) === 5) {
            // Restarting, so unset environment variable and use saved values
            $this->notify(\_HumbugBoxb94336daae36\Composer\XdebugHandler\Status::RESTARTED);
            \_HumbugBoxb94336daae36\Composer\XdebugHandler\Process::setEnv($this->envAllowXdebug);
            self::$inRestart = \true;
            if (!$this->loaded) {
                // Skipped version is only set if xdebug is not loaded
                self::$skipped = $envArgs[1];
            }
            // Put restart settings in the environment
            $this->setEnvRestartSettings($envArgs);
            return;
        }
        $this->notify(\_HumbugBoxb94336daae36\Composer\XdebugHandler\Status::NORESTART);
        if ($settings = self::getRestartSettings()) {
            // Called with existing settings, so sync our settings
            $this->syncSettings($settings);
        }
    }
    /**
     * Returns an array of php.ini locations with at least one entry
     *
     * The equivalent of calling php_ini_loaded_file then php_ini_scanned_files.
     * The loaded ini location is the first entry and may be empty.
     *
     * @return array
     */
    public static function getAllIniFiles()
    {
        if (!empty(self::$name)) {
            $env = \getenv(self::$name . self::SUFFIX_INIS);
            if (\false !== $env) {
                return \explode(\PATH_SEPARATOR, $env);
            }
        }
        $paths = array((string) \php_ini_loaded_file());
        if ($scanned = \php_ini_scanned_files()) {
            $paths = \array_merge($paths, \array_map('trim', \explode(',', $scanned)));
        }
        return $paths;
    }
    /**
     * Returns an array of restart settings or null
     *
     * Settings will be available if the current process was restarted, or
     * called with the settings from an existing restart.
     *
     * @return array|null
     */
    public static function getRestartSettings()
    {
        $envArgs = \explode('|', (string) \getenv(self::RESTART_SETTINGS));
        if (\count($envArgs) !== 6 || !self::$inRestart && \php_ini_loaded_file() !== $envArgs[0]) {
            return;
        }
        return array('tmpIni' => $envArgs[0], 'scannedInis' => (bool) $envArgs[1], 'scanDir' => '*' === $envArgs[2] ? \false : $envArgs[2], 'phprc' => '*' === $envArgs[3] ? \false : $envArgs[3], 'inis' => \explode(\PATH_SEPARATOR, $envArgs[4]), 'skipped' => $envArgs[5]);
    }
    /**
     * Returns the xdebug version that triggered a successful restart
     *
     * @return string
     */
    public static function getSkippedVersion()
    {
        return (string) self::$skipped;
    }
    /**
     * Returns true if xdebug is loaded, or as directed by an extending class
     *
     * @param bool $isLoaded Whether xdebug is loaded
     *
     * @return bool
     */
    protected function requiresRestart($isLoaded)
    {
        return $isLoaded;
    }
    /**
     * Allows an extending class to access the tmpIni
     *
     * @param string $command
     */
    protected function restart($command)
    {
        $this->doRestart($command);
    }
    /**
     * Executes the restarted command then deletes the tmp ini
     *
     * @param string $command
     */
    private function doRestart($command)
    {
        \passthru($command, $exitCode);
        $this->notify(\_HumbugBoxb94336daae36\Composer\XdebugHandler\Status::INFO, 'Restarted process exited ' . $exitCode);
        if ($this->debug === '2') {
            $this->notify(\_HumbugBoxb94336daae36\Composer\XdebugHandler\Status::INFO, 'Temp ini saved: ' . $this->tmpIni);
        } else {
            @\unlink($this->tmpIni);
        }
        exit($exitCode);
    }
    /**
     * Returns true if everything was written for the restart
     *
     * If any of the following fails (however unlikely) we must return false to
     * stop potential recursion:
     *   - tmp ini file creation
     *   - environment variable creation
     *
     * @return bool
     */
    private function prepareRestart()
    {
        $error = '';
        $iniFiles = self::getAllIniFiles();
        $scannedInis = \count($iniFiles) > 1;
        $tmpDir = \sys_get_temp_dir();
        if (!$this->cli) {
            $error = 'Unsupported SAPI: ' . \PHP_SAPI;
        } elseif (!\defined('PHP_BINARY')) {
            $error = 'PHP version is too old: ' . \PHP_VERSION;
        } elseif (!$this->checkConfiguration($info)) {
            $error = $info;
        } elseif (!$this->checkScanDirConfig()) {
            $error = 'PHP version does not report scanned inis: ' . \PHP_VERSION;
        } elseif (!$this->checkMainScript()) {
            $error = 'Unable to access main script: ' . $this->script;
        } elseif (!$this->writeTmpIni($iniFiles, $tmpDir, $error)) {
            $error = $error ?: 'Unable to create temp ini file at: ' . $tmpDir;
        } elseif (!$this->setEnvironment($scannedInis, $iniFiles)) {
            $error = 'Unable to set environment variables';
        }
        if ($error) {
            $this->notify(\_HumbugBoxb94336daae36\Composer\XdebugHandler\Status::ERROR, $error);
        }
        return empty($error);
    }
    /**
     * Returns true if the tmp ini file was written
     *
     * @param array $iniFiles All ini files used in the current process
     * @param string $tmpDir The system temporary directory
     * @param string $error Set by method if ini file cannot be read
     *
     * @return bool
     */
    private function writeTmpIni(array $iniFiles, $tmpDir, &$error)
    {
        if (!($this->tmpIni = @\tempnam($tmpDir, ''))) {
            return \false;
        }
        // $iniFiles has at least one item and it may be empty
        if (empty($iniFiles[0])) {
            \array_shift($iniFiles);
        }
        $content = '';
        $regex = '/^\\s*(zend_extension\\s*=.*xdebug.*)$/mi';
        foreach ($iniFiles as $file) {
            // Check for inaccessible ini files
            if (!($data = @\file_get_contents($file))) {
                $error = 'Unable to read ini: ' . $file;
                return \false;
            }
            $content .= \preg_replace($regex, ';$1', $data) . \PHP_EOL;
        }
        // Merge loaded settings into our ini content, if it is valid
        if ($config = \parse_ini_string($content)) {
            $loaded = \ini_get_all(null, \false);
            $content .= $this->mergeLoadedConfig($loaded, $config);
        }
        // Work-around for https://bugs.php.net/bug.php?id=75932
        $content .= 'opcache.enable_cli=0' . \PHP_EOL;
        return @\file_put_contents($this->tmpIni, $content);
    }
    /**
     * Returns the restart command line
     *
     * @return string
     */
    private function getCommand()
    {
        $php = array(\PHP_BINARY);
        $args = \array_slice($_SERVER['argv'], 1);
        if (!$this->persistent) {
            // Use command-line options
            \array_push($php, '-n', '-c', $this->tmpIni);
        }
        if (\defined('STDOUT') && \_HumbugBoxb94336daae36\Composer\XdebugHandler\Process::supportsColor(\STDOUT)) {
            $args = \_HumbugBoxb94336daae36\Composer\XdebugHandler\Process::addColorOption($args, $this->colorOption);
        }
        $args = \array_merge($php, array($this->script), $args);
        $cmd = \_HumbugBoxb94336daae36\Composer\XdebugHandler\Process::escape(\array_shift($args), \true, \true);
        foreach ($args as $arg) {
            $cmd .= ' ' . \_HumbugBoxb94336daae36\Composer\XdebugHandler\Process::escape($arg);
        }
        return $cmd;
    }
    /**
     * Returns true if the restart environment variables were set
     *
     * No need to update $_SERVER since this is set in the restarted process.
     *
     * @param bool $scannedInis Whether there were scanned ini files
     * @param array $iniFiles All ini files used in the current process
     *
     * @return bool
     */
    private function setEnvironment($scannedInis, array $iniFiles)
    {
        $scanDir = \getenv('PHP_INI_SCAN_DIR');
        $phprc = \getenv('PHPRC');
        // Make original inis available to restarted process
        if (!\putenv($this->envOriginalInis . '=' . \implode(\PATH_SEPARATOR, $iniFiles))) {
            return \false;
        }
        if ($this->persistent) {
            // Use the environment to persist the settings
            if (!\putenv('PHP_INI_SCAN_DIR=') || !\putenv('PHPRC=' . $this->tmpIni)) {
                return \false;
            }
        }
        // Flag restarted process and save values for it to use
        $envArgs = array(self::RESTART_ID, $this->loaded, (int) $scannedInis, \false === $scanDir ? '*' : $scanDir, \false === $phprc ? '*' : $phprc);
        return \putenv($this->envAllowXdebug . '=' . \implode('|', $envArgs));
    }
    /**
     * Logs status messages
     *
     * @param string $op Status handler constant
     * @param null|string $data Optional data
     */
    private function notify($op, $data = null)
    {
        $this->statusWriter->report($op, $data);
    }
    /**
     * Returns default, changed and command-line ini settings
     *
     * @param array $loadedConfig All current ini settings
     * @param array $iniConfig Settings from user ini files
     *
     * @return string
     */
    private function mergeLoadedConfig(array $loadedConfig, array $iniConfig)
    {
        $content = '';
        foreach ($loadedConfig as $name => $value) {
            // Value will either be null, string or array (HHVM only)
            if (!\is_string($value) || \strpos($name, 'xdebug') === 0 || $name === 'apc.mmap_file_mask') {
                continue;
            }
            if (!isset($iniConfig[$name]) || $iniConfig[$name] !== $value) {
                // Double-quote escape each value
                $content .= $name . '="' . \addcslashes($value, '\\"') . '"' . \PHP_EOL;
            }
        }
        return $content;
    }
    /**
     * Returns true if the script name can be used
     *
     * @return bool
     */
    private function checkMainScript()
    {
        if (null !== $this->script) {
            // Allow an application to set -- for standard input
            return \file_exists($this->script) || '--' === $this->script;
        }
        if (\file_exists($this->script = $_SERVER['argv'][0])) {
            return \true;
        }
        // Use a backtrace to resolve Phar and chdir issues
        $options = \PHP_VERSION_ID >= 50306 ? \DEBUG_BACKTRACE_IGNORE_ARGS : \false;
        $trace = \debug_backtrace($options);
        if (($main = \end($trace)) && isset($main['file'])) {
            return \file_exists($this->script = $main['file']);
        }
        return \false;
    }
    /**
     * Adds restart settings to the environment
     *
     * @param string $envArgs
     */
    private function setEnvRestartSettings($envArgs)
    {
        $settings = array(\php_ini_loaded_file(), $envArgs[2], $envArgs[3], $envArgs[4], \getenv($this->envOriginalInis), self::$skipped);
        \_HumbugBoxb94336daae36\Composer\XdebugHandler\Process::setEnv(self::RESTART_SETTINGS, \implode('|', $settings));
    }
    /**
     * Syncs settings and the environment if called with existing settings
     *
     * @param array $settings
     */
    private function syncSettings(array $settings)
    {
        if (\false === \getenv($this->envOriginalInis)) {
            // Called by another app, so make original inis available
            \_HumbugBoxb94336daae36\Composer\XdebugHandler\Process::setEnv($this->envOriginalInis, \implode(\PATH_SEPARATOR, $settings['inis']));
        }
        self::$skipped = $settings['skipped'];
        $this->notify(\_HumbugBoxb94336daae36\Composer\XdebugHandler\Status::INFO, 'Process called with existing restart settings');
    }
    /**
     * Returns true if there are scanned inis and PHP is able to report them
     *
     * php_ini_scanned_files will fail when PHP_CONFIG_FILE_SCAN_DIR is empty.
     * Fixed in 7.1.13 and 7.2.1
     *
     * @return bool
     */
    private function checkScanDirConfig()
    {
        return !(\getenv('PHP_INI_SCAN_DIR') && !\PHP_CONFIG_FILE_SCAN_DIR && (\PHP_VERSION_ID < 70113 || \PHP_VERSION_ID === 70200));
    }
    /**
     * Returns true if there are no known configuration issues
     *
     * @param string $info Set by method
     */
    private function checkConfiguration(&$info)
    {
        if (\false !== \strpos(\ini_get('disable_functions'), 'passthru')) {
            $info = 'passthru function is disabled';
            return \false;
        }
        if (\extension_loaded('uopz')) {
            // uopz works at opcode level and disables exit calls
            if (\function_exists('_HumbugBoxb94336daae36\\uopz_allow_exit')) {
                @uopz_allow_exit(\true);
            } else {
                $info = 'uopz extension is not compatible';
                return \false;
            }
        }
        return \true;
    }
}
<?php

/*
 * This file is part of composer/xdebug-handler.
 *
 * (c) Composer <https://github.com/composer>
 *
 * For the full copyright and license information, please view
 * the LICENSE file that was distributed with this source code.
 */
namespace _HumbugBoxb94336daae36\Composer\XdebugHandler;

/**
 * Provides utility functions to prepare a child process command-line and set
 * environment variables in that process.
 *
 * @author John Stevenson <john-stevenson@blueyonder.co.uk>
 * @internal
 */
class Process
{
    /**
     * Returns an array of parameters, including a color option if required
     *
     * A color option is needed because child process output is piped.
     *
     * @param array $args The script parameters
     * @param string $colorOption The long option to force color output
     *
     * @return array
     */
    public static function addColorOption(array $args, $colorOption)
    {
        if (!$colorOption || \in_array($colorOption, $args) || !\preg_match('/^--([a-z]+$)|(^--[a-z]+=)/', $colorOption, $matches)) {
            return $args;
        }
        if (isset($matches[2])) {
            // Handle --color(s)= options
            if (\false !== ($index = \array_search($matches[2] . 'auto', $args))) {
                $args[$index] = $colorOption;
                return $args;
            } elseif (\preg_grep('/^' . $matches[2] . '/', $args)) {
                return $args;
            }
        } elseif (\in_array('--no-' . $matches[1], $args)) {
            return $args;
        }
        if (\false !== ($index = \array_search('--', $args))) {
            // Position option before double-dash delimiter
            \array_splice($args, $index, 0, $colorOption);
        } else {
            $args[] = $colorOption;
        }
        return $args;
    }
    /**
     * Escapes a string to be used as a shell argument.
     *
     * From https://github.com/johnstevenson/winbox-args
     * MIT Licensed (c) John Stevenson <john-stevenson@blueyonder.co.uk>
     *
     * @param string $arg  The argument to be escaped
     * @param bool   $meta Additionally escape cmd.exe meta characters
     * @param bool $module The argument is the module to invoke
     *
     * @return string The escaped argument
     */
    public static function escape($arg, $meta = \true, $module = \false)
    {
        if (!\defined('PHP_WINDOWS_VERSION_BUILD')) {
            return "'" . \str_replace("'", "'\\''", $arg) . "'";
        }
        $quote = \strpbrk($arg, " \t") !== \false || $arg === '';
        $arg = \preg_replace('/(\\\\*)"/', '$1$1\\"', $arg, -1, $dquotes);
        if ($meta) {
            $meta = $dquotes || \preg_match('/%[^%]+%/', $arg);
            if (!$meta) {
                $quote = $quote || \strpbrk($arg, '^&|<>()') !== \false;
            } elseif ($module && !$dquotes && $quote) {
                $meta = \false;
            }
        }
        if ($quote) {
            $arg = '"' . \preg_replace('/(\\\\*)$/', '$1$1', $arg) . '"';
        }
        if ($meta) {
            $arg = \preg_replace('/(["^&|<>()%])/', '^$1', $arg);
        }
        return $arg;
    }
    /**
     * Returns true if the output stream supports colors
     *
     * This is tricky on Windows, because Cygwin, Msys2 etc emulate pseudo
     * terminals via named pipes, so we can only check the environment.
     *
     * @param mixed $output A valid CLI output stream
     *
     * @return bool
     */
    public static function supportsColor($output)
    {
        if (\defined('PHP_WINDOWS_VERSION_BUILD')) {
            return \function_exists('_HumbugBoxb94336daae36\\sapi_windows_vt100_support') && sapi_windows_vt100_support($output) || \false !== \getenv('ANSICON') || 'ON' === \getenv('ConEmuANSI') || 'xterm' === \getenv('TERM');
        }
        if (\function_exists('stream_isatty')) {
            return \stream_isatty($output);
        } elseif (\function_exists('posix_isatty')) {
            return \posix_isatty($output);
        }
        $stat = \fstat($output);
        // Check if formatted mode is S_IFCHR
        return $stat ? 020000 === ($stat['mode'] & 0170000) : \false;
    }
    /**
     * Makes putenv environment changes available in $_SERVER and $_ENV
     *
     * @param string $name
     * @param string|false $value A false value unsets the variable
     *
     * @return bool Whether the environment variable was set
     */
    public static function setEnv($name, $value = \false)
    {
        $unset = \false === $value;
        if (!\putenv($unset ? $name : $name . '=' . $value)) {
            return \false;
        }
        if ($unset) {
            unset($_SERVER[$name]);
        } else {
            $_SERVER[$name] = $value;
        }
        // Update $_ENV if it is being used
        if (\false !== \stripos((string) \ini_get('variables_order'), 'E')) {
            if ($unset) {
                unset($_ENV[$name]);
            } else {
                $_ENV[$name] = $value;
            }
        }
        return \true;
    }
}
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    http://www.php-fig.org/psr/psr-0/
 * @see    http://www.php-fig.org/psr/psr-4/
 */
class ClassLoader
{
    // PSR-4
    private $prefixLengthsPsr4 = array();
    private $prefixDirsPsr4 = array();
    private $fallbackDirsPsr4 = array();

    // PSR-0
    private $prefixesPsr0 = array();
    private $fallbackDirsPsr0 = array();

    private $useIncludePath = false;
    private $classMap = array();
    private $classMapAuthoritative = false;
    private $missingClasses = array();
    private $apcuPrefix;

    public function getPrefixes()
    {
        if (!empty($this->prefixesPsr0)) {
            return call_user_func_array('array_merge', $this->prefixesPsr0);
        }

        return array();
    }

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

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

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

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

    /**
     * @param array $classMap Class to filename map
     */
    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 array|string $paths   The PSR-0 root directories
     * @param bool         $prepend Whether to prepend the directories
     */
    public function add($prefix, $paths, $prepend = false)
    {
        if (!$prefix) {
            if ($prepend) {
                $this->fallbackDirsPsr0 = array_merge(
                    (array) $paths,
                    $this->fallbackDirsPsr0
                );
            } else {
                $this->fallbackDirsPsr0 = array_merge(
                    $this->fallbackDirsPsr0,
                    (array) $paths
                );
            }

            return;
        }

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

            return;
        }
        if ($prepend) {
            $this->prefixesPsr0[$first][$prefix] = array_merge(
                (array) $paths,
                $this->prefixesPsr0[$first][$prefix]
            );
        } else {
            $this->prefixesPsr0[$first][$prefix] = array_merge(
                $this->prefixesPsr0[$first][$prefix],
                (array) $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 array|string $paths   The PSR-4 base directories
     * @param bool         $prepend Whether to prepend the directories
     *
     * @throws \InvalidArgumentException
     */
    public function addPsr4($prefix, $paths, $prepend = false)
    {
        if (!$prefix) {
            // Register directories for the root namespace.
            if ($prepend) {
                $this->fallbackDirsPsr4 = array_merge(
                    (array) $paths,
                    $this->fallbackDirsPsr4
                );
            } else {
                $this->fallbackDirsPsr4 = array_merge(
                    $this->fallbackDirsPsr4,
                    (array) $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] = (array) $paths;
        } elseif ($prepend) {
            // Prepend directories for an already registered namespace.
            $this->prefixDirsPsr4[$prefix] = array_merge(
                (array) $paths,
                $this->prefixDirsPsr4[$prefix]
            );
        } else {
            // Append directories for an already registered namespace.
            $this->prefixDirsPsr4[$prefix] = array_merge(
                $this->prefixDirsPsr4[$prefix],
                (array) $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 array|string $paths  The PSR-0 base directories
     */
    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 array|string $paths  The PSR-4 base directories
     *
     * @throws \InvalidArgumentException
     */
    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
     */
    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
     */
    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
     */
    public function setApcuPrefix($apcuPrefix)
    {
        $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $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
     */
    public function register($prepend = false)
    {
        spl_autoload_register(array($this, 'loadClass'), true, $prepend);
    }

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

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

            return true;
        }
    }

    /**
     * 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;
    }

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

/**
 * Scope isolated include.
 *
 * Prevents access to $this/self from included files.
 */
function includeFile($file)
{
    include $file;
}
<?php

// autoload_psr4.php @generated by Composer

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

return array(
    '_HumbugBoxb94336daae36\\Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\' => array($vendorDir . '/symfony/finder'),
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\' => array($vendorDir . '/symfony/debug'),
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'),
    '_HumbugBoxb94336daae36\\Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
    '_HumbugBoxb94336daae36\\PackageVersions\\' => array($vendorDir . '/ocramius/package-versions/src/PackageVersions'),
    '_HumbugBoxb94336daae36\\Jean85\\' => array($vendorDir . '/jean85/pretty-package-versions/src'),
    '_HumbugBoxb94336daae36\\Composer\\XdebugHandler\\' => array($vendorDir . '/composer/xdebug-handler/src'),
    'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'),
    'PHPStan\\PhpDocParser\\' => array($vendorDir . '/phpstan/phpdoc-parser/src'),
    'PHPStan\\' => array($baseDir . '/src'),
);
<?php

// autoload_classmap.php @generated by Composer

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

return array(
    'PHPStan\\AnalysedCodeException' => $baseDir . '/src/AnalysedCodeException.php',
    'PHPStan\\Analyser\\Analyser' => $baseDir . '/src/Analyser/Analyser.php',
    'PHPStan\\Analyser\\EnsuredNonNullabilityResult' => $baseDir . '/src/Analyser/EnsuredNonNullabilityResult.php',
    'PHPStan\\Analyser\\EnsuredNonNullabilityResultExpression' => $baseDir . '/src/Analyser/EnsuredNonNullabilityResultExpression.php',
    'PHPStan\\Analyser\\Error' => $baseDir . '/src/Analyser/Error.php',
    'PHPStan\\Analyser\\ExpressionContext' => $baseDir . '/src/Analyser/ExpressionContext.php',
    'PHPStan\\Analyser\\ExpressionResult' => $baseDir . '/src/Analyser/ExpressionResult.php',
    'PHPStan\\Analyser\\IgnoredError' => $baseDir . '/src/Analyser/IgnoredError.php',
    'PHPStan\\Analyser\\NameScope' => $baseDir . '/src/Analyser/NameScope.php',
    'PHPStan\\Analyser\\NodeScopeResolver' => $baseDir . '/src/Analyser/NodeScopeResolver.php',
    'PHPStan\\Analyser\\OutOfClassScope' => $baseDir . '/src/Analyser/OutOfClassScope.php',
    'PHPStan\\Analyser\\Scope' => $baseDir . '/src/Analyser/Scope.php',
    'PHPStan\\Analyser\\ScopeContext' => $baseDir . '/src/Analyser/ScopeContext.php',
    'PHPStan\\Analyser\\ScopeFactory' => $baseDir . '/src/Analyser/ScopeFactory.php',
    'PHPStan\\Analyser\\SpecifiedTypes' => $baseDir . '/src/Analyser/SpecifiedTypes.php',
    'PHPStan\\Analyser\\StatementExitPoint' => $baseDir . '/src/Analyser/StatementExitPoint.php',
    'PHPStan\\Analyser\\StatementResult' => $baseDir . '/src/Analyser/StatementResult.php',
    'PHPStan\\Analyser\\TypeSpecifier' => $baseDir . '/src/Analyser/TypeSpecifier.php',
    'PHPStan\\Analyser\\TypeSpecifierAwareExtension' => $baseDir . '/src/Analyser/TypeSpecifierAwareExtension.php',
    'PHPStan\\Analyser\\TypeSpecifierContext' => $baseDir . '/src/Analyser/TypeSpecifierContext.php',
    'PHPStan\\Analyser\\TypeSpecifierFactory' => $baseDir . '/src/Analyser/TypeSpecifierFactory.php',
    'PHPStan\\Analyser\\UndefinedVariableException' => $baseDir . '/src/Analyser/UndefinedVariableException.php',
    'PHPStan\\Analyser\\VariableTypeHolder' => $baseDir . '/src/Analyser/VariableTypeHolder.php',
    'PHPStan\\Broker\\AnonymousClassNameHelper' => $baseDir . '/src/Broker/AnonymousClassNameHelper.php',
    'PHPStan\\Broker\\Broker' => $baseDir . '/src/Broker/Broker.php',
    'PHPStan\\Broker\\BrokerFactory' => $baseDir . '/src/Broker/BrokerFactory.php',
    'PHPStan\\Broker\\ClassAutoloadingException' => $baseDir . '/src/Broker/ClassAutoloadingException.php',
    'PHPStan\\Broker\\ClassNotFoundException' => $baseDir . '/src/Broker/ClassNotFoundException.php',
    'PHPStan\\Broker\\FunctionNotFoundException' => $baseDir . '/src/Broker/FunctionNotFoundException.php',
    'PHPStan\\Cache\\Cache' => $baseDir . '/src/Cache/Cache.php',
    'PHPStan\\Cache\\CacheStorage' => $baseDir . '/src/Cache/CacheStorage.php',
    'PHPStan\\Cache\\FileCacheStorage' => $baseDir . '/src/Cache/FileCacheStorage.php',
    'PHPStan\\Cache\\MemoryCacheStorage' => $baseDir . '/src/Cache/MemoryCacheStorage.php',
    'PHPStan\\Command\\AnalyseApplication' => $baseDir . '/src/Command/AnalyseApplication.php',
    'PHPStan\\Command\\AnalyseCommand' => $baseDir . '/src/Command/AnalyseCommand.php',
    'PHPStan\\Command\\AnalysisResult' => $baseDir . '/src/Command/AnalysisResult.php',
    'PHPStan\\Command\\CommandHelper' => $baseDir . '/src/Command/CommandHelper.php',
    'PHPStan\\Command\\DumpDependenciesCommand' => $baseDir . '/src/Command/DumpDependenciesCommand.php',
    'PHPStan\\Command\\ErrorFormatter\\CheckstyleErrorFormatter' => $baseDir . '/src/Command/ErrorFormatter/CheckstyleErrorFormatter.php',
    'PHPStan\\Command\\ErrorFormatter\\ErrorFormatter' => $baseDir . '/src/Command/ErrorFormatter/ErrorFormatter.php',
    'PHPStan\\Command\\ErrorFormatter\\JsonErrorFormatter' => $baseDir . '/src/Command/ErrorFormatter/JsonErrorFormatter.php',
    'PHPStan\\Command\\ErrorFormatter\\RawErrorFormatter' => $baseDir . '/src/Command/ErrorFormatter/RawErrorFormatter.php',
    'PHPStan\\Command\\ErrorFormatter\\TableErrorFormatter' => $baseDir . '/src/Command/ErrorFormatter/TableErrorFormatter.php',
    'PHPStan\\Command\\ErrorsConsoleStyle' => $baseDir . '/src/Command/ErrorsConsoleStyle.php',
    'PHPStan\\Command\\InceptionNotSuccessfulException' => $baseDir . '/src/Command/InceptionNotSuccessfulException.php',
    'PHPStan\\Command\\InceptionResult' => $baseDir . '/src/Command/InceptionResult.php',
    'PHPStan\\DependencyInjection\\ConditionalTagsExtension' => $baseDir . '/src/DependencyInjection/ConditionalTagsExtension.php',
    'PHPStan\\DependencyInjection\\Configurator' => $baseDir . '/src/DependencyInjection/Configurator.php',
    'PHPStan\\DependencyInjection\\Container' => $baseDir . '/src/DependencyInjection/Container.php',
    'PHPStan\\DependencyInjection\\ContainerFactory' => $baseDir . '/src/DependencyInjection/ContainerFactory.php',
    'PHPStan\\DependencyInjection\\LoaderFactory' => $baseDir . '/src/DependencyInjection/LoaderFactory.php',
    'PHPStan\\DependencyInjection\\Nette\\NetteContainer' => $baseDir . '/src/DependencyInjection/Nette/NetteContainer.php',
    'PHPStan\\DependencyInjection\\ParametersSchemaExtension' => $baseDir . '/src/DependencyInjection/ParametersSchemaExtension.php',
    'PHPStan\\DependencyInjection\\RulesExtension' => $baseDir . '/src/DependencyInjection/RulesExtension.php',
    'PHPStan\\Dependency\\DependencyDumper' => $baseDir . '/src/Dependency/DependencyDumper.php',
    'PHPStan\\Dependency\\DependencyResolver' => $baseDir . '/src/Dependency/DependencyResolver.php',
    'PHPStan\\File\\FileExcluder' => $baseDir . '/src/File/FileExcluder.php',
    'PHPStan\\File\\FileFinder' => $baseDir . '/src/File/FileFinder.php',
    'PHPStan\\File\\FileFinderResult' => $baseDir . '/src/File/FileFinderResult.php',
    'PHPStan\\File\\FileHelper' => $baseDir . '/src/File/FileHelper.php',
    'PHPStan\\File\\FuzzyRelativePathHelper' => $baseDir . '/src/File/FuzzyRelativePathHelper.php',
    'PHPStan\\File\\PathNotFoundException' => $baseDir . '/src/File/PathNotFoundException.php',
    'PHPStan\\File\\RelativePathHelper' => $baseDir . '/src/File/RelativePathHelper.php',
    'PHPStan\\File\\SimpleRelativePathHelper' => $baseDir . '/src/File/SimpleRelativePathHelper.php',
    'PHPStan\\Internal\\ContainerDynamicReturnTypeExtension' => $baseDir . '/src/Internal/ContainerDynamicReturnTypeExtension.php',
    'PHPStan\\Internal\\ScopeIsInClassTypeSpecifyingExtension' => $baseDir . '/src/Internal/ScopeIsInClassTypeSpecifyingExtension.php',
    'PHPStan\\Internal\\UnionTypeGetInternalDynamicReturnTypeExtension' => $baseDir . '/src/Internal/UnionTypeGetInternalDynamicReturnTypeExtension.php',
    'PHPStan\\Node\\ClosureReturnStatementsNode' => $baseDir . '/src/Node/ClosureReturnStatementsNode.php',
    'PHPStan\\Node\\ExecutionEndNode' => $baseDir . '/src/Node/ExecutionEndNode.php',
    'PHPStan\\Node\\InClassMethodNode' => $baseDir . '/src/Node/InClassMethodNode.php',
    'PHPStan\\Node\\LiteralArrayItem' => $baseDir . '/src/Node/LiteralArrayItem.php',
    'PHPStan\\Node\\LiteralArrayNode' => $baseDir . '/src/Node/LiteralArrayNode.php',
    'PHPStan\\Node\\ReturnStatement' => $baseDir . '/src/Node/ReturnStatement.php',
    'PHPStan\\Node\\UnreachableStatementNode' => $baseDir . '/src/Node/UnreachableStatementNode.php',
    'PHPStan\\Node\\VirtualNode' => $baseDir . '/src/Node/VirtualNode.php',
    'PHPStan\\Parser\\CachedParser' => $baseDir . '/src/Parser/CachedParser.php',
    'PHPStan\\Parser\\DirectParser' => $baseDir . '/src/Parser/DirectParser.php',
    'PHPStan\\Parser\\FunctionCallStatementFinder' => $baseDir . '/src/Parser/FunctionCallStatementFinder.php',
    'PHPStan\\Parser\\Parser' => $baseDir . '/src/Parser/Parser.php',
    'PHPStan\\Parser\\ParserErrorsException' => $baseDir . '/src/Parser/ParserErrorsException.php',
    'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprArrayItemNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayItemNode.php',
    'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprArrayNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php',
    'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprFalseNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFalseNode.php',
    'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprFloatNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFloatNode.php',
    'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprIntegerNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.php',
    'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNode.php',
    'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprNullNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNullNode.php',
    'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprStringNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprStringNode.php',
    'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprTrueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprTrueNode.php',
    'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstFetchNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstFetchNode.php',
    'PHPStan\\PhpDocParser\\Ast\\Node' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Node.php',
    'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\DeprecatedTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.php',
    'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\GenericTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.php',
    'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\InvalidTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php',
    'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\MethodTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php',
    'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\MethodTagValueParameterNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php',
    'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.php',
    'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocChildNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocChildNode.php',
    'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocNode.php',
    'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTagNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php',
    'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagValueNode.php',
    'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTextNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTextNode.php',
    'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PropertyTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php',
    'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ReturnTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.php',
    'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TemplateTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.php',
    'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ThrowsTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.php',
    'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\VarTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.php',
    'PHPStan\\PhpDocParser\\Ast\\Type\\ArrayTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php',
    'PHPStan\\PhpDocParser\\Ast\\Type\\CallableTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php',
    'PHPStan\\PhpDocParser\\Ast\\Type\\CallableTypeParameterNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php',
    'PHPStan\\PhpDocParser\\Ast\\Type\\GenericTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php',
    'PHPStan\\PhpDocParser\\Ast\\Type\\IdentifierTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php',
    'PHPStan\\PhpDocParser\\Ast\\Type\\IntersectionTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php',
    'PHPStan\\PhpDocParser\\Ast\\Type\\NullableTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php',
    'PHPStan\\PhpDocParser\\Ast\\Type\\ThisTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ThisTypeNode.php',
    'PHPStan\\PhpDocParser\\Ast\\Type\\TypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/TypeNode.php',
    'PHPStan\\PhpDocParser\\Ast\\Type\\UnionTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php',
    'PHPStan\\PhpDocParser\\Lexer\\Lexer' => $vendorDir . '/phpstan/phpdoc-parser/src/Lexer/Lexer.php',
    'PHPStan\\PhpDocParser\\Parser\\ConstExprParser' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php',
    'PHPStan\\PhpDocParser\\Parser\\ParserException' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/ParserException.php',
    'PHPStan\\PhpDocParser\\Parser\\PhpDocParser' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php',
    'PHPStan\\PhpDocParser\\Parser\\TokenIterator' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/TokenIterator.php',
    'PHPStan\\PhpDocParser\\Parser\\TypeParser' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/TypeParser.php',
    'PHPStan\\PhpDoc\\PhpDocBlock' => $baseDir . '/src/PhpDoc/PhpDocBlock.php',
    'PHPStan\\PhpDoc\\PhpDocNodeResolver' => $baseDir . '/src/PhpDoc/PhpDocNodeResolver.php',
    'PHPStan\\PhpDoc\\PhpDocStringResolver' => $baseDir . '/src/PhpDoc/PhpDocStringResolver.php',
    'PHPStan\\PhpDoc\\ResolvedPhpDocBlock' => $baseDir . '/src/PhpDoc/ResolvedPhpDocBlock.php',
    'PHPStan\\PhpDoc\\Tag\\DeprecatedTag' => $baseDir . '/src/PhpDoc/Tag/DeprecatedTag.php',
    'PHPStan\\PhpDoc\\Tag\\MethodTag' => $baseDir . '/src/PhpDoc/Tag/MethodTag.php',
    'PHPStan\\PhpDoc\\Tag\\MethodTagParameter' => $baseDir . '/src/PhpDoc/Tag/MethodTagParameter.php',
    'PHPStan\\PhpDoc\\Tag\\ParamTag' => $baseDir . '/src/PhpDoc/Tag/ParamTag.php',
    'PHPStan\\PhpDoc\\Tag\\PropertyTag' => $baseDir . '/src/PhpDoc/Tag/PropertyTag.php',
    'PHPStan\\PhpDoc\\Tag\\ReturnTag' => $baseDir . '/src/PhpDoc/Tag/ReturnTag.php',
    'PHPStan\\PhpDoc\\Tag\\ThrowsTag' => $baseDir . '/src/PhpDoc/Tag/ThrowsTag.php',
    'PHPStan\\PhpDoc\\Tag\\VarTag' => $baseDir . '/src/PhpDoc/Tag/VarTag.php',
    'PHPStan\\PhpDoc\\TypeNodeResolver' => $baseDir . '/src/PhpDoc/TypeNodeResolver.php',
    'PHPStan\\PhpDoc\\TypeNodeResolverAwareExtension' => $baseDir . '/src/PhpDoc/TypeNodeResolverAwareExtension.php',
    'PHPStan\\PhpDoc\\TypeNodeResolverExtension' => $baseDir . '/src/PhpDoc/TypeNodeResolverExtension.php',
    'PHPStan\\PhpDoc\\TypeNodeResolverFactory' => $baseDir . '/src/PhpDoc/TypeNodeResolverFactory.php',
    'PHPStan\\PhpDoc\\TypeStringResolver' => $baseDir . '/src/PhpDoc/TypeStringResolver.php',
    'PHPStan\\Reflection\\Annotations\\AnnotationMethodReflection' => $baseDir . '/src/Reflection/Annotations/AnnotationMethodReflection.php',
    'PHPStan\\Reflection\\Annotations\\AnnotationPropertyReflection' => $baseDir . '/src/Reflection/Annotations/AnnotationPropertyReflection.php',
    'PHPStan\\Reflection\\Annotations\\AnnotationsMethodParameterReflection' => $baseDir . '/src/Reflection/Annotations/AnnotationsMethodParameterReflection.php',
    'PHPStan\\Reflection\\Annotations\\AnnotationsMethodsClassReflectionExtension' => $baseDir . '/src/Reflection/Annotations/AnnotationsMethodsClassReflectionExtension.php',
    'PHPStan\\Reflection\\Annotations\\AnnotationsPropertiesClassReflectionExtension' => $baseDir . '/src/Reflection/Annotations/AnnotationsPropertiesClassReflectionExtension.php',
    'PHPStan\\Reflection\\BrokerAwareClassReflectionExtension' => $baseDir . '/src/Reflection/BrokerAwareClassReflectionExtension.php',
    'PHPStan\\Reflection\\BrokerAwareExtension' => $baseDir . '/src/Reflection/BrokerAwareExtension.php',
    'PHPStan\\Reflection\\ClassConstantReflection' => $baseDir . '/src/Reflection/ClassConstantReflection.php',
    'PHPStan\\Reflection\\ClassMemberAccessAnswerer' => $baseDir . '/src/Reflection/ClassMemberAccessAnswerer.php',
    'PHPStan\\Reflection\\ClassMemberReflection' => $baseDir . '/src/Reflection/ClassMemberReflection.php',
    'PHPStan\\Reflection\\ClassReflection' => $baseDir . '/src/Reflection/ClassReflection.php',
    'PHPStan\\Reflection\\ConstantReflection' => $baseDir . '/src/Reflection/ConstantReflection.php',
    'PHPStan\\Reflection\\DeprecatableReflection' => $baseDir . '/src/Reflection/DeprecatableReflection.php',
    'PHPStan\\Reflection\\Dummy\\DummyConstantReflection' => $baseDir . '/src/Reflection/Dummy/DummyConstantReflection.php',
    'PHPStan\\Reflection\\Dummy\\DummyMethodReflection' => $baseDir . '/src/Reflection/Dummy/DummyMethodReflection.php',
    'PHPStan\\Reflection\\Dummy\\DummyPropertyReflection' => $baseDir . '/src/Reflection/Dummy/DummyPropertyReflection.php',
    'PHPStan\\Reflection\\FinalizableReflection' => $baseDir . '/src/Reflection/FinalizableReflection.php',
    'PHPStan\\Reflection\\FunctionReflection' => $baseDir . '/src/Reflection/FunctionReflection.php',
    'PHPStan\\Reflection\\FunctionReflectionFactory' => $baseDir . '/src/Reflection/FunctionReflectionFactory.php',
    'PHPStan\\Reflection\\FunctionVariant' => $baseDir . '/src/Reflection/FunctionVariant.php',
    'PHPStan\\Reflection\\FunctionVariantWithPhpDocs' => $baseDir . '/src/Reflection/FunctionVariantWithPhpDocs.php',
    'PHPStan\\Reflection\\InaccessibleMethod' => $baseDir . '/src/Reflection/InaccessibleMethod.php',
    'PHPStan\\Reflection\\InternableReflection' => $baseDir . '/src/Reflection/InternableReflection.php',
    'PHPStan\\Reflection\\MethodPrototypeReflection' => $baseDir . '/src/Reflection/MethodPrototypeReflection.php',
    'PHPStan\\Reflection\\MethodReflection' => $baseDir . '/src/Reflection/MethodReflection.php',
    'PHPStan\\Reflection\\MethodsClassReflectionExtension' => $baseDir . '/src/Reflection/MethodsClassReflectionExtension.php',
    'PHPStan\\Reflection\\MissingConstantFromReflectionException' => $baseDir . '/src/Reflection/MissingConstantFromReflectionException.php',
    'PHPStan\\Reflection\\MissingMethodFromReflectionException' => $baseDir . '/src/Reflection/MissingMethodFromReflectionException.php',
    'PHPStan\\Reflection\\MissingPropertyFromReflectionException' => $baseDir . '/src/Reflection/MissingPropertyFromReflectionException.php',
    'PHPStan\\Reflection\\Native\\NativeFunctionReflection' => $baseDir . '/src/Reflection/Native/NativeFunctionReflection.php',
    'PHPStan\\Reflection\\Native\\NativeMethodReflection' => $baseDir . '/src/Reflection/Native/NativeMethodReflection.php',
    'PHPStan\\Reflection\\Native\\NativeParameterReflection' => $baseDir . '/src/Reflection/Native/NativeParameterReflection.php',
    'PHPStan\\Reflection\\ParameterReflection' => $baseDir . '/src/Reflection/ParameterReflection.php',
    'PHPStan\\Reflection\\ParameterReflectionWithPhpDocs' => $baseDir . '/src/Reflection/ParameterReflectionWithPhpDocs.php',
    'PHPStan\\Reflection\\ParametersAcceptor' => $baseDir . '/src/Reflection/ParametersAcceptor.php',
    'PHPStan\\Reflection\\ParametersAcceptorSelector' => $baseDir . '/src/Reflection/ParametersAcceptorSelector.php',
    'PHPStan\\Reflection\\ParametersAcceptorWithPhpDocs' => $baseDir . '/src/Reflection/ParametersAcceptorWithPhpDocs.php',
    'PHPStan\\Reflection\\PassedByReference' => $baseDir . '/src/Reflection/PassedByReference.php',
    'PHPStan\\Reflection\\PhpDefect\\PhpDefectClassReflectionExtension' => $baseDir . '/src/Reflection/PhpDefect/PhpDefectClassReflectionExtension.php',
    'PHPStan\\Reflection\\PhpDefect\\PhpDefectPropertyReflection' => $baseDir . '/src/Reflection/PhpDefect/PhpDefectPropertyReflection.php',
    'PHPStan\\Reflection\\Php\\BuiltinMethodReflection' => $baseDir . '/src/Reflection/Php/BuiltinMethodReflection.php',
    'PHPStan\\Reflection\\Php\\DummyParameter' => $baseDir . '/src/Reflection/Php/DummyParameter.php',
    'PHPStan\\Reflection\\Php\\FakeBuiltinMethodReflection' => $baseDir . '/src/Reflection/Php/FakeBuiltinMethodReflection.php',
    'PHPStan\\Reflection\\Php\\NativeBuiltinMethodReflection' => $baseDir . '/src/Reflection/Php/NativeBuiltinMethodReflection.php',
    'PHPStan\\Reflection\\Php\\PhpClassReflectionExtension' => $baseDir . '/src/Reflection/Php/PhpClassReflectionExtension.php',
    'PHPStan\\Reflection\\Php\\PhpFunctionFromParserNodeReflection' => $baseDir . '/src/Reflection/Php/PhpFunctionFromParserNodeReflection.php',
    'PHPStan\\Reflection\\Php\\PhpFunctionReflection' => $baseDir . '/src/Reflection/Php/PhpFunctionReflection.php',
    'PHPStan\\Reflection\\Php\\PhpMethodFromParserNodeReflection' => $baseDir . '/src/Reflection/Php/PhpMethodFromParserNodeReflection.php',
    'PHPStan\\Reflection\\Php\\PhpMethodReflection' => $baseDir . '/src/Reflection/Php/PhpMethodReflection.php',
    'PHPStan\\Reflection\\Php\\PhpMethodReflectionFactory' => $baseDir . '/src/Reflection/Php/PhpMethodReflectionFactory.php',
    'PHPStan\\Reflection\\Php\\PhpParameterFromParserNodeReflection' => $baseDir . '/src/Reflection/Php/PhpParameterFromParserNodeReflection.php',
    'PHPStan\\Reflection\\Php\\PhpParameterReflection' => $baseDir . '/src/Reflection/Php/PhpParameterReflection.php',
    'PHPStan\\Reflection\\Php\\PhpPropertyReflection' => $baseDir . '/src/Reflection/Php/PhpPropertyReflection.php',
    'PHPStan\\Reflection\\Php\\UniversalObjectCrateProperty' => $baseDir . '/src/Reflection/Php/UniversalObjectCrateProperty.php',
    'PHPStan\\Reflection\\Php\\UniversalObjectCratesClassReflectionExtension' => $baseDir . '/src/Reflection/Php/UniversalObjectCratesClassReflectionExtension.php',
    'PHPStan\\Reflection\\PropertiesClassReflectionExtension' => $baseDir . '/src/Reflection/PropertiesClassReflectionExtension.php',
    'PHPStan\\Reflection\\PropertyReflection' => $baseDir . '/src/Reflection/PropertyReflection.php',
    'PHPStan\\Reflection\\ReflectionWithFilename' => $baseDir . '/src/Reflection/ReflectionWithFilename.php',
    'PHPStan\\Reflection\\SignatureMap\\FunctionSignature' => $baseDir . '/src/Reflection/SignatureMap/FunctionSignature.php',
    'PHPStan\\Reflection\\SignatureMap\\ParameterSignature' => $baseDir . '/src/Reflection/SignatureMap/ParameterSignature.php',
    'PHPStan\\Reflection\\SignatureMap\\SignatureMapParser' => $baseDir . '/src/Reflection/SignatureMap/SignatureMapParser.php',
    'PHPStan\\Reflection\\SignatureMap\\SignatureMapProvider' => $baseDir . '/src/Reflection/SignatureMap/SignatureMapProvider.php',
    'PHPStan\\Reflection\\ThrowableReflection' => $baseDir . '/src/Reflection/ThrowableReflection.php',
    'PHPStan\\Reflection\\TrivialParametersAcceptor' => $baseDir . '/src/Reflection/TrivialParametersAcceptor.php',
    'PHPStan\\Rules\\Arrays\\AllowedArrayKeysTypes' => $baseDir . '/src/Rules/Arrays/AllowedArrayKeysTypes.php',
    'PHPStan\\Rules\\Arrays\\AppendedArrayItemTypeRule' => $baseDir . '/src/Rules/Arrays/AppendedArrayItemTypeRule.php',
    'PHPStan\\Rules\\Arrays\\AppendedArrayKeyTypeRule' => $baseDir . '/src/Rules/Arrays/AppendedArrayKeyTypeRule.php',
    'PHPStan\\Rules\\Arrays\\DeadForeachRule' => $baseDir . '/src/Rules/Arrays/DeadForeachRule.php',
    'PHPStan\\Rules\\Arrays\\DuplicateKeysInLiteralArraysRule' => $baseDir . '/src/Rules/Arrays/DuplicateKeysInLiteralArraysRule.php',
    'PHPStan\\Rules\\Arrays\\InvalidKeyInArrayDimFetchRule' => $baseDir . '/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php',
    'PHPStan\\Rules\\Arrays\\InvalidKeyInArrayItemRule' => $baseDir . '/src/Rules/Arrays/InvalidKeyInArrayItemRule.php',
    'PHPStan\\Rules\\Arrays\\IterableInForeachRule' => $baseDir . '/src/Rules/Arrays/IterableInForeachRule.php',
    'PHPStan\\Rules\\Arrays\\NonexistentOffsetInArrayDimFetchRule' => $baseDir . '/src/Rules/Arrays/NonexistentOffsetInArrayDimFetchRule.php',
    'PHPStan\\Rules\\Arrays\\OffsetAccessAssignOpRule' => $baseDir . '/src/Rules/Arrays/OffsetAccessAssignOpRule.php',
    'PHPStan\\Rules\\Arrays\\OffsetAccessAssignmentRule' => $baseDir . '/src/Rules/Arrays/OffsetAccessAssignmentRule.php',
    'PHPStan\\Rules\\Arrays\\OffsetAccessWithoutDimForReadingRule' => $baseDir . '/src/Rules/Arrays/OffsetAccessWithoutDimForReadingRule.php',
    'PHPStan\\Rules\\Cast\\EchoRule' => $baseDir . '/src/Rules/Cast/EchoRule.php',
    'PHPStan\\Rules\\Cast\\InvalidCastRule' => $baseDir . '/src/Rules/Cast/InvalidCastRule.php',
    'PHPStan\\Rules\\Cast\\InvalidPartOfEncapsedStringRule' => $baseDir . '/src/Rules/Cast/InvalidPartOfEncapsedStringRule.php',
    'PHPStan\\Rules\\Cast\\PrintRule' => $baseDir . '/src/Rules/Cast/PrintRule.php',
    'PHPStan\\Rules\\ClassCaseSensitivityCheck' => $baseDir . '/src/Rules/ClassCaseSensitivityCheck.php',
    'PHPStan\\Rules\\ClassNameNodePair' => $baseDir . '/src/Rules/ClassNameNodePair.php',
    'PHPStan\\Rules\\Classes\\ClassConstantDeclarationRule' => $baseDir . '/src/Rules/Classes/ClassConstantDeclarationRule.php',
    'PHPStan\\Rules\\Classes\\ClassConstantRule' => $baseDir . '/src/Rules/Classes/ClassConstantRule.php',
    'PHPStan\\Rules\\Classes\\ExistingClassInClassExtendsRule' => $baseDir . '/src/Rules/Classes/ExistingClassInClassExtendsRule.php',
    'PHPStan\\Rules\\Classes\\ExistingClassInInstanceOfRule' => $baseDir . '/src/Rules/Classes/ExistingClassInInstanceOfRule.php',
    'PHPStan\\Rules\\Classes\\ExistingClassInTraitUseRule' => $baseDir . '/src/Rules/Classes/ExistingClassInTraitUseRule.php',
    'PHPStan\\Rules\\Classes\\ExistingClassesInClassImplementsRule' => $baseDir . '/src/Rules/Classes/ExistingClassesInClassImplementsRule.php',
    'PHPStan\\Rules\\Classes\\ExistingClassesInInterfaceExtendsRule' => $baseDir . '/src/Rules/Classes/ExistingClassesInInterfaceExtendsRule.php',
    'PHPStan\\Rules\\Classes\\ImpossibleInstanceOfRule' => $baseDir . '/src/Rules/Classes/ImpossibleInstanceOfRule.php',
    'PHPStan\\Rules\\Classes\\InstantiationRule' => $baseDir . '/src/Rules/Classes/InstantiationRule.php',
    'PHPStan\\Rules\\Classes\\RequireParentConstructCallRule' => $baseDir . '/src/Rules/Classes/RequireParentConstructCallRule.php',
    'PHPStan\\Rules\\Classes\\UnusedConstructorParametersRule' => $baseDir . '/src/Rules/Classes/UnusedConstructorParametersRule.php',
    'PHPStan\\Rules\\Comparison\\BooleanAndConstantConditionRule' => $baseDir . '/src/Rules/Comparison/BooleanAndConstantConditionRule.php',
    'PHPStan\\Rules\\Comparison\\BooleanNotConstantConditionRule' => $baseDir . '/src/Rules/Comparison/BooleanNotConstantConditionRule.php',
    'PHPStan\\Rules\\Comparison\\BooleanOrConstantConditionRule' => $baseDir . '/src/Rules/Comparison/BooleanOrConstantConditionRule.php',
    'PHPStan\\Rules\\Comparison\\ConstantConditionRuleHelper' => $baseDir . '/src/Rules/Comparison/ConstantConditionRuleHelper.php',
    'PHPStan\\Rules\\Comparison\\ElseIfConstantConditionRule' => $baseDir . '/src/Rules/Comparison/ElseIfConstantConditionRule.php',
    'PHPStan\\Rules\\Comparison\\IfConstantConditionRule' => $baseDir . '/src/Rules/Comparison/IfConstantConditionRule.php',
    'PHPStan\\Rules\\Comparison\\ImpossibleCheckTypeFunctionCallRule' => $baseDir . '/src/Rules/Comparison/ImpossibleCheckTypeFunctionCallRule.php',
    'PHPStan\\Rules\\Comparison\\ImpossibleCheckTypeHelper' => $baseDir . '/src/Rules/Comparison/ImpossibleCheckTypeHelper.php',
    'PHPStan\\Rules\\Comparison\\ImpossibleCheckTypeMethodCallRule' => $baseDir . '/src/Rules/Comparison/ImpossibleCheckTypeMethodCallRule.php',
    'PHPStan\\Rules\\Comparison\\ImpossibleCheckTypeStaticMethodCallRule' => $baseDir . '/src/Rules/Comparison/ImpossibleCheckTypeStaticMethodCallRule.php',
    'PHPStan\\Rules\\Comparison\\StrictComparisonOfDifferentTypesRule' => $baseDir . '/src/Rules/Comparison/StrictComparisonOfDifferentTypesRule.php',
    'PHPStan\\Rules\\Comparison\\TernaryOperatorConstantConditionRule' => $baseDir . '/src/Rules/Comparison/TernaryOperatorConstantConditionRule.php',
    'PHPStan\\Rules\\Comparison\\UnreachableIfBranchesRule' => $baseDir . '/src/Rules/Comparison/UnreachableIfBranchesRule.php',
    'PHPStan\\Rules\\Comparison\\UnreachableTernaryElseBranchRule' => $baseDir . '/src/Rules/Comparison/UnreachableTernaryElseBranchRule.php',
    'PHPStan\\Rules\\Constants\\ConstantRule' => $baseDir . '/src/Rules/Constants/ConstantRule.php',
    'PHPStan\\Rules\\DeadCode\\NoopRule' => $baseDir . '/src/Rules/DeadCode/NoopRule.php',
    'PHPStan\\Rules\\DeadCode\\UnreachableStatementRule' => $baseDir . '/src/Rules/DeadCode/UnreachableStatementRule.php',
    'PHPStan\\Rules\\Exceptions\\CaughtExceptionExistenceRule' => $baseDir . '/src/Rules/Exceptions/CaughtExceptionExistenceRule.php',
    'PHPStan\\Rules\\Exceptions\\DeadCatchRule' => $baseDir . '/src/Rules/Exceptions/DeadCatchRule.php',
    'PHPStan\\Rules\\FileRuleError' => $baseDir . '/src/Rules/FileRuleError.php',
    'PHPStan\\Rules\\FoundTypeResult' => $baseDir . '/src/Rules/FoundTypeResult.php',
    'PHPStan\\Rules\\FunctionCallParametersCheck' => $baseDir . '/src/Rules/FunctionCallParametersCheck.php',
    'PHPStan\\Rules\\FunctionDefinitionCheck' => $baseDir . '/src/Rules/FunctionDefinitionCheck.php',
    'PHPStan\\Rules\\FunctionReturnTypeCheck' => $baseDir . '/src/Rules/FunctionReturnTypeCheck.php',
    'PHPStan\\Rules\\Functions\\CallCallablesRule' => $baseDir . '/src/Rules/Functions/CallCallablesRule.php',
    'PHPStan\\Rules\\Functions\\CallToFunctionParametersRule' => $baseDir . '/src/Rules/Functions/CallToFunctionParametersRule.php',
    'PHPStan\\Rules\\Functions\\CallToNonExistentFunctionRule' => $baseDir . '/src/Rules/Functions/CallToNonExistentFunctionRule.php',
    'PHPStan\\Rules\\Functions\\ClosureReturnTypeRule' => $baseDir . '/src/Rules/Functions/ClosureReturnTypeRule.php',
    'PHPStan\\Rules\\Functions\\ExistingClassesInClosureTypehintsRule' => $baseDir . '/src/Rules/Functions/ExistingClassesInClosureTypehintsRule.php',
    'PHPStan\\Rules\\Functions\\ExistingClassesInTypehintsRule' => $baseDir . '/src/Rules/Functions/ExistingClassesInTypehintsRule.php',
    'PHPStan\\Rules\\Functions\\IncompatibleDefaultParameterTypeRule' => $baseDir . '/src/Rules/Functions/IncompatibleDefaultParameterTypeRule.php',
    'PHPStan\\Rules\\Functions\\InnerFunctionRule' => $baseDir . '/src/Rules/Functions/InnerFunctionRule.php',
    'PHPStan\\Rules\\Functions\\NonExistentDefinedFunctionRule' => $baseDir . '/src/Rules/Functions/NonExistentDefinedFunctionRule.php',
    'PHPStan\\Rules\\Functions\\PrintfParametersRule' => $baseDir . '/src/Rules/Functions/PrintfParametersRule.php',
    'PHPStan\\Rules\\Functions\\ReturnTypeRule' => $baseDir . '/src/Rules/Functions/ReturnTypeRule.php',
    'PHPStan\\Rules\\Functions\\UnusedClosureUsesRule' => $baseDir . '/src/Rules/Functions/UnusedClosureUsesRule.php',
    'PHPStan\\Rules\\Generators\\YieldFromTypeRule' => $baseDir . '/src/Rules/Generators/YieldFromTypeRule.php',
    'PHPStan\\Rules\\Generators\\YieldInGeneratorRule' => $baseDir . '/src/Rules/Generators/YieldInGeneratorRule.php',
    'PHPStan\\Rules\\Generators\\YieldTypeRule' => $baseDir . '/src/Rules/Generators/YieldTypeRule.php',
    'PHPStan\\Rules\\LineRuleError' => $baseDir . '/src/Rules/LineRuleError.php',
    'PHPStan\\Rules\\Methods\\CallMethodsRule' => $baseDir . '/src/Rules/Methods/CallMethodsRule.php',
    'PHPStan\\Rules\\Methods\\CallStaticMethodsRule' => $baseDir . '/src/Rules/Methods/CallStaticMethodsRule.php',
    'PHPStan\\Rules\\Methods\\ExistingClassesInTypehintsRule' => $baseDir . '/src/Rules/Methods/ExistingClassesInTypehintsRule.php',
    'PHPStan\\Rules\\Methods\\IncompatibleDefaultParameterTypeRule' => $baseDir . '/src/Rules/Methods/IncompatibleDefaultParameterTypeRule.php',
    'PHPStan\\Rules\\Methods\\MethodSignatureRule' => $baseDir . '/src/Rules/Methods/MethodSignatureRule.php',
    'PHPStan\\Rules\\Methods\\ReturnTypeRule' => $baseDir . '/src/Rules/Methods/ReturnTypeRule.php',
    'PHPStan\\Rules\\Missing\\MissingClosureNativeReturnTypehintRule' => $baseDir . '/src/Rules/Missing/MissingClosureNativeReturnTypehintRule.php',
    'PHPStan\\Rules\\Missing\\MissingReturnRule' => $baseDir . '/src/Rules/Missing/MissingReturnRule.php',
    'PHPStan\\Rules\\Namespaces\\ExistingNamesInGroupUseRule' => $baseDir . '/src/Rules/Namespaces/ExistingNamesInGroupUseRule.php',
    'PHPStan\\Rules\\Namespaces\\ExistingNamesInUseRule' => $baseDir . '/src/Rules/Namespaces/ExistingNamesInUseRule.php',
    'PHPStan\\Rules\\Operators\\InvalidBinaryOperationRule' => $baseDir . '/src/Rules/Operators/InvalidBinaryOperationRule.php',
    'PHPStan\\Rules\\Operators\\InvalidComparisonOperationRule' => $baseDir . '/src/Rules/Operators/InvalidComparisonOperationRule.php',
    'PHPStan\\Rules\\Operators\\InvalidIncDecOperationRule' => $baseDir . '/src/Rules/Operators/InvalidIncDecOperationRule.php',
    'PHPStan\\Rules\\Operators\\InvalidUnaryOperationRule' => $baseDir . '/src/Rules/Operators/InvalidUnaryOperationRule.php',
    'PHPStan\\Rules\\PhpDoc\\IncompatiblePhpDocTypeRule' => $baseDir . '/src/Rules/PhpDoc/IncompatiblePhpDocTypeRule.php',
    'PHPStan\\Rules\\PhpDoc\\IncompatiblePropertyPhpDocTypeRule' => $baseDir . '/src/Rules/PhpDoc/IncompatiblePropertyPhpDocTypeRule.php',
    'PHPStan\\Rules\\PhpDoc\\InvalidPhpDocTagValueRule' => $baseDir . '/src/Rules/PhpDoc/InvalidPhpDocTagValueRule.php',
    'PHPStan\\Rules\\PhpDoc\\InvalidThrowsPhpDocValueRule' => $baseDir . '/src/Rules/PhpDoc/InvalidThrowsPhpDocValueRule.php',
    'PHPStan\\Rules\\Properties\\AccessPropertiesInAssignRule' => $baseDir . '/src/Rules/Properties/AccessPropertiesInAssignRule.php',
    'PHPStan\\Rules\\Properties\\AccessPropertiesRule' => $baseDir . '/src/Rules/Properties/AccessPropertiesRule.php',
    'PHPStan\\Rules\\Properties\\AccessStaticPropertiesInAssignRule' => $baseDir . '/src/Rules/Properties/AccessStaticPropertiesInAssignRule.php',
    'PHPStan\\Rules\\Properties\\AccessStaticPropertiesRule' => $baseDir . '/src/Rules/Properties/AccessStaticPropertiesRule.php',
    'PHPStan\\Rules\\Properties\\DefaultValueTypesAssignedToPropertiesRule' => $baseDir . '/src/Rules/Properties/DefaultValueTypesAssignedToPropertiesRule.php',
    'PHPStan\\Rules\\Properties\\ExistingClassesInPropertiesRule' => $baseDir . '/src/Rules/Properties/ExistingClassesInPropertiesRule.php',
    'PHPStan\\Rules\\Properties\\PropertyDescriptor' => $baseDir . '/src/Rules/Properties/PropertyDescriptor.php',
    'PHPStan\\Rules\\Properties\\PropertyReflectionFinder' => $baseDir . '/src/Rules/Properties/PropertyReflectionFinder.php',
    'PHPStan\\Rules\\Properties\\ReadingWriteOnlyPropertiesRule' => $baseDir . '/src/Rules/Properties/ReadingWriteOnlyPropertiesRule.php',
    'PHPStan\\Rules\\Properties\\TypesAssignedToPropertiesRule' => $baseDir . '/src/Rules/Properties/TypesAssignedToPropertiesRule.php',
    'PHPStan\\Rules\\Properties\\WritingToReadOnlyPropertiesRule' => $baseDir . '/src/Rules/Properties/WritingToReadOnlyPropertiesRule.php',
    'PHPStan\\Rules\\Regexp\\RegularExpressionPatternRule' => $baseDir . '/src/Rules/Regexp/RegularExpressionPatternRule.php',
    'PHPStan\\Rules\\Registry' => $baseDir . '/src/Rules/Registry.php',
    'PHPStan\\Rules\\RegistryFactory' => $baseDir . '/src/Rules/RegistryFactory.php',
    'PHPStan\\Rules\\Rule' => $baseDir . '/src/Rules/Rule.php',
    'PHPStan\\Rules\\RuleError' => $baseDir . '/src/Rules/RuleError.php',
    'PHPStan\\Rules\\RuleErrorBuilder' => $baseDir . '/src/Rules/RuleErrorBuilder.php',
    'PHPStan\\Rules\\RuleErrors\\RuleErrorWithMessage' => $baseDir . '/src/Rules/RuleErrors/RuleErrorWithMessage.php',
    'PHPStan\\Rules\\RuleErrors\\RuleErrorWithMessageAndFile' => $baseDir . '/src/Rules/RuleErrors/RuleErrorWithMessageAndFile.php',
    'PHPStan\\Rules\\RuleErrors\\RuleErrorWithMessageAndLine' => $baseDir . '/src/Rules/RuleErrors/RuleErrorWithMessageAndLine.php',
    'PHPStan\\Rules\\RuleErrors\\RuleErrorWithMessageAndLineAndFile' => $baseDir . '/src/Rules/RuleErrors/RuleErrorWithMessageAndLineAndFile.php',
    'PHPStan\\Rules\\RuleLevelHelper' => $baseDir . '/src/Rules/RuleLevelHelper.php',
    'PHPStan\\Rules\\UnusedFunctionParametersCheck' => $baseDir . '/src/Rules/UnusedFunctionParametersCheck.php',
    'PHPStan\\Rules\\Variables\\DefinedVariableInAnonymousFunctionUseRule' => $baseDir . '/src/Rules/Variables/DefinedVariableInAnonymousFunctionUseRule.php',
    'PHPStan\\Rules\\Variables\\DefinedVariableRule' => $baseDir . '/src/Rules/Variables/DefinedVariableRule.php',
    'PHPStan\\Rules\\Variables\\ThisVariableRule' => $baseDir . '/src/Rules/Variables/ThisVariableRule.php',
    'PHPStan\\Rules\\Variables\\ThrowTypeRule' => $baseDir . '/src/Rules/Variables/ThrowTypeRule.php',
    'PHPStan\\Rules\\Variables\\VariableCertaintyInIssetRule' => $baseDir . '/src/Rules/Variables/VariableCertaintyInIssetRule.php',
    'PHPStan\\Rules\\Variables\\VariableCloningRule' => $baseDir . '/src/Rules/Variables/VariableCloningRule.php',
    'PHPStan\\ShouldNotHappenException' => $baseDir . '/src/ShouldNotHappenException.php',
    'PHPStan\\Testing\\LevelsTestCase' => $baseDir . '/src/Testing/LevelsTestCase.php',
    'PHPStan\\Testing\\RuleTestCase' => $baseDir . '/src/Testing/RuleTestCase.php',
    'PHPStan\\Testing\\TestCase' => $baseDir . '/src/Testing/TestCase.php',
    'PHPStan\\TrinaryLogic' => $baseDir . '/src/TrinaryLogic.php',
    'PHPStan\\Type\\Accessory\\AccessoryType' => $baseDir . '/src/Type/Accessory/AccessoryType.php',
    'PHPStan\\Type\\Accessory\\HasMethodType' => $baseDir . '/src/Type/Accessory/HasMethodType.php',
    'PHPStan\\Type\\Accessory\\HasOffsetType' => $baseDir . '/src/Type/Accessory/HasOffsetType.php',
    'PHPStan\\Type\\Accessory\\HasPropertyType' => $baseDir . '/src/Type/Accessory/HasPropertyType.php',
    'PHPStan\\Type\\Accessory\\NonEmptyArrayType' => $baseDir . '/src/Type/Accessory/NonEmptyArrayType.php',
    'PHPStan\\Type\\ArrayType' => $baseDir . '/src/Type/ArrayType.php',
    'PHPStan\\Type\\BenevolentUnionType' => $baseDir . '/src/Type/BenevolentUnionType.php',
    'PHPStan\\Type\\BooleanType' => $baseDir . '/src/Type/BooleanType.php',
    'PHPStan\\Type\\CallableType' => $baseDir . '/src/Type/CallableType.php',
    'PHPStan\\Type\\CallableTypeHelper' => $baseDir . '/src/Type/CallableTypeHelper.php',
    'PHPStan\\Type\\ClosureType' => $baseDir . '/src/Type/ClosureType.php',
    'PHPStan\\Type\\CommentHelper' => $baseDir . '/src/Type/CommentHelper.php',
    'PHPStan\\Type\\CompoundType' => $baseDir . '/src/Type/CompoundType.php',
    'PHPStan\\Type\\CompoundTypeHelper' => $baseDir . '/src/Type/CompoundTypeHelper.php',
    'PHPStan\\Type\\ConstantScalarType' => $baseDir . '/src/Type/ConstantScalarType.php',
    'PHPStan\\Type\\ConstantType' => $baseDir . '/src/Type/ConstantType.php',
    'PHPStan\\Type\\Constant\\ConstantArrayType' => $baseDir . '/src/Type/Constant/ConstantArrayType.php',
    'PHPStan\\Type\\Constant\\ConstantArrayTypeAndMethod' => $baseDir . '/src/Type/Constant/ConstantArrayTypeAndMethod.php',
    'PHPStan\\Type\\Constant\\ConstantArrayTypeBuilder' => $baseDir . '/src/Type/Constant/ConstantArrayTypeBuilder.php',
    'PHPStan\\Type\\Constant\\ConstantBooleanType' => $baseDir . '/src/Type/Constant/ConstantBooleanType.php',
    'PHPStan\\Type\\Constant\\ConstantFloatType' => $baseDir . '/src/Type/Constant/ConstantFloatType.php',
    'PHPStan\\Type\\Constant\\ConstantIntegerType' => $baseDir . '/src/Type/Constant/ConstantIntegerType.php',
    'PHPStan\\Type\\Constant\\ConstantScalarToBooleanTrait' => $baseDir . '/src/Type/Constant/ConstantScalarToBooleanTrait.php',
    'PHPStan\\Type\\Constant\\ConstantStringType' => $baseDir . '/src/Type/Constant/ConstantStringType.php',
    'PHPStan\\Type\\DynamicFunctionReturnTypeExtension' => $baseDir . '/src/Type/DynamicFunctionReturnTypeExtension.php',
    'PHPStan\\Type\\DynamicMethodReturnTypeExtension' => $baseDir . '/src/Type/DynamicMethodReturnTypeExtension.php',
    'PHPStan\\Type\\DynamicStaticMethodReturnTypeExtension' => $baseDir . '/src/Type/DynamicStaticMethodReturnTypeExtension.php',
    'PHPStan\\Type\\ErrorType' => $baseDir . '/src/Type/ErrorType.php',
    'PHPStan\\Type\\FileTypeMapper' => $baseDir . '/src/Type/FileTypeMapper.php',
    'PHPStan\\Type\\FloatType' => $baseDir . '/src/Type/FloatType.php',
    'PHPStan\\Type\\FunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/FunctionTypeSpecifyingExtension.php',
    'PHPStan\\Type\\IntegerType' => $baseDir . '/src/Type/IntegerType.php',
    'PHPStan\\Type\\IntersectionType' => $baseDir . '/src/Type/IntersectionType.php',
    'PHPStan\\Type\\IterableType' => $baseDir . '/src/Type/IterableType.php',
    'PHPStan\\Type\\JustNullableTypeTrait' => $baseDir . '/src/Type/JustNullableTypeTrait.php',
    'PHPStan\\Type\\MethodTypeSpecifyingExtension' => $baseDir . '/src/Type/MethodTypeSpecifyingExtension.php',
    'PHPStan\\Type\\MixedType' => $baseDir . '/src/Type/MixedType.php',
    'PHPStan\\Type\\NeverType' => $baseDir . '/src/Type/NeverType.php',
    'PHPStan\\Type\\NonexistentParentClassType' => $baseDir . '/src/Type/NonexistentParentClassType.php',
    'PHPStan\\Type\\NullType' => $baseDir . '/src/Type/NullType.php',
    'PHPStan\\Type\\ObjectType' => $baseDir . '/src/Type/ObjectType.php',
    'PHPStan\\Type\\ObjectWithoutClassType' => $baseDir . '/src/Type/ObjectWithoutClassType.php',
    'PHPStan\\Type\\OperatorTypeSpecifyingExtension' => $baseDir . '/src/Type/OperatorTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\ArgumentBasedFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArgumentBasedFunctionReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\ArrayFillFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayFillFunctionReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\ArrayFillKeysFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayFillKeysFunctionReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\ArrayFilterFunctionReturnTypeReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayFilterFunctionReturnTypeReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\ArrayKeyDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayKeyDynamicReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\ArrayKeyExistsFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/ArrayKeyExistsFunctionTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\ArrayKeyFirstDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayKeyFirstDynamicReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\ArrayKeyLastDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayKeyLastDynamicReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\ArrayKeysFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayKeysFunctionDynamicReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\ArrayMapFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayMapFunctionReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\ArrayMergeFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayMergeFunctionDynamicReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\ArrayPointerFunctionsDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayPointerFunctionsDynamicReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\ArrayPopFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayPopFunctionReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\ArrayReduceFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayReduceFunctionReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\ArraySearchFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ArraySearchFunctionDynamicReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\ArrayShiftFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayShiftFunctionReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\ArraySliceFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArraySliceFunctionReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\ArrayValuesFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayValuesFunctionDynamicReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\AssertFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/AssertFunctionTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\CountFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/CountFunctionReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\CountFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/CountFunctionTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\CurlInitReturnTypeExtension' => $baseDir . '/src/Type/Php/CurlInitReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\DefineConstantTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/DefineConstantTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\DefinedConstantTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/DefinedConstantTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\DioStatDynamicFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/DioStatDynamicFunctionReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\ExplodeFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ExplodeFunctionDynamicReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\FilterVarDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/FilterVarDynamicReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\GetParentClassDynamicFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/GetParentClassDynamicFunctionReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\GettimeofdayDynamicFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/GettimeofdayDynamicFunctionReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\HrtimeFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/HrtimeFunctionReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\InArrayFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/InArrayFunctionTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\IsAFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/IsAFunctionTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\IsArrayFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/IsArrayFunctionTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\IsBoolFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/IsBoolFunctionTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\IsCallableFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/IsCallableFunctionTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\IsCountableFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/IsCountableFunctionTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\IsFloatFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/IsFloatFunctionTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\IsIntFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/IsIntFunctionTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\IsIterableFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/IsIterableFunctionTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\IsNullFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/IsNullFunctionTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\IsNumericFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/IsNumericFunctionTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\IsObjectFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/IsObjectFunctionTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\IsResourceFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/IsResourceFunctionTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\IsScalarFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/IsScalarFunctionTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\IsStringFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/IsStringFunctionTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\IsSubclassOfFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/IsSubclassOfFunctionTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\JsonThrowOnErrorDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/JsonThrowOnErrorDynamicReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\MbFunctionsReturnTypeExtension' => $baseDir . '/src/Type/Php/MbFunctionsReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\MethodExistsTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/MethodExistsTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\MicrotimeFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/MicrotimeFunctionReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\MinMaxFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/MinMaxFunctionReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\ParseUrlFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ParseUrlFunctionDynamicReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\PathinfoFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/PathinfoFunctionDynamicReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\PropertyExistsTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/PropertyExistsTypeSpecifyingExtension.php',
    'PHPStan\\Type\\Php\\RangeFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/RangeFunctionReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\ReplaceFunctionsDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ReplaceFunctionsDynamicReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\SprintfFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/SprintfFunctionDynamicReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\StatDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/StatDynamicReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\StrSplitFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/StrSplitFunctionReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\StrtotimeFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/StrtotimeFunctionReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\TypeSpecifyingFunctionsDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/TypeSpecifyingFunctionsDynamicReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\VarExportFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/VarExportFunctionDynamicReturnTypeExtension.php',
    'PHPStan\\Type\\Php\\VersionCompareFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/VersionCompareFunctionDynamicReturnTypeExtension.php',
    'PHPStan\\Type\\RecursionGuard' => $baseDir . '/src/Type/RecursionGuard.php',
    'PHPStan\\Type\\ResourceType' => $baseDir . '/src/Type/ResourceType.php',
    'PHPStan\\Type\\StaticMethodTypeSpecifyingExtension' => $baseDir . '/src/Type/StaticMethodTypeSpecifyingExtension.php',
    'PHPStan\\Type\\StaticResolvableType' => $baseDir . '/src/Type/StaticResolvableType.php',
    'PHPStan\\Type\\StaticType' => $baseDir . '/src/Type/StaticType.php',
    'PHPStan\\Type\\StringAlwaysAcceptingObjectWithToStringType' => $baseDir . '/src/Type/StringAlwaysAcceptingObjectWithToStringType.php',
    'PHPStan\\Type\\StringType' => $baseDir . '/src/Type/StringType.php',
    'PHPStan\\Type\\SubtractableType' => $baseDir . '/src/Type/SubtractableType.php',
    'PHPStan\\Type\\ThisType' => $baseDir . '/src/Type/ThisType.php',
    'PHPStan\\Type\\Traits\\ConstantScalarTypeTrait' => $baseDir . '/src/Type/Traits/ConstantScalarTypeTrait.php',
    'PHPStan\\Type\\Traits\\FalseyBooleanTypeTrait' => $baseDir . '/src/Type/Traits/FalseyBooleanTypeTrait.php',
    'PHPStan\\Type\\Traits\\MaybeCallableTypeTrait' => $baseDir . '/src/Type/Traits/MaybeCallableTypeTrait.php',
    'PHPStan\\Type\\Traits\\MaybeIterableTypeTrait' => $baseDir . '/src/Type/Traits/MaybeIterableTypeTrait.php',
    'PHPStan\\Type\\Traits\\MaybeObjectTypeTrait' => $baseDir . '/src/Type/Traits/MaybeObjectTypeTrait.php',
    'PHPStan\\Type\\Traits\\MaybeOffsetAccessibleTypeTrait' => $baseDir . '/src/Type/Traits/MaybeOffsetAccessibleTypeTrait.php',
    'PHPStan\\Type\\Traits\\NonCallableTypeTrait' => $baseDir . '/src/Type/Traits/NonCallableTypeTrait.php',
    'PHPStan\\Type\\Traits\\NonIterableTypeTrait' => $baseDir . '/src/Type/Traits/NonIterableTypeTrait.php',
    'PHPStan\\Type\\Traits\\NonObjectTypeTrait' => $baseDir . '/src/Type/Traits/NonObjectTypeTrait.php',
    'PHPStan\\Type\\Traits\\NonOffsetAccessibleTypeTrait' => $baseDir . '/src/Type/Traits/NonOffsetAccessibleTypeTrait.php',
    'PHPStan\\Type\\Traits\\ObjectTypeTrait' => $baseDir . '/src/Type/Traits/ObjectTypeTrait.php',
    'PHPStan\\Type\\Traits\\TruthyBooleanTypeTrait' => $baseDir . '/src/Type/Traits/TruthyBooleanTypeTrait.php',
    'PHPStan\\Type\\Traits\\UndecidedBooleanTypeTrait' => $baseDir . '/src/Type/Traits/UndecidedBooleanTypeTrait.php',
    'PHPStan\\Type\\Type' => $baseDir . '/src/Type/Type.php',
    'PHPStan\\Type\\TypeCombinator' => $baseDir . '/src/Type/TypeCombinator.php',
    'PHPStan\\Type\\TypeUtils' => $baseDir . '/src/Type/TypeUtils.php',
    'PHPStan\\Type\\TypeWithClassName' => $baseDir . '/src/Type/TypeWithClassName.php',
    'PHPStan\\Type\\TypehintHelper' => $baseDir . '/src/Type/TypehintHelper.php',
    'PHPStan\\Type\\UnionType' => $baseDir . '/src/Type/UnionType.php',
    'PHPStan\\Type\\UnionTypeHelper' => $baseDir . '/src/Type/UnionTypeHelper.php',
    'PHPStan\\Type\\VerbosityLevel' => $baseDir . '/src/Type/VerbosityLevel.php',
    'PHPStan\\Type\\VoidType' => $baseDir . '/src/Type/VoidType.php',
    'PhpParser\\Builder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder.php',
    'PhpParser\\BuilderFactory' => $vendorDir . '/nikic/php-parser/lib/PhpParser/BuilderFactory.php',
    'PhpParser\\BuilderHelpers' => $vendorDir . '/nikic/php-parser/lib/PhpParser/BuilderHelpers.php',
    'PhpParser\\Builder\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Class_.php',
    'PhpParser\\Builder\\Declaration' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Declaration.php',
    'PhpParser\\Builder\\FunctionLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php',
    'PhpParser\\Builder\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Function_.php',
    'PhpParser\\Builder\\Interface_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Interface_.php',
    'PhpParser\\Builder\\Method' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Method.php',
    'PhpParser\\Builder\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php',
    'PhpParser\\Builder\\Param' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Param.php',
    'PhpParser\\Builder\\Property' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Property.php',
    'PhpParser\\Builder\\TraitUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php',
    'PhpParser\\Builder\\TraitUseAdaptation' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php',
    'PhpParser\\Builder\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Trait_.php',
    'PhpParser\\Builder\\Use_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Use_.php',
    'PhpParser\\Comment' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Comment.php',
    'PhpParser\\Comment\\Doc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Comment/Doc.php',
    'PhpParser\\ConstExprEvaluationException' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php',
    'PhpParser\\ConstExprEvaluator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php',
    'PhpParser\\Error' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Error.php',
    'PhpParser\\ErrorHandler' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler.php',
    'PhpParser\\ErrorHandler\\Collecting' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php',
    'PhpParser\\ErrorHandler\\Throwing' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php',
    'PhpParser\\Internal\\DiffElem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php',
    'PhpParser\\Internal\\Differ' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/Differ.php',
    'PhpParser\\Internal\\PrintableNewAnonClassNode' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php',
    'PhpParser\\Internal\\TokenStream' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php',
    'PhpParser\\JsonDecoder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/JsonDecoder.php',
    'PhpParser\\Lexer' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer.php',
    'PhpParser\\Lexer\\Emulative' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php',
    'PhpParser\\Lexer\\TokenEmulator\\CoaleseEqualTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php',
    'PhpParser\\Lexer\\TokenEmulator\\FnTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php',
    'PhpParser\\Lexer\\TokenEmulator\\TokenEmulatorInterface' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulatorInterface.php',
    'PhpParser\\NameContext' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NameContext.php',
    'PhpParser\\Node' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node.php',
    'PhpParser\\NodeAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeAbstract.php',
    'PhpParser\\NodeDumper' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeDumper.php',
    'PhpParser\\NodeFinder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeFinder.php',
    'PhpParser\\NodeTraverser' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeTraverser.php',
    'PhpParser\\NodeTraverserInterface' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php',
    'PhpParser\\NodeVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor.php',
    'PhpParser\\NodeVisitorAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php',
    'PhpParser\\NodeVisitor\\CloningVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php',
    'PhpParser\\NodeVisitor\\FindingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php',
    'PhpParser\\NodeVisitor\\FirstFindingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php',
    'PhpParser\\NodeVisitor\\NameResolver' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php',
    'PhpParser\\Node\\Arg' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Arg.php',
    'PhpParser\\Node\\Const_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Const_.php',
    'PhpParser\\Node\\Expr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr.php',
    'PhpParser\\Node\\Expr\\ArrayDimFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php',
    'PhpParser\\Node\\Expr\\ArrayItem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php',
    'PhpParser\\Node\\Expr\\Array_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php',
    'PhpParser\\Node\\Expr\\ArrowFunction' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php',
    'PhpParser\\Node\\Expr\\Assign' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php',
    'PhpParser\\Node\\Expr\\AssignOp' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php',
    'PhpParser\\Node\\Expr\\AssignOp\\BitwiseAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php',
    'PhpParser\\Node\\Expr\\AssignOp\\BitwiseOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php',
    'PhpParser\\Node\\Expr\\AssignOp\\BitwiseXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php',
    'PhpParser\\Node\\Expr\\AssignOp\\Coalesce' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php',
    'PhpParser\\Node\\Expr\\AssignOp\\Concat' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php',
    'PhpParser\\Node\\Expr\\AssignOp\\Div' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php',
    'PhpParser\\Node\\Expr\\AssignOp\\Minus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php',
    'PhpParser\\Node\\Expr\\AssignOp\\Mod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php',
    'PhpParser\\Node\\Expr\\AssignOp\\Mul' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php',
    'PhpParser\\Node\\Expr\\AssignOp\\Plus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php',
    'PhpParser\\Node\\Expr\\AssignOp\\Pow' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php',
    'PhpParser\\Node\\Expr\\AssignOp\\ShiftLeft' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php',
    'PhpParser\\Node\\Expr\\AssignOp\\ShiftRight' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php',
    'PhpParser\\Node\\Expr\\AssignRef' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php',
    'PhpParser\\Node\\Expr\\BinaryOp' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\BooleanAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\BooleanOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\Coalesce' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\Concat' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\Div' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\Equal' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\Greater' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\GreaterOrEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\Identical' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\LogicalAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\LogicalOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\LogicalXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\Minus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\Mod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\Mul' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\NotEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\NotIdentical' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\Plus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\Pow' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\ShiftLeft' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\ShiftRight' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\Smaller' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\SmallerOrEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php',
    'PhpParser\\Node\\Expr\\BinaryOp\\Spaceship' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php',
    'PhpParser\\Node\\Expr\\BitwiseNot' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php',
    'PhpParser\\Node\\Expr\\BooleanNot' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php',
    'PhpParser\\Node\\Expr\\Cast' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php',
    'PhpParser\\Node\\Expr\\Cast\\Array_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php',
    'PhpParser\\Node\\Expr\\Cast\\Bool_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php',
    'PhpParser\\Node\\Expr\\Cast\\Double' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php',
    'PhpParser\\Node\\Expr\\Cast\\Int_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php',
    'PhpParser\\Node\\Expr\\Cast\\Object_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php',
    'PhpParser\\Node\\Expr\\Cast\\String_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php',
    'PhpParser\\Node\\Expr\\Cast\\Unset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php',
    'PhpParser\\Node\\Expr\\ClassConstFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php',
    'PhpParser\\Node\\Expr\\Clone_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php',
    'PhpParser\\Node\\Expr\\Closure' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php',
    'PhpParser\\Node\\Expr\\ClosureUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php',
    'PhpParser\\Node\\Expr\\ConstFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php',
    'PhpParser\\Node\\Expr\\Empty_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php',
    'PhpParser\\Node\\Expr\\Error' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php',
    'PhpParser\\Node\\Expr\\ErrorSuppress' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php',
    'PhpParser\\Node\\Expr\\Eval_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php',
    'PhpParser\\Node\\Expr\\Exit_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php',
    'PhpParser\\Node\\Expr\\FuncCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php',
    'PhpParser\\Node\\Expr\\Include_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php',
    'PhpParser\\Node\\Expr\\Instanceof_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php',
    'PhpParser\\Node\\Expr\\Isset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php',
    'PhpParser\\Node\\Expr\\List_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php',
    'PhpParser\\Node\\Expr\\MethodCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php',
    'PhpParser\\Node\\Expr\\New_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php',
    'PhpParser\\Node\\Expr\\PostDec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php',
    'PhpParser\\Node\\Expr\\PostInc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php',
    'PhpParser\\Node\\Expr\\PreDec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php',
    'PhpParser\\Node\\Expr\\PreInc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php',
    'PhpParser\\Node\\Expr\\Print_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php',
    'PhpParser\\Node\\Expr\\PropertyFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php',
    'PhpParser\\Node\\Expr\\ShellExec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php',
    'PhpParser\\Node\\Expr\\StaticCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php',
    'PhpParser\\Node\\Expr\\StaticPropertyFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php',
    'PhpParser\\Node\\Expr\\Ternary' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php',
    'PhpParser\\Node\\Expr\\UnaryMinus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php',
    'PhpParser\\Node\\Expr\\UnaryPlus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php',
    'PhpParser\\Node\\Expr\\Variable' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php',
    'PhpParser\\Node\\Expr\\YieldFrom' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php',
    'PhpParser\\Node\\Expr\\Yield_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php',
    'PhpParser\\Node\\FunctionLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php',
    'PhpParser\\Node\\Identifier' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Identifier.php',
    'PhpParser\\Node\\Name' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name.php',
    'PhpParser\\Node\\Name\\FullyQualified' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php',
    'PhpParser\\Node\\Name\\Relative' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php',
    'PhpParser\\Node\\NullableType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/NullableType.php',
    'PhpParser\\Node\\Param' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Param.php',
    'PhpParser\\Node\\Scalar' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar.php',
    'PhpParser\\Node\\Scalar\\DNumber' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php',
    'PhpParser\\Node\\Scalar\\Encapsed' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php',
    'PhpParser\\Node\\Scalar\\EncapsedStringPart' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php',
    'PhpParser\\Node\\Scalar\\LNumber' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php',
    'PhpParser\\Node\\Scalar\\MagicConst' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php',
    'PhpParser\\Node\\Scalar\\MagicConst\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php',
    'PhpParser\\Node\\Scalar\\MagicConst\\Dir' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php',
    'PhpParser\\Node\\Scalar\\MagicConst\\File' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php',
    'PhpParser\\Node\\Scalar\\MagicConst\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php',
    'PhpParser\\Node\\Scalar\\MagicConst\\Line' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php',
    'PhpParser\\Node\\Scalar\\MagicConst\\Method' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php',
    'PhpParser\\Node\\Scalar\\MagicConst\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php',
    'PhpParser\\Node\\Scalar\\MagicConst\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php',
    'PhpParser\\Node\\Scalar\\String_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php',
    'PhpParser\\Node\\Stmt' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt.php',
    'PhpParser\\Node\\Stmt\\Break_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php',
    'PhpParser\\Node\\Stmt\\Case_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php',
    'PhpParser\\Node\\Stmt\\Catch_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php',
    'PhpParser\\Node\\Stmt\\ClassConst' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php',
    'PhpParser\\Node\\Stmt\\ClassLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php',
    'PhpParser\\Node\\Stmt\\ClassMethod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php',
    'PhpParser\\Node\\Stmt\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php',
    'PhpParser\\Node\\Stmt\\Const_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php',
    'PhpParser\\Node\\Stmt\\Continue_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php',
    'PhpParser\\Node\\Stmt\\DeclareDeclare' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php',
    'PhpParser\\Node\\Stmt\\Declare_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php',
    'PhpParser\\Node\\Stmt\\Do_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php',
    'PhpParser\\Node\\Stmt\\Echo_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php',
    'PhpParser\\Node\\Stmt\\ElseIf_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php',
    'PhpParser\\Node\\Stmt\\Else_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php',
    'PhpParser\\Node\\Stmt\\Expression' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php',
    'PhpParser\\Node\\Stmt\\Finally_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php',
    'PhpParser\\Node\\Stmt\\For_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php',
    'PhpParser\\Node\\Stmt\\Foreach_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php',
    'PhpParser\\Node\\Stmt\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php',
    'PhpParser\\Node\\Stmt\\Global_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php',
    'PhpParser\\Node\\Stmt\\Goto_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php',
    'PhpParser\\Node\\Stmt\\GroupUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php',
    'PhpParser\\Node\\Stmt\\HaltCompiler' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php',
    'PhpParser\\Node\\Stmt\\If_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php',
    'PhpParser\\Node\\Stmt\\InlineHTML' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php',
    'PhpParser\\Node\\Stmt\\Interface_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php',
    'PhpParser\\Node\\Stmt\\Label' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php',
    'PhpParser\\Node\\Stmt\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php',
    'PhpParser\\Node\\Stmt\\Nop' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php',
    'PhpParser\\Node\\Stmt\\Property' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php',
    'PhpParser\\Node\\Stmt\\PropertyProperty' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php',
    'PhpParser\\Node\\Stmt\\Return_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php',
    'PhpParser\\Node\\Stmt\\StaticVar' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php',
    'PhpParser\\Node\\Stmt\\Static_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php',
    'PhpParser\\Node\\Stmt\\Switch_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php',
    'PhpParser\\Node\\Stmt\\Throw_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php',
    'PhpParser\\Node\\Stmt\\TraitUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php',
    'PhpParser\\Node\\Stmt\\TraitUseAdaptation' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php',
    'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Alias' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php',
    'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Precedence' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php',
    'PhpParser\\Node\\Stmt\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php',
    'PhpParser\\Node\\Stmt\\TryCatch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php',
    'PhpParser\\Node\\Stmt\\Unset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php',
    'PhpParser\\Node\\Stmt\\UseUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php',
    'PhpParser\\Node\\Stmt\\Use_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php',
    'PhpParser\\Node\\Stmt\\While_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php',
    'PhpParser\\Node\\VarLikeIdentifier' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php',
    'PhpParser\\Parser' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser.php',
    'PhpParser\\ParserAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ParserAbstract.php',
    'PhpParser\\ParserFactory' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ParserFactory.php',
    'PhpParser\\Parser\\Multiple' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Multiple.php',
    'PhpParser\\Parser\\Php5' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Php5.php',
    'PhpParser\\Parser\\Php7' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Php7.php',
    'PhpParser\\Parser\\Tokens' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Tokens.php',
    'PhpParser\\PrettyPrinterAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php',
    'PhpParser\\PrettyPrinter\\Standard' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php',
    '_HumbugBoxb94336daae36\\Composer\\XdebugHandler\\PhpConfig' => $vendorDir . '/composer/xdebug-handler/src/PhpConfig.php',
    '_HumbugBoxb94336daae36\\Composer\\XdebugHandler\\Process' => $vendorDir . '/composer/xdebug-handler/src/Process.php',
    '_HumbugBoxb94336daae36\\Composer\\XdebugHandler\\Status' => $vendorDir . '/composer/xdebug-handler/src/Status.php',
    '_HumbugBoxb94336daae36\\Composer\\XdebugHandler\\XdebugHandler' => $vendorDir . '/composer/xdebug-handler/src/XdebugHandler.php',
    '_HumbugBoxb94336daae36\\DG\\ComposerCleaner\\Cleaner' => $vendorDir . '/dg/composer-cleaner/src/ComposerCleaner/Cleaner.php',
    '_HumbugBoxb94336daae36\\DG\\ComposerCleaner\\Plugin' => $vendorDir . '/dg/composer-cleaner/src/ComposerCleaner/Plugin.php',
    '_HumbugBoxb94336daae36\\Jean85\\PrettyVersions' => $vendorDir . '/jean85/pretty-package-versions/src/PrettyVersions.php',
    '_HumbugBoxb94336daae36\\Jean85\\Version' => $vendorDir . '/jean85/pretty-package-versions/src/Version.php',
    '_HumbugBoxb94336daae36\\Nette\\ArgumentOutOfRangeException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
    '_HumbugBoxb94336daae36\\Nette\\Bridges\\DITracy\\ContainerPanel' => $vendorDir . '/nette/di/src/Bridges/DITracy/ContainerPanel.php',
    '_HumbugBoxb94336daae36\\Nette\\Configurator' => $vendorDir . '/nette/bootstrap/src/Bootstrap/Configurator.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Autowiring' => $vendorDir . '/nette/di/src/DI/Autowiring.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Compiler' => $vendorDir . '/nette/di/src/DI/Compiler.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\CompilerExtension' => $vendorDir . '/nette/di/src/DI/CompilerExtension.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Config\\Adapter' => $vendorDir . '/nette/di/src/DI/Config/Adapter.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Config\\Adapters\\NeonAdapter' => $vendorDir . '/nette/di/src/DI/Config/Adapters/NeonAdapter.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Config\\Adapters\\PhpAdapter' => $vendorDir . '/nette/di/src/DI/Config/Adapters/PhpAdapter.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Config\\DefinitionSchema' => $vendorDir . '/nette/di/src/DI/Config/DefinitionSchema.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Config\\Helpers' => $vendorDir . '/nette/di/src/DI/Config/Helpers.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Config\\Loader' => $vendorDir . '/nette/di/src/DI/Config/Loader.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Container' => $vendorDir . '/nette/di/src/DI/Container.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\ContainerBuilder' => $vendorDir . '/nette/di/src/DI/ContainerBuilder.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\ContainerLoader' => $vendorDir . '/nette/di/src/DI/ContainerLoader.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Definitions\\AccessorDefinition' => $vendorDir . '/nette/di/src/DI/Definitions/AccessorDefinition.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Definitions\\Definition' => $vendorDir . '/nette/di/src/DI/Definitions/Definition.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Definitions\\FactoryDefinition' => $vendorDir . '/nette/di/src/DI/Definitions/FactoryDefinition.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Definitions\\ImportedDefinition' => $vendorDir . '/nette/di/src/DI/Definitions/ImportedDefinition.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Definitions\\LocatorDefinition' => $vendorDir . '/nette/di/src/DI/Definitions/LocatorDefinition.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Definitions\\Reference' => $vendorDir . '/nette/di/src/DI/Definitions/Reference.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Definitions\\ServiceDefinition' => $vendorDir . '/nette/di/src/DI/Definitions/ServiceDefinition.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Definitions\\Statement' => $vendorDir . '/nette/di/src/DI/Definitions/Statement.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\DependencyChecker' => $vendorDir . '/nette/di/src/DI/DependencyChecker.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\DynamicParameter' => $vendorDir . '/nette/di/src/DI/DynamicParameter.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Extensions\\ConstantsExtension' => $vendorDir . '/nette/di/src/DI/Extensions/ConstantsExtension.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Extensions\\DIExtension' => $vendorDir . '/nette/di/src/DI/Extensions/DIExtension.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Extensions\\DecoratorExtension' => $vendorDir . '/nette/di/src/DI/Extensions/DecoratorExtension.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Extensions\\ExtensionsExtension' => $vendorDir . '/nette/di/src/DI/Extensions/ExtensionsExtension.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Extensions\\InjectExtension' => $vendorDir . '/nette/di/src/DI/Extensions/InjectExtension.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Extensions\\ParametersExtension' => $vendorDir . '/nette/di/src/DI/Extensions/ParametersExtension.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Extensions\\PhpExtension' => $vendorDir . '/nette/di/src/DI/Extensions/PhpExtension.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Extensions\\SearchExtension' => $vendorDir . '/nette/di/src/DI/Extensions/SearchExtension.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Extensions\\ServicesExtension' => $vendorDir . '/nette/di/src/DI/Extensions/ServicesExtension.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Helpers' => $vendorDir . '/nette/di/src/DI/Helpers.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\InvalidConfigurationException' => $vendorDir . '/nette/di/src/DI/exceptions.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\MissingServiceException' => $vendorDir . '/nette/di/src/DI/exceptions.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\NotAllowedDuringResolvingException' => $vendorDir . '/nette/di/src/DI/exceptions.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\PhpGenerator' => $vendorDir . '/nette/di/src/DI/PhpGenerator.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\Resolver' => $vendorDir . '/nette/di/src/DI/Resolver.php',
    '_HumbugBoxb94336daae36\\Nette\\DI\\ServiceCreationException' => $vendorDir . '/nette/di/src/DI/exceptions.php',
    '_HumbugBoxb94336daae36\\Nette\\DeprecatedException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
    '_HumbugBoxb94336daae36\\Nette\\DirectoryNotFoundException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
    '_HumbugBoxb94336daae36\\Nette\\FileNotFoundException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
    '_HumbugBoxb94336daae36\\Nette\\IOException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
    '_HumbugBoxb94336daae36\\Nette\\InvalidArgumentException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
    '_HumbugBoxb94336daae36\\Nette\\InvalidStateException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
    '_HumbugBoxb94336daae36\\Nette\\Iterators\\CachingIterator' => $vendorDir . '/nette/utils/src/Iterators/CachingIterator.php',
    '_HumbugBoxb94336daae36\\Nette\\Iterators\\Mapper' => $vendorDir . '/nette/utils/src/Iterators/Mapper.php',
    '_HumbugBoxb94336daae36\\Nette\\Loaders\\RobotLoader' => $vendorDir . '/nette/robot-loader/src/RobotLoader/RobotLoader.php',
    '_HumbugBoxb94336daae36\\Nette\\Localization\\ITranslator' => $vendorDir . '/nette/utils/src/Utils/ITranslator.php',
    '_HumbugBoxb94336daae36\\Nette\\MemberAccessException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
    '_HumbugBoxb94336daae36\\Nette\\Neon\\Decoder' => $vendorDir . '/nette/neon/src/Neon/Decoder.php',
    '_HumbugBoxb94336daae36\\Nette\\Neon\\Encoder' => $vendorDir . '/nette/neon/src/Neon/Encoder.php',
    '_HumbugBoxb94336daae36\\Nette\\Neon\\Entity' => $vendorDir . '/nette/neon/src/Neon/Entity.php',
    '_HumbugBoxb94336daae36\\Nette\\Neon\\Exception' => $vendorDir . '/nette/neon/src/Neon/Exception.php',
    '_HumbugBoxb94336daae36\\Nette\\Neon\\Neon' => $vendorDir . '/nette/neon/src/Neon/Neon.php',
    '_HumbugBoxb94336daae36\\Nette\\NotImplementedException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
    '_HumbugBoxb94336daae36\\Nette\\NotSupportedException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
    '_HumbugBoxb94336daae36\\Nette\\OutOfRangeException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
    '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\ClassType' => $vendorDir . '/nette/php-generator/src/PhpGenerator/ClassType.php',
    '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Closure' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Closure.php',
    '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Constant' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Constant.php',
    '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Factory' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Factory.php',
    '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\GlobalFunction' => $vendorDir . '/nette/php-generator/src/PhpGenerator/GlobalFunction.php',
    '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Helpers' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Helpers.php',
    '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Method' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Method.php',
    '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Parameter' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Parameter.php',
    '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\PhpFile' => $vendorDir . '/nette/php-generator/src/PhpGenerator/PhpFile.php',
    '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\PhpLiteral' => $vendorDir . '/nette/php-generator/src/PhpGenerator/PhpLiteral.php',
    '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\PhpNamespace' => $vendorDir . '/nette/php-generator/src/PhpGenerator/PhpNamespace.php',
    '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Printer' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Printer.php',
    '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Property' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Property.php',
    '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\PsrPrinter' => $vendorDir . '/nette/php-generator/src/PhpGenerator/PsrPrinter.php',
    '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Traits\\CommentAware' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Traits/CommentAware.php',
    '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Traits\\FunctionLike' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Traits/FunctionLike.php',
    '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Traits\\NameAware' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Traits/NameAware.php',
    '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Traits\\VisibilityAware' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Traits/VisibilityAware.php',
    '_HumbugBoxb94336daae36\\Nette\\Schema\\Context' => $vendorDir . '/nette/schema/src/Schema/Context.php',
    '_HumbugBoxb94336daae36\\Nette\\Schema\\DynamicParameter' => $vendorDir . '/nette/schema/src/Schema/DynamicParameter.php',
    '_HumbugBoxb94336daae36\\Nette\\Schema\\Elements\\AnyOf' => $vendorDir . '/nette/schema/src/Schema/Elements/AnyOf.php',
    '_HumbugBoxb94336daae36\\Nette\\Schema\\Elements\\Base' => $vendorDir . '/nette/schema/src/Schema/Elements/Base.php',
    '_HumbugBoxb94336daae36\\Nette\\Schema\\Elements\\Structure' => $vendorDir . '/nette/schema/src/Schema/Elements/Structure.php',
    '_HumbugBoxb94336daae36\\Nette\\Schema\\Elements\\Type' => $vendorDir . '/nette/schema/src/Schema/Elements/Type.php',
    '_HumbugBoxb94336daae36\\Nette\\Schema\\Expect' => $vendorDir . '/nette/schema/src/Schema/Expect.php',
    '_HumbugBoxb94336daae36\\Nette\\Schema\\Helpers' => $vendorDir . '/nette/schema/src/Schema/Helpers.php',
    '_HumbugBoxb94336daae36\\Nette\\Schema\\Processor' => $vendorDir . '/nette/schema/src/Schema/Processor.php',
    '_HumbugBoxb94336daae36\\Nette\\Schema\\Schema' => $vendorDir . '/nette/schema/src/Schema/Schema.php',
    '_HumbugBoxb94336daae36\\Nette\\Schema\\ValidationException' => $vendorDir . '/nette/schema/src/Schema/ValidationException.php',
    '_HumbugBoxb94336daae36\\Nette\\SmartObject' => $vendorDir . '/nette/utils/src/Utils/SmartObject.php',
    '_HumbugBoxb94336daae36\\Nette\\StaticClass' => $vendorDir . '/nette/utils/src/Utils/StaticClass.php',
    '_HumbugBoxb94336daae36\\Nette\\UnexpectedValueException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
    '_HumbugBoxb94336daae36\\Nette\\Utils\\ArrayHash' => $vendorDir . '/nette/utils/src/Utils/ArrayHash.php',
    '_HumbugBoxb94336daae36\\Nette\\Utils\\ArrayList' => $vendorDir . '/nette/utils/src/Utils/ArrayList.php',
    '_HumbugBoxb94336daae36\\Nette\\Utils\\Arrays' => $vendorDir . '/nette/utils/src/Utils/Arrays.php',
    '_HumbugBoxb94336daae36\\Nette\\Utils\\AssertionException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
    '_HumbugBoxb94336daae36\\Nette\\Utils\\Callback' => $vendorDir . '/nette/utils/src/Utils/Callback.php',
    '_HumbugBoxb94336daae36\\Nette\\Utils\\DateTime' => $vendorDir . '/nette/utils/src/Utils/DateTime.php',
    '_HumbugBoxb94336daae36\\Nette\\Utils\\FileSystem' => $vendorDir . '/nette/utils/src/Utils/FileSystem.php',
    '_HumbugBoxb94336daae36\\Nette\\Utils\\Finder' => $vendorDir . '/nette/finder/src/Utils/Finder.php',
    '_HumbugBoxb94336daae36\\Nette\\Utils\\Html' => $vendorDir . '/nette/utils/src/Utils/Html.php',
    '_HumbugBoxb94336daae36\\Nette\\Utils\\IHtmlString' => $vendorDir . '/nette/utils/src/Utils/IHtmlString.php',
    '_HumbugBoxb94336daae36\\Nette\\Utils\\Image' => $vendorDir . '/nette/utils/src/Utils/Image.php',
    '_HumbugBoxb94336daae36\\Nette\\Utils\\ImageException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
    '_HumbugBoxb94336daae36\\Nette\\Utils\\Json' => $vendorDir . '/nette/utils/src/Utils/Json.php',
    '_HumbugBoxb94336daae36\\Nette\\Utils\\JsonException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
    '_HumbugBoxb94336daae36\\Nette\\Utils\\ObjectHelpers' => $vendorDir . '/nette/utils/src/Utils/ObjectHelpers.php',
    '_HumbugBoxb94336daae36\\Nette\\Utils\\ObjectMixin' => $vendorDir . '/nette/utils/src/Utils/ObjectMixin.php',
    '_HumbugBoxb94336daae36\\Nette\\Utils\\Paginator' => $vendorDir . '/nette/utils/src/Utils/Paginator.php',
    '_HumbugBoxb94336daae36\\Nette\\Utils\\Random' => $vendorDir . '/nette/utils/src/Utils/Random.php',
    '_HumbugBoxb94336daae36\\Nette\\Utils\\Reflection' => $vendorDir . '/nette/utils/src/Utils/Reflection.php',
    '_HumbugBoxb94336daae36\\Nette\\Utils\\RegexpException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
    '_HumbugBoxb94336daae36\\Nette\\Utils\\Strings' => $vendorDir . '/nette/utils/src/Utils/Strings.php',
    '_HumbugBoxb94336daae36\\Nette\\Utils\\UnknownImageFileException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
    '_HumbugBoxb94336daae36\\Nette\\Utils\\Validators' => $vendorDir . '/nette/utils/src/Utils/Validators.php',
    '_HumbugBoxb94336daae36\\PackageVersions\\FallbackVersions' => $vendorDir . '/ocramius/package-versions/src/PackageVersions/FallbackVersions.php',
    '_HumbugBoxb94336daae36\\PackageVersions\\Installer' => $vendorDir . '/ocramius/package-versions/src/PackageVersions/Installer.php',
    '_HumbugBoxb94336daae36\\PackageVersions\\Versions' => $vendorDir . '/ocramius/package-versions/src/PackageVersions/Versions.php',
    '_HumbugBoxb94336daae36\\Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/Psr/Log/AbstractLogger.php',
    '_HumbugBoxb94336daae36\\Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/Psr/Log/InvalidArgumentException.php',
    '_HumbugBoxb94336daae36\\Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/Psr/Log/LogLevel.php',
    '_HumbugBoxb94336daae36\\Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareInterface.php',
    '_HumbugBoxb94336daae36\\Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareTrait.php',
    '_HumbugBoxb94336daae36\\Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerInterface.php',
    '_HumbugBoxb94336daae36\\Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerTrait.php',
    '_HumbugBoxb94336daae36\\Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php',
    '_HumbugBoxb94336daae36\\Psr\\Log\\Test\\DummyTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
    '_HumbugBoxb94336daae36\\Psr\\Log\\Test\\LoggerInterfaceTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
    '_HumbugBoxb94336daae36\\Psr\\Log\\Test\\TestLogger' => $vendorDir . '/psr/log/Psr/Log/Test/TestLogger.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Application' => $vendorDir . '/symfony/console/Application.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => $vendorDir . '/symfony/console/CommandLoader/CommandLoaderInterface.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/ContainerCommandLoader.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/FactoryCommandLoader.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Command\\Command' => $vendorDir . '/symfony/console/Command/Command.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Command\\HelpCommand' => $vendorDir . '/symfony/console/Command/HelpCommand.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Command\\ListCommand' => $vendorDir . '/symfony/console/Command/ListCommand.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Command\\LockableTrait' => $vendorDir . '/symfony/console/Command/LockableTrait.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\ConsoleEvents' => $vendorDir . '/symfony/console/ConsoleEvents.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => $vendorDir . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => $vendorDir . '/symfony/console/Descriptor/ApplicationDescription.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Descriptor\\Descriptor' => $vendorDir . '/symfony/console/Descriptor/Descriptor.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => $vendorDir . '/symfony/console/Descriptor/DescriptorInterface.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => $vendorDir . '/symfony/console/Descriptor/JsonDescriptor.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => $vendorDir . '/symfony/console/Descriptor/MarkdownDescriptor.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => $vendorDir . '/symfony/console/Descriptor/TextDescriptor.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => $vendorDir . '/symfony/console/Descriptor/XmlDescriptor.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\EventListener\\ErrorListener' => $vendorDir . '/symfony/console/EventListener/ErrorListener.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => $vendorDir . '/symfony/console/Event/ConsoleCommandEvent.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Event\\ConsoleErrorEvent' => $vendorDir . '/symfony/console/Event/ConsoleErrorEvent.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Event\\ConsoleEvent' => $vendorDir . '/symfony/console/Event/ConsoleEvent.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Event\\ConsoleExceptionEvent' => $vendorDir . '/symfony/console/Event/ConsoleExceptionEvent.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => $vendorDir . '/symfony/console/Event/ConsoleTerminateEvent.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => $vendorDir . '/symfony/console/Exception/CommandNotFoundException.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/console/Exception/ExceptionInterface.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/console/Exception/InvalidArgumentException.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Exception\\InvalidOptionException' => $vendorDir . '/symfony/console/Exception/InvalidOptionException.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Exception\\LogicException' => $vendorDir . '/symfony/console/Exception/LogicException.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Exception\\RuntimeException' => $vendorDir . '/symfony/console/Exception/RuntimeException.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Formatter\\OutputFormatter' => $vendorDir . '/symfony/console/Formatter/OutputFormatter.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterInterface.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyle.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleInterface.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleStack.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => $vendorDir . '/symfony/console/Helper/DebugFormatterHelper.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\DescriptorHelper' => $vendorDir . '/symfony/console/Helper/DescriptorHelper.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\FormatterHelper' => $vendorDir . '/symfony/console/Helper/FormatterHelper.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\Helper' => $vendorDir . '/symfony/console/Helper/Helper.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\HelperInterface' => $vendorDir . '/symfony/console/Helper/HelperInterface.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\HelperSet' => $vendorDir . '/symfony/console/Helper/HelperSet.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\InputAwareHelper' => $vendorDir . '/symfony/console/Helper/InputAwareHelper.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\ProcessHelper' => $vendorDir . '/symfony/console/Helper/ProcessHelper.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\ProgressBar' => $vendorDir . '/symfony/console/Helper/ProgressBar.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\ProgressIndicator' => $vendorDir . '/symfony/console/Helper/ProgressIndicator.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\QuestionHelper' => $vendorDir . '/symfony/console/Helper/QuestionHelper.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => $vendorDir . '/symfony/console/Helper/SymfonyQuestionHelper.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\Table' => $vendorDir . '/symfony/console/Helper/Table.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\TableCell' => $vendorDir . '/symfony/console/Helper/TableCell.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\TableSeparator' => $vendorDir . '/symfony/console/Helper/TableSeparator.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\TableStyle' => $vendorDir . '/symfony/console/Helper/TableStyle.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Input\\ArgvInput' => $vendorDir . '/symfony/console/Input/ArgvInput.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Input\\ArrayInput' => $vendorDir . '/symfony/console/Input/ArrayInput.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Input\\Input' => $vendorDir . '/symfony/console/Input/Input.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Input\\InputArgument' => $vendorDir . '/symfony/console/Input/InputArgument.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Input\\InputAwareInterface' => $vendorDir . '/symfony/console/Input/InputAwareInterface.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Input\\InputDefinition' => $vendorDir . '/symfony/console/Input/InputDefinition.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Input\\InputInterface' => $vendorDir . '/symfony/console/Input/InputInterface.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Input\\InputOption' => $vendorDir . '/symfony/console/Input/InputOption.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Input\\StreamableInputInterface' => $vendorDir . '/symfony/console/Input/StreamableInputInterface.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Input\\StringInput' => $vendorDir . '/symfony/console/Input/StringInput.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Logger\\ConsoleLogger' => $vendorDir . '/symfony/console/Logger/ConsoleLogger.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Output\\BufferedOutput' => $vendorDir . '/symfony/console/Output/BufferedOutput.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Output\\ConsoleOutput' => $vendorDir . '/symfony/console/Output/ConsoleOutput.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => $vendorDir . '/symfony/console/Output/ConsoleOutputInterface.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Output\\NullOutput' => $vendorDir . '/symfony/console/Output/NullOutput.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Output\\Output' => $vendorDir . '/symfony/console/Output/Output.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Output\\OutputInterface' => $vendorDir . '/symfony/console/Output/OutputInterface.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Output\\StreamOutput' => $vendorDir . '/symfony/console/Output/StreamOutput.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Question\\ChoiceQuestion' => $vendorDir . '/symfony/console/Question/ChoiceQuestion.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => $vendorDir . '/symfony/console/Question/ConfirmationQuestion.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Question\\Question' => $vendorDir . '/symfony/console/Question/Question.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Style\\OutputStyle' => $vendorDir . '/symfony/console/Style/OutputStyle.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Style\\StyleInterface' => $vendorDir . '/symfony/console/Style/StyleInterface.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Style\\SymfonyStyle' => $vendorDir . '/symfony/console/Style/SymfonyStyle.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Terminal' => $vendorDir . '/symfony/console/Terminal.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Tester\\ApplicationTester' => $vendorDir . '/symfony/console/Tester/ApplicationTester.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Tester\\CommandTester' => $vendorDir . '/symfony/console/Tester/CommandTester.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\BufferingLogger' => $vendorDir . '/symfony/debug/BufferingLogger.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\Debug' => $vendorDir . '/symfony/debug/Debug.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\DebugClassLoader' => $vendorDir . '/symfony/debug/DebugClassLoader.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\ErrorHandler' => $vendorDir . '/symfony/debug/ErrorHandler.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\ExceptionHandler' => $vendorDir . '/symfony/debug/ExceptionHandler.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\Exception\\ClassNotFoundException' => $vendorDir . '/symfony/debug/Exception/ClassNotFoundException.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\Exception\\ContextErrorException' => $vendorDir . '/symfony/debug/Exception/ContextErrorException.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\Exception\\FatalErrorException' => $vendorDir . '/symfony/debug/Exception/FatalErrorException.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\Exception\\FatalThrowableError' => $vendorDir . '/symfony/debug/Exception/FatalThrowableError.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\Exception\\FlattenException' => $vendorDir . '/symfony/debug/Exception/FlattenException.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\Exception\\OutOfMemoryException' => $vendorDir . '/symfony/debug/Exception/OutOfMemoryException.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\Exception\\SilencedErrorContext' => $vendorDir . '/symfony/debug/Exception/SilencedErrorContext.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\Exception\\UndefinedFunctionException' => $vendorDir . '/symfony/debug/Exception/UndefinedFunctionException.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\Exception\\UndefinedMethodException' => $vendorDir . '/symfony/debug/Exception/UndefinedMethodException.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\FatalErrorHandler\\ClassNotFoundFatalErrorHandler' => $vendorDir . '/symfony/debug/FatalErrorHandler/ClassNotFoundFatalErrorHandler.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\FatalErrorHandler\\FatalErrorHandlerInterface' => $vendorDir . '/symfony/debug/FatalErrorHandler/FatalErrorHandlerInterface.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\FatalErrorHandler\\UndefinedFunctionFatalErrorHandler' => $vendorDir . '/symfony/debug/FatalErrorHandler/UndefinedFunctionFatalErrorHandler.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\FatalErrorHandler\\UndefinedMethodFatalErrorHandler' => $vendorDir . '/symfony/debug/FatalErrorHandler/UndefinedMethodFatalErrorHandler.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Comparator\\Comparator' => $vendorDir . '/symfony/finder/Comparator/Comparator.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Comparator\\DateComparator' => $vendorDir . '/symfony/finder/Comparator/DateComparator.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Comparator\\NumberComparator' => $vendorDir . '/symfony/finder/Comparator/NumberComparator.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => $vendorDir . '/symfony/finder/Exception/AccessDeniedException.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/finder/Exception/ExceptionInterface.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Finder' => $vendorDir . '/symfony/finder/Finder.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Glob' => $vendorDir . '/symfony/finder/Glob.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => $vendorDir . '/symfony/finder/Iterator/CustomFilterIterator.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DateRangeFilterIterator.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DepthRangeFilterIterator.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => $vendorDir . '/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FileTypeFilterIterator.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilecontentFilterIterator.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilenameFilterIterator.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\FilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilterIterator.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => $vendorDir . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => $vendorDir . '/symfony/finder/Iterator/PathFilterIterator.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => $vendorDir . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/SizeRangeFilterIterator.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\SortableIterator' => $vendorDir . '/symfony/finder/Iterator/SortableIterator.php',
    '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\SplFileInfo' => $vendorDir . '/symfony/finder/SplFileInfo.php',
    '_HumbugBoxb94336daae36\\Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php',
);
<?php

// autoload_static.php @generated by Composer

namespace Composer\Autoload;

class ComposerStaticInit6dce0c234fc32484ec6b4f3a33bb4a6f
{
    public static $files = array (
        '59af96974553a1fc6407327354b6f47e' => __DIR__ . '/..' . '/nette/di/src/compatibility.php',
        '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
    );

    public static $prefixLengthsPsr4 = array (
        '_' => 
        array (
            '_HumbugBoxb94336daae36\\Symfony\\Polyfill\\Mbstring\\' => 49,
            '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\' => 48,
            '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\' => 47,
            '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\' => 49,
            '_HumbugBoxb94336daae36\\Psr\\Log\\' => 31,
            '_HumbugBoxb94336daae36\\PackageVersions\\' => 39,
            '_HumbugBoxb94336daae36\\Jean85\\' => 30,
            '_HumbugBoxb94336daae36\\Composer\\XdebugHandler\\' => 46,
        ),
        'P' => 
        array (
            'PhpParser\\' => 10,
            'PHPStan\\PhpDocParser\\' => 21,
            'PHPStan\\' => 8,
        ),
    );

    public static $prefixDirsPsr4 = array (
        '_HumbugBoxb94336daae36\\Symfony\\Polyfill\\Mbstring\\' => 
        array (
            0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
        ),
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\' => 
        array (
            0 => __DIR__ . '/..' . '/symfony/finder',
        ),
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\' => 
        array (
            0 => __DIR__ . '/..' . '/symfony/debug',
        ),
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\' => 
        array (
            0 => __DIR__ . '/..' . '/symfony/console',
        ),
        '_HumbugBoxb94336daae36\\Psr\\Log\\' => 
        array (
            0 => __DIR__ . '/..' . '/psr/log/Psr/Log',
        ),
        '_HumbugBoxb94336daae36\\PackageVersions\\' => 
        array (
            0 => __DIR__ . '/..' . '/ocramius/package-versions/src/PackageVersions',
        ),
        '_HumbugBoxb94336daae36\\Jean85\\' => 
        array (
            0 => __DIR__ . '/..' . '/jean85/pretty-package-versions/src',
        ),
        '_HumbugBoxb94336daae36\\Composer\\XdebugHandler\\' => 
        array (
            0 => __DIR__ . '/..' . '/composer/xdebug-handler/src',
        ),
        'PhpParser\\' => 
        array (
            0 => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser',
        ),
        'PHPStan\\PhpDocParser\\' => 
        array (
            0 => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src',
        ),
        'PHPStan\\' => 
        array (
            0 => __DIR__ . '/../..' . '/src',
        ),
    );

    public static $classMap = array (
        'PHPStan\\AnalysedCodeException' => __DIR__ . '/../..' . '/src/AnalysedCodeException.php',
        'PHPStan\\Analyser\\Analyser' => __DIR__ . '/../..' . '/src/Analyser/Analyser.php',
        'PHPStan\\Analyser\\EnsuredNonNullabilityResult' => __DIR__ . '/../..' . '/src/Analyser/EnsuredNonNullabilityResult.php',
        'PHPStan\\Analyser\\EnsuredNonNullabilityResultExpression' => __DIR__ . '/../..' . '/src/Analyser/EnsuredNonNullabilityResultExpression.php',
        'PHPStan\\Analyser\\Error' => __DIR__ . '/../..' . '/src/Analyser/Error.php',
        'PHPStan\\Analyser\\ExpressionContext' => __DIR__ . '/../..' . '/src/Analyser/ExpressionContext.php',
        'PHPStan\\Analyser\\ExpressionResult' => __DIR__ . '/../..' . '/src/Analyser/ExpressionResult.php',
        'PHPStan\\Analyser\\IgnoredError' => __DIR__ . '/../..' . '/src/Analyser/IgnoredError.php',
        'PHPStan\\Analyser\\NameScope' => __DIR__ . '/../..' . '/src/Analyser/NameScope.php',
        'PHPStan\\Analyser\\NodeScopeResolver' => __DIR__ . '/../..' . '/src/Analyser/NodeScopeResolver.php',
        'PHPStan\\Analyser\\OutOfClassScope' => __DIR__ . '/../..' . '/src/Analyser/OutOfClassScope.php',
        'PHPStan\\Analyser\\Scope' => __DIR__ . '/../..' . '/src/Analyser/Scope.php',
        'PHPStan\\Analyser\\ScopeContext' => __DIR__ . '/../..' . '/src/Analyser/ScopeContext.php',
        'PHPStan\\Analyser\\ScopeFactory' => __DIR__ . '/../..' . '/src/Analyser/ScopeFactory.php',
        'PHPStan\\Analyser\\SpecifiedTypes' => __DIR__ . '/../..' . '/src/Analyser/SpecifiedTypes.php',
        'PHPStan\\Analyser\\StatementExitPoint' => __DIR__ . '/../..' . '/src/Analyser/StatementExitPoint.php',
        'PHPStan\\Analyser\\StatementResult' => __DIR__ . '/../..' . '/src/Analyser/StatementResult.php',
        'PHPStan\\Analyser\\TypeSpecifier' => __DIR__ . '/../..' . '/src/Analyser/TypeSpecifier.php',
        'PHPStan\\Analyser\\TypeSpecifierAwareExtension' => __DIR__ . '/../..' . '/src/Analyser/TypeSpecifierAwareExtension.php',
        'PHPStan\\Analyser\\TypeSpecifierContext' => __DIR__ . '/../..' . '/src/Analyser/TypeSpecifierContext.php',
        'PHPStan\\Analyser\\TypeSpecifierFactory' => __DIR__ . '/../..' . '/src/Analyser/TypeSpecifierFactory.php',
        'PHPStan\\Analyser\\UndefinedVariableException' => __DIR__ . '/../..' . '/src/Analyser/UndefinedVariableException.php',
        'PHPStan\\Analyser\\VariableTypeHolder' => __DIR__ . '/../..' . '/src/Analyser/VariableTypeHolder.php',
        'PHPStan\\Broker\\AnonymousClassNameHelper' => __DIR__ . '/../..' . '/src/Broker/AnonymousClassNameHelper.php',
        'PHPStan\\Broker\\Broker' => __DIR__ . '/../..' . '/src/Broker/Broker.php',
        'PHPStan\\Broker\\BrokerFactory' => __DIR__ . '/../..' . '/src/Broker/BrokerFactory.php',
        'PHPStan\\Broker\\ClassAutoloadingException' => __DIR__ . '/../..' . '/src/Broker/ClassAutoloadingException.php',
        'PHPStan\\Broker\\ClassNotFoundException' => __DIR__ . '/../..' . '/src/Broker/ClassNotFoundException.php',
        'PHPStan\\Broker\\FunctionNotFoundException' => __DIR__ . '/../..' . '/src/Broker/FunctionNotFoundException.php',
        'PHPStan\\Cache\\Cache' => __DIR__ . '/../..' . '/src/Cache/Cache.php',
        'PHPStan\\Cache\\CacheStorage' => __DIR__ . '/../..' . '/src/Cache/CacheStorage.php',
        'PHPStan\\Cache\\FileCacheStorage' => __DIR__ . '/../..' . '/src/Cache/FileCacheStorage.php',
        'PHPStan\\Cache\\MemoryCacheStorage' => __DIR__ . '/../..' . '/src/Cache/MemoryCacheStorage.php',
        'PHPStan\\Command\\AnalyseApplication' => __DIR__ . '/../..' . '/src/Command/AnalyseApplication.php',
        'PHPStan\\Command\\AnalyseCommand' => __DIR__ . '/../..' . '/src/Command/AnalyseCommand.php',
        'PHPStan\\Command\\AnalysisResult' => __DIR__ . '/../..' . '/src/Command/AnalysisResult.php',
        'PHPStan\\Command\\CommandHelper' => __DIR__ . '/../..' . '/src/Command/CommandHelper.php',
        'PHPStan\\Command\\DumpDependenciesCommand' => __DIR__ . '/../..' . '/src/Command/DumpDependenciesCommand.php',
        'PHPStan\\Command\\ErrorFormatter\\CheckstyleErrorFormatter' => __DIR__ . '/../..' . '/src/Command/ErrorFormatter/CheckstyleErrorFormatter.php',
        'PHPStan\\Command\\ErrorFormatter\\ErrorFormatter' => __DIR__ . '/../..' . '/src/Command/ErrorFormatter/ErrorFormatter.php',
        'PHPStan\\Command\\ErrorFormatter\\JsonErrorFormatter' => __DIR__ . '/../..' . '/src/Command/ErrorFormatter/JsonErrorFormatter.php',
        'PHPStan\\Command\\ErrorFormatter\\RawErrorFormatter' => __DIR__ . '/../..' . '/src/Command/ErrorFormatter/RawErrorFormatter.php',
        'PHPStan\\Command\\ErrorFormatter\\TableErrorFormatter' => __DIR__ . '/../..' . '/src/Command/ErrorFormatter/TableErrorFormatter.php',
        'PHPStan\\Command\\ErrorsConsoleStyle' => __DIR__ . '/../..' . '/src/Command/ErrorsConsoleStyle.php',
        'PHPStan\\Command\\InceptionNotSuccessfulException' => __DIR__ . '/../..' . '/src/Command/InceptionNotSuccessfulException.php',
        'PHPStan\\Command\\InceptionResult' => __DIR__ . '/../..' . '/src/Command/InceptionResult.php',
        'PHPStan\\DependencyInjection\\ConditionalTagsExtension' => __DIR__ . '/../..' . '/src/DependencyInjection/ConditionalTagsExtension.php',
        'PHPStan\\DependencyInjection\\Configurator' => __DIR__ . '/../..' . '/src/DependencyInjection/Configurator.php',
        'PHPStan\\DependencyInjection\\Container' => __DIR__ . '/../..' . '/src/DependencyInjection/Container.php',
        'PHPStan\\DependencyInjection\\ContainerFactory' => __DIR__ . '/../..' . '/src/DependencyInjection/ContainerFactory.php',
        'PHPStan\\DependencyInjection\\LoaderFactory' => __DIR__ . '/../..' . '/src/DependencyInjection/LoaderFactory.php',
        'PHPStan\\DependencyInjection\\Nette\\NetteContainer' => __DIR__ . '/../..' . '/src/DependencyInjection/Nette/NetteContainer.php',
        'PHPStan\\DependencyInjection\\ParametersSchemaExtension' => __DIR__ . '/../..' . '/src/DependencyInjection/ParametersSchemaExtension.php',
        'PHPStan\\DependencyInjection\\RulesExtension' => __DIR__ . '/../..' . '/src/DependencyInjection/RulesExtension.php',
        'PHPStan\\Dependency\\DependencyDumper' => __DIR__ . '/../..' . '/src/Dependency/DependencyDumper.php',
        'PHPStan\\Dependency\\DependencyResolver' => __DIR__ . '/../..' . '/src/Dependency/DependencyResolver.php',
        'PHPStan\\File\\FileExcluder' => __DIR__ . '/../..' . '/src/File/FileExcluder.php',
        'PHPStan\\File\\FileFinder' => __DIR__ . '/../..' . '/src/File/FileFinder.php',
        'PHPStan\\File\\FileFinderResult' => __DIR__ . '/../..' . '/src/File/FileFinderResult.php',
        'PHPStan\\File\\FileHelper' => __DIR__ . '/../..' . '/src/File/FileHelper.php',
        'PHPStan\\File\\FuzzyRelativePathHelper' => __DIR__ . '/../..' . '/src/File/FuzzyRelativePathHelper.php',
        'PHPStan\\File\\PathNotFoundException' => __DIR__ . '/../..' . '/src/File/PathNotFoundException.php',
        'PHPStan\\File\\RelativePathHelper' => __DIR__ . '/../..' . '/src/File/RelativePathHelper.php',
        'PHPStan\\File\\SimpleRelativePathHelper' => __DIR__ . '/../..' . '/src/File/SimpleRelativePathHelper.php',
        'PHPStan\\Internal\\ContainerDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Internal/ContainerDynamicReturnTypeExtension.php',
        'PHPStan\\Internal\\ScopeIsInClassTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Internal/ScopeIsInClassTypeSpecifyingExtension.php',
        'PHPStan\\Internal\\UnionTypeGetInternalDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Internal/UnionTypeGetInternalDynamicReturnTypeExtension.php',
        'PHPStan\\Node\\ClosureReturnStatementsNode' => __DIR__ . '/../..' . '/src/Node/ClosureReturnStatementsNode.php',
        'PHPStan\\Node\\ExecutionEndNode' => __DIR__ . '/../..' . '/src/Node/ExecutionEndNode.php',
        'PHPStan\\Node\\InClassMethodNode' => __DIR__ . '/../..' . '/src/Node/InClassMethodNode.php',
        'PHPStan\\Node\\LiteralArrayItem' => __DIR__ . '/../..' . '/src/Node/LiteralArrayItem.php',
        'PHPStan\\Node\\LiteralArrayNode' => __DIR__ . '/../..' . '/src/Node/LiteralArrayNode.php',
        'PHPStan\\Node\\ReturnStatement' => __DIR__ . '/../..' . '/src/Node/ReturnStatement.php',
        'PHPStan\\Node\\UnreachableStatementNode' => __DIR__ . '/../..' . '/src/Node/UnreachableStatementNode.php',
        'PHPStan\\Node\\VirtualNode' => __DIR__ . '/../..' . '/src/Node/VirtualNode.php',
        'PHPStan\\Parser\\CachedParser' => __DIR__ . '/../..' . '/src/Parser/CachedParser.php',
        'PHPStan\\Parser\\DirectParser' => __DIR__ . '/../..' . '/src/Parser/DirectParser.php',
        'PHPStan\\Parser\\FunctionCallStatementFinder' => __DIR__ . '/../..' . '/src/Parser/FunctionCallStatementFinder.php',
        'PHPStan\\Parser\\Parser' => __DIR__ . '/../..' . '/src/Parser/Parser.php',
        'PHPStan\\Parser\\ParserErrorsException' => __DIR__ . '/../..' . '/src/Parser/ParserErrorsException.php',
        'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprArrayItemNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayItemNode.php',
        'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprArrayNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php',
        'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprFalseNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFalseNode.php',
        'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprFloatNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFloatNode.php',
        'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprIntegerNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.php',
        'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNode.php',
        'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprNullNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNullNode.php',
        'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprStringNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprStringNode.php',
        'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprTrueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprTrueNode.php',
        'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstFetchNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstFetchNode.php',
        'PHPStan\\PhpDocParser\\Ast\\Node' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Node.php',
        'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\DeprecatedTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.php',
        'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\GenericTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.php',
        'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\InvalidTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php',
        'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\MethodTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php',
        'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\MethodTagValueParameterNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php',
        'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.php',
        'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocChildNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocChildNode.php',
        'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocNode.php',
        'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTagNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php',
        'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagValueNode.php',
        'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTextNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTextNode.php',
        'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PropertyTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php',
        'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ReturnTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.php',
        'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TemplateTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.php',
        'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ThrowsTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.php',
        'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\VarTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.php',
        'PHPStan\\PhpDocParser\\Ast\\Type\\ArrayTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php',
        'PHPStan\\PhpDocParser\\Ast\\Type\\CallableTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php',
        'PHPStan\\PhpDocParser\\Ast\\Type\\CallableTypeParameterNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php',
        'PHPStan\\PhpDocParser\\Ast\\Type\\GenericTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php',
        'PHPStan\\PhpDocParser\\Ast\\Type\\IdentifierTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php',
        'PHPStan\\PhpDocParser\\Ast\\Type\\IntersectionTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php',
        'PHPStan\\PhpDocParser\\Ast\\Type\\NullableTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php',
        'PHPStan\\PhpDocParser\\Ast\\Type\\ThisTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ThisTypeNode.php',
        'PHPStan\\PhpDocParser\\Ast\\Type\\TypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/TypeNode.php',
        'PHPStan\\PhpDocParser\\Ast\\Type\\UnionTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php',
        'PHPStan\\PhpDocParser\\Lexer\\Lexer' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Lexer/Lexer.php',
        'PHPStan\\PhpDocParser\\Parser\\ConstExprParser' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php',
        'PHPStan\\PhpDocParser\\Parser\\ParserException' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/ParserException.php',
        'PHPStan\\PhpDocParser\\Parser\\PhpDocParser' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php',
        'PHPStan\\PhpDocParser\\Parser\\TokenIterator' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/TokenIterator.php',
        'PHPStan\\PhpDocParser\\Parser\\TypeParser' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/TypeParser.php',
        'PHPStan\\PhpDoc\\PhpDocBlock' => __DIR__ . '/../..' . '/src/PhpDoc/PhpDocBlock.php',
        'PHPStan\\PhpDoc\\PhpDocNodeResolver' => __DIR__ . '/../..' . '/src/PhpDoc/PhpDocNodeResolver.php',
        'PHPStan\\PhpDoc\\PhpDocStringResolver' => __DIR__ . '/../..' . '/src/PhpDoc/PhpDocStringResolver.php',
        'PHPStan\\PhpDoc\\ResolvedPhpDocBlock' => __DIR__ . '/../..' . '/src/PhpDoc/ResolvedPhpDocBlock.php',
        'PHPStan\\PhpDoc\\Tag\\DeprecatedTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/DeprecatedTag.php',
        'PHPStan\\PhpDoc\\Tag\\MethodTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/MethodTag.php',
        'PHPStan\\PhpDoc\\Tag\\MethodTagParameter' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/MethodTagParameter.php',
        'PHPStan\\PhpDoc\\Tag\\ParamTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/ParamTag.php',
        'PHPStan\\PhpDoc\\Tag\\PropertyTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/PropertyTag.php',
        'PHPStan\\PhpDoc\\Tag\\ReturnTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/ReturnTag.php',
        'PHPStan\\PhpDoc\\Tag\\ThrowsTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/ThrowsTag.php',
        'PHPStan\\PhpDoc\\Tag\\VarTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/VarTag.php',
        'PHPStan\\PhpDoc\\TypeNodeResolver' => __DIR__ . '/../..' . '/src/PhpDoc/TypeNodeResolver.php',
        'PHPStan\\PhpDoc\\TypeNodeResolverAwareExtension' => __DIR__ . '/../..' . '/src/PhpDoc/TypeNodeResolverAwareExtension.php',
        'PHPStan\\PhpDoc\\TypeNodeResolverExtension' => __DIR__ . '/../..' . '/src/PhpDoc/TypeNodeResolverExtension.php',
        'PHPStan\\PhpDoc\\TypeNodeResolverFactory' => __DIR__ . '/../..' . '/src/PhpDoc/TypeNodeResolverFactory.php',
        'PHPStan\\PhpDoc\\TypeStringResolver' => __DIR__ . '/../..' . '/src/PhpDoc/TypeStringResolver.php',
        'PHPStan\\Reflection\\Annotations\\AnnotationMethodReflection' => __DIR__ . '/../..' . '/src/Reflection/Annotations/AnnotationMethodReflection.php',
        'PHPStan\\Reflection\\Annotations\\AnnotationPropertyReflection' => __DIR__ . '/../..' . '/src/Reflection/Annotations/AnnotationPropertyReflection.php',
        'PHPStan\\Reflection\\Annotations\\AnnotationsMethodParameterReflection' => __DIR__ . '/../..' . '/src/Reflection/Annotations/AnnotationsMethodParameterReflection.php',
        'PHPStan\\Reflection\\Annotations\\AnnotationsMethodsClassReflectionExtension' => __DIR__ . '/../..' . '/src/Reflection/Annotations/AnnotationsMethodsClassReflectionExtension.php',
        'PHPStan\\Reflection\\Annotations\\AnnotationsPropertiesClassReflectionExtension' => __DIR__ . '/../..' . '/src/Reflection/Annotations/AnnotationsPropertiesClassReflectionExtension.php',
        'PHPStan\\Reflection\\BrokerAwareClassReflectionExtension' => __DIR__ . '/../..' . '/src/Reflection/BrokerAwareClassReflectionExtension.php',
        'PHPStan\\Reflection\\BrokerAwareExtension' => __DIR__ . '/../..' . '/src/Reflection/BrokerAwareExtension.php',
        'PHPStan\\Reflection\\ClassConstantReflection' => __DIR__ . '/../..' . '/src/Reflection/ClassConstantReflection.php',
        'PHPStan\\Reflection\\ClassMemberAccessAnswerer' => __DIR__ . '/../..' . '/src/Reflection/ClassMemberAccessAnswerer.php',
        'PHPStan\\Reflection\\ClassMemberReflection' => __DIR__ . '/../..' . '/src/Reflection/ClassMemberReflection.php',
        'PHPStan\\Reflection\\ClassReflection' => __DIR__ . '/../..' . '/src/Reflection/ClassReflection.php',
        'PHPStan\\Reflection\\ConstantReflection' => __DIR__ . '/../..' . '/src/Reflection/ConstantReflection.php',
        'PHPStan\\Reflection\\DeprecatableReflection' => __DIR__ . '/../..' . '/src/Reflection/DeprecatableReflection.php',
        'PHPStan\\Reflection\\Dummy\\DummyConstantReflection' => __DIR__ . '/../..' . '/src/Reflection/Dummy/DummyConstantReflection.php',
        'PHPStan\\Reflection\\Dummy\\DummyMethodReflection' => __DIR__ . '/../..' . '/src/Reflection/Dummy/DummyMethodReflection.php',
        'PHPStan\\Reflection\\Dummy\\DummyPropertyReflection' => __DIR__ . '/../..' . '/src/Reflection/Dummy/DummyPropertyReflection.php',
        'PHPStan\\Reflection\\FinalizableReflection' => __DIR__ . '/../..' . '/src/Reflection/FinalizableReflection.php',
        'PHPStan\\Reflection\\FunctionReflection' => __DIR__ . '/../..' . '/src/Reflection/FunctionReflection.php',
        'PHPStan\\Reflection\\FunctionReflectionFactory' => __DIR__ . '/../..' . '/src/Reflection/FunctionReflectionFactory.php',
        'PHPStan\\Reflection\\FunctionVariant' => __DIR__ . '/../..' . '/src/Reflection/FunctionVariant.php',
        'PHPStan\\Reflection\\FunctionVariantWithPhpDocs' => __DIR__ . '/../..' . '/src/Reflection/FunctionVariantWithPhpDocs.php',
        'PHPStan\\Reflection\\InaccessibleMethod' => __DIR__ . '/../..' . '/src/Reflection/InaccessibleMethod.php',
        'PHPStan\\Reflection\\InternableReflection' => __DIR__ . '/../..' . '/src/Reflection/InternableReflection.php',
        'PHPStan\\Reflection\\MethodPrototypeReflection' => __DIR__ . '/../..' . '/src/Reflection/MethodPrototypeReflection.php',
        'PHPStan\\Reflection\\MethodReflection' => __DIR__ . '/../..' . '/src/Reflection/MethodReflection.php',
        'PHPStan\\Reflection\\MethodsClassReflectionExtension' => __DIR__ . '/../..' . '/src/Reflection/MethodsClassReflectionExtension.php',
        'PHPStan\\Reflection\\MissingConstantFromReflectionException' => __DIR__ . '/../..' . '/src/Reflection/MissingConstantFromReflectionException.php',
        'PHPStan\\Reflection\\MissingMethodFromReflectionException' => __DIR__ . '/../..' . '/src/Reflection/MissingMethodFromReflectionException.php',
        'PHPStan\\Reflection\\MissingPropertyFromReflectionException' => __DIR__ . '/../..' . '/src/Reflection/MissingPropertyFromReflectionException.php',
        'PHPStan\\Reflection\\Native\\NativeFunctionReflection' => __DIR__ . '/../..' . '/src/Reflection/Native/NativeFunctionReflection.php',
        'PHPStan\\Reflection\\Native\\NativeMethodReflection' => __DIR__ . '/../..' . '/src/Reflection/Native/NativeMethodReflection.php',
        'PHPStan\\Reflection\\Native\\NativeParameterReflection' => __DIR__ . '/../..' . '/src/Reflection/Native/NativeParameterReflection.php',
        'PHPStan\\Reflection\\ParameterReflection' => __DIR__ . '/../..' . '/src/Reflection/ParameterReflection.php',
        'PHPStan\\Reflection\\ParameterReflectionWithPhpDocs' => __DIR__ . '/../..' . '/src/Reflection/ParameterReflectionWithPhpDocs.php',
        'PHPStan\\Reflection\\ParametersAcceptor' => __DIR__ . '/../..' . '/src/Reflection/ParametersAcceptor.php',
        'PHPStan\\Reflection\\ParametersAcceptorSelector' => __DIR__ . '/../..' . '/src/Reflection/ParametersAcceptorSelector.php',
        'PHPStan\\Reflection\\ParametersAcceptorWithPhpDocs' => __DIR__ . '/../..' . '/src/Reflection/ParametersAcceptorWithPhpDocs.php',
        'PHPStan\\Reflection\\PassedByReference' => __DIR__ . '/../..' . '/src/Reflection/PassedByReference.php',
        'PHPStan\\Reflection\\PhpDefect\\PhpDefectClassReflectionExtension' => __DIR__ . '/../..' . '/src/Reflection/PhpDefect/PhpDefectClassReflectionExtension.php',
        'PHPStan\\Reflection\\PhpDefect\\PhpDefectPropertyReflection' => __DIR__ . '/../..' . '/src/Reflection/PhpDefect/PhpDefectPropertyReflection.php',
        'PHPStan\\Reflection\\Php\\BuiltinMethodReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/BuiltinMethodReflection.php',
        'PHPStan\\Reflection\\Php\\DummyParameter' => __DIR__ . '/../..' . '/src/Reflection/Php/DummyParameter.php',
        'PHPStan\\Reflection\\Php\\FakeBuiltinMethodReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/FakeBuiltinMethodReflection.php',
        'PHPStan\\Reflection\\Php\\NativeBuiltinMethodReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/NativeBuiltinMethodReflection.php',
        'PHPStan\\Reflection\\Php\\PhpClassReflectionExtension' => __DIR__ . '/../..' . '/src/Reflection/Php/PhpClassReflectionExtension.php',
        'PHPStan\\Reflection\\Php\\PhpFunctionFromParserNodeReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/PhpFunctionFromParserNodeReflection.php',
        'PHPStan\\Reflection\\Php\\PhpFunctionReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/PhpFunctionReflection.php',
        'PHPStan\\Reflection\\Php\\PhpMethodFromParserNodeReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/PhpMethodFromParserNodeReflection.php',
        'PHPStan\\Reflection\\Php\\PhpMethodReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/PhpMethodReflection.php',
        'PHPStan\\Reflection\\Php\\PhpMethodReflectionFactory' => __DIR__ . '/../..' . '/src/Reflection/Php/PhpMethodReflectionFactory.php',
        'PHPStan\\Reflection\\Php\\PhpParameterFromParserNodeReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/PhpParameterFromParserNodeReflection.php',
        'PHPStan\\Reflection\\Php\\PhpParameterReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/PhpParameterReflection.php',
        'PHPStan\\Reflection\\Php\\PhpPropertyReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/PhpPropertyReflection.php',
        'PHPStan\\Reflection\\Php\\UniversalObjectCrateProperty' => __DIR__ . '/../..' . '/src/Reflection/Php/UniversalObjectCrateProperty.php',
        'PHPStan\\Reflection\\Php\\UniversalObjectCratesClassReflectionExtension' => __DIR__ . '/../..' . '/src/Reflection/Php/UniversalObjectCratesClassReflectionExtension.php',
        'PHPStan\\Reflection\\PropertiesClassReflectionExtension' => __DIR__ . '/../..' . '/src/Reflection/PropertiesClassReflectionExtension.php',
        'PHPStan\\Reflection\\PropertyReflection' => __DIR__ . '/../..' . '/src/Reflection/PropertyReflection.php',
        'PHPStan\\Reflection\\ReflectionWithFilename' => __DIR__ . '/../..' . '/src/Reflection/ReflectionWithFilename.php',
        'PHPStan\\Reflection\\SignatureMap\\FunctionSignature' => __DIR__ . '/../..' . '/src/Reflection/SignatureMap/FunctionSignature.php',
        'PHPStan\\Reflection\\SignatureMap\\ParameterSignature' => __DIR__ . '/../..' . '/src/Reflection/SignatureMap/ParameterSignature.php',
        'PHPStan\\Reflection\\SignatureMap\\SignatureMapParser' => __DIR__ . '/../..' . '/src/Reflection/SignatureMap/SignatureMapParser.php',
        'PHPStan\\Reflection\\SignatureMap\\SignatureMapProvider' => __DIR__ . '/../..' . '/src/Reflection/SignatureMap/SignatureMapProvider.php',
        'PHPStan\\Reflection\\ThrowableReflection' => __DIR__ . '/../..' . '/src/Reflection/ThrowableReflection.php',
        'PHPStan\\Reflection\\TrivialParametersAcceptor' => __DIR__ . '/../..' . '/src/Reflection/TrivialParametersAcceptor.php',
        'PHPStan\\Rules\\Arrays\\AllowedArrayKeysTypes' => __DIR__ . '/../..' . '/src/Rules/Arrays/AllowedArrayKeysTypes.php',
        'PHPStan\\Rules\\Arrays\\AppendedArrayItemTypeRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/AppendedArrayItemTypeRule.php',
        'PHPStan\\Rules\\Arrays\\AppendedArrayKeyTypeRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/AppendedArrayKeyTypeRule.php',
        'PHPStan\\Rules\\Arrays\\DeadForeachRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/DeadForeachRule.php',
        'PHPStan\\Rules\\Arrays\\DuplicateKeysInLiteralArraysRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/DuplicateKeysInLiteralArraysRule.php',
        'PHPStan\\Rules\\Arrays\\InvalidKeyInArrayDimFetchRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php',
        'PHPStan\\Rules\\Arrays\\InvalidKeyInArrayItemRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/InvalidKeyInArrayItemRule.php',
        'PHPStan\\Rules\\Arrays\\IterableInForeachRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/IterableInForeachRule.php',
        'PHPStan\\Rules\\Arrays\\NonexistentOffsetInArrayDimFetchRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/NonexistentOffsetInArrayDimFetchRule.php',
        'PHPStan\\Rules\\Arrays\\OffsetAccessAssignOpRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/OffsetAccessAssignOpRule.php',
        'PHPStan\\Rules\\Arrays\\OffsetAccessAssignmentRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/OffsetAccessAssignmentRule.php',
        'PHPStan\\Rules\\Arrays\\OffsetAccessWithoutDimForReadingRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/OffsetAccessWithoutDimForReadingRule.php',
        'PHPStan\\Rules\\Cast\\EchoRule' => __DIR__ . '/../..' . '/src/Rules/Cast/EchoRule.php',
        'PHPStan\\Rules\\Cast\\InvalidCastRule' => __DIR__ . '/../..' . '/src/Rules/Cast/InvalidCastRule.php',
        'PHPStan\\Rules\\Cast\\InvalidPartOfEncapsedStringRule' => __DIR__ . '/../..' . '/src/Rules/Cast/InvalidPartOfEncapsedStringRule.php',
        'PHPStan\\Rules\\Cast\\PrintRule' => __DIR__ . '/../..' . '/src/Rules/Cast/PrintRule.php',
        'PHPStan\\Rules\\ClassCaseSensitivityCheck' => __DIR__ . '/../..' . '/src/Rules/ClassCaseSensitivityCheck.php',
        'PHPStan\\Rules\\ClassNameNodePair' => __DIR__ . '/../..' . '/src/Rules/ClassNameNodePair.php',
        'PHPStan\\Rules\\Classes\\ClassConstantDeclarationRule' => __DIR__ . '/../..' . '/src/Rules/Classes/ClassConstantDeclarationRule.php',
        'PHPStan\\Rules\\Classes\\ClassConstantRule' => __DIR__ . '/../..' . '/src/Rules/Classes/ClassConstantRule.php',
        'PHPStan\\Rules\\Classes\\ExistingClassInClassExtendsRule' => __DIR__ . '/../..' . '/src/Rules/Classes/ExistingClassInClassExtendsRule.php',
        'PHPStan\\Rules\\Classes\\ExistingClassInInstanceOfRule' => __DIR__ . '/../..' . '/src/Rules/Classes/ExistingClassInInstanceOfRule.php',
        'PHPStan\\Rules\\Classes\\ExistingClassInTraitUseRule' => __DIR__ . '/../..' . '/src/Rules/Classes/ExistingClassInTraitUseRule.php',
        'PHPStan\\Rules\\Classes\\ExistingClassesInClassImplementsRule' => __DIR__ . '/../..' . '/src/Rules/Classes/ExistingClassesInClassImplementsRule.php',
        'PHPStan\\Rules\\Classes\\ExistingClassesInInterfaceExtendsRule' => __DIR__ . '/../..' . '/src/Rules/Classes/ExistingClassesInInterfaceExtendsRule.php',
        'PHPStan\\Rules\\Classes\\ImpossibleInstanceOfRule' => __DIR__ . '/../..' . '/src/Rules/Classes/ImpossibleInstanceOfRule.php',
        'PHPStan\\Rules\\Classes\\InstantiationRule' => __DIR__ . '/../..' . '/src/Rules/Classes/InstantiationRule.php',
        'PHPStan\\Rules\\Classes\\RequireParentConstructCallRule' => __DIR__ . '/../..' . '/src/Rules/Classes/RequireParentConstructCallRule.php',
        'PHPStan\\Rules\\Classes\\UnusedConstructorParametersRule' => __DIR__ . '/../..' . '/src/Rules/Classes/UnusedConstructorParametersRule.php',
        'PHPStan\\Rules\\Comparison\\BooleanAndConstantConditionRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/BooleanAndConstantConditionRule.php',
        'PHPStan\\Rules\\Comparison\\BooleanNotConstantConditionRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/BooleanNotConstantConditionRule.php',
        'PHPStan\\Rules\\Comparison\\BooleanOrConstantConditionRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/BooleanOrConstantConditionRule.php',
        'PHPStan\\Rules\\Comparison\\ConstantConditionRuleHelper' => __DIR__ . '/../..' . '/src/Rules/Comparison/ConstantConditionRuleHelper.php',
        'PHPStan\\Rules\\Comparison\\ElseIfConstantConditionRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/ElseIfConstantConditionRule.php',
        'PHPStan\\Rules\\Comparison\\IfConstantConditionRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/IfConstantConditionRule.php',
        'PHPStan\\Rules\\Comparison\\ImpossibleCheckTypeFunctionCallRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/ImpossibleCheckTypeFunctionCallRule.php',
        'PHPStan\\Rules\\Comparison\\ImpossibleCheckTypeHelper' => __DIR__ . '/../..' . '/src/Rules/Comparison/ImpossibleCheckTypeHelper.php',
        'PHPStan\\Rules\\Comparison\\ImpossibleCheckTypeMethodCallRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/ImpossibleCheckTypeMethodCallRule.php',
        'PHPStan\\Rules\\Comparison\\ImpossibleCheckTypeStaticMethodCallRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/ImpossibleCheckTypeStaticMethodCallRule.php',
        'PHPStan\\Rules\\Comparison\\StrictComparisonOfDifferentTypesRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/StrictComparisonOfDifferentTypesRule.php',
        'PHPStan\\Rules\\Comparison\\TernaryOperatorConstantConditionRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/TernaryOperatorConstantConditionRule.php',
        'PHPStan\\Rules\\Comparison\\UnreachableIfBranchesRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/UnreachableIfBranchesRule.php',
        'PHPStan\\Rules\\Comparison\\UnreachableTernaryElseBranchRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/UnreachableTernaryElseBranchRule.php',
        'PHPStan\\Rules\\Constants\\ConstantRule' => __DIR__ . '/../..' . '/src/Rules/Constants/ConstantRule.php',
        'PHPStan\\Rules\\DeadCode\\NoopRule' => __DIR__ . '/../..' . '/src/Rules/DeadCode/NoopRule.php',
        'PHPStan\\Rules\\DeadCode\\UnreachableStatementRule' => __DIR__ . '/../..' . '/src/Rules/DeadCode/UnreachableStatementRule.php',
        'PHPStan\\Rules\\Exceptions\\CaughtExceptionExistenceRule' => __DIR__ . '/../..' . '/src/Rules/Exceptions/CaughtExceptionExistenceRule.php',
        'PHPStan\\Rules\\Exceptions\\DeadCatchRule' => __DIR__ . '/../..' . '/src/Rules/Exceptions/DeadCatchRule.php',
        'PHPStan\\Rules\\FileRuleError' => __DIR__ . '/../..' . '/src/Rules/FileRuleError.php',
        'PHPStan\\Rules\\FoundTypeResult' => __DIR__ . '/../..' . '/src/Rules/FoundTypeResult.php',
        'PHPStan\\Rules\\FunctionCallParametersCheck' => __DIR__ . '/../..' . '/src/Rules/FunctionCallParametersCheck.php',
        'PHPStan\\Rules\\FunctionDefinitionCheck' => __DIR__ . '/../..' . '/src/Rules/FunctionDefinitionCheck.php',
        'PHPStan\\Rules\\FunctionReturnTypeCheck' => __DIR__ . '/../..' . '/src/Rules/FunctionReturnTypeCheck.php',
        'PHPStan\\Rules\\Functions\\CallCallablesRule' => __DIR__ . '/../..' . '/src/Rules/Functions/CallCallablesRule.php',
        'PHPStan\\Rules\\Functions\\CallToFunctionParametersRule' => __DIR__ . '/../..' . '/src/Rules/Functions/CallToFunctionParametersRule.php',
        'PHPStan\\Rules\\Functions\\CallToNonExistentFunctionRule' => __DIR__ . '/../..' . '/src/Rules/Functions/CallToNonExistentFunctionRule.php',
        'PHPStan\\Rules\\Functions\\ClosureReturnTypeRule' => __DIR__ . '/../..' . '/src/Rules/Functions/ClosureReturnTypeRule.php',
        'PHPStan\\Rules\\Functions\\ExistingClassesInClosureTypehintsRule' => __DIR__ . '/../..' . '/src/Rules/Functions/ExistingClassesInClosureTypehintsRule.php',
        'PHPStan\\Rules\\Functions\\ExistingClassesInTypehintsRule' => __DIR__ . '/../..' . '/src/Rules/Functions/ExistingClassesInTypehintsRule.php',
        'PHPStan\\Rules\\Functions\\IncompatibleDefaultParameterTypeRule' => __DIR__ . '/../..' . '/src/Rules/Functions/IncompatibleDefaultParameterTypeRule.php',
        'PHPStan\\Rules\\Functions\\InnerFunctionRule' => __DIR__ . '/../..' . '/src/Rules/Functions/InnerFunctionRule.php',
        'PHPStan\\Rules\\Functions\\NonExistentDefinedFunctionRule' => __DIR__ . '/../..' . '/src/Rules/Functions/NonExistentDefinedFunctionRule.php',
        'PHPStan\\Rules\\Functions\\PrintfParametersRule' => __DIR__ . '/../..' . '/src/Rules/Functions/PrintfParametersRule.php',
        'PHPStan\\Rules\\Functions\\ReturnTypeRule' => __DIR__ . '/../..' . '/src/Rules/Functions/ReturnTypeRule.php',
        'PHPStan\\Rules\\Functions\\UnusedClosureUsesRule' => __DIR__ . '/../..' . '/src/Rules/Functions/UnusedClosureUsesRule.php',
        'PHPStan\\Rules\\Generators\\YieldFromTypeRule' => __DIR__ . '/../..' . '/src/Rules/Generators/YieldFromTypeRule.php',
        'PHPStan\\Rules\\Generators\\YieldInGeneratorRule' => __DIR__ . '/../..' . '/src/Rules/Generators/YieldInGeneratorRule.php',
        'PHPStan\\Rules\\Generators\\YieldTypeRule' => __DIR__ . '/../..' . '/src/Rules/Generators/YieldTypeRule.php',
        'PHPStan\\Rules\\LineRuleError' => __DIR__ . '/../..' . '/src/Rules/LineRuleError.php',
        'PHPStan\\Rules\\Methods\\CallMethodsRule' => __DIR__ . '/../..' . '/src/Rules/Methods/CallMethodsRule.php',
        'PHPStan\\Rules\\Methods\\CallStaticMethodsRule' => __DIR__ . '/../..' . '/src/Rules/Methods/CallStaticMethodsRule.php',
        'PHPStan\\Rules\\Methods\\ExistingClassesInTypehintsRule' => __DIR__ . '/../..' . '/src/Rules/Methods/ExistingClassesInTypehintsRule.php',
        'PHPStan\\Rules\\Methods\\IncompatibleDefaultParameterTypeRule' => __DIR__ . '/../..' . '/src/Rules/Methods/IncompatibleDefaultParameterTypeRule.php',
        'PHPStan\\Rules\\Methods\\MethodSignatureRule' => __DIR__ . '/../..' . '/src/Rules/Methods/MethodSignatureRule.php',
        'PHPStan\\Rules\\Methods\\ReturnTypeRule' => __DIR__ . '/../..' . '/src/Rules/Methods/ReturnTypeRule.php',
        'PHPStan\\Rules\\Missing\\MissingClosureNativeReturnTypehintRule' => __DIR__ . '/../..' . '/src/Rules/Missing/MissingClosureNativeReturnTypehintRule.php',
        'PHPStan\\Rules\\Missing\\MissingReturnRule' => __DIR__ . '/../..' . '/src/Rules/Missing/MissingReturnRule.php',
        'PHPStan\\Rules\\Namespaces\\ExistingNamesInGroupUseRule' => __DIR__ . '/../..' . '/src/Rules/Namespaces/ExistingNamesInGroupUseRule.php',
        'PHPStan\\Rules\\Namespaces\\ExistingNamesInUseRule' => __DIR__ . '/../..' . '/src/Rules/Namespaces/ExistingNamesInUseRule.php',
        'PHPStan\\Rules\\Operators\\InvalidBinaryOperationRule' => __DIR__ . '/../..' . '/src/Rules/Operators/InvalidBinaryOperationRule.php',
        'PHPStan\\Rules\\Operators\\InvalidComparisonOperationRule' => __DIR__ . '/../..' . '/src/Rules/Operators/InvalidComparisonOperationRule.php',
        'PHPStan\\Rules\\Operators\\InvalidIncDecOperationRule' => __DIR__ . '/../..' . '/src/Rules/Operators/InvalidIncDecOperationRule.php',
        'PHPStan\\Rules\\Operators\\InvalidUnaryOperationRule' => __DIR__ . '/../..' . '/src/Rules/Operators/InvalidUnaryOperationRule.php',
        'PHPStan\\Rules\\PhpDoc\\IncompatiblePhpDocTypeRule' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/IncompatiblePhpDocTypeRule.php',
        'PHPStan\\Rules\\PhpDoc\\IncompatiblePropertyPhpDocTypeRule' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/IncompatiblePropertyPhpDocTypeRule.php',
        'PHPStan\\Rules\\PhpDoc\\InvalidPhpDocTagValueRule' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/InvalidPhpDocTagValueRule.php',
        'PHPStan\\Rules\\PhpDoc\\InvalidThrowsPhpDocValueRule' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/InvalidThrowsPhpDocValueRule.php',
        'PHPStan\\Rules\\Properties\\AccessPropertiesInAssignRule' => __DIR__ . '/../..' . '/src/Rules/Properties/AccessPropertiesInAssignRule.php',
        'PHPStan\\Rules\\Properties\\AccessPropertiesRule' => __DIR__ . '/../..' . '/src/Rules/Properties/AccessPropertiesRule.php',
        'PHPStan\\Rules\\Properties\\AccessStaticPropertiesInAssignRule' => __DIR__ . '/../..' . '/src/Rules/Properties/AccessStaticPropertiesInAssignRule.php',
        'PHPStan\\Rules\\Properties\\AccessStaticPropertiesRule' => __DIR__ . '/../..' . '/src/Rules/Properties/AccessStaticPropertiesRule.php',
        'PHPStan\\Rules\\Properties\\DefaultValueTypesAssignedToPropertiesRule' => __DIR__ . '/../..' . '/src/Rules/Properties/DefaultValueTypesAssignedToPropertiesRule.php',
        'PHPStan\\Rules\\Properties\\ExistingClassesInPropertiesRule' => __DIR__ . '/../..' . '/src/Rules/Properties/ExistingClassesInPropertiesRule.php',
        'PHPStan\\Rules\\Properties\\PropertyDescriptor' => __DIR__ . '/../..' . '/src/Rules/Properties/PropertyDescriptor.php',
        'PHPStan\\Rules\\Properties\\PropertyReflectionFinder' => __DIR__ . '/../..' . '/src/Rules/Properties/PropertyReflectionFinder.php',
        'PHPStan\\Rules\\Properties\\ReadingWriteOnlyPropertiesRule' => __DIR__ . '/../..' . '/src/Rules/Properties/ReadingWriteOnlyPropertiesRule.php',
        'PHPStan\\Rules\\Properties\\TypesAssignedToPropertiesRule' => __DIR__ . '/../..' . '/src/Rules/Properties/TypesAssignedToPropertiesRule.php',
        'PHPStan\\Rules\\Properties\\WritingToReadOnlyPropertiesRule' => __DIR__ . '/../..' . '/src/Rules/Properties/WritingToReadOnlyPropertiesRule.php',
        'PHPStan\\Rules\\Regexp\\RegularExpressionPatternRule' => __DIR__ . '/../..' . '/src/Rules/Regexp/RegularExpressionPatternRule.php',
        'PHPStan\\Rules\\Registry' => __DIR__ . '/../..' . '/src/Rules/Registry.php',
        'PHPStan\\Rules\\RegistryFactory' => __DIR__ . '/../..' . '/src/Rules/RegistryFactory.php',
        'PHPStan\\Rules\\Rule' => __DIR__ . '/../..' . '/src/Rules/Rule.php',
        'PHPStan\\Rules\\RuleError' => __DIR__ . '/../..' . '/src/Rules/RuleError.php',
        'PHPStan\\Rules\\RuleErrorBuilder' => __DIR__ . '/../..' . '/src/Rules/RuleErrorBuilder.php',
        'PHPStan\\Rules\\RuleErrors\\RuleErrorWithMessage' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleErrorWithMessage.php',
        'PHPStan\\Rules\\RuleErrors\\RuleErrorWithMessageAndFile' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleErrorWithMessageAndFile.php',
        'PHPStan\\Rules\\RuleErrors\\RuleErrorWithMessageAndLine' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleErrorWithMessageAndLine.php',
        'PHPStan\\Rules\\RuleErrors\\RuleErrorWithMessageAndLineAndFile' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleErrorWithMessageAndLineAndFile.php',
        'PHPStan\\Rules\\RuleLevelHelper' => __DIR__ . '/../..' . '/src/Rules/RuleLevelHelper.php',
        'PHPStan\\Rules\\UnusedFunctionParametersCheck' => __DIR__ . '/../..' . '/src/Rules/UnusedFunctionParametersCheck.php',
        'PHPStan\\Rules\\Variables\\DefinedVariableInAnonymousFunctionUseRule' => __DIR__ . '/../..' . '/src/Rules/Variables/DefinedVariableInAnonymousFunctionUseRule.php',
        'PHPStan\\Rules\\Variables\\DefinedVariableRule' => __DIR__ . '/../..' . '/src/Rules/Variables/DefinedVariableRule.php',
        'PHPStan\\Rules\\Variables\\ThisVariableRule' => __DIR__ . '/../..' . '/src/Rules/Variables/ThisVariableRule.php',
        'PHPStan\\Rules\\Variables\\ThrowTypeRule' => __DIR__ . '/../..' . '/src/Rules/Variables/ThrowTypeRule.php',
        'PHPStan\\Rules\\Variables\\VariableCertaintyInIssetRule' => __DIR__ . '/../..' . '/src/Rules/Variables/VariableCertaintyInIssetRule.php',
        'PHPStan\\Rules\\Variables\\VariableCloningRule' => __DIR__ . '/../..' . '/src/Rules/Variables/VariableCloningRule.php',
        'PHPStan\\ShouldNotHappenException' => __DIR__ . '/../..' . '/src/ShouldNotHappenException.php',
        'PHPStan\\Testing\\LevelsTestCase' => __DIR__ . '/../..' . '/src/Testing/LevelsTestCase.php',
        'PHPStan\\Testing\\RuleTestCase' => __DIR__ . '/../..' . '/src/Testing/RuleTestCase.php',
        'PHPStan\\Testing\\TestCase' => __DIR__ . '/../..' . '/src/Testing/TestCase.php',
        'PHPStan\\TrinaryLogic' => __DIR__ . '/../..' . '/src/TrinaryLogic.php',
        'PHPStan\\Type\\Accessory\\AccessoryType' => __DIR__ . '/../..' . '/src/Type/Accessory/AccessoryType.php',
        'PHPStan\\Type\\Accessory\\HasMethodType' => __DIR__ . '/../..' . '/src/Type/Accessory/HasMethodType.php',
        'PHPStan\\Type\\Accessory\\HasOffsetType' => __DIR__ . '/../..' . '/src/Type/Accessory/HasOffsetType.php',
        'PHPStan\\Type\\Accessory\\HasPropertyType' => __DIR__ . '/../..' . '/src/Type/Accessory/HasPropertyType.php',
        'PHPStan\\Type\\Accessory\\NonEmptyArrayType' => __DIR__ . '/../..' . '/src/Type/Accessory/NonEmptyArrayType.php',
        'PHPStan\\Type\\ArrayType' => __DIR__ . '/../..' . '/src/Type/ArrayType.php',
        'PHPStan\\Type\\BenevolentUnionType' => __DIR__ . '/../..' . '/src/Type/BenevolentUnionType.php',
        'PHPStan\\Type\\BooleanType' => __DIR__ . '/../..' . '/src/Type/BooleanType.php',
        'PHPStan\\Type\\CallableType' => __DIR__ . '/../..' . '/src/Type/CallableType.php',
        'PHPStan\\Type\\CallableTypeHelper' => __DIR__ . '/../..' . '/src/Type/CallableTypeHelper.php',
        'PHPStan\\Type\\ClosureType' => __DIR__ . '/../..' . '/src/Type/ClosureType.php',
        'PHPStan\\Type\\CommentHelper' => __DIR__ . '/../..' . '/src/Type/CommentHelper.php',
        'PHPStan\\Type\\CompoundType' => __DIR__ . '/../..' . '/src/Type/CompoundType.php',
        'PHPStan\\Type\\CompoundTypeHelper' => __DIR__ . '/../..' . '/src/Type/CompoundTypeHelper.php',
        'PHPStan\\Type\\ConstantScalarType' => __DIR__ . '/../..' . '/src/Type/ConstantScalarType.php',
        'PHPStan\\Type\\ConstantType' => __DIR__ . '/../..' . '/src/Type/ConstantType.php',
        'PHPStan\\Type\\Constant\\ConstantArrayType' => __DIR__ . '/../..' . '/src/Type/Constant/ConstantArrayType.php',
        'PHPStan\\Type\\Constant\\ConstantArrayTypeAndMethod' => __DIR__ . '/../..' . '/src/Type/Constant/ConstantArrayTypeAndMethod.php',
        'PHPStan\\Type\\Constant\\ConstantArrayTypeBuilder' => __DIR__ . '/../..' . '/src/Type/Constant/ConstantArrayTypeBuilder.php',
        'PHPStan\\Type\\Constant\\ConstantBooleanType' => __DIR__ . '/../..' . '/src/Type/Constant/ConstantBooleanType.php',
        'PHPStan\\Type\\Constant\\ConstantFloatType' => __DIR__ . '/../..' . '/src/Type/Constant/ConstantFloatType.php',
        'PHPStan\\Type\\Constant\\ConstantIntegerType' => __DIR__ . '/../..' . '/src/Type/Constant/ConstantIntegerType.php',
        'PHPStan\\Type\\Constant\\ConstantScalarToBooleanTrait' => __DIR__ . '/../..' . '/src/Type/Constant/ConstantScalarToBooleanTrait.php',
        'PHPStan\\Type\\Constant\\ConstantStringType' => __DIR__ . '/../..' . '/src/Type/Constant/ConstantStringType.php',
        'PHPStan\\Type\\DynamicFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/DynamicFunctionReturnTypeExtension.php',
        'PHPStan\\Type\\DynamicMethodReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/DynamicMethodReturnTypeExtension.php',
        'PHPStan\\Type\\DynamicStaticMethodReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/DynamicStaticMethodReturnTypeExtension.php',
        'PHPStan\\Type\\ErrorType' => __DIR__ . '/../..' . '/src/Type/ErrorType.php',
        'PHPStan\\Type\\FileTypeMapper' => __DIR__ . '/../..' . '/src/Type/FileTypeMapper.php',
        'PHPStan\\Type\\FloatType' => __DIR__ . '/../..' . '/src/Type/FloatType.php',
        'PHPStan\\Type\\FunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/FunctionTypeSpecifyingExtension.php',
        'PHPStan\\Type\\IntegerType' => __DIR__ . '/../..' . '/src/Type/IntegerType.php',
        'PHPStan\\Type\\IntersectionType' => __DIR__ . '/../..' . '/src/Type/IntersectionType.php',
        'PHPStan\\Type\\IterableType' => __DIR__ . '/../..' . '/src/Type/IterableType.php',
        'PHPStan\\Type\\JustNullableTypeTrait' => __DIR__ . '/../..' . '/src/Type/JustNullableTypeTrait.php',
        'PHPStan\\Type\\MethodTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/MethodTypeSpecifyingExtension.php',
        'PHPStan\\Type\\MixedType' => __DIR__ . '/../..' . '/src/Type/MixedType.php',
        'PHPStan\\Type\\NeverType' => __DIR__ . '/../..' . '/src/Type/NeverType.php',
        'PHPStan\\Type\\NonexistentParentClassType' => __DIR__ . '/../..' . '/src/Type/NonexistentParentClassType.php',
        'PHPStan\\Type\\NullType' => __DIR__ . '/../..' . '/src/Type/NullType.php',
        'PHPStan\\Type\\ObjectType' => __DIR__ . '/../..' . '/src/Type/ObjectType.php',
        'PHPStan\\Type\\ObjectWithoutClassType' => __DIR__ . '/../..' . '/src/Type/ObjectWithoutClassType.php',
        'PHPStan\\Type\\OperatorTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/OperatorTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\ArgumentBasedFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArgumentBasedFunctionReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\ArrayFillFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayFillFunctionReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\ArrayFillKeysFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayFillKeysFunctionReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\ArrayFilterFunctionReturnTypeReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayFilterFunctionReturnTypeReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\ArrayKeyDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayKeyDynamicReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\ArrayKeyExistsFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayKeyExistsFunctionTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\ArrayKeyFirstDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayKeyFirstDynamicReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\ArrayKeyLastDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayKeyLastDynamicReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\ArrayKeysFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayKeysFunctionDynamicReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\ArrayMapFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayMapFunctionReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\ArrayMergeFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayMergeFunctionDynamicReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\ArrayPointerFunctionsDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayPointerFunctionsDynamicReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\ArrayPopFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayPopFunctionReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\ArrayReduceFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayReduceFunctionReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\ArraySearchFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArraySearchFunctionDynamicReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\ArrayShiftFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayShiftFunctionReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\ArraySliceFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArraySliceFunctionReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\ArrayValuesFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayValuesFunctionDynamicReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\AssertFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/AssertFunctionTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\CountFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/CountFunctionReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\CountFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/CountFunctionTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\CurlInitReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/CurlInitReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\DefineConstantTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/DefineConstantTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\DefinedConstantTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/DefinedConstantTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\DioStatDynamicFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/DioStatDynamicFunctionReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\ExplodeFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ExplodeFunctionDynamicReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\FilterVarDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/FilterVarDynamicReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\GetParentClassDynamicFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/GetParentClassDynamicFunctionReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\GettimeofdayDynamicFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/GettimeofdayDynamicFunctionReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\HrtimeFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/HrtimeFunctionReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\InArrayFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/InArrayFunctionTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\IsAFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/IsAFunctionTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\IsArrayFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/IsArrayFunctionTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\IsBoolFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/IsBoolFunctionTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\IsCallableFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/IsCallableFunctionTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\IsCountableFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/IsCountableFunctionTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\IsFloatFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/IsFloatFunctionTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\IsIntFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/IsIntFunctionTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\IsIterableFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/IsIterableFunctionTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\IsNullFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/IsNullFunctionTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\IsNumericFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/IsNumericFunctionTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\IsObjectFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/IsObjectFunctionTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\IsResourceFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/IsResourceFunctionTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\IsScalarFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/IsScalarFunctionTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\IsStringFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/IsStringFunctionTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\IsSubclassOfFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/IsSubclassOfFunctionTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\JsonThrowOnErrorDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/JsonThrowOnErrorDynamicReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\MbFunctionsReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/MbFunctionsReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\MethodExistsTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/MethodExistsTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\MicrotimeFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/MicrotimeFunctionReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\MinMaxFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/MinMaxFunctionReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\ParseUrlFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ParseUrlFunctionDynamicReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\PathinfoFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/PathinfoFunctionDynamicReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\PropertyExistsTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/PropertyExistsTypeSpecifyingExtension.php',
        'PHPStan\\Type\\Php\\RangeFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/RangeFunctionReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\ReplaceFunctionsDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ReplaceFunctionsDynamicReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\SprintfFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/SprintfFunctionDynamicReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\StatDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/StatDynamicReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\StrSplitFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/StrSplitFunctionReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\StrtotimeFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/StrtotimeFunctionReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\TypeSpecifyingFunctionsDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/TypeSpecifyingFunctionsDynamicReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\VarExportFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/VarExportFunctionDynamicReturnTypeExtension.php',
        'PHPStan\\Type\\Php\\VersionCompareFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/VersionCompareFunctionDynamicReturnTypeExtension.php',
        'PHPStan\\Type\\RecursionGuard' => __DIR__ . '/../..' . '/src/Type/RecursionGuard.php',
        'PHPStan\\Type\\ResourceType' => __DIR__ . '/../..' . '/src/Type/ResourceType.php',
        'PHPStan\\Type\\StaticMethodTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/StaticMethodTypeSpecifyingExtension.php',
        'PHPStan\\Type\\StaticResolvableType' => __DIR__ . '/../..' . '/src/Type/StaticResolvableType.php',
        'PHPStan\\Type\\StaticType' => __DIR__ . '/../..' . '/src/Type/StaticType.php',
        'PHPStan\\Type\\StringAlwaysAcceptingObjectWithToStringType' => __DIR__ . '/../..' . '/src/Type/StringAlwaysAcceptingObjectWithToStringType.php',
        'PHPStan\\Type\\StringType' => __DIR__ . '/../..' . '/src/Type/StringType.php',
        'PHPStan\\Type\\SubtractableType' => __DIR__ . '/../..' . '/src/Type/SubtractableType.php',
        'PHPStan\\Type\\ThisType' => __DIR__ . '/../..' . '/src/Type/ThisType.php',
        'PHPStan\\Type\\Traits\\ConstantScalarTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/ConstantScalarTypeTrait.php',
        'PHPStan\\Type\\Traits\\FalseyBooleanTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/FalseyBooleanTypeTrait.php',
        'PHPStan\\Type\\Traits\\MaybeCallableTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/MaybeCallableTypeTrait.php',
        'PHPStan\\Type\\Traits\\MaybeIterableTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/MaybeIterableTypeTrait.php',
        'PHPStan\\Type\\Traits\\MaybeObjectTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/MaybeObjectTypeTrait.php',
        'PHPStan\\Type\\Traits\\MaybeOffsetAccessibleTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/MaybeOffsetAccessibleTypeTrait.php',
        'PHPStan\\Type\\Traits\\NonCallableTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/NonCallableTypeTrait.php',
        'PHPStan\\Type\\Traits\\NonIterableTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/NonIterableTypeTrait.php',
        'PHPStan\\Type\\Traits\\NonObjectTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/NonObjectTypeTrait.php',
        'PHPStan\\Type\\Traits\\NonOffsetAccessibleTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/NonOffsetAccessibleTypeTrait.php',
        'PHPStan\\Type\\Traits\\ObjectTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/ObjectTypeTrait.php',
        'PHPStan\\Type\\Traits\\TruthyBooleanTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/TruthyBooleanTypeTrait.php',
        'PHPStan\\Type\\Traits\\UndecidedBooleanTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/UndecidedBooleanTypeTrait.php',
        'PHPStan\\Type\\Type' => __DIR__ . '/../..' . '/src/Type/Type.php',
        'PHPStan\\Type\\TypeCombinator' => __DIR__ . '/../..' . '/src/Type/TypeCombinator.php',
        'PHPStan\\Type\\TypeUtils' => __DIR__ . '/../..' . '/src/Type/TypeUtils.php',
        'PHPStan\\Type\\TypeWithClassName' => __DIR__ . '/../..' . '/src/Type/TypeWithClassName.php',
        'PHPStan\\Type\\TypehintHelper' => __DIR__ . '/../..' . '/src/Type/TypehintHelper.php',
        'PHPStan\\Type\\UnionType' => __DIR__ . '/../..' . '/src/Type/UnionType.php',
        'PHPStan\\Type\\UnionTypeHelper' => __DIR__ . '/../..' . '/src/Type/UnionTypeHelper.php',
        'PHPStan\\Type\\VerbosityLevel' => __DIR__ . '/../..' . '/src/Type/VerbosityLevel.php',
        'PHPStan\\Type\\VoidType' => __DIR__ . '/../..' . '/src/Type/VoidType.php',
        'PhpParser\\Builder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder.php',
        'PhpParser\\BuilderFactory' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/BuilderFactory.php',
        'PhpParser\\BuilderHelpers' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/BuilderHelpers.php',
        'PhpParser\\Builder\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Class_.php',
        'PhpParser\\Builder\\Declaration' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Declaration.php',
        'PhpParser\\Builder\\FunctionLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php',
        'PhpParser\\Builder\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Function_.php',
        'PhpParser\\Builder\\Interface_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Interface_.php',
        'PhpParser\\Builder\\Method' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Method.php',
        'PhpParser\\Builder\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php',
        'PhpParser\\Builder\\Param' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Param.php',
        'PhpParser\\Builder\\Property' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Property.php',
        'PhpParser\\Builder\\TraitUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php',
        'PhpParser\\Builder\\TraitUseAdaptation' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php',
        'PhpParser\\Builder\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Trait_.php',
        'PhpParser\\Builder\\Use_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Use_.php',
        'PhpParser\\Comment' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Comment.php',
        'PhpParser\\Comment\\Doc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Comment/Doc.php',
        'PhpParser\\ConstExprEvaluationException' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php',
        'PhpParser\\ConstExprEvaluator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php',
        'PhpParser\\Error' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Error.php',
        'PhpParser\\ErrorHandler' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler.php',
        'PhpParser\\ErrorHandler\\Collecting' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php',
        'PhpParser\\ErrorHandler\\Throwing' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php',
        'PhpParser\\Internal\\DiffElem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php',
        'PhpParser\\Internal\\Differ' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/Differ.php',
        'PhpParser\\Internal\\PrintableNewAnonClassNode' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php',
        'PhpParser\\Internal\\TokenStream' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php',
        'PhpParser\\JsonDecoder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/JsonDecoder.php',
        'PhpParser\\Lexer' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer.php',
        'PhpParser\\Lexer\\Emulative' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php',
        'PhpParser\\Lexer\\TokenEmulator\\CoaleseEqualTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php',
        'PhpParser\\Lexer\\TokenEmulator\\FnTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php',
        'PhpParser\\Lexer\\TokenEmulator\\TokenEmulatorInterface' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulatorInterface.php',
        'PhpParser\\NameContext' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NameContext.php',
        'PhpParser\\Node' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node.php',
        'PhpParser\\NodeAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeAbstract.php',
        'PhpParser\\NodeDumper' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeDumper.php',
        'PhpParser\\NodeFinder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeFinder.php',
        'PhpParser\\NodeTraverser' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeTraverser.php',
        'PhpParser\\NodeTraverserInterface' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php',
        'PhpParser\\NodeVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor.php',
        'PhpParser\\NodeVisitorAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php',
        'PhpParser\\NodeVisitor\\CloningVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php',
        'PhpParser\\NodeVisitor\\FindingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php',
        'PhpParser\\NodeVisitor\\FirstFindingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php',
        'PhpParser\\NodeVisitor\\NameResolver' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php',
        'PhpParser\\Node\\Arg' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Arg.php',
        'PhpParser\\Node\\Const_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Const_.php',
        'PhpParser\\Node\\Expr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr.php',
        'PhpParser\\Node\\Expr\\ArrayDimFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php',
        'PhpParser\\Node\\Expr\\ArrayItem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php',
        'PhpParser\\Node\\Expr\\Array_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php',
        'PhpParser\\Node\\Expr\\ArrowFunction' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php',
        'PhpParser\\Node\\Expr\\Assign' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php',
        'PhpParser\\Node\\Expr\\AssignOp' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php',
        'PhpParser\\Node\\Expr\\AssignOp\\BitwiseAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php',
        'PhpParser\\Node\\Expr\\AssignOp\\BitwiseOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php',
        'PhpParser\\Node\\Expr\\AssignOp\\BitwiseXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php',
        'PhpParser\\Node\\Expr\\AssignOp\\Coalesce' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php',
        'PhpParser\\Node\\Expr\\AssignOp\\Concat' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php',
        'PhpParser\\Node\\Expr\\AssignOp\\Div' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php',
        'PhpParser\\Node\\Expr\\AssignOp\\Minus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php',
        'PhpParser\\Node\\Expr\\AssignOp\\Mod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php',
        'PhpParser\\Node\\Expr\\AssignOp\\Mul' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php',
        'PhpParser\\Node\\Expr\\AssignOp\\Plus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php',
        'PhpParser\\Node\\Expr\\AssignOp\\Pow' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php',
        'PhpParser\\Node\\Expr\\AssignOp\\ShiftLeft' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php',
        'PhpParser\\Node\\Expr\\AssignOp\\ShiftRight' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php',
        'PhpParser\\Node\\Expr\\AssignRef' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php',
        'PhpParser\\Node\\Expr\\BinaryOp' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\BooleanAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\BooleanOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\Coalesce' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\Concat' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\Div' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\Equal' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\Greater' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\GreaterOrEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\Identical' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\LogicalAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\LogicalOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\LogicalXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\Minus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\Mod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\Mul' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\NotEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\NotIdentical' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\Plus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\Pow' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\ShiftLeft' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\ShiftRight' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\Smaller' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\SmallerOrEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php',
        'PhpParser\\Node\\Expr\\BinaryOp\\Spaceship' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php',
        'PhpParser\\Node\\Expr\\BitwiseNot' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php',
        'PhpParser\\Node\\Expr\\BooleanNot' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php',
        'PhpParser\\Node\\Expr\\Cast' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php',
        'PhpParser\\Node\\Expr\\Cast\\Array_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php',
        'PhpParser\\Node\\Expr\\Cast\\Bool_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php',
        'PhpParser\\Node\\Expr\\Cast\\Double' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php',
        'PhpParser\\Node\\Expr\\Cast\\Int_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php',
        'PhpParser\\Node\\Expr\\Cast\\Object_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php',
        'PhpParser\\Node\\Expr\\Cast\\String_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php',
        'PhpParser\\Node\\Expr\\Cast\\Unset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php',
        'PhpParser\\Node\\Expr\\ClassConstFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php',
        'PhpParser\\Node\\Expr\\Clone_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php',
        'PhpParser\\Node\\Expr\\Closure' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php',
        'PhpParser\\Node\\Expr\\ClosureUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php',
        'PhpParser\\Node\\Expr\\ConstFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php',
        'PhpParser\\Node\\Expr\\Empty_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php',
        'PhpParser\\Node\\Expr\\Error' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php',
        'PhpParser\\Node\\Expr\\ErrorSuppress' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php',
        'PhpParser\\Node\\Expr\\Eval_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php',
        'PhpParser\\Node\\Expr\\Exit_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php',
        'PhpParser\\Node\\Expr\\FuncCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php',
        'PhpParser\\Node\\Expr\\Include_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php',
        'PhpParser\\Node\\Expr\\Instanceof_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php',
        'PhpParser\\Node\\Expr\\Isset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php',
        'PhpParser\\Node\\Expr\\List_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php',
        'PhpParser\\Node\\Expr\\MethodCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php',
        'PhpParser\\Node\\Expr\\New_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php',
        'PhpParser\\Node\\Expr\\PostDec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php',
        'PhpParser\\Node\\Expr\\PostInc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php',
        'PhpParser\\Node\\Expr\\PreDec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php',
        'PhpParser\\Node\\Expr\\PreInc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php',
        'PhpParser\\Node\\Expr\\Print_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php',
        'PhpParser\\Node\\Expr\\PropertyFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php',
        'PhpParser\\Node\\Expr\\ShellExec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php',
        'PhpParser\\Node\\Expr\\StaticCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php',
        'PhpParser\\Node\\Expr\\StaticPropertyFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php',
        'PhpParser\\Node\\Expr\\Ternary' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php',
        'PhpParser\\Node\\Expr\\UnaryMinus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php',
        'PhpParser\\Node\\Expr\\UnaryPlus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php',
        'PhpParser\\Node\\Expr\\Variable' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php',
        'PhpParser\\Node\\Expr\\YieldFrom' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php',
        'PhpParser\\Node\\Expr\\Yield_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php',
        'PhpParser\\Node\\FunctionLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php',
        'PhpParser\\Node\\Identifier' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Identifier.php',
        'PhpParser\\Node\\Name' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name.php',
        'PhpParser\\Node\\Name\\FullyQualified' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php',
        'PhpParser\\Node\\Name\\Relative' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php',
        'PhpParser\\Node\\NullableType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/NullableType.php',
        'PhpParser\\Node\\Param' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Param.php',
        'PhpParser\\Node\\Scalar' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar.php',
        'PhpParser\\Node\\Scalar\\DNumber' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php',
        'PhpParser\\Node\\Scalar\\Encapsed' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php',
        'PhpParser\\Node\\Scalar\\EncapsedStringPart' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php',
        'PhpParser\\Node\\Scalar\\LNumber' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php',
        'PhpParser\\Node\\Scalar\\MagicConst' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php',
        'PhpParser\\Node\\Scalar\\MagicConst\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php',
        'PhpParser\\Node\\Scalar\\MagicConst\\Dir' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php',
        'PhpParser\\Node\\Scalar\\MagicConst\\File' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php',
        'PhpParser\\Node\\Scalar\\MagicConst\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php',
        'PhpParser\\Node\\Scalar\\MagicConst\\Line' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php',
        'PhpParser\\Node\\Scalar\\MagicConst\\Method' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php',
        'PhpParser\\Node\\Scalar\\MagicConst\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php',
        'PhpParser\\Node\\Scalar\\MagicConst\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php',
        'PhpParser\\Node\\Scalar\\String_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php',
        'PhpParser\\Node\\Stmt' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt.php',
        'PhpParser\\Node\\Stmt\\Break_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php',
        'PhpParser\\Node\\Stmt\\Case_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php',
        'PhpParser\\Node\\Stmt\\Catch_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php',
        'PhpParser\\Node\\Stmt\\ClassConst' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php',
        'PhpParser\\Node\\Stmt\\ClassLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php',
        'PhpParser\\Node\\Stmt\\ClassMethod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php',
        'PhpParser\\Node\\Stmt\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php',
        'PhpParser\\Node\\Stmt\\Const_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php',
        'PhpParser\\Node\\Stmt\\Continue_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php',
        'PhpParser\\Node\\Stmt\\DeclareDeclare' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php',
        'PhpParser\\Node\\Stmt\\Declare_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php',
        'PhpParser\\Node\\Stmt\\Do_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php',
        'PhpParser\\Node\\Stmt\\Echo_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php',
        'PhpParser\\Node\\Stmt\\ElseIf_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php',
        'PhpParser\\Node\\Stmt\\Else_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php',
        'PhpParser\\Node\\Stmt\\Expression' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php',
        'PhpParser\\Node\\Stmt\\Finally_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php',
        'PhpParser\\Node\\Stmt\\For_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php',
        'PhpParser\\Node\\Stmt\\Foreach_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php',
        'PhpParser\\Node\\Stmt\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php',
        'PhpParser\\Node\\Stmt\\Global_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php',
        'PhpParser\\Node\\Stmt\\Goto_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php',
        'PhpParser\\Node\\Stmt\\GroupUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php',
        'PhpParser\\Node\\Stmt\\HaltCompiler' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php',
        'PhpParser\\Node\\Stmt\\If_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php',
        'PhpParser\\Node\\Stmt\\InlineHTML' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php',
        'PhpParser\\Node\\Stmt\\Interface_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php',
        'PhpParser\\Node\\Stmt\\Label' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php',
        'PhpParser\\Node\\Stmt\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php',
        'PhpParser\\Node\\Stmt\\Nop' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php',
        'PhpParser\\Node\\Stmt\\Property' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php',
        'PhpParser\\Node\\Stmt\\PropertyProperty' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php',
        'PhpParser\\Node\\Stmt\\Return_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php',
        'PhpParser\\Node\\Stmt\\StaticVar' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php',
        'PhpParser\\Node\\Stmt\\Static_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php',
        'PhpParser\\Node\\Stmt\\Switch_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php',
        'PhpParser\\Node\\Stmt\\Throw_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php',
        'PhpParser\\Node\\Stmt\\TraitUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php',
        'PhpParser\\Node\\Stmt\\TraitUseAdaptation' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php',
        'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Alias' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php',
        'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Precedence' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php',
        'PhpParser\\Node\\Stmt\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php',
        'PhpParser\\Node\\Stmt\\TryCatch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php',
        'PhpParser\\Node\\Stmt\\Unset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php',
        'PhpParser\\Node\\Stmt\\UseUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php',
        'PhpParser\\Node\\Stmt\\Use_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php',
        'PhpParser\\Node\\Stmt\\While_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php',
        'PhpParser\\Node\\VarLikeIdentifier' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php',
        'PhpParser\\Parser' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser.php',
        'PhpParser\\ParserAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ParserAbstract.php',
        'PhpParser\\ParserFactory' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ParserFactory.php',
        'PhpParser\\Parser\\Multiple' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Multiple.php',
        'PhpParser\\Parser\\Php5' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Php5.php',
        'PhpParser\\Parser\\Php7' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Php7.php',
        'PhpParser\\Parser\\Tokens' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Tokens.php',
        'PhpParser\\PrettyPrinterAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php',
        'PhpParser\\PrettyPrinter\\Standard' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php',
        '_HumbugBoxb94336daae36\\Composer\\XdebugHandler\\PhpConfig' => __DIR__ . '/..' . '/composer/xdebug-handler/src/PhpConfig.php',
        '_HumbugBoxb94336daae36\\Composer\\XdebugHandler\\Process' => __DIR__ . '/..' . '/composer/xdebug-handler/src/Process.php',
        '_HumbugBoxb94336daae36\\Composer\\XdebugHandler\\Status' => __DIR__ . '/..' . '/composer/xdebug-handler/src/Status.php',
        '_HumbugBoxb94336daae36\\Composer\\XdebugHandler\\XdebugHandler' => __DIR__ . '/..' . '/composer/xdebug-handler/src/XdebugHandler.php',
        '_HumbugBoxb94336daae36\\DG\\ComposerCleaner\\Cleaner' => __DIR__ . '/..' . '/dg/composer-cleaner/src/ComposerCleaner/Cleaner.php',
        '_HumbugBoxb94336daae36\\DG\\ComposerCleaner\\Plugin' => __DIR__ . '/..' . '/dg/composer-cleaner/src/ComposerCleaner/Plugin.php',
        '_HumbugBoxb94336daae36\\Jean85\\PrettyVersions' => __DIR__ . '/..' . '/jean85/pretty-package-versions/src/PrettyVersions.php',
        '_HumbugBoxb94336daae36\\Jean85\\Version' => __DIR__ . '/..' . '/jean85/pretty-package-versions/src/Version.php',
        '_HumbugBoxb94336daae36\\Nette\\ArgumentOutOfRangeException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
        '_HumbugBoxb94336daae36\\Nette\\Bridges\\DITracy\\ContainerPanel' => __DIR__ . '/..' . '/nette/di/src/Bridges/DITracy/ContainerPanel.php',
        '_HumbugBoxb94336daae36\\Nette\\Configurator' => __DIR__ . '/..' . '/nette/bootstrap/src/Bootstrap/Configurator.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Autowiring' => __DIR__ . '/..' . '/nette/di/src/DI/Autowiring.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Compiler' => __DIR__ . '/..' . '/nette/di/src/DI/Compiler.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\CompilerExtension' => __DIR__ . '/..' . '/nette/di/src/DI/CompilerExtension.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Config\\Adapter' => __DIR__ . '/..' . '/nette/di/src/DI/Config/Adapter.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Config\\Adapters\\NeonAdapter' => __DIR__ . '/..' . '/nette/di/src/DI/Config/Adapters/NeonAdapter.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Config\\Adapters\\PhpAdapter' => __DIR__ . '/..' . '/nette/di/src/DI/Config/Adapters/PhpAdapter.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Config\\DefinitionSchema' => __DIR__ . '/..' . '/nette/di/src/DI/Config/DefinitionSchema.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Config\\Helpers' => __DIR__ . '/..' . '/nette/di/src/DI/Config/Helpers.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Config\\Loader' => __DIR__ . '/..' . '/nette/di/src/DI/Config/Loader.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Container' => __DIR__ . '/..' . '/nette/di/src/DI/Container.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\ContainerBuilder' => __DIR__ . '/..' . '/nette/di/src/DI/ContainerBuilder.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\ContainerLoader' => __DIR__ . '/..' . '/nette/di/src/DI/ContainerLoader.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Definitions\\AccessorDefinition' => __DIR__ . '/..' . '/nette/di/src/DI/Definitions/AccessorDefinition.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Definitions\\Definition' => __DIR__ . '/..' . '/nette/di/src/DI/Definitions/Definition.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Definitions\\FactoryDefinition' => __DIR__ . '/..' . '/nette/di/src/DI/Definitions/FactoryDefinition.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Definitions\\ImportedDefinition' => __DIR__ . '/..' . '/nette/di/src/DI/Definitions/ImportedDefinition.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Definitions\\LocatorDefinition' => __DIR__ . '/..' . '/nette/di/src/DI/Definitions/LocatorDefinition.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Definitions\\Reference' => __DIR__ . '/..' . '/nette/di/src/DI/Definitions/Reference.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Definitions\\ServiceDefinition' => __DIR__ . '/..' . '/nette/di/src/DI/Definitions/ServiceDefinition.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Definitions\\Statement' => __DIR__ . '/..' . '/nette/di/src/DI/Definitions/Statement.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\DependencyChecker' => __DIR__ . '/..' . '/nette/di/src/DI/DependencyChecker.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\DynamicParameter' => __DIR__ . '/..' . '/nette/di/src/DI/DynamicParameter.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Extensions\\ConstantsExtension' => __DIR__ . '/..' . '/nette/di/src/DI/Extensions/ConstantsExtension.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Extensions\\DIExtension' => __DIR__ . '/..' . '/nette/di/src/DI/Extensions/DIExtension.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Extensions\\DecoratorExtension' => __DIR__ . '/..' . '/nette/di/src/DI/Extensions/DecoratorExtension.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Extensions\\ExtensionsExtension' => __DIR__ . '/..' . '/nette/di/src/DI/Extensions/ExtensionsExtension.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Extensions\\InjectExtension' => __DIR__ . '/..' . '/nette/di/src/DI/Extensions/InjectExtension.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Extensions\\ParametersExtension' => __DIR__ . '/..' . '/nette/di/src/DI/Extensions/ParametersExtension.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Extensions\\PhpExtension' => __DIR__ . '/..' . '/nette/di/src/DI/Extensions/PhpExtension.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Extensions\\SearchExtension' => __DIR__ . '/..' . '/nette/di/src/DI/Extensions/SearchExtension.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Extensions\\ServicesExtension' => __DIR__ . '/..' . '/nette/di/src/DI/Extensions/ServicesExtension.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Helpers' => __DIR__ . '/..' . '/nette/di/src/DI/Helpers.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\InvalidConfigurationException' => __DIR__ . '/..' . '/nette/di/src/DI/exceptions.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\MissingServiceException' => __DIR__ . '/..' . '/nette/di/src/DI/exceptions.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\NotAllowedDuringResolvingException' => __DIR__ . '/..' . '/nette/di/src/DI/exceptions.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\PhpGenerator' => __DIR__ . '/..' . '/nette/di/src/DI/PhpGenerator.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\Resolver' => __DIR__ . '/..' . '/nette/di/src/DI/Resolver.php',
        '_HumbugBoxb94336daae36\\Nette\\DI\\ServiceCreationException' => __DIR__ . '/..' . '/nette/di/src/DI/exceptions.php',
        '_HumbugBoxb94336daae36\\Nette\\DeprecatedException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
        '_HumbugBoxb94336daae36\\Nette\\DirectoryNotFoundException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
        '_HumbugBoxb94336daae36\\Nette\\FileNotFoundException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
        '_HumbugBoxb94336daae36\\Nette\\IOException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
        '_HumbugBoxb94336daae36\\Nette\\InvalidArgumentException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
        '_HumbugBoxb94336daae36\\Nette\\InvalidStateException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
        '_HumbugBoxb94336daae36\\Nette\\Iterators\\CachingIterator' => __DIR__ . '/..' . '/nette/utils/src/Iterators/CachingIterator.php',
        '_HumbugBoxb94336daae36\\Nette\\Iterators\\Mapper' => __DIR__ . '/..' . '/nette/utils/src/Iterators/Mapper.php',
        '_HumbugBoxb94336daae36\\Nette\\Loaders\\RobotLoader' => __DIR__ . '/..' . '/nette/robot-loader/src/RobotLoader/RobotLoader.php',
        '_HumbugBoxb94336daae36\\Nette\\Localization\\ITranslator' => __DIR__ . '/..' . '/nette/utils/src/Utils/ITranslator.php',
        '_HumbugBoxb94336daae36\\Nette\\MemberAccessException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
        '_HumbugBoxb94336daae36\\Nette\\Neon\\Decoder' => __DIR__ . '/..' . '/nette/neon/src/Neon/Decoder.php',
        '_HumbugBoxb94336daae36\\Nette\\Neon\\Encoder' => __DIR__ . '/..' . '/nette/neon/src/Neon/Encoder.php',
        '_HumbugBoxb94336daae36\\Nette\\Neon\\Entity' => __DIR__ . '/..' . '/nette/neon/src/Neon/Entity.php',
        '_HumbugBoxb94336daae36\\Nette\\Neon\\Exception' => __DIR__ . '/..' . '/nette/neon/src/Neon/Exception.php',
        '_HumbugBoxb94336daae36\\Nette\\Neon\\Neon' => __DIR__ . '/..' . '/nette/neon/src/Neon/Neon.php',
        '_HumbugBoxb94336daae36\\Nette\\NotImplementedException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
        '_HumbugBoxb94336daae36\\Nette\\NotSupportedException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
        '_HumbugBoxb94336daae36\\Nette\\OutOfRangeException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
        '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\ClassType' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/ClassType.php',
        '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Closure' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Closure.php',
        '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Constant' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Constant.php',
        '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Factory' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Factory.php',
        '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\GlobalFunction' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/GlobalFunction.php',
        '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Helpers' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Helpers.php',
        '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Method' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Method.php',
        '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Parameter' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Parameter.php',
        '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\PhpFile' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/PhpFile.php',
        '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\PhpLiteral' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/PhpLiteral.php',
        '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\PhpNamespace' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/PhpNamespace.php',
        '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Printer' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Printer.php',
        '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Property' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Property.php',
        '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\PsrPrinter' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/PsrPrinter.php',
        '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Traits\\CommentAware' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Traits/CommentAware.php',
        '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Traits\\FunctionLike' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Traits/FunctionLike.php',
        '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Traits\\NameAware' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Traits/NameAware.php',
        '_HumbugBoxb94336daae36\\Nette\\PhpGenerator\\Traits\\VisibilityAware' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Traits/VisibilityAware.php',
        '_HumbugBoxb94336daae36\\Nette\\Schema\\Context' => __DIR__ . '/..' . '/nette/schema/src/Schema/Context.php',
        '_HumbugBoxb94336daae36\\Nette\\Schema\\DynamicParameter' => __DIR__ . '/..' . '/nette/schema/src/Schema/DynamicParameter.php',
        '_HumbugBoxb94336daae36\\Nette\\Schema\\Elements\\AnyOf' => __DIR__ . '/..' . '/nette/schema/src/Schema/Elements/AnyOf.php',
        '_HumbugBoxb94336daae36\\Nette\\Schema\\Elements\\Base' => __DIR__ . '/..' . '/nette/schema/src/Schema/Elements/Base.php',
        '_HumbugBoxb94336daae36\\Nette\\Schema\\Elements\\Structure' => __DIR__ . '/..' . '/nette/schema/src/Schema/Elements/Structure.php',
        '_HumbugBoxb94336daae36\\Nette\\Schema\\Elements\\Type' => __DIR__ . '/..' . '/nette/schema/src/Schema/Elements/Type.php',
        '_HumbugBoxb94336daae36\\Nette\\Schema\\Expect' => __DIR__ . '/..' . '/nette/schema/src/Schema/Expect.php',
        '_HumbugBoxb94336daae36\\Nette\\Schema\\Helpers' => __DIR__ . '/..' . '/nette/schema/src/Schema/Helpers.php',
        '_HumbugBoxb94336daae36\\Nette\\Schema\\Processor' => __DIR__ . '/..' . '/nette/schema/src/Schema/Processor.php',
        '_HumbugBoxb94336daae36\\Nette\\Schema\\Schema' => __DIR__ . '/..' . '/nette/schema/src/Schema/Schema.php',
        '_HumbugBoxb94336daae36\\Nette\\Schema\\ValidationException' => __DIR__ . '/..' . '/nette/schema/src/Schema/ValidationException.php',
        '_HumbugBoxb94336daae36\\Nette\\SmartObject' => __DIR__ . '/..' . '/nette/utils/src/Utils/SmartObject.php',
        '_HumbugBoxb94336daae36\\Nette\\StaticClass' => __DIR__ . '/..' . '/nette/utils/src/Utils/StaticClass.php',
        '_HumbugBoxb94336daae36\\Nette\\UnexpectedValueException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
        '_HumbugBoxb94336daae36\\Nette\\Utils\\ArrayHash' => __DIR__ . '/..' . '/nette/utils/src/Utils/ArrayHash.php',
        '_HumbugBoxb94336daae36\\Nette\\Utils\\ArrayList' => __DIR__ . '/..' . '/nette/utils/src/Utils/ArrayList.php',
        '_HumbugBoxb94336daae36\\Nette\\Utils\\Arrays' => __DIR__ . '/..' . '/nette/utils/src/Utils/Arrays.php',
        '_HumbugBoxb94336daae36\\Nette\\Utils\\AssertionException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
        '_HumbugBoxb94336daae36\\Nette\\Utils\\Callback' => __DIR__ . '/..' . '/nette/utils/src/Utils/Callback.php',
        '_HumbugBoxb94336daae36\\Nette\\Utils\\DateTime' => __DIR__ . '/..' . '/nette/utils/src/Utils/DateTime.php',
        '_HumbugBoxb94336daae36\\Nette\\Utils\\FileSystem' => __DIR__ . '/..' . '/nette/utils/src/Utils/FileSystem.php',
        '_HumbugBoxb94336daae36\\Nette\\Utils\\Finder' => __DIR__ . '/..' . '/nette/finder/src/Utils/Finder.php',
        '_HumbugBoxb94336daae36\\Nette\\Utils\\Html' => __DIR__ . '/..' . '/nette/utils/src/Utils/Html.php',
        '_HumbugBoxb94336daae36\\Nette\\Utils\\IHtmlString' => __DIR__ . '/..' . '/nette/utils/src/Utils/IHtmlString.php',
        '_HumbugBoxb94336daae36\\Nette\\Utils\\Image' => __DIR__ . '/..' . '/nette/utils/src/Utils/Image.php',
        '_HumbugBoxb94336daae36\\Nette\\Utils\\ImageException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
        '_HumbugBoxb94336daae36\\Nette\\Utils\\Json' => __DIR__ . '/..' . '/nette/utils/src/Utils/Json.php',
        '_HumbugBoxb94336daae36\\Nette\\Utils\\JsonException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
        '_HumbugBoxb94336daae36\\Nette\\Utils\\ObjectHelpers' => __DIR__ . '/..' . '/nette/utils/src/Utils/ObjectHelpers.php',
        '_HumbugBoxb94336daae36\\Nette\\Utils\\ObjectMixin' => __DIR__ . '/..' . '/nette/utils/src/Utils/ObjectMixin.php',
        '_HumbugBoxb94336daae36\\Nette\\Utils\\Paginator' => __DIR__ . '/..' . '/nette/utils/src/Utils/Paginator.php',
        '_HumbugBoxb94336daae36\\Nette\\Utils\\Random' => __DIR__ . '/..' . '/nette/utils/src/Utils/Random.php',
        '_HumbugBoxb94336daae36\\Nette\\Utils\\Reflection' => __DIR__ . '/..' . '/nette/utils/src/Utils/Reflection.php',
        '_HumbugBoxb94336daae36\\Nette\\Utils\\RegexpException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
        '_HumbugBoxb94336daae36\\Nette\\Utils\\Strings' => __DIR__ . '/..' . '/nette/utils/src/Utils/Strings.php',
        '_HumbugBoxb94336daae36\\Nette\\Utils\\UnknownImageFileException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
        '_HumbugBoxb94336daae36\\Nette\\Utils\\Validators' => __DIR__ . '/..' . '/nette/utils/src/Utils/Validators.php',
        '_HumbugBoxb94336daae36\\PackageVersions\\FallbackVersions' => __DIR__ . '/..' . '/ocramius/package-versions/src/PackageVersions/FallbackVersions.php',
        '_HumbugBoxb94336daae36\\PackageVersions\\Installer' => __DIR__ . '/..' . '/ocramius/package-versions/src/PackageVersions/Installer.php',
        '_HumbugBoxb94336daae36\\PackageVersions\\Versions' => __DIR__ . '/..' . '/ocramius/package-versions/src/PackageVersions/Versions.php',
        '_HumbugBoxb94336daae36\\Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/AbstractLogger.php',
        '_HumbugBoxb94336daae36\\Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/Psr/Log/InvalidArgumentException.php',
        '_HumbugBoxb94336daae36\\Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/Psr/Log/LogLevel.php',
        '_HumbugBoxb94336daae36\\Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareInterface.php',
        '_HumbugBoxb94336daae36\\Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareTrait.php',
        '_HumbugBoxb94336daae36\\Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerInterface.php',
        '_HumbugBoxb94336daae36\\Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerTrait.php',
        '_HumbugBoxb94336daae36\\Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php',
        '_HumbugBoxb94336daae36\\Psr\\Log\\Test\\DummyTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
        '_HumbugBoxb94336daae36\\Psr\\Log\\Test\\LoggerInterfaceTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
        '_HumbugBoxb94336daae36\\Psr\\Log\\Test\\TestLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/TestLogger.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Application' => __DIR__ . '/..' . '/symfony/console/Application.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => __DIR__ . '/..' . '/symfony/console/CommandLoader/CommandLoaderInterface.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/ContainerCommandLoader.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/FactoryCommandLoader.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Command\\Command' => __DIR__ . '/..' . '/symfony/console/Command/Command.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Command\\HelpCommand' => __DIR__ . '/..' . '/symfony/console/Command/HelpCommand.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Command\\ListCommand' => __DIR__ . '/..' . '/symfony/console/Command/ListCommand.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Command\\LockableTrait' => __DIR__ . '/..' . '/symfony/console/Command/LockableTrait.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\ConsoleEvents' => __DIR__ . '/..' . '/symfony/console/ConsoleEvents.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => __DIR__ . '/..' . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => __DIR__ . '/..' . '/symfony/console/Descriptor/ApplicationDescription.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Descriptor\\Descriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/Descriptor.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => __DIR__ . '/..' . '/symfony/console/Descriptor/DescriptorInterface.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/JsonDescriptor.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/MarkdownDescriptor.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/TextDescriptor.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/XmlDescriptor.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\EventListener\\ErrorListener' => __DIR__ . '/..' . '/symfony/console/EventListener/ErrorListener.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleCommandEvent.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Event\\ConsoleErrorEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleErrorEvent.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Event\\ConsoleEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleEvent.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Event\\ConsoleExceptionEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleExceptionEvent.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleTerminateEvent.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/CommandNotFoundException.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/console/Exception/ExceptionInterface.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidArgumentException.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Exception\\InvalidOptionException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidOptionException.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/console/Exception/LogicException.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/console/Exception/RuntimeException.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Formatter\\OutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatter.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterInterface.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyle.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleInterface.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleStack.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DebugFormatterHelper.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\DescriptorHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DescriptorHelper.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\FormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/FormatterHelper.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\Helper' => __DIR__ . '/..' . '/symfony/console/Helper/Helper.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\HelperInterface' => __DIR__ . '/..' . '/symfony/console/Helper/HelperInterface.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\HelperSet' => __DIR__ . '/..' . '/symfony/console/Helper/HelperSet.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\InputAwareHelper' => __DIR__ . '/..' . '/symfony/console/Helper/InputAwareHelper.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\ProcessHelper' => __DIR__ . '/..' . '/symfony/console/Helper/ProcessHelper.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\ProgressBar' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressBar.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\ProgressIndicator' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressIndicator.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\QuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/QuestionHelper.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/SymfonyQuestionHelper.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\Table' => __DIR__ . '/..' . '/symfony/console/Helper/Table.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\TableCell' => __DIR__ . '/..' . '/symfony/console/Helper/TableCell.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\TableSeparator' => __DIR__ . '/..' . '/symfony/console/Helper/TableSeparator.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Helper\\TableStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableStyle.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Input\\ArgvInput' => __DIR__ . '/..' . '/symfony/console/Input/ArgvInput.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Input\\ArrayInput' => __DIR__ . '/..' . '/symfony/console/Input/ArrayInput.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Input\\Input' => __DIR__ . '/..' . '/symfony/console/Input/Input.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Input\\InputArgument' => __DIR__ . '/..' . '/symfony/console/Input/InputArgument.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Input\\InputAwareInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputAwareInterface.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Input\\InputDefinition' => __DIR__ . '/..' . '/symfony/console/Input/InputDefinition.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Input\\InputInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputInterface.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Input\\InputOption' => __DIR__ . '/..' . '/symfony/console/Input/InputOption.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Input\\StreamableInputInterface' => __DIR__ . '/..' . '/symfony/console/Input/StreamableInputInterface.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Input\\StringInput' => __DIR__ . '/..' . '/symfony/console/Input/StringInput.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Logger\\ConsoleLogger' => __DIR__ . '/..' . '/symfony/console/Logger/ConsoleLogger.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Output\\BufferedOutput' => __DIR__ . '/..' . '/symfony/console/Output/BufferedOutput.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Output\\ConsoleOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutput.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutputInterface.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Output\\NullOutput' => __DIR__ . '/..' . '/symfony/console/Output/NullOutput.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Output\\Output' => __DIR__ . '/..' . '/symfony/console/Output/Output.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Output\\OutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/OutputInterface.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Output\\StreamOutput' => __DIR__ . '/..' . '/symfony/console/Output/StreamOutput.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Question\\ChoiceQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ChoiceQuestion.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ConfirmationQuestion.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Question\\Question' => __DIR__ . '/..' . '/symfony/console/Question/Question.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Style\\OutputStyle' => __DIR__ . '/..' . '/symfony/console/Style/OutputStyle.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Style\\StyleInterface' => __DIR__ . '/..' . '/symfony/console/Style/StyleInterface.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Style\\SymfonyStyle' => __DIR__ . '/..' . '/symfony/console/Style/SymfonyStyle.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Terminal' => __DIR__ . '/..' . '/symfony/console/Terminal.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Tester\\ApplicationTester' => __DIR__ . '/..' . '/symfony/console/Tester/ApplicationTester.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\Tester\\CommandTester' => __DIR__ . '/..' . '/symfony/console/Tester/CommandTester.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\BufferingLogger' => __DIR__ . '/..' . '/symfony/debug/BufferingLogger.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\Debug' => __DIR__ . '/..' . '/symfony/debug/Debug.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\DebugClassLoader' => __DIR__ . '/..' . '/symfony/debug/DebugClassLoader.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\ErrorHandler' => __DIR__ . '/..' . '/symfony/debug/ErrorHandler.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\ExceptionHandler' => __DIR__ . '/..' . '/symfony/debug/ExceptionHandler.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\Exception\\ClassNotFoundException' => __DIR__ . '/..' . '/symfony/debug/Exception/ClassNotFoundException.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\Exception\\ContextErrorException' => __DIR__ . '/..' . '/symfony/debug/Exception/ContextErrorException.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\Exception\\FatalErrorException' => __DIR__ . '/..' . '/symfony/debug/Exception/FatalErrorException.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\Exception\\FatalThrowableError' => __DIR__ . '/..' . '/symfony/debug/Exception/FatalThrowableError.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\Exception\\FlattenException' => __DIR__ . '/..' . '/symfony/debug/Exception/FlattenException.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\Exception\\OutOfMemoryException' => __DIR__ . '/..' . '/symfony/debug/Exception/OutOfMemoryException.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\Exception\\SilencedErrorContext' => __DIR__ . '/..' . '/symfony/debug/Exception/SilencedErrorContext.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\Exception\\UndefinedFunctionException' => __DIR__ . '/..' . '/symfony/debug/Exception/UndefinedFunctionException.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\Exception\\UndefinedMethodException' => __DIR__ . '/..' . '/symfony/debug/Exception/UndefinedMethodException.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\FatalErrorHandler\\ClassNotFoundFatalErrorHandler' => __DIR__ . '/..' . '/symfony/debug/FatalErrorHandler/ClassNotFoundFatalErrorHandler.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\FatalErrorHandler\\FatalErrorHandlerInterface' => __DIR__ . '/..' . '/symfony/debug/FatalErrorHandler/FatalErrorHandlerInterface.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\FatalErrorHandler\\UndefinedFunctionFatalErrorHandler' => __DIR__ . '/..' . '/symfony/debug/FatalErrorHandler/UndefinedFunctionFatalErrorHandler.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\FatalErrorHandler\\UndefinedMethodFatalErrorHandler' => __DIR__ . '/..' . '/symfony/debug/FatalErrorHandler/UndefinedMethodFatalErrorHandler.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Comparator\\Comparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/Comparator.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Comparator\\DateComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/DateComparator.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Comparator\\NumberComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/NumberComparator.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => __DIR__ . '/..' . '/symfony/finder/Exception/AccessDeniedException.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/finder/Exception/ExceptionInterface.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Finder' => __DIR__ . '/..' . '/symfony/finder/Finder.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Glob' => __DIR__ . '/..' . '/symfony/finder/Glob.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/CustomFilterIterator.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/DateRangeFilterIterator.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/DepthRangeFilterIterator.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FileTypeFilterIterator.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilecontentFilterIterator.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilenameFilterIterator.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\FilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilterIterator.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/PathFilterIterator.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SizeRangeFilterIterator.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\Iterator\\SortableIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SortableIterator.php',
        '_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\SplFileInfo' => __DIR__ . '/..' . '/symfony/finder/SplFileInfo.php',
        '_HumbugBoxb94336daae36\\Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php',
    );

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

        }, null, ClassLoader::class);
    }
}
<?php

// autoload_real.php @generated by Composer

class ComposerAutoloaderInit6dce0c234fc32484ec6b4f3a33bb4a6f
{
    private static $loader;

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

    public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }

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

        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
        if ($useStaticLoader) {
            require_once __DIR__ . '/autoload_static.php';

            call_user_func(\Composer\Autoload\ComposerStaticInit6dce0c234fc32484ec6b4f3a33bb4a6f::getInitializer($loader));
        } else {
            $classMap = require __DIR__ . '/autoload_classmap.php';
            if ($classMap) {
                $loader->addClassMap($classMap);
            }
        }

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

        if ($useStaticLoader) {
            $includeFiles = Composer\Autoload\ComposerStaticInit6dce0c234fc32484ec6b4f3a33bb4a6f::$files;
        } else {
            $includeFiles = require __DIR__ . '/autoload_files.php';
        }
        foreach ($includeFiles as $fileIdentifier => $file) {
            composerRequire6dce0c234fc32484ec6b4f3a33bb4a6f($fileIdentifier, $file);
        }

        return $loader;
    }
}

function composerRequire6dce0c234fc32484ec6b4f3a33bb4a6f($fileIdentifier, $file)
{
    if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
        require $file;

        $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
    }
}
<?php

// autoload_files.php @generated by Composer

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

return array(
    '59af96974553a1fc6407327354b6f47e' => $vendorDir . '/nette/di/src/compatibility.php',
    '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
);
Licenses
========

Good news! You may use Nette Framework under the terms of either
the New BSD License or the GNU General Public License (GPL) version 2 or 3.

The BSD License is recommended for most projects. It is easy to understand and it
places almost no restrictions on what you can do with the framework. If the GPL
fits better to your project, you can use the framework under this license.

You don't have to notify anyone which license you are using. You can freely
use Nette Framework in commercial projects as long as the copyright header
remains intact.

Please be advised that the name "Nette Framework" is a protected trademark and its
usage has some limitations. So please do not use word "Nette" in the name of your
project or top-level domain, and choose a name that stands on its own merits.
If your stuff is good, it will not take long to establish a reputation for yourselves.


New BSD License
---------------

Copyright (c) 2004, 2014 David Grudl (https://davidgrudl.com)
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 "Nette Framework" 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 owner 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.


GNU General Public License
--------------------------

GPL licenses are very very long, so instead of including them here we offer
you URLs with full text:

- [GPL version 2](http://www.gnu.org/licenses/gpl-2.0.html)
- [GPL version 3](http://www.gnu.org/licenses/gpl-3.0.html)
{
    "name": "nette\/di",
    "description": "\ud83d\udc8e Nette Dependency Injection Container: Flexible, compiled and full-featured DIC with perfectly usable autowiring and support for all new PHP 7.1 features.",
    "keywords": [
        "nette",
        "di",
        "dic",
        "ioc",
        "factory",
        "compiled",
        "static"
    ],
    "homepage": "https:\/\/nette.org",
    "license": [
        "BSD-3-Clause",
        "GPL-2.0",
        "GPL-3.0"
    ],
    "authors": [
        {
            "name": "David Grudl",
            "homepage": "https:\/\/davidgrudl.com"
        },
        {
            "name": "Nette Community",
            "homepage": "https:\/\/nette.org\/contributors"
        }
    ],
    "require": {
        "php": ">=7.1",
        "ext-tokenizer": "*",
        "nette\/neon": "^3.0",
        "nette\/php-generator": "^3.2.2",
        "nette\/robot-loader": "^3.2",
        "nette\/schema": "^1.0",
        "nette\/utils": "^3.0"
    },
    "require-dev": {
        "nette\/tester": "^2.2",
        "tracy\/tracy": "^2.3"
    },
    "conflict": {
        "nette\/bootstrap": "<3.0"
    },
    "autoload": {
        "classmap": [
            "src\/"
        ],
        "files": [
            "src\/compatibility.php"
        ]
    },
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "3.0-dev"
        }
    }
}<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI;

use _HumbugBoxb94336daae36\Nette;
/**
 * The dependency injection container default implementation.
 */
class Container
{
    use Nette\SmartObject;
    /** @var array  user parameters */
    public $parameters = [];
    /** @var string[]  services name => type (complete list of available services) */
    protected $types = [];
    /** @var string[]  alias => service name */
    protected $aliases = [];
    /** @var array[]  tag name => service name => tag value */
    protected $tags = [];
    /** @var array[]  type => level => services */
    protected $wiring = [];
    /** @var object[]  service name => instance */
    private $instances = [];
    /** @var array circular reference detector */
    private $creating;
    /** @var array */
    private $methods;
    public function __construct(array $params = [])
    {
        $this->parameters = $params;
        $this->methods = \array_flip(\get_class_methods($this));
    }
    public function getParameters() : array
    {
        return $this->parameters;
    }
    /**
     * Adds the service to the container.
     * @param  object  $service  service or its factory
     * @return static
     */
    public function addService(string $name, $service)
    {
        $name = $this->aliases[$name] ?? $name;
        if (isset($this->instances[$name])) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException("Service '{$name}' already exists.");
        } elseif (!\is_object($service)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException(\sprintf("Service '%s' must be a object, %s given.", $name, \gettype($service)));
        }
        $type = $service instanceof \Closure ? (string) (new \ReflectionFunction($service))->getReturnType() : \get_class($service);
        if (!isset($this->methods[self::getMethodName($name)])) {
            \trigger_error(__METHOD__ . "() service '{$name}' should be defined as 'imported'", \E_USER_NOTICE);
            $this->types[$name] = $type;
        } elseif (($expectedType = $this->getServiceType($name)) && !\is_a($type, $expectedType, \true)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Service '{$name}' must be instance of {$expectedType}, " . ($type ? "{$type} given." : 'add typehint to closure.'));
        }
        if ($service instanceof \Closure) {
            $this->methods[self::getMethodName($name)] = $service;
            $this->types[$name] = $type;
        } else {
            $this->instances[$name] = $service;
        }
        return $this;
    }
    /**
     * Removes the service from the container.
     */
    public function removeService(string $name) : void
    {
        $name = $this->aliases[$name] ?? $name;
        unset($this->instances[$name]);
    }
    /**
     * Gets the service object by name.
     * @return object
     * @throws MissingServiceException
     */
    public function getService(string $name)
    {
        if (!isset($this->instances[$name])) {
            if (isset($this->aliases[$name])) {
                return $this->getService($this->aliases[$name]);
            }
            $this->instances[$name] = $this->createService($name);
        }
        return $this->instances[$name];
    }
    /**
     * Gets the service type by name.
     * @throws MissingServiceException
     */
    public function getServiceType(string $name) : string
    {
        $method = self::getMethodName($name);
        if (isset($this->aliases[$name])) {
            return $this->getServiceType($this->aliases[$name]);
        } elseif (isset($this->types[$name])) {
            return $this->types[$name];
        } elseif (isset($this->methods[$method])) {
            return (string) (new \ReflectionMethod($this, $method))->getReturnType();
        } else {
            throw new \_HumbugBoxb94336daae36\Nette\DI\MissingServiceException("Service '{$name}' not found.");
        }
    }
    /**
     * Does the service exist?
     */
    public function hasService(string $name) : bool
    {
        $name = $this->aliases[$name] ?? $name;
        return isset($this->methods[self::getMethodName($name)]) || isset($this->instances[$name]);
    }
    /**
     * Is the service created?
     */
    public function isCreated(string $name) : bool
    {
        if (!$this->hasService($name)) {
            throw new \_HumbugBoxb94336daae36\Nette\DI\MissingServiceException("Service '{$name}' not found.");
        }
        $name = $this->aliases[$name] ?? $name;
        return isset($this->instances[$name]);
    }
    /**
     * Creates new instance of the service.
     * @return object
     * @throws MissingServiceException
     */
    public function createService(string $name, array $args = [])
    {
        $name = $this->aliases[$name] ?? $name;
        $method = self::getMethodName($name);
        $cb = $this->methods[$method] ?? null;
        if (isset($this->creating[$name])) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException(\sprintf('Circular reference detected for services: %s.', \implode(', ', \array_keys($this->creating))));
        } elseif ($cb === null) {
            throw new \_HumbugBoxb94336daae36\Nette\DI\MissingServiceException("Service '{$name}' not found.");
        }
        try {
            $this->creating[$name] = \true;
            $service = $cb instanceof \Closure ? $cb(...$args) : $this->{$method}(...$args);
        } finally {
            unset($this->creating[$name]);
        }
        if (!\is_object($service)) {
            throw new \_HumbugBoxb94336daae36\Nette\UnexpectedValueException("Unable to create service '{$name}', value returned by " . ($cb instanceof \Closure ? 'closure' : "method {$method}()") . ' is not object.');
        }
        return $service;
    }
    /**
     * Resolves service by type.
     * @param  bool  $throw  exception if service doesn't exist?
     * @return object|null  service
     * @throws MissingServiceException
     */
    public function getByType(string $type, bool $throw = \true)
    {
        $type = \_HumbugBoxb94336daae36\Nette\DI\Helpers::normalizeClass($type);
        if (!empty($this->wiring[$type][0])) {
            if (\count($names = $this->wiring[$type][0]) === 1) {
                return $this->getService($names[0]);
            }
            \natsort($names);
            throw new \_HumbugBoxb94336daae36\Nette\DI\MissingServiceException("Multiple services of type {$type} found: " . \implode(', ', $names) . '.');
        } elseif ($throw) {
            throw new \_HumbugBoxb94336daae36\Nette\DI\MissingServiceException("Service of type {$type} not found.");
        }
        return null;
    }
    /**
     * Gets the autowired service names of the specified type.
     * @return string[]
     * @internal
     */
    public function findAutowired(string $type) : array
    {
        $type = \_HumbugBoxb94336daae36\Nette\DI\Helpers::normalizeClass($type);
        return \array_merge($this->wiring[$type][0] ?? [], $this->wiring[$type][1] ?? []);
    }
    /**
     * Gets the service names of the specified type.
     * @return string[]
     */
    public function findByType(string $type) : array
    {
        $type = \_HumbugBoxb94336daae36\Nette\DI\Helpers::normalizeClass($type);
        return empty($this->wiring[$type]) ? [] : \array_merge(...\array_values($this->wiring[$type]));
    }
    /**
     * Gets the service names of the specified tag.
     * @return array of [service name => tag attributes]
     */
    public function findByTag(string $tag) : array
    {
        return $this->tags[$tag] ?? [];
    }
    /********************* autowiring ****************d*g**/
    /**
     * Creates new instance using autowiring.
     * @return object
     * @throws Nette\InvalidArgumentException
     */
    public function createInstance(string $class, array $args = [])
    {
        $rc = new \ReflectionClass($class);
        if (!$rc->isInstantiable()) {
            throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Class {$class} is not instantiable.");
        } elseif ($constructor = $rc->getConstructor()) {
            return $rc->newInstanceArgs(\_HumbugBoxb94336daae36\Nette\DI\Resolver::autowireArguments($constructor, $args, $this));
        } elseif ($args) {
            throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Unable to pass arguments, class {$class} has no constructor.");
        }
        return new $class();
    }
    /**
     * Calls all methods starting with with "inject" using autowiring.
     * @param  object  $service
     */
    public function callInjects($service) : void
    {
        \_HumbugBoxb94336daae36\Nette\DI\Extensions\InjectExtension::callInjects($this, $service);
    }
    /**
     * Calls method using autowiring.
     * @return mixed
     */
    public function callMethod(callable $function, array $args = [])
    {
        return $function(...\_HumbugBoxb94336daae36\Nette\DI\Resolver::autowireArguments(\_HumbugBoxb94336daae36\Nette\Utils\Callback::toReflection($function), $args, $this));
    }
    public static function getMethodName(string $name) : string
    {
        if ($name === '') {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Service name must be a non-empty string.');
        }
        return 'createService' . \str_replace('.', '__', \ucfirst($name));
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\DI\Definitions\Definition;
use _HumbugBoxb94336daae36\Nette\DI\Definitions\Reference;
use _HumbugBoxb94336daae36\Nette\DI\Definitions\Statement;
use _HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers as PhpHelpers;
use _HumbugBoxb94336daae36\Nette\Utils\Reflection;
use _HumbugBoxb94336daae36\Nette\Utils\Strings;
use _HumbugBoxb94336daae36\Nette\Utils\Validators;
use ReflectionClass;
/**
 * Services resolver
 * @internal
 */
class Resolver
{
    use Nette\SmartObject;
    /** @var ContainerBuilder */
    private $builder;
    /** @var Definition|null */
    private $currentService;
    /** @var string|null */
    private $currentServiceType;
    /** @var bool */
    private $currentServiceAllowed;
    /** @var \SplObjectStorage  circular reference detector */
    private $recursive;
    public function __construct(\_HumbugBoxb94336daae36\Nette\DI\ContainerBuilder $builder)
    {
        $this->builder = $builder;
        $this->recursive = new \SplObjectStorage();
    }
    public function getContainerBuilder() : \_HumbugBoxb94336daae36\Nette\DI\ContainerBuilder
    {
        return $this->builder;
    }
    public function resolveDefinition(\_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition $def) : void
    {
        if ($this->recursive->contains($def)) {
            $names = \array_map(function ($item) {
                return $item->getName();
            }, \iterator_to_array($this->recursive));
            throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException(\sprintf('Circular reference detected for services: %s.', \implode(', ', $names)));
        }
        try {
            $this->recursive->attach($def);
            $def->resolveType($this);
            if (!$def->getType()) {
                throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException('Type of service is unknown.');
            }
        } catch (\Exception $e) {
            throw $this->completeException($e, $def);
        } finally {
            $this->recursive->detach($def);
        }
    }
    public function resolveReferenceType(\_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference $ref) : ?string
    {
        if ($ref->isSelf()) {
            return $this->currentServiceType;
        } elseif ($ref->isType()) {
            return \ltrim($ref->getValue(), '\\');
        }
        $def = $this->resolveReference($ref);
        if (!$def->getType()) {
            $this->resolveDefinition($def);
        }
        return $def->getType();
    }
    public function resolveEntityType(\_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement $statement) : ?string
    {
        $entity = $this->normalizeEntity($statement);
        if (\is_array($entity)) {
            if ($entity[0] instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference || $entity[0] instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement) {
                $entity[0] = $this->resolveEntityType($entity[0] instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement ? $entity[0] : new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement($entity[0]));
                if (!$entity[0]) {
                    return null;
                }
            }
            try {
                $reflection = \_HumbugBoxb94336daae36\Nette\Utils\Callback::toReflection($entity[0] === '' ? $entity[1] : $entity);
                $refClass = $reflection instanceof \ReflectionMethod ? $reflection->getDeclaringClass() : null;
            } catch (\ReflectionException $e) {
            }
            if (isset($e) || $refClass && (!$reflection->isPublic() || $refClass->isTrait() && !$reflection->isStatic())) {
                throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException(\sprintf('Method %s() is not callable.', \_HumbugBoxb94336daae36\Nette\Utils\Callback::toString($entity)), 0, $e ?? null);
            }
            $this->addDependency($reflection);
            $type = \_HumbugBoxb94336daae36\Nette\DI\Helpers::getReturnType($reflection);
            if ($type && !\class_exists($type) && !\interface_exists($type)) {
                throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException(\sprintf("Class or interface '%s' not found. Is return type of %s() correct?", $type, \_HumbugBoxb94336daae36\Nette\Utils\Callback::toString($entity)));
            }
            return $type;
        } elseif ($entity instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference) {
            // alias or factory
            return $this->resolveReferenceType($entity);
        } elseif (\is_string($entity)) {
            // class
            if (!\class_exists($entity)) {
                throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Class {$entity} not found.");
            }
            return $entity;
        }
        return null;
    }
    public function completeDefinition(\_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition $def) : void
    {
        $this->currentService = \in_array($def, $this->builder->getDefinitions(), \true) ? $def : null;
        $this->currentServiceType = $def->getType();
        $this->currentServiceAllowed = \false;
        try {
            $def->complete($this);
            $this->addDependency(new \ReflectionClass($def->getType()));
        } catch (\Exception $e) {
            throw $this->completeException($e, $def);
        } finally {
            $this->currentService = $this->currentServiceType = null;
        }
    }
    public function completeStatement(\_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement $statement, bool $currentServiceAllowed = \false) : \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement
    {
        $this->currentServiceAllowed = $currentServiceAllowed;
        $entity = $this->normalizeEntity($statement);
        $arguments = $this->convertReferences($statement->arguments);
        switch (\true) {
            case \is_string($entity) && \_HumbugBoxb94336daae36\Nette\Utils\Strings::contains($entity, '?'):
                // PHP literal
                break;
            case $entity === 'not':
                $entity = ['', '!'];
                break;
            case \is_string($entity):
                // create class
                if (!\class_exists($entity)) {
                    throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Class {$entity} not found.");
                } elseif ((new \ReflectionClass($entity))->isAbstract()) {
                    throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Class {$entity} is abstract.");
                } elseif (($rm = (new \ReflectionClass($entity))->getConstructor()) !== null && !$rm->isPublic()) {
                    $visibility = $rm->isProtected() ? 'protected' : 'private';
                    throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Class {$entity} has {$visibility} constructor.");
                } elseif ($constructor = (new \ReflectionClass($entity))->getConstructor()) {
                    $arguments = self::autowireArguments($constructor, $arguments, $this, $this->currentService);
                    $this->addDependency($constructor);
                } elseif ($arguments) {
                    throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Unable to pass arguments, class {$entity} has no constructor.");
                }
                break;
            case $entity instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference:
                $entity = [new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference(\_HumbugBoxb94336daae36\Nette\DI\ContainerBuilder::THIS_CONTAINER), \_HumbugBoxb94336daae36\Nette\DI\Container::getMethodName($entity->getValue())];
                break;
            case \is_array($entity):
                if (!\preg_match('#^\\$?(\\\\?' . \_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::PHP_IDENT . ')+(\\[\\])?\\z#', $entity[1])) {
                    throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Expected function, method or property name, '{$entity[1]}' given.");
                }
                switch (\true) {
                    case $entity[0] === '':
                        // function call
                        if (!\_HumbugBoxb94336daae36\Nette\Utils\Arrays::isList($arguments)) {
                            throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Unable to pass specified arguments to {$entity[0]}.");
                        } elseif (!\function_exists($entity[1])) {
                            throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Function {$entity[1]} doesn't exist.");
                        }
                        $rf = new \ReflectionFunction($entity[1]);
                        $arguments = self::autowireArguments($rf, $arguments, $this, $this->currentService);
                        $this->addDependency($rf);
                        break;
                    case $entity[0] instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement:
                        $entity[0] = $this->completeStatement($entity[0], $this->currentServiceAllowed);
                    // break omitted
                    case \is_string($entity[0]):
                    // static method call
                    case $entity[0] instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference:
                        if ($entity[1][0] === '$') {
                            // property getter, setter or appender
                            \_HumbugBoxb94336daae36\Nette\Utils\Validators::assert($arguments, 'list:0..1', "setup arguments for '" . \_HumbugBoxb94336daae36\Nette\Utils\Callback::toString($entity) . "'");
                            if (!$arguments && \substr($entity[1], -2) === '[]') {
                                throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Missing argument for {$entity[1]}.");
                            }
                        } elseif ($type = $entity[0] instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference ? $this->resolveReferenceType($entity[0]) : $this->resolveEntityType($entity[0] instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement ? $entity[0] : new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement($entity[0]))) {
                            $rc = new \ReflectionClass($type);
                            if ($rc->hasMethod($entity[1])) {
                                $rm = $rc->getMethod($entity[1]);
                                if (!$rm->isPublic()) {
                                    throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("{$type}::{$entity[1]}() is not callable.");
                                }
                                $arguments = self::autowireArguments($rm, $arguments, $this, $this->currentService);
                                $this->addDependency($rm);
                            } elseif (!\_HumbugBoxb94336daae36\Nette\Utils\Arrays::isList($arguments)) {
                                throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Unable to pass specified arguments to {$type}::{$entity[1]}().");
                            }
                        }
                }
        }
        try {
            $arguments = $this->completeArguments($arguments);
        } catch (\_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException $e) {
            if (!\strpos($e->getMessage(), ' (used in')) {
                $e->setMessage($e->getMessage() . " (used in {$this->entityToString($entity)})");
            }
            throw $e;
        }
        return new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement($entity, $arguments);
    }
    private function completeArguments(array $arguments) : array
    {
        \array_walk_recursive($arguments, function (&$val) : void {
            if ($val instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement) {
                $entity = $val->getEntity();
                if ($entity === 'typed' || $entity === 'tagged') {
                    $services = [];
                    $current = $this->currentService ? $this->currentService->getName() : null;
                    foreach ($val->arguments as $argument) {
                        foreach ($entity === 'tagged' ? $this->builder->findByTag($argument) : $this->builder->findAutowired($argument) as $name => $foo) {
                            if ($name !== $current) {
                                $services[] = new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference($name);
                            }
                        }
                    }
                    $val = $this->completeArguments($services);
                } else {
                    $val = $this->completeStatement($val, $this->currentServiceAllowed);
                }
            } elseif ($val instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition || $val instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference) {
                $val = $this->normalizeEntity(new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement($val));
            }
        });
        return $arguments;
    }
    /**
     * @return string|array|Reference  literal, Class, Reference, [Class, member], [, globalFunc], [Reference, member], [Statement, member]
     */
    private function normalizeEntity(\_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement $statement)
    {
        $entity = $statement->getEntity();
        if (\is_array($entity)) {
            $item =& $entity[0];
        } else {
            $item =& $entity;
        }
        if ($item instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition) {
            $name = \current(\array_keys($this->builder->getDefinitions(), $item, \true));
            if ($name == \false) {
                throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Service '{$item->getName()}' not found in definitions.");
            }
            $item = new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference($name);
        }
        if ($item instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference) {
            $item = $this->normalizeReference($item);
        }
        return $entity;
    }
    /**
     * Normalizes reference to 'self' or named reference (or leaves it typed if it is not possible during resolving) and checks existence of service.
     */
    public function normalizeReference(\_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference $ref) : \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference
    {
        $service = $ref->getValue();
        if ($ref->isSelf()) {
            return $ref;
        } elseif ($ref->isName()) {
            if (!$this->builder->hasDefinition($service)) {
                throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Reference to missing service '{$service}'.");
            }
            return $this->currentService && $service === $this->currentService->getName() ? new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference(\_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference::SELF) : $ref;
        } else {
            try {
                $res = $this->getByType($service);
            } catch (\_HumbugBoxb94336daae36\Nette\DI\NotAllowedDuringResolvingException $e) {
                return new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference($service);
            }
            if (!$res) {
                throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Reference to missing service of type {$service}.");
            }
            return $res;
        }
    }
    public function resolveReference(\_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference $ref) : \_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition
    {
        return $ref->isSelf() ? $this->currentService : $this->builder->getDefinition($ref->getValue());
    }
    /**
     * Returns named reference to service resolved by type (or 'self' reference for local-autowiring).
     * @throws ServiceCreationException when multiple found
     * @throws MissingServiceException when not found
     */
    public function getByType(string $type) : \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference
    {
        if ($this->currentService && $this->currentServiceAllowed && \is_a($this->currentServiceType, $type, \true)) {
            return new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference(\_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference::SELF);
        }
        return new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference($this->builder->getByType($type, \true));
    }
    /**
     * Adds item to the list of dependencies.
     * @param  \ReflectionClass|\ReflectionFunctionAbstract|string  $dep
     * @return static
     */
    public function addDependency($dep)
    {
        $this->builder->addDependency($dep);
        return $this;
    }
    private function completeException(\Exception $e, \_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition $def) : \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException
    {
        if ($e instanceof \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException && \_HumbugBoxb94336daae36\Nette\Utils\Strings::startsWith($e->getMessage(), "Service '")) {
            return $e;
        } else {
            $name = $def->getName();
            $type = $def->getType();
            if (!$type) {
                $message = "Service '{$name}': " . $e->getMessage();
            } elseif (!$name || \ctype_digit($name)) {
                $message = "Service of type {$type}: " . \str_replace("{$type}::", '', $e->getMessage());
            } else {
                $message = "Service '{$name}' (type of {$type}): " . \str_replace("{$type}::", '', $e->getMessage());
            }
            return $e instanceof \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException ? $e->setMessage($message) : new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException($message, 0, $e);
        }
    }
    private function entityToString($entity) : string
    {
        $referenceToText = function (\_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference $ref) : string {
            return $ref->isSelf() && $this->currentService ? '@' . $this->currentService->getName() : '@' . $ref->getValue();
        };
        if (\is_string($entity)) {
            return $entity . '::__construct()';
        } elseif ($entity instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference) {
            $entity = $referenceToText($entity);
        } elseif (\is_array($entity)) {
            if (\strpos($entity[1], '$') === \false) {
                $entity[1] .= '()';
            }
            if ($entity[0] instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference) {
                $entity[0] = $referenceToText($entity[0]);
            } elseif (!\is_string($entity[0])) {
                return $entity[1];
            }
            return \implode('::', $entity);
        }
        return (string) $entity;
    }
    private function convertReferences(array $arguments) : array
    {
        \array_walk_recursive($arguments, function (&$val) : void {
            if (\is_string($val) && \strlen($val) > 1 && $val[0] === '@' && $val[1] !== '@') {
                $pair = \explode('::', \substr($val, 1), 2);
                if (!isset($pair[1])) {
                    // @service
                    $val = new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference($pair[0]);
                } elseif (\preg_match('#^[A-Z][A-Z0-9_]*\\z#', $pair[1], $m)) {
                    // @service::CONSTANT
                    $val = \_HumbugBoxb94336daae36\Nette\DI\ContainerBuilder::literal($this->resolveReferenceType(new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference($pair[0])) . '::' . $pair[1]);
                } else {
                    // @service::property
                    $val = new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement([new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference($pair[0]), '$' . $pair[1]]);
                }
            } elseif (\is_string($val) && \substr($val, 0, 2) === '@@') {
                // escaped text @@
                $val = \substr($val, 1);
            }
        });
        return $arguments;
    }
    /**
     * Add missing arguments using autowiring.
     * @param  Resolver|Container  $resolver
     * @throws ServiceCreationException
     */
    public static function autowireArguments(\ReflectionFunctionAbstract $method, array $arguments, $resolver, \_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition $current = null) : array
    {
        $optCount = 0;
        $num = -1;
        $res = [];
        $methodName = \_HumbugBoxb94336daae36\Nette\Utils\Reflection::toString($method) . '()';
        foreach ($method->getParameters() as $num => $parameter) {
            $paramName = $parameter->getName();
            if (!$parameter->isVariadic() && \array_key_exists($paramName, $arguments)) {
                $res[$num] = $arguments[$paramName];
                unset($arguments[$paramName], $arguments[$num]);
                $optCount = 0;
            } elseif (\array_key_exists($num, $arguments)) {
                $res[$num] = $arguments[$num];
                unset($arguments[$num]);
                $optCount = 0;
            } elseif (($type = \_HumbugBoxb94336daae36\Nette\Utils\Reflection::getParameterType($parameter)) && !\_HumbugBoxb94336daae36\Nette\Utils\Reflection::isBuiltinType($type)) {
                try {
                    $res[$num] = $resolver->getByType($type);
                } catch (\_HumbugBoxb94336daae36\Nette\DI\MissingServiceException $e) {
                    $res[$num] = null;
                } catch (\_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException $e) {
                    throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("{$e->getMessage()} (needed by \${$paramName} in {$methodName})", 0, $e);
                }
                if ($res[$num] === null) {
                    if ($parameter->allowsNull()) {
                        $optCount++;
                    } elseif (\class_exists($type) || \interface_exists($type)) {
                        throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Service of type {$type} needed by \${$paramName} in {$methodName} not found. Did you register it in configuration file?");
                    } else {
                        throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Class {$type} needed by \${$paramName} in {$methodName} not found. Check type hint and 'use' statements.");
                    }
                } else {
                    $optCount = 0;
                }
            } elseif ($method instanceof \ReflectionMethod && $parameter->isArray() && \preg_match('#@param[ \\t]+([\\w\\\\]+)\\[\\][ \\t]+\\$' . $paramName . '#', (string) $method->getDocComment(), $m) && ($type = \_HumbugBoxb94336daae36\Nette\Utils\Reflection::expandClassName($m[1], $method->getDeclaringClass())) && (\class_exists($type) || \interface_exists($type))) {
                $list = $resolver instanceof self ? $resolver->getContainerBuilder()->findAutowired($type) : \array_map([$resolver, 'getService'], $resolver->findAutowired($type));
                $res[$num] = [];
                foreach ($list as $item) {
                    if ($item !== $current) {
                        $res[$num][] = $item;
                    }
                }
            } elseif ($type && $parameter->allowsNull() || $parameter->isOptional() || $parameter->isDefaultValueAvailable()) {
                // !optional + defaultAvailable = func($a = null, $b) since 5.4.7
                // optional + !defaultAvailable = i.e. Exception::__construct, mysqli::mysqli, ...
                $res[$num] = $parameter->isDefaultValueAvailable() ? \_HumbugBoxb94336daae36\Nette\Utils\Reflection::getParameterDefaultValue($parameter) : null;
                $optCount++;
            } else {
                throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Parameter \${$paramName} in {$methodName} has no class type hint or default value, so its value must be specified.");
            }
        }
        // extra parameters
        while (\array_key_exists(++$num, $arguments)) {
            $res[$num] = $arguments[$num];
            unset($arguments[$num]);
            $optCount = 0;
        }
        if ($arguments) {
            throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Unable to pass specified arguments to {$methodName}.");
        }
        return $optCount ? \array_slice($res, 0, -$optCount) : $res;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI;

use _HumbugBoxb94336daae36\Nette;
/**
 * @internal
 */
final class DynamicParameter extends \_HumbugBoxb94336daae36\Nette\PhpGenerator\PhpLiteral implements \_HumbugBoxb94336daae36\Nette\Schema\DynamicParameter
{
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI\Config;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\Utils\Validators;
/**
 * Configuration file loader.
 */
class Loader
{
    use Nette\SmartObject;
    private const INCLUDES_KEY = 'includes';
    private $adapters = ['php' => \_HumbugBoxb94336daae36\Nette\DI\Config\Adapters\PhpAdapter::class, 'neon' => \_HumbugBoxb94336daae36\Nette\DI\Config\Adapters\NeonAdapter::class];
    private $dependencies = [];
    private $loadedFiles = [];
    private $parameters = [];
    /**
     * Reads configuration from file.
     */
    public function load(string $file, ?bool $merge = \true) : array
    {
        if (!\is_file($file) || !\is_readable($file)) {
            throw new \_HumbugBoxb94336daae36\Nette\FileNotFoundException("File '{$file}' is missing or is not readable.");
        }
        if (isset($this->loadedFiles[$file])) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException("Recursive included file '{$file}'");
        }
        $this->loadedFiles[$file] = \true;
        $this->dependencies[] = $file;
        $data = $this->getAdapter($file)->load($file);
        $res = [];
        if (isset($data[self::INCLUDES_KEY])) {
            \_HumbugBoxb94336daae36\Nette\Utils\Validators::assert($data[self::INCLUDES_KEY], 'list', "section 'includes' in file '{$file}'");
            $includes = \_HumbugBoxb94336daae36\Nette\DI\Helpers::expand($data[self::INCLUDES_KEY], $this->parameters);
            foreach ($includes as $include) {
                $include = $this->expandIncludedFile($include, $file);
                $res = \_HumbugBoxb94336daae36\Nette\Schema\Helpers::merge($this->load($include, $merge), $res);
            }
        }
        unset($data[self::INCLUDES_KEY], $this->loadedFiles[$file]);
        if ($merge === \false) {
            $res[] = $data;
        } else {
            $res = \_HumbugBoxb94336daae36\Nette\Schema\Helpers::merge($data, $res);
        }
        return $res;
    }
    /**
     * Save configuration to file.
     */
    public function save(array $data, string $file) : void
    {
        if (\file_put_contents($file, $this->getAdapter($file)->dump($data)) === \false) {
            throw new \_HumbugBoxb94336daae36\Nette\IOException("Cannot write file '{$file}'.");
        }
    }
    /**
     * Returns configuration files.
     */
    public function getDependencies() : array
    {
        return \array_unique($this->dependencies);
    }
    /**
     * Expands included file name.
     */
    public function expandIncludedFile(string $includedFile, string $mainFile) : string
    {
        return \preg_match('#([a-z]+:)?[/\\\\]#Ai', $includedFile) ? $includedFile : \dirname($mainFile) . '/' . $includedFile;
    }
    /**
     * Registers adapter for given file extension.
     * @param  string|Adapter  $adapter
     * @return static
     */
    public function addAdapter(string $extension, $adapter)
    {
        $this->adapters[\strtolower($extension)] = $adapter;
        return $this;
    }
    private function getAdapter(string $file) : \_HumbugBoxb94336daae36\Nette\DI\Config\Adapter
    {
        $extension = \strtolower(\pathinfo($file, \PATHINFO_EXTENSION));
        if (!isset($this->adapters[$extension])) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Unknown file extension '{$file}'.");
        }
        return \is_object($this->adapters[$extension]) ? $this->adapters[$extension] : new $this->adapters[$extension]();
    }
    /**
     * @return static
     */
    public function setParameters(array $params)
    {
        $this->parameters = $params;
        return $this;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI\Config;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\DI\Definitions;
use _HumbugBoxb94336daae36\Nette\DI\Definitions\Statement;
use _HumbugBoxb94336daae36\Nette\Schema\Context;
use _HumbugBoxb94336daae36\Nette\Schema\Expect;
use _HumbugBoxb94336daae36\Nette\Schema\Schema;
/**
 * Service configuration schema.
 */
class DefinitionSchema implements \_HumbugBoxb94336daae36\Nette\Schema\Schema
{
    use Nette\SmartObject;
    /** @var Nette\DI\ContainerBuilder */
    private $builder;
    public function __construct(\_HumbugBoxb94336daae36\Nette\DI\ContainerBuilder $builder)
    {
        $this->builder = $builder;
    }
    public function complete($def, \_HumbugBoxb94336daae36\Nette\Schema\Context $context)
    {
        if ($def === [\false]) {
            return (object) $def;
        }
        if (\_HumbugBoxb94336daae36\Nette\DI\Config\Helpers::takeParent($def)) {
            $def['reset']['all'] = \true;
        }
        foreach (['arguments', 'setup', 'tags'] as $k) {
            if (isset($def[$k]) && \_HumbugBoxb94336daae36\Nette\DI\Config\Helpers::takeParent($def[$k])) {
                $def['reset'][$k] = \true;
            }
        }
        $def = $this->expandParameters($def);
        $type = $this->sniffType(\end($context->path), $def);
        $def = $this->getSchema($type)->complete($def, $context);
        if ($def) {
            $def->defType = $type;
        }
        return $def;
    }
    public function merge($def, $base)
    {
        if (!empty($def['alteration'])) {
            unset($def['alteration']);
        }
        return \_HumbugBoxb94336daae36\Nette\Schema\Helpers::merge($def, $base);
    }
    /**
     * Normalizes configuration of service definitions.
     */
    public function normalize($def, \_HumbugBoxb94336daae36\Nette\Schema\Context $context)
    {
        if ($def === null || $def === \false) {
            return (array) $def;
        } elseif (\is_string($def) && \interface_exists($def)) {
            return ['implement' => $def];
        } elseif ($def instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement && \is_string($def->getEntity()) && \interface_exists($def->getEntity())) {
            $res = ['implement' => $def->getEntity()];
            if (\array_keys($def->arguments) === ['tagged']) {
                $res += $def->arguments;
            } elseif (\count($def->arguments) > 1) {
                $res['references'] = $def->arguments;
            } elseif ($factory = \array_shift($def->arguments)) {
                $res['factory'] = $factory;
            }
            return $res;
        } elseif (!\is_array($def) || isset($def[0], $def[1])) {
            return ['factory' => $def];
        } elseif (\is_array($def)) {
            if (isset($def['class']) && !isset($def['type'])) {
                if ($def['class'] instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement) {
                    $key = \end($context->path);
                    \trigger_error("Service '{$key}': option 'class' should be changed to 'factory'.", \E_USER_DEPRECATED);
                    $def['factory'] = $def['class'];
                    unset($def['class']);
                } elseif (!isset($def['factory']) && !isset($def['dynamic']) && !isset($def['imported'])) {
                    $def['factory'] = $def['class'];
                    unset($def['class']);
                }
            }
            foreach (['class' => 'type', 'dynamic' => 'imported'] as $alias => $original) {
                if (\array_key_exists($alias, $def)) {
                    if (\array_key_exists($original, $def)) {
                        throw new \_HumbugBoxb94336daae36\Nette\DI\InvalidConfigurationException("Options '{$alias}' and '{$original}' are aliases, use only '{$original}'.");
                    }
                    $def[$original] = $def[$alias];
                    unset($def[$alias]);
                }
            }
            return $def;
        } else {
            throw new \_HumbugBoxb94336daae36\Nette\DI\InvalidConfigurationException('Unexpected format of service definition');
        }
    }
    public function completeDefault(\_HumbugBoxb94336daae36\Nette\Schema\Context $context)
    {
    }
    private function sniffType($key, array $def) : string
    {
        if (\is_string($key)) {
            $name = \preg_match('#^@[\\w\\\\]+\\z#', $key) ? $this->builder->getByType(\substr($key, 1), \false) : $key;
            if ($name && $this->builder->hasDefinition($name)) {
                return \get_class($this->builder->getDefinition($name));
            }
        }
        if (isset($def['implement'], $def['references']) || isset($def['implement'], $def['tagged'])) {
            return \_HumbugBoxb94336daae36\Nette\DI\Definitions\LocatorDefinition::class;
        } elseif (isset($def['implement'])) {
            return \method_exists($def['implement'], 'create') ? \_HumbugBoxb94336daae36\Nette\DI\Definitions\FactoryDefinition::class : \_HumbugBoxb94336daae36\Nette\DI\Definitions\AccessorDefinition::class;
        } elseif (isset($def['imported'])) {
            return \_HumbugBoxb94336daae36\Nette\DI\Definitions\ImportedDefinition::class;
        } else {
            return \_HumbugBoxb94336daae36\Nette\DI\Definitions\ServiceDefinition::class;
        }
    }
    private function expandParameters(array $config) : array
    {
        $params = $this->builder->parameters;
        if (isset($config['parameters'])) {
            foreach ((array) $config['parameters'] as $k => $v) {
                $v = \explode(' ', \is_int($k) ? $v : $k);
                $params[\end($v)] = $this->builder::literal('$' . \end($v));
            }
        }
        return \_HumbugBoxb94336daae36\Nette\DI\Helpers::expand($config, $params);
    }
    private static function getSchema(string $type) : \_HumbugBoxb94336daae36\Nette\Schema\Schema
    {
        static $cache;
        $cache = $cache ?: [\_HumbugBoxb94336daae36\Nette\DI\Definitions\ServiceDefinition::class => self::getServiceSchema(), \_HumbugBoxb94336daae36\Nette\DI\Definitions\AccessorDefinition::class => self::getAccessorSchema(), \_HumbugBoxb94336daae36\Nette\DI\Definitions\FactoryDefinition::class => self::getFactorySchema(), \_HumbugBoxb94336daae36\Nette\DI\Definitions\LocatorDefinition::class => self::getLocatorSchema(), \_HumbugBoxb94336daae36\Nette\DI\Definitions\ImportedDefinition::class => self::getImportedSchema()];
        return $cache[$type];
    }
    private static function getServiceSchema() : \_HumbugBoxb94336daae36\Nette\Schema\Schema
    {
        return \_HumbugBoxb94336daae36\Nette\Schema\Expect::structure(['type' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::type('string'), 'factory' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::type('callable|_HumbugBoxb94336daae36\\Nette\\DI\\Definitions\\Statement'), 'arguments' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::array(), 'setup' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::listOf('callable|_HumbugBoxb94336daae36\\Nette\\DI\\Definitions\\Statement|array:1'), 'inject' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::bool(), 'autowired' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::type('bool|string|array'), 'tags' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::array(), 'reset' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::array(), 'alteration' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::bool()]);
    }
    private static function getAccessorSchema() : \_HumbugBoxb94336daae36\Nette\Schema\Schema
    {
        return \_HumbugBoxb94336daae36\Nette\Schema\Expect::structure(['type' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::string(), 'implement' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::string(), 'factory' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::type('callable|_HumbugBoxb94336daae36\\Nette\\DI\\Definitions\\Statement'), 'autowired' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::type('bool|string|array'), 'tags' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::array()]);
    }
    private static function getFactorySchema() : \_HumbugBoxb94336daae36\Nette\Schema\Schema
    {
        return \_HumbugBoxb94336daae36\Nette\Schema\Expect::structure(['type' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::string(), 'factory' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::type('callable|_HumbugBoxb94336daae36\\Nette\\DI\\Definitions\\Statement'), 'implement' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::string(), 'arguments' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::array(), 'setup' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::listOf('callable|_HumbugBoxb94336daae36\\Nette\\DI\\Definitions\\Statement|array:1'), 'parameters' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::array(), 'references' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::array(), 'tagged' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::string(), 'inject' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::bool(), 'autowired' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::type('bool|string|array'), 'tags' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::array(), 'reset' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::array()]);
    }
    private static function getLocatorSchema() : \_HumbugBoxb94336daae36\Nette\Schema\Schema
    {
        return \_HumbugBoxb94336daae36\Nette\Schema\Expect::structure(['implement' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::string(), 'references' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::array(), 'tagged' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::string(), 'autowired' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::type('bool|string|array'), 'tags' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::array()]);
    }
    private static function getImportedSchema() : \_HumbugBoxb94336daae36\Nette\Schema\Schema
    {
        return \_HumbugBoxb94336daae36\Nette\Schema\Expect::structure(['type' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::string(), 'imported' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::bool(), 'autowired' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::type('bool|string|array'), 'tags' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::array()]);
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI\Config\Adapters;

use _HumbugBoxb94336daae36\Nette;
/**
 * Reading and generating PHP files.
 */
final class PhpAdapter implements \_HumbugBoxb94336daae36\Nette\DI\Config\Adapter
{
    use Nette\SmartObject;
    /**
     * Reads configuration from PHP file.
     */
    public function load(string $file) : array
    {
        return require $file;
    }
    /**
     * Generates configuration in PHP format.
     */
    public function dump(array $data) : string
    {
        return "<?php // generated by Nette \nreturn " . \_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::dump($data) . ';';
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI\Config\Adapters;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\DI\Config\Helpers;
use _HumbugBoxb94336daae36\Nette\DI\Definitions\Reference;
use _HumbugBoxb94336daae36\Nette\DI\Definitions\Statement;
use _HumbugBoxb94336daae36\Nette\Neon;
/**
 * Reading and generating NEON files.
 */
final class NeonAdapter implements \_HumbugBoxb94336daae36\Nette\DI\Config\Adapter
{
    use Nette\SmartObject;
    private const PREVENT_MERGING_SUFFIX = '!';
    /**
     * Reads configuration from NEON file.
     */
    public function load(string $file) : array
    {
        return $this->process((array) \_HumbugBoxb94336daae36\Nette\Neon\Neon::decode(\file_get_contents($file)));
    }
    /**
     * @throws Nette\InvalidStateException
     */
    public function process(array $arr) : array
    {
        $res = [];
        foreach ($arr as $key => $val) {
            if (\is_string($key) && \substr($key, -1) === self::PREVENT_MERGING_SUFFIX) {
                if (!\is_array($val) && $val !== null) {
                    throw new \_HumbugBoxb94336daae36\Nette\DI\InvalidConfigurationException("Replacing operator is available only for arrays, item '{$key}' is not array.");
                }
                $key = \substr($key, 0, -1);
                $val[\_HumbugBoxb94336daae36\Nette\DI\Config\Helpers::PREVENT_MERGING] = \true;
            }
            if (\is_array($val)) {
                $val = $this->process($val);
            } elseif ($val instanceof \_HumbugBoxb94336daae36\Nette\Neon\Entity) {
                if ($val->value === \_HumbugBoxb94336daae36\Nette\Neon\Neon::CHAIN) {
                    $tmp = null;
                    foreach ($this->process($val->attributes) as $st) {
                        $tmp = new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement($tmp === null ? $st->getEntity() : [$tmp, \ltrim(\implode('::', (array) $st->getEntity()), ':')], $st->arguments);
                    }
                    $val = $tmp;
                } else {
                    $tmp = $this->process([$val->value]);
                    if (\is_string($tmp[0]) && \strpos($tmp[0], '?') !== \false) {
                        \trigger_error('Operator ? is deprecated in config files.', \E_USER_DEPRECATED);
                    }
                    $val = new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement($tmp[0], $this->process($val->attributes));
                }
            }
            $res[$key] = $val;
        }
        return $res;
    }
    /**
     * Generates configuration in NEON format.
     */
    public function dump(array $data) : string
    {
        \array_walk_recursive($data, function (&$val) : void {
            if ($val instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement) {
                $val = self::statementToEntity($val);
            }
        });
        return "# generated by Nette\n\n" . \_HumbugBoxb94336daae36\Nette\Neon\Neon::encode($data, \_HumbugBoxb94336daae36\Nette\Neon\Neon::BLOCK);
    }
    private static function statementToEntity(\_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement $val) : \_HumbugBoxb94336daae36\Nette\Neon\Entity
    {
        \array_walk_recursive($val->arguments, function (&$val) : void {
            if ($val instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement) {
                $val = self::statementToEntity($val);
            } elseif ($val instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference) {
                $val = '@' . $val->getValue();
            }
        });
        $entity = $val->getEntity();
        if ($entity instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference) {
            $entity = '@' . $entity->getValue();
        } elseif (\is_array($entity)) {
            if ($entity[0] instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement) {
                return new \_HumbugBoxb94336daae36\Nette\Neon\Entity(\_HumbugBoxb94336daae36\Nette\Neon\Neon::CHAIN, [self::statementToEntity($entity[0]), new \_HumbugBoxb94336daae36\Nette\Neon\Entity('::' . $entity[1], $val->arguments)]);
            } elseif ($entity[0] instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference) {
                $entity = '@' . $entity[0]->getValue() . '::' . $entity[1];
            } elseif (\is_string($entity[0])) {
                $entity = $entity[0] . '::' . $entity[1];
            }
        }
        return new \_HumbugBoxb94336daae36\Nette\Neon\Entity($entity, $val->arguments);
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI\Config;

/**
 * Adapter for reading and writing configuration files.
 */
interface Adapter
{
    /**
     * Reads configuration from file.
     */
    function load(string $file) : array;
    /**
     * Generates configuration string.
     */
    function dump(array $data) : string;
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI\Config;

use _HumbugBoxb94336daae36\Nette;
/**
 * Configuration helpers.
 * @deprecated
 */
final class Helpers
{
    use Nette\StaticClass;
    public const PREVENT_MERGING = '_prevent_merging';
    /**
     * Merges configurations. Left has higher priority than right one.
     * @return array|string
     */
    public static function merge($left, $right)
    {
        return \_HumbugBoxb94336daae36\Nette\Schema\Helpers::merge($left, $right);
    }
    /**
     * Return true if array prevents merging and removes this information.
     * @return mixed
     */
    public static function takeParent(&$data) : bool
    {
        if (\is_array($data) && isset($data[self::PREVENT_MERGING])) {
            unset($data[self::PREVENT_MERGING]);
            return \true;
        }
        return \false;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI;

use _HumbugBoxb94336daae36\Nette;
/**
 * Configurator compiling extension.
 */
abstract class CompilerExtension
{
    use Nette\SmartObject;
    /** @var Compiler */
    protected $compiler;
    /** @var string */
    protected $name;
    /** @var array|object */
    protected $config = [];
    /**
     * @return static
     */
    public function setCompiler(\_HumbugBoxb94336daae36\Nette\DI\Compiler $compiler, string $name)
    {
        $this->compiler = $compiler;
        $this->name = $name;
        return $this;
    }
    /**
     * @param  array|object  $config
     * @return static
     */
    public function setConfig($config)
    {
        if (!\is_array($config) && !\is_object($config)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException();
        }
        $this->config = $config;
        return $this;
    }
    /**
     * Returns extension configuration.
     * @return array|object
     */
    public function getConfig()
    {
        return $this->config;
    }
    /**
     * Returns configuration schema.
     */
    public function getConfigSchema() : \_HumbugBoxb94336daae36\Nette\Schema\Schema
    {
        return \is_object($this->config) ? \_HumbugBoxb94336daae36\Nette\Schema\Expect::from($this->config) : \_HumbugBoxb94336daae36\Nette\Schema\Expect::array();
    }
    /**
     * Checks whether $config contains only $expected items and returns combined array.
     * @throws Nette\InvalidStateException
     * @deprecated  use getConfigSchema()
     */
    public function validateConfig(array $expected, array $config = null, string $name = null) : array
    {
        if (\func_num_args() === 1) {
            return $this->config = $this->validateConfig($expected, $this->config);
        }
        if ($extra = \array_diff_key((array) $config, $expected)) {
            $name = $name ? \str_replace('.', ' › ', $name) : $this->name;
            $hint = \_HumbugBoxb94336daae36\Nette\Utils\ObjectHelpers::getSuggestion(\array_keys($expected), \key($extra));
            $extra = $hint ? \key($extra) : \implode("', '{$name} › ", \array_keys($extra));
            throw new \_HumbugBoxb94336daae36\Nette\DI\InvalidConfigurationException("Unknown configuration option '{$name} › {$extra}'" . ($hint ? ", did you mean '{$name} › {$hint}'?" : '.'));
        }
        return \_HumbugBoxb94336daae36\Nette\Schema\Helpers::merge($config, $expected);
    }
    public function getContainerBuilder() : \_HumbugBoxb94336daae36\Nette\DI\ContainerBuilder
    {
        return $this->compiler->getContainerBuilder();
    }
    /**
     * Reads configuration from file.
     */
    public function loadFromFile(string $file) : array
    {
        $loader = $this->createLoader();
        $res = $loader->load($file);
        $this->compiler->addDependencies($loader->getDependencies());
        return $res;
    }
    /**
     * Loads list of service definitions from configuration.
     * Prefixes its names and replaces @extension with name in definition.
     */
    public function loadDefinitionsFromConfig(array $configList) : void
    {
        $res = [];
        foreach ($configList as $key => $config) {
            $key = \is_string($key) ? $this->name . '.' . $key : $key;
            $res[$key] = \_HumbugBoxb94336daae36\Nette\DI\Helpers::prefixServiceName($config, $this->name);
        }
        $this->compiler->loadDefinitionsFromConfig($res);
    }
    protected function createLoader() : \_HumbugBoxb94336daae36\Nette\DI\Config\Loader
    {
        return new \_HumbugBoxb94336daae36\Nette\DI\Config\Loader();
    }
    /**
     * Prepend extension name to identifier or service name.
     */
    public function prefix(string $id) : string
    {
        return \substr_replace($id, $this->name . '.', \substr($id, 0, 1) === '@' ? 1 : 0, 0);
    }
    /**
     * Processes configuration data. Intended to be overridden by descendant.
     * @return void
     */
    public function loadConfiguration()
    {
    }
    /**
     * Adjusts DI container before is compiled to PHP class. Intended to be overridden by descendant.
     * @return void
     */
    public function beforeCompile()
    {
    }
    /**
     * Adjusts DI container compiled to PHP class. Intended to be overridden by descendant.
     * @return void
     */
    public function afterCompile(\_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType $class)
    {
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\DI\Definitions\Definition;
/**
 * Container builder.
 */
class ContainerBuilder
{
    use Nette\SmartObject;
    public const THIS_SERVICE = 'self', THIS_CONTAINER = 'container';
    /** @var array */
    public $parameters = [];
    /** @var Definition[] */
    private $definitions = [];
    /** @var array of alias => service */
    private $aliases = [];
    /** @var Autowiring */
    private $autowiring;
    /** @var bool */
    private $needsResolve = \true;
    /** @var bool */
    private $resolving = \false;
    /** @var array */
    private $dependencies = [];
    public function __construct()
    {
        $this->autowiring = new \_HumbugBoxb94336daae36\Nette\DI\Autowiring($this);
        $this->addImportedDefinition(self::THIS_CONTAINER)->setType(\_HumbugBoxb94336daae36\Nette\DI\Container::class);
    }
    /**
     * Adds new service definition.
     * @return Definitions\ServiceDefinition
     */
    public function addDefinition(?string $name, \_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition $definition = null) : \_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition
    {
        $this->needsResolve = \true;
        if ($name === null) {
            for ($i = 1; isset($this->definitions['0' . $i]) || isset($this->aliases['0' . $i]); $i++) {
            }
            $name = '0' . $i;
            // prevents converting to integer in array key
        } elseif (\is_int(\key([$name => 1])) || !\preg_match('#^\\w+(\\.\\w+)*\\z#', $name)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException(\sprintf('Service name must be a alpha-numeric string and not a number, %s given.', \gettype($name)));
        } else {
            $name = $this->aliases[$name] ?? $name;
            if (isset($this->definitions[$name])) {
                throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException("Service '{$name}' has already been added.");
            }
            $lname = \strtolower($name);
            foreach ($this->definitions as $nm => $foo) {
                if ($lname === \strtolower($nm)) {
                    throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException("Service '{$name}' has the same name as '{$nm}' in a case-insensitive manner.");
                }
            }
        }
        $definition = $definition ?: new \_HumbugBoxb94336daae36\Nette\DI\Definitions\ServiceDefinition();
        $definition->setName($name);
        $definition->setNotifier(function () : void {
            $this->needsResolve = \true;
        });
        return $this->definitions[$name] = $definition;
    }
    public function addAccessorDefinition(?string $name) : \_HumbugBoxb94336daae36\Nette\DI\Definitions\AccessorDefinition
    {
        return $this->addDefinition($name, new \_HumbugBoxb94336daae36\Nette\DI\Definitions\AccessorDefinition());
    }
    public function addFactoryDefinition(?string $name) : \_HumbugBoxb94336daae36\Nette\DI\Definitions\FactoryDefinition
    {
        return $this->addDefinition($name, new \_HumbugBoxb94336daae36\Nette\DI\Definitions\FactoryDefinition());
    }
    public function addLocatorDefinition(?string $name) : \_HumbugBoxb94336daae36\Nette\DI\Definitions\LocatorDefinition
    {
        return $this->addDefinition($name, new \_HumbugBoxb94336daae36\Nette\DI\Definitions\LocatorDefinition());
    }
    public function addImportedDefinition(?string $name) : \_HumbugBoxb94336daae36\Nette\DI\Definitions\ImportedDefinition
    {
        return $this->addDefinition($name, new \_HumbugBoxb94336daae36\Nette\DI\Definitions\ImportedDefinition());
    }
    /**
     * Removes the specified service definition.
     */
    public function removeDefinition(string $name) : void
    {
        $this->needsResolve = \true;
        $name = $this->aliases[$name] ?? $name;
        unset($this->definitions[$name]);
    }
    /**
     * Gets the service definition.
     */
    public function getDefinition(string $name) : \_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition
    {
        $service = $this->aliases[$name] ?? $name;
        if (!isset($this->definitions[$service])) {
            throw new \_HumbugBoxb94336daae36\Nette\DI\MissingServiceException("Service '{$name}' not found.");
        }
        return $this->definitions[$service];
    }
    /**
     * Gets all service definitions.
     * @return Definition[]
     */
    public function getDefinitions() : array
    {
        return $this->definitions;
    }
    /**
     * Does the service definition or alias exist?
     */
    public function hasDefinition(string $name) : bool
    {
        $name = $this->aliases[$name] ?? $name;
        return isset($this->definitions[$name]);
    }
    public function addAlias(string $alias, string $service) : void
    {
        if (!$alias) {
            // builder is not ready for falsy names such as '0'
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException(\sprintf('Alias name must be a non-empty string, %s given.', \gettype($alias)));
        } elseif (!$service) {
            // builder is not ready for falsy names such as '0'
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException(\sprintf('Service name must be a non-empty string, %s given.', \gettype($service)));
        } elseif (isset($this->aliases[$alias])) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException("Alias '{$alias}' has already been added.");
        } elseif (isset($this->definitions[$alias])) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException("Service '{$alias}' has already been added.");
        }
        $this->aliases[$alias] = $service;
    }
    /**
     * Removes the specified alias.
     */
    public function removeAlias(string $alias) : void
    {
        unset($this->aliases[$alias]);
    }
    /**
     * Gets all service aliases.
     */
    public function getAliases() : array
    {
        return $this->aliases;
    }
    /**
     * @param  string[]  $types
     * @return static
     */
    public function addExcludedClasses(array $types)
    {
        $this->needsResolve = \true;
        $this->autowiring->addExcludedClasses($types);
        return $this;
    }
    /**
     * Resolves autowired service name by type.
     * @param  bool  $throw exception if service doesn't exist?
     * @throws ServiceCreationException
     */
    public function getByType(string $type, bool $throw = \false) : ?string
    {
        $this->needResolved();
        return $this->autowiring->getByType($type, $throw);
    }
    /**
     * Gets autowired service definition of the specified type.
     */
    public function getDefinitionByType(string $type) : \_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition
    {
        return $this->getDefinition($this->getByType($type, \true));
    }
    /**
     * Gets the autowired service names and definitions of the specified type.
     * @return Definition[]  service name is key
     * @internal
     */
    public function findAutowired(string $type) : array
    {
        $this->needResolved();
        return $this->autowiring->findByType($type);
    }
    /**
     * Gets the service names and definitions of the specified type.
     * @return Definition[]  service name is key
     */
    public function findByType(string $type) : array
    {
        $this->needResolved();
        $found = [];
        foreach ($this->definitions as $name => $def) {
            if (\is_a($def->getType(), $type, \true)) {
                $found[$name] = $def;
            }
        }
        return $found;
    }
    /**
     * Gets the service names and tag values.
     * @return array of [service name => tag attributes]
     */
    public function findByTag(string $tag) : array
    {
        $found = [];
        foreach ($this->definitions as $name => $def) {
            if (($tmp = $def->getTag($tag)) !== null) {
                $found[$name] = $tmp;
            }
        }
        return $found;
    }
    /********************* building ****************d*g**/
    /**
     * Checks services, resolves types and rebuilts autowiring classlist.
     */
    public function resolve() : void
    {
        if ($this->resolving) {
            return;
        }
        $this->resolving = \true;
        $resolver = new \_HumbugBoxb94336daae36\Nette\DI\Resolver($this);
        foreach ($this->definitions as $def) {
            $resolver->resolveDefinition($def);
        }
        $this->autowiring->rebuild();
        $this->resolving = $this->needsResolve = \false;
    }
    private function needResolved() : void
    {
        if ($this->resolving) {
            throw new \_HumbugBoxb94336daae36\Nette\DI\NotAllowedDuringResolvingException();
        } elseif ($this->needsResolve) {
            $this->resolve();
        }
    }
    public function complete() : void
    {
        $this->resolve();
        foreach ($this->definitions as $def) {
            $def->setNotifier(null);
        }
        $resolver = new \_HumbugBoxb94336daae36\Nette\DI\Resolver($this);
        foreach ($this->definitions as $def) {
            $resolver->completeDefinition($def);
        }
    }
    /**
     * Adds item to the list of dependencies.
     * @param  \ReflectionClass|\ReflectionFunctionAbstract|string  $dep
     * @return static
     * @internal
     */
    public function addDependency($dep)
    {
        $this->dependencies[] = $dep;
        return $this;
    }
    /**
     * Returns the list of dependencies.
     */
    public function getDependencies() : array
    {
        return $this->dependencies;
    }
    /**
     * @internal
     */
    public function exportMeta() : array
    {
        $defs = $this->definitions;
        \ksort($defs);
        foreach ($defs as $name => $def) {
            if ($def instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\ImportedDefinition) {
                $meta['types'][$name] = $def->getType();
            }
            foreach ($def->getTags() as $tag => $value) {
                $meta['tags'][$tag][$name] = $value;
            }
        }
        $meta['aliases'] = $this->aliases;
        \ksort($meta['aliases']);
        $all = [];
        foreach ($this->definitions as $name => $def) {
            if ($type = $def->getType()) {
                foreach (\class_parents($type) + \class_implements($type) + [$type] as $class) {
                    $all[$class][] = $name;
                }
            }
        }
        [$low, $high] = $this->autowiring->getClassList();
        foreach ($all as $class => $names) {
            $meta['wiring'][$class] = \array_filter([$high[$class] ?? [], $low[$class] ?? [], \array_diff($names, $low[$class] ?? [], $high[$class] ?? [])]);
        }
        return $meta;
    }
    public static function literal(string $code, array $args = null) : \_HumbugBoxb94336daae36\Nette\PhpGenerator\PhpLiteral
    {
        return new \_HumbugBoxb94336daae36\Nette\PhpGenerator\PhpLiteral($args === null ? $code : \_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::formatArgs($code, $args));
    }
    /** @deprecated */
    public function formatPhp(string $statement, array $args) : string
    {
        \array_walk_recursive($args, function (&$val) : void {
            if ($val instanceof \_HumbugBoxb94336daae36\Nette\DI\Statement) {
                $val = (new \_HumbugBoxb94336daae36\Nette\DI\Resolver($this))->completeStatement($val);
            } elseif ($val instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition) {
                $val = new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference($val->getName());
            }
        });
        return (new \_HumbugBoxb94336daae36\Nette\DI\PhpGenerator($this))->formatPhp($statement, $args);
    }
    /** @deprecated use resolve() */
    public function prepareClassList() : void
    {
        \trigger_error(__METHOD__ . '() is deprecated, use resolve()', \E_USER_DEPRECATED);
        $this->resolve();
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\DI\Definitions\Reference;
use _HumbugBoxb94336daae36\Nette\DI\Definitions\Statement;
use _HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers as PhpHelpers;
use _HumbugBoxb94336daae36\Nette\PhpGenerator\PhpLiteral;
use _HumbugBoxb94336daae36\Nette\Utils\Strings;
/**
 * Container PHP code generator.
 */
class PhpGenerator
{
    use Nette\SmartObject;
    /** @var ContainerBuilder */
    private $builder;
    /** @var string */
    private $className;
    public function __construct(\_HumbugBoxb94336daae36\Nette\DI\ContainerBuilder $builder)
    {
        $this->builder = $builder;
    }
    /**
     * Generates PHP classes. First class is the container.
     */
    public function generate(string $className) : \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType
    {
        $this->className = $className;
        $class = new \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType($this->className);
        $class->setExtends(\_HumbugBoxb94336daae36\Nette\DI\Container::class);
        $class->addMethod('__construct')->addBody('parent::__construct($params);')->addBody('$this->parameters += ?;', [$this->builder->parameters])->addParameter('params', [])->setTypeHint('array');
        foreach ($this->builder->exportMeta() as $key => $value) {
            $class->addProperty($key)->setVisibility('protected')->setValue($value);
        }
        $definitions = $this->builder->getDefinitions();
        \ksort($definitions);
        foreach ($definitions as $def) {
            $class->addMember($this->generateMethod($def));
        }
        $class->getMethod(\_HumbugBoxb94336daae36\Nette\DI\Container::getMethodName(\_HumbugBoxb94336daae36\Nette\DI\ContainerBuilder::THIS_CONTAINER))->setReturnType($className)->setBody('return $this;');
        return $class;
    }
    public function toString(\_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType $class) : string
    {
        return '/** @noinspection PhpParamsInspection,PhpMethodMayBeStaticInspection */

declare(strict_types=1);

' . $class->__toString();
    }
    public function generateMethod(\_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition $def) : \_HumbugBoxb94336daae36\Nette\PhpGenerator\Method
    {
        try {
            $name = $def->getName();
            $method = new \_HumbugBoxb94336daae36\Nette\PhpGenerator\Method(\_HumbugBoxb94336daae36\Nette\DI\Container::getMethodName($name));
            $method->setVisibility('public');
            $method->setReturnType($def->getType());
            $def->generateMethod($method, $this);
            return $method;
        } catch (\Exception $e) {
            throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Service '{$name}': " . $e->getMessage(), 0, $e);
        }
    }
    /**
     * Formats PHP code for class instantiating, function calling or property setting in PHP.
     */
    public function formatStatement(\_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement $statement) : string
    {
        $entity = $statement->getEntity();
        $arguments = $statement->arguments;
        switch (\true) {
            case \is_string($entity) && \_HumbugBoxb94336daae36\Nette\Utils\Strings::contains($entity, '?'):
                // PHP literal
                return $this->formatPhp($entity, $arguments);
            case \is_string($entity):
                // create class
                return $this->formatPhp("new {$entity}" . ($arguments ? '(...?)' : ''), $arguments ? [$arguments] : []);
            case \is_array($entity):
                switch (\true) {
                    case $entity[1][0] === '$':
                        // property getter, setter or appender
                        $name = \substr($entity[1], 1);
                        if ($append = \substr($name, -2) === '[]') {
                            $name = \substr($name, 0, -2);
                        }
                        if ($entity[0] instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference) {
                            $prop = $this->formatPhp('?->?', [$entity[0], $name]);
                        } else {
                            $prop = $this->formatPhp($entity[0] . '::$?', [$name]);
                        }
                        return $arguments ? $this->formatPhp($prop . ($append ? '[]' : '') . ' = ?', [$arguments[0]]) : $prop;
                    case $entity[0] instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement:
                        $inner = $this->formatPhp('?', [$entity[0]]);
                        if (\substr($inner, 0, 4) === 'new ') {
                            $inner = "({$inner})";
                        }
                        return $this->formatPhp("{$inner}->?(...?)", [$entity[1], $arguments]);
                    case $entity[0] instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference:
                        return $this->formatPhp('?->?(...?)', [$entity[0], $entity[1], $arguments]);
                    case $entity[0] === '':
                        // function call
                        return $this->formatPhp("{$entity[1]}(...?)", [$arguments]);
                    case \is_string($entity[0]):
                        // static method call
                        return $this->formatPhp("{$entity[0]}::{$entity[1]}(...?)", [$arguments]);
                }
        }
        throw \_HumbugBoxb94336daae36\Nette\InvalidStateException;
    }
    /**
     * Formats PHP statement.
     * @internal
     */
    public function formatPhp(string $statement, array $args) : string
    {
        \array_walk_recursive($args, function (&$val) : void {
            if ($val instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement) {
                $val = new \_HumbugBoxb94336daae36\Nette\PhpGenerator\PhpLiteral($this->formatStatement($val));
            } elseif ($val instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference) {
                $name = $val->getValue();
                if ($val->isSelf()) {
                    $val = new \_HumbugBoxb94336daae36\Nette\PhpGenerator\PhpLiteral('$service');
                } elseif ($name === \_HumbugBoxb94336daae36\Nette\DI\ContainerBuilder::THIS_CONTAINER) {
                    $val = new \_HumbugBoxb94336daae36\Nette\PhpGenerator\PhpLiteral('$this');
                } else {
                    $val = \_HumbugBoxb94336daae36\Nette\DI\ContainerBuilder::literal('$this->getService(?)', [$name]);
                }
            }
        });
        return \_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::formatArgs($statement, $args);
    }
    /**
     * Converts parameters from Definition to PhpGenerator.
     * @return Nette\PhpGenerator\Parameter[]
     */
    public function convertParameters(array $parameters) : array
    {
        $res = [];
        foreach ($parameters as $k => $v) {
            $tmp = \explode(' ', \is_int($k) ? $v : $k);
            $param = $res[] = new \_HumbugBoxb94336daae36\Nette\PhpGenerator\Parameter(\end($tmp));
            if (!\is_int($k)) {
                $param->setDefaultValue($v);
            }
            if (isset($tmp[1])) {
                $param->setTypeHint($tmp[0]);
            }
        }
        return $res;
    }
    public function getClassName() : ?string
    {
        return $this->className;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI\Extensions;

use _HumbugBoxb94336daae36\Nette;
/**
 * Constant definitions.
 */
final class ConstantsExtension extends \_HumbugBoxb94336daae36\Nette\DI\CompilerExtension
{
    public function afterCompile(\_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType $class)
    {
        foreach ($this->getConfig() as $name => $value) {
            $class->getMethod('initialize')->addBody('define(?, ?);', [$name, $value]);
        }
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI\Extensions;

use _HumbugBoxb94336daae36\Nette;
/**
 * DI extension.
 */
final class DIExtension extends \_HumbugBoxb94336daae36\Nette\DI\CompilerExtension
{
    /** @var string[] */
    public $exportedTags = [];
    /** @var string[] */
    public $exportedTypes = [];
    /** @var bool */
    private $debugMode;
    /** @var int */
    private $time;
    public function __construct(bool $debugMode = \false)
    {
        $this->debugMode = $debugMode;
        $this->time = \microtime(\true);
        $this->config = new class
        {
            /** @var bool */
            public $debugger;
            /** @var string[] */
            public $excluded = [];
            /** @var ?string */
            public $parentClass;
            /** @var object */
            public $export;
        };
        $this->config->export = new class
        {
            /** @var bool */
            public $parameters = \true;
            /** @var string[]|bool|null */
            public $tags = \true;
            /** @var string[]|bool|null */
            public $types = \true;
        };
        $this->config->debugger = \interface_exists(\_HumbugBoxb94336daae36\Tracy\IBarPanel::class);
    }
    public function loadConfiguration()
    {
        $builder = $this->getContainerBuilder();
        $builder->addExcludedClasses($this->config->excluded);
    }
    public function beforeCompile()
    {
        if (!$this->config->export->parameters) {
            $this->getContainerBuilder()->parameters = [];
        }
    }
    public function afterCompile(\_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType $class)
    {
        if ($this->config->parentClass) {
            $class->setExtends($this->config->parentClass);
        }
        $this->restrictTags($class);
        $this->restrictTypes($class);
        if ($this->debugMode && $this->config->debugger) {
            $this->enableTracyIntegration($class);
        }
        $this->initializeTaggedServices($class);
    }
    private function restrictTags(\_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType $class) : void
    {
        $option = $this->config->export->tags;
        if ($option === \true) {
        } elseif ($option === \false) {
            $class->removeProperty('tags');
        } elseif ($prop = $class->getProperties()['tags'] ?? null) {
            $prop->value = \array_intersect_key($prop->value, $this->exportedTags + \array_flip((array) $option));
        }
    }
    private function restrictTypes(\_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType $class) : void
    {
        $option = $this->config->export->types;
        if ($option === \true) {
            return;
        }
        $prop = $class->getProperty('wiring');
        $prop->value = \array_intersect_key($prop->value, $this->exportedTypes + (\is_array($option) ? \array_flip($option) : []));
    }
    private function initializeTaggedServices(\_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType $class) : void
    {
        foreach (\array_filter($this->getContainerBuilder()->findByTag('run')) as $name => $on) {
            \trigger_error("Tag 'run' used in service '{$name}' definition is deprecated.", \E_USER_DEPRECATED);
            $class->getMethod('initialize')->addBody('$this->getService(?);', [$name]);
        }
    }
    private function enableTracyIntegration(\_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType $class) : void
    {
        \_HumbugBoxb94336daae36\Nette\Bridges\DITracy\ContainerPanel::$compilationTime = $this->time;
        $class->getMethod('initialize')->addBody($this->getContainerBuilder()->formatPhp('?;', [new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement('@Tracy\\Bar::addPanel', [new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement(\_HumbugBoxb94336daae36\Nette\Bridges\DITracy\ContainerPanel::class)])]));
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI\Extensions;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\DI\DynamicParameter;
/**
 * Parameters.
 */
final class ParametersExtension extends \_HumbugBoxb94336daae36\Nette\DI\CompilerExtension
{
    /** @var string[] */
    public $dynamicParams = [];
    /** @var string[][] */
    public $dynamicValidators = [];
    /** @var array */
    private $compilerConfig;
    public function __construct(array &$compilerConfig)
    {
        $this->compilerConfig =& $compilerConfig;
    }
    public function loadConfiguration()
    {
        $builder = $this->getContainerBuilder();
        $params = $this->config;
        foreach ($this->dynamicParams as $key) {
            $params[$key] = \array_key_exists($key, $params) ? new \_HumbugBoxb94336daae36\Nette\DI\DynamicParameter(\_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::format('($this->parameters[?] \\?\\? ?)', $key, $params[$key])) : new \_HumbugBoxb94336daae36\Nette\DI\DynamicParameter(\_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::format('$this->parameters[?]', $key));
        }
        $builder->parameters = \_HumbugBoxb94336daae36\Nette\DI\Helpers::expand($params, $params, \true);
        // expand all except 'services'
        $slice = \array_diff_key($this->compilerConfig, ['services' => 1]);
        $this->compilerConfig = \_HumbugBoxb94336daae36\Nette\DI\Helpers::expand($slice, $builder->parameters) + $this->compilerConfig;
    }
    public function afterCompile(\_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType $class)
    {
        $builder = $this->getContainerBuilder();
        $cnstr = $class->getMethod('__construct');
        foreach ($this->dynamicValidators as [$param, $expected]) {
            $cnstr->addBody('Nette\\Utils\\Validators::assert(?, ?, ?);', [$param, $expected, 'dynamic parameter']);
        }
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI\Extensions;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\Loaders\RobotLoader;
use _HumbugBoxb94336daae36\Nette\Schema\Expect;
use _HumbugBoxb94336daae36\Nette\Utils\Arrays;
/**
 * Services auto-discovery.
 */
final class SearchExtension extends \_HumbugBoxb94336daae36\Nette\DI\CompilerExtension
{
    /** @var array */
    private $classes = [];
    /** @var string */
    private $tempDir;
    public function __construct(string $tempDir)
    {
        $this->tempDir = $tempDir;
    }
    public function getConfigSchema() : \_HumbugBoxb94336daae36\Nette\Schema\Schema
    {
        return \_HumbugBoxb94336daae36\Nette\Schema\Expect::arrayOf(\_HumbugBoxb94336daae36\Nette\Schema\Expect::structure(['in' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::string()->required(), 'files' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::anyOf(\_HumbugBoxb94336daae36\Nette\Schema\Expect::listOf('string'), \_HumbugBoxb94336daae36\Nette\Schema\Expect::string()->castTo('array'))->default([]), 'classes' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::anyOf(\_HumbugBoxb94336daae36\Nette\Schema\Expect::listOf('string'), \_HumbugBoxb94336daae36\Nette\Schema\Expect::string()->castTo('array'))->default([]), 'extends' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::anyOf(\_HumbugBoxb94336daae36\Nette\Schema\Expect::listOf('string'), \_HumbugBoxb94336daae36\Nette\Schema\Expect::string()->castTo('array'))->default([]), 'implements' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::anyOf(\_HumbugBoxb94336daae36\Nette\Schema\Expect::listOf('string'), \_HumbugBoxb94336daae36\Nette\Schema\Expect::string()->castTo('array'))->default([]), 'exclude' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::structure(['classes' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::anyOf(\_HumbugBoxb94336daae36\Nette\Schema\Expect::listOf('string'), \_HumbugBoxb94336daae36\Nette\Schema\Expect::string()->castTo('array'))->default([]), 'extends' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::anyOf(\_HumbugBoxb94336daae36\Nette\Schema\Expect::listOf('string'), \_HumbugBoxb94336daae36\Nette\Schema\Expect::string()->castTo('array'))->default([]), 'implements' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::anyOf(\_HumbugBoxb94336daae36\Nette\Schema\Expect::listOf('string'), \_HumbugBoxb94336daae36\Nette\Schema\Expect::string()->castTo('array'))->default([])]), 'tags' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::array()]))->before(function ($val) {
            return \is_string($val['in'] ?? null) ? ['default' => $val] : $val;
        });
    }
    public function loadConfiguration()
    {
        foreach (\array_filter($this->config) as $name => $batch) {
            if (!\is_dir($batch->in)) {
                throw new \_HumbugBoxb94336daae36\Nette\DI\InvalidConfigurationException("Option '{$this->name} › {$name} › in' must be valid directory name, '{$batch->in}' given.");
            }
            foreach ($this->findClasses($batch) as $class) {
                $this->classes[$class] = \array_merge($this->classes[$class] ?? [], $batch->tags);
            }
        }
    }
    public function findClasses(\stdClass $config) : array
    {
        $robot = new \_HumbugBoxb94336daae36\Nette\Loaders\RobotLoader();
        $robot->setTempDirectory($this->tempDir);
        $robot->addDirectory($config->in);
        $robot->acceptFiles = $config->files ?: ['*.php'];
        $robot->reportParseErrors(\false);
        $robot->refresh();
        $classes = \array_unique(\array_keys($robot->getIndexedClasses()));
        $classes = \array_filter($classes, 'class_exists');
        $exclude = $config->exclude;
        $acceptRE = self::buildNameRegexp($config->classes);
        $rejectRE = self::buildNameRegexp($exclude->classes);
        $acceptParent = \array_merge($config->extends, $config->implements);
        $rejectParent = \array_merge($exclude->extends, $exclude->implements);
        $found = [];
        foreach ($classes as $class) {
            $rc = new \ReflectionClass($class);
            if ($rc->isInstantiable() && (!$acceptRE || \preg_match($acceptRE, $rc->getName())) && (!$rejectRE || !\preg_match($rejectRE, $rc->getName())) && (!$acceptParent || \_HumbugBoxb94336daae36\Nette\Utils\Arrays::some($acceptParent, function ($nm) use($rc) {
                return $rc->isSubclassOf($nm);
            })) && (!$rejectParent || \_HumbugBoxb94336daae36\Nette\Utils\Arrays::every($rejectParent, function ($nm) use($rc) {
                return !$rc->isSubclassOf($nm);
            }))) {
                $found[] = $rc->getName();
            }
        }
        return $found;
    }
    public function beforeCompile()
    {
        $builder = $this->getContainerBuilder();
        foreach ($this->classes as $class => $tags) {
            if (!$builder->findByType($class)) {
                $builder->addDefinition(null)->setType($class)->setTags(\_HumbugBoxb94336daae36\Nette\Utils\Arrays::normalize($tags, \true));
            }
        }
    }
    private static function buildNameRegexp(array $masks) : ?string
    {
        $res = [];
        foreach ((array) $masks as $mask) {
            $mask = (\strpos($mask, '\\') === \false ? '**\\' : '') . $mask;
            $mask = \preg_quote($mask, '#');
            $mask = \str_replace('\\*\\*\\\\', '(.*\\\\)?', $mask);
            $mask = \str_replace('\\\\\\*\\*', '(\\\\.*)?', $mask);
            $mask = \str_replace('\\*', '\\w*', $mask);
            $res[] = $mask;
        }
        return $res ? '#^(' . \implode('|', $res) . ')$#i' : null;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI\Extensions;

use _HumbugBoxb94336daae36\Nette;
/**
 * PHP directives definition.
 */
final class PhpExtension extends \_HumbugBoxb94336daae36\Nette\DI\CompilerExtension
{
    public function getConfigSchema() : \_HumbugBoxb94336daae36\Nette\Schema\Schema
    {
        return \_HumbugBoxb94336daae36\Nette\Schema\Expect::arrayOf('scalar');
    }
    public function afterCompile(\_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType $class)
    {
        $initialize = $class->getMethod('initialize');
        foreach ($this->getConfig() as $name => $value) {
            if ($value === null) {
                continue;
            } elseif ($name === 'include_path') {
                $initialize->addBody('set_include_path(?);', [\str_replace(';', \PATH_SEPARATOR, $value)]);
            } elseif ($name === 'ignore_user_abort') {
                $initialize->addBody('ignore_user_abort(?);', [$value]);
            } elseif ($name === 'max_execution_time') {
                $initialize->addBody('set_time_limit(?);', [$value]);
            } elseif ($name === 'date.timezone') {
                $initialize->addBody('date_default_timezone_set(?);', [$value]);
            } elseif (\function_exists('ini_set')) {
                $initialize->addBody('ini_set(?, ?);', [$name, $value === \false ? '0' : (string) $value]);
            } elseif (\ini_get($name) != $value) {
                // intentionally ==
                throw new \_HumbugBoxb94336daae36\Nette\NotSupportedException('Required function ini_set() is disabled.');
            }
        }
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI\Extensions;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\DI\Definitions;
use _HumbugBoxb94336daae36\Nette\DI\Definitions\Statement;
use _HumbugBoxb94336daae36\Nette\DI\Helpers;
/**
 * Service definitions loader.
 */
final class ServicesExtension extends \_HumbugBoxb94336daae36\Nette\DI\CompilerExtension
{
    use Nette\SmartObject;
    public function getConfigSchema() : \_HumbugBoxb94336daae36\Nette\Schema\Schema
    {
        return \_HumbugBoxb94336daae36\Nette\Schema\Expect::arrayOf(new \_HumbugBoxb94336daae36\Nette\DI\Config\DefinitionSchema($this->getContainerBuilder()));
    }
    public function loadConfiguration()
    {
        $this->loadDefinitions($this->config);
    }
    /**
     * Loads list of service definitions.
     */
    public function loadDefinitions(array $config)
    {
        foreach ($config as $key => $defConfig) {
            $this->loadDefinition($this->convertKeyToName($key), $defConfig);
        }
    }
    /**
     * Loads service definition from normalized configuration.
     */
    private function loadDefinition(?string $name, \stdClass $config) : void
    {
        try {
            if ((array) $config === [\false]) {
                $this->getContainerBuilder()->removeDefinition($name);
                return;
            } elseif (!empty($config->alteration) && !$this->getContainerBuilder()->hasDefinition($name)) {
                throw new \_HumbugBoxb94336daae36\Nette\DI\InvalidConfigurationException('missing original definition for alteration.');
            }
            $def = $this->retrieveDefinition($name, $config);
            static $methods = [\_HumbugBoxb94336daae36\Nette\DI\Definitions\ServiceDefinition::class => 'updateServiceDefinition', \_HumbugBoxb94336daae36\Nette\DI\Definitions\AccessorDefinition::class => 'updateAccessorDefinition', \_HumbugBoxb94336daae36\Nette\DI\Definitions\FactoryDefinition::class => 'updateFactoryDefinition', \_HumbugBoxb94336daae36\Nette\DI\Definitions\LocatorDefinition::class => 'updateLocatorDefinition', \_HumbugBoxb94336daae36\Nette\DI\Definitions\ImportedDefinition::class => 'updateImportedDefinition'];
            $this->{$methods[$config->defType]}($def, $config);
            $this->updateDefinition($def, $config);
        } catch (\Exception $e) {
            throw new \_HumbugBoxb94336daae36\Nette\DI\InvalidConfigurationException(($name ? "Service '{$name}': " : '') . $e->getMessage(), 0, $e);
        }
    }
    /**
     * Updates service definition according to normalized configuration.
     */
    private function updateServiceDefinition(\_HumbugBoxb94336daae36\Nette\DI\Definitions\ServiceDefinition $definition, \stdClass $config) : void
    {
        if ($config->factory) {
            $definition->setFactory(\_HumbugBoxb94336daae36\Nette\DI\Helpers::filterArguments([$config->factory])[0]);
            $definition->setType(null);
        }
        if ($config->type) {
            $definition->setType($config->type);
        }
        if ($config->arguments) {
            $arguments = \_HumbugBoxb94336daae36\Nette\DI\Helpers::filterArguments($config->arguments);
            if (empty($config->reset['arguments']) && !\_HumbugBoxb94336daae36\Nette\Utils\Arrays::isList($arguments)) {
                $arguments += $definition->getFactory()->arguments;
            }
            $definition->setArguments($arguments);
        }
        if (isset($config->setup)) {
            if (!empty($config->reset['setup'])) {
                $definition->setSetup([]);
            }
            foreach (\_HumbugBoxb94336daae36\Nette\DI\Helpers::filterArguments($config->setup) as $id => $setup) {
                if (\is_array($setup)) {
                    $setup = new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement(\key($setup), \array_values($setup));
                }
                $definition->addSetup($setup);
            }
        }
        if (isset($config->inject)) {
            $definition->addTag(\_HumbugBoxb94336daae36\Nette\DI\Extensions\InjectExtension::TAG_INJECT, $config->inject);
        }
    }
    private function updateAccessorDefinition(\_HumbugBoxb94336daae36\Nette\DI\Definitions\AccessorDefinition $definition, \stdClass $config) : void
    {
        if (isset($config->implement)) {
            $definition->setImplement($config->implement);
        }
        if ($ref = $config->factory ?? $config->type ?? null) {
            $definition->setReference($ref);
        }
    }
    private function updateFactoryDefinition(\_HumbugBoxb94336daae36\Nette\DI\Definitions\FactoryDefinition $definition, \stdClass $config) : void
    {
        $resultDef = $definition->getResultDefinition();
        if (isset($config->implement)) {
            $definition->setImplement($config->implement);
            $definition->setAutowired(\true);
        }
        if ($config->factory) {
            $resultDef->setFactory(\_HumbugBoxb94336daae36\Nette\DI\Helpers::filterArguments([$config->factory])[0]);
        }
        if ($config->type) {
            $resultDef->setFactory($config->type);
        }
        if ($config->arguments) {
            $arguments = \_HumbugBoxb94336daae36\Nette\DI\Helpers::filterArguments($config->arguments);
            if (empty($config->reset['arguments']) && !\_HumbugBoxb94336daae36\Nette\Utils\Arrays::isList($arguments)) {
                $arguments += $resultDef->getFactory()->arguments;
            }
            $resultDef->setArguments($arguments);
        }
        if (isset($config->setup)) {
            if (!empty($config->reset['setup'])) {
                $resultDef->setSetup([]);
            }
            foreach (\_HumbugBoxb94336daae36\Nette\DI\Helpers::filterArguments($config->setup) as $id => $setup) {
                if (\is_array($setup)) {
                    $setup = new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement(\key($setup), \array_values($setup));
                }
                $resultDef->addSetup($setup);
            }
        }
        if (isset($config->parameters)) {
            $definition->setParameters($config->parameters);
        }
        if (isset($config->inject)) {
            $definition->addTag(\_HumbugBoxb94336daae36\Nette\DI\Extensions\InjectExtension::TAG_INJECT, $config->inject);
        }
    }
    private function updateLocatorDefinition(\_HumbugBoxb94336daae36\Nette\DI\Definitions\LocatorDefinition $definition, \stdClass $config) : void
    {
        if (isset($config->implement)) {
            $definition->setImplement($config->implement);
        }
        if (isset($config->references)) {
            $definition->setReferences($config->references);
        }
        if (isset($config->tagged)) {
            $definition->setTagged($config->tagged);
        }
    }
    private function updateImportedDefinition(\_HumbugBoxb94336daae36\Nette\DI\Definitions\ImportedDefinition $definition, \stdClass $config) : void
    {
        if ($config->type) {
            $definition->setType($config->type);
        }
    }
    private function updateDefinition(\_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition $definition, \stdClass $config) : void
    {
        if (isset($config->autowired)) {
            $definition->setAutowired($config->autowired);
        }
        if (isset($config->tags)) {
            if (!empty($config->reset['tags'])) {
                $definition->setTags([]);
            }
            foreach ($config->tags as $tag => $attrs) {
                if (\is_int($tag) && \is_string($attrs)) {
                    $definition->addTag($attrs);
                } else {
                    $definition->addTag($tag, $attrs);
                }
            }
        }
    }
    private function convertKeyToName($key) : ?string
    {
        if (\is_int($key)) {
            return null;
        } elseif (\preg_match('#^@[\\w\\\\]+\\z#', $key)) {
            return $this->getContainerBuilder()->getByType(\substr($key, 1), \true);
        }
        return $key;
    }
    private function retrieveDefinition(?string $name, \stdClass $config) : \_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition
    {
        $builder = $this->getContainerBuilder();
        if (!empty($config->reset['all'])) {
            $builder->removeDefinition($name);
        }
        return $name && $builder->hasDefinition($name) ? $builder->getDefinition($name) : $builder->addDefinition($name, new $config->defType());
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI\Extensions;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\DI\Definitions;
use _HumbugBoxb94336daae36\Nette\Schema\Expect;
/**
 * Decorators for services.
 */
final class DecoratorExtension extends \_HumbugBoxb94336daae36\Nette\DI\CompilerExtension
{
    public function getConfigSchema() : \_HumbugBoxb94336daae36\Nette\Schema\Schema
    {
        return \_HumbugBoxb94336daae36\Nette\Schema\Expect::arrayOf(\_HumbugBoxb94336daae36\Nette\Schema\Expect::structure(['setup' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::list(), 'tags' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::array(), 'inject' => \_HumbugBoxb94336daae36\Nette\Schema\Expect::bool()]));
    }
    public function beforeCompile()
    {
        foreach ($this->config as $type => $info) {
            if ($info->inject !== null) {
                $info->tags[\_HumbugBoxb94336daae36\Nette\DI\Extensions\InjectExtension::TAG_INJECT] = $info->inject;
            }
            $this->addSetups($type, \_HumbugBoxb94336daae36\Nette\DI\Helpers::filterArguments($info->setup));
            $this->addTags($type, \_HumbugBoxb94336daae36\Nette\DI\Helpers::filterArguments($info->tags));
        }
    }
    public function addSetups(string $type, array $setups) : void
    {
        foreach ($this->findByType($type) as $def) {
            if ($def instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\FactoryDefinition) {
                $def = $def->getResultDefinition();
            }
            foreach ($setups as $setup) {
                if (\is_array($setup)) {
                    $setup = new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement(\key($setup), \array_values($setup));
                }
                $def->addSetup($setup);
            }
        }
    }
    public function addTags(string $type, array $tags) : void
    {
        $tags = \_HumbugBoxb94336daae36\Nette\Utils\Arrays::normalize($tags, \true);
        foreach ($this->findByType($type) as $def) {
            $def->setTags($def->getTags() + $tags);
        }
    }
    private function findByType(string $type) : array
    {
        return \array_filter($this->getContainerBuilder()->getDefinitions(), function (\_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition $def) use($type) : bool {
            return \is_a($def->getType(), $type, \true) || $def instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\FactoryDefinition && \is_a($def->getResultType(), $type, \true);
        });
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI\Extensions;

use _HumbugBoxb94336daae36\Nette;
/**
 * Enables registration of other extensions in $config file
 */
final class ExtensionsExtension extends \_HumbugBoxb94336daae36\Nette\DI\CompilerExtension
{
    public function getConfigSchema() : \_HumbugBoxb94336daae36\Nette\Schema\Schema
    {
        return \_HumbugBoxb94336daae36\Nette\Schema\Expect::arrayOf('string|_HumbugBoxb94336daae36\\Nette\\DI\\Definitions\\Statement');
    }
    public function loadConfiguration()
    {
        foreach ($this->getConfig() as $name => $class) {
            if (\is_int($name)) {
                $name = null;
            }
            if ($class instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement) {
                $rc = new \ReflectionClass($class->getEntity());
                $this->compiler->addExtension($name, $rc->newInstanceArgs($class->arguments));
            } else {
                $this->compiler->addExtension($name, new $class());
            }
        }
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI\Extensions;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\DI;
use _HumbugBoxb94336daae36\Nette\DI\Definitions;
use _HumbugBoxb94336daae36\Nette\Utils\Reflection;
/**
 * Calls inject methods and fills @inject properties.
 */
final class InjectExtension extends \_HumbugBoxb94336daae36\Nette\DI\CompilerExtension
{
    public const TAG_INJECT = 'nette.inject';
    public function getConfigSchema() : \_HumbugBoxb94336daae36\Nette\Schema\Schema
    {
        return \_HumbugBoxb94336daae36\Nette\Schema\Expect::structure([]);
    }
    public function beforeCompile()
    {
        foreach ($this->getContainerBuilder()->getDefinitions() as $def) {
            if ($def->getTag(self::TAG_INJECT) && ($def = $def instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\FactoryDefinition ? $def->getResultDefinition() : $def) && $def instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\ServiceDefinition) {
                $this->updateDefinition($def);
            }
        }
    }
    private function updateDefinition(\_HumbugBoxb94336daae36\Nette\DI\Definitions\ServiceDefinition $def) : void
    {
        $class = $def->getType();
        $setups = $def->getSetup();
        foreach (self::getInjectProperties($class) as $property => $type) {
            $builder = $this->getContainerBuilder();
            $inject = new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement('$' . $property, [\_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference::fromType((string) $type)]);
            foreach ($setups as $key => $setup) {
                if ($setup->getEntity() === $inject->getEntity()) {
                    $inject = $setup;
                    $builder = null;
                    unset($setups[$key]);
                }
            }
            self::checkType($class, $property, $type, $builder);
            \array_unshift($setups, $inject);
        }
        foreach (\array_reverse(self::getInjectMethods($def->getType())) as $method) {
            $inject = new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement($method);
            foreach ($setups as $key => $setup) {
                if ($setup->getEntity() === $inject->getEntity()) {
                    $inject = $setup;
                    unset($setups[$key]);
                }
            }
            \array_unshift($setups, $inject);
        }
        $def->setSetup($setups);
    }
    /**
     * Generates list of inject methods.
     * @internal
     */
    public static function getInjectMethods(string $class) : array
    {
        $res = [];
        foreach (\get_class_methods($class) as $name) {
            if (\substr($name, 0, 6) === 'inject') {
                $res[$name] = (new \ReflectionMethod($class, $name))->getDeclaringClass()->getName();
            }
        }
        \uksort($res, function (string $a, string $b) use($res) : int {
            return $res[$a] === $res[$b] ? \strcmp($a, $b) : (\is_a($res[$a], $res[$b], \true) ? 1 : -1);
        });
        return \array_keys($res);
    }
    /**
     * Generates list of properties with annotation @inject.
     * @internal
     */
    public static function getInjectProperties(string $class) : array
    {
        $res = [];
        foreach (\get_class_vars($class) as $name => $foo) {
            $rp = new \ReflectionProperty($class, $name);
            if (\_HumbugBoxb94336daae36\Nette\DI\Helpers::parseAnnotation($rp, 'inject') !== null) {
                if ($type = \_HumbugBoxb94336daae36\Nette\DI\Helpers::parseAnnotation($rp, 'var')) {
                    $type = \_HumbugBoxb94336daae36\Nette\Utils\Reflection::expandClassName($type, \_HumbugBoxb94336daae36\Nette\Utils\Reflection::getPropertyDeclaringClass($rp));
                }
                $res[$name] = $type;
            }
        }
        \ksort($res);
        return $res;
    }
    /**
     * Calls all methods starting with with "inject" using autowiring.
     * @param  object  $service
     */
    public static function callInjects(\_HumbugBoxb94336daae36\Nette\DI\Container $container, $service) : void
    {
        if (!\is_object($service)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException(\sprintf('Service must be object, %s given.', \gettype($service)));
        }
        foreach (self::getInjectMethods(\get_class($service)) as $method) {
            $container->callMethod([$service, $method]);
        }
        foreach (self::getInjectProperties(\get_class($service)) as $property => $type) {
            self::checkType($service, $property, $type, $container);
            $service->{$property} = $container->getByType($type);
        }
    }
    /**
     * @param  object|string  $class
     * @param  DI\Resolver|DI\Container  $container
     */
    private static function checkType($class, string $name, ?string $type, $container = null) : void
    {
        $propName = \_HumbugBoxb94336daae36\Nette\Utils\Reflection::toString(new \ReflectionProperty($class, $name));
        if (!$type) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException("Property {$propName} has no @var annotation.");
        } elseif (!\class_exists($type) && !\interface_exists($type)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException("Class or interface '{$type}' used in @var annotation at {$propName} not found. Check annotation and 'use' statements.");
        } elseif ($container && !$container->getByType($type, \false)) {
            throw new \_HumbugBoxb94336daae36\Nette\DI\MissingServiceException("Service of type {$type} used in @var annotation at {$propName} not found. Did you register it in configuration file?");
        }
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\Utils\Reflection;
use ReflectionClass;
use ReflectionMethod;
/**
 * Cache dependencies checker.
 */
class DependencyChecker
{
    use Nette\SmartObject;
    public const VERSION = 1;
    /** @var array of ReflectionClass|\ReflectionFunctionAbstract|string */
    private $dependencies = [];
    /**
     * Adds dependencies to the list.
     * @return static
     */
    public function add(array $deps)
    {
        $this->dependencies = \array_merge($this->dependencies, $deps);
        return $this;
    }
    /**
     * Exports dependencies.
     */
    public function export() : array
    {
        $files = $phpFiles = $classes = $functions = [];
        foreach ($this->dependencies as $dep) {
            if (\is_string($dep)) {
                $files[] = $dep;
            } elseif ($dep instanceof \ReflectionClass) {
                if (empty($classes[$name = $dep->getName()])) {
                    $all = [$name] + \class_parents($name) + \class_implements($name);
                    foreach ($all as &$item) {
                        $all += \class_uses($item);
                        $phpFiles[] = (new \ReflectionClass($item))->getFileName();
                        $classes[$item] = \true;
                    }
                }
            } elseif ($dep instanceof \ReflectionFunctionAbstract) {
                $phpFiles[] = $dep->getFileName();
                $functions[] = \_HumbugBoxb94336daae36\Nette\Utils\Reflection::toString($dep);
            } else {
                throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException('Unexpected dependency ' . \gettype($dep));
            }
        }
        $classes = \array_keys($classes);
        $functions = \array_unique($functions, \SORT_REGULAR);
        $hash = self::calculateHash($classes, $functions);
        $files = @\array_map('filemtime', \array_combine($files, $files));
        // @ - file may not exist
        $phpFiles = @\array_map('filemtime', \array_combine($phpFiles, $phpFiles));
        // @ - file may not exist
        return [self::VERSION, $files, $phpFiles, $classes, $functions, $hash];
    }
    /**
     * Are dependencies expired?
     */
    public static function isExpired(int $version, array $files, array &$phpFiles, array $classes, array $functions, string $hash) : bool
    {
        try {
            $currentFiles = @\array_map('filemtime', \array_combine($tmp = \array_keys($files), $tmp));
            // @ - files may not exist
            $origPhpFiles = $phpFiles;
            $phpFiles = @\array_map('filemtime', \array_combine($tmp = \array_keys($phpFiles), $tmp));
            // @ - files may not exist
            return $version !== self::VERSION || $files !== $currentFiles || $phpFiles !== $origPhpFiles && $hash !== self::calculateHash($classes, $functions);
        } catch (\ReflectionException $e) {
            return \true;
        }
    }
    private static function calculateHash(array $classes, array $functions) : string
    {
        $hash = [];
        foreach ($classes as $name) {
            $class = new \ReflectionClass($name);
            $hash[] = [$name, \_HumbugBoxb94336daae36\Nette\Utils\Reflection::getUseStatements($class), $class->isAbstract(), \get_parent_class($name), \class_implements($name), \class_uses($name)];
            foreach ($class->getProperties(\ReflectionProperty::IS_PUBLIC) as $prop) {
                if ($prop->getDeclaringClass() == $class) {
                    // intentionally ==
                    $hash[] = [$name, $prop->getName(), $prop->getDocComment()];
                }
            }
            foreach ($class->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) {
                if ($method->getDeclaringClass() == $class) {
                    // intentionally ==
                    $hash[] = [$name, $method->getName(), $method->getDocComment(), self::hashParameters($method), $method->hasReturnType() ? [$method->getReturnType()->getName(), $method->getReturnType()->allowsNull()] : null];
                }
            }
        }
        $flip = \array_flip($classes);
        foreach ($functions as $name) {
            if (\strpos($name, '::')) {
                $method = new \ReflectionMethod($name);
                $class = $method->getDeclaringClass();
                if (isset($flip[$class->getName()])) {
                    continue;
                }
                $uses = \_HumbugBoxb94336daae36\Nette\Utils\Reflection::getUseStatements($class);
            } else {
                $method = new \ReflectionFunction($name);
                $uses = null;
            }
            $hash[] = [$name, $uses, $method->getDocComment(), self::hashParameters($method), $method->hasReturnType() ? [$method->getReturnType()->getName(), $method->getReturnType()->allowsNull()] : null];
        }
        return \md5(\serialize($hash));
    }
    private static function hashParameters(\ReflectionFunctionAbstract $method) : array
    {
        $res = [];
        foreach ($method->getParameters() as $param) {
            $res[] = [$param->getName(), \_HumbugBoxb94336daae36\Nette\Utils\Reflection::getParameterType($param), $param->allowsNull(), $param->isVariadic(), $param->isDefaultValueAvailable() ? [\_HumbugBoxb94336daae36\Nette\Utils\Reflection::getParameterDefaultValue($param)] : null];
        }
        return $res;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI;

use _HumbugBoxb94336daae36\Nette;
/**
 * Autowiring.
 */
class Autowiring
{
    use Nette\SmartObject;
    /** @var ContainerBuilder */
    private $builder;
    /** @var array[]  type => services, used by getByType() */
    private $highPriority = [];
    /** @var array[]  type => services, used by findByType() */
    private $lowPriority = [];
    /** @var string[] of classes excluded from autowiring */
    private $excludedClasses = [];
    public function __construct(\_HumbugBoxb94336daae36\Nette\DI\ContainerBuilder $builder)
    {
        $this->builder = $builder;
    }
    /**
     * Resolves service name by type.
     * @param  bool  $throw exception if service not found?
     * @throws MissingServiceException when not found
     * @throws ServiceCreationException when multiple found
     */
    public function getByType(string $type, bool $throw = \false) : ?string
    {
        $type = \_HumbugBoxb94336daae36\Nette\DI\Helpers::normalizeClass($type);
        $types = $this->highPriority;
        if (empty($types[$type])) {
            if ($throw) {
                throw new \_HumbugBoxb94336daae36\Nette\DI\MissingServiceException("Service of type '{$type}' not found.");
            }
            return null;
        } elseif (\count($types[$type]) === 1) {
            return $types[$type][0];
        } else {
            $list = $types[$type];
            \natsort($list);
            $hint = \count($list) === 2 && ($tmp = \strpos($list[0], '.') xor \strpos($list[1], '.')) ? '. If you want to overwrite service ' . $list[$tmp ? 0 : 1] . ', give it proper name.' : '';
            throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Multiple services of type {$type} found: " . \implode(', ', $list) . $hint);
        }
    }
    /**
     * Gets the service names and definitions of the specified type.
     * @return Definitions\Definition[]  service name is key
     */
    public function findByType(string $type) : array
    {
        $type = \_HumbugBoxb94336daae36\Nette\DI\Helpers::normalizeClass($type);
        $definitions = $this->builder->getDefinitions();
        $names = \array_merge($this->highPriority[$type] ?? [], $this->lowPriority[$type] ?? []);
        $res = [];
        foreach ($names as $name) {
            $res[$name] = $definitions[$name];
        }
        return $res;
    }
    /**
     * @param  string[]  $types
     */
    public function addExcludedClasses(array $types) : void
    {
        foreach ($types as $type) {
            if (\class_exists($type) || \interface_exists($type)) {
                $type = \_HumbugBoxb94336daae36\Nette\DI\Helpers::normalizeClass($type);
                $this->excludedClasses += \class_parents($type) + \class_implements($type) + [$type => $type];
            }
        }
    }
    public function getClassList() : array
    {
        return [$this->lowPriority, $this->highPriority];
    }
    public function rebuild() : void
    {
        $this->lowPriority = $this->highPriority = $preferred = [];
        foreach ($this->builder->getDefinitions() as $name => $def) {
            if (!($type = $def->getType())) {
                continue;
            }
            $autowired = $def->getAutowired();
            if (\is_array($autowired)) {
                foreach ($autowired as $k => $autowiredType) {
                    if ($autowiredType === \_HumbugBoxb94336daae36\Nette\DI\ContainerBuilder::THIS_SERVICE) {
                        $autowired[$k] = $type;
                    } elseif (!\is_a($type, $autowiredType, \true)) {
                        throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Incompatible class {$autowiredType} in autowiring definition of service '{$name}'.");
                    }
                }
            }
            foreach (\class_parents($type) + \class_implements($type) + [$type] as $parent) {
                if (!$autowired || isset($this->excludedClasses[$parent])) {
                    continue;
                } elseif (\is_array($autowired)) {
                    $priority = \false;
                    foreach ($autowired as $autowiredType) {
                        if (\is_a($parent, $autowiredType, \true)) {
                            if (empty($preferred[$parent]) && isset($this->highPriority[$parent])) {
                                $this->lowPriority[$parent] = \array_merge($this->lowPriority[$parent], $this->highPriority[$parent]);
                                $this->highPriority[$parent] = [];
                            }
                            $preferred[$parent] = $priority = \true;
                            break;
                        }
                    }
                } else {
                    $priority = empty($preferred[$parent]);
                }
                $list = $priority ? 'highPriority' : 'lowPriority';
                $this->{$list}[$parent][] = $name;
            }
        }
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\DI\Definitions\Reference;
use _HumbugBoxb94336daae36\Nette\DI\Definitions\Statement;
use _HumbugBoxb94336daae36\Nette\Utils\Reflection;
/**
 * The DI helpers.
 * @internal
 */
final class Helpers
{
    use Nette\StaticClass;
    /**
     * Expands %placeholders%.
     * @param  mixed  $var
     * @param  bool|array  $recursive
     * @return mixed
     * @throws Nette\InvalidArgumentException
     */
    public static function expand($var, array $params, $recursive = \false)
    {
        if (\is_array($var)) {
            $res = [];
            foreach ($var as $key => $val) {
                $res[self::expand($key, $params, $recursive)] = self::expand($val, $params, $recursive);
            }
            return $res;
        } elseif ($var instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement) {
            return new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement(self::expand($var->getEntity(), $params, $recursive), self::expand($var->arguments, $params, $recursive));
        } elseif (!\is_string($var)) {
            return $var;
        }
        $parts = \preg_split('#%([\\w.-]*)%#i', $var, -1, \PREG_SPLIT_DELIM_CAPTURE);
        $res = [];
        $php = \false;
        foreach ($parts as $n => $part) {
            if ($n % 2 === 0) {
                $res[] = $part;
            } elseif ($part === '') {
                $res[] = '%';
            } elseif (isset($recursive[$part])) {
                throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException(\sprintf('Circular reference detected for variables: %s.', \implode(', ', \array_keys($recursive))));
            } else {
                $val = $params;
                foreach (\explode('.', $part) as $key) {
                    if (\is_array($val) && \array_key_exists($key, $val)) {
                        $val = $val[$key];
                    } elseif ($val instanceof \_HumbugBoxb94336daae36\Nette\DI\DynamicParameter) {
                        $val = new \_HumbugBoxb94336daae36\Nette\DI\DynamicParameter($val . '[' . \var_export($key, \true) . ']');
                    } else {
                        throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Missing parameter '{$part}'.");
                    }
                }
                if ($recursive) {
                    $val = self::expand($val, $params, (\is_array($recursive) ? $recursive : []) + [$part => 1]);
                }
                if (\strlen($part) + 2 === \strlen($var)) {
                    return $val;
                }
                if ($val instanceof \_HumbugBoxb94336daae36\Nette\DI\DynamicParameter) {
                    $php = \true;
                } elseif (!\is_scalar($val)) {
                    throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Unable to concatenate non-scalar parameter '{$part}' into '{$var}'.");
                }
                $res[] = $val;
            }
        }
        if ($php) {
            $res = \array_filter($res, function ($val) : bool {
                return $val !== '';
            });
            $res = \array_map(function ($val) : string {
                return $val instanceof \_HumbugBoxb94336daae36\Nette\DI\DynamicParameter ? "({$val})" : \var_export((string) $val, \true);
            }, $res);
            return new \_HumbugBoxb94336daae36\Nette\DI\DynamicParameter(\implode(' . ', $res));
        }
        return \implode('', $res);
    }
    /**
     * Removes ... and process constants recursively.
     */
    public static function filterArguments(array $args) : array
    {
        foreach ($args as $k => $v) {
            if ($v === '...') {
                unset($args[$k]);
            } elseif (\is_string($v) && \preg_match('#^[\\w\\\\]*::[A-Z][A-Z0-9_]*\\z#', $v, $m)) {
                $args[$k] = \constant(\ltrim($v, ':'));
            } elseif (\is_string($v) && \preg_match('#^@[\\w\\\\]+\\z#', $v)) {
                $args[$k] = new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference(\substr($v, 1));
            } elseif (\is_array($v)) {
                $args[$k] = self::filterArguments($v);
            } elseif ($v instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement) {
                $tmp = self::filterArguments([$v->getEntity()]);
                $args[$k] = new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement($tmp[0], self::filterArguments($v->arguments));
            }
        }
        return $args;
    }
    /**
     * Replaces @extension with real extension name in service definition.
     * @param  mixed  $config
     * @return mixed
     */
    public static function prefixServiceName($config, string $namespace)
    {
        if (\is_string($config)) {
            if (\strncmp($config, '@extension.', 10) === 0) {
                $config = '@' . $namespace . '.' . \substr($config, 11);
            }
        } elseif ($config instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference) {
            if (\strncmp($config->getValue(), 'extension.', 9) === 0) {
                $config = new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference($namespace . '.' . \substr($config->getValue(), 10));
            }
        } elseif ($config instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement) {
            return new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement(self::prefixServiceName($config->getEntity(), $namespace), self::prefixServiceName($config->arguments, $namespace));
        } elseif (\is_array($config)) {
            foreach ($config as &$val) {
                $val = self::prefixServiceName($val, $namespace);
            }
        }
        return $config;
    }
    /**
     * Returns an annotation value.
     */
    public static function parseAnnotation(\Reflector $ref, string $name) : ?string
    {
        if (!\_HumbugBoxb94336daae36\Nette\Utils\Reflection::areCommentsAvailable()) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException('You have to enable phpDoc comments in opcode cache.');
        }
        $re = '#[\\s*]@' . \preg_quote($name, '#') . '(?=\\s|$)(?:[ \\t]+([^@\\s]\\S*))?#';
        if ($ref->getDocComment() && \preg_match($re, \trim($ref->getDocComment(), '/*'), $m)) {
            return $m[1] ?? '';
        }
        return null;
    }
    public static function getReturnType(\ReflectionFunctionAbstract $func) : ?string
    {
        if ($type = \_HumbugBoxb94336daae36\Nette\Utils\Reflection::getReturnType($func)) {
            return $type;
        } elseif ($type = \preg_replace('#[|\\s].*#', '', (string) self::parseAnnotation($func, 'return'))) {
            if ($type === 'object' || $type === 'mixed') {
                return null;
            } elseif ($func instanceof \ReflectionMethod) {
                return $type === 'static' || $type === '$this' ? $func->getDeclaringClass()->getName() : \_HumbugBoxb94336daae36\Nette\Utils\Reflection::expandClassName($type, $func->getDeclaringClass());
            } else {
                return $type;
            }
        }
        return null;
    }
    public static function normalizeClass(string $type) : string
    {
        return \class_exists($type) || \interface_exists($type) ? (new \ReflectionClass($type))->getName() : $type;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI;

use _HumbugBoxb94336daae36\Nette;
/**
 * Service not found exception.
 */
class MissingServiceException extends \_HumbugBoxb94336daae36\Nette\InvalidStateException
{
}
/**
 * Service creation exception.
 */
class ServiceCreationException extends \_HumbugBoxb94336daae36\Nette\InvalidStateException
{
    public function setMessage(string $message) : self
    {
        $this->message = $message;
        return $this;
    }
}
/**
 * Not allowed when container is resolving.
 */
class NotAllowedDuringResolvingException extends \_HumbugBoxb94336daae36\Nette\InvalidStateException
{
}
/**
 * Error in configuration.
 */
class InvalidConfigurationException extends \_HumbugBoxb94336daae36\Nette\InvalidStateException
{
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI\Definitions;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\DI\ServiceCreationException;
use _HumbugBoxb94336daae36\Nette\Utils\Reflection;
/**
 * Accessor definition.
 */
final class AccessorDefinition extends \_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition
{
    private const METHOD_GET = 'get';
    /** @var Reference|null */
    private $reference;
    /**
     * @return static
     */
    public function setImplement(string $type)
    {
        if (!\interface_exists($type)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Service '{$this->getName()}': Interface '{$type}' not found.");
        }
        $rc = new \ReflectionClass($type);
        $method = $rc->getMethods()[0] ?? null;
        if (!$method || $method->isStatic() || $method->getName() !== self::METHOD_GET || \count($rc->getMethods()) > 1) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Service '{$this->getName()}': Interface {$type} must have just one non-static method get().");
        } elseif ($method->getNumberOfParameters()) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Service '{$this->getName()}': Method {$type}::get() must have no parameters.");
        }
        return parent::setType($type);
    }
    public function getImplement() : ?string
    {
        return $this->getType();
    }
    /**
     * @param  string|Reference  $reference
     * @return static
     */
    public function setReference($reference)
    {
        if ($reference instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference) {
            $this->reference = $reference;
        } else {
            $this->reference = \substr($reference, 0, 1) === '@' ? new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference(\substr($reference, 1)) : \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference::fromType($reference);
        }
        return $this;
    }
    public function getReference() : ?\_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference
    {
        return $this->reference;
    }
    public function resolveType(\_HumbugBoxb94336daae36\Nette\DI\Resolver $resolver) : void
    {
    }
    public function complete(\_HumbugBoxb94336daae36\Nette\DI\Resolver $resolver) : void
    {
        if (!$this->reference) {
            $interface = $this->getType();
            $method = new \ReflectionMethod($interface, self::METHOD_GET);
            $returnType = \_HumbugBoxb94336daae36\Nette\DI\Helpers::getReturnType($method);
            if (!$returnType) {
                throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Method {$interface}::get() has not return type hint or annotation @return.");
            } elseif (!\class_exists($returnType) && !\interface_exists($returnType)) {
                throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Check a type hint or annotation @return of the {$interface}::get() method, class '{$returnType}' cannot be found.");
            }
            $this->setReference($returnType);
        }
        $this->reference = $resolver->normalizeReference($this->reference);
    }
    public function generateMethod(\_HumbugBoxb94336daae36\Nette\PhpGenerator\Method $method, \_HumbugBoxb94336daae36\Nette\DI\PhpGenerator $generator) : void
    {
        $class = (new \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType())->addImplement($this->getType());
        $class->addProperty('container')->setVisibility('private');
        $class->addMethod('__construct')->addBody('$this->container = $container;')->addParameter('container')->setTypeHint($generator->getClassName());
        $rm = new \ReflectionMethod($this->getType(), self::METHOD_GET);
        $class->addMethod(self::METHOD_GET)->setBody('return $this->container->getService(?);', [$this->reference->getValue()])->setReturnType(\_HumbugBoxb94336daae36\Nette\Utils\Reflection::getReturnType($rm));
        $method->setBody('return new class ($this) ' . $class . ';');
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI\Definitions;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\Utils\Reflection;
/**
 * Multi accessor/factory definition.
 */
final class LocatorDefinition extends \_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition
{
    /** @var Reference[] */
    private $references = [];
    /** @var string|null */
    private $tagged;
    /**
     * @return static
     */
    public function setImplement(string $type)
    {
        if (!\interface_exists($type)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException(\sprintf("Service '%s': Interface '%s' not found.", $this->getName(), $type));
        }
        $methods = (new \ReflectionClass($type))->getMethods();
        if (!$methods) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException(\sprintf("Service '%s': Interface %s must have at least one method.", $this->getName(), $type));
        }
        foreach ($methods as $method) {
            if ($method->isStatic() || !(\preg_match('#^(get|create)$#', $method->getName()) && $method->getNumberOfParameters() === 1 || \preg_match('#^(get|create)[A-Z]#', $method->getName()) && $method->getNumberOfParameters() === 0)) {
                throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException(\sprintf("Service '%s': Method %s::%s() does not meet the requirements: is create(\$name), get(\$name), create*() or get*() and is non-static.", $this->getName(), $type, $method->getName()));
            }
        }
        return parent::setType($type);
    }
    public function getImplement() : ?string
    {
        return $this->getType();
    }
    /**
     * @return static
     */
    public function setReferences(array $references)
    {
        $this->references = [];
        foreach ($references as $name => $ref) {
            $this->references[$name] = \substr($ref, 0, 1) === '@' ? new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference(\substr($ref, 1)) : \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference::fromType($ref);
        }
        return $this;
    }
    /**
     * @return Reference[]
     */
    public function getReferences() : array
    {
        return $this->references;
    }
    /**
     * @return static
     */
    public function setTagged(?string $tagged)
    {
        $this->tagged = $tagged;
        return $this;
    }
    public function getTagged() : ?string
    {
        return $this->tagged;
    }
    public function resolveType(\_HumbugBoxb94336daae36\Nette\DI\Resolver $resolver) : void
    {
    }
    public function complete(\_HumbugBoxb94336daae36\Nette\DI\Resolver $resolver) : void
    {
        if ($this->tagged !== null) {
            $this->references = [];
            foreach ($resolver->getContainerBuilder()->findByTag($this->tagged) as $name => $tag) {
                if (isset($this->references[$tag])) {
                    \trigger_error("Service '{$this->getName()}': duplicated tag '{$this->tagged}' with value '{$tag}'.", \E_USER_NOTICE);
                }
                $this->references[$tag] = new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference($name);
            }
        }
        foreach ($this->references as $name => $ref) {
            $this->references[$name] = $resolver->normalizeReference($ref);
        }
    }
    public function generateMethod(\_HumbugBoxb94336daae36\Nette\PhpGenerator\Method $method, \_HumbugBoxb94336daae36\Nette\DI\PhpGenerator $generator) : void
    {
        $class = (new \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType())->addImplement($this->getType());
        $class->addProperty('container')->setVisibility('private');
        $class->addMethod('__construct')->addBody('$this->container = $container;')->addParameter('container')->setTypeHint($generator->getClassName());
        foreach ((new \ReflectionClass($this->getType()))->getMethods() as $rm) {
            \preg_match('#^(get|create)(.*)#', $rm->getName(), $m);
            $name = \lcfirst($m[2]);
            $nullable = $rm->getReturnType()->allowsNull();
            $methodInner = $class->addMethod($rm->getName())->setReturnType(\_HumbugBoxb94336daae36\Nette\Utils\Reflection::getReturnType($rm))->setReturnNullable($nullable);
            if (!$name) {
                $class->addProperty('mapping', \array_map(function ($item) {
                    return $item->getValue();
                }, $this->references))->setVisibility('private');
                $methodInner->setBody('if (!isset($this->mapping[$name])) {
	' . ($nullable ? 'return null;' : 'throw new Nette\\DI\\MissingServiceException("Service \'$name\' is not defined.");') . '
}
return $this->container->' . $m[1] . 'Service($this->mapping[$name]);')->addParameter('name');
            } elseif (isset($this->references[$name])) {
                $ref = $this->references[$name]->getValue();
                if ($m[1] === 'get') {
                    $methodInner->setBody('return $this->container->getService(?);', [$ref]);
                } else {
                    $methodInner->setBody('return $this->container->?();', [\_HumbugBoxb94336daae36\Nette\DI\Container::getMethodName($ref)]);
                }
            } else {
                $methodInner->setBody($nullable ? 'return null;' : 'throw new Nette\\DI\\MissingServiceException("Service is not defined.");');
            }
        }
        $method->setBody('return new class ($this) ' . $class . ';');
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI\Definitions;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\DI\Definitions\Reference;
use _HumbugBoxb94336daae36\Nette\DI\ServiceCreationException;
use _HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers as PhpHelpers;
/**
 * Definition of standard service.
 *
 * @property string|null $class
 * @property Statement $factory
 * @property Statement[] $setup
 */
final class ServiceDefinition extends \_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition
{
    /** @var Statement */
    private $factory;
    /** @var Statement[] */
    private $setup = [];
    public function __construct()
    {
        $this->factory = new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement(null);
    }
    /**
     * @deprecated Use setType()
     */
    public function setClass(?string $type)
    {
        $this->setType($type);
        if (\func_num_args() > 1) {
            \trigger_error(\sprintf('Service %s: %s() second parameter $args is deprecated, use setFactory()', $this->getName(), __METHOD__), \E_USER_DEPRECATED);
            if ($args = \func_get_arg(1)) {
                $this->setFactory($type, $args);
            }
        }
        return $this;
    }
    /**
     * @return static
     */
    public function setType(?string $type)
    {
        return parent::setType($type);
    }
    /**
     * @param  string|array|Definition|Reference|Statement  $factory
     * @return static
     */
    public function setFactory($factory, array $args = [])
    {
        $this->factory = $factory instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement ? $factory : new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement($factory, $args);
        return $this;
    }
    public function getFactory() : \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement
    {
        return $this->factory;
    }
    /**
     * @return string|array|Definition|null
     */
    public function getEntity()
    {
        return $this->factory->getEntity();
    }
    /**
     * @return static
     */
    public function setArguments(array $args = [])
    {
        $this->factory->arguments = $args;
        return $this;
    }
    /**
     * @return static
     */
    public function setArgument($key, $value)
    {
        $this->factory->arguments[$key] = $value;
        return $this;
    }
    /**
     * @param  Statement[]  $setup
     * @return static
     */
    public function setSetup(array $setup)
    {
        foreach ($setup as $v) {
            if (!$v instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement) {
                throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Argument must be Nette\\DI\\Definitions\\Statement[].');
            }
        }
        $this->setup = $setup;
        return $this;
    }
    /**
     * @return Statement[]
     */
    public function getSetup() : array
    {
        return $this->setup;
    }
    /**
     * @param  string|array|Definition|Reference|Statement  $entity
     * @return static
     */
    public function addSetup($entity, array $args = [])
    {
        $this->setup[] = $entity instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement ? $entity : new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement($entity, $args);
        return $this;
    }
    /**
     * @deprecated
     */
    public function setParameters(array $params)
    {
        throw new \_HumbugBoxb94336daae36\Nette\DeprecatedException(\sprintf('Service %s: %s() is deprecated.', $this->getName(), __METHOD__));
    }
    /**
     * @deprecated
     */
    public function getParameters() : array
    {
        \trigger_error(\sprintf('Service %s: %s() is deprecated.', $this->getName(), __METHOD__), \E_USER_DEPRECATED);
        return [];
    }
    /**
     * @deprecated use $builder->addImportedDefinition(...)
     */
    public function setDynamic() : void
    {
        throw new \_HumbugBoxb94336daae36\Nette\DeprecatedException(\sprintf('Service %s: %s() is deprecated, use $builder->addImportedDefinition(...)', $this->getName(), __METHOD__));
    }
    /**
     * @deprecated use $builder->addFactoryDefinition(...) or addAccessorDefinition(...)
     */
    public function setImplement() : void
    {
        throw new \_HumbugBoxb94336daae36\Nette\DeprecatedException(\sprintf('Service %s: %s() is deprecated, use $builder->addFactoryDefinition(...)', $this->getName(), __METHOD__));
    }
    /**
     * @deprecated use addTag('nette.inject')
     */
    public function setInject(bool $state = \true)
    {
        \trigger_error(\sprintf('Service %s: %s() is deprecated, use addTag(Nette\\DI\\Extensions\\InjectExtension::TAG_INJECT)', $this->getName(), __METHOD__), \E_USER_DEPRECATED);
        return $this->addTag(\_HumbugBoxb94336daae36\Nette\DI\Extensions\InjectExtension::TAG_INJECT, $state);
    }
    public function resolveType(\_HumbugBoxb94336daae36\Nette\DI\Resolver $resolver) : void
    {
        if (!$this->getEntity()) {
            if (!$this->getType()) {
                throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException('Factory and type are missing in definition of service.');
            }
            $this->setFactory($this->getType(), $this->factory->arguments ?? []);
        } elseif (!$this->getType()) {
            $type = $resolver->resolveEntityType($this->factory);
            if (!$type) {
                throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException('Unknown service type, specify it or declare return type of factory.');
            }
            $this->setType($type);
            $resolver->addDependency(new \ReflectionClass($type));
        }
        // auto-disable autowiring for aliases
        if ($this->getAutowired() === \true && $this->getEntity() instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference) {
            $this->setAutowired(\false);
        }
    }
    public function complete(\_HumbugBoxb94336daae36\Nette\DI\Resolver $resolver) : void
    {
        $entity = $this->factory->getEntity();
        if ($entity instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference && !$this->factory->arguments && !$this->setup) {
            $ref = $resolver->normalizeReference($entity);
            $this->setFactory([new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference(\_HumbugBoxb94336daae36\Nette\DI\ContainerBuilder::THIS_CONTAINER), 'getService'], [$ref->getValue()]);
        }
        $this->factory = $resolver->completeStatement($this->factory);
        foreach ($this->setup as &$setup) {
            if (\is_string($setup->getEntity()) && \strpbrk($setup->getEntity(), ':@?\\') === \false) {
                // auto-prepend @self
                $setup = new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement([new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference(\_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference::SELF), $setup->getEntity()], $setup->arguments);
            }
            $setup = $resolver->completeStatement($setup, \true);
        }
    }
    public function generateMethod(\_HumbugBoxb94336daae36\Nette\PhpGenerator\Method $method, \_HumbugBoxb94336daae36\Nette\DI\PhpGenerator $generator) : void
    {
        $entity = $this->factory->getEntity();
        $code = '$service = ' . $generator->formatStatement($this->factory) . ";\n";
        $type = $this->getType();
        if ($this->setup && $type !== $entity && !(\is_array($entity) && $entity[0] instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference && $entity[0]->getValue() === \_HumbugBoxb94336daae36\Nette\DI\ContainerBuilder::THIS_CONTAINER) && !(\is_string($entity) && \preg_match('#^[\\w\\\\]+\\z#', $entity) && \is_subclass_of($entity, $type))) {
            $code .= \_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::formatArgs("if (!\$service instanceof {$type}) {\n" . "\tthrow new Nette\\UnexpectedValueException(?);\n}\n", ["Unable to create service '{$this->getName()}', value returned by factory is not {$type} type."]);
        }
        foreach ($this->setup as $setup) {
            $code .= $generator->formatStatement($setup) . ";\n";
        }
        $code .= 'return $service;';
        $method->setBody($code);
    }
    public function __clone()
    {
        parent::__clone();
        $this->factory = \unserialize(\serialize($this->factory));
        $this->setup = \unserialize(\serialize($this->setup));
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI\Definitions;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\DI\ServiceCreationException;
use _HumbugBoxb94336daae36\Nette\Utils\Reflection;
/**
 * Definition of standard service.
 */
final class FactoryDefinition extends \_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition
{
    private const METHOD_CREATE = 'create';
    /** @var array */
    public $parameters = [];
    /** @var Definition */
    private $resultDefinition;
    public function __construct()
    {
        $this->resultDefinition = new \_HumbugBoxb94336daae36\Nette\DI\Definitions\ServiceDefinition();
    }
    /**
     * @return static
     */
    public function setImplement(string $type)
    {
        if (!\interface_exists($type)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Service '{$this->getName()}': Interface '{$type}' not found.");
        }
        $rc = new \ReflectionClass($type);
        $method = $rc->getMethods()[0] ?? null;
        if (!$method || $method->isStatic() || $method->getName() !== self::METHOD_CREATE || \count($rc->getMethods()) > 1) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Service '{$this->getName()}': Interface {$type} must have just one non-static method create().");
        }
        return parent::setType($type);
    }
    public function getImplement() : ?string
    {
        return $this->getType();
    }
    public final function getResultType() : ?string
    {
        return $this->resultDefinition->getType();
    }
    /**
     * @return static
     */
    public function setResultDefinition(\_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition $definition)
    {
        $this->resultDefinition = $definition;
        return $this;
    }
    /**
     * @return ServiceDefinition
     */
    public function getResultDefinition() : \_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition
    {
        return $this->resultDefinition;
    }
    /**
     * @deprecated use ->getResultDefinition()->setFactory()
     * @return static
     */
    public function setFactory($factory, array $args = [])
    {
        \trigger_error(\sprintf('Service %s: %s() is deprecated, use ->getResultDefinition()->setFactory()', $this->getName(), __METHOD__), \E_USER_DEPRECATED);
        $this->resultDefinition->setFactory($factory, $args);
        return $this;
    }
    /**
     * @deprecated use ->getResultDefinition()->getFactory()
     */
    public function getFactory() : ?\_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement
    {
        \trigger_error(\sprintf('Service %s: %s() is deprecated, use ->getResultDefinition()->getFactory()', $this->getName(), __METHOD__), \E_USER_DEPRECATED);
        return $this->resultDefinition->getFactory();
    }
    /**
     * @deprecated use ->getResultDefinition()->getEntity()
     * @return mixed
     */
    public function getEntity()
    {
        \trigger_error(\sprintf('Service %s: %s() is deprecated, use ->getResultDefinition()->getEntity()', $this->getName(), __METHOD__), \E_USER_DEPRECATED);
        return $this->resultDefinition->getEntity();
    }
    /**
     * @deprecated use ->getResultDefinition()->setArguments()
     * @return static
     */
    public function setArguments(array $args = [])
    {
        \trigger_error(\sprintf('Service %s: %s() is deprecated, use ->getResultDefinition()->setArguments()', $this->getName(), __METHOD__), \E_USER_DEPRECATED);
        $this->resultDefinition->setArguments($args);
        return $this;
    }
    /**
     * @deprecated use ->getResultDefinition()->setSetup()
     * @return static
     */
    public function setSetup(array $setup)
    {
        \trigger_error(\sprintf('Service %s: %s() is deprecated, use ->getResultDefinition()->setSetup()', $this->getName(), __METHOD__), \E_USER_DEPRECATED);
        $this->resultDefinition->setSetup($setup);
        return $this;
    }
    /**
     * @deprecated use ->getResultDefinition()->getSetup()
     */
    public function getSetup() : array
    {
        \trigger_error(\sprintf('Service %s: %s() is deprecated, use ->getResultDefinition()->getSetup()', $this->getName(), __METHOD__), \E_USER_DEPRECATED);
        return $this->resultDefinition->getSetup();
    }
    /**
     * @deprecated use ->getResultDefinition()->addSetup()
     * @return static
     */
    public function addSetup($entity, array $args = [])
    {
        \trigger_error(\sprintf('Service %s: %s() is deprecated, use ->getResultDefinition()->addSetup()', $this->getName(), __METHOD__), \E_USER_DEPRECATED);
        $this->resultDefinition->addSetup($entity, $args);
        return $this;
    }
    /**
     * @return static
     */
    public function setParameters(array $params)
    {
        $this->parameters = $params;
        return $this;
    }
    public function getParameters() : array
    {
        return $this->parameters;
    }
    public function resolveType(\_HumbugBoxb94336daae36\Nette\DI\Resolver $resolver) : void
    {
        $resultDef = $this->resultDefinition;
        try {
            $resolver->resolveDefinition($resultDef);
            return;
        } catch (\_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException $e) {
        }
        if (!$resultDef->getType()) {
            $interface = $this->getType();
            if (!$interface) {
                throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException('Type is missing in definition of service.');
            }
            $method = new \ReflectionMethod($interface, self::METHOD_CREATE);
            $returnType = \_HumbugBoxb94336daae36\Nette\DI\Helpers::getReturnType($method);
            if (!$returnType) {
                throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Method {$interface}::create() has not return type hint or annotation @return.");
            } elseif (!\class_exists($returnType) && !\interface_exists($returnType)) {
                throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Check a type hint or annotation @return of the {$interface}::create() method, class '{$returnType}' cannot be found.");
            }
            $resultDef->setType($returnType);
        }
        $resolver->resolveDefinition($resultDef);
    }
    public function complete(\_HumbugBoxb94336daae36\Nette\DI\Resolver $resolver) : void
    {
        $resultDef = $this->resultDefinition;
        if ($resultDef instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\ServiceDefinition) {
            if (!$this->parameters) {
                $this->completeParameters($resolver);
            }
            if ($resultDef->getEntity() instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference && !$resultDef->getFactory()->arguments) {
                $resultDef->setFactory([
                    // render as $container->createMethod()
                    new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference(\_HumbugBoxb94336daae36\Nette\DI\ContainerBuilder::THIS_CONTAINER),
                    \_HumbugBoxb94336daae36\Nette\DI\Container::getMethodName($resultDef->getEntity()->getValue()),
                ]);
            }
        }
        $resolver->completeDefinition($resultDef);
    }
    private function completeParameters(\_HumbugBoxb94336daae36\Nette\DI\Resolver $resolver) : void
    {
        $interface = $this->getType();
        $method = new \ReflectionMethod($interface, self::METHOD_CREATE);
        $ctorParams = [];
        if (($class = $resolver->resolveEntityType($this->resultDefinition->getFactory())) && ($ctor = (new \ReflectionClass($class))->getConstructor())) {
            foreach ($ctor->getParameters() as $param) {
                $ctorParams[$param->getName()] = $param;
            }
        }
        foreach ($method->getParameters() as $param) {
            $hint = \_HumbugBoxb94336daae36\Nette\Utils\Reflection::getParameterType($param);
            if (isset($ctorParams[$param->getName()])) {
                $arg = $ctorParams[$param->getName()];
                $argHint = \_HumbugBoxb94336daae36\Nette\Utils\Reflection::getParameterType($arg);
                if ($hint !== $argHint && !\is_a($hint, (string) $argHint, \true)) {
                    throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Type hint for \${$param->getName()} in {$interface}::create() doesn't match type hint in {$class} constructor.");
                }
                $this->resultDefinition->getFactory()->arguments[$arg->getPosition()] = \_HumbugBoxb94336daae36\Nette\DI\ContainerBuilder::literal('$' . $arg->getName());
            } elseif (!$this->resultDefinition->getSetup()) {
                $hint = \_HumbugBoxb94336daae36\Nette\Utils\ObjectHelpers::getSuggestion(\array_keys($ctorParams), $param->getName());
                throw new \_HumbugBoxb94336daae36\Nette\DI\ServiceCreationException("Unused parameter \${$param->getName()} when implementing method {$interface}::create()" . ($hint ? ", did you mean \${$hint}?" : '.'));
            }
            $nullable = $hint && $param->allowsNull() && (!$param->isDefaultValueAvailable() || $param->getDefaultValue() !== null);
            $paramDef = ($nullable ? '?' : '') . $hint . ' ' . $param->getName();
            if ($param->isDefaultValueAvailable()) {
                $this->parameters[$paramDef] = \_HumbugBoxb94336daae36\Nette\Utils\Reflection::getParameterDefaultValue($param);
            } else {
                $this->parameters[] = $paramDef;
            }
        }
    }
    public function generateMethod(\_HumbugBoxb94336daae36\Nette\PhpGenerator\Method $method, \_HumbugBoxb94336daae36\Nette\DI\PhpGenerator $generator) : void
    {
        $class = (new \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType())->addImplement($this->getType());
        $class->addProperty('container')->setVisibility('private');
        $class->addMethod('__construct')->addBody('$this->container = $container;')->addParameter('container')->setTypeHint($generator->getClassName());
        $methodCreate = $class->addMethod(self::METHOD_CREATE);
        $this->resultDefinition->generateMethod($methodCreate, $generator);
        $body = $methodCreate->getBody();
        $body = \str_replace('$this', '$this->container', $body);
        $body = \str_replace('$this->container->container', '$this->container', $body);
        $rm = new \ReflectionMethod($this->getType(), self::METHOD_CREATE);
        $methodCreate->setParameters($generator->convertParameters($this->parameters))->setReturnType(\_HumbugBoxb94336daae36\Nette\Utils\Reflection::getReturnType($rm) ?: $this->getResultType())->setBody($body);
        $method->setBody('return new class ($this) ' . $class . ';');
    }
    public function __clone()
    {
        parent::__clone();
        $this->resultDefinition = \unserialize(\serialize($this->resultDefinition));
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI\Definitions;

use _HumbugBoxb94336daae36\Nette;
/**
 * Reference to service. Either by name or by type or reference to the 'self' service.
 */
final class Reference
{
    use Nette\SmartObject;
    public const SELF = 'self';
    /** @var string */
    private $value;
    public static function fromType(string $value) : self
    {
        if (\strpos($value, '\\') === \false) {
            $value = '\\' . $value;
        }
        return new static($value);
    }
    public function __construct(string $value)
    {
        $this->value = $value;
    }
    public function getValue() : string
    {
        return $this->value;
    }
    public function isName() : bool
    {
        return \strpos($this->value, '\\') === \false && $this->value !== self::SELF;
    }
    public function isType() : bool
    {
        return \strpos($this->value, '\\') !== \false;
    }
    public function isSelf() : bool
    {
        return $this->value === self::SELF;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI\Definitions;

use _HumbugBoxb94336daae36\Nette;
/**
 * Definition used by ContainerBuilder.
 */
abstract class Definition
{
    use Nette\SmartObject;
    /** @var string */
    private $name;
    /** @var string|null  class or interface name */
    private $type;
    /** @var array */
    private $tags = [];
    /** @var bool|string[] */
    private $autowired = \true;
    /** @var callable|null */
    private $notifier;
    /**
     * @return static
     * @internal  This is managed by ContainerBuilder and should not be called by user
     */
    public final function setName(string $name)
    {
        if ($this->name) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException('Name already has been set.');
        }
        $this->name = $name;
        return $this;
    }
    public final function getName() : ?string
    {
        return $this->name;
    }
    /**
     * @return static
     */
    protected function setType(?string $type)
    {
        if ($this->autowired && $this->notifier && $this->type !== $type) {
            ($this->notifier)();
        }
        if ($type === null) {
            $this->type = null;
        } elseif (!\class_exists($type) && !\interface_exists($type)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Service '{$this->name}': Class or interface '{$type}' not found.");
        } else {
            $this->type = \_HumbugBoxb94336daae36\Nette\DI\Helpers::normalizeClass($type);
        }
        return $this;
    }
    public final function getType() : ?string
    {
        return $this->type;
    }
    /**
     * @return static
     */
    public final function setTags(array $tags)
    {
        $this->tags = $tags;
        return $this;
    }
    public final function getTags() : array
    {
        return $this->tags;
    }
    /**
     * @param  mixed  $attr
     * @return static
     */
    public final function addTag(string $tag, $attr = \true)
    {
        $this->tags[$tag] = $attr;
        return $this;
    }
    /**
     * @return mixed
     */
    public final function getTag(string $tag)
    {
        return $this->tags[$tag] ?? null;
    }
    /**
     * @param  bool|string|string[]  $state
     * @return static
     */
    public final function setAutowired($state = \true)
    {
        if ($this->notifier && $this->autowired !== $state) {
            ($this->notifier)();
        }
        $this->autowired = \is_string($state) || \is_array($state) ? (array) $state : (bool) $state;
        return $this;
    }
    /**
     * @return bool|string[]
     */
    public final function getAutowired()
    {
        return $this->autowired;
    }
    /**
     * @return static
     */
    public function setExported(bool $state = \true)
    {
        return $this->addTag('nette.exported', $state);
    }
    public function isExported() : bool
    {
        return (bool) $this->getTag('nette.exported');
    }
    public function __clone()
    {
        $this->notifier = $this->name = null;
    }
    /********************* life cycle ****************d*g**/
    public abstract function resolveType(\_HumbugBoxb94336daae36\Nette\DI\Resolver $resolver) : void;
    public abstract function complete(\_HumbugBoxb94336daae36\Nette\DI\Resolver $resolver) : void;
    public abstract function generateMethod(\_HumbugBoxb94336daae36\Nette\PhpGenerator\Method $method, \_HumbugBoxb94336daae36\Nette\DI\PhpGenerator $generator) : void;
    public final function setNotifier(?callable $notifier) : void
    {
        $this->notifier = $notifier;
    }
    /********************* deprecated stuff from former ServiceDefinition ****************d*g**/
    /**
     * @deprecated Use setType()
     */
    public function setClass(?string $type)
    {
        return $this->setType($type);
    }
    /**
     * @deprecated Use getType()
     */
    public function getClass() : ?string
    {
        return $this->getType();
    }
    /**
     * @deprecated Use '$def instanceof Nette\DI\Definitions\ImportedDefinition'
     */
    public function isDynamic() : bool
    {
        return \false;
    }
    /**
     * @deprecated Use Nette\DI\Definitions\FactoryDefinition or AccessorDefinition
     */
    public function getImplement() : ?string
    {
        return null;
    }
    /**
     * @deprecated Use getAutowired()
     */
    public function isAutowired()
    {
        return $this->autowired;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI\Definitions;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\Utils\Strings;
/**
 * Assignment or calling statement.
 *
 * @property string|array|Definition|Reference|null $entity
 */
final class Statement
{
    use Nette\SmartObject;
    /** @var array */
    public $arguments;
    /** @var string|array|Definition|Reference|null */
    private $entity;
    /**
     * @param  string|array|Definition|Reference|null  $entity
     */
    public function __construct($entity, array $arguments = [])
    {
        if ($entity !== null && !\is_string($entity) && !$entity instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition && !$entity instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference && !(\is_array($entity) && \array_keys($entity) === [0, 1] && (\is_string($entity[0]) || $entity[0] instanceof self || $entity[0] instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference || $entity[0] instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition))) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Argument is not valid Statement entity.');
        }
        // normalize Class::method to [Class, method]
        if (\is_string($entity) && \_HumbugBoxb94336daae36\Nette\Utils\Strings::contains($entity, '::') && !\_HumbugBoxb94336daae36\Nette\Utils\Strings::contains($entity, '?')) {
            $entity = \explode('::', $entity);
        }
        if (\is_string($entity) && \substr($entity, 0, 1) === '@') {
            // normalize @service to Reference
            $entity = new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference(\substr($entity, 1));
        } elseif (\is_array($entity) && \is_string($entity[0]) && \substr($entity[0], 0, 1) === '@') {
            $entity[0] = new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Reference(\substr($entity[0], 1));
        }
        $this->entity = $entity;
        $this->arguments = $arguments;
    }
    /** @return string|array|Definition|Reference|null */
    public function getEntity()
    {
        return $this->entity;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI\Definitions;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\DI\PhpGenerator;
/**
 * Imported service injected to the container.
 */
final class ImportedDefinition extends \_HumbugBoxb94336daae36\Nette\DI\Definitions\Definition
{
    /**
     * @return static
     */
    public function setType(?string $type)
    {
        return parent::setType($type);
    }
    public function resolveType(\_HumbugBoxb94336daae36\Nette\DI\Resolver $resolver) : void
    {
    }
    public function complete(\_HumbugBoxb94336daae36\Nette\DI\Resolver $resolver) : void
    {
    }
    public function generateMethod(\_HumbugBoxb94336daae36\Nette\PhpGenerator\Method $method, \_HumbugBoxb94336daae36\Nette\DI\PhpGenerator $generator) : void
    {
        $method->setReturnType('void')->setBody('throw new Nette\\DI\\ServiceCreationException(?);', ["Unable to create imported service '{$this->getName()}', it must be added using addService()"]);
    }
    /**
     * @deprecated use '$def instanceof ImportedDefinition'
     */
    public function isDynamic() : bool
    {
        return \true;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI;

use _HumbugBoxb94336daae36\Nette;
/**
 * DI container loader.
 */
class ContainerLoader
{
    use Nette\SmartObject;
    /** @var bool */
    private $autoRebuild = \false;
    /** @var string */
    private $tempDirectory;
    public function __construct(string $tempDirectory, bool $autoRebuild = \false)
    {
        $this->tempDirectory = $tempDirectory;
        $this->autoRebuild = $autoRebuild;
    }
    /**
     * @param  callable  $generator  function (Nette\DI\Compiler $compiler): string|null
     * @param  mixed  $key
     */
    public function load(callable $generator, $key = null) : string
    {
        $class = $this->getClassName($key);
        if (!\class_exists($class, \false)) {
            $this->loadFile($class, $generator);
        }
        return $class;
    }
    /**
     * @param  mixed  $key
     */
    public function getClassName($key) : string
    {
        return 'Container_' . \substr(\md5(\serialize($key)), 0, 10);
    }
    private function loadFile(string $class, callable $generator) : void
    {
        $file = "{$this->tempDirectory}/{$class}.php";
        if (!$this->isExpired($file) && @(include $file) !== \false) {
            // @ file may not exist
            return;
        }
        \_HumbugBoxb94336daae36\Nette\Utils\FileSystem::createDir($this->tempDirectory);
        $handle = @\fopen("{$file}.lock", 'c+');
        // @ is escalated to exception
        if (!$handle) {
            throw new \_HumbugBoxb94336daae36\Nette\IOException("Unable to create file '{$file}.lock'. " . \error_get_last()['message']);
        } elseif (!@\flock($handle, \LOCK_EX)) {
            // @ is escalated to exception
            throw new \_HumbugBoxb94336daae36\Nette\IOException("Unable to acquire exclusive lock on '{$file}.lock'. " . \error_get_last()['message']);
        }
        if (!\is_file($file) || $this->isExpired($file, $updatedMeta)) {
            if (isset($updatedMeta)) {
                $toWrite["{$file}.meta"] = $updatedMeta;
            } else {
                [$toWrite[$file], $toWrite["{$file}.meta"]] = $this->generate($class, $generator);
            }
            foreach ($toWrite as $name => $content) {
                if (\file_put_contents("{$name}.tmp", $content) !== \strlen($content) || !\rename("{$name}.tmp", $name)) {
                    @\unlink("{$name}.tmp");
                    // @ - file may not exist
                    throw new \_HumbugBoxb94336daae36\Nette\IOException("Unable to create file '{$name}'.");
                } elseif (\function_exists('opcache_invalidate')) {
                    @\opcache_invalidate($name, \true);
                    // @ can be restricted
                }
            }
        }
        if (@(include $file) === \false) {
            // @ - error escalated to exception
            throw new \_HumbugBoxb94336daae36\Nette\IOException("Unable to include '{$file}'.");
        }
        \flock($handle, \LOCK_UN);
    }
    private function isExpired(string $file, string &$updatedMeta = null) : bool
    {
        if ($this->autoRebuild) {
            $meta = @\unserialize((string) \file_get_contents("{$file}.meta"));
            // @ - file may not exist
            $orig = $meta[2];
            return empty($meta[0]) || \_HumbugBoxb94336daae36\Nette\DI\DependencyChecker::isExpired(...$meta) || $orig !== $meta[2] && ($updatedMeta = \serialize($meta));
        }
        return \false;
    }
    /**
     * @return array of (code, file[])
     */
    protected function generate(string $class, callable $generator) : array
    {
        $compiler = new \_HumbugBoxb94336daae36\Nette\DI\Compiler();
        $compiler->setClassName($class);
        $code = $generator(...[&$compiler]) ?: $compiler->compile();
        return ["<?php\n{$code}", \serialize($compiler->exportDependencies())];
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\DI;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\Schema;
/**
 * DI container compiler.
 */
class Compiler
{
    use Nette\SmartObject;
    private const SERVICES = 'services', PARAMETERS = 'parameters', DI = 'di';
    /** @var CompilerExtension[] */
    private $extensions = [];
    /** @var ContainerBuilder */
    private $builder;
    /** @var array */
    private $config = [];
    /** @var array [section => array[]] */
    private $configs = [];
    /** @var string */
    private $sources = '';
    /** @var DependencyChecker */
    private $dependencies;
    /** @var string */
    private $className = 'Container';
    public function __construct(\_HumbugBoxb94336daae36\Nette\DI\ContainerBuilder $builder = null)
    {
        $this->builder = $builder ?: new \_HumbugBoxb94336daae36\Nette\DI\ContainerBuilder();
        $this->dependencies = new \_HumbugBoxb94336daae36\Nette\DI\DependencyChecker();
        $this->addExtension(self::SERVICES, new \_HumbugBoxb94336daae36\Nette\DI\Extensions\ServicesExtension());
        $this->addExtension(self::PARAMETERS, new \_HumbugBoxb94336daae36\Nette\DI\Extensions\ParametersExtension($this->configs));
    }
    /**
     * Add custom configurator extension.
     * @return static
     */
    public function addExtension(?string $name, \_HumbugBoxb94336daae36\Nette\DI\CompilerExtension $extension)
    {
        if ($name === null) {
            $name = '_' . \count($this->extensions);
        } elseif (isset($this->extensions[$name])) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Name '{$name}' is already used or reserved.");
        }
        $lname = \strtolower($name);
        foreach (\array_keys($this->extensions) as $nm) {
            if ($lname === \strtolower((string) $nm)) {
                throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Name of extension '{$name}' has the same name as '{$nm}' in a case-insensitive manner.");
            }
        }
        $this->extensions[$name] = $extension->setCompiler($this, $name);
        return $this;
    }
    public function getExtensions(string $type = null) : array
    {
        return $type ? \array_filter($this->extensions, function ($item) use($type) : bool {
            return $item instanceof $type;
        }) : $this->extensions;
    }
    public function getContainerBuilder() : \_HumbugBoxb94336daae36\Nette\DI\ContainerBuilder
    {
        return $this->builder;
    }
    /**
     * @return static
     */
    public function setClassName(string $className)
    {
        $this->className = $className;
        return $this;
    }
    /**
     * Adds new configuration.
     * @return static
     */
    public function addConfig(array $config)
    {
        foreach ($config as $section => $data) {
            $this->configs[$section][] = $data;
        }
        $this->sources .= "// source: array\n";
        return $this;
    }
    /**
     * Adds new configuration from file.
     * @return static
     */
    public function loadConfig(string $file, \_HumbugBoxb94336daae36\Nette\DI\Config\Loader $loader = null)
    {
        $sources = $this->sources . "// source: {$file}\n";
        $loader = $loader ?: new \_HumbugBoxb94336daae36\Nette\DI\Config\Loader();
        foreach ($loader->load($file, \false) as $data) {
            $this->addConfig($data);
        }
        $this->dependencies->add($loader->getDependencies());
        $this->sources = $sources;
        return $this;
    }
    /**
     * Returns configuration.
     * @deprecated
     */
    public function getConfig() : array
    {
        return $this->config;
    }
    /**
     * Sets the names of dynamic parameters.
     * @return static
     */
    public function setDynamicParameterNames(array $names)
    {
        $this->extensions[self::PARAMETERS]->dynamicParams = $names;
        return $this;
    }
    /**
     * Adds dependencies to the list.
     * @param  array  $deps  of ReflectionClass|\ReflectionFunctionAbstract|string
     * @return static
     */
    public function addDependencies(array $deps)
    {
        $this->dependencies->add(\array_filter($deps));
        return $this;
    }
    /**
     * Exports dependencies.
     */
    public function exportDependencies() : array
    {
        return $this->dependencies->export();
    }
    /**
     * @return static
     */
    public function addExportedTag(string $tag)
    {
        if (isset($this->extensions[self::DI])) {
            $this->extensions[self::DI]->exportedTags[$tag] = \true;
        }
        return $this;
    }
    /**
     * @return static
     */
    public function addExportedType(string $type)
    {
        if (isset($this->extensions[self::DI])) {
            $this->extensions[self::DI]->exportedTypes[$type] = \true;
        }
        return $this;
    }
    public function compile() : string
    {
        $this->processExtensions();
        return $this->generateCode();
    }
    /** @internal */
    public function processExtensions() : void
    {
        $first = $this->getExtensions(\_HumbugBoxb94336daae36\Nette\DI\Extensions\ParametersExtension::class) + $this->getExtensions(\_HumbugBoxb94336daae36\Nette\DI\Extensions\ExtensionsExtension::class);
        foreach ($first as $name => $extension) {
            $config = $this->processSchema($extension->getConfigSchema(), $this->configs[$name] ?? [], $name);
            $extension->setConfig($this->config[$name] = $config);
            $extension->loadConfiguration();
        }
        $last = $this->getExtensions(\_HumbugBoxb94336daae36\Nette\DI\Extensions\InjectExtension::class);
        $this->extensions = \array_merge(\array_diff_key($this->extensions, $last), $last);
        $extensions = \array_diff_key($this->extensions, $first, [self::SERVICES => 1]);
        foreach ($extensions as $name => $extension) {
            $config = $this->processSchema($extension->getConfigSchema(), $this->configs[$name] ?? [], $name);
            $extension->setConfig($this->config[$name] = $config);
        }
        foreach ($extensions as $extension) {
            $extension->loadConfiguration();
        }
        foreach ($this->getExtensions(\_HumbugBoxb94336daae36\Nette\DI\Extensions\ServicesExtension::class) as $name => $extension) {
            $config = $this->processSchema($extension->getConfigSchema(), $this->configs[$name] ?? [], $name);
            $extension->setConfig($this->config[$name] = $config);
            $extension->loadConfiguration();
        }
        if ($extra = \array_diff_key($this->extensions, $extensions, $first, [self::SERVICES => 1])) {
            $extra = \implode("', '", \array_keys($extra));
            throw new \_HumbugBoxb94336daae36\Nette\DeprecatedException("Extensions '{$extra}' were added while container was being compiled.");
        } elseif ($extra = \key(\array_diff_key($this->configs, $this->extensions))) {
            $hint = \_HumbugBoxb94336daae36\Nette\Utils\ObjectHelpers::getSuggestion(\array_keys($this->extensions), $extra);
            throw new \_HumbugBoxb94336daae36\Nette\DI\InvalidConfigurationException("Found section '{$extra}' in configuration, but corresponding extension is missing" . ($hint ? ", did you mean '{$hint}'?" : '.'));
        }
    }
    /**
     * Merges and validates configurations against scheme.
     * @return array|object
     */
    private function processSchema(\_HumbugBoxb94336daae36\Nette\Schema\Schema $schema, array $configs, $name = null)
    {
        $processor = new \_HumbugBoxb94336daae36\Nette\Schema\Processor();
        $processor->onNewContext[] = function (\_HumbugBoxb94336daae36\Nette\Schema\Context $context) use($name) {
            $context->path = $name ? [$name] : [];
            $context->dynamics =& $this->extensions[self::PARAMETERS]->dynamicValidators;
        };
        try {
            return $processor->processMultiple($schema, $configs);
        } catch (\_HumbugBoxb94336daae36\Nette\Schema\ValidationException $e) {
            throw new \_HumbugBoxb94336daae36\Nette\DI\InvalidConfigurationException($e->getMessage());
        }
    }
    /** @internal */
    public function generateCode() : string
    {
        $this->builder->resolve();
        foreach ($this->extensions as $extension) {
            $extension->beforeCompile();
            $this->dependencies->add([(new \ReflectionClass($extension))->getFileName()]);
        }
        $this->builder->complete();
        $generator = new \_HumbugBoxb94336daae36\Nette\DI\PhpGenerator($this->builder);
        $class = $generator->generate($this->className);
        $class->addMethod('initialize');
        $this->dependencies->add($this->builder->getDependencies());
        foreach ($this->extensions as $extension) {
            $extension->afterCompile($class);
        }
        return $this->sources . "\n" . $generator->toString($class);
    }
    /**
     * Loads list of service definitions from configuration.
     */
    public function loadDefinitionsFromConfig(array $configList) : void
    {
        $extension = $this->extensions[self::SERVICES];
        $extension->loadDefinitions($this->processSchema($extension->getConfigSchema(), [$configList]));
    }
    /**
     * @deprecated use non-static Compiler::loadDefinitionsFromConfig()
     */
    public static function loadDefinitions() : void
    {
        throw new \_HumbugBoxb94336daae36\Nette\DeprecatedException(__METHOD__ . '() is deprecated, use non-static Compiler::loadDefinitionsFromConfig(array $configList).');
    }
    /**
     * @deprecated use non-static Compiler::loadDefinitionsFromConfig()
     */
    public static function loadDefinition() : void
    {
        throw new \_HumbugBoxb94336daae36\Nette\DeprecatedException(__METHOD__ . '() is deprecated, use non-static Compiler::loadDefinitionsFromConfig(array $configList).');
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Bridges\DITracy;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\DI\Container;
use _HumbugBoxb94336daae36\Tracy;
/**
 * Dependency injection container panel for Debugger Bar.
 */
class ContainerPanel implements \_HumbugBoxb94336daae36\Tracy\IBarPanel
{
    use Nette\SmartObject;
    /** @var int */
    public static $compilationTime;
    /** @var Nette\DI\Container */
    private $container;
    /** @var int|null */
    private $elapsedTime;
    public function __construct(\_HumbugBoxb94336daae36\Nette\DI\Container $container)
    {
        $this->container = $container;
        $this->elapsedTime = self::$compilationTime ? \microtime(\true) - self::$compilationTime : null;
    }
    /**
     * Renders tab.
     */
    public function getTab() : string
    {
        \ob_start(function () {
        });
        $elapsedTime = $this->elapsedTime;
        require __DIR__ . '/templates/ContainerPanel.tab.phtml';
        return \ob_get_clean();
    }
    /**
     * Renders panel.
     */
    public function getPanel() : string
    {
        $container = $this->container;
        $rc = new \ReflectionClass($container);
        $file = $rc->getFileName();
        $tags = [];
        $instances = $this->getContainerProperty('instances');
        $wiring = $this->getContainerProperty('wiring');
        $types = [];
        foreach ($rc->getMethods() as $method) {
            if (\preg_match('#^createService(.+)#', $method->getName(), $m) && $method->getReturnType()) {
                $types[\lcfirst(\str_replace('__', '.', $m[1]))] = (string) $method->getReturnType();
            }
        }
        $types = $this->getContainerProperty('types') + $types;
        \ksort($types);
        foreach ($this->getContainerProperty('tags') as $tag => $tmp) {
            foreach ($tmp as $service => $val) {
                $tags[$service][$tag] = $val;
            }
        }
        \ob_start(function () {
        });
        require __DIR__ . '/templates/ContainerPanel.panel.phtml';
        return \ob_get_clean();
    }
    private function getContainerProperty(string $name)
    {
        $prop = (new \ReflectionClass(\_HumbugBoxb94336daae36\Nette\DI\Container::class))->getProperty($name);
        $prop->setAccessible(\true);
        return $prop->getValue($this->container);
    }
}
<?php
declare(strict_types=1);

namespace Nette\Bridges\DITracy;


?>
<span title="Dependency Injection Container">
<svg viewBox="0 0 2048 2048"><path fill="#ae7c21" d="m1675 690.55v-125c0-36-4-60-13-71-9-12-26-18-52-18s-43 6-52 17c-8 11-12 36-12 72v910.62c0 37 4 61 12 72 9 11 26 17 52 17s44-6 52-17c9-12 13-36 13-72v-207h243v165c0 86-4 148-12 187-8 38-21 70-39 96-20 28-45 48-77 59-31 11-87 16-170 16-96 0-161-5-196-16-34-11-63-31-86-59-21-26-36-59-45-97-9-39-14-101-14-186v-826.62c0-85 4-147 13-185s25-71 46-97c23-29 54-49 92-60s102-17 189-17c75 0 130 6 164 17s61 30 81 59c19 26 33 59 41 99 8 39 12 101 12 185v84zm-524 1086.6h-254v-1514.6h254zm-1025 0v-1514.6h316c127 0 212 27 257 81 44 53 66 159 66 316v721.62c0 157-22 263-66 317-44 53-130 80-257 80zm388-314v-884.62c0-35-4-58-13-70-9-11-26-17-53-17h-66v1058.6h66c26 0 44-6 53-17 9-12 14-35 14-70z"/>
</svg><span class="tracy-label"><?= $elapsedTime ? sprintf('%0.1f ms', $elapsedTime * 1000) : '' ?></span>
</span>
<?php
declare(strict_types=1);

namespace Nette\Bridges\DITracy;

use Nette;
use Tracy\Dumper;
use Tracy\Helpers;

?>
<style class="tracy-debug">
	#tracy-debug .nette-ContainerPanel table {
		width: 100%;
		white-space: nowrap;
	}

	#tracy-debug .nette-ContainerPanel .created {
		font-weight: bold;
	}

	#tracy-debug .nette-ContainerPanel .yes {
		color: green;
		font-weight: bold;
	}

	#tracy-debug .nette-ContainerPanel table pre {
		display: inline;
		background: transparent;
	}
</style>

<h1><?= get_class($container) ?></h1>

<div class="tracy-inner nette-ContainerPanel">
<div class="tracy-inner-container">
	<h2>Services</h2>

	<table class="tracy-sortable">
		<thead>
		<tr>
			<th>Name</th>
			<th>Autowired</th>
			<th>Service</th>
			<th>Tags</th>
		</tr>
		</thead>
		<tbody>
		<?php foreach ($types as $name => $type): ?>
		<?php $name = (string) $name ?>
		<?php $autowired = in_array($name, array_merge($wiring[$type][0] ?? [], $wiring[$type][1] ?? []), true) ?>
		<tr>
			<td class="<?= isset($instances[$name]) ? 'created' : '' ?>"><?= is_numeric($name) ? "<span title='$name'>–</span>" : Helpers::escapeHtml($name) ?></td>
			<td class="<?= $autowired ? 'yes' : '' ?>"><?= $autowired ? 'yes' : (isset($wiring[$type]) ? 'no' : '?') ?></td>
			<td>
				<?php if (isset($instances[$name]) && !$instances[$name] instanceof Nette\DI\Container): ?>
					<?= Dumper::toHtml($instances[$name], [Dumper::COLLAPSE => true, Dumper::LIVE => true]); ?>
				<?php elseif (isset($instances[$name])): ?>
					<code><?= get_class($instances[$name]) ?></code>
				<?php elseif (is_string($type)): ?>
					<code><?= Helpers::escapeHtml($type) ?></code>
				<?php endif ?>
			</td>
			<td><?php if (isset($tags[$name])) {
				echo count($tags[$name]) === 1
					? Helpers::escapeHtml(key($tags[$name])) . ' = ' . Dumper::toHtml(current($tags[$name]), [Dumper::COLLAPSE => true])
					: Dumper::toHtml($tags[$name], [Dumper::COLLAPSE => true]);
			} ?></td>
		</tr>
		<?php endforeach ?>
		</tbody>
	</table>

	<h2>Parameters</h2>

	<div class="nette-ContainerPanel-parameters">
		<?= Dumper::toHtml($container->parameters); ?>
	</div>

	<p>Source: <?= Helpers::editorLink($file) ?></p>
</div>
</div>
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36;

\class_alias(\_HumbugBoxb94336daae36\Nette\DI\Config\Adapter::class, \_HumbugBoxb94336daae36\Nette\DI\Config\IAdapter::class);
\class_alias(\_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement::class, \_HumbugBoxb94336daae36\Nette\DI\Statement::class);
\class_alias(\_HumbugBoxb94336daae36\Nette\DI\Definitions\ServiceDefinition::class, \_HumbugBoxb94336daae36\Nette\DI\ServiceDefinition::class);
Licenses
========

Good news! You may use Nette Framework under the terms of either
the New BSD License or the GNU General Public License (GPL) version 2 or 3.

The BSD License is recommended for most projects. It is easy to understand and it
places almost no restrictions on what you can do with the framework. If the GPL
fits better to your project, you can use the framework under this license.

You don't have to notify anyone which license you are using. You can freely
use Nette Framework in commercial projects as long as the copyright header
remains intact.

Please be advised that the name "Nette Framework" is a protected trademark and its
usage has some limitations. So please do not use word "Nette" in the name of your
project or top-level domain, and choose a name that stands on its own merits.
If your stuff is good, it will not take long to establish a reputation for yourselves.


New BSD License
---------------

Copyright (c) 2004, 2014 David Grudl (https://davidgrudl.com)
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 "Nette Framework" 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 owner 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.


GNU General Public License
--------------------------

GPL licenses are very very long, so instead of including them here we offer
you URLs with full text:

- [GPL version 2](http://www.gnu.org/licenses/gpl-2.0.html)
- [GPL version 3](http://www.gnu.org/licenses/gpl-3.0.html)
{
    "name": "nette\/bootstrap",
    "description": "\ud83c\udd71 Nette Bootstrap: the simple way to configure and bootstrap your Nette application.",
    "keywords": [
        "nette",
        "configurator",
        "bootstrapping"
    ],
    "homepage": "https:\/\/nette.org",
    "license": [
        "BSD-3-Clause",
        "GPL-2.0",
        "GPL-3.0"
    ],
    "authors": [
        {
            "name": "David Grudl",
            "homepage": "https:\/\/davidgrudl.com"
        },
        {
            "name": "Nette Community",
            "homepage": "https:\/\/nette.org\/contributors"
        }
    ],
    "require": {
        "php": ">=7.1",
        "nette\/di": "^3.0",
        "nette\/utils": "^3.0"
    },
    "suggest": {
        "nette\/robot-loader": "to use Configurator::createRobotLoader()",
        "tracy\/tracy": "to use Configurator::enableTracy()"
    },
    "require-dev": {
        "nette\/application": "^3.0",
        "nette\/caching": "^3.0",
        "nette\/database": "^3.0",
        "nette\/forms": "^3.0",
        "nette\/http": "^3.0",
        "nette\/mail": "^3.0",
        "nette\/robot-loader": "^3.0",
        "nette\/safe-stream": "^2.2",
        "nette\/security": "^3.0",
        "nette\/tester": "^2.0",
        "latte\/latte": "^2.2",
        "tracy\/tracy": "^2.6"
    },
    "autoload": {
        "classmap": [
            "src\/"
        ]
    },
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "3.0-dev"
        }
    }
}<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette;

use _HumbugBoxb94336daae36\Composer\Autoload\ClassLoader;
use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\DI;
use _HumbugBoxb94336daae36\Tracy;
/**
 * Initial system DI container generator.
 */
class Configurator
{
    use SmartObject;
    public const COOKIE_SECRET = 'nette-debug';
    /** @var callable[]  function (Configurator $sender, DI\Compiler $compiler); Occurs after the compiler is created */
    public $onCompile;
    /** @var array */
    public $defaultExtensions = ['application' => [\_HumbugBoxb94336daae36\Nette\Bridges\ApplicationDI\ApplicationExtension::class, ['%debugMode%', ['%appDir%'], '%tempDir%/cache/nette.application']], 'cache' => [\_HumbugBoxb94336daae36\Nette\Bridges\CacheDI\CacheExtension::class, ['%tempDir%']], 'constants' => \_HumbugBoxb94336daae36\Nette\DI\Extensions\ConstantsExtension::class, 'database' => [\_HumbugBoxb94336daae36\Nette\Bridges\DatabaseDI\DatabaseExtension::class, ['%debugMode%']], 'decorator' => \_HumbugBoxb94336daae36\Nette\DI\Extensions\DecoratorExtension::class, 'di' => [\_HumbugBoxb94336daae36\Nette\DI\Extensions\DIExtension::class, ['%debugMode%']], 'extensions' => \_HumbugBoxb94336daae36\Nette\DI\Extensions\ExtensionsExtension::class, 'forms' => \_HumbugBoxb94336daae36\Nette\Bridges\FormsDI\FormsExtension::class, 'http' => [\_HumbugBoxb94336daae36\Nette\Bridges\HttpDI\HttpExtension::class, ['%consoleMode%']], 'inject' => \_HumbugBoxb94336daae36\Nette\DI\Extensions\InjectExtension::class, 'latte' => [\_HumbugBoxb94336daae36\Nette\Bridges\ApplicationDI\LatteExtension::class, ['%tempDir%/cache/latte', '%debugMode%']], 'mail' => \_HumbugBoxb94336daae36\Nette\Bridges\MailDI\MailExtension::class, 'php' => \_HumbugBoxb94336daae36\Nette\DI\Extensions\PhpExtension::class, 'routing' => [\_HumbugBoxb94336daae36\Nette\Bridges\ApplicationDI\RoutingExtension::class, ['%debugMode%']], 'search' => [\_HumbugBoxb94336daae36\Nette\DI\Extensions\SearchExtension::class, ['%tempDir%/cache/nette.search']], 'security' => [\_HumbugBoxb94336daae36\Nette\Bridges\SecurityDI\SecurityExtension::class, ['%debugMode%']], 'session' => [\_HumbugBoxb94336daae36\Nette\Bridges\HttpDI\SessionExtension::class, ['%debugMode%', '%consoleMode%']], 'tracy' => [\_HumbugBoxb94336daae36\Tracy\Bridges\Nette\TracyExtension::class, ['%debugMode%', '%consoleMode%']]];
    /** @var string[] of classes which shouldn't be autowired */
    public $autowireExcludedClasses = ['ArrayAccess', 'Countable', 'IteratorAggregate', 'stdClass', 'Traversable'];
    /** @var array */
    protected $parameters;
    /** @var array */
    protected $dynamicParameters = [];
    /** @var array */
    protected $services = [];
    /** @var array of string|array */
    protected $configs = [];
    public function __construct()
    {
        $this->parameters = $this->getDefaultParameters();
    }
    /**
     * Set parameter %debugMode%.
     * @param  bool|string|array  $value
     * @return static
     */
    public function setDebugMode($value)
    {
        if (\is_string($value) || \is_array($value)) {
            $value = static::detectDebugMode($value);
        } elseif (!\is_bool($value)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException(\sprintf('Value must be either a string, array, or boolean, %s given.', \gettype($value)));
        }
        $this->parameters['debugMode'] = $value;
        $this->parameters['productionMode'] = !$this->parameters['debugMode'];
        // compatibility
        return $this;
    }
    public function isDebugMode() : bool
    {
        return $this->parameters['debugMode'];
    }
    /**
     * Sets path to temporary directory.
     * @return static
     */
    public function setTempDirectory(string $path)
    {
        $this->parameters['tempDir'] = $path;
        return $this;
    }
    /**
     * Sets the default timezone.
     * @return static
     */
    public function setTimeZone(string $timezone)
    {
        \date_default_timezone_set($timezone);
        @\ini_set('date.timezone', $timezone);
        // @ - function may be disabled
        return $this;
    }
    /**
     * Adds new parameters. The %params% will be expanded.
     * @return static
     */
    public function addParameters(array $params)
    {
        $this->parameters = \_HumbugBoxb94336daae36\Nette\DI\Config\Helpers::merge($params, $this->parameters);
        return $this;
    }
    /**
     * Adds new dynamic parameters.
     * @return static
     */
    public function addDynamicParameters(array $params)
    {
        $this->dynamicParameters = $params + $this->dynamicParameters;
        return $this;
    }
    /**
     * Add instances of services.
     * @return static
     */
    public function addServices(array $services)
    {
        $this->services = $services + $this->services;
        return $this;
    }
    protected function getDefaultParameters() : array
    {
        $trace = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS);
        $last = \end($trace);
        $debugMode = static::detectDebugMode();
        $loaderRc = \class_exists(\_HumbugBoxb94336daae36\Composer\Autoload\ClassLoader::class) ? new \ReflectionClass(\_HumbugBoxb94336daae36\Composer\Autoload\ClassLoader::class) : null;
        return ['appDir' => isset($trace[1]['file']) ? \dirname($trace[1]['file']) : null, 'wwwDir' => isset($last['file']) ? \dirname($last['file']) : null, 'vendorDir' => $loaderRc ? \dirname(\dirname($loaderRc->getFileName())) : null, 'debugMode' => $debugMode, 'productionMode' => !$debugMode, 'consoleMode' => \PHP_SAPI === 'cli'];
    }
    public function enableTracy(string $logDirectory = null, string $email = null) : void
    {
        \_HumbugBoxb94336daae36\Tracy\Debugger::$strictMode = \true;
        \_HumbugBoxb94336daae36\Tracy\Debugger::enable(!$this->parameters['debugMode'], $logDirectory, $email);
        \_HumbugBoxb94336daae36\Tracy\Bridges\Nette\Bridge::initialize();
    }
    /**
     * Alias for enableTracy()
     */
    public function enableDebugger(string $logDirectory = null, string $email = null) : void
    {
        $this->enableTracy($logDirectory, $email);
    }
    /**
     * @throws Nette\NotSupportedException if RobotLoader is not available
     */
    public function createRobotLoader() : \_HumbugBoxb94336daae36\Nette\Loaders\RobotLoader
    {
        if (!\class_exists(\_HumbugBoxb94336daae36\Nette\Loaders\RobotLoader::class)) {
            throw new \_HumbugBoxb94336daae36\Nette\NotSupportedException('RobotLoader not found, do you have `nette/robot-loader` package installed?');
        }
        $loader = new \_HumbugBoxb94336daae36\Nette\Loaders\RobotLoader();
        $loader->setTempDirectory($this->getCacheDirectory() . '/nette.robotLoader');
        $loader->setAutoRefresh($this->parameters['debugMode']);
        return $loader;
    }
    /**
     * Adds configuration file.
     * @param  string|array  $config
     * @return static
     */
    public function addConfig($config)
    {
        $this->configs[] = $config;
        return $this;
    }
    /**
     * Returns system DI container.
     */
    public function createContainer() : \_HumbugBoxb94336daae36\Nette\DI\Container
    {
        $class = $this->loadContainer();
        $container = new $class($this->dynamicParameters);
        foreach ($this->services as $name => $service) {
            $container->addService($name, $service);
        }
        $container->initialize();
        return $container;
    }
    /**
     * Loads system DI container class and returns its name.
     */
    public function loadContainer() : string
    {
        $loader = new \_HumbugBoxb94336daae36\Nette\DI\ContainerLoader($this->getCacheDirectory() . '/nette.configurator', $this->parameters['debugMode']);
        $class = $loader->load([$this, 'generateContainer'], [$this->parameters, \array_keys($this->dynamicParameters), $this->configs, \PHP_VERSION_ID - \PHP_RELEASE_VERSION]);
        return $class;
    }
    /**
     * @internal
     */
    public function generateContainer(\_HumbugBoxb94336daae36\Nette\DI\Compiler $compiler) : void
    {
        $loader = $this->createLoader();
        $loader->setParameters($this->parameters);
        foreach ($this->configs as $config) {
            if (\is_string($config)) {
                $compiler->loadConfig($config, $loader);
            } else {
                $compiler->addConfig($config);
            }
        }
        $compiler->addConfig(['parameters' => $this->parameters]);
        $compiler->setDynamicParameterNames(\array_keys($this->dynamicParameters));
        $builder = $compiler->getContainerBuilder();
        $builder->addExcludedClasses($this->autowireExcludedClasses);
        foreach ($this->defaultExtensions as $name => $extension) {
            [$class, $args] = \is_string($extension) ? [$extension, []] : $extension;
            if (\class_exists($class)) {
                $args = \_HumbugBoxb94336daae36\Nette\DI\Helpers::expand($args, $this->parameters, \true);
                $compiler->addExtension($name, (new \ReflectionClass($class))->newInstanceArgs($args));
            }
        }
        $this->onCompile($this, $compiler);
    }
    protected function createLoader() : \_HumbugBoxb94336daae36\Nette\DI\Config\Loader
    {
        return new \_HumbugBoxb94336daae36\Nette\DI\Config\Loader();
    }
    protected function getCacheDirectory() : string
    {
        if (empty($this->parameters['tempDir'])) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException('Set path to temporary directory using setTempDirectory().');
        }
        $dir = $this->parameters['tempDir'] . '/cache';
        \_HumbugBoxb94336daae36\Nette\Utils\FileSystem::createDir($dir);
        return $dir;
    }
    /********************* tools ****************d*g**/
    /**
     * Detects debug mode by IP addresses or computer names whitelist detection.
     * @param  string|array  $list
     */
    public static function detectDebugMode($list = null) : bool
    {
        $addr = $_SERVER['REMOTE_ADDR'] ?? \php_uname('n');
        $secret = \is_string($_COOKIE[self::COOKIE_SECRET] ?? null) ? $_COOKIE[self::COOKIE_SECRET] : null;
        $list = \is_string($list) ? \preg_split('#[,\\s]+#', $list) : (array) $list;
        if (!isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !isset($_SERVER['HTTP_FORWARDED'])) {
            $list[] = '127.0.0.1';
            $list[] = '::1';
        }
        return \in_array($addr, $list, \true) || \in_array("{$secret}@{$addr}", $list, \true);
    }
}
Licenses
========

Good news! You may use Nette Framework under the terms of either
the New BSD License or the GNU General Public License (GPL) version 2 or 3.

The BSD License is recommended for most projects. It is easy to understand and it
places almost no restrictions on what you can do with the framework. If the GPL
fits better to your project, you can use the framework under this license.

You don't have to notify anyone which license you are using. You can freely
use Nette Framework in commercial projects as long as the copyright header
remains intact.

Please be advised that the name "Nette Framework" is a protected trademark and its
usage has some limitations. So please do not use word "Nette" in the name of your
project or top-level domain, and choose a name that stands on its own merits.
If your stuff is good, it will not take long to establish a reputation for yourselves.


New BSD License
---------------

Copyright (c) 2004, 2014 David Grudl (https://davidgrudl.com)
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 "Nette Framework" 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 owner 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.


GNU General Public License
--------------------------

GPL licenses are very very long, so instead of including them here we offer
you URLs with full text:

- [GPL version 2](http://www.gnu.org/licenses/gpl-2.0.html)
- [GPL version 3](http://www.gnu.org/licenses/gpl-3.0.html)
{
    "name": "nette\/php-generator",
    "description": "\ud83d\udc18 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 7.3 features.",
    "keywords": [
        "nette",
        "php",
        "code",
        "scaffolding"
    ],
    "homepage": "https:\/\/nette.org",
    "license": [
        "BSD-3-Clause",
        "GPL-2.0",
        "GPL-3.0"
    ],
    "authors": [
        {
            "name": "David Grudl",
            "homepage": "https:\/\/davidgrudl.com"
        },
        {
            "name": "Nette Community",
            "homepage": "https:\/\/nette.org\/contributors"
        }
    ],
    "require": {
        "php": ">=7.1",
        "nette\/utils": "^2.4.2 || ~3.0.0"
    },
    "require-dev": {
        "nette\/tester": "^2.0",
        "tracy\/tracy": "^2.3"
    },
    "autoload": {
        "classmap": [
            "src\/"
        ]
    },
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "3.2-dev"
        }
    }
}<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\PhpGenerator;

use _HumbugBoxb94336daae36\Nette;
/**
 * Class constant.
 */
final class Constant
{
    use Nette\SmartObject;
    use Traits\NameAware;
    use Traits\VisibilityAware;
    use Traits\CommentAware;
    /** @var mixed */
    private $value;
    /**
     * @return static
     */
    public function setValue($val) : self
    {
        $this->value = $val;
        return $this;
    }
    public function getValue()
    {
        return $this->value;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\PhpGenerator;

use _HumbugBoxb94336daae36\Nette;
/**
 * Creates a representation based on reflection.
 */
final class Factory
{
    use Nette\SmartObject;
    public function fromClassReflection(\ReflectionClass $from) : \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType
    {
        $class = $from->isAnonymous() ? new \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType() : new \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType($from->getShortName(), new \_HumbugBoxb94336daae36\Nette\PhpGenerator\PhpNamespace($from->getNamespaceName()));
        $class->setType($from->isInterface() ? $class::TYPE_INTERFACE : ($from->isTrait() ? $class::TYPE_TRAIT : $class::TYPE_CLASS));
        $class->setFinal($from->isFinal() && $class->getType() === $class::TYPE_CLASS);
        $class->setAbstract($from->isAbstract() && $class->getType() === $class::TYPE_CLASS);
        $ifaces = $from->getInterfaceNames();
        foreach ($ifaces as $iface) {
            $ifaces = \array_filter($ifaces, function (string $item) use($iface) : bool {
                return !\is_subclass_of($iface, $item);
            });
        }
        $class->setImplements($ifaces);
        $class->setComment(\_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::unformatDocComment((string) $from->getDocComment()));
        if ($from->getParentClass()) {
            $class->setExtends($from->getParentClass()->getName());
            $class->setImplements(\array_diff($class->getImplements(), $from->getParentClass()->getInterfaceNames()));
        }
        $props = $methods = [];
        foreach ($from->getProperties() as $prop) {
            if ($prop->isDefault() && $prop->getDeclaringClass()->getName() === $from->getName()) {
                $props[] = $this->fromPropertyReflection($prop);
            }
        }
        $class->setProperties($props);
        foreach ($from->getMethods() as $method) {
            if ($method->getDeclaringClass()->getName() === $from->getName()) {
                $methods[] = $this->fromMethodReflection($method);
            }
        }
        $class->setMethods($methods);
        $class->setConstants($from->getConstants());
        return $class;
    }
    public function fromMethodReflection(\ReflectionMethod $from) : \_HumbugBoxb94336daae36\Nette\PhpGenerator\Method
    {
        $method = new \_HumbugBoxb94336daae36\Nette\PhpGenerator\Method($from->getName());
        $method->setParameters(\array_map([$this, 'fromParameterReflection'], $from->getParameters()));
        $method->setStatic($from->isStatic());
        $isInterface = $from->getDeclaringClass()->isInterface();
        $method->setVisibility($from->isPrivate() ? \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType::VISIBILITY_PRIVATE : ($from->isProtected() ? \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType::VISIBILITY_PROTECTED : ($isInterface ? null : \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType::VISIBILITY_PUBLIC)));
        $method->setFinal($from->isFinal());
        $method->setAbstract($from->isAbstract() && !$isInterface);
        $method->setBody($from->isAbstract() ? null : '');
        $method->setReturnReference($from->returnsReference());
        $method->setVariadic($from->isVariadic());
        $method->setComment(\_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::unformatDocComment((string) $from->getDocComment()));
        if ($from->hasReturnType()) {
            $method->setReturnType($from->getReturnType()->getName());
            $method->setReturnNullable($from->getReturnType()->allowsNull());
        }
        return $method;
    }
    /**
     * @return GlobalFunction|Closure
     */
    public function fromFunctionReflection(\ReflectionFunction $from)
    {
        $function = $from->isClosure() ? new \_HumbugBoxb94336daae36\Nette\PhpGenerator\Closure() : new \_HumbugBoxb94336daae36\Nette\PhpGenerator\GlobalFunction($from->getName());
        $function->setParameters(\array_map([$this, 'fromParameterReflection'], $from->getParameters()));
        $function->setReturnReference($from->returnsReference());
        $function->setVariadic($from->isVariadic());
        if (!$from->isClosure()) {
            $function->setComment(\_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::unformatDocComment((string) $from->getDocComment()));
        }
        if ($from->hasReturnType()) {
            $function->setReturnType($from->getReturnType()->getName());
            $function->setReturnNullable($from->getReturnType()->allowsNull());
        }
        return $function;
    }
    public function fromParameterReflection(\ReflectionParameter $from) : \_HumbugBoxb94336daae36\Nette\PhpGenerator\Parameter
    {
        $param = new \_HumbugBoxb94336daae36\Nette\PhpGenerator\Parameter($from->getName());
        $param->setReference($from->isPassedByReference());
        $param->setTypeHint($from->hasType() ? $from->getType()->getName() : null);
        $param->setNullable($from->hasType() && $from->getType()->allowsNull());
        if ($from->isDefaultValueAvailable()) {
            $param->setDefaultValue($from->isDefaultValueConstant() ? new \_HumbugBoxb94336daae36\Nette\PhpGenerator\PhpLiteral($from->getDefaultValueConstantName()) : $from->getDefaultValue());
            $param->setNullable($param->isNullable() && $param->getDefaultValue() !== null);
        }
        return $param;
    }
    public function fromPropertyReflection(\ReflectionProperty $from) : \_HumbugBoxb94336daae36\Nette\PhpGenerator\Property
    {
        $prop = new \_HumbugBoxb94336daae36\Nette\PhpGenerator\Property($from->getName());
        $prop->setValue($from->getDeclaringClass()->getDefaultProperties()[$prop->getName()] ?? null);
        $prop->setStatic($from->isStatic());
        $prop->setVisibility($from->isPrivate() ? \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType::VISIBILITY_PRIVATE : ($from->isProtected() ? \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType::VISIBILITY_PROTECTED : \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType::VISIBILITY_PUBLIC));
        $prop->setComment(\_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::unformatDocComment((string) $from->getDocComment()));
        return $prop;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\PhpGenerator;

/**
 * Generates PHP code compatible with PSR-2 and PSR-12.
 */
final class PsrPrinter extends \_HumbugBoxb94336daae36\Nette\PhpGenerator\Printer
{
    /** @var string */
    protected $indentation = '    ';
    /** @var int */
    protected $linesBetweenMethods = 1;
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\PhpGenerator;

/**
 * PHP literal value.
 */
class PhpLiteral
{
    /** @var string */
    private $value;
    public function __construct(string $value)
    {
        $this->value = $value;
    }
    public function __toString() : string
    {
        return $this->value;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\PhpGenerator;

use _HumbugBoxb94336daae36\Nette;
/**
 * Instance of PHP file.
 *
 * Generates:
 * - opening tag (<?php)
 * - doc comments
 * - one or more namespaces
 */
final class PhpFile
{
    use Nette\SmartObject;
    use Traits\CommentAware;
    /** @var PhpNamespace[] */
    private $namespaces = [];
    /** @var bool */
    private $strictTypes = \false;
    public function addClass(string $name) : \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType
    {
        return $this->addNamespace(\_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::extractNamespace($name))->addClass(\_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::extractShortName($name));
    }
    public function addInterface(string $name) : \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType
    {
        return $this->addNamespace(\_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::extractNamespace($name))->addInterface(\_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::extractShortName($name));
    }
    public function addTrait(string $name) : \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType
    {
        return $this->addNamespace(\_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::extractNamespace($name))->addTrait(\_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::extractShortName($name));
    }
    public function addNamespace(string $name) : \_HumbugBoxb94336daae36\Nette\PhpGenerator\PhpNamespace
    {
        if (!isset($this->namespaces[$name])) {
            $this->namespaces[$name] = new \_HumbugBoxb94336daae36\Nette\PhpGenerator\PhpNamespace($name);
            foreach ($this->namespaces as $namespace) {
                $namespace->setBracketedSyntax(\count($this->namespaces) > 1 && isset($this->namespaces['']));
            }
        }
        return $this->namespaces[$name];
    }
    /**
     * @return PhpNamespace[]
     */
    public function getNamespaces() : array
    {
        return $this->namespaces;
    }
    /**
     * @return static
     */
    public function addUse(string $name, string $alias = null) : self
    {
        $this->addNamespace('')->addUse($name, $alias);
        return $this;
    }
    /**
     * Adds declare(strict_types=1) to output.
     * @return static
     */
    public function setStrictTypes(bool $on = \true) : self
    {
        $this->strictTypes = $on;
        return $this;
    }
    public function getStrictTypes() : bool
    {
        return $this->strictTypes;
    }
    public function __toString() : string
    {
        try {
            return (new \_HumbugBoxb94336daae36\Nette\PhpGenerator\Printer())->printFile($this);
        } catch (\Throwable $e) {
            \trigger_error('Exception in ' . __METHOD__ . "(): {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}", \E_USER_ERROR);
        }
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\PhpGenerator;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\InvalidStateException;
use _HumbugBoxb94336daae36\Nette\Utils\Strings;
/**
 * Namespaced part of a PHP file.
 *
 * Generates:
 * - namespace statement
 * - variable amount of use statements
 * - one or more class declarations
 */
final class PhpNamespace
{
    use Nette\SmartObject;
    private const KEYWORDS = ['string' => 1, 'int' => 1, 'float' => 1, 'bool' => 1, 'array' => 1, 'object' => 1, 'callable' => 1, 'iterable' => 1, 'void' => 1, 'self' => 1, 'parent' => 1];
    /** @var string */
    private $name;
    /** @var bool */
    private $bracketedSyntax = \false;
    /** @var string[] */
    private $uses = [];
    /** @var ClassType[] */
    private $classes = [];
    public function __construct(string $name)
    {
        if ($name !== '' && !\_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::isNamespaceIdentifier($name)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Value '{$name}' is not valid name.");
        }
        $this->name = $name;
    }
    public function getName() : string
    {
        return $this->name;
    }
    /**
     * @return static
     * @internal
     */
    public function setBracketedSyntax(bool $state = \true) : self
    {
        $this->bracketedSyntax = $state;
        return $this;
    }
    public function getBracketedSyntax() : bool
    {
        return $this->bracketedSyntax;
    }
    /**
     * @throws InvalidStateException
     * @return static
     */
    public function addUse(string $name, string $alias = null, string &$aliasOut = null) : self
    {
        $name = \ltrim($name, '\\');
        if ($alias === null && $this->name === \_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::extractNamespace($name)) {
            $alias = \_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::extractShortName($name);
        }
        if ($alias === null) {
            $path = \explode('\\', $name);
            $counter = null;
            do {
                if (empty($path)) {
                    $counter++;
                } else {
                    $alias = \array_pop($path) . $alias;
                }
            } while (isset($this->uses[$alias . $counter]) && $this->uses[$alias . $counter] !== $name);
            $alias .= $counter;
        } elseif (isset($this->uses[$alias]) && $this->uses[$alias] !== $name) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException("Alias '{$alias}' used already for '{$this->uses[$alias]}', cannot use for '{$name}'.");
        }
        $aliasOut = $alias;
        $this->uses[$alias] = $name;
        \asort($this->uses);
        return $this;
    }
    /**
     * @return string[]
     */
    public function getUses() : array
    {
        return $this->uses;
    }
    public function unresolveName(string $name) : string
    {
        if (isset(self::KEYWORDS[\strtolower($name)]) || $name === '') {
            return $name;
        }
        $name = \ltrim($name, '\\');
        $res = null;
        $lower = \strtolower($name);
        foreach ($this->uses as $alias => $original) {
            if (\_HumbugBoxb94336daae36\Nette\Utils\Strings::startsWith($lower . '\\', \strtolower($original) . '\\')) {
                $short = $alias . \substr($name, \strlen($original));
                if (!isset($res) || \strlen($res) > \strlen($short)) {
                    $res = $short;
                }
            }
        }
        if (!$res && \_HumbugBoxb94336daae36\Nette\Utils\Strings::startsWith($lower, \strtolower($this->name) . '\\')) {
            return \substr($name, \strlen($this->name) + 1);
        } else {
            return $res ?: ($this->name ? '\\' : '') . $name;
        }
    }
    /**
     * @return static
     */
    public function add(\_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType $class) : self
    {
        $name = $class->getName();
        if ($name === null) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Class does not have a name.');
        }
        $this->addUse($this->name . '\\' . $name);
        $this->classes[$name] = $class;
        return $this;
    }
    public function addClass(string $name) : \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType
    {
        $this->add($class = new \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType($name, $this));
        return $class;
    }
    public function addInterface(string $name) : \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType
    {
        return $this->addClass($name)->setType(\_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType::TYPE_INTERFACE);
    }
    public function addTrait(string $name) : \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType
    {
        return $this->addClass($name)->setType(\_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType::TYPE_TRAIT);
    }
    /**
     * @return ClassType[]
     */
    public function getClasses() : array
    {
        return $this->classes;
    }
    public function __toString() : string
    {
        try {
            return (new \_HumbugBoxb94336daae36\Nette\PhpGenerator\Printer())->printNamespace($this);
        } catch (\Throwable $e) {
            \trigger_error('Exception in ' . __METHOD__ . "(): {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}", \E_USER_ERROR);
        }
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\PhpGenerator\Traits;

/**
 * @internal
 */
trait CommentAware
{
    /** @var string|null */
    private $comment;
    /**
     * @return static
     */
    public function setComment(?string $val) : self
    {
        $this->comment = $val;
        return $this;
    }
    public function getComment() : ?string
    {
        return $this->comment;
    }
    /**
     * @return static
     */
    public function addComment(string $val) : self
    {
        $this->comment .= $this->comment ? "\n{$val}" : $val;
        return $this;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\PhpGenerator\Traits;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType;
/**
 * @internal
 */
trait VisibilityAware
{
    /** @var string|null  public|protected|private */
    private $visibility;
    /**
     * @param  string|null  $val  public|protected|private
     * @return static
     */
    public function setVisibility(?string $val) : self
    {
        if (!\in_array($val, [\_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType::VISIBILITY_PUBLIC, \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType::VISIBILITY_PROTECTED, \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType::VISIBILITY_PRIVATE, null], \true)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Argument must be public|protected|private.');
        }
        $this->visibility = $val;
        return $this;
    }
    public function getVisibility() : ?string
    {
        return $this->visibility;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\PhpGenerator\Traits;

use _HumbugBoxb94336daae36\Nette;
/**
 * @internal
 */
trait NameAware
{
    /** @var string */
    private $name;
    public function __construct(string $name)
    {
        if (!\_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::isIdentifier($name)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Value '{$name}' is not valid name.");
        }
        $this->name = $name;
    }
    public function getName() : string
    {
        return $this->name;
    }
    /**
     * Returns clone with a different name.
     * @return static
     */
    public function cloneWithName(string $name) : self
    {
        $dolly = clone $this;
        $dolly->__construct($name);
        return $dolly;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\PhpGenerator\Traits;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers;
use _HumbugBoxb94336daae36\Nette\PhpGenerator\Parameter;
/**
 * @internal
 */
trait FunctionLike
{
    /** @var string */
    private $body = '';
    /** @var array of name => Parameter */
    private $parameters = [];
    /** @var bool */
    private $variadic = \false;
    /** @var string|null */
    private $returnType;
    /** @var bool */
    private $returnReference = \false;
    /** @var bool */
    private $returnNullable = \false;
    /**
     * @return static
     */
    public function setBody(string $code, array $args = null) : self
    {
        $this->body = $args === null ? $code : \_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::format($code, ...$args);
        return $this;
    }
    public function getBody() : string
    {
        return $this->body;
    }
    /**
     * @return static
     */
    public function addBody(string $code, array $args = null) : self
    {
        $this->body .= ($args === null ? $code : \_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::format($code, ...$args)) . "\n";
        return $this;
    }
    /**
     * @param  Parameter[]  $val
     * @return static
     */
    public function setParameters(array $val) : self
    {
        $this->parameters = [];
        foreach ($val as $v) {
            if (!$v instanceof \_HumbugBoxb94336daae36\Nette\PhpGenerator\Parameter) {
                throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Argument must be Nette\\PhpGenerator\\Parameter[].');
            }
            $this->parameters[$v->getName()] = $v;
        }
        return $this;
    }
    /**
     * @return Parameter[]
     */
    public function getParameters() : array
    {
        return $this->parameters;
    }
    /**
     * @param  string  $name without $
     */
    public function addParameter(string $name, $defaultValue = null) : \_HumbugBoxb94336daae36\Nette\PhpGenerator\Parameter
    {
        $param = new \_HumbugBoxb94336daae36\Nette\PhpGenerator\Parameter($name);
        if (\func_num_args() > 1) {
            $param->setDefaultValue($defaultValue);
        }
        return $this->parameters[$name] = $param;
    }
    /**
     * @param  string  $name without $
     * @return static
     */
    public function removeParameter(string $name) : self
    {
        unset($this->parameters[$name]);
        return $this;
    }
    /**
     * @return static
     */
    public function setVariadic(bool $state = \true) : self
    {
        $this->variadic = $state;
        return $this;
    }
    public function isVariadic() : bool
    {
        return $this->variadic;
    }
    /**
     * @return static
     */
    public function setReturnType(?string $val) : self
    {
        $this->returnType = $val;
        return $this;
    }
    public function getReturnType() : ?string
    {
        return $this->returnType;
    }
    /**
     * @return static
     */
    public function setReturnReference(bool $state = \true) : self
    {
        $this->returnReference = $state;
        return $this;
    }
    public function getReturnReference() : bool
    {
        return $this->returnReference;
    }
    /**
     * @return static
     */
    public function setReturnNullable(bool $state = \true) : self
    {
        $this->returnNullable = $state;
        return $this;
    }
    public function getReturnNullable() : bool
    {
        return $this->returnNullable;
    }
    /**
     * @deprecated
     */
    public function setNamespace(\_HumbugBoxb94336daae36\Nette\PhpGenerator\Traits\PhpNamespace $val = null) : self
    {
        \trigger_error(__METHOD__ . '() is deprecated', \E_USER_DEPRECATED);
        return $this;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\PhpGenerator;

use _HumbugBoxb94336daae36\Nette;
/**
 * Closure.
 *
 * @property string $body
 */
final class Closure
{
    use Nette\SmartObject;
    use Traits\FunctionLike;
    /** @var Parameter[] */
    private $uses = [];
    /**
     * @return static
     */
    public static function from(\Closure $closure) : self
    {
        return (new \_HumbugBoxb94336daae36\Nette\PhpGenerator\Factory())->fromFunctionReflection(new \ReflectionFunction($closure));
    }
    public function __toString() : string
    {
        try {
            return (new \_HumbugBoxb94336daae36\Nette\PhpGenerator\Printer())->printClosure($this);
        } catch (\Throwable $e) {
            \trigger_error('Exception in ' . __METHOD__ . "(): {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}", \E_USER_ERROR);
        }
    }
    /**
     * @param  Parameter[]  $uses
     * @return static
     */
    public function setUses(array $uses) : self
    {
        (function (\_HumbugBoxb94336daae36\Nette\PhpGenerator\Parameter ...$uses) {
        })(...$uses);
        $this->uses = $uses;
        return $this;
    }
    public function getUses() : array
    {
        return $this->uses;
    }
    public function addUse(string $name) : \_HumbugBoxb94336daae36\Nette\PhpGenerator\Parameter
    {
        return $this->uses[] = new \_HumbugBoxb94336daae36\Nette\PhpGenerator\Parameter($name);
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\PhpGenerator;

use _HumbugBoxb94336daae36\Nette;
/**
 * Class method.
 *
 * @property string|null $body
 */
final class Method
{
    use Nette\SmartObject;
    use Traits\FunctionLike;
    use Traits\NameAware;
    use Traits\VisibilityAware;
    use Traits\CommentAware;
    /** @var string|null */
    private $body = '';
    /** @var bool */
    private $static = \false;
    /** @var bool */
    private $final = \false;
    /** @var bool */
    private $abstract = \false;
    /**
     * @param  string|array  $method
     * @return static
     */
    public static function from($method) : self
    {
        return (new \_HumbugBoxb94336daae36\Nette\PhpGenerator\Factory())->fromMethodReflection(\_HumbugBoxb94336daae36\Nette\Utils\Callback::toReflection($method));
    }
    public function __toString() : string
    {
        try {
            return (new \_HumbugBoxb94336daae36\Nette\PhpGenerator\Printer())->printMethod($this);
        } catch (\Throwable $e) {
            \trigger_error('Exception in ' . __METHOD__ . "(): {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}", \E_USER_ERROR);
        }
    }
    /**
     * @return static
     */
    public function setBody(?string $code, array $args = null) : self
    {
        $this->body = $args === null || $code === null ? $code : \_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::format($code, ...$args);
        return $this;
    }
    public function getBody() : ?string
    {
        return $this->body;
    }
    /**
     * @return static
     */
    public function setStatic(bool $state = \true) : self
    {
        $this->static = $state;
        return $this;
    }
    public function isStatic() : bool
    {
        return $this->static;
    }
    /**
     * @return static
     */
    public function setFinal(bool $state = \true) : self
    {
        $this->final = $state;
        return $this;
    }
    public function isFinal() : bool
    {
        return $this->final;
    }
    /**
     * @return static
     */
    public function setAbstract(bool $state = \true) : self
    {
        $this->abstract = $state;
        return $this;
    }
    public function isAbstract() : bool
    {
        return $this->abstract;
    }
    /**
     * @throws Nette\InvalidStateException
     */
    public function validate() : void
    {
        if ($this->abstract && ($this->final || $this->visibility === \_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType::VISIBILITY_PRIVATE)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException('Method cannot be abstract and final or private.');
        }
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\PhpGenerator;

use _HumbugBoxb94336daae36\Nette;
/**
 * Class/Interface/Trait description.
 *
 * @property Method[] $methods
 * @property Property[] $properties
 */
final class ClassType
{
    use Nette\SmartObject;
    use Traits\CommentAware;
    public const TYPE_CLASS = 'class', TYPE_INTERFACE = 'interface', TYPE_TRAIT = 'trait';
    public const VISIBILITY_PUBLIC = 'public', VISIBILITY_PROTECTED = 'protected', VISIBILITY_PRIVATE = 'private';
    /** @var PhpNamespace|null */
    private $namespace;
    /** @var string|null */
    private $name;
    /** @var string  class|interface|trait */
    private $type = self::TYPE_CLASS;
    /** @var bool */
    private $final = \false;
    /** @var bool */
    private $abstract = \false;
    /** @var string|string[] */
    private $extends = [];
    /** @var string[] */
    private $implements = [];
    /** @var array[] */
    private $traits = [];
    /** @var Constant[] name => Constant */
    private $consts = [];
    /** @var Property[] name => Property */
    private $properties = [];
    /** @var Method[] name => Method */
    private $methods = [];
    /**
     * @param  string|object  $class
     * @return static
     */
    public static function from($class) : self
    {
        return (new \_HumbugBoxb94336daae36\Nette\PhpGenerator\Factory())->fromClassReflection(new \ReflectionClass($class));
    }
    public function __construct(string $name = null, \_HumbugBoxb94336daae36\Nette\PhpGenerator\PhpNamespace $namespace = null)
    {
        $this->setName($name);
        $this->namespace = $namespace;
    }
    public function __toString() : string
    {
        try {
            return (new \_HumbugBoxb94336daae36\Nette\PhpGenerator\Printer())->printClass($this, $this->namespace);
        } catch (\Throwable $e) {
            \trigger_error('Exception in ' . __METHOD__ . "(): {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}", \E_USER_ERROR);
        }
    }
    /**
     * Deprecated: an object can be in multiple namespaces.
     * @deprecated
     */
    public function getNamespace() : ?\_HumbugBoxb94336daae36\Nette\PhpGenerator\PhpNamespace
    {
        return $this->namespace;
    }
    /**
     * @return static
     */
    public function setName(?string $name) : self
    {
        if ($name !== null && !\_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::isIdentifier($name)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Value '{$name}' is not valid class name.");
        }
        $this->name = $name;
        return $this;
    }
    public function getName() : ?string
    {
        return $this->name;
    }
    /**
     * @return static
     */
    public function setType(string $type) : self
    {
        if (!\in_array($type, [self::TYPE_CLASS, self::TYPE_INTERFACE, self::TYPE_TRAIT], \true)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Argument must be class|interface|trait.');
        }
        $this->type = $type;
        return $this;
    }
    public function getType() : string
    {
        return $this->type;
    }
    /**
     * @return static
     */
    public function setFinal(bool $state = \true) : self
    {
        $this->final = $state;
        return $this;
    }
    public function isFinal() : bool
    {
        return $this->final;
    }
    /**
     * @return static
     */
    public function setAbstract(bool $state = \true) : self
    {
        $this->abstract = $state;
        return $this;
    }
    public function isAbstract() : bool
    {
        return $this->abstract;
    }
    /**
     * @param  string|string[]  $names
     * @return static
     */
    public function setExtends($names) : self
    {
        if (!\is_string($names) && !\is_array($names)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Argument must be string or string[].');
        }
        $this->validateNames((array) $names);
        $this->extends = $names;
        return $this;
    }
    /**
     * @return string|string[]
     */
    public function getExtends()
    {
        return $this->extends;
    }
    /**
     * @return static
     */
    public function addExtend(string $name) : self
    {
        $this->validateNames([$name]);
        $this->extends = (array) $this->extends;
        $this->extends[] = $name;
        return $this;
    }
    /**
     * @param  string[]  $names
     * @return static
     */
    public function setImplements(array $names) : self
    {
        $this->validateNames($names);
        $this->implements = $names;
        return $this;
    }
    /**
     * @return string[]
     */
    public function getImplements() : array
    {
        return $this->implements;
    }
    /**
     * @return static
     */
    public function addImplement(string $name) : self
    {
        $this->validateNames([$name]);
        $this->implements[] = $name;
        return $this;
    }
    /**
     * @param  string[]  $names
     * @return static
     */
    public function setTraits(array $names) : self
    {
        $this->validateNames($names);
        $this->traits = \array_fill_keys($names, []);
        return $this;
    }
    /**
     * @return string[]
     */
    public function getTraits() : array
    {
        return \array_keys($this->traits);
    }
    /**
     * @internal
     */
    public function getTraitResolutions() : array
    {
        return $this->traits;
    }
    /**
     * @return static
     */
    public function addTrait(string $name, array $resolutions = []) : self
    {
        $this->validateNames([$name]);
        $this->traits[$name] = $resolutions;
        return $this;
    }
    /**
     * @param  Method|Property|Constant  $member
     * @return static
     */
    public function addMember($member) : self
    {
        if ($member instanceof \_HumbugBoxb94336daae36\Nette\PhpGenerator\Method) {
            if ($this->type === self::TYPE_INTERFACE) {
                $member->setBody(null);
            }
            $this->methods[$member->getName()] = $member;
        } elseif ($member instanceof \_HumbugBoxb94336daae36\Nette\PhpGenerator\Property) {
            $this->properties[$member->getName()] = $member;
        } elseif ($member instanceof \_HumbugBoxb94336daae36\Nette\PhpGenerator\Constant) {
            $this->consts[$member->getName()] = $member;
        } else {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Argument must be Method|Property|Constant.');
        }
        return $this;
    }
    /**
     * @param  Constant[]|mixed[]  $consts
     * @return static
     */
    public function setConstants(array $consts) : self
    {
        $this->consts = [];
        foreach ($consts as $k => $v) {
            $const = $v instanceof \_HumbugBoxb94336daae36\Nette\PhpGenerator\Constant ? $v : (new \_HumbugBoxb94336daae36\Nette\PhpGenerator\Constant($k))->setValue($v);
            $this->consts[$const->getName()] = $const;
        }
        return $this;
    }
    /**
     * @return Constant[]
     */
    public function getConstants() : array
    {
        return $this->consts;
    }
    public function addConstant(string $name, $value) : \_HumbugBoxb94336daae36\Nette\PhpGenerator\Constant
    {
        return $this->consts[$name] = (new \_HumbugBoxb94336daae36\Nette\PhpGenerator\Constant($name))->setValue($value);
    }
    /**
     * @return static
     */
    public function removeConstant(string $name) : self
    {
        unset($this->consts[$name]);
        return $this;
    }
    /**
     * @param  Property[]  $props
     * @return static
     */
    public function setProperties(array $props) : self
    {
        $this->properties = [];
        foreach ($props as $v) {
            if (!$v instanceof \_HumbugBoxb94336daae36\Nette\PhpGenerator\Property) {
                throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Argument must be Nette\\PhpGenerator\\Property[].');
            }
            $this->properties[$v->getName()] = $v;
        }
        return $this;
    }
    /**
     * @return Property[]
     */
    public function getProperties() : array
    {
        return $this->properties;
    }
    public function getProperty(string $name) : \_HumbugBoxb94336daae36\Nette\PhpGenerator\Property
    {
        if (!isset($this->properties[$name])) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Property '{$name}' not found.");
        }
        return $this->properties[$name];
    }
    /**
     * @param  string  $name  without $
     */
    public function addProperty(string $name, $value = null) : \_HumbugBoxb94336daae36\Nette\PhpGenerator\Property
    {
        return $this->properties[$name] = (new \_HumbugBoxb94336daae36\Nette\PhpGenerator\Property($name))->setValue($value);
    }
    /**
     * @param  string  $name without $
     * @return static
     */
    public function removeProperty(string $name) : self
    {
        unset($this->properties[$name]);
        return $this;
    }
    /**
     * @param  Method[]  $methods
     * @return static
     */
    public function setMethods(array $methods) : self
    {
        $this->methods = [];
        foreach ($methods as $v) {
            if (!$v instanceof \_HumbugBoxb94336daae36\Nette\PhpGenerator\Method) {
                throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Argument must be Nette\\PhpGenerator\\Method[].');
            }
            $this->methods[$v->getName()] = $v;
        }
        return $this;
    }
    /**
     * @return Method[]
     */
    public function getMethods() : array
    {
        return $this->methods;
    }
    public function getMethod(string $name) : \_HumbugBoxb94336daae36\Nette\PhpGenerator\Method
    {
        if (!isset($this->methods[$name])) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Method '{$name}' not found.");
        }
        return $this->methods[$name];
    }
    public function addMethod(string $name) : \_HumbugBoxb94336daae36\Nette\PhpGenerator\Method
    {
        $method = new \_HumbugBoxb94336daae36\Nette\PhpGenerator\Method($name);
        if ($this->type === self::TYPE_INTERFACE) {
            $method->setBody(null);
        } else {
            $method->setVisibility(self::VISIBILITY_PUBLIC);
        }
        return $this->methods[$name] = $method;
    }
    /**
     * @return static
     */
    public function removeMethod(string $name) : self
    {
        unset($this->methods[$name]);
        return $this;
    }
    /**
     * @throws Nette\InvalidStateException
     */
    public function validate() : void
    {
        if ($this->abstract && $this->final) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException('Class cannot be abstract and final.');
        } elseif (!$this->name && ($this->abstract || $this->final)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException('Anonymous class cannot be abstract or final.');
        }
    }
    private function validateNames(array $names) : void
    {
        foreach ($names as $name) {
            if (!\_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::isNamespaceIdentifier($name, \true)) {
                throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Value '{$name}' is not valid class name.");
            }
        }
    }
    public function __clone()
    {
        $clone = function ($item) {
            return clone $item;
        };
        $this->consts = \array_map($clone, $this->consts);
        $this->properties = \array_map($clone, $this->properties);
        $this->methods = \array_map($clone, $this->methods);
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\PhpGenerator;

use _HumbugBoxb94336daae36\Nette;
/**
 * Class property description.
 *
 * @property mixed $value
 */
final class Property
{
    use Nette\SmartObject;
    use Traits\NameAware;
    use Traits\VisibilityAware;
    use Traits\CommentAware;
    /** @var mixed */
    private $value;
    /** @var bool */
    private $static = \false;
    /**
     * @return static
     */
    public function setValue($val) : self
    {
        $this->value = $val;
        return $this;
    }
    public function &getValue()
    {
        return $this->value;
    }
    /**
     * @return static
     */
    public function setStatic(bool $state = \true) : self
    {
        $this->static = $state;
        return $this;
    }
    public function isStatic() : bool
    {
        return $this->static;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\PhpGenerator;

use _HumbugBoxb94336daae36\Nette;
/**
 * Global function.
 *
 * @property string $body
 */
final class GlobalFunction
{
    use Nette\SmartObject;
    use Traits\FunctionLike;
    use Traits\NameAware;
    use Traits\CommentAware;
    /**
     * @return static
     */
    public static function from(string $function) : self
    {
        return (new \_HumbugBoxb94336daae36\Nette\PhpGenerator\Factory())->fromFunctionReflection(new \ReflectionFunction($function));
    }
    public function __toString() : string
    {
        try {
            return (new \_HumbugBoxb94336daae36\Nette\PhpGenerator\Printer())->printFunction($this);
        } catch (\Throwable $e) {
            \trigger_error('Exception in ' . __METHOD__ . "(): {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}", \E_USER_ERROR);
        }
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\PhpGenerator;

use _HumbugBoxb94336daae36\Nette;
/**
 * PHP code generator utils.
 */
final class Helpers
{
    use Nette\StaticClass;
    public const PHP_IDENT = '[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*';
    public const WRAP_LENGTH = 100;
    public const INDENT_LENGTH = 4;
    private const MAX_DEPTH = 50;
    /**
     * Returns a PHP representation of a variable.
     */
    public static function dump($var) : string
    {
        return self::_dump($var);
    }
    private static function _dump(&$var, int $level = 0)
    {
        if ($var instanceof \_HumbugBoxb94336daae36\Nette\PhpGenerator\PhpLiteral) {
            return (string) $var;
        } elseif (\is_float($var)) {
            return \var_export($var, \true);
        } elseif ($var === null) {
            return 'null';
        } elseif (\is_string($var) && (\preg_match('#[^\\x09\\x20-\\x7E\\xA0-\\x{10FFFF}]#u', $var) || \preg_last_error())) {
            static $table;
            if ($table === null) {
                foreach (\array_merge(\range("\0", "\37"), \range("", "")) as $ch) {
                    $table[$ch] = '\\x' . \str_pad(\dechex(\ord($ch)), 2, '0', \STR_PAD_LEFT);
                }
                $table['\\'] = '\\\\';
                $table["\r"] = '\\r';
                $table["\n"] = '\\n';
                $table["\t"] = '\\t';
                $table['$'] = '\\$';
                $table['"'] = '\\"';
            }
            return '"' . \strtr($var, $table) . '"';
        } elseif (\is_string($var)) {
            return "'" . \preg_replace('#\'|\\\\(?=[\'\\\\]|\\z)#', '\\\\$0', $var) . "'";
        } elseif (\is_array($var)) {
            $space = \str_repeat("\t", $level);
            static $marker;
            if ($marker === null) {
                $marker = \uniqid("\0", \true);
            }
            if (empty($var)) {
                $out = '';
            } elseif ($level > self::MAX_DEPTH || isset($var[$marker])) {
                throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Nesting level too deep or recursive dependency.');
            } else {
                $out = '';
                $outWrapped = "\n{$space}";
                $var[$marker] = \true;
                $counter = 0;
                foreach ($var as $k => &$v) {
                    if ($k !== $marker) {
                        $item = ($k === $counter ? '' : self::_dump($k, $level + 1) . ' => ') . self::_dump($v, $level + 1);
                        $counter = \is_int($k) ? \max($k + 1, $counter) : $counter;
                        $out .= ($out === '' ? '' : ', ') . $item;
                        $outWrapped .= "\t{$item},\n{$space}";
                    }
                }
                unset($var[$marker]);
            }
            $wrap = \strpos($out, "\n") !== \false || \strlen($out) > self::WRAP_LENGTH - $level * self::INDENT_LENGTH;
            return '[' . ($wrap ? $outWrapped : $out) . ']';
        } elseif ($var instanceof \Serializable) {
            $var = \serialize($var);
            return 'unserialize(' . self::_dump($var, $level) . ')';
        } elseif ($var instanceof \Closure) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Cannot dump closure.');
        } elseif (\is_object($var)) {
            $class = \get_class($var);
            if ((new \ReflectionObject($var))->isAnonymous()) {
                throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Cannot dump anonymous class.');
            } elseif (\in_array($class, ['DateTime', 'DateTimeImmutable'], \true)) {
                return self::format("new {$class}(?, new DateTimeZone(?))", $var->format('Y-m-d H:i:s.u'), $var->getTimeZone()->getName());
            }
            $arr = (array) $var;
            $space = \str_repeat("\t", $level);
            static $list = [];
            if ($level > self::MAX_DEPTH || \in_array($var, $list, \true)) {
                throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Nesting level too deep or recursive dependency.');
            } else {
                $out = "\n";
                $list[] = $var;
                if (\method_exists($var, '__sleep')) {
                    foreach ($var->__sleep() as $v) {
                        $props[$v] = $props["\0*\0{$v}"] = $props["\0{$class}\0{$v}"] = \true;
                    }
                }
                foreach ($arr as $k => &$v) {
                    if (!isset($props) || isset($props[$k])) {
                        $out .= "{$space}\t" . self::_dump($k, $level + 1) . ' => ' . self::_dump($v, $level + 1) . ",\n";
                    }
                }
                \array_pop($list);
                $out .= $space;
            }
            return $class === 'stdClass' ? "(object) [{$out}]" : __CLASS__ . "::createObject('{$class}', [{$out}])";
        } elseif (\is_resource($var)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Cannot dump resource.');
        } else {
            return \var_export($var, \true);
        }
    }
    /**
     * Generates PHP statement.
     */
    public static function format(string $statement, ...$args) : string
    {
        return self::formatArgs($statement, $args);
    }
    /**
     * Generates PHP statement.
     */
    public static function formatArgs(string $statement, array $args) : string
    {
        $tokens = \preg_split('#(\\.\\.\\.\\?|\\$\\?|->\\?|::\\?|\\\\\\?|\\?\\*|\\?)#', $statement, -1, \PREG_SPLIT_DELIM_CAPTURE);
        $res = '';
        foreach ($tokens as $n => $token) {
            if ($n % 2 === 0) {
                $res .= $token;
            } elseif ($token === '\\?') {
                $res .= '?';
            } elseif (!$args) {
                throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Insufficient number of arguments.');
            } elseif ($token === '?') {
                $res .= self::dump(\array_shift($args));
            } elseif ($token === '...?' || $token === '?*') {
                $arg = \array_shift($args);
                if (!\is_array($arg)) {
                    throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Argument must be an array.');
                }
                $items = [];
                foreach ($arg as $tmp) {
                    $items[] = self::dump($tmp);
                }
                $res .= \strlen($tmp = \implode(', ', $items)) > self::WRAP_LENGTH && \count($items) > 1 ? "\n" . \_HumbugBoxb94336daae36\Nette\Utils\Strings::indent(\implode(",\n", $items)) . "\n" : $tmp;
            } else {
                // $  ->  ::
                $res .= \substr($token, 0, -1) . self::formatMember(\array_shift($args));
            }
        }
        if ($args) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Insufficient number of placeholders.');
        }
        return $res;
    }
    /**
     * Returns a PHP representation of a object member.
     */
    public static function formatMember($name) : string
    {
        return $name instanceof \_HumbugBoxb94336daae36\Nette\PhpGenerator\PhpLiteral || !self::isIdentifier($name) ? '{' . self::_dump($name) . '}' : $name;
    }
    public static function formatDocComment(string $content) : string
    {
        if (($s = \trim($content)) === '') {
            return '';
        } elseif (\strpos($content, "\n") === \false) {
            return "/** {$s} */\n";
        } else {
            return \str_replace("\n", "\n * ", "/**\n{$s}") . "\n */\n";
        }
    }
    public static function unformatDocComment(string $comment) : string
    {
        return \preg_replace('#^\\s*\\* ?#m', '', \trim(\trim(\trim($comment), '/*')));
    }
    public static function isIdentifier($value) : bool
    {
        return \is_string($value) && \preg_match('#^' . self::PHP_IDENT . '\\z#', $value);
    }
    public static function isNamespaceIdentifier($value, bool $allowLeadingSlash = \false) : bool
    {
        $re = '#^' . ($allowLeadingSlash ? '\\\\?' : '') . self::PHP_IDENT . '(\\\\' . self::PHP_IDENT . ')*\\z#';
        return \is_string($value) && \preg_match($re, $value);
    }
    /**
     * @return object
     * @internal
     */
    public static function createObject(string $class, array $props)
    {
        return \unserialize('O' . \substr(\serialize($class), 1, -1) . \substr(\serialize($props), 1));
    }
    public static function extractNamespace(string $name) : string
    {
        return ($pos = \strrpos($name, '\\')) ? \substr($name, 0, $pos) : '';
    }
    public static function extractShortName(string $name) : string
    {
        return ($pos = \strrpos($name, '\\')) === \false ? $name : \substr($name, $pos + 1);
    }
    public static function tabsToSpaces(string $s, int $count = self::INDENT_LENGTH) : string
    {
        return \str_replace("\t", \str_repeat(' ', $count), $s);
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\PhpGenerator;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\Utils\Strings;
/**
 * Generates PHP code.
 */
class Printer
{
    use Nette\SmartObject;
    /** @var string */
    protected $indentation = "\t";
    /** @var int */
    protected $linesBetweenMethods = 2;
    /** @var bool */
    private $resolveTypes = \true;
    public function printFunction(\_HumbugBoxb94336daae36\Nette\PhpGenerator\GlobalFunction $function, \_HumbugBoxb94336daae36\Nette\PhpGenerator\PhpNamespace $namespace = null) : string
    {
        return \_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::formatDocComment($function->getComment() . "\n") . 'function ' . ($function->getReturnReference() ? '&' : '') . $function->getName() . $this->printParameters($function, $namespace) . $this->printReturnType($function, $namespace) . "\n{\n" . $this->indent(\ltrim(\rtrim($function->getBody()) . "\n")) . "}\n";
    }
    public function printClosure(\_HumbugBoxb94336daae36\Nette\PhpGenerator\Closure $closure) : string
    {
        $uses = [];
        foreach ($closure->getUses() as $param) {
            $uses[] = ($param->isReference() ? '&' : '') . '$' . $param->getName();
        }
        $useStr = \strlen($tmp = \implode(', ', $uses)) > \_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::WRAP_LENGTH && \count($uses) > 1 ? "\n" . $this->indentation . \implode(",\n" . $this->indentation, $uses) . "\n" : $tmp;
        return 'function ' . ($closure->getReturnReference() ? '&' : '') . $this->printParameters($closure, null) . ($uses ? " use ({$useStr})" : '') . $this->printReturnType($closure, null) . " {\n" . $this->indent(\ltrim(\rtrim($closure->getBody()) . "\n")) . '}';
    }
    public function printMethod(\_HumbugBoxb94336daae36\Nette\PhpGenerator\Method $method, \_HumbugBoxb94336daae36\Nette\PhpGenerator\PhpNamespace $namespace = null) : string
    {
        $method->validate();
        return \_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::formatDocComment($method->getComment() . "\n") . ($method->isAbstract() ? 'abstract ' : '') . ($method->isFinal() ? 'final ' : '') . ($method->getVisibility() ? $method->getVisibility() . ' ' : '') . ($method->isStatic() ? 'static ' : '') . 'function ' . ($method->getReturnReference() ? '&' : '') . $method->getName() . ($params = $this->printParameters($method, $namespace)) . $this->printReturnType($method, $namespace) . ($method->isAbstract() || $method->getBody() === null ? ";\n" : (\strpos($params, "\n") === \false ? "\n" : ' ') . "{\n" . $this->indent(\ltrim(\rtrim($method->getBody()) . "\n")) . "}\n");
    }
    public function printClass(\_HumbugBoxb94336daae36\Nette\PhpGenerator\ClassType $class, \_HumbugBoxb94336daae36\Nette\PhpGenerator\PhpNamespace $namespace = null) : string
    {
        $class->validate();
        $resolver = $this->resolveTypes && $namespace ? [$namespace, 'unresolveName'] : function ($s) {
            return $s;
        };
        $traits = [];
        foreach ($class->getTraitResolutions() as $trait => $resolutions) {
            $traits[] = 'use ' . $resolver($trait) . ($resolutions ? " {\n" . $this->indentation . \implode(";\n" . $this->indentation, $resolutions) . ";\n}\n" : ";\n");
        }
        $consts = [];
        foreach ($class->getConstants() as $const) {
            $consts[] = \_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::formatDocComment((string) $const->getComment()) . ($const->getVisibility() ? $const->getVisibility() . ' ' : '') . 'const ' . $const->getName() . ' = ' . \_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::dump($const->getValue()) . ";\n";
        }
        $properties = [];
        foreach ($class->getProperties() as $property) {
            $properties[] = \_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::formatDocComment((string) $property->getComment()) . ($property->getVisibility() ?: 'public') . ($property->isStatic() ? ' static' : '') . ' $' . $property->getName() . ($property->getValue() === null ? '' : ' = ' . \_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::dump($property->getValue())) . ";\n";
        }
        $methods = [];
        foreach ($class->getMethods() as $method) {
            $methods[] = $this->printMethod($method, $namespace);
        }
        $members = \array_filter([\implode('', $traits), \implode('', $consts), \implode("\n", $properties), ($methods && $properties ? \str_repeat("\n", $this->linesBetweenMethods - 1) : '') . \implode(\str_repeat("\n", $this->linesBetweenMethods), $methods)]);
        return \_HumbugBoxb94336daae36\Nette\Utils\Strings::normalize(\_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::formatDocComment($class->getComment() . "\n") . ($class->isAbstract() ? 'abstract ' : '') . ($class->isFinal() ? 'final ' : '') . ($class->getName() ? $class->getType() . ' ' . $class->getName() . ' ' : '') . ($class->getExtends() ? 'extends ' . \implode(', ', \array_map($resolver, (array) $class->getExtends())) . ' ' : '') . ($class->getImplements() ? 'implements ' . \implode(', ', \array_map($resolver, $class->getImplements())) . ' ' : '') . ($class->getName() ? "\n" : '') . "{\n" . ($members ? $this->indent(\implode("\n", $members)) : '') . '}') . ($class->getName() ? "\n" : '');
    }
    public function printNamespace(\_HumbugBoxb94336daae36\Nette\PhpGenerator\PhpNamespace $namespace) : string
    {
        $name = $namespace->getName();
        $uses = [];
        foreach ($namespace->getUses() as $alias => $original) {
            if ($original !== ($name ? $name . '\\' . $alias : $alias)) {
                if ($alias === $original || \substr($original, -(\strlen($alias) + 1)) === '\\' . $alias) {
                    $uses[] = "use {$original};";
                } else {
                    $uses[] = "use {$original} as {$alias};";
                }
            }
        }
        $classes = [];
        foreach ($namespace->getClasses() as $class) {
            $classes[] = $this->printClass($class, $namespace);
        }
        $body = ($uses ? \implode("\n", $uses) . "\n\n" : '') . \implode("\n", $classes);
        if ($namespace->getBracketedSyntax()) {
            return 'namespace' . ($name ? " {$name}" : '') . "\n{\n" . $this->indent($body) . "}\n";
        } else {
            return ($name ? "namespace {$name};\n\n" : '') . $body;
        }
    }
    public function printFile(\_HumbugBoxb94336daae36\Nette\PhpGenerator\PhpFile $file) : string
    {
        $namespaces = [];
        foreach ($file->getNamespaces() as $namespace) {
            $namespaces[] = $this->printNamespace($namespace);
        }
        return \_HumbugBoxb94336daae36\Nette\Utils\Strings::normalize("<?php\n" . ($file->getComment() ? "\n" . \_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::formatDocComment($file->getComment() . "\n") : '') . "\n" . ($file->getStrictTypes() ? "declare(strict_types=1);\n\n" : '') . \implode("\n\n", $namespaces)) . "\n";
    }
    /**
     * @return static
     */
    public function setTypeResolving(bool $state = \true) : self
    {
        $this->resolveTypes = $state;
        return $this;
    }
    protected function indent(string $s) : string
    {
        return \_HumbugBoxb94336daae36\Nette\Utils\Strings::indent($s, 1, $this->indentation);
    }
    /**
     * @param Nette\PhpGenerator\Traits\FunctionLike  $function
     */
    protected function printParameters($function, ?\_HumbugBoxb94336daae36\Nette\PhpGenerator\PhpNamespace $namespace) : string
    {
        $params = [];
        $list = $function->getParameters();
        foreach ($list as $param) {
            $variadic = $function->isVariadic() && $param === \end($list);
            $hint = $param->getTypeHint();
            $params[] = ($hint ? ($param->isNullable() ? '?' : '') . ($this->resolveTypes && $namespace ? $namespace->unresolveName($hint) : $hint) . ' ' : '') . ($param->isReference() ? '&' : '') . ($variadic ? '...' : '') . '$' . $param->getName() . ($param->hasDefaultValue() && !$variadic ? ' = ' . \_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::dump($param->getDefaultValue()) : '');
        }
        return \strlen($tmp = \implode(', ', $params)) > \_HumbugBoxb94336daae36\Nette\PhpGenerator\Helpers::WRAP_LENGTH && \count($params) > 1 ? "(\n" . $this->indentation . \implode(",\n" . $this->indentation, $params) . "\n)" : "({$tmp})";
    }
    /**
     * @param Nette\PhpGenerator\Traits\FunctionLike  $function
     */
    protected function printReturnType($function, ?\_HumbugBoxb94336daae36\Nette\PhpGenerator\PhpNamespace $namespace) : string
    {
        return $function->getReturnType() ? ': ' . ($function->getReturnNullable() ? '?' : '') . ($this->resolveTypes && $namespace ? $namespace->unresolveName($function->getReturnType()) : $function->getReturnType()) : '';
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\PhpGenerator;

use _HumbugBoxb94336daae36\Nette;
/**
 * Method parameter description.
 *
 * @property mixed $defaultValue
 */
final class Parameter
{
    use Nette\SmartObject;
    use Traits\NameAware;
    /** @var bool */
    private $reference = \false;
    /** @var string|null */
    private $typeHint;
    /** @var bool */
    private $nullable = \false;
    /** @var bool */
    private $hasDefaultValue = \false;
    /** @var mixed */
    private $defaultValue;
    /**
     * @return static
     */
    public function setReference(bool $state = \true) : self
    {
        $this->reference = $state;
        return $this;
    }
    public function isReference() : bool
    {
        return $this->reference;
    }
    /**
     * @return static
     */
    public function setTypeHint(?string $hint) : self
    {
        $this->typeHint = $hint;
        return $this;
    }
    public function getTypeHint() : ?string
    {
        return $this->typeHint;
    }
    /**
     * @deprecated  just use setDefaultValue()
     * @return static
     */
    public function setOptional(bool $state = \true) : self
    {
        \trigger_error(__METHOD__ . '() is deprecated, use setDefaultValue()', \E_USER_DEPRECATED);
        $this->hasDefaultValue = $state;
        return $this;
    }
    /**
     * @return static
     */
    public function setNullable(bool $state = \true) : self
    {
        $this->nullable = $state;
        return $this;
    }
    public function isNullable() : bool
    {
        return $this->nullable;
    }
    /**
     * @return static
     */
    public function setDefaultValue($val) : self
    {
        $this->defaultValue = $val;
        $this->hasDefaultValue = \true;
        return $this;
    }
    public function getDefaultValue()
    {
        return $this->defaultValue;
    }
    public function hasDefaultValue() : bool
    {
        return $this->hasDefaultValue;
    }
}
Licenses
========

Good news! You may use Nette Framework under the terms of either
the New BSD License or the GNU General Public License (GPL) version 2 or 3.

The BSD License is recommended for most projects. It is easy to understand and it
places almost no restrictions on what you can do with the framework. If the GPL
fits better to your project, you can use the framework under this license.

You don't have to notify anyone which license you are using. You can freely
use Nette Framework in commercial projects as long as the copyright header
remains intact.

Please be advised that the name "Nette Framework" is a protected trademark and its
usage has some limitations. So please do not use word "Nette" in the name of your
project or top-level domain, and choose a name that stands on its own merits.
If your stuff is good, it will not take long to establish a reputation for yourselves.


New BSD License
---------------

Copyright (c) 2004, 2014 David Grudl (https://davidgrudl.com)
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 "Nette Framework" 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 owner 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.


GNU General Public License
--------------------------

GPL licenses are very very long, so instead of including them here we offer
you URLs with full text:

- [GPL version 2](http://www.gnu.org/licenses/gpl-2.0.html)
- [GPL version 3](http://www.gnu.org/licenses/gpl-3.0.html)
{
    "name": "nette\/utils",
    "description": "\ud83d\udee0 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding\/decoding, validation, slug or strong password generating etc.",
    "keywords": [
        "nette",
        "images",
        "json",
        "password",
        "validation",
        "utility",
        "string",
        "array",
        "core",
        "slugify",
        "utf-8",
        "unicode",
        "paginator",
        "datetime"
    ],
    "homepage": "https:\/\/nette.org",
    "license": [
        "BSD-3-Clause",
        "GPL-2.0",
        "GPL-3.0"
    ],
    "authors": [
        {
            "name": "David Grudl",
            "homepage": "https:\/\/davidgrudl.com"
        },
        {
            "name": "Nette Community",
            "homepage": "https:\/\/nette.org\/contributors"
        }
    ],
    "require": {
        "php": ">=7.1"
    },
    "require-dev": {
        "nette\/tester": "~2.0",
        "tracy\/tracy": "^2.3"
    },
    "suggest": {
        "ext-iconv": "to use Strings::webalize() and toAscii()",
        "ext-json": "to use Nette\\Utils\\Json",
        "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()",
        "ext-mbstring": "to use Strings::lower() etc...",
        "ext-xml": "to use Strings::length() etc. when mbstring is not available",
        "ext-gd": "to use Image"
    },
    "autoload": {
        "classmap": [
            "src\/"
        ]
    },
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "3.0-dev"
        }
    }
}<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Utils;

use _HumbugBoxb94336daae36\Nette;
/**
 * DateTime.
 */
class DateTime extends \DateTime implements \JsonSerializable
{
    use Nette\SmartObject;
    /** minute in seconds */
    public const MINUTE = 60;
    /** hour in seconds */
    public const HOUR = 60 * self::MINUTE;
    /** day in seconds */
    public const DAY = 24 * self::HOUR;
    /** week in seconds */
    public const WEEK = 7 * self::DAY;
    /** average month in seconds */
    public const MONTH = 2629800;
    /** average year in seconds */
    public const YEAR = 31557600;
    /**
     * DateTime object factory.
     * @param  string|int|\DateTimeInterface  $time
     * @return static
     */
    public static function from($time)
    {
        if ($time instanceof \DateTimeInterface) {
            return new static($time->format('Y-m-d H:i:s.u'), $time->getTimezone());
        } elseif (\is_numeric($time)) {
            if ($time <= self::YEAR) {
                $time += \time();
            }
            return (new static('@' . $time))->setTimezone(new \DateTimeZone(\date_default_timezone_get()));
        } else {
            // textual or null
            return new static($time);
        }
    }
    /**
     * Creates DateTime object.
     * @return static
     */
    public static function fromParts(int $year, int $month, int $day, int $hour = 0, int $minute = 0, float $second = 0.0)
    {
        $s = \sprintf('%04d-%02d-%02d %02d:%02d:%02.5f', $year, $month, $day, $hour, $minute, $second);
        if (!\checkdate($month, $day, $year) || $hour < 0 || $hour > 23 || $minute < 0 || $minute > 59 || $second < 0 || $second >= 60) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Invalid date '{$s}'");
        }
        return new static($s);
    }
    /**
     * Returns new DateTime object formatted according to the specified format.
     * @param  string  $format  The format the $time parameter should be in
     * @param  string  $time
     * @param  string|\DateTimeZone  $timezone (default timezone is used if null is passed)
     * @return static|false
     */
    public static function createFromFormat($format, $time, $timezone = null)
    {
        if ($timezone === null) {
            $timezone = new \DateTimeZone(\date_default_timezone_get());
        } elseif (\is_string($timezone)) {
            $timezone = new \DateTimeZone($timezone);
        } elseif (!$timezone instanceof \DateTimeZone) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Invalid timezone given');
        }
        $date = parent::createFromFormat($format, $time, $timezone);
        return $date ? static::from($date) : \false;
    }
    /**
     * Returns JSON representation in ISO 8601 (used by JavaScript).
     */
    public function jsonSerialize() : string
    {
        return $this->format('c');
    }
    public function __toString() : string
    {
        return $this->format('Y-m-d H:i:s');
    }
    /**
     * @return static
     */
    public function modifyClone(string $modify = '')
    {
        $dolly = clone $this;
        return $modify ? $dolly->modify($modify) : $dolly;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette;

/**
 * Static class.
 */
trait StaticClass
{
    /**
     * @throws \Error
     */
    public final function __construct()
    {
        throw new \Error('Class ' . \get_class($this) . ' is static and cannot be instantiated.');
    }
    /**
     * Call to undefined static method.
     * @throws MemberAccessException
     */
    public static function __callStatic(string $name, array $args)
    {
        \_HumbugBoxb94336daae36\Nette\Utils\ObjectHelpers::strictStaticCall(static::class, $name);
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Utils;

use _HumbugBoxb94336daae36\Nette;
/**
 * Provides the base class for a generic list (items can be accessed by index).
 */
class ArrayList implements \ArrayAccess, \Countable, \IteratorAggregate
{
    use Nette\SmartObject;
    private $list = [];
    /**
     * Returns an iterator over all items.
     */
    public function getIterator() : \ArrayIterator
    {
        return new \ArrayIterator($this->list);
    }
    /**
     * Returns items count.
     */
    public function count() : int
    {
        return \count($this->list);
    }
    /**
     * Replaces or appends a item.
     * @param  int|null  $index
     * @throws Nette\OutOfRangeException
     */
    public function offsetSet($index, $value) : void
    {
        if ($index === null) {
            $this->list[] = $value;
        } elseif (!\is_int($index) || $index < 0 || $index >= \count($this->list)) {
            throw new \_HumbugBoxb94336daae36\Nette\OutOfRangeException('Offset invalid or out of range');
        } else {
            $this->list[$index] = $value;
        }
    }
    /**
     * Returns a item.
     * @param  int  $index
     * @return mixed
     * @throws Nette\OutOfRangeException
     */
    public function offsetGet($index)
    {
        if (!\is_int($index) || $index < 0 || $index >= \count($this->list)) {
            throw new \_HumbugBoxb94336daae36\Nette\OutOfRangeException('Offset invalid or out of range');
        }
        return $this->list[$index];
    }
    /**
     * Determines whether a item exists.
     * @param  int  $index
     */
    public function offsetExists($index) : bool
    {
        return \is_int($index) && $index >= 0 && $index < \count($this->list);
    }
    /**
     * Removes the element at the specified position in this list.
     * @param  int  $index
     * @throws Nette\OutOfRangeException
     */
    public function offsetUnset($index) : void
    {
        if (!\is_int($index) || $index < 0 || $index >= \count($this->list)) {
            throw new \_HumbugBoxb94336daae36\Nette\OutOfRangeException('Offset invalid or out of range');
        }
        \array_splice($this->list, $index, 1);
    }
    /**
     * Prepends a item.
     */
    public function prepend($value) : void
    {
        $first = \array_slice($this->list, 0, 1);
        $this->offsetSet(0, $value);
        \array_splice($this->list, 1, 0, $first);
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Utils;

interface IHtmlString
{
    /**
     * Returns string in HTML format
     */
    function __toString() : string;
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Utils;

use _HumbugBoxb94336daae36\Nette;
/**
 * JSON encoder and decoder.
 */
final class Json
{
    use Nette\StaticClass;
    public const FORCE_ARRAY = 0b1;
    public const PRETTY = 0b10;
    /**
     * Returns the JSON representation of a value. Accepts flag Json::PRETTY.
     */
    public static function encode($value, int $flags = 0) : string
    {
        $flags = \JSON_UNESCAPED_UNICODE | \JSON_UNESCAPED_SLASHES | ($flags & self::PRETTY ? \JSON_PRETTY_PRINT : 0) | (\defined('JSON_PRESERVE_ZERO_FRACTION') ? \JSON_PRESERVE_ZERO_FRACTION : 0);
        // since PHP 5.6.6 & PECL JSON-C 1.3.7
        $json = \json_encode($value, $flags);
        if ($error = \json_last_error()) {
            throw new \_HumbugBoxb94336daae36\Nette\Utils\JsonException(\json_last_error_msg(), $error);
        }
        return $json;
    }
    /**
     * Decodes a JSON string. Accepts flag Json::FORCE_ARRAY.
     * @return mixed
     */
    public static function decode(string $json, int $flags = 0)
    {
        $forceArray = (bool) ($flags & self::FORCE_ARRAY);
        $value = \json_decode($json, $forceArray, 512, \JSON_BIGINT_AS_STRING);
        if ($error = \json_last_error()) {
            throw new \_HumbugBoxb94336daae36\Nette\Utils\JsonException(\json_last_error_msg(), $error);
        }
        return $value;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Utils;

use _HumbugBoxb94336daae36\Nette;
/**
 * Paginating math.
 *
 * @property   int $page
 * @property-read int $firstPage
 * @property-read int|null $lastPage
 * @property   int $base
 * @property-read bool $first
 * @property-read bool $last
 * @property-read int|null $pageCount
 * @property   int $itemsPerPage
 * @property   int|null $itemCount
 * @property-read int $offset
 * @property-read int|null $countdownOffset
 * @property-read int $length
 */
class Paginator
{
    use Nette\SmartObject;
    /** @var int */
    private $base = 1;
    /** @var int */
    private $itemsPerPage = 1;
    /** @var int */
    private $page = 1;
    /** @var int|null */
    private $itemCount;
    /**
     * Sets current page number.
     * @return static
     */
    public function setPage(int $page)
    {
        $this->page = $page;
        return $this;
    }
    /**
     * Returns current page number.
     */
    public function getPage() : int
    {
        return $this->base + $this->getPageIndex();
    }
    /**
     * Returns first page number.
     */
    public function getFirstPage() : int
    {
        return $this->base;
    }
    /**
     * Returns last page number.
     */
    public function getLastPage() : ?int
    {
        return $this->itemCount === null ? null : $this->base + \max(0, $this->getPageCount() - 1);
    }
    /**
     * Sets first page (base) number.
     * @return static
     */
    public function setBase(int $base)
    {
        $this->base = $base;
        return $this;
    }
    /**
     * Returns first page (base) number.
     */
    public function getBase() : int
    {
        return $this->base;
    }
    /**
     * Returns zero-based page number.
     */
    protected function getPageIndex() : int
    {
        $index = \max(0, $this->page - $this->base);
        return $this->itemCount === null ? $index : \min($index, \max(0, $this->getPageCount() - 1));
    }
    /**
     * Is the current page the first one?
     */
    public function isFirst() : bool
    {
        return $this->getPageIndex() === 0;
    }
    /**
     * Is the current page the last one?
     */
    public function isLast() : bool
    {
        return $this->itemCount === null ? \false : $this->getPageIndex() >= $this->getPageCount() - 1;
    }
    /**
     * Returns the total number of pages.
     */
    public function getPageCount() : ?int
    {
        return $this->itemCount === null ? null : (int) \ceil($this->itemCount / $this->itemsPerPage);
    }
    /**
     * Sets the number of items to display on a single page.
     * @return static
     */
    public function setItemsPerPage(int $itemsPerPage)
    {
        $this->itemsPerPage = \max(1, $itemsPerPage);
        return $this;
    }
    /**
     * Returns the number of items to display on a single page.
     */
    public function getItemsPerPage() : int
    {
        return $this->itemsPerPage;
    }
    /**
     * Sets the total number of items.
     * @return static
     */
    public function setItemCount(int $itemCount = null)
    {
        $this->itemCount = $itemCount === null ? null : \max(0, $itemCount);
        return $this;
    }
    /**
     * Returns the total number of items.
     */
    public function getItemCount() : ?int
    {
        return $this->itemCount;
    }
    /**
     * Returns the absolute index of the first item on current page.
     */
    public function getOffset() : int
    {
        return $this->getPageIndex() * $this->itemsPerPage;
    }
    /**
     * Returns the absolute index of the first item on current page in countdown paging.
     */
    public function getCountdownOffset() : ?int
    {
        return $this->itemCount === null ? null : \max(0, $this->itemCount - ($this->getPageIndex() + 1) * $this->itemsPerPage);
    }
    /**
     * Returns the number of items on current page.
     */
    public function getLength() : int
    {
        return $this->itemCount === null ? $this->itemsPerPage : \min($this->itemsPerPage, $this->itemCount - $this->getPageIndex() * $this->itemsPerPage);
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Utils;

use _HumbugBoxb94336daae36\Nette;
use function is_array, is_int, is_object;
/**
 * Array tools library.
 */
class Arrays
{
    use Nette\StaticClass;
    /**
     * Returns item from array or $default if item is not set.
     * @param  string|int|array $key one or more keys
     * @return mixed
     * @throws Nette\InvalidArgumentException if item does not exist and default value is not provided
     */
    public static function get(array $arr, $key, $default = null)
    {
        foreach (\is_array($key) ? $key : [$key] as $k) {
            if (\is_array($arr) && \array_key_exists($k, $arr)) {
                $arr = $arr[$k];
            } else {
                if (\func_num_args() < 3) {
                    throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Missing item '{$k}'.");
                }
                return $default;
            }
        }
        return $arr;
    }
    /**
     * Returns reference to array item.
     * @param  string|int|array $key one or more keys
     * @return mixed
     * @throws Nette\InvalidArgumentException if traversed item is not an array
     */
    public static function &getRef(array &$arr, $key)
    {
        foreach (\is_array($key) ? $key : [$key] as $k) {
            if (\is_array($arr) || $arr === null) {
                $arr =& $arr[$k];
            } else {
                throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Traversed item is not an array.');
            }
        }
        return $arr;
    }
    /**
     * Recursively appends elements of remaining keys from the second array to the first.
     */
    public static function mergeTree(array $arr1, array $arr2) : array
    {
        $res = $arr1 + $arr2;
        foreach (\array_intersect_key($arr1, $arr2) as $k => $v) {
            if (\is_array($v) && \is_array($arr2[$k])) {
                $res[$k] = self::mergeTree($v, $arr2[$k]);
            }
        }
        return $res;
    }
    /**
     * Searches the array for a given key and returns the offset if successful.
     * @return int|null offset if it is found, null otherwise
     */
    public static function searchKey(array $arr, $key) : ?int
    {
        $foo = [$key => null];
        return ($tmp = \array_search(\key($foo), \array_keys($arr), \true)) === \false ? null : $tmp;
    }
    /**
     * Inserts new array before item specified by key.
     */
    public static function insertBefore(array &$arr, $key, array $inserted) : void
    {
        $offset = (int) self::searchKey($arr, $key);
        $arr = \array_slice($arr, 0, $offset, \true) + $inserted + \array_slice($arr, $offset, \count($arr), \true);
    }
    /**
     * Inserts new array after item specified by key.
     */
    public static function insertAfter(array &$arr, $key, array $inserted) : void
    {
        $offset = self::searchKey($arr, $key);
        $offset = $offset === null ? \count($arr) : $offset + 1;
        $arr = \array_slice($arr, 0, $offset, \true) + $inserted + \array_slice($arr, $offset, \count($arr), \true);
    }
    /**
     * Renames key in array.
     */
    public static function renameKey(array &$arr, $oldKey, $newKey) : void
    {
        $offset = self::searchKey($arr, $oldKey);
        if ($offset !== null) {
            $keys = \array_keys($arr);
            $keys[$offset] = $newKey;
            $arr = \array_combine($keys, $arr);
        }
    }
    /**
     * Returns array entries that match the pattern.
     */
    public static function grep(array $arr, string $pattern, int $flags = 0) : array
    {
        return \_HumbugBoxb94336daae36\Nette\Utils\Strings::pcre('preg_grep', [$pattern, $arr, $flags]);
    }
    /**
     * Returns flattened array.
     */
    public static function flatten(array $arr, bool $preserveKeys = \false) : array
    {
        $res = [];
        $cb = $preserveKeys ? function ($v, $k) use(&$res) : void {
            $res[$k] = $v;
        } : function ($v) use(&$res) : void {
            $res[] = $v;
        };
        \array_walk_recursive($arr, $cb);
        return $res;
    }
    /**
     * Finds whether a variable is a zero-based integer indexed array.
     */
    public static function isList($value) : bool
    {
        return \is_array($value) && (!$value || \array_keys($value) === \range(0, \count($value) - 1));
    }
    /**
     * Reformats table to associative tree. Path looks like 'field|field[]field->field=field'.
     * @return array|\stdClass
     */
    public static function associate(array $arr, $path)
    {
        $parts = \is_array($path) ? $path : \preg_split('#(\\[\\]|->|=|\\|)#', $path, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY);
        if (!$parts || $parts[0] === '=' || $parts[0] === '|' || $parts === ['->']) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Invalid path '{$path}'.");
        }
        $res = $parts[0] === '->' ? new \stdClass() : [];
        foreach ($arr as $rowOrig) {
            $row = (array) $rowOrig;
            $x =& $res;
            for ($i = 0; $i < \count($parts); $i++) {
                $part = $parts[$i];
                if ($part === '[]') {
                    $x =& $x[];
                } elseif ($part === '=') {
                    if (isset($parts[++$i])) {
                        $x = $row[$parts[$i]];
                        $row = null;
                    }
                } elseif ($part === '->') {
                    if (isset($parts[++$i])) {
                        $x =& $x->{$row[$parts[$i]]};
                    } else {
                        $row = \is_object($rowOrig) ? $rowOrig : (object) $row;
                    }
                } elseif ($part !== '|') {
                    $x =& $x[(string) $row[$part]];
                }
            }
            if ($x === null) {
                $x = $row;
            }
        }
        return $res;
    }
    /**
     * Normalizes to associative array.
     */
    public static function normalize(array $arr, $filling = null) : array
    {
        $res = [];
        foreach ($arr as $k => $v) {
            $res[\is_int($k) ? $v : $k] = \is_int($k) ? $filling : $v;
        }
        return $res;
    }
    /**
     * Picks element from the array by key and return its value.
     * @param  string|int $key array key
     * @return mixed
     * @throws Nette\InvalidArgumentException if item does not exist and default value is not provided
     */
    public static function pick(array &$arr, $key, $default = null)
    {
        if (\array_key_exists($key, $arr)) {
            $value = $arr[$key];
            unset($arr[$key]);
            return $value;
        } elseif (\func_num_args() < 3) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Missing item '{$key}'.");
        } else {
            return $default;
        }
    }
    /**
     * Tests whether some element in the array passes the callback test.
     */
    public static function some(array $arr, callable $callback) : bool
    {
        foreach ($arr as $k => $v) {
            if ($callback($v, $k, $arr)) {
                return \true;
            }
        }
        return \false;
    }
    /**
     * Tests whether all elements in the array pass the callback test.
     */
    public static function every(array $arr, callable $callback) : bool
    {
        foreach ($arr as $k => $v) {
            if (!$callback($v, $k, $arr)) {
                return \false;
            }
        }
        return \true;
    }
    /**
     * Applies the callback to the elements of the array.
     */
    public static function map(array $arr, callable $callback) : array
    {
        $res = [];
        foreach ($arr as $k => $v) {
            $res[$k] = $callback($v, $k, $arr);
        }
        return $res;
    }
    /**
     * Converts array to object
     * @param  object  $obj
     * @return object
     */
    public static function toObject(array $arr, $obj)
    {
        foreach ($arr as $k => $v) {
            $obj->{$k} = $v;
        }
        return $obj;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Utils;

use _HumbugBoxb94336daae36\Nette;
/**
 * File system tool.
 */
final class FileSystem
{
    use Nette\StaticClass;
    /**
     * Creates a directory.
     * @throws Nette\IOException
     */
    public static function createDir(string $dir, int $mode = 0777) : void
    {
        if (!\is_dir($dir) && !@\mkdir($dir, $mode, \true) && !\is_dir($dir)) {
            // @ - dir may already exist
            throw new \_HumbugBoxb94336daae36\Nette\IOException("Unable to create directory '{$dir}'. " . self::getLastError());
        }
    }
    /**
     * Copies a file or directory.
     * @throws Nette\IOException
     */
    public static function copy(string $source, string $dest, bool $overwrite = \true) : void
    {
        if (\stream_is_local($source) && !\file_exists($source)) {
            throw new \_HumbugBoxb94336daae36\Nette\IOException("File or directory '{$source}' not found.");
        } elseif (!$overwrite && \file_exists($dest)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException("File or directory '{$dest}' already exists.");
        } elseif (\is_dir($source)) {
            static::createDir($dest);
            foreach (new \FilesystemIterator($dest) as $item) {
                static::delete($item->getPathname());
            }
            foreach ($iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($source, \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::SELF_FIRST) as $item) {
                if ($item->isDir()) {
                    static::createDir($dest . '/' . $iterator->getSubPathName());
                } else {
                    static::copy($item->getPathname(), $dest . '/' . $iterator->getSubPathName());
                }
            }
        } else {
            static::createDir(\dirname($dest));
            if (($s = @\fopen($source, 'r')) && ($d = @\fopen($dest, 'w')) && @\stream_copy_to_stream($s, $d) === \false) {
                // @ is escalated to exception
                throw new \_HumbugBoxb94336daae36\Nette\IOException("Unable to copy file '{$source}' to '{$dest}'. " . self::getLastError());
            }
        }
    }
    /**
     * Deletes a file or directory.
     * @throws Nette\IOException
     */
    public static function delete(string $path) : void
    {
        if (\is_file($path) || \is_link($path)) {
            $func = \DIRECTORY_SEPARATOR === '\\' && \is_dir($path) ? 'rmdir' : 'unlink';
            if (!@$func($path)) {
                // @ is escalated to exception
                throw new \_HumbugBoxb94336daae36\Nette\IOException("Unable to delete '{$path}'. " . self::getLastError());
            }
        } elseif (\is_dir($path)) {
            foreach (new \FilesystemIterator($path) as $item) {
                static::delete($item->getPathname());
            }
            if (!@\rmdir($path)) {
                // @ is escalated to exception
                throw new \_HumbugBoxb94336daae36\Nette\IOException("Unable to delete directory '{$path}'. " . self::getLastError());
            }
        }
    }
    /**
     * Renames a file or directory.
     * @throws Nette\IOException
     * @throws Nette\InvalidStateException if the target file or directory already exist
     */
    public static function rename(string $name, string $newName, bool $overwrite = \true) : void
    {
        if (!$overwrite && \file_exists($newName)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException("File or directory '{$newName}' already exists.");
        } elseif (!\file_exists($name)) {
            throw new \_HumbugBoxb94336daae36\Nette\IOException("File or directory '{$name}' not found.");
        } else {
            static::createDir(\dirname($newName));
            if (\realpath($name) !== \realpath($newName)) {
                static::delete($newName);
            }
            if (!@\rename($name, $newName)) {
                // @ is escalated to exception
                throw new \_HumbugBoxb94336daae36\Nette\IOException("Unable to rename file or directory '{$name}' to '{$newName}'. " . self::getLastError());
            }
        }
    }
    /**
     * Reads file content.
     * @throws Nette\IOException
     */
    public static function read(string $file) : string
    {
        $content = @\file_get_contents($file);
        // @ is escalated to exception
        if ($content === \false) {
            throw new \_HumbugBoxb94336daae36\Nette\IOException("Unable to read file '{$file}'. " . self::getLastError());
        }
        return $content;
    }
    /**
     * Writes a string to a file.
     * @throws Nette\IOException
     */
    public static function write(string $file, string $content, ?int $mode = 0666) : void
    {
        static::createDir(\dirname($file));
        if (@\file_put_contents($file, $content) === \false) {
            // @ is escalated to exception
            throw new \_HumbugBoxb94336daae36\Nette\IOException("Unable to write file '{$file}'. " . self::getLastError());
        }
        if ($mode !== null && !@\chmod($file, $mode)) {
            // @ is escalated to exception
            throw new \_HumbugBoxb94336daae36\Nette\IOException("Unable to chmod file '{$file}'. " . self::getLastError());
        }
    }
    /**
     * Is path absolute?
     */
    public static function isAbsolute(string $path) : bool
    {
        return (bool) \preg_match('#([a-z]:)?[/\\\\]|[a-z][a-z0-9+.-]*://#Ai', $path);
    }
    private static function getLastError() : string
    {
        return \preg_replace('#^\\w+\\(.*?\\): #', '', \error_get_last()['message']);
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Utils;

use _HumbugBoxb94336daae36\Nette;
/**
 * Provides objects to work as array.
 */
class ArrayHash extends \stdClass implements \ArrayAccess, \Countable, \IteratorAggregate
{
    /**
     * @return static
     */
    public static function from(array $arr, bool $recursive = \true)
    {
        $obj = new static();
        foreach ($arr as $key => $value) {
            if ($recursive && \is_array($value)) {
                $obj->{$key} = static::from($value, \true);
            } else {
                $obj->{$key} = $value;
            }
        }
        return $obj;
    }
    /**
     * Returns an iterator over all items.
     */
    public function getIterator() : \RecursiveArrayIterator
    {
        return new \RecursiveArrayIterator((array) $this);
    }
    /**
     * Returns items count.
     */
    public function count() : int
    {
        return \count((array) $this);
    }
    /**
     * Replaces or appends a item.
     */
    public function offsetSet($key, $value) : void
    {
        if (!\is_scalar($key)) {
            // prevents null
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException(\sprintf('Key must be either a string or an integer, %s given.', \gettype($key)));
        }
        $this->{$key} = $value;
    }
    /**
     * Returns a item.
     * @return mixed
     */
    public function offsetGet($key)
    {
        return $this->{$key};
    }
    /**
     * Determines whether a item exists.
     */
    public function offsetExists($key) : bool
    {
        return isset($this->{$key});
    }
    /**
     * Removes the element from this list.
     */
    public function offsetUnset($key) : void
    {
        unset($this->{$key});
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Utils;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\MemberAccessException;
/**
 * Nette\SmartObject helpers.
 */
final class ObjectHelpers
{
    use Nette\StaticClass;
    /**
     * @throws MemberAccessException
     */
    public static function strictGet(string $class, string $name) : void
    {
        $rc = new \ReflectionClass($class);
        $hint = self::getSuggestion(\array_merge(\array_filter($rc->getProperties(\ReflectionProperty::IS_PUBLIC), function ($p) {
            return !$p->isStatic();
        }), self::parseFullDoc($rc, '~^[ \\t*]*@property(?:-read)?[ \\t]+(?:\\S+[ \\t]+)??\\$(\\w+)~m')), $name);
        throw new \_HumbugBoxb94336daae36\Nette\MemberAccessException("Cannot read an undeclared property {$class}::\${$name}" . ($hint ? ", did you mean \${$hint}?" : '.'));
    }
    /**
     * @throws MemberAccessException
     */
    public static function strictSet(string $class, string $name) : void
    {
        $rc = new \ReflectionClass($class);
        $hint = self::getSuggestion(\array_merge(\array_filter($rc->getProperties(\ReflectionProperty::IS_PUBLIC), function ($p) {
            return !$p->isStatic();
        }), self::parseFullDoc($rc, '~^[ \\t*]*@property(?:-write)?[ \\t]+(?:\\S+[ \\t]+)??\\$(\\w+)~m')), $name);
        throw new \_HumbugBoxb94336daae36\Nette\MemberAccessException("Cannot write to an undeclared property {$class}::\${$name}" . ($hint ? ", did you mean \${$hint}?" : '.'));
    }
    /**
     * @throws MemberAccessException
     */
    public static function strictCall(string $class, string $method, array $additionalMethods = []) : void
    {
        $hint = self::getSuggestion(\array_merge(\get_class_methods($class), self::parseFullDoc(new \ReflectionClass($class), '~^[ \\t*]*@method[ \\t]+(?:\\S+[ \\t]+)??(\\w+)\\(~m'), $additionalMethods), $method);
        if (\method_exists($class, $method)) {
            // called parent::$method()
            $class = 'parent';
        }
        throw new \_HumbugBoxb94336daae36\Nette\MemberAccessException("Call to undefined method {$class}::{$method}()" . ($hint ? ", did you mean {$hint}()?" : '.'));
    }
    /**
     * @throws MemberAccessException
     */
    public static function strictStaticCall(string $class, string $method) : void
    {
        $hint = self::getSuggestion(\array_filter((new \ReflectionClass($class))->getMethods(\ReflectionMethod::IS_PUBLIC), function ($m) {
            return $m->isStatic();
        }), $method);
        throw new \_HumbugBoxb94336daae36\Nette\MemberAccessException("Call to undefined static method {$class}::{$method}()" . ($hint ? ", did you mean {$hint}()?" : '.'));
    }
    /**
     * Returns array of magic properties defined by annotation @property.
     * @return array of [name => bit mask]
     * @internal
     */
    public static function getMagicProperties(string $class) : array
    {
        static $cache;
        $props =& $cache[$class];
        if ($props !== null) {
            return $props;
        }
        $rc = new \ReflectionClass($class);
        \preg_match_all('~^  [ \\t*]*  @property(|-read|-write)  [ \\t]+  [^\\s$]+  [ \\t]+  \\$  (\\w+)  ()~mx', (string) $rc->getDocComment(), $matches, \PREG_SET_ORDER);
        $props = [];
        foreach ($matches as [, $type, $name]) {
            $uname = \ucfirst($name);
            $write = $type !== '-read' && $rc->hasMethod($nm = 'set' . $uname) && ($rm = $rc->getMethod($nm)) && $rm->getName() === $nm && !$rm->isPrivate() && !$rm->isStatic();
            $read = $type !== '-write' && ($rc->hasMethod($nm = 'get' . $uname) || $rc->hasMethod($nm = 'is' . $uname)) && ($rm = $rc->getMethod($nm)) && $rm->getName() === $nm && !$rm->isPrivate() && !$rm->isStatic();
            if ($read || $write) {
                $props[$name] = $read << 0 | ($nm[0] === 'g') << 1 | $rm->returnsReference() << 2 | $write << 3;
            }
        }
        foreach ($rc->getTraits() as $trait) {
            $props += self::getMagicProperties($trait->getName());
        }
        if ($parent = \get_parent_class($class)) {
            $props += self::getMagicProperties($parent);
        }
        return $props;
    }
    /**
     * Finds the best suggestion (for 8-bit encoding).
     * @param  (\ReflectionFunctionAbstract|\ReflectionParameter|\ReflectionClass|\ReflectionProperty|string)[]  $possibilities
     * @internal
     */
    public static function getSuggestion(array $possibilities, string $value) : ?string
    {
        $norm = \preg_replace($re = '#^(get|set|has|is|add)(?=[A-Z])#', '', $value);
        $best = null;
        $min = (\strlen($value) / 4 + 1) * 10 + 0.1;
        foreach (\array_unique($possibilities, \SORT_REGULAR) as $item) {
            $item = $item instanceof \Reflector ? $item->getName() : $item;
            if ($item !== $value && (($len = \levenshtein($item, $value, 10, 11, 10)) < $min || ($len = \levenshtein(\preg_replace($re, '', $item), $norm, 10, 11, 10) + 20) < $min)) {
                $min = $len;
                $best = $item;
            }
        }
        return $best;
    }
    private static function parseFullDoc(\ReflectionClass $rc, string $pattern) : array
    {
        do {
            $doc[] = $rc->getDocComment();
            $traits = $rc->getTraits();
            while ($trait = \array_pop($traits)) {
                $doc[] = $trait->getDocComment();
                $traits += $trait->getTraits();
            }
        } while ($rc = $rc->getParentClass());
        return \preg_match_all($pattern, \implode($doc), $m) ? $m[1] : [];
    }
    /**
     * Checks if the public non-static property exists.
     * @return bool|string returns 'event' if the property exists and has event like name
     * @internal
     */
    public static function hasProperty(string $class, string $name)
    {
        static $cache;
        $prop =& $cache[$class][$name];
        if ($prop === null) {
            $prop = \false;
            try {
                $rp = new \ReflectionProperty($class, $name);
                if ($rp->isPublic() && !$rp->isStatic()) {
                    $prop = $name >= 'onA' && $name < 'on_' ? 'event' : \true;
                }
            } catch (\ReflectionException $e) {
            }
        }
        return $prop;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Utils;

use _HumbugBoxb94336daae36\Nette;
/**
 * PHP reflection helpers.
 */
final class Reflection
{
    use Nette\StaticClass;
    private const BUILTIN_TYPES = ['string' => 1, 'int' => 1, 'float' => 1, 'bool' => 1, 'array' => 1, 'object' => 1, 'callable' => 1, 'iterable' => 1, 'void' => 1, 'null' => 1];
    public static function isBuiltinType(string $type) : bool
    {
        return isset(self::BUILTIN_TYPES[\strtolower($type)]);
    }
    public static function getReturnType(\ReflectionFunctionAbstract $func) : ?string
    {
        return $func->hasReturnType() ? self::normalizeType($func->getReturnType()->getName(), $func) : null;
    }
    public static function getParameterType(\ReflectionParameter $param) : ?string
    {
        return $param->hasType() ? self::normalizeType($param->getType()->getName(), $param) : null;
    }
    public static function getPropertyType(\ReflectionProperty $prop) : ?string
    {
        return \PHP_VERSION_ID >= 70400 && $prop->hasType() ? self::normalizeType($prop->getType()->getName(), $prop) : null;
    }
    private static function normalizeType(string $type, $reflection) : string
    {
        $lower = \strtolower($type);
        if ($lower === 'self') {
            return $reflection->getDeclaringClass()->getName();
        } elseif ($lower === 'parent' && $reflection->getDeclaringClass()->getParentClass()) {
            return $reflection->getDeclaringClass()->getParentClass()->getName();
        } else {
            return $type;
        }
    }
    /**
     * @return mixed
     * @throws \ReflectionException when default value is not available or resolvable
     */
    public static function getParameterDefaultValue(\ReflectionParameter $param)
    {
        if ($param->isDefaultValueConstant()) {
            $const = $orig = $param->getDefaultValueConstantName();
            $pair = \explode('::', $const);
            if (isset($pair[1])) {
                if (\strtolower($pair[0]) === 'self') {
                    $pair[0] = $param->getDeclaringClass()->getName();
                }
                try {
                    $rcc = new \ReflectionClassConstant($pair[0], $pair[1]);
                } catch (\ReflectionException $e) {
                    $name = self::toString($param);
                    throw new \ReflectionException("Unable to resolve constant {$orig} used as default value of {$name}.", 0, $e);
                }
                return $rcc->getValue();
            } elseif (!\defined($const)) {
                $const = \substr((string) \strrchr($const, '\\'), 1);
                if (!\defined($const)) {
                    $name = self::toString($param);
                    throw new \ReflectionException("Unable to resolve constant {$orig} used as default value of {$name}.");
                }
            }
            return \constant($const);
        }
        return $param->getDefaultValue();
    }
    /**
     * Returns declaring class or trait.
     */
    public static function getPropertyDeclaringClass(\ReflectionProperty $prop) : \ReflectionClass
    {
        foreach ($prop->getDeclaringClass()->getTraits() as $trait) {
            if ($trait->hasProperty($prop->getName()) && $trait->getProperty($prop->getName())->getDocComment() === $prop->getDocComment()) {
                return self::getPropertyDeclaringClass($trait->getProperty($prop->getName()));
            }
        }
        return $prop->getDeclaringClass();
    }
    /**
     * Are documentation comments available?
     */
    public static function areCommentsAvailable() : bool
    {
        static $res;
        return $res === null ? $res = (bool) (new \ReflectionMethod(__METHOD__))->getDocComment() : $res;
    }
    public static function toString(\Reflector $ref) : string
    {
        if ($ref instanceof \ReflectionClass) {
            return $ref->getName();
        } elseif ($ref instanceof \ReflectionMethod) {
            return $ref->getDeclaringClass()->getName() . '::' . $ref->getName();
        } elseif ($ref instanceof \ReflectionFunction) {
            return $ref->getName();
        } elseif ($ref instanceof \ReflectionProperty) {
            return self::getPropertyDeclaringClass($ref)->getName() . '::$' . $ref->getName();
        } elseif ($ref instanceof \ReflectionParameter) {
            return '$' . $ref->getName() . ' in ' . self::toString($ref->getDeclaringFunction()) . '()';
        } else {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException();
        }
    }
    /**
     * Expands class name into full name.
     * @throws Nette\InvalidArgumentException
     */
    public static function expandClassName(string $name, \ReflectionClass $rc) : string
    {
        $lower = \strtolower($name);
        if (empty($name)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Class name must not be empty.');
        } elseif (isset(self::BUILTIN_TYPES[$lower])) {
            return $lower;
        } elseif ($lower === 'self') {
            return $rc->getName();
        } elseif ($name[0] === '\\') {
            // fully qualified name
            return \ltrim($name, '\\');
        }
        $uses = self::getUseStatements($rc);
        $parts = \explode('\\', $name, 2);
        if (isset($uses[$parts[0]])) {
            $parts[0] = $uses[$parts[0]];
            return \implode('\\', $parts);
        } elseif ($rc->inNamespace()) {
            return $rc->getNamespaceName() . '\\' . $name;
        } else {
            return $name;
        }
    }
    /**
     * @return array of [alias => class]
     */
    public static function getUseStatements(\ReflectionClass $class) : array
    {
        if ($class->isAnonymous()) {
            throw new \_HumbugBoxb94336daae36\Nette\NotImplementedException('Anonymous classes are not supported.');
        }
        static $cache = [];
        if (!isset($cache[$name = $class->getName()])) {
            if ($class->isInternal()) {
                $cache[$name] = [];
            } else {
                $code = \file_get_contents($class->getFileName());
                $cache = self::parseUseStatements($code, $name) + $cache;
            }
        }
        return $cache[$name];
    }
    /**
     * Parses PHP code to [class => [alias => class, ...]]
     */
    private static function parseUseStatements(string $code, string $forClass = null) : array
    {
        try {
            $tokens = \token_get_all($code, \TOKEN_PARSE);
        } catch (\ParseError $e) {
            \trigger_error($e->getMessage(), \E_USER_NOTICE);
            $tokens = [];
        }
        $namespace = $class = $classLevel = $level = null;
        $res = $uses = [];
        while ($token = \current($tokens)) {
            \next($tokens);
            switch (\is_array($token) ? $token[0] : $token) {
                case \T_NAMESPACE:
                    $namespace = \ltrim(self::fetch($tokens, [\T_STRING, \T_NS_SEPARATOR]) . '\\', '\\');
                    $uses = [];
                    break;
                case \T_CLASS:
                case \T_INTERFACE:
                case \T_TRAIT:
                    if ($name = self::fetch($tokens, \T_STRING)) {
                        $class = $namespace . $name;
                        $classLevel = $level + 1;
                        $res[$class] = $uses;
                        if ($class === $forClass) {
                            return $res;
                        }
                    }
                    break;
                case \T_USE:
                    while (!$class && ($name = self::fetch($tokens, [\T_STRING, \T_NS_SEPARATOR]))) {
                        $name = \ltrim($name, '\\');
                        if (self::fetch($tokens, '{')) {
                            while ($suffix = self::fetch($tokens, [\T_STRING, \T_NS_SEPARATOR])) {
                                if (self::fetch($tokens, \T_AS)) {
                                    $uses[self::fetch($tokens, \T_STRING)] = $name . $suffix;
                                } else {
                                    $tmp = \explode('\\', $suffix);
                                    $uses[\end($tmp)] = $name . $suffix;
                                }
                                if (!self::fetch($tokens, ',')) {
                                    break;
                                }
                            }
                        } elseif (self::fetch($tokens, \T_AS)) {
                            $uses[self::fetch($tokens, \T_STRING)] = $name;
                        } else {
                            $tmp = \explode('\\', $name);
                            $uses[\end($tmp)] = $name;
                        }
                        if (!self::fetch($tokens, ',')) {
                            break;
                        }
                    }
                    break;
                case \T_CURLY_OPEN:
                case \T_DOLLAR_OPEN_CURLY_BRACES:
                case '{':
                    $level++;
                    break;
                case '}':
                    if ($level === $classLevel) {
                        $class = $classLevel = null;
                    }
                    $level--;
            }
        }
        return $res;
    }
    private static function fetch(&$tokens, $take)
    {
        $res = null;
        while ($token = \current($tokens)) {
            [$token, $s] = \is_array($token) ? $token : [$token, $token];
            if (\in_array($token, (array) $take, \true)) {
                $res .= $s;
            } elseif (!\in_array($token, [\T_DOC_COMMENT, \T_WHITESPACE, \T_COMMENT], \true)) {
                break;
            }
            \next($tokens);
        }
        return $res;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Utils;

use _HumbugBoxb94336daae36\Nette;
use function is_array, is_object, strlen;
/**
 * String tools library.
 */
class Strings
{
    use Nette\StaticClass;
    public const TRIM_CHARACTERS = " \t\n\r\0\v ";
    /**
     * Checks if the string is valid for UTF-8 encoding.
     */
    public static function checkEncoding(string $s) : bool
    {
        return $s === self::fixEncoding($s);
    }
    /**
     * Removes invalid code unit sequences from UTF-8 string.
     */
    public static function fixEncoding(string $s) : string
    {
        // removes xD800-xDFFF, x110000 and higher
        return \htmlspecialchars_decode(\htmlspecialchars($s, \ENT_NOQUOTES | \ENT_IGNORE, 'UTF-8'), \ENT_NOQUOTES);
    }
    /**
     * Returns a specific character in UTF-8 from code point (0x0 to 0xD7FF or 0xE000 to 0x10FFFF).
     * @throws Nette\InvalidArgumentException if code point is not in valid range
     */
    public static function chr(int $code) : string
    {
        if ($code < 0 || $code >= 0xd800 && $code <= 0xdfff || $code > 0x10ffff) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Code point must be in range 0x0 to 0xD7FF or 0xE000 to 0x10FFFF.');
        }
        return \iconv('UTF-32BE', 'UTF-8//IGNORE', \pack('N', $code));
    }
    /**
     * Starts the $haystack string with the prefix $needle?
     */
    public static function startsWith(string $haystack, string $needle) : bool
    {
        return \strncmp($haystack, $needle, \strlen($needle)) === 0;
    }
    /**
     * Ends the $haystack string with the suffix $needle?
     */
    public static function endsWith(string $haystack, string $needle) : bool
    {
        return \strlen($needle) === 0 || \substr($haystack, -\strlen($needle)) === $needle;
    }
    /**
     * Does $haystack contain $needle?
     */
    public static function contains(string $haystack, string $needle) : bool
    {
        return \strpos($haystack, $needle) !== \false;
    }
    /**
     * Returns a part of UTF-8 string.
     */
    public static function substring(string $s, int $start, int $length = null) : string
    {
        if (\function_exists('mb_substr')) {
            return \mb_substr($s, $start, $length, 'UTF-8');
            // MB is much faster
        } elseif ($length === null) {
            $length = self::length($s);
        } elseif ($start < 0 && $length < 0) {
            $start += self::length($s);
            // unifies iconv_substr behavior with mb_substr
        }
        return \iconv_substr($s, $start, $length, 'UTF-8');
    }
    /**
     * Removes special controls characters and normalizes line endings, spaces and normal form to NFC in UTF-8 string.
     */
    public static function normalize(string $s) : string
    {
        // convert to compressed normal form (NFC)
        if (\class_exists('Normalizer', \false)) {
            $s = \Normalizer::normalize($s, \Normalizer::FORM_C);
        }
        $s = self::normalizeNewLines($s);
        // remove control characters; leave \t + \n
        $s = \preg_replace('#[\\x00-\\x08\\x0B-\\x1F\\x7F-\\x9F]+#u', '', $s);
        // right trim
        $s = \preg_replace('#[\\t ]+$#m', '', $s);
        // leading and trailing blank lines
        $s = \trim($s, "\n");
        return $s;
    }
    /**
     * Standardize line endings to unix-like.
     */
    public static function normalizeNewLines(string $s) : string
    {
        return \str_replace(["\r\n", "\r"], "\n", $s);
    }
    /**
     * Converts UTF-8 string to ASCII.
     */
    public static function toAscii(string $s) : string
    {
        static $transliterator = null;
        if ($transliterator === null && \class_exists('Transliterator', \false)) {
            $transliterator = \Transliterator::create('Any-Latin; Latin-ASCII');
        }
        $s = \preg_replace('#[^\\x09\\x0A\\x0D\\x20-\\x7E\\xA0-\\x{2FF}\\x{370}-\\x{10FFFF}]#u', '', $s);
        $s = \strtr($s, '`\'"^~?', "\1\2\3\4\5\6");
        $s = \str_replace(["„", "“", "”", "‚", "‘", "’", "°"], ["\3", "\3", "\3", "\2", "\2", "\2", "\4"], $s);
        if ($transliterator !== null) {
            $s = $transliterator->transliterate($s);
        }
        if (\ICONV_IMPL === 'glibc') {
            $s = \str_replace(["»", "«", "…", "™", "©", "®"], ['>>', '<<', '...', 'TM', '(c)', '(R)'], $s);
            $s = \iconv('UTF-8', 'WINDOWS-1250//TRANSLIT//IGNORE', $s);
            $s = \strtr($s, "" . "" . "" . "" . "", 'ALLSSSSTZZZallssstzzzRAAAALCCCEEEEIIDDNNOOOOxRUUUUYTsraaaalccceeeeiiddnnooooruuuuyt- <->|-.');
            $s = \preg_replace('#[^\\x00-\\x7F]++#', '', $s);
        } else {
            $s = \iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $s);
        }
        $s = \str_replace(['`', "'", '"', '^', '~', '?'], '', $s);
        return \strtr($s, "\1\2\3\4\5\6", '`\'"^~?');
    }
    /**
     * Converts UTF-8 string to web safe characters [a-z0-9-] text.
     */
    public static function webalize(string $s, string $charlist = null, bool $lower = \true) : string
    {
        $s = self::toAscii($s);
        if ($lower) {
            $s = \strtolower($s);
        }
        $s = \preg_replace('#[^a-z0-9' . ($charlist !== null ? \preg_quote($charlist, '#') : '') . ']+#i', '-', $s);
        $s = \trim($s, '-');
        return $s;
    }
    /**
     * Truncates UTF-8 string to maximal length.
     */
    public static function truncate(string $s, int $maxLen, string $append = "…") : string
    {
        if (self::length($s) > $maxLen) {
            $maxLen = $maxLen - self::length($append);
            if ($maxLen < 1) {
                return $append;
            } elseif ($matches = self::match($s, '#^.{1,' . $maxLen . '}(?=[\\s\\x00-/:-@\\[-`{-~])#us')) {
                return $matches[0] . $append;
            } else {
                return self::substring($s, 0, $maxLen) . $append;
            }
        }
        return $s;
    }
    /**
     * Indents UTF-8 string from the left.
     */
    public static function indent(string $s, int $level = 1, string $chars = "\t") : string
    {
        if ($level > 0) {
            $s = self::replace($s, '#(?:^|[\\r\\n]+)(?=[^\\r\\n])#', '$0' . \str_repeat($chars, $level));
        }
        return $s;
    }
    /**
     * Converts UTF-8 string to lower case.
     */
    public static function lower(string $s) : string
    {
        return \mb_strtolower($s, 'UTF-8');
    }
    /**
     * Converts first character to lower case.
     */
    public static function firstLower(string $s) : string
    {
        return self::lower(self::substring($s, 0, 1)) . self::substring($s, 1);
    }
    /**
     * Converts UTF-8 string to upper case.
     */
    public static function upper(string $s) : string
    {
        return \mb_strtoupper($s, 'UTF-8');
    }
    /**
     * Converts first character to upper case.
     */
    public static function firstUpper(string $s) : string
    {
        return self::upper(self::substring($s, 0, 1)) . self::substring($s, 1);
    }
    /**
     * Capitalizes UTF-8 string.
     */
    public static function capitalize(string $s) : string
    {
        return \mb_convert_case($s, \MB_CASE_TITLE, 'UTF-8');
    }
    /**
     * Case-insensitive compares UTF-8 strings.
     */
    public static function compare(string $left, string $right, int $len = null) : bool
    {
        if (\class_exists('Normalizer', \false)) {
            $left = \Normalizer::normalize($left, \Normalizer::FORM_D);
            // form NFD is faster
            $right = \Normalizer::normalize($right, \Normalizer::FORM_D);
            // form NFD is faster
        }
        if ($len < 0) {
            $left = self::substring($left, $len, -$len);
            $right = self::substring($right, $len, -$len);
        } elseif ($len !== null) {
            $left = self::substring($left, 0, $len);
            $right = self::substring($right, 0, $len);
        }
        return self::lower($left) === self::lower($right);
    }
    /**
     * Finds the length of common prefix of strings.
     * @param  string[]  $strings
     */
    public static function findPrefix(array $strings) : string
    {
        $first = \array_shift($strings);
        for ($i = 0; $i < \strlen($first); $i++) {
            foreach ($strings as $s) {
                if (!isset($s[$i]) || $first[$i] !== $s[$i]) {
                    while ($i && $first[$i - 1] >= "" && $first[$i] >= "" && $first[$i] < "") {
                        $i--;
                    }
                    return \substr($first, 0, $i);
                }
            }
        }
        return $first;
    }
    /**
     * Returns number of characters (not bytes) in UTF-8 string.
     * That is the number of Unicode code points which may differ from the number of graphemes.
     */
    public static function length(string $s) : int
    {
        return \function_exists('mb_strlen') ? \mb_strlen($s, 'UTF-8') : \strlen(\utf8_decode($s));
    }
    /**
     * Strips whitespace from UTF-8 string.
     */
    public static function trim(string $s, string $charlist = self::TRIM_CHARACTERS) : string
    {
        $charlist = \preg_quote($charlist, '#');
        return self::replace($s, '#^[' . $charlist . ']+|[' . $charlist . ']+\\z#u', '');
    }
    /**
     * Pad a UTF-8 string to a certain length with another string.
     */
    public static function padLeft(string $s, int $length, string $pad = ' ') : string
    {
        $length = \max(0, $length - self::length($s));
        $padLen = self::length($pad);
        return \str_repeat($pad, (int) ($length / $padLen)) . self::substring($pad, 0, $length % $padLen) . $s;
    }
    /**
     * Pad a UTF-8 string to a certain length with another string.
     */
    public static function padRight(string $s, int $length, string $pad = ' ') : string
    {
        $length = \max(0, $length - self::length($s));
        $padLen = self::length($pad);
        return $s . \str_repeat($pad, (int) ($length / $padLen)) . self::substring($pad, 0, $length % $padLen);
    }
    /**
     * Reverse string.
     */
    public static function reverse(string $s) : string
    {
        return \iconv('UTF-32LE', 'UTF-8', \strrev(\iconv('UTF-8', 'UTF-32BE', $s)));
    }
    /**
     * Returns part of $haystack before $nth occurence of $needle (negative value means searching from the end).
     * @return string|null  returns null if the needle was not found
     */
    public static function before(string $haystack, string $needle, int $nth = 1) : ?string
    {
        $pos = self::pos($haystack, $needle, $nth);
        return $pos === null ? null : \substr($haystack, 0, $pos);
    }
    /**
     * Returns part of $haystack after $nth occurence of $needle (negative value means searching from the end).
     * @return string|null  returns null if the needle was not found
     */
    public static function after(string $haystack, string $needle, int $nth = 1) : ?string
    {
        $pos = self::pos($haystack, $needle, $nth);
        return $pos === null ? null : \substr($haystack, $pos + \strlen($needle));
    }
    /**
     * Returns position of $nth occurence of $needle in $haystack (negative value means searching from the end).
     * @return int|null  offset in characters or null if the needle was not found
     */
    public static function indexOf(string $haystack, string $needle, int $nth = 1) : ?int
    {
        $pos = self::pos($haystack, $needle, $nth);
        return $pos === null ? null : self::length(\substr($haystack, 0, $pos));
    }
    /**
     * Returns position of $nth occurence of $needle in $haystack.
     * @return int|null  offset in bytes or null if the needle was not found
     */
    private static function pos(string $haystack, string $needle, int $nth = 1) : ?int
    {
        if (!$nth) {
            return null;
        } elseif ($nth > 0) {
            if (\strlen($needle) === 0) {
                return 0;
            }
            $pos = 0;
            while (($pos = \strpos($haystack, $needle, $pos)) !== \false && --$nth) {
                $pos++;
            }
        } else {
            $len = \strlen($haystack);
            if (\strlen($needle) === 0) {
                return $len;
            }
            $pos = $len - 1;
            while (($pos = \strrpos($haystack, $needle, $pos - $len)) !== \false && ++$nth) {
                $pos--;
            }
        }
        return $pos === \false ? null : $pos;
    }
    /**
     * Splits string by a regular expression.
     */
    public static function split(string $subject, string $pattern, int $flags = 0) : array
    {
        return self::pcre('preg_split', [$pattern, $subject, -1, $flags | \PREG_SPLIT_DELIM_CAPTURE]);
    }
    /**
     * Performs a regular expression match. Accepts flag PREG_OFFSET_CAPTURE (returned in bytes).
     */
    public static function match(string $subject, string $pattern, int $flags = 0, int $offset = 0) : ?array
    {
        if ($offset > \strlen($subject)) {
            return null;
        }
        return self::pcre('preg_match', [$pattern, $subject, &$m, $flags, $offset]) ? $m : null;
    }
    /**
     * Performs a global regular expression match. Accepts flag PREG_OFFSET_CAPTURE (returned in bytes), PREG_SET_ORDER is default.
     */
    public static function matchAll(string $subject, string $pattern, int $flags = 0, int $offset = 0) : array
    {
        if ($offset > \strlen($subject)) {
            return [];
        }
        self::pcre('preg_match_all', [$pattern, $subject, &$m, $flags & \PREG_PATTERN_ORDER ? $flags : $flags | \PREG_SET_ORDER, $offset]);
        return $m;
    }
    /**
     * Perform a regular expression search and replace.
     * @param  string|array  $pattern
     * @param  string|callable  $replacement
     */
    public static function replace(string $subject, $pattern, $replacement = null, int $limit = -1) : string
    {
        if (\is_object($replacement) || \is_array($replacement)) {
            if (!\is_callable($replacement, \false, $textual)) {
                throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException("Callback '{$textual}' is not callable.");
            }
            return self::pcre('preg_replace_callback', [$pattern, $replacement, $subject, $limit]);
        } elseif ($replacement === null && \is_array($pattern)) {
            $replacement = \array_values($pattern);
            $pattern = \array_keys($pattern);
        }
        return self::pcre('preg_replace', [$pattern, $replacement, $subject, $limit]);
    }
    /** @internal */
    public static function pcre(string $func, array $args)
    {
        $res = \_HumbugBoxb94336daae36\Nette\Utils\Callback::invokeSafe($func, $args, function (string $message) use($args) : void {
            // compile-time error, not detectable by preg_last_error
            throw new \_HumbugBoxb94336daae36\Nette\Utils\RegexpException($message . ' in pattern: ' . \implode(' or ', (array) $args[0]));
        });
        if (($code = \preg_last_error()) && ($res === null || !\in_array($func, ['preg_filter', 'preg_replace_callback', 'preg_replace'], \true))) {
            throw new \_HumbugBoxb94336daae36\Nette\Utils\RegexpException((\_HumbugBoxb94336daae36\Nette\Utils\RegexpException::MESSAGES[$code] ?? 'Unknown error') . ' (pattern: ' . \implode(' or ', (array) $args[0]) . ')', $code);
        }
        return $res;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Utils;

use _HumbugBoxb94336daae36\Nette;
/**
 * Secure random string generator.
 */
final class Random
{
    use Nette\StaticClass;
    /**
     * Generate random string.
     */
    public static function generate(int $length = 10, string $charlist = '0-9a-z') : string
    {
        $charlist = \count_chars(\preg_replace_callback('#.-.#', function (array $m) : string {
            return \implode('', \range($m[0][0], $m[0][2]));
        }, $charlist), 3);
        $chLen = \strlen($charlist);
        if ($length < 1) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Length must be greater than zero.');
        } elseif ($chLen < 2) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Character list must contain at least two chars.');
        }
        $res = '';
        for ($i = 0; $i < $length; $i++) {
            $res .= $charlist[\random_int(0, $chLen - 1)];
        }
        return $res;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Localization;

/**
 * Translator adapter.
 */
interface ITranslator
{
    /**
     * Translates the given string.
     */
    function translate($message, ...$parameters) : string;
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette;

use _HumbugBoxb94336daae36\Nette\Utils\ObjectHelpers;
/**
 * Strict class for better experience.
 * - 'did you mean' hints
 * - access to undeclared members throws exceptions
 * - support for @property annotations
 * - support for calling event handlers stored in $onEvent via onEvent()
 */
trait SmartObject
{
    /**
     * @throws MemberAccessException
     */
    public function __call(string $name, array $args)
    {
        $class = \get_class($this);
        if (\_HumbugBoxb94336daae36\Nette\Utils\ObjectHelpers::hasProperty($class, $name) === 'event') {
            // calling event handlers
            if (\is_iterable($this->{$name})) {
                foreach ($this->{$name} as $handler) {
                    $handler(...$args);
                }
            } elseif ($this->{$name} !== null) {
                throw new \_HumbugBoxb94336daae36\Nette\UnexpectedValueException("Property {$class}::\${$name} must be iterable or null, " . \gettype($this->{$name}) . ' given.');
            }
        } else {
            \_HumbugBoxb94336daae36\Nette\Utils\ObjectHelpers::strictCall($class, $name);
        }
    }
    /**
     * @throws MemberAccessException
     */
    public static function __callStatic(string $name, array $args)
    {
        \_HumbugBoxb94336daae36\Nette\Utils\ObjectHelpers::strictStaticCall(static::class, $name);
    }
    /**
     * @return mixed
     * @throws MemberAccessException if the property is not defined.
     */
    public function &__get(string $name)
    {
        $class = \get_class($this);
        if ($prop = \_HumbugBoxb94336daae36\Nette\Utils\ObjectHelpers::getMagicProperties($class)[$name] ?? null) {
            // property getter
            if (!($prop & 0b1)) {
                throw new \_HumbugBoxb94336daae36\Nette\MemberAccessException("Cannot read a write-only property {$class}::\${$name}.");
            }
            $m = ($prop & 0b10 ? 'get' : 'is') . $name;
            if ($prop & 0b100) {
                // return by reference
                return $this->{$m}();
            } else {
                $val = $this->{$m}();
                return $val;
            }
        } else {
            \_HumbugBoxb94336daae36\Nette\Utils\ObjectHelpers::strictGet($class, $name);
        }
    }
    /**
     * @return void
     * @throws MemberAccessException if the property is not defined or is read-only
     */
    public function __set(string $name, $value)
    {
        $class = \get_class($this);
        if (\_HumbugBoxb94336daae36\Nette\Utils\ObjectHelpers::hasProperty($class, $name)) {
            // unsetted property
            $this->{$name} = $value;
        } elseif ($prop = \_HumbugBoxb94336daae36\Nette\Utils\ObjectHelpers::getMagicProperties($class)[$name] ?? null) {
            // property setter
            if (!($prop & 0b1000)) {
                throw new \_HumbugBoxb94336daae36\Nette\MemberAccessException("Cannot write to a read-only property {$class}::\${$name}.");
            }
            $this->{'set' . $name}($value);
        } else {
            \_HumbugBoxb94336daae36\Nette\Utils\ObjectHelpers::strictSet($class, $name);
        }
    }
    /**
     * @return void
     * @throws MemberAccessException
     */
    public function __unset(string $name)
    {
        $class = \get_class($this);
        if (!\_HumbugBoxb94336daae36\Nette\Utils\ObjectHelpers::hasProperty($class, $name)) {
            throw new \_HumbugBoxb94336daae36\Nette\MemberAccessException("Cannot unset the property {$class}::\${$name}.");
        }
    }
    public function __isset(string $name) : bool
    {
        return isset(\_HumbugBoxb94336daae36\Nette\Utils\ObjectHelpers::getMagicProperties(\get_class($this))[$name]);
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Utils;

use _HumbugBoxb94336daae36\Nette;
use function is_array, is_float, is_object, is_string;
/**
 * HTML helper.
 *
 * <code>
 * $el = Html::el('a')->href($link)->setText('Nette');
 * $el->class = 'myclass';
 * echo $el;
 *
 * echo $el->startTag(), $el->endTag();
 * </code>
 */
class Html implements \ArrayAccess, \Countable, \IteratorAggregate, \_HumbugBoxb94336daae36\Nette\Utils\IHtmlString
{
    use Nette\SmartObject;
    /** @var array  element's attributes */
    public $attrs = [];
    /** @var bool  use XHTML syntax? */
    public static $xhtml = \false;
    /** @var array  empty (void) elements */
    public static $emptyElements = ['img' => 1, 'hr' => 1, 'br' => 1, 'input' => 1, 'meta' => 1, 'area' => 1, 'embed' => 1, 'keygen' => 1, 'source' => 1, 'base' => 1, 'col' => 1, 'link' => 1, 'param' => 1, 'basefont' => 1, 'frame' => 1, 'isindex' => 1, 'wbr' => 1, 'command' => 1, 'track' => 1];
    /** @var array  of Html | string nodes */
    protected $children = [];
    /** @var string  element's name */
    private $name;
    /** @var bool  is element empty? */
    private $isEmpty;
    /**
     * Static factory.
     * @param  array|string $attrs element's attributes or plain text content
     * @return static
     */
    public static function el(string $name = null, $attrs = null)
    {
        $el = new static();
        $parts = \explode(' ', (string) $name, 2);
        $el->setName($parts[0]);
        if (\is_array($attrs)) {
            $el->attrs = $attrs;
        } elseif ($attrs !== null) {
            $el->setText($attrs);
        }
        if (isset($parts[1])) {
            foreach (\_HumbugBoxb94336daae36\Nette\Utils\Strings::matchAll($parts[1] . ' ', '#([a-z0-9:-]+)(?:=(["\'])?(.*?)(?(2)\\2|\\s))?#i') as $m) {
                $el->attrs[$m[1]] = $m[3] ?? \true;
            }
        }
        return $el;
    }
    /**
     * Changes element's name.
     * @return static
     */
    public final function setName(string $name, bool $isEmpty = null)
    {
        $this->name = $name;
        $this->isEmpty = $isEmpty === null ? isset(static::$emptyElements[$name]) : $isEmpty;
        return $this;
    }
    /**
     * Returns element's name.
     */
    public final function getName() : string
    {
        return $this->name;
    }
    /**
     * Is element empty?
     */
    public final function isEmpty() : bool
    {
        return $this->isEmpty;
    }
    /**
     * Sets multiple attributes.
     * @return static
     */
    public function addAttributes(array $attrs)
    {
        $this->attrs = \array_merge($this->attrs, $attrs);
        return $this;
    }
    /**
     * Appends value to element's attribute.
     * @return static
     */
    public function appendAttribute(string $name, $value, $option = \true)
    {
        if (\is_array($value)) {
            $prev = isset($this->attrs[$name]) ? (array) $this->attrs[$name] : [];
            $this->attrs[$name] = $value + $prev;
        } elseif ((string) $value === '') {
            $tmp =& $this->attrs[$name];
            // appending empty value? -> ignore, but ensure it exists
        } elseif (!isset($this->attrs[$name]) || \is_array($this->attrs[$name])) {
            // needs array
            $this->attrs[$name][$value] = $option;
        } else {
            $this->attrs[$name] = [$this->attrs[$name] => \true, $value => $option];
        }
        return $this;
    }
    /**
     * Sets element's attribute.
     * @return static
     */
    public function setAttribute(string $name, $value)
    {
        $this->attrs[$name] = $value;
        return $this;
    }
    /**
     * Returns element's attribute.
     * @return mixed
     */
    public function getAttribute(string $name)
    {
        return $this->attrs[$name] ?? null;
    }
    /**
     * Unsets element's attribute.
     * @return static
     */
    public function removeAttribute(string $name)
    {
        unset($this->attrs[$name]);
        return $this;
    }
    /**
     * Unsets element's attributes.
     * @return static
     */
    public function removeAttributes(array $attributes)
    {
        foreach ($attributes as $name) {
            unset($this->attrs[$name]);
        }
        return $this;
    }
    /**
     * Overloaded setter for element's attribute.
     */
    public final function __set(string $name, $value) : void
    {
        $this->attrs[$name] = $value;
    }
    /**
     * Overloaded getter for element's attribute.
     * @return mixed
     */
    public final function &__get(string $name)
    {
        return $this->attrs[$name];
    }
    /**
     * Overloaded tester for element's attribute.
     */
    public final function __isset(string $name) : bool
    {
        return isset($this->attrs[$name]);
    }
    /**
     * Overloaded unsetter for element's attribute.
     */
    public final function __unset(string $name) : void
    {
        unset($this->attrs[$name]);
    }
    /**
     * Overloaded setter for element's attribute.
     * @return mixed
     */
    public final function __call(string $m, array $args)
    {
        $p = \substr($m, 0, 3);
        if ($p === 'get' || $p === 'set' || $p === 'add') {
            $m = \substr($m, 3);
            $m[0] = $m[0] | " ";
            if ($p === 'get') {
                return $this->attrs[$m] ?? null;
            } elseif ($p === 'add') {
                $args[] = \true;
            }
        }
        if (\count($args) === 0) {
            // invalid
        } elseif (\count($args) === 1) {
            // set
            $this->attrs[$m] = $args[0];
        } else {
            // add
            $this->appendAttribute($m, $args[0], $args[1]);
        }
        return $this;
    }
    /**
     * Special setter for element's attribute.
     * @return static
     */
    public final function href(string $path, array $query = null)
    {
        if ($query) {
            $query = \http_build_query($query, '', '&');
            if ($query !== '') {
                $path .= '?' . $query;
            }
        }
        $this->attrs['href'] = $path;
        return $this;
    }
    /**
     * Setter for data-* attributes. Booleans are converted to 'true' resp. 'false'.
     * @return static
     */
    public function data(string $name, $value = null)
    {
        if (\func_num_args() === 1) {
            $this->attrs['data'] = $name;
        } else {
            $this->attrs["data-{$name}"] = \is_bool($value) ? \json_encode($value) : $value;
        }
        return $this;
    }
    /**
     * Sets element's HTML content.
     * @param  IHtmlString|string  $html
     * @return static
     */
    public final function setHtml($html)
    {
        $this->children = [(string) $html];
        return $this;
    }
    /**
     * Returns element's HTML content.
     */
    public final function getHtml() : string
    {
        return \implode('', $this->children);
    }
    /**
     * Sets element's textual content.
     * @param  IHtmlString|string|int|float  $text
     * @return static
     */
    public final function setText($text)
    {
        if (!$text instanceof \_HumbugBoxb94336daae36\Nette\Utils\IHtmlString) {
            $text = \htmlspecialchars((string) $text, \ENT_NOQUOTES, 'UTF-8');
        }
        $this->children = [(string) $text];
        return $this;
    }
    /**
     * Returns element's textual content.
     */
    public final function getText() : string
    {
        return \html_entity_decode(\strip_tags($this->getHtml()), \ENT_QUOTES, 'UTF-8');
    }
    /**
     * Adds new element's child.
     * @param  IHtmlString|string  $child  Html node or raw HTML string
     * @return static
     */
    public final function addHtml($child)
    {
        return $this->insert(null, $child);
    }
    /**
     * Appends plain-text string to element content.
     * @param  IHtmlString|string|int|float  $text
     * @return static
     */
    public function addText($text)
    {
        if (!$text instanceof \_HumbugBoxb94336daae36\Nette\Utils\IHtmlString) {
            $text = \htmlspecialchars((string) $text, \ENT_NOQUOTES, 'UTF-8');
        }
        return $this->insert(null, $text);
    }
    /**
     * Creates and adds a new Html child.
     * @param  array|string $attrs  element's attributes or raw HTML string
     * @return static  created element
     */
    public final function create(string $name, $attrs = null)
    {
        $this->insert(null, $child = static::el($name, $attrs));
        return $child;
    }
    /**
     * Inserts child node.
     * @param  IHtmlString|string $child Html node or raw HTML string
     * @return static
     */
    public function insert(int $index = null, $child, bool $replace = \false)
    {
        $child = $child instanceof self ? $child : (string) $child;
        if ($index === null) {
            // append
            $this->children[] = $child;
        } else {
            // insert or replace
            \array_splice($this->children, $index, $replace ? 1 : 0, [$child]);
        }
        return $this;
    }
    /**
     * Inserts (replaces) child node (\ArrayAccess implementation).
     * @param  int|null  $index  position or null for appending
     * @param  Html|string  $child  Html node or raw HTML string
     */
    public final function offsetSet($index, $child) : void
    {
        $this->insert($index, $child, \true);
    }
    /**
     * Returns child node (\ArrayAccess implementation).
     * @param  int  $index
     * @return static|string
     */
    public final function offsetGet($index)
    {
        return $this->children[$index];
    }
    /**
     * Exists child node? (\ArrayAccess implementation).
     * @param  int  $index
     */
    public final function offsetExists($index) : bool
    {
        return isset($this->children[$index]);
    }
    /**
     * Removes child node (\ArrayAccess implementation).
     * @param  int  $index
     */
    public function offsetUnset($index) : void
    {
        if (isset($this->children[$index])) {
            \array_splice($this->children, $index, 1);
        }
    }
    /**
     * Returns children count.
     */
    public final function count() : int
    {
        return \count($this->children);
    }
    /**
     * Removes all children.
     */
    public function removeChildren() : void
    {
        $this->children = [];
    }
    /**
     * Iterates over elements.
     */
    public final function getIterator() : \ArrayIterator
    {
        return new \ArrayIterator($this->children);
    }
    /**
     * Returns all children.
     */
    public final function getChildren() : array
    {
        return $this->children;
    }
    /**
     * Renders element's start tag, content and end tag.
     */
    public final function render(int $indent = null) : string
    {
        $s = $this->startTag();
        if (!$this->isEmpty) {
            // add content
            if ($indent !== null) {
                $indent++;
            }
            foreach ($this->children as $child) {
                if ($child instanceof self) {
                    $s .= $child->render($indent);
                } else {
                    $s .= $child;
                }
            }
            // add end tag
            $s .= $this->endTag();
        }
        if ($indent !== null) {
            return "\n" . \str_repeat("\t", $indent - 1) . $s . "\n" . \str_repeat("\t", \max(0, $indent - 2));
        }
        return $s;
    }
    public final function __toString() : string
    {
        try {
            return $this->render();
        } catch (\Throwable $e) {
            \trigger_error('Exception in ' . __METHOD__ . "(): {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}", \E_USER_ERROR);
        }
    }
    /**
     * Returns element's start tag.
     */
    public final function startTag() : string
    {
        if ($this->name) {
            return '<' . $this->name . $this->attributes() . (static::$xhtml && $this->isEmpty ? ' />' : '>');
        } else {
            return '';
        }
    }
    /**
     * Returns element's end tag.
     */
    public final function endTag() : string
    {
        return $this->name && !$this->isEmpty ? '</' . $this->name . '>' : '';
    }
    /**
     * Returns element's attributes.
     * @internal
     */
    public final function attributes() : string
    {
        if (!\is_array($this->attrs)) {
            return '';
        }
        $s = '';
        $attrs = $this->attrs;
        foreach ($attrs as $key => $value) {
            if ($value === null || $value === \false) {
                continue;
            } elseif ($value === \true) {
                if (static::$xhtml) {
                    $s .= ' ' . $key . '="' . $key . '"';
                } else {
                    $s .= ' ' . $key;
                }
                continue;
            } elseif (\is_array($value)) {
                if (\strncmp($key, 'data-', 5) === 0) {
                    $value = \_HumbugBoxb94336daae36\Nette\Utils\Json::encode($value);
                } else {
                    $tmp = null;
                    foreach ($value as $k => $v) {
                        if ($v != null) {
                            // intentionally ==, skip nulls & empty string
                            // composite 'style' vs. 'others'
                            $tmp[] = $v === \true ? $k : (\is_string($k) ? $k . ':' . $v : $v);
                        }
                    }
                    if ($tmp === null) {
                        continue;
                    }
                    $value = \implode($key === 'style' || !\strncmp($key, 'on', 2) ? ';' : ' ', $tmp);
                }
            } elseif (\is_float($value)) {
                $value = \rtrim(\rtrim(\number_format($value, 10, '.', ''), '0'), '.');
            } else {
                $value = (string) $value;
            }
            $q = \strpos($value, '"') === \false ? '"' : "'";
            $s .= ' ' . $key . '=' . $q . \str_replace(['&', $q, '<'], ['&amp;', $q === '"' ? '&quot;' : '&#39;', self::$xhtml ? '&lt;' : '<'], $value) . (\strpos($value, '`') !== \false && \strpbrk($value, ' <>"\'') === \false ? ' ' : '') . $q;
        }
        $s = \str_replace('@', '&#64;', $s);
        return $s;
    }
    /**
     * Clones all children too.
     */
    public function __clone()
    {
        foreach ($this->children as $key => $value) {
            if (\is_object($value)) {
                $this->children[$key] = clone $value;
            }
        }
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Utils;

use _HumbugBoxb94336daae36\Nette;
/**
 * Validation utilities.
 */
class Validators
{
    use Nette\StaticClass;
    protected static $validators = [
        // PHP types
        'array' => 'is_array',
        'bool' => 'is_bool',
        'boolean' => 'is_bool',
        'float' => 'is_float',
        'int' => 'is_int',
        'integer' => 'is_int',
        'null' => 'is_null',
        'object' => 'is_object',
        'resource' => 'is_resource',
        'scalar' => 'is_scalar',
        'string' => 'is_string',
        // pseudo-types
        'callable' => [__CLASS__, 'isCallable'],
        'iterable' => 'is_iterable',
        'list' => [\_HumbugBoxb94336daae36\Nette\Utils\Arrays::class, 'isList'],
        'mixed' => [__CLASS__, 'isMixed'],
        'none' => [__CLASS__, 'isNone'],
        'number' => [__CLASS__, 'isNumber'],
        'numeric' => [__CLASS__, 'isNumeric'],
        'numericint' => [__CLASS__, 'isNumericInt'],
        // string patterns
        'alnum' => 'ctype_alnum',
        'alpha' => 'ctype_alpha',
        'digit' => 'ctype_digit',
        'lower' => 'ctype_lower',
        'pattern' => null,
        'space' => 'ctype_space',
        'unicode' => [__CLASS__, 'isUnicode'],
        'upper' => 'ctype_upper',
        'xdigit' => 'ctype_xdigit',
        // syntax validation
        'email' => [__CLASS__, 'isEmail'],
        'identifier' => [__CLASS__, 'isPhpIdentifier'],
        'uri' => [__CLASS__, 'isUri'],
        'url' => [__CLASS__, 'isUrl'],
        // environment validation
        'class' => 'class_exists',
        'interface' => 'interface_exists',
        'directory' => 'is_dir',
        'file' => 'is_file',
        'type' => [__CLASS__, 'isType'],
    ];
    protected static $counters = ['string' => 'strlen', 'unicode' => [\_HumbugBoxb94336daae36\Nette\Utils\Strings::class, 'length'], 'array' => 'count', 'list' => 'count', 'alnum' => 'strlen', 'alpha' => 'strlen', 'digit' => 'strlen', 'lower' => 'strlen', 'space' => 'strlen', 'upper' => 'strlen', 'xdigit' => 'strlen'];
    /**
     * Throws exception if a variable is of unexpected type (separated by pipe).
     */
    public static function assert($value, string $expected, string $label = 'variable') : void
    {
        if (!static::is($value, $expected)) {
            $expected = \str_replace(['|', ':'], [' or ', ' in range '], $expected);
            static $translate = ['boolean' => 'bool', 'integer' => 'int', 'double' => 'float', 'NULL' => 'null'];
            $type = $translate[\gettype($value)] ?? \gettype($value);
            if (\is_int($value) || \is_float($value) || \is_string($value) && \strlen($value) < 40) {
                $type .= ' ' . \var_export($value, \true);
            } elseif (\is_object($value)) {
                $type .= ' ' . \get_class($value);
            }
            throw new \_HumbugBoxb94336daae36\Nette\Utils\AssertionException("The {$label} expects to be {$expected}, {$type} given.");
        }
    }
    /**
     * Throws exception if an array field is missing or of unexpected type (separated by pipe).
     */
    public static function assertField(array $arr, $field, string $expected = null, string $label = "item '%' in array") : void
    {
        if (!\array_key_exists($field, $arr)) {
            throw new \_HumbugBoxb94336daae36\Nette\Utils\AssertionException('Missing ' . \str_replace('%', $field, $label) . '.');
        } elseif ($expected) {
            static::assert($arr[$field], $expected, \str_replace('%', $field, $label));
        }
    }
    /**
     * Finds whether a variable is of expected type (separated by pipe).
     */
    public static function is($value, string $expected) : bool
    {
        foreach (\explode('|', $expected) as $item) {
            if (\substr($item, -2) === '[]') {
                if (\is_iterable($value) && self::everyIs($value, \substr($item, 0, -2))) {
                    return \true;
                }
                continue;
            } elseif (\substr($item, 0, 1) === '?') {
                $item = \substr($item, 1);
                if ($value === null) {
                    return \true;
                }
            }
            [$type] = $item = \explode(':', $item, 2);
            if (isset(static::$validators[$type])) {
                try {
                    if (!static::$validators[$type]($value)) {
                        continue;
                    }
                } catch (\TypeError $e) {
                    continue;
                }
            } elseif ($type === 'pattern') {
                if (\preg_match('|^' . ($item[1] ?? '') . '\\z|', $value)) {
                    return \true;
                }
                continue;
            } elseif (!$value instanceof $type) {
                continue;
            }
            if (isset($item[1])) {
                $length = $value;
                if (isset(static::$counters[$type])) {
                    $length = static::$counters[$type]($value);
                }
                $range = \explode('..', $item[1]);
                if (!isset($range[1])) {
                    $range[1] = $range[0];
                }
                if ($range[0] !== '' && $length < $range[0] || $range[1] !== '' && $length > $range[1]) {
                    continue;
                }
            }
            return \true;
        }
        return \false;
    }
    /**
     * Finds whether all values are of expected type (separated by pipe).
     */
    public static function everyIs(iterable $values, string $expected) : bool
    {
        foreach ($values as $value) {
            if (!static::is($value, $expected)) {
                return \false;
            }
        }
        return \true;
    }
    /**
     * Finds whether a value is an integer or a float.
     */
    public static function isNumber($value) : bool
    {
        return \is_int($value) || \is_float($value);
    }
    /**
     * Finds whether a value is an integer.
     */
    public static function isNumericInt($value) : bool
    {
        return \is_int($value) || \is_string($value) && \preg_match('#^[+-]?[0-9]+\\z#', $value);
    }
    /**
     * Finds whether a string is a floating point number in decimal base.
     */
    public static function isNumeric($value) : bool
    {
        return \is_float($value) || \is_int($value) || \is_string($value) && \preg_match('#^[+-]?[0-9]*[.]?[0-9]+\\z#', $value);
    }
    /**
     * Finds whether a value is a syntactically correct callback.
     */
    public static function isCallable($value) : bool
    {
        return $value && \is_callable($value, \true);
    }
    /**
     * Finds whether a value is an UTF-8 encoded string.
     */
    public static function isUnicode($value) : bool
    {
        return \is_string($value) && \preg_match('##u', $value);
    }
    /**
     * Finds whether a value is "falsy".
     */
    public static function isNone($value) : bool
    {
        return $value == null;
        // intentionally ==
    }
    /** @internal */
    public static function isMixed() : bool
    {
        return \true;
    }
    /**
     * Finds whether a variable is a zero-based integer indexed array.
     */
    public static function isList($value) : bool
    {
        return \_HumbugBoxb94336daae36\Nette\Utils\Arrays::isList($value);
    }
    /**
     * Is a value in specified min and max value pair?
     */
    public static function isInRange($value, array $range) : bool
    {
        if ($value === null || !(isset($range[0]) || isset($range[1]))) {
            return \false;
        }
        $limit = $range[0] ?? $range[1];
        if (\is_string($limit)) {
            $value = (string) $value;
        } elseif ($limit instanceof \DateTimeInterface) {
            if (!$value instanceof \DateTimeInterface) {
                return \false;
            }
        } elseif (\is_numeric($value)) {
            $value *= 1;
        } else {
            return \false;
        }
        return (!isset($range[0]) || $value >= $range[0]) && (!isset($range[1]) || $value <= $range[1]);
    }
    /**
     * Finds whether a string is a valid email address.
     */
    public static function isEmail(string $value) : bool
    {
        $atom = "[-a-z0-9!#\$%&'*+/=?^_`{|}~]";
        // RFC 5322 unquoted characters in local-part
        $alpha = "a-z-";
        // superset of IDN
        return (bool) \preg_match("(^\n\t\t\t(\"([ !#-[\\]-~]*|\\\\[ -~])+\"|{$atom}+(\\.{$atom}+)*)  # quoted or unquoted\n\t\t\t@\n\t\t\t([0-9{$alpha}]([-0-9{$alpha}]{0,61}[0-9{$alpha}])?\\.)+    # domain - RFC 1034\n\t\t\t[{$alpha}]([-0-9{$alpha}]{0,17}[{$alpha}])?                # top domain\n\t\t\\z)ix", $value);
    }
    /**
     * Finds whether a string is a valid http(s) URL.
     */
    public static function isUrl(string $value) : bool
    {
        $alpha = "a-z-";
        return (bool) \preg_match("(^\n\t\t\thttps?://(\n\t\t\t\t(([-_0-9{$alpha}]+\\.)*                       # subdomain\n\t\t\t\t\t[0-9{$alpha}]([-0-9{$alpha}]{0,61}[0-9{$alpha}])?\\.)?  # domain\n\t\t\t\t\t[{$alpha}]([-0-9{$alpha}]{0,17}[{$alpha}])?   # top domain\n\t\t\t\t|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}  # IPv4\n\t\t\t\t|\\[[0-9a-f:]{3,39}\\]                        # IPv6\n\t\t\t)(:\\d{1,5})?                                   # port\n\t\t\t(/\\S*)?                                        # path\n\t\t\\z)ix", $value);
    }
    /**
     * Finds whether a string is a valid URI according to RFC 1738.
     */
    public static function isUri(string $value) : bool
    {
        return (bool) \preg_match('#^[a-z\\d+\\.-]+:\\S+\\z#i', $value);
    }
    /**
     * Checks whether the input is a class, interface or trait.
     */
    public static function isType(string $type) : bool
    {
        return \class_exists($type) || \interface_exists($type) || \trait_exists($type);
    }
    /**
     * Checks whether the input is a valid PHP identifier.
     */
    public static function isPhpIdentifier(string $value) : bool
    {
        return \is_string($value) && \preg_match('#^[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*\\z#', $value);
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Utils;

use _HumbugBoxb94336daae36\Nette;
/**
 * Nette\Object behaviour mixin.
 * @deprecated
 */
final class ObjectMixin
{
    use Nette\StaticClass;
    /**
     * @deprecated  use ObjectHelpers::getSuggestion()
     */
    public static function getSuggestion(array $possibilities, string $value) : ?string
    {
        \trigger_error(__METHOD__ . '() has been renamed to Nette\\Utils\\ObjectHelpers::getSuggestion()', \E_USER_DEPRECATED);
        return \_HumbugBoxb94336daae36\Nette\Utils\ObjectHelpers::getSuggestion($possibilities, $value);
    }
    public static function setExtensionMethod($class, $name, $callback)
    {
        \trigger_error('Class Nette\\Utils\\ObjectMixin is deprecated', \E_USER_DEPRECATED);
    }
    public static function getExtensionMethod($class, $name)
    {
        \trigger_error('Class Nette\\Utils\\ObjectMixin is deprecated', \E_USER_DEPRECATED);
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette;

/**
 * The exception that is thrown when the value of an argument is
 * outside the allowable range of values as defined by the invoked method.
 */
class ArgumentOutOfRangeException extends \InvalidArgumentException
{
}
/**
 * The exception that is thrown when a method call is invalid for the object's
 * current state, method has been invoked at an illegal or inappropriate time.
 */
class InvalidStateException extends \RuntimeException
{
}
/**
 * The exception that is thrown when a requested method or operation is not implemented.
 */
class NotImplementedException extends \LogicException
{
}
/**
 * The exception that is thrown when an invoked method is not supported. For scenarios where
 * it is sometimes possible to perform the requested operation, see InvalidStateException.
 */
class NotSupportedException extends \LogicException
{
}
/**
 * The exception that is thrown when a requested method or operation is deprecated.
 */
class DeprecatedException extends \_HumbugBoxb94336daae36\Nette\NotSupportedException
{
}
/**
 * The exception that is thrown when accessing a class member (property or method) fails.
 */
class MemberAccessException extends \Error
{
}
/**
 * The exception that is thrown when an I/O error occurs.
 */
class IOException extends \RuntimeException
{
}
/**
 * The exception that is thrown when accessing a file that does not exist on disk.
 */
class FileNotFoundException extends \_HumbugBoxb94336daae36\Nette\IOException
{
}
/**
 * The exception that is thrown when part of a file or directory cannot be found.
 */
class DirectoryNotFoundException extends \_HumbugBoxb94336daae36\Nette\IOException
{
}
/**
 * The exception that is thrown when an argument does not match with the expected value.
 */
class InvalidArgumentException extends \InvalidArgumentException
{
}
/**
 * The exception that is thrown when an illegal index was requested.
 */
class OutOfRangeException extends \OutOfRangeException
{
}
/**
 * The exception that is thrown when a value (typically returned by function) does not match with the expected value.
 */
class UnexpectedValueException extends \UnexpectedValueException
{
}
namespace _HumbugBoxb94336daae36\Nette\Utils;

/**
 * The exception that is thrown when an image error occurs.
 */
class ImageException extends \Exception
{
}
/**
 * The exception that indicates invalid image file.
 */
class UnknownImageFileException extends \_HumbugBoxb94336daae36\Nette\Utils\ImageException
{
}
/**
 * The exception that indicates error of JSON encoding/decoding.
 */
class JsonException extends \Exception
{
}
/**
 * The exception that indicates error of the last Regexp execution.
 */
class RegexpException extends \Exception
{
    public const MESSAGES = [\PREG_INTERNAL_ERROR => 'Internal error', \PREG_BACKTRACK_LIMIT_ERROR => 'Backtrack limit was exhausted', \PREG_RECURSION_LIMIT_ERROR => 'Recursion limit was exhausted', \PREG_BAD_UTF8_ERROR => 'Malformed UTF-8 data', \PREG_BAD_UTF8_OFFSET_ERROR => 'Offset didn\'t correspond to the begin of a valid UTF-8 code point', 6 => 'Failed due to limited JIT stack space'];
}
/**
 * The exception that indicates assertion error.
 */
class AssertionException extends \Exception
{
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Utils;

use _HumbugBoxb94336daae36\Nette;
use function is_array, is_object, is_string;
/**
 * PHP callable tools.
 */
final class Callback
{
    use Nette\StaticClass;
    /**
     * @param  string|object|callable  $callable  class, object, callable
     * @deprecated use Closure::fromCallable()
     */
    public static function closure($callable, string $method = null) : \Closure
    {
        try {
            return \Closure::fromCallable($method === null ? $callable : [$callable, $method]);
        } catch (\TypeError $e) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException($e->getMessage());
        }
    }
    /**
     * Invokes callback.
     * @return mixed
     * @deprecated
     */
    public static function invoke($callable, ...$args)
    {
        \trigger_error(__METHOD__ . '() is deprecated, use native invoking.', \E_USER_DEPRECATED);
        self::check($callable);
        return $callable(...$args);
    }
    /**
     * Invokes callback with an array of parameters.
     * @return mixed
     * @deprecated
     */
    public static function invokeArgs($callable, array $args = [])
    {
        \trigger_error(__METHOD__ . '() is deprecated, use native invoking.', \E_USER_DEPRECATED);
        self::check($callable);
        return $callable(...$args);
    }
    /**
     * Invokes internal PHP function with own error handler.
     * @return mixed
     */
    public static function invokeSafe(string $function, array $args, callable $onError)
    {
        $prev = \set_error_handler(function ($severity, $message, $file) use($onError, &$prev, $function) : ?bool {
            if ($file === __FILE__) {
                $msg = $message;
                if (\ini_get('html_errors')) {
                    $msg = \html_entity_decode(\strip_tags($msg));
                }
                $msg = \preg_replace("#^{$function}\\(.*?\\): #", '', $msg);
                if ($onError($msg, $severity) !== \false) {
                    return null;
                }
            }
            return $prev ? $prev(...\func_get_args()) : \false;
        });
        try {
            return $function(...$args);
        } finally {
            \restore_error_handler();
        }
    }
    /**
     * @return callable
     */
    public static function check($callable, bool $syntax = \false)
    {
        if (!\is_callable($callable, $syntax)) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException($syntax ? 'Given value is not a callable type.' : \sprintf("Callback '%s' is not callable.", self::toString($callable)));
        }
        return $callable;
    }
    public static function toString($callable) : string
    {
        if ($callable instanceof \Closure) {
            $inner = self::unwrap($callable);
            return '{closure' . ($inner instanceof \Closure ? '}' : ' ' . self::toString($inner) . '}');
        } elseif (\is_string($callable) && $callable[0] === "\0") {
            return '{lambda}';
        } else {
            \is_callable(\is_object($callable) ? [$callable, '__invoke'] : $callable, \true, $textual);
            return $textual;
        }
    }
    public static function toReflection($callable) : \ReflectionFunctionAbstract
    {
        if ($callable instanceof \Closure) {
            $callable = self::unwrap($callable);
        }
        if (\is_string($callable) && \strpos($callable, '::')) {
            return new \ReflectionMethod($callable);
        } elseif (\is_array($callable)) {
            return new \ReflectionMethod($callable[0], $callable[1]);
        } elseif (\is_object($callable) && !$callable instanceof \Closure) {
            return new \ReflectionMethod($callable, '__invoke');
        } else {
            return new \ReflectionFunction($callable);
        }
    }
    public static function isStatic(callable $callable) : bool
    {
        return \is_array($callable) ? \is_string($callable[0]) : \is_string($callable);
    }
    /**
     * Unwraps closure created by Closure::fromCallable()
     * @internal
     */
    public static function unwrap(\Closure $closure) : callable
    {
        $r = new \ReflectionFunction($closure);
        if (\substr($r->getName(), -1) === '}') {
            return $closure;
        } elseif ($obj = $r->getClosureThis()) {
            return [$obj, $r->getName()];
        } elseif ($class = $r->getClosureScopeClass()) {
            return [$class->getName(), $r->getName()];
        } else {
            return $r->getName();
        }
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Utils;

use _HumbugBoxb94336daae36\Nette;
/**
 * Basic manipulation with images.
 *
 * <code>
 * $image = Image::fromFile('nette.jpg');
 * $image->resize(150, 100);
 * $image->sharpen();
 * $image->send();
 * </code>
 *
 * @method void alphaBlending(bool $on)
 * @method void antialias(bool $on)
 * @method void arc($x, $y, $w, $h, $start, $end, $color)
 * @method void char(int $font, $x, $y, string $char, $color)
 * @method void charUp(int $font, $x, $y, string $char, $color)
 * @method int colorAllocate($red, $green, $blue)
 * @method int colorAllocateAlpha($red, $green, $blue, $alpha)
 * @method int colorAt($x, $y)
 * @method int colorClosest($red, $green, $blue)
 * @method int colorClosestAlpha($red, $green, $blue, $alpha)
 * @method int colorClosestHWB($red, $green, $blue)
 * @method void colorDeallocate($color)
 * @method int colorExact($red, $green, $blue)
 * @method int colorExactAlpha($red, $green, $blue, $alpha)
 * @method void colorMatch(Image $image2)
 * @method int colorResolve($red, $green, $blue)
 * @method int colorResolveAlpha($red, $green, $blue, $alpha)
 * @method void colorSet($index, $red, $green, $blue)
 * @method array colorsForIndex($index)
 * @method int colorsTotal()
 * @method int colorTransparent($color = null)
 * @method void convolution(array $matrix, float $div, float $offset)
 * @method void copy(Image $src, $dstX, $dstY, $srcX, $srcY, $srcW, $srcH)
 * @method void copyMerge(Image $src, $dstX, $dstY, $srcX, $srcY, $srcW, $srcH, $opacity)
 * @method void copyMergeGray(Image $src, $dstX, $dstY, $srcX, $srcY, $srcW, $srcH, $opacity)
 * @method void copyResampled(Image $src, $dstX, $dstY, $srcX, $srcY, $dstW, $dstH, $srcW, $srcH)
 * @method void copyResized(Image $src, $dstX, $dstY, $srcX, $srcY, $dstW, $dstH, $srcW, $srcH)
 * @method Image cropAuto(int $mode = -1, float $threshold = .5, int $color = -1)
 * @method void dashedLine($x1, $y1, $x2, $y2, $color)
 * @method void ellipse($cx, $cy, $w, $h, $color)
 * @method void fill($x, $y, $color)
 * @method void filledArc($cx, $cy, $w, $h, $s, $e, $color, $style)
 * @method void filledEllipse($cx, $cy, $w, $h, $color)
 * @method void filledPolygon(array $points, $numPoints, $color)
 * @method void filledRectangle($x1, $y1, $x2, $y2, $color)
 * @method void fillToBorder($x, $y, $border, $color)
 * @method void filter($filtertype)
 * @method void flip(int $mode)
 * @method array ftText($size, $angle, $x, $y, $col, string $fontFile, string $text, array $extrainfo = null)
 * @method void gammaCorrect(float $inputgamma, float $outputgamma)
 * @method int interlace($interlace = null)
 * @method bool isTrueColor()
 * @method void layerEffect($effect)
 * @method void line($x1, $y1, $x2, $y2, $color)
 * @method void paletteCopy(Image $source)
 * @method void paletteToTrueColor()
 * @method void polygon(array $points, $numPoints, $color)
 * @method array psText(string $text, $font, $size, $color, $backgroundColor, $x, $y, $space = null, $tightness = null, float $angle = null, $antialiasSteps = null)
 * @method void rectangle($x1, $y1, $x2, $y2, $col)
 * @method Image rotate(float $angle, $backgroundColor)
 * @method void saveAlpha(bool $saveflag)
 * @method Image scale(int $newWidth, int $newHeight = -1, int $mode = IMG_BILINEAR_FIXED)
 * @method void setBrush(Image $brush)
 * @method void setPixel($x, $y, $color)
 * @method void setStyle(array $style)
 * @method void setThickness($thickness)
 * @method void setTile(Image $tile)
 * @method void string($font, $x, $y, string $s, $col)
 * @method void stringUp($font, $x, $y, string $s, $col)
 * @method void trueColorToPalette(bool $dither, $ncolors)
 * @method array ttfText($size, $angle, $x, $y, $color, string $fontfile, string $text)
 * @property-read int $width
 * @property-read int $height
 * @property-read resource $imageResource
 */
class Image
{
    use Nette\SmartObject;
    /** {@link resize()} only shrinks images */
    public const SHRINK_ONLY = 0b1;
    /** {@link resize()} will ignore aspect ratio */
    public const STRETCH = 0b10;
    /** {@link resize()} fits in given area so its dimensions are less than or equal to the required dimensions */
    public const FIT = 0b0;
    /** {@link resize()} fills given area so its dimensions are greater than or equal to the required dimensions */
    public const FILL = 0b100;
    /** {@link resize()} fills given area exactly */
    public const EXACT = 0b1000;
    /** image types */
    public const JPEG = \IMAGETYPE_JPEG, PNG = \IMAGETYPE_PNG, GIF = \IMAGETYPE_GIF, WEBP = 18;
    // IMAGETYPE_WEBP is available as of PHP 7.1
    public const EMPTY_GIF = "GIF89a\1\0\1\0\0\0\0\0\0\0\0\0!\4\1\0\0\0\0,\0\0\0\0\1\0\1\0\0\2\2D\1\0;";
    private const FORMATS = [self::JPEG => 'jpeg', self::PNG => 'png', self::GIF => 'gif', self::WEBP => 'webp'];
    /** @var resource */
    private $image;
    /**
     * Returns RGB color (0..255) and transparency (0..127).
     */
    public static function rgb(int $red, int $green, int $blue, int $transparency = 0) : array
    {
        return ['red' => \max(0, \min(255, $red)), 'green' => \max(0, \min(255, $green)), 'blue' => \max(0, \min(255, $blue)), 'alpha' => \max(0, \min(127, $transparency))];
    }
    /**
     * Opens image from file.
     * @throws Nette\NotSupportedException if gd extension is not loaded
     * @throws UnknownImageFileException if file not found or file type is not known
     * @return static
     */
    public static function fromFile(string $file, int &$detectedFormat = null)
    {
        if (!\extension_loaded('gd')) {
            throw new \_HumbugBoxb94336daae36\Nette\NotSupportedException('PHP extension GD is not loaded.');
        }
        $detectedFormat = @\getimagesize($file)[2];
        // @ - files smaller than 12 bytes causes read error
        if (!isset(self::FORMATS[$detectedFormat])) {
            $detectedFormat = null;
            throw new \_HumbugBoxb94336daae36\Nette\Utils\UnknownImageFileException(\is_file($file) ? "Unknown type of file '{$file}'." : "File '{$file}' not found.");
        }
        return new static(\_HumbugBoxb94336daae36\Nette\Utils\Callback::invokeSafe('imagecreatefrom' . \image_type_to_extension($detectedFormat, \false), [$file], function (string $message) : void {
            throw new \_HumbugBoxb94336daae36\Nette\Utils\ImageException($message);
        }));
    }
    /**
     * Create a new image from the image stream in the string.
     * @return static
     * @throws ImageException
     */
    public static function fromString(string $s, int &$detectedFormat = null)
    {
        if (!\extension_loaded('gd')) {
            throw new \_HumbugBoxb94336daae36\Nette\NotSupportedException('PHP extension GD is not loaded.');
        }
        if (\func_num_args() > 1) {
            $tmp = @\getimagesizefromstring($s)[2];
            // @ - strings smaller than 12 bytes causes read error
            $detectedFormat = isset(self::FORMATS[$tmp]) ? $tmp : null;
        }
        return new static(\_HumbugBoxb94336daae36\Nette\Utils\Callback::invokeSafe('imagecreatefromstring', [$s], function (string $message) : void {
            throw new \_HumbugBoxb94336daae36\Nette\Utils\ImageException($message);
        }));
    }
    /**
     * Creates blank image.
     * @return static
     */
    public static function fromBlank(int $width, int $height, array $color = null)
    {
        if (!\extension_loaded('gd')) {
            throw new \_HumbugBoxb94336daae36\Nette\NotSupportedException('PHP extension GD is not loaded.');
        }
        if ($width < 1 || $height < 1) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Image width and height must be greater than zero.');
        }
        $image = \imagecreatetruecolor($width, $height);
        if ($color) {
            $color += ['alpha' => 0];
            $color = \imagecolorresolvealpha($image, $color['red'], $color['green'], $color['blue'], $color['alpha']);
            \imagealphablending($image, \false);
            \imagefilledrectangle($image, 0, 0, $width - 1, $height - 1, $color);
            \imagealphablending($image, \true);
        }
        return new static($image);
    }
    /**
     * Wraps GD image.
     * @param  resource  $image
     */
    public function __construct($image)
    {
        $this->setImageResource($image);
        \imagesavealpha($image, \true);
    }
    /**
     * Returns image width.
     */
    public function getWidth() : int
    {
        return \imagesx($this->image);
    }
    /**
     * Returns image height.
     */
    public function getHeight() : int
    {
        return \imagesy($this->image);
    }
    /**
     * Sets image resource.
     * @param  resource  $image
     * @return static
     */
    protected function setImageResource($image)
    {
        if (!\is_resource($image) || \get_resource_type($image) !== 'gd') {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Image is not valid.');
        }
        $this->image = $image;
        return $this;
    }
    /**
     * Returns image GD resource.
     * @return resource
     */
    public function getImageResource()
    {
        return $this->image;
    }
    /**
     * Resizes image.
     * @param  int|string  $width in pixels or percent
     * @param  int|string  $height in pixels or percent
     * @return static
     */
    public function resize($width, $height, int $flags = self::FIT)
    {
        if ($flags & self::EXACT) {
            return $this->resize($width, $height, self::FILL)->crop('50%', '50%', $width, $height);
        }
        [$newWidth, $newHeight] = static::calculateSize($this->getWidth(), $this->getHeight(), $width, $height, $flags);
        if ($newWidth !== $this->getWidth() || $newHeight !== $this->getHeight()) {
            // resize
            $newImage = static::fromBlank($newWidth, $newHeight, self::rgb(0, 0, 0, 127))->getImageResource();
            \imagecopyresampled($newImage, $this->image, 0, 0, 0, 0, $newWidth, $newHeight, $this->getWidth(), $this->getHeight());
            $this->image = $newImage;
        }
        if ($width < 0 || $height < 0) {
            \imageflip($this->image, $width < 0 ? $height < 0 ? \IMG_FLIP_BOTH : \IMG_FLIP_HORIZONTAL : \IMG_FLIP_VERTICAL);
        }
        return $this;
    }
    /**
     * Calculates dimensions of resized image.
     * @param  int|string  $newWidth in pixels or percent
     * @param  int|string  $newHeight in pixels or percent
     */
    public static function calculateSize(int $srcWidth, int $srcHeight, $newWidth, $newHeight, int $flags = self::FIT) : array
    {
        if (\is_string($newWidth) && \substr($newWidth, -1) === '%') {
            $newWidth = (int) \round($srcWidth / 100 * \abs(\substr($newWidth, 0, -1)));
            $percents = \true;
        } else {
            $newWidth = (int) \abs($newWidth);
        }
        if (\is_string($newHeight) && \substr($newHeight, -1) === '%') {
            $newHeight = (int) \round($srcHeight / 100 * \abs(\substr($newHeight, 0, -1)));
            $flags |= empty($percents) ? 0 : self::STRETCH;
        } else {
            $newHeight = (int) \abs($newHeight);
        }
        if ($flags & self::STRETCH) {
            // non-proportional
            if (empty($newWidth) || empty($newHeight)) {
                throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('For stretching must be both width and height specified.');
            }
            if ($flags & self::SHRINK_ONLY) {
                $newWidth = (int) \round($srcWidth * \min(1, $newWidth / $srcWidth));
                $newHeight = (int) \round($srcHeight * \min(1, $newHeight / $srcHeight));
            }
        } else {
            // proportional
            if (empty($newWidth) && empty($newHeight)) {
                throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('At least width or height must be specified.');
            }
            $scale = [];
            if ($newWidth > 0) {
                // fit width
                $scale[] = $newWidth / $srcWidth;
            }
            if ($newHeight > 0) {
                // fit height
                $scale[] = $newHeight / $srcHeight;
            }
            if ($flags & self::FILL) {
                $scale = [\max($scale)];
            }
            if ($flags & self::SHRINK_ONLY) {
                $scale[] = 1;
            }
            $scale = \min($scale);
            $newWidth = (int) \round($srcWidth * $scale);
            $newHeight = (int) \round($srcHeight * $scale);
        }
        return [\max($newWidth, 1), \max($newHeight, 1)];
    }
    /**
     * Crops image.
     * @param  int|string  $left in pixels or percent
     * @param  int|string  $top in pixels or percent
     * @param  int|string  $width in pixels or percent
     * @param  int|string  $height in pixels or percent
     * @return static
     */
    public function crop($left, $top, $width, $height)
    {
        [$r['x'], $r['y'], $r['width'], $r['height']] = static::calculateCutout($this->getWidth(), $this->getHeight(), $left, $top, $width, $height);
        $this->image = \imagecrop($this->image, $r);
        return $this;
    }
    /**
     * Calculates dimensions of cutout in image.
     * @param  int|string  $left in pixels or percent
     * @param  int|string  $top in pixels or percent
     * @param  int|string  $newWidth in pixels or percent
     * @param  int|string  $newHeight in pixels or percent
     */
    public static function calculateCutout(int $srcWidth, int $srcHeight, $left, $top, $newWidth, $newHeight) : array
    {
        if (\is_string($newWidth) && \substr($newWidth, -1) === '%') {
            $newWidth = (int) \round($srcWidth / 100 * \substr($newWidth, 0, -1));
        }
        if (\is_string($newHeight) && \substr($newHeight, -1) === '%') {
            $newHeight = (int) \round($srcHeight / 100 * \substr($newHeight, 0, -1));
        }
        if (\is_string($left) && \substr($left, -1) === '%') {
            $left = (int) \round(($srcWidth - $newWidth) / 100 * \substr($left, 0, -1));
        }
        if (\is_string($top) && \substr($top, -1) === '%') {
            $top = (int) \round(($srcHeight - $newHeight) / 100 * \substr($top, 0, -1));
        }
        if ($left < 0) {
            $newWidth += $left;
            $left = 0;
        }
        if ($top < 0) {
            $newHeight += $top;
            $top = 0;
        }
        $newWidth = \min($newWidth, $srcWidth - $left);
        $newHeight = \min($newHeight, $srcHeight - $top);
        return [$left, $top, $newWidth, $newHeight];
    }
    /**
     * Sharpen image.
     * @return static
     */
    public function sharpen()
    {
        \imageconvolution($this->image, [
            // my magic numbers ;)
            [-1, -1, -1],
            [-1, 24, -1],
            [-1, -1, -1],
        ], 16, 0);
        return $this;
    }
    /**
     * Puts another image into this image.
     * @param  int|string  $left in pixels or percent
     * @param  int|string  $top in pixels or percent
     * @param  int  $opacity 0..100
     * @return static
     */
    public function place(self $image, $left = 0, $top = 0, int $opacity = 100)
    {
        $opacity = \max(0, \min(100, $opacity));
        if ($opacity === 0) {
            return $this;
        }
        $width = $image->getWidth();
        $height = $image->getHeight();
        if (\is_string($left) && \substr($left, -1) === '%') {
            $left = (int) \round(($this->getWidth() - $width) / 100 * \substr($left, 0, -1));
        }
        if (\is_string($top) && \substr($top, -1) === '%') {
            $top = (int) \round(($this->getHeight() - $height) / 100 * \substr($top, 0, -1));
        }
        $output = $input = $image->image;
        if ($opacity < 100) {
            $tbl = [];
            for ($i = 0; $i < 128; $i++) {
                $tbl[$i] = \round(127 - (127 - $i) * $opacity / 100);
            }
            $output = \imagecreatetruecolor($width, $height);
            \imagealphablending($output, \false);
            if (!$image->isTrueColor()) {
                $input = $output;
                \imagefilledrectangle($output, 0, 0, $width, $height, \imagecolorallocatealpha($output, 0, 0, 0, 127));
                \imagecopy($output, $image->image, 0, 0, 0, 0, $width, $height);
            }
            for ($x = 0; $x < $width; $x++) {
                for ($y = 0; $y < $height; $y++) {
                    $c = \imagecolorat($input, $x, $y);
                    $c = ($c & 0xffffff) + ($tbl[$c >> 24] << 24);
                    \imagesetpixel($output, $x, $y, $c);
                }
            }
            \imagealphablending($output, \true);
        }
        \imagecopy($this->image, $output, $left, $top, 0, 0, $width, $height);
        return $this;
    }
    /**
     * Saves image to the file. Quality is 0..100 for JPEG and WEBP, 0..9 for PNG.
     * @throws ImageException
     */
    public function save(string $file, int $quality = null, int $type = null) : void
    {
        if ($type === null) {
            $extensions = \array_flip(self::FORMATS) + ['jpg' => self::JPEG];
            $ext = \strtolower(\pathinfo($file, \PATHINFO_EXTENSION));
            if (!isset($extensions[$ext])) {
                throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Unsupported file extension '{$ext}'.");
            }
            $type = $extensions[$ext];
        }
        $this->output($type, $quality, $file);
    }
    /**
     * Outputs image to string. Quality is 0..100 for JPEG and WEBP, 0..9 for PNG.
     */
    public function toString(int $type = self::JPEG, int $quality = null) : string
    {
        \ob_start(function () {
        });
        $this->output($type, $quality);
        return \ob_get_clean();
    }
    /**
     * Outputs image to string.
     */
    public function __toString() : string
    {
        try {
            return $this->toString();
        } catch (\Throwable $e) {
            if (\func_num_args()) {
                throw $e;
            }
            \trigger_error('Exception in ' . __METHOD__ . "(): {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}", \E_USER_ERROR);
        }
    }
    /**
     * Outputs image to browser. Quality is 0..100 for JPEG and WEBP, 0..9 for PNG.
     * @throws ImageException
     */
    public function send(int $type = self::JPEG, int $quality = null) : void
    {
        if (!isset(self::FORMATS[$type])) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Unsupported image type '{$type}'.");
        }
        \header('Content-Type: ' . \image_type_to_mime_type($type));
        $this->output($type, $quality);
    }
    /**
     * Outputs image to browser or file.
     * @throws ImageException
     */
    private function output(int $type, ?int $quality, string $file = null) : void
    {
        switch ($type) {
            case self::JPEG:
                $quality = $quality === null ? 85 : \max(0, \min(100, $quality));
                $success = \imagejpeg($this->image, $file, $quality);
                break;
            case self::PNG:
                $quality = $quality === null ? 9 : \max(0, \min(9, $quality));
                $success = \imagepng($this->image, $file, $quality);
                break;
            case self::GIF:
                $success = \imagegif($this->image, $file);
                break;
            case self::WEBP:
                $quality = $quality === null ? 80 : \max(0, \min(100, $quality));
                $success = \imagewebp($this->image, $file, $quality);
                break;
            default:
                throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Unsupported image type '{$type}'.");
        }
        if (!$success) {
            throw new \_HumbugBoxb94336daae36\Nette\Utils\ImageException(\error_get_last()['message'] ?: 'Unknown error');
        }
    }
    /**
     * Call to undefined method.
     * @return mixed
     * @throws Nette\MemberAccessException
     */
    public function __call(string $name, array $args)
    {
        $function = 'image' . $name;
        if (!\function_exists($function)) {
            \_HumbugBoxb94336daae36\Nette\Utils\ObjectHelpers::strictCall(\get_class($this), $name);
        }
        foreach ($args as $key => $value) {
            if ($value instanceof self) {
                $args[$key] = $value->getImageResource();
            } elseif (\is_array($value) && isset($value['red'])) {
                // rgb
                $args[$key] = \imagecolorallocatealpha($this->image, $value['red'], $value['green'], $value['blue'], $value['alpha']) ?: \imagecolorresolvealpha($this->image, $value['red'], $value['green'], $value['blue'], $value['alpha']);
            }
        }
        $res = $function($this->image, ...$args);
        return \is_resource($res) && \get_resource_type($res) === 'gd' ? $this->setImageResource($res) : $res;
    }
    public function __clone()
    {
        \ob_start(function () {
        });
        \imagegd2($this->image);
        $this->setImageResource(\imagecreatefromstring(\ob_get_clean()));
    }
    /**
     * Prevents serialization.
     */
    public function __sleep()
    {
        throw new \_HumbugBoxb94336daae36\Nette\NotSupportedException('You cannot serialize or unserialize ' . self::class . ' instances.');
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Iterators;

/**
 * Applies the callback to the elements of the inner iterator.
 */
class Mapper extends \IteratorIterator
{
    /** @var callable */
    private $callback;
    public function __construct(\Traversable $iterator, callable $callback)
    {
        parent::__construct($iterator);
        $this->callback = $callback;
    }
    public function current()
    {
        return ($this->callback)(parent::current(), parent::key());
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Iterators;

use _HumbugBoxb94336daae36\Nette;
/**
 * Smarter caching iterator.
 *
 * @property-read bool $first
 * @property-read bool $last
 * @property-read bool $empty
 * @property-read bool $odd
 * @property-read bool $even
 * @property-read int $counter
 * @property-read mixed $nextKey
 * @property-read mixed $nextValue
 */
class CachingIterator extends \CachingIterator implements \Countable
{
    use Nette\SmartObject;
    /** @var int */
    private $counter = 0;
    public function __construct($iterator)
    {
        if (\is_array($iterator) || $iterator instanceof \stdClass) {
            $iterator = new \ArrayIterator($iterator);
        } elseif ($iterator instanceof \IteratorAggregate) {
            do {
                $iterator = $iterator->getIterator();
            } while ($iterator instanceof \IteratorAggregate);
        } elseif ($iterator instanceof \Traversable) {
            if (!$iterator instanceof \Iterator) {
                $iterator = new \IteratorIterator($iterator);
            }
        } else {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException(\sprintf('Invalid argument passed to %s; array or Traversable expected, %s given.', __CLASS__, \is_object($iterator) ? \get_class($iterator) : \gettype($iterator)));
        }
        parent::__construct($iterator, 0);
    }
    /**
     * Is the current element the first one?
     */
    public function isFirst(int $gridWidth = null) : bool
    {
        return $this->counter === 1 || $gridWidth && $this->counter !== 0 && ($this->counter - 1) % $gridWidth === 0;
    }
    /**
     * Is the current element the last one?
     */
    public function isLast(int $gridWidth = null) : bool
    {
        return !$this->hasNext() || $gridWidth && $this->counter % $gridWidth === 0;
    }
    /**
     * Is the iterator empty?
     */
    public function isEmpty() : bool
    {
        return $this->counter === 0;
    }
    /**
     * Is the counter odd?
     */
    public function isOdd() : bool
    {
        return $this->counter % 2 === 1;
    }
    /**
     * Is the counter even?
     */
    public function isEven() : bool
    {
        return $this->counter % 2 === 0;
    }
    /**
     * Returns the counter.
     */
    public function getCounter() : int
    {
        return $this->counter;
    }
    /**
     * Returns the count of elements.
     */
    public function count() : int
    {
        $inner = $this->getInnerIterator();
        if ($inner instanceof \Countable) {
            return $inner->count();
        } else {
            throw new \_HumbugBoxb94336daae36\Nette\NotSupportedException('Iterator is not countable.');
        }
    }
    /**
     * Forwards to the next element.
     */
    public function next() : void
    {
        parent::next();
        if (parent::valid()) {
            $this->counter++;
        }
    }
    /**
     * Rewinds the Iterator.
     */
    public function rewind() : void
    {
        parent::rewind();
        $this->counter = parent::valid() ? 1 : 0;
    }
    /**
     * Returns the next key.
     * @return mixed
     */
    public function getNextKey()
    {
        return $this->getInnerIterator()->key();
    }
    /**
     * Returns the next element.
     * @return mixed
     */
    public function getNextValue()
    {
        return $this->getInnerIterator()->current();
    }
}
Licenses
========

Good news! You may use Nette Framework under the terms of either
the New BSD License or the GNU General Public License (GPL) version 2 or 3.

The BSD License is recommended for most projects. It is easy to understand and it
places almost no restrictions on what you can do with the framework. If the GPL
fits better to your project, you can use the framework under this license.

You don't have to notify anyone which license you are using. You can freely
use Nette Framework in commercial projects as long as the copyright header
remains intact.

Please be advised that the name "Nette Framework" is a protected trademark and its
usage has some limitations. So please do not use word "Nette" in the name of your
project or top-level domain, and choose a name that stands on its own merits.
If your stuff is good, it will not take long to establish a reputation for yourselves.


New BSD License
---------------

Copyright (c) 2004, 2014 David Grudl (https://davidgrudl.com)
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 "Nette Framework" 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 owner 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.


GNU General Public License
--------------------------

GPL licenses are very very long, so instead of including them here we offer
you URLs with full text:

- [GPL version 2](http://www.gnu.org/licenses/gpl-2.0.html)
- [GPL version 3](http://www.gnu.org/licenses/gpl-3.0.html)
{
    "name": "nette\/robot-loader",
    "description": "\ud83c\udf40 Nette RobotLoader: high performance and comfortable autoloader that will search and autoload classes within your application.",
    "keywords": [
        "nette",
        "autoload",
        "class",
        "trait",
        "interface"
    ],
    "homepage": "https:\/\/nette.org",
    "license": [
        "BSD-3-Clause",
        "GPL-2.0",
        "GPL-3.0"
    ],
    "authors": [
        {
            "name": "David Grudl",
            "homepage": "https:\/\/davidgrudl.com"
        },
        {
            "name": "Nette Community",
            "homepage": "https:\/\/nette.org\/contributors"
        }
    ],
    "require": {
        "php": ">=7.1",
        "ext-tokenizer": "*",
        "nette\/finder": "^2.5",
        "nette\/utils": "^3.0"
    },
    "require-dev": {
        "nette\/tester": "^2.0",
        "tracy\/tracy": "^2.3"
    },
    "autoload": {
        "classmap": [
            "src\/"
        ]
    },
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "3.2-dev"
        }
    }
}<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Loaders;

use _HumbugBoxb94336daae36\Nette;
use SplFileInfo;
/**
 * Nette auto loader is responsible for loading classes and interfaces.
 *
 * <code>
 * $loader = new Nette\Loaders\RobotLoader;
 * $loader->addDirectory('app');
 * $loader->excludeDirectory('app/exclude');
 * $loader->setTempDirectory('temp');
 * $loader->register();
 * </code>
 */
class RobotLoader
{
    use Nette\SmartObject;
    private const RETRY_LIMIT = 3;
    /** @var array */
    public $ignoreDirs = ['.*', '*.old', '*.bak', '*.tmp', 'temp'];
    /** @var array */
    public $acceptFiles = ['*.php'];
    /** @var bool */
    private $autoRebuild = \true;
    /** @var bool */
    private $reportParseErrors = \true;
    /** @var array */
    private $scanPaths = [];
    /** @var array */
    private $excludeDirs = [];
    /** @var array of class => [file, time] */
    private $classes = [];
    /** @var bool */
    private $refreshed = \false;
    /** @var array of missing classes */
    private $missing = [];
    /** @var string|null */
    private $tempDirectory;
    public function __construct()
    {
        if (!\extension_loaded('tokenizer')) {
            throw new \_HumbugBoxb94336daae36\Nette\NotSupportedException('PHP extension Tokenizer is not loaded.');
        }
    }
    /**
     * Register autoloader.
     */
    public function register(bool $prepend = \false) : self
    {
        $this->loadCache();
        \spl_autoload_register([$this, 'tryLoad'], \true, $prepend);
        return $this;
    }
    /**
     * Handles autoloading of classes, interfaces or traits.
     */
    public function tryLoad(string $type) : void
    {
        $type = \ltrim($type, '\\');
        // PHP namespace bug #49143
        $info = $this->classes[$type] ?? null;
        if ($this->autoRebuild) {
            if (!$info || !\is_file($info['file'])) {
                $missing =& $this->missing[$type];
                $missing++;
                if (!$this->refreshed && $missing <= self::RETRY_LIMIT) {
                    $this->refreshClasses();
                    $this->saveCache();
                } elseif ($info) {
                    unset($this->classes[$type]);
                    $this->saveCache();
                }
            } elseif (!$this->refreshed && \filemtime($info['file']) !== $info['time']) {
                $this->updateFile($info['file']);
                if (empty($this->classes[$type])) {
                    $this->missing[$type] = 0;
                }
                $this->saveCache();
            }
            $info = $this->classes[$type] ?? null;
        }
        if ($info) {
            (function ($file) {
                require $file;
            })($info['file']);
        }
    }
    /**
     * Add path or paths to list.
     * @param  string  ...$paths  absolute path
     */
    public function addDirectory(...$paths) : self
    {
        if (\is_array($paths[0])) {
            \trigger_error(__METHOD__ . '() use variadics ...$paths to add an array of paths.', \E_USER_WARNING);
            $paths = $paths[0];
        }
        $this->scanPaths = \array_merge($this->scanPaths, $paths);
        return $this;
    }
    public function reportParseErrors(bool $on = \true) : self
    {
        $this->reportParseErrors = (bool) $on;
        return $this;
    }
    /**
     * Excludes path or paths from list.
     * @param  string  ...$paths  absolute path
     */
    public function excludeDirectory(...$paths) : self
    {
        if (\is_array($paths[0])) {
            \trigger_error(__METHOD__ . '() use variadics ...$paths to add an array of paths.', \E_USER_WARNING);
            $paths = $paths[0];
        }
        $this->excludeDirs = \array_merge($this->excludeDirs, $paths);
        return $this;
    }
    /**
     * @return array of class => filename
     */
    public function getIndexedClasses() : array
    {
        $res = [];
        foreach ($this->classes as $class => $info) {
            $res[$class] = $info['file'];
        }
        return $res;
    }
    /**
     * Rebuilds class list cache.
     */
    public function rebuild() : void
    {
        $this->classes = $this->missing = [];
        $this->refreshClasses();
        if ($this->tempDirectory) {
            $this->saveCache();
        }
    }
    /**
     * Refreshes class list cache.
     */
    public function refresh() : void
    {
        $this->loadCache();
        if (!$this->refreshed) {
            $this->refreshClasses();
            $this->saveCache();
        }
    }
    /**
     * Refreshes $classes.
     */
    private function refreshClasses() : void
    {
        $this->refreshed = \true;
        // prevents calling refreshClasses() or updateFile() in tryLoad()
        $files = [];
        foreach ($this->classes as $class => $info) {
            $files[$info['file']]['time'] = $info['time'];
            $files[$info['file']]['classes'][] = $class;
        }
        $this->classes = [];
        foreach ($this->scanPaths as $path) {
            $iterator = \is_file($path) ? [new \SplFileInfo($path)] : $this->createFileIterator($path);
            foreach ($iterator as $file) {
                $file = $file->getPathname();
                if (isset($files[$file]) && $files[$file]['time'] == \filemtime($file)) {
                    $classes = $files[$file]['classes'];
                } else {
                    $classes = $this->scanPhp($file);
                }
                $files[$file] = ['classes' => [], 'time' => \filemtime($file)];
                foreach ($classes as $class) {
                    $info =& $this->classes[$class];
                    if (isset($info['file'])) {
                        throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException("Ambiguous class {$class} resolution; defined in {$info['file']} and in {$file}.");
                    }
                    $info = ['file' => $file, 'time' => \filemtime($file)];
                    unset($this->missing[$class]);
                }
            }
        }
    }
    /**
     * Creates an iterator scaning directory for PHP files, subdirectories and 'netterobots.txt' files.
     * @throws Nette\IOException if path is not found
     */
    private function createFileIterator(string $dir) : \_HumbugBoxb94336daae36\Nette\Utils\Finder
    {
        if (!\is_dir($dir)) {
            throw new \_HumbugBoxb94336daae36\Nette\IOException("File or directory '{$dir}' not found.");
        }
        if (!\is_array($ignoreDirs = $this->ignoreDirs)) {
            \trigger_error(__CLASS__ . ': $ignoreDirs must be an array.', \E_USER_WARNING);
            $ignoreDirs = \preg_split('#[,\\s]+#', $ignoreDirs);
        }
        $disallow = [];
        foreach (\array_merge($ignoreDirs, $this->excludeDirs) as $item) {
            if ($item = \realpath($item)) {
                $disallow[\str_replace('\\', '/', $item)] = \true;
            }
        }
        if (!\is_array($acceptFiles = $this->acceptFiles)) {
            \trigger_error(__CLASS__ . ': $acceptFiles must be an array.', \E_USER_WARNING);
            $acceptFiles = \preg_split('#[,\\s]+#', $acceptFiles);
        }
        $iterator = \_HumbugBoxb94336daae36\Nette\Utils\Finder::findFiles($acceptFiles)->filter(function (\SplFileInfo $file) use(&$disallow) {
            return !isset($disallow[\str_replace('\\', '/', $file->getRealPath())]);
        })->from($dir)->exclude($ignoreDirs)->filter($filter = function (\SplFileInfo $dir) use(&$disallow) {
            $path = \str_replace('\\', '/', $dir->getRealPath());
            if (\is_file("{$path}/netterobots.txt")) {
                foreach (\file("{$path}/netterobots.txt") as $s) {
                    if (\preg_match('#^(?:disallow\\s*:)?\\s*(\\S+)#i', $s, $matches)) {
                        $disallow[$path . \rtrim('/' . \ltrim($matches[1], '/'), '/')] = \true;
                    }
                }
            }
            return !isset($disallow[$path]);
        });
        $filter(new \SplFileInfo($dir));
        return $iterator;
    }
    private function updateFile(string $file) : void
    {
        foreach ($this->classes as $class => $info) {
            if (isset($info['file']) && $info['file'] === $file) {
                unset($this->classes[$class]);
            }
        }
        $classes = \is_file($file) ? $this->scanPhp($file) : [];
        foreach ($classes as $class) {
            $info =& $this->classes[$class];
            if (isset($info['file']) && @\filemtime($info['file']) !== $info['time']) {
                // @ file may not exists
                $this->updateFile($info['file']);
                $info =& $this->classes[$class];
            }
            if (isset($info['file'])) {
                throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException("Ambiguous class {$class} resolution; defined in {$info['file']} and in {$file}.");
            }
            $info = ['file' => $file, 'time' => \filemtime($file)];
        }
    }
    /**
     * Searches classes, interfaces and traits in PHP file.
     * @return string[]
     */
    private function scanPhp(string $file) : array
    {
        $code = \file_get_contents($file);
        $expected = \false;
        $namespace = '';
        $level = $minLevel = 0;
        $classes = [];
        if (\preg_match('#//nette' . 'loader=(\\S*)#', $code, $matches)) {
            foreach (\explode(',', $matches[1]) as $name) {
                $classes[] = $name;
            }
            return $classes;
        }
        try {
            $tokens = \token_get_all($code, \TOKEN_PARSE);
        } catch (\ParseError $e) {
            if ($this->reportParseErrors) {
                $rp = new \ReflectionProperty($e, 'file');
                $rp->setAccessible(\true);
                $rp->setValue($e, $file);
                throw $e;
            }
            $tokens = [];
        }
        foreach ($tokens as $token) {
            if (\is_array($token)) {
                switch ($token[0]) {
                    case \T_COMMENT:
                    case \T_DOC_COMMENT:
                    case \T_WHITESPACE:
                        continue 2;
                    case \T_NS_SEPARATOR:
                    case \T_STRING:
                        if ($expected) {
                            $name .= $token[1];
                        }
                        continue 2;
                    case \T_NAMESPACE:
                    case \T_CLASS:
                    case \T_INTERFACE:
                    case \T_TRAIT:
                        $expected = $token[0];
                        $name = '';
                        continue 2;
                    case \T_CURLY_OPEN:
                    case \T_DOLLAR_OPEN_CURLY_BRACES:
                        $level++;
                }
            }
            if ($expected) {
                switch ($expected) {
                    case \T_CLASS:
                    case \T_INTERFACE:
                    case \T_TRAIT:
                        if ($name && $level === $minLevel) {
                            $classes[] = $namespace . $name;
                        }
                        break;
                    case \T_NAMESPACE:
                        $namespace = $name ? $name . '\\' : '';
                        $minLevel = $token === '{' ? 1 : 0;
                }
                $expected = null;
            }
            if ($token === '{') {
                $level++;
            } elseif ($token === '}') {
                $level--;
            }
        }
        return $classes;
    }
    /********************* caching ****************d*g**/
    /**
     * Sets auto-refresh mode.
     */
    public function setAutoRefresh(bool $on = \true) : self
    {
        $this->autoRebuild = (bool) $on;
        return $this;
    }
    /**
     * Sets path to temporary directory.
     */
    public function setTempDirectory(string $dir) : self
    {
        \_HumbugBoxb94336daae36\Nette\Utils\FileSystem::createDir($dir);
        $this->tempDirectory = $dir;
        return $this;
    }
    /**
     * Loads class list from cache.
     */
    private function loadCache() : void
    {
        $file = $this->getCacheFile();
        [$this->classes, $this->missing] = @(include $file);
        // @ file may not exist
        if (\is_array($this->classes)) {
            return;
        }
        $handle = \fopen("{$file}.lock", 'c+');
        if (!$handle || !\flock($handle, \LOCK_EX)) {
            throw new \RuntimeException("Unable to create or acquire exclusive lock on file '{$file}.lock'.");
        }
        [$this->classes, $this->missing] = @(include $file);
        // @ file may not exist
        if (!\is_array($this->classes)) {
            $this->rebuild();
        }
        \flock($handle, \LOCK_UN);
        \fclose($handle);
        @\unlink("{$file}.lock");
        // @ file may become locked on Windows
    }
    /**
     * Writes class list to cache.
     */
    private function saveCache() : void
    {
        $file = $this->getCacheFile();
        $tempFile = $file . \uniqid('', \true) . '.tmp';
        $code = "<?php\nreturn " . \var_export([$this->classes, $this->missing], \true) . ";\n";
        if (\file_put_contents($tempFile, $code) !== \strlen($code) || !\rename($tempFile, $file)) {
            @\unlink($tempFile);
            // @ - file may not exist
            throw new \RuntimeException("Unable to create '{$file}'.");
        }
        if (\function_exists('opcache_invalidate')) {
            @\opcache_invalidate($file, \true);
            // @ can be restricted
        }
    }
    private function getCacheFile() : string
    {
        if (!$this->tempDirectory) {
            throw new \LogicException('Set path to temporary directory using setTempDirectory().');
        }
        return $this->tempDirectory . '/' . \md5(\serialize($this->getCacheKey())) . '.php';
    }
    protected function getCacheKey() : array
    {
        return [$this->ignoreDirs, $this->acceptFiles, $this->scanPaths, $this->excludeDirs];
    }
}
Licenses
========

Good news! You may use Nette Framework under the terms of either
the New BSD License or the GNU General Public License (GPL) version 2 or 3.

The BSD License is recommended for most projects. It is easy to understand and it
places almost no restrictions on what you can do with the framework. If the GPL
fits better to your project, you can use the framework under this license.

You don't have to notify anyone which license you are using. You can freely
use Nette Framework in commercial projects as long as the copyright header
remains intact.

Please be advised that the name "Nette Framework" is a protected trademark and its
usage has some limitations. So please do not use word "Nette" in the name of your
project or top-level domain, and choose a name that stands on its own merits.
If your stuff is good, it will not take long to establish a reputation for yourselves.


New BSD License
---------------

Copyright (c) 2004, 2014 David Grudl (https://davidgrudl.com)
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 "Nette Framework" 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 owner 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.


GNU General Public License
--------------------------

GPL licenses are very very long, so instead of including them here we offer
you URLs with full text:

- [GPL version 2](http://www.gnu.org/licenses/gpl-2.0.html)
- [GPL version 3](http://www.gnu.org/licenses/gpl-3.0.html)
{
    "name": "nette\/schema",
    "description": "\ud83d\udcd0 Nette Schema: validating data structures against a given Schema.",
    "keywords": [
        "nette",
        "config"
    ],
    "homepage": "https:\/\/nette.org",
    "license": [
        "BSD-3-Clause",
        "GPL-2.0",
        "GPL-3.0"
    ],
    "authors": [
        {
            "name": "David Grudl",
            "homepage": "https:\/\/davidgrudl.com"
        },
        {
            "name": "Nette Community",
            "homepage": "https:\/\/nette.org\/contributors"
        }
    ],
    "require": {
        "php": ">=7.1",
        "nette\/utils": "^3.0.1"
    },
    "require-dev": {
        "nette\/tester": "^2.2",
        "tracy\/tracy": "^2.3"
    },
    "autoload": {
        "classmap": [
            "src\/"
        ]
    },
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "1.0-dev"
        }
    }
}<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Schema;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\Schema\Elements\AnyOf;
use _HumbugBoxb94336daae36\Nette\Schema\Elements\Structure;
use _HumbugBoxb94336daae36\Nette\Schema\Elements\Type;
/**
 * Schema generator.
 *
 * @method static Type scalar($default = null)
 * @method static Type string($default = null)
 * @method static Type int($default = null)
 * @method static Type float($default = null)
 * @method static Type bool($default = null)
 * @method static Type null()
 * @method static Type array()
 * @method static Type list()
 * @method static Type mixed()
 * @method static Type email($default = null)
 */
final class Expect
{
    use Nette\SmartObject;
    public static function __callStatic(string $name, array $args) : \_HumbugBoxb94336daae36\Nette\Schema\Elements\Type
    {
        $type = new \_HumbugBoxb94336daae36\Nette\Schema\Elements\Type($name);
        if ($args) {
            $type->default($args[0]);
        }
        return $type;
    }
    public static function type(string $type) : \_HumbugBoxb94336daae36\Nette\Schema\Elements\Type
    {
        return new \_HumbugBoxb94336daae36\Nette\Schema\Elements\Type($type);
    }
    /**
     * @param  mixed|Schema  ...$set
     */
    public static function anyOf(...$set) : \_HumbugBoxb94336daae36\Nette\Schema\Elements\AnyOf
    {
        return new \_HumbugBoxb94336daae36\Nette\Schema\Elements\AnyOf(...$set);
    }
    /**
     * @param  Schema[]  $items
     */
    public static function structure(array $items) : \_HumbugBoxb94336daae36\Nette\Schema\Elements\Structure
    {
        return new \_HumbugBoxb94336daae36\Nette\Schema\Elements\Structure($items);
    }
    /**
     * @param  object  $object
     */
    public static function from($object, array $items = []) : \_HumbugBoxb94336daae36\Nette\Schema\Elements\Structure
    {
        $ro = new \ReflectionObject($object);
        foreach ($ro->getProperties() as $prop) {
            $type = \_HumbugBoxb94336daae36\Nette\Schema\Helpers::getPropertyType($prop) ?? 'mixed';
            $item =& $items[$prop->getName()];
            if (!$item) {
                $item = new \_HumbugBoxb94336daae36\Nette\Schema\Elements\Type($type);
                if (\PHP_VERSION_ID >= 70400 && !$prop->isInitialized($object)) {
                    $item->required();
                } else {
                    $def = $prop->getValue($object);
                    if (\is_object($def)) {
                        $item = static::from($def);
                    } elseif ($def === null && !\_HumbugBoxb94336daae36\Nette\Utils\Validators::is(null, $type)) {
                        $item->required();
                    } else {
                        $item->default($def);
                    }
                }
            }
        }
        return (new \_HumbugBoxb94336daae36\Nette\Schema\Elements\Structure($items))->castTo($ro->getName());
    }
    /**
     * @param  string|Schema  $type
     */
    public static function arrayOf($type) : \_HumbugBoxb94336daae36\Nette\Schema\Elements\Type
    {
        return (new \_HumbugBoxb94336daae36\Nette\Schema\Elements\Type('array'))->items($type);
    }
    /**
     * @param  string|Schema  $type
     */
    public static function listOf($type) : \_HumbugBoxb94336daae36\Nette\Schema\Elements\Type
    {
        return (new \_HumbugBoxb94336daae36\Nette\Schema\Elements\Type('list'))->items($type);
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Schema;

interface DynamicParameter
{
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Schema;

use _HumbugBoxb94336daae36\Nette;
/**
 * Validation error.
 */
class ValidationException extends \_HumbugBoxb94336daae36\Nette\InvalidStateException
{
    /** @var array */
    private $messages;
    public function __construct(string $message, array $messages = [])
    {
        parent::__construct($message);
        $this->messages = $messages ?: [$message];
    }
    public function getMessages() : array
    {
        return $this->messages;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Schema\Elements;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\Schema\Context;
use _HumbugBoxb94336daae36\Nette\Schema\DynamicParameter;
use _HumbugBoxb94336daae36\Nette\Schema\Helpers;
use _HumbugBoxb94336daae36\Nette\Schema\Schema;
final class Type implements \_HumbugBoxb94336daae36\Nette\Schema\Schema
{
    use Base;
    use Nette\SmartObject;
    /** @var string */
    private $type;
    /** @var Schema|null for arrays */
    private $items;
    /** @var array */
    private $range = [null, null];
    public function __construct(string $type)
    {
        static $defaults = ['list' => [], 'array' => []];
        $this->type = $type;
        $this->default = \strpos($type, '[]') ? [] : $defaults[$type] ?? null;
    }
    public function nullable() : self
    {
        $this->type .= '|null';
        return $this;
    }
    public function dynamic() : self
    {
        $this->type .= '|' . \_HumbugBoxb94336daae36\Nette\Schema\DynamicParameter::class;
        return $this;
    }
    public function min(?float $min) : self
    {
        $this->range[0] = $min;
        return $this;
    }
    public function max(?float $max) : self
    {
        $this->range[1] = $max;
        return $this;
    }
    /**
     * @param  string|Schema  $type
     */
    public function items($type = 'mixed') : self
    {
        $this->items = $type instanceof \_HumbugBoxb94336daae36\Nette\Schema\Schema ? $type : new self($type);
        return $this;
    }
    /********************* processing ****************d*g**/
    public function normalize($value, \_HumbugBoxb94336daae36\Nette\Schema\Context $context)
    {
        $value = $this->doNormalize($value, $context);
        if (\is_array($value) && $this->items) {
            foreach ($value as $key => $val) {
                $context->path[] = $key;
                $value[$key] = $this->items->normalize($val, $context);
                \array_pop($context->path);
            }
        }
        return $value;
    }
    public function merge($value, $base)
    {
        if (\is_array($value) && isset($value[\_HumbugBoxb94336daae36\Nette\Schema\Helpers::PREVENT_MERGING])) {
            unset($value[\_HumbugBoxb94336daae36\Nette\Schema\Helpers::PREVENT_MERGING]);
            return $value;
        }
        if (\is_array($value) && \is_array($base) && $this->items) {
            $index = 0;
            foreach ($value as $key => $val) {
                if ($key === $index) {
                    $base[] = $val;
                    $index++;
                } else {
                    $base[$key] = \array_key_exists($key, $base) ? $this->items->merge($val, $base[$key]) : $val;
                }
            }
            return $base;
        }
        return \_HumbugBoxb94336daae36\Nette\Schema\Helpers::merge($value, $base);
    }
    public function complete($value, \_HumbugBoxb94336daae36\Nette\Schema\Context $context)
    {
        if ($value === null && \is_array($this->default)) {
            $value = [];
            // is unable to distinguish null from array in NEON
        }
        $expected = $this->type . ($this->range === [null, null] ? '' : ':' . \implode('..', $this->range));
        if (!$this->doValidate($value, $expected, $context)) {
            return;
        }
        if ($value instanceof \_HumbugBoxb94336daae36\Nette\Schema\DynamicParameter) {
            $context->dynamics[] = [$value, \str_replace('|' . \_HumbugBoxb94336daae36\Nette\Schema\DynamicParameter::class, '', $expected)];
        }
        if ($this->items) {
            $errCount = \count($context->errors);
            foreach ($value as $key => $val) {
                $context->path[] = $key;
                $value[$key] = $this->items->complete($val, $context);
                \array_pop($context->path);
            }
            if (\count($context->errors) > $errCount) {
                return null;
            }
        }
        $value = \_HumbugBoxb94336daae36\Nette\Schema\Helpers::merge($value, $this->default);
        return $this->doFinalize($value, $context);
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Schema\Elements;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\Schema\Context;
use _HumbugBoxb94336daae36\Nette\Schema\Helpers;
use _HumbugBoxb94336daae36\Nette\Schema\Schema;
final class Structure implements \_HumbugBoxb94336daae36\Nette\Schema\Schema
{
    use Base;
    use Nette\SmartObject;
    /** @var Schema[] */
    private $items;
    /** @var Schema|null  for array|list */
    private $otherItems;
    /** @var array */
    private $range = [null, null];
    /**
     * @param  Schema[]  $items
     */
    public function __construct(array $items)
    {
        (function (\_HumbugBoxb94336daae36\Nette\Schema\Schema ...$items) {
        })(...\array_values($items));
        $this->items = $items;
        $this->castTo = 'object';
    }
    public function default($value) : self
    {
        throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException('Structure cannot have default value.');
    }
    public function min(?float $min) : self
    {
        $this->range[0] = $min;
        return $this;
    }
    public function max(?float $max) : self
    {
        $this->range[1] = $max;
        return $this;
    }
    /**
     * @param  string|Schema  $type
     */
    public function otherItems($type = 'mixed') : self
    {
        $this->otherItems = $type instanceof \_HumbugBoxb94336daae36\Nette\Schema\Schema ? $type : new \_HumbugBoxb94336daae36\Nette\Schema\Elements\Type($type);
        return $this;
    }
    /********************* processing ****************d*g**/
    public function normalize($value, \_HumbugBoxb94336daae36\Nette\Schema\Context $context)
    {
        $value = $this->doNormalize($value, $context);
        if (\is_array($value)) {
            foreach ($value as $key => $val) {
                $itemSchema = $this->items[$key] ?? $this->otherItems;
                if ($itemSchema) {
                    $context->path[] = $key;
                    $value[$key] = $itemSchema->normalize($val, $context);
                    \array_pop($context->path);
                }
            }
        }
        return $value;
    }
    public function merge($value, $base)
    {
        if (\is_array($value) && isset($value[\_HumbugBoxb94336daae36\Nette\Schema\Helpers::PREVENT_MERGING])) {
            unset($value[\_HumbugBoxb94336daae36\Nette\Schema\Helpers::PREVENT_MERGING]);
            $base = null;
        }
        if (\is_array($value) && \is_array($base)) {
            $index = 0;
            foreach ($value as $key => $val) {
                if ($key === $index) {
                    $base[] = $val;
                    $index++;
                } elseif (\array_key_exists($key, $base)) {
                    $itemSchema = $this->items[$key] ?? $this->otherItems;
                    $base[$key] = $itemSchema ? $itemSchema->merge($val, $base[$key]) : \_HumbugBoxb94336daae36\Nette\Schema\Helpers::merge($val, $base[$key]);
                } else {
                    $base[$key] = $val;
                }
            }
            return $base;
        }
        return \_HumbugBoxb94336daae36\Nette\Schema\Helpers::merge($value, $base);
    }
    public function complete($value, \_HumbugBoxb94336daae36\Nette\Schema\Context $context)
    {
        if ($value === null) {
            $value = [];
            // is unable to distinguish null from array in NEON
        } elseif (\is_object($value)) {
            $value = (array) $value;
        }
        $expected = 'array' . ($this->range === [null, null] ? '' : ':' . \implode('..', $this->range));
        if (!$this->doValidate($value, $expected, $context)) {
            return;
        }
        $errCount = \count($context->errors);
        $items = $this->items;
        if ($extraKeys = \array_keys(\array_diff_key($value, $items))) {
            if ($this->otherItems) {
                $items += \array_fill_keys($extraKeys, $this->otherItems);
            } else {
                $hint = \_HumbugBoxb94336daae36\Nette\Utils\ObjectHelpers::getSuggestion(\array_map('strval', \array_keys($items)), (string) $extraKeys[0]);
                $s = \implode("', '", \array_map(function ($key) use($context) {
                    return \implode(' › ', \array_merge($context->path, [$key]));
                }, $hint ? [$extraKeys[0]] : $extraKeys));
                $context->addError("Unexpected option '{$s}'" . ($hint ? ", did you mean '{$hint}'?" : '.'));
            }
        }
        foreach ($items as $itemKey => $itemVal) {
            $context->path[] = $itemKey;
            if (\array_key_exists($itemKey, $value)) {
                $value[$itemKey] = $itemVal->complete($value[$itemKey], $context);
            } else {
                $default = $itemVal->completeDefault($context);
                // checks required item
                if (!$context->skipDefaults) {
                    $value[$itemKey] = $default;
                }
            }
            \array_pop($context->path);
        }
        if (\count($context->errors) > $errCount) {
            return;
        }
        return $this->doFinalize($value, $context);
    }
    public function completeDefault(\_HumbugBoxb94336daae36\Nette\Schema\Context $context)
    {
        return $this->complete([], $context);
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Schema\Elements;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\Schema\Context;
/**
 * @internal
 */
trait Base
{
    /** @var bool */
    private $required = \false;
    /** @var mixed */
    private $default;
    /** @var callable|null */
    private $before;
    /** @var callable[] */
    private $asserts = [];
    /** @var string|null */
    private $castTo;
    public function default($value) : self
    {
        $this->default = $value;
        return $this;
    }
    public function required() : self
    {
        $this->required = \true;
        return $this;
    }
    public function before(callable $handler) : self
    {
        $this->before = $handler;
        return $this;
    }
    public function castTo(string $type) : self
    {
        $this->castTo = $type;
        return $this;
    }
    public function assert(callable $handler) : self
    {
        $this->asserts[] = $handler;
        return $this;
    }
    public function completeDefault(\_HumbugBoxb94336daae36\Nette\Schema\Context $context)
    {
        if ($this->required) {
            $context->addError('The mandatory option %path% is missing.');
            return null;
        }
        return $this->default;
    }
    public function doNormalize($value, \_HumbugBoxb94336daae36\Nette\Schema\Context $context)
    {
        if ($this->before) {
            $value = ($this->before)($value);
        }
        return $value;
    }
    private function doValidate($value, string $expected, \_HumbugBoxb94336daae36\Nette\Schema\Context $context) : bool
    {
        try {
            \_HumbugBoxb94336daae36\Nette\Utils\Validators::assert($value, $expected, 'option %path%');
            return \true;
        } catch (\_HumbugBoxb94336daae36\Nette\Utils\AssertionException $e) {
            $context->addError($e->getMessage(), $expected);
            return \false;
        }
    }
    private function doFinalize($value, \_HumbugBoxb94336daae36\Nette\Schema\Context $context)
    {
        if ($this->castTo) {
            if (\_HumbugBoxb94336daae36\Nette\Utils\Reflection::isBuiltinType($this->castTo)) {
                \settype($value, $this->castTo);
            } else {
                $value = \_HumbugBoxb94336daae36\Nette\Utils\Arrays::toObject($value, new $this->castTo());
            }
        }
        foreach ($this->asserts as $i => $assert) {
            if (!$assert($value)) {
                $expected = \is_string($assert) ? "{$assert}()" : "#{$i}";
                $context->addError("Failed assertion {$expected} for option %path% with value " . static::formatValue($value) . '.');
                return;
            }
        }
        return $value;
    }
    private static function formatValue($value) : string
    {
        if (\is_string($value)) {
            return "'{$value}'";
        } elseif (\is_bool($value)) {
            return $value ? 'true' : 'false';
        } elseif (\is_scalar($value)) {
            return (string) $value;
        } else {
            return \strtolower(\gettype($value));
        }
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Schema\Elements;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\Schema\Context;
use _HumbugBoxb94336daae36\Nette\Schema\Helpers;
use _HumbugBoxb94336daae36\Nette\Schema\Schema;
final class AnyOf implements \_HumbugBoxb94336daae36\Nette\Schema\Schema
{
    use Base;
    use Nette\SmartObject;
    /** @var array */
    private $set;
    /**
     * @param  mixed|Schema  ...$set
     */
    public function __construct(...$set)
    {
        $this->set = $set;
    }
    public function nullable() : self
    {
        $this->set[] = null;
        return $this;
    }
    public function dynamic() : self
    {
        $this->set[] = new \_HumbugBoxb94336daae36\Nette\Schema\Elements\Type(\_HumbugBoxb94336daae36\Nette\Schema\DynamicParameter::class);
        return $this;
    }
    /********************* processing ****************d*g**/
    public function normalize($value, \_HumbugBoxb94336daae36\Nette\Schema\Context $context)
    {
        return $this->doNormalize($value, $context);
    }
    public function merge($value, $base)
    {
        if (\is_array($value) && isset($value[\_HumbugBoxb94336daae36\Nette\Schema\Helpers::PREVENT_MERGING])) {
            unset($value[\_HumbugBoxb94336daae36\Nette\Schema\Helpers::PREVENT_MERGING]);
            return $value;
        }
        return \_HumbugBoxb94336daae36\Nette\Schema\Helpers::merge($value, $base);
    }
    public function complete($value, \_HumbugBoxb94336daae36\Nette\Schema\Context $context)
    {
        $hints = $innerErrors = [];
        foreach ($this->set as $item) {
            if ($item instanceof \_HumbugBoxb94336daae36\Nette\Schema\Schema) {
                $dolly = new \_HumbugBoxb94336daae36\Nette\Schema\Context();
                $dolly->path = $context->path;
                $res = $item->complete($value, $dolly);
                if (!$dolly->errors) {
                    return $this->doFinalize($res, $context);
                }
                foreach ($dolly->errors as $error) {
                    if ($error->path !== $context->path || !$error->hint) {
                        $innerErrors[] = $error;
                    } else {
                        $hints[] = $error->hint;
                    }
                }
            } else {
                if ($item === $value) {
                    return $this->doFinalize($value, $context);
                }
                $hints[] = static::formatValue($item);
            }
        }
        if ($innerErrors) {
            $context->errors = \array_merge($context->errors, $innerErrors);
        } else {
            $hints = \implode('|', \array_unique($hints));
            $context->addError("The option %path% expects to be {$hints}, " . static::formatValue($value) . ' given.');
        }
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Schema;

use _HumbugBoxb94336daae36\Nette;
/**
 * @internal
 */
final class Context
{
    use Nette\SmartObject;
    /** @var bool */
    public $skipDefaults = \false;
    /** @var string[] */
    public $path = [];
    /** @var \stdClass[] */
    public $errors = [];
    /** @var array[] */
    public $dynamics = [];
    public function addError($message, $hint = null)
    {
        $this->errors[] = (object) ['message' => $message, 'path' => $this->path, 'hint' => $hint];
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Schema;

use _HumbugBoxb94336daae36\Nette;
/**
 * Schema validator.
 */
final class Processor
{
    use Nette\SmartObject;
    /** @var array */
    public $onNewContext = [];
    /** @var bool */
    private $skipDefaults;
    public function skipDefaults(bool $value = \true)
    {
        $this->skipDefaults = $value;
    }
    /**
     * Normalizes and validates data. Result is a clean completed data.
     * @return mixed
     * @throws ValidationException
     */
    public function process(\_HumbugBoxb94336daae36\Nette\Schema\Schema $schema, $data)
    {
        $context = $this->createContext();
        $data = $schema->normalize($data, $context);
        $this->throwsErrors($context);
        $data = $schema->complete($data, $context);
        $this->throwsErrors($context);
        return $data;
    }
    /**
     * Normalizes and validates and merges multiple data. Result is a clean completed data.
     * @return mixed
     * @throws ValidationException
     */
    public function processMultiple(\_HumbugBoxb94336daae36\Nette\Schema\Schema $schema, array $dataset)
    {
        $context = $this->createContext();
        $flatten = null;
        $first = \true;
        foreach ($dataset as $data) {
            $data = $schema->normalize($data, $context);
            $this->throwsErrors($context);
            $flatten = $first ? $data : $schema->merge($data, $flatten);
            $first = \false;
        }
        $data = $schema->complete($flatten, $context);
        $this->throwsErrors($context);
        return $data;
    }
    private function throwsErrors(\_HumbugBoxb94336daae36\Nette\Schema\Context $context) : void
    {
        $messages = [];
        foreach ($context->errors as $error) {
            $pathStr = " '" . \implode(' › ', $error->path) . "'";
            $messages[] = \str_replace(' %path%', $error->path ? $pathStr : '', $error->message);
        }
        if ($messages) {
            throw new \_HumbugBoxb94336daae36\Nette\Schema\ValidationException($messages[0], $messages);
        }
    }
    private function createContext() : \_HumbugBoxb94336daae36\Nette\Schema\Context
    {
        $context = new \_HumbugBoxb94336daae36\Nette\Schema\Context();
        $context->skipDefaults = $this->skipDefaults;
        $this->onNewContext($context);
        return $context;
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Schema;

interface Schema
{
    /**
     * Normalization.
     * @return mixed
     */
    function normalize($value, \_HumbugBoxb94336daae36\Nette\Schema\Context $context);
    /**
     * Merging.
     * @return mixed
     */
    function merge($value, $base);
    /**
     * Validation and finalization.
     * @return mixed
     */
    function complete($value, \_HumbugBoxb94336daae36\Nette\Schema\Context $context);
    /**
     * @return mixed
     */
    function completeDefault(\_HumbugBoxb94336daae36\Nette\Schema\Context $context);
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Schema;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\Utils\Reflection;
/**
 * @internal
 */
final class Helpers
{
    use Nette\StaticClass;
    public const PREVENT_MERGING = '_prevent_merging';
    /**
     * Merges dataset. Left has higher priority than right one.
     * @return array|string
     */
    public static function merge($value, $base)
    {
        if (\is_array($value) && isset($value[self::PREVENT_MERGING])) {
            unset($value[self::PREVENT_MERGING]);
            return $value;
        }
        if (\is_array($value) && \is_array($base)) {
            $index = 0;
            foreach ($value as $key => $val) {
                if ($key === $index) {
                    $base[] = $val;
                    $index++;
                } else {
                    $base[$key] = static::merge($val, $base[$key] ?? null);
                }
            }
            return $base;
        } elseif ($value === null && \is_array($base)) {
            return $base;
        } else {
            return $value;
        }
    }
    public static function getPropertyType(\ReflectionProperty $prop) : ?string
    {
        if ($type = \_HumbugBoxb94336daae36\Nette\Utils\Reflection::getPropertyType($prop)) {
            return ($prop->getType()->allowsNull() ? '?' : '') . $type;
        } elseif ($type = \preg_replace('#\\s.*#', '', (string) self::parseAnnotation($prop, 'var'))) {
            $class = \_HumbugBoxb94336daae36\Nette\Utils\Reflection::getPropertyDeclaringClass($prop);
            return \preg_replace_callback('#[\\w\\\\]+#', function ($m) use($class) {
                return \_HumbugBoxb94336daae36\Nette\Utils\Reflection::expandClassName($m[0], $class);
            }, $type);
        }
        return null;
    }
    /**
     * Returns an annotation value.
     */
    public static function parseAnnotation(\Reflector $ref, string $name) : ?string
    {
        if (!\_HumbugBoxb94336daae36\Nette\Utils\Reflection::areCommentsAvailable()) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException('You have to enable phpDoc comments in opcode cache.');
        }
        $re = '#[\\s*]@' . \preg_quote($name, '#') . '(?=\\s|$)(?:[ \\t]+([^@\\s]\\S*))?#';
        if ($ref->getDocComment() && \preg_match($re, \trim($ref->getDocComment(), '/*'), $m)) {
            return $m[1] ?? '';
        }
        return null;
    }
}
Licenses
========

Good news! You may use Nette Framework under the terms of either
the New BSD License or the GNU General Public License (GPL) version 2 or 3.

The BSD License is recommended for most projects. It is easy to understand and it
places almost no restrictions on what you can do with the framework. If the GPL
fits better to your project, you can use the framework under this license.

You don't have to notify anyone which license you are using. You can freely
use Nette Framework in commercial projects as long as the copyright header
remains intact.

Please be advised that the name "Nette Framework" is a protected trademark and its
usage has some limitations. So please do not use word "Nette" in the name of your
project or top-level domain, and choose a name that stands on its own merits.
If your stuff is good, it will not take long to establish a reputation for yourselves.


New BSD License
---------------

Copyright (c) 2004, 2014 David Grudl (https://davidgrudl.com)
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 "Nette Framework" 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 owner 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.


GNU General Public License
--------------------------

GPL licenses are very very long, so instead of including them here we offer
you URLs with full text:

- [GPL version 2](http://www.gnu.org/licenses/gpl-2.0.html)
- [GPL version 3](http://www.gnu.org/licenses/gpl-3.0.html)
{
    "name": "nette\/finder",
    "description": "\ud83d\udd0d Nette Finder: find files and directories with an intuitive API.",
    "keywords": [
        "nette",
        "filesystem",
        "iterator",
        "glob"
    ],
    "homepage": "https:\/\/nette.org",
    "license": [
        "BSD-3-Clause",
        "GPL-2.0",
        "GPL-3.0"
    ],
    "authors": [
        {
            "name": "David Grudl",
            "homepage": "https:\/\/davidgrudl.com"
        },
        {
            "name": "Nette Community",
            "homepage": "https:\/\/nette.org\/contributors"
        }
    ],
    "require": {
        "php": ">=7.1",
        "nette\/utils": "^2.4 || ~3.0.0"
    },
    "require-dev": {
        "nette\/tester": "^2.0",
        "tracy\/tracy": "^2.3"
    },
    "conflict": {
        "nette\/nette": "<2.2"
    },
    "autoload": {
        "classmap": [
            "src\/"
        ]
    },
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.5-dev"
        }
    }
}<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Utils;

use _HumbugBoxb94336daae36\Nette;
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
/**
 * Finder allows searching through directory trees using iterator.
 *
 * <code>
 * Finder::findFiles('*.php')
 *     ->size('> 10kB')
 *     ->from('.')
 *     ->exclude('temp');
 * </code>
 */
class Finder implements \IteratorAggregate, \Countable
{
    use Nette\SmartObject;
    /** @var callable  extension methods */
    private static $extMethods = [];
    /** @var array */
    private $paths = [];
    /** @var array of filters */
    private $groups = [];
    /** @var array filter for recursive traversing */
    private $exclude = [];
    /** @var int */
    private $order = \RecursiveIteratorIterator::SELF_FIRST;
    /** @var int */
    private $maxDepth = -1;
    /** @var array */
    private $cursor;
    /**
     * Begins search for files matching mask and all directories.
     * @param  string|string[]  $masks
     * @return static
     */
    public static function find(...$masks) : self
    {
        $masks = $masks && \is_array($masks[0]) ? $masks[0] : $masks;
        return (new static())->select($masks, 'isDir')->select($masks, 'isFile');
    }
    /**
     * Begins search for files matching mask.
     * @param  string|string[]  $masks
     * @return static
     */
    public static function findFiles(...$masks) : self
    {
        $masks = $masks && \is_array($masks[0]) ? $masks[0] : $masks;
        return (new static())->select($masks, 'isFile');
    }
    /**
     * Begins search for directories matching mask.
     * @param  string|string[]  $masks
     * @return static
     */
    public static function findDirectories(...$masks) : self
    {
        $masks = $masks && \is_array($masks[0]) ? $masks[0] : $masks;
        return (new static())->select($masks, 'isDir');
    }
    /**
     * Creates filtering group by mask & type selector.
     * @return static
     */
    private function select(array $masks, string $type) : self
    {
        $this->cursor =& $this->groups[];
        $pattern = self::buildPattern($masks);
        $this->filter(function (\RecursiveDirectoryIterator $file) use($type, $pattern) : bool {
            return !$file->isDot() && $file->{$type}() && (!$pattern || \preg_match($pattern, '/' . \strtr($file->getSubPathName(), '\\', '/')));
        });
        return $this;
    }
    /**
     * Searches in the given folder(s).
     * @param  string|string[]  $paths
     * @return static
     */
    public function in(...$paths) : self
    {
        $this->maxDepth = 0;
        return $this->from(...$paths);
    }
    /**
     * Searches recursively from the given folder(s).
     * @param  string|string[]  $paths
     * @return static
     */
    public function from(...$paths) : self
    {
        if ($this->paths) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException('Directory to search has already been specified.');
        }
        $this->paths = \is_array($paths[0]) ? $paths[0] : $paths;
        $this->cursor =& $this->exclude;
        return $this;
    }
    /**
     * Shows folder content prior to the folder.
     * @return static
     */
    public function childFirst() : self
    {
        $this->order = \RecursiveIteratorIterator::CHILD_FIRST;
        return $this;
    }
    /**
     * Converts Finder pattern to regular expression.
     */
    private static function buildPattern(array $masks) : ?string
    {
        $pattern = [];
        foreach ($masks as $mask) {
            $mask = \rtrim(\strtr($mask, '\\', '/'), '/');
            $prefix = '';
            if ($mask === '') {
                continue;
            } elseif ($mask === '*') {
                return null;
            } elseif ($mask[0] === '/') {
                // absolute fixing
                $mask = \ltrim($mask, '/');
                $prefix = '(?<=^/)';
            }
            $pattern[] = $prefix . \strtr(\preg_quote($mask, '#'), ['\\*\\*' => '.*', '\\*' => '[^/]*', '\\?' => '[^/]', '\\[\\!' => '[^', '\\[' => '[', '\\]' => ']', '\\-' => '-']);
        }
        return $pattern ? '#/(' . \implode('|', $pattern) . ')\\z#i' : null;
    }
    /********************* iterator generator ****************d*g**/
    /**
     * Get the number of found files and/or directories.
     */
    public function count() : int
    {
        return \iterator_count($this->getIterator());
    }
    /**
     * Returns iterator.
     */
    public function getIterator() : \Iterator
    {
        if (!$this->paths) {
            throw new \_HumbugBoxb94336daae36\Nette\InvalidStateException('Call in() or from() to specify directory to search.');
        } elseif (\count($this->paths) === 1) {
            return $this->buildIterator((string) $this->paths[0]);
        } else {
            $iterator = new \AppendIterator();
            foreach ($this->paths as $path) {
                $iterator->append($this->buildIterator((string) $path));
            }
            return $iterator;
        }
    }
    /**
     * Returns per-path iterator.
     */
    private function buildIterator(string $path) : \Iterator
    {
        $iterator = new \RecursiveDirectoryIterator($path, \RecursiveDirectoryIterator::FOLLOW_SYMLINKS);
        if ($this->exclude) {
            $iterator = new \RecursiveCallbackFilterIterator($iterator, function ($foo, $bar, \RecursiveDirectoryIterator $file) : bool {
                if (!$file->isDot() && !$file->isFile()) {
                    foreach ($this->exclude as $filter) {
                        if (!$filter($file)) {
                            return \false;
                        }
                    }
                }
                return \true;
            });
        }
        if ($this->maxDepth !== 0) {
            $iterator = new \RecursiveIteratorIterator($iterator, $this->order);
            $iterator->setMaxDepth($this->maxDepth);
        }
        $iterator = new \CallbackFilterIterator($iterator, function ($foo, $bar, \Iterator $file) : bool {
            while ($file instanceof \OuterIterator) {
                $file = $file->getInnerIterator();
            }
            foreach ($this->groups as $filters) {
                foreach ($filters as $filter) {
                    if (!$filter($file)) {
                        continue 2;
                    }
                }
                return \true;
            }
            return \false;
        });
        return $iterator;
    }
    /********************* filtering ****************d*g**/
    /**
     * Restricts the search using mask.
     * Excludes directories from recursive traversing.
     * @param  string|string[]  $masks
     * @return static
     */
    public function exclude(...$masks) : self
    {
        $masks = $masks && \is_array($masks[0]) ? $masks[0] : $masks;
        $pattern = self::buildPattern($masks);
        if ($pattern) {
            $this->filter(function (\RecursiveDirectoryIterator $file) use($pattern) : bool {
                return !\preg_match($pattern, '/' . \strtr($file->getSubPathName(), '\\', '/'));
            });
        }
        return $this;
    }
    /**
     * Restricts the search using callback.
     * @param  callable  $callback  function (RecursiveDirectoryIterator $file): bool
     * @return static
     */
    public function filter(callable $callback) : self
    {
        $this->cursor[] = $callback;
        return $this;
    }
    /**
     * Limits recursion level.
     * @return static
     */
    public function limitDepth(int $depth) : self
    {
        $this->maxDepth = $depth;
        return $this;
    }
    /**
     * Restricts the search by size.
     * @param  string  $operator  "[operator] [size] [unit]" example: >=10kB
     * @return static
     */
    public function size(string $operator, int $size = null) : self
    {
        if (\func_num_args() === 1) {
            // in $operator is predicate
            if (!\preg_match('#^(?:([=<>!]=?|<>)\\s*)?((?:\\d*\\.)?\\d+)\\s*(K|M|G|)B?\\z#i', $operator, $matches)) {
                throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Invalid size predicate format.');
            }
            [, $operator, $size, $unit] = $matches;
            static $units = ['' => 1, 'k' => 1000.0, 'm' => 1000000.0, 'g' => 1000000000.0];
            $size *= $units[\strtolower($unit)];
            $operator = $operator ?: '=';
        }
        return $this->filter(function (\RecursiveDirectoryIterator $file) use($operator, $size) : bool {
            return self::compare($file->getSize(), $operator, $size);
        });
    }
    /**
     * Restricts the search by modified time.
     * @param  string  $operator  "[operator] [date]" example: >1978-01-23
     * @param  string|int|\DateTimeInterface  $date
     * @return static
     */
    public function date(string $operator, $date = null) : self
    {
        if (\func_num_args() === 1) {
            // in $operator is predicate
            if (!\preg_match('#^(?:([=<>!]=?|<>)\\s*)?(.+)\\z#i', $operator, $matches)) {
                throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException('Invalid date predicate format.');
            }
            [, $operator, $date] = $matches;
            $operator = $operator ?: '=';
        }
        $date = \_HumbugBoxb94336daae36\Nette\Utils\DateTime::from($date)->format('U');
        return $this->filter(function (\RecursiveDirectoryIterator $file) use($operator, $date) : bool {
            return self::compare($file->getMTime(), $operator, $date);
        });
    }
    /**
     * Compares two values.
     */
    public static function compare($l, string $operator, $r) : bool
    {
        switch ($operator) {
            case '>':
                return $l > $r;
            case '>=':
                return $l >= $r;
            case '<':
                return $l < $r;
            case '<=':
                return $l <= $r;
            case '=':
            case '==':
                return $l == $r;
            case '!':
            case '!=':
            case '<>':
                return $l != $r;
            default:
                throw new \_HumbugBoxb94336daae36\Nette\InvalidArgumentException("Unknown operator {$operator}.");
        }
    }
    /********************* extension methods ****************d*g**/
    public function __call(string $name, array $args)
    {
        return isset(self::$extMethods[$name]) ? self::$extMethods[$name]($this, ...$args) : parent::__call($name, $args);
    }
    public static function extensionMethod(string $name, callable $callback) : void
    {
        self::$extMethods[$name] = $callback;
    }
}
Licenses
========

Good news! You may use Nette Framework under the terms of either
the New BSD License or the GNU General Public License (GPL) version 2 or 3.

The BSD License is recommended for most projects. It is easy to understand and it
places almost no restrictions on what you can do with the framework. If the GPL
fits better to your project, you can use the framework under this license.

You don't have to notify anyone which license you are using. You can freely
use Nette Framework in commercial projects as long as the copyright header
remains intact.

Please be advised that the name "Nette Framework" is a protected trademark and its
usage has some limitations. So please do not use word "Nette" in the name of your
project or top-level domain, and choose a name that stands on its own merits.
If your stuff is good, it will not take long to establish a reputation for yourselves.


New BSD License
---------------

Copyright (c) 2004, 2014 David Grudl (https://davidgrudl.com)
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 "Nette Framework" 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 owner 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.


GNU General Public License
--------------------------

GPL licenses are very very long, so instead of including them here we offer
you URLs with full text:

- [GPL version 2](http://www.gnu.org/licenses/gpl-2.0.html)
- [GPL version 3](http://www.gnu.org/licenses/gpl-3.0.html)
{
    "name": "nette\/neon",
    "description": "\ud83c\udf78 Nette NEON: encodes and decodes NEON file format.",
    "keywords": [
        "nette",
        "neon",
        "import",
        "export",
        "yaml"
    ],
    "homepage": "http:\/\/ne-on.org",
    "license": [
        "BSD-3-Clause",
        "GPL-2.0",
        "GPL-3.0"
    ],
    "authors": [
        {
            "name": "David Grudl",
            "homepage": "https:\/\/davidgrudl.com"
        },
        {
            "name": "Nette Community",
            "homepage": "https:\/\/nette.org\/contributors"
        }
    ],
    "require": {
        "php": ">=7.0",
        "ext-iconv": "*",
        "ext-json": "*"
    },
    "require-dev": {
        "nette\/tester": "^2.0",
        "tracy\/tracy": "^2.3"
    },
    "autoload": {
        "classmap": [
            "src\/"
        ]
    },
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "3.0-dev"
        }
    }
}<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Neon;

/**
 * Simple generator for Nette Object Notation.
 */
final class Encoder
{
    const BLOCK = 1;
    /**
     * Returns the NEON representation of a value.
     */
    public function encode($var, int $flags = 0) : string
    {
        if ($var instanceof \DateTimeInterface) {
            return $var->format('Y-m-d H:i:s O');
        } elseif ($var instanceof \_HumbugBoxb94336daae36\Nette\Neon\Entity) {
            if ($var->value === \_HumbugBoxb94336daae36\Nette\Neon\Neon::CHAIN) {
                return \implode('', \array_map([$this, 'encode'], $var->attributes));
            }
            return $this->encode($var->value) . '(' . (\is_array($var->attributes) ? \substr($this->encode($var->attributes), 1, -1) : '') . ')';
        }
        if (\is_object($var)) {
            $obj = $var;
            $var = [];
            foreach ($obj as $k => $v) {
                $var[$k] = $v;
            }
        }
        if (\is_array($var)) {
            $isList = !$var || \array_keys($var) === \range(0, \count($var) - 1);
            $s = '';
            if ($flags & self::BLOCK) {
                if (\count($var) === 0) {
                    return '[]';
                }
                foreach ($var as $k => $v) {
                    $v = $this->encode($v, self::BLOCK);
                    $s .= ($isList ? '-' : $this->encode($k) . ':') . (\strpos($v, "\n") === \false ? ' ' . $v . "\n" : "\n" . \preg_replace('#^(?=.)#m', "\t", $v) . (\substr($v, -2, 1) === "\n" ? '' : "\n"));
                }
                return $s;
            } else {
                foreach ($var as $k => $v) {
                    $s .= ($isList ? '' : $this->encode($k) . ': ') . $this->encode($v) . ', ';
                }
                return ($isList ? '[' : '{') . \substr($s, 0, -2) . ($isList ? ']' : '}');
            }
        } elseif (\is_string($var) && !\is_numeric($var) && !\preg_match('~[\\x00-\\x1F]|^\\d{4}|^(true|false|yes|no|on|off|null)\\z~i', $var) && \preg_match('~^' . \_HumbugBoxb94336daae36\Nette\Neon\Decoder::PATTERNS[1] . '\\z~x', $var)) {
            return $var;
        } elseif (\is_float($var)) {
            $var = \json_encode($var);
            return \strpos($var, '.') === \false ? $var . '.0' : $var;
        } else {
            return \json_encode($var, \JSON_UNESCAPED_UNICODE | \JSON_UNESCAPED_SLASHES);
        }
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Neon;

/**
 * Parser for Nette Object Notation.
 * @internal
 */
final class Decoder
{
    const PATTERNS = [
        '
			\'\'\'\\n (?:(?: [^\\n] | \\n(?![\\t\\ ]*+\'\'\') )*+ \\n)?[\\t\\ ]*+\'\'\' |
			"""\\n (?:(?: [^\\n] | \\n(?![\\t\\ ]*+""") )*+ \\n)?[\\t\\ ]*+""" |
			\'[^\'\\n]*+\' |
			" (?: \\\\. | [^"\\\\\\n] )*+ "
		',
        // string
        '
			(?: [^#"\',:=[\\]{}()\\x00-\\x20!`-] | [:-][^"\',\\]})\\s] )
			(?:
				[^,:=\\]})(\\x00-\\x20]++ |
				:(?! [\\s,\\]})] | $ ) |
				[\\ \\t]++ [^#,:=\\]})(\\x00-\\x20]
			)*+
		',
        // literal / boolean / integer / float
        '
			[,:=[\\]{}()-]
		',
        // symbol
        '?:\\#.*+',
        // comment
        '\\n[\\t\\ ]*+',
        // new line + indent
        '?:[\\t\\ ]++',
    ];
    const PATTERN_DATETIME = '#\\d\\d\\d\\d-\\d\\d?-\\d\\d?(?:(?:[Tt]| ++)\\d\\d?:\\d\\d:\\d\\d(?:\\.\\d*+)? *+(?:Z|[-+]\\d\\d?(?::?\\d\\d)?)?)?\\z#A';
    const PATTERN_HEX = '#0x[0-9a-fA-F]++\\z#A';
    const PATTERN_OCTAL = '#0o[0-7]++\\z#A';
    const PATTERN_BINARY = '#0b[0-1]++\\z#A';
    const SIMPLE_TYPES = ['true' => 'TRUE', 'True' => 'TRUE', 'TRUE' => 'TRUE', 'yes' => 'TRUE', 'Yes' => 'TRUE', 'YES' => 'TRUE', 'on' => 'TRUE', 'On' => 'TRUE', 'ON' => 'TRUE', 'false' => 'FALSE', 'False' => 'FALSE', 'FALSE' => 'FALSE', 'no' => 'FALSE', 'No' => 'FALSE', 'NO' => 'FALSE', 'off' => 'FALSE', 'Off' => 'FALSE', 'OFF' => 'FALSE', 'null' => 'NULL', 'Null' => 'NULL', 'NULL' => 'NULL'];
    const ESCAPE_SEQUENCES = ['t' => "\t", 'n' => "\n", 'r' => "\r", 'f' => "\f", 'b' => "\10", '"' => '"', '\\' => '\\', '/' => '/', '_' => " "];
    const BRACKETS = ['[' => ']', '{' => '}', '(' => ')'];
    /** @var string */
    private $input;
    /** @var array */
    private $tokens;
    /** @var int */
    private $pos;
    /**
     * Decodes a NEON string.
     * @return mixed
     */
    public function decode(string $input)
    {
        if (!\is_string($input)) {
            throw new \InvalidArgumentException(\sprintf('Argument must be a string, %s given.', \gettype($input)));
        } elseif (\substr($input, 0, 3) === "﻿") {
            // BOM
            $input = \substr($input, 3);
        }
        $this->input = "\n" . \str_replace("\r", '', $input);
        // \n forces indent detection
        $pattern = '~(' . \implode(')|(', self::PATTERNS) . ')~Amix';
        $this->tokens = \preg_split($pattern, $this->input, -1, \PREG_SPLIT_NO_EMPTY | \PREG_SPLIT_OFFSET_CAPTURE | \PREG_SPLIT_DELIM_CAPTURE);
        $last = \end($this->tokens);
        if ($this->tokens && !\preg_match($pattern, $last[0])) {
            $this->pos = \count($this->tokens) - 1;
            $this->error();
        }
        $this->pos = 0;
        $res = $this->parse(null);
        while (isset($this->tokens[$this->pos])) {
            if ($this->tokens[$this->pos][0][0] === "\n") {
                $this->pos++;
            } else {
                $this->error();
            }
        }
        return $res;
    }
    /**
     * @param  string|bool|null  $indent  indentation (for block-parser)
     * @return mixed
     */
    private function parse($indent, array $result = null, $key = null, bool $hasKey = \false)
    {
        $inlineParser = $indent === \false;
        $value = null;
        $hasValue = \false;
        $tokens = $this->tokens;
        $n =& $this->pos;
        $count = \count($tokens);
        $mainResult =& $result;
        for (; $n < $count; $n++) {
            $t = $tokens[$n][0];
            if ($t === ',') {
                // ArrayEntry separator
                if (!$hasKey && !$hasValue || !$inlineParser) {
                    $this->error();
                }
                $this->addValue($result, $hasKey ? $key : null, $hasValue ? $value : null);
                $hasKey = $hasValue = \false;
            } elseif ($t === ':' || $t === '=') {
                // KeyValuePair separator
                if ($hasValue && (\is_array($value) || \is_object($value))) {
                    $this->error('Unacceptable key');
                } elseif ($hasKey && $key === null && $hasValue && !$inlineParser) {
                    $n++;
                    $result[] = $this->parse($indent . '  ', [], $value, \true);
                    $newIndent = isset($tokens[$n], $tokens[$n + 1]) ? (string) \substr($tokens[$n][0], 1) : '';
                    // not last
                    if (\strlen($newIndent) > \strlen($indent)) {
                        $n++;
                        $this->error('Bad indentation');
                    } elseif (\strlen($newIndent) < \strlen($indent)) {
                        return $mainResult;
                        // block parser exit point
                    }
                    $hasKey = $hasValue = \false;
                } elseif ($hasKey || !$hasValue) {
                    $this->error();
                } else {
                    $key = (string) $value;
                    $hasKey = \true;
                    $hasValue = \false;
                    $result =& $mainResult;
                }
            } elseif ($t === '-') {
                // BlockArray bullet
                if ($hasKey || $hasValue || $inlineParser) {
                    $this->error();
                }
                $key = null;
                $hasKey = \true;
            } elseif (isset(self::BRACKETS[$t])) {
                // Opening bracket [ ( {
                if ($hasValue) {
                    if ($t !== '(') {
                        $this->error();
                    }
                    $n++;
                    if ($value instanceof \_HumbugBoxb94336daae36\Nette\Neon\Entity && $value->value === \_HumbugBoxb94336daae36\Nette\Neon\Neon::CHAIN) {
                        \end($value->attributes)->attributes = $this->parse(\false, []);
                    } else {
                        $value = new \_HumbugBoxb94336daae36\Nette\Neon\Entity($value, $this->parse(\false, []));
                    }
                } else {
                    $n++;
                    $value = $this->parse(\false, []);
                }
                $hasValue = \true;
                if (!isset($tokens[$n]) || $tokens[$n][0] !== self::BRACKETS[$t]) {
                    // unexpected type of bracket or block-parser
                    $this->error();
                }
            } elseif ($t === ']' || $t === '}' || $t === ')') {
                // Closing bracket ] ) }
                if (!$inlineParser) {
                    $this->error();
                }
                break;
            } elseif ($t[0] === "\n") {
                // Indent
                if ($inlineParser) {
                    if ($hasKey || $hasValue) {
                        $this->addValue($result, $hasKey ? $key : null, $hasValue ? $value : null);
                        $hasKey = $hasValue = \false;
                    }
                } else {
                    while (isset($tokens[$n + 1]) && $tokens[$n + 1][0][0] === "\n") {
                        $n++;
                        // skip to last indent
                    }
                    if (!isset($tokens[$n + 1])) {
                        break;
                    }
                    $newIndent = (string) \substr($tokens[$n][0], 1);
                    if ($indent === null) {
                        // first iteration
                        $indent = $newIndent;
                    }
                    $minlen = \min(\strlen($newIndent), \strlen($indent));
                    if ($minlen && (string) \substr($newIndent, 0, $minlen) !== (string) \substr($indent, 0, $minlen)) {
                        $n++;
                        $this->error('Invalid combination of tabs and spaces');
                    }
                    if (\strlen($newIndent) > \strlen($indent)) {
                        // open new block-array or hash
                        if ($hasValue || !$hasKey) {
                            $n++;
                            $this->error('Bad indentation');
                        }
                        $this->addValue($result, $key, $this->parse($newIndent));
                        $newIndent = isset($tokens[$n], $tokens[$n + 1]) ? (string) \substr($tokens[$n][0], 1) : '';
                        // not last
                        if (\strlen($newIndent) > \strlen($indent)) {
                            $n++;
                            $this->error('Bad indentation');
                        }
                        $hasKey = \false;
                    } else {
                        if ($hasValue && !$hasKey) {
                            // block items must have "key"; null key means list item
                            break;
                        } elseif ($hasKey) {
                            $this->addValue($result, $key, $hasValue ? $value : null);
                            if ($key !== null && !$hasValue && $newIndent === $indent && isset($tokens[$n + 1]) && $tokens[$n + 1][0] === '-') {
                                $result =& $result[$key];
                            }
                            $hasKey = $hasValue = \false;
                        }
                    }
                    if (\strlen($newIndent) < \strlen($indent)) {
                        // close block
                        return $mainResult;
                        // block parser exit point
                    }
                }
            } else {
                // Value
                if ($t[0] === '"' || $t[0] === "'") {
                    if (\preg_match('#^...\\n++([\\t ]*+)#', $t, $m)) {
                        $converted = \substr($t, 3, -3);
                        $converted = \str_replace("\n" . $m[1], "\n", $converted);
                        $converted = \preg_replace('#^\\n|\\n[\\t ]*+\\z#', '', $converted);
                    } else {
                        $converted = \substr($t, 1, -1);
                    }
                    if ($t[0] === '"') {
                        $converted = \preg_replace_callback('#\\\\(?:ud[89ab][0-9a-f]{2}\\\\ud[c-f][0-9a-f]{2}|u[0-9a-f]{4}|x[0-9a-f]{2}|.)#i', [$this, 'cbString'], $converted);
                    }
                } elseif (($fix56 = self::SIMPLE_TYPES) && isset($fix56[$t]) && (!isset($tokens[$n + 1][0]) || $tokens[$n + 1][0] !== ':' && $tokens[$n + 1][0] !== '=')) {
                    $converted = \constant(self::SIMPLE_TYPES[$t]);
                } elseif (\is_numeric($t)) {
                    $converted = $t * 1;
                } elseif (\preg_match(self::PATTERN_HEX, $t)) {
                    $converted = \hexdec($t);
                } elseif (\preg_match(self::PATTERN_OCTAL, $t)) {
                    $converted = \octdec($t);
                } elseif (\preg_match(self::PATTERN_BINARY, $t)) {
                    $converted = \bindec($t);
                } elseif (\preg_match(self::PATTERN_DATETIME, $t)) {
                    $converted = new \DateTimeImmutable($t);
                } else {
                    // literal
                    $converted = $t;
                }
                if ($hasValue) {
                    if ($value instanceof \_HumbugBoxb94336daae36\Nette\Neon\Entity) {
                        // Entity chaining
                        if ($value->value !== \_HumbugBoxb94336daae36\Nette\Neon\Neon::CHAIN) {
                            $value = new \_HumbugBoxb94336daae36\Nette\Neon\Entity(\_HumbugBoxb94336daae36\Nette\Neon\Neon::CHAIN, [$value]);
                        }
                        $value->attributes[] = new \_HumbugBoxb94336daae36\Nette\Neon\Entity($converted);
                    } else {
                        $this->error();
                    }
                } else {
                    $value = $converted;
                    $hasValue = \true;
                }
            }
        }
        if ($inlineParser) {
            if ($hasKey || $hasValue) {
                $this->addValue($result, $hasKey ? $key : null, $hasValue ? $value : null);
            }
        } else {
            if ($hasValue && !$hasKey) {
                // block items must have "key"
                if ($result === null) {
                    $result = $value;
                    // simple value parser
                } else {
                    $this->error();
                }
            } elseif ($hasKey) {
                $this->addValue($result, $key, $hasValue ? $value : null);
            }
        }
        return $mainResult;
    }
    private function addValue(&$result, $key, $value)
    {
        if ($key === null) {
            $result[] = $value;
        } elseif ($result && \array_key_exists($key, $result)) {
            $this->error("Duplicated key '{$key}'");
        } else {
            $result[$key] = $value;
        }
    }
    private function cbString(array $m) : string
    {
        $sq = $m[0];
        if (($fix56 = self::ESCAPE_SEQUENCES) && isset($fix56[$sq[1]])) {
            // workaround for PHP 5.6
            return self::ESCAPE_SEQUENCES[$sq[1]];
        } elseif ($sq[1] === 'u' && \strlen($sq) >= 6) {
            $lead = \hexdec(\substr($sq, 2, 4));
            $tail = \hexdec(\substr($sq, 8, 4));
            $code = $tail ? 0x2400 + ($lead - 0xd800 << 10) + $tail : $lead;
            if ($code >= 0xd800 && $code <= 0xdfff) {
                $this->error("Invalid UTF-8 (lone surrogate) {$sq}");
            }
            return \iconv('UTF-32BE', 'UTF-8//IGNORE', \pack('N', $code));
        } elseif ($sq[1] === 'x' && \strlen($sq) === 4) {
            return \chr(\hexdec(\substr($sq, 2)));
        } else {
            $this->error("Invalid escaping sequence {$sq}");
            return '';
        }
    }
    private function error(string $message = "Unexpected '%s'")
    {
        $last = isset($this->tokens[$this->pos]) ? $this->tokens[$this->pos] : null;
        $offset = $last ? $last[1] : \strlen($this->input);
        $text = \substr($this->input, 0, $offset);
        $line = \substr_count($text, "\n");
        $col = $offset - \strrpos("\n" . $text, "\n") + 1;
        $token = $last ? \str_replace("\n", '<new line>', \substr($last[0], 0, 40)) : 'end';
        throw new \_HumbugBoxb94336daae36\Nette\Neon\Exception(\str_replace('%s', $token, $message) . " on line {$line}, column {$col}.");
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Neon;

/**
 * The exception that indicates error of NEON processing.
 */
class Exception extends \Exception
{
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Neon;

/**
 * Representation of 'foo(bar=1)' literal
 */
final class Entity extends \stdClass
{
    /** @var mixed */
    public $value;
    /** @var array */
    public $attributes;
    public function __construct($value, array $attrs = [])
    {
        $this->value = $value;
        $this->attributes = $attrs;
    }
    public static function __set_state(array $properties)
    {
        return new self($properties['value'], $properties['attributes']);
    }
}
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */
declare (strict_types=1);
namespace _HumbugBoxb94336daae36\Nette\Neon;

/**
 * Simple parser & generator for Nette Object Notation.
 */
final class Neon
{
    const BLOCK = \_HumbugBoxb94336daae36\Nette\Neon\Encoder::BLOCK;
    const CHAIN = '!!chain';
    /**
     * Returns the NEON representation of a value.
     */
    public static function encode($var, int $flags = 0) : string
    {
        $encoder = new \_HumbugBoxb94336daae36\Nette\Neon\Encoder();
        return $encoder->encode($var, $flags);
    }
    /**
     * Decodes a NEON string.
     * @return mixed
     */
    public static function decode(string $input)
    {
        $decoder = new \_HumbugBoxb94336daae36\Nette\Neon\Decoder();
        return $decoder->decode($input);
    }
}
<?php

declare (strict_types=1);
namespace _HumbugBoxb94336daae36;

require __DIR__ . '/Neon/Decoder.php';
require __DIR__ . '/Neon/Encoder.php';
require __DIR__ . '/Neon/Entity.php';
require __DIR__ . '/Neon/Exception.php';
require __DIR__ . '/Neon/Neon.php';
Copyright (c) 2016 Marco Pivetta

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.
{
    "name": "ocramius\/package-versions",
    "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)",
    "type": "composer-plugin",
    "license": "MIT",
    "authors": [
        {
            "name": "Marco Pivetta",
            "email": "ocramius@gmail.com"
        }
    ],
    "require": {
        "php": "^7.1.0",
        "composer-plugin-api": "^1.0.0"
    },
    "require-dev": {
        "phpunit\/phpunit": "^7.0.0",
        "infection\/infection": "^0.7.1",
        "composer\/composer": "^1.6.3",
        "ext-zip": "*",
        "doctrine\/coding-standard": "^5.0.1"
    },
    "autoload": {
        "psr-4": {
            "_HumbugBoxb94336daae36\\PackageVersions\\": "src\/PackageVersions"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "_HumbugBoxb94336daae36\\PackageVersionsTest\\": "test\/PackageVersionsTest"
        }
    },
    "extra": {
        "class": "PackageVersions\\Installer",
        "branch-alias": {
            "dev-master": "2.0.x-dev"
        }
    },
    "scripts": {
        "post-update-cmd": "PackageVersions\\Installer::dumpVersionsClass",
        "post-install-cmd": "PackageVersions\\Installer::dumpVersionsClass"
    }
}<?php

declare (strict_types=1);
namespace _HumbugBoxb94336daae36\PackageVersions;

/**
 * This class is generated by ocramius/package-versions, specifically by
 * @see \PackageVersions\Installer
 *
 * This file is overwritten at every run of `composer install` or `composer update`.
 */
final class Versions
{
    public const ROOT_PACKAGE_NAME = 'phpstan/phpstan';
    public const VERSIONS = array('composer/xdebug-handler' => '1.3.3@46867cbf8ca9fb8d60c506895449eb799db1184f', 'dg/composer-cleaner' => 'v2.1@91f865f0b50c66dd647955a0e5ba7745d8086945', 'jean85/pretty-package-versions' => '1.2@75c7effcf3f77501d0e0caa75111aff4daa0dd48', 'nette/bootstrap' => 'v3.0.0@e1075af05c211915e03e0c86542f3ba5433df4a3', 'nette/di' => 'v3.0.0@19d83539245aaacb59470828919182411061841f', 'nette/finder' => 'v2.5.0@6be1b83ea68ac558aff189d640abe242e0306fe2', 'nette/neon' => 'v3.0.0@cbff32059cbdd8720deccf9e9eace6ee516f02eb', 'nette/php-generator' => 'v3.2.2@acff8b136fad84b860a626d133e791f95781f9f5', 'nette/robot-loader' => 'v3.2.0@0712a0e39ae7956d6a94c0ab6ad41aa842544b5c', 'nette/schema' => 'v1.0.0@6241d8d4da39e825dd6cb5bfbe4242912f4d7e4d', 'nette/utils' => 'v3.0.1@bd961f49b211997202bda1d0fbc410905be370d4', 'nikic/php-parser' => 'v4.2.2@1bd73cc04c3843ad8d6b0bfc0956026a151fc420', 'ocramius/package-versions' => '1.4.0@a4d4b60d0e60da2487bd21a2c6ac089f85570dbb', 'phpstan/phpdoc-parser' => '0.3.4@ab518a5fc8f1d90f58bd2c5552ba915e2c477b66', 'psr/log' => '1.1.0@6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd', 'symfony/console' => 'v3.4.28@8e1d1e406dd31727fa70cd5a99cda202e9d6a5c6', 'symfony/debug' => 'v3.4.28@671fc55bd14800668b1d0a3708c3714940e30a8c', 'symfony/finder' => 'v3.4.28@fa5d962a71f2169dfe1cbae217fa5a2799859f6c', 'symfony/polyfill-mbstring' => 'v1.11.0@fe5e94c604826c35a32fa832f35bd036b6799609', 'phpstan/phpstan' => '0.11.8@fcf0081bf3a254ddacffa03e78be87842d0c09c9');
    private function __construct()
    {
    }
    /**
     * @throws \OutOfBoundsException If a version cannot be located.
     */
    public static function getVersion(string $packageName) : string
    {
        if (isset(self::VERSIONS[$packageName])) {
            return self::VERSIONS[$packageName];
        }
        throw new \OutOfBoundsException('Required package "' . $packageName . '" is not installed: cannot detect its version');
    }
}
<?php

declare (strict_types=1);
namespace _HumbugBoxb94336daae36\PackageVersions;

use Generator;
use OutOfBoundsException;
use UnexpectedValueException;
use function array_key_exists;
use function array_merge;
use function file_exists;
use function file_get_contents;
use function iterator_to_array;
use function json_decode;
use function json_encode;
use function sprintf;
/**
 * @internal
 *
 * This is a fallback for {@see \PackageVersions\Versions::getVersion()}
 * Do not use this class directly: it is intended to be only used when
 * {@see \PackageVersions\Versions} fails to be generated, which typically
 * happens when running composer with `--no-scripts` flag)
 */
final class FallbackVersions
{
    public const ROOT_PACKAGE_NAME = 'unknown/root-package@UNKNOWN';
    private function __construct()
    {
    }
    /**
     * @throws OutOfBoundsException If a version cannot be located.
     * @throws UnexpectedValueException If the composer.lock file could not be located.
     */
    public static function getVersion(string $packageName) : string
    {
        $versions = \iterator_to_array(self::getVersions(self::getComposerLockPath()));
        if (!\array_key_exists($packageName, $versions)) {
            throw new \OutOfBoundsException('Required package "' . $packageName . '" is not installed: cannot detect its version');
        }
        return $versions[$packageName];
    }
    /**
     * @throws UnexpectedValueException
     */
    private static function getComposerLockPath() : string
    {
        // bold assumption, but there's not here to fix everyone's problems.
        $checkedPaths = [__DIR__ . '/../../../../../composer.lock', __DIR__ . '/../../composer.lock'];
        foreach ($checkedPaths as $path) {
            if (\file_exists($path)) {
                return $path;
            }
        }
        throw new \UnexpectedValueException(\sprintf('PackageVersions could not locate your `composer.lock` location. This is assumed to be in %s. ' . 'If you customized your composer vendor directory and ran composer installation with --no-scripts, ' . 'then you are on your own, and we can\'t really help you. Fix your shit and cut the tooling some slack.', \json_encode($checkedPaths)));
    }
    private static function getVersions(string $composerLockFile) : \Generator
    {
        $lockData = \json_decode(\file_get_contents($composerLockFile), \true);
        $lockData['packages-dev'] = $lockData['packages-dev'] ?? [];
        foreach (\array_merge($lockData['packages'], $lockData['packages-dev']) as $package) {
            (yield $package['name'] => $package['version'] . '@' . ($package['source']['reference'] ?? $package['dist']['reference'] ?? ''));
        }
        (yield self::ROOT_PACKAGE_NAME);
    }
}
<?php

declare (strict_types=1);
namespace _HumbugBoxb94336daae36\PackageVersions;

use _HumbugBoxb94336daae36\Composer\Composer;
use _HumbugBoxb94336daae36\Composer\Config;
use _HumbugBoxb94336daae36\Composer\EventDispatcher\EventSubscriberInterface;
use _HumbugBoxb94336daae36\Composer\IO\IOInterface;
use _HumbugBoxb94336daae36\Composer\Package\AliasPackage;
use _HumbugBoxb94336daae36\Composer\Package\Locker;
use _HumbugBoxb94336daae36\Composer\Package\PackageInterface;
use _HumbugBoxb94336daae36\Composer\Package\RootPackageInterface;
use _HumbugBoxb94336daae36\Composer\Plugin\PluginInterface;
use _HumbugBoxb94336daae36\Composer\Script\Event;
use _HumbugBoxb94336daae36\Composer\Script\ScriptEvents;
use Generator;
use RuntimeException;
use function array_key_exists;
use function array_merge;
use function chmod;
use function dirname;
use function file_exists;
use function file_put_contents;
use function iterator_to_array;
use function rename;
use function sprintf;
use function uniqid;
use function var_export;
final class Installer implements \_HumbugBoxb94336daae36\Composer\Plugin\PluginInterface, \_HumbugBoxb94336daae36\Composer\EventDispatcher\EventSubscriberInterface
{
    /** @var string */
    private static $generatedClassTemplate = <<<'PHP'
<?php

declare(strict_types=1);

namespace PackageVersions;

/**
 * This class is generated by ocramius/package-versions, specifically by
 * @see \PackageVersions\Installer
 *
 * This file is overwritten at every run of `composer install` or `composer update`.
 */
%s
{
    public const ROOT_PACKAGE_NAME = '%s';
    public const VERSIONS          = %s;

    private function __construct()
    {
    }

    /**
     * @throws \OutOfBoundsException If a version cannot be located.
     */
    public static function getVersion(string $packageName) : string
    {
        if (isset(self::VERSIONS[$packageName])) {
            return self::VERSIONS[$packageName];
        }

        throw new \OutOfBoundsException(
            'Required package "' . $packageName . '" is not installed: cannot detect its version'
        );
    }
}

PHP;
    /**
     * {@inheritDoc}
     */
    public function activate(\_HumbugBoxb94336daae36\Composer\Composer $composer, \_HumbugBoxb94336daae36\Composer\IO\IOInterface $io) : void
    {
        // Nothing to do here, as all features are provided through event listeners
    }
    /**
     * {@inheritDoc}
     */
    public static function getSubscribedEvents() : array
    {
        return [\_HumbugBoxb94336daae36\Composer\Script\ScriptEvents::POST_INSTALL_CMD => 'dumpVersionsClass', \_HumbugBoxb94336daae36\Composer\Script\ScriptEvents::POST_UPDATE_CMD => 'dumpVersionsClass'];
    }
    /**
     * @throws RuntimeException
     */
    public static function dumpVersionsClass(\_HumbugBoxb94336daae36\Composer\Script\Event $composerEvent) : void
    {
        $composer = $composerEvent->getComposer();
        $rootPackage = $composer->getPackage();
        $versions = \iterator_to_array(self::getVersions($composer->getLocker(), $rootPackage));
        if (!\array_key_exists('ocramius/package-versions', $versions)) {
            //plugin must be globally installed - we only want to generate versions for projects which specifically
            //require ocramius/package-versions
            return;
        }
        $versionClass = self::generateVersionsClass($rootPackage->getName(), $versions);
        self::writeVersionClassToFile($versionClass, $composer, $composerEvent->getIO());
    }
    /**
     * @param string[] $versions
     */
    private static function generateVersionsClass(string $rootPackageName, array $versions) : string
    {
        return \sprintf(
            self::$generatedClassTemplate,
            'fin' . 'al ' . 'cla' . 'ss ' . 'Versions',
            // note: workaround for regex-based code parsers :-(
            $rootPackageName,
            \var_export($versions, \true)
        );
    }
    /**
     * @throws RuntimeException
     */
    private static function writeVersionClassToFile(string $versionClassSource, \_HumbugBoxb94336daae36\Composer\Composer $composer, \_HumbugBoxb94336daae36\Composer\IO\IOInterface $io) : void
    {
        $installPath = self::locateRootPackageInstallPath($composer->getConfig(), $composer->getPackage()) . '/src/PackageVersions/Versions.php';
        if (!\file_exists(\dirname($installPath))) {
            $io->write('<info>ocramius/package-versions:</info> Package not found (probably scheduled for removal); generation of version class skipped.');
            return;
        }
        $io->write('<info>ocramius/package-versions:</info>  Generating version class...');
        $installPathTmp = $installPath . '_' . \uniqid('tmp', \true);
        \file_put_contents($installPathTmp, $versionClassSource);
        \chmod($installPathTmp, 0664);
        \rename($installPathTmp, $installPath);
        $io->write('<info>ocramius/package-versions:</info> ...done generating version class');
    }
    /**
     * @throws RuntimeException
     */
    private static function locateRootPackageInstallPath(\_HumbugBoxb94336daae36\Composer\Config $composerConfig, \_HumbugBoxb94336daae36\Composer\Package\RootPackageInterface $rootPackage) : string
    {
        if (self::getRootPackageAlias($rootPackage)->getName() === 'ocramius/package-versions') {
            return \dirname($composerConfig->get('vendor-dir'));
        }
        return $composerConfig->get('vendor-dir') . '/ocramius/package-versions';
    }
    private static function getRootPackageAlias(\_HumbugBoxb94336daae36\Composer\Package\RootPackageInterface $rootPackage) : \_HumbugBoxb94336daae36\Composer\Package\PackageInterface
    {
        $package = $rootPackage;
        while ($package instanceof \_HumbugBoxb94336daae36\Composer\Package\AliasPackage) {
            $package = $package->getAliasOf();
        }
        return $package;
    }
    /**
     * @return Generator|string[]
     */
    private static function getVersions(\_HumbugBoxb94336daae36\Composer\Package\Locker $locker, \_HumbugBoxb94336daae36\Composer\Package\RootPackageInterface $rootPackage) : \Generator
    {
        $lockData = $locker->getLockData();
        $lockData['packages-dev'] = $lockData['packages-dev'] ?? [];
        foreach (\array_merge($lockData['packages'], $lockData['packages-dev']) as $package) {
            (yield $package['name'] => $package['version'] . '@' . ($package['source']['reference'] ?? $package['dist']['reference'] ?? ''));
        }
        foreach ($rootPackage->getReplaces() as $replace) {
            $version = $replace->getPrettyConstraint();
            if ($version === 'self.version') {
                $version = $rootPackage->getPrettyVersion();
            }
            (yield $replace->getTarget() => $version . '@' . $rootPackage->getSourceReference());
        }
        (yield $rootPackage->getName() => $rootPackage->getPrettyVersion() . '@' . $rootPackage->getSourceReference());
    }
}
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 _HumbugBoxb94336daae36\Psr\Log;

/**
 * Describes a logger-aware instance.
 */
interface LoggerAwareInterface
{
    /**
     * Sets a logger instance on the object.
     *
     * @param LoggerInterface $logger
     *
     * @return void
     */
    public function setLogger(\_HumbugBoxb94336daae36\Psr\Log\LoggerInterface $logger);
}
<?php

namespace _HumbugBoxb94336daae36\Psr\Log;

/**
 * Describes log levels.
 */
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 _HumbugBoxb94336daae36\Psr\Log\Test;

use _HumbugBoxb94336daae36\Psr\Log\LoggerInterface;
use _HumbugBoxb94336daae36\Psr\Log\LogLevel;
/**
 * Provides a base test class for ensuring compliance with the LoggerInterface.
 *
 * Implementors can extend the class and implement abstract methods to run this
 * as part of their test suite.
 */
abstract class LoggerInterfaceTest extends \_HumbugBoxb94336daae36\PHPUnit_Framework_TestCase
{
    /**
     * @return LoggerInterface
     */
    public abstract function getLogger();
    /**
     * This must return the log messages in order.
     *
     * The simple formatting of the messages is: "<LOG LEVEL> <MESSAGE>".
     *
     * Example ->error('Foo') would yield "error Foo".
     *
     * @return string[]
     */
    public abstract function getLogs();
    public function testImplements()
    {
        $this->assertInstanceOf('_HumbugBoxb94336daae36\\Psr\\Log\\LoggerInterface', $this->getLogger());
    }
    /**
     * @dataProvider provideLevelsAndMessages
     */
    public function testLogsAtAllLevels($level, $message)
    {
        $logger = $this->getLogger();
        $logger->{$level}($message, array('user' => 'Bob'));
        $logger->log($level, $message, array('user' => 'Bob'));
        $expected = array($level . ' message of level ' . $level . ' with context: Bob', $level . ' message of level ' . $level . ' with context: Bob');
        $this->assertEquals($expected, $this->getLogs());
    }
    public function provideLevelsAndMessages()
    {
        return array(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::EMERGENCY => array(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::EMERGENCY, 'message of level emergency with context: {user}'), \_HumbugBoxb94336daae36\Psr\Log\LogLevel::ALERT => array(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::ALERT, 'message of level alert with context: {user}'), \_HumbugBoxb94336daae36\Psr\Log\LogLevel::CRITICAL => array(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::CRITICAL, 'message of level critical with context: {user}'), \_HumbugBoxb94336daae36\Psr\Log\LogLevel::ERROR => array(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::ERROR, 'message of level error with context: {user}'), \_HumbugBoxb94336daae36\Psr\Log\LogLevel::WARNING => array(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::WARNING, 'message of level warning with context: {user}'), \_HumbugBoxb94336daae36\Psr\Log\LogLevel::NOTICE => array(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::NOTICE, 'message of level notice with context: {user}'), \_HumbugBoxb94336daae36\Psr\Log\LogLevel::INFO => array(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::INFO, 'message of level info with context: {user}'), \_HumbugBoxb94336daae36\Psr\Log\LogLevel::DEBUG => array(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::DEBUG, 'message of level debug with context: {user}'));
    }
    /**
     * @expectedException \Psr\Log\InvalidArgumentException
     */
    public function testThrowsOnInvalidLevel()
    {
        $logger = $this->getLogger();
        $logger->log('invalid level', 'Foo');
    }
    public function testContextReplacement()
    {
        $logger = $this->getLogger();
        $logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar'));
        $expected = array('info {Message {nothing} Bob Bar a}');
        $this->assertEquals($expected, $this->getLogs());
    }
    public function testObjectCastToString()
    {
        if (\method_exists($this, 'createPartialMock')) {
            $dummy = $this->createPartialMock('_HumbugBoxb94336daae36\\Psr\\Log\\Test\\DummyTest', array('__toString'));
        } else {
            $dummy = $this->getMock('_HumbugBoxb94336daae36\\Psr\\Log\\Test\\DummyTest', array('__toString'));
        }
        $dummy->expects($this->once())->method('__toString')->will($this->returnValue('DUMMY'));
        $this->getLogger()->warning($dummy);
        $expected = array('warning DUMMY');
        $this->assertEquals($expected, $this->getLogs());
    }
    public function testContextCanContainAnything()
    {
        $closed = \fopen('php://memory', 'r');
        \fclose($closed);
        $context = array('bool' => \true, 'null' => null, 'string' => 'Foo', 'int' => 0, 'float' => 0.5, 'nested' => array('with object' => new \_HumbugBoxb94336daae36\Psr\Log\Test\DummyTest()), 'object' => new \DateTime(), 'resource' => \fopen('php://memory', 'r'), 'closed' => $closed);
        $this->getLogger()->warning('Crazy context data', $context);
        $expected = array('warning Crazy context data');
        $this->assertEquals($expected, $this->getLogs());
    }
    public function testContextExceptionKeyCanBeExceptionOrOtherValues()
    {
        $logger = $this->getLogger();
        $logger->warning('Random message', array('exception' => 'oops'));
        $logger->critical('Uncaught Exception!', array('exception' => new \LogicException('Fail')));
        $expected = array('warning Random message', 'critical Uncaught Exception!');
        $this->assertEquals($expected, $this->getLogs());
    }
}
class DummyTest
{
    public function __toString()
    {
    }
}
<?php

namespace _HumbugBoxb94336daae36\Psr\Log\Test;

use _HumbugBoxb94336daae36\Psr\Log\AbstractLogger;
/**
 * Used for testing purposes.
 *
 * It records all records and gives you access to them for verification.
 *
 * @method bool hasEmergency($record)
 * @method bool hasAlert($record)
 * @method bool hasCritical($record)
 * @method bool hasError($record)
 * @method bool hasWarning($record)
 * @method bool hasNotice($record)
 * @method bool hasInfo($record)
 * @method bool hasDebug($record)
 *
 * @method bool hasEmergencyRecords()
 * @method bool hasAlertRecords()
 * @method bool hasCriticalRecords()
 * @method bool hasErrorRecords()
 * @method bool hasWarningRecords()
 * @method bool hasNoticeRecords()
 * @method bool hasInfoRecords()
 * @method bool hasDebugRecords()
 *
 * @method bool hasEmergencyThatContains($message)
 * @method bool hasAlertThatContains($message)
 * @method bool hasCriticalThatContains($message)
 * @method bool hasErrorThatContains($message)
 * @method bool hasWarningThatContains($message)
 * @method bool hasNoticeThatContains($message)
 * @method bool hasInfoThatContains($message)
 * @method bool hasDebugThatContains($message)
 *
 * @method bool hasEmergencyThatMatches($message)
 * @method bool hasAlertThatMatches($message)
 * @method bool hasCriticalThatMatches($message)
 * @method bool hasErrorThatMatches($message)
 * @method bool hasWarningThatMatches($message)
 * @method bool hasNoticeThatMatches($message)
 * @method bool hasInfoThatMatches($message)
 * @method bool hasDebugThatMatches($message)
 *
 * @method bool hasEmergencyThatPasses($message)
 * @method bool hasAlertThatPasses($message)
 * @method bool hasCriticalThatPasses($message)
 * @method bool hasErrorThatPasses($message)
 * @method bool hasWarningThatPasses($message)
 * @method bool hasNoticeThatPasses($message)
 * @method bool hasInfoThatPasses($message)
 * @method bool hasDebugThatPasses($message)
 */
class TestLogger extends \_HumbugBoxb94336daae36\Psr\Log\AbstractLogger
{
    /**
     * @var array
     */
    public $records = [];
    public $recordsByLevel = [];
    /**
     * @inheritdoc
     */
    public function log($level, $message, array $context = [])
    {
        $record = ['level' => $level, 'message' => $message, 'context' => $context];
        $this->recordsByLevel[$record['level']][] = $record;
        $this->records[] = $record;
    }
    public function hasRecords($level)
    {
        return isset($this->recordsByLevel[$level]);
    }
    public function hasRecord($record, $level)
    {
        if (\is_string($record)) {
            $record = ['message' => $record];
        }
        return $this->hasRecordThatPasses(function ($rec) use($record) {
            if ($rec['message'] !== $record['message']) {
                return \false;
            }
            if (isset($record['context']) && $rec['context'] !== $record['context']) {
                return \false;
            }
            return \true;
        }, $level);
    }
    public function hasRecordThatContains($message, $level)
    {
        return $this->hasRecordThatPasses(function ($rec) use($message) {
            return \strpos($rec['message'], $message) !== \false;
        }, $level);
    }
    public function hasRecordThatMatches($regex, $level)
    {
        return $this->hasRecordThatPasses(function ($rec) use($regex) {
            return \preg_match($regex, $rec['message']) > 0;
        }, $level);
    }
    public function hasRecordThatPasses(callable $predicate, $level)
    {
        if (!isset($this->recordsByLevel[$level])) {
            return \false;
        }
        foreach ($this->recordsByLevel[$level] as $i => $rec) {
            if (\call_user_func($predicate, $rec, $i)) {
                return \true;
            }
        }
        return \false;
    }
    public function __call($method, $args)
    {
        if (\preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) {
            $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3];
            $level = \strtolower($matches[2]);
            if (\method_exists($this, $genericMethod)) {
                $args[] = $level;
                return \call_user_func_array([$this, $genericMethod], $args);
            }
        }
        throw new \BadMethodCallException('Call to undefined method ' . \get_class($this) . '::' . $method . '()');
    }
    public function reset()
    {
        $this->records = [];
    }
}
<?php

namespace _HumbugBoxb94336daae36\Psr\Log;

/**
 * Basic Implementation of LoggerAwareInterface.
 */
trait LoggerAwareTrait
{
    /**
     * The logger instance.
     *
     * @var LoggerInterface
     */
    protected $logger;
    /**
     * Sets a logger.
     *
     * @param LoggerInterface $logger
     */
    public function setLogger(\_HumbugBoxb94336daae36\Psr\Log\LoggerInterface $logger)
    {
        $this->logger = $logger;
    }
}
<?php

namespace _HumbugBoxb94336daae36\Psr\Log;

class InvalidArgumentException extends \InvalidArgumentException
{
}
<?php

namespace _HumbugBoxb94336daae36\Psr\Log;

/**
 * This Logger can be used to avoid conditional log calls.
 *
 * Logging should always be optional, and if no logger is provided to your
 * library creating a NullLogger instance to have something to throw logs at
 * is a good way to avoid littering your code with `if ($this->logger) { }`
 * blocks.
 */
class NullLogger extends \_HumbugBoxb94336daae36\Psr\Log\AbstractLogger
{
    /**
     * Logs with an arbitrary level.
     *
     * @param mixed  $level
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function log($level, $message, array $context = array())
    {
        // noop
    }
}
<?php

namespace _HumbugBoxb94336daae36\Psr\Log;

/**
 * Describes a logger instance.
 *
 * The message MUST be a string or object implementing __toString().
 *
 * The message MAY contain placeholders in the form: {foo} where foo
 * will be replaced by the context data in key "foo".
 *
 * The context array can contain arbitrary data. The only assumption that
 * can be made by implementors is that if an Exception instance is given
 * to produce a stack trace, it MUST be in a key named "exception".
 *
 * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
 * for the full interface specification.
 */
interface LoggerInterface
{
    /**
     * System is unusable.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function emergency($message, array $context = array());
    /**
     * Action must be taken immediately.
     *
     * Example: Entire website down, database unavailable, etc. This should
     * trigger the SMS alerts and wake you up.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function alert($message, array $context = array());
    /**
     * Critical conditions.
     *
     * Example: Application component unavailable, unexpected exception.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function critical($message, array $context = array());
    /**
     * Runtime errors that do not require immediate action but should typically
     * be logged and monitored.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function error($message, array $context = array());
    /**
     * Exceptional occurrences that are not errors.
     *
     * Example: Use of deprecated APIs, poor use of an API, undesirable things
     * that are not necessarily wrong.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function warning($message, array $context = array());
    /**
     * Normal but significant events.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function notice($message, array $context = array());
    /**
     * Interesting events.
     *
     * Example: User logs in, SQL logs.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function info($message, array $context = array());
    /**
     * Detailed debug information.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function debug($message, array $context = array());
    /**
     * Logs with an arbitrary level.
     *
     * @param mixed  $level
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function log($level, $message, array $context = array());
}
<?php

namespace _HumbugBoxb94336daae36\Psr\Log;

/**
 * This is a simple Logger trait that classes unable to extend AbstractLogger
 * (because they extend another class, etc) can include.
 *
 * It simply delegates all log-level-specific methods to the `log` method to
 * reduce boilerplate code that a simple Logger that does the same thing with
 * messages regardless of the error level has to implement.
 */
trait LoggerTrait
{
    /**
     * System is unusable.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function emergency($message, array $context = array())
    {
        $this->log(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::EMERGENCY, $message, $context);
    }
    /**
     * Action must be taken immediately.
     *
     * Example: Entire website down, database unavailable, etc. This should
     * trigger the SMS alerts and wake you up.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function alert($message, array $context = array())
    {
        $this->log(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::ALERT, $message, $context);
    }
    /**
     * Critical conditions.
     *
     * Example: Application component unavailable, unexpected exception.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function critical($message, array $context = array())
    {
        $this->log(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::CRITICAL, $message, $context);
    }
    /**
     * Runtime errors that do not require immediate action but should typically
     * be logged and monitored.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function error($message, array $context = array())
    {
        $this->log(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::ERROR, $message, $context);
    }
    /**
     * Exceptional occurrences that are not errors.
     *
     * Example: Use of deprecated APIs, poor use of an API, undesirable things
     * that are not necessarily wrong.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function warning($message, array $context = array())
    {
        $this->log(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::WARNING, $message, $context);
    }
    /**
     * Normal but significant events.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function notice($message, array $context = array())
    {
        $this->log(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::NOTICE, $message, $context);
    }
    /**
     * Interesting events.
     *
     * Example: User logs in, SQL logs.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function info($message, array $context = array())
    {
        $this->log(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::INFO, $message, $context);
    }
    /**
     * Detailed debug information.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function debug($message, array $context = array())
    {
        $this->log(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::DEBUG, $message, $context);
    }
    /**
     * Logs with an arbitrary level.
     *
     * @param mixed  $level
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public abstract function log($level, $message, array $context = array());
}
<?php

namespace _HumbugBoxb94336daae36\Psr\Log;

/**
 * This is a simple Logger implementation that other Loggers can inherit from.
 *
 * It simply delegates all log-level-specific methods to the `log` method to
 * reduce boilerplate code that a simple Logger that does the same thing with
 * messages regardless of the error level has to implement.
 */
abstract class AbstractLogger implements \_HumbugBoxb94336daae36\Psr\Log\LoggerInterface
{
    /**
     * System is unusable.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function emergency($message, array $context = array())
    {
        $this->log(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::EMERGENCY, $message, $context);
    }
    /**
     * Action must be taken immediately.
     *
     * Example: Entire website down, database unavailable, etc. This should
     * trigger the SMS alerts and wake you up.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function alert($message, array $context = array())
    {
        $this->log(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::ALERT, $message, $context);
    }
    /**
     * Critical conditions.
     *
     * Example: Application component unavailable, unexpected exception.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function critical($message, array $context = array())
    {
        $this->log(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::CRITICAL, $message, $context);
    }
    /**
     * Runtime errors that do not require immediate action but should typically
     * be logged and monitored.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function error($message, array $context = array())
    {
        $this->log(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::ERROR, $message, $context);
    }
    /**
     * Exceptional occurrences that are not errors.
     *
     * Example: Use of deprecated APIs, poor use of an API, undesirable things
     * that are not necessarily wrong.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function warning($message, array $context = array())
    {
        $this->log(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::WARNING, $message, $context);
    }
    /**
     * Normal but significant events.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function notice($message, array $context = array())
    {
        $this->log(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::NOTICE, $message, $context);
    }
    /**
     * Interesting events.
     *
     * Example: User logs in, SQL logs.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function info($message, array $context = array())
    {
        $this->log(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::INFO, $message, $context);
    }
    /**
     * Detailed debug information.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function debug($message, array $context = array())
    {
        $this->log(\_HumbugBoxb94336daae36\Psr\Log\LogLevel::DEBUG, $message, $context);
    }
}
{
    "name": "psr\/log",
    "description": "Common interface for logging libraries",
    "keywords": [
        "psr",
        "psr-3",
        "log"
    ],
    "homepage": "https:\/\/github.com\/php-fig\/log",
    "license": "MIT",
    "authors": [
        {
            "name": "PHP-FIG",
            "homepage": "http:\/\/www.php-fig.org\/"
        }
    ],
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "psr-4": {
            "_HumbugBoxb94336daae36\\Psr\\Log\\": "Psr\/Log\/"
        }
    },
    "extra": {
        "branch-alias": {
            "dev-master": "1.0.x-dev"
        }
    }
}<?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 _HumbugBoxb94336daae36\Symfony\Component\Finder;

/**
 * Extends \SplFileInfo to support relative paths.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class SplFileInfo extends \SplFileInfo
{
    private $relativePath;
    private $relativePathname;
    /**
     * @param string $file             The file name
     * @param string $relativePath     The relative path
     * @param string $relativePathname The relative path name
     */
    public function __construct($file, $relativePath, $relativePathname)
    {
        parent::__construct($file);
        $this->relativePath = $relativePath;
        $this->relativePathname = $relativePathname;
    }
    /**
     * Returns the relative path.
     *
     * This path does not contain the file name.
     *
     * @return string the relative path
     */
    public function getRelativePath()
    {
        return $this->relativePath;
    }
    /**
     * Returns the relative path name.
     *
     * This path contains the file name.
     *
     * @return string the relative path name
     */
    public function getRelativePathname()
    {
        return $this->relativePathname;
    }
    /**
     * Returns the contents of the file.
     *
     * @return string the contents of the file
     *
     * @throws \RuntimeException
     */
    public function getContents()
    {
        \set_error_handler(function ($type, $msg) use(&$error) {
            $error = $msg;
        });
        $content = \file_get_contents($this->getPathname());
        \restore_error_handler();
        if (\false === $content) {
            throw new \RuntimeException($error);
        }
        return $content;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Finder\Comparator;

/**
 * NumberComparator compiles a simple comparison to an anonymous
 * subroutine, which you can call with a value to be tested again.
 *
 * Now this would be very pointless, if NumberCompare didn't understand
 * magnitudes.
 *
 * The target value may use magnitudes of kilobytes (k, ki),
 * megabytes (m, mi), or gigabytes (g, gi).  Those suffixed
 * with an i use the appropriate 2**n version in accordance with the
 * IEC standard: http://physics.nist.gov/cuu/Units/binary.html
 *
 * Based on the Perl Number::Compare module.
 *
 * @author    Fabien Potencier <fabien@symfony.com> PHP port
 * @author    Richard Clamp <richardc@unixbeard.net> Perl version
 * @copyright 2004-2005 Fabien Potencier <fabien@symfony.com>
 * @copyright 2002 Richard Clamp <richardc@unixbeard.net>
 *
 * @see http://physics.nist.gov/cuu/Units/binary.html
 */
class NumberComparator extends \_HumbugBoxb94336daae36\Symfony\Component\Finder\Comparator\Comparator
{
    /**
     * @param string|int $test A comparison string or an integer
     *
     * @throws \InvalidArgumentException If the test is not understood
     */
    public function __construct($test)
    {
        if (!\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));
        }
        $target = $matches[2];
        if (!\is_numeric($target)) {
            throw new \InvalidArgumentException(\sprintf('Invalid number "%s".', $target));
        }
        if (isset($matches[3])) {
            // magnitude
            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;
            }
        }
        $this->setTarget($target);
        $this->setOperator(isset($matches[1]) ? $matches[1] : '==');
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Finder\Comparator;

/**
 * Comparator.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Comparator
{
    private $target;
    private $operator = '==';
    /**
     * Gets the target value.
     *
     * @return string The target value
     */
    public function getTarget()
    {
        return $this->target;
    }
    /**
     * Sets the target value.
     *
     * @param string $target The target value
     */
    public function setTarget($target)
    {
        $this->target = $target;
    }
    /**
     * Gets the comparison operator.
     *
     * @return string The operator
     */
    public function getOperator()
    {
        return $this->operator;
    }
    /**
     * Sets the comparison operator.
     *
     * @param string $operator A valid operator
     *
     * @throws \InvalidArgumentException
     */
    public function setOperator($operator)
    {
        if (!$operator) {
            $operator = '==';
        }
        if (!\in_array($operator, ['>', '<', '>=', '<=', '==', '!='])) {
            throw new \InvalidArgumentException(\sprintf('Invalid operator "%s".', $operator));
        }
        $this->operator = $operator;
    }
    /**
     * Tests against the target.
     *
     * @param mixed $test A test value
     *
     * @return bool
     */
    public function test($test)
    {
        switch ($this->operator) {
            case '>':
                return $test > $this->target;
            case '>=':
                return $test >= $this->target;
            case '<':
                return $test < $this->target;
            case '<=':
                return $test <= $this->target;
            case '!=':
                return $test != $this->target;
        }
        return $test == $this->target;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Finder\Comparator;

/**
 * DateCompare compiles date comparisons.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class DateComparator extends \_HumbugBoxb94336daae36\Symfony\Component\Finder\Comparator\Comparator
{
    /**
     * @param string $test A comparison string
     *
     * @throws \InvalidArgumentException If the test is not understood
     */
    public function __construct($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 \DateTime($matches[2]);
            $target = $date->format('U');
        } catch (\Exception $e) {
            throw new \InvalidArgumentException(\sprintf('"%s" is not a valid date.', $matches[2]));
        }
        $operator = isset($matches[1]) ? $matches[1] : '==';
        if ('since' === $operator || 'after' === $operator) {
            $operator = '>';
        }
        if ('until' === $operator || 'before' === $operator) {
            $operator = '<';
        }
        $this->setOperator($operator);
        $this->setTarget($target);
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Finder;

use _HumbugBoxb94336daae36\Symfony\Component\Finder\Comparator\DateComparator;
use _HumbugBoxb94336daae36\Symfony\Component\Finder\Comparator\NumberComparator;
use _HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\CustomFilterIterator;
use _HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\DateRangeFilterIterator;
use _HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\DepthRangeFilterIterator;
use _HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator;
use _HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\FilecontentFilterIterator;
use _HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\FilenameFilterIterator;
use _HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\SizeRangeFilterIterator;
use _HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\SortableIterator;
/**
 * Finder allows to build rules to find files and directories.
 *
 * It is a thin wrapper around several specialized iterator classes.
 *
 * All rules may be invoked several times.
 *
 * All methods return the current Finder object to allow chaining:
 *
 *     $finder = Finder::create()->files()->name('*.php')->in(__DIR__);
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Finder implements \IteratorAggregate, \Countable
{
    const IGNORE_VCS_FILES = 1;
    const IGNORE_DOT_FILES = 2;
    private $mode = 0;
    private $names = [];
    private $notNames = [];
    private $exclude = [];
    private $filters = [];
    private $depths = [];
    private $sizes = [];
    private $followLinks = \false;
    private $sort = \false;
    private $ignore = 0;
    private $dirs = [];
    private $dates = [];
    private $iterators = [];
    private $contains = [];
    private $notContains = [];
    private $paths = [];
    private $notPaths = [];
    private $ignoreUnreadableDirs = \false;
    private static $vcsPatterns = ['.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg'];
    public function __construct()
    {
        $this->ignore = static::IGNORE_VCS_FILES | static::IGNORE_DOT_FILES;
    }
    /**
     * Creates a new Finder.
     *
     * @return static
     */
    public static function create()
    {
        return new static();
    }
    /**
     * Restricts the matching to directories only.
     *
     * @return $this
     */
    public function directories()
    {
        $this->mode = \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\FileTypeFilterIterator::ONLY_DIRECTORIES;
        return $this;
    }
    /**
     * Restricts the matching to files only.
     *
     * @return $this
     */
    public function files()
    {
        $this->mode = \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\FileTypeFilterIterator::ONLY_FILES;
        return $this;
    }
    /**
     * Adds tests for the directory depth.
     *
     * Usage:
     *
     *     $finder->depth('> 1') // the Finder will start matching at level 1.
     *     $finder->depth('< 3') // the Finder will descend at most 3 levels of directories below the starting point.
     *
     * @param string|int $level The depth level expression
     *
     * @return $this
     *
     * @see DepthRangeFilterIterator
     * @see NumberComparator
     */
    public function depth($level)
    {
        $this->depths[] = new \_HumbugBoxb94336daae36\Symfony\Component\Finder\Comparator\NumberComparator($level);
        return $this;
    }
    /**
     * Adds tests for file dates (last modified).
     *
     * The date must be something that strtotime() is able to parse:
     *
     *     $finder->date('since yesterday');
     *     $finder->date('until 2 days ago');
     *     $finder->date('> now - 2 hours');
     *     $finder->date('>= 2005-10-15');
     *
     * @param string $date A date range string
     *
     * @return $this
     *
     * @see strtotime
     * @see DateRangeFilterIterator
     * @see DateComparator
     */
    public function date($date)
    {
        $this->dates[] = new \_HumbugBoxb94336daae36\Symfony\Component\Finder\Comparator\DateComparator($date);
        return $this;
    }
    /**
     * Adds rules that files must match.
     *
     * You can use patterns (delimited with / sign), globs or simple strings.
     *
     *     $finder->name('*.php')
     *     $finder->name('/\.php$/') // same as above
     *     $finder->name('test.php')
     *
     * @param string $pattern A pattern (a regexp, a glob, or a string)
     *
     * @return $this
     *
     * @see FilenameFilterIterator
     */
    public function name($pattern)
    {
        $this->names[] = $pattern;
        return $this;
    }
    /**
     * Adds rules that files must not match.
     *
     * @param string $pattern A pattern (a regexp, a glob, or a string)
     *
     * @return $this
     *
     * @see FilenameFilterIterator
     */
    public function notName($pattern)
    {
        $this->notNames[] = $pattern;
        return $this;
    }
    /**
     * Adds tests that file contents must match.
     *
     * Strings or PCRE patterns can be used:
     *
     *     $finder->contains('Lorem ipsum')
     *     $finder->contains('/Lorem ipsum/i')
     *
     * @param string $pattern A pattern (string or regexp)
     *
     * @return $this
     *
     * @see FilecontentFilterIterator
     */
    public function contains($pattern)
    {
        $this->contains[] = $pattern;
        return $this;
    }
    /**
     * Adds tests that file contents must not match.
     *
     * Strings or PCRE patterns can be used:
     *
     *     $finder->notContains('Lorem ipsum')
     *     $finder->notContains('/Lorem ipsum/i')
     *
     * @param string $pattern A pattern (string or regexp)
     *
     * @return $this
     *
     * @see FilecontentFilterIterator
     */
    public function notContains($pattern)
    {
        $this->notContains[] = $pattern;
        return $this;
    }
    /**
     * Adds rules that filenames must match.
     *
     * You can use patterns (delimited with / sign) or simple strings.
     *
     *     $finder->path('some/special/dir')
     *     $finder->path('/some\/special\/dir/') // same as above
     *
     * Use only / as dirname separator.
     *
     * @param string $pattern A pattern (a regexp or a string)
     *
     * @return $this
     *
     * @see FilenameFilterIterator
     */
    public function path($pattern)
    {
        $this->paths[] = $pattern;
        return $this;
    }
    /**
     * Adds rules that filenames must not match.
     *
     * You can use patterns (delimited with / sign) or simple strings.
     *
     *     $finder->notPath('some/special/dir')
     *     $finder->notPath('/some\/special\/dir/') // same as above
     *
     * Use only / as dirname separator.
     *
     * @param string $pattern A pattern (a regexp or a string)
     *
     * @return $this
     *
     * @see FilenameFilterIterator
     */
    public function notPath($pattern)
    {
        $this->notPaths[] = $pattern;
        return $this;
    }
    /**
     * Adds tests for file sizes.
     *
     *     $finder->size('> 10K');
     *     $finder->size('<= 1Ki');
     *     $finder->size(4);
     *
     * @param string|int $size A size range string or an integer
     *
     * @return $this
     *
     * @see SizeRangeFilterIterator
     * @see NumberComparator
     */
    public function size($size)
    {
        $this->sizes[] = new \_HumbugBoxb94336daae36\Symfony\Component\Finder\Comparator\NumberComparator($size);
        return $this;
    }
    /**
     * Excludes directories.
     *
     * Directories passed as argument must be relative to the ones defined with the `in()` method. For example:
     *
     *     $finder->in(__DIR__)->exclude('ruby');
     *
     * @param string|array $dirs A directory path or an array of directories
     *
     * @return $this
     *
     * @see ExcludeDirectoryFilterIterator
     */
    public function exclude($dirs)
    {
        $this->exclude = \array_merge($this->exclude, (array) $dirs);
        return $this;
    }
    /**
     * Excludes "hidden" directories and files (starting with a dot).
     *
     * This option is enabled by default.
     *
     * @param bool $ignoreDotFiles Whether to exclude "hidden" files or not
     *
     * @return $this
     *
     * @see ExcludeDirectoryFilterIterator
     */
    public function ignoreDotFiles($ignoreDotFiles)
    {
        if ($ignoreDotFiles) {
            $this->ignore |= static::IGNORE_DOT_FILES;
        } else {
            $this->ignore &= ~static::IGNORE_DOT_FILES;
        }
        return $this;
    }
    /**
     * Forces the finder to ignore version control directories.
     *
     * This option is enabled by default.
     *
     * @param bool $ignoreVCS Whether to exclude VCS files or not
     *
     * @return $this
     *
     * @see ExcludeDirectoryFilterIterator
     */
    public function ignoreVCS($ignoreVCS)
    {
        if ($ignoreVCS) {
            $this->ignore |= static::IGNORE_VCS_FILES;
        } else {
            $this->ignore &= ~static::IGNORE_VCS_FILES;
        }
        return $this;
    }
    /**
     * Adds VCS patterns.
     *
     * @see ignoreVCS()
     *
     * @param string|string[] $pattern VCS patterns to ignore
     */
    public static function addVCSPattern($pattern)
    {
        foreach ((array) $pattern as $p) {
            self::$vcsPatterns[] = $p;
        }
        self::$vcsPatterns = \array_unique(self::$vcsPatterns);
    }
    /**
     * Sorts files and directories by an anonymous function.
     *
     * The anonymous function receives two \SplFileInfo instances to compare.
     *
     * This can be slow as all the matching files and directories must be retrieved for comparison.
     *
     * @return $this
     *
     * @see SortableIterator
     */
    public function sort(\Closure $closure)
    {
        $this->sort = $closure;
        return $this;
    }
    /**
     * Sorts files and directories by name.
     *
     * This can be slow as all the matching files and directories must be retrieved for comparison.
     *
     * @return $this
     *
     * @see SortableIterator
     */
    public function sortByName()
    {
        $this->sort = \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\SortableIterator::SORT_BY_NAME;
        return $this;
    }
    /**
     * Sorts files and directories by type (directories before files), then by name.
     *
     * This can be slow as all the matching files and directories must be retrieved for comparison.
     *
     * @return $this
     *
     * @see SortableIterator
     */
    public function sortByType()
    {
        $this->sort = \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\SortableIterator::SORT_BY_TYPE;
        return $this;
    }
    /**
     * Sorts files and directories by the last accessed time.
     *
     * This is the time that the file was last accessed, read or written to.
     *
     * This can be slow as all the matching files and directories must be retrieved for comparison.
     *
     * @return $this
     *
     * @see SortableIterator
     */
    public function sortByAccessedTime()
    {
        $this->sort = \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\SortableIterator::SORT_BY_ACCESSED_TIME;
        return $this;
    }
    /**
     * Sorts files and directories by the last inode changed time.
     *
     * This is the time that the inode information was last modified (permissions, owner, group or other metadata).
     *
     * On Windows, since inode is not available, changed time is actually the file creation time.
     *
     * This can be slow as all the matching files and directories must be retrieved for comparison.
     *
     * @return $this
     *
     * @see SortableIterator
     */
    public function sortByChangedTime()
    {
        $this->sort = \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\SortableIterator::SORT_BY_CHANGED_TIME;
        return $this;
    }
    /**
     * Sorts files and directories by the last modified time.
     *
     * This is the last time the actual contents of the file were last modified.
     *
     * This can be slow as all the matching files and directories must be retrieved for comparison.
     *
     * @return $this
     *
     * @see SortableIterator
     */
    public function sortByModifiedTime()
    {
        $this->sort = \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\SortableIterator::SORT_BY_MODIFIED_TIME;
        return $this;
    }
    /**
     * Filters the iterator with an anonymous function.
     *
     * The anonymous function receives a \SplFileInfo and must return false
     * to remove files.
     *
     * @return $this
     *
     * @see CustomFilterIterator
     */
    public function filter(\Closure $closure)
    {
        $this->filters[] = $closure;
        return $this;
    }
    /**
     * Forces the following of symlinks.
     *
     * @return $this
     */
    public function followLinks()
    {
        $this->followLinks = \true;
        return $this;
    }
    /**
     * Tells finder to ignore unreadable directories.
     *
     * By default, scanning unreadable directories content throws an AccessDeniedException.
     *
     * @param bool $ignore
     *
     * @return $this
     */
    public function ignoreUnreadableDirs($ignore = \true)
    {
        $this->ignoreUnreadableDirs = (bool) $ignore;
        return $this;
    }
    /**
     * Searches files and directories which match defined rules.
     *
     * @param string|array $dirs A directory path or an array of directories
     *
     * @return $this
     *
     * @throws \InvalidArgumentException if one of the directories does not exist
     */
    public function in($dirs)
    {
        $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)) {
                $resolvedDirs = \array_merge($resolvedDirs, \array_map([$this, 'normalizeDir'], $glob));
            } else {
                throw new \InvalidArgumentException(\sprintf('The "%s" directory does not exist.', $dir));
            }
        }
        $this->dirs = \array_merge($this->dirs, $resolvedDirs);
        return $this;
    }
    /**
     * Returns an Iterator for the current Finder configuration.
     *
     * This method implements the IteratorAggregate interface.
     *
     * @return \Iterator|SplFileInfo[] An iterator
     *
     * @throws \LogicException if the in() method has not been called
     */
    public function getIterator()
    {
        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)) {
            return $this->searchInDirectory($this->dirs[0]);
        }
        $iterator = new \AppendIterator();
        foreach ($this->dirs as $dir) {
            $iterator->append($this->searchInDirectory($dir));
        }
        foreach ($this->iterators as $it) {
            $iterator->append($it);
        }
        return $iterator;
    }
    /**
     * Appends an existing set of files/directories to the finder.
     *
     * The set can be another Finder, an Iterator, an IteratorAggregate, or even a plain array.
     *
     * @param iterable $iterator
     *
     * @return $this
     *
     * @throws \InvalidArgumentException when the given argument is not iterable
     */
    public function append($iterator)
    {
        if ($iterator instanceof \IteratorAggregate) {
            $this->iterators[] = $iterator->getIterator();
        } elseif ($iterator instanceof \Iterator) {
            $this->iterators[] = $iterator;
        } elseif ($iterator instanceof \Traversable || \is_array($iterator)) {
            $it = new \ArrayIterator();
            foreach ($iterator as $file) {
                $it->append($file instanceof \SplFileInfo ? $file : new \SplFileInfo($file));
            }
            $this->iterators[] = $it;
        } else {
            throw new \InvalidArgumentException('Finder::append() method wrong argument type.');
        }
        return $this;
    }
    /**
     * Check if the any results were found.
     *
     * @return bool
     */
    public function hasResults()
    {
        foreach ($this->getIterator() as $_) {
            return \true;
        }
        return \false;
    }
    /**
     * Counts all the results collected by the iterators.
     *
     * @return int
     */
    public function count()
    {
        return \iterator_count($this->getIterator());
    }
    /**
     * @param string $dir
     *
     * @return \Iterator
     */
    private function searchInDirectory($dir)
    {
        $exclude = $this->exclude;
        $notPaths = $this->notPaths;
        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 \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\RecursiveDirectoryIterator($dir, $flags, $this->ignoreUnreadableDirs);
        if ($exclude) {
            $iterator = new \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator($iterator, $exclude);
        }
        $iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::SELF_FIRST);
        if ($minDepth > 0 || $maxDepth < \PHP_INT_MAX) {
            $iterator = new \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\DepthRangeFilterIterator($iterator, $minDepth, $maxDepth);
        }
        if ($this->mode) {
            $iterator = new \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\FileTypeFilterIterator($iterator, $this->mode);
        }
        if ($this->names || $this->notNames) {
            $iterator = new \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\FilenameFilterIterator($iterator, $this->names, $this->notNames);
        }
        if ($this->contains || $this->notContains) {
            $iterator = new \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\FilecontentFilterIterator($iterator, $this->contains, $this->notContains);
        }
        if ($this->sizes) {
            $iterator = new \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\SizeRangeFilterIterator($iterator, $this->sizes);
        }
        if ($this->dates) {
            $iterator = new \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\DateRangeFilterIterator($iterator, $this->dates);
        }
        if ($this->filters) {
            $iterator = new \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\CustomFilterIterator($iterator, $this->filters);
        }
        if ($this->paths || $notPaths) {
            $iterator = new \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\PathFilterIterator($iterator, $this->paths, $notPaths);
        }
        if ($this->sort) {
            $iteratorAggregate = new \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\SortableIterator($iterator, $this->sort);
            $iterator = $iteratorAggregate->getIterator();
        }
        return $iterator;
    }
    /**
     * Normalizes given directory names by removing trailing slashes.
     *
     * Excluding: (s)ftp:// wrapper
     *
     * @param string $dir
     *
     * @return string
     */
    private function normalizeDir($dir)
    {
        $dir = \rtrim($dir, '/' . \DIRECTORY_SEPARATOR);
        if (\preg_match('#^s?ftp://#', $dir)) {
            $dir .= '/';
        }
        return $dir;
    }
}
Copyright (c) 2004-2019 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
CHANGELOG
=========

3.4.0
-----

 * deprecated `Symfony\Component\Finder\Iterator\FilterIterator`
 * added Finder::hasResults() method to check if any results were found

3.3.0
-----

 * added double-star matching to Glob::toRegex()

3.0.0
-----

 * removed deprecated classes

2.8.0
-----

 * deprecated adapters and related classes

2.5.0
-----
 * added support for GLOB_BRACE in the paths passed to Finder::in()

2.3.0
-----

 * added a way to ignore unreadable directories (via Finder::ignoreUnreadableDirs())
 * unified the way subfolders that are not executable are handled by always throwing an AccessDeniedException exception

2.2.0
-----

 * added Finder::path() and Finder::notPath() methods
 * added finder adapters to improve performance on specific platforms
 * added support for wildcard characters (glob patterns) in the paths passed
   to Finder::in()

2.1.0
-----

 * added Finder::sortByAccessedTime(), Finder::sortByChangedTime(), and
   Finder::sortByModifiedTime()
 * added Countable to Finder
 * added support for an array of directories as an argument to
   Finder::exclude()
 * added searching based on the file content via Finder::contains() and
   Finder::notContains()
 * added support for the != operator in the Comparator
 * [BC BREAK] filter expressions (used for file name and content) are no more
   considered as regexps but glob patterns when they are enclosed in '*' or '?'
<?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 _HumbugBoxb94336daae36\Symfony\Component\Finder;

/**
 * Glob matches globbing patterns against text.
 *
 *     if match_glob("foo.*", "foo.bar") echo "matched\n";
 *
 *     // prints foo.bar and foo.baz
 *     $regex = glob_to_regex("foo.*");
 *     for (['foo.bar', 'foo.baz', 'foo', 'bar'] as $t)
 *     {
 *         if (/$regex/) echo "matched: $car\n";
 *     }
 *
 * Glob implements glob(3) style matching that can be used to match
 * against text, rather than fetching names from a filesystem.
 *
 * Based on the Perl Text::Glob module.
 *
 * @author Fabien Potencier <fabien@symfony.com> PHP port
 * @author     Richard Clamp <richardc@unixbeard.net> Perl version
 * @copyright  2004-2005 Fabien Potencier <fabien@symfony.com>
 * @copyright  2002 Richard Clamp <richardc@unixbeard.net>
 */
class Glob
{
    /**
     * Returns a regexp which is the equivalent of the glob pattern.
     *
     * @param string $glob                The glob pattern
     * @param bool   $strictLeadingDot
     * @param bool   $strictWildcardSlash
     * @param string $delimiter           Optional delimiter
     *
     * @return string regex The regexp
     */
    public static function toRegex($glob, $strictLeadingDot = \true, $strictWildcardSlash = \true, $delimiter = '#')
    {
        $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;
    }
}
Finder Component
================

The Finder component finds files and directories via an intuitive fluent
interface.

Resources
---------

  * [Documentation](https://symfony.com/doc/current/components/finder.html)
  * [Contributing](https://symfony.com/doc/current/contributing/index.html)
  * [Report issues](https://github.com/symfony/symfony/issues) and
    [send Pull Requests](https://github.com/symfony/symfony/pulls)
    in the [main Symfony repository](https://github.com/symfony/symfony)
<?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 _HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator;

/**
 * FilecontentFilterIterator filters files by their contents using patterns (regexps or strings).
 *
 * @author Fabien Potencier  <fabien@symfony.com>
 * @author Włodzimierz Gajda <gajdaw@gajdaw.pl>
 */
class FilecontentFilterIterator extends \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\MultiplePcreFilterIterator
{
    /**
     * Filters the iterator values.
     *
     * @return bool true if the value should be kept, false otherwise
     */
    public function accept()
    {
        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);
    }
    /**
     * Converts string to regexp if necessary.
     *
     * @param string $str Pattern: string or regexp
     *
     * @return string regexp corresponding to a given string or regexp
     */
    protected function toRegex($str)
    {
        return $this->isRegex($str) ? $str : '/' . \preg_quote($str, '/') . '/';
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator;

/**
 * MultiplePcreFilterIterator filters files using patterns (regexps, globs or strings).
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class MultiplePcreFilterIterator extends \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\FilterIterator
{
    protected $matchRegexps = [];
    protected $noMatchRegexps = [];
    /**
     * @param \Iterator $iterator        The Iterator to filter
     * @param array     $matchPatterns   An array of patterns that need to match
     * @param array     $noMatchPatterns An array of patterns that need to not match
     */
    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);
    }
    /**
     * Checks whether the string is accepted by the regex filters.
     *
     * If there is no regexps defined in the class, this method will accept the string.
     * Such case can be handled by child classes before calling the method if they want to
     * apply a different behavior.
     *
     * @param string $string The string to be matched against filters
     *
     * @return bool
     */
    protected function isAccepted($string)
    {
        // should at least not match one rule to exclude
        foreach ($this->noMatchRegexps as $regex) {
            if (\preg_match($regex, $string)) {
                return \false;
            }
        }
        // should at least match one rule
        if ($this->matchRegexps) {
            foreach ($this->matchRegexps as $regex) {
                if (\preg_match($regex, $string)) {
                    return \true;
                }
            }
            return \false;
        }
        // If there is no match rules, the file is accepted
        return \true;
    }
    /**
     * Checks whether the string is a regex.
     *
     * @param string $str
     *
     * @return bool Whether the given string is a regex
     */
    protected function isRegex($str)
    {
        if (\preg_match('/^(.{3,}?)[imsxuADU]*$/', $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;
    }
    /**
     * Converts string into regexp.
     *
     * @param string $str Pattern
     *
     * @return string regexp corresponding to a given string
     */
    protected abstract function toRegex($str);
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator;

use _HumbugBoxb94336daae36\Symfony\Component\Finder\Comparator\NumberComparator;
/**
 * SizeRangeFilterIterator filters out files that are not in the given size range.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class SizeRangeFilterIterator extends \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\FilterIterator
{
    private $comparators = [];
    /**
     * @param \Iterator          $iterator    The Iterator to filter
     * @param NumberComparator[] $comparators An array of NumberComparator instances
     */
    public function __construct(\Iterator $iterator, array $comparators)
    {
        $this->comparators = $comparators;
        parent::__construct($iterator);
    }
    /**
     * Filters the iterator values.
     *
     * @return bool true if the value should be kept, false otherwise
     */
    public function accept()
    {
        $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

/*
 * 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 _HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator;

use _HumbugBoxb94336daae36\Symfony\Component\Finder\Glob;
/**
 * FilenameFilterIterator filters files by patterns (a regexp, a glob, or a string).
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class FilenameFilterIterator extends \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\MultiplePcreFilterIterator
{
    /**
     * Filters the iterator values.
     *
     * @return bool true if the value should be kept, false otherwise
     */
    public function accept()
    {
        return $this->isAccepted($this->current()->getFilename());
    }
    /**
     * Converts glob to regexp.
     *
     * PCRE patterns are left unchanged.
     * Glob strings are transformed with Glob::toRegex().
     *
     * @param string $str Pattern: glob or regexp
     *
     * @return string regexp corresponding to a given glob or regexp
     */
    protected function toRegex($str)
    {
        return $this->isRegex($str) ? $str : \_HumbugBoxb94336daae36\Symfony\Component\Finder\Glob::toRegex($str);
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator;

use _HumbugBoxb94336daae36\Symfony\Component\Finder\Comparator\DateComparator;
/**
 * DateRangeFilterIterator filters out files that are not in the given date range (last modified dates).
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class DateRangeFilterIterator extends \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\FilterIterator
{
    private $comparators = [];
    /**
     * @param \Iterator        $iterator    The Iterator to filter
     * @param DateComparator[] $comparators An array of DateComparator instances
     */
    public function __construct(\Iterator $iterator, array $comparators)
    {
        $this->comparators = $comparators;
        parent::__construct($iterator);
    }
    /**
     * Filters the iterator values.
     *
     * @return bool true if the value should be kept, false otherwise
     */
    public function accept()
    {
        $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

/*
 * 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 _HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator;

/**
 * CustomFilterIterator filters files by applying anonymous functions.
 *
 * The anonymous function receives a \SplFileInfo and must return false
 * to remove files.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class CustomFilterIterator extends \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\FilterIterator
{
    private $filters = [];
    /**
     * @param \Iterator  $iterator The Iterator to filter
     * @param callable[] $filters  An array of PHP callbacks
     *
     * @throws \InvalidArgumentException
     */
    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);
    }
    /**
     * Filters the iterator values.
     *
     * @return bool true if the value should be kept, false otherwise
     */
    public function accept()
    {
        $fileinfo = $this->current();
        foreach ($this->filters as $filter) {
            if (\false === \call_user_func($filter, $fileinfo)) {
                return \false;
            }
        }
        return \true;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator;

use _HumbugBoxb94336daae36\Symfony\Component\Finder\Exception\AccessDeniedException;
use _HumbugBoxb94336daae36\Symfony\Component\Finder\SplFileInfo;
/**
 * Extends the \RecursiveDirectoryIterator to support relative paths.
 *
 * @author Victor Berchet <victor@suumit.com>
 */
class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator
{
    /**
     * @var bool
     */
    private $ignoreUnreadableDirs;
    /**
     * @var bool
     */
    private $rewindable;
    // these 3 properties take part of the performance optimization to avoid redoing the same work in all iterations
    private $rootPath;
    private $subPath;
    private $directorySeparator = '/';
    /**
     * @param string $path
     * @param int    $flags
     * @param bool   $ignoreUnreadableDirs
     *
     * @throws \RuntimeException
     */
    public function __construct($path, $flags, $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;
        }
    }
    /**
     * Return an instance of SplFileInfo with support for relative paths.
     *
     * @return SplFileInfo File information
     */
    public function current()
    {
        // the logic here avoids redoing the same work in all iterations
        if (null === ($subPathname = $this->subPath)) {
            $subPathname = $this->subPath = (string) $this->getSubPath();
        }
        if ('' !== $subPathname) {
            $subPathname .= $this->directorySeparator;
        }
        $subPathname .= $this->getFilename();
        return new \_HumbugBoxb94336daae36\Symfony\Component\Finder\SplFileInfo($this->rootPath . $this->directorySeparator . $subPathname, $this->subPath, $subPathname);
    }
    /**
     * @return \RecursiveIterator
     *
     * @throws AccessDeniedException
     */
    public function getChildren()
    {
        try {
            $children = parent::getChildren();
            if ($children instanceof self) {
                // parent method will call the constructor with default arguments, so unreadable dirs won't be ignored anymore
                $children->ignoreUnreadableDirs = $this->ignoreUnreadableDirs;
                // performance optimization to avoid redoing the same work in all children
                $children->rewindable =& $this->rewindable;
                $children->rootPath = $this->rootPath;
            }
            return $children;
        } catch (\UnexpectedValueException $e) {
            if ($this->ignoreUnreadableDirs) {
                // If directory is unreadable and finder is set to ignore it, a fake empty content is returned.
                return new \RecursiveArrayIterator([]);
            } else {
                throw new \_HumbugBoxb94336daae36\Symfony\Component\Finder\Exception\AccessDeniedException($e->getMessage(), $e->getCode(), $e);
            }
        }
    }
    /**
     * Do nothing for non rewindable stream.
     */
    public function rewind()
    {
        if (\false === $this->isRewindable()) {
            return;
        }
        // @see https://bugs.php.net/68557
        if (\PHP_VERSION_ID < 50523 || \PHP_VERSION_ID >= 50600 && \PHP_VERSION_ID < 50607) {
            parent::next();
        }
        parent::rewind();
    }
    /**
     * Checks if the stream is rewindable.
     *
     * @return bool true when the stream is rewindable, false otherwise
     */
    public function isRewindable()
    {
        if (null !== $this->rewindable) {
            return $this->rewindable;
        }
        // workaround for an HHVM bug, should be removed when https://github.com/facebook/hhvm/issues/7281 is fixed
        if ('' === $this->getPath()) {
            return $this->rewindable = \false;
        }
        if (\false !== ($stream = @\opendir($this->getPath()))) {
            $infos = \stream_get_meta_data($stream);
            \closedir($stream);
            if ($infos['seekable']) {
                return $this->rewindable = \true;
            }
        }
        return $this->rewindable = \false;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator;

/**
 * ExcludeDirectoryFilterIterator filters out directories.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ExcludeDirectoryFilterIterator extends \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\FilterIterator implements \RecursiveIterator
{
    private $iterator;
    private $isRecursive;
    private $excludedDirs = [];
    private $excludedPattern;
    /**
     * @param \Iterator $iterator    The Iterator to filter
     * @param array     $directories An array of directories to exclude
     */
    public function __construct(\Iterator $iterator, array $directories)
    {
        $this->iterator = $iterator;
        $this->isRecursive = $iterator instanceof \RecursiveIterator;
        $patterns = [];
        foreach ($directories as $directory) {
            $directory = \rtrim($directory, '/');
            if (!$this->isRecursive || \false !== \strpos($directory, '/')) {
                $patterns[] = \preg_quote($directory, '#');
            } else {
                $this->excludedDirs[$directory] = \true;
            }
        }
        if ($patterns) {
            $this->excludedPattern = '#(?:^|/)(?:' . \implode('|', $patterns) . ')(?:/|$)#';
        }
        parent::__construct($iterator);
    }
    /**
     * Filters the iterator values.
     *
     * @return bool True if the value should be kept, false otherwise
     */
    public function accept()
    {
        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);
        }
        return \true;
    }
    public function hasChildren()
    {
        return $this->isRecursive && $this->iterator->hasChildren();
    }
    public function getChildren()
    {
        $children = new self($this->iterator->getChildren(), []);
        $children->excludedDirs = $this->excludedDirs;
        $children->excludedPattern = $this->excludedPattern;
        return $children;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator;

/**
 * SortableIterator applies a sort on a given Iterator.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class SortableIterator implements \IteratorAggregate
{
    const SORT_BY_NAME = 1;
    const SORT_BY_TYPE = 2;
    const SORT_BY_ACCESSED_TIME = 3;
    const SORT_BY_CHANGED_TIME = 4;
    const SORT_BY_MODIFIED_TIME = 5;
    private $iterator;
    private $sort;
    /**
     * @param \Traversable $iterator The Iterator to filter
     * @param int|callable $sort     The sort type (SORT_BY_NAME, SORT_BY_TYPE, or a PHP callback)
     *
     * @throws \InvalidArgumentException
     */
    public function __construct(\Traversable $iterator, $sort)
    {
        $this->iterator = $iterator;
        if (self::SORT_BY_NAME === $sort) {
            $this->sort = function ($a, $b) {
                return \strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname());
            };
        } elseif (self::SORT_BY_TYPE === $sort) {
            $this->sort = function ($a, $b) {
                if ($a->isDir() && $b->isFile()) {
                    return -1;
                } elseif ($a->isFile() && $b->isDir()) {
                    return 1;
                }
                return \strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname());
            };
        } elseif (self::SORT_BY_ACCESSED_TIME === $sort) {
            $this->sort = function ($a, $b) {
                return $a->getATime() - $b->getATime();
            };
        } elseif (self::SORT_BY_CHANGED_TIME === $sort) {
            $this->sort = function ($a, $b) {
                return $a->getCTime() - $b->getCTime();
            };
        } elseif (self::SORT_BY_MODIFIED_TIME === $sort) {
            $this->sort = function ($a, $b) {
                return $a->getMTime() - $b->getMTime();
            };
        } elseif (\is_callable($sort)) {
            $this->sort = $sort;
        } else {
            throw new \InvalidArgumentException('The SortableIterator takes a PHP callable or a valid built-in sort algorithm as an argument.');
        }
    }
    public function getIterator()
    {
        $array = \iterator_to_array($this->iterator, \true);
        \uasort($array, $this->sort);
        return new \ArrayIterator($array);
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator;

/**
 * This iterator just overrides the rewind method in order to correct a PHP bug,
 * which existed before version 5.5.23/5.6.7.
 *
 * @see https://bugs.php.net/68557
 *
 * @author Alex Bogomazov
 *
 * @deprecated since 3.4, to be removed in 4.0.
 */
abstract class FilterIterator extends \FilterIterator
{
    /**
     * This is a workaround for the problem with \FilterIterator leaving inner \FilesystemIterator in wrong state after
     * rewind in some cases.
     *
     * @see FilterIterator::rewind()
     */
    public function rewind()
    {
        if (\PHP_VERSION_ID > 50607 || \PHP_VERSION_ID > 50523 && \PHP_VERSION_ID < 50600) {
            parent::rewind();
            return;
        }
        $iterator = $this;
        while ($iterator instanceof \OuterIterator) {
            $innerIterator = $iterator->getInnerIterator();
            if ($innerIterator instanceof \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\RecursiveDirectoryIterator) {
                // this condition is necessary for iterators to work properly with non-local filesystems like ftp
                if ($innerIterator->isRewindable()) {
                    $innerIterator->next();
                    $innerIterator->rewind();
                }
            } elseif ($innerIterator instanceof \FilesystemIterator) {
                $innerIterator->next();
                $innerIterator->rewind();
            }
            $iterator = $innerIterator;
        }
        parent::rewind();
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator;

/**
 * DepthRangeFilterIterator limits the directory depth.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class DepthRangeFilterIterator extends \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\FilterIterator
{
    private $minDepth = 0;
    /**
     * @param \RecursiveIteratorIterator $iterator The Iterator to filter
     * @param int                        $minDepth The min depth
     * @param int                        $maxDepth The max depth
     */
    public function __construct(\RecursiveIteratorIterator $iterator, $minDepth = 0, $maxDepth = \PHP_INT_MAX)
    {
        $this->minDepth = $minDepth;
        $iterator->setMaxDepth(\PHP_INT_MAX === $maxDepth ? -1 : $maxDepth);
        parent::__construct($iterator);
    }
    /**
     * Filters the iterator values.
     *
     * @return bool true if the value should be kept, false otherwise
     */
    public function accept()
    {
        return $this->getInnerIterator()->getDepth() >= $this->minDepth;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator;

/**
 * FileTypeFilterIterator only keeps files, directories, or both.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class FileTypeFilterIterator extends \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\FilterIterator
{
    const ONLY_FILES = 1;
    const ONLY_DIRECTORIES = 2;
    private $mode;
    /**
     * @param \Iterator $iterator The Iterator to filter
     * @param int       $mode     The mode (self::ONLY_FILES or self::ONLY_DIRECTORIES)
     */
    public function __construct(\Iterator $iterator, $mode)
    {
        $this->mode = $mode;
        parent::__construct($iterator);
    }
    /**
     * Filters the iterator values.
     *
     * @return bool true if the value should be kept, false otherwise
     */
    public function accept()
    {
        $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

/*
 * 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 _HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator;

/**
 * PathFilterIterator filters files by path patterns (e.g. some/special/dir).
 *
 * @author Fabien Potencier  <fabien@symfony.com>
 * @author Włodzimierz Gajda <gajdaw@gajdaw.pl>
 */
class PathFilterIterator extends \_HumbugBoxb94336daae36\Symfony\Component\Finder\Iterator\MultiplePcreFilterIterator
{
    /**
     * Filters the iterator values.
     *
     * @return bool true if the value should be kept, false otherwise
     */
    public function accept()
    {
        $filename = $this->current()->getRelativePathname();
        if ('\\' === \DIRECTORY_SEPARATOR) {
            $filename = \str_replace('\\', '/', $filename);
        }
        return $this->isAccepted($filename);
    }
    /**
     * Converts strings to regexp.
     *
     * PCRE patterns are left unchanged.
     *
     * Default conversion:
     *     'lorem/ipsum/dolor' ==>  'lorem\/ipsum\/dolor/'
     *
     * Use only / as directory separator (on Windows also).
     *
     * @param string $str Pattern: regexp or dirname
     *
     * @return string regexp corresponding to a given string or regexp
     */
    protected function toRegex($str)
    {
        return $this->isRegex($str) ? $str : '/' . \preg_quote($str, '/') . '/';
    }
}
<?xml version="1.0" encoding="UTF-8"?>

<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/5.2/phpunit.xsd"
         backupGlobals="false"
         colors="true"
         bootstrap="vendor/autoload.php"
         failOnRisky="true"
         failOnWarning="true"
>
    <php>
        <ini name="error_reporting" value="-1" />
    </php>

    <testsuites>
        <testsuite name="Symfony Finder Component Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./Tests</directory>
                <directory>./vendor</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
<?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 _HumbugBoxb94336daae36\Symfony\Component\Finder\Exception;

/**
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class AccessDeniedException extends \UnexpectedValueException
{
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Finder\Exception;

/**
 * @author Jean-François Simon <contact@jfsimon.fr>
 *
 * @deprecated since 3.3, to be removed in 4.0.
 */
interface ExceptionInterface
{
    /**
     * @return \Symfony\Component\Finder\Adapter\AdapterInterface
     */
    public function getAdapter();
}
{
    "name": "symfony\/finder",
    "type": "library",
    "description": "Symfony Finder Component",
    "keywords": [],
    "homepage": "https:\/\/symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "https:\/\/symfony.com\/contributors"
        }
    ],
    "require": {
        "php": "^5.5.9|>=7.0.8"
    },
    "autoload": {
        "psr-4": {
            "_HumbugBoxb94336daae36\\Symfony\\Component\\Finder\\": ""
        },
        "exclude-from-classmap": [
            "\/Tests\/"
        ]
    },
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "3.4-dev"
        }
    }
}Copyright (c) 2004-2019 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
CHANGELOG
=========

3.4.0
-----

* deprecated `ErrorHandler::stackErrors()` and `ErrorHandler::unstackErrors()`

3.3.0
-----

* deprecated the `ContextErrorException` class: use \ErrorException directly now

3.2.0
-----

* `FlattenException::getTrace()` now returns additional type descriptions
  `integer` and `float`.


3.0.0
-----

* removed classes, methods and interfaces deprecated in 2.x

2.8.0
-----

* added BufferingLogger for errors that happen before a proper logger is configured
* allow throwing from `__toString()` with `return trigger_error($e, E_USER_ERROR);`
* deprecate ExceptionHandler::createResponse

2.7.0
-----

* added deprecations checking for parent interfaces/classes to DebugClassLoader
* added ZTS support to symfony_debug extension
* added symfony_debug_backtrace() to symfony_debug extension
  to track the backtrace of fatal errors

2.6.0
-----

* generalized ErrorHandler and ExceptionHandler,
  with some new methods and others deprecated
* enhanced error messages for uncaught exceptions

2.5.0
-----

* added ExceptionHandler::setHandler()
* added UndefinedMethodFatalErrorHandler
* deprecated DummyException

2.4.0
-----

 * added a DebugClassLoader able to wrap any autoloader providing a findFile method
 * improved error messages for not found classes and functions

2.3.0
-----

 * added the component
// $Id$
// vim:ft=javascript

// If your extension references something external, use ARG_WITH
// ARG_WITH("symfony_debug", "for symfony_debug support", "no");

// Otherwise, use ARG_ENABLE
// ARG_ENABLE("symfony_debug", "enable symfony_debug support", "no");

if (PHP_SYMFONY_DEBUG != "no") {
	EXTENSION("symfony_debug", "symfony_debug.c");
}

/*
 * 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.
 */

#ifndef PHP_SYMFONY_DEBUG_H
#define PHP_SYMFONY_DEBUG_H

extern zend_module_entry symfony_debug_module_entry;
#define phpext_symfony_debug_ptr &symfony_debug_module_entry

#define PHP_SYMFONY_DEBUG_VERSION "2.7"

#ifdef PHP_WIN32
#	define PHP_SYMFONY_DEBUG_API __declspec(dllexport)
#elif defined(__GNUC__) && __GNUC__ >= 4
#	define PHP_SYMFONY_DEBUG_API __attribute__ ((visibility("default")))
#else
#	define PHP_SYMFONY_DEBUG_API
#endif

#ifdef ZTS
#include "TSRM.h"
#endif

ZEND_BEGIN_MODULE_GLOBALS(symfony_debug)
	intptr_t req_rand_init;
	void (*old_error_cb)(int type, const char *error_filename, const uint error_lineno, const char *format, va_list args);
	zval *debug_bt;
ZEND_END_MODULE_GLOBALS(symfony_debug)

PHP_MINIT_FUNCTION(symfony_debug);
PHP_MSHUTDOWN_FUNCTION(symfony_debug);
PHP_RINIT_FUNCTION(symfony_debug);
PHP_RSHUTDOWN_FUNCTION(symfony_debug);
PHP_MINFO_FUNCTION(symfony_debug);
PHP_GINIT_FUNCTION(symfony_debug);
PHP_GSHUTDOWN_FUNCTION(symfony_debug);

PHP_FUNCTION(symfony_zval_info);
PHP_FUNCTION(symfony_debug_backtrace);

static char *_symfony_debug_memory_address_hash(void * TSRMLS_DC);
static const char *_symfony_debug_zval_type(zval *);
static const char* _symfony_debug_get_resource_type(long TSRMLS_DC);
static int _symfony_debug_get_resource_refcount(long TSRMLS_DC);

void symfony_debug_error_cb(int type, const char *error_filename, const uint error_lineno, const char *format, va_list args);

#ifdef ZTS
#define SYMFONY_DEBUG_G(v) TSRMG(symfony_debug_globals_id, zend_symfony_debug_globals *, v)
#else
#define SYMFONY_DEBUG_G(v) (symfony_debug_globals.v)
#endif

#endif	/* PHP_SYMFONY_DEBUG_H */
--TEST--
Test symfony_debug_backtrace in case of fatal error
--SKIPIF--
<?php if (!extension_loaded('symfony_debug')) {
    echo 'skip';
} ?>
--FILE--
<?php

function bar()
{
    foo();
}

function foo()
{
    notexist();
}

function bt()
{
    print_r(symfony_debug_backtrace());
}

register_shutdown_function('bt');

bar();

?>
--EXPECTF--
Fatal error: Call to undefined function notexist() in %s on line %d
Array
(
    [0] => Array
        (
            [function] => bt
            [args] => Array
                (
                )

        )

    [1] => Array
        (
            [file] => %s
            [line] => %d
            [function] => foo
            [args] => Array
                (
                )

        )

    [2] => Array
        (
            [file] => %s
            [line] => %d
            [function] => bar
            [args] => Array
                (
                )

        )

)
--TEST--
Test ErrorHandler in case of fatal error
--SKIPIF--
<?php if (!extension_loaded('symfony_debug')) {
    echo 'skip';
} ?>
--FILE--
<?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';
}

namespace Symfony\Component\Debug;

$dir = __DIR__.'/../../../';
require $dir.'ErrorHandler.php';
require $dir.'Exception/FatalErrorException.php';
require $dir.'Exception/UndefinedFunctionException.php';
require $dir.'FatalErrorHandler/FatalErrorHandlerInterface.php';
require $dir.'FatalErrorHandler/ClassNotFoundFatalErrorHandler.php';
require $dir.'FatalErrorHandler/UndefinedFunctionFatalErrorHandler.php';
require $dir.'FatalErrorHandler/UndefinedMethodFatalErrorHandler.php';

function bar()
{
    foo();
}

function foo()
{
    notexist();
}

$handler = ErrorHandler::register();
$handler->setExceptionHandler('print_r');

if (\function_exists('xdebug_disable')) {
    xdebug_disable();
}

bar();
?>
--EXPECTF--
Fatal error: Call to undefined function Symfony\Component\Debug\notexist() in %s on line %d
Symfony\Component\Debug\Exception\UndefinedFunctionException Object
(
    [message:protected] => Attempted to call function "notexist" from namespace "Symfony\Component\Debug".
    [string:Exception:private] => 
    [code:protected] => 0
    [file:protected] => %s
    [line:protected] => %d
    [trace:Exception:private] => Array
        (
            [0] => Array
                (
%A                    [function] => Symfony\Component\Debug\foo
%A                    [args] => Array
                        (
                        )

                )

            [1] => Array
                (
%A                    [function] => Symfony\Component\Debug\bar
%A                    [args] => Array
                        (
                        )

                )
%A
        )

    [previous:Exception:private] => 
    [severity:protected] => 1
)
--TEST--
Test symfony_debug_backtrace in case of non fatal error
--SKIPIF--
<?php if (!extension_loaded('symfony_debug')) {
    echo 'skip';
} ?>
--FILE--
<?php

function bar()
{
    bt();
}

function bt()
{
    print_r(symfony_debug_backtrace());
}

bar();

?>
--EXPECTF--
Array
(
    [0] => Array
        (
            [file] => %s
            [line] => %d
            [function] => bt
            [args] => Array
                (
                )

        )

    [1] => Array
        (
            [file] => %s
            [line] => %d
            [function] => bar
            [args] => Array
                (
                )

        )

)
--TEST--
Test symfony_zval_info API
--SKIPIF--
<?php if (!extension_loaded('symfony_debug')) {
    echo 'skip';
} ?>
--FILE--
<?php

$int = 42;
$float = 42.42;
$str = 'foobar';
$object = new StdClass();
$array = ['foo', 'bar'];
$resource = tmpfile();
$null = null;
$bool = true;

$anotherint = 42;
$refcount2 = &$anotherint;

$var = [
    'int' => $int,
    'float' => $float,
    'str' => $str,
    'object' => $object,
    'array' => $array,
    'resource' => $resource,
    'null' => $null,
    'bool' => $bool,
    'refcount' => &$refcount2,
];

var_dump(symfony_zval_info('int', $var));
var_dump(symfony_zval_info('float', $var));
var_dump(symfony_zval_info('str', $var));
var_dump(symfony_zval_info('object', $var));
var_dump(symfony_zval_info('array', $var));
var_dump(symfony_zval_info('resource', $var));
var_dump(symfony_zval_info('null', $var));
var_dump(symfony_zval_info('bool', $var));

var_dump(symfony_zval_info('refcount', $var));
var_dump(symfony_zval_info('not-exist', $var));
?>
--EXPECTF--
array(4) {
  ["type"]=>
  string(7) "integer"
  ["zval_hash"]=>
  string(16) "%s"
  ["zval_refcount"]=>
  int(2)
  ["zval_isref"]=>
  bool(false)
}
array(4) {
  ["type"]=>
  string(6) "double"
  ["zval_hash"]=>
  string(16) "%s"
  ["zval_refcount"]=>
  int(2)
  ["zval_isref"]=>
  bool(false)
}
array(5) {
  ["type"]=>
  string(6) "string"
  ["zval_hash"]=>
  string(16) "%s"
  ["zval_refcount"]=>
  int(2)
  ["zval_isref"]=>
  bool(false)
  ["strlen"]=>
  int(6)
}
array(8) {
  ["type"]=>
  string(6) "object"
  ["zval_hash"]=>
  string(16) "%s"
  ["zval_refcount"]=>
  int(2)
  ["zval_isref"]=>
  bool(false)
  ["object_class"]=>
  string(8) "stdClass"
  ["object_refcount"]=>
  int(1)
  ["object_hash"]=>
  string(32) "%s"
  ["object_handle"]=>
  int(%d)
}
array(5) {
  ["type"]=>
  string(5) "array"
  ["zval_hash"]=>
  string(16) "%s"
  ["zval_refcount"]=>
  int(2)
  ["zval_isref"]=>
  bool(false)
  ["array_count"]=>
  int(2)
}
array(7) {
  ["type"]=>
  string(8) "resource"
  ["zval_hash"]=>
  string(16) "%s"
  ["zval_refcount"]=>
  int(2)
  ["zval_isref"]=>
  bool(false)
  ["resource_handle"]=>
  int(%d)
  ["resource_type"]=>
  string(6) "stream"
  ["resource_refcount"]=>
  int(1)
}
array(4) {
  ["type"]=>
  string(4) "NULL"
  ["zval_hash"]=>
  string(16) "%s"
  ["zval_refcount"]=>
  int(2)
  ["zval_isref"]=>
  bool(false)
}
array(4) {
  ["type"]=>
  string(7) "boolean"
  ["zval_hash"]=>
  string(16) "%s"
  ["zval_refcount"]=>
  int(2)
  ["zval_isref"]=>
  bool(false)
}
array(4) {
  ["type"]=>
  string(7) "integer"
  ["zval_hash"]=>
  string(16) "%s"
  ["zval_refcount"]=>
  int(3)
  ["zval_isref"]=>
  bool(true)
}
NULL
Symfony Debug Extension for PHP 5
=================================

This extension publishes several functions to help building powerful debugging tools.
It is compatible with PHP 5.3, 5.4, 5.5 and 5.6; with ZTS and non-ZTS modes.
It is not required thus not provided for PHP 7.

symfony_zval_info()
-------------------

- exposes zval_hash/refcounts, allowing e.g. efficient exploration of arbitrary structures in PHP,
- does work with references, preventing memory copying.

Its behavior is about the same as:

```php
<?php

function symfony_zval_info($key, $array, $options = 0)
{

    // $options is currently not used, but could be in future version.

    if (!array_key_exists($key, $array)) {
        return null;
    }

    $info = [
        'type' => gettype($array[$key]),
        'zval_hash' => /* hashed memory address of $array[$key] */,
        'zval_refcount' => /* internal zval refcount of $array[$key] */,
        'zval_isref' => /* is_ref status of $array[$key] */,
    ];

    switch ($info['type']) {
        case 'object':
            $info += [
                'object_class' => get_class($array[$key]),
                'object_refcount' => /* internal object refcount of $array[$key] */,
                'object_hash' => spl_object_hash($array[$key]),
                'object_handle' => /* internal object handle $array[$key] */,
            ];
            break;

        case 'resource':
            $info += [
                'resource_handle' => (int) $array[$key],
                'resource_type' => get_resource_type($array[$key]),
                'resource_refcount' => /* internal resource refcount of $array[$key] */,
            ];
            break;

        case 'array':
            $info += [
                'array_count' => count($array[$key]),
            ];
            break;

        case 'string':
            $info += [
                'strlen' => strlen($array[$key]),
            ];
            break;
    }

    return $info;
}
```

symfony_debug_backtrace()
-------------------------

This function works like debug_backtrace(), except that it can fetch the full backtrace in case of fatal errors:

```php
function foo() { fatal(); }
function bar() { foo(); }

function sd() { var_dump(symfony_debug_backtrace()); }

register_shutdown_function('sd');

bar();

/* Will output
Fatal error: Call to undefined function fatal() in foo.php on line 42
array(3) {
  [0]=>
  array(2) {
    ["function"]=>
    string(2) "sd"
    ["args"]=>
    array(0) {
    }
  }
  [1]=>
  array(4) {
    ["file"]=>
    string(7) "foo.php"
    ["line"]=>
    int(1)
    ["function"]=>
    string(3) "foo"
    ["args"]=>
    array(0) {
    }
  }
  [2]=>
  array(4) {
    ["file"]=>
    string(102) "foo.php"
    ["line"]=>
    int(2)
    ["function"]=>
    string(3) "bar"
    ["args"]=>
    array(0) {
    }
  }
}
*/
```

Usage
-----

To enable the extension from source, run:

```
    phpize
    ./configure
    make
    sudo make install
```
dnl $Id$
dnl config.m4 for extension symfony_debug

dnl Comments in this file start with the string 'dnl'.
dnl Remove where necessary. This file will not work
dnl without editing.

dnl If your extension references something external, use with:

dnl PHP_ARG_WITH(symfony_debug, for symfony_debug support,
dnl Make sure that the comment is aligned:
dnl [  --with-symfony_debug             Include symfony_debug support])

dnl Otherwise use enable:

PHP_ARG_ENABLE(symfony_debug, whether to enable symfony_debug support,
dnl Make sure that the comment is aligned:
[  --enable-symfony_debug           Enable symfony_debug support])

if test "$PHP_SYMFONY_DEBUG" != "no"; then
  dnl Write more examples of tests here...

  dnl # --with-symfony_debug -> check with-path
  dnl SEARCH_PATH="/usr/local /usr"     # you might want to change this
  dnl SEARCH_FOR="/include/symfony_debug.h"  # you most likely want to change this
  dnl if test -r $PHP_SYMFONY_DEBUG/$SEARCH_FOR; then # path given as parameter
  dnl   SYMFONY_DEBUG_DIR=$PHP_SYMFONY_DEBUG
  dnl else # search default path list
  dnl   AC_MSG_CHECKING([for symfony_debug files in default path])
  dnl   for i in $SEARCH_PATH ; do
  dnl     if test -r $i/$SEARCH_FOR; then
  dnl       SYMFONY_DEBUG_DIR=$i
  dnl       AC_MSG_RESULT(found in $i)
  dnl     fi
  dnl   done
  dnl fi
  dnl
  dnl if test -z "$SYMFONY_DEBUG_DIR"; then
  dnl   AC_MSG_RESULT([not found])
  dnl   AC_MSG_ERROR([Please reinstall the symfony_debug distribution])
  dnl fi

  dnl # --with-symfony_debug -> add include path
  dnl PHP_ADD_INCLUDE($SYMFONY_DEBUG_DIR/include)

  dnl # --with-symfony_debug -> check for lib and symbol presence
  dnl LIBNAME=symfony_debug # you may want to change this
  dnl LIBSYMBOL=symfony_debug # you most likely want to change this 

  dnl PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
  dnl [
  dnl   PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $SYMFONY_DEBUG_DIR/lib, SYMFONY_DEBUG_SHARED_LIBADD)
  dnl   AC_DEFINE(HAVE_SYMFONY_DEBUGLIB,1,[ ])
  dnl ],[
  dnl   AC_MSG_ERROR([wrong symfony_debug lib version or lib not found])
  dnl ],[
  dnl   -L$SYMFONY_DEBUG_DIR/lib -lm
  dnl ])
  dnl
  dnl PHP_SUBST(SYMFONY_DEBUG_SHARED_LIBADD)

  PHP_NEW_EXTENSION(symfony_debug, symfony_debug.c, $ext_shared)
fi
/*
 * 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.
 */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "php.h"
#ifdef ZTS
#include "TSRM.h"
#endif
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_symfony_debug.h"
#include "ext/standard/php_rand.h"
#include "ext/standard/php_lcg.h"
#include "ext/spl/php_spl.h"
#include "Zend/zend_gc.h"
#include "Zend/zend_builtin_functions.h"
#include "Zend/zend_extensions.h" /* for ZEND_EXTENSION_API_NO */
#include "ext/standard/php_array.h"
#include "Zend/zend_interfaces.h"
#include "SAPI.h"

#define IS_PHP_53 ZEND_EXTENSION_API_NO == 220090626

ZEND_DECLARE_MODULE_GLOBALS(symfony_debug)

ZEND_BEGIN_ARG_INFO_EX(symfony_zval_arginfo, 0, 0, 2)
	ZEND_ARG_INFO(0, key)
	ZEND_ARG_ARRAY_INFO(0, array, 0)
	ZEND_ARG_INFO(0, options)
ZEND_END_ARG_INFO()

const zend_function_entry symfony_debug_functions[] = {
	PHP_FE(symfony_zval_info,	symfony_zval_arginfo)
	PHP_FE(symfony_debug_backtrace, NULL)
	PHP_FE_END
};

PHP_FUNCTION(symfony_debug_backtrace)
{
	if (zend_parse_parameters_none() == FAILURE) {
		return;
	}
#if IS_PHP_53
	zend_fetch_debug_backtrace(return_value, 1, 0 TSRMLS_CC);
#else
	zend_fetch_debug_backtrace(return_value, 1, 0, 0 TSRMLS_CC);
#endif

	if (!SYMFONY_DEBUG_G(debug_bt)) {
		return;
	}

	php_array_merge(Z_ARRVAL_P(return_value), Z_ARRVAL_P(SYMFONY_DEBUG_G(debug_bt)), 0 TSRMLS_CC);
}

PHP_FUNCTION(symfony_zval_info)
{
	zval *key = NULL, *arg = NULL;
	zval **data = NULL;
	HashTable *array = NULL;
	long options = 0;

	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zh|l", &key, &array, &options) == FAILURE) {
		return;
	}

	switch (Z_TYPE_P(key)) {
		case IS_STRING:
			if (zend_symtable_find(array, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, (void **)&data) == FAILURE) {
				return;
			}
		break;
		case IS_LONG:
			if (zend_hash_index_find(array, Z_LVAL_P(key), (void **)&data)) {
				return;
			}
		break;
	}

	arg = *data;

	array_init(return_value);

	add_assoc_string(return_value, "type", (char *)_symfony_debug_zval_type(arg), 1);
	add_assoc_stringl(return_value, "zval_hash", _symfony_debug_memory_address_hash((void *)arg TSRMLS_CC), 16, 0);
	add_assoc_long(return_value, "zval_refcount", Z_REFCOUNT_P(arg));
	add_assoc_bool(return_value, "zval_isref", (zend_bool)Z_ISREF_P(arg));

	if (Z_TYPE_P(arg) == IS_OBJECT) {
		char hash[33] = {0};

		php_spl_object_hash(arg, (char *)hash TSRMLS_CC);
		add_assoc_stringl(return_value, "object_class", (char *)Z_OBJCE_P(arg)->name, Z_OBJCE_P(arg)->name_length, 1);
		add_assoc_long(return_value, "object_refcount", EG(objects_store).object_buckets[Z_OBJ_HANDLE_P(arg)].bucket.obj.refcount);
		add_assoc_string(return_value, "object_hash", hash, 1);
		add_assoc_long(return_value, "object_handle", Z_OBJ_HANDLE_P(arg));
	} else if (Z_TYPE_P(arg) == IS_ARRAY) {
		add_assoc_long(return_value, "array_count", zend_hash_num_elements(Z_ARRVAL_P(arg)));
	} else if(Z_TYPE_P(arg) == IS_RESOURCE) {
		add_assoc_long(return_value, "resource_handle", Z_LVAL_P(arg));
		add_assoc_string(return_value, "resource_type", (char *)_symfony_debug_get_resource_type(Z_LVAL_P(arg) TSRMLS_CC), 1);
		add_assoc_long(return_value, "resource_refcount", _symfony_debug_get_resource_refcount(Z_LVAL_P(arg) TSRMLS_CC));
	} else if (Z_TYPE_P(arg) == IS_STRING) {
		add_assoc_long(return_value, "strlen", Z_STRLEN_P(arg));
	}
}

void symfony_debug_error_cb(int type, const char *error_filename, const uint error_lineno, const char *format, va_list args)
{
	TSRMLS_FETCH();
	zval *retval;

	switch (type) {
		case E_ERROR:
		case E_PARSE:
		case E_CORE_ERROR:
		case E_CORE_WARNING:
		case E_COMPILE_ERROR:
		case E_COMPILE_WARNING:
			ALLOC_INIT_ZVAL(retval);
#if IS_PHP_53
			zend_fetch_debug_backtrace(retval, 1, 0 TSRMLS_CC);
#else
			zend_fetch_debug_backtrace(retval, 1, 0, 0 TSRMLS_CC);
#endif
			SYMFONY_DEBUG_G(debug_bt) = retval;
	}

	SYMFONY_DEBUG_G(old_error_cb)(type, error_filename, error_lineno, format, args);
}

static const char* _symfony_debug_get_resource_type(long rsid TSRMLS_DC)
{
	const char *res_type;
	res_type = zend_rsrc_list_get_rsrc_type(rsid TSRMLS_CC);

	if (!res_type) {
		return "Unknown";
	}

	return res_type;
}

static int _symfony_debug_get_resource_refcount(long rsid TSRMLS_DC)
{
	zend_rsrc_list_entry *le;

	if (zend_hash_index_find(&EG(regular_list), rsid, (void **) &le)==SUCCESS) {
		return le->refcount;
	}

	return 0;
}

static char *_symfony_debug_memory_address_hash(void *address TSRMLS_DC)
{
	char *result = NULL;
	intptr_t address_rand;

	if (!SYMFONY_DEBUG_G(req_rand_init)) {
		if (!BG(mt_rand_is_seeded)) {
			php_mt_srand(GENERATE_SEED() TSRMLS_CC);
		}
		SYMFONY_DEBUG_G(req_rand_init) = (intptr_t)php_mt_rand(TSRMLS_C);
	}

	address_rand = (intptr_t)address ^ SYMFONY_DEBUG_G(req_rand_init);

	spprintf(&result, 17, "%016zx", address_rand);

	return result;
}

static const char *_symfony_debug_zval_type(zval *zv)
{
	switch (Z_TYPE_P(zv)) {
		case IS_NULL:
			return "NULL";
			break;

		case IS_BOOL:
			return "boolean";
			break;

		case IS_LONG:
			return "integer";
			break;

		case IS_DOUBLE:
			return "double";
			break;

		case IS_STRING:
			return "string";
			break;

		case IS_ARRAY:
			return "array";
			break;

		case IS_OBJECT:
			return "object";

		case IS_RESOURCE:
			return "resource";

		default:
			return "unknown type";
	}
}

zend_module_entry symfony_debug_module_entry = {
	STANDARD_MODULE_HEADER,
	"symfony_debug",
	symfony_debug_functions,
	PHP_MINIT(symfony_debug),
	PHP_MSHUTDOWN(symfony_debug),
	PHP_RINIT(symfony_debug),
	PHP_RSHUTDOWN(symfony_debug),
	PHP_MINFO(symfony_debug),
	PHP_SYMFONY_DEBUG_VERSION,
	PHP_MODULE_GLOBALS(symfony_debug),
	PHP_GINIT(symfony_debug),
	PHP_GSHUTDOWN(symfony_debug),
	NULL,
	STANDARD_MODULE_PROPERTIES_EX
};

#ifdef COMPILE_DL_SYMFONY_DEBUG
ZEND_GET_MODULE(symfony_debug)
#endif

PHP_GINIT_FUNCTION(symfony_debug)
{
	memset(symfony_debug_globals, 0 , sizeof(*symfony_debug_globals));
}

PHP_GSHUTDOWN_FUNCTION(symfony_debug)
{

}

PHP_MINIT_FUNCTION(symfony_debug)
{
	SYMFONY_DEBUG_G(old_error_cb) = zend_error_cb;
	zend_error_cb                 = symfony_debug_error_cb;

	return SUCCESS;
}

PHP_MSHUTDOWN_FUNCTION(symfony_debug)
{
	zend_error_cb = SYMFONY_DEBUG_G(old_error_cb);

	return SUCCESS;
}

PHP_RINIT_FUNCTION(symfony_debug)
{
	return SUCCESS;
}

PHP_RSHUTDOWN_FUNCTION(symfony_debug)
{
	return SUCCESS;
}

PHP_MINFO_FUNCTION(symfony_debug)
{
	php_info_print_table_start();
	php_info_print_table_header(2, "Symfony Debug support", "enabled");
	php_info_print_table_header(2, "Symfony Debug version", PHP_SYMFONY_DEBUG_VERSION);
	php_info_print_table_end();
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Debug;

/**
 * Registers all the debug tools.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Debug
{
    private static $enabled = \false;
    /**
     * Enables the debug tools.
     *
     * This method registers an error handler, an exception handler and a special class loader.
     *
     * @param int  $errorReportingLevel The level of error reporting you want
     * @param bool $displayErrors       Whether to display errors (for development) or just log them (for production)
     */
    public static function enable($errorReportingLevel = \E_ALL, $displayErrors = \true)
    {
        if (static::$enabled) {
            return;
        }
        static::$enabled = \true;
        if (null !== $errorReportingLevel) {
            \error_reporting($errorReportingLevel);
        } else {
            \error_reporting(\E_ALL);
        }
        if (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], \true)) {
            \ini_set('display_errors', 0);
            \_HumbugBoxb94336daae36\Symfony\Component\Debug\ExceptionHandler::register();
        } elseif ($displayErrors && (!\filter_var(\ini_get('log_errors'), \FILTER_VALIDATE_BOOLEAN) || \ini_get('error_log'))) {
            // CLI - display errors only if they're not already logged to STDERR
            \ini_set('display_errors', 1);
        }
        if ($displayErrors) {
            \_HumbugBoxb94336daae36\Symfony\Component\Debug\ErrorHandler::register(new \_HumbugBoxb94336daae36\Symfony\Component\Debug\ErrorHandler(new \_HumbugBoxb94336daae36\Symfony\Component\Debug\BufferingLogger()));
        } else {
            \_HumbugBoxb94336daae36\Symfony\Component\Debug\ErrorHandler::register()->throwAt(0, \true);
        }
        \_HumbugBoxb94336daae36\Symfony\Component\Debug\DebugClassLoader::enable();
    }
}
Debug Component
===============

The Debug component provides tools to ease debugging PHP code.

Resources
---------

  * [Documentation](https://symfony.com/doc/current/components/debug/index.html)
  * [Contributing](https://symfony.com/doc/current/contributing/index.html)
  * [Report issues](https://github.com/symfony/symfony/issues) and
    [send Pull Requests](https://github.com/symfony/symfony/pulls)
    in the [main Symfony repository](https://github.com/symfony/symfony)
<?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 _HumbugBoxb94336daae36\Symfony\Component\Debug\FatalErrorHandler;

use _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalErrorException;
use _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\UndefinedFunctionException;
/**
 * ErrorHandler for undefined functions.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class UndefinedFunctionFatalErrorHandler implements \_HumbugBoxb94336daae36\Symfony\Component\Debug\FatalErrorHandler\FatalErrorHandlerInterface
{
    /**
     * {@inheritdoc}
     */
    public function handleError(array $error, \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalErrorException $exception)
    {
        $messageLen = \strlen($error['message']);
        $notFoundSuffix = '()';
        $notFoundSuffixLen = \strlen($notFoundSuffix);
        if ($notFoundSuffixLen > $messageLen) {
            return;
        }
        if (0 !== \substr_compare($error['message'], $notFoundSuffix, -$notFoundSuffixLen)) {
            return;
        }
        $prefix = 'Call to undefined function ';
        $prefixLen = \strlen($prefix);
        if (0 !== \strpos($error['message'], $prefix)) {
            return;
        }
        $fullyQualifiedFunctionName = \substr($error['message'], $prefixLen, -$notFoundSuffixLen);
        if (\false !== ($namespaceSeparatorIndex = \strrpos($fullyQualifiedFunctionName, '\\'))) {
            $functionName = \substr($fullyQualifiedFunctionName, $namespaceSeparatorIndex + 1);
            $namespacePrefix = \substr($fullyQualifiedFunctionName, 0, $namespaceSeparatorIndex);
            $message = \sprintf('Attempted to call function "%s" from namespace "%s".', $functionName, $namespacePrefix);
        } else {
            $functionName = $fullyQualifiedFunctionName;
            $message = \sprintf('Attempted to call 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 \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\UndefinedFunctionException($message, $exception);
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Debug\FatalErrorHandler;

use _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalErrorException;
/**
 * Attempts to convert fatal errors to exceptions.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface FatalErrorHandlerInterface
{
    /**
     * Attempts to convert an error into an exception.
     *
     * @param array               $error     An array as returned by error_get_last()
     * @param FatalErrorException $exception A FatalErrorException instance
     *
     * @return FatalErrorException|null A FatalErrorException instance if the class is able to convert the error, null otherwise
     */
    public function handleError(array $error, \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalErrorException $exception);
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Debug\FatalErrorHandler;

use _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalErrorException;
use _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\UndefinedMethodException;
/**
 * ErrorHandler for undefined methods.
 *
 * @author Grégoire Pineau <lyrixx@lyrixx.info>
 */
class UndefinedMethodFatalErrorHandler implements \_HumbugBoxb94336daae36\Symfony\Component\Debug\FatalErrorHandler\FatalErrorHandlerInterface
{
    /**
     * {@inheritdoc}
     */
    public function handleError(array $error, \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalErrorException $exception)
    {
        \preg_match('/^Call to undefined method (.*)::(.*)\\(\\)$/', $error['message'], $matches);
        if (!$matches) {
            return;
        }
        $className = $matches[1];
        $methodName = $matches[2];
        $message = \sprintf('Attempted to call an undefined method named "%s" of class "%s".', $methodName, $className);
        if (!\class_exists($className) || null === ($methods = \get_class_methods($className))) {
            // failed to get the class or its methods on which an unknown method was called (for example on an anonymous class)
            return new \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\UndefinedMethodException($message, $exception);
        }
        $candidates = [];
        foreach ($methods as $definedMethodName) {
            $lev = \levenshtein($methodName, $definedMethodName);
            if ($lev <= \strlen($methodName) / 3 || \false !== \strpos($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 \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\UndefinedMethodException($message, $exception);
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Debug\FatalErrorHandler;

use _HumbugBoxb94336daae36\Composer\Autoload\ClassLoader as ComposerClassLoader;
use _HumbugBoxb94336daae36\Symfony\Component\ClassLoader\ClassLoader as SymfonyClassLoader;
use _HumbugBoxb94336daae36\Symfony\Component\Debug\DebugClassLoader;
use _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\ClassNotFoundException;
use _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalErrorException;
/**
 * ErrorHandler for classes that do not exist.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ClassNotFoundFatalErrorHandler implements \_HumbugBoxb94336daae36\Symfony\Component\Debug\FatalErrorHandler\FatalErrorHandlerInterface
{
    /**
     * {@inheritdoc}
     */
    public function handleError(array $error, \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalErrorException $exception)
    {
        $messageLen = \strlen($error['message']);
        $notFoundSuffix = '\' not found';
        $notFoundSuffixLen = \strlen($notFoundSuffix);
        if ($notFoundSuffixLen > $messageLen) {
            return;
        }
        if (0 !== \substr_compare($error['message'], $notFoundSuffix, -$notFoundSuffixLen)) {
            return;
        }
        foreach (['class', 'interface', 'trait'] as $typeName) {
            $prefix = \ucfirst($typeName) . ' \'';
            $prefixLen = \strlen($prefix);
            if (0 !== \strpos($error['message'], $prefix)) {
                continue;
            }
            $fullyQualifiedClassName = \substr($error['message'], $prefixLen, -$notFoundSuffixLen);
            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 \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\ClassNotFoundException($message, $exception);
        }
    }
    /**
     * Tries to guess the full namespace for a given class name.
     *
     * By default, it looks for PSR-0 and PSR-4 classes registered via a Symfony or a Composer
     * autoloader (that should cover all common cases).
     *
     * @param string $class A class name (without its namespace)
     *
     * @return array An array of possible fully qualified class names
     */
    private function getClassCandidates($class)
    {
        if (!\is_array($functions = \spl_autoload_functions())) {
            return [];
        }
        // find Symfony and Composer autoloaders
        $classes = [];
        foreach ($functions as $function) {
            if (!\is_array($function)) {
                continue;
            }
            // get class loaders wrapped by DebugClassLoader
            if ($function[0] instanceof \_HumbugBoxb94336daae36\Symfony\Component\Debug\DebugClassLoader) {
                $function = $function[0]->getClassLoader();
                if (!\is_array($function)) {
                    continue;
                }
            }
            if ($function[0] instanceof \_HumbugBoxb94336daae36\Composer\Autoload\ClassLoader || $function[0] instanceof \_HumbugBoxb94336daae36\Symfony\Component\ClassLoader\ClassLoader) {
                foreach ($function[0]->getPrefixes() as $prefix => $paths) {
                    foreach ($paths as $path) {
                        $classes = \array_merge($classes, $this->findClassInPath($path, $class, $prefix));
                    }
                }
            }
            if ($function[0] instanceof \_HumbugBoxb94336daae36\Composer\Autoload\ClassLoader) {
                foreach ($function[0]->getPrefixesPsr4() as $prefix => $paths) {
                    foreach ($paths as $path) {
                        $classes = \array_merge($classes, $this->findClassInPath($path, $class, $prefix));
                    }
                }
            }
        }
        return \array_unique($classes);
    }
    /**
     * @param string $path
     * @param string $class
     * @param string $prefix
     *
     * @return array
     */
    private function findClassInPath($path, $class, $prefix)
    {
        if (!($path = \realpath($path . '/' . \strtr($prefix, '\\_', '//')) ?: \realpath($path . '/' . \dirname(\strtr($prefix, '\\_', '//'))) ?: \realpath($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;
    }
    /**
     * @param string $path
     * @param string $file
     * @param string $prefix
     *
     * @return string|null
     */
    private function convertFileToClass($path, $file, $prefix)
    {
        $candidates = [
            // namespaced class
            $namespacedClass = \str_replace([$path . \DIRECTORY_SEPARATOR, '.php', '/'], ['', '', '\\'], $file),
            // namespaced class (with target dir)
            $prefix . $namespacedClass,
            // namespaced class (with target dir and separator)
            $prefix . '\\' . $namespacedClass,
            // PEAR class
            \str_replace('\\', '_', $namespacedClass),
            // PEAR class (with target dir)
            \str_replace('\\', '_', $prefix . $namespacedClass),
            // PEAR class (with target dir and separator)
            \str_replace('\\', '_', $prefix . '\\' . $namespacedClass),
        ];
        if ($prefix) {
            $candidates = \array_filter($candidates, function ($candidate) use($prefix) {
                return 0 === \strpos($candidate, $prefix);
            });
        }
        // We cannot use the autoloader here as most of them use require; but if the class
        // is not found, the new autoloader call will require the file again leading to a
        // "cannot redeclare class" error.
        foreach ($candidates as $candidate) {
            if ($this->classExists($candidate)) {
                return $candidate;
            }
        }
        try {
            require_once $file;
        } catch (\Throwable $e) {
            return null;
        }
        foreach ($candidates as $candidate) {
            if ($this->classExists($candidate)) {
                return $candidate;
            }
        }
    }
    /**
     * @param string $class
     *
     * @return bool
     */
    private function classExists($class)
    {
        return \class_exists($class, \false) || \interface_exists($class, \false) || \trait_exists($class, \false);
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Debug;

use _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FlattenException;
use _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\OutOfMemoryException;
use _HumbugBoxb94336daae36\Symfony\Component\HttpKernel\Debug\FileLinkFormatter;
/**
 * ExceptionHandler converts an exception to a Response object.
 *
 * It is mostly useful in debug mode to replace the default PHP/XDebug
 * output with something prettier and more useful.
 *
 * As this class is mainly used during Kernel boot, where nothing is yet
 * available, the Response content is always HTML.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Nicolas Grekas <p@tchwork.com>
 */
class ExceptionHandler
{
    private $debug;
    private $charset;
    private $handler;
    private $caughtBuffer;
    private $caughtLength;
    private $fileLinkFormat;
    public function __construct($debug = \true, $charset = null, $fileLinkFormat = null)
    {
        $this->debug = $debug;
        $this->charset = $charset ?: \ini_get('default_charset') ?: 'UTF-8';
        $this->fileLinkFormat = $fileLinkFormat;
    }
    /**
     * Registers the exception handler.
     *
     * @param bool        $debug          Enable/disable debug mode, where the stack trace is displayed
     * @param string|null $charset        The charset used by exception messages
     * @param string|null $fileLinkFormat The IDE link template
     *
     * @return static
     */
    public static function register($debug = \true, $charset = null, $fileLinkFormat = null)
    {
        $handler = new static($debug, $charset, $fileLinkFormat);
        $prev = \set_exception_handler([$handler, 'handle']);
        if (\is_array($prev) && $prev[0] instanceof \_HumbugBoxb94336daae36\Symfony\Component\Debug\ErrorHandler) {
            \restore_exception_handler();
            $prev[0]->setExceptionHandler([$handler, 'handle']);
        }
        return $handler;
    }
    /**
     * Sets a user exception handler.
     *
     * @param callable $handler An handler that will be called on Exception
     *
     * @return callable|null The previous exception handler if any
     */
    public function setHandler(callable $handler = null)
    {
        $old = $this->handler;
        $this->handler = $handler;
        return $old;
    }
    /**
     * Sets the format for links to source files.
     *
     * @param string|FileLinkFormatter $fileLinkFormat The format for links to source files
     *
     * @return string The previous file link format
     */
    public function setFileLinkFormat($fileLinkFormat)
    {
        $old = $this->fileLinkFormat;
        $this->fileLinkFormat = $fileLinkFormat;
        return $old;
    }
    /**
     * Sends a response for the given Exception.
     *
     * To be as fail-safe as possible, the exception is first handled
     * by our simple exception handler, then by the user exception handler.
     * The latter takes precedence and any output from the former is cancelled,
     * if and only if nothing bad happens in this handling path.
     */
    public function handle(\Exception $exception)
    {
        if (null === $this->handler || $exception instanceof \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\OutOfMemoryException) {
            $this->sendPhpResponse($exception);
            return;
        }
        $caughtLength = $this->caughtLength = 0;
        \ob_start(function ($buffer) {
            $this->caughtBuffer = $buffer;
            return '';
        });
        $this->sendPhpResponse($exception);
        while (null === $this->caughtBuffer && \ob_end_flush()) {
            // Empty loop, everything is in the condition
        }
        if (isset($this->caughtBuffer[0])) {
            \ob_start(function ($buffer) {
                if ($this->caughtLength) {
                    // use substr_replace() instead of substr() for mbstring overloading resistance
                    $cleanBuffer = \substr_replace($buffer, '', 0, $this->caughtLength);
                    if (isset($cleanBuffer[0])) {
                        $buffer = $cleanBuffer;
                    }
                }
                return $buffer;
            });
            echo $this->caughtBuffer;
            $caughtLength = \ob_get_length();
        }
        $this->caughtBuffer = null;
        try {
            \call_user_func($this->handler, $exception);
            $this->caughtLength = $caughtLength;
        } catch (\Exception $e) {
            if (!$caughtLength) {
                // All handlers failed. Let PHP handle that now.
                throw $exception;
            }
        }
    }
    /**
     * Sends the error associated with the given Exception as a plain PHP response.
     *
     * This method uses plain PHP functions like header() and echo to output
     * the response.
     *
     * @param \Exception|FlattenException $exception An \Exception or FlattenException instance
     */
    public function sendPhpResponse($exception)
    {
        if (!$exception instanceof \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FlattenException) {
            $exception = \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FlattenException::create($exception);
        }
        if (!\headers_sent()) {
            \header(\sprintf('HTTP/1.0 %s', $exception->getStatusCode()));
            foreach ($exception->getHeaders() as $name => $value) {
                \header($name . ': ' . $value, \false);
            }
            \header('Content-Type: text/html; charset=' . $this->charset);
        }
        echo $this->decorate($this->getContent($exception), $this->getStylesheet($exception));
    }
    /**
     * Gets the full HTML content associated with the given exception.
     *
     * @param \Exception|FlattenException $exception An \Exception or FlattenException instance
     *
     * @return string The HTML content as a string
     */
    public function getHtml($exception)
    {
        if (!$exception instanceof \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FlattenException) {
            $exception = \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FlattenException::create($exception);
        }
        return $this->decorate($this->getContent($exception), $this->getStylesheet($exception));
    }
    /**
     * Gets the HTML content associated with the given exception.
     *
     * @return string The content as a string
     */
    public function getContent(\_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FlattenException $exception)
    {
        switch ($exception->getStatusCode()) {
            case 404:
                $title = 'Sorry, the page you are looking for could not be found.';
                break;
            default:
                $title = 'Whoops, looks like something went wrong.';
        }
        if (!$this->debug) {
            return <<<EOF
                <div class="container">
                    <h1>{$title}</h1>
                </div>
EOF;
        }
        $content = '';
        try {
            $count = \count($exception->getAllPrevious());
            $total = $count + 1;
            foreach ($exception->toArray() as $position => $e) {
                $ind = $count - $position + 1;
                $class = $this->formatClass($e['class']);
                $message = \nl2br($this->escapeHtml($e['message']));
                $content .= \sprintf(<<<'EOF'
                    <div class="trace trace-as-html">
                        <table class="trace-details">
                            <thead class="trace-head"><tr><th>
                                <h3 class="trace-class">
                                    <span class="text-muted">(%d/%d)</span>
                                    <span class="exception_title">%s</span>
                                </h3>
                                <p class="break-long-words trace-message">%s</p>
                            </th></tr></thead>
                            <tbody>
EOF
, $ind, $total, $class, $message);
                foreach ($e['trace'] as $trace) {
                    $content .= '<tr><td>';
                    if ($trace['function']) {
                        $content .= \sprintf('at <span class="trace-class">%s</span><span class="trace-type">%s</span><span class="trace-method">%s</span>(<span class="trace-arguments">%s</span>)', $this->formatClass($trace['class']), $trace['type'], $trace['function'], $this->formatArgs($trace['args']));
                    }
                    if (isset($trace['file']) && isset($trace['line'])) {
                        $content .= $this->formatPath($trace['file'], $trace['line']);
                    }
                    $content .= "</td></tr>\n";
                }
                $content .= "</tbody>\n</table>\n</div>\n";
            }
        } catch (\Exception $e) {
            // something nasty happened and we cannot throw an exception anymore
            if ($this->debug) {
                $title = \sprintf('Exception thrown when handling an exception (%s: %s)', \get_class($e), $this->escapeHtml($e->getMessage()));
            } else {
                $title = 'Whoops, looks like something went wrong.';
            }
        }
        $symfonyGhostImageContents = $this->getSymfonyGhostAsSvg();
        return <<<EOF
            <div class="exception-summary">
                <div class="container">
                    <div class="exception-message-wrapper">
                        <h1 class="break-long-words exception-message">{$title}</h1>
                        <div class="exception-illustration hidden-xs-down">{$symfonyGhostImageContents}</div>
                    </div>
                </div>
            </div>

            <div class="container">
                {$content}
            </div>
EOF;
    }
    /**
     * Gets the stylesheet associated with the given exception.
     *
     * @return string The stylesheet as a string
     */
    public function getStylesheet(\_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FlattenException $exception)
    {
        if (!$this->debug) {
            return <<<'EOF'
                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; }
EOF;
        }
        return <<<'EOF'
            body { background-color: #F9F9F9; color: #222; font: 14px/1.4 Helvetica, Arial, sans-serif; margin: 0; 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: #FFF; border-collapse: collapse; vertical-align: top; }
            table { background: #FFF; border: 1px solid #E0E0E0; box-shadow: 0px 0px 1px rgba(128, 128, 128, .2); margin: 1em 0; width: 100%; }
            table th, table td { border: solid #E0E0E0; border-width: 1px 0; padding: 8px 10px; }
            table th { background-color: #E0E0E0; font-weight: bold; text-align: left; }

            .hidden-xs-down { display: none; }
            .block { display: block; }
            .break-long-words { -ms-word-break: break-all; word-break: break-all; word-break: break-word; -webkit-hyphens: auto; -moz-hyphens: auto; hyphens: auto; }
            .text-muted { color: #999; }

            .container { max-width: 1024px; margin: 0 auto; padding: 0 15px; }
            .container::after { content: ""; display: table; clear: both; }

            .exception-summary { background: #B0413E; 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: 30px; }

            .exception-message-wrapper { display: flex; align-items: center; min-height: 70px; }
            .exception-message { flex-grow: 1; padding: 30px 0; }
            .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-illustration { flex-basis: 111px; flex-shrink: 0; height: 66px; margin-left: 15px; opacity: .7; }

            .trace + .trace { margin-top: 30px; }
            .trace-head .trace-class { color: #222; font-size: 18px; font-weight: bold; line-height: 1.3; margin: 0; position: relative; }

            .trace-message { font-size: 14px; font-weight: normal; margin: .5em 0 0; }

            .trace-file-path, .trace-file-path a { color: #222; margin-top: 3px; font-size: 13px; }
            .trace-class { color: #B0413E; }
            .trace-type { padding: 0 2px; }
            .trace-method { color: #B0413E; font-weight: bold; }
            .trace-arguments { color: #777; font-weight: normal; padding-left: 2px; }

            @media (min-width: 575px) {
                .hidden-xs-down { display: initial; }
            }
EOF;
    }
    private function decorate($content, $css)
    {
        return <<<EOF
<!DOCTYPE html>
<html>
    <head>
        <meta charset="{$this->charset}" />
        <meta name="robots" content="noindex,nofollow" />
        <style>{$css}</style>
    </head>
    <body>
        {$content}
    </body>
</html>
EOF;
    }
    private function formatClass($class)
    {
        $parts = \explode('\\', $class);
        return \sprintf('<abbr title="%s">%s</abbr>', $class, \array_pop($parts));
    }
    private function formatPath($path, $line)
    {
        $file = $this->escapeHtml(\preg_match('#[^/\\\\]*+$#', $path, $file) ? $file[0] : $path);
        $fmt = $this->fileLinkFormat ?: \ini_get('xdebug.file_link_format') ?: \get_cfg_var('xdebug.file_link_format');
        if (!$fmt) {
            return \sprintf('<span class="block trace-file-path">in <span title="%s%3$s"><strong>%s</strong>%s</span></span>', $this->escapeHtml($path), $file, 0 < $line ? ' line ' . $line : '');
        }
        if (\is_string($fmt)) {
            $i = \strpos($f = $fmt, '&', \max(\strrpos($f, '%f'), \strrpos($f, '%l'))) ?: \strlen($f);
            $fmt = [\substr($f, 0, $i)] + \preg_split('/&([^>]++)>/', \substr($f, $i), -1, \PREG_SPLIT_DELIM_CAPTURE);
            for ($i = 1; isset($fmt[$i]); ++$i) {
                if (0 === \strpos($path, $k = $fmt[$i++])) {
                    $path = \substr_replace($path, $fmt[$i], 0, \strlen($k));
                    break;
                }
            }
            $link = \strtr($fmt[0], ['%f' => $path, '%l' => $line]);
        } else {
            try {
                $link = $fmt->format($path, $line);
            } catch (\Exception $e) {
                return \sprintf('<span class="block trace-file-path">in <span title="%s%3$s"><strong>%s</strong>%s</span></span>', $this->escapeHtml($path), $file, 0 < $line ? ' line ' . $line : '');
            }
        }
        return \sprintf('<span class="block trace-file-path">in <a href="%s" title="Go to source"><strong>%s</string>%s</a></span>', $this->escapeHtml($link), $file, 0 < $line ? ' line ' . $line : '');
    }
    /**
     * Formats an array as a string.
     *
     * @param array $args The argument array
     *
     * @return string
     */
    private function formatArgs(array $args)
    {
        $result = [];
        foreach ($args as $key => $item) {
            if ('object' === $item[0]) {
                $formattedValue = \sprintf('<em>object</em>(%s)', $this->formatClass($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>';
            } else {
                $formattedValue = \str_replace("\n", '', $this->escapeHtml(\var_export($item[1], \true)));
            }
            $result[] = \is_int($key) ? $formattedValue : \sprintf("'%s' => %s", $this->escapeHtml($key), $formattedValue);
        }
        return \implode(', ', $result);
    }
    /**
     * HTML-encodes a string.
     */
    private function escapeHtml($str)
    {
        return \htmlspecialchars($str, \ENT_COMPAT | \ENT_SUBSTITUTE, $this->charset);
    }
    private function getSymfonyGhostAsSvg()
    {
        return '<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.1A8.2 8.2 0 0 1 58 64a10.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-.5 8.2 8.2 0 0 1-2.7-3.8 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"/></svg>';
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Debug;

/**
 * Autoloader checking if the class is really defined in the file found.
 *
 * The ClassLoader will wrap all registered autoloaders
 * and will throw an exception if a file is found but does
 * not declare the class.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Christophe Coevoet <stof@notk.org>
 * @author Nicolas Grekas <p@tchwork.com>
 */
class DebugClassLoader
{
    private $classLoader;
    private $isFinder;
    private $loaded = [];
    private static $caseCheck;
    private static $checkedClasses = [];
    private static $final = [];
    private static $finalMethods = [];
    private static $deprecated = [];
    private static $internal = [];
    private static $internalMethods = [];
    private static $php7Reserved = ['int' => 1, 'float' => 1, 'bool' => 1, 'string' => 1, 'true' => 1, 'false' => 1, 'null' => 1];
    private static $darwinCache = ['/' => ['/', []]];
    public function __construct(callable $classLoader)
    {
        $this->classLoader = $classLoader;
        $this->isFinder = \is_array($classLoader) && \method_exists($classLoader[0], 'findFile');
        if (!isset(self::$caseCheck)) {
            $file = \file_exists(__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) {
                // filesystem is case sensitive
                self::$caseCheck = 0;
            } elseif (\substr($test, -\strlen($file)) === $file) {
                // filesystem is case insensitive and realpath() normalizes the case of characters
                self::$caseCheck = 1;
            } elseif (\false !== \stripos(\PHP_OS, 'darwin')) {
                // on MacOSX, HFS+ is case insensitive but realpath() doesn't normalize the case of characters
                self::$caseCheck = 2;
            } else {
                // filesystem case checks failed, fallback to disabling them
                self::$caseCheck = 0;
            }
        }
    }
    /**
     * Gets the wrapped class loader.
     *
     * @return callable The wrapped class loader
     */
    public function getClassLoader()
    {
        return $this->classLoader;
    }
    /**
     * Wraps all autoloaders.
     */
    public static function enable()
    {
        // Ensures we don't hit https://bugs.php.net/42098
        \class_exists('_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\ErrorHandler');
        \class_exists('_HumbugBoxb94336daae36\\Psr\\Log\\LogLevel');
        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);
        }
    }
    /**
     * Disables the wrapping.
     */
    public static function disable()
    {
        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);
        }
    }
    /**
     * @return string|null
     */
    public function findFile($class)
    {
        return $this->isFinder ? $this->classLoader[0]->findFile($class) ?: null : null;
    }
    /**
     * Loads the given class or interface.
     *
     * @param string $class The name of the class
     *
     * @throws \RuntimeException
     */
    public function loadClass($class)
    {
        $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) ?: \false)) {
                    // no-op
                } elseif (\function_exists('opcache_is_script_cached') && @\opcache_is_script_cached($file)) {
                    require $file;
                    return;
                } else {
                    require $file;
                }
            } else {
                \call_user_func($this->classLoader, $class);
                $file = \false;
            }
        } finally {
            \error_reporting($e);
        }
        $this->checkClass($class, $file);
    }
    private function checkClass($class, $file = null)
    {
        $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);
            if (isset(self::$php7Reserved[\strtolower($refl->getShortName())])) {
                $deprecations[] = \sprintf('The "%s" class uses the reserved name "%s", it will break on PHP 7 and higher', $name, $refl->getShortName());
            }
            foreach ($deprecations as $message) {
                @\trigger_error($message, \E_USER_DEPRECATED);
            }
        }
        if (!$file) {
            return;
        }
        if (!$exists) {
            if (\false !== \strpos($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, $class)
    {
        $deprecations = [];
        // Don't trigger deprecations for classes in the same vendor
        if (2 > ($len = 1 + (\strpos($class, '\\') ?: \strpos($class, '_')))) {
            $len = 0;
            $ns = '';
        } else {
            $ns = \str_replace('_', '\\', \substr($class, 0, $len));
        }
        // Detect annotations on the class
        if (\false !== ($doc = $refl->getDocComment())) {
            foreach (['final', 'deprecated', 'internal'] as $annotation) {
                if (\false !== \strpos($doc, $annotation) && \preg_match('#\\n\\s+\\* @' . $annotation . '(?:( .+?)\\.?)?\\r?\\n\\s+\\*(?: @|/$|\\r?\\n)#s', $doc, $notice)) {
                    self::${$annotation}[$class] = isset($notice[1]) ? \preg_replace('#\\.?\\r?\\n( \\*)? *(?= |\\r?\\n|$)#', '', $notice[1]) : '';
                }
            }
        }
        $parent = \get_parent_class($class);
        $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], $class);
            }
        }
        // Detect if the parent is annotated
        foreach ($parentAndOwnInterfaces + \class_uses($class, \false) as $use) {
            if (!isset(self::$checkedClasses[$use])) {
                $this->checkClass($use);
            }
            if (isset(self::$deprecated[$use]) && \strncmp($ns, \str_replace('_', '\\', $use), $len) && !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.', $class, $type, $verb, $use, self::$deprecated[$use]);
            }
            if (isset(self::$internal[$use]) && \strncmp($ns, \str_replace('_', '\\', $use), $len)) {
                $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], $class);
            }
        }
        if (\trait_exists($class)) {
            return $deprecations;
        }
        // Inherit @final and @internal annotations for methods
        self::$finalMethods[$class] = [];
        self::$internalMethods[$class] = [];
        foreach ($parentAndOwnInterfaces as $use) {
            foreach (['finalMethods', 'internalMethods'] as $property) {
                if (isset(self::${$property}[$use])) {
                    self::${$property}[$class] = self::${$property}[$class] ? self::${$property}[$use] + self::${$property}[$class] : self::${$property}[$use];
                }
            }
        }
        foreach ($refl->getMethods(\ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED) as $method) {
            if ($method->class !== $class) {
                continue;
            }
            if ($parent && isset(self::$finalMethods[$parent][$method->name])) {
                list($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, $class);
            }
            if (isset(self::$internalMethods[$class][$method->name])) {
                list($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, $class);
                }
            }
            // Detect method annotations
            if (\false === ($doc = $method->getDocComment())) {
                continue;
            }
            foreach (['final', 'internal'] as $annotation) {
                if (\false !== \strpos($doc, $annotation) && \preg_match('#\\n\\s+\\* @' . $annotation . '(?:( .+?)\\.?)?\\r?\\n\\s+\\*(?: @|/$|\\r?\\n)#s', $doc, $notice)) {
                    $message = isset($notice[1]) ? \preg_replace('#\\.?\\r?\\n( \\*)? *(?= |\\r?\\n|$)#', '', $notice[1]) : '';
                    self::${$annotation . 'Methods'}[$class][$method->name] = [$class, $message];
                }
            }
        }
        return $deprecations;
    }
    public function checkCase(\ReflectionClass $refl, $file, $class)
    {
        $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;
        }
        $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)];
        }
    }
    /**
     * `realpath` on MacOSX doesn't normalize the case of characters.
     */
    private function darwinRealpath($real)
    {
        $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();
                \chdir($real);
                $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]) && ') : eval()\'d code' === \substr($file, -17)) {
            // Get the file name from "file_name.php(123) : 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 = $k = $file;
                    } elseif ($f !== ($k = \strtolower($f))) {
                        $dirFiles[$k] = $f;
                    }
                }
            }
            self::$darwinCache[$kDir][1] = $dirFiles;
        }
        return $real .= $dirFiles[$kFile];
    }
    /**
     * `class_implements` includes interfaces from the parents so we have to manually exclude them.
     *
     * @param string       $class
     * @param string|false $parent
     *
     * @return string[]
     */
    private function getOwnInterfaces($class, $parent)
    {
        $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;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Debug;

use _HumbugBoxb94336daae36\Psr\Log\AbstractLogger;
/**
 * A buffering logger that stacks logs for later.
 *
 * @author Nicolas Grekas <p@tchwork.com>
 */
class BufferingLogger extends \_HumbugBoxb94336daae36\Psr\Log\AbstractLogger
{
    private $logs = [];
    public function log($level, $message, array $context = [])
    {
        $this->logs[] = [$level, $message, $context];
    }
    public function cleanLogs()
    {
        $logs = $this->logs;
        $this->logs = [];
        return $logs;
    }
}
<?xml version="1.0" encoding="UTF-8"?>

<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/5.2/phpunit.xsd"
         backupGlobals="false"
         colors="true"
         bootstrap="vendor/autoload.php"
         failOnRisky="true"
         failOnWarning="true"
>
    <php>
        <ini name="error_reporting" value="-1" />
    </php>

    <testsuites>
        <testsuite name="Symfony Debug Component Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
        <testsuite name="Symfony Debug Extension Test Suite">
            <directory suffix=".phpt">./Resources/ext/tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./Tests</directory>
                <directory>./vendor</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
<?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 _HumbugBoxb94336daae36\Symfony\Component\Debug;

use _HumbugBoxb94336daae36\Psr\Log\LoggerInterface;
use _HumbugBoxb94336daae36\Psr\Log\LogLevel;
use _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\ContextErrorException;
use _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalErrorException;
use _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalThrowableError;
use _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\OutOfMemoryException;
use _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\SilencedErrorContext;
use _HumbugBoxb94336daae36\Symfony\Component\Debug\FatalErrorHandler\ClassNotFoundFatalErrorHandler;
use _HumbugBoxb94336daae36\Symfony\Component\Debug\FatalErrorHandler\FatalErrorHandlerInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Debug\FatalErrorHandler\UndefinedFunctionFatalErrorHandler;
use _HumbugBoxb94336daae36\Symfony\Component\Debug\FatalErrorHandler\UndefinedMethodFatalErrorHandler;
/**
 * A generic ErrorHandler for the PHP engine.
 *
 * Provides five bit fields that control how errors are handled:
 * - thrownErrors: errors thrown as \ErrorException
 * - loggedErrors: logged errors, when not @-silenced
 * - scopedErrors: errors thrown or logged with their local context
 * - tracedErrors: errors logged with their stack trace
 * - screamedErrors: never @-silenced errors
 *
 * Each error level can be logged by a dedicated PSR-3 logger object.
 * Screaming only applies to logging.
 * Throwing takes precedence over logging.
 * Uncaught exceptions are logged as E_ERROR.
 * E_DEPRECATED and E_USER_DEPRECATED levels never throw.
 * E_RECOVERABLE_ERROR and E_USER_ERROR levels always throw.
 * Non catchable errors that can be detected at shutdown time are logged when the scream bit field allows so.
 * As errors have a performance cost, repeated errors are all logged, so that the developer
 * can see them and weight them as more important to fix than others of the same level.
 *
 * @author Nicolas Grekas <p@tchwork.com>
 * @author Grégoire Pineau <lyrixx@lyrixx.info>
 */
class ErrorHandler
{
    private $levels = [\E_DEPRECATED => 'Deprecated', \E_USER_DEPRECATED => 'User Deprecated', \E_NOTICE => 'Notice', \E_USER_NOTICE => 'User Notice', \E_STRICT => 'Runtime 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 $loggers = [\E_DEPRECATED => [null, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::INFO], \E_USER_DEPRECATED => [null, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::INFO], \E_NOTICE => [null, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::WARNING], \E_USER_NOTICE => [null, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::WARNING], \E_STRICT => [null, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::WARNING], \E_WARNING => [null, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::WARNING], \E_USER_WARNING => [null, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::WARNING], \E_COMPILE_WARNING => [null, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::WARNING], \E_CORE_WARNING => [null, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::WARNING], \E_USER_ERROR => [null, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::CRITICAL], \E_RECOVERABLE_ERROR => [null, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::CRITICAL], \E_COMPILE_ERROR => [null, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::CRITICAL], \E_PARSE => [null, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::CRITICAL], \E_ERROR => [null, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::CRITICAL], \E_CORE_ERROR => [null, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::CRITICAL]];
    private $thrownErrors = 0x1fff;
    // E_ALL - E_DEPRECATED - E_USER_DEPRECATED
    private $scopedErrors = 0x1fff;
    // E_ALL - E_DEPRECATED - E_USER_DEPRECATED
    private $tracedErrors = 0x77fb;
    // E_ALL - E_STRICT - E_PARSE
    private $screamedErrors = 0x55;
    // E_ERROR + E_CORE_ERROR + E_COMPILE_ERROR + E_PARSE
    private $loggedErrors = 0;
    private $traceReflector;
    private $isRecursive = 0;
    private $isRoot = \false;
    private $exceptionHandler;
    private $bootstrappingLogger;
    private static $reservedMemory;
    private static $stackedErrors = [];
    private static $stackedErrorLevels = [];
    private static $toStringException = null;
    private static $silencedErrorCache = [];
    private static $silencedErrorCount = 0;
    private static $exitCode = 0;
    /**
     * Registers the error handler.
     *
     * @param self|null $handler The handler to register
     * @param bool      $replace Whether to replace or not any existing handler
     *
     * @return self The registered error handler
     */
    public static function register(self $handler = null, $replace = \true)
    {
        if (null === self::$reservedMemory) {
            self::$reservedMemory = \str_repeat('x', 10240);
            \register_shutdown_function(__CLASS__ . '::handleFatalError');
        }
        if ($handlerIsNew = null === $handler) {
            $handler = new static();
        }
        if (null === ($prev = \set_error_handler([$handler, 'handleError']))) {
            \restore_error_handler();
            // Specifying the error types earlier would expose us to https://bugs.php.net/63206
            \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->throwAt(\E_ALL & $handler->thrownErrors, \true);
        return $handler;
    }
    public function __construct(\_HumbugBoxb94336daae36\Symfony\Component\Debug\BufferingLogger $bootstrappingLogger = null)
    {
        if ($bootstrappingLogger) {
            $this->bootstrappingLogger = $bootstrappingLogger;
            $this->setDefaultLogger($bootstrappingLogger);
        }
        $this->traceReflector = new \ReflectionProperty('Exception', 'trace');
        $this->traceReflector->setAccessible(\true);
    }
    /**
     * Sets a logger to non assigned errors levels.
     *
     * @param LoggerInterface $logger  A PSR-3 logger to put as default for the given levels
     * @param array|int       $levels  An array map of E_* to LogLevel::* or an integer bit field of E_* constants
     * @param bool            $replace Whether to replace or not any existing logger
     */
    public function setDefaultLogger(\_HumbugBoxb94336daae36\Psr\Log\LoggerInterface $logger, $levels = \E_ALL, $replace = \false)
    {
        $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 {
            if (null === $levels) {
                $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);
    }
    /**
     * Sets a logger for each error level.
     *
     * @param array $loggers Error levels to [LoggerInterface|null, LogLevel::*] map
     *
     * @return array The previous map
     *
     * @throws \InvalidArgumentException
     */
    public function setLoggers(array $loggers)
    {
        $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 \_HumbugBoxb94336daae36\Psr\Log\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 = $log[2]['exception'] instanceof \ErrorException ? $log[2]['exception']->getSeverity() : \E_ERROR;
                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;
    }
    /**
     * Sets a user exception handler.
     *
     * @param callable $handler A handler that will be called on Exception
     *
     * @return callable|null The previous exception handler
     */
    public function setExceptionHandler(callable $handler = null)
    {
        $prev = $this->exceptionHandler;
        $this->exceptionHandler = $handler;
        return $prev;
    }
    /**
     * Sets the PHP error levels that throw an exception when a PHP error occurs.
     *
     * @param int  $levels  A bit field of E_* constants for thrown errors
     * @param bool $replace Replace or amend the previous value
     *
     * @return int The previous value
     */
    public function throwAt($levels, $replace = \false)
    {
        $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;
    }
    /**
     * Sets the PHP error levels for which local variables are preserved.
     *
     * @param int  $levels  A bit field of E_* constants for scoped errors
     * @param bool $replace Replace or amend the previous value
     *
     * @return int The previous value
     */
    public function scopeAt($levels, $replace = \false)
    {
        $prev = $this->scopedErrors;
        $this->scopedErrors = (int) $levels;
        if (!$replace) {
            $this->scopedErrors |= $prev;
        }
        return $prev;
    }
    /**
     * Sets the PHP error levels for which the stack trace is preserved.
     *
     * @param int  $levels  A bit field of E_* constants for traced errors
     * @param bool $replace Replace or amend the previous value
     *
     * @return int The previous value
     */
    public function traceAt($levels, $replace = \false)
    {
        $prev = $this->tracedErrors;
        $this->tracedErrors = (int) $levels;
        if (!$replace) {
            $this->tracedErrors |= $prev;
        }
        return $prev;
    }
    /**
     * Sets the error levels where the @-operator is ignored.
     *
     * @param int  $levels  A bit field of E_* constants for screamed errors
     * @param bool $replace Replace or amend the previous value
     *
     * @return int The previous value
     */
    public function screamAt($levels, $replace = \false)
    {
        $prev = $this->screamedErrors;
        $this->screamedErrors = (int) $levels;
        if (!$replace) {
            $this->screamedErrors |= $prev;
        }
        return $prev;
    }
    /**
     * Re-registers as a PHP error handler if levels changed.
     */
    private function reRegister($prev)
    {
        if ($prev !== $this->thrownErrors | $this->loggedErrors) {
            $handler = \set_error_handler('var_dump');
            $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']);
                }
            }
        }
    }
    /**
     * Handles errors by filtering then logging them according to the configured bit fields.
     *
     * @param int    $type    One of the E_* constants
     * @param string $message
     * @param string $file
     * @param int    $line
     *
     * @return bool Returns false when no handling happens so that the PHP engine can handle the error itself
     *
     * @throws \ErrorException When $this->thrownErrors requests so
     *
     * @internal
     */
    public function handleError($type, $message, $file, $line)
    {
        // Level is the current error reporting level to manage silent error.
        $level = \error_reporting();
        $silenced = 0 === ($level & $type);
        // Strong errors are not authorized to be silenced.
        $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 (!$type || !$log && !$throw) {
            return !$silenced && $type && $log;
        }
        $scope = $this->scopedErrors & $type;
        if (4 < ($numArgs = \func_num_args())) {
            $context = $scope ? \func_get_arg(4) ?: [] : [];
            $backtrace = 5 < $numArgs ? \func_get_arg(5) : null;
            // defined on HHVM
        } else {
            $context = [];
            $backtrace = null;
        }
        if (isset($context['GLOBALS']) && $scope) {
            $e = $context;
            // Whatever the signature of the method,
            unset($e['GLOBALS'], $context);
            // $context is always a reference in 5.3
            $context = $e;
        }
        if (null !== $backtrace && $type & \E_ERROR) {
            // E_ERROR fatal errors are triggered on HHVM when
            // hhvm.error_handling.call_user_handler_on_fatals=1
            // which is the way to get their backtrace.
            $this->handleFatalError(\compact('type', 'message', 'file', 'line', 'backtrace'));
            return \true;
        }
        $logMessage = $this->levels[$type] . ': ' . $message;
        if (null !== self::$toStringException) {
            $errorAsException = self::$toStringException;
            self::$toStringException = null;
        } elseif (!$throw && !($type & $level)) {
            if (!isset(self::$silencedErrorCache[$id = $file . ':' . $line])) {
                $lightTrace = $this->tracedErrors & $type ? $this->cleanTrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 3), $type, $file, $line, \false) : [];
                $errorAsException = new \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\SilencedErrorContext($type, $file, $line, $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;
            }
        } else {
            if ($scope) {
                $errorAsException = new \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\ContextErrorException($logMessage, 0, $type, $file, $line, $context);
            } else {
                $errorAsException = new \ErrorException($logMessage, 0, $type, $file, $line);
            }
            // Clean the trace by removing function arguments and the first frames added by the error handler itself.
            if ($throw || $this->tracedErrors & $type) {
                $backtrace = $backtrace ?: $errorAsException->getTrace();
                $lightTrace = $this->cleanTrace($backtrace, $type, $file, $line, $throw);
                $this->traceReflector->setValue($errorAsException, $lightTrace);
            } else {
                $this->traceReflector->setValue($errorAsException, []);
            }
        }
        if ($throw) {
            if (\E_USER_ERROR & $type) {
                for ($i = 1; isset($backtrace[$i]); ++$i) {
                    if (isset($backtrace[$i]['function'], $backtrace[$i]['type'], $backtrace[$i - 1]['function']) && '__toString' === $backtrace[$i]['function'] && '->' === $backtrace[$i]['type'] && !isset($backtrace[$i - 1]['class']) && ('trigger_error' === $backtrace[$i - 1]['function'] || 'user_error' === $backtrace[$i - 1]['function'])) {
                        // Here, we know trigger_error() has been called from __toString().
                        // HHVM is fine with throwing from __toString() but PHP triggers a fatal error instead.
                        // A small convention allows working around the limitation:
                        // given a caught $e exception in __toString(), quitting the method with
                        // `return trigger_error($e, E_USER_ERROR);` allows this error handler
                        // to make $e get through the __toString() barrier.
                        foreach ($context as $e) {
                            if (($e instanceof \Exception || $e instanceof \Throwable) && $e->__toString() === $message) {
                                if (1 === $i) {
                                    // On HHVM
                                    $errorAsException = $e;
                                    break;
                                }
                                self::$toStringException = $e;
                                return \true;
                            }
                        }
                        if (1 < $i) {
                            // On PHP (not on HHVM), display the original error message instead of the default one.
                            $this->handleException($errorAsException);
                            // Stop the process by giving back the error to the native handler.
                            return \false;
                        }
                    }
                }
            }
            throw $errorAsException;
        }
        if ($this->isRecursive) {
            $log = 0;
        } elseif (self::$stackedErrorLevels) {
            self::$stackedErrors[] = [$this->loggers[$type][0], $type & $level ? $this->loggers[$type][1] : \_HumbugBoxb94336daae36\Psr\Log\LogLevel::DEBUG, $logMessage, $errorAsException ? ['exception' => $errorAsException] : []];
        } else {
            if (!\defined('HHVM_VERSION')) {
                $currentErrorHandler = \set_error_handler('var_dump');
                \restore_error_handler();
            }
            try {
                $this->isRecursive = \true;
                $level = $type & $level ? $this->loggers[$type][1] : \_HumbugBoxb94336daae36\Psr\Log\LogLevel::DEBUG;
                $this->loggers[$type][0]->log($level, $logMessage, $errorAsException ? ['exception' => $errorAsException] : []);
            } finally {
                $this->isRecursive = \false;
                if (!\defined('HHVM_VERSION')) {
                    \set_error_handler($currentErrorHandler);
                }
            }
        }
        return !$silenced && $type && $log;
    }
    /**
     * Handles an exception by logging then forwarding it to another handler.
     *
     * @param \Exception|\Throwable $exception An exception to handle
     * @param array                 $error     An array as returned by error_get_last()
     *
     * @internal
     */
    public function handleException($exception, array $error = null)
    {
        if (null === $error) {
            self::$exitCode = 255;
        }
        if (!$exception instanceof \Exception) {
            $exception = new \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalThrowableError($exception);
        }
        $type = $exception instanceof \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalErrorException ? $exception->getSeverity() : \E_ERROR;
        $handlerException = null;
        if ($this->loggedErrors & $type || $exception instanceof \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalThrowableError) {
            if ($exception instanceof \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalErrorException) {
                if ($exception instanceof \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalThrowableError) {
                    $error = ['type' => $type, 'message' => $message = $exception->getMessage(), 'file' => $exception->getFile(), 'line' => $exception->getLine()];
                } else {
                    $message = 'Fatal ' . $exception->getMessage();
                }
            } elseif ($exception instanceof \ErrorException) {
                $message = 'Uncaught ' . $exception->getMessage();
            } else {
                $message = 'Uncaught Exception: ' . $exception->getMessage();
            }
        }
        if ($this->loggedErrors & $type) {
            try {
                $this->loggers[$type][0]->log($this->loggers[$type][1], $message, ['exception' => $exception]);
            } catch (\Exception $handlerException) {
            } catch (\Throwable $handlerException) {
            }
        }
        if ($exception instanceof \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalErrorException && !$exception instanceof \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\OutOfMemoryException && $error) {
            foreach ($this->getFatalErrorHandlers() as $handler) {
                if ($e = $handler->handleError($error, $exception)) {
                    $exception = $e;
                    break;
                }
            }
        }
        $exceptionHandler = $this->exceptionHandler;
        $this->exceptionHandler = null;
        try {
            if (null !== $exceptionHandler) {
                return \call_user_func($exceptionHandler, $exception);
            }
            $handlerException = $handlerException ?: $exception;
        } catch (\Exception $handlerException) {
        } catch (\Throwable $handlerException) {
        }
        if ($exception === $handlerException) {
            self::$reservedMemory = null;
            // Disable the fatal error handler
            throw $exception;
            // Give back $exception to the native handler
        }
        $this->handleException($handlerException);
    }
    /**
     * Shutdown registered function for handling PHP fatal errors.
     *
     * @param array $error An array as returned by error_get_last()
     *
     * @internal
     */
    public static function handleFatalError(array $error = null)
    {
        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('var_dump');
            \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) {
            return;
        }
        if ($handler !== $h) {
            $handler[0]->setExceptionHandler($h);
        }
        $handler = $handler[0];
        $handlers = [];
        if ($exit = null === $error) {
            $error = \error_get_last();
        }
        try {
            while (self::$stackedErrorLevels) {
                static::unstackErrors();
            }
        } catch (\Exception $exception) {
            // Handled below
        } catch (\Throwable $exception) {
            // Handled below
        }
        if ($error && ($error['type'] &= \E_PARSE | \E_ERROR | \E_CORE_ERROR | \E_COMPILE_ERROR)) {
            // Let's not throw anymore but keep logging
            $handler->throwAt(0, \true);
            $trace = isset($error['backtrace']) ? $error['backtrace'] : null;
            if (0 === \strpos($error['message'], 'Allowed memory') || 0 === \strpos($error['message'], 'Out of memory')) {
                $exception = new \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\OutOfMemoryException($handler->levels[$error['type']] . ': ' . $error['message'], 0, $error['type'], $error['file'], $error['line'], 2, \false, $trace);
            } else {
                $exception = new \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalErrorException($handler->levels[$error['type']] . ': ' . $error['message'], 0, $error['type'], $error['file'], $error['line'], 2, \true, $trace);
            }
        }
        try {
            if (isset($exception)) {
                self::$exitCode = 255;
                $handler->handleException($exception, $error);
            }
        } catch (\_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalErrorException $e) {
            // Ignore this re-throw
        }
        if ($exit && self::$exitCode) {
            $exitCode = self::$exitCode;
            \register_shutdown_function('register_shutdown_function', function () use($exitCode) {
                exit($exitCode);
            });
        }
    }
    /**
     * Configures the error handler for delayed handling.
     * Ensures also that non-catchable fatal errors are never silenced.
     *
     * As shown by http://bugs.php.net/42098 and http://bugs.php.net/60724
     * PHP has a compile stage where it behaves unusually. To workaround it,
     * we plug an error handler that only stacks errors for later.
     *
     * The most important feature of this is to prevent
     * autoloading until unstackErrors() is called.
     *
     * @deprecated since version 3.4, to be removed in 4.0.
     */
    public static function stackErrors()
    {
        @\trigger_error('Support for stacking errors is deprecated since Symfony 3.4 and will be removed in 4.0.', \E_USER_DEPRECATED);
        self::$stackedErrorLevels[] = \error_reporting(\error_reporting() | \E_PARSE | \E_ERROR | \E_CORE_ERROR | \E_COMPILE_ERROR);
    }
    /**
     * Unstacks stacked errors and forwards to the logger.
     *
     * @deprecated since version 3.4, to be removed in 4.0.
     */
    public static function unstackErrors()
    {
        @\trigger_error('Support for unstacking errors is deprecated since Symfony 3.4 and will be removed in 4.0.', \E_USER_DEPRECATED);
        $level = \array_pop(self::$stackedErrorLevels);
        if (null !== $level) {
            $errorReportingLevel = \error_reporting($level);
            if ($errorReportingLevel !== ($level | \E_PARSE | \E_ERROR | \E_CORE_ERROR | \E_COMPILE_ERROR)) {
                // If the user changed the error level, do not overwrite it
                \error_reporting($errorReportingLevel);
            }
        }
        if (empty(self::$stackedErrorLevels)) {
            $errors = self::$stackedErrors;
            self::$stackedErrors = [];
            foreach ($errors as $error) {
                $error[0]->log($error[1], $error[2], $error[3]);
            }
        }
    }
    /**
     * Gets the fatal error handlers.
     *
     * Override this method if you want to define more fatal error handlers.
     *
     * @return FatalErrorHandlerInterface[] An array of FatalErrorHandlerInterface
     */
    protected function getFatalErrorHandlers()
    {
        return [new \_HumbugBoxb94336daae36\Symfony\Component\Debug\FatalErrorHandler\UndefinedFunctionFatalErrorHandler(), new \_HumbugBoxb94336daae36\Symfony\Component\Debug\FatalErrorHandler\UndefinedMethodFatalErrorHandler(), new \_HumbugBoxb94336daae36\Symfony\Component\Debug\FatalErrorHandler\ClassNotFoundFatalErrorHandler()];
    }
    private function cleanTrace($backtrace, $type, $file, $line, $throw)
    {
        $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 (!($throw || $this->scopedErrors & $type)) {
            for ($i = 0; isset($lightTrace[$i]); ++$i) {
                unset($lightTrace[$i]['args'], $lightTrace[$i]['object']);
            }
        }
        return $lightTrace;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception;

/**
 * Fatal Throwable Error.
 *
 * @author Nicolas Grekas <p@tchwork.com>
 */
class FatalThrowableError extends \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalErrorException
{
    public function __construct(\Throwable $e)
    {
        if ($e instanceof \ParseError) {
            $message = 'Parse error: ' . $e->getMessage();
            $severity = \E_PARSE;
        } elseif ($e instanceof \TypeError) {
            $message = 'Type error: ' . $e->getMessage();
            $severity = \E_RECOVERABLE_ERROR;
        } else {
            $message = $e->getMessage();
            $severity = \E_ERROR;
        }
        \ErrorException::__construct($message, $e->getCode(), $severity, $e->getFile(), $e->getLine(), $e->getPrevious());
        $this->setTrace($e->getTrace());
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception;

/**
 * Out of memory exception.
 *
 * @author Nicolas Grekas <p@tchwork.com>
 */
class OutOfMemoryException extends \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalErrorException
{
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception;

use _HumbugBoxb94336daae36\Symfony\Component\HttpFoundation\Exception\RequestExceptionInterface;
use _HumbugBoxb94336daae36\Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
/**
 * FlattenException wraps a PHP Exception to be able to serialize it.
 *
 * Basically, this class removes all objects from the trace.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class FlattenException
{
    private $message;
    private $code;
    private $previous;
    private $trace;
    private $class;
    private $statusCode;
    private $headers;
    private $file;
    private $line;
    public static function create(\Exception $exception, $statusCode = null, array $headers = [])
    {
        $e = new static();
        $e->setMessage($exception->getMessage());
        $e->setCode($exception->getCode());
        if ($exception instanceof \_HumbugBoxb94336daae36\Symfony\Component\HttpKernel\Exception\HttpExceptionInterface) {
            $statusCode = $exception->getStatusCode();
            $headers = \array_merge($headers, $exception->getHeaders());
        } elseif ($exception instanceof \_HumbugBoxb94336daae36\Symfony\Component\HttpFoundation\Exception\RequestExceptionInterface) {
            $statusCode = 400;
        }
        if (null === $statusCode) {
            $statusCode = 500;
        }
        $e->setStatusCode($statusCode);
        $e->setHeaders($headers);
        $e->setTraceFromException($exception);
        $e->setClass(\get_class($exception));
        $e->setFile($exception->getFile());
        $e->setLine($exception->getLine());
        $previous = $exception->getPrevious();
        if ($previous instanceof \Exception) {
            $e->setPrevious(static::create($previous));
        } elseif ($previous instanceof \Throwable) {
            $e->setPrevious(static::create(new \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalThrowableError($previous)));
        }
        return $e;
    }
    public function toArray()
    {
        $exceptions = [];
        foreach (\array_merge([$this], $this->getAllPrevious()) as $exception) {
            $exceptions[] = ['message' => $exception->getMessage(), 'class' => $exception->getClass(), 'trace' => $exception->getTrace()];
        }
        return $exceptions;
    }
    public function getStatusCode()
    {
        return $this->statusCode;
    }
    public function setStatusCode($code)
    {
        $this->statusCode = $code;
    }
    public function getHeaders()
    {
        return $this->headers;
    }
    public function setHeaders(array $headers)
    {
        $this->headers = $headers;
    }
    public function getClass()
    {
        return $this->class;
    }
    public function setClass($class)
    {
        $this->class = $class;
    }
    public function getFile()
    {
        return $this->file;
    }
    public function setFile($file)
    {
        $this->file = $file;
    }
    public function getLine()
    {
        return $this->line;
    }
    public function setLine($line)
    {
        $this->line = $line;
    }
    public function getMessage()
    {
        return $this->message;
    }
    public function setMessage($message)
    {
        $this->message = $message;
    }
    public function getCode()
    {
        return $this->code;
    }
    public function setCode($code)
    {
        $this->code = $code;
    }
    public function getPrevious()
    {
        return $this->previous;
    }
    public function setPrevious(self $previous)
    {
        $this->previous = $previous;
    }
    public function getAllPrevious()
    {
        $exceptions = [];
        $e = $this;
        while ($e = $e->getPrevious()) {
            $exceptions[] = $e;
        }
        return $exceptions;
    }
    public function getTrace()
    {
        return $this->trace;
    }
    public function setTraceFromException(\Exception $exception)
    {
        $this->setTrace($exception->getTrace(), $exception->getFile(), $exception->getLine());
    }
    public function setTrace($trace, $file, $line)
    {
        $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' => isset($entry['class']) ? $entry['class'] : '', 'type' => isset($entry['type']) ? $entry['type'] : '', 'function' => isset($entry['function']) ? $entry['function'] : null, 'file' => isset($entry['file']) ? $entry['file'] : null, 'line' => isset($entry['line']) ? $entry['line'] : null, 'args' => isset($entry['args']) ? $this->flattenArgs($entry['args']) : []];
        }
    }
    private function flattenArgs($args, $level = 0, &$count = 0)
    {
        $result = [];
        foreach ($args as $key => $value) {
            if (++$count > 10000.0) {
                return ['array', '*SKIPPED over 10000 entries*'];
            }
            if ($value instanceof \__PHP_Incomplete_Class) {
                // is_object() returns false on PHP<=7.1
                $result[$key] = ['incomplete-object', $this->getClassNameFromIncomplete($value)];
            } elseif (\is_object($value)) {
                $result[$key] = ['object', \get_class($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)
    {
        $array = new \ArrayObject($value);
        return $array['__PHP_Incomplete_Class_Name'];
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception;

/**
 * Undefined Method Exception.
 *
 * @author Grégoire Pineau <lyrixx@lyrixx.info>
 */
class UndefinedMethodException extends \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalErrorException
{
    public function __construct($message, \ErrorException $previous)
    {
        parent::__construct($message, $previous->getCode(), $previous->getSeverity(), $previous->getFile(), $previous->getLine(), null, \true, null, $previous->getPrevious());
        $this->setTrace($previous->getTrace());
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception;

/**
 * Undefined Function Exception.
 *
 * @author Konstanton Myakshin <koc-dp@yandex.ru>
 */
class UndefinedFunctionException extends \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalErrorException
{
    public function __construct($message, \ErrorException $previous)
    {
        parent::__construct($message, $previous->getCode(), $previous->getSeverity(), $previous->getFile(), $previous->getLine(), null, \true, null, $previous->getPrevious());
        $this->setTrace($previous->getTrace());
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception;

/**
 * Fatal Error Exception.
 *
 * @author Konstanton Myakshin <koc-dp@yandex.ru>
 */
class FatalErrorException extends \ErrorException
{
    public function __construct($message, $code, $severity, $filename, $lineno, $traceOffset = null, $traceArgs = \true, array $trace = null, $previous = null)
    {
        parent::__construct($message, $code, $severity, $filename, $lineno, $previous);
        if (null !== $trace) {
            if (!$traceArgs) {
                foreach ($trace as &$frame) {
                    unset($frame['args'], $frame['this'], $frame);
                }
            }
            $this->setTrace($trace);
        } elseif (null !== $traceOffset) {
            if (\function_exists('_HumbugBoxb94336daae36\\xdebug_get_function_stack')) {
                $trace = xdebug_get_function_stack();
                if (0 < $traceOffset) {
                    \array_splice($trace, -$traceOffset);
                }
                foreach ($trace as &$frame) {
                    if (!isset($frame['type'])) {
                        // XDebug pre 2.1.1 doesn't currently set the call type key http://bugs.xdebug.org/view.php?id=695
                        if (isset($frame['class'])) {
                            $frame['type'] = '::';
                        }
                    } elseif ('dynamic' === $frame['type']) {
                        $frame['type'] = '->';
                    } elseif ('static' === $frame['type']) {
                        $frame['type'] = '::';
                    }
                    // XDebug also has a different name for the parameters array
                    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);
            } elseif (\function_exists('_HumbugBoxb94336daae36\\symfony_debug_backtrace')) {
                $trace = symfony_debug_backtrace();
                if (0 < $traceOffset) {
                    \array_splice($trace, 0, $traceOffset);
                }
            } else {
                $trace = [];
            }
            $this->setTrace($trace);
        }
    }
    protected function setTrace($trace)
    {
        $traceReflector = new \ReflectionProperty('Exception', 'trace');
        $traceReflector->setAccessible(\true);
        $traceReflector->setValue($this, $trace);
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception;

/**
 * Data Object that represents a Silenced Error.
 *
 * @author Grégoire Pineau <lyrixx@lyrixx.info>
 */
class SilencedErrorContext implements \JsonSerializable
{
    public $count = 1;
    private $severity;
    private $file;
    private $line;
    private $trace;
    public function __construct($severity, $file, $line, array $trace = [], $count = 1)
    {
        $this->severity = $severity;
        $this->file = $file;
        $this->line = $line;
        $this->trace = $trace;
        $this->count = $count;
    }
    public function getSeverity()
    {
        return $this->severity;
    }
    public function getFile()
    {
        return $this->file;
    }
    public function getLine()
    {
        return $this->line;
    }
    public function getTrace()
    {
        return $this->trace;
    }
    public function JsonSerialize()
    {
        return ['severity' => $this->severity, 'file' => $this->file, 'line' => $this->line, 'trace' => $this->trace, 'count' => $this->count];
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception;

/**
 * Class (or Trait or Interface) Not Found Exception.
 *
 * @author Konstanton Myakshin <koc-dp@yandex.ru>
 */
class ClassNotFoundException extends \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalErrorException
{
    public function __construct($message, \ErrorException $previous)
    {
        parent::__construct($message, $previous->getCode(), $previous->getSeverity(), $previous->getFile(), $previous->getLine(), null, \true, null, $previous->getPrevious());
        $this->setTrace($previous->getTrace());
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception;

/**
 * Error Exception with Variable Context.
 *
 * @author Christian Sciberras <uuf6429@gmail.com>
 *
 * @deprecated since version 3.3. Instead, \ErrorException will be used directly in 4.0.
 */
class ContextErrorException extends \ErrorException
{
    private $context = [];
    public function __construct($message, $code, $severity, $filename, $lineno, $context = [])
    {
        parent::__construct($message, $code, $severity, $filename, $lineno);
        $this->context = $context;
    }
    /**
     * @return array Array of variables that existed when the exception occurred
     */
    public function getContext()
    {
        @\trigger_error(\sprintf('The %s class is deprecated since Symfony 3.3 and will be removed in 4.0.', __CLASS__), \E_USER_DEPRECATED);
        return $this->context;
    }
}
{
    "name": "symfony\/debug",
    "type": "library",
    "description": "Symfony Debug Component",
    "keywords": [],
    "homepage": "https:\/\/symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "https:\/\/symfony.com\/contributors"
        }
    ],
    "require": {
        "php": "^5.5.9|>=7.0.8",
        "psr\/log": "~1.0"
    },
    "conflict": {
        "symfony\/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
    },
    "require-dev": {
        "symfony\/http-kernel": "~2.8|~3.0|~4.0"
    },
    "autoload": {
        "psr-4": {
            "_HumbugBoxb94336daae36\\Symfony\\Component\\Debug\\": ""
        },
        "exclude-from-classmap": [
            "\/Tests\/"
        ]
    },
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "3.4-dev"
        }
    }
}<?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 _HumbugBoxb94336daae36\Symfony\Component\Console;

/**
 * Contains all events dispatched by an Application.
 *
 * @author Francesco Levorato <git@flevour.net>
 */
final class ConsoleEvents
{
    /**
     * The COMMAND event allows you to attach listeners before any command is
     * executed by the console. It also allows you to modify the command, input and output
     * before they are handled to the command.
     *
     * @Event("Symfony\Component\Console\Event\ConsoleCommandEvent")
     */
    const COMMAND = 'console.command';
    /**
     * The TERMINATE event allows you to attach listeners after a command is
     * executed by the console.
     *
     * @Event("Symfony\Component\Console\Event\ConsoleTerminateEvent")
     */
    const TERMINATE = 'console.terminate';
    /**
     * The EXCEPTION event occurs when an uncaught exception appears
     * while executing Command#run().
     *
     * This event allows you to deal with the exception or
     * to modify the thrown exception.
     *
     * @Event("Symfony\Component\Console\Event\ConsoleExceptionEvent")
     *
     * @deprecated The console.exception event is deprecated since version 3.3 and will be removed in 4.0. Use the console.error event instead.
     */
    const EXCEPTION = 'console.exception';
    /**
     * The ERROR event occurs when an uncaught exception or error appears.
     *
     * This event allows you to deal with the exception/error or
     * to modify the thrown exception.
     *
     * @Event("Symfony\Component\Console\Event\ConsoleErrorEvent")
     */
    const ERROR = 'console.error';
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Command\HelpCommand;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Command\ListCommand;
use _HumbugBoxb94336daae36\Symfony\Component\Console\CommandLoader\CommandLoaderInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Event\ConsoleCommandEvent;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Event\ConsoleErrorEvent;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Event\ConsoleExceptionEvent;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Event\ConsoleTerminateEvent;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\CommandNotFoundException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\ExceptionInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatter;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Helper\DebugFormatterHelper;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Helper\FormatterHelper;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Helper\HelperSet;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Helper\ProcessHelper;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Helper\QuestionHelper;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\ArgvInput;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\ArrayInput;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputAwareInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\StreamableInputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\ConsoleOutput;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\ConsoleOutputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Debug\ErrorHandler;
use _HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalThrowableError;
use _HumbugBoxb94336daae36\Symfony\Component\EventDispatcher\EventDispatcherInterface;
/**
 * An Application is the container for a collection of commands.
 *
 * It is the main entry point of a Console application.
 *
 * This class is optimized for a standard CLI environment.
 *
 * Usage:
 *
 *     $app = new Application('myapp', '1.0 (stable)');
 *     $app->add(new SimpleCommand());
 *     $app->run();
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Application
{
    private $commands = [];
    private $wantHelps = \false;
    private $runningCommand;
    private $name;
    private $version;
    private $commandLoader;
    private $catchExceptions = \true;
    private $autoExit = \true;
    private $definition;
    private $helperSet;
    private $dispatcher;
    private $terminal;
    private $defaultCommand;
    private $singleCommand = \false;
    private $initialized;
    /**
     * @param string $name    The name of the application
     * @param string $version The version of the application
     */
    public function __construct($name = 'UNKNOWN', $version = 'UNKNOWN')
    {
        $this->name = $name;
        $this->version = $version;
        $this->terminal = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Terminal();
        $this->defaultCommand = 'list';
    }
    public function setDispatcher(\_HumbugBoxb94336daae36\Symfony\Component\EventDispatcher\EventDispatcherInterface $dispatcher)
    {
        $this->dispatcher = $dispatcher;
    }
    public function setCommandLoader(\_HumbugBoxb94336daae36\Symfony\Component\Console\CommandLoader\CommandLoaderInterface $commandLoader)
    {
        $this->commandLoader = $commandLoader;
    }
    /**
     * Runs the current application.
     *
     * @return int 0 if everything went fine, or an error code
     *
     * @throws \Exception When running fails. Bypass this when {@link setCatchExceptions()}.
     */
    public function run(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input = null, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output = null)
    {
        \putenv('LINES=' . $this->terminal->getHeight());
        \putenv('COLUMNS=' . $this->terminal->getWidth());
        if (null === $input) {
            $input = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\ArgvInput();
        }
        if (null === $output) {
            $output = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\ConsoleOutput();
        }
        $renderException = function ($e) use($output) {
            if (!$e instanceof \Exception) {
                $e = \class_exists(\_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalThrowableError::class) ? new \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalThrowableError($e) : new \ErrorException($e->getMessage(), $e->getCode(), \E_ERROR, $e->getFile(), $e->getLine());
            }
            if ($output instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\ConsoleOutputInterface) {
                $this->renderException($e, $output->getErrorOutput());
            } else {
                $this->renderException($e, $output);
            }
        };
        if ($phpHandler = \set_exception_handler($renderException)) {
            \restore_exception_handler();
            if (!\is_array($phpHandler) || !$phpHandler[0] instanceof \_HumbugBoxb94336daae36\Symfony\Component\Debug\ErrorHandler) {
                $debugHandler = \true;
            } elseif ($debugHandler = $phpHandler[0]->setExceptionHandler($renderException)) {
                $phpHandler[0]->setExceptionHandler($debugHandler);
            }
        }
        if (null !== $this->dispatcher && $this->dispatcher->hasListeners(\_HumbugBoxb94336daae36\Symfony\Component\Console\ConsoleEvents::EXCEPTION)) {
            @\trigger_error(\sprintf('The "ConsoleEvents::EXCEPTION" event is deprecated since Symfony 3.3 and will be removed in 4.0. Listen to the "ConsoleEvents::ERROR" event instead.'), \E_USER_DEPRECATED);
        }
        $this->configureIO($input, $output);
        try {
            $exitCode = $this->doRun($input, $output);
        } catch (\Exception $e) {
            if (!$this->catchExceptions) {
                throw $e;
            }
            $renderException($e);
            $exitCode = $e->getCode();
            if (\is_numeric($exitCode)) {
                $exitCode = (int) $exitCode;
                if (0 === $exitCode) {
                    $exitCode = 1;
                }
            } else {
                $exitCode = 1;
            }
        } finally {
            // if the exception handler changed, keep it
            // otherwise, unregister $renderException
            if (!$phpHandler) {
                if (\set_exception_handler($renderException) === $renderException) {
                    \restore_exception_handler();
                }
                \restore_exception_handler();
            } elseif (!$debugHandler) {
                $finalHandler = $phpHandler[0]->setExceptionHandler(null);
                if ($finalHandler !== $renderException) {
                    $phpHandler[0]->setExceptionHandler($finalHandler);
                }
            }
        }
        if ($this->autoExit) {
            if ($exitCode > 255) {
                $exitCode = 255;
            }
            exit($exitCode);
        }
        return $exitCode;
    }
    /**
     * Runs the current application.
     *
     * @return int 0 if everything went fine, or an error code
     */
    public function doRun(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output)
    {
        if (\true === $input->hasParameterOption(['--version', '-V'], \true)) {
            $output->writeln($this->getLongVersion());
            return 0;
        }
        try {
            // Makes ArgvInput::getFirstArgument() able to distinguish an option from an argument.
            $input->bind($this->getDefinition());
        } catch (\_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\ExceptionInterface $e) {
            // Errors must be ignored, full binding/validation happens later when the command is known.
        }
        $name = $this->getCommandName($input);
        if (\true === $input->hasParameterOption(['--help', '-h'], \true)) {
            if (!$name) {
                $name = 'help';
                $input = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\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 \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument('command', \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument::OPTIONAL, $definition->getArgument('command')->getDescription(), $name)]));
        }
        try {
            $e = $this->runningCommand = null;
            // the command name MUST be the first element of the input
            $command = $this->find($name);
        } catch (\Exception $e) {
        } catch (\Throwable $e) {
        }
        if (null !== $e) {
            if (null !== $this->dispatcher) {
                $event = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Event\ConsoleErrorEvent($input, $output, $e);
                $this->dispatcher->dispatch(\_HumbugBoxb94336daae36\Symfony\Component\Console\ConsoleEvents::ERROR, $event);
                $e = $event->getError();
                if (0 === $event->getExitCode()) {
                    return 0;
                }
            }
            throw $e;
        }
        $this->runningCommand = $command;
        $exitCode = $this->doRunCommand($command, $input, $output);
        $this->runningCommand = null;
        return $exitCode;
    }
    public function setHelperSet(\_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\HelperSet $helperSet)
    {
        $this->helperSet = $helperSet;
    }
    /**
     * Get the helper set associated with the command.
     *
     * @return HelperSet The HelperSet instance associated with this command
     */
    public function getHelperSet()
    {
        if (!$this->helperSet) {
            $this->helperSet = $this->getDefaultHelperSet();
        }
        return $this->helperSet;
    }
    public function setDefinition(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition $definition)
    {
        $this->definition = $definition;
    }
    /**
     * Gets the InputDefinition related to this Application.
     *
     * @return InputDefinition The InputDefinition instance
     */
    public function getDefinition()
    {
        if (!$this->definition) {
            $this->definition = $this->getDefaultInputDefinition();
        }
        if ($this->singleCommand) {
            $inputDefinition = $this->definition;
            $inputDefinition->setArguments();
            return $inputDefinition;
        }
        return $this->definition;
    }
    /**
     * Gets the help message.
     *
     * @return string A help message
     */
    public function getHelp()
    {
        return $this->getLongVersion();
    }
    /**
     * Gets whether to catch exceptions or not during commands execution.
     *
     * @return bool Whether to catch exceptions or not during commands execution
     */
    public function areExceptionsCaught()
    {
        return $this->catchExceptions;
    }
    /**
     * Sets whether to catch exceptions or not during commands execution.
     *
     * @param bool $boolean Whether to catch exceptions or not during commands execution
     */
    public function setCatchExceptions($boolean)
    {
        $this->catchExceptions = (bool) $boolean;
    }
    /**
     * Gets whether to automatically exit after a command execution or not.
     *
     * @return bool Whether to automatically exit after a command execution or not
     */
    public function isAutoExitEnabled()
    {
        return $this->autoExit;
    }
    /**
     * Sets whether to automatically exit after a command execution or not.
     *
     * @param bool $boolean Whether to automatically exit after a command execution or not
     */
    public function setAutoExit($boolean)
    {
        $this->autoExit = (bool) $boolean;
    }
    /**
     * Gets the name of the application.
     *
     * @return string The application name
     */
    public function getName()
    {
        return $this->name;
    }
    /**
     * Sets the application name.
     *
     * @param string $name The application name
     */
    public function setName($name)
    {
        $this->name = $name;
    }
    /**
     * Gets the application version.
     *
     * @return string The application version
     */
    public function getVersion()
    {
        return $this->version;
    }
    /**
     * Sets the application version.
     *
     * @param string $version The application version
     */
    public function setVersion($version)
    {
        $this->version = $version;
    }
    /**
     * Returns the long version of the application.
     *
     * @return string The long application 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';
    }
    /**
     * Registers a new command.
     *
     * @param string $name The command name
     *
     * @return Command The newly created command
     */
    public function register($name)
    {
        return $this->add(new \_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command($name));
    }
    /**
     * Adds an array of command objects.
     *
     * If a Command is not enabled it will not be added.
     *
     * @param Command[] $commands An array of commands
     */
    public function addCommands(array $commands)
    {
        foreach ($commands as $command) {
            $this->add($command);
        }
    }
    /**
     * Adds a command object.
     *
     * If a command with the same name already exists, it will be overridden.
     * If the command is not enabled it will not be added.
     *
     * @return Command|null The registered command if enabled or null
     */
    public function add(\_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command $command)
    {
        $this->init();
        $command->setApplication($this);
        if (!$command->isEnabled()) {
            $command->setApplication(null);
            return;
        }
        if (null === $command->getDefinition()) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException(\sprintf('Command class "%s" is not correctly initialized. You probably forgot to call the parent constructor.', \get_class($command)));
        }
        if (!$command->getName()) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException(\sprintf('The command defined in "%s" cannot have an empty name.', \get_class($command)));
        }
        $this->commands[$command->getName()] = $command;
        foreach ($command->getAliases() as $alias) {
            $this->commands[$alias] = $command;
        }
        return $command;
    }
    /**
     * Returns a registered command by name or alias.
     *
     * @param string $name The command name or alias
     *
     * @return Command A Command object
     *
     * @throws CommandNotFoundException When given command name does not exist
     */
    public function get($name)
    {
        $this->init();
        if (!$this->has($name)) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\CommandNotFoundException(\sprintf('The command "%s" does not exist.', $name));
        }
        $command = $this->commands[$name];
        if ($this->wantHelps) {
            $this->wantHelps = \false;
            $helpCommand = $this->get('help');
            $helpCommand->setCommand($command);
            return $helpCommand;
        }
        return $command;
    }
    /**
     * Returns true if the command exists, false otherwise.
     *
     * @param string $name The command name or alias
     *
     * @return bool true if the command exists, false otherwise
     */
    public function has($name)
    {
        $this->init();
        return isset($this->commands[$name]) || $this->commandLoader && $this->commandLoader->has($name) && $this->add($this->commandLoader->get($name));
    }
    /**
     * Returns an array of all unique namespaces used by currently registered commands.
     *
     * It does not return the global namespace which always exists.
     *
     * @return string[] An array of namespaces
     */
    public function getNamespaces()
    {
        $namespaces = [];
        foreach ($this->all() as $command) {
            $namespaces = \array_merge($namespaces, $this->extractAllNamespaces($command->getName()));
            foreach ($command->getAliases() as $alias) {
                $namespaces = \array_merge($namespaces, $this->extractAllNamespaces($alias));
            }
        }
        return \array_values(\array_unique(\array_filter($namespaces)));
    }
    /**
     * Finds a registered namespace by a name or an abbreviation.
     *
     * @param string $namespace A namespace or abbreviation to search for
     *
     * @return string A registered namespace
     *
     * @throws CommandNotFoundException When namespace is incorrect or ambiguous
     */
    public function findNamespace($namespace)
    {
        $allNamespaces = $this->getNamespaces();
        $expr = \preg_replace_callback('{([^:]+|)}', function ($matches) {
            return \preg_quote($matches[1]) . '[^:]*';
        }, $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 \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\CommandNotFoundException($message, $alternatives);
        }
        $exact = \in_array($namespace, $namespaces, \true);
        if (\count($namespaces) > 1 && !$exact) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\CommandNotFoundException(\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);
    }
    /**
     * Finds a command by name or alias.
     *
     * Contrary to get, this command tries to find the best
     * match if you give it an abbreviation of a name or alias.
     *
     * @param string $name A command name or a command alias
     *
     * @return Command A Command instance
     *
     * @throws CommandNotFoundException When command name is incorrect or ambiguous
     */
    public function find($name)
    {
        $this->init();
        $aliases = [];
        foreach ($this->commands as $command) {
            foreach ($command->getAliases() as $alias) {
                if (!$this->has($alias)) {
                    $this->commands[$alias] = $command;
                }
            }
        }
        $allCommands = $this->commandLoader ? \array_merge($this->commandLoader->getNames(), \array_keys($this->commands)) : \array_keys($this->commands);
        $expr = \preg_replace_callback('{([^:]+|)}', function ($matches) {
            return \preg_quote($matches[1]) . '[^:]*';
        }, $name);
        $commands = \preg_grep('{^' . $expr . '}', $allCommands);
        if (empty($commands)) {
            $commands = \preg_grep('{^' . $expr . '}i', $allCommands);
        }
        // if no commands matched or we just matched namespaces
        if (empty($commands) || \count(\preg_grep('{^' . $expr . '$}i', $commands)) < 1) {
            if (\false !== ($pos = \strrpos($name, ':'))) {
                // check if a namespace exists and contains commands
                $this->findNamespace(\substr($name, 0, $pos));
            }
            $message = \sprintf('Command "%s" is not defined.', $name);
            if ($alternatives = $this->findAlternatives($name, $allCommands)) {
                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 \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\CommandNotFoundException($message, $alternatives);
        }
        // filter out aliases for commands which are already on the list
        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) {
                $commandName = $commandList[$nameOrAlias] instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command ? $commandList[$nameOrAlias]->getName() : $nameOrAlias;
                $aliases[$nameOrAlias] = $commandName;
                return $commandName === $nameOrAlias || !\in_array($commandName, $commands);
            }));
        }
        $exact = \in_array($name, $commands, \true) || isset($aliases[$name]);
        if (\count($commands) > 1 && !$exact) {
            $usableWidth = $this->terminal->getWidth() - 10;
            $abbrevs = \array_values($commands);
            $maxLen = 0;
            foreach ($abbrevs as $abbrev) {
                $maxLen = \max(\_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlen($abbrev), $maxLen);
            }
            $abbrevs = \array_map(function ($cmd) use($commandList, $usableWidth, $maxLen) {
                if (!$commandList[$cmd] instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command) {
                    return $cmd;
                }
                $abbrev = \str_pad($cmd, $maxLen, ' ') . ' ' . $commandList[$cmd]->getDescription();
                return \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlen($abbrev) > $usableWidth ? \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::substr($abbrev, 0, $usableWidth - 3) . '...' : $abbrev;
            }, \array_values($commands));
            $suggestions = $this->getAbbreviationSuggestions($abbrevs);
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\CommandNotFoundException(\sprintf("Command \"%s\" is ambiguous.\nDid you mean one of these?\n%s", $name, $suggestions), \array_values($commands));
        }
        return $this->get($exact ? $name : \reset($commands));
    }
    /**
     * Gets the commands (registered in the given namespace if provided).
     *
     * The array keys are the full names and the values the command instances.
     *
     * @param string $namespace A namespace name
     *
     * @return Command[] An array of Command instances
     */
    public function all($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;
    }
    /**
     * Returns an array of possible abbreviations given a set of names.
     *
     * @param array $names An array of names
     *
     * @return array An array of abbreviations
     */
    public static function getAbbreviations($names)
    {
        $abbrevs = [];
        foreach ($names as $name) {
            for ($len = \strlen($name); $len > 0; --$len) {
                $abbrev = \substr($name, 0, $len);
                $abbrevs[$abbrev][] = $name;
            }
        }
        return $abbrevs;
    }
    /**
     * Renders a caught exception.
     */
    public function renderException(\Exception $e, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output)
    {
        $output->writeln('', \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_QUIET);
        $this->doRenderException($e, $output);
        if (null !== $this->runningCommand) {
            $output->writeln(\sprintf('<info>%s</info>', \sprintf($this->runningCommand->getSynopsis(), $this->getName())), \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_QUIET);
            $output->writeln('', \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_QUIET);
        }
    }
    protected function doRenderException(\Exception $e, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output)
    {
        do {
            $message = \trim($e->getMessage());
            if ('' === $message || \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {
                $title = \sprintf('  [%s%s]  ', \get_class($e), 0 !== ($code = $e->getCode()) ? ' (' . $code . ')' : '');
                $len = \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlen($title);
            } else {
                $len = 0;
            }
            $width = $this->terminal->getWidth() ? $this->terminal->getWidth() - 1 : \PHP_INT_MAX;
            // HHVM only accepts 32 bits integer in str_split, even when PHP_INT_MAX is a 64 bit integer: https://github.com/facebook/hhvm/issues/1327
            if (\defined('HHVM_VERSION') && $width > 1 << 31) {
                $width = 1 << 31;
            }
            $lines = [];
            foreach ('' !== $message ? \preg_split('/\\r?\\n/', $message) : [] as $line) {
                foreach ($this->splitStringByWidth($line, $width - 4) as $line) {
                    // pre-format lines to get the right string length
                    $lineLength = \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlen($line) + 4;
                    $lines[] = [$line, $lineLength];
                    $len = \max($lineLength, $len);
                }
            }
            $messages = [];
            if (!$e instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\ExceptionInterface || \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {
                $messages[] = \sprintf('<comment>%s</comment>', \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\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 || \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {
                $messages[] = \sprintf('<error>%s%s</error>', $title, \str_repeat(' ', \max(0, $len - \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlen($title))));
            }
            foreach ($lines as $line) {
                $messages[] = \sprintf('<error>  %s  %s</error>', \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatter::escape($line[0]), \str_repeat(' ', $len - $line[1]));
            }
            $messages[] = $emptyLine;
            $messages[] = '';
            $output->writeln($messages, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_QUIET);
            if (\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {
                $output->writeln('<comment>Exception trace:</comment>', \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_QUIET);
                // exception related properties
                $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 = isset($trace[$i]['class']) ? $trace[$i]['class'] : '';
                    $type = isset($trace[$i]['type']) ? $trace[$i]['type'] : '';
                    $function = $trace[$i]['function'];
                    $file = isset($trace[$i]['file']) ? $trace[$i]['file'] : 'n/a';
                    $line = isset($trace[$i]['line']) ? $trace[$i]['line'] : 'n/a';
                    $output->writeln(\sprintf(' %s%s%s() at <info>%s:%s</info>', $class, $type, $function, $file, $line), \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_QUIET);
                }
                $output->writeln('', \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_QUIET);
            }
        } while ($e = $e->getPrevious());
    }
    /**
     * Tries to figure out the terminal width in which this application runs.
     *
     * @return int|null
     *
     * @deprecated since version 3.2, to be removed in 4.0. Create a Terminal instance instead.
     */
    protected function getTerminalWidth()
    {
        @\trigger_error(\sprintf('The "%s()" method is deprecated as of 3.2 and will be removed in 4.0. Create a Terminal instance instead.', __METHOD__), \E_USER_DEPRECATED);
        return $this->terminal->getWidth();
    }
    /**
     * Tries to figure out the terminal height in which this application runs.
     *
     * @return int|null
     *
     * @deprecated since version 3.2, to be removed in 4.0. Create a Terminal instance instead.
     */
    protected function getTerminalHeight()
    {
        @\trigger_error(\sprintf('The "%s()" method is deprecated as of 3.2 and will be removed in 4.0. Create a Terminal instance instead.', __METHOD__), \E_USER_DEPRECATED);
        return $this->terminal->getHeight();
    }
    /**
     * Tries to figure out the terminal dimensions based on the current environment.
     *
     * @return array Array containing width and height
     *
     * @deprecated since version 3.2, to be removed in 4.0. Create a Terminal instance instead.
     */
    public function getTerminalDimensions()
    {
        @\trigger_error(\sprintf('The "%s()" method is deprecated as of 3.2 and will be removed in 4.0. Create a Terminal instance instead.', __METHOD__), \E_USER_DEPRECATED);
        return [$this->terminal->getWidth(), $this->terminal->getHeight()];
    }
    /**
     * Sets terminal dimensions.
     *
     * Can be useful to force terminal dimensions for functional tests.
     *
     * @param int $width  The width
     * @param int $height The height
     *
     * @return $this
     *
     * @deprecated since version 3.2, to be removed in 4.0. Set the COLUMNS and LINES env vars instead.
     */
    public function setTerminalDimensions($width, $height)
    {
        @\trigger_error(\sprintf('The "%s()" method is deprecated as of 3.2 and will be removed in 4.0. Set the COLUMNS and LINES env vars instead.', __METHOD__), \E_USER_DEPRECATED);
        \putenv('COLUMNS=' . $width);
        \putenv('LINES=' . $height);
        return $this;
    }
    /**
     * Configures the input and output instances based on the user arguments and options.
     */
    protected function configureIO(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\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);
        } elseif (\function_exists('posix_isatty')) {
            $inputStream = null;
            if ($input instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\StreamableInputInterface) {
                $inputStream = $input->getStream();
            }
            // This check ensures that calling QuestionHelper::setInputStream() works
            // To be removed in 4.0 (in the same time as QuestionHelper::setInputStream)
            if (!$inputStream && $this->getHelperSet()->has('question')) {
                $inputStream = $this->getHelperSet()->get('question')->getInputStream(\false);
            }
            if (!@\posix_isatty($inputStream) && \false === \getenv('SHELL_INTERACTIVE')) {
                $input->setInteractive(\false);
            }
        }
        switch ($shellVerbosity = (int) \getenv('SHELL_VERBOSITY')) {
            case -1:
                $output->setVerbosity(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_QUIET);
                break;
            case 1:
                $output->setVerbosity(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_VERBOSE);
                break;
            case 2:
                $output->setVerbosity(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_VERY_VERBOSE);
                break;
            case 3:
                $output->setVerbosity(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_DEBUG);
                break;
            default:
                $shellVerbosity = 0;
                break;
        }
        if (\true === $input->hasParameterOption(['--quiet', '-q'], \true)) {
            $output->setVerbosity(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_QUIET);
            $shellVerbosity = -1;
        } else {
            if ($input->hasParameterOption('-vvv', \true) || $input->hasParameterOption('--verbose=3', \true) || 3 === $input->getParameterOption('--verbose', \false, \true)) {
                $output->setVerbosity(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_DEBUG);
                $shellVerbosity = 3;
            } elseif ($input->hasParameterOption('-vv', \true) || $input->hasParameterOption('--verbose=2', \true) || 2 === $input->getParameterOption('--verbose', \false, \true)) {
                $output->setVerbosity(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\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(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_VERBOSE);
                $shellVerbosity = 1;
            }
        }
        if (-1 === $shellVerbosity) {
            $input->setInteractive(\false);
        }
        \putenv('SHELL_VERBOSITY=' . $shellVerbosity);
        $_ENV['SHELL_VERBOSITY'] = $shellVerbosity;
        $_SERVER['SHELL_VERBOSITY'] = $shellVerbosity;
    }
    /**
     * Runs the current command.
     *
     * If an event dispatcher has been attached to the application,
     * events are also dispatched during the life-cycle of the command.
     *
     * @return int 0 if everything went fine, or an error code
     */
    protected function doRunCommand(\_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command $command, \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output)
    {
        foreach ($command->getHelperSet() as $helper) {
            if ($helper instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputAwareInterface) {
                $helper->setInput($input);
            }
        }
        if (null === $this->dispatcher) {
            return $command->run($input, $output);
        }
        // bind before the console.command event, so the listeners have access to input options/arguments
        try {
            $command->mergeApplicationDefinition();
            $input->bind($command->getDefinition());
        } catch (\_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\ExceptionInterface $e) {
            // ignore invalid options/arguments for now, to allow the event listeners to customize the InputDefinition
        }
        $event = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Event\ConsoleCommandEvent($command, $input, $output);
        $e = null;
        try {
            $this->dispatcher->dispatch(\_HumbugBoxb94336daae36\Symfony\Component\Console\ConsoleEvents::COMMAND, $event);
            if ($event->commandShouldRun()) {
                $exitCode = $command->run($input, $output);
            } else {
                $exitCode = \_HumbugBoxb94336daae36\Symfony\Component\Console\Event\ConsoleCommandEvent::RETURN_CODE_DISABLED;
            }
        } catch (\Exception $e) {
        } catch (\Throwable $e) {
        }
        if (null !== $e) {
            if ($this->dispatcher->hasListeners(\_HumbugBoxb94336daae36\Symfony\Component\Console\ConsoleEvents::EXCEPTION)) {
                $x = $e instanceof \Exception ? $e : new \_HumbugBoxb94336daae36\Symfony\Component\Debug\Exception\FatalThrowableError($e);
                $event = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Event\ConsoleExceptionEvent($command, $input, $output, $x, $x->getCode());
                $this->dispatcher->dispatch(\_HumbugBoxb94336daae36\Symfony\Component\Console\ConsoleEvents::EXCEPTION, $event);
                if ($x !== $event->getException()) {
                    $e = $event->getException();
                }
            }
            $event = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Event\ConsoleErrorEvent($input, $output, $e, $command);
            $this->dispatcher->dispatch(\_HumbugBoxb94336daae36\Symfony\Component\Console\ConsoleEvents::ERROR, $event);
            $e = $event->getError();
            if (0 === ($exitCode = $event->getExitCode())) {
                $e = null;
            }
        }
        $event = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Event\ConsoleTerminateEvent($command, $input, $output, $exitCode);
        $this->dispatcher->dispatch(\_HumbugBoxb94336daae36\Symfony\Component\Console\ConsoleEvents::TERMINATE, $event);
        if (null !== $e) {
            throw $e;
        }
        return $event->getExitCode();
    }
    /**
     * Gets the name of the command based on input.
     *
     * @return string The command name
     */
    protected function getCommandName(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input)
    {
        return $this->singleCommand ? $this->defaultCommand : $input->getFirstArgument();
    }
    /**
     * Gets the default input definition.
     *
     * @return InputDefinition An InputDefinition instance
     */
    protected function getDefaultInputDefinition()
    {
        return new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition([new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument('command', \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument::REQUIRED, 'The command to execute'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption('--help', '-h', \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_NONE, 'Display this help message'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption('--quiet', '-q', \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_NONE, 'Do not output any message'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption('--verbose', '-v|vv|vvv', \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_NONE, 'Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption('--version', '-V', \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_NONE, 'Display this application version'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption('--ansi', '', \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_NONE, 'Force ANSI output'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption('--no-ansi', '', \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_NONE, 'Disable ANSI output'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption('--no-interaction', '-n', \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_NONE, 'Do not ask any interactive question')]);
    }
    /**
     * Gets the default commands that should always be available.
     *
     * @return Command[] An array of default Command instances
     */
    protected function getDefaultCommands()
    {
        return [new \_HumbugBoxb94336daae36\Symfony\Component\Console\Command\HelpCommand(), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Command\ListCommand()];
    }
    /**
     * Gets the default helper set with the helpers that should always be available.
     *
     * @return HelperSet A HelperSet instance
     */
    protected function getDefaultHelperSet()
    {
        return new \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\HelperSet([new \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\FormatterHelper(), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\DebugFormatterHelper(), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\ProcessHelper(), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\QuestionHelper()]);
    }
    /**
     * Returns abbreviated suggestions in string format.
     *
     * @param array $abbrevs Abbreviated suggestions to convert
     *
     * @return string A formatted string of abbreviated suggestions
     */
    private function getAbbreviationSuggestions($abbrevs)
    {
        return '    ' . \implode("\n    ", $abbrevs);
    }
    /**
     * Returns the namespace part of the command name.
     *
     * This method is not part of public API and should not be used directly.
     *
     * @param string $name  The full name of the command
     * @param string $limit The maximum number of parts of the namespace
     *
     * @return string The namespace of the command
     */
    public function extractNamespace($name, $limit = null)
    {
        $parts = \explode(':', $name);
        \array_pop($parts);
        return \implode(':', null === $limit ? $parts : \array_slice($parts, 0, $limit));
    }
    /**
     * Finds alternative of $name among $collection,
     * if nothing is found in $collection, try in $abbrevs.
     *
     * @param string   $name       The string
     * @param iterable $collection The collection
     *
     * @return string[] A sorted array of similar string
     */
    private function findAlternatives($name, $collection)
    {
        $threshold = 1000.0;
        $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 && \false !== \strpos($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 || \false !== \strpos($item, $name)) {
                $alternatives[$item] = isset($alternatives[$item]) ? $alternatives[$item] - $lev : $lev;
            }
        }
        $alternatives = \array_filter($alternatives, function ($lev) use($threshold) {
            return $lev < 2 * $threshold;
        });
        \ksort($alternatives, \SORT_NATURAL | \SORT_FLAG_CASE);
        return \array_keys($alternatives);
    }
    /**
     * Sets the default Command name.
     *
     * @param string $commandName     The Command name
     * @param bool   $isSingleCommand Set to true if there is only one command in this application
     *
     * @return self
     */
    public function setDefaultCommand($commandName, $isSingleCommand = \false)
    {
        $this->defaultCommand = $commandName;
        if ($isSingleCommand) {
            // Ensure the command exist
            $this->find($commandName);
            $this->singleCommand = \true;
        }
        return $this;
    }
    /**
     * @internal
     */
    public function isSingleCommand()
    {
        return $this->singleCommand;
    }
    private function splitStringByWidth($string, $width)
    {
        // str_split is not suitable for multi-byte characters, we should use preg_split to get char array properly.
        // additionally, array_slice() is not enough as some character has doubled width.
        // we need a function to split string not by character count but by string width
        if (\false === ($encoding = \mb_detect_encoding($string, null, \true))) {
            return \str_split($string, $width);
        }
        $utf8String = \mb_convert_encoding($string, 'utf8', $encoding);
        $lines = [];
        $line = '';
        foreach (\preg_split('//u', $utf8String) as $char) {
            // test if $char could be appended to current line
            if (\mb_strwidth($line . $char, 'utf8') <= $width) {
                $line .= $char;
                continue;
            }
            // if not, push current line to array and make new line
            $lines[] = \str_pad($line, $width);
            $line = $char;
        }
        $lines[] = \count($lines) ? \str_pad($line, $width) : $line;
        \mb_convert_variables($encoding, 'utf8', $lines);
        return $lines;
    }
    /**
     * Returns all namespaces of the command name.
     *
     * @param string $name The full name of the command
     *
     * @return string[] The namespaces of the command
     */
    private function extractAllNamespaces($name)
    {
        // -1 as third argument is needed to skip the command short name when exploding
        $parts = \explode(':', $name, -1);
        $namespaces = [];
        foreach ($parts as $part) {
            if (\count($namespaces)) {
                $namespaces[] = \end($namespaces) . ':' . $part;
            } else {
                $namespaces[] = $part;
            }
        }
        return $namespaces;
    }
    private function init()
    {
        if ($this->initialized) {
            return;
        }
        $this->initialized = \true;
        foreach ($this->getDefaultCommands() as $command) {
            $this->add($command);
        }
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Logger;

use _HumbugBoxb94336daae36\Psr\Log\AbstractLogger;
use _HumbugBoxb94336daae36\Psr\Log\InvalidArgumentException;
use _HumbugBoxb94336daae36\Psr\Log\LogLevel;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\ConsoleOutputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
/**
 * PSR-3 compliant console logger.
 *
 * @author Kévin Dunglas <dunglas@gmail.com>
 *
 * @see http://www.php-fig.org/psr/psr-3/
 */
class ConsoleLogger extends \_HumbugBoxb94336daae36\Psr\Log\AbstractLogger
{
    const INFO = 'info';
    const ERROR = 'error';
    private $output;
    private $verbosityLevelMap = [\_HumbugBoxb94336daae36\Psr\Log\LogLevel::EMERGENCY => \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_NORMAL, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::ALERT => \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_NORMAL, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::CRITICAL => \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_NORMAL, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::ERROR => \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_NORMAL, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::WARNING => \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_NORMAL, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::NOTICE => \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_VERBOSE, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::INFO => \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_VERY_VERBOSE, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::DEBUG => \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_DEBUG];
    private $formatLevelMap = [\_HumbugBoxb94336daae36\Psr\Log\LogLevel::EMERGENCY => self::ERROR, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::ALERT => self::ERROR, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::CRITICAL => self::ERROR, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::ERROR => self::ERROR, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::WARNING => self::INFO, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::NOTICE => self::INFO, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::INFO => self::INFO, \_HumbugBoxb94336daae36\Psr\Log\LogLevel::DEBUG => self::INFO];
    private $errored = \false;
    public function __construct(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, array $verbosityLevelMap = [], array $formatLevelMap = [])
    {
        $this->output = $output;
        $this->verbosityLevelMap = $verbosityLevelMap + $this->verbosityLevelMap;
        $this->formatLevelMap = $formatLevelMap + $this->formatLevelMap;
    }
    /**
     * {@inheritdoc}
     */
    public function log($level, $message, array $context = [])
    {
        if (!isset($this->verbosityLevelMap[$level])) {
            throw new \_HumbugBoxb94336daae36\Psr\Log\InvalidArgumentException(\sprintf('The log level "%s" does not exist.', $level));
        }
        $output = $this->output;
        // Write to the error output if necessary and available
        if (self::ERROR === $this->formatLevelMap[$level]) {
            if ($this->output instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\ConsoleOutputInterface) {
                $output = $output->getErrorOutput();
            }
            $this->errored = \true;
        }
        // the if condition check isn't necessary -- it's the same one that $output will do internally anyway.
        // We only do it for efficiency here as the message formatting is relatively expensive.
        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]);
        }
    }
    /**
     * Returns true when any messages have been logged at error levels.
     *
     * @return bool
     */
    public function hasErrored()
    {
        return $this->errored;
    }
    /**
     * Interpolates context values into the message placeholders.
     *
     * @author PHP Framework Interoperability Group
     *
     * @param string $message
     * @param array  $context
     *
     * @return string
     */
    private function interpolate($message, array $context)
    {
        if (\false === \strpos($message, '{')) {
            return $message;
        }
        $replacements = [];
        foreach ($context as $key => $val) {
            if (null === $val || \is_scalar($val) || \is_object($val) && \method_exists($val, '__toString')) {
                $replacements["{{$key}}"] = $val;
            } elseif ($val instanceof \DateTimeInterface) {
                $replacements["{{$key}}"] = $val->format(\DateTime::RFC3339);
            } elseif (\is_object($val)) {
                $replacements["{{$key}}"] = '[object ' . \get_class($val) . ']';
            } else {
                $replacements["{{$key}}"] = '[' . \gettype($val) . ']';
            }
        }
        return \strtr($message, $replacements);
    }
}
Copyright (c) 2004-2019 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
CHANGELOG
=========

3.4.0
-----

 * added `SHELL_VERBOSITY` env var to control verbosity
 * added `CommandLoaderInterface`, `FactoryCommandLoader` and PSR-11
   `ContainerCommandLoader` for commands lazy-loading
 * added a case-insensitive command name matching fallback
 * added static `Command::$defaultName/getDefaultName()`, allowing for
   commands to be registered at compile time in the application command loader.
   Setting the `$defaultName` property avoids the need for filling the `command`
   attribute on the `console.command` tag when using `AddConsoleCommandPass`.

3.3.0
-----

* added `ExceptionListener`
* added `AddConsoleCommandPass` (originally in FrameworkBundle)
* [BC BREAK] `Input::getOption()` no longer returns the default value for options
  with value optional explicitly passed empty
* added console.error event to catch exceptions thrown by other listeners
* deprecated console.exception event in favor of console.error
* added ability to handle `CommandNotFoundException` through the 
 `console.error` event
* deprecated default validation in `SymfonyQuestionHelper::ask`

3.2.0
------

* added `setInputs()` method to CommandTester for ease testing of commands expecting inputs
* added `setStream()` and `getStream()` methods to Input (implement StreamableInputInterface)
* added StreamableInputInterface
* added LockableTrait

3.1.0
-----

 * added truncate method to FormatterHelper
 * added setColumnWidth(s) method to Table 

2.8.3
-----

 * remove readline support from the question helper as it caused issues

2.8.0
-----

 * use readline for user input in the question helper when available to allow
   the use of arrow keys

2.6.0
-----

 * added a Process helper
 * added a DebugFormatter helper

2.5.0
-----

 * deprecated the dialog helper (use the question helper instead)
 * deprecated TableHelper in favor of Table
 * deprecated ProgressHelper in favor of ProgressBar
 * added ConsoleLogger
 * added a question helper
 * added a way to set the process name of a command
 * added a way to set a default command instead of `ListCommand`

2.4.0
-----

 * added a way to force terminal dimensions
 * added a convenient method to detect verbosity level
 * [BC BREAK] made descriptors use output instead of returning a string

2.3.0
-----

 * added multiselect support to the select dialog helper
 * added Table Helper for tabular data rendering
 * added support for events in `Application`
 * added a way to normalize EOLs in `ApplicationTester::getDisplay()` and `CommandTester::getDisplay()`
 * added a way to set the progress bar progress via the `setCurrent` method
 * added support for multiple InputOption shortcuts, written as `'-a|-b|-c'`
 * added two additional verbosity levels, VERBOSITY_VERY_VERBOSE and VERBOSITY_DEBUG

2.2.0
-----

 * added support for colorization on Windows via ConEmu
 * add a method to Dialog Helper to ask for a question and hide the response
 * added support for interactive selections in console (DialogHelper::select())
 * added support for autocompletion as you type in Dialog Helper

2.1.0
-----

 * added ConsoleOutputInterface
 * added the possibility to disable a command (Command::isEnabled())
 * added suggestions when a command does not exist
 * added a --raw option to the list command
 * added support for STDERR in the console output class (errors are now sent
   to STDERR)
 * made the defaults (helper set, commands, input definition) in Application
   more easily customizable
 * added support for the shell even if readline is not available
 * added support for process isolation in Symfony shell via
   `--process-isolation` switch
 * added support for `--`, which disables options parsing after that point
   (tokens will be parsed as arguments)
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Input;

/**
 * StreamableInputInterface is the interface implemented by all input classes
 * that have an input stream.
 *
 * @author Robin Chalas <robin.chalas@gmail.com>
 */
interface StreamableInputInterface extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface
{
    /**
     * Sets the input stream to read from when interacting with the user.
     *
     * This is mainly useful for testing purpose.
     *
     * @param resource $stream The input stream
     */
    public function setStream($stream);
    /**
     * Returns the input stream.
     *
     * @return resource|null
     */
    public function getStream();
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Input;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidOptionException;
/**
 * ArrayInput represents an input provided as an array.
 *
 * Usage:
 *
 *     $input = new ArrayInput(['command' => 'foo:bar', 'foo' => 'bar', '--bar' => 'foobar']);
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ArrayInput extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\Input
{
    private $parameters;
    public function __construct(array $parameters, \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition $definition = null)
    {
        $this->parameters = $parameters;
        parent::__construct($definition);
    }
    /**
     * {@inheritdoc}
     */
    public function getFirstArgument()
    {
        foreach ($this->parameters as $key => $value) {
            if ($key && '-' === $key[0]) {
                continue;
            }
            return $value;
        }
    }
    /**
     * {@inheritdoc}
     */
    public function hasParameterOption($values, $onlyParams = \false)
    {
        $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;
    }
    /**
     * {@inheritdoc}
     */
    public function getParameterOption($values, $default = \false, $onlyParams = \false)
    {
        $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;
    }
    /**
     * Returns a stringified representation of the args passed to the command.
     *
     * @return string
     */
    public function __toString()
    {
        $params = [];
        foreach ($this->parameters as $param => $val) {
            if ($param && '-' === $param[0]) {
                if (\is_array($val)) {
                    foreach ($val as $v) {
                        $params[] = $param . ('' != $v ? '=' . $this->escapeToken($v) : '');
                    }
                } else {
                    $params[] = $param . ('' != $val ? '=' . $this->escapeToken($val) : '');
                }
            } else {
                $params[] = \is_array($val) ? \implode(' ', \array_map([$this, 'escapeToken'], $val)) : $this->escapeToken($val);
            }
        }
        return \implode(' ', $params);
    }
    /**
     * {@inheritdoc}
     */
    protected function parse()
    {
        foreach ($this->parameters as $key => $value) {
            if ('--' === $key) {
                return;
            }
            if (0 === \strpos($key, '--')) {
                $this->addLongOption(\substr($key, 2), $value);
            } elseif ('-' === $key[0]) {
                $this->addShortOption(\substr($key, 1), $value);
            } else {
                $this->addArgument($key, $value);
            }
        }
    }
    /**
     * Adds a short option value.
     *
     * @param string $shortcut The short option key
     * @param mixed  $value    The value for the option
     *
     * @throws InvalidOptionException When option given doesn't exist
     */
    private function addShortOption($shortcut, $value)
    {
        if (!$this->definition->hasShortcut($shortcut)) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidOptionException(\sprintf('The "-%s" option does not exist.', $shortcut));
        }
        $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value);
    }
    /**
     * Adds a long option value.
     *
     * @param string $name  The long option key
     * @param mixed  $value The value for the option
     *
     * @throws InvalidOptionException When option given doesn't exist
     * @throws InvalidOptionException When a required value is missing
     */
    private function addLongOption($name, $value)
    {
        if (!$this->definition->hasOption($name)) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidOptionException(\sprintf('The "--%s" option does not exist.', $name));
        }
        $option = $this->definition->getOption($name);
        if (null === $value) {
            if ($option->isValueRequired()) {
                throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidOptionException(\sprintf('The "--%s" option requires a value.', $name));
            }
            if (!$option->isValueOptional()) {
                $value = \true;
            }
        }
        $this->options[$name] = $value;
    }
    /**
     * Adds an argument value.
     *
     * @param string $name  The argument name
     * @param mixed  $value The value for the argument
     *
     * @throws InvalidArgumentException When argument given doesn't exist
     */
    private function addArgument($name, $value)
    {
        if (!$this->definition->hasArgument($name)) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('The "%s" argument does not exist.', $name));
        }
        $this->arguments[$name] = $value;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Input;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\RuntimeException;
/**
 * ArgvInput represents an input coming from the CLI arguments.
 *
 * Usage:
 *
 *     $input = new ArgvInput();
 *
 * By default, the `$_SERVER['argv']` array is used for the input values.
 *
 * This can be overridden by explicitly passing the input values in the constructor:
 *
 *     $input = new ArgvInput($_SERVER['argv']);
 *
 * If you pass it yourself, don't forget that the first element of the array
 * is the name of the running application.
 *
 * When passing an argument to the constructor, be sure that it respects
 * the same rules as the argv one. It's almost always better to use the
 * `StringInput` when you want to provide your own input.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @see http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html
 * @see http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02
 */
class ArgvInput extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\Input
{
    private $tokens;
    private $parsed;
    /**
     * @param array|null           $argv       An array of parameters from the CLI (in the argv format)
     * @param InputDefinition|null $definition A InputDefinition instance
     */
    public function __construct(array $argv = null, \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition $definition = null)
    {
        if (null === $argv) {
            $argv = $_SERVER['argv'];
        }
        // strip the application name
        \array_shift($argv);
        $this->tokens = $argv;
        parent::__construct($definition);
    }
    protected function setTokens(array $tokens)
    {
        $this->tokens = $tokens;
    }
    /**
     * {@inheritdoc}
     */
    protected function parse()
    {
        $parseOptions = \true;
        $this->parsed = $this->tokens;
        while (null !== ($token = \array_shift($this->parsed))) {
            if ($parseOptions && '' == $token) {
                $this->parseArgument($token);
            } elseif ($parseOptions && '--' == $token) {
                $parseOptions = \false;
            } elseif ($parseOptions && 0 === \strpos($token, '--')) {
                $this->parseLongOption($token);
            } elseif ($parseOptions && '-' === $token[0] && '-' !== $token) {
                $this->parseShortOption($token);
            } else {
                $this->parseArgument($token);
            }
        }
    }
    /**
     * Parses a short option.
     *
     * @param string $token The current token
     */
    private function parseShortOption($token)
    {
        $name = \substr($token, 1);
        if (\strlen($name) > 1) {
            if ($this->definition->hasShortcut($name[0]) && $this->definition->getOptionForShortcut($name[0])->acceptValue()) {
                // an option with a value (with no space)
                $this->addShortOption($name[0], \substr($name, 1));
            } else {
                $this->parseShortOptionSet($name);
            }
        } else {
            $this->addShortOption($name, null);
        }
    }
    /**
     * Parses a short option set.
     *
     * @param string $name The current token
     *
     * @throws RuntimeException When option given doesn't exist
     */
    private function parseShortOptionSet($name)
    {
        $len = \strlen($name);
        for ($i = 0; $i < $len; ++$i) {
            if (!$this->definition->hasShortcut($name[$i])) {
                $encoding = \mb_detect_encoding($name, null, \true);
                throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\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);
            }
        }
    }
    /**
     * Parses a long option.
     *
     * @param string $token The current token
     */
    private function parseLongOption($token)
    {
        $name = \substr($token, 2);
        if (\false !== ($pos = \strpos($name, '='))) {
            if (0 === \strlen($value = \substr($name, $pos + 1))) {
                // if no value after "=" then substr() returns "" since php7 only, false before
                // see http://php.net/manual/fr/migration70.incompatible.php#119151
                if (\PHP_VERSION_ID < 70000 && \false === $value) {
                    $value = '';
                }
                \array_unshift($this->parsed, $value);
            }
            $this->addLongOption(\substr($name, 0, $pos), $value);
        } else {
            $this->addLongOption($name, null);
        }
    }
    /**
     * Parses an argument.
     *
     * @param string $token The current token
     *
     * @throws RuntimeException When too many arguments are given
     */
    private function parseArgument($token)
    {
        $c = \count($this->arguments);
        // if input is expecting another argument, add it
        if ($this->definition->hasArgument($c)) {
            $arg = $this->definition->getArgument($c);
            $this->arguments[$arg->getName()] = $arg->isArray() ? [$token] : $token;
            // if last argument isArray(), append token to last argument
        } elseif ($this->definition->hasArgument($c - 1) && $this->definition->getArgument($c - 1)->isArray()) {
            $arg = $this->definition->getArgument($c - 1);
            $this->arguments[$arg->getName()][] = $token;
            // unexpected argument
        } else {
            $all = $this->definition->getArguments();
            if (\count($all)) {
                throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\RuntimeException(\sprintf('Too many arguments, expected arguments "%s".', \implode('" "', \array_keys($all))));
            }
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\RuntimeException(\sprintf('No arguments expected, got "%s".', $token));
        }
    }
    /**
     * Adds a short option value.
     *
     * @param string $shortcut The short option key
     * @param mixed  $value    The value for the option
     *
     * @throws RuntimeException When option given doesn't exist
     */
    private function addShortOption($shortcut, $value)
    {
        if (!$this->definition->hasShortcut($shortcut)) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\RuntimeException(\sprintf('The "-%s" option does not exist.', $shortcut));
        }
        $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value);
    }
    /**
     * Adds a long option value.
     *
     * @param string $name  The long option key
     * @param mixed  $value The value for the option
     *
     * @throws RuntimeException When option given doesn't exist
     */
    private function addLongOption($name, $value)
    {
        if (!$this->definition->hasOption($name)) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\RuntimeException(\sprintf('The "--%s" option does not exist.', $name));
        }
        $option = $this->definition->getOption($name);
        if (null !== $value && !$option->acceptValue()) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\RuntimeException(\sprintf('The "--%s" option does not accept a value.', $name));
        }
        if (\in_array($value, ['', null], \true) && $option->acceptValue() && \count($this->parsed)) {
            // if option accepts an optional or mandatory argument
            // let's see if there is one provided
            $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 \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\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;
        }
    }
    /**
     * {@inheritdoc}
     */
    public function getFirstArgument()
    {
        $isOption = \false;
        foreach ($this->tokens as $i => $token) {
            if ($token && '-' === $token[0]) {
                if (\false !== \strpos($token, '=') || !isset($this->tokens[$i + 1])) {
                    continue;
                }
                // If it's a long option, consider that everything after "--" is the option name.
                // Otherwise, use the last char (if it's a short option set, only the last one can take a value with space separator)
                $name = '-' === $token[1] ? \substr($token, 2) : \substr($token, -1);
                if (!isset($this->options[$name]) && !$this->definition->hasShortcut($name)) {
                    // noop
                } 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;
        }
    }
    /**
     * {@inheritdoc}
     */
    public function hasParameterOption($values, $onlyParams = \false)
    {
        $values = (array) $values;
        foreach ($this->tokens as $token) {
            if ($onlyParams && '--' === $token) {
                return \false;
            }
            foreach ($values as $value) {
                // Options with values:
                //   For long options, test for '--option=' at beginning
                //   For short options, test for '-o' at beginning
                $leading = 0 === \strpos($value, '--') ? $value . '=' : $value;
                if ($token === $value || '' !== $leading && 0 === \strpos($token, $leading)) {
                    return \true;
                }
            }
        }
        return \false;
    }
    /**
     * {@inheritdoc}
     */
    public function getParameterOption($values, $default = \false, $onlyParams = \false)
    {
        $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);
                }
                // Options with values:
                //   For long options, test for '--option=' at beginning
                //   For short options, test for '-o' at beginning
                $leading = 0 === \strpos($value, '--') ? $value . '=' : $value;
                if ('' !== $leading && 0 === \strpos($token, $leading)) {
                    return \substr($token, \strlen($leading));
                }
            }
        }
        return $default;
    }
    /**
     * Returns a stringified representation of the args passed to the command.
     *
     * @return string
     */
    public function __toString()
    {
        $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

/*
 * 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 _HumbugBoxb94336daae36\Symfony\Component\Console\Input;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException;
/**
 * Represents a command line argument.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class InputArgument
{
    const REQUIRED = 1;
    const OPTIONAL = 2;
    const IS_ARRAY = 4;
    private $name;
    private $mode;
    private $default;
    private $description;
    /**
     * @param string               $name        The argument name
     * @param int|null             $mode        The argument mode: self::REQUIRED or self::OPTIONAL
     * @param string               $description A description text
     * @param string|string[]|null $default     The default value (for self::OPTIONAL mode only)
     *
     * @throws InvalidArgumentException When argument mode is not valid
     */
    public function __construct($name, $mode = null, $description = '', $default = null)
    {
        if (null === $mode) {
            $mode = self::OPTIONAL;
        } elseif (!\is_int($mode) || $mode > 7 || $mode < 1) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('Argument mode "%s" is not valid.', $mode));
        }
        $this->name = $name;
        $this->mode = $mode;
        $this->description = $description;
        $this->setDefault($default);
    }
    /**
     * Returns the argument name.
     *
     * @return string The argument name
     */
    public function getName()
    {
        return $this->name;
    }
    /**
     * Returns true if the argument is required.
     *
     * @return bool true if parameter mode is self::REQUIRED, false otherwise
     */
    public function isRequired()
    {
        return self::REQUIRED === (self::REQUIRED & $this->mode);
    }
    /**
     * Returns true if the argument can take multiple values.
     *
     * @return bool true if mode is self::IS_ARRAY, false otherwise
     */
    public function isArray()
    {
        return self::IS_ARRAY === (self::IS_ARRAY & $this->mode);
    }
    /**
     * Sets the default value.
     *
     * @param string|string[]|null $default The default value
     *
     * @throws LogicException When incorrect default value is given
     */
    public function setDefault($default = null)
    {
        if (self::REQUIRED === $this->mode && null !== $default) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException('Cannot set a default value except for InputArgument::OPTIONAL mode.');
        }
        if ($this->isArray()) {
            if (null === $default) {
                $default = [];
            } elseif (!\is_array($default)) {
                throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException('A default value for an array argument must be an array.');
            }
        }
        $this->default = $default;
    }
    /**
     * Returns the default value.
     *
     * @return string|string[]|null The default value
     */
    public function getDefault()
    {
        return $this->default;
    }
    /**
     * Returns the description text.
     *
     * @return string The description text
     */
    public function getDescription()
    {
        return $this->description;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Input;

/**
 * InputAwareInterface should be implemented by classes that depends on the
 * Console Input.
 *
 * @author Wouter J <waldio.webdesign@gmail.com>
 */
interface InputAwareInterface
{
    /**
     * Sets the Console Input.
     */
    public function setInput(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input);
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Input;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException;
/**
 * Represents a command line option.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class InputOption
{
    const VALUE_NONE = 1;
    const VALUE_REQUIRED = 2;
    const VALUE_OPTIONAL = 4;
    const VALUE_IS_ARRAY = 8;
    private $name;
    private $shortcut;
    private $mode;
    private $default;
    private $description;
    /**
     * @param string                        $name        The option name
     * @param string|array|null             $shortcut    The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts
     * @param int|null                      $mode        The option mode: One of the VALUE_* constants
     * @param string                        $description A description text
     * @param string|string[]|int|bool|null $default     The default value (must be null for self::VALUE_NONE)
     *
     * @throws InvalidArgumentException If option mode is invalid or incompatible
     */
    public function __construct($name, $shortcut = null, $mode = null, $description = '', $default = null)
    {
        if (0 === \strpos($name, '--')) {
            $name = \substr($name, 2);
        }
        if (empty($name)) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException('An option name cannot be empty.');
        }
        if (empty($shortcut)) {
            $shortcut = null;
        }
        if (null !== $shortcut) {
            if (\is_array($shortcut)) {
                $shortcut = \implode('|', $shortcut);
            }
            $shortcuts = \preg_split('{(\\|)-?}', \ltrim($shortcut, '-'));
            $shortcuts = \array_filter($shortcuts);
            $shortcut = \implode('|', $shortcuts);
            if (empty($shortcut)) {
                throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException('An option shortcut cannot be empty.');
            }
        }
        if (null === $mode) {
            $mode = self::VALUE_NONE;
        } elseif (!\is_int($mode) || $mode > 15 || $mode < 1) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('Option mode "%s" is not valid.', $mode));
        }
        $this->name = $name;
        $this->shortcut = $shortcut;
        $this->mode = $mode;
        $this->description = $description;
        if ($this->isArray() && !$this->acceptValue()) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException('Impossible to have an option mode VALUE_IS_ARRAY if the option does not accept a value.');
        }
        $this->setDefault($default);
    }
    /**
     * Returns the option shortcut.
     *
     * @return string|null The shortcut
     */
    public function getShortcut()
    {
        return $this->shortcut;
    }
    /**
     * Returns the option name.
     *
     * @return string The name
     */
    public function getName()
    {
        return $this->name;
    }
    /**
     * Returns true if the option accepts a value.
     *
     * @return bool true if value mode is not self::VALUE_NONE, false otherwise
     */
    public function acceptValue()
    {
        return $this->isValueRequired() || $this->isValueOptional();
    }
    /**
     * Returns true if the option requires a value.
     *
     * @return bool true if value mode is self::VALUE_REQUIRED, false otherwise
     */
    public function isValueRequired()
    {
        return self::VALUE_REQUIRED === (self::VALUE_REQUIRED & $this->mode);
    }
    /**
     * Returns true if the option takes an optional value.
     *
     * @return bool true if value mode is self::VALUE_OPTIONAL, false otherwise
     */
    public function isValueOptional()
    {
        return self::VALUE_OPTIONAL === (self::VALUE_OPTIONAL & $this->mode);
    }
    /**
     * Returns true if the option can take multiple values.
     *
     * @return bool true if mode is self::VALUE_IS_ARRAY, false otherwise
     */
    public function isArray()
    {
        return self::VALUE_IS_ARRAY === (self::VALUE_IS_ARRAY & $this->mode);
    }
    /**
     * Sets the default value.
     *
     * @param string|string[]|int|bool|null $default The default value
     *
     * @throws LogicException When incorrect default value is given
     */
    public function setDefault($default = null)
    {
        if (self::VALUE_NONE === (self::VALUE_NONE & $this->mode) && null !== $default) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\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 \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException('A default value for an array option must be an array.');
            }
        }
        $this->default = $this->acceptValue() ? $default : \false;
    }
    /**
     * Returns the default value.
     *
     * @return string|string[]|int|bool|null The default value
     */
    public function getDefault()
    {
        return $this->default;
    }
    /**
     * Returns the description text.
     *
     * @return string The description text
     */
    public function getDescription()
    {
        return $this->description;
    }
    /**
     * Checks whether the given option equals this one.
     *
     * @return bool
     */
    public function equals(self $option)
    {
        return $option->getName() === $this->getName() && $option->getShortcut() === $this->getShortcut() && $option->getDefault() === $this->getDefault() && $option->isArray() === $this->isArray() && $option->isValueRequired() === $this->isValueRequired() && $option->isValueOptional() === $this->isValueOptional();
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Input;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException;
/**
 * A InputDefinition represents a set of valid command line arguments and options.
 *
 * Usage:
 *
 *     $definition = new InputDefinition([
 *         new InputArgument('name', InputArgument::REQUIRED),
 *         new InputOption('foo', 'f', InputOption::VALUE_REQUIRED),
 *     ]);
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class InputDefinition
{
    private $arguments;
    private $requiredCount;
    private $hasAnArrayArgument = \false;
    private $hasOptional;
    private $options;
    private $shortcuts;
    /**
     * @param array $definition An array of InputArgument and InputOption instance
     */
    public function __construct(array $definition = [])
    {
        $this->setDefinition($definition);
    }
    /**
     * Sets the definition of the input.
     */
    public function setDefinition(array $definition)
    {
        $arguments = [];
        $options = [];
        foreach ($definition as $item) {
            if ($item instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption) {
                $options[] = $item;
            } else {
                $arguments[] = $item;
            }
        }
        $this->setArguments($arguments);
        $this->setOptions($options);
    }
    /**
     * Sets the InputArgument objects.
     *
     * @param InputArgument[] $arguments An array of InputArgument objects
     */
    public function setArguments($arguments = [])
    {
        $this->arguments = [];
        $this->requiredCount = 0;
        $this->hasOptional = \false;
        $this->hasAnArrayArgument = \false;
        $this->addArguments($arguments);
    }
    /**
     * Adds an array of InputArgument objects.
     *
     * @param InputArgument[] $arguments An array of InputArgument objects
     */
    public function addArguments($arguments = [])
    {
        if (null !== $arguments) {
            foreach ($arguments as $argument) {
                $this->addArgument($argument);
            }
        }
    }
    /**
     * @throws LogicException When incorrect argument is given
     */
    public function addArgument(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument $argument)
    {
        if (isset($this->arguments[$argument->getName()])) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException(\sprintf('An argument with name "%s" already exists.', $argument->getName()));
        }
        if ($this->hasAnArrayArgument) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException('Cannot add an argument after an array argument.');
        }
        if ($argument->isRequired() && $this->hasOptional) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException('Cannot add a required argument after an optional one.');
        }
        if ($argument->isArray()) {
            $this->hasAnArrayArgument = \true;
        }
        if ($argument->isRequired()) {
            ++$this->requiredCount;
        } else {
            $this->hasOptional = \true;
        }
        $this->arguments[$argument->getName()] = $argument;
    }
    /**
     * Returns an InputArgument by name or by position.
     *
     * @param string|int $name The InputArgument name or position
     *
     * @return InputArgument An InputArgument object
     *
     * @throws InvalidArgumentException When argument given doesn't exist
     */
    public function getArgument($name)
    {
        if (!$this->hasArgument($name)) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('The "%s" argument does not exist.', $name));
        }
        $arguments = \is_int($name) ? \array_values($this->arguments) : $this->arguments;
        return $arguments[$name];
    }
    /**
     * Returns true if an InputArgument object exists by name or position.
     *
     * @param string|int $name The InputArgument name or position
     *
     * @return bool true if the InputArgument object exists, false otherwise
     */
    public function hasArgument($name)
    {
        $arguments = \is_int($name) ? \array_values($this->arguments) : $this->arguments;
        return isset($arguments[$name]);
    }
    /**
     * Gets the array of InputArgument objects.
     *
     * @return InputArgument[] An array of InputArgument objects
     */
    public function getArguments()
    {
        return $this->arguments;
    }
    /**
     * Returns the number of InputArguments.
     *
     * @return int The number of InputArguments
     */
    public function getArgumentCount()
    {
        return $this->hasAnArrayArgument ? \PHP_INT_MAX : \count($this->arguments);
    }
    /**
     * Returns the number of required InputArguments.
     *
     * @return int The number of required InputArguments
     */
    public function getArgumentRequiredCount()
    {
        return $this->requiredCount;
    }
    /**
     * Gets the default values.
     *
     * @return array An array of default values
     */
    public function getArgumentDefaults()
    {
        $values = [];
        foreach ($this->arguments as $argument) {
            $values[$argument->getName()] = $argument->getDefault();
        }
        return $values;
    }
    /**
     * Sets the InputOption objects.
     *
     * @param InputOption[] $options An array of InputOption objects
     */
    public function setOptions($options = [])
    {
        $this->options = [];
        $this->shortcuts = [];
        $this->addOptions($options);
    }
    /**
     * Adds an array of InputOption objects.
     *
     * @param InputOption[] $options An array of InputOption objects
     */
    public function addOptions($options = [])
    {
        foreach ($options as $option) {
            $this->addOption($option);
        }
    }
    /**
     * @throws LogicException When option given already exist
     */
    public function addOption(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption $option)
    {
        if (isset($this->options[$option->getName()]) && !$option->equals($this->options[$option->getName()])) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\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 \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\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();
            }
        }
    }
    /**
     * Returns an InputOption by name.
     *
     * @param string $name The InputOption name
     *
     * @return InputOption A InputOption object
     *
     * @throws InvalidArgumentException When option given doesn't exist
     */
    public function getOption($name)
    {
        if (!$this->hasOption($name)) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('The "--%s" option does not exist.', $name));
        }
        return $this->options[$name];
    }
    /**
     * Returns true if an InputOption object exists by name.
     *
     * This method can't be used to check if the user included the option when
     * executing the command (use getOption() instead).
     *
     * @param string $name The InputOption name
     *
     * @return bool true if the InputOption object exists, false otherwise
     */
    public function hasOption($name)
    {
        return isset($this->options[$name]);
    }
    /**
     * Gets the array of InputOption objects.
     *
     * @return InputOption[] An array of InputOption objects
     */
    public function getOptions()
    {
        return $this->options;
    }
    /**
     * Returns true if an InputOption object exists by shortcut.
     *
     * @param string $name The InputOption shortcut
     *
     * @return bool true if the InputOption object exists, false otherwise
     */
    public function hasShortcut($name)
    {
        return isset($this->shortcuts[$name]);
    }
    /**
     * Gets an InputOption by shortcut.
     *
     * @param string $shortcut The Shortcut name
     *
     * @return InputOption An InputOption object
     */
    public function getOptionForShortcut($shortcut)
    {
        return $this->getOption($this->shortcutToName($shortcut));
    }
    /**
     * Gets an array of default values.
     *
     * @return array An array of all default values
     */
    public function getOptionDefaults()
    {
        $values = [];
        foreach ($this->options as $option) {
            $values[$option->getName()] = $option->getDefault();
        }
        return $values;
    }
    /**
     * Returns the InputOption name given a shortcut.
     *
     * @param string $shortcut The shortcut
     *
     * @return string The InputOption name
     *
     * @throws InvalidArgumentException When option given does not exist
     *
     * @internal
     */
    public function shortcutToName($shortcut)
    {
        if (!isset($this->shortcuts[$shortcut])) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('The "-%s" option does not exist.', $shortcut));
        }
        return $this->shortcuts[$shortcut];
    }
    /**
     * Gets the synopsis.
     *
     * @param bool $short Whether to return the short version (with options folded) or not
     *
     * @return string The synopsis
     */
    public function getSynopsis($short = \false)
    {
        $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()) : '';
                $elements[] = \sprintf('[%s--%s%s]', $shortcut, $option->getName(), $value);
            }
        }
        if (\count($elements) && $this->getArguments()) {
            $elements[] = '[--]';
        }
        foreach ($this->getArguments() as $argument) {
            $element = '<' . $argument->getName() . '>';
            if (!$argument->isRequired()) {
                $element = '[' . $element . ']';
            } elseif ($argument->isArray()) {
                $element .= ' (' . $element . ')';
            }
            if ($argument->isArray()) {
                $element .= '...';
            }
            $elements[] = $element;
        }
        return \implode(' ', $elements);
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Input;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException;
/**
 * StringInput represents an input provided as a string.
 *
 * Usage:
 *
 *     $input = new StringInput('foo --bar="foobar"');
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class StringInput extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\ArgvInput
{
    const REGEX_STRING = '([^\\s]+?)(?:\\s|(?<!\\\\)"|(?<!\\\\)\'|$)';
    const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\')';
    /**
     * @param string $input A string representing the parameters from the CLI
     */
    public function __construct($input)
    {
        parent::__construct([]);
        $this->setTokens($this->tokenize($input));
    }
    /**
     * Tokenizes a string.
     *
     * @param string $input The input to tokenize
     *
     * @return array An array of tokens
     *
     * @throws InvalidArgumentException When unable to parse input (should never happen)
     */
    private function tokenize($input)
    {
        $tokens = [];
        $length = \strlen($input);
        $cursor = 0;
        while ($cursor < $length) {
            if (\preg_match('/\\s+/A', $input, $match, null, $cursor)) {
            } elseif (\preg_match('/([^="\'\\s]+?)(=?)(' . self::REGEX_QUOTED_STRING . '+)/A', $input, $match, null, $cursor)) {
                $tokens[] = $match[1] . $match[2] . \stripcslashes(\str_replace(['"\'', '\'"', '\'\'', '""'], '', \substr($match[3], 1, \strlen($match[3]) - 2)));
            } elseif (\preg_match('/' . self::REGEX_QUOTED_STRING . '/A', $input, $match, null, $cursor)) {
                $tokens[] = \stripcslashes(\substr($match[0], 1, \strlen($match[0]) - 2));
            } elseif (\preg_match('/' . self::REGEX_STRING . '/A', $input, $match, null, $cursor)) {
                $tokens[] = \stripcslashes($match[1]);
            } else {
                // should never happen
                throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('Unable to parse input near "... %s ..."', \substr($input, $cursor, 10)));
            }
            $cursor += \strlen($match[0]);
        }
        return $tokens;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Input;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\RuntimeException;
/**
 * Input is the base class for all concrete Input classes.
 *
 * Three concrete classes are provided by default:
 *
 *  * `ArgvInput`: The input comes from the CLI arguments (argv)
 *  * `StringInput`: The input is provided as a string
 *  * `ArrayInput`: The input is provided as an array
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class Input implements \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface, \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\StreamableInputInterface
{
    protected $definition;
    protected $stream;
    protected $options = [];
    protected $arguments = [];
    protected $interactive = \true;
    public function __construct(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition $definition = null)
    {
        if (null === $definition) {
            $this->definition = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition();
        } else {
            $this->bind($definition);
            $this->validate();
        }
    }
    /**
     * {@inheritdoc}
     */
    public function bind(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition $definition)
    {
        $this->arguments = [];
        $this->options = [];
        $this->definition = $definition;
        $this->parse();
    }
    /**
     * Processes command line arguments.
     */
    protected abstract function parse();
    /**
     * {@inheritdoc}
     */
    public function validate()
    {
        $definition = $this->definition;
        $givenArguments = $this->arguments;
        $missingArguments = \array_filter(\array_keys($definition->getArguments()), function ($argument) use($definition, $givenArguments) {
            return !\array_key_exists($argument, $givenArguments) && $definition->getArgument($argument)->isRequired();
        });
        if (\count($missingArguments) > 0) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\RuntimeException(\sprintf('Not enough arguments (missing: "%s").', \implode(', ', $missingArguments)));
        }
    }
    /**
     * {@inheritdoc}
     */
    public function isInteractive()
    {
        return $this->interactive;
    }
    /**
     * {@inheritdoc}
     */
    public function setInteractive($interactive)
    {
        $this->interactive = (bool) $interactive;
    }
    /**
     * {@inheritdoc}
     */
    public function getArguments()
    {
        return \array_merge($this->definition->getArgumentDefaults(), $this->arguments);
    }
    /**
     * {@inheritdoc}
     */
    public function getArgument($name)
    {
        if (!$this->definition->hasArgument($name)) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('The "%s" argument does not exist.', $name));
        }
        return isset($this->arguments[$name]) ? $this->arguments[$name] : $this->definition->getArgument($name)->getDefault();
    }
    /**
     * {@inheritdoc}
     */
    public function setArgument($name, $value)
    {
        if (!$this->definition->hasArgument($name)) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('The "%s" argument does not exist.', $name));
        }
        $this->arguments[$name] = $value;
    }
    /**
     * {@inheritdoc}
     */
    public function hasArgument($name)
    {
        return $this->definition->hasArgument($name);
    }
    /**
     * {@inheritdoc}
     */
    public function getOptions()
    {
        return \array_merge($this->definition->getOptionDefaults(), $this->options);
    }
    /**
     * {@inheritdoc}
     */
    public function getOption($name)
    {
        if (!$this->definition->hasOption($name)) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('The "%s" option does not exist.', $name));
        }
        return \array_key_exists($name, $this->options) ? $this->options[$name] : $this->definition->getOption($name)->getDefault();
    }
    /**
     * {@inheritdoc}
     */
    public function setOption($name, $value)
    {
        if (!$this->definition->hasOption($name)) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('The "%s" option does not exist.', $name));
        }
        $this->options[$name] = $value;
    }
    /**
     * {@inheritdoc}
     */
    public function hasOption($name)
    {
        return $this->definition->hasOption($name);
    }
    /**
     * Escapes a token through escapeshellarg if it contains unsafe chars.
     *
     * @param string $token
     *
     * @return string
     */
    public function escapeToken($token)
    {
        return \preg_match('{^[\\w-]+$}', $token) ? $token : \escapeshellarg($token);
    }
    /**
     * {@inheritdoc}
     */
    public function setStream($stream)
    {
        $this->stream = $stream;
    }
    /**
     * {@inheritdoc}
     */
    public function getStream()
    {
        return $this->stream;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Input;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\RuntimeException;
/**
 * InputInterface is the interface implemented by all input classes.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface InputInterface
{
    /**
     * Returns the first argument from the raw parameters (not parsed).
     *
     * @return string|null The value of the first argument or null otherwise
     */
    public function getFirstArgument();
    /**
     * Returns true if the raw parameters (not parsed) contain a value.
     *
     * This method is to be used to introspect the input parameters
     * before they have been validated. It must be used carefully.
     * Does not necessarily return the correct result for short options
     * when multiple flags are combined in the same option.
     *
     * @param string|array $values     The values to look for in the raw parameters (can be an array)
     * @param bool         $onlyParams Only check real parameters, skip those following an end of options (--) signal
     *
     * @return bool true if the value is contained in the raw parameters
     */
    public function hasParameterOption($values, $onlyParams = \false);
    /**
     * Returns the value of a raw option (not parsed).
     *
     * This method is to be used to introspect the input parameters
     * before they have been validated. It must be used carefully.
     * Does not necessarily return the correct result for short options
     * when multiple flags are combined in the same option.
     *
     * @param string|array $values     The value(s) to look for in the raw parameters (can be an array)
     * @param mixed        $default    The default value to return if no result is found
     * @param bool         $onlyParams Only check real parameters, skip those following an end of options (--) signal
     *
     * @return mixed The option value
     */
    public function getParameterOption($values, $default = \false, $onlyParams = \false);
    /**
     * Binds the current Input instance with the given arguments and options.
     *
     * @throws RuntimeException
     */
    public function bind(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition $definition);
    /**
     * Validates the input.
     *
     * @throws RuntimeException When not enough arguments are given
     */
    public function validate();
    /**
     * Returns all the given arguments merged with the default values.
     *
     * @return array
     */
    public function getArguments();
    /**
     * Returns the argument value for a given argument name.
     *
     * @param string $name The argument name
     *
     * @return string|string[]|null The argument value
     *
     * @throws InvalidArgumentException When argument given doesn't exist
     */
    public function getArgument($name);
    /**
     * Sets an argument value by name.
     *
     * @param string               $name  The argument name
     * @param string|string[]|null $value The argument value
     *
     * @throws InvalidArgumentException When argument given doesn't exist
     */
    public function setArgument($name, $value);
    /**
     * Returns true if an InputArgument object exists by name or position.
     *
     * @param string|int $name The InputArgument name or position
     *
     * @return bool true if the InputArgument object exists, false otherwise
     */
    public function hasArgument($name);
    /**
     * Returns all the given options merged with the default values.
     *
     * @return array
     */
    public function getOptions();
    /**
     * Returns the option value for a given option name.
     *
     * @param string $name The option name
     *
     * @return string|string[]|bool|null The option value
     *
     * @throws InvalidArgumentException When option given doesn't exist
     */
    public function getOption($name);
    /**
     * Sets an option value by name.
     *
     * @param string                    $name  The option name
     * @param string|string[]|bool|null $value The option value
     *
     * @throws InvalidArgumentException When option given doesn't exist
     */
    public function setOption($name, $value);
    /**
     * Returns true if an InputOption object exists by name.
     *
     * @param string $name The InputOption name
     *
     * @return bool true if the InputOption object exists, false otherwise
     */
    public function hasOption($name);
    /**
     * Is this input means interactive?
     *
     * @return bool
     */
    public function isInteractive();
    /**
     * Sets the input interactivity.
     *
     * @param bool $interactive If the input should be interactive
     */
    public function setInteractive($interactive);
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console;

class Terminal
{
    private static $width;
    private static $height;
    /**
     * Gets the terminal width.
     *
     * @return int
     */
    public function getWidth()
    {
        $width = \getenv('COLUMNS');
        if (\false !== $width) {
            return (int) \trim($width);
        }
        if (null === self::$width) {
            self::initDimensions();
        }
        return self::$width ?: 80;
    }
    /**
     * Gets the terminal height.
     *
     * @return int
     */
    public function getHeight()
    {
        $height = \getenv('LINES');
        if (\false !== $height) {
            return (int) \trim($height);
        }
        if (null === self::$height) {
            self::initDimensions();
        }
        return self::$height ?: 50;
    }
    private static function initDimensions()
    {
        if ('\\' === \DIRECTORY_SEPARATOR) {
            if (\preg_match('/^(\\d+)x(\\d+)(?: \\((\\d+)x(\\d+)\\))?$/', \trim(\getenv('ANSICON')), $matches)) {
                // extract [w, H] from "wxh (WxH)"
                // or [w, h] from "wxh"
                self::$width = (int) $matches[1];
                self::$height = isset($matches[4]) ? (int) $matches[4] : (int) $matches[2];
            } elseif (null !== ($dimensions = self::getConsoleMode())) {
                // extract [w, h] from "wxh"
                self::$width = (int) $dimensions[0];
                self::$height = (int) $dimensions[1];
            }
        } elseif ($sttyString = self::getSttyColumns()) {
            if (\preg_match('/rows.(\\d+);.columns.(\\d+);/i', $sttyString, $matches)) {
                // extract [w, h] from "rows h; columns w;"
                self::$width = (int) $matches[2];
                self::$height = (int) $matches[1];
            } elseif (\preg_match('/;.(\\d+).rows;.(\\d+).columns/i', $sttyString, $matches)) {
                // extract [w, h] from "; h rows; w columns"
                self::$width = (int) $matches[2];
                self::$height = (int) $matches[1];
            }
        }
    }
    /**
     * Runs and parses mode CON if it's available, suppressing any error output.
     *
     * @return int[]|null An array composed of the width and the height or null if it could not be parsed
     */
    private static function getConsoleMode()
    {
        if (!\function_exists('proc_open')) {
            return;
        }
        $descriptorspec = [1 => ['pipe', 'w'], 2 => ['pipe', 'w']];
        $process = \proc_open('mode CON', $descriptorspec, $pipes, null, null, ['suppress_errors' => \true]);
        if (\is_resource($process)) {
            $info = \stream_get_contents($pipes[1]);
            \fclose($pipes[1]);
            \fclose($pipes[2]);
            \proc_close($process);
            if (\preg_match('/--------+\\r?\\n.+?(\\d+)\\r?\\n.+?(\\d+)\\r?\\n/', $info, $matches)) {
                return [(int) $matches[2], (int) $matches[1]];
            }
        }
    }
    /**
     * Runs and parses stty -a if it's available, suppressing any error output.
     *
     * @return string|null
     */
    private static function getSttyColumns()
    {
        if (!\function_exists('proc_open')) {
            return;
        }
        $descriptorspec = [1 => ['pipe', 'w'], 2 => ['pipe', 'w']];
        $process = \proc_open('stty -a | grep columns', $descriptorspec, $pipes, null, null, ['suppress_errors' => \true]);
        if (\is_resource($process)) {
            $info = \stream_get_contents($pipes[1]);
            \fclose($pipes[1]);
            \fclose($pipes[2]);
            \proc_close($process);
            return $info;
        }
    }
}
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

/*
 * 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 _HumbugBoxb94336daae36\Symfony\Component\Console\Output;

/**
 * ConsoleOutputInterface is the interface implemented by ConsoleOutput class.
 * This adds information about stderr output stream.
 *
 * @author Dariusz Górecki <darek.krk@gmail.com>
 */
interface ConsoleOutputInterface extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface
{
    /**
     * Gets the OutputInterface for errors.
     *
     * @return OutputInterface
     */
    public function getErrorOutput();
    public function setErrorOutput(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $error);
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Output;

/**
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class BufferedOutput extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\Output
{
    private $buffer = '';
    /**
     * Empties buffer and returns its content.
     *
     * @return string
     */
    public function fetch()
    {
        $content = $this->buffer;
        $this->buffer = '';
        return $content;
    }
    /**
     * {@inheritdoc}
     */
    protected function doWrite($message, $newline)
    {
        $this->buffer .= $message;
        if ($newline) {
            $this->buffer .= \PHP_EOL;
        }
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Output;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterInterface;
/**
 * OutputInterface is the interface implemented by all Output classes.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface OutputInterface
{
    const VERBOSITY_QUIET = 16;
    const VERBOSITY_NORMAL = 32;
    const VERBOSITY_VERBOSE = 64;
    const VERBOSITY_VERY_VERBOSE = 128;
    const VERBOSITY_DEBUG = 256;
    const OUTPUT_NORMAL = 1;
    const OUTPUT_RAW = 2;
    const OUTPUT_PLAIN = 4;
    /**
     * Writes a message to the output.
     *
     * @param string|array $messages The message as an array of strings or a single string
     * @param bool         $newline  Whether to add a newline
     * @param int          $options  A bitmask of options (one of the OUTPUT or VERBOSITY constants), 0 is considered the same as self::OUTPUT_NORMAL | self::VERBOSITY_NORMAL
     */
    public function write($messages, $newline = \false, $options = 0);
    /**
     * Writes a message to the output and adds a newline at the end.
     *
     * @param string|array $messages The message as an array of strings or a single string
     * @param int          $options  A bitmask of options (one of the OUTPUT or VERBOSITY constants), 0 is considered the same as self::OUTPUT_NORMAL | self::VERBOSITY_NORMAL
     */
    public function writeln($messages, $options = 0);
    /**
     * Sets the verbosity of the output.
     *
     * @param int $level The level of verbosity (one of the VERBOSITY constants)
     */
    public function setVerbosity($level);
    /**
     * Gets the current verbosity of the output.
     *
     * @return int The current level of verbosity (one of the VERBOSITY constants)
     */
    public function getVerbosity();
    /**
     * Returns whether verbosity is quiet (-q).
     *
     * @return bool true if verbosity is set to VERBOSITY_QUIET, false otherwise
     */
    public function isQuiet();
    /**
     * Returns whether verbosity is verbose (-v).
     *
     * @return bool true if verbosity is set to VERBOSITY_VERBOSE, false otherwise
     */
    public function isVerbose();
    /**
     * Returns whether verbosity is very verbose (-vv).
     *
     * @return bool true if verbosity is set to VERBOSITY_VERY_VERBOSE, false otherwise
     */
    public function isVeryVerbose();
    /**
     * Returns whether verbosity is debug (-vvv).
     *
     * @return bool true if verbosity is set to VERBOSITY_DEBUG, false otherwise
     */
    public function isDebug();
    /**
     * Sets the decorated flag.
     *
     * @param bool $decorated Whether to decorate the messages
     */
    public function setDecorated($decorated);
    /**
     * Gets the decorated flag.
     *
     * @return bool true if the output will decorate messages, false otherwise
     */
    public function isDecorated();
    public function setFormatter(\_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterInterface $formatter);
    /**
     * Returns current output formatter instance.
     *
     * @return OutputFormatterInterface
     */
    public function getFormatter();
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Output;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatter;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterInterface;
/**
 * Base class for output classes.
 *
 * There are five levels of verbosity:
 *
 *  * normal: no option passed (normal output)
 *  * verbose: -v (more output)
 *  * very verbose: -vv (highly extended output)
 *  * debug: -vvv (all debug output)
 *  * quiet: -q (no output)
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class Output implements \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface
{
    private $verbosity;
    private $formatter;
    /**
     * @param int                           $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)
     * @param bool                          $decorated Whether to decorate messages
     * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter)
     */
    public function __construct($verbosity = self::VERBOSITY_NORMAL, $decorated = \false, \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterInterface $formatter = null)
    {
        $this->verbosity = null === $verbosity ? self::VERBOSITY_NORMAL : $verbosity;
        $this->formatter = $formatter ?: new \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatter();
        $this->formatter->setDecorated($decorated);
    }
    /**
     * {@inheritdoc}
     */
    public function setFormatter(\_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterInterface $formatter)
    {
        $this->formatter = $formatter;
    }
    /**
     * {@inheritdoc}
     */
    public function getFormatter()
    {
        return $this->formatter;
    }
    /**
     * {@inheritdoc}
     */
    public function setDecorated($decorated)
    {
        $this->formatter->setDecorated($decorated);
    }
    /**
     * {@inheritdoc}
     */
    public function isDecorated()
    {
        return $this->formatter->isDecorated();
    }
    /**
     * {@inheritdoc}
     */
    public function setVerbosity($level)
    {
        $this->verbosity = (int) $level;
    }
    /**
     * {@inheritdoc}
     */
    public function getVerbosity()
    {
        return $this->verbosity;
    }
    /**
     * {@inheritdoc}
     */
    public function isQuiet()
    {
        return self::VERBOSITY_QUIET === $this->verbosity;
    }
    /**
     * {@inheritdoc}
     */
    public function isVerbose()
    {
        return self::VERBOSITY_VERBOSE <= $this->verbosity;
    }
    /**
     * {@inheritdoc}
     */
    public function isVeryVerbose()
    {
        return self::VERBOSITY_VERY_VERBOSE <= $this->verbosity;
    }
    /**
     * {@inheritdoc}
     */
    public function isDebug()
    {
        return self::VERBOSITY_DEBUG <= $this->verbosity;
    }
    /**
     * {@inheritdoc}
     */
    public function writeln($messages, $options = self::OUTPUT_NORMAL)
    {
        $this->write($messages, \true, $options);
    }
    /**
     * {@inheritdoc}
     */
    public function write($messages, $newline = \false, $options = self::OUTPUT_NORMAL)
    {
        $messages = (array) $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 \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::OUTPUT_NORMAL:
                    $message = $this->formatter->format($message);
                    break;
                case \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::OUTPUT_RAW:
                    break;
                case \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::OUTPUT_PLAIN:
                    $message = \strip_tags($this->formatter->format($message));
                    break;
            }
            $this->doWrite($message, $newline);
        }
    }
    /**
     * Writes a message to the output.
     *
     * @param string $message A message to write to the output
     * @param bool   $newline Whether to add a newline or not
     */
    protected abstract function doWrite($message, $newline);
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Output;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterInterface;
/**
 * ConsoleOutput is the default class for all CLI output. It uses STDOUT and STDERR.
 *
 * This class is a convenient wrapper around `StreamOutput` for both STDOUT and STDERR.
 *
 *     $output = new ConsoleOutput();
 *
 * This is equivalent to:
 *
 *     $output = new StreamOutput(fopen('php://stdout', 'w'));
 *     $stdErr = new StreamOutput(fopen('php://stderr', 'w'));
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ConsoleOutput extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\StreamOutput implements \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\ConsoleOutputInterface
{
    private $stderr;
    /**
     * @param int                           $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)
     * @param bool|null                     $decorated Whether to decorate messages (null for auto-guessing)
     * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter)
     */
    public function __construct($verbosity = self::VERBOSITY_NORMAL, $decorated = null, \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterInterface $formatter = null)
    {
        parent::__construct($this->openOutputStream(), $verbosity, $decorated, $formatter);
        $actualDecorated = $this->isDecorated();
        $this->stderr = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\StreamOutput($this->openErrorStream(), $verbosity, $decorated, $this->getFormatter());
        if (null === $decorated) {
            $this->setDecorated($actualDecorated && $this->stderr->isDecorated());
        }
    }
    /**
     * {@inheritdoc}
     */
    public function setDecorated($decorated)
    {
        parent::setDecorated($decorated);
        $this->stderr->setDecorated($decorated);
    }
    /**
     * {@inheritdoc}
     */
    public function setFormatter(\_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterInterface $formatter)
    {
        parent::setFormatter($formatter);
        $this->stderr->setFormatter($formatter);
    }
    /**
     * {@inheritdoc}
     */
    public function setVerbosity($level)
    {
        parent::setVerbosity($level);
        $this->stderr->setVerbosity($level);
    }
    /**
     * {@inheritdoc}
     */
    public function getErrorOutput()
    {
        return $this->stderr;
    }
    /**
     * {@inheritdoc}
     */
    public function setErrorOutput(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $error)
    {
        $this->stderr = $error;
    }
    /**
     * Returns true if current environment supports writing console output to
     * STDOUT.
     *
     * @return bool
     */
    protected function hasStdoutSupport()
    {
        return \false === $this->isRunningOS400();
    }
    /**
     * Returns true if current environment supports writing console output to
     * STDERR.
     *
     * @return bool
     */
    protected function hasStderrSupport()
    {
        return \false === $this->isRunningOS400();
    }
    /**
     * Checks if current executing environment is IBM iSeries (OS400), which
     * doesn't properly convert character-encodings between ASCII to EBCDIC.
     *
     * @return bool
     */
    private function isRunningOS400()
    {
        $checks = [\function_exists('php_uname') ? \php_uname('s') : '', \getenv('OSTYPE'), \PHP_OS];
        return \false !== \stripos(\implode(';', $checks), 'OS400');
    }
    /**
     * @return resource
     */
    private function openOutputStream()
    {
        if (!$this->hasStdoutSupport()) {
            return \fopen('php://output', 'w');
        }
        return @\fopen('php://stdout', 'w') ?: \fopen('php://output', 'w');
    }
    /**
     * @return resource
     */
    private function openErrorStream()
    {
        return \fopen($this->hasStderrSupport() ? 'php://stderr' : 'php://output', 'w');
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Output;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatter;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterInterface;
/**
 * NullOutput suppresses all output.
 *
 *     $output = new NullOutput();
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Tobias Schultze <http://tobion.de>
 */
class NullOutput implements \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface
{
    /**
     * {@inheritdoc}
     */
    public function setFormatter(\_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterInterface $formatter)
    {
        // do nothing
    }
    /**
     * {@inheritdoc}
     */
    public function getFormatter()
    {
        // to comply with the interface we must return a OutputFormatterInterface
        return new \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatter();
    }
    /**
     * {@inheritdoc}
     */
    public function setDecorated($decorated)
    {
        // do nothing
    }
    /**
     * {@inheritdoc}
     */
    public function isDecorated()
    {
        return \false;
    }
    /**
     * {@inheritdoc}
     */
    public function setVerbosity($level)
    {
        // do nothing
    }
    /**
     * {@inheritdoc}
     */
    public function getVerbosity()
    {
        return self::VERBOSITY_QUIET;
    }
    /**
     * {@inheritdoc}
     */
    public function isQuiet()
    {
        return \true;
    }
    /**
     * {@inheritdoc}
     */
    public function isVerbose()
    {
        return \false;
    }
    /**
     * {@inheritdoc}
     */
    public function isVeryVerbose()
    {
        return \false;
    }
    /**
     * {@inheritdoc}
     */
    public function isDebug()
    {
        return \false;
    }
    /**
     * {@inheritdoc}
     */
    public function writeln($messages, $options = self::OUTPUT_NORMAL)
    {
        // do nothing
    }
    /**
     * {@inheritdoc}
     */
    public function write($messages, $newline = \false, $options = self::OUTPUT_NORMAL)
    {
        // do nothing
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Output;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\RuntimeException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterInterface;
/**
 * StreamOutput writes the output to a given stream.
 *
 * Usage:
 *
 *     $output = new StreamOutput(fopen('php://stdout', 'w'));
 *
 * As `StreamOutput` can use any stream, you can also use a file:
 *
 *     $output = new StreamOutput(fopen('/path/to/output.log', 'a', false));
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class StreamOutput extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\Output
{
    private $stream;
    /**
     * @param resource                      $stream    A stream resource
     * @param int                           $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)
     * @param bool|null                     $decorated Whether to decorate messages (null for auto-guessing)
     * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter)
     *
     * @throws InvalidArgumentException When first argument is not a real stream
     */
    public function __construct($stream, $verbosity = self::VERBOSITY_NORMAL, $decorated = null, \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterInterface $formatter = null)
    {
        if (!\is_resource($stream) || 'stream' !== \get_resource_type($stream)) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException('The StreamOutput class needs a stream as its first argument.');
        }
        $this->stream = $stream;
        if (null === $decorated) {
            $decorated = $this->hasColorSupport();
        }
        parent::__construct($verbosity, $decorated, $formatter);
    }
    /**
     * Gets the stream attached to this StreamOutput instance.
     *
     * @return resource A stream resource
     */
    public function getStream()
    {
        return $this->stream;
    }
    /**
     * {@inheritdoc}
     */
    protected function doWrite($message, $newline)
    {
        if ($newline) {
            $message .= \PHP_EOL;
        }
        if (\false === @\fwrite($this->stream, $message)) {
            // should never happen
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\RuntimeException('Unable to write output.');
        }
        \fflush($this->stream);
    }
    /**
     * Returns true if the stream supports colorization.
     *
     * Colorization is disabled if not supported by the stream:
     *
     * This is tricky on Windows, because Cygwin, Msys2 etc emulate pseudo
     * terminals via named pipes, so we can only check the environment.
     *
     * Reference: Composer\XdebugHandler\Process::supportsColor
     * https://github.com/composer/xdebug-handler
     *
     * @return bool true if the stream supports colorization, false otherwise
     */
    protected function hasColorSupport()
    {
        if ('Hyper' === \getenv('TERM_PROGRAM')) {
            return \true;
        }
        if (\DIRECTORY_SEPARATOR === '\\') {
            return \function_exists('_HumbugBoxb94336daae36\\sapi_windows_vt100_support') && @sapi_windows_vt100_support($this->stream) || \false !== \getenv('ANSICON') || 'ON' === \getenv('ConEmuANSI') || 'xterm' === \getenv('TERM');
        }
        if (\function_exists('stream_isatty')) {
            return @\stream_isatty($this->stream);
        }
        if (\function_exists('posix_isatty')) {
            return @\posix_isatty($this->stream);
        }
        $stat = @\fstat($this->stream);
        // Check if formatted mode is S_IFCHR
        return $stat ? 020000 === ($stat['mode'] & 0170000) : \false;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Style;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Helper\ProgressBar;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\ConsoleOutputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
/**
 * Decorates output to add console style guide helpers.
 *
 * @author Kevin Bond <kevinbond@gmail.com>
 */
abstract class OutputStyle implements \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface, \_HumbugBoxb94336daae36\Symfony\Component\Console\Style\StyleInterface
{
    private $output;
    public function __construct(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output)
    {
        $this->output = $output;
    }
    /**
     * {@inheritdoc}
     */
    public function newLine($count = 1)
    {
        $this->output->write(\str_repeat(\PHP_EOL, $count));
    }
    /**
     * @param int $max
     *
     * @return ProgressBar
     */
    public function createProgressBar($max = 0)
    {
        return new \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\ProgressBar($this->output, $max);
    }
    /**
     * {@inheritdoc}
     */
    public function write($messages, $newline = \false, $type = self::OUTPUT_NORMAL)
    {
        $this->output->write($messages, $newline, $type);
    }
    /**
     * {@inheritdoc}
     */
    public function writeln($messages, $type = self::OUTPUT_NORMAL)
    {
        $this->output->writeln($messages, $type);
    }
    /**
     * {@inheritdoc}
     */
    public function setVerbosity($level)
    {
        $this->output->setVerbosity($level);
    }
    /**
     * {@inheritdoc}
     */
    public function getVerbosity()
    {
        return $this->output->getVerbosity();
    }
    /**
     * {@inheritdoc}
     */
    public function setDecorated($decorated)
    {
        $this->output->setDecorated($decorated);
    }
    /**
     * {@inheritdoc}
     */
    public function isDecorated()
    {
        return $this->output->isDecorated();
    }
    /**
     * {@inheritdoc}
     */
    public function setFormatter(\_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterInterface $formatter)
    {
        $this->output->setFormatter($formatter);
    }
    /**
     * {@inheritdoc}
     */
    public function getFormatter()
    {
        return $this->output->getFormatter();
    }
    /**
     * {@inheritdoc}
     */
    public function isQuiet()
    {
        return $this->output->isQuiet();
    }
    /**
     * {@inheritdoc}
     */
    public function isVerbose()
    {
        return $this->output->isVerbose();
    }
    /**
     * {@inheritdoc}
     */
    public function isVeryVerbose()
    {
        return $this->output->isVeryVerbose();
    }
    /**
     * {@inheritdoc}
     */
    public function isDebug()
    {
        return $this->output->isDebug();
    }
    protected function getErrorOutput()
    {
        if (!$this->output instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\ConsoleOutputInterface) {
            return $this->output;
        }
        return $this->output->getErrorOutput();
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Style;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\RuntimeException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatter;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Helper\ProgressBar;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Helper\SymfonyQuestionHelper;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Table;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\BufferedOutput;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Question\ChoiceQuestion;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Question\ConfirmationQuestion;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Question\Question;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Terminal;
/**
 * Output decorator helpers for the Symfony Style Guide.
 *
 * @author Kevin Bond <kevinbond@gmail.com>
 */
class SymfonyStyle extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Style\OutputStyle
{
    const MAX_LINE_LENGTH = 120;
    private $input;
    private $questionHelper;
    private $progressBar;
    private $lineLength;
    private $bufferedOutput;
    public function __construct(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output)
    {
        $this->input = $input;
        $this->bufferedOutput = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\BufferedOutput($output->getVerbosity(), \false, clone $output->getFormatter());
        // Windows cmd wraps lines as soon as the terminal width is reached, whether there are following chars or not.
        $width = (new \_HumbugBoxb94336daae36\Symfony\Component\Console\Terminal())->getWidth() ?: self::MAX_LINE_LENGTH;
        $this->lineLength = \min($width - (int) (\DIRECTORY_SEPARATOR === '\\'), self::MAX_LINE_LENGTH);
        parent::__construct($output);
    }
    /**
     * Formats a message as a block of text.
     *
     * @param string|array $messages The message to write in the block
     * @param string|null  $type     The block type (added in [] on first line)
     * @param string|null  $style    The style to apply to the whole block
     * @param string       $prefix   The prefix for the block
     * @param bool         $padding  Whether to add vertical padding
     * @param bool         $escape   Whether to escape the message
     */
    public function block($messages, $type = null, $style = null, $prefix = ' ', $padding = \false, $escape = \true)
    {
        $messages = \is_array($messages) ? \array_values($messages) : [$messages];
        $this->autoPrependBlock();
        $this->writeln($this->createBlock($messages, $type, $style, $prefix, $padding, $escape));
        $this->newLine();
    }
    /**
     * {@inheritdoc}
     */
    public function title($message)
    {
        $this->autoPrependBlock();
        $this->writeln([\sprintf('<comment>%s</>', \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatter::escapeTrailingBackslash($message)), \sprintf('<comment>%s</>', \str_repeat('=', \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlenWithoutDecoration($this->getFormatter(), $message)))]);
        $this->newLine();
    }
    /**
     * {@inheritdoc}
     */
    public function section($message)
    {
        $this->autoPrependBlock();
        $this->writeln([\sprintf('<comment>%s</>', \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatter::escapeTrailingBackslash($message)), \sprintf('<comment>%s</>', \str_repeat('-', \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlenWithoutDecoration($this->getFormatter(), $message)))]);
        $this->newLine();
    }
    /**
     * {@inheritdoc}
     */
    public function listing(array $elements)
    {
        $this->autoPrependText();
        $elements = \array_map(function ($element) {
            return \sprintf(' * %s', $element);
        }, $elements);
        $this->writeln($elements);
        $this->newLine();
    }
    /**
     * {@inheritdoc}
     */
    public function text($message)
    {
        $this->autoPrependText();
        $messages = \is_array($message) ? \array_values($message) : [$message];
        foreach ($messages as $message) {
            $this->writeln(\sprintf(' %s', $message));
        }
    }
    /**
     * Formats a command comment.
     *
     * @param string|array $message
     */
    public function comment($message)
    {
        $this->block($message, null, null, '<fg=default;bg=default> // </>', \false, \false);
    }
    /**
     * {@inheritdoc}
     */
    public function success($message)
    {
        $this->block($message, 'OK', 'fg=black;bg=green', ' ', \true);
    }
    /**
     * {@inheritdoc}
     */
    public function error($message)
    {
        $this->block($message, 'ERROR', 'fg=white;bg=red', ' ', \true);
    }
    /**
     * {@inheritdoc}
     */
    public function warning($message)
    {
        $this->block($message, 'WARNING', 'fg=white;bg=red', ' ', \true);
    }
    /**
     * {@inheritdoc}
     */
    public function note($message)
    {
        $this->block($message, 'NOTE', 'fg=yellow', ' ! ');
    }
    /**
     * {@inheritdoc}
     */
    public function caution($message)
    {
        $this->block($message, 'CAUTION', 'fg=white;bg=red', ' ! ', \true);
    }
    /**
     * {@inheritdoc}
     */
    public function table(array $headers, array $rows)
    {
        $style = clone \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Table::getStyleDefinition('symfony-style-guide');
        $style->setCellHeaderFormat('<info>%s</info>');
        $table = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Table($this);
        $table->setHeaders($headers);
        $table->setRows($rows);
        $table->setStyle($style);
        $table->render();
        $this->newLine();
    }
    /**
     * {@inheritdoc}
     */
    public function ask($question, $default = null, $validator = null)
    {
        $question = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Question\Question($question, $default);
        $question->setValidator($validator);
        return $this->askQuestion($question);
    }
    /**
     * {@inheritdoc}
     */
    public function askHidden($question, $validator = null)
    {
        $question = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Question\Question($question);
        $question->setHidden(\true);
        $question->setValidator($validator);
        return $this->askQuestion($question);
    }
    /**
     * {@inheritdoc}
     */
    public function confirm($question, $default = \true)
    {
        return $this->askQuestion(new \_HumbugBoxb94336daae36\Symfony\Component\Console\Question\ConfirmationQuestion($question, $default));
    }
    /**
     * {@inheritdoc}
     */
    public function choice($question, array $choices, $default = null)
    {
        if (null !== $default) {
            $values = \array_flip($choices);
            $default = $values[$default];
        }
        return $this->askQuestion(new \_HumbugBoxb94336daae36\Symfony\Component\Console\Question\ChoiceQuestion($question, $choices, $default));
    }
    /**
     * {@inheritdoc}
     */
    public function progressStart($max = 0)
    {
        $this->progressBar = $this->createProgressBar($max);
        $this->progressBar->start();
    }
    /**
     * {@inheritdoc}
     */
    public function progressAdvance($step = 1)
    {
        $this->getProgressBar()->advance($step);
    }
    /**
     * {@inheritdoc}
     */
    public function progressFinish()
    {
        $this->getProgressBar()->finish();
        $this->newLine(2);
        $this->progressBar = null;
    }
    /**
     * {@inheritdoc}
     */
    public function createProgressBar($max = 0)
    {
        $progressBar = parent::createProgressBar($max);
        if ('\\' !== \DIRECTORY_SEPARATOR || 'Hyper' === \getenv('TERM_PROGRAM')) {
            $progressBar->setEmptyBarCharacter('░');
            // light shade character \u2591
            $progressBar->setProgressCharacter('');
            $progressBar->setBarCharacter('▓');
            // dark shade character \u2593
        }
        return $progressBar;
    }
    /**
     * @return mixed
     */
    public function askQuestion(\_HumbugBoxb94336daae36\Symfony\Component\Console\Question\Question $question)
    {
        if ($this->input->isInteractive()) {
            $this->autoPrependBlock();
        }
        if (!$this->questionHelper) {
            $this->questionHelper = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\SymfonyQuestionHelper();
        }
        $answer = $this->questionHelper->ask($this->input, $this, $question);
        if ($this->input->isInteractive()) {
            $this->newLine();
            $this->bufferedOutput->write("\n");
        }
        return $answer;
    }
    /**
     * {@inheritdoc}
     */
    public function writeln($messages, $type = self::OUTPUT_NORMAL)
    {
        parent::writeln($messages, $type);
        $this->bufferedOutput->writeln($this->reduceBuffer($messages), $type);
    }
    /**
     * {@inheritdoc}
     */
    public function write($messages, $newline = \false, $type = self::OUTPUT_NORMAL)
    {
        parent::write($messages, $newline, $type);
        $this->bufferedOutput->write($this->reduceBuffer($messages), $newline, $type);
    }
    /**
     * {@inheritdoc}
     */
    public function newLine($count = 1)
    {
        parent::newLine($count);
        $this->bufferedOutput->write(\str_repeat("\n", $count));
    }
    /**
     * Returns a new instance which makes use of stderr if available.
     *
     * @return self
     */
    public function getErrorStyle()
    {
        return new self($this->input, $this->getErrorOutput());
    }
    /**
     * @return ProgressBar
     */
    private function getProgressBar()
    {
        if (!$this->progressBar) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\RuntimeException('The ProgressBar is not started.');
        }
        return $this->progressBar;
    }
    private function autoPrependBlock()
    {
        $chars = \substr(\str_replace(\PHP_EOL, "\n", $this->bufferedOutput->fetch()), -2);
        if (!isset($chars[0])) {
            return $this->newLine();
            //empty history, so we should start with a new line.
        }
        //Prepend new line for each non LF chars (This means no blank line was output before)
        $this->newLine(2 - \substr_count($chars, "\n"));
    }
    private function autoPrependText()
    {
        $fetched = $this->bufferedOutput->fetch();
        //Prepend new line if last char isn't EOL:
        if ("\n" !== \substr($fetched, -1)) {
            $this->newLine();
        }
    }
    private function reduceBuffer($messages)
    {
        // We need to know if the two last chars are PHP_EOL
        // Preserve the last 4 chars inserted (PHP_EOL on windows is two chars) in the history buffer
        return \array_map(function ($value) {
            return \substr($value, -4);
        }, \array_merge([$this->bufferedOutput->fetch()], (array) $messages));
    }
    private function createBlock($messages, $type = null, $style = null, $prefix = ' ', $padding = \false, $escape = \false)
    {
        $indentLength = 0;
        $prefixLength = \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlenWithoutDecoration($this->getFormatter(), $prefix);
        $lines = [];
        if (null !== $type) {
            $type = \sprintf('[%s] ', $type);
            $indentLength = \strlen($type);
            $lineIndentation = \str_repeat(' ', $indentLength);
        }
        // wrap and add newlines for each element
        foreach ($messages as $key => $message) {
            if ($escape) {
                $message = \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatter::escape($message);
            }
            $lines = \array_merge($lines, \explode(\PHP_EOL, \wordwrap($message, $this->lineLength - $prefixLength - $indentLength, \PHP_EOL, \true)));
            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(' ', $this->lineLength - \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlenWithoutDecoration($this->getFormatter(), $line));
            if ($style) {
                $line = \sprintf('<%s>%s</>', $style, $line);
            }
        }
        return $lines;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Style;

/**
 * Output style helpers.
 *
 * @author Kevin Bond <kevinbond@gmail.com>
 */
interface StyleInterface
{
    /**
     * Formats a command title.
     *
     * @param string $message
     */
    public function title($message);
    /**
     * Formats a section title.
     *
     * @param string $message
     */
    public function section($message);
    /**
     * Formats a list.
     */
    public function listing(array $elements);
    /**
     * Formats informational text.
     *
     * @param string|array $message
     */
    public function text($message);
    /**
     * Formats a success result bar.
     *
     * @param string|array $message
     */
    public function success($message);
    /**
     * Formats an error result bar.
     *
     * @param string|array $message
     */
    public function error($message);
    /**
     * Formats an warning result bar.
     *
     * @param string|array $message
     */
    public function warning($message);
    /**
     * Formats a note admonition.
     *
     * @param string|array $message
     */
    public function note($message);
    /**
     * Formats a caution admonition.
     *
     * @param string|array $message
     */
    public function caution($message);
    /**
     * Formats a table.
     */
    public function table(array $headers, array $rows);
    /**
     * Asks a question.
     *
     * @param string        $question
     * @param string|null   $default
     * @param callable|null $validator
     *
     * @return mixed
     */
    public function ask($question, $default = null, $validator = null);
    /**
     * Asks a question with the user input hidden.
     *
     * @param string        $question
     * @param callable|null $validator
     *
     * @return mixed
     */
    public function askHidden($question, $validator = null);
    /**
     * Asks for confirmation.
     *
     * @param string $question
     * @param bool   $default
     *
     * @return bool
     */
    public function confirm($question, $default = \true);
    /**
     * Asks a choice question.
     *
     * @param string          $question
     * @param array           $choices
     * @param string|int|null $default
     *
     * @return mixed
     */
    public function choice($question, array $choices, $default = null);
    /**
     * Add newline(s).
     *
     * @param int $count The number of newlines
     */
    public function newLine($count = 1);
    /**
     * Starts the progress output.
     *
     * @param int $max Maximum steps (0 if unknown)
     */
    public function progressStart($max = 0);
    /**
     * Advances the progress output X steps.
     *
     * @param int $step Number of steps to advance
     */
    public function progressAdvance($step = 1);
    /**
     * Finishes the progress output.
     */
    public function progressFinish();
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Question;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException;
/**
 * Represents a choice question.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ChoiceQuestion extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Question\Question
{
    private $choices;
    private $multiselect = \false;
    private $prompt = ' > ';
    private $errorMessage = 'Value "%s" is invalid';
    /**
     * @param string $question The question to ask to the user
     * @param array  $choices  The list of available choices
     * @param mixed  $default  The default answer to return
     */
    public function __construct($question, array $choices, $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);
    }
    /**
     * Returns available choices.
     *
     * @return array
     */
    public function getChoices()
    {
        return $this->choices;
    }
    /**
     * Sets multiselect option.
     *
     * When multiselect is set to true, multiple choices can be answered.
     *
     * @param bool $multiselect
     *
     * @return $this
     */
    public function setMultiselect($multiselect)
    {
        $this->multiselect = $multiselect;
        $this->setValidator($this->getDefaultValidator());
        return $this;
    }
    /**
     * Returns whether the choices are multiselect.
     *
     * @return bool
     */
    public function isMultiselect()
    {
        return $this->multiselect;
    }
    /**
     * Gets the prompt for choices.
     *
     * @return string
     */
    public function getPrompt()
    {
        return $this->prompt;
    }
    /**
     * Sets the prompt for choices.
     *
     * @param string $prompt
     *
     * @return $this
     */
    public function setPrompt($prompt)
    {
        $this->prompt = $prompt;
        return $this;
    }
    /**
     * Sets the error message for invalid values.
     *
     * The error message has a string placeholder (%s) for the invalid value.
     *
     * @param string $errorMessage
     *
     * @return $this
     */
    public function setErrorMessage($errorMessage)
    {
        $this->errorMessage = $errorMessage;
        $this->setValidator($this->getDefaultValidator());
        return $this;
    }
    /**
     * Returns the default answer validator.
     *
     * @return callable
     */
    private function getDefaultValidator()
    {
        $choices = $this->choices;
        $errorMessage = $this->errorMessage;
        $multiselect = $this->multiselect;
        $isAssoc = $this->isAssoc($choices);
        return function ($selected) use($choices, $errorMessage, $multiselect, $isAssoc) {
            // Collapse all spaces.
            $selectedChoices = \str_replace(' ', '', $selected);
            if ($multiselect) {
                // Check for a separated comma values
                if (!\preg_match('/^[^,]+(?:,[^,]+)*$/', $selectedChoices, $matches)) {
                    throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf($errorMessage, $selected));
                }
                $selectedChoices = \explode(',', $selectedChoices);
            } else {
                $selectedChoices = [$selected];
            }
            $multiselectChoices = [];
            foreach ($selectedChoices as $value) {
                $results = [];
                foreach ($choices as $key => $choice) {
                    if ($choice === $value) {
                        $results[] = $key;
                    }
                }
                if (\count($results) > 1) {
                    throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\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 \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf($errorMessage, $value));
                }
                $multiselectChoices[] = (string) $result;
            }
            if ($multiselect) {
                return $multiselectChoices;
            }
            return \current($multiselectChoices);
        };
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Question;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException;
/**
 * Represents a Question.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Question
{
    private $question;
    private $attempts;
    private $hidden = \false;
    private $hiddenFallback = \true;
    private $autocompleterValues;
    private $validator;
    private $default;
    private $normalizer;
    /**
     * @param string $question The question to ask to the user
     * @param mixed  $default  The default answer to return if the user enters nothing
     */
    public function __construct($question, $default = null)
    {
        $this->question = $question;
        $this->default = $default;
    }
    /**
     * Returns the question.
     *
     * @return string
     */
    public function getQuestion()
    {
        return $this->question;
    }
    /**
     * Returns the default answer.
     *
     * @return mixed
     */
    public function getDefault()
    {
        return $this->default;
    }
    /**
     * Returns whether the user response must be hidden.
     *
     * @return bool
     */
    public function isHidden()
    {
        return $this->hidden;
    }
    /**
     * Sets whether the user response must be hidden or not.
     *
     * @param bool $hidden
     *
     * @return $this
     *
     * @throws LogicException In case the autocompleter is also used
     */
    public function setHidden($hidden)
    {
        if ($this->autocompleterValues) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException('A hidden question cannot use the autocompleter.');
        }
        $this->hidden = (bool) $hidden;
        return $this;
    }
    /**
     * In case the response can not be hidden, whether to fallback on non-hidden question or not.
     *
     * @return bool
     */
    public function isHiddenFallback()
    {
        return $this->hiddenFallback;
    }
    /**
     * Sets whether to fallback on non-hidden question if the response can not be hidden.
     *
     * @param bool $fallback
     *
     * @return $this
     */
    public function setHiddenFallback($fallback)
    {
        $this->hiddenFallback = (bool) $fallback;
        return $this;
    }
    /**
     * Gets values for the autocompleter.
     *
     * @return iterable|null
     */
    public function getAutocompleterValues()
    {
        return $this->autocompleterValues;
    }
    /**
     * Sets values for the autocompleter.
     *
     * @param iterable|null $values
     *
     * @return $this
     *
     * @throws InvalidArgumentException
     * @throws LogicException
     */
    public function setAutocompleterValues($values)
    {
        if (\is_array($values)) {
            $values = $this->isAssoc($values) ? \array_merge(\array_keys($values), \array_values($values)) : \array_values($values);
        }
        if (null !== $values && !\is_array($values) && !$values instanceof \Traversable) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException('Autocompleter values can be either an array, `null` or a `Traversable` object.');
        }
        if ($this->hidden) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException('A hidden question cannot use the autocompleter.');
        }
        $this->autocompleterValues = $values;
        return $this;
    }
    /**
     * Sets a validator for the question.
     *
     * @param callable|null $validator
     *
     * @return $this
     */
    public function setValidator(callable $validator = null)
    {
        $this->validator = $validator;
        return $this;
    }
    /**
     * Gets the validator for the question.
     *
     * @return callable|null
     */
    public function getValidator()
    {
        return $this->validator;
    }
    /**
     * Sets the maximum number of attempts.
     *
     * Null means an unlimited number of attempts.
     *
     * @param int|null $attempts
     *
     * @return $this
     *
     * @throws InvalidArgumentException in case the number of attempts is invalid
     */
    public function setMaxAttempts($attempts)
    {
        if (null !== $attempts && $attempts < 1) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException('Maximum number of attempts must be a positive value.');
        }
        $this->attempts = $attempts;
        return $this;
    }
    /**
     * Gets the maximum number of attempts.
     *
     * Null means an unlimited number of attempts.
     *
     * @return int|null
     */
    public function getMaxAttempts()
    {
        return $this->attempts;
    }
    /**
     * Sets a normalizer for the response.
     *
     * The normalizer can be a callable (a string), a closure or a class implementing __invoke.
     *
     * @param callable $normalizer
     *
     * @return $this
     */
    public function setNormalizer(callable $normalizer)
    {
        $this->normalizer = $normalizer;
        return $this;
    }
    /**
     * Gets the normalizer for the response.
     *
     * The normalizer can ba a callable (a string), a closure or a class implementing __invoke.
     *
     * @return callable
     */
    public function getNormalizer()
    {
        return $this->normalizer;
    }
    protected function isAssoc($array)
    {
        return (bool) \count(\array_filter(\array_keys($array), 'is_string'));
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Question;

/**
 * Represents a yes/no question.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ConfirmationQuestion extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Question\Question
{
    private $trueAnswerRegex;
    /**
     * @param string $question        The question to ask to the user
     * @param bool   $default         The default answer to return, true or false
     * @param string $trueAnswerRegex A regex to match the "yes" answer
     */
    public function __construct($question, $default = \true, $trueAnswerRegex = '/^y/i')
    {
        parent::__construct($question, (bool) $default);
        $this->trueAnswerRegex = $trueAnswerRegex;
        $this->setNormalizer($this->getDefaultNormalizer());
    }
    /**
     * Returns the default answer normalizer.
     *
     * @return callable
     */
    private function getDefaultNormalizer()
    {
        $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;
        };
    }
}
Console Component
=================

The Console component eases the creation of beautiful and testable command line
interfaces.

Resources
---------

  * [Documentation](https://symfony.com/doc/current/components/console/index.html)
  * [Contributing](https://symfony.com/doc/current/contributing/index.html)
  * [Report issues](https://github.com/symfony/symfony/issues) and
    [send Pull Requests](https://github.com/symfony/symfony/pulls)
    in the [main Symfony repository](https://github.com/symfony/symfony)

Credits
-------

`Resources/bin/hiddeninput.exe` is a third party binary provided within this
component. Find sources and license at https://github.com/Seldaek/hidden-input.
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Formatter;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException;
/**
 * Formatter style class for defining styles.
 *
 * @author Konstantin Kudryashov <ever.zet@gmail.com>
 */
class OutputFormatterStyle implements \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterStyleInterface
{
    private static $availableForegroundColors = ['black' => ['set' => 30, 'unset' => 39], 'red' => ['set' => 31, 'unset' => 39], 'green' => ['set' => 32, 'unset' => 39], 'yellow' => ['set' => 33, 'unset' => 39], 'blue' => ['set' => 34, 'unset' => 39], 'magenta' => ['set' => 35, 'unset' => 39], 'cyan' => ['set' => 36, 'unset' => 39], 'white' => ['set' => 37, 'unset' => 39], 'default' => ['set' => 39, 'unset' => 39]];
    private static $availableBackgroundColors = ['black' => ['set' => 40, 'unset' => 49], 'red' => ['set' => 41, 'unset' => 49], 'green' => ['set' => 42, 'unset' => 49], 'yellow' => ['set' => 43, 'unset' => 49], 'blue' => ['set' => 44, 'unset' => 49], 'magenta' => ['set' => 45, 'unset' => 49], 'cyan' => ['set' => 46, 'unset' => 49], 'white' => ['set' => 47, 'unset' => 49], 'default' => ['set' => 49, 'unset' => 49]];
    private static $availableOptions = ['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 $foreground;
    private $background;
    private $options = [];
    /**
     * Initializes output formatter style.
     *
     * @param string|null $foreground The style foreground color name
     * @param string|null $background The style background color name
     * @param array       $options    The style options
     */
    public function __construct($foreground = null, $background = null, array $options = [])
    {
        if (null !== $foreground) {
            $this->setForeground($foreground);
        }
        if (null !== $background) {
            $this->setBackground($background);
        }
        if (\count($options)) {
            $this->setOptions($options);
        }
    }
    /**
     * Sets style foreground color.
     *
     * @param string|null $color The color name
     *
     * @throws InvalidArgumentException When the color name isn't defined
     */
    public function setForeground($color = null)
    {
        if (null === $color) {
            $this->foreground = null;
            return;
        }
        if (!isset(static::$availableForegroundColors[$color])) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('Invalid foreground color specified: "%s". Expected one of (%s)', $color, \implode(', ', \array_keys(static::$availableForegroundColors))));
        }
        $this->foreground = static::$availableForegroundColors[$color];
    }
    /**
     * Sets style background color.
     *
     * @param string|null $color The color name
     *
     * @throws InvalidArgumentException When the color name isn't defined
     */
    public function setBackground($color = null)
    {
        if (null === $color) {
            $this->background = null;
            return;
        }
        if (!isset(static::$availableBackgroundColors[$color])) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('Invalid background color specified: "%s". Expected one of (%s)', $color, \implode(', ', \array_keys(static::$availableBackgroundColors))));
        }
        $this->background = static::$availableBackgroundColors[$color];
    }
    /**
     * Sets some specific style option.
     *
     * @param string $option The option name
     *
     * @throws InvalidArgumentException When the option name isn't defined
     */
    public function setOption($option)
    {
        if (!isset(static::$availableOptions[$option])) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('Invalid option specified: "%s". Expected one of (%s)', $option, \implode(', ', \array_keys(static::$availableOptions))));
        }
        if (!\in_array(static::$availableOptions[$option], $this->options)) {
            $this->options[] = static::$availableOptions[$option];
        }
    }
    /**
     * Unsets some specific style option.
     *
     * @param string $option The option name
     *
     * @throws InvalidArgumentException When the option name isn't defined
     */
    public function unsetOption($option)
    {
        if (!isset(static::$availableOptions[$option])) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('Invalid option specified: "%s". Expected one of (%s)', $option, \implode(', ', \array_keys(static::$availableOptions))));
        }
        $pos = \array_search(static::$availableOptions[$option], $this->options);
        if (\false !== $pos) {
            unset($this->options[$pos]);
        }
    }
    /**
     * {@inheritdoc}
     */
    public function setOptions(array $options)
    {
        $this->options = [];
        foreach ($options as $option) {
            $this->setOption($option);
        }
    }
    /**
     * Applies the style to a given text.
     *
     * @param string $text The text to style
     *
     * @return string
     */
    public function apply($text)
    {
        $setCodes = [];
        $unsetCodes = [];
        if (null !== $this->foreground) {
            $setCodes[] = $this->foreground['set'];
            $unsetCodes[] = $this->foreground['unset'];
        }
        if (null !== $this->background) {
            $setCodes[] = $this->background['set'];
            $unsetCodes[] = $this->background['unset'];
        }
        if (\count($this->options)) {
            foreach ($this->options as $option) {
                $setCodes[] = $option['set'];
                $unsetCodes[] = $option['unset'];
            }
        }
        if (0 === \count($setCodes)) {
            return $text;
        }
        return \sprintf("\33[%sm%s\33[%sm", \implode(';', $setCodes), $text, \implode(';', $unsetCodes));
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Formatter;

/**
 * Formatter style interface for defining styles.
 *
 * @author Konstantin Kudryashov <ever.zet@gmail.com>
 */
interface OutputFormatterStyleInterface
{
    /**
     * Sets style foreground color.
     *
     * @param string $color The color name
     */
    public function setForeground($color = null);
    /**
     * Sets style background color.
     *
     * @param string $color The color name
     */
    public function setBackground($color = null);
    /**
     * Sets some specific style option.
     *
     * @param string $option The option name
     */
    public function setOption($option);
    /**
     * Unsets some specific style option.
     *
     * @param string $option The option name
     */
    public function unsetOption($option);
    /**
     * Sets multiple style options at once.
     */
    public function setOptions(array $options);
    /**
     * Applies the style to a given text.
     *
     * @param string $text The text to style
     *
     * @return string
     */
    public function apply($text);
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Formatter;

/**
 * Formatter interface for console output.
 *
 * @author Konstantin Kudryashov <ever.zet@gmail.com>
 */
interface OutputFormatterInterface
{
    /**
     * Sets the decorated flag.
     *
     * @param bool $decorated Whether to decorate the messages or not
     */
    public function setDecorated($decorated);
    /**
     * Gets the decorated flag.
     *
     * @return bool true if the output will decorate messages, false otherwise
     */
    public function isDecorated();
    /**
     * Sets a new style.
     *
     * @param string                        $name  The style name
     * @param OutputFormatterStyleInterface $style The style instance
     */
    public function setStyle($name, \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterStyleInterface $style);
    /**
     * Checks if output formatter has style with specified name.
     *
     * @param string $name
     *
     * @return bool
     */
    public function hasStyle($name);
    /**
     * Gets style options from style with specified name.
     *
     * @param string $name
     *
     * @return OutputFormatterStyleInterface
     *
     * @throws \InvalidArgumentException When style isn't defined
     */
    public function getStyle($name);
    /**
     * Formats a message according to the given styles.
     *
     * @param string $message The message to style
     *
     * @return string The styled message
     */
    public function format($message);
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Formatter;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException;
/**
 * Formatter class for console output.
 *
 * @author Konstantin Kudryashov <ever.zet@gmail.com>
 */
class OutputFormatter implements \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterInterface
{
    private $decorated;
    private $styles = [];
    private $styleStack;
    /**
     * Escapes "<" special char in given text.
     *
     * @param string $text Text to escape
     *
     * @return string Escaped text
     */
    public static function escape($text)
    {
        $text = \preg_replace('/([^\\\\]?)</', '$1\\<', $text);
        return self::escapeTrailingBackslash($text);
    }
    /**
     * Escapes trailing "\" in given text.
     *
     * @param string $text Text to escape
     *
     * @return string Escaped text
     *
     * @internal
     */
    public static function escapeTrailingBackslash($text)
    {
        if ('\\' === \substr($text, -1)) {
            $len = \strlen($text);
            $text = \rtrim($text, '\\');
            $text = \str_replace("\0", '', $text);
            $text .= \str_repeat("\0", $len - \strlen($text));
        }
        return $text;
    }
    /**
     * Initializes console output formatter.
     *
     * @param bool                            $decorated Whether this formatter should actually decorate strings
     * @param OutputFormatterStyleInterface[] $styles    Array of "name => FormatterStyle" instances
     */
    public function __construct($decorated = \false, array $styles = [])
    {
        $this->decorated = (bool) $decorated;
        $this->setStyle('error', new \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterStyle('white', 'red'));
        $this->setStyle('info', new \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterStyle('green'));
        $this->setStyle('comment', new \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterStyle('yellow'));
        $this->setStyle('question', new \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterStyle('black', 'cyan'));
        foreach ($styles as $name => $style) {
            $this->setStyle($name, $style);
        }
        $this->styleStack = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterStyleStack();
    }
    /**
     * {@inheritdoc}
     */
    public function setDecorated($decorated)
    {
        $this->decorated = (bool) $decorated;
    }
    /**
     * {@inheritdoc}
     */
    public function isDecorated()
    {
        return $this->decorated;
    }
    /**
     * {@inheritdoc}
     */
    public function setStyle($name, \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterStyleInterface $style)
    {
        $this->styles[\strtolower($name)] = $style;
    }
    /**
     * {@inheritdoc}
     */
    public function hasStyle($name)
    {
        return isset($this->styles[\strtolower($name)]);
    }
    /**
     * {@inheritdoc}
     */
    public function getStyle($name)
    {
        if (!$this->hasStyle($name)) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('Undefined style: %s', $name));
        }
        return $this->styles[\strtolower($name)];
    }
    /**
     * {@inheritdoc}
     */
    public function format($message)
    {
        $message = (string) $message;
        $offset = 0;
        $output = '';
        $tagRegex = '[a-z][a-z0-9,_=;-]*+';
        \preg_match_all("#<(({$tagRegex}) | /({$tagRegex})?)>#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;
            }
            // add the text up to the next tag
            $output .= $this->applyCurrentStyle(\substr($message, $offset, $pos - $offset));
            $offset = $pos + \strlen($text);
            // opening tag?
            if ($open = '/' != $text[1]) {
                $tag = $matches[1][$i][0];
            } else {
                $tag = isset($matches[3][$i][0]) ? $matches[3][$i][0] : '';
            }
            if (!$open && !$tag) {
                // </>
                $this->styleStack->pop();
            } elseif (\false === ($style = $this->createStyleFromString($tag))) {
                $output .= $this->applyCurrentStyle($text);
            } elseif ($open) {
                $this->styleStack->push($style);
            } else {
                $this->styleStack->pop($style);
            }
        }
        $output .= $this->applyCurrentStyle(\substr($message, $offset));
        if (\false !== \strpos($output, "\0")) {
            return \strtr($output, ["\0" => '\\', '\\<' => '<']);
        }
        return \str_replace('\\<', '<', $output);
    }
    /**
     * @return OutputFormatterStyleStack
     */
    public function getStyleStack()
    {
        return $this->styleStack;
    }
    /**
     * Tries to create new style instance from string.
     *
     * @param string $string
     *
     * @return OutputFormatterStyle|false false if string is not format string
     */
    private function createStyleFromString($string)
    {
        if (isset($this->styles[$string])) {
            return $this->styles[$string];
        }
        if (!\preg_match_all('/([^=]+)=([^;]+)(;|$)/', $string, $matches, \PREG_SET_ORDER)) {
            return \false;
        }
        $style = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\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 ('options' === $match[0]) {
                \preg_match_all('([^,;]+)', \strtolower($match[1]), $options);
                $options = \array_shift($options);
                foreach ($options as $option) {
                    try {
                        $style->setOption($option);
                    } catch (\InvalidArgumentException $e) {
                        @\trigger_error(\sprintf('Unknown style options are deprecated since Symfony 3.2 and will be removed in 4.0. Exception "%s".', $e->getMessage()), \E_USER_DEPRECATED);
                        return \false;
                    }
                }
            } else {
                return \false;
            }
        }
        return $style;
    }
    /**
     * Applies current style from stack to text, if must be applied.
     *
     * @param string $text Input text
     *
     * @return string Styled text
     */
    private function applyCurrentStyle($text)
    {
        return $this->isDecorated() && \strlen($text) > 0 ? $this->styleStack->getCurrent()->apply($text) : $text;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Formatter;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException;
/**
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class OutputFormatterStyleStack
{
    /**
     * @var OutputFormatterStyleInterface[]
     */
    private $styles;
    private $emptyStyle;
    public function __construct(\_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterStyleInterface $emptyStyle = null)
    {
        $this->emptyStyle = $emptyStyle ?: new \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterStyle();
        $this->reset();
    }
    /**
     * Resets stack (ie. empty internal arrays).
     */
    public function reset()
    {
        $this->styles = [];
    }
    /**
     * Pushes a style in the stack.
     */
    public function push(\_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterStyleInterface $style)
    {
        $this->styles[] = $style;
    }
    /**
     * Pops a style from the stack.
     *
     * @return OutputFormatterStyleInterface
     *
     * @throws InvalidArgumentException When style tags incorrectly nested
     */
    public function pop(\_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterStyleInterface $style = null)
    {
        if (empty($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 \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException('Incorrectly nested style tag found.');
    }
    /**
     * Computes current style with stacks top codes.
     *
     * @return OutputFormatterStyle
     */
    public function getCurrent()
    {
        if (empty($this->styles)) {
            return $this->emptyStyle;
        }
        return $this->styles[\count($this->styles) - 1];
    }
    /**
     * @return $this
     */
    public function setEmptyStyle(\_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterStyleInterface $emptyStyle)
    {
        $this->emptyStyle = $emptyStyle;
        return $this;
    }
    /**
     * @return OutputFormatterStyleInterface
     */
    public function getEmptyStyle()
    {
        return $this->emptyStyle;
    }
}
<?php

namespace _HumbugBoxb94336daae36\Symfony\Component\Console\CommandLoader;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\CommandNotFoundException;
/**
 * @author Robin Chalas <robin.chalas@gmail.com>
 */
interface CommandLoaderInterface
{
    /**
     * Loads a command.
     *
     * @param string $name
     *
     * @return Command
     *
     * @throws CommandNotFoundException
     */
    public function get($name);
    /**
     * Checks if a command exists.
     *
     * @param string $name
     *
     * @return bool
     */
    public function has($name);
    /**
     * @return string[] All registered command names
     */
    public function getNames();
}
<?php

namespace _HumbugBoxb94336daae36\Symfony\Component\Console\CommandLoader;

use _HumbugBoxb94336daae36\Psr\Container\ContainerInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\CommandNotFoundException;
/**
 * Loads commands from a PSR-11 container.
 *
 * @author Robin Chalas <robin.chalas@gmail.com>
 */
class ContainerCommandLoader implements \_HumbugBoxb94336daae36\Symfony\Component\Console\CommandLoader\CommandLoaderInterface
{
    private $container;
    private $commandMap;
    /**
     * @param ContainerInterface $container  A container from which to load command services
     * @param array              $commandMap An array with command names as keys and service ids as values
     */
    public function __construct(\_HumbugBoxb94336daae36\Psr\Container\ContainerInterface $container, array $commandMap)
    {
        $this->container = $container;
        $this->commandMap = $commandMap;
    }
    /**
     * {@inheritdoc}
     */
    public function get($name)
    {
        if (!$this->has($name)) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\CommandNotFoundException(\sprintf('Command "%s" does not exist.', $name));
        }
        return $this->container->get($this->commandMap[$name]);
    }
    /**
     * {@inheritdoc}
     */
    public function has($name)
    {
        return isset($this->commandMap[$name]) && $this->container->has($this->commandMap[$name]);
    }
    /**
     * {@inheritdoc}
     */
    public function getNames()
    {
        return \array_keys($this->commandMap);
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\CommandLoader;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\CommandNotFoundException;
/**
 * A simple command loader using factories to instantiate commands lazily.
 *
 * @author Maxime Steinhausser <maxime.steinhausser@gmail.com>
 */
class FactoryCommandLoader implements \_HumbugBoxb94336daae36\Symfony\Component\Console\CommandLoader\CommandLoaderInterface
{
    private $factories;
    /**
     * @param callable[] $factories Indexed by command names
     */
    public function __construct(array $factories)
    {
        $this->factories = $factories;
    }
    /**
     * {@inheritdoc}
     */
    public function has($name)
    {
        return isset($this->factories[$name]);
    }
    /**
     * {@inheritdoc}
     */
    public function get($name)
    {
        if (!isset($this->factories[$name])) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\CommandNotFoundException(\sprintf('Command "%s" does not exist.', $name));
        }
        $factory = $this->factories[$name];
        return $factory();
    }
    /**
     * {@inheritdoc}
     */
    public function getNames()
    {
        return \array_keys($this->factories);
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Application;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatter;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption;
/**
 * Text descriptor.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 *
 * @internal
 */
class TextDescriptor extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor\Descriptor
{
    /**
     * {@inheritdoc}
     */
    protected function describeInputArgument(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument $argument, array $options = [])
    {
        if (null !== $argument->getDefault() && (!\is_array($argument->getDefault()) || \count($argument->getDefault()))) {
            $default = \sprintf('<comment> [default: %s]</comment>', $this->formatDefaultValue($argument->getDefault()));
        } else {
            $default = '';
        }
        $totalWidth = isset($options['total_width']) ? $options['total_width'] : \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlen($argument->getName());
        $spacingWidth = $totalWidth - \strlen($argument->getName());
        $this->writeText(\sprintf(
            '  <info>%s</info>  %s%s%s',
            $argument->getName(),
            \str_repeat(' ', $spacingWidth),
            // + 4 = 2 spaces before <info>, 2 spaces after </info>
            \preg_replace('/\\s*[\\r\\n]\\s*/', "\n" . \str_repeat(' ', $totalWidth + 4), $argument->getDescription()),
            $default
        ), $options);
    }
    /**
     * {@inheritdoc}
     */
    protected function describeInputOption(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption $option, array $options = [])
    {
        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 = isset($options['total_width']) ? $options['total_width'] : $this->calculateTotalWidthForOptions([$option]);
        $synopsis = \sprintf('%s%s', $option->getShortcut() ? \sprintf('-%s, ', $option->getShortcut()) : '    ', \sprintf('--%s%s', $option->getName(), $value));
        $spacingWidth = $totalWidth - \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlen($synopsis);
        $this->writeText(\sprintf(
            '  <info>%s</info>  %s%s%s%s',
            $synopsis,
            \str_repeat(' ', $spacingWidth),
            // + 4 = 2 spaces before <info>, 2 spaces after </info>
            \preg_replace('/\\s*[\\r\\n]\\s*/', "\n" . \str_repeat(' ', $totalWidth + 4), $option->getDescription()),
            $default,
            $option->isArray() ? '<comment> (multiple values allowed)</comment>' : ''
        ), $options);
    }
    /**
     * {@inheritdoc}
     */
    protected function describeInputDefinition(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition $definition, array $options = [])
    {
        $totalWidth = $this->calculateTotalWidthForOptions($definition->getOptions());
        foreach ($definition->getArguments() as $argument) {
            $totalWidth = \max($totalWidth, \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlen($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]));
            }
        }
    }
    /**
     * {@inheritdoc}
     */
    protected function describeCommand(\_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command $command, array $options = [])
    {
        $command->getSynopsis(\true);
        $command->getSynopsis(\false);
        $command->mergeApplicationDefinition(\false);
        $this->writeText('<comment>Usage:</comment>', $options);
        foreach (\array_merge([$command->getSynopsis(\true)], $command->getAliases(), $command->getUsages()) as $usage) {
            $this->writeText("\n");
            $this->writeText('  ' . \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatter::escape($usage), $options);
        }
        $this->writeText("\n");
        $definition = $command->getNativeDefinition();
        if ($definition->getOptions() || $definition->getArguments()) {
            $this->writeText("\n");
            $this->describeInputDefinition($definition, $options);
            $this->writeText("\n");
        }
        if ($help = $command->getProcessedHelp()) {
            $this->writeText("\n");
            $this->writeText('<comment>Help:</comment>', $options);
            $this->writeText("\n");
            $this->writeText('  ' . \str_replace("\n", "\n  ", $help), $options);
            $this->writeText("\n");
        }
    }
    /**
     * {@inheritdoc}
     */
    protected function describeApplication(\_HumbugBoxb94336daae36\Symfony\Component\Console\Application $application, array $options = [])
    {
        $describedNamespace = isset($options['namespace']) ? $options['namespace'] : null;
        $description = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor\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 \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition($application->getDefinition()->getOptions()), $options);
            $this->writeText("\n");
            $this->writeText("\n");
            $commands = $description->getCommands();
            $namespaces = $description->getNamespaces();
            if ($describedNamespace && $namespaces) {
                // make sure all alias commands are included when describing a specific namespace
                $describedNamespaceInfo = \reset($namespaces);
                foreach ($describedNamespaceInfo['commands'] as $name) {
                    $commands[$name] = $description->getCommand($name);
                }
            }
            // calculate max. width based on available commands per namespace
            $width = $this->getColumnWidth(\call_user_func_array('array_merge', \array_map(function ($namespace) use($commands) {
                return \array_intersect($namespace['commands'], \array_keys($commands));
            }, $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'], function ($name) use($commands) {
                    return isset($commands[$name]);
                });
                if (!$namespace['commands']) {
                    continue;
                }
                if (!$describedNamespace && \_HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor\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 - \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlen($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");
        }
    }
    /**
     * {@inheritdoc}
     */
    private function writeText($content, array $options = [])
    {
        $this->write(isset($options['raw_text']) && $options['raw_text'] ? \strip_tags($content) : $content, isset($options['raw_output']) ? !$options['raw_output'] : \true);
    }
    /**
     * Formats command aliases to show them in the command description.
     *
     * @return string
     */
    private function getCommandAliasesText(\_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command $command)
    {
        $text = '';
        $aliases = $command->getAliases();
        if ($aliases) {
            $text = '[' . \implode('|', $aliases) . '] ';
        }
        return $text;
    }
    /**
     * Formats input option/argument default value.
     *
     * @param mixed $default
     *
     * @return string
     */
    private function formatDefaultValue($default)
    {
        if (\INF === $default) {
            return 'INF';
        }
        if (\is_string($default)) {
            $default = \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatter::escape($default);
        } elseif (\is_array($default)) {
            foreach ($default as $key => $value) {
                if (\is_string($value)) {
                    $default[$key] = \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatter::escape($value);
                }
            }
        }
        return \str_replace('\\\\', '\\', \json_encode($default, \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE));
    }
    /**
     * @param (Command|string)[] $commands
     *
     * @return int
     */
    private function getColumnWidth(array $commands)
    {
        $widths = [];
        foreach ($commands as $command) {
            if ($command instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command) {
                $widths[] = \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlen($command->getName());
                foreach ($command->getAliases() as $alias) {
                    $widths[] = \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlen($alias);
                }
            } else {
                $widths[] = \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlen($command);
            }
        }
        return $widths ? \max($widths) + 2 : 0;
    }
    /**
     * @param InputOption[] $options
     *
     * @return int
     */
    private function calculateTotalWidthForOptions(array $options)
    {
        $totalWidth = 0;
        foreach ($options as $option) {
            // "-" + shortcut + ", --" + name
            $nameLength = 1 + \max(\_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlen($option->getShortcut()), 1) + 4 + \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlen($option->getName());
            if ($option->acceptValue()) {
                $valueLength = 1 + \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlen($option->getName());
                // = + value
                $valueLength += $option->isValueOptional() ? 2 : 0;
                // [ + ]
                $nameLength += $valueLength;
            }
            $totalWidth = \max($totalWidth, $nameLength);
        }
        return $totalWidth;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Application;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\CommandNotFoundException;
/**
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 *
 * @internal
 */
class ApplicationDescription
{
    const GLOBAL_NAMESPACE = '_global';
    private $application;
    private $namespace;
    private $showHidden;
    /**
     * @var array
     */
    private $namespaces;
    /**
     * @var Command[]
     */
    private $commands;
    /**
     * @var Command[]
     */
    private $aliases;
    /**
     * @param Application $application
     * @param string|null $namespace
     * @param bool        $showHidden
     */
    public function __construct(\_HumbugBoxb94336daae36\Symfony\Component\Console\Application $application, $namespace = null, $showHidden = \false)
    {
        $this->application = $application;
        $this->namespace = $namespace;
        $this->showHidden = $showHidden;
    }
    /**
     * @return array
     */
    public function getNamespaces()
    {
        if (null === $this->namespaces) {
            $this->inspectApplication();
        }
        return $this->namespaces;
    }
    /**
     * @return Command[]
     */
    public function getCommands()
    {
        if (null === $this->commands) {
            $this->inspectApplication();
        }
        return $this->commands;
    }
    /**
     * @param string $name
     *
     * @return Command
     *
     * @throws CommandNotFoundException
     */
    public function getCommand($name)
    {
        if (!isset($this->commands[$name]) && !isset($this->aliases[$name])) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\CommandNotFoundException(\sprintf('Command %s does not exist.', $name));
        }
        return isset($this->commands[$name]) ? $this->commands[$name] : $this->aliases[$name];
    }
    private function inspectApplication()
    {
        $this->commands = [];
        $this->namespaces = [];
        $all = $this->application->all($this->namespace ? $this->application->findNamespace($this->namespace) : null);
        foreach ($this->sortCommands($all) as $namespace => $commands) {
            $names = [];
            /** @var Command $command */
            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];
        }
    }
    /**
     * @return array
     */
    private function sortCommands(array $commands)
    {
        $namespacedCommands = [];
        $globalCommands = [];
        foreach ($commands as $name => $command) {
            $key = $this->application->extractNamespace($name, 1);
            if (!$key) {
                $globalCommands['_global'][$name] = $command;
            } else {
                $namespacedCommands[$key][$name] = $command;
            }
        }
        \ksort($namespacedCommands);
        $namespacedCommands = \array_merge($globalCommands, $namespacedCommands);
        foreach ($namespacedCommands as &$commandsSet) {
            \ksort($commandsSet);
        }
        // unset reference to keep scope clear
        unset($commandsSet);
        return $namespacedCommands;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Application;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption;
/**
 * XML descriptor.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 *
 * @internal
 */
class XmlDescriptor extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor\Descriptor
{
    /**
     * @return \DOMDocument
     */
    public function getInputDefinitionDocument(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition $definition)
    {
        $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;
    }
    /**
     * @return \DOMDocument
     */
    public function getCommandDocument(\_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command $command)
    {
        $dom = new \DOMDocument('1.0', 'UTF-8');
        $dom->appendChild($commandXML = $dom->createElement('command'));
        $command->getSynopsis();
        $command->mergeApplicationDefinition(\false);
        $commandXML->setAttribute('id', $command->getName());
        $commandXML->setAttribute('name', $command->getName());
        $commandXML->setAttribute('hidden', $command->isHidden() ? 1 : 0);
        $commandXML->appendChild($usagesXML = $dom->createElement('usages'));
        foreach (\array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()) as $usage) {
            $usagesXML->appendChild($dom->createElement('usage', $usage));
        }
        $commandXML->appendChild($descriptionXML = $dom->createElement('description'));
        $descriptionXML->appendChild($dom->createTextNode(\str_replace("\n", "\n ", $command->getDescription())));
        $commandXML->appendChild($helpXML = $dom->createElement('help'));
        $helpXML->appendChild($dom->createTextNode(\str_replace("\n", "\n ", $command->getProcessedHelp())));
        $definitionXML = $this->getInputDefinitionDocument($command->getNativeDefinition());
        $this->appendDocument($commandXML, $definitionXML->getElementsByTagName('definition')->item(0));
        return $dom;
    }
    /**
     * @param Application $application
     * @param string|null $namespace
     *
     * @return \DOMDocument
     */
    public function getApplicationDocument(\_HumbugBoxb94336daae36\Symfony\Component\Console\Application $application, $namespace = null)
    {
        $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 \_HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor\ApplicationDescription($application, $namespace, \true);
        if ($namespace) {
            $commandsXML->setAttribute('namespace', $namespace);
        }
        foreach ($description->getCommands() as $command) {
            $this->appendDocument($commandsXML, $this->getCommandDocument($command));
        }
        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;
    }
    /**
     * {@inheritdoc}
     */
    protected function describeInputArgument(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument $argument, array $options = [])
    {
        $this->writeDocument($this->getInputArgumentDocument($argument));
    }
    /**
     * {@inheritdoc}
     */
    protected function describeInputOption(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption $option, array $options = [])
    {
        $this->writeDocument($this->getInputOptionDocument($option));
    }
    /**
     * {@inheritdoc}
     */
    protected function describeInputDefinition(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition $definition, array $options = [])
    {
        $this->writeDocument($this->getInputDefinitionDocument($definition));
    }
    /**
     * {@inheritdoc}
     */
    protected function describeCommand(\_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command $command, array $options = [])
    {
        $this->writeDocument($this->getCommandDocument($command));
    }
    /**
     * {@inheritdoc}
     */
    protected function describeApplication(\_HumbugBoxb94336daae36\Symfony\Component\Console\Application $application, array $options = [])
    {
        $this->writeDocument($this->getApplicationDocument($application, isset($options['namespace']) ? $options['namespace'] : null));
    }
    /**
     * Appends document children to parent node.
     */
    private function appendDocument(\DOMNode $parentNode, \DOMNode $importedParent)
    {
        foreach ($importedParent->childNodes as $childNode) {
            $parentNode->appendChild($parentNode->ownerDocument->importNode($childNode, \true));
        }
    }
    /**
     * Writes DOM document.
     *
     * @return \DOMDocument|string
     */
    private function writeDocument(\DOMDocument $dom)
    {
        $dom->formatOutput = \true;
        $this->write($dom->saveXML());
    }
    /**
     * @return \DOMDocument
     */
    private function getInputArgumentDocument(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument $argument)
    {
        $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;
    }
    /**
     * @return \DOMDocument
     */
    private function getInputOptionDocument(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption $option)
    {
        $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));
                }
            }
        }
        return $dom;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
/**
 * Descriptor interface.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
interface DescriptorInterface
{
    /**
     * Describes an object if supported.
     *
     * @param OutputInterface $output
     * @param object          $object
     * @param array           $options
     */
    public function describe(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, $object, array $options = []);
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Application;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
/**
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 *
 * @internal
 */
abstract class Descriptor implements \_HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor\DescriptorInterface
{
    /**
     * @var OutputInterface
     */
    protected $output;
    /**
     * {@inheritdoc}
     */
    public function describe(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, $object, array $options = [])
    {
        $this->output = $output;
        switch (\true) {
            case $object instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument:
                $this->describeInputArgument($object, $options);
                break;
            case $object instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption:
                $this->describeInputOption($object, $options);
                break;
            case $object instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition:
                $this->describeInputDefinition($object, $options);
                break;
            case $object instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command:
                $this->describeCommand($object, $options);
                break;
            case $object instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Application:
                $this->describeApplication($object, $options);
                break;
            default:
                throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('Object of type "%s" is not describable.', \get_class($object)));
        }
    }
    /**
     * Writes content to output.
     *
     * @param string $content
     * @param bool   $decorated
     */
    protected function write($content, $decorated = \false)
    {
        $this->output->write($content, \false, $decorated ? \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::OUTPUT_NORMAL : \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::OUTPUT_RAW);
    }
    /**
     * Describes an InputArgument instance.
     *
     * @return string|mixed
     */
    protected abstract function describeInputArgument(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument $argument, array $options = []);
    /**
     * Describes an InputOption instance.
     *
     * @return string|mixed
     */
    protected abstract function describeInputOption(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption $option, array $options = []);
    /**
     * Describes an InputDefinition instance.
     *
     * @return string|mixed
     */
    protected abstract function describeInputDefinition(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition $definition, array $options = []);
    /**
     * Describes a Command instance.
     *
     * @return string|mixed
     */
    protected abstract function describeCommand(\_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command $command, array $options = []);
    /**
     * Describes an Application instance.
     *
     * @return string|mixed
     */
    protected abstract function describeApplication(\_HumbugBoxb94336daae36\Symfony\Component\Console\Application $application, array $options = []);
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Application;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption;
/**
 * JSON descriptor.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 *
 * @internal
 */
class JsonDescriptor extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor\Descriptor
{
    /**
     * {@inheritdoc}
     */
    protected function describeInputArgument(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument $argument, array $options = [])
    {
        $this->writeData($this->getInputArgumentData($argument), $options);
    }
    /**
     * {@inheritdoc}
     */
    protected function describeInputOption(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption $option, array $options = [])
    {
        $this->writeData($this->getInputOptionData($option), $options);
    }
    /**
     * {@inheritdoc}
     */
    protected function describeInputDefinition(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition $definition, array $options = [])
    {
        $this->writeData($this->getInputDefinitionData($definition), $options);
    }
    /**
     * {@inheritdoc}
     */
    protected function describeCommand(\_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command $command, array $options = [])
    {
        $this->writeData($this->getCommandData($command), $options);
    }
    /**
     * {@inheritdoc}
     */
    protected function describeApplication(\_HumbugBoxb94336daae36\Symfony\Component\Console\Application $application, array $options = [])
    {
        $describedNamespace = isset($options['namespace']) ? $options['namespace'] : null;
        $description = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor\ApplicationDescription($application, $describedNamespace, \true);
        $commands = [];
        foreach ($description->getCommands() as $command) {
            $commands[] = $this->getCommandData($command);
        }
        $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);
    }
    /**
     * Writes data as json.
     *
     * @return array|string
     */
    private function writeData(array $data, array $options)
    {
        $this->write(\json_encode($data, isset($options['json_encoding']) ? $options['json_encoding'] : 0));
    }
    /**
     * @return array
     */
    private function getInputArgumentData(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument $argument)
    {
        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()];
    }
    /**
     * @return array
     */
    private function getInputOptionData(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption $option)
    {
        return ['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()];
    }
    /**
     * @return array
     */
    private function getInputDefinitionData(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition $definition)
    {
        $inputArguments = [];
        foreach ($definition->getArguments() as $name => $argument) {
            $inputArguments[$name] = $this->getInputArgumentData($argument);
        }
        $inputOptions = [];
        foreach ($definition->getOptions() as $name => $option) {
            $inputOptions[$name] = $this->getInputOptionData($option);
        }
        return ['arguments' => $inputArguments, 'options' => $inputOptions];
    }
    /**
     * @return array
     */
    private function getCommandData(\_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command $command)
    {
        $command->getSynopsis();
        $command->mergeApplicationDefinition(\false);
        return ['name' => $command->getName(), 'usage' => \array_merge([$command->getSynopsis()], $command->getUsages(), $command->getAliases()), 'description' => $command->getDescription(), 'help' => $command->getProcessedHelp(), 'definition' => $this->getInputDefinitionData($command->getNativeDefinition()), 'hidden' => $command->isHidden()];
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Application;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
/**
 * Markdown descriptor.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 *
 * @internal
 */
class MarkdownDescriptor extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor\Descriptor
{
    /**
     * {@inheritdoc}
     */
    public function describe(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, $object, array $options = [])
    {
        $decorated = $output->isDecorated();
        $output->setDecorated(\false);
        parent::describe($output, $object, $options);
        $output->setDecorated($decorated);
    }
    /**
     * {@inheritdoc}
     */
    protected function write($content, $decorated = \true)
    {
        parent::write($content, $decorated);
    }
    /**
     * {@inheritdoc}
     */
    protected function describeInputArgument(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument $argument, array $options = [])
    {
        $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)) . '`');
    }
    /**
     * {@inheritdoc}
     */
    protected function describeInputOption(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption $option, array $options = [])
    {
        $name = '--' . $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" . '* Default: `' . \str_replace("\n", '', \var_export($option->getDefault(), \true)) . '`');
    }
    /**
     * {@inheritdoc}
     */
    protected function describeInputDefinition(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition $definition, array $options = [])
    {
        if ($showArguments = \count($definition->getArguments()) > 0) {
            $this->write('### Arguments');
            foreach ($definition->getArguments() as $argument) {
                $this->write("\n\n");
                $this->write($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->write($this->describeInputOption($option));
            }
        }
    }
    /**
     * {@inheritdoc}
     */
    protected function describeCommand(\_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command $command, array $options = [])
    {
        $command->getSynopsis();
        $command->mergeApplicationDefinition(\false);
        $this->write('`' . $command->getName() . "`\n" . \str_repeat('-', \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlen($command->getName()) + 2) . "\n\n" . ($command->getDescription() ? $command->getDescription() . "\n\n" : '') . '### Usage' . "\n\n" . \array_reduce(\array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()), function ($carry, $usage) {
            return $carry . '* `' . $usage . '`' . "\n";
        }));
        if ($help = $command->getProcessedHelp()) {
            $this->write("\n");
            $this->write($help);
        }
        if ($command->getNativeDefinition()) {
            $this->write("\n\n");
            $this->describeInputDefinition($command->getNativeDefinition());
        }
    }
    /**
     * {@inheritdoc}
     */
    protected function describeApplication(\_HumbugBoxb94336daae36\Symfony\Component\Console\Application $application, array $options = [])
    {
        $describedNamespace = isset($options['namespace']) ? $options['namespace'] : null;
        $description = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor\ApplicationDescription($application, $describedNamespace);
        $title = $this->getApplicationTitle($application);
        $this->write($title . "\n" . \str_repeat('=', \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlen($title)));
        foreach ($description->getNamespaces() as $namespace) {
            if (\_HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor\ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) {
                $this->write("\n\n");
                $this->write('**' . $namespace['id'] . ':**');
            }
            $this->write("\n\n");
            $this->write(\implode("\n", \array_map(function ($commandName) use($description) {
                return \sprintf('* [`%s`](#%s)', $commandName, \str_replace(':', '', $description->getCommand($commandName)->getName()));
            }, $namespace['commands'])));
        }
        foreach ($description->getCommands() as $command) {
            $this->write("\n\n");
            $this->write($this->describeCommand($command));
        }
    }
    private function getApplicationTitle(\_HumbugBoxb94336daae36\Symfony\Component\Console\Application $application)
    {
        if ('UNKNOWN' !== $application->getName()) {
            if ('UNKNOWN' !== $application->getVersion()) {
                return \sprintf('%s %s', $application->getName(), $application->getVersion());
            }
            return $application->getName();
        }
        return 'Console Tool';
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Tester;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\ArrayInput;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\StreamOutput;
/**
 * Eases the testing of console commands.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Robin Chalas <robin.chalas@gmail.com>
 */
class CommandTester
{
    private $command;
    private $input;
    private $output;
    private $inputs = [];
    private $statusCode;
    public function __construct(\_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command $command)
    {
        $this->command = $command;
    }
    /**
     * Executes the command.
     *
     * Available execution options:
     *
     *  * interactive: Sets the input interactive flag
     *  * decorated:   Sets the output decorated flag
     *  * verbosity:   Sets the output verbosity flag
     *
     * @param array $input   An array of command arguments and options
     * @param array $options An array of execution options
     *
     * @return int The command exit code
     */
    public function execute(array $input, array $options = [])
    {
        // set the command name automatically if the application requires
        // this argument and no command name was passed
        if (!isset($input['command']) && null !== ($application = $this->command->getApplication()) && $application->getDefinition()->hasArgument('command')) {
            $input = \array_merge(['command' => $this->command->getName()], $input);
        }
        $this->input = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\ArrayInput($input);
        // Use an in-memory input stream even if no inputs are set so that QuestionHelper::ask() does not rely on the blocking STDIN.
        $this->input->setStream(self::createStream($this->inputs));
        if (isset($options['interactive'])) {
            $this->input->setInteractive($options['interactive']);
        }
        $this->output = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\StreamOutput(\fopen('php://memory', 'w', \false));
        $this->output->setDecorated(isset($options['decorated']) ? $options['decorated'] : \false);
        if (isset($options['verbosity'])) {
            $this->output->setVerbosity($options['verbosity']);
        }
        return $this->statusCode = $this->command->run($this->input, $this->output);
    }
    /**
     * Gets the display returned by the last execution of the command.
     *
     * @param bool $normalize Whether to normalize end of lines to \n or not
     *
     * @return string The display
     */
    public function getDisplay($normalize = \false)
    {
        if (null === $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;
    }
    /**
     * Gets the input instance used by the last execution of the command.
     *
     * @return InputInterface The current input instance
     */
    public function getInput()
    {
        return $this->input;
    }
    /**
     * Gets the output instance used by the last execution of the command.
     *
     * @return OutputInterface The current output instance
     */
    public function getOutput()
    {
        return $this->output;
    }
    /**
     * Gets the status code returned by the last execution of the application.
     *
     * @return int The status code
     */
    public function getStatusCode()
    {
        return $this->statusCode;
    }
    /**
     * Sets the user inputs.
     *
     * @param array $inputs An array of strings representing each input
     *                      passed to the command input stream
     *
     * @return CommandTester
     */
    public function setInputs(array $inputs)
    {
        $this->inputs = $inputs;
        return $this;
    }
    private static function createStream(array $inputs)
    {
        $stream = \fopen('php://memory', 'r+', \false);
        foreach ($inputs as $input) {
            \fwrite($stream, $input . \PHP_EOL);
        }
        \rewind($stream);
        return $stream;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Tester;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Application;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\ArrayInput;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\ConsoleOutput;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\StreamOutput;
/**
 * Eases the testing of console applications.
 *
 * When testing an application, don't forget to disable the auto exit flag:
 *
 *     $application = new Application();
 *     $application->setAutoExit(false);
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ApplicationTester
{
    private $application;
    private $input;
    private $statusCode;
    /**
     * @var OutputInterface
     */
    private $output;
    private $captureStreamsIndependently = \false;
    public function __construct(\_HumbugBoxb94336daae36\Symfony\Component\Console\Application $application)
    {
        $this->application = $application;
    }
    /**
     * Executes the application.
     *
     * Available options:
     *
     *  * interactive:               Sets the input interactive flag
     *  * decorated:                 Sets the output decorated flag
     *  * verbosity:                 Sets the output verbosity flag
     *  * capture_stderr_separately: Make output of stdOut and stdErr separately available
     *
     * @param array $input   An array of arguments and options
     * @param array $options An array of options
     *
     * @return int The command exit code
     */
    public function run(array $input, $options = [])
    {
        $this->input = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\ArrayInput($input);
        if (isset($options['interactive'])) {
            $this->input->setInteractive($options['interactive']);
        }
        $this->captureStreamsIndependently = \array_key_exists('capture_stderr_separately', $options) && $options['capture_stderr_separately'];
        if (!$this->captureStreamsIndependently) {
            $this->output = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\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 \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\ConsoleOutput(isset($options['verbosity']) ? $options['verbosity'] : \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\ConsoleOutput::VERBOSITY_NORMAL, isset($options['decorated']) ? $options['decorated'] : null);
            $errorOutput = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\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->setAccessible(\true);
            $strErrProperty->setValue($this->output, $errorOutput);
            $reflectedParent = $reflectedOutput->getParentClass();
            $streamProperty = $reflectedParent->getProperty('stream');
            $streamProperty->setAccessible(\true);
            $streamProperty->setValue($this->output, \fopen('php://memory', 'w', \false));
        }
        return $this->statusCode = $this->application->run($this->input, $this->output);
    }
    /**
     * Gets the display returned by the last execution of the application.
     *
     * @param bool $normalize Whether to normalize end of lines to \n or not
     *
     * @return string The display
     */
    public function getDisplay($normalize = \false)
    {
        \rewind($this->output->getStream());
        $display = \stream_get_contents($this->output->getStream());
        if ($normalize) {
            $display = \str_replace(\PHP_EOL, "\n", $display);
        }
        return $display;
    }
    /**
     * Gets the output written to STDERR by the application.
     *
     * @param bool $normalize Whether to normalize end of lines to \n or not
     *
     * @return string
     */
    public function getErrorOutput($normalize = \false)
    {
        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;
    }
    /**
     * Gets the input instance used by the last execution of the application.
     *
     * @return InputInterface The current input instance
     */
    public function getInput()
    {
        return $this->input;
    }
    /**
     * Gets the output instance used by the last execution of the application.
     *
     * @return OutputInterface The current output instance
     */
    public function getOutput()
    {
        return $this->output;
    }
    /**
     * Gets the status code returned by the last execution of the application.
     *
     * @return int The status code
     */
    public function getStatusCode()
    {
        return $this->statusCode;
    }
}
<?xml version="1.0" encoding="UTF-8"?>

<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/5.2/phpunit.xsd"
         backupGlobals="false"
         colors="true"
         bootstrap="vendor/autoload.php"
         failOnRisky="true"
         failOnWarning="true"
>
    <php>
        <ini name="error_reporting" value="-1" />
    </php>

    <testsuites>
        <testsuite name="Symfony Console Component Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./Resources</directory>
                <directory>./Tests</directory>
                <directory>./vendor</directory>
            </exclude>
        </whitelist>
    </filter>

    <listeners>
        <listener class="Symfony\Bridge\PhpUnit\SymfonyTestsListener">
            <arguments>
                <array>
                    <element key="time-sensitive"><string>Symfony\Component\Console</string></element>
                </array>
            </arguments>
        </listener>
    </listeners>
</phpunit>
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Command;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\RuntimeException;
use _HumbugBoxb94336daae36\Symfony\Component\Lock\Factory;
use _HumbugBoxb94336daae36\Symfony\Component\Lock\Lock;
use _HumbugBoxb94336daae36\Symfony\Component\Lock\Store\FlockStore;
use _HumbugBoxb94336daae36\Symfony\Component\Lock\Store\SemaphoreStore;
/**
 * Basic lock feature for commands.
 *
 * @author Geoffrey Brier <geoffrey.brier@gmail.com>
 */
trait LockableTrait
{
    /** @var Lock */
    private $lock;
    /**
     * Locks a command.
     *
     * @return bool
     */
    private function lock($name = null, $blocking = \false)
    {
        if (!\class_exists(\_HumbugBoxb94336daae36\Symfony\Component\Lock\Store\SemaphoreStore::class)) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\RuntimeException('To enable the locking feature you must install the symfony/lock component.');
        }
        if (null !== $this->lock) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException('A lock is already in place.');
        }
        if (\_HumbugBoxb94336daae36\Symfony\Component\Lock\Store\SemaphoreStore::isSupported($blocking)) {
            $store = new \_HumbugBoxb94336daae36\Symfony\Component\Lock\Store\SemaphoreStore();
        } else {
            $store = new \_HumbugBoxb94336daae36\Symfony\Component\Lock\Store\FlockStore();
        }
        $this->lock = (new \_HumbugBoxb94336daae36\Symfony\Component\Lock\Factory($store))->createLock($name ?: $this->getName());
        if (!$this->lock->acquire($blocking)) {
            $this->lock = null;
            return \false;
        }
        return \true;
    }
    /**
     * Releases the command lock if there is one.
     */
    private function release()
    {
        if ($this->lock) {
            $this->lock->release();
            $this->lock = null;
        }
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Command;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Helper\DescriptorHelper;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
/**
 * HelpCommand displays the help for a given command.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class HelpCommand extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command
{
    private $command;
    /**
     * {@inheritdoc}
     */
    protected function configure()
    {
        $this->ignoreValidationErrors();
        $this->setName('help')->setDefinition([new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument('command_name', \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument::OPTIONAL, 'The command name', 'help'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption('format', null, \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption('raw', null, \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_NONE, 'To output raw command help')])->setDescription('Displays help for a command')->setHelp(<<<'EOF'
The <info>%command.name%</info> command displays help for a given command:

  <info>php %command.full_name% list</info>

You can also output the help in other formats by using the <comment>--format</comment> option:

  <info>php %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(\_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command $command)
    {
        $this->command = $command;
    }
    /**
     * {@inheritdoc}
     */
    protected function execute(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output)
    {
        if (null === $this->command) {
            $this->command = $this->getApplication()->find($input->getArgument('command_name'));
        }
        $helper = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\DescriptorHelper();
        $helper->describe($output, $this->command, ['format' => $input->getOption('format'), 'raw_text' => $input->getOption('raw')]);
        $this->command = null;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Command;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Helper\DescriptorHelper;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
/**
 * ListCommand displays the list of all available commands for the application.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ListCommand extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command
{
    /**
     * {@inheritdoc}
     */
    protected function configure()
    {
        $this->setName('list')->setDefinition($this->createDefinition())->setDescription('Lists commands')->setHelp(<<<'EOF'
The <info>%command.name%</info> command lists all commands:

  <info>php %command.full_name%</info>

You can also display the commands for a specific namespace:

  <info>php %command.full_name% test</info>

You can also output the information in other formats by using the <comment>--format</comment> option:

  <info>php %command.full_name% --format=xml</info>

It's also possible to get raw list of commands (useful for embedding command runner):

  <info>php %command.full_name% --raw</info>
EOF
);
    }
    /**
     * {@inheritdoc}
     */
    public function getNativeDefinition()
    {
        return $this->createDefinition();
    }
    /**
     * {@inheritdoc}
     */
    protected function execute(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output)
    {
        $helper = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\DescriptorHelper();
        $helper->describe($output, $this->getApplication(), ['format' => $input->getOption('format'), 'raw_text' => $input->getOption('raw'), 'namespace' => $input->getArgument('namespace')]);
    }
    /**
     * {@inheritdoc}
     */
    private function createDefinition()
    {
        return new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition([new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument('namespace', \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument::OPTIONAL, 'The namespace name'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption('raw', null, \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_NONE, 'To output raw command list'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption('format', null, \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt')]);
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Command;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Application;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\ExceptionInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Helper\HelperSet;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
/**
 * Base class for all commands.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Command
{
    /**
     * @var string|null The default command name
     */
    protected static $defaultName;
    private $application;
    private $name;
    private $processTitle;
    private $aliases = [];
    private $definition;
    private $hidden = \false;
    private $help;
    private $description;
    private $ignoreValidationErrors = \false;
    private $applicationDefinitionMerged = \false;
    private $applicationDefinitionMergedWithArgs = \false;
    private $code;
    private $synopsis = [];
    private $usages = [];
    private $helperSet;
    /**
     * @return string|null The default command name or null when no default name is set
     */
    public static function getDefaultName()
    {
        $class = \get_called_class();
        $r = new \ReflectionProperty($class, 'defaultName');
        return $class === $r->class ? static::$defaultName : null;
    }
    /**
     * @param string|null $name The name of the command; passing null means it must be set in configure()
     *
     * @throws LogicException When the command name is empty
     */
    public function __construct($name = null)
    {
        $this->definition = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition();
        if (null !== $name || null !== ($name = static::getDefaultName())) {
            $this->setName($name);
        }
        $this->configure();
    }
    /**
     * Ignores validation errors.
     *
     * This is mainly useful for the help command.
     */
    public function ignoreValidationErrors()
    {
        $this->ignoreValidationErrors = \true;
    }
    public function setApplication(\_HumbugBoxb94336daae36\Symfony\Component\Console\Application $application = null)
    {
        $this->application = $application;
        if ($application) {
            $this->setHelperSet($application->getHelperSet());
        } else {
            $this->helperSet = null;
        }
    }
    public function setHelperSet(\_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\HelperSet $helperSet)
    {
        $this->helperSet = $helperSet;
    }
    /**
     * Gets the helper set.
     *
     * @return HelperSet A HelperSet instance
     */
    public function getHelperSet()
    {
        return $this->helperSet;
    }
    /**
     * Gets the application instance for this command.
     *
     * @return Application An Application instance
     */
    public function getApplication()
    {
        return $this->application;
    }
    /**
     * Checks whether the command is enabled or not in the current environment.
     *
     * Override this to check for x or y and return false if the command can not
     * run properly under the current conditions.
     *
     * @return bool
     */
    public function isEnabled()
    {
        return \true;
    }
    /**
     * Configures the current command.
     */
    protected function configure()
    {
    }
    /**
     * Executes the current command.
     *
     * This method is not abstract because you can use this class
     * as a concrete class. In this case, instead of defining the
     * execute() method, you set the code to execute by passing
     * a Closure to the setCode() method.
     *
     * @return int|null null or 0 if everything went fine, or an error code
     *
     * @throws LogicException When this abstract method is not implemented
     *
     * @see setCode()
     */
    protected function execute(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output)
    {
        throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException('You must override the execute() method in the concrete command class.');
    }
    /**
     * Interacts with the user.
     *
     * This method is executed before the InputDefinition is validated.
     * This means that this is the only place where the command can
     * interactively ask for values of missing required arguments.
     */
    protected function interact(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output)
    {
    }
    /**
     * Initializes the command after the input has been bound and before the input
     * is validated.
     *
     * This is mainly useful when a lot of commands extends one main command
     * where some things need to be initialized based on the input arguments and options.
     *
     * @see InputInterface::bind()
     * @see InputInterface::validate()
     */
    protected function initialize(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output)
    {
    }
    /**
     * Runs the command.
     *
     * The code to execute is either defined directly with the
     * setCode() method or by overriding the execute() method
     * in a sub-class.
     *
     * @return int The command exit code
     *
     * @throws \Exception When binding input fails. Bypass this by calling {@link ignoreValidationErrors()}.
     *
     * @see setCode()
     * @see execute()
     */
    public function run(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output)
    {
        // force the creation of the synopsis before the merge with the app definition
        $this->getSynopsis(\true);
        $this->getSynopsis(\false);
        // add the application arguments and options
        $this->mergeApplicationDefinition();
        // bind the input against the command specific arguments/options
        try {
            $input->bind($this->definition);
        } catch (\_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\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>', \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_VERY_VERBOSE);
                    } else {
                        \cli_set_process_title($this->processTitle);
                    }
                }
            } elseif (\function_exists('_HumbugBoxb94336daae36\\setproctitle')) {
                setproctitle($this->processTitle);
            } elseif (\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\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);
        }
        // The command name argument is often omitted when a command is executed directly with its run() method.
        // It would fail the validation if we didn't make sure the command argument is present,
        // since it's required by the application.
        if ($input->hasArgument('command') && null === $input->getArgument('command')) {
            $input->setArgument('command', $this->getName());
        }
        $input->validate();
        if ($this->code) {
            $statusCode = \call_user_func($this->code, $input, $output);
        } else {
            $statusCode = $this->execute($input, $output);
        }
        return \is_numeric($statusCode) ? (int) $statusCode : 0;
    }
    /**
     * Sets the code to execute when running this command.
     *
     * If this method is used, it overrides the code defined
     * in the execute() method.
     *
     * @param callable $code A callable(InputInterface $input, OutputInterface $output)
     *
     * @return $this
     *
     * @throws InvalidArgumentException
     *
     * @see execute()
     */
    public function setCode(callable $code)
    {
        if ($code instanceof \Closure) {
            $r = new \ReflectionFunction($code);
            if (null === $r->getClosureThis()) {
                if (\PHP_VERSION_ID < 70000) {
                    // Bug in PHP5: https://bugs.php.net/bug.php?id=64761
                    // This means that we cannot bind static closures and therefore we must
                    // ignore any errors here.  There is no way to test if the closure is
                    // bindable.
                    $code = @\Closure::bind($code, $this);
                } else {
                    $code = \Closure::bind($code, $this);
                }
            }
        }
        $this->code = $code;
        return $this;
    }
    /**
     * Merges the application definition with the command definition.
     *
     * This method is not part of public API and should not be used directly.
     *
     * @param bool $mergeArgs Whether to merge or not the Application definition arguments to Command definition arguments
     */
    public function mergeApplicationDefinition($mergeArgs = \true)
    {
        if (null === $this->application || \true === $this->applicationDefinitionMerged && ($this->applicationDefinitionMergedWithArgs || !$mergeArgs)) {
            return;
        }
        $this->definition->addOptions($this->application->getDefinition()->getOptions());
        $this->applicationDefinitionMerged = \true;
        if ($mergeArgs) {
            $currentArguments = $this->definition->getArguments();
            $this->definition->setArguments($this->application->getDefinition()->getArguments());
            $this->definition->addArguments($currentArguments);
            $this->applicationDefinitionMergedWithArgs = \true;
        }
    }
    /**
     * Sets an array of argument and option instances.
     *
     * @param array|InputDefinition $definition An array of argument and option instances or a definition instance
     *
     * @return $this
     */
    public function setDefinition($definition)
    {
        if ($definition instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputDefinition) {
            $this->definition = $definition;
        } else {
            $this->definition->setDefinition($definition);
        }
        $this->applicationDefinitionMerged = \false;
        return $this;
    }
    /**
     * Gets the InputDefinition attached to this Command.
     *
     * @return InputDefinition An InputDefinition instance
     */
    public function getDefinition()
    {
        return $this->definition;
    }
    /**
     * Gets the InputDefinition to be used to create representations of this Command.
     *
     * Can be overridden to provide the original command representation when it would otherwise
     * be changed by merging with the application InputDefinition.
     *
     * This method is not part of public API and should not be used directly.
     *
     * @return InputDefinition An InputDefinition instance
     */
    public function getNativeDefinition()
    {
        return $this->getDefinition();
    }
    /**
     * Adds an argument.
     *
     * @param string               $name        The argument name
     * @param int|null             $mode        The argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL
     * @param string               $description A description text
     * @param string|string[]|null $default     The default value (for InputArgument::OPTIONAL mode only)
     *
     * @throws InvalidArgumentException When argument mode is not valid
     *
     * @return $this
     */
    public function addArgument($name, $mode = null, $description = '', $default = null)
    {
        $this->definition->addArgument(new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument($name, $mode, $description, $default));
        return $this;
    }
    /**
     * Adds an option.
     *
     * @param string                        $name        The option name
     * @param string|array|null             $shortcut    The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts
     * @param int|null                      $mode        The option mode: One of the InputOption::VALUE_* constants
     * @param string                        $description A description text
     * @param string|string[]|int|bool|null $default     The default value (must be null for InputOption::VALUE_NONE)
     *
     * @throws InvalidArgumentException If option mode is invalid or incompatible
     *
     * @return $this
     */
    public function addOption($name, $shortcut = null, $mode = null, $description = '', $default = null)
    {
        $this->definition->addOption(new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption($name, $shortcut, $mode, $description, $default));
        return $this;
    }
    /**
     * Sets the name of the command.
     *
     * This method can set both the namespace and the name if
     * you separate them by a colon (:)
     *
     *     $command->setName('foo:bar');
     *
     * @param string $name The command name
     *
     * @return $this
     *
     * @throws InvalidArgumentException When the name is invalid
     */
    public function setName($name)
    {
        $this->validateName($name);
        $this->name = $name;
        return $this;
    }
    /**
     * Sets the process title of the command.
     *
     * This feature should be used only when creating a long process command,
     * like a daemon.
     *
     * PHP 5.5+ or the proctitle PECL library is required
     *
     * @param string $title The process title
     *
     * @return $this
     */
    public function setProcessTitle($title)
    {
        $this->processTitle = $title;
        return $this;
    }
    /**
     * Returns the command name.
     *
     * @return string The command name
     */
    public function getName()
    {
        return $this->name;
    }
    /**
     * @param bool $hidden Whether or not the command should be hidden from the list of commands
     *
     * @return Command The current instance
     */
    public function setHidden($hidden)
    {
        $this->hidden = (bool) $hidden;
        return $this;
    }
    /**
     * @return bool whether the command should be publicly shown or not
     */
    public function isHidden()
    {
        return $this->hidden;
    }
    /**
     * Sets the description for the command.
     *
     * @param string $description The description for the command
     *
     * @return $this
     */
    public function setDescription($description)
    {
        $this->description = $description;
        return $this;
    }
    /**
     * Returns the description for the command.
     *
     * @return string The description for the command
     */
    public function getDescription()
    {
        return $this->description;
    }
    /**
     * Sets the help for the command.
     *
     * @param string $help The help for the command
     *
     * @return $this
     */
    public function setHelp($help)
    {
        $this->help = $help;
        return $this;
    }
    /**
     * Returns the help for the command.
     *
     * @return string The help for the command
     */
    public function getHelp()
    {
        return $this->help;
    }
    /**
     * Returns the processed help for the command replacing the %command.name% and
     * %command.full_name% patterns with the real values dynamically.
     *
     * @return string The processed help for the command
     */
    public function getProcessedHelp()
    {
        $name = $this->name;
        $isSingleCommand = $this->application && $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());
    }
    /**
     * Sets the aliases for the command.
     *
     * @param string[] $aliases An array of aliases for the command
     *
     * @return $this
     *
     * @throws InvalidArgumentException When an alias is invalid
     */
    public function setAliases($aliases)
    {
        if (!\is_array($aliases) && !$aliases instanceof \Traversable) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException('$aliases must be an array or an instance of \\Traversable');
        }
        foreach ($aliases as $alias) {
            $this->validateName($alias);
        }
        $this->aliases = $aliases;
        return $this;
    }
    /**
     * Returns the aliases for the command.
     *
     * @return array An array of aliases for the command
     */
    public function getAliases()
    {
        return $this->aliases;
    }
    /**
     * Returns the synopsis for the command.
     *
     * @param bool $short Whether to show the short version of the synopsis (with options folded) or not
     *
     * @return string The synopsis
     */
    public function getSynopsis($short = \false)
    {
        $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];
    }
    /**
     * Add a command usage example.
     *
     * @param string $usage The usage, it'll be prefixed with the command name
     *
     * @return $this
     */
    public function addUsage($usage)
    {
        if (0 !== \strpos($usage, $this->name)) {
            $usage = \sprintf('%s %s', $this->name, $usage);
        }
        $this->usages[] = $usage;
        return $this;
    }
    /**
     * Returns alternative usages of the command.
     *
     * @return array
     */
    public function getUsages()
    {
        return $this->usages;
    }
    /**
     * Gets a helper instance by name.
     *
     * @param string $name The helper name
     *
     * @return mixed The helper value
     *
     * @throws LogicException           if no HelperSet is defined
     * @throws InvalidArgumentException if the helper is not defined
     */
    public function getHelper($name)
    {
        if (null === $this->helperSet) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\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);
    }
    /**
     * Validates a command name.
     *
     * It must be non-empty and parts can optionally be separated by ":".
     *
     * @param string $name
     *
     * @throws InvalidArgumentException When the name is invalid
     */
    private function validateName($name)
    {
        if (!\preg_match('/^[^\\:]++(\\:[^\\:]++)*$/', $name)) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('Command name "%s" is invalid.', $name));
        }
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Helper;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException;
/**
 * Defines the styles for a Table.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Саша Стаменковић <umpirsky@gmail.com>
 */
class TableStyle
{
    private $paddingChar = ' ';
    private $horizontalBorderChar = '-';
    private $verticalBorderChar = '|';
    private $crossingChar = '+';
    private $cellHeaderFormat = '<info>%s</info>';
    private $cellRowFormat = '%s';
    private $cellRowContentFormat = ' %s ';
    private $borderFormat = '%s';
    private $padType = \STR_PAD_RIGHT;
    /**
     * Sets padding character, used for cell padding.
     *
     * @param string $paddingChar
     *
     * @return $this
     */
    public function setPaddingChar($paddingChar)
    {
        if (!$paddingChar) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException('The padding char must not be empty');
        }
        $this->paddingChar = $paddingChar;
        return $this;
    }
    /**
     * Gets padding character, used for cell padding.
     *
     * @return string
     */
    public function getPaddingChar()
    {
        return $this->paddingChar;
    }
    /**
     * Sets horizontal border character.
     *
     * @param string $horizontalBorderChar
     *
     * @return $this
     */
    public function setHorizontalBorderChar($horizontalBorderChar)
    {
        $this->horizontalBorderChar = $horizontalBorderChar;
        return $this;
    }
    /**
     * Gets horizontal border character.
     *
     * @return string
     */
    public function getHorizontalBorderChar()
    {
        return $this->horizontalBorderChar;
    }
    /**
     * Sets vertical border character.
     *
     * @param string $verticalBorderChar
     *
     * @return $this
     */
    public function setVerticalBorderChar($verticalBorderChar)
    {
        $this->verticalBorderChar = $verticalBorderChar;
        return $this;
    }
    /**
     * Gets vertical border character.
     *
     * @return string
     */
    public function getVerticalBorderChar()
    {
        return $this->verticalBorderChar;
    }
    /**
     * Sets crossing character.
     *
     * @param string $crossingChar
     *
     * @return $this
     */
    public function setCrossingChar($crossingChar)
    {
        $this->crossingChar = $crossingChar;
        return $this;
    }
    /**
     * Gets crossing character.
     *
     * @return string
     */
    public function getCrossingChar()
    {
        return $this->crossingChar;
    }
    /**
     * Sets header cell format.
     *
     * @param string $cellHeaderFormat
     *
     * @return $this
     */
    public function setCellHeaderFormat($cellHeaderFormat)
    {
        $this->cellHeaderFormat = $cellHeaderFormat;
        return $this;
    }
    /**
     * Gets header cell format.
     *
     * @return string
     */
    public function getCellHeaderFormat()
    {
        return $this->cellHeaderFormat;
    }
    /**
     * Sets row cell format.
     *
     * @param string $cellRowFormat
     *
     * @return $this
     */
    public function setCellRowFormat($cellRowFormat)
    {
        $this->cellRowFormat = $cellRowFormat;
        return $this;
    }
    /**
     * Gets row cell format.
     *
     * @return string
     */
    public function getCellRowFormat()
    {
        return $this->cellRowFormat;
    }
    /**
     * Sets row cell content format.
     *
     * @param string $cellRowContentFormat
     *
     * @return $this
     */
    public function setCellRowContentFormat($cellRowContentFormat)
    {
        $this->cellRowContentFormat = $cellRowContentFormat;
        return $this;
    }
    /**
     * Gets row cell content format.
     *
     * @return string
     */
    public function getCellRowContentFormat()
    {
        return $this->cellRowContentFormat;
    }
    /**
     * Sets table border format.
     *
     * @param string $borderFormat
     *
     * @return $this
     */
    public function setBorderFormat($borderFormat)
    {
        $this->borderFormat = $borderFormat;
        return $this;
    }
    /**
     * Gets table border format.
     *
     * @return string
     */
    public function getBorderFormat()
    {
        return $this->borderFormat;
    }
    /**
     * Sets cell padding type.
     *
     * @param int $padType STR_PAD_*
     *
     * @return $this
     */
    public function setPadType($padType)
    {
        if (!\in_array($padType, [\STR_PAD_LEFT, \STR_PAD_RIGHT, \STR_PAD_BOTH], \true)) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException('Invalid padding type. Expected one of (STR_PAD_LEFT, STR_PAD_RIGHT, STR_PAD_BOTH).');
        }
        $this->padType = $padType;
        return $this;
    }
    /**
     * Gets cell padding type.
     *
     * @return int
     */
    public function getPadType()
    {
        return $this->padType;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Helper;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatter;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Question\ChoiceQuestion;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Question\ConfirmationQuestion;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Question\Question;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Style\SymfonyStyle;
/**
 * Symfony Style Guide compliant question helper.
 *
 * @author Kevin Bond <kevinbond@gmail.com>
 */
class SymfonyQuestionHelper extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\QuestionHelper
{
    /**
     * {@inheritdoc}
     *
     * To be removed in 4.0
     */
    public function ask(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, \_HumbugBoxb94336daae36\Symfony\Component\Console\Question\Question $question)
    {
        $validator = $question->getValidator();
        $question->setValidator(function ($value) use($validator) {
            if (null !== $validator) {
                $value = $validator($value);
            } else {
                // make required
                if (!\is_array($value) && !\is_bool($value) && 0 === \strlen($value)) {
                    @\trigger_error('The default question validator is deprecated since Symfony 3.3 and will not be used anymore in version 4.0. Set a custom question validator if needed.', \E_USER_DEPRECATED);
                    throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException('A value is required.');
                }
            }
            return $value;
        });
        return parent::ask($input, $output, $question);
    }
    /**
     * {@inheritdoc}
     */
    protected function writePrompt(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, \_HumbugBoxb94336daae36\Symfony\Component\Console\Question\Question $question)
    {
        $text = \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatter::escapeTrailingBackslash($question->getQuestion());
        $default = $question->getDefault();
        switch (\true) {
            case null === $default:
                $text = \sprintf(' <info>%s</info>:', $text);
                break;
            case $question instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Question\ConfirmationQuestion:
                $text = \sprintf(' <info>%s (yes/no)</info> [<comment>%s</comment>]:', $text, $default ? 'yes' : 'no');
                break;
            case $question instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Question\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, \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatter::escape(\implode(', ', $default)));
                break;
            case $question instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Question\ChoiceQuestion:
                $choices = $question->getChoices();
                $text = \sprintf(' <info>%s</info> [<comment>%s</comment>]:', $text, \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatter::escape(isset($choices[$default]) ? $choices[$default] : $default));
                break;
            default:
                $text = \sprintf(' <info>%s</info> [<comment>%s</comment>]:', $text, \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatter::escape($default));
        }
        $output->writeln($text);
        if ($question instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Question\ChoiceQuestion) {
            $width = \max(\array_map('strlen', \array_keys($question->getChoices())));
            foreach ($question->getChoices() as $key => $value) {
                $output->writeln(\sprintf("  [<comment>%-{$width}s</comment>] %s", $key, $value));
            }
        }
        $output->write(' > ');
    }
    /**
     * {@inheritdoc}
     */
    protected function writeError(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, \Exception $error)
    {
        if ($output instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Style\SymfonyStyle) {
            $output->newLine();
            $output->error($error->getMessage());
            return;
        }
        parent::writeError($output, $error);
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Helper;

/**
 * HelperInterface is the interface all helpers must implement.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface HelperInterface
{
    /**
     * Sets the helper set associated with this helper.
     */
    public function setHelperSet(\_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\HelperSet $helperSet = null);
    /**
     * Gets the helper set associated with this helper.
     *
     * @return HelperSet A HelperSet instance
     */
    public function getHelperSet();
    /**
     * Returns the canonical name of this helper.
     *
     * @return string The canonical name
     */
    public function getName();
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Helper;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException;
/**
 * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
 */
class TableCell
{
    private $value;
    private $options = ['rowspan' => 1, 'colspan' => 1];
    /**
     * @param string $value
     * @param array  $options
     */
    public function __construct($value = '', array $options = [])
    {
        if (\is_numeric($value) && !\is_string($value)) {
            $value = (string) $value;
        }
        $this->value = $value;
        // check option names
        if ($diff = \array_diff(\array_keys($options), \array_keys($this->options))) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('The TableCell does not support the following options: \'%s\'.', \implode('\', \'', $diff)));
        }
        $this->options = \array_merge($this->options, $options);
    }
    /**
     * Returns the cell value.
     *
     * @return string
     */
    public function __toString()
    {
        return $this->value;
    }
    /**
     * Gets number of colspan.
     *
     * @return int
     */
    public function getColspan()
    {
        return (int) $this->options['colspan'];
    }
    /**
     * Gets number of rowspan.
     *
     * @return int
     */
    public function getRowspan()
    {
        return (int) $this->options['rowspan'];
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Helper;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\ConsoleOutputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Process\Exception\ProcessFailedException;
use _HumbugBoxb94336daae36\Symfony\Component\Process\Process;
/**
 * The ProcessHelper class provides helpers to run external processes.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ProcessHelper extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper
{
    /**
     * Runs an external process.
     *
     * @param OutputInterface      $output    An OutputInterface instance
     * @param string|array|Process $cmd       An instance of Process or an array of arguments to escape and run or a command to run
     * @param string|null          $error     An error message that must be displayed if something went wrong
     * @param callable|null        $callback  A PHP callback to run whenever there is some
     *                                        output available on STDOUT or STDERR
     * @param int                  $verbosity The threshold for verbosity
     *
     * @return Process The process that ran
     */
    public function run(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, $cmd, $error = null, callable $callback = null, $verbosity = \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_VERY_VERBOSE)
    {
        if ($output instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\ConsoleOutputInterface) {
            $output = $output->getErrorOutput();
        }
        $formatter = $this->getHelperSet()->get('debug_formatter');
        if ($cmd instanceof \_HumbugBoxb94336daae36\Symfony\Component\Process\Process) {
            $process = $cmd;
        } else {
            $process = new \_HumbugBoxb94336daae36\Symfony\Component\Process\Process($cmd);
        }
        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);
        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;
    }
    /**
     * Runs the process.
     *
     * This is identical to run() except that an exception is thrown if the process
     * exits with a non-zero exit code.
     *
     * @param OutputInterface $output   An OutputInterface instance
     * @param string|Process  $cmd      An instance of Process or a command to run
     * @param string|null     $error    An error message that must be displayed if something went wrong
     * @param callable|null   $callback A PHP callback to run whenever there is some
     *                                  output available on STDOUT or STDERR
     *
     * @return Process The process that ran
     *
     * @throws ProcessFailedException
     *
     * @see run()
     */
    public function mustRun(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, $cmd, $error = null, callable $callback = null)
    {
        $process = $this->run($output, $cmd, $error, $callback);
        if (!$process->isSuccessful()) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Process\Exception\ProcessFailedException($process);
        }
        return $process;
    }
    /**
     * Wraps a Process callback to add debugging output.
     *
     * @param OutputInterface $output   An OutputInterface interface
     * @param Process         $process  The Process
     * @param callable|null   $callback A PHP callable
     *
     * @return callable
     */
    public function wrapCallback(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, \_HumbugBoxb94336daae36\Symfony\Component\Process\Process $process, callable $callback = null)
    {
        if ($output instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\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), \_HumbugBoxb94336daae36\Symfony\Component\Process\Process::ERR === $type));
            if (null !== $callback) {
                \call_user_func($callback, $type, $buffer);
            }
        };
    }
    private function escapeString($str)
    {
        return \str_replace('<', '\\<', $str);
    }
    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'process';
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Helper;

/**
 * Marks a row as being a separator.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class TableSeparator extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableCell
{
    public function __construct(array $options = [])
    {
        parent::__construct('', $options);
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Helper;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatter;
/**
 * The Formatter class provides helpers to format messages.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class FormatterHelper extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper
{
    /**
     * Formats a message within a section.
     *
     * @param string $section The section name
     * @param string $message The message
     * @param string $style   The style to apply to the section
     *
     * @return string The format section
     */
    public function formatSection($section, $message, $style = 'info')
    {
        return \sprintf('<%s>[%s]</%s> %s', $style, $section, $style, $message);
    }
    /**
     * Formats a message as a block of text.
     *
     * @param string|array $messages The message to write in the block
     * @param string       $style    The style to apply to the whole block
     * @param bool         $large    Whether to return a large block
     *
     * @return string The formatter message
     */
    public function formatBlock($messages, $style, $large = \false)
    {
        if (!\is_array($messages)) {
            $messages = [$messages];
        }
        $len = 0;
        $lines = [];
        foreach ($messages as $message) {
            $message = \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatter::escape($message);
            $lines[] = \sprintf($large ? '  %s  ' : ' %s ', $message);
            $len = \max($this->strlen($message) + ($large ? 4 : 2), $len);
        }
        $messages = $large ? [\str_repeat(' ', $len)] : [];
        for ($i = 0; isset($lines[$i]); ++$i) {
            $messages[] = $lines[$i] . \str_repeat(' ', $len - $this->strlen($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);
    }
    /**
     * Truncates a message to the given length.
     *
     * @param string $message
     * @param int    $length
     * @param string $suffix
     *
     * @return string
     */
    public function truncate($message, $length, $suffix = '...')
    {
        $computedLength = $length - $this->strlen($suffix);
        if ($computedLength > $this->strlen($message)) {
            return $message;
        }
        if (\false === ($encoding = \mb_detect_encoding($message, null, \true))) {
            return \substr($message, 0, $length) . $suffix;
        }
        return \mb_substr($message, 0, $length, $encoding) . $suffix;
    }
    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'formatter';
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Helper;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\ConsoleOutputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Terminal;
/**
 * The ProgressBar provides helpers to display progress output.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Chris Jones <leeked@gmail.com>
 */
final class ProgressBar
{
    private $barWidth = 28;
    private $barChar;
    private $emptyBarChar = '-';
    private $progressChar = '>';
    private $format;
    private $internalFormat;
    private $redrawFreq = 1;
    private $output;
    private $step = 0;
    private $max;
    private $startTime;
    private $stepWidth;
    private $percent = 0.0;
    private $formatLineCount;
    private $messages = [];
    private $overwrite = \true;
    private $terminal;
    private $firstRun = \true;
    private static $formatters;
    private static $formats;
    /**
     * @param OutputInterface $output An OutputInterface instance
     * @param int             $max    Maximum steps (0 if unknown)
     */
    public function __construct(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, $max = 0)
    {
        if ($output instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\ConsoleOutputInterface) {
            $output = $output->getErrorOutput();
        }
        $this->output = $output;
        $this->setMaxSteps($max);
        $this->terminal = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Terminal();
        if (!$this->output->isDecorated()) {
            // disable overwrite when output does not support ANSI codes.
            $this->overwrite = \false;
            // set a reasonable redraw frequency so output isn't flooded
            $this->setRedrawFrequency($max / 10);
        }
        $this->startTime = \time();
    }
    /**
     * Sets a placeholder formatter for a given name.
     *
     * This method also allow you to override an existing placeholder.
     *
     * @param string   $name     The placeholder name (including the delimiter char like %)
     * @param callable $callable A PHP callable
     */
    public static function setPlaceholderFormatterDefinition($name, callable $callable)
    {
        if (!self::$formatters) {
            self::$formatters = self::initPlaceholderFormatters();
        }
        self::$formatters[$name] = $callable;
    }
    /**
     * Gets the placeholder formatter for a given name.
     *
     * @param string $name The placeholder name (including the delimiter char like %)
     *
     * @return callable|null A PHP callable
     */
    public static function getPlaceholderFormatterDefinition($name)
    {
        if (!self::$formatters) {
            self::$formatters = self::initPlaceholderFormatters();
        }
        return isset(self::$formatters[$name]) ? self::$formatters[$name] : null;
    }
    /**
     * Sets a format for a given name.
     *
     * This method also allow you to override an existing format.
     *
     * @param string $name   The format name
     * @param string $format A format string
     */
    public static function setFormatDefinition($name, $format)
    {
        if (!self::$formats) {
            self::$formats = self::initFormats();
        }
        self::$formats[$name] = $format;
    }
    /**
     * Gets the format for a given name.
     *
     * @param string $name The format name
     *
     * @return string|null A format string
     */
    public static function getFormatDefinition($name)
    {
        if (!self::$formats) {
            self::$formats = self::initFormats();
        }
        return isset(self::$formats[$name]) ? self::$formats[$name] : null;
    }
    /**
     * Associates a text with a named placeholder.
     *
     * The text is displayed when the progress bar is rendered but only
     * when the corresponding placeholder is part of the custom format line
     * (by wrapping the name with %).
     *
     * @param string $message The text to associate with the placeholder
     * @param string $name    The name of the placeholder
     */
    public function setMessage($message, $name = 'message')
    {
        $this->messages[$name] = $message;
    }
    public function getMessage($name = 'message')
    {
        return $this->messages[$name];
    }
    /**
     * Gets the progress bar start time.
     *
     * @return int The progress bar start time
     */
    public function getStartTime()
    {
        return $this->startTime;
    }
    /**
     * Gets the progress bar maximal steps.
     *
     * @return int The progress bar max steps
     */
    public function getMaxSteps()
    {
        return $this->max;
    }
    /**
     * Gets the current step position.
     *
     * @return int The progress bar step
     */
    public function getProgress()
    {
        return $this->step;
    }
    /**
     * Gets the progress bar step width.
     *
     * @return int The progress bar step width
     */
    private function getStepWidth()
    {
        return $this->stepWidth;
    }
    /**
     * Gets the current progress bar percent.
     *
     * @return float The current progress bar percent
     */
    public function getProgressPercent()
    {
        return $this->percent;
    }
    /**
     * Sets the progress bar width.
     *
     * @param int $size The progress bar size
     */
    public function setBarWidth($size)
    {
        $this->barWidth = \max(1, (int) $size);
    }
    /**
     * Gets the progress bar width.
     *
     * @return int The progress bar size
     */
    public function getBarWidth()
    {
        return $this->barWidth;
    }
    /**
     * Sets the bar character.
     *
     * @param string $char A character
     */
    public function setBarCharacter($char)
    {
        $this->barChar = $char;
    }
    /**
     * Gets the bar character.
     *
     * @return string A character
     */
    public function getBarCharacter()
    {
        if (null === $this->barChar) {
            return $this->max ? '=' : $this->emptyBarChar;
        }
        return $this->barChar;
    }
    /**
     * Sets the empty bar character.
     *
     * @param string $char A character
     */
    public function setEmptyBarCharacter($char)
    {
        $this->emptyBarChar = $char;
    }
    /**
     * Gets the empty bar character.
     *
     * @return string A character
     */
    public function getEmptyBarCharacter()
    {
        return $this->emptyBarChar;
    }
    /**
     * Sets the progress bar character.
     *
     * @param string $char A character
     */
    public function setProgressCharacter($char)
    {
        $this->progressChar = $char;
    }
    /**
     * Gets the progress bar character.
     *
     * @return string A character
     */
    public function getProgressCharacter()
    {
        return $this->progressChar;
    }
    /**
     * Sets the progress bar format.
     *
     * @param string $format The format
     */
    public function setFormat($format)
    {
        $this->format = null;
        $this->internalFormat = $format;
    }
    /**
     * Sets the redraw frequency.
     *
     * @param int|float $freq The frequency in steps
     */
    public function setRedrawFrequency($freq)
    {
        $this->redrawFreq = \max((int) $freq, 1);
    }
    /**
     * Starts the progress output.
     *
     * @param int|null $max Number of steps to complete the bar (0 if indeterminate), null to leave unchanged
     */
    public function start($max = null)
    {
        $this->startTime = \time();
        $this->step = 0;
        $this->percent = 0.0;
        if (null !== $max) {
            $this->setMaxSteps($max);
        }
        $this->display();
    }
    /**
     * Advances the progress output X steps.
     *
     * @param int $step Number of steps to advance
     */
    public function advance($step = 1)
    {
        $this->setProgress($this->step + $step);
    }
    /**
     * Sets whether to overwrite the progressbar, false for new line.
     *
     * @param bool $overwrite
     */
    public function setOverwrite($overwrite)
    {
        $this->overwrite = (bool) $overwrite;
    }
    /**
     * Sets the current progress.
     *
     * @param int $step The current progress
     */
    public function setProgress($step)
    {
        $step = (int) $step;
        if ($this->max && $step > $this->max) {
            $this->max = $step;
        } elseif ($step < 0) {
            $step = 0;
        }
        $prevPeriod = (int) ($this->step / $this->redrawFreq);
        $currPeriod = (int) ($step / $this->redrawFreq);
        $this->step = $step;
        $this->percent = $this->max ? (double) $this->step / $this->max : 0;
        if ($prevPeriod !== $currPeriod || $this->max === $step) {
            $this->display();
        }
    }
    /**
     * Finishes the progress output.
     */
    public function finish()
    {
        if (!$this->max) {
            $this->max = $this->step;
        }
        if ($this->step === $this->max && !$this->overwrite) {
            // prevent double 100% output
            return;
        }
        $this->setProgress($this->max);
    }
    /**
     * Outputs the current progress string.
     */
    public function display()
    {
        if (\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) {
            return;
        }
        if (null === $this->format) {
            $this->setRealFormat($this->internalFormat ?: $this->determineBestFormat());
        }
        $this->overwrite($this->buildLine());
    }
    /**
     * Removes the progress bar from the current line.
     *
     * This is useful if you wish to write some output
     * while a progress bar is running.
     * Call display() to show the progress bar again.
     */
    public function clear()
    {
        if (!$this->overwrite) {
            return;
        }
        if (null === $this->format) {
            $this->setRealFormat($this->internalFormat ?: $this->determineBestFormat());
        }
        $this->overwrite('');
    }
    /**
     * Sets the progress bar format.
     *
     * @param string $format The format
     */
    private function setRealFormat($format)
    {
        // try to use the _nomax variant if available
        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;
        }
        $this->formatLineCount = \substr_count($this->format, "\n");
    }
    /**
     * Sets the progress bar maximal steps.
     *
     * @param int $max The progress bar max steps
     */
    private function setMaxSteps($max)
    {
        $this->max = \max(0, (int) $max);
        $this->stepWidth = $this->max ? \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlen($this->max) : 4;
    }
    /**
     * Overwrites a previous message to the output.
     *
     * @param string $message The message
     */
    private function overwrite($message)
    {
        if ($this->overwrite) {
            if (!$this->firstRun) {
                // Erase previous lines
                if ($this->formatLineCount > 0) {
                    $message = \str_repeat("\33[1A\33[2K", $this->formatLineCount) . $message;
                }
                // Move the cursor to the beginning of the line and erase the line
                $message = "\r\33[2K{$message}";
            }
        } elseif ($this->step > 0) {
            $message = \PHP_EOL . $message;
        }
        $this->firstRun = \false;
        $this->output->write($message);
    }
    private function determineBestFormat()
    {
        switch ($this->output->getVerbosity()) {
            // OutputInterface::VERBOSITY_QUIET: display is disabled anyway
            case \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_VERBOSE:
                return $this->max ? 'verbose' : 'verbose_nomax';
            case \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_VERY_VERBOSE:
                return $this->max ? 'very_verbose' : 'very_verbose_nomax';
            case \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_DEBUG:
                return $this->max ? 'debug' : 'debug_nomax';
            default:
                return $this->max ? 'normal' : 'normal_nomax';
        }
    }
    private static function initPlaceholderFormatters()
    {
        return ['bar' => function (self $bar, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output) {
            $completeBars = \floor($bar->getMaxSteps() > 0 ? $bar->getProgressPercent() * $bar->getBarWidth() : $bar->getProgress() % $bar->getBarWidth());
            $display = \str_repeat($bar->getBarCharacter(), $completeBars);
            if ($completeBars < $bar->getBarWidth()) {
                $emptyBars = $bar->getBarWidth() - $completeBars - \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlenWithoutDecoration($output->getFormatter(), $bar->getProgressCharacter());
                $display .= $bar->getProgressCharacter() . \str_repeat($bar->getEmptyBarCharacter(), $emptyBars);
            }
            return $display;
        }, 'elapsed' => function (self $bar) {
            return \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::formatTime(\time() - $bar->getStartTime());
        }, 'remaining' => function (self $bar) {
            if (!$bar->getMaxSteps()) {
                throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException('Unable to display the remaining time if the maximum number of steps is not set.');
            }
            if (!$bar->getProgress()) {
                $remaining = 0;
            } else {
                $remaining = \round((\time() - $bar->getStartTime()) / $bar->getProgress() * ($bar->getMaxSteps() - $bar->getProgress()));
            }
            return \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::formatTime($remaining);
        }, 'estimated' => function (self $bar) {
            if (!$bar->getMaxSteps()) {
                throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException('Unable to display the estimated time if the maximum number of steps is not set.');
            }
            if (!$bar->getProgress()) {
                $estimated = 0;
            } else {
                $estimated = \round((\time() - $bar->getStartTime()) / $bar->getProgress() * $bar->getMaxSteps());
            }
            return \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::formatTime($estimated);
        }, 'memory' => function (self $bar) {
            return \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::formatMemory(\memory_get_usage(\true));
        }, 'current' => function (self $bar) {
            return \str_pad($bar->getProgress(), $bar->getStepWidth(), ' ', \STR_PAD_LEFT);
        }, 'max' => function (self $bar) {
            return $bar->getMaxSteps();
        }, 'percent' => function (self $bar) {
            return \floor($bar->getProgressPercent() * 100);
        }];
    }
    private static function initFormats()
    {
        return ['normal' => ' %current%/%max% [%bar%] %percent:3s%%', 'normal_nomax' => ' %current% [%bar%]', 'verbose' => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%', 'verbose_nomax' => ' %current% [%bar%] %elapsed:6s%', 'very_verbose' => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s%', 'very_verbose_nomax' => ' %current% [%bar%] %elapsed:6s%', 'debug' => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s% %memory:6s%', 'debug_nomax' => ' %current% [%bar%] %elapsed:6s% %memory:6s%'];
    }
    /**
     * @return string
     */
    private function buildLine()
    {
        $regex = "{%([a-z\\-_]+)(?:\\:([^%]+))?%}i";
        $callback = function ($matches) {
            if ($formatter = $this::getPlaceholderFormatterDefinition($matches[1])) {
                $text = \call_user_func($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);
        // gets string length for each sub line with multiline format
        $linesLength = \array_map(function ($subLine) {
            return \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlenWithoutDecoration($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

/*
 * 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 _HumbugBoxb94336daae36\Symfony\Component\Console\Helper;

/**
 * Helps outputting debug information when running an external program from a command.
 *
 * An external program can be a Process, an HTTP request, or anything else.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class DebugFormatterHelper extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper
{
    private $colors = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white', 'default'];
    private $started = [];
    private $count = -1;
    /**
     * Starts a debug formatting session.
     *
     * @param string $id      The id of the formatting session
     * @param string $message The message to display
     * @param string $prefix  The prefix to use
     *
     * @return string
     */
    public function start($id, $message, $prefix = 'RUN')
    {
        $this->started[$id] = ['border' => ++$this->count % \count($this->colors)];
        return \sprintf("%s<bg=blue;fg=white> %s </> <fg=blue>%s</>\n", $this->getBorder($id), $prefix, $message);
    }
    /**
     * Adds progress to a formatting session.
     *
     * @param string $id          The id of the formatting session
     * @param string $buffer      The message to display
     * @param bool   $error       Whether to consider the buffer as error
     * @param string $prefix      The prefix for output
     * @param string $errorPrefix The prefix for error output
     *
     * @return string
     */
    public function progress($id, $buffer, $error = \false, $prefix = 'OUT', $errorPrefix = 'ERR')
    {
        $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;
    }
    /**
     * Stops a formatting session.
     *
     * @param string $id         The id of the formatting session
     * @param string $message    The message to display
     * @param bool   $successful Whether to consider the result as success
     * @param string $prefix     The prefix for the end output
     *
     * @return string
     */
    public function stop($id, $message, $successful, $prefix = 'RES')
    {
        $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;
    }
    /**
     * @param string $id The id of the formatting session
     *
     * @return string
     */
    private function getBorder($id)
    {
        return \sprintf('<bg=%s> </>', $this->colors[$this->started[$id]['border']]);
    }
    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'debug_formatter';
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Helper;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException;
/**
 * HelperSet represents a set of helpers to be used with a command.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class HelperSet implements \IteratorAggregate
{
    /**
     * @var Helper[]
     */
    private $helpers = [];
    private $command;
    /**
     * @param Helper[] $helpers An array of helper
     */
    public function __construct(array $helpers = [])
    {
        foreach ($helpers as $alias => $helper) {
            $this->set($helper, \is_int($alias) ? null : $alias);
        }
    }
    /**
     * Sets a helper.
     *
     * @param HelperInterface $helper The helper instance
     * @param string          $alias  An alias
     */
    public function set(\_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\HelperInterface $helper, $alias = null)
    {
        $this->helpers[$helper->getName()] = $helper;
        if (null !== $alias) {
            $this->helpers[$alias] = $helper;
        }
        $helper->setHelperSet($this);
    }
    /**
     * Returns true if the helper if defined.
     *
     * @param string $name The helper name
     *
     * @return bool true if the helper is defined, false otherwise
     */
    public function has($name)
    {
        return isset($this->helpers[$name]);
    }
    /**
     * Gets a helper value.
     *
     * @param string $name The helper name
     *
     * @return HelperInterface The helper instance
     *
     * @throws InvalidArgumentException if the helper is not defined
     */
    public function get($name)
    {
        if (!$this->has($name)) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('The helper "%s" is not defined.', $name));
        }
        return $this->helpers[$name];
    }
    public function setCommand(\_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command $command = null)
    {
        $this->command = $command;
    }
    /**
     * Gets the command associated with this helper set.
     *
     * @return Command A Command instance
     */
    public function getCommand()
    {
        return $this->command;
    }
    /**
     * @return Helper[]
     */
    public function getIterator()
    {
        return new \ArrayIterator($this->helpers);
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Helper;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputAwareInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface;
/**
 * An implementation of InputAwareInterface for Helpers.
 *
 * @author Wouter J <waldio.webdesign@gmail.com>
 */
abstract class InputAwareHelper extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper implements \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputAwareInterface
{
    protected $input;
    /**
     * {@inheritdoc}
     */
    public function setInput(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input)
    {
        $this->input = $input;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Helper;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\RuntimeException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatter;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterStyle;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\StreamableInputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\ConsoleOutputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Question\ChoiceQuestion;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Question\Question;
/**
 * The QuestionHelper class provides helpers to interact with the user.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class QuestionHelper extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper
{
    private $inputStream;
    private static $shell;
    private static $stty;
    /**
     * Asks a question to the user.
     *
     * @return mixed The user answer
     *
     * @throws RuntimeException If there is no data to read in the input stream
     */
    public function ask(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, \_HumbugBoxb94336daae36\Symfony\Component\Console\Question\Question $question)
    {
        if ($output instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\ConsoleOutputInterface) {
            $output = $output->getErrorOutput();
        }
        if (!$input->isInteractive()) {
            $default = $question->getDefault();
            if (null === $default) {
                return $default;
            }
            if ($validator = $question->getValidator()) {
                return \call_user_func($question->getValidator(), $default);
            } elseif ($question instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Question\ChoiceQuestion) {
                $choices = $question->getChoices();
                if (!$question->isMultiselect()) {
                    return isset($choices[$default]) ? $choices[$default] : $default;
                }
                $default = \explode(',', $default);
                foreach ($default as $k => $v) {
                    $v = \trim($v);
                    $default[$k] = isset($choices[$v]) ? $choices[$v] : $v;
                }
            }
            return $default;
        }
        if ($input instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\StreamableInputInterface && ($stream = $input->getStream())) {
            $this->inputStream = $stream;
        }
        if (!$question->getValidator()) {
            return $this->doAsk($output, $question);
        }
        $interviewer = function () use($output, $question) {
            return $this->doAsk($output, $question);
        };
        return $this->validateAttempts($interviewer, $output, $question);
    }
    /**
     * Sets the input stream to read from when interacting with the user.
     *
     * This is mainly useful for testing purpose.
     *
     * @deprecated since version 3.2, to be removed in 4.0. Use
     *             StreamableInputInterface::setStream() instead.
     *
     * @param resource $stream The input stream
     *
     * @throws InvalidArgumentException In case the stream is not a resource
     */
    public function setInputStream($stream)
    {
        @\trigger_error(\sprintf('The %s() method is deprecated since Symfony 3.2 and will be removed in 4.0. Use %s::setStream() instead.', __METHOD__, \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\StreamableInputInterface::class), \E_USER_DEPRECATED);
        if (!\is_resource($stream)) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException('Input stream must be a valid resource.');
        }
        $this->inputStream = $stream;
    }
    /**
     * Returns the helper's input stream.
     *
     * @deprecated since version 3.2, to be removed in 4.0. Use
     *             StreamableInputInterface::getStream() instead.
     *
     * @return resource
     */
    public function getInputStream()
    {
        if (0 === \func_num_args() || \func_get_arg(0)) {
            @\trigger_error(\sprintf('The %s() method is deprecated since Symfony 3.2 and will be removed in 4.0. Use %s::getStream() instead.', __METHOD__, \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\StreamableInputInterface::class), \E_USER_DEPRECATED);
        }
        return $this->inputStream;
    }
    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'question';
    }
    /**
     * Prevents usage of stty.
     */
    public static function disableStty()
    {
        self::$stty = \false;
    }
    /**
     * Asks the question to the user.
     *
     * @return bool|mixed|string|null
     *
     * @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden
     */
    private function doAsk(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, \_HumbugBoxb94336daae36\Symfony\Component\Console\Question\Question $question)
    {
        $this->writePrompt($output, $question);
        $inputStream = $this->inputStream ?: \STDIN;
        $autocomplete = $question->getAutocompleterValues();
        if (null === $autocomplete || !$this->hasSttyAvailable()) {
            $ret = \false;
            if ($question->isHidden()) {
                try {
                    $ret = \trim($this->getHiddenResponse($output, $inputStream));
                } catch (\_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\RuntimeException $e) {
                    if (!$question->isHiddenFallback()) {
                        throw $e;
                    }
                }
            }
            if (\false === $ret) {
                $ret = \fgets($inputStream, 4096);
                if (\false === $ret) {
                    throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\RuntimeException('Aborted.');
                }
                $ret = \trim($ret);
            }
        } else {
            $ret = \trim($this->autocomplete($output, $question, $inputStream, \is_array($autocomplete) ? $autocomplete : \iterator_to_array($autocomplete, \false)));
        }
        $ret = \strlen($ret) > 0 ? $ret : $question->getDefault();
        if ($normalizer = $question->getNormalizer()) {
            return $normalizer($ret);
        }
        return $ret;
    }
    /**
     * Outputs the question prompt.
     */
    protected function writePrompt(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, \_HumbugBoxb94336daae36\Symfony\Component\Console\Question\Question $question)
    {
        $message = $question->getQuestion();
        if ($question instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Question\ChoiceQuestion) {
            $maxWidth = \max(\array_map([$this, 'strlen'], \array_keys($question->getChoices())));
            $messages = (array) $question->getQuestion();
            foreach ($question->getChoices() as $key => $value) {
                $width = $maxWidth - $this->strlen($key);
                $messages[] = '  [<info>' . $key . \str_repeat(' ', $width) . '</info>] ' . $value;
            }
            $output->writeln($messages);
            $message = $question->getPrompt();
        }
        $output->write($message);
    }
    /**
     * Outputs an error message.
     */
    protected function writeError(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\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);
    }
    /**
     * Autocompletes a question.
     *
     * @param OutputInterface $output
     * @param Question        $question
     * @param resource        $inputStream
     * @param array           $autocomplete
     *
     * @return string
     */
    private function autocomplete(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, \_HumbugBoxb94336daae36\Symfony\Component\Console\Question\Question $question, $inputStream, array $autocomplete)
    {
        $fullChoice = '';
        $ret = '';
        $i = 0;
        $ofs = -1;
        $matches = $autocomplete;
        $numMatches = \count($matches);
        $sttyMode = \shell_exec('stty -g');
        // Disable icanon (so we can fread each keypress) and echo (we'll do echoing here instead)
        \shell_exec('stty -icanon -echo');
        // Add highlighted text style
        $output->getFormatter()->setStyle('hl', new \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterStyle('black', 'white'));
        // Read a keypress
        while (!\feof($inputStream)) {
            $c = \fread($inputStream, 1);
            // as opposed to fgets(), fread() returns an empty string when the stream content is empty, not false.
            if (\false === $c || '' === $ret && '' === $c && null === $question->getDefault()) {
                \shell_exec(\sprintf('stty %s', $sttyMode));
                throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\RuntimeException('Aborted.');
            } elseif ("" === $c) {
                // Backspace Character
                if (0 === $numMatches && 0 !== $i) {
                    --$i;
                    $fullChoice = \substr($fullChoice, 0, -1);
                    // Move cursor backwards
                    $output->write("\33[1D");
                }
                if (0 === $i) {
                    $ofs = -1;
                    $matches = $autocomplete;
                    $numMatches = \count($matches);
                } else {
                    $numMatches = 0;
                }
                // Pop the last character off the end of our string
                $ret = \substr($ret, 0, $i);
            } elseif ("\33" === $c) {
                // Did we read an escape sequence?
                $c .= \fread($inputStream, 2);
                // A = Up Arrow. B = Down Arrow
                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 (\ord($c) < 32) {
                if ("\t" === $c || "\n" === $c) {
                    if ($numMatches > 0 && -1 !== $ofs) {
                        $ret = $matches[$ofs];
                        // Echo out remaining chars for current match
                        $remainingCharacters = \substr($ret, \strlen(\trim($this->mostRecentlyEnteredValue($fullChoice))));
                        $output->write($remainingCharacters);
                        $fullChoice .= $remainingCharacters;
                        $i = \strlen($fullChoice);
                    }
                    if ("\n" === $c) {
                        $output->write($c);
                        break;
                    }
                    $numMatches = 0;
                }
                continue;
            } else {
                if ("" <= $c) {
                    $c .= \fread($inputStream, ["" => 1, "" => 1, "" => 2, "" => 3][$c & ""]);
                }
                $output->write($c);
                $ret .= $c;
                $fullChoice .= $c;
                ++$i;
                $tempRet = $ret;
                if ($question instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Question\ChoiceQuestion && $question->isMultiselect()) {
                    $tempRet = $this->mostRecentlyEnteredValue($fullChoice);
                }
                $numMatches = 0;
                $ofs = 0;
                foreach ($autocomplete as $value) {
                    // If typed characters match the beginning chunk of value (e.g. [AcmeDe]moBundle)
                    if (0 === \strpos($value, $tempRet)) {
                        $matches[$numMatches++] = $value;
                    }
                }
            }
            // Erase characters from cursor to end of line
            $output->write("\33[K");
            if ($numMatches > 0 && -1 !== $ofs) {
                // Save cursor position
                $output->write("\0337");
                // Write highlighted text, complete the partially entered response
                $charactersEntered = \strlen(\trim($this->mostRecentlyEnteredValue($fullChoice)));
                $output->write('<hl>' . \_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatter::escapeTrailingBackslash(\substr($matches[$ofs], $charactersEntered)) . '</hl>');
                // Restore cursor position
                $output->write("\338");
            }
        }
        // Reset stty so it behaves normally again
        \shell_exec(\sprintf('stty %s', $sttyMode));
        return $fullChoice;
    }
    private function mostRecentlyEnteredValue($entered)
    {
        // Determine the most recent value that the user entered
        if (\false === \strpos($entered, ',')) {
            return $entered;
        }
        $choices = \explode(',', $entered);
        if (\strlen($lastChoice = \trim($choices[\count($choices) - 1])) > 0) {
            return $lastChoice;
        }
        return $entered;
    }
    /**
     * Gets a hidden response from user.
     *
     * @param OutputInterface $output      An Output instance
     * @param resource        $inputStream The handler resource
     *
     * @return string The answer
     *
     * @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden
     */
    private function getHiddenResponse(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, $inputStream)
    {
        if ('\\' === \DIRECTORY_SEPARATOR) {
            $exe = __DIR__ . '/../Resources/bin/hiddeninput.exe';
            // handle code running from a phar
            if ('phar:' === \substr(__FILE__, 0, 5)) {
                $tmpExe = \sys_get_temp_dir() . '/hiddeninput.exe';
                \copy($exe, $tmpExe);
                $exe = $tmpExe;
            }
            $value = \rtrim(\shell_exec($exe));
            $output->writeln('');
            if (isset($tmpExe)) {
                \unlink($tmpExe);
            }
            return $value;
        }
        if ($this->hasSttyAvailable()) {
            $sttyMode = \shell_exec('stty -g');
            \shell_exec('stty -echo');
            $value = \fgets($inputStream, 4096);
            \shell_exec(\sprintf('stty %s', $sttyMode));
            if (\false === $value) {
                throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\RuntimeException('Aborted.');
            }
            $value = \trim($value);
            $output->writeln('');
            return $value;
        }
        if (\false !== ($shell = $this->getShell())) {
            $readCmd = 'csh' === $shell ? 'set mypassword = $<' : 'read -r mypassword';
            $command = \sprintf("/usr/bin/env %s -c 'stty -echo; %s; stty echo; echo \$mypassword'", $shell, $readCmd);
            $value = \rtrim(\shell_exec($command));
            $output->writeln('');
            return $value;
        }
        throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\RuntimeException('Unable to hide the response.');
    }
    /**
     * Validates an attempt.
     *
     * @param callable        $interviewer A callable that will ask for a question and return the result
     * @param OutputInterface $output      An Output instance
     * @param Question        $question    A Question instance
     *
     * @return mixed The validated response
     *
     * @throws \Exception In case the max number of attempts has been reached and no valid response has been given
     */
    private function validateAttempts(callable $interviewer, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, \_HumbugBoxb94336daae36\Symfony\Component\Console\Question\Question $question)
    {
        $error = null;
        $attempts = $question->getMaxAttempts();
        while (null === $attempts || $attempts--) {
            if (null !== $error) {
                $this->writeError($output, $error);
            }
            try {
                return \call_user_func($question->getValidator(), $interviewer());
            } catch (\_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\RuntimeException $e) {
                throw $e;
            } catch (\Exception $error) {
            }
        }
        throw $error;
    }
    /**
     * Returns a valid unix shell.
     *
     * @return string|bool The valid shell name, false in case no valid shell is found
     */
    private function getShell()
    {
        if (null !== self::$shell) {
            return self::$shell;
        }
        self::$shell = \false;
        if (\file_exists('/usr/bin/env')) {
            // handle other OSs with bash/zsh/ksh/csh if available to hide the answer
            $test = "/usr/bin/env %s -c 'echo OK' 2> /dev/null";
            foreach (['bash', 'zsh', 'ksh', 'csh'] as $sh) {
                if ('OK' === \rtrim(\shell_exec(\sprintf($test, $sh)))) {
                    self::$shell = $sh;
                    break;
                }
            }
        }
        return self::$shell;
    }
    /**
     * Returns whether Stty is available or not.
     *
     * @return bool
     */
    private function hasSttyAvailable()
    {
        if (null !== self::$stty) {
            return self::$stty;
        }
        \exec('stty 2>&1', $output, $exitcode);
        return self::$stty = 0 === $exitcode;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Helper;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterInterface;
/**
 * Helper is the base class for all helper classes.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class Helper implements \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\HelperInterface
{
    protected $helperSet = null;
    /**
     * {@inheritdoc}
     */
    public function setHelperSet(\_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\HelperSet $helperSet = null)
    {
        $this->helperSet = $helperSet;
    }
    /**
     * {@inheritdoc}
     */
    public function getHelperSet()
    {
        return $this->helperSet;
    }
    /**
     * Returns the length of a string, using mb_strwidth if it is available.
     *
     * @param string $string The string to check its length
     *
     * @return int The length of the string
     */
    public static function strlen($string)
    {
        if (\false === ($encoding = \mb_detect_encoding($string, null, \true))) {
            return \strlen($string);
        }
        return \mb_strwidth($string, $encoding);
    }
    /**
     * Returns the subset of a string, using mb_substr if it is available.
     *
     * @param string   $string String to subset
     * @param int      $from   Start offset
     * @param int|null $length Length to read
     *
     * @return string The string subset
     */
    public static function substr($string, $from, $length = null)
    {
        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($secs)
    {
        static $timeFormats = [[0, '< 1 sec'], [1, '1 sec'], [2, 'secs', 1], [60, '1 min'], [120, 'mins', 60], [3600, '1 hr'], [7200, 'hrs', 3600], [86400, '1 day'], [172800, 'days', 86400]];
        foreach ($timeFormats as $index => $format) {
            if ($secs >= $format[0]) {
                if (isset($timeFormats[$index + 1]) && $secs < $timeFormats[$index + 1][0] || $index == \count($timeFormats) - 1) {
                    if (2 == \count($format)) {
                        return $format[1];
                    }
                    return \floor($secs / $format[2]) . ' ' . $format[1];
                }
            }
        }
    }
    public static function formatMemory($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 strlenWithoutDecoration(\_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterInterface $formatter, $string)
    {
        return self::strlen(self::removeDecoration($formatter, $string));
    }
    public static function removeDecoration(\_HumbugBoxb94336daae36\Symfony\Component\Console\Formatter\OutputFormatterInterface $formatter, $string)
    {
        $isDecorated = $formatter->isDecorated();
        $formatter->setDecorated(\false);
        // remove <...> formatting
        $string = $formatter->format($string);
        // remove already formatted characters
        $string = \preg_replace("/\33\\[[^m]*m/", '', $string);
        $formatter->setDecorated($isDecorated);
        return $string;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Helper;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
/**
 * Provides helpers to display a table.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Саша Стаменковић <umpirsky@gmail.com>
 * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
 * @author Max Grigorian <maxakawizard@gmail.com>
 */
class Table
{
    /**
     * Table headers.
     */
    private $headers = [];
    /**
     * Table rows.
     */
    private $rows = [];
    /**
     * Column widths cache.
     */
    private $effectiveColumnWidths = [];
    /**
     * Number of columns cache.
     *
     * @var int
     */
    private $numberOfColumns;
    /**
     * @var OutputInterface
     */
    private $output;
    /**
     * @var TableStyle
     */
    private $style;
    /**
     * @var array
     */
    private $columnStyles = [];
    /**
     * User set column widths.
     *
     * @var array
     */
    private $columnWidths = [];
    private static $styles;
    public function __construct(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output)
    {
        $this->output = $output;
        if (!self::$styles) {
            self::$styles = self::initStyles();
        }
        $this->setStyle('default');
    }
    /**
     * Sets a style definition.
     *
     * @param string     $name  The style name
     * @param TableStyle $style A TableStyle instance
     */
    public static function setStyleDefinition($name, \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableStyle $style)
    {
        if (!self::$styles) {
            self::$styles = self::initStyles();
        }
        self::$styles[$name] = $style;
    }
    /**
     * Gets a style definition by name.
     *
     * @param string $name The style name
     *
     * @return TableStyle
     */
    public static function getStyleDefinition($name)
    {
        if (!self::$styles) {
            self::$styles = self::initStyles();
        }
        if (isset(self::$styles[$name])) {
            return self::$styles[$name];
        }
        throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('Style "%s" is not defined.', $name));
    }
    /**
     * Sets table style.
     *
     * @param TableStyle|string $name The style name or a TableStyle instance
     *
     * @return $this
     */
    public function setStyle($name)
    {
        $this->style = $this->resolveStyle($name);
        return $this;
    }
    /**
     * Gets the current table style.
     *
     * @return TableStyle
     */
    public function getStyle()
    {
        return $this->style;
    }
    /**
     * Sets table column style.
     *
     * @param int               $columnIndex Column index
     * @param TableStyle|string $name        The style name or a TableStyle instance
     *
     * @return $this
     */
    public function setColumnStyle($columnIndex, $name)
    {
        $columnIndex = (int) $columnIndex;
        $this->columnStyles[$columnIndex] = $this->resolveStyle($name);
        return $this;
    }
    /**
     * Gets the current style for a column.
     *
     * If style was not set, it returns the global table style.
     *
     * @param int $columnIndex Column index
     *
     * @return TableStyle
     */
    public function getColumnStyle($columnIndex)
    {
        if (isset($this->columnStyles[$columnIndex])) {
            return $this->columnStyles[$columnIndex];
        }
        return $this->getStyle();
    }
    /**
     * Sets the minimum width of a column.
     *
     * @param int $columnIndex Column index
     * @param int $width       Minimum column width in characters
     *
     * @return $this
     */
    public function setColumnWidth($columnIndex, $width)
    {
        $this->columnWidths[(int) $columnIndex] = (int) $width;
        return $this;
    }
    /**
     * Sets the minimum width of all columns.
     *
     * @param array $widths
     *
     * @return $this
     */
    public function setColumnWidths(array $widths)
    {
        $this->columnWidths = [];
        foreach ($widths as $index => $width) {
            $this->setColumnWidth($index, $width);
        }
        return $this;
    }
    public function setHeaders(array $headers)
    {
        $headers = \array_values($headers);
        if (!empty($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)
    {
        foreach ($rows as $row) {
            $this->addRow($row);
        }
        return $this;
    }
    public function addRow($row)
    {
        if ($row instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableSeparator) {
            $this->rows[] = $row;
            return $this;
        }
        if (!\is_array($row)) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException('A row must be an array or a TableSeparator instance.');
        }
        $this->rows[] = \array_values($row);
        return $this;
    }
    public function setRow($column, array $row)
    {
        $this->rows[$column] = $row;
        return $this;
    }
    /**
     * Renders table to output.
     *
     * Example:
     *
     *     +---------------+-----------------------+------------------+
     *     | ISBN          | Title                 | Author           |
     *     +---------------+-----------------------+------------------+
     *     | 99921-58-10-7 | Divine Comedy         | Dante Alighieri  |
     *     | 9971-5-0210-0 | A Tale of Two Cities  | Charles Dickens  |
     *     | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien |
     *     +---------------+-----------------------+------------------+
     */
    public function render()
    {
        $this->calculateNumberOfColumns();
        $rows = $this->buildTableRows($this->rows);
        $headers = $this->buildTableRows($this->headers);
        $this->calculateColumnsWidth(\array_merge($headers, $rows));
        $this->renderRowSeparator();
        if (!empty($headers)) {
            foreach ($headers as $header) {
                $this->renderRow($header, $this->style->getCellHeaderFormat());
                $this->renderRowSeparator();
            }
        }
        foreach ($rows as $row) {
            if ($row instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableSeparator) {
                $this->renderRowSeparator();
            } else {
                $this->renderRow($row, $this->style->getCellRowFormat());
            }
        }
        if (!empty($rows)) {
            $this->renderRowSeparator();
        }
        $this->cleanup();
    }
    /**
     * Renders horizontal header separator.
     *
     * Example:
     *
     *     +-----+-----------+-------+
     */
    private function renderRowSeparator()
    {
        if (0 === ($count = $this->numberOfColumns)) {
            return;
        }
        if (!$this->style->getHorizontalBorderChar() && !$this->style->getCrossingChar()) {
            return;
        }
        $markup = $this->style->getCrossingChar();
        for ($column = 0; $column < $count; ++$column) {
            $markup .= \str_repeat($this->style->getHorizontalBorderChar(), $this->effectiveColumnWidths[$column]) . $this->style->getCrossingChar();
        }
        $this->output->writeln(\sprintf($this->style->getBorderFormat(), $markup));
    }
    /**
     * Renders vertical column separator.
     */
    private function renderColumnSeparator()
    {
        return \sprintf($this->style->getBorderFormat(), $this->style->getVerticalBorderChar());
    }
    /**
     * Renders table row.
     *
     * Example:
     *
     *     | 9971-5-0210-0 | A Tale of Two Cities  | Charles Dickens  |
     *
     * @param array  $row
     * @param string $cellFormat
     */
    private function renderRow(array $row, $cellFormat)
    {
        if (empty($row)) {
            return;
        }
        $rowContent = $this->renderColumnSeparator();
        foreach ($this->getRowColumns($row) as $column) {
            $rowContent .= $this->renderCell($row, $column, $cellFormat);
            $rowContent .= $this->renderColumnSeparator();
        }
        $this->output->writeln($rowContent);
    }
    /**
     * Renders table cell with padding.
     *
     * @param array  $row
     * @param int    $column
     * @param string $cellFormat
     */
    private function renderCell(array $row, $column, $cellFormat)
    {
        $cell = isset($row[$column]) ? $row[$column] : '';
        $width = $this->effectiveColumnWidths[$column];
        if ($cell instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableCell && $cell->getColspan() > 1) {
            // add the width of the following columns(numbers of colspan).
            foreach (\range($column + 1, $column + $cell->getColspan() - 1) as $nextColumn) {
                $width += $this->getColumnSeparatorWidth() + $this->effectiveColumnWidths[$nextColumn];
            }
        }
        // str_pad won't work properly with multi-byte strings, we need to fix the padding
        if (\false !== ($encoding = \mb_detect_encoding($cell, null, \true))) {
            $width += \strlen($cell) - \mb_strwidth($cell, $encoding);
        }
        $style = $this->getColumnStyle($column);
        if ($cell instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableSeparator) {
            return \sprintf($style->getBorderFormat(), \str_repeat($style->getHorizontalBorderChar(), $width));
        }
        $width += \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlen($cell) - \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlenWithoutDecoration($this->output->getFormatter(), $cell);
        $content = \sprintf($style->getCellRowContentFormat(), $cell);
        return \sprintf($cellFormat, \str_pad($content, $width, $style->getPaddingChar(), $style->getPadType()));
    }
    /**
     * Calculate number of columns for this table.
     */
    private function calculateNumberOfColumns()
    {
        if (null !== $this->numberOfColumns) {
            return;
        }
        $columns = [0];
        foreach (\array_merge($this->headers, $this->rows) as $row) {
            if ($row instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableSeparator) {
                continue;
            }
            $columns[] = $this->getNumberOfColumns($row);
        }
        $this->numberOfColumns = \max($columns);
    }
    private function buildTableRows($rows)
    {
        $unmergedRows = [];
        for ($rowKey = 0; $rowKey < \count($rows); ++$rowKey) {
            $rows = $this->fillNextRows($rows, $rowKey);
            // Remove any new line breaks and replace it with a new line
            foreach ($rows[$rowKey] as $column => $cell) {
                if (!\strstr($cell, "\n")) {
                    continue;
                }
                $lines = \explode("\n", \str_replace("\n", "<fg=default;bg=default>\n</>", $cell));
                foreach ($lines as $lineKey => $line) {
                    if ($cell instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableCell) {
                        $line = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableCell($line, ['colspan' => $cell->getColspan()]);
                    }
                    if (0 === $lineKey) {
                        $rows[$rowKey][$column] = $line;
                    } else {
                        $unmergedRows[$rowKey][$lineKey][$column] = $line;
                    }
                }
            }
        }
        $tableRows = [];
        foreach ($rows as $rowKey => $row) {
            $tableRows[] = $this->fillCells($row);
            if (isset($unmergedRows[$rowKey])) {
                $tableRows = \array_merge($tableRows, $unmergedRows[$rowKey]);
            }
        }
        return $tableRows;
    }
    /**
     * fill rows that contains rowspan > 1.
     *
     * @param array $rows
     * @param int   $line
     *
     * @return array
     *
     * @throws InvalidArgumentException
     */
    private function fillNextRows(array $rows, $line)
    {
        $unmergedRows = [];
        foreach ($rows[$line] as $column => $cell) {
            if (null !== $cell && !$cell instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableCell && !\is_scalar($cell) && !(\is_object($cell) && \method_exists($cell, '__toString'))) {
                throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('A cell must be a TableCell, a scalar or an object implementing __toString, %s given.', \gettype($cell)));
            }
            if ($cell instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableCell && $cell->getRowspan() > 1) {
                $nbLines = $cell->getRowspan() - 1;
                $lines = [$cell];
                if (\strstr($cell, "\n")) {
                    $lines = \explode("\n", \str_replace("\n", "<fg=default;bg=default>\n</>", $cell));
                    $nbLines = \count($lines) > $nbLines ? \substr_count($cell, "\n") : $nbLines;
                    $rows[$line][$column] = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableCell($lines[0], ['colspan' => $cell->getColspan()]);
                    unset($lines[0]);
                }
                // create a two dimensional array (rowspan x colspan)
                $unmergedRows = \array_replace_recursive(\array_fill($line + 1, $nbLines, []), $unmergedRows);
                foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) {
                    $value = isset($lines[$unmergedRowKey - $line]) ? $lines[$unmergedRowKey - $line] : '';
                    $unmergedRows[$unmergedRowKey][$column] = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableCell($value, ['colspan' => $cell->getColspan()]);
                    if ($nbLines === $unmergedRowKey - $line) {
                        break;
                    }
                }
            }
        }
        foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) {
            // we need to know if $unmergedRow will be merged or inserted into $rows
            if (isset($rows[$unmergedRowKey]) && \is_array($rows[$unmergedRowKey]) && $this->getNumberOfColumns($rows[$unmergedRowKey]) + $this->getNumberOfColumns($unmergedRows[$unmergedRowKey]) <= $this->numberOfColumns) {
                foreach ($unmergedRow as $cellKey => $cell) {
                    // insert cell into row at cellKey position
                    \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;
    }
    /**
     * fill cells for a row that contains colspan > 1.
     *
     * @return array
     */
    private function fillCells($row)
    {
        $newRow = [];
        foreach ($row as $column => $cell) {
            $newRow[] = $cell;
            if ($cell instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableCell && $cell->getColspan() > 1) {
                foreach (\range($column + 1, $column + $cell->getColspan() - 1) as $position) {
                    // insert empty value at column position
                    $newRow[] = '';
                }
            }
        }
        return $newRow ?: $row;
    }
    /**
     * @param array $rows
     * @param int   $line
     *
     * @return array
     */
    private function copyRow(array $rows, $line)
    {
        $row = $rows[$line];
        foreach ($row as $cellKey => $cellValue) {
            $row[$cellKey] = '';
            if ($cellValue instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableCell) {
                $row[$cellKey] = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableCell('', ['colspan' => $cellValue->getColspan()]);
            }
        }
        return $row;
    }
    /**
     * Gets number of columns by row.
     *
     * @return int
     */
    private function getNumberOfColumns(array $row)
    {
        $columns = \count($row);
        foreach ($row as $column) {
            $columns += $column instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableCell ? $column->getColspan() - 1 : 0;
        }
        return $columns;
    }
    /**
     * Gets list of columns for the given row.
     *
     * @return array
     */
    private function getRowColumns(array $row)
    {
        $columns = \range(0, $this->numberOfColumns - 1);
        foreach ($row as $cellKey => $cell) {
            if ($cell instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableCell && $cell->getColspan() > 1) {
                // exclude grouped columns.
                $columns = \array_diff($columns, \range($cellKey + 1, $cellKey + $cell->getColspan() - 1));
            }
        }
        return $columns;
    }
    /**
     * Calculates columns widths.
     */
    private function calculateColumnsWidth(array $rows)
    {
        for ($column = 0; $column < $this->numberOfColumns; ++$column) {
            $lengths = [];
            foreach ($rows as $row) {
                if ($row instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableSeparator) {
                    continue;
                }
                foreach ($row as $i => $cell) {
                    if ($cell instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableCell) {
                        $textContent = \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::removeDecoration($this->output->getFormatter(), $cell);
                        $textLength = \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlen($textContent);
                        if ($textLength > 0) {
                            $contentColumns = \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) + \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlen($this->style->getCellRowContentFormat()) - 2;
        }
    }
    /**
     * Gets column width.
     *
     * @return int
     */
    private function getColumnSeparatorWidth()
    {
        return \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlen(\sprintf($this->style->getBorderFormat(), $this->style->getVerticalBorderChar()));
    }
    /**
     * Gets cell width.
     *
     * @param array $row
     * @param int   $column
     *
     * @return int
     */
    private function getCellWidth(array $row, $column)
    {
        $cellWidth = 0;
        if (isset($row[$column])) {
            $cell = $row[$column];
            $cellWidth = \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::strlenWithoutDecoration($this->output->getFormatter(), $cell);
        }
        $columnWidth = isset($this->columnWidths[$column]) ? $this->columnWidths[$column] : 0;
        return \max($cellWidth, $columnWidth);
    }
    /**
     * Called after rendering to cleanup cache data.
     */
    private function cleanup()
    {
        $this->effectiveColumnWidths = [];
        $this->numberOfColumns = null;
    }
    private static function initStyles()
    {
        $borderless = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableStyle();
        $borderless->setHorizontalBorderChar('=')->setVerticalBorderChar(' ')->setCrossingChar(' ');
        $compact = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableStyle();
        $compact->setHorizontalBorderChar('')->setVerticalBorderChar(' ')->setCrossingChar('')->setCellRowContentFormat('%s');
        $styleGuide = new \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableStyle();
        $styleGuide->setHorizontalBorderChar('-')->setVerticalBorderChar(' ')->setCrossingChar(' ')->setCellHeaderFormat('%s');
        return ['default' => new \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableStyle(), 'borderless' => $borderless, 'compact' => $compact, 'symfony-style-guide' => $styleGuide];
    }
    private function resolveStyle($name)
    {
        if ($name instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\TableStyle) {
            return $name;
        }
        if (isset(self::$styles[$name])) {
            return self::$styles[$name];
        }
        throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('Style "%s" is not defined.', $name));
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Helper;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
/**
 * @author Kevin Bond <kevinbond@gmail.com>
 */
class ProgressIndicator
{
    private $output;
    private $startTime;
    private $format;
    private $message;
    private $indicatorValues;
    private $indicatorCurrent;
    private $indicatorChangeInterval;
    private $indicatorUpdateTime;
    private $started = \false;
    private static $formatters;
    private static $formats;
    /**
     * @param OutputInterface $output
     * @param string|null     $format                  Indicator format
     * @param int             $indicatorChangeInterval Change interval in milliseconds
     * @param array|null      $indicatorValues         Animated indicator characters
     */
    public function __construct(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, $format = null, $indicatorChangeInterval = 100, $indicatorValues = null)
    {
        $this->output = $output;
        if (null === $format) {
            $format = $this->determineBestFormat();
        }
        if (null === $indicatorValues) {
            $indicatorValues = ['-', '\\', '|', '/'];
        }
        $indicatorValues = \array_values($indicatorValues);
        if (2 > \count($indicatorValues)) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException('Must have at least 2 indicator value characters.');
        }
        $this->format = self::getFormatDefinition($format);
        $this->indicatorChangeInterval = $indicatorChangeInterval;
        $this->indicatorValues = $indicatorValues;
        $this->startTime = \time();
    }
    /**
     * Sets the current indicator message.
     *
     * @param string|null $message
     */
    public function setMessage($message)
    {
        $this->message = $message;
        $this->display();
    }
    /**
     * Starts the indicator output.
     *
     * @param $message
     */
    public function start($message)
    {
        if ($this->started) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\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();
    }
    /**
     * Advances the indicator.
     */
    public function advance()
    {
        if (!$this->started) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\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();
    }
    /**
     * Finish the indicator with message.
     *
     * @param $message
     */
    public function finish($message)
    {
        if (!$this->started) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\LogicException('Progress indicator has not yet been started.');
        }
        $this->message = $message;
        $this->display();
        $this->output->writeln('');
        $this->started = \false;
    }
    /**
     * Gets the format for a given name.
     *
     * @param string $name The format name
     *
     * @return string|null A format string
     */
    public static function getFormatDefinition($name)
    {
        if (!self::$formats) {
            self::$formats = self::initFormats();
        }
        return isset(self::$formats[$name]) ? self::$formats[$name] : null;
    }
    /**
     * Sets a placeholder formatter for a given name.
     *
     * This method also allow you to override an existing placeholder.
     *
     * @param string   $name     The placeholder name (including the delimiter char like %)
     * @param callable $callable A PHP callable
     */
    public static function setPlaceholderFormatterDefinition($name, $callable)
    {
        if (!self::$formatters) {
            self::$formatters = self::initPlaceholderFormatters();
        }
        self::$formatters[$name] = $callable;
    }
    /**
     * Gets the placeholder formatter for a given name.
     *
     * @param string $name The placeholder name (including the delimiter char like %)
     *
     * @return callable|null A PHP callable
     */
    public static function getPlaceholderFormatterDefinition($name)
    {
        if (!self::$formatters) {
            self::$formatters = self::initPlaceholderFormatters();
        }
        return isset(self::$formatters[$name]) ? self::$formatters[$name] : null;
    }
    private function display()
    {
        if (\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) {
            return;
        }
        $self = $this;
        $this->overwrite(\preg_replace_callback("{%([a-z\\-_]+)(?:\\:([^%]+))?%}i", function ($matches) use($self) {
            if ($formatter = $self::getPlaceholderFormatterDefinition($matches[1])) {
                return \call_user_func($formatter, $self);
            }
            return $matches[0];
        }, $this->format));
    }
    private function determineBestFormat()
    {
        switch ($this->output->getVerbosity()) {
            // OutputInterface::VERBOSITY_QUIET: display is disabled anyway
            case \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_VERBOSE:
                return $this->output->isDecorated() ? 'verbose' : 'verbose_no_ansi';
            case \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_VERY_VERBOSE:
            case \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_DEBUG:
                return $this->output->isDecorated() ? 'very_verbose' : 'very_verbose_no_ansi';
            default:
                return $this->output->isDecorated() ? 'normal' : 'normal_no_ansi';
        }
    }
    /**
     * Overwrites a previous message to the output.
     *
     * @param string $message The message
     */
    private function overwrite($message)
    {
        if ($this->output->isDecorated()) {
            $this->output->write("\r\33[2K");
            $this->output->write($message);
        } else {
            $this->output->writeln($message);
        }
    }
    private function getCurrentTimeInMilliseconds()
    {
        return \round(\microtime(\true) * 1000);
    }
    private static function initPlaceholderFormatters()
    {
        return ['indicator' => function (self $indicator) {
            return $indicator->indicatorValues[$indicator->indicatorCurrent % \count($indicator->indicatorValues)];
        }, 'message' => function (self $indicator) {
            return $indicator->message;
        }, 'elapsed' => function (self $indicator) {
            return \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::formatTime(\time() - $indicator->startTime);
        }, 'memory' => function () {
            return \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper::formatMemory(\memory_get_usage(\true));
        }];
    }
    private static function initFormats()
    {
        return ['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%)'];
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Helper;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor\DescriptorInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor\JsonDescriptor;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor\MarkdownDescriptor;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor\TextDescriptor;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor\XmlDescriptor;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
/**
 * This class adds helper method to describe objects in various formats.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class DescriptorHelper extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\Helper
{
    /**
     * @var DescriptorInterface[]
     */
    private $descriptors = [];
    public function __construct()
    {
        $this->register('txt', new \_HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor\TextDescriptor())->register('xml', new \_HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor\XmlDescriptor())->register('json', new \_HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor\JsonDescriptor())->register('md', new \_HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor\MarkdownDescriptor());
    }
    /**
     * Describes an object if supported.
     *
     * Available options are:
     * * format: string, the output format name
     * * raw_text: boolean, sets output type as raw
     *
     * @param OutputInterface $output
     * @param object          $object
     * @param array           $options
     *
     * @throws InvalidArgumentException when the given format is not supported
     */
    public function describe(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, $object, array $options = [])
    {
        $options = \array_merge(['raw_text' => \false, 'format' => 'txt'], $options);
        if (!isset($this->descriptors[$options['format']])) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('Unsupported format "%s".', $options['format']));
        }
        $descriptor = $this->descriptors[$options['format']];
        $descriptor->describe($output, $object, $options);
    }
    /**
     * Registers a descriptor.
     *
     * @param string              $format
     * @param DescriptorInterface $descriptor
     *
     * @return $this
     */
    public function register($format, \_HumbugBoxb94336daae36\Symfony\Component\Console\Descriptor\DescriptorInterface $descriptor)
    {
        $this->descriptors[$format] = $descriptor;
        return $this;
    }
    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'descriptor';
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\DependencyInjection;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command;
use _HumbugBoxb94336daae36\Symfony\Component\Console\CommandLoader\ContainerCommandLoader;
use _HumbugBoxb94336daae36\Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use _HumbugBoxb94336daae36\Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass;
use _HumbugBoxb94336daae36\Symfony\Component\DependencyInjection\ContainerBuilder;
use _HumbugBoxb94336daae36\Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use _HumbugBoxb94336daae36\Symfony\Component\DependencyInjection\TypedReference;
/**
 * Registers console commands.
 *
 * @author Grégoire Pineau <lyrixx@lyrixx.info>
 */
class AddConsoleCommandPass implements \_HumbugBoxb94336daae36\Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface
{
    private $commandLoaderServiceId;
    private $commandTag;
    public function __construct($commandLoaderServiceId = 'console.command_loader', $commandTag = 'console.command')
    {
        $this->commandLoaderServiceId = $commandLoaderServiceId;
        $this->commandTag = $commandTag;
    }
    public function process(\_HumbugBoxb94336daae36\Symfony\Component\DependencyInjection\ContainerBuilder $container)
    {
        $commandServices = $container->findTaggedServiceIds($this->commandTag, \true);
        $lazyCommandMap = [];
        $lazyCommandRefs = [];
        $serviceIds = [];
        $lazyServiceIds = [];
        foreach ($commandServices as $id => $tags) {
            $definition = $container->getDefinition($id);
            $class = $container->getParameterBag()->resolveValue($definition->getClass());
            $commandId = 'console.command.' . \strtolower(\str_replace('\\', '_', $class));
            if (isset($tags[0]['command'])) {
                $commandName = $tags[0]['command'];
            } else {
                if (!($r = $container->getReflectionClass($class))) {
                    throw new \_HumbugBoxb94336daae36\Symfony\Component\DependencyInjection\Exception\InvalidArgumentException(\sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id));
                }
                if (!$r->isSubclassOf(\_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command::class)) {
                    throw new \_HumbugBoxb94336daae36\Symfony\Component\DependencyInjection\Exception\InvalidArgumentException(\sprintf('The service "%s" tagged "%s" must be a subclass of "%s".', $id, $this->commandTag, \_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command::class));
                }
                $commandName = $class::getDefaultName();
            }
            if (null === $commandName) {
                if (isset($serviceIds[$commandId]) || $container->hasAlias($commandId)) {
                    $commandId = $commandId . '_' . $id;
                }
                if (!$definition->isPublic() || $definition->isPrivate()) {
                    $container->setAlias($commandId, $id)->setPublic(\true);
                    $id = $commandId;
                }
                $serviceIds[$commandId] = $id;
                continue;
            }
            $serviceIds[$commandId] = $id;
            $lazyServiceIds[$id] = \true;
            unset($tags[0]);
            $lazyCommandMap[$commandName] = $id;
            $lazyCommandRefs[$id] = new \_HumbugBoxb94336daae36\Symfony\Component\DependencyInjection\TypedReference($id, $class);
            $aliases = [];
            foreach ($tags as $tag) {
                if (isset($tag['command'])) {
                    $aliases[] = $tag['command'];
                    $lazyCommandMap[$tag['command']] = $id;
                }
            }
            $definition->addMethodCall('setName', [$commandName]);
            if ($aliases) {
                $definition->addMethodCall('setAliases', [$aliases]);
            }
        }
        $container->register($this->commandLoaderServiceId, \_HumbugBoxb94336daae36\Symfony\Component\Console\CommandLoader\ContainerCommandLoader::class)->setPublic(\true)->setArguments([\_HumbugBoxb94336daae36\Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass::register($container, $lazyCommandRefs), $lazyCommandMap]);
        $container->setParameter('console.command.ids', $serviceIds);
        $container->setParameter('console.lazy_command.ids', $lazyServiceIds);
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Exception;

/**
 * @author Jérôme Tamarelle <jerome@tamarelle.net>
 */
class LogicException extends \LogicException implements \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\ExceptionInterface
{
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Exception;

/**
 * Represents an incorrect option name typed in the console.
 *
 * @author Jérôme Tamarelle <jerome@tamarelle.net>
 */
class InvalidOptionException extends \InvalidArgumentException implements \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\ExceptionInterface
{
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Exception;

/**
 * ExceptionInterface.
 *
 * @author Jérôme Tamarelle <jerome@tamarelle.net>
 */
interface ExceptionInterface
{
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Exception;

/**
 * @author Jérôme Tamarelle <jerome@tamarelle.net>
 */
class RuntimeException extends \RuntimeException implements \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\ExceptionInterface
{
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Exception;

/**
 * @author Jérôme Tamarelle <jerome@tamarelle.net>
 */
class InvalidArgumentException extends \InvalidArgumentException implements \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\ExceptionInterface
{
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Exception;

/**
 * Represents an incorrect command name typed in the console.
 *
 * @author Jérôme Tamarelle <jerome@tamarelle.net>
 */
class CommandNotFoundException extends \InvalidArgumentException implements \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\ExceptionInterface
{
    private $alternatives;
    /**
     * @param string     $message      Exception message to throw
     * @param array      $alternatives List of similar defined names
     * @param int        $code         Exception code
     * @param \Exception $previous     Previous exception used for the exception chaining
     */
    public function __construct($message, array $alternatives = [], $code = 0, \Exception $previous = null)
    {
        parent::__construct($message, $code, $previous);
        $this->alternatives = $alternatives;
    }
    /**
     * @return array A list of similar defined names
     */
    public function getAlternatives()
    {
        return $this->alternatives;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Event;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
/**
 * Allows to manipulate the exit code of a command after its execution.
 *
 * @author Francesco Levorato <git@flevour.net>
 */
class ConsoleTerminateEvent extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Event\ConsoleEvent
{
    /**
     * The exit code of the command.
     *
     * @var int
     */
    private $exitCode;
    public function __construct(\_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command $command, \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, $exitCode)
    {
        parent::__construct($command, $input, $output);
        $this->setExitCode($exitCode);
    }
    /**
     * Sets the exit code.
     *
     * @param int $exitCode The command exit code
     */
    public function setExitCode($exitCode)
    {
        $this->exitCode = (int) $exitCode;
    }
    /**
     * Gets the exit code.
     *
     * @return int The command exit code
     */
    public function getExitCode()
    {
        return $this->exitCode;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Event;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
/**
 * Allows to handle throwables thrown while running a command.
 *
 * @author Wouter de Jong <wouter@wouterj.nl>
 */
final class ConsoleErrorEvent extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Event\ConsoleEvent
{
    private $error;
    private $exitCode;
    public function __construct(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, $error, \_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command $command = null)
    {
        parent::__construct($command, $input, $output);
        $this->setError($error);
    }
    /**
     * Returns the thrown error/exception.
     *
     * @return \Throwable
     */
    public function getError()
    {
        return $this->error;
    }
    /**
     * Replaces the thrown error/exception.
     *
     * @param \Throwable $error
     */
    public function setError($error)
    {
        if (!$error instanceof \Throwable && !$error instanceof \Exception) {
            throw new \_HumbugBoxb94336daae36\Symfony\Component\Console\Exception\InvalidArgumentException(\sprintf('The error passed to ConsoleErrorEvent must be an instance of \\Throwable or \\Exception, "%s" was passed instead.', \is_object($error) ? \get_class($error) : \gettype($error)));
        }
        $this->error = $error;
    }
    /**
     * Sets the exit code.
     *
     * @param int $exitCode The command exit code
     */
    public function setExitCode($exitCode)
    {
        $this->exitCode = (int) $exitCode;
        $r = new \ReflectionProperty($this->error, 'code');
        $r->setAccessible(\true);
        $r->setValue($this->error, $this->exitCode);
    }
    /**
     * Gets the exit code.
     *
     * @return int The command exit code
     */
    public function getExitCode()
    {
        return null !== $this->exitCode ? $this->exitCode : (\is_int($this->error->getCode()) && 0 !== $this->error->getCode() ? $this->error->getCode() : 1);
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Event;

/**
 * Allows to do things before the command is executed, like skipping the command or changing the input.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ConsoleCommandEvent extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Event\ConsoleEvent
{
    /**
     * The return code for skipped commands, this will also be passed into the terminate event.
     */
    const RETURN_CODE_DISABLED = 113;
    /**
     * Indicates if the command should be run or skipped.
     */
    private $commandShouldRun = \true;
    /**
     * Disables the command, so it won't be run.
     *
     * @return bool
     */
    public function disableCommand()
    {
        return $this->commandShouldRun = \false;
    }
    /**
     * Enables the command.
     *
     * @return bool
     */
    public function enableCommand()
    {
        return $this->commandShouldRun = \true;
    }
    /**
     * Returns true if the command is runnable, false otherwise.
     *
     * @return bool
     */
    public function commandShouldRun()
    {
        return $this->commandShouldRun;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Event;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\EventDispatcher\Event;
/**
 * Allows to inspect input and output of a command.
 *
 * @author Francesco Levorato <git@flevour.net>
 */
class ConsoleEvent extends \_HumbugBoxb94336daae36\Symfony\Component\EventDispatcher\Event
{
    protected $command;
    private $input;
    private $output;
    public function __construct(\_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command $command = null, \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output)
    {
        $this->command = $command;
        $this->input = $input;
        $this->output = $output;
    }
    /**
     * Gets the command that is executed.
     *
     * @return Command|null A Command instance
     */
    public function getCommand()
    {
        return $this->command;
    }
    /**
     * Gets the input instance.
     *
     * @return InputInterface An InputInterface instance
     */
    public function getInput()
    {
        return $this->input;
    }
    /**
     * Gets the output instance.
     *
     * @return OutputInterface An OutputInterface instance
     */
    public function getOutput()
    {
        return $this->output;
    }
}
<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\Event;

@\trigger_error(\sprintf('The "%s" class is deprecated since Symfony 3.3 and will be removed in 4.0. Use the ConsoleErrorEvent instead.', \_HumbugBoxb94336daae36\Symfony\Component\Console\Event\ConsoleExceptionEvent::class), \E_USER_DEPRECATED);
use _HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
/**
 * Allows to handle exception thrown in a command.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @deprecated since version 3.3, to be removed in 4.0. Use ConsoleErrorEvent instead.
 */
class ConsoleExceptionEvent extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Event\ConsoleEvent
{
    private $exception;
    private $exitCode;
    public function __construct(\_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command $command, \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, \Exception $exception, $exitCode)
    {
        parent::__construct($command, $input, $output);
        $this->setException($exception);
        $this->exitCode = (int) $exitCode;
    }
    /**
     * Returns the thrown exception.
     *
     * @return \Exception The thrown exception
     */
    public function getException()
    {
        return $this->exception;
    }
    /**
     * Replaces the thrown exception.
     *
     * This exception will be thrown if no response is set in the event.
     *
     * @param \Exception $exception The thrown exception
     */
    public function setException(\Exception $exception)
    {
        $this->exception = $exception;
    }
    /**
     * Gets the exit code.
     *
     * @return int The command exit code
     */
    public function getExitCode()
    {
        return $this->exitCode;
    }
}
{
    "name": "symfony\/console",
    "type": "library",
    "description": "Symfony Console Component",
    "keywords": [],
    "homepage": "https:\/\/symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "https:\/\/symfony.com\/contributors"
        }
    ],
    "require": {
        "php": "^5.5.9|>=7.0.8",
        "symfony\/polyfill-mbstring": "~1.0",
        "symfony\/debug": "~2.8|~3.0|~4.0"
    },
    "require-dev": {
        "symfony\/config": "~3.3|~4.0",
        "symfony\/event-dispatcher": "~2.8|~3.0|~4.0",
        "symfony\/dependency-injection": "~3.4|~4.0",
        "symfony\/lock": "~3.4|~4.0",
        "symfony\/process": "~3.3|~4.0",
        "psr\/log": "~1.0"
    },
    "provide": {
        "psr\/log-implementation": "1.0"
    },
    "suggest": {
        "symfony\/event-dispatcher": "",
        "symfony\/lock": "",
        "symfony\/process": "",
        "psr\/log": "For using the console logger"
    },
    "conflict": {
        "symfony\/dependency-injection": "<3.4",
        "symfony\/process": "<3.3"
    },
    "autoload": {
        "psr-4": {
            "_HumbugBoxb94336daae36\\Symfony\\Component\\Console\\": ""
        },
        "exclude-from-classmap": [
            "\/Tests\/"
        ]
    },
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "3.4-dev"
        }
    }
}<?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 _HumbugBoxb94336daae36\Symfony\Component\Console\EventListener;

use _HumbugBoxb94336daae36\Psr\Log\LoggerInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\ConsoleEvents;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Event\ConsoleErrorEvent;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Event\ConsoleEvent;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Event\ConsoleTerminateEvent;
use _HumbugBoxb94336daae36\Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
 * @author James Halsall <james.t.halsall@googlemail.com>
 * @author Robin Chalas <robin.chalas@gmail.com>
 */
class ErrorListener implements \_HumbugBoxb94336daae36\Symfony\Component\EventDispatcher\EventSubscriberInterface
{
    private $logger;
    public function __construct(\_HumbugBoxb94336daae36\Psr\Log\LoggerInterface $logger = null)
    {
        $this->logger = $logger;
    }
    public function onConsoleError(\_HumbugBoxb94336daae36\Symfony\Component\Console\Event\ConsoleErrorEvent $event)
    {
        if (null === $this->logger) {
            return;
        }
        $error = $event->getError();
        if (!($inputString = $this->getInputString($event))) {
            return $this->logger->error('An error occurred while using the console. Message: "{message}"', ['exception' => $error, 'message' => $error->getMessage()]);
        }
        $this->logger->error('Error thrown while running command "{command}". Message: "{message}"', ['exception' => $error, 'command' => $inputString, 'message' => $error->getMessage()]);
    }
    public function onConsoleTerminate(\_HumbugBoxb94336daae36\Symfony\Component\Console\Event\ConsoleTerminateEvent $event)
    {
        if (null === $this->logger) {
            return;
        }
        $exitCode = $event->getExitCode();
        if (0 === $exitCode) {
            return;
        }
        if (!($inputString = $this->getInputString($event))) {
            return $this->logger->debug('The console exited with code "{code}"', ['code' => $exitCode]);
        }
        $this->logger->debug('Command "{command}" exited with code "{code}"', ['command' => $inputString, 'code' => $exitCode]);
    }
    public static function getSubscribedEvents()
    {
        return [\_HumbugBoxb94336daae36\Symfony\Component\Console\ConsoleEvents::ERROR => ['onConsoleError', -128], \_HumbugBoxb94336daae36\Symfony\Component\Console\ConsoleEvents::TERMINATE => ['onConsoleTerminate', -128]];
    }
    private static function getInputString(\_HumbugBoxb94336daae36\Symfony\Component\Console\Event\ConsoleEvent $event)
    {
        $commandName = $event->getCommand() ? $event->getCommand()->getName() : null;
        $input = $event->getInput();
        if (\method_exists($input, '__toString')) {
            if ($commandName) {
                return \str_replace(["'{$commandName}'", "\"{$commandName}\""], $commandName, (string) $input);
            }
            return (string) $input;
        }
        return $commandName;
    }
}
Copyright (c) 2015-2019 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
<?php

namespace _HumbugBoxb94336daae36;

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

// from Case_Ignorable in https://unicode.org/Public/UNIDATA/DerivedCoreProperties.txt
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

namespace _HumbugBoxb94336daae36;

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', 'ƀ' => 'Ƀ', 'ƃ' => 'Ƃ', 'ƅ' => 'Ƅ', 'ƈ' => 'Ƈ', 'ƌ' => 'Ƌ', 'ƒ' => 'Ƒ', 'ƕ' => 'Ƕ', 'ƙ' => 'Ƙ', 'ƚ' => 'Ƚ', 'ƞ' => 'Ƞ', 'ơ' => 'Ơ', 'ƣ' => 'Ƣ', 'ƥ' => 'Ƥ', 'ƨ' => 'Ƨ', 'ƭ' => 'Ƭ', 'ư' => 'Ư', 'ƴ' => 'Ƴ', 'ƶ' => 'Ƶ', 'ƹ' => 'Ƹ', 'ƽ' => 'Ƽ', 'ƿ' => 'Ƿ', 'ǅ' => 'Ǆ', 'ǆ' => 'Ǆ', 'ǈ' => 'Ǉ', 'ǉ' => 'Ǉ', 'ǋ' => 'Ǌ', 'ǌ' => 'Ǌ', 'ǎ' => 'Ǎ', 'ǐ' => 'Ǐ', 'ǒ' => 'Ǒ', 'ǔ' => 'Ǔ', 'ǖ' => 'Ǖ', 'ǘ' => 'Ǘ', 'ǚ' => 'Ǚ', 'ǜ' => 'Ǜ', 'ǝ' => 'Ǝ', 'ǟ' => 'Ǟ', 'ǡ' => 'Ǡ', 'ǣ' => 'Ǣ', 'ǥ' => 'Ǥ', 'ǧ' => 'Ǧ', 'ǩ' => 'Ǩ', 'ǫ' => 'Ǫ', 'ǭ' => 'Ǭ', 'ǯ' => 'Ǯ', 'ǲ' => 'Ǳ', 'ǳ' => 'Ǳ', 'ǵ' => 'Ǵ', 'ǹ' => 'Ǹ', 'ǻ' => 'Ǻ', 'ǽ' => 'Ǽ', 'ǿ' => 'Ǿ', 'ȁ' => 'Ȁ', 'ȃ' => 'Ȃ', 'ȅ' => 'Ȅ', 'ȇ' => 'Ȇ', 'ȉ' => 'Ȉ', 'ȋ' => 'Ȋ', 'ȍ' => 'Ȍ', 'ȏ' => 'Ȏ', 'ȑ' => 'Ȑ', 'ȓ' => 'Ȓ', 'ȕ' => 'Ȕ', 'ȗ' => 'Ȗ', 'ș' => 'Ș', 'ț' => 'Ț', 'ȝ' => 'Ȝ', 'ȟ' => 'Ȟ', 'ȣ' => 'Ȣ', 'ȥ' => 'Ȥ', 'ȧ' => 'Ȧ', 'ȩ' => 'Ȩ', 'ȫ' => 'Ȫ', 'ȭ' => 'Ȭ', 'ȯ' => 'Ȯ', 'ȱ' => 'Ȱ', 'ȳ' => 'Ȳ', 'ȼ' => 'Ȼ', 'ȿ' => 'Ȿ', 'ɀ' => 'Ɀ', 'ɂ' => 'Ɂ', 'ɇ' => 'Ɇ', 'ɉ' => 'Ɉ', 'ɋ' => 'Ɋ', 'ɍ' => 'Ɍ', 'ɏ' => 'Ɏ', 'ɐ' => 'Ɐ', 'ɑ' => 'Ɑ', 'ɒ' => 'Ɒ', 'ɓ' => 'Ɓ', 'ɔ' => 'Ɔ', 'ɖ' => 'Ɖ', 'ɗ' => 'Ɗ', 'ə' => 'Ə', 'ɛ' => 'Ɛ', 'ɜ' => 'Ɜ', 'ɠ' => 'Ɠ', 'ɡ' => 'Ɡ', 'ɣ' => 'Ɣ', 'ɥ' => 'Ɥ', 'ɦ' => 'Ɦ', 'ɨ' => 'Ɨ', 'ɩ' => 'Ɩ', 'ɫ' => 'Ɫ', 'ɬ' => 'Ɬ', 'ɯ' => 'Ɯ', 'ɱ' => 'Ɱ', 'ɲ' => 'Ɲ', 'ɵ' => 'Ɵ', 'ɽ' => 'Ɽ', 'ʀ' => 'Ʀ', 'ʃ' => 'Ʃ', 'ʇ' => 'Ʇ', 'ʈ' => 'Ʈ', 'ʉ' => 'Ʉ', 'ʊ' => 'Ʊ', 'ʋ' => 'Ʋ', 'ʌ' => 'Ʌ', 'ʒ' => 'Ʒ', 'ʞ' => 'Ʞ', 'ͅ' => 'Ι', 'ͱ' => 'Ͱ', 'ͳ' => 'Ͳ', 'ͷ' => 'Ͷ', 'ͻ' => 'Ͻ', 'ͼ' => 'Ͼ', 'ͽ' => 'Ͽ', 'ά' => 'Ά', 'έ' => 'Έ', 'ή' => 'Ή', 'ί' => 'Ί', 'α' => 'Α', 'β' => 'Β', 'γ' => 'Γ', 'δ' => 'Δ', 'ε' => 'Ε', 'ζ' => 'Ζ', 'η' => 'Η', 'θ' => 'Θ', 'ι' => 'Ι', 'κ' => 'Κ', 'λ' => 'Λ', 'μ' => 'Μ', 'ν' => 'Ν', 'ξ' => 'Ξ', 'ο' => 'Ο', 'π' => 'Π', 'ρ' => 'Ρ', 'ς' => 'Σ', 'σ' => 'Σ', 'τ' => 'Τ', 'υ' => 'Υ', 'φ' => 'Φ', 'χ' => 'Χ', 'ψ' => 'Ψ', 'ω' => 'Ω', 'ϊ' => 'Ϊ', 'ϋ' => 'Ϋ', 'ό' => 'Ό', 'ύ' => 'Ύ', 'ώ' => 'Ώ', 'ϐ' => 'Β', 'ϑ' => 'Θ', 'ϕ' => 'Φ', 'ϖ' => 'Π', 'ϗ' => 'Ϗ', 'ϙ' => 'Ϙ', 'ϛ' => 'Ϛ', 'ϝ' => 'Ϝ', 'ϟ' => 'Ϟ', 'ϡ' => 'Ϡ', 'ϣ' => 'Ϣ', 'ϥ' => 'Ϥ', 'ϧ' => 'Ϧ', 'ϩ' => 'Ϩ', 'ϫ' => 'Ϫ', 'ϭ' => 'Ϭ', 'ϯ' => 'Ϯ', 'ϰ' => 'Κ', 'ϱ' => 'Ρ', 'ϲ' => 'Ϲ', 'ϳ' => 'Ϳ', 'ϵ' => 'Ε', 'ϸ' => 'Ϸ', 'ϻ' => 'Ϻ', 'а' => 'А', 'б' => 'Б', 'в' => 'В', 'г' => 'Г', 'д' => 'Д', 'е' => 'Е', 'ж' => 'Ж', 'з' => 'З', 'и' => 'И', 'й' => 'Й', 'к' => 'К', 'л' => 'Л', 'м' => 'М', 'н' => 'Н', 'о' => 'О', 'п' => 'П', 'р' => 'Р', 'с' => 'С', 'т' => 'Т', 'у' => 'У', 'ф' => 'Ф', 'х' => 'Х', 'ц' => 'Ц', 'ч' => 'Ч', 'ш' => 'Ш', 'щ' => 'Щ', 'ъ' => 'Ъ', 'ы' => 'Ы', 'ь' => 'Ь', 'э' => 'Э', 'ю' => 'Ю', 'я' => 'Я', 'ѐ' => 'Ѐ', 'ё' => 'Ё', 'ђ' => 'Ђ', 'ѓ' => 'Ѓ', 'є' => 'Є', 'ѕ' => 'Ѕ', 'і' => 'І', 'ї' => 'Ї', 'ј' => 'Ј', 'љ' => 'Љ', 'њ' => 'Њ', 'ћ' => 'Ћ', 'ќ' => 'Ќ', 'ѝ' => 'Ѝ', 'ў' => 'Ў', 'џ' => 'Џ', 'ѡ' => 'Ѡ', 'ѣ' => 'Ѣ', 'ѥ' => 'Ѥ', 'ѧ' => 'Ѧ', 'ѩ' => 'Ѩ', 'ѫ' => 'Ѫ', 'ѭ' => 'Ѭ', 'ѯ' => 'Ѯ', 'ѱ' => 'Ѱ', 'ѳ' => 'Ѳ', 'ѵ' => 'Ѵ', 'ѷ' => 'Ѷ', 'ѹ' => 'Ѹ', 'ѻ' => 'Ѻ', 'ѽ' => 'Ѽ', 'ѿ' => 'Ѿ', 'ҁ' => 'Ҁ', 'ҋ' => 'Ҋ', 'ҍ' => 'Ҍ', 'ҏ' => 'Ҏ', 'ґ' => 'Ґ', 'ғ' => 'Ғ', 'ҕ' => 'Ҕ', 'җ' => 'Җ', 'ҙ' => 'Ҙ', 'қ' => 'Қ', 'ҝ' => 'Ҝ', 'ҟ' => 'Ҟ', 'ҡ' => 'Ҡ', 'ң' => 'Ң', 'ҥ' => 'Ҥ', 'ҧ' => 'Ҧ', 'ҩ' => 'Ҩ', 'ҫ' => 'Ҫ', 'ҭ' => 'Ҭ', 'ү' => 'Ү', 'ұ' => 'Ұ', 'ҳ' => 'Ҳ', 'ҵ' => 'Ҵ', 'ҷ' => 'Ҷ', 'ҹ' => 'Ҹ', 'һ' => 'Һ', 'ҽ' => 'Ҽ', 'ҿ' => 'Ҿ', 'ӂ' => 'Ӂ', 'ӄ' => 'Ӄ', 'ӆ' => 'Ӆ', 'ӈ' => 'Ӈ', 'ӊ' => 'Ӊ', 'ӌ' => 'Ӌ', 'ӎ' => 'Ӎ', 'ӏ' => 'Ӏ', 'ӑ' => 'Ӑ', 'ӓ' => 'Ӓ', 'ӕ' => 'Ӕ', 'ӗ' => 'Ӗ', 'ә' => 'Ә', 'ӛ' => 'Ӛ', 'ӝ' => 'Ӝ', 'ӟ' => 'Ӟ', 'ӡ' => 'Ӡ', 'ӣ' => 'Ӣ', 'ӥ' => 'Ӥ', 'ӧ' => 'Ӧ', 'ө' => 'Ө', 'ӫ' => 'Ӫ', 'ӭ' => 'Ӭ', 'ӯ' => 'Ӯ', 'ӱ' => 'Ӱ', 'ӳ' => 'Ӳ', 'ӵ' => 'Ӵ', 'ӷ' => 'Ӷ', 'ӹ' => 'Ӹ', 'ӻ' => 'Ӻ', 'ӽ' => 'Ӽ', 'ӿ' => 'Ӿ', 'ԁ' => 'Ԁ', 'ԃ' => 'Ԃ', 'ԅ' => 'Ԅ', 'ԇ' => 'Ԇ', 'ԉ' => 'Ԉ', 'ԋ' => 'Ԋ', 'ԍ' => 'Ԍ', 'ԏ' => 'Ԏ', 'ԑ' => 'Ԑ', 'ԓ' => 'Ԓ', 'ԕ' => 'Ԕ', 'ԗ' => 'Ԗ', 'ԙ' => 'Ԙ', 'ԛ' => 'Ԛ', 'ԝ' => 'Ԝ', 'ԟ' => 'Ԟ', 'ԡ' => 'Ԡ', 'ԣ' => 'Ԣ', 'ԥ' => 'Ԥ', 'ԧ' => 'Ԧ', 'ԩ' => 'Ԩ', 'ԫ' => 'Ԫ', 'ԭ' => 'Ԭ', 'ԯ' => 'Ԯ', 'ա' => 'Ա', 'բ' => 'Բ', 'գ' => 'Գ', 'դ' => 'Դ', 'ե' => 'Ե', 'զ' => 'Զ', 'է' => 'Է', 'ը' => 'Ը', 'թ' => 'Թ', 'ժ' => 'Ժ', 'ի' => 'Ի', 'լ' => 'Լ', 'խ' => 'Խ', 'ծ' => 'Ծ', 'կ' => 'Կ', 'հ' => 'Հ', 'ձ' => 'Ձ', 'ղ' => 'Ղ', 'ճ' => 'Ճ', 'մ' => 'Մ', 'յ' => 'Յ', 'ն' => 'Ն', 'շ' => 'Շ', 'ո' => 'Ո', 'չ' => 'Չ', 'պ' => 'Պ', 'ջ' => 'Ջ', 'ռ' => 'Ռ', 'ս' => 'Ս', 'վ' => 'Վ', 'տ' => 'Տ', 'ր' => 'Ր', 'ց' => 'Ց', 'ւ' => 'Ւ', 'փ' => 'Փ', 'ք' => 'Ք', 'օ' => 'Օ', 'ֆ' => 'Ֆ', 'ᵹ' => 'Ᵹ', 'ᵽ' => 'Ᵽ', 'ḁ' => 'Ḁ', 'ḃ' => 'Ḃ', 'ḅ' => 'Ḅ', 'ḇ' => 'Ḇ', 'ḉ' => 'Ḉ', 'ḋ' => 'Ḋ', 'ḍ' => 'Ḍ', 'ḏ' => 'Ḏ', 'ḑ' => 'Ḑ', 'ḓ' => 'Ḓ', 'ḕ' => 'Ḕ', 'ḗ' => 'Ḗ', 'ḙ' => 'Ḙ', 'ḛ' => 'Ḛ', 'ḝ' => 'Ḝ', 'ḟ' => 'Ḟ', 'ḡ' => 'Ḡ', 'ḣ' => 'Ḣ', 'ḥ' => 'Ḥ', 'ḧ' => 'Ḧ', 'ḩ' => 'Ḩ', 'ḫ' => 'Ḫ', 'ḭ' => 'Ḭ', 'ḯ' => 'Ḯ', 'ḱ' => 'Ḱ', 'ḳ' => 'Ḳ', 'ḵ' => 'Ḵ', 'ḷ' => 'Ḷ', 'ḹ' => 'Ḹ', 'ḻ' => 'Ḻ', 'ḽ' => 'Ḽ', 'ḿ' => 'Ḿ', 'ṁ' => 'Ṁ', 'ṃ' => 'Ṃ', 'ṅ' => 'Ṅ', 'ṇ' => 'Ṇ', 'ṉ' => 'Ṉ', 'ṋ' => 'Ṋ', 'ṍ' => 'Ṍ', 'ṏ' => 'Ṏ', 'ṑ' => 'Ṑ', 'ṓ' => 'Ṓ', 'ṕ' => 'Ṕ', 'ṗ' => 'Ṗ', 'ṙ' => 'Ṙ', 'ṛ' => 'Ṛ', 'ṝ' => 'Ṝ', 'ṟ' => 'Ṟ', 'ṡ' => 'Ṡ', 'ṣ' => 'Ṣ', 'ṥ' => 'Ṥ', 'ṧ' => 'Ṧ', 'ṩ' => 'Ṩ', 'ṫ' => 'Ṫ', 'ṭ' => 'Ṭ', 'ṯ' => 'Ṯ', 'ṱ' => 'Ṱ', 'ṳ' => 'Ṳ', 'ṵ' => 'Ṵ', 'ṷ' => 'Ṷ', 'ṹ' => 'Ṹ', 'ṻ' => 'Ṻ', 'ṽ' => 'Ṽ', 'ṿ' => 'Ṿ', 'ẁ' => 'Ẁ', 'ẃ' => 'Ẃ', 'ẅ' => 'Ẅ', 'ẇ' => 'Ẇ', 'ẉ' => 'Ẉ', 'ẋ' => 'Ẋ', 'ẍ' => 'Ẍ', 'ẏ' => 'Ẏ', 'ẑ' => 'Ẑ', 'ẓ' => 'Ẓ', 'ẕ' => 'Ẕ', 'ẛ' => 'Ṡ', 'ạ' => 'Ạ', 'ả' => 'Ả', 'ấ' => 'Ấ', 'ầ' => 'Ầ', 'ẩ' => 'Ẩ', 'ẫ' => 'Ẫ', 'ậ' => 'Ậ', 'ắ' => 'Ắ', 'ằ' => 'Ằ', 'ẳ' => 'Ẳ', 'ẵ' => 'Ẵ', 'ặ' => 'Ặ', 'ẹ' => 'Ẹ', 'ẻ' => 'Ẻ', 'ẽ' => 'Ẽ', 'ế' => 'Ế', 'ề' => 'Ề', 'ể' => 'Ể', 'ễ' => 'Ễ', 'ệ' => 'Ệ', 'ỉ' => 'Ỉ', 'ị' => 'Ị', 'ọ' => 'Ọ', 'ỏ' => 'Ỏ', 'ố' => 'Ố', 'ồ' => 'Ồ', 'ổ' => 'Ổ', 'ỗ' => 'Ỗ', 'ộ' => 'Ộ', 'ớ' => 'Ớ', 'ờ' => 'Ờ', 'ở' => 'Ở', 'ỡ' => 'Ỡ', 'ợ' => 'Ợ', 'ụ' => 'Ụ', 'ủ' => 'Ủ', 'ứ' => 'Ứ', 'ừ' => 'Ừ', 'ử' => 'Ử', 'ữ' => 'Ữ', 'ự' => 'Ự', 'ỳ' => 'Ỳ', 'ỵ' => 'Ỵ', 'ỷ' => 'Ỷ', 'ỹ' => 'Ỹ', 'ỻ' => 'Ỻ', 'ỽ' => 'Ỽ', 'ỿ' => 'Ỿ', 'ἀ' => 'Ἀ', 'ἁ' => 'Ἁ', 'ἂ' => 'Ἂ', 'ἃ' => 'Ἃ', 'ἄ' => 'Ἄ', 'ἅ' => 'Ἅ', 'ἆ' => 'Ἆ', 'ἇ' => 'Ἇ', 'ἐ' => 'Ἐ', 'ἑ' => 'Ἑ', 'ἒ' => 'Ἒ', 'ἓ' => 'Ἓ', 'ἔ' => 'Ἔ', 'ἕ' => 'Ἕ', 'ἠ' => 'Ἠ', 'ἡ' => 'Ἡ', 'ἢ' => 'Ἢ', 'ἣ' => 'Ἣ', 'ἤ' => 'Ἤ', 'ἥ' => 'Ἥ', 'ἦ' => 'Ἦ', 'ἧ' => 'Ἧ', 'ἰ' => 'Ἰ', 'ἱ' => 'Ἱ', 'ἲ' => 'Ἲ', 'ἳ' => 'Ἳ', 'ἴ' => 'Ἴ', 'ἵ' => 'Ἵ', 'ἶ' => 'Ἶ', 'ἷ' => 'Ἷ', 'ὀ' => 'Ὀ', 'ὁ' => 'Ὁ', 'ὂ' => 'Ὂ', 'ὃ' => 'Ὃ', 'ὄ' => 'Ὄ', 'ὅ' => 'Ὅ', 'ὑ' => 'Ὑ', 'ὓ' => 'Ὓ', 'ὕ' => 'Ὕ', 'ὗ' => 'Ὗ', 'ὠ' => 'Ὠ', 'ὡ' => 'Ὡ', 'ὢ' => 'Ὢ', 'ὣ' => 'Ὣ', 'ὤ' => 'Ὤ', 'ὥ' => 'Ὥ', 'ὦ' => 'Ὦ', 'ὧ' => 'Ὧ', 'ὰ' => 'Ὰ', 'ά' => 'Ά', 'ὲ' => 'Ὲ', 'έ' => 'Έ', 'ὴ' => 'Ὴ', 'ή' => 'Ή', 'ὶ' => 'Ὶ', 'ί' => 'Ί', 'ὸ' => 'Ὸ', 'ό' => 'Ό', 'ὺ' => 'Ὺ', 'ύ' => 'Ύ', 'ὼ' => 'Ὼ', 'ώ' => 'Ώ', 'ᾀ' => 'ᾈ', 'ᾁ' => 'ᾉ', 'ᾂ' => 'ᾊ', 'ᾃ' => 'ᾋ', 'ᾄ' => 'ᾌ', 'ᾅ' => 'ᾍ', 'ᾆ' => 'ᾎ', 'ᾇ' => 'ᾏ', 'ᾐ' => 'ᾘ', 'ᾑ' => 'ᾙ', 'ᾒ' => 'ᾚ', 'ᾓ' => 'ᾛ', 'ᾔ' => 'ᾜ', 'ᾕ' => 'ᾝ', 'ᾖ' => 'ᾞ', 'ᾗ' => 'ᾟ', 'ᾠ' => 'ᾨ', 'ᾡ' => 'ᾩ', 'ᾢ' => 'ᾪ', 'ᾣ' => 'ᾫ', 'ᾤ' => 'ᾬ', 'ᾥ' => 'ᾭ', 'ᾦ' => 'ᾮ', 'ᾧ' => 'ᾯ', 'ᾰ' => 'Ᾰ', 'ᾱ' => 'Ᾱ', 'ᾳ' => 'ᾼ', 'ι' => 'Ι', 'ῃ' => 'ῌ', 'ῐ' => 'Ῐ', 'ῑ' => 'Ῑ', 'ῠ' => 'Ῠ', 'ῡ' => 'Ῡ', 'ῥ' => 'Ῥ', 'ῳ' => 'ῼ', 'ⅎ' => 'Ⅎ', 'ⅰ' => 'Ⅰ', 'ⅱ' => 'Ⅱ', 'ⅲ' => 'Ⅲ', 'ⅳ' => 'Ⅳ', 'ⅴ' => 'Ⅴ', 'ⅵ' => 'Ⅵ', 'ⅶ' => 'Ⅶ', 'ⅷ' => 'Ⅷ', 'ⅸ' => 'Ⅸ', 'ⅹ' => 'Ⅹ', 'ⅺ' => 'Ⅺ', 'ⅻ' => 'Ⅻ', 'ⅼ' => 'Ⅼ', 'ⅽ' => 'Ⅽ', 'ⅾ' => 'Ⅾ', 'ⅿ' => 'Ⅿ', 'ↄ' => 'Ↄ', 'ⓐ' => 'Ⓐ', 'ⓑ' => 'Ⓑ', 'ⓒ' => 'Ⓒ', 'ⓓ' => 'Ⓓ', 'ⓔ' => 'Ⓔ', 'ⓕ' => 'Ⓕ', 'ⓖ' => 'Ⓖ', 'ⓗ' => 'Ⓗ', 'ⓘ' => 'Ⓘ', 'ⓙ' => 'Ⓙ', 'ⓚ' => 'Ⓚ', 'ⓛ' => 'Ⓛ', 'ⓜ' => 'Ⓜ', 'ⓝ' => 'Ⓝ', 'ⓞ' => 'Ⓞ', 'ⓟ' => 'Ⓟ', 'ⓠ' => 'Ⓠ', 'ⓡ' => 'Ⓡ', 'ⓢ' => 'Ⓢ', 'ⓣ' => 'Ⓣ', 'ⓤ' => 'Ⓤ', 'ⓥ' => 'Ⓥ', 'ⓦ' => 'Ⓦ', 'ⓧ' => 'Ⓧ', 'ⓨ' => 'Ⓨ', 'ⓩ' => 'Ⓩ', 'ⰰ' => 'Ⰰ', 'ⰱ' => 'Ⰱ', 'ⰲ' => 'Ⰲ', 'ⰳ' => 'Ⰳ', 'ⰴ' => 'Ⰴ', 'ⰵ' => 'Ⰵ', 'ⰶ' => 'Ⰶ', 'ⰷ' => 'Ⰷ', 'ⰸ' => 'Ⰸ', 'ⰹ' => 'Ⰹ', 'ⰺ' => 'Ⰺ', 'ⰻ' => 'Ⰻ', 'ⰼ' => 'Ⰼ', 'ⰽ' => 'Ⰽ', 'ⰾ' => 'Ⰾ', 'ⰿ' => 'Ⰿ', 'ⱀ' => 'Ⱀ', 'ⱁ' => 'Ⱁ', 'ⱂ' => 'Ⱂ', 'ⱃ' => 'Ⱃ', 'ⱄ' => 'Ⱄ', 'ⱅ' => 'Ⱅ', 'ⱆ' => 'Ⱆ', 'ⱇ' => 'Ⱇ', 'ⱈ' => 'Ⱈ', 'ⱉ' => 'Ⱉ', 'ⱊ' => 'Ⱊ', 'ⱋ' => 'Ⱋ', 'ⱌ' => 'Ⱌ', 'ⱍ' => 'Ⱍ', 'ⱎ' => 'Ⱎ', 'ⱏ' => 'Ⱏ', 'ⱐ' => 'Ⱐ', 'ⱑ' => 'Ⱑ', 'ⱒ' => 'Ⱒ', 'ⱓ' => 'Ⱓ', 'ⱔ' => 'Ⱔ', 'ⱕ' => 'Ⱕ', 'ⱖ' => 'Ⱖ', 'ⱗ' => 'Ⱗ', 'ⱘ' => 'Ⱘ', 'ⱙ' => 'Ⱙ', 'ⱚ' => 'Ⱚ', 'ⱛ' => 'Ⱛ', 'ⱜ' => 'Ⱜ', 'ⱝ' => 'Ⱝ', 'ⱞ' => 'Ⱞ', 'ⱡ' => 'Ⱡ', 'ⱥ' => 'Ⱥ', 'ⱦ' => 'Ⱦ', 'ⱨ' => 'Ⱨ', 'ⱪ' => 'Ⱪ', 'ⱬ' => 'Ⱬ', 'ⱳ' => 'Ⱳ', 'ⱶ' => 'Ⱶ', 'ⲁ' => 'Ⲁ', 'ⲃ' => 'Ⲃ', 'ⲅ' => 'Ⲅ', 'ⲇ' => 'Ⲇ', 'ⲉ' => 'Ⲉ', 'ⲋ' => 'Ⲋ', 'ⲍ' => 'Ⲍ', 'ⲏ' => 'Ⲏ', 'ⲑ' => 'Ⲑ', 'ⲓ' => 'Ⲓ', 'ⲕ' => 'Ⲕ', 'ⲗ' => 'Ⲗ', 'ⲙ' => 'Ⲙ', 'ⲛ' => 'Ⲛ', 'ⲝ' => 'Ⲝ', 'ⲟ' => 'Ⲟ', 'ⲡ' => 'Ⲡ', 'ⲣ' => 'Ⲣ', 'ⲥ' => 'Ⲥ', 'ⲧ' => 'Ⲧ', 'ⲩ' => 'Ⲩ', 'ⲫ' => 'Ⲫ', 'ⲭ' => 'Ⲭ', 'ⲯ' => 'Ⲯ', 'ⲱ' => 'Ⲱ', 'ⲳ' => 'Ⲳ', 'ⲵ' => 'Ⲵ', 'ⲷ' => 'Ⲷ', 'ⲹ' => 'Ⲹ', 'ⲻ' => 'Ⲻ', 'ⲽ' => 'Ⲽ', 'ⲿ' => 'Ⲿ', 'ⳁ' => 'Ⳁ', 'ⳃ' => 'Ⳃ', 'ⳅ' => 'Ⳅ', 'ⳇ' => 'Ⳇ', 'ⳉ' => 'Ⳉ', 'ⳋ' => 'Ⳋ', 'ⳍ' => 'Ⳍ', 'ⳏ' => 'Ⳏ', 'ⳑ' => 'Ⳑ', 'ⳓ' => 'Ⳓ', 'ⳕ' => 'Ⳕ', 'ⳗ' => 'Ⳗ', 'ⳙ' => 'Ⳙ', 'ⳛ' => 'Ⳛ', 'ⳝ' => 'Ⳝ', 'ⳟ' => 'Ⳟ', 'ⳡ' => 'Ⳡ', 'ⳣ' => 'Ⳣ', 'ⳬ' => 'Ⳬ', 'ⳮ' => 'Ⳮ', 'ⳳ' => 'Ⳳ', 'ⴀ' => 'Ⴀ', 'ⴁ' => 'Ⴁ', 'ⴂ' => 'Ⴂ', 'ⴃ' => 'Ⴃ', 'ⴄ' => 'Ⴄ', 'ⴅ' => 'Ⴅ', 'ⴆ' => 'Ⴆ', 'ⴇ' => 'Ⴇ', 'ⴈ' => 'Ⴈ', 'ⴉ' => 'Ⴉ', 'ⴊ' => 'Ⴊ', 'ⴋ' => 'Ⴋ', 'ⴌ' => 'Ⴌ', 'ⴍ' => 'Ⴍ', 'ⴎ' => 'Ⴎ', 'ⴏ' => 'Ⴏ', 'ⴐ' => 'Ⴐ', 'ⴑ' => 'Ⴑ', 'ⴒ' => 'Ⴒ', 'ⴓ' => 'Ⴓ', 'ⴔ' => 'Ⴔ', 'ⴕ' => 'Ⴕ', 'ⴖ' => 'Ⴖ', 'ⴗ' => 'Ⴗ', 'ⴘ' => 'Ⴘ', 'ⴙ' => 'Ⴙ', 'ⴚ' => 'Ⴚ', 'ⴛ' => 'Ⴛ', 'ⴜ' => 'Ⴜ', 'ⴝ' => 'Ⴝ', 'ⴞ' => 'Ⴞ', 'ⴟ' => 'Ⴟ', 'ⴠ' => 'Ⴠ', 'ⴡ' => 'Ⴡ', 'ⴢ' => 'Ⴢ', 'ⴣ' => 'Ⴣ', 'ⴤ' => 'Ⴤ', 'ⴥ' => 'Ⴥ', 'ⴧ' => 'Ⴧ', 'ⴭ' => 'Ⴭ', 'ꙁ' => 'Ꙁ', 'ꙃ' => 'Ꙃ', 'ꙅ' => 'Ꙅ', 'ꙇ' => 'Ꙇ', 'ꙉ' => 'Ꙉ', 'ꙋ' => 'Ꙋ', 'ꙍ' => 'Ꙍ', 'ꙏ' => 'Ꙏ', 'ꙑ' => 'Ꙑ', 'ꙓ' => 'Ꙓ', 'ꙕ' => 'Ꙕ', 'ꙗ' => 'Ꙗ', 'ꙙ' => 'Ꙙ', 'ꙛ' => 'Ꙛ', 'ꙝ' => 'Ꙝ', 'ꙟ' => 'Ꙟ', 'ꙡ' => 'Ꙡ', 'ꙣ' => 'Ꙣ', 'ꙥ' => 'Ꙥ', 'ꙧ' => 'Ꙧ', 'ꙩ' => 'Ꙩ', 'ꙫ' => 'Ꙫ', 'ꙭ' => 'Ꙭ', 'ꚁ' => 'Ꚁ', 'ꚃ' => 'Ꚃ', 'ꚅ' => 'Ꚅ', 'ꚇ' => 'Ꚇ', 'ꚉ' => 'Ꚉ', 'ꚋ' => 'Ꚋ', 'ꚍ' => 'Ꚍ', 'ꚏ' => 'Ꚏ', 'ꚑ' => 'Ꚑ', 'ꚓ' => 'Ꚓ', 'ꚕ' => 'Ꚕ', 'ꚗ' => 'Ꚗ', 'ꚙ' => 'Ꚙ', 'ꚛ' => 'Ꚛ', 'ꜣ' => 'Ꜣ', 'ꜥ' => 'Ꜥ', 'ꜧ' => 'Ꜧ', 'ꜩ' => 'Ꜩ', 'ꜫ' => 'Ꜫ', 'ꜭ' => 'Ꜭ', 'ꜯ' => 'Ꜯ', 'ꜳ' => 'Ꜳ', 'ꜵ' => 'Ꜵ', 'ꜷ' => 'Ꜷ', 'ꜹ' => 'Ꜹ', 'ꜻ' => 'Ꜻ', 'ꜽ' => 'Ꜽ', 'ꜿ' => 'Ꜿ', 'ꝁ' => 'Ꝁ', 'ꝃ' => 'Ꝃ', 'ꝅ' => 'Ꝅ', 'ꝇ' => 'Ꝇ', 'ꝉ' => 'Ꝉ', 'ꝋ' => 'Ꝋ', 'ꝍ' => 'Ꝍ', 'ꝏ' => 'Ꝏ', 'ꝑ' => 'Ꝑ', 'ꝓ' => 'Ꝓ', 'ꝕ' => 'Ꝕ', 'ꝗ' => 'Ꝗ', 'ꝙ' => 'Ꝙ', 'ꝛ' => 'Ꝛ', 'ꝝ' => 'Ꝝ', 'ꝟ' => 'Ꝟ', 'ꝡ' => 'Ꝡ', 'ꝣ' => 'Ꝣ', 'ꝥ' => 'Ꝥ', 'ꝧ' => 'Ꝧ', 'ꝩ' => 'Ꝩ', 'ꝫ' => 'Ꝫ', 'ꝭ' => 'Ꝭ', 'ꝯ' => 'Ꝯ', 'ꝺ' => 'Ꝺ', 'ꝼ' => 'Ꝼ', 'ꝿ' => 'Ꝿ', 'ꞁ' => 'Ꞁ', 'ꞃ' => 'Ꞃ', 'ꞅ' => 'Ꞅ', 'ꞇ' => 'Ꞇ', 'ꞌ' => 'Ꞌ', 'ꞑ' => 'Ꞑ', 'ꞓ' => 'Ꞓ', 'ꞗ' => 'Ꞗ', 'ꞙ' => 'Ꞙ', 'ꞛ' => 'Ꞛ', 'ꞝ' => 'Ꞝ', 'ꞟ' => 'Ꞟ', 'ꞡ' => 'Ꞡ', 'ꞣ' => 'Ꞣ', 'ꞥ' => 'Ꞥ', 'ꞧ' => 'Ꞧ', 'ꞩ' => 'Ꞩ', 'ａ' => 'Ａ', 'ｂ' => 'Ｂ', 'ｃ' => 'Ｃ', 'ｄ' => 'Ｄ', 'ｅ' => 'Ｅ', 'ｆ' => 'Ｆ', 'ｇ' => 'Ｇ', 'ｈ' => 'Ｈ', 'ｉ' => 'Ｉ', 'ｊ' => 'Ｊ', 'ｋ' => 'Ｋ', 'ｌ' => 'Ｌ', 'ｍ' => 'Ｍ', 'ｎ' => 'Ｎ', 'ｏ' => 'Ｏ', 'ｐ' => 'Ｐ', 'ｑ' => 'Ｑ', 'ｒ' => 'Ｒ', 'ｓ' => 'Ｓ', 'ｔ' => 'Ｔ', 'ｕ' => 'Ｕ', 'ｖ' => 'Ｖ', 'ｗ' => 'Ｗ', 'ｘ' => 'Ｘ', 'ｙ' => 'Ｙ', 'ｚ' => 'Ｚ', '𐐨' => '𐐀', '𐐩' => '𐐁', '𐐪' => '𐐂', '𐐫' => '𐐃', '𐐬' => '𐐄', '𐐭' => '𐐅', '𐐮' => '𐐆', '𐐯' => '𐐇', '𐐰' => '𐐈', '𐐱' => '𐐉', '𐐲' => '𐐊', '𐐳' => '𐐋', '𐐴' => '𐐌', '𐐵' => '𐐍', '𐐶' => '𐐎', '𐐷' => '𐐏', '𐐸' => '𐐐', '𐐹' => '𐐑', '𐐺' => '𐐒', '𐐻' => '𐐓', '𐐼' => '𐐔', '𐐽' => '𐐕', '𐐾' => '𐐖', '𐐿' => '𐐗', '𐑀' => '𐐘', '𐑁' => '𐐙', '𐑂' => '𐐚', '𐑃' => '𐐛', '𐑄' => '𐐜', '𐑅' => '𐐝', '𐑆' => '𐐞', '𐑇' => '𐐟', '𐑈' => '𐐠', '𐑉' => '𐐡', '𐑊' => '𐐢', '𐑋' => '𐐣', '𐑌' => '𐐤', '𐑍' => '𐐥', '𐑎' => '𐐦', '𐑏' => '𐐧', '𑣀' => '𑢠', '𑣁' => '𑢡', '𑣂' => '𑢢', '𑣃' => '𑢣', '𑣄' => '𑢤', '𑣅' => '𑢥', '𑣆' => '𑢦', '𑣇' => '𑢧', '𑣈' => '𑢨', '𑣉' => '𑢩', '𑣊' => '𑢪', '𑣋' => '𑢫', '𑣌' => '𑢬', '𑣍' => '𑢭', '𑣎' => '𑢮', '𑣏' => '𑢯', '𑣐' => '𑢰', '𑣑' => '𑢱', '𑣒' => '𑢲', '𑣓' => '𑢳', '𑣔' => '𑢴', '𑣕' => '𑢵', '𑣖' => '𑢶', '𑣗' => '𑢷', '𑣘' => '𑢸', '𑣙' => '𑢹', '𑣚' => '𑢺', '𑣛' => '𑢻', '𑣜' => '𑢼', '𑣝' => '𑢽', '𑣞' => '𑢾', '𑣟' => '𑢿');
<?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 _HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring;

/**
 * Partial mbstring implementation in PHP, iconv based, UTF-8 centric.
 *
 * Implemented:
 * - mb_chr                  - Returns a specific character from its Unicode code point
 * - mb_convert_encoding     - Convert character encoding
 * - mb_convert_variables    - Convert character code in variable(s)
 * - mb_decode_mimeheader    - Decode string in MIME header field
 * - mb_encode_mimeheader    - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED
 * - mb_decode_numericentity - Decode HTML numeric string reference to character
 * - mb_encode_numericentity - Encode character to HTML numeric string reference
 * - mb_convert_case         - Perform case folding on a string
 * - mb_detect_encoding      - Detect character encoding
 * - mb_get_info             - Get internal settings of mbstring
 * - mb_http_input           - Detect HTTP input character encoding
 * - mb_http_output          - Set/Get HTTP output character encoding
 * - mb_internal_encoding    - Set/Get internal character encoding
 * - mb_list_encodings       - Returns an array of all supported encodings
 * - mb_ord                  - Returns the Unicode code point of a character
 * - mb_output_handler       - Callback function converts character encoding in output buffer
 * - mb_scrub                - Replaces ill-formed byte sequences with substitute characters
 * - mb_strlen               - Get string length
 * - mb_strpos               - Find position of first occurrence of string in a string
 * - mb_strrpos              - Find position of last occurrence of a string in a string
 * - mb_strtolower           - Make a string lowercase
 * - mb_strtoupper           - Make a string uppercase
 * - mb_substitute_character - Set/Get substitution character
 * - mb_substr               - Get part of string
 * - mb_stripos              - Finds position of first occurrence of a string within another, case insensitive
 * - mb_stristr              - Finds first occurrence of a string within another, case insensitive
 * - mb_strrchr              - Finds the last occurrence of a character in a string within another
 * - mb_strrichr             - Finds the last occurrence of a character in a string within another, case insensitive
 * - mb_strripos             - Finds position of last occurrence of a string within another, case insensitive
 * - mb_strstr               - Finds first occurrence of a string within another
 * - mb_strwidth             - Return width of string
 * - mb_substr_count         - Count the number of substring occurrences
 *
 * Not implemented:
 * - mb_convert_kana         - Convert "kana" one from another ("zen-kaku", "han-kaku" and more)
 * - mb_ereg_*               - Regular expression with multibyte support
 * - mb_parse_str            - Parse GET/POST/COOKIE data and set global variable
 * - mb_preferred_mime_name  - Get MIME charset string
 * - mb_regex_encoding       - Returns current encoding for multibyte regex as string
 * - mb_regex_set_options    - Set/Get the default options for mbregex functions
 * - mb_send_mail            - Send encoded mail
 * - mb_split                - Split multibyte string using regular expression
 * - mb_strcut               - Get part of string
 * - mb_strimwidth           - Get truncated string with specified width
 *
 * @author Nicolas Grekas <p@tchwork.com>
 *
 * @internal
 */
final class Mbstring
{
    const MB_CASE_FOLD = \PHP_INT_MAX;
    private static $encodingList = array('ASCII', 'UTF-8');
    private static $language = 'neutral';
    private static $internalEncoding = 'UTF-8';
    private static $caseFold = array(array('µ', 'ſ', "ͅ", 'ς', "ϐ", "ϑ", "ϕ", "ϖ", "ϰ", "ϱ", "ϵ", "ẛ", "ι"), array('μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "ṡ", 'ι'));
    public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)
    {
        if (\is_array($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]+/', array(__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, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null)
    {
        $vars = array(&$a, &$b, &$c, &$d, &$e, &$f);
        $ok = \true;
        \array_walk_recursive($vars, function (&$v) use(&$ok, $toEncoding, $fromEncoding) {
            if (\false === ($v = \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::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) || !$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 '';
            // Instead of null (cf. mb_encode_numericentity).
        }
        $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) {
            // collector_decode_htmlnumericentity ignores $convmap[$i + 3]
            $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 \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::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) || !$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;
            // Instead of '' (cf. mb_decode_numericentity).
        }
        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 = array("" => 2, "" => 2, "" => 3, "" => 4);
        $cnt = \floor(\count($convmap) / 4) * 4;
        $i = 0;
        $len = \strlen($s);
        $result = '';
        while ($i < $len) {
            $ulen = $s[$i] < "" ? 1 : $ulenMask[$s[$i] & ""];
            $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, array(__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) {
                    $s = \str_replace(self::$caseFold[0], self::$caseFold[1], $s);
                }
                static $lower = null;
                if (null === $lower) {
                    $lower = self::getData('lowerCase');
                }
                $map = $lower;
            }
            static $ulenMask = array("" => 2, "" => 2, "" => 3, "" => 4);
            $i = 0;
            $len = \strlen($s);
            while ($i < $len) {
                $ulen = $s[$i] < "" ? 1 : $ulenMask[$s[$i] & ""];
                $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;
        }
        $encoding = self::getEncoding($encoding);
        if ('UTF-8' === $encoding || \false !== @\iconv($encoding, $encoding, ' ')) {
            self::$internalEncoding = $encoding;
            return \true;
        }
        return \false;
    }
    public static function mb_language($lang = null)
    {
        if (null === $lang) {
            return self::$language;
        }
        switch ($lang = \strtolower($lang)) {
            case 'uni':
            case 'neutral':
                self::$language = $lang;
                return \true;
        }
        return \false;
    }
    public static function mb_list_encodings()
    {
        return array('UTF-8');
    }
    public static function mb_encoding_aliases($encoding)
    {
        switch (\strtoupper($encoding)) {
            case 'UTF8':
            case 'UTF-8':
                return array('utf8');
        }
        return \false;
    }
    public static function mb_check_encoding($var = null, $encoding = null)
    {
        if (null === $encoding) {
            if (null === $var) {
                return \false;
            }
            $encoding = self::$internalEncoding;
        }
        return self::mb_detect_encoding($var, array($encoding)) || \false !== @\iconv($encoding, $encoding, $var);
    }
    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;
                    }
                // no break
                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) {
            \trigger_error(__METHOD__ . ': Empty delimiter', \E_USER_WARNING);
            return \false;
        }
        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) {
                $haystack = self::mb_substr($haystack, 0, $offset, $encoding);
                $offset = 0;
            } else {
                $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding);
            }
        }
        $pos = \iconv_strrpos($haystack, $needle, $encoding);
        return \false !== $pos ? $offset + $pos : \false;
    }
    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 (0 === \strcasecmp($c, 'none')) {
            return \true;
        }
        return null !== $c ? \false : 'none';
    }
    public static function mb_substr($s, $start, $length = null, $encoding = null)
    {
        $encoding = self::getEncoding($encoding);
        if ('CP850' === $encoding || 'ASCII' === $encoding) {
            return \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 = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
        $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $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) {
            return \strrchr($haystack, $needle, $part);
        }
        $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, self::MB_CASE_FOLD, $encoding);
        $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
        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 = array('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;
    }
    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;
        }
        $encoding = \strtoupper($encoding);
        if ('8BIT' === $encoding || 'BINARY' === $encoding) {
            return 'CP850';
        }
        if ('UTF8' === $encoding) {
            return 'UTF-8';
        }
        return $encoding;
    }
}
<?php

namespace _HumbugBoxb94336daae36;

/*
 * 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.
 */
use _HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring as p;
if (!\function_exists('mb_strlen')) {
    \define('MB_CASE_UPPER', 0);
    \define('MB_CASE_LOWER', 1);
    \define('MB_CASE_TITLE', 2);
    function mb_convert_encoding($s, $to, $from = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_convert_encoding($s, $to, $from);
    }
    function mb_decode_mimeheader($s)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_decode_mimeheader($s);
    }
    function mb_encode_mimeheader($s, $charset = null, $transferEnc = null, $lf = null, $indent = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_encode_mimeheader($s, $charset, $transferEnc, $lf, $indent);
    }
    function mb_decode_numericentity($s, $convmap, $enc = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_decode_numericentity($s, $convmap, $enc);
    }
    function mb_encode_numericentity($s, $convmap, $enc = null, $is_hex = \false)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_encode_numericentity($s, $convmap, $enc, $is_hex);
    }
    function mb_convert_case($s, $mode, $enc = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_convert_case($s, $mode, $enc);
    }
    function mb_internal_encoding($enc = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_internal_encoding($enc);
    }
    function mb_language($lang = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_language($lang);
    }
    function mb_list_encodings()
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_list_encodings();
    }
    function mb_encoding_aliases($encoding)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_encoding_aliases($encoding);
    }
    function mb_check_encoding($var = null, $encoding = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_check_encoding($var, $encoding);
    }
    function mb_detect_encoding($str, $encodingList = null, $strict = \false)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_detect_encoding($str, $encodingList, $strict);
    }
    function mb_detect_order($encodingList = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_detect_order($encodingList);
    }
    function mb_parse_str($s, &$result = array())
    {
        \parse_str($s, $result);
    }
    function mb_strlen($s, $enc = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_strlen($s, $enc);
    }
    function mb_strpos($s, $needle, $offset = 0, $enc = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_strpos($s, $needle, $offset, $enc);
    }
    function mb_strtolower($s, $enc = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_strtolower($s, $enc);
    }
    function mb_strtoupper($s, $enc = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_strtoupper($s, $enc);
    }
    function mb_substitute_character($char = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_substitute_character($char);
    }
    function mb_substr($s, $start, $length = 2147483647, $enc = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_substr($s, $start, $length, $enc);
    }
    function mb_stripos($s, $needle, $offset = 0, $enc = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_stripos($s, $needle, $offset, $enc);
    }
    function mb_stristr($s, $needle, $part = \false, $enc = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_stristr($s, $needle, $part, $enc);
    }
    function mb_strrchr($s, $needle, $part = \false, $enc = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_strrchr($s, $needle, $part, $enc);
    }
    function mb_strrichr($s, $needle, $part = \false, $enc = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_strrichr($s, $needle, $part, $enc);
    }
    function mb_strripos($s, $needle, $offset = 0, $enc = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_strripos($s, $needle, $offset, $enc);
    }
    function mb_strrpos($s, $needle, $offset = 0, $enc = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_strrpos($s, $needle, $offset, $enc);
    }
    function mb_strstr($s, $needle, $part = \false, $enc = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_strstr($s, $needle, $part, $enc);
    }
    function mb_get_info($type = 'all')
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_get_info($type);
    }
    function mb_http_output($enc = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_http_output($enc);
    }
    function mb_strwidth($s, $enc = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_strwidth($s, $enc);
    }
    function mb_substr_count($haystack, $needle, $enc = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_substr_count($haystack, $needle, $enc);
    }
    function mb_output_handler($contents, $status)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_output_handler($contents, $status);
    }
    function mb_http_input($type = '')
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_http_input($type);
    }
    function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_convert_variables($toEncoding, $fromEncoding, $a, $b, $c, $d, $e, $f);
    }
}
if (!\function_exists('mb_chr')) {
    function mb_ord($s, $enc = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_ord($s, $enc);
    }
    function mb_chr($code, $enc = null)
    {
        return \_HumbugBoxb94336daae36\Symfony\Polyfill\Mbstring\Mbstring::mb_chr($code, $enc);
    }
    function mb_scrub($s, $enc = null)
    {
        $enc = null === $enc ? \mb_internal_encoding() : $enc;
        return \mb_convert_encoding($s, $enc, $enc);
    }
}
Symfony Polyfill / Mbstring
===========================

This component provides a partial, native PHP implementation for the
[Mbstring](http://php.net/mbstring) extension.

More information can be found in the
[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).

License
=======

This library is released under the [MIT license](LICENSE).
{
    "name": "symfony\/polyfill-mbstring",
    "type": "library",
    "description": "Symfony polyfill for the Mbstring extension",
    "keywords": [
        "polyfill",
        "shim",
        "compatibility",
        "portable",
        "mbstring"
    ],
    "homepage": "https:\/\/symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Nicolas Grekas",
            "email": "p@tchwork.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "https:\/\/symfony.com\/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3"
    },
    "autoload": {
        "psr-4": {
            "_HumbugBoxb94336daae36\\Symfony\\Polyfill\\Mbstring\\": ""
        },
        "files": [
            "bootstrap.php"
        ]
    },
    "suggest": {
        "ext-mbstring": "For best performance"
    },
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "1.11-dev"
        }
    }
}<?php

declare (strict_types=1);
namespace PHPStan\PhpDoc;

use PHPStan\Analyser\NameScope;
use PHPStan\PhpDocParser\Lexer\Lexer;
use PHPStan\PhpDocParser\Parser\TokenIterator;
use PHPStan\PhpDocParser\Parser\TypeParser;
use PHPStan\Type\Type;
class TypeStringResolver
{
    /** @var Lexer */
    private $typeLexer;
    /** @var TypeParser */
    private $typeParser;
    /** @var TypeNodeResolver */
    private $typeNodeResolver;
    public function __construct(\PHPStan\PhpDocParser\Lexer\Lexer $typeLexer, \PHPStan\PhpDocParser\Parser\TypeParser $typeParser, \PHPStan\PhpDoc\TypeNodeResolver $typeNodeResolver)
    {
        $this->typeLexer = $typeLexer;
        $this->typeParser = $typeParser;
        $this->typeNodeResolver = $typeNodeResolver;
    }
    public function resolve(string $typeString, ?\PHPStan\Analyser\NameScope $nameScope = null) : \PHPStan\Type\Type
    {
        $tokens = new \PHPStan\PhpDocParser\Parser\TokenIterator($this->typeLexer->tokenize($typeString));
        $typeNode = $this->typeParser->parse($tokens);
        $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_END);
        return $this->typeNodeResolver->resolve($typeNode, $nameScope ?? new \PHPStan\Analyser\NameScope(null, []));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDoc;

interface TypeNodeResolverAwareExtension
{
    public function setTypeNodeResolver(\PHPStan\PhpDoc\TypeNodeResolver $typeNodeResolver) : void;
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDoc;

use PHPStan\Analyser\NameScope;
use PHPStan\PhpDocParser\Lexer\Lexer;
use PHPStan\PhpDocParser\Parser\PhpDocParser;
use PHPStan\PhpDocParser\Parser\TokenIterator;
class PhpDocStringResolver
{
    /** @var Lexer */
    private $phpDocLexer;
    /** @var PhpDocParser */
    private $phpDocParser;
    /** @var PhpDocNodeResolver */
    private $phpDocNodeResolver;
    public function __construct(\PHPStan\PhpDocParser\Lexer\Lexer $phpDocLexer, \PHPStan\PhpDocParser\Parser\PhpDocParser $phpDocParser, \PHPStan\PhpDoc\PhpDocNodeResolver $phpDocNodeResolver)
    {
        $this->phpDocNodeResolver = $phpDocNodeResolver;
        $this->phpDocLexer = $phpDocLexer;
        $this->phpDocParser = $phpDocParser;
    }
    public function resolve(string $phpDocString, \PHPStan\Analyser\NameScope $nameScope) : \PHPStan\PhpDoc\ResolvedPhpDocBlock
    {
        $tokens = new \PHPStan\PhpDocParser\Parser\TokenIterator($this->phpDocLexer->tokenize($phpDocString));
        $phpDocNode = $this->phpDocParser->parse($tokens);
        $tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_END);
        return $this->phpDocNodeResolver->resolve($phpDocNode, $nameScope);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDoc;

use PHPStan\Broker\Broker;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\Php\PhpMethodReflection;
use PHPStan\Reflection\Php\PhpPropertyReflection;
class PhpDocBlock
{
    /** @var string */
    private $docComment;
    /** @var string */
    private $file;
    /** @var string */
    private $class;
    /** @var string|null */
    private $trait;
    /** @var bool */
    private $explicit;
    private function __construct(string $docComment, string $file, string $class, ?string $trait, bool $explicit)
    {
        $this->docComment = $docComment;
        $this->file = $file;
        $this->class = $class;
        $this->trait = $trait;
        $this->explicit = $explicit;
    }
    public function getDocComment() : string
    {
        return $this->docComment;
    }
    public function getFile() : string
    {
        return $this->file;
    }
    public function getClass() : string
    {
        return $this->class;
    }
    public function getTrait() : ?string
    {
        return $this->trait;
    }
    public function isExplicit() : bool
    {
        return $this->explicit;
    }
    public static function resolvePhpDocBlockForProperty(\PHPStan\Broker\Broker $broker, ?string $docComment, string $class, ?string $trait, string $propertyName, string $file, ?bool $explicit = null) : ?self
    {
        return self::resolvePhpDocBlock($broker, $docComment, $class, $trait, $propertyName, $file, 'hasNativeProperty', 'getNativeProperty', __FUNCTION__, $explicit);
    }
    public static function resolvePhpDocBlockForMethod(\PHPStan\Broker\Broker $broker, ?string $docComment, string $class, ?string $trait, string $methodName, string $file, ?bool $explicit = null) : ?self
    {
        return self::resolvePhpDocBlock($broker, $docComment, $class, $trait, $methodName, $file, 'hasNativeMethod', 'getNativeMethod', __FUNCTION__, $explicit);
    }
    private static function resolvePhpDocBlock(\PHPStan\Broker\Broker $broker, ?string $docComment, string $class, ?string $trait, string $name, string $file, string $hasMethodName, string $getMethodName, string $resolveMethodName, ?bool $explicit) : ?self
    {
        if (($docComment === null || \preg_match('#\\{@inheritdoc\\}#i', $docComment) > 0) && $broker->hasClass($class)) {
            $classReflection = $broker->getClass($class);
            if ($classReflection->getParentClass() !== \false) {
                $parentClassReflection = $classReflection->getParentClass();
                $phpDocBlockFromClass = self::resolvePhpDocBlockRecursive($broker, $parentClassReflection, $trait, $name, $hasMethodName, $getMethodName, $resolveMethodName, $explicit ?? $docComment !== null);
                if ($phpDocBlockFromClass !== null) {
                    return $phpDocBlockFromClass;
                }
            }
            foreach ($classReflection->getInterfaces() as $interface) {
                $phpDocBlockFromClass = self::resolvePhpDocBlockFromClass($broker, $interface, $name, $hasMethodName, $getMethodName, $resolveMethodName, $explicit ?? $docComment !== null);
                if ($phpDocBlockFromClass !== null) {
                    return $phpDocBlockFromClass;
                }
            }
        }
        return $docComment !== null ? new self($docComment, $file, $class, $trait, $explicit ?? \true) : null;
    }
    private static function resolvePhpDocBlockRecursive(\PHPStan\Broker\Broker $broker, \PHPStan\Reflection\ClassReflection $classReflection, ?string $trait, string $name, string $hasMethodName, string $getMethodName, string $resolveMethodName, bool $explicit) : ?self
    {
        $phpDocBlockFromClass = self::resolvePhpDocBlockFromClass($broker, $classReflection, $name, $hasMethodName, $getMethodName, $resolveMethodName, $explicit);
        if ($phpDocBlockFromClass !== null) {
            return $phpDocBlockFromClass;
        }
        $parentClassReflection = $classReflection->getParentClass();
        if ($parentClassReflection !== \false) {
            return self::resolvePhpDocBlockRecursive($broker, $parentClassReflection, $trait, $name, $hasMethodName, $getMethodName, $resolveMethodName, $explicit);
        }
        return null;
    }
    private static function resolvePhpDocBlockFromClass(\PHPStan\Broker\Broker $broker, \PHPStan\Reflection\ClassReflection $classReflection, string $name, string $hasMethodName, string $getMethodName, string $resolveMethodName, bool $explicit) : ?self
    {
        if ($classReflection->getFileName() !== \false && $classReflection->{$hasMethodName}($name)) {
            /** @var \PHPStan\Reflection\PropertyReflection|\PHPStan\Reflection\MethodReflection $parentReflection */
            $parentReflection = $classReflection->{$getMethodName}($name);
            if (!$parentReflection instanceof \PHPStan\Reflection\Php\PhpPropertyReflection && !$parentReflection instanceof \PHPStan\Reflection\Php\PhpMethodReflection) {
                return null;
            }
            if ($parentReflection->isPrivate()) {
                return null;
            }
            if (!$parentReflection->getDeclaringClass()->isTrait() && $parentReflection->getDeclaringClass()->getName() !== $classReflection->getName()) {
                return null;
            }
            $traitReflection = $parentReflection instanceof \PHPStan\Reflection\Php\PhpMethodReflection ? $parentReflection->getDeclaringTrait() : null;
            $trait = $traitReflection !== null ? $traitReflection->getName() : null;
            if ($parentReflection->getDocComment() !== \false) {
                return self::$resolveMethodName($broker, $parentReflection->getDocComment(), $classReflection->getName(), $trait, $name, $classReflection->getFileName(), $explicit);
            }
        }
        return null;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDoc;

use PHPStan\DependencyInjection\Container;
class TypeNodeResolverFactory
{
    public const EXTENSION_TAG = 'phpstan.phpDoc.typeNodeResolverExtension';
    /** @var \PHPStan\DependencyInjection\Container */
    private $container;
    public function __construct(\PHPStan\DependencyInjection\Container $container)
    {
        $this->container = $container;
    }
    public function create() : \PHPStan\PhpDoc\TypeNodeResolver
    {
        return new \PHPStan\PhpDoc\TypeNodeResolver($this->container->getServicesByTag(self::EXTENSION_TAG));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDoc;

use PHPStan\PhpDoc\Tag\DeprecatedTag;
use PHPStan\PhpDoc\Tag\ReturnTag;
use PHPStan\PhpDoc\Tag\ThrowsTag;
class ResolvedPhpDocBlock
{
    /** @var array<string|int, \PHPStan\PhpDoc\Tag\VarTag> */
    private $varTags;
    /** @var array<string, \PHPStan\PhpDoc\Tag\MethodTag> */
    private $methodTags;
    /** @var array<string, \PHPStan\PhpDoc\Tag\PropertyTag> */
    private $propertyTags;
    /** @var array<string, \PHPStan\PhpDoc\Tag\ParamTag> */
    private $paramTags;
    /** @var \PHPStan\PhpDoc\Tag\ReturnTag|null */
    private $returnTag;
    /** @var \PHPStan\PhpDoc\Tag\ThrowsTag|null */
    private $throwsTag;
    /** @var \PHPStan\PhpDoc\Tag\DeprecatedTag|null */
    private $deprecatedTag;
    /** @var bool */
    private $isDeprecated;
    /** @var bool */
    private $isInternal;
    /** @var bool */
    private $isFinal;
    /**
     * @param array<string|int, \PHPStan\PhpDoc\Tag\VarTag> $varTags
     * @param array<string, \PHPStan\PhpDoc\Tag\MethodTag> $methodTags
     * @param array<string, \PHPStan\PhpDoc\Tag\PropertyTag> $propertyTags
     * @param array<string, \PHPStan\PhpDoc\Tag\ParamTag> $paramTags
     * @param \PHPStan\PhpDoc\Tag\ReturnTag|null $returnTag
     * @param \PHPStan\PhpDoc\Tag\ThrowsTag|null $throwsTags
     * @param \PHPStan\PhpDoc\Tag\DeprecatedTag|null $deprecatedTag
     * @param bool $isDeprecated
     * @param bool $isInternal
     * @param bool $isFinal
     */
    private function __construct(array $varTags, array $methodTags, array $propertyTags, array $paramTags, ?\PHPStan\PhpDoc\Tag\ReturnTag $returnTag, ?\PHPStan\PhpDoc\Tag\ThrowsTag $throwsTags, ?\PHPStan\PhpDoc\Tag\DeprecatedTag $deprecatedTag, bool $isDeprecated, bool $isInternal, bool $isFinal)
    {
        $this->varTags = $varTags;
        $this->methodTags = $methodTags;
        $this->propertyTags = $propertyTags;
        $this->paramTags = $paramTags;
        $this->returnTag = $returnTag;
        $this->throwsTag = $throwsTags;
        $this->deprecatedTag = $deprecatedTag;
        $this->isDeprecated = $isDeprecated;
        $this->isInternal = $isInternal;
        $this->isFinal = $isFinal;
    }
    /**
     * @param array<string|int, \PHPStan\PhpDoc\Tag\VarTag> $varTags
     * @param array<string, \PHPStan\PhpDoc\Tag\MethodTag> $methodTags
     * @param array<string, \PHPStan\PhpDoc\Tag\PropertyTag> $propertyTags
     * @param array<string, \PHPStan\PhpDoc\Tag\ParamTag> $paramTags
     * @param \PHPStan\PhpDoc\Tag\ReturnTag|null $returnTag
     * @param \PHPStan\PhpDoc\Tag\ThrowsTag|null $throwsTag
     * @param \PHPStan\PhpDoc\Tag\DeprecatedTag|null $deprecatedTag
     * @param bool $isDeprecated
     * @param bool $isInternal
     * @param bool $isFinal
     * @return self
     */
    public static function create(array $varTags, array $methodTags, array $propertyTags, array $paramTags, ?\PHPStan\PhpDoc\Tag\ReturnTag $returnTag, ?\PHPStan\PhpDoc\Tag\ThrowsTag $throwsTag, ?\PHPStan\PhpDoc\Tag\DeprecatedTag $deprecatedTag, bool $isDeprecated, bool $isInternal, bool $isFinal) : self
    {
        return new self($varTags, $methodTags, $propertyTags, $paramTags, $returnTag, $throwsTag, $deprecatedTag, $isDeprecated, $isInternal, $isFinal);
    }
    public static function createEmpty() : self
    {
        return new self([], [], [], [], null, null, null, \false, \false, \false);
    }
    /**
     * @return array<string|int, \PHPStan\PhpDoc\Tag\VarTag>
     */
    public function getVarTags() : array
    {
        return $this->varTags;
    }
    /**
     * @return array<string, \PHPStan\PhpDoc\Tag\MethodTag>
     */
    public function getMethodTags() : array
    {
        return $this->methodTags;
    }
    /**
     * @return array<string, \PHPStan\PhpDoc\Tag\PropertyTag>
     */
    public function getPropertyTags() : array
    {
        return $this->propertyTags;
    }
    /**
     * @return array<string, \PHPStan\PhpDoc\Tag\ParamTag>
     */
    public function getParamTags() : array
    {
        return $this->paramTags;
    }
    public function getReturnTag() : ?\PHPStan\PhpDoc\Tag\ReturnTag
    {
        return $this->returnTag;
    }
    public function getThrowsTag() : ?\PHPStan\PhpDoc\Tag\ThrowsTag
    {
        return $this->throwsTag;
    }
    public function getDeprecatedTag() : ?\PHPStan\PhpDoc\Tag\DeprecatedTag
    {
        return $this->deprecatedTag;
    }
    public function isDeprecated() : bool
    {
        return $this->isDeprecated;
    }
    public function isInternal() : bool
    {
        return $this->isInternal;
    }
    public function isFinal() : bool
    {
        return $this->isFinal;
    }
    /**
     * @param mixed[] $properties
     * @return self
     */
    public static function __set_state(array $properties) : self
    {
        return new self($properties['varTags'], $properties['methodTags'], $properties['propertyTags'], $properties['paramTags'], $properties['returnTag'], $properties['throwsTag'], $properties['deprecatedTag'], $properties['isDeprecated'], $properties['isInternal'], $properties['isFinal']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDoc;

use PHPStan\Analyser\NameScope;
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
use PHPStan\Type\Type;
interface TypeNodeResolverExtension
{
    public function getCacheKey() : string;
    public function resolve(\PHPStan\PhpDocParser\Ast\Type\TypeNode $typeNode, \PHPStan\Analyser\NameScope $nameScope) : ?\PHPStan\Type\Type;
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDoc;

use PHPStan\Analyser\NameScope;
use PHPStan\Broker\Broker;
use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode;
use PHPStan\PhpDocParser\Ast\Type\CallableTypeNode;
use PHPStan\PhpDocParser\Ast\Type\CallableTypeParameterNode;
use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode;
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
use PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode;
use PHPStan\PhpDocParser\Ast\Type\NullableTypeNode;
use PHPStan\PhpDocParser\Ast\Type\ThisTypeNode;
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode;
use PHPStan\Reflection\Native\NativeParameterReflection;
use PHPStan\Reflection\PassedByReference;
use PHPStan\Type\ArrayType;
use PHPStan\Type\BooleanType;
use PHPStan\Type\CallableType;
use PHPStan\Type\ClosureType;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\ErrorType;
use PHPStan\Type\FloatType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\IntersectionType;
use PHPStan\Type\IterableType;
use PHPStan\Type\MixedType;
use PHPStan\Type\NeverType;
use PHPStan\Type\NonexistentParentClassType;
use PHPStan\Type\NullType;
use PHPStan\Type\ObjectType;
use PHPStan\Type\ObjectWithoutClassType;
use PHPStan\Type\ResourceType;
use PHPStan\Type\StaticType;
use PHPStan\Type\StringType;
use PHPStan\Type\ThisType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\UnionType;
use PHPStan\Type\VoidType;
class TypeNodeResolver
{
    /** @var TypeNodeResolverExtension[] */
    private $extensions;
    /**
     * @param TypeNodeResolverExtension[] $extensions
     */
    public function __construct(array $extensions)
    {
        foreach ($extensions as $extension) {
            if (!$extension instanceof \PHPStan\PhpDoc\TypeNodeResolverAwareExtension) {
                continue;
            }
            $extension->setTypeNodeResolver($this);
        }
        $this->extensions = $extensions;
    }
    public function getCacheKey() : string
    {
        $key = 'v56';
        foreach ($this->extensions as $extension) {
            $key .= \sprintf('-%s', $extension->getCacheKey());
        }
        return $key;
    }
    public function resolve(\PHPStan\PhpDocParser\Ast\Type\TypeNode $typeNode, \PHPStan\Analyser\NameScope $nameScope) : \PHPStan\Type\Type
    {
        foreach ($this->extensions as $extension) {
            $type = $extension->resolve($typeNode, $nameScope);
            if ($type !== null) {
                return $type;
            }
        }
        if ($typeNode instanceof \PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode) {
            return $this->resolveIdentifierTypeNode($typeNode, $nameScope);
        } elseif ($typeNode instanceof \PHPStan\PhpDocParser\Ast\Type\ThisTypeNode) {
            return $this->resolveThisTypeNode($typeNode, $nameScope);
        } elseif ($typeNode instanceof \PHPStan\PhpDocParser\Ast\Type\NullableTypeNode) {
            return $this->resolveNullableTypeNode($typeNode, $nameScope);
        } elseif ($typeNode instanceof \PHPStan\PhpDocParser\Ast\Type\UnionTypeNode) {
            return $this->resolveUnionTypeNode($typeNode, $nameScope);
        } elseif ($typeNode instanceof \PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode) {
            return $this->resolveIntersectionTypeNode($typeNode, $nameScope);
        } elseif ($typeNode instanceof \PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode) {
            return $this->resolveArrayTypeNode($typeNode, $nameScope);
        } elseif ($typeNode instanceof \PHPStan\PhpDocParser\Ast\Type\GenericTypeNode) {
            return $this->resolveGenericTypeNode($typeNode, $nameScope);
        } elseif ($typeNode instanceof \PHPStan\PhpDocParser\Ast\Type\CallableTypeNode) {
            return $this->resolveCallableTypeNode($typeNode, $nameScope);
        }
        return new \PHPStan\Type\ErrorType();
    }
    private function resolveIdentifierTypeNode(\PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode $typeNode, \PHPStan\Analyser\NameScope $nameScope) : \PHPStan\Type\Type
    {
        switch (\strtolower($typeNode->name)) {
            case 'int':
            case 'integer':
                return new \PHPStan\Type\IntegerType();
            case 'string':
                return new \PHPStan\Type\StringType();
            case 'bool':
            case 'boolean':
                return new \PHPStan\Type\BooleanType();
            case 'true':
                return new \PHPStan\Type\Constant\ConstantBooleanType(\true);
            case 'false':
                return new \PHPStan\Type\Constant\ConstantBooleanType(\false);
            case 'null':
                return new \PHPStan\Type\NullType();
            case 'float':
            case 'double':
                return new \PHPStan\Type\FloatType();
            case 'array':
                return new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(\true), new \PHPStan\Type\MixedType(\true));
            case 'scalar':
                return new \PHPStan\Type\UnionType([new \PHPStan\Type\IntegerType(), new \PHPStan\Type\FloatType(), new \PHPStan\Type\StringType(), new \PHPStan\Type\BooleanType()]);
            case 'number':
                return new \PHPStan\Type\UnionType([new \PHPStan\Type\IntegerType(), new \PHPStan\Type\FloatType()]);
            case 'iterable':
                return new \PHPStan\Type\IterableType(new \PHPStan\Type\MixedType(\true), new \PHPStan\Type\MixedType(\true));
            case 'callable':
                return new \PHPStan\Type\CallableType();
            case 'resource':
                return new \PHPStan\Type\ResourceType();
            case 'mixed':
                return new \PHPStan\Type\MixedType(\true);
            case 'void':
                return new \PHPStan\Type\VoidType();
            case 'object':
                return new \PHPStan\Type\ObjectWithoutClassType();
            case 'never':
                return new \PHPStan\Type\NeverType();
        }
        if ($nameScope->getClassName() !== null) {
            switch (\strtolower($typeNode->name)) {
                case 'self':
                    return new \PHPStan\Type\ObjectType($nameScope->getClassName());
                case 'static':
                    return new \PHPStan\Type\StaticType($nameScope->getClassName());
                case 'parent':
                    $broker = \PHPStan\Broker\Broker::getInstance();
                    if ($broker->hasClass($nameScope->getClassName())) {
                        $classReflection = $broker->getClass($nameScope->getClassName());
                        if ($classReflection->getParentClass() !== \false) {
                            return new \PHPStan\Type\ObjectType($classReflection->getParentClass()->getName());
                        }
                    }
                    return new \PHPStan\Type\NonexistentParentClassType();
            }
        }
        return new \PHPStan\Type\ObjectType($nameScope->resolveStringName($typeNode->name));
    }
    private function resolveThisTypeNode(\PHPStan\PhpDocParser\Ast\Type\ThisTypeNode $typeNode, \PHPStan\Analyser\NameScope $nameScope) : \PHPStan\Type\Type
    {
        if ($nameScope->getClassName() !== null) {
            return new \PHPStan\Type\ThisType($nameScope->getClassName());
        }
        return new \PHPStan\Type\ErrorType();
    }
    private function resolveNullableTypeNode(\PHPStan\PhpDocParser\Ast\Type\NullableTypeNode $typeNode, \PHPStan\Analyser\NameScope $nameScope) : \PHPStan\Type\Type
    {
        return \PHPStan\Type\TypeCombinator::addNull($this->resolve($typeNode->type, $nameScope));
    }
    private function resolveUnionTypeNode(\PHPStan\PhpDocParser\Ast\Type\UnionTypeNode $typeNode, \PHPStan\Analyser\NameScope $nameScope) : \PHPStan\Type\Type
    {
        $iterableTypeNodes = [];
        $otherTypeNodes = [];
        foreach ($typeNode->types as $innerTypeNode) {
            if ($innerTypeNode instanceof \PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode) {
                $iterableTypeNodes[] = $innerTypeNode->type;
            } else {
                $otherTypeNodes[] = $innerTypeNode;
            }
        }
        $otherTypeTypes = $this->resolveMultiple($otherTypeNodes, $nameScope);
        if (\count($iterableTypeNodes) > 0) {
            $arrayTypeTypes = $this->resolveMultiple($iterableTypeNodes, $nameScope);
            $arrayTypeType = \PHPStan\Type\TypeCombinator::union(...$arrayTypeTypes);
            $addArray = \true;
            foreach ($otherTypeTypes as &$type) {
                if (!$type->isIterable()->yes() || !$type->getIterableValueType()->isSuperTypeOf($arrayTypeType)->yes()) {
                    continue;
                }
                if ($type instanceof \PHPStan\Type\ObjectType) {
                    $type = new \PHPStan\Type\IntersectionType([$type, new \PHPStan\Type\IterableType(new \PHPStan\Type\MixedType(), $arrayTypeType)]);
                } elseif ($type instanceof \PHPStan\Type\ArrayType) {
                    $type = new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), $arrayTypeType);
                } elseif ($type instanceof \PHPStan\Type\IterableType) {
                    $type = new \PHPStan\Type\IterableType(new \PHPStan\Type\MixedType(), $arrayTypeType);
                } else {
                    continue;
                }
                $addArray = \false;
            }
            if ($addArray) {
                $otherTypeTypes[] = new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), $arrayTypeType);
            }
        }
        return \PHPStan\Type\TypeCombinator::union(...$otherTypeTypes);
    }
    private function resolveIntersectionTypeNode(\PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode $typeNode, \PHPStan\Analyser\NameScope $nameScope) : \PHPStan\Type\Type
    {
        $types = $this->resolveMultiple($typeNode->types, $nameScope);
        return \PHPStan\Type\TypeCombinator::intersect(...$types);
    }
    private function resolveArrayTypeNode(\PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode $typeNode, \PHPStan\Analyser\NameScope $nameScope) : \PHPStan\Type\Type
    {
        $itemType = $this->resolve($typeNode->type, $nameScope);
        return new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), $itemType);
    }
    private function resolveGenericTypeNode(\PHPStan\PhpDocParser\Ast\Type\GenericTypeNode $typeNode, \PHPStan\Analyser\NameScope $nameScope) : \PHPStan\Type\Type
    {
        $mainTypeName = \strtolower($typeNode->type->name);
        $genericTypes = $this->resolveMultiple($typeNode->genericTypes, $nameScope);
        if ($mainTypeName === 'array') {
            if (\count($genericTypes) === 1) {
                // array<ValueType>
                return new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(\true), $genericTypes[0]);
            }
            if (\count($genericTypes) === 2) {
                // array<KeyType, ValueType>
                return new \PHPStan\Type\ArrayType($genericTypes[0], $genericTypes[1]);
            }
        } elseif ($mainTypeName === 'iterable') {
            if (\count($genericTypes) === 1) {
                // iterable<ValueType>
                return new \PHPStan\Type\IterableType(new \PHPStan\Type\MixedType(\true), $genericTypes[0]);
            }
            if (\count($genericTypes) === 2) {
                // iterable<KeyType, ValueType>
                return new \PHPStan\Type\IterableType($genericTypes[0], $genericTypes[1]);
            }
        }
        $mainType = $this->resolveIdentifierTypeNode($typeNode->type, $nameScope);
        if ($mainType->isIterable()->yes()) {
            if (\count($genericTypes) === 1) {
                // Foo<ValueType>
                return \PHPStan\Type\TypeCombinator::intersect($mainType, new \PHPStan\Type\IterableType(new \PHPStan\Type\MixedType(\true), $genericTypes[0]));
            }
            if (\count($genericTypes) === 2) {
                // Foo<KeyType, ValueType>
                return \PHPStan\Type\TypeCombinator::intersect($mainType, new \PHPStan\Type\IterableType($genericTypes[0], $genericTypes[1]));
            }
        }
        return new \PHPStan\Type\ErrorType();
    }
    private function resolveCallableTypeNode(\PHPStan\PhpDocParser\Ast\Type\CallableTypeNode $typeNode, \PHPStan\Analyser\NameScope $nameScope) : \PHPStan\Type\Type
    {
        $mainType = $this->resolve($typeNode->identifier, $nameScope);
        $isVariadic = \false;
        $parameters = \array_map(function (\PHPStan\PhpDocParser\Ast\Type\CallableTypeParameterNode $parameterNode) use($nameScope, &$isVariadic) : NativeParameterReflection {
            $isVariadic = $isVariadic || $parameterNode->isVariadic;
            return new \PHPStan\Reflection\Native\NativeParameterReflection($parameterNode->parameterName, $parameterNode->isOptional, $this->resolve($parameterNode->type, $nameScope), $parameterNode->isReference ? \PHPStan\Reflection\PassedByReference::createCreatesNewVariable() : \PHPStan\Reflection\PassedByReference::createNo(), $parameterNode->isVariadic);
        }, $typeNode->parameters);
        $returnType = $this->resolve($typeNode->returnType, $nameScope);
        if ($mainType instanceof \PHPStan\Type\CallableType) {
            return new \PHPStan\Type\CallableType($parameters, $returnType, $isVariadic);
        } elseif ($mainType instanceof \PHPStan\Type\ObjectType && $mainType->getClassName() === \Closure::class) {
            return new \PHPStan\Type\ClosureType($parameters, $returnType, $isVariadic);
        }
        return new \PHPStan\Type\ErrorType();
    }
    /**
     * @param TypeNode[] $typeNodes
     * @param NameScope $nameScope
     * @return Type[]
     */
    public function resolveMultiple(array $typeNodes, \PHPStan\Analyser\NameScope $nameScope) : array
    {
        $types = [];
        foreach ($typeNodes as $typeNode) {
            $types[] = $this->resolve($typeNode, $nameScope);
        }
        return $types;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDoc\Tag;

use PHPStan\Type\Type;
class ThrowsTag
{
    /** @var \PHPStan\Type\Type */
    private $type;
    public function __construct(\PHPStan\Type\Type $type)
    {
        $this->type = $type;
    }
    public function getType() : \PHPStan\Type\Type
    {
        return $this->type;
    }
    /**
     * @param mixed[] $properties
     * @return ThrowsTag
     */
    public static function __set_state(array $properties) : self
    {
        return new self($properties['type']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDoc\Tag;

use PHPStan\Type\Type;
class MethodTag
{
    /** @var \PHPStan\Type\Type */
    private $returnType;
    /** @var bool */
    private $isStatic;
    /** @var array<string, \PHPStan\PhpDoc\Tag\MethodTagParameter> */
    private $parameters;
    /**
     * @param \PHPStan\Type\Type $returnType
     * @param bool $isStatic
     * @param array<string, \PHPStan\PhpDoc\Tag\MethodTagParameter> $parameters
     */
    public function __construct(\PHPStan\Type\Type $returnType, bool $isStatic, array $parameters)
    {
        $this->returnType = $returnType;
        $this->isStatic = $isStatic;
        $this->parameters = $parameters;
    }
    public function getReturnType() : \PHPStan\Type\Type
    {
        return $this->returnType;
    }
    public function isStatic() : bool
    {
        return $this->isStatic;
    }
    /**
     * @return array<string, \PHPStan\PhpDoc\Tag\MethodTagParameter>
     */
    public function getParameters() : array
    {
        return $this->parameters;
    }
    /**
     * @param mixed[] $properties
     * @return self
     */
    public static function __set_state(array $properties) : self
    {
        return new self($properties['returnType'], $properties['isStatic'], $properties['parameters']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDoc\Tag;

use PHPStan\Reflection\PassedByReference;
use PHPStan\Type\Type;
class MethodTagParameter
{
    /** @var \PHPStan\Type\Type */
    private $type;
    /** @var \PHPStan\Reflection\PassedByReference */
    private $passedByReference;
    /** @var bool */
    private $isOptional;
    /** @var bool */
    private $isVariadic;
    public function __construct(\PHPStan\Type\Type $type, \PHPStan\Reflection\PassedByReference $passedByReference, bool $isOptional, bool $isVariadic)
    {
        $this->type = $type;
        $this->passedByReference = $passedByReference;
        $this->isOptional = $isOptional;
        $this->isVariadic = $isVariadic;
    }
    public function getType() : \PHPStan\Type\Type
    {
        return $this->type;
    }
    public function passedByReference() : \PHPStan\Reflection\PassedByReference
    {
        return $this->passedByReference;
    }
    public function isOptional() : bool
    {
        return $this->isOptional;
    }
    public function isVariadic() : bool
    {
        return $this->isVariadic;
    }
    /**
     * @param mixed[] $properties
     * @return self
     */
    public static function __set_state(array $properties) : self
    {
        return new self($properties['type'], $properties['passedByReference'], $properties['isOptional'], $properties['isVariadic']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDoc\Tag;

use PHPStan\Type\Type;
class ParamTag
{
    /** @var \PHPStan\Type\Type */
    private $type;
    /** @var bool */
    private $isVariadic;
    public function __construct(\PHPStan\Type\Type $type, bool $isVariadic)
    {
        $this->type = $type;
        $this->isVariadic = $isVariadic;
    }
    public function getType() : \PHPStan\Type\Type
    {
        return $this->type;
    }
    public function isVariadic() : bool
    {
        return $this->isVariadic;
    }
    /**
     * @param mixed[] $properties
     * @return self
     */
    public static function __set_state(array $properties) : self
    {
        return new self($properties['type'], $properties['isVariadic']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDoc\Tag;

use PHPStan\Type\Type;
class VarTag
{
    /** @var \PHPStan\Type\Type */
    private $type;
    public function __construct(\PHPStan\Type\Type $type)
    {
        $this->type = $type;
    }
    public function getType() : \PHPStan\Type\Type
    {
        return $this->type;
    }
    /**
     * @param mixed[] $properties
     * @return self
     */
    public static function __set_state(array $properties) : self
    {
        return new self($properties['type']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDoc\Tag;

use PHPStan\Type\Type;
class PropertyTag
{
    /** @var \PHPStan\Type\Type */
    private $type;
    /** @var bool */
    private $readable;
    /** @var bool */
    private $writable;
    public function __construct(\PHPStan\Type\Type $type, bool $readable, bool $writable)
    {
        $this->type = $type;
        $this->readable = $readable;
        $this->writable = $writable;
    }
    public function getType() : \PHPStan\Type\Type
    {
        return $this->type;
    }
    public function isReadable() : bool
    {
        return $this->readable;
    }
    public function isWritable() : bool
    {
        return $this->writable;
    }
    /**
     * @param mixed[] $properties
     * @return PropertyTag
     */
    public static function __set_state(array $properties) : self
    {
        return new self($properties['type'], $properties['readable'], $properties['writable']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDoc\Tag;

use PHPStan\Type\Type;
class ReturnTag
{
    /** @var \PHPStan\Type\Type */
    private $type;
    public function __construct(\PHPStan\Type\Type $type)
    {
        $this->type = $type;
    }
    public function getType() : \PHPStan\Type\Type
    {
        return $this->type;
    }
    /**
     * @param mixed[] $properties
     * @return ReturnTag
     */
    public static function __set_state(array $properties) : self
    {
        return new self($properties['type']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDoc\Tag;

class DeprecatedTag
{
    /** @var string|null */
    private $message;
    public function __construct(?string $message)
    {
        $this->message = $message;
    }
    public function getMessage() : ?string
    {
        return $this->message;
    }
    /**
     * @param mixed[] $properties
     * @return DeprecatedTag
     */
    public static function __set_state(array $properties) : self
    {
        return new self($properties['message']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\PhpDoc;

use PHPStan\Analyser\NameScope;
use PHPStan\PhpDoc\Tag\DeprecatedTag;
use PHPStan\PhpDoc\Tag\MethodTag;
use PHPStan\PhpDoc\Tag\MethodTagParameter;
use PHPStan\PhpDoc\Tag\ParamTag;
use PHPStan\PhpDoc\Tag\PropertyTag;
use PHPStan\PhpDoc\Tag\ReturnTag;
use PHPStan\PhpDoc\Tag\ThrowsTag;
use PHPStan\PhpDoc\Tag\VarTag;
use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNullNode;
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode;
use PHPStan\PhpDocParser\Ast\PhpDoc\ThrowsTagValueNode;
use PHPStan\Reflection\PassedByReference;
use PHPStan\Type\ArrayType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
class PhpDocNodeResolver
{
    /** @var TypeNodeResolver */
    private $typeNodeResolver;
    public function __construct(\PHPStan\PhpDoc\TypeNodeResolver $typeNodeResolver)
    {
        $this->typeNodeResolver = $typeNodeResolver;
    }
    public function resolve(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode $phpDocNode, \PHPStan\Analyser\NameScope $nameScope) : \PHPStan\PhpDoc\ResolvedPhpDocBlock
    {
        return \PHPStan\PhpDoc\ResolvedPhpDocBlock::create($this->resolveVarTags($phpDocNode, $nameScope), $this->resolveMethodTags($phpDocNode, $nameScope), $this->resolvePropertyTags($phpDocNode, $nameScope), $this->resolveParamTags($phpDocNode, $nameScope), $this->resolveReturnTag($phpDocNode, $nameScope), $this->resolveThrowsTags($phpDocNode, $nameScope), $this->resolveDeprecatedTag($phpDocNode, $nameScope), $this->resolveIsDeprecated($phpDocNode), $this->resolveIsInternal($phpDocNode), $this->resolveIsFinal($phpDocNode));
    }
    /**
     * @param PhpDocNode $phpDocNode
     * @param NameScope $nameScope
     * @return array<string|int, \PHPStan\PhpDoc\Tag\VarTag>
     */
    private function resolveVarTags(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode $phpDocNode, \PHPStan\Analyser\NameScope $nameScope) : array
    {
        $resolved = [];
        foreach ($phpDocNode->getVarTagValues() as $tagValue) {
            if ($tagValue->variableName !== '') {
                $variableName = \substr($tagValue->variableName, 1);
                $type = !isset($resolved[$variableName]) ? $this->typeNodeResolver->resolve($tagValue->type, $nameScope) : new \PHPStan\Type\MixedType();
                $resolved[$variableName] = new \PHPStan\PhpDoc\Tag\VarTag($type);
            } else {
                $resolved[] = new \PHPStan\PhpDoc\Tag\VarTag($this->typeNodeResolver->resolve($tagValue->type, $nameScope));
            }
        }
        return $resolved;
    }
    /**
     * @param PhpDocNode $phpDocNode
     * @param NameScope $nameScope
     * @return array<string, \PHPStan\PhpDoc\Tag\PropertyTag>
     */
    private function resolvePropertyTags(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode $phpDocNode, \PHPStan\Analyser\NameScope $nameScope) : array
    {
        $resolved = [];
        foreach ($phpDocNode->getPropertyTagValues() as $tagValue) {
            $propertyName = \substr($tagValue->propertyName, 1);
            $propertyType = !isset($resolved[$propertyName]) ? $this->typeNodeResolver->resolve($tagValue->type, $nameScope) : new \PHPStan\Type\MixedType();
            $resolved[$propertyName] = new \PHPStan\PhpDoc\Tag\PropertyTag($propertyType, \true, \true);
        }
        foreach ($phpDocNode->getPropertyReadTagValues() as $tagValue) {
            $propertyName = \substr($tagValue->propertyName, 1);
            $propertyType = !isset($resolved[$propertyName]) ? $this->typeNodeResolver->resolve($tagValue->type, $nameScope) : new \PHPStan\Type\MixedType();
            $resolved[$propertyName] = new \PHPStan\PhpDoc\Tag\PropertyTag($propertyType, \true, \false);
        }
        foreach ($phpDocNode->getPropertyWriteTagValues() as $tagValue) {
            $propertyName = \substr($tagValue->propertyName, 1);
            $propertyType = !isset($resolved[$propertyName]) ? $this->typeNodeResolver->resolve($tagValue->type, $nameScope) : new \PHPStan\Type\MixedType();
            $resolved[$propertyName] = new \PHPStan\PhpDoc\Tag\PropertyTag($propertyType, \false, \true);
        }
        return $resolved;
    }
    /**
     * @param PhpDocNode $phpDocNode
     * @param NameScope $nameScope
     * @return array<string, \PHPStan\PhpDoc\Tag\MethodTag>
     */
    private function resolveMethodTags(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode $phpDocNode, \PHPStan\Analyser\NameScope $nameScope) : array
    {
        $resolved = [];
        foreach ($phpDocNode->getMethodTagValues() as $tagValue) {
            $parameters = [];
            foreach ($tagValue->parameters as $parameterNode) {
                $parameterName = \substr($parameterNode->parameterName, 1);
                $type = $parameterNode->type !== null ? $this->typeNodeResolver->resolve($parameterNode->type, $nameScope) : new \PHPStan\Type\MixedType();
                if ($parameterNode->defaultValue instanceof \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNullNode) {
                    $type = \PHPStan\Type\TypeCombinator::addNull($type);
                }
                $parameters[$parameterName] = new \PHPStan\PhpDoc\Tag\MethodTagParameter($type, $parameterNode->isReference ? \PHPStan\Reflection\PassedByReference::createCreatesNewVariable() : \PHPStan\Reflection\PassedByReference::createNo(), $parameterNode->isVariadic || $parameterNode->defaultValue !== null, $parameterNode->isVariadic);
            }
            $resolved[$tagValue->methodName] = new \PHPStan\PhpDoc\Tag\MethodTag($tagValue->returnType !== null ? $this->typeNodeResolver->resolve($tagValue->returnType, $nameScope) : new \PHPStan\Type\MixedType(), $tagValue->isStatic, $parameters);
        }
        return $resolved;
    }
    /**
     * @param PhpDocNode $phpDocNode
     * @param NameScope $nameScope
     * @return array<string, \PHPStan\PhpDoc\Tag\ParamTag>
     */
    private function resolveParamTags(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode $phpDocNode, \PHPStan\Analyser\NameScope $nameScope) : array
    {
        $resolved = [];
        foreach ($phpDocNode->getParamTagValues() as $tagValue) {
            $parameterName = \substr($tagValue->parameterName, 1);
            $parameterType = !isset($resolved[$parameterName]) ? $this->typeNodeResolver->resolve($tagValue->type, $nameScope) : new \PHPStan\Type\MixedType();
            if ($tagValue->isVariadic) {
                if (!$parameterType instanceof \PHPStan\Type\ArrayType) {
                    $parameterType = new \PHPStan\Type\ArrayType(new \PHPStan\Type\IntegerType(), $parameterType);
                } elseif ($parameterType->getKeyType() instanceof \PHPStan\Type\MixedType) {
                    $parameterType = new \PHPStan\Type\ArrayType(new \PHPStan\Type\IntegerType(), $parameterType->getItemType());
                }
            }
            $resolved[$parameterName] = new \PHPStan\PhpDoc\Tag\ParamTag($parameterType, $tagValue->isVariadic);
        }
        return $resolved;
    }
    private function resolveReturnTag(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode $phpDocNode, \PHPStan\Analyser\NameScope $nameScope) : ?\PHPStan\PhpDoc\Tag\ReturnTag
    {
        foreach ($phpDocNode->getReturnTagValues() as $tagValue) {
            return new \PHPStan\PhpDoc\Tag\ReturnTag($this->typeNodeResolver->resolve($tagValue->type, $nameScope));
        }
        return null;
    }
    private function resolveThrowsTags(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode $phpDocNode, \PHPStan\Analyser\NameScope $nameScope) : ?\PHPStan\PhpDoc\Tag\ThrowsTag
    {
        $types = \array_map(function (\PHPStan\PhpDocParser\Ast\PhpDoc\ThrowsTagValueNode $throwsTagValue) use($nameScope) : Type {
            return $this->typeNodeResolver->resolve($throwsTagValue->type, $nameScope);
        }, $phpDocNode->getThrowsTagValues());
        if (\count($types) === 0) {
            return null;
        }
        return new \PHPStan\PhpDoc\Tag\ThrowsTag(\PHPStan\Type\TypeCombinator::union(...$types));
    }
    private function resolveDeprecatedTag(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode $phpDocNode, \PHPStan\Analyser\NameScope $nameScope) : ?\PHPStan\PhpDoc\Tag\DeprecatedTag
    {
        foreach ($phpDocNode->getDeprecatedTagValues() as $deprecatedTagValue) {
            $description = (string) $deprecatedTagValue;
            return new \PHPStan\PhpDoc\Tag\DeprecatedTag($description === '' ? null : $description);
        }
        return null;
    }
    private function resolveIsDeprecated(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode $phpDocNode) : bool
    {
        $deprecatedTags = $phpDocNode->getTagsByName('@deprecated');
        return \count($deprecatedTags) > 0;
    }
    private function resolveIsInternal(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode $phpDocNode) : bool
    {
        $internalTags = $phpDocNode->getTagsByName('@internal');
        return \count($internalTags) > 0;
    }
    private function resolveIsFinal(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode $phpDocNode) : bool
    {
        $finalTags = $phpDocNode->getTagsByName('@final');
        return \count($finalTags) > 0;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Broker;

use PHPStan\DependencyInjection\Container;
use PHPStan\File\RelativePathHelper;
use PHPStan\Parser\Parser;
use PHPStan\Reflection\Annotations\AnnotationsMethodsClassReflectionExtension;
use PHPStan\Reflection\Annotations\AnnotationsPropertiesClassReflectionExtension;
use PHPStan\Reflection\FunctionReflectionFactory;
use PHPStan\Reflection\Php\PhpClassReflectionExtension;
use PHPStan\Reflection\PhpDefect\PhpDefectClassReflectionExtension;
use PHPStan\Reflection\SignatureMap\SignatureMapProvider;
use PHPStan\Type\FileTypeMapper;
class BrokerFactory
{
    public const PROPERTIES_CLASS_REFLECTION_EXTENSION_TAG = 'phpstan.broker.propertiesClassReflectionExtension';
    public const METHODS_CLASS_REFLECTION_EXTENSION_TAG = 'phpstan.broker.methodsClassReflectionExtension';
    public const DYNAMIC_METHOD_RETURN_TYPE_EXTENSION_TAG = 'phpstan.broker.dynamicMethodReturnTypeExtension';
    public const DYNAMIC_STATIC_METHOD_RETURN_TYPE_EXTENSION_TAG = 'phpstan.broker.dynamicStaticMethodReturnTypeExtension';
    public const DYNAMIC_FUNCTION_RETURN_TYPE_EXTENSION_TAG = 'phpstan.broker.dynamicFunctionReturnTypeExtension';
    public const OPERATOR_TYPE_SPECIFYING_EXTENSION_TAG = 'phpstan.broker.operatorTypeSpecifyingExtension';
    /** @var \PHPStan\DependencyInjection\Container */
    private $container;
    public function __construct(\PHPStan\DependencyInjection\Container $container)
    {
        $this->container = $container;
    }
    public function create() : \PHPStan\Broker\Broker
    {
        $phpClassReflectionExtension = $this->container->getByType(\PHPStan\Reflection\Php\PhpClassReflectionExtension::class);
        $annotationsMethodsClassReflectionExtension = $this->container->getByType(\PHPStan\Reflection\Annotations\AnnotationsMethodsClassReflectionExtension::class);
        $annotationsPropertiesClassReflectionExtension = $this->container->getByType(\PHPStan\Reflection\Annotations\AnnotationsPropertiesClassReflectionExtension::class);
        $phpDefectClassReflectionExtension = $this->container->getByType(\PHPStan\Reflection\PhpDefect\PhpDefectClassReflectionExtension::class);
        /** @var RelativePathHelper $relativePathHelper */
        $relativePathHelper = $this->container->getService('simpleRelativePathHelper');
        return new \PHPStan\Broker\Broker(\array_merge([$phpClassReflectionExtension, $phpDefectClassReflectionExtension], $this->container->getServicesByTag(self::PROPERTIES_CLASS_REFLECTION_EXTENSION_TAG), [$annotationsPropertiesClassReflectionExtension]), \array_merge([$phpClassReflectionExtension], $this->container->getServicesByTag(self::METHODS_CLASS_REFLECTION_EXTENSION_TAG), [$annotationsMethodsClassReflectionExtension]), $this->container->getServicesByTag(self::DYNAMIC_METHOD_RETURN_TYPE_EXTENSION_TAG), $this->container->getServicesByTag(self::DYNAMIC_STATIC_METHOD_RETURN_TYPE_EXTENSION_TAG), $this->container->getServicesByTag(self::DYNAMIC_FUNCTION_RETURN_TYPE_EXTENSION_TAG), $this->container->getServicesByTag(self::OPERATOR_TYPE_SPECIFYING_EXTENSION_TAG), $this->container->getByType(\PHPStan\Reflection\FunctionReflectionFactory::class), $this->container->getByType(\PHPStan\Type\FileTypeMapper::class), $this->container->getByType(\PHPStan\Reflection\SignatureMap\SignatureMapProvider::class), $this->container->getByType(\PhpParser\PrettyPrinter\Standard::class), $this->container->getByType(\PHPStan\Broker\AnonymousClassNameHelper::class), $this->container->getByType(\PHPStan\Parser\Parser::class), $relativePathHelper, $this->container->getParameter('universalObjectCratesClasses'));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Broker;

class ClassAutoloadingException extends \PHPStan\AnalysedCodeException
{
    /** @var string */
    private $className;
    public function __construct(string $functionName, ?\Throwable $previous = null)
    {
        if ($previous !== null) {
            parent::__construct(\sprintf('%s (%s) thrown while autoloading class %s.', \get_class($previous), $previous->getMessage(), $functionName), 0, $previous);
        } else {
            parent::__construct(\sprintf('Class %s not found and could not be autoloaded.', $functionName), 0);
        }
        $this->className = $functionName;
    }
    public function getClassName() : string
    {
        return $this->className;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Broker;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\File\RelativePathHelper;
use PHPStan\Parser\Parser;
use PHPStan\PhpDoc\Tag\ParamTag;
use PHPStan\Reflection\BrokerAwareExtension;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\FunctionReflectionFactory;
use PHPStan\Reflection\FunctionVariant;
use PHPStan\Reflection\Native\NativeFunctionReflection;
use PHPStan\Reflection\Native\NativeParameterReflection;
use PHPStan\Reflection\SignatureMap\ParameterSignature;
use PHPStan\Reflection\SignatureMap\SignatureMapProvider;
use PHPStan\Type\BooleanType;
use PHPStan\Type\FileTypeMapper;
use PHPStan\Type\FloatType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\NullType;
use PHPStan\Type\OperatorTypeSpecifyingExtension;
use PHPStan\Type\StringAlwaysAcceptingObjectWithToStringType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeUtils;
use PHPStan\Type\UnionType;
use ReflectionClass;
class Broker
{
    /** @var \PHPStan\Reflection\PropertiesClassReflectionExtension[] */
    private $propertiesClassReflectionExtensions;
    /** @var \PHPStan\Reflection\MethodsClassReflectionExtension[] */
    private $methodsClassReflectionExtensions;
    /** @var \PHPStan\Type\DynamicMethodReturnTypeExtension[] */
    private $dynamicMethodReturnTypeExtensions = [];
    /** @var \PHPStan\Type\DynamicStaticMethodReturnTypeExtension[] */
    private $dynamicStaticMethodReturnTypeExtensions = [];
    /** @var \PHPStan\Type\DynamicMethodReturnTypeExtension[][]|null */
    private $dynamicMethodReturnTypeExtensionsByClass;
    /** @var \PHPStan\Type\DynamicStaticMethodReturnTypeExtension[][]|null */
    private $dynamicStaticMethodReturnTypeExtensionsByClass;
    /** @var \PHPStan\Type\DynamicFunctionReturnTypeExtension[] */
    private $dynamicFunctionReturnTypeExtensions = [];
    /** @var \PHPStan\Reflection\ClassReflection[] */
    private $classReflections = [];
    /** @var \PHPStan\Reflection\FunctionReflectionFactory */
    private $functionReflectionFactory;
    /** @var \PHPStan\Type\FileTypeMapper */
    private $fileTypeMapper;
    /** @var \PHPStan\Reflection\SignatureMap\SignatureMapProvider */
    private $signatureMapProvider;
    /** @var \PhpParser\PrettyPrinter\Standard */
    private $printer;
    /** @var AnonymousClassNameHelper */
    private $anonymousClassNameHelper;
    /** @var Parser */
    private $parser;
    /** @var RelativePathHelper */
    private $relativePathHelper;
    /** @var string[] */
    private $universalObjectCratesClasses;
    /** @var \PHPStan\Reflection\FunctionReflection[] */
    private $functionReflections = [];
    /** @var \PHPStan\Reflection\Php\PhpFunctionReflection[] */
    private $customFunctionReflections = [];
    /** @var self|null */
    private static $instance;
    /** @var bool[] */
    private $hasClassCache;
    /** @var NativeFunctionReflection[] */
    private static $functionMap = [];
    /** @var \PHPStan\Reflection\ClassReflection[] */
    private static $anonymousClasses = [];
    /** @var \PHPStan\Type\OperatorTypeSpecifyingExtension[] */
    private $operatorTypeSpecifyingExtensions;
    /**
     * @param \PHPStan\Reflection\PropertiesClassReflectionExtension[] $propertiesClassReflectionExtensions
     * @param \PHPStan\Reflection\MethodsClassReflectionExtension[] $methodsClassReflectionExtensions
     * @param \PHPStan\Type\DynamicMethodReturnTypeExtension[] $dynamicMethodReturnTypeExtensions
     * @param \PHPStan\Type\DynamicStaticMethodReturnTypeExtension[] $dynamicStaticMethodReturnTypeExtensions
     * @param \PHPStan\Type\DynamicFunctionReturnTypeExtension[] $dynamicFunctionReturnTypeExtensions
     * @param \PHPStan\Type\OperatorTypeSpecifyingExtension[] $operatorTypeSpecifyingExtensions
     * @param \PHPStan\Reflection\FunctionReflectionFactory $functionReflectionFactory
     * @param \PHPStan\Type\FileTypeMapper $fileTypeMapper
     * @param \PHPStan\Reflection\SignatureMap\SignatureMapProvider $signatureMapProvider
     * @param \PhpParser\PrettyPrinter\Standard $printer
     * @param AnonymousClassNameHelper $anonymousClassNameHelper
     * @param Parser $parser
     * @param RelativePathHelper $relativePathHelper
     * @param string[] $universalObjectCratesClasses
     */
    public function __construct(array $propertiesClassReflectionExtensions, array $methodsClassReflectionExtensions, array $dynamicMethodReturnTypeExtensions, array $dynamicStaticMethodReturnTypeExtensions, array $dynamicFunctionReturnTypeExtensions, array $operatorTypeSpecifyingExtensions, \PHPStan\Reflection\FunctionReflectionFactory $functionReflectionFactory, \PHPStan\Type\FileTypeMapper $fileTypeMapper, \PHPStan\Reflection\SignatureMap\SignatureMapProvider $signatureMapProvider, \PhpParser\PrettyPrinter\Standard $printer, \PHPStan\Broker\AnonymousClassNameHelper $anonymousClassNameHelper, \PHPStan\Parser\Parser $parser, \PHPStan\File\RelativePathHelper $relativePathHelper, array $universalObjectCratesClasses)
    {
        $this->propertiesClassReflectionExtensions = $propertiesClassReflectionExtensions;
        $this->methodsClassReflectionExtensions = $methodsClassReflectionExtensions;
        foreach (\array_merge($propertiesClassReflectionExtensions, $methodsClassReflectionExtensions, $dynamicMethodReturnTypeExtensions, $dynamicStaticMethodReturnTypeExtensions, $dynamicFunctionReturnTypeExtensions, $operatorTypeSpecifyingExtensions) as $extension) {
            if (!$extension instanceof \PHPStan\Reflection\BrokerAwareExtension) {
                continue;
            }
            $extension->setBroker($this);
        }
        $this->dynamicMethodReturnTypeExtensions = $dynamicMethodReturnTypeExtensions;
        $this->dynamicStaticMethodReturnTypeExtensions = $dynamicStaticMethodReturnTypeExtensions;
        $this->operatorTypeSpecifyingExtensions = $operatorTypeSpecifyingExtensions;
        foreach ($dynamicFunctionReturnTypeExtensions as $functionReturnTypeExtension) {
            $this->dynamicFunctionReturnTypeExtensions[] = $functionReturnTypeExtension;
        }
        $this->functionReflectionFactory = $functionReflectionFactory;
        $this->fileTypeMapper = $fileTypeMapper;
        $this->signatureMapProvider = $signatureMapProvider;
        $this->printer = $printer;
        $this->anonymousClassNameHelper = $anonymousClassNameHelper;
        $this->parser = $parser;
        $this->relativePathHelper = $relativePathHelper;
        $this->universalObjectCratesClasses = $universalObjectCratesClasses;
    }
    public static function registerInstance(\PHPStan\Broker\Broker $broker) : void
    {
        self::$instance = $broker;
    }
    public static function getInstance() : self
    {
        if (self::$instance === null) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return self::$instance;
    }
    /**
     * @return string[]
     */
    public function getUniversalObjectCratesClasses() : array
    {
        return $this->universalObjectCratesClasses;
    }
    /**
     * @param string $className
     * @return \PHPStan\Type\DynamicMethodReturnTypeExtension[]
     */
    public function getDynamicMethodReturnTypeExtensionsForClass(string $className) : array
    {
        if ($this->dynamicMethodReturnTypeExtensionsByClass === null) {
            $byClass = [];
            foreach ($this->dynamicMethodReturnTypeExtensions as $extension) {
                $byClass[$extension->getClass()][] = $extension;
            }
            $this->dynamicMethodReturnTypeExtensionsByClass = $byClass;
        }
        return $this->getDynamicExtensionsForType($this->dynamicMethodReturnTypeExtensionsByClass, $className);
    }
    /**
     * @param string $className
     * @return \PHPStan\Type\DynamicStaticMethodReturnTypeExtension[]
     */
    public function getDynamicStaticMethodReturnTypeExtensionsForClass(string $className) : array
    {
        if ($this->dynamicStaticMethodReturnTypeExtensionsByClass === null) {
            $byClass = [];
            foreach ($this->dynamicStaticMethodReturnTypeExtensions as $extension) {
                $byClass[$extension->getClass()][] = $extension;
            }
            $this->dynamicStaticMethodReturnTypeExtensionsByClass = $byClass;
        }
        return $this->getDynamicExtensionsForType($this->dynamicStaticMethodReturnTypeExtensionsByClass, $className);
    }
    /**
     * @return OperatorTypeSpecifyingExtension[]
     */
    public function getOperatorTypeSpecifyingExtensions(string $operator, \PHPStan\Type\Type $leftType, \PHPStan\Type\Type $rightType) : array
    {
        return \array_filter($this->operatorTypeSpecifyingExtensions, static function (\PHPStan\Type\OperatorTypeSpecifyingExtension $extension) use($operator, $leftType, $rightType) : bool {
            return $extension->isOperatorSupported($operator, $leftType, $rightType);
        });
    }
    /**
     * @return \PHPStan\Type\DynamicFunctionReturnTypeExtension[]
     */
    public function getDynamicFunctionReturnTypeExtensions() : array
    {
        return $this->dynamicFunctionReturnTypeExtensions;
    }
    /**
     * @param \PHPStan\Type\DynamicMethodReturnTypeExtension[][]|\PHPStan\Type\DynamicStaticMethodReturnTypeExtension[][] $extensions
     * @param string $className
     * @return mixed[]
     */
    private function getDynamicExtensionsForType(array $extensions, string $className) : array
    {
        $extensionsForClass = [];
        $class = $this->getClass($className);
        foreach (\array_merge([$className], $class->getParentClassesNames(), $class->getNativeReflection()->getInterfaceNames()) as $extensionClassName) {
            if (!isset($extensions[$extensionClassName])) {
                continue;
            }
            $extensionsForClass = \array_merge($extensionsForClass, $extensions[$extensionClassName]);
        }
        return $extensionsForClass;
    }
    public function getClass(string $className) : \PHPStan\Reflection\ClassReflection
    {
        if (!$this->hasClass($className)) {
            throw new \PHPStan\Broker\ClassNotFoundException($className);
        }
        if (isset(self::$anonymousClasses[$className])) {
            return self::$anonymousClasses[$className];
        }
        if (!isset($this->classReflections[$className])) {
            $reflectionClass = new \ReflectionClass($className);
            $filename = null;
            if ($reflectionClass->getFileName() !== \false) {
                $filename = $reflectionClass->getFileName();
            }
            $classReflection = $this->getClassFromReflection($reflectionClass, $reflectionClass->getName(), $reflectionClass->isAnonymous() ? $filename : null);
            $this->classReflections[$className] = $classReflection;
            if ($className !== $reflectionClass->getName()) {
                // class alias optimization
                $this->classReflections[$reflectionClass->getName()] = $classReflection;
            }
        }
        return $this->classReflections[$className];
    }
    public function getAnonymousClassReflection(\PhpParser\Node\Stmt\Class_ $classNode, \PHPStan\Analyser\Scope $scope) : \PHPStan\Reflection\ClassReflection
    {
        if (isset($classNode->namespacedName)) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        if (!$scope->isInTrait()) {
            $scopeFile = $scope->getFile();
        } else {
            $scopeFile = $scope->getTraitReflection()->getFileName();
            if ($scopeFile === \false) {
                $scopeFile = $scope->getFile();
            }
        }
        $filename = $this->relativePathHelper->getRelativePath($scopeFile);
        $className = $this->anonymousClassNameHelper->getAnonymousClassName($classNode, $scopeFile);
        $classNode->name = new \PhpParser\Node\Identifier($className);
        $classNode->setAttribute('anonymousClass', \true);
        if (isset(self::$anonymousClasses[$className])) {
            return self::$anonymousClasses[$className];
        }
        eval($this->printer->prettyPrint([$classNode]));
        self::$anonymousClasses[$className] = $this->getClassFromReflection(new \ReflectionClass('\\' . $className), \sprintf('class@anonymous/%s:%s', $filename, $classNode->getLine()), $scopeFile);
        $this->classReflections[$className] = self::$anonymousClasses[$className];
        return self::$anonymousClasses[$className];
    }
    public function getClassFromReflection(\ReflectionClass $reflectionClass, string $displayName, ?string $anonymousFilename) : \PHPStan\Reflection\ClassReflection
    {
        $className = $reflectionClass->getName();
        if (!isset($this->classReflections[$className])) {
            $classReflection = new \PHPStan\Reflection\ClassReflection($this, $this->fileTypeMapper, $this->propertiesClassReflectionExtensions, $this->methodsClassReflectionExtensions, $displayName, $reflectionClass, $anonymousFilename);
            $this->classReflections[$className] = $classReflection;
        }
        return $this->classReflections[$className];
    }
    public function hasClass(string $className) : bool
    {
        if (isset($this->hasClassCache[$className])) {
            return $this->hasClassCache[$className];
        }
        \spl_autoload_register($autoloader = function (string $autoloadedClassName) use($className) : void {
            if ($autoloadedClassName !== $className && !$this->isExistsCheckCall()) {
                throw new \PHPStan\Broker\ClassAutoloadingException($autoloadedClassName);
            }
        });
        try {
            return $this->hasClassCache[$className] = \class_exists($className) || \interface_exists($className) || \trait_exists($className);
        } catch (\PHPStan\Broker\ClassAutoloadingException $e) {
            throw $e;
        } catch (\Throwable $t) {
            throw new \PHPStan\Broker\ClassAutoloadingException($className, $t);
        } finally {
            \spl_autoload_unregister($autoloader);
        }
    }
    public function getFunction(\PhpParser\Node\Name $nameNode, ?\PHPStan\Analyser\Scope $scope) : \PHPStan\Reflection\FunctionReflection
    {
        $functionName = $this->resolveFunctionName($nameNode, $scope);
        if ($functionName === null) {
            throw new \PHPStan\Broker\FunctionNotFoundException((string) $nameNode);
        }
        $lowerCasedFunctionName = \strtolower($functionName);
        if (!isset($this->functionReflections[$lowerCasedFunctionName])) {
            if (isset(self::$functionMap[$lowerCasedFunctionName])) {
                return $this->functionReflections[$lowerCasedFunctionName] = self::$functionMap[$lowerCasedFunctionName];
            }
            if ($this->signatureMapProvider->hasFunctionSignature($lowerCasedFunctionName)) {
                $variantName = $lowerCasedFunctionName;
                $variants = [];
                $i = 0;
                while ($this->signatureMapProvider->hasFunctionSignature($variantName)) {
                    $functionSignature = $this->signatureMapProvider->getFunctionSignature($variantName, null);
                    $returnType = $functionSignature->getReturnType();
                    if ($lowerCasedFunctionName === 'pow') {
                        $returnType = \PHPStan\Type\TypeUtils::toBenevolentUnion($returnType);
                    }
                    $variants[] = new \PHPStan\Reflection\FunctionVariant(\array_map(static function (\PHPStan\Reflection\SignatureMap\ParameterSignature $parameterSignature) use($lowerCasedFunctionName) : NativeParameterReflection {
                        $type = $parameterSignature->getType();
                        if ($parameterSignature->getName() === 'args' && ($lowerCasedFunctionName === 'printf' || $lowerCasedFunctionName === 'sprintf')) {
                            $type = new \PHPStan\Type\UnionType([new \PHPStan\Type\StringAlwaysAcceptingObjectWithToStringType(), new \PHPStan\Type\IntegerType(), new \PHPStan\Type\FloatType(), new \PHPStan\Type\NullType(), new \PHPStan\Type\BooleanType()]);
                        }
                        return new \PHPStan\Reflection\Native\NativeParameterReflection($parameterSignature->getName(), $parameterSignature->isOptional(), $type, $parameterSignature->passedByReference(), $parameterSignature->isVariadic());
                    }, $functionSignature->getParameters()), $functionSignature->isVariadic(), $returnType);
                    $i++;
                    $variantName = \sprintf($lowerCasedFunctionName . '\'' . $i);
                }
                $functionReflection = new \PHPStan\Reflection\Native\NativeFunctionReflection($lowerCasedFunctionName, $variants, null);
                self::$functionMap[$lowerCasedFunctionName] = $functionReflection;
                $this->functionReflections[$lowerCasedFunctionName] = $functionReflection;
            } else {
                $this->functionReflections[$lowerCasedFunctionName] = $this->getCustomFunction($nameNode, $scope);
            }
        }
        return $this->functionReflections[$lowerCasedFunctionName];
    }
    public function hasFunction(\PhpParser\Node\Name $nameNode, ?\PHPStan\Analyser\Scope $scope) : bool
    {
        return $this->resolveFunctionName($nameNode, $scope) !== null;
    }
    public function hasCustomFunction(\PhpParser\Node\Name $nameNode, ?\PHPStan\Analyser\Scope $scope) : bool
    {
        $functionName = $this->resolveFunctionName($nameNode, $scope);
        if ($functionName === null) {
            return \false;
        }
        $lowerCasedFunctionName = \strtolower($functionName);
        return !$this->signatureMapProvider->hasFunctionSignature($lowerCasedFunctionName);
    }
    public function getCustomFunction(\PhpParser\Node\Name $nameNode, ?\PHPStan\Analyser\Scope $scope) : \PHPStan\Reflection\Php\PhpFunctionReflection
    {
        if (!$this->hasCustomFunction($nameNode, $scope)) {
            throw new \PHPStan\Broker\FunctionNotFoundException((string) $nameNode);
        }
        /** @var string $functionName */
        $functionName = $this->resolveFunctionName($nameNode, $scope);
        if (!\function_exists($functionName)) {
            throw new \PHPStan\Broker\FunctionNotFoundException($functionName);
        }
        $lowerCasedFunctionName = \strtolower($functionName);
        if (isset($this->customFunctionReflections[$lowerCasedFunctionName])) {
            return $this->customFunctionReflections[$lowerCasedFunctionName];
        }
        $reflectionFunction = new \ReflectionFunction($functionName);
        $phpDocParameterTags = [];
        $phpDocReturnTag = null;
        $phpDocThrowsTag = null;
        $deprecatedTag = null;
        $isDeprecated = \false;
        $isInternal = \false;
        $isFinal = \false;
        if ($reflectionFunction->getFileName() !== \false && $reflectionFunction->getDocComment() !== \false) {
            $fileName = $reflectionFunction->getFileName();
            $docComment = $reflectionFunction->getDocComment();
            $resolvedPhpDoc = $this->fileTypeMapper->getResolvedPhpDoc($fileName, null, null, $docComment);
            $phpDocParameterTags = $resolvedPhpDoc->getParamTags();
            $phpDocReturnTag = $resolvedPhpDoc->getReturnTag();
            $phpDocThrowsTag = $resolvedPhpDoc->getThrowsTag();
            $deprecatedTag = $resolvedPhpDoc->getDeprecatedTag();
            $isDeprecated = $resolvedPhpDoc->isDeprecated();
            $isInternal = $resolvedPhpDoc->isInternal();
            $isFinal = $resolvedPhpDoc->isFinal();
        }
        $functionReflection = $this->functionReflectionFactory->create($reflectionFunction, \array_map(static function (\PHPStan\PhpDoc\Tag\ParamTag $paramTag) : Type {
            return $paramTag->getType();
        }, $phpDocParameterTags), $phpDocReturnTag !== null ? $phpDocReturnTag->getType() : null, $phpDocThrowsTag !== null ? $phpDocThrowsTag->getType() : null, $deprecatedTag !== null ? $deprecatedTag->getMessage() : null, $isDeprecated, $isInternal, $isFinal, $reflectionFunction->getFileName());
        $this->customFunctionReflections[$lowerCasedFunctionName] = $functionReflection;
        return $functionReflection;
    }
    public function resolveFunctionName(\PhpParser\Node\Name $nameNode, ?\PHPStan\Analyser\Scope $scope) : ?string
    {
        return $this->resolveName($nameNode, function (string $name) : bool {
            $exists = \function_exists($name);
            if ($exists) {
                return \true;
            }
            $lowercased = \strtolower($name);
            return $this->signatureMapProvider->hasFunctionSignature($lowercased);
        }, $scope);
    }
    public function hasConstant(\PhpParser\Node\Name $nameNode, ?\PHPStan\Analyser\Scope $scope) : bool
    {
        return $this->resolveConstantName($nameNode, $scope) !== null;
    }
    public function resolveConstantName(\PhpParser\Node\Name $nameNode, ?\PHPStan\Analyser\Scope $scope) : ?string
    {
        return $this->resolveName($nameNode, function (string $name) use($scope) : bool {
            $isCompilerHaltOffset = $name === '__COMPILER_HALT_OFFSET__';
            if ($isCompilerHaltOffset && $scope !== null && $this->fileHasCompilerHaltStatementCalls($scope->getFile())) {
                return \true;
            }
            return \defined($name);
        }, $scope);
    }
    private function fileHasCompilerHaltStatementCalls(string $pathToFile) : bool
    {
        $nodes = $this->parser->parseFile($pathToFile);
        foreach ($nodes as $node) {
            if ($node instanceof \PhpParser\Node\Stmt\HaltCompiler) {
                return \true;
            }
        }
        return \false;
    }
    /**
     * @param Node\Name $nameNode
     * @param \Closure(string $name): bool $existsCallback
     * @param Scope|null $scope
     * @return string|null
     */
    private function resolveName(\PhpParser\Node\Name $nameNode, \Closure $existsCallback, ?\PHPStan\Analyser\Scope $scope) : ?string
    {
        $name = (string) $nameNode;
        if ($scope !== null && $scope->getNamespace() !== null && !$nameNode->isFullyQualified()) {
            $namespacedName = \sprintf('%s\\%s', $scope->getNamespace(), $name);
            if ($existsCallback($namespacedName)) {
                return $namespacedName;
            }
        }
        if ($existsCallback($name)) {
            return $name;
        }
        return null;
    }
    private function isExistsCheckCall() : bool
    {
        $debugBacktrace = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS);
        $existsCallTypes = ['class_exists' => \true, 'interface_exists' => \true, 'trait_exists' => \true];
        foreach ($debugBacktrace as $traceStep) {
            if (isset($traceStep['function']) && isset($existsCallTypes[$traceStep['function']]) && (!isset($traceStep['file']) || $traceStep['file'] !== __FILE__)) {
                return \true;
            }
        }
        return \false;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Broker;

class FunctionNotFoundException extends \PHPStan\AnalysedCodeException
{
    /** @var string */
    private $functionName;
    public function __construct(string $functionName)
    {
        parent::__construct(\sprintf('Function %s not found while trying to analyse it - autoloading is probably not configured properly.', $functionName));
        $this->functionName = $functionName;
    }
    public function getFunctionName() : string
    {
        return $this->functionName;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Broker;

class ClassNotFoundException extends \PHPStan\AnalysedCodeException
{
    /** @var string */
    private $className;
    public function __construct(string $functionName)
    {
        parent::__construct(\sprintf('Class %s was not found while trying to analyse it - autoloading is probably not configured properly.', $functionName));
        $this->className = $functionName;
    }
    public function getClassName() : string
    {
        return $this->className;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Broker;

use PHPStan\File\FileHelper;
use PHPStan\File\RelativePathHelper;
class AnonymousClassNameHelper
{
    /** @var FileHelper */
    private $fileHelper;
    /** @var RelativePathHelper */
    private $relativePathHelper;
    public function __construct(\PHPStan\File\FileHelper $fileHelper, \PHPStan\File\RelativePathHelper $relativePathHelper)
    {
        $this->fileHelper = $fileHelper;
        $this->relativePathHelper = $relativePathHelper;
    }
    public function getAnonymousClassName(\PhpParser\Node\Stmt\Class_ $classNode, string $filename) : string
    {
        if (isset($classNode->namespacedName)) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        $filename = $this->relativePathHelper->getRelativePath($this->fileHelper->normalizePath($filename));
        return \sprintf('AnonymousClass%s', \md5(\sprintf('%s:%s', $filename, $classNode->getLine())));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Cache;

class FileCacheStorage implements \PHPStan\Cache\CacheStorage
{
    /** @var string */
    private $directory;
    public function __construct(string $directory)
    {
        $this->directory = $directory;
        if (@\mkdir($this->directory) && !\is_dir($this->directory)) {
            throw new \InvalidArgumentException(\sprintf('Directory "%s" doesn\'t exist.', $this->directory));
        }
    }
    /**
     * @param string $key
     * @return mixed|null
     */
    public function load(string $key)
    {
        return (function (string $key) {
            $filePath = $this->getFilePath($key);
            return \is_file($filePath) ? require $this->getFilePath($key) : null;
        })($key);
    }
    /**
     * @param string $key
     * @param mixed $data
     * @return bool
     */
    public function save(string $key, $data) : bool
    {
        $writtenBytes = @\file_put_contents($this->getFilePath($key), \sprintf("<?php declare(strict_types = 1);\n\nreturn %s;", \var_export($data, \true)));
        return $writtenBytes !== \false;
    }
    private function getFilePath(string $key) : string
    {
        return \sprintf('%s/%s.php', $this->directory, \preg_replace('~[^-\\w]~', '_', $key));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Cache;

class MemoryCacheStorage implements \PHPStan\Cache\CacheStorage
{
    /** @var mixed[] */
    private $storage = [];
    /**
     * @param string $key
     * @return mixed|null
     */
    public function load(string $key)
    {
        return $this->storage[$key] ?? null;
    }
    /**
     * @param string $key
     * @param mixed $data
     * @return bool
     */
    public function save(string $key, $data) : bool
    {
        $this->storage[$key] = $data;
        return \true;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Cache;

class Cache
{
    /** @var \PHPStan\Cache\CacheStorage */
    private $storage;
    public function __construct(\PHPStan\Cache\CacheStorage $storage)
    {
        $this->storage = $storage;
    }
    /**
     * @param string $key
     * @return mixed|null
     */
    public function load(string $key)
    {
        return $this->storage->load($key);
    }
    /**
     * @param string $key
     * @param mixed $data
     * @return bool
     */
    public function save(string $key, $data) : bool
    {
        return $this->storage->save($key, $data);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Cache;

interface CacheStorage
{
    /**
     * @param string $key
     * @return mixed|null
     */
    public function load(string $key);
    /**
     * @param string $key
     * @param mixed $data
     * @return bool
     */
    public function save(string $key, $data) : bool;
}
<?php

declare (strict_types=1);
namespace PHPStan\File;

class SimpleRelativePathHelper implements \PHPStan\File\RelativePathHelper
{
    /** @var string */
    private $currentWorkingDirectory;
    public function __construct(string $currentWorkingDirectory)
    {
        $this->currentWorkingDirectory = $currentWorkingDirectory;
    }
    public function getRelativePath(string $filename) : string
    {
        if ($this->currentWorkingDirectory !== '' && \strpos($filename, $this->currentWorkingDirectory) === 0) {
            return \substr($filename, \strlen($this->currentWorkingDirectory) + 1);
        }
        return $filename;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\File;

use _HumbugBoxb94336daae36\Symfony\Component\Finder\Finder;
class FileFinder
{
    /** @var FileExcluder */
    private $fileExcluder;
    /** @var FileHelper */
    private $fileHelper;
    /** @var string[] */
    private $fileExtensions;
    /**
     * @param FileExcluder $fileExcluder
     * @param FileHelper $fileHelper
     * @param string[] $fileExtensions
     */
    public function __construct(\PHPStan\File\FileExcluder $fileExcluder, \PHPStan\File\FileHelper $fileHelper, array $fileExtensions)
    {
        $this->fileExcluder = $fileExcluder;
        $this->fileHelper = $fileHelper;
        $this->fileExtensions = $fileExtensions;
    }
    /**
     * @param string[] $paths
     * @return FileFinderResult
     */
    public function findFiles(array $paths) : \PHPStan\File\FileFinderResult
    {
        $onlyFiles = \true;
        $files = [];
        foreach ($paths as $path) {
            if (!\file_exists($path)) {
                throw new \PHPStan\File\PathNotFoundException($path);
            } elseif (\is_file($path)) {
                $files[] = $this->fileHelper->normalizePath($path);
            } else {
                $finder = new \_HumbugBoxb94336daae36\Symfony\Component\Finder\Finder();
                $finder->followLinks();
                foreach ($finder->files()->name('*.{' . \implode(',', $this->fileExtensions) . '}')->in($path) as $fileInfo) {
                    $files[] = $this->fileHelper->normalizePath($fileInfo->getPathname());
                    $onlyFiles = \false;
                }
            }
        }
        $files = \array_values(\array_filter($files, function (string $file) : bool {
            return !$this->fileExcluder->isExcludedFromAnalysing($file);
        }));
        return new \PHPStan\File\FileFinderResult($files, $onlyFiles);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\File;

class FileExcluder
{
    /**
     * Directories to exclude from analysing
     *
     * @var string[]
     */
    private $analyseExcludes;
    /**
     * @param FileHelper $fileHelper
     * @param string[] $analyseExcludes
     */
    public function __construct(\PHPStan\File\FileHelper $fileHelper, array $analyseExcludes)
    {
        $this->analyseExcludes = \array_map(function (string $exclude) use($fileHelper) : string {
            $normalized = $fileHelper->normalizePath($exclude);
            if ($this->isFnmatchPattern($normalized)) {
                return $normalized;
            }
            return $fileHelper->absolutizePath($normalized);
        }, $analyseExcludes);
    }
    public function isExcludedFromAnalysing(string $file) : bool
    {
        foreach ($this->analyseExcludes as $exclude) {
            if (\strpos($file, $exclude) === 0) {
                return \true;
            }
            $isWindows = \DIRECTORY_SEPARATOR === '\\';
            if ($isWindows) {
                $fnmatchFlags = \FNM_NOESCAPE | \FNM_CASEFOLD;
            } else {
                $fnmatchFlags = 0;
            }
            if ($this->isFnmatchPattern($exclude) && \fnmatch($exclude, $file, $fnmatchFlags)) {
                return \true;
            }
        }
        return \false;
    }
    private function isFnmatchPattern(string $path) : bool
    {
        return \preg_match('~[*?[\\]]~', $path) > 0;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\File;

use _HumbugBoxb94336daae36\Nette\Utils\Strings;
class FileHelper
{
    /** @var string */
    private $workingDirectory;
    public function __construct(string $workingDirectory)
    {
        $this->workingDirectory = $this->normalizePath($workingDirectory);
    }
    public function getWorkingDirectory() : string
    {
        return $this->workingDirectory;
    }
    public function absolutizePath(string $path) : string
    {
        if (\DIRECTORY_SEPARATOR === '/') {
            if (\substr($path, 0, 1) === '/') {
                return $path;
            }
        } else {
            if (\substr($path, 1, 1) === ':') {
                return $path;
            }
        }
        return \rtrim($this->getWorkingDirectory(), '/\\') . \DIRECTORY_SEPARATOR . \ltrim($path, '/\\');
    }
    public function normalizePath(string $originalPath) : string
    {
        $matches = \_HumbugBoxb94336daae36\Nette\Utils\Strings::match($originalPath, '~^([a-z]+)\\:\\/\\/(.+)~');
        if ($matches !== null) {
            [, $scheme, $path] = $matches;
        } else {
            $scheme = null;
            $path = $originalPath;
        }
        $path = \str_replace('\\', '/', $path);
        $path = \_HumbugBoxb94336daae36\Nette\Utils\Strings::replace($path, '~/{2,}~', '/');
        $pathRoot = \strpos($path, '/') === 0 ? \DIRECTORY_SEPARATOR : '';
        $pathParts = \explode('/', \trim($path, '/'));
        $normalizedPathParts = [];
        foreach ($pathParts as $pathPart) {
            if ($pathPart === '.') {
                continue;
            }
            if ($pathPart === '..') {
                /** @var string $removedPart */
                $removedPart = \array_pop($normalizedPathParts);
                if ($scheme === 'phar' && \substr($removedPart, -5) === '.phar') {
                    $scheme = null;
                }
            } else {
                $normalizedPathParts[] = $pathPart;
            }
        }
        return ($scheme !== null ? $scheme . '://' : '') . $pathRoot . \implode(\DIRECTORY_SEPARATOR, $normalizedPathParts);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\File;

class FileFinderResult
{
    /** @var string[] */
    private $files;
    /** @var bool */
    private $onlyFiles;
    /**
     * @param string[] $files
     * @param bool $onlyFiles
     */
    public function __construct(array $files, bool $onlyFiles)
    {
        $this->files = $files;
        $this->onlyFiles = $onlyFiles;
    }
    /**
     * @return string[]
     */
    public function getFiles() : array
    {
        return $this->files;
    }
    public function isOnlyFiles() : bool
    {
        return $this->onlyFiles;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\File;

class FuzzyRelativePathHelper implements \PHPStan\File\RelativePathHelper
{
    /** @var string */
    private $directorySeparator;
    /** @var string|null */
    private $pathToTrim;
    /**
     * @param string $currentWorkingDirectory
     * @param string $directorySeparator
     * @param string[] $analysedPaths
     */
    public function __construct(string $currentWorkingDirectory, string $directorySeparator, array $analysedPaths)
    {
        $this->directorySeparator = $directorySeparator;
        $pathBeginning = null;
        $pathToTrimArray = null;
        $trimBeginning = static function (string $path) : array {
            if (\substr($path, 0, 1) === '/') {
                return ['/', \substr($path, 1)];
            } elseif (\substr($path, 1, 1) === ':') {
                return [\substr($path, 0, 3), \substr($path, 3)];
            }
            return ['', $path];
        };
        if (!\in_array($currentWorkingDirectory, ['', '/'], \true) && !(\strlen($currentWorkingDirectory) === 3 && \substr($currentWorkingDirectory, 1, 1) === ':')) {
            [$pathBeginning, $currentWorkingDirectory] = $trimBeginning($currentWorkingDirectory);
            /** @var string[] $pathToTrimArray */
            $pathToTrimArray = \explode($directorySeparator, $currentWorkingDirectory);
        }
        foreach ($analysedPaths as $pathNumber => $path) {
            [$tempPathBeginning, $path] = $trimBeginning($path);
            /** @var string[] $pathArray */
            $pathArray = \explode($directorySeparator, $path);
            $pathTempParts = [];
            foreach ($pathArray as $i => $pathPart) {
                if (\_HumbugBoxb94336daae36\Nette\Utils\Strings::endsWith($pathPart, '.php')) {
                    continue;
                }
                if (!isset($pathToTrimArray[$i])) {
                    if ($pathNumber !== 0) {
                        $pathToTrimArray = $pathTempParts;
                        continue 2;
                    }
                } elseif ($pathToTrimArray[$i] !== $pathPart) {
                    $pathToTrimArray = $pathTempParts;
                    continue 2;
                }
                $pathTempParts[] = $pathPart;
            }
            $pathBeginning = $tempPathBeginning;
            $pathToTrimArray = $pathTempParts;
        }
        if ($pathToTrimArray === null || \count($pathToTrimArray) === 0) {
            return;
        }
        $pathToTrim = $pathBeginning . \implode($directorySeparator, $pathToTrimArray);
        $realPathToTrim = \realpath($pathToTrim);
        if ($realPathToTrim !== \false) {
            $pathToTrim = $realPathToTrim;
        }
        $this->pathToTrim = $pathToTrim;
    }
    public function getRelativePath(string $filename) : string
    {
        if ($this->pathToTrim !== null && \strpos($filename, $this->pathToTrim) === 0) {
            return \ltrim(\substr($filename, \strlen($this->pathToTrim)), $this->directorySeparator);
        }
        return $filename;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\File;

interface RelativePathHelper
{
    public function getRelativePath(string $filename) : string;
}
<?php

declare (strict_types=1);
namespace PHPStan\File;

class PathNotFoundException extends \Exception
{
    /** @var string */
    private $path;
    public function __construct(string $path)
    {
        parent::__construct(\sprintf('Path %s does not exist', $path));
        $this->path = $path;
    }
    public function getPath() : string
    {
        return $this->path;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Internal;

use PhpParser\Node\Expr\MethodCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\DynamicMethodReturnTypeExtension;
use PHPStan\Type\Type;
use PHPStan\Type\UnionType;
class UnionTypeGetInternalDynamicReturnTypeExtension implements \PHPStan\Type\DynamicMethodReturnTypeExtension
{
    public function getClass() : string
    {
        return \PHPStan\Type\UnionType::class;
    }
    public function isMethodSupported(\PHPStan\Reflection\MethodReflection $methodReflection) : bool
    {
        return $methodReflection->getName() === 'getInternal';
    }
    public function getTypeFromMethodCall(\PHPStan\Reflection\MethodReflection $methodReflection, \PhpParser\Node\Expr\MethodCall $methodCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        if (\count($methodCall->args) < 2) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
        }
        $getterClosureType = $scope->getType($methodCall->args[1]->value);
        return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($getterClosureType->getCallableParametersAcceptors($scope))->getReturnType();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Internal;

use PhpParser\Node\Expr\MethodCall;
use PHPStan\Analyser\Scope;
use PHPStan\DependencyInjection\Container;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\ObjectType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
class ContainerDynamicReturnTypeExtension implements \PHPStan\Type\DynamicMethodReturnTypeExtension
{
    public function getClass() : string
    {
        return \PHPStan\DependencyInjection\Container::class;
    }
    public function isMethodSupported(\PHPStan\Reflection\MethodReflection $methodReflection) : bool
    {
        return \in_array($methodReflection->getName(), ['getByType'], \true);
    }
    public function getTypeFromMethodCall(\PHPStan\Reflection\MethodReflection $methodReflection, \PhpParser\Node\Expr\MethodCall $methodCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        if (\count($methodCall->args) === 0) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
        }
        $argType = $scope->getType($methodCall->args[0]->value);
        if (!$argType instanceof \PHPStan\Type\Constant\ConstantStringType) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
        }
        $type = new \PHPStan\Type\ObjectType($argType->getValue());
        if ($methodReflection->getName() === 'getByType' && \count($methodCall->args) >= 2) {
            $argType = $scope->getType($methodCall->args[1]->value);
            if ($argType instanceof \PHPStan\Type\Constant\ConstantBooleanType && $argType->getValue()) {
                $type = \PHPStan\Type\TypeCombinator::addNull($type);
            }
        }
        return $type;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Internal;

use PhpParser\Node\Expr\MethodCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Broker\Broker;
use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\MethodTypeSpecifyingExtension;
use PHPStan\Type\TypeCombinator;
class ScopeIsInClassTypeSpecifyingExtension implements \PHPStan\Type\MethodTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var string */
    private $isInMethodName;
    /** @var string */
    private $removeNullMethodName;
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    public function __construct(string $isInMethodName, string $removeNullMethodName, \PHPStan\Broker\Broker $broker)
    {
        $this->isInMethodName = $isInMethodName;
        $this->removeNullMethodName = $removeNullMethodName;
        $this->broker = $broker;
    }
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
    public function getClass() : string
    {
        return \PHPStan\Reflection\ClassMemberAccessAnswerer::class;
    }
    public function isMethodSupported(\PHPStan\Reflection\MethodReflection $methodReflection, \PhpParser\Node\Expr\MethodCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return $methodReflection->getName() === $this->isInMethodName && !$context->null();
    }
    public function specifyTypes(\PHPStan\Reflection\MethodReflection $methodReflection, \PhpParser\Node\Expr\MethodCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        $scopeClass = $this->broker->getClass(\PHPStan\Analyser\Scope::class);
        $methodVariants = $scopeClass->getMethod($this->removeNullMethodName, $scope)->getVariants();
        return $this->typeSpecifier->create(new \PhpParser\Node\Expr\MethodCall($node->var, $this->removeNullMethodName), \PHPStan\Type\TypeCombinator::removeNull(\PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($methodVariants)->getReturnType()), $context);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Dependency;

use PHPStan\Analyser\NodeScopeResolver;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\ScopeContext;
use PHPStan\Analyser\ScopeFactory;
use PHPStan\File\FileFinder;
use PHPStan\File\FileHelper;
use PHPStan\Parser\Parser;
class DependencyDumper
{
    /** @var DependencyResolver */
    private $dependencyResolver;
    /** @var NodeScopeResolver */
    private $nodeScopeResolver;
    /** @var FileHelper */
    private $fileHelper;
    /** @var Parser */
    private $parser;
    /** @var ScopeFactory */
    private $scopeFactory;
    /** @var FileFinder */
    private $fileFinder;
    public function __construct(\PHPStan\Dependency\DependencyResolver $dependencyResolver, \PHPStan\Analyser\NodeScopeResolver $nodeScopeResolver, \PHPStan\File\FileHelper $fileHelper, \PHPStan\Parser\Parser $parser, \PHPStan\Analyser\ScopeFactory $scopeFactory, \PHPStan\File\FileFinder $fileFinder)
    {
        $this->dependencyResolver = $dependencyResolver;
        $this->nodeScopeResolver = $nodeScopeResolver;
        $this->fileHelper = $fileHelper;
        $this->parser = $parser;
        $this->scopeFactory = $scopeFactory;
        $this->fileFinder = $fileFinder;
    }
    /**
     * @param string[] $files
     * @param callable(int $count): void $countCallback
     * @param callable(): void $progressCallback
     * @param string[]|null $analysedPaths
     * @return string[][]
     */
    public function dumpDependencies(array $files, callable $countCallback, callable $progressCallback, ?array $analysedPaths) : array
    {
        $analysedFiles = $files;
        if ($analysedPaths !== null) {
            $analysedFiles = $this->fileFinder->findFiles($analysedPaths)->getFiles();
        }
        $this->nodeScopeResolver->setAnalysedFiles($analysedFiles);
        $analysedFiles = \array_fill_keys($analysedFiles, \true);
        $dependencies = [];
        $countCallback(\count($files));
        foreach ($files as $file) {
            try {
                $parserNodes = $this->parser->parseFile($file);
            } catch (\PHPStan\Parser\ParserErrorsException $e) {
                continue;
            }
            $fileDependencies = [];
            try {
                $this->nodeScopeResolver->processNodes($parserNodes, $this->scopeFactory->create(\PHPStan\Analyser\ScopeContext::create($file)), function (\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) use($analysedFiles, &$fileDependencies) : void {
                    $fileDependencies = \array_merge($fileDependencies, $this->resolveDependencies($node, $scope, $analysedFiles));
                });
            } catch (\PHPStan\AnalysedCodeException $e) {
                // pass
            }
            foreach (\array_unique($fileDependencies) as $fileDependency) {
                $relativeDependencyFile = $fileDependency;
                $dependencies[$relativeDependencyFile][] = $file;
            }
            $progressCallback();
        }
        return $dependencies;
    }
    /**
     * @param \PhpParser\Node $node
     * @param Scope $scope
     * @param array<string, true> $analysedFiles
     * @return string[]
     */
    private function resolveDependencies(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope, array $analysedFiles) : array
    {
        $dependencies = [];
        foreach ($this->dependencyResolver->resolveDependencies($node, $scope) as $dependencyReflection) {
            $dependencyFile = $dependencyReflection->getFileName();
            if ($dependencyFile === \false) {
                continue;
            }
            $dependencyFile = $this->fileHelper->normalizePath($dependencyFile);
            if ($scope->getFile() === $dependencyFile) {
                continue;
            }
            if (!isset($analysedFiles[$dependencyFile])) {
                continue;
            }
            $dependencies[$dependencyFile] = $dependencyFile;
        }
        return \array_values($dependencies);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Dependency;

use PhpParser\Node\Expr\Array_;
use PhpParser\Node\Expr\ArrayDimFetch;
use PhpParser\Node\Expr\Closure;
use PhpParser\Node\Name;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Foreach_;
use PhpParser\Node\Stmt\Function_;
use PHPStan\Analyser\Scope;
use PHPStan\Broker\Broker;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Reflection\ParametersAcceptorWithPhpDocs;
use PHPStan\Reflection\Php\PhpMethodReflection;
use PHPStan\Reflection\ReflectionWithFilename;
use PHPStan\Type\ClosureType;
class DependencyResolver
{
    /** @var Broker */
    private $broker;
    public function __construct(\PHPStan\Broker\Broker $broker)
    {
        $this->broker = $broker;
    }
    /**
     * @param \PhpParser\Node $node
     * @param Scope $scope
     * @return ReflectionWithFilename[]
     */
    public function resolveDependencies(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $dependenciesReflections = [];
        if ($node instanceof \PhpParser\Node\Stmt\Class_) {
            if ($node->extends !== null) {
                $this->addClassToDependencies($node->extends->toString(), $dependenciesReflections);
            }
            foreach ($node->implements as $className) {
                $this->addClassToDependencies($className->toString(), $dependenciesReflections);
            }
        } elseif ($node instanceof \PhpParser\Node\Stmt\Interface_) {
            if ($node->extends !== null) {
                foreach ($node->extends as $className) {
                    $this->addClassToDependencies($className->toString(), $dependenciesReflections);
                }
            }
        } elseif ($node instanceof \PhpParser\Node\Stmt\ClassMethod) {
            if (!$scope->isInClass()) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            $nativeMethod = $scope->getClassReflection()->getNativeMethod($node->name->name);
            if ($nativeMethod instanceof \PHPStan\Reflection\Php\PhpMethodReflection) {
                /** @var \PHPStan\Reflection\ParametersAcceptorWithPhpDocs $parametersAcceptor */
                $parametersAcceptor = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($nativeMethod->getVariants());
                $this->extractFromParametersAcceptor($parametersAcceptor, $dependenciesReflections);
            }
        } elseif ($node instanceof \PhpParser\Node\Stmt\Function_) {
            $functionName = $node->name->name;
            if (isset($node->namespacedName)) {
                $functionName = (string) $node->namespacedName;
            }
            $functionNameName = new \PhpParser\Node\Name($functionName);
            if ($this->broker->hasCustomFunction($functionNameName, null)) {
                $functionReflection = $this->broker->getCustomFunction($functionNameName, null);
                /** @var \PHPStan\Reflection\ParametersAcceptorWithPhpDocs $parametersAcceptor */
                $parametersAcceptor = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants());
                $this->extractFromParametersAcceptor($parametersAcceptor, $dependenciesReflections);
            }
        } elseif ($node instanceof \PhpParser\Node\Expr\Closure) {
            /** @var ClosureType $closureType */
            $closureType = $scope->getType($node);
            foreach ($closureType->getParameters() as $parameter) {
                $referencedClasses = $parameter->getType()->getReferencedClasses();
                foreach ($referencedClasses as $referencedClass) {
                    $this->addClassToDependencies($referencedClass, $dependenciesReflections);
                }
            }
            $returnTypeReferencedClasses = $closureType->getReturnType()->getReferencedClasses();
            foreach ($returnTypeReferencedClasses as $referencedClass) {
                $this->addClassToDependencies($referencedClass, $dependenciesReflections);
            }
        } elseif ($node instanceof \PhpParser\Node\Expr\FuncCall) {
            $functionName = $node->name;
            if ($functionName instanceof \PhpParser\Node\Name) {
                try {
                    $dependenciesReflections[] = $this->getFunctionReflection($functionName, $scope);
                } catch (\PHPStan\Broker\FunctionNotFoundException $e) {
                    // pass
                }
            } else {
                $variants = $scope->getType($functionName)->getCallableParametersAcceptors($scope);
                foreach ($variants as $variant) {
                    $referencedClasses = $variant->getReturnType()->getReferencedClasses();
                    foreach ($referencedClasses as $referencedClass) {
                        $this->addClassToDependencies($referencedClass, $dependenciesReflections);
                    }
                }
            }
            $returnType = $scope->getType($node);
            foreach ($returnType->getReferencedClasses() as $referencedClass) {
                $this->addClassToDependencies($referencedClass, $dependenciesReflections);
            }
        } elseif ($node instanceof \PhpParser\Node\Expr\MethodCall || $node instanceof \PhpParser\Node\Expr\PropertyFetch) {
            $classNames = $scope->getType($node->var)->getReferencedClasses();
            foreach ($classNames as $className) {
                $this->addClassToDependencies($className, $dependenciesReflections);
            }
            $returnType = $scope->getType($node);
            foreach ($returnType->getReferencedClasses() as $referencedClass) {
                $this->addClassToDependencies($referencedClass, $dependenciesReflections);
            }
        } elseif ($node instanceof \PhpParser\Node\Expr\StaticCall || $node instanceof \PhpParser\Node\Expr\ClassConstFetch || $node instanceof \PhpParser\Node\Expr\StaticPropertyFetch) {
            if ($node->class instanceof \PhpParser\Node\Name) {
                $this->addClassToDependencies($scope->resolveName($node->class), $dependenciesReflections);
            } else {
                foreach ($scope->getType($node->class)->getReferencedClasses() as $referencedClass) {
                    $this->addClassToDependencies($referencedClass, $dependenciesReflections);
                }
            }
            $returnType = $scope->getType($node);
            foreach ($returnType->getReferencedClasses() as $referencedClass) {
                $this->addClassToDependencies($referencedClass, $dependenciesReflections);
            }
        } elseif ($node instanceof \PhpParser\Node\Expr\New_ && $node->class instanceof \PhpParser\Node\Name) {
            $this->addClassToDependencies($scope->resolveName($node->class), $dependenciesReflections);
        } elseif ($node instanceof \PhpParser\Node\Stmt\TraitUse) {
            foreach ($node->traits as $traitName) {
                $this->addClassToDependencies($traitName->toString(), $dependenciesReflections);
            }
        } elseif ($node instanceof \PhpParser\Node\Expr\Instanceof_) {
            if ($node->class instanceof \PhpParser\Node\Name) {
                $this->addClassToDependencies($scope->resolveName($node->class), $dependenciesReflections);
            }
        } elseif ($node instanceof \PhpParser\Node\Stmt\Catch_) {
            foreach ($node->types as $type) {
                $this->addClassToDependencies($scope->resolveName($type), $dependenciesReflections);
            }
        } elseif ($node instanceof \PhpParser\Node\Expr\ArrayDimFetch && $node->dim !== null) {
            $varType = $scope->getType($node->var);
            $dimType = $scope->getType($node->dim);
            foreach ($varType->getOffsetValueType($dimType)->getReferencedClasses() as $referencedClass) {
                $this->addClassToDependencies($referencedClass, $dependenciesReflections);
            }
        } elseif ($node instanceof \PhpParser\Node\Stmt\Foreach_) {
            $exprType = $scope->getType($node->expr);
            if ($node->keyVar !== null) {
                foreach ($exprType->getIterableKeyType()->getReferencedClasses() as $referencedClass) {
                    $this->addClassToDependencies($referencedClass, $dependenciesReflections);
                }
            }
            foreach ($exprType->getIterableValueType()->getReferencedClasses() as $referencedClass) {
                $this->addClassToDependencies($referencedClass, $dependenciesReflections);
            }
        } elseif ($node instanceof \PhpParser\Node\Expr\Array_) {
            $arrayType = $scope->getType($node);
            if (!$arrayType->isCallable()->no()) {
                foreach ($arrayType->getCallableParametersAcceptors($scope) as $variant) {
                    $referencedClasses = $variant->getReturnType()->getReferencedClasses();
                    foreach ($referencedClasses as $referencedClass) {
                        $this->addClassToDependencies($referencedClass, $dependenciesReflections);
                    }
                }
            }
        }
        return $dependenciesReflections;
    }
    /**
     * @param string $className
     * @param ReflectionWithFilename[] $dependenciesReflections
     */
    private function addClassToDependencies(string $className, array &$dependenciesReflections) : void
    {
        try {
            $classReflection = $this->broker->getClass($className);
        } catch (\PHPStan\Broker\ClassNotFoundException $e) {
            return;
        }
        do {
            $dependenciesReflections[] = $classReflection;
            foreach ($classReflection->getInterfaces() as $interface) {
                $dependenciesReflections[] = $interface;
            }
            foreach ($classReflection->getTraits() as $trait) {
                $dependenciesReflections[] = $trait;
            }
            $classReflection = $classReflection->getParentClass();
        } while ($classReflection !== \false);
    }
    private function getFunctionReflection(\PhpParser\Node\Name $nameNode, ?\PHPStan\Analyser\Scope $scope) : \PHPStan\Reflection\ReflectionWithFilename
    {
        $reflection = $this->broker->getFunction($nameNode, $scope);
        if (!$reflection instanceof \PHPStan\Reflection\ReflectionWithFilename) {
            throw new \PHPStan\Broker\FunctionNotFoundException((string) $nameNode);
        }
        return $reflection;
    }
    /**
     * @param ParametersAcceptorWithPhpDocs $parametersAcceptor
     * @param ReflectionWithFilename[] $dependenciesReflections
     */
    private function extractFromParametersAcceptor(\PHPStan\Reflection\ParametersAcceptorWithPhpDocs $parametersAcceptor, array &$dependenciesReflections) : void
    {
        foreach ($parametersAcceptor->getParameters() as $parameter) {
            $referencedClasses = \array_merge($parameter->getNativeType()->getReferencedClasses(), $parameter->getPhpDocType()->getReferencedClasses());
            foreach ($referencedClasses as $referencedClass) {
                $this->addClassToDependencies($referencedClass, $dependenciesReflections);
            }
        }
        $returnTypeReferencedClasses = \array_merge($parametersAcceptor->getNativeReturnType()->getReferencedClasses(), $parametersAcceptor->getPhpDocReturnType()->getReferencedClasses());
        foreach ($returnTypeReferencedClasses as $referencedClass) {
            $this->addClassToDependencies($referencedClass, $dependenciesReflections);
        }
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Parser;

interface Parser
{
    /**
     * @param string $file path to a file to parse
     * @return \PhpParser\Node[]
     */
    public function parseFile(string $file) : array;
    /**
     * @param string $sourceCode
     * @return \PhpParser\Node[]
     */
    public function parseString(string $sourceCode) : array;
}
<?php

declare (strict_types=1);
namespace PHPStan\Parser;

use PhpParser\ErrorHandler\Collecting;
use PhpParser\NodeTraverser;
class DirectParser implements \PHPStan\Parser\Parser
{
    /** @var \PhpParser\Parser */
    private $parser;
    /** @var \PhpParser\NodeTraverser */
    private $traverser;
    public function __construct(\PhpParser\Parser $parser, \PhpParser\NodeTraverser $traverser)
    {
        $this->parser = $parser;
        $this->traverser = $traverser;
    }
    /**
     * @param string $file path to a file to parse
     * @return \PhpParser\Node[]
     */
    public function parseFile(string $file) : array
    {
        $contents = \file_get_contents($file);
        if ($contents === \false) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $this->parseString($contents);
    }
    /**
     * @param string $sourceCode
     * @return \PhpParser\Node[]
     */
    public function parseString(string $sourceCode) : array
    {
        $errorHandler = new \PhpParser\ErrorHandler\Collecting();
        $nodes = $this->parser->parse($sourceCode, $errorHandler);
        if ($errorHandler->hasErrors()) {
            throw new \PHPStan\Parser\ParserErrorsException($errorHandler->getErrors());
        }
        if ($nodes === null) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $this->traverser->traverse($nodes);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Parser;

use PhpParser\Node\Expr\FuncCall;
use PhpParser\Node\Name;
class FunctionCallStatementFinder
{
    /**
     * @param string[] $functionNames
     * @param mixed $statements
     * @return \PhpParser\Node|null
     */
    public function findFunctionCallInStatements(array $functionNames, $statements) : ?\PhpParser\Node
    {
        foreach ($statements as $statement) {
            if (\is_array($statement)) {
                $result = $this->findFunctionCallInStatements($functionNames, $statement);
                if ($result !== null) {
                    return $result;
                }
            }
            if (!$statement instanceof \PhpParser\Node) {
                continue;
            }
            if ($statement instanceof \PhpParser\Node\Expr\FuncCall && $statement->name instanceof \PhpParser\Node\Name) {
                if (\in_array((string) $statement->name, $functionNames, \true)) {
                    return $statement;
                }
            }
            $result = $this->findFunctionCallInStatements($functionNames, $statement);
            if ($result !== null) {
                return $result;
            }
        }
        return null;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Parser;

use PhpParser\Error;
class ParserErrorsException extends \Exception
{
    /** @var \PhpParser\Error[] */
    private $errors;
    /**
     * @param \PhpParser\Error[] $errors
     */
    public function __construct(array $errors)
    {
        parent::__construct(\implode(', ', \array_map(static function (\PhpParser\Error $error) : string {
            return $error->getMessage();
        }, $errors)));
        $this->errors = $errors;
    }
    /**
     * @return \PhpParser\Error[]
     */
    public function getErrors() : array
    {
        return $this->errors;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Parser;

class CachedParser implements \PHPStan\Parser\Parser
{
    /** @var \PHPStan\Parser\Parser */
    private $originalParser;
    /** @var mixed[] */
    private $cachedNodesByFile = [];
    /** @var int */
    private $cachedNodesByFileCount = 0;
    /** @var int */
    private $cachedNodesByFileCountMax;
    /** @var mixed[] */
    private $cachedNodesByString = [];
    /** @var int */
    private $cachedNodesByStringCount = 0;
    /** @var int */
    private $cachedNodesByStringCountMax;
    public function __construct(\PHPStan\Parser\Parser $originalParser, int $cachedNodesByFileCountMax, int $cachedNodesByStringCountMax)
    {
        $this->originalParser = $originalParser;
        $this->cachedNodesByFileCountMax = $cachedNodesByFileCountMax;
        $this->cachedNodesByStringCountMax = $cachedNodesByStringCountMax;
    }
    /**
     * @param string $file path to a file to parse
     * @return \PhpParser\Node[]
     */
    public function parseFile(string $file) : array
    {
        if ($this->cachedNodesByFileCountMax !== 0 && $this->cachedNodesByFileCount >= $this->cachedNodesByFileCountMax) {
            $this->cachedNodesByFile = \array_slice($this->cachedNodesByFile, 1, null, \true);
            --$this->cachedNodesByFileCount;
        }
        if (!isset($this->cachedNodesByFile[$file])) {
            $this->cachedNodesByFile[$file] = $this->originalParser->parseFile($file);
            $this->cachedNodesByFileCount++;
        }
        return $this->cachedNodesByFile[$file];
    }
    /**
     * @param string $sourceCode
     * @return \PhpParser\Node[]
     */
    public function parseString(string $sourceCode) : array
    {
        if ($this->cachedNodesByStringCountMax !== 0 && $this->cachedNodesByStringCount >= $this->cachedNodesByStringCountMax) {
            $this->cachedNodesByString = \array_slice($this->cachedNodesByString, 1, null, \true);
            --$this->cachedNodesByStringCount;
        }
        if (!isset($this->cachedNodesByString[$sourceCode])) {
            $this->cachedNodesByString[$sourceCode] = $this->originalParser->parseString($sourceCode);
            $this->cachedNodesByStringCount++;
        }
        return $this->cachedNodesByString[$sourceCode];
    }
    public function getCachedNodesByFileCount() : int
    {
        return $this->cachedNodesByFileCount;
    }
    public function getCachedNodesByFileCountMax() : int
    {
        return $this->cachedNodesByFileCountMax;
    }
    public function getCachedNodesByStringCount() : int
    {
        return $this->cachedNodesByStringCount;
    }
    public function getCachedNodesByStingCountMax() : int
    {
        return $this->cachedNodesByStringCountMax;
    }
    public function getCachedNodesByFile() : array
    {
        return $this->cachedNodesByFile;
    }
    public function getCachedNodesByString() : array
    {
        return $this->cachedNodesByString;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Testing;

use PHPStan\File\FileHelper;
abstract class LevelsTestCase extends \PHPUnit\Framework\TestCase
{
    public abstract function dataTopics() : array;
    public abstract function getDataPath() : string;
    public abstract function getPhpStanExecutablePath() : string;
    public abstract function getPhpStanConfigPath() : ?string;
    protected function getResultSuffix() : string
    {
        return '';
    }
    /**
     * @dataProvider dataTopics
     * @param string $topic
     */
    public function testLevels(string $topic) : void
    {
        $file = \sprintf('%s/%s.php', $this->getDataPath(), $topic);
        $command = \escapeshellcmd($this->getPhpStanExecutablePath());
        $configPath = $this->getPhpStanConfigPath();
        $fileHelper = new \PHPStan\File\FileHelper(__DIR__ . '/../..');
        $previousMessages = [];
        $exceptions = [];
        foreach (\range(0, 7) as $level) {
            unset($outputLines);
            \exec(\sprintf('php %s analyse --no-progress --error-format=prettyJson --level=%d %s --autoload-file %s %s', $command, $level, $configPath !== null ? '--configuration ' . \escapeshellarg($configPath) : '', \escapeshellarg($file), \escapeshellarg($file)), $outputLines);
            $output = \implode("\n", $outputLines);
            try {
                $actualJson = \_HumbugBoxb94336daae36\Nette\Utils\Json::decode($output, \_HumbugBoxb94336daae36\Nette\Utils\Json::FORCE_ARRAY);
            } catch (\_HumbugBoxb94336daae36\Nette\Utils\JsonException $e) {
                throw new \_HumbugBoxb94336daae36\Nette\Utils\JsonException(\sprintf('Cannot decode: %s', $output));
            }
            if (\count($actualJson['files']) > 0) {
                $messagesBeforeDiffing = $actualJson['files'][$fileHelper->normalizePath($file)]['messages'];
            } else {
                $messagesBeforeDiffing = [];
            }
            $messages = [];
            foreach ($messagesBeforeDiffing as $message) {
                foreach ($previousMessages as $lastMessage) {
                    if ($message['message'] === $lastMessage['message'] && $message['line'] === $lastMessage['line']) {
                        continue 2;
                    }
                }
                $messages[] = $message;
            }
            $missingMessages = [];
            foreach ($previousMessages as $previousMessage) {
                foreach ($messagesBeforeDiffing as $message) {
                    if ($previousMessage['message'] === $message['message'] && $previousMessage['line'] === $message['line']) {
                        continue 2;
                    }
                }
                $missingMessages[] = $previousMessage;
            }
            $previousMessages = \array_merge($previousMessages, $messages);
            $expectedJsonFile = \sprintf('%s/%s-%d%s.json', $this->getDataPath(), $topic, $level, $this->getResultSuffix());
            $exception = $this->compareFiles($expectedJsonFile, $messages);
            if ($exception !== null) {
                $exceptions[] = $exception;
            }
            $expectedJsonMissingFile = \sprintf('%s/%s-%d-missing%s.json', $this->getDataPath(), $topic, $level, $this->getResultSuffix());
            $exception = $this->compareFiles($expectedJsonMissingFile, $missingMessages);
            if ($exception === null) {
                continue;
            }
            $exceptions[] = $exception;
        }
        if (\count($exceptions) > 0) {
            throw $exceptions[0];
        }
    }
    private function compareFiles(string $expectedJsonFile, array $expectedMessages) : ?\PHPUnit\Framework\AssertionFailedError
    {
        if (\count($expectedMessages) === 0) {
            try {
                $this->assertFileNotExists($expectedJsonFile);
                return null;
            } catch (\PHPUnit\Framework\AssertionFailedError $e) {
                \unlink($expectedJsonFile);
                return $e;
            }
        }
        $actualOutput = \_HumbugBoxb94336daae36\Nette\Utils\Json::encode($expectedMessages, \_HumbugBoxb94336daae36\Nette\Utils\Json::PRETTY);
        try {
            $this->assertJsonStringEqualsJsonFile($expectedJsonFile, $actualOutput);
        } catch (\PHPUnit\Framework\AssertionFailedError $e) {
            \file_put_contents($expectedJsonFile, $actualOutput);
            return $e;
        }
        return null;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Testing;

use PHPStan\Analyser\Analyser;
use PHPStan\Analyser\Error;
use PHPStan\Analyser\NodeScopeResolver;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Broker\AnonymousClassNameHelper;
use PHPStan\Cache\Cache;
use PHPStan\File\FileHelper;
use PHPStan\File\FuzzyRelativePathHelper;
use PHPStan\PhpDoc\PhpDocStringResolver;
use PHPStan\Rules\Registry;
use PHPStan\Rules\Rule;
use PHPStan\Type\FileTypeMapper;
abstract class RuleTestCase extends \PHPStan\Testing\TestCase
{
    /** @var \PHPStan\Analyser\Analyser|null */
    private $analyser;
    protected abstract function getRule() : \PHPStan\Rules\Rule;
    protected function getTypeSpecifier() : \PHPStan\Analyser\TypeSpecifier
    {
        return $this->createTypeSpecifier(new \PhpParser\PrettyPrinter\Standard(), $this->createBroker(), $this->getMethodTypeSpecifyingExtensions(), $this->getStaticMethodTypeSpecifyingExtensions());
    }
    private function getAnalyser() : \PHPStan\Analyser\Analyser
    {
        if ($this->analyser === null) {
            $registry = new \PHPStan\Rules\Registry([$this->getRule()]);
            $broker = $this->createBroker();
            $printer = new \PhpParser\PrettyPrinter\Standard();
            $fileHelper = $this->getFileHelper();
            $typeSpecifier = $this->createTypeSpecifier($printer, $broker, $this->getMethodTypeSpecifyingExtensions(), $this->getStaticMethodTypeSpecifyingExtensions());
            $currentWorkingDirectory = $this->getCurrentWorkingDirectory();
            $this->analyser = new \PHPStan\Analyser\Analyser($this->createScopeFactory($broker, $typeSpecifier), $this->getParser(), $registry, new \PHPStan\Analyser\NodeScopeResolver($broker, $this->getParser(), new \PHPStan\Type\FileTypeMapper($this->getParser(), self::getContainer()->getByType(\PHPStan\PhpDoc\PhpDocStringResolver::class), $this->createMock(\PHPStan\Cache\Cache::class), new \PHPStan\Broker\AnonymousClassNameHelper(new \PHPStan\File\FileHelper($currentWorkingDirectory), new \PHPStan\File\FuzzyRelativePathHelper($currentWorkingDirectory, \DIRECTORY_SEPARATOR, [])), new \PHPStan\PhpDoc\TypeNodeResolver($this->getTypeNodeResolverExtensions())), $fileHelper, $typeSpecifier, $this->shouldPolluteScopeWithLoopInitialAssignments(), $this->shouldPolluteCatchScopeWithTryAssignments(), $this->shouldPolluteScopeWithAlwaysIterableForeach(), []), $fileHelper, [], \true, 50);
        }
        return $this->analyser;
    }
    /**
     * @return \PHPStan\Type\MethodTypeSpecifyingExtension[]
     */
    protected function getMethodTypeSpecifyingExtensions() : array
    {
        return [];
    }
    /**
     * @return \PHPStan\Type\StaticMethodTypeSpecifyingExtension[]
     */
    protected function getStaticMethodTypeSpecifyingExtensions() : array
    {
        return [];
    }
    /**
     * @return \PHPStan\PhpDoc\TypeNodeResolverExtension[]
     */
    protected function getTypeNodeResolverExtensions() : array
    {
        return [];
    }
    /**
     * @param string[] $files
     * @param mixed[] $expectedErrors
     */
    public function analyse(array $files, array $expectedErrors) : void
    {
        $files = \array_map([$this->getFileHelper(), 'normalizePath'], $files);
        $actualErrors = $this->getAnalyser()->analyse($files, \false);
        $strictlyTypedSprintf = static function (int $line, string $message) : string {
            return \sprintf('%02d: %s', $line, $message);
        };
        $expectedErrors = \array_map(static function (array $error) use($strictlyTypedSprintf) : string {
            if (!isset($error[0])) {
                throw new \InvalidArgumentException('Missing expected error message.');
            }
            if (!isset($error[1])) {
                throw new \InvalidArgumentException('Missing expected file line.');
            }
            return $strictlyTypedSprintf($error[1], $error[0]);
        }, $expectedErrors);
        $actualErrors = \array_map(static function (\PHPStan\Analyser\Error $error) : string {
            return \sprintf('%02d: %s', $error->getLine(), $error->getMessage());
        }, $actualErrors);
        $this->assertSame(\implode("\n", $expectedErrors), \implode("\n", $actualErrors));
    }
    protected function shouldPolluteScopeWithLoopInitialAssignments() : bool
    {
        return \false;
    }
    protected function shouldPolluteCatchScopeWithTryAssignments() : bool
    {
        return \false;
    }
    protected function shouldPolluteScopeWithAlwaysIterableForeach() : bool
    {
        return \true;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Testing;

use PhpParser\PrettyPrinter\Standard;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\ScopeFactory;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierFactory;
use PHPStan\Broker\AnonymousClassNameHelper;
use PHPStan\Broker\Broker;
use PHPStan\Broker\BrokerFactory;
use PHPStan\Cache\Cache;
use PHPStan\Cache\MemoryCacheStorage;
use PHPStan\DependencyInjection\Container;
use PHPStan\DependencyInjection\ContainerFactory;
use PHPStan\File\FileHelper;
use PHPStan\File\FuzzyRelativePathHelper;
use PHPStan\Parser\FunctionCallStatementFinder;
use PHPStan\Parser\Parser;
use PHPStan\PhpDoc\PhpDocStringResolver;
use PHPStan\PhpDoc\TypeStringResolver;
use PHPStan\Reflection\Annotations\AnnotationsMethodsClassReflectionExtension;
use PHPStan\Reflection\Annotations\AnnotationsPropertiesClassReflectionExtension;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\FunctionReflectionFactory;
use PHPStan\Reflection\Php\PhpClassReflectionExtension;
use PHPStan\Reflection\Php\PhpFunctionReflection;
use PHPStan\Reflection\Php\PhpMethodReflection;
use PHPStan\Reflection\Php\PhpMethodReflectionFactory;
use PHPStan\Reflection\Php\UniversalObjectCratesClassReflectionExtension;
use PHPStan\Reflection\PhpDefect\PhpDefectClassReflectionExtension;
use PHPStan\Reflection\SignatureMap\SignatureMapProvider;
use PHPStan\Type\FileTypeMapper;
use PHPStan\Type\Type;
abstract class TestCase extends \PHPUnit\Framework\TestCase
{
    /** @var \Nette\DI\Container|null */
    private static $container;
    public static function getContainer() : \_HumbugBoxb94336daae36\Nette\DI\Container
    {
        if (self::$container === null) {
            $tmpDir = \sys_get_temp_dir() . '/phpstan-tests';
            if (!@\mkdir($tmpDir, 0777, \true) && !\is_dir($tmpDir)) {
                self::fail(\sprintf('Cannot create temp directory %s', $tmpDir));
            }
            $rootDir = __DIR__ . '/../..';
            $containerFactory = new \PHPStan\DependencyInjection\ContainerFactory($rootDir);
            self::$container = $containerFactory->create($tmpDir, [$containerFactory->getConfigDirectory() . '/config.level7.neon'], []);
        }
        return self::$container;
    }
    public function getParser() : \PHPStan\Parser\Parser
    {
        /** @var \PHPStan\Parser\Parser $parser */
        $parser = self::getContainer()->getService('directParser');
        return $parser;
    }
    /**
     * @param \PHPStan\Type\DynamicMethodReturnTypeExtension[] $dynamicMethodReturnTypeExtensions
     * @param \PHPStan\Type\DynamicStaticMethodReturnTypeExtension[] $dynamicStaticMethodReturnTypeExtensions
     * @return \PHPStan\Broker\Broker
     */
    public function createBroker(array $dynamicMethodReturnTypeExtensions = [], array $dynamicStaticMethodReturnTypeExtensions = []) : \PHPStan\Broker\Broker
    {
        $functionCallStatementFinder = new \PHPStan\Parser\FunctionCallStatementFinder();
        $parser = $this->getParser();
        $cache = new \PHPStan\Cache\Cache(new \PHPStan\Cache\MemoryCacheStorage());
        $methodReflectionFactory = new class($parser, $functionCallStatementFinder, $cache) implements \PHPStan\Reflection\Php\PhpMethodReflectionFactory
        {
            /** @var \PHPStan\Parser\Parser */
            private $parser;
            /** @var \PHPStan\Parser\FunctionCallStatementFinder */
            private $functionCallStatementFinder;
            /** @var \PHPStan\Cache\Cache */
            private $cache;
            /** @var \PHPStan\Broker\Broker */
            public $broker;
            public function __construct(\PHPStan\Parser\Parser $parser, \PHPStan\Parser\FunctionCallStatementFinder $functionCallStatementFinder, \PHPStan\Cache\Cache $cache)
            {
                $this->parser = $parser;
                $this->functionCallStatementFinder = $functionCallStatementFinder;
                $this->cache = $cache;
            }
            /**
             * @param ClassReflection $declaringClass
             * @param ClassReflection|null $declaringTrait
             * @param \PHPStan\Reflection\Php\BuiltinMethodReflection $reflection
             * @param Type[] $phpDocParameterTypes
             * @param Type|null $phpDocReturnType
             * @param Type|null $phpDocThrowType
             * @param string|null $deprecatedDescription
             * @param bool $isDeprecated
             * @param bool $isInternal
             * @param bool $isFinal
             * @return PhpMethodReflection
             */
            public function create(\PHPStan\Reflection\ClassReflection $declaringClass, ?\PHPStan\Reflection\ClassReflection $declaringTrait, \PHPStan\Reflection\Php\BuiltinMethodReflection $reflection, array $phpDocParameterTypes, ?\PHPStan\Type\Type $phpDocReturnType, ?\PHPStan\Type\Type $phpDocThrowType, ?string $deprecatedDescription, bool $isDeprecated, bool $isInternal, bool $isFinal) : \PHPStan\Reflection\Php\PhpMethodReflection
            {
                return new \PHPStan\Reflection\Php\PhpMethodReflection($declaringClass, $declaringTrait, $reflection, $this->broker, $this->parser, $this->functionCallStatementFinder, $this->cache, $phpDocParameterTypes, $phpDocReturnType, $phpDocThrowType, $deprecatedDescription, $isDeprecated, $isInternal, $isFinal);
            }
        };
        $phpDocStringResolver = self::getContainer()->getByType(\PHPStan\PhpDoc\PhpDocStringResolver::class);
        $currentWorkingDirectory = $this->getCurrentWorkingDirectory();
        $fileTypeMapper = new \PHPStan\Type\FileTypeMapper($parser, $phpDocStringResolver, $cache, new \PHPStan\Broker\AnonymousClassNameHelper(new \PHPStan\File\FileHelper($currentWorkingDirectory), new \PHPStan\File\FuzzyRelativePathHelper($currentWorkingDirectory, \DIRECTORY_SEPARATOR, [])), self::getContainer()->getByType(\PHPStan\PhpDoc\TypeNodeResolver::class));
        $annotationsMethodsClassReflectionExtension = new \PHPStan\Reflection\Annotations\AnnotationsMethodsClassReflectionExtension($fileTypeMapper);
        $annotationsPropertiesClassReflectionExtension = new \PHPStan\Reflection\Annotations\AnnotationsPropertiesClassReflectionExtension($fileTypeMapper);
        $signatureMapProvider = self::getContainer()->getByType(\PHPStan\Reflection\SignatureMap\SignatureMapProvider::class);
        $phpExtension = new \PHPStan\Reflection\Php\PhpClassReflectionExtension($methodReflectionFactory, $fileTypeMapper, $annotationsMethodsClassReflectionExtension, $annotationsPropertiesClassReflectionExtension, $signatureMapProvider);
        $functionReflectionFactory = new class($this->getParser(), $functionCallStatementFinder, $cache) implements \PHPStan\Reflection\FunctionReflectionFactory
        {
            /** @var \PHPStan\Parser\Parser */
            private $parser;
            /** @var \PHPStan\Parser\FunctionCallStatementFinder */
            private $functionCallStatementFinder;
            /** @var \PHPStan\Cache\Cache */
            private $cache;
            public function __construct(\PHPStan\Parser\Parser $parser, \PHPStan\Parser\FunctionCallStatementFinder $functionCallStatementFinder, \PHPStan\Cache\Cache $cache)
            {
                $this->parser = $parser;
                $this->functionCallStatementFinder = $functionCallStatementFinder;
                $this->cache = $cache;
            }
            /**
             * @param \ReflectionFunction $function
             * @param Type[] $phpDocParameterTypes
             * @param Type|null $phpDocReturnType
             * @param Type|null $phpDocThrowType
             * @param string|null $deprecatedDescription
             * @param bool $isDeprecated
             * @param bool $isInternal
             * @param bool $isFinal
             * @param string|false $filename
             * @return PhpFunctionReflection
             */
            public function create(\ReflectionFunction $function, array $phpDocParameterTypes, ?\PHPStan\Type\Type $phpDocReturnType, ?\PHPStan\Type\Type $phpDocThrowType, ?string $deprecatedDescription, bool $isDeprecated, bool $isInternal, bool $isFinal, $filename) : \PHPStan\Reflection\Php\PhpFunctionReflection
            {
                return new \PHPStan\Reflection\Php\PhpFunctionReflection($function, $this->parser, $this->functionCallStatementFinder, $this->cache, $phpDocParameterTypes, $phpDocReturnType, $phpDocThrowType, $deprecatedDescription, $isDeprecated, $isInternal, $isFinal, $filename);
            }
        };
        $tagToService = static function (array $tags) {
            return \array_map(static function (string $serviceName) {
                return self::getContainer()->getService($serviceName);
            }, \array_keys($tags));
        };
        $currentWorkingDirectory = $this->getCurrentWorkingDirectory();
        $anonymousClassNameHelper = new \PHPStan\Broker\AnonymousClassNameHelper(new \PHPStan\File\FileHelper($currentWorkingDirectory), new \PHPStan\File\FuzzyRelativePathHelper($currentWorkingDirectory, \DIRECTORY_SEPARATOR, []));
        $broker = new \PHPStan\Broker\Broker([$phpExtension, new \PHPStan\Reflection\PhpDefect\PhpDefectClassReflectionExtension(self::getContainer()->getByType(\PHPStan\PhpDoc\TypeStringResolver::class), $annotationsPropertiesClassReflectionExtension), new \PHPStan\Reflection\Php\UniversalObjectCratesClassReflectionExtension([\stdClass::class]), $annotationsPropertiesClassReflectionExtension], [$phpExtension, $annotationsMethodsClassReflectionExtension], \array_merge($dynamicMethodReturnTypeExtensions, $this->getDynamicMethodReturnTypeExtensions()), \array_merge($dynamicStaticMethodReturnTypeExtensions, $this->getDynamicStaticMethodReturnTypeExtensions()), \array_merge($tagToService(self::getContainer()->findByTag(\PHPStan\Broker\BrokerFactory::DYNAMIC_FUNCTION_RETURN_TYPE_EXTENSION_TAG)), $this->getDynamicFunctionReturnTypeExtensions()), $this->getOperatorTypeSpecifyingExtensions(), $functionReflectionFactory, new \PHPStan\Type\FileTypeMapper($this->getParser(), $phpDocStringResolver, $cache, $anonymousClassNameHelper, self::getContainer()->getByType(\PHPStan\PhpDoc\TypeNodeResolver::class)), $signatureMapProvider, self::getContainer()->getByType(\PhpParser\PrettyPrinter\Standard::class), $anonymousClassNameHelper, self::getContainer()->getByType(\PHPStan\Parser\Parser::class), new \PHPStan\File\FuzzyRelativePathHelper($this->getCurrentWorkingDirectory(), \DIRECTORY_SEPARATOR, []), self::getContainer()->parameters['universalObjectCratesClasses']);
        $methodReflectionFactory->broker = $broker;
        return $broker;
    }
    /**
     * @param Broker $broker
     * @param TypeSpecifier $typeSpecifier
     * @param string[] $dynamicConstantNames
     *
     * @return ScopeFactory
     */
    public function createScopeFactory(\PHPStan\Broker\Broker $broker, \PHPStan\Analyser\TypeSpecifier $typeSpecifier, array $dynamicConstantNames = []) : \PHPStan\Analyser\ScopeFactory
    {
        $container = self::getContainer();
        if (\count($dynamicConstantNames) > 0) {
            $container->parameters['dynamicConstantNames'] = \array_merge($container->parameters['dynamicConstantNames'], $dynamicConstantNames);
        }
        return new \PHPStan\Analyser\ScopeFactory(\PHPStan\Analyser\Scope::class, $broker, new \PhpParser\PrettyPrinter\Standard(), $typeSpecifier, $container->getByType(\PHPStan\DependencyInjection\Container::class));
    }
    public function getCurrentWorkingDirectory() : string
    {
        return $this->getFileHelper()->normalizePath(__DIR__ . '/../..');
    }
    /**
     * @return \PHPStan\Type\DynamicMethodReturnTypeExtension[]
     */
    public function getDynamicMethodReturnTypeExtensions() : array
    {
        return [];
    }
    /**
     * @return \PHPStan\Type\DynamicStaticMethodReturnTypeExtension[]
     */
    public function getDynamicStaticMethodReturnTypeExtensions() : array
    {
        return [];
    }
    /**
     * @return \PHPStan\Type\DynamicFunctionReturnTypeExtension[]
     */
    public function getDynamicFunctionReturnTypeExtensions() : array
    {
        return [];
    }
    /**
     * @return \PHPStan\Type\OperatorTypeSpecifyingExtension[]
     */
    public function getOperatorTypeSpecifyingExtensions() : array
    {
        return [];
    }
    /**
     * @param \PhpParser\PrettyPrinter\Standard $printer
     * @param \PHPStan\Broker\Broker $broker
     * @param \PHPStan\Type\MethodTypeSpecifyingExtension[] $methodTypeSpecifyingExtensions
     * @param \PHPStan\Type\StaticMethodTypeSpecifyingExtension[] $staticMethodTypeSpecifyingExtensions
     * @return \PHPStan\Analyser\TypeSpecifier
     */
    public function createTypeSpecifier(\PhpParser\PrettyPrinter\Standard $printer, \PHPStan\Broker\Broker $broker, array $methodTypeSpecifyingExtensions = [], array $staticMethodTypeSpecifyingExtensions = []) : \PHPStan\Analyser\TypeSpecifier
    {
        $tagToService = static function (array $tags) {
            return \array_map(static function (string $serviceName) {
                return self::getContainer()->getService($serviceName);
            }, \array_keys($tags));
        };
        return new \PHPStan\Analyser\TypeSpecifier($printer, $broker, $tagToService(self::getContainer()->findByTag(\PHPStan\Analyser\TypeSpecifierFactory::FUNCTION_TYPE_SPECIFYING_EXTENSION_TAG)), $methodTypeSpecifyingExtensions, $staticMethodTypeSpecifyingExtensions);
    }
    public function getFileHelper() : \PHPStan\File\FileHelper
    {
        return self::getContainer()->getByType(\PHPStan\File\FileHelper::class);
    }
    protected function skipIfNotOnWindows() : void
    {
        if (\DIRECTORY_SEPARATOR === '\\') {
            return;
        }
        self::markTestSkipped();
    }
    protected function skipIfNotOnUnix() : void
    {
        if (\DIRECTORY_SEPARATOR === '/') {
            return;
        }
        self::markTestSkipped();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\Broker\Broker;
use PHPStan\TrinaryLogic;
class StringAlwaysAcceptingObjectWithToStringType extends \PHPStan\Type\StringType
{
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof \PHPStan\Type\TypeWithClassName) {
            $broker = \PHPStan\Broker\Broker::getInstance();
            if (!$broker->hasClass($type->getClassName())) {
                return \PHPStan\TrinaryLogic::createNo();
            }
            $typeClass = $broker->getClass($type->getClassName());
            return \PHPStan\TrinaryLogic::createFromBoolean($typeClass->hasNativeMethod('__toString'));
        }
        return parent::accepts($type, $strictTypes);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

interface TypeWithClassName extends \PHPStan\Type\Type
{
    public function getClassName() : string;
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

interface ConstantScalarType extends \PHPStan\Type\ConstantType
{
    /**
     * @return int|float|string|bool|null
     */
    public function getValue();
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\Reflection\ConstantReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\PropertyReflection;
use PHPStan\TrinaryLogic;
interface Type
{
    /**
     * @return string[]
     */
    public function getReferencedClasses() : array;
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic;
    public function isSuperTypeOf(\PHPStan\Type\Type $type) : \PHPStan\TrinaryLogic;
    public function equals(\PHPStan\Type\Type $type) : bool;
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string;
    public function canAccessProperties() : \PHPStan\TrinaryLogic;
    public function hasProperty(string $propertyName) : \PHPStan\TrinaryLogic;
    public function getProperty(string $propertyName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\PropertyReflection;
    public function canCallMethods() : \PHPStan\TrinaryLogic;
    public function hasMethod(string $methodName) : \PHPStan\TrinaryLogic;
    public function getMethod(string $methodName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\MethodReflection;
    public function canAccessConstants() : \PHPStan\TrinaryLogic;
    public function hasConstant(string $constantName) : \PHPStan\TrinaryLogic;
    public function getConstant(string $constantName) : \PHPStan\Reflection\ConstantReflection;
    public function isIterable() : \PHPStan\TrinaryLogic;
    public function isIterableAtLeastOnce() : \PHPStan\TrinaryLogic;
    public function getIterableKeyType() : \PHPStan\Type\Type;
    public function getIterableValueType() : \PHPStan\Type\Type;
    public function isOffsetAccessible() : \PHPStan\TrinaryLogic;
    public function hasOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\TrinaryLogic;
    public function getOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\Type\Type;
    public function setOffsetValueType(?\PHPStan\Type\Type $offsetType, \PHPStan\Type\Type $valueType) : \PHPStan\Type\Type;
    public function isCallable() : \PHPStan\TrinaryLogic;
    /**
     * @param \PHPStan\Reflection\ClassMemberAccessAnswerer $scope
     * @return \PHPStan\Reflection\ParametersAcceptor[]
     */
    public function getCallableParametersAcceptors(\PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : array;
    public function isCloneable() : \PHPStan\TrinaryLogic;
    public function toBoolean() : \PHPStan\Type\BooleanType;
    public function toNumber() : \PHPStan\Type\Type;
    public function toInteger() : \PHPStan\Type\Type;
    public function toFloat() : \PHPStan\Type\Type;
    public function toString() : \PHPStan\Type\Type;
    public function toArray() : \PHPStan\Type\Type;
    /**
     * @param mixed[] $properties
     * @return self
     */
    public static function __set_state(array $properties) : self;
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PhpParser\Node\Expr\StaticCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\MethodReflection;
interface DynamicStaticMethodReturnTypeExtension
{
    public function getClass() : string;
    public function isStaticMethodSupported(\PHPStan\Reflection\MethodReflection $methodReflection) : bool;
    public function getTypeFromStaticMethodCall(\PHPStan\Reflection\MethodReflection $methodReflection, \PhpParser\Node\Expr\StaticCall $methodCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type;
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\TrinaryLogic;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\Traits\NonCallableTypeTrait;
use PHPStan\Type\Traits\NonIterableTypeTrait;
use PHPStan\Type\Traits\NonObjectTypeTrait;
use PHPStan\Type\Traits\TruthyBooleanTypeTrait;
class ResourceType implements \PHPStan\Type\Type
{
    use JustNullableTypeTrait;
    use NonCallableTypeTrait;
    use NonIterableTypeTrait;
    use NonObjectTypeTrait;
    use TruthyBooleanTypeTrait;
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return 'resource';
    }
    public function toNumber() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toString() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\StringType();
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\IntegerType();
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toArray() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\Constant\ConstantArrayType([new \PHPStan\Type\Constant\ConstantIntegerType(0)], [$this], 1);
    }
    public function isOffsetAccessible() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function hasOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function getOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\NullType();
    }
    public function setOffsetValueType(?\PHPStan\Type\Type $offsetType, \PHPStan\Type\Type $valueType) : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\Reflection\ConstantReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\ParameterReflection;
use PHPStan\Reflection\ParametersAcceptor;
use PHPStan\Reflection\PropertyReflection;
use PHPStan\TrinaryLogic;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantIntegerType;
class ClosureType implements \PHPStan\Type\TypeWithClassName, \PHPStan\Reflection\ParametersAcceptor
{
    /** @var ObjectType */
    private $objectType;
    /** @var array<int, \PHPStan\Reflection\Native\NativeParameterReflection> */
    private $parameters;
    /** @var Type */
    private $returnType;
    /** @var bool */
    private $variadic;
    /**
     * @param array<int, \PHPStan\Reflection\Native\NativeParameterReflection> $parameters
     * @param Type $returnType
     * @param bool $variadic
     */
    public function __construct(array $parameters, \PHPStan\Type\Type $returnType, bool $variadic)
    {
        $this->objectType = new \PHPStan\Type\ObjectType(\Closure::class);
        $this->parameters = $parameters;
        $this->returnType = $returnType;
        $this->variadic = $variadic;
    }
    public function getClassName() : string
    {
        return $this->objectType->getClassName();
    }
    /**
     * @return string[]
     */
    public function getReferencedClasses() : array
    {
        $classes = $this->objectType->getReferencedClasses();
        foreach ($this->parameters as $parameter) {
            $classes = \array_merge($classes, $parameter->getType()->getReferencedClasses());
        }
        return \array_merge($classes, $this->returnType->getReferencedClasses());
    }
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return \PHPStan\Type\CompoundTypeHelper::accepts($type, $this, $strictTypes);
        }
        if (!$type instanceof \PHPStan\Type\ClosureType) {
            return $this->objectType->accepts($type, $strictTypes);
        }
        return $this->isSuperTypeOf($type);
    }
    public function isSuperTypeOf(\PHPStan\Type\Type $type) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof self) {
            return \PHPStan\Type\CallableTypeHelper::isParametersAcceptorSuperTypeOf($this, $type);
        }
        if ($type instanceof \PHPStan\Type\TypeWithClassName && $type->getClassName() === \Closure::class) {
            return \PHPStan\TrinaryLogic::createMaybe();
        }
        return $this->objectType->isSuperTypeOf($type);
    }
    public function equals(\PHPStan\Type\Type $type) : bool
    {
        if (!$type instanceof self) {
            return \false;
        }
        return $this->returnType->equals($type->returnType);
    }
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return \sprintf('Closure(%s): %s', \implode(', ', \array_map(static function (\PHPStan\Reflection\ParameterReflection $parameter) use($level) : string {
            return $parameter->getType()->describe($level);
        }, $this->parameters)), $this->returnType->describe($level));
    }
    public function canAccessProperties() : \PHPStan\TrinaryLogic
    {
        return $this->objectType->canAccessProperties();
    }
    public function hasProperty(string $propertyName) : \PHPStan\TrinaryLogic
    {
        return $this->objectType->hasProperty($propertyName);
    }
    public function getProperty(string $propertyName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\PropertyReflection
    {
        return $this->objectType->getProperty($propertyName, $scope);
    }
    public function canCallMethods() : \PHPStan\TrinaryLogic
    {
        return $this->objectType->canCallMethods();
    }
    public function hasMethod(string $methodName) : \PHPStan\TrinaryLogic
    {
        return $this->objectType->hasMethod($methodName);
    }
    public function getMethod(string $methodName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\MethodReflection
    {
        return $this->objectType->getMethod($methodName, $scope);
    }
    public function canAccessConstants() : \PHPStan\TrinaryLogic
    {
        return $this->objectType->canAccessConstants();
    }
    public function hasConstant(string $constantName) : \PHPStan\TrinaryLogic
    {
        return $this->objectType->hasConstant($constantName);
    }
    public function getConstant(string $constantName) : \PHPStan\Reflection\ConstantReflection
    {
        return $this->objectType->getConstant($constantName);
    }
    public function isIterable() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function isIterableAtLeastOnce() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function getIterableKeyType() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function getIterableValueType() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function isOffsetAccessible() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function hasOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function getOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function setOffsetValueType(?\PHPStan\Type\Type $offsetType, \PHPStan\Type\Type $valueType) : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function isCallable() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    /**
     * @param \PHPStan\Reflection\ClassMemberAccessAnswerer $scope
     * @return \PHPStan\Reflection\ParametersAcceptor[]
     */
    public function getCallableParametersAcceptors(\PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : array
    {
        return [$this];
    }
    public function isCloneable() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function toBoolean() : \PHPStan\Type\BooleanType
    {
        return new \PHPStan\Type\Constant\ConstantBooleanType(\true);
    }
    public function toNumber() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toString() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toArray() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\Constant\ConstantArrayType([new \PHPStan\Type\Constant\ConstantIntegerType(0)], [$this], 1);
    }
    /**
     * @return array<int, \PHPStan\Reflection\Native\NativeParameterReflection>
     */
    public function getParameters() : array
    {
        return $this->parameters;
    }
    public function isVariadic() : bool
    {
        return $this->variadic;
    }
    public function getReturnType() : \PHPStan\Type\Type
    {
        return $this->returnType;
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self($properties['parameters'], $properties['returnType'], $properties['variadic']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Traits;

use PHPStan\Type\BooleanType;
trait UndecidedBooleanTypeTrait
{
    public function toBoolean() : \PHPStan\Type\BooleanType
    {
        return new \PHPStan\Type\BooleanType();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Traits;

use PHPStan\TrinaryLogic;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
trait MaybeIterableTypeTrait
{
    public function isIterable() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function isIterableAtLeastOnce() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function getIterableKeyType() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\MixedType();
    }
    public function getIterableValueType() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\MixedType();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Traits;

use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\Reflection\TrivialParametersAcceptor;
use PHPStan\TrinaryLogic;
trait MaybeCallableTypeTrait
{
    public function isCallable() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    /**
     * @param \PHPStan\Reflection\ClassMemberAccessAnswerer $scope
     * @return \PHPStan\Reflection\ParametersAcceptor[]
     */
    public function getCallableParametersAcceptors(\PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : array
    {
        return [new \PHPStan\Reflection\TrivialParametersAcceptor()];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Traits;

use PHPStan\TrinaryLogic;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
trait MaybeOffsetAccessibleTypeTrait
{
    public function isOffsetAccessible() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function hasOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function getOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\MixedType();
    }
    public function setOffsetValueType(?\PHPStan\Type\Type $offsetType, \PHPStan\Type\Type $valueType) : \PHPStan\Type\Type
    {
        return $this;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Traits;

use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\Reflection\ConstantReflection;
use PHPStan\Reflection\Dummy\DummyConstantReflection;
use PHPStan\Reflection\Dummy\DummyMethodReflection;
use PHPStan\Reflection\Dummy\DummyPropertyReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\PropertyReflection;
use PHPStan\TrinaryLogic;
trait MaybeObjectTypeTrait
{
    public function canAccessProperties() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function hasProperty(string $propertyName) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function getProperty(string $propertyName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\PropertyReflection
    {
        return new \PHPStan\Reflection\Dummy\DummyPropertyReflection();
    }
    public function canCallMethods() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function hasMethod(string $methodName) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function getMethod(string $methodName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\MethodReflection
    {
        return new \PHPStan\Reflection\Dummy\DummyMethodReflection($methodName);
    }
    public function canAccessConstants() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function hasConstant(string $constantName) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function getConstant(string $constantName) : \PHPStan\Reflection\ConstantReflection
    {
        return new \PHPStan\Reflection\Dummy\DummyConstantReflection($constantName);
    }
    public function isCloneable() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createMaybe();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Traits;

use PHPStan\Type\BooleanType;
use PHPStan\Type\Constant\ConstantBooleanType;
trait FalseyBooleanTypeTrait
{
    public function toBoolean() : \PHPStan\Type\BooleanType
    {
        return new \PHPStan\Type\Constant\ConstantBooleanType(\false);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Traits;

use PHPStan\TrinaryLogic;
use PHPStan\Type\CompoundType;
use PHPStan\Type\CompoundTypeHelper;
use PHPStan\Type\Type;
trait ConstantScalarTypeTrait
{
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof self) {
            return \PHPStan\TrinaryLogic::createFromBoolean($this->value === $type->value);
        }
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return \PHPStan\Type\CompoundTypeHelper::accepts($type, $this, $strictTypes);
        }
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function isSuperTypeOf(\PHPStan\Type\Type $type) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof self) {
            return $this->value === $type->value ? \PHPStan\TrinaryLogic::createYes() : \PHPStan\TrinaryLogic::createNo();
        }
        if ($type instanceof parent) {
            return \PHPStan\TrinaryLogic::createMaybe();
        }
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return $type->isSubTypeOf($this);
        }
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function equals(\PHPStan\Type\Type $type) : bool
    {
        return $type instanceof self && $this->value === $type->value;
    }
    public function generalize() : \PHPStan\Type\Type
    {
        return new parent();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Traits;

use PHPStan\TrinaryLogic;
use PHPStan\Type\ErrorType;
use PHPStan\Type\Type;
trait NonOffsetAccessibleTypeTrait
{
    public function isOffsetAccessible() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function hasOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function getOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function setOffsetValueType(?\PHPStan\Type\Type $offsetType, \PHPStan\Type\Type $valueType) : \PHPStan\Type\Type
    {
        return $this;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Traits;

use PHPStan\Type\BooleanType;
use PHPStan\Type\Constant\ConstantBooleanType;
trait TruthyBooleanTypeTrait
{
    public function toBoolean() : \PHPStan\Type\BooleanType
    {
        return new \PHPStan\Type\Constant\ConstantBooleanType(\true);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Traits;

use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\TrinaryLogic;
trait NonCallableTypeTrait
{
    public function isCallable() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function getCallableParametersAcceptors(\PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : array
    {
        throw new \PHPStan\ShouldNotHappenException();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Traits;

use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\Reflection\ConstantReflection;
use PHPStan\Reflection\Dummy\DummyConstantReflection;
use PHPStan\Reflection\Dummy\DummyMethodReflection;
use PHPStan\Reflection\Dummy\DummyPropertyReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\PropertyReflection;
use PHPStan\TrinaryLogic;
use PHPStan\Type\ArrayType;
use PHPStan\Type\ErrorType;
use PHPStan\Type\MixedType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
trait ObjectTypeTrait
{
    use MaybeCallableTypeTrait;
    use MaybeIterableTypeTrait;
    use MaybeOffsetAccessibleTypeTrait;
    use TruthyBooleanTypeTrait;
    public function canAccessProperties() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function hasProperty(string $propertyName) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function getProperty(string $propertyName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\PropertyReflection
    {
        return new \PHPStan\Reflection\Dummy\DummyPropertyReflection();
    }
    public function canCallMethods() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function hasMethod(string $methodName) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function getMethod(string $methodName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\MethodReflection
    {
        return new \PHPStan\Reflection\Dummy\DummyMethodReflection($methodName);
    }
    public function canAccessConstants() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function hasConstant(string $constantName) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function getConstant(string $constantName) : \PHPStan\Reflection\ConstantReflection
    {
        return new \PHPStan\Reflection\Dummy\DummyConstantReflection($constantName);
    }
    public function isCloneable() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function toNumber() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toString() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\StringType();
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toArray() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType());
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Traits;

use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\Reflection\ConstantReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\PropertyReflection;
use PHPStan\TrinaryLogic;
trait NonObjectTypeTrait
{
    public function canAccessProperties() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function hasProperty(string $propertyName) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function getProperty(string $propertyName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\PropertyReflection
    {
        throw new \PHPStan\ShouldNotHappenException();
    }
    public function canCallMethods() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function hasMethod(string $methodName) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function getMethod(string $methodName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\MethodReflection
    {
        throw new \PHPStan\ShouldNotHappenException();
    }
    public function canAccessConstants() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function hasConstant(string $constantName) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function getConstant(string $constantName) : \PHPStan\Reflection\ConstantReflection
    {
        throw new \PHPStan\ShouldNotHappenException();
    }
    public function isCloneable() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Traits;

use PHPStan\TrinaryLogic;
use PHPStan\Type\ErrorType;
use PHPStan\Type\Type;
trait NonIterableTypeTrait
{
    public function isIterable() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function isIterableAtLeastOnce() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function getIterableKeyType() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function getIterableValueType() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PhpParser\Node\Expr\MethodCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\MethodReflection;
interface DynamicMethodReturnTypeExtension
{
    public function getClass() : string;
    public function isMethodSupported(\PHPStan\Reflection\MethodReflection $methodReflection) : bool;
    public function getTypeFromMethodCall(\PHPStan\Reflection\MethodReflection $methodReflection, \PhpParser\Node\Expr\MethodCall $methodCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type;
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

class ErrorType extends \PHPStan\Type\MixedType
{
    public function getIterableKeyType() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function getIterableValueType() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function subtract(\PHPStan\Type\Type $type) : \PHPStan\Type\Type
    {
        return new self();
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\TrinaryLogic;
class CompoundTypeHelper
{
    public static function accepts(\PHPStan\Type\CompoundType $compoundType, \PHPStan\Type\Type $otherType, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        if ($compoundType instanceof \PHPStan\Type\MixedType) {
            $isSuperType = $compoundType->isSuperTypeOf($otherType);
            if ($isSuperType->no()) {
                return $isSuperType;
            }
            return \PHPStan\TrinaryLogic::createYes();
        }
        if ($compoundType instanceof \PHPStan\Type\BenevolentUnionType) {
            foreach ($compoundType->getTypes() as $innerType) {
                if ($otherType->accepts($innerType, $strictTypes)->yes()) {
                    return \PHPStan\TrinaryLogic::createYes();
                }
            }
            return \PHPStan\TrinaryLogic::createNo();
        }
        return $compoundType->isSubTypeOf($otherType);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

interface SubtractableType extends \PHPStan\Type\Type
{
    public function subtract(\PHPStan\Type\Type $type) : \PHPStan\Type\Type;
    public function getTypeWithoutSubtractedType() : \PHPStan\Type\Type;
    public function changeSubtractedType(?\PHPStan\Type\Type $subtractedType) : \PHPStan\Type\Type;
    public function getSubtractedType() : ?\PHPStan\Type\Type;
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
interface DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool;
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type;
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

class VerbosityLevel
{
    private const TYPE_ONLY = 1;
    private const VALUE = 2;
    private const PRECISE = 3;
    /** @var self[] */
    private static $registry;
    /** @var int */
    private $value;
    private function __construct(int $value)
    {
        $this->value = $value;
    }
    private static function create(int $value) : self
    {
        self::$registry[$value] = self::$registry[$value] ?? new self($value);
        return self::$registry[$value];
    }
    public static function typeOnly() : self
    {
        return self::create(self::TYPE_ONLY);
    }
    public static function value() : self
    {
        return self::create(self::VALUE);
    }
    public static function precise() : self
    {
        return self::create(self::PRECISE);
    }
    /**
     * @param callable(): string $typeOnlyCallback
     * @param callable(): string $valueCallback
     * @param callable(): string|null $preciseCallback
     * @return string
     */
    public function handle(callable $typeOnlyCallback, callable $valueCallback, ?callable $preciseCallback = null) : string
    {
        if ($this->value === self::TYPE_ONLY) {
            return $typeOnlyCallback();
        }
        if ($this->value === self::VALUE || $preciseCallback === null) {
            return $valueCallback();
        }
        return $preciseCallback();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\Type\Accessory\HasPropertyType;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantStringType;
class TypeUtils
{
    /**
     * @param \PHPStan\Type\Type $type
     * @return \PHPStan\Type\ArrayType[]
     */
    public static function getArrays(\PHPStan\Type\Type $type) : array
    {
        return self::map(\PHPStan\Type\ArrayType::class, $type, \true);
    }
    /**
     * @param \PHPStan\Type\Type $type
     * @return \PHPStan\Type\Constant\ConstantArrayType[]
     */
    public static function getConstantArrays(\PHPStan\Type\Type $type) : array
    {
        return self::map(\PHPStan\Type\Constant\ConstantArrayType::class, $type, \false);
    }
    /**
     * @param \PHPStan\Type\Type $type
     * @return \PHPStan\Type\Constant\ConstantStringType[]
     */
    public static function getConstantStrings(\PHPStan\Type\Type $type) : array
    {
        return self::map(\PHPStan\Type\Constant\ConstantStringType::class, $type, \false);
    }
    /**
     * @param \PHPStan\Type\Type $type
     * @return \PHPStan\Type\ConstantType[]
     */
    public static function getConstantTypes(\PHPStan\Type\Type $type) : array
    {
        return self::map(\PHPStan\Type\ConstantType::class, $type, \false);
    }
    /**
     * @param \PHPStan\Type\Type $type
     * @return \PHPStan\Type\ConstantType[]
     */
    public static function getAnyConstantTypes(\PHPStan\Type\Type $type) : array
    {
        return self::map(\PHPStan\Type\ConstantType::class, $type, \false, \false);
    }
    /**
     * @param \PHPStan\Type\Type $type
     * @return \PHPStan\Type\ArrayType[]
     */
    public static function getAnyArrays(\PHPStan\Type\Type $type) : array
    {
        return self::map(\PHPStan\Type\ArrayType::class, $type, \true, \false);
    }
    public static function generalizeType(\PHPStan\Type\Type $type) : \PHPStan\Type\Type
    {
        if ($type instanceof \PHPStan\Type\ConstantType) {
            return $type->generalize();
        } elseif ($type instanceof \PHPStan\Type\UnionType) {
            return \PHPStan\Type\TypeCombinator::union(...\array_map(static function (\PHPStan\Type\Type $innerType) : Type {
                return self::generalizeType($innerType);
            }, $type->getTypes()));
        }
        return $type;
    }
    /**
     * @param Type $type
     * @return string[]
     */
    public static function getDirectClassNames(\PHPStan\Type\Type $type) : array
    {
        if ($type instanceof \PHPStan\Type\TypeWithClassName) {
            return [$type->getClassName()];
        }
        if ($type instanceof \PHPStan\Type\UnionType || $type instanceof \PHPStan\Type\IntersectionType) {
            $classNames = [];
            foreach ($type->getTypes() as $innerType) {
                if (!$innerType instanceof \PHPStan\Type\TypeWithClassName) {
                    continue;
                }
                $classNames[] = $innerType->getClassName();
            }
            return $classNames;
        }
        return [];
    }
    /**
     * @param Type $type
     * @return \PHPStan\Type\ConstantScalarType[]
     */
    public static function getConstantScalars(\PHPStan\Type\Type $type) : array
    {
        return self::map(\PHPStan\Type\ConstantScalarType::class, $type, \false);
    }
    /**
     * @param string $typeClass
     * @param Type $type
     * @param bool $inspectIntersections
     * @param bool $stopOnUnmatched
     * @return mixed[]
     */
    private static function map(string $typeClass, \PHPStan\Type\Type $type, bool $inspectIntersections, bool $stopOnUnmatched = \true) : array
    {
        if ($type instanceof $typeClass) {
            return [$type];
        }
        if ($type instanceof \PHPStan\Type\UnionType) {
            $matchingTypes = [];
            foreach ($type->getTypes() as $innerType) {
                if (!$innerType instanceof $typeClass) {
                    if ($stopOnUnmatched) {
                        return [];
                    }
                    continue;
                }
                $matchingTypes[] = $innerType;
            }
            return $matchingTypes;
        }
        if ($inspectIntersections && $type instanceof \PHPStan\Type\IntersectionType) {
            $matchingTypes = [];
            foreach ($type->getTypes() as $innerType) {
                if (!$innerType instanceof $typeClass) {
                    if ($stopOnUnmatched) {
                        return [];
                    }
                    continue;
                }
                $matchingTypes[] = $innerType;
            }
            return $matchingTypes;
        }
        return [];
    }
    public static function toBenevolentUnion(\PHPStan\Type\Type $type) : \PHPStan\Type\Type
    {
        if ($type instanceof \PHPStan\Type\BenevolentUnionType) {
            return $type;
        }
        if ($type instanceof \PHPStan\Type\UnionType) {
            return new \PHPStan\Type\BenevolentUnionType($type->getTypes());
        }
        return $type;
    }
    /**
     * @param Type $type
     * @return Type[]
     */
    public static function flattenTypes(\PHPStan\Type\Type $type) : array
    {
        if ($type instanceof \PHPStan\Type\UnionType) {
            return $type->getTypes();
        }
        return [$type];
    }
    public static function findThisType(\PHPStan\Type\Type $type) : ?\PHPStan\Type\ThisType
    {
        if ($type instanceof \PHPStan\Type\ThisType) {
            return $type;
        }
        if ($type instanceof \PHPStan\Type\UnionType || $type instanceof \PHPStan\Type\IntersectionType) {
            foreach ($type->getTypes() as $innerType) {
                $thisType = self::findThisType($innerType);
                if ($thisType !== null) {
                    return $thisType;
                }
            }
        }
        return null;
    }
    /**
     * @param Type $type
     * @return HasPropertyType[]
     */
    public static function getHasPropertyTypes(\PHPStan\Type\Type $type) : array
    {
        if ($type instanceof \PHPStan\Type\Accessory\HasPropertyType) {
            return [$type];
        }
        if ($type instanceof \PHPStan\Type\UnionType || $type instanceof \PHPStan\Type\IntersectionType) {
            $hasPropertyTypes = [];
            foreach ($type->getTypes() as $innerType) {
                $hasPropertyTypes = \array_merge($hasPropertyTypes, self::getHasPropertyTypes($innerType));
            }
            return $hasPropertyTypes;
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
interface FunctionTypeSpecifyingExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool;
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes;
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\TrinaryLogic;
interface CompoundType extends \PHPStan\Type\Type
{
    public function isSubTypeOf(\PHPStan\Type\Type $otherType) : \PHPStan\TrinaryLogic;
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PhpParser\Node;
class CommentHelper
{
    public static function getDocComment(\PhpParser\Node $node) : ?string
    {
        $phpDoc = $node->getDocComment();
        if ($phpDoc !== null) {
            return $phpDoc->getText();
        }
        return null;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

class RecursionGuard
{
    /** @var true[] */
    private static $context = [];
    public static function run(\PHPStan\Type\Type $type, callable $callback) : \PHPStan\Type\Type
    {
        $key = $type->describe(\PHPStan\Type\VerbosityLevel::value());
        if (isset(self::$context[$key])) {
            return new \PHPStan\Type\ErrorType();
        }
        try {
            self::$context[$key] = \true;
            return $callback();
        } finally {
            unset(self::$context[$key]);
        }
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

interface ConstantType extends \PHPStan\Type\Type
{
    public function generalize() : \PHPStan\Type\Type;
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\TrinaryLogic;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantFloatType;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\Traits\NonCallableTypeTrait;
use PHPStan\Type\Traits\NonIterableTypeTrait;
use PHPStan\Type\Traits\NonObjectTypeTrait;
use PHPStan\Type\Traits\UndecidedBooleanTypeTrait;
class BooleanType implements \PHPStan\Type\Type
{
    use JustNullableTypeTrait;
    use NonCallableTypeTrait;
    use NonIterableTypeTrait;
    use NonObjectTypeTrait;
    use UndecidedBooleanTypeTrait;
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return 'bool';
    }
    public function toNumber() : \PHPStan\Type\Type
    {
        return $this->toInteger();
    }
    public function toString() : \PHPStan\Type\Type
    {
        return \PHPStan\Type\TypeCombinator::union(new \PHPStan\Type\Constant\ConstantStringType(''), new \PHPStan\Type\Constant\ConstantStringType('1'));
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        return \PHPStan\Type\TypeCombinator::union(new \PHPStan\Type\Constant\ConstantIntegerType(0), new \PHPStan\Type\Constant\ConstantIntegerType(1));
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        return \PHPStan\Type\TypeCombinator::union(new \PHPStan\Type\Constant\ConstantFloatType(0.0), new \PHPStan\Type\Constant\ConstantFloatType(1.0));
    }
    public function toArray() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\Constant\ConstantArrayType([new \PHPStan\Type\Constant\ConstantIntegerType(0)], [$this], 1);
    }
    public function isOffsetAccessible() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function hasOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function getOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\NullType();
    }
    public function setOffsetValueType(?\PHPStan\Type\Type $offsetType, \PHPStan\Type\Type $valueType) : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new static();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\TrinaryLogic;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\Traits\FalseyBooleanTypeTrait;
use PHPStan\Type\Traits\NonCallableTypeTrait;
use PHPStan\Type\Traits\NonIterableTypeTrait;
use PHPStan\Type\Traits\NonObjectTypeTrait;
class NullType implements \PHPStan\Type\ConstantScalarType
{
    use NonCallableTypeTrait;
    use NonIterableTypeTrait;
    use NonObjectTypeTrait;
    use FalseyBooleanTypeTrait;
    /**
     * @return string[]
     */
    public function getReferencedClasses() : array
    {
        return [];
    }
    /**
     * @return null
     */
    public function getValue()
    {
        return null;
    }
    public function generalize() : \PHPStan\Type\Type
    {
        return $this;
    }
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof self) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return \PHPStan\Type\CompoundTypeHelper::accepts($type, $this, $strictTypes);
        }
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function isSuperTypeOf(\PHPStan\Type\Type $type) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof self) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return $type->isSubTypeOf($this);
        }
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function equals(\PHPStan\Type\Type $type) : bool
    {
        return $type instanceof self;
    }
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return 'null';
    }
    public function toNumber() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\Constant\ConstantIntegerType(0);
    }
    public function toString() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\Constant\ConstantStringType('');
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        return $this->toNumber();
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        return $this->toNumber()->toFloat();
    }
    public function toArray() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\Constant\ConstantArrayType([], []);
    }
    public function isOffsetAccessible() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function hasOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function getOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\NullType();
    }
    public function setOffsetValueType(?\PHPStan\Type\Type $offsetType, \PHPStan\Type\Type $valueType) : \PHPStan\Type\Type
    {
        $array = new \PHPStan\Type\Constant\ConstantArrayType([], []);
        return $array->setOffsetValueType($offsetType, $valueType);
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\Broker\Broker;
class TypehintHelper
{
    private static function getTypeObjectFromTypehint(string $typeString, ?string $selfClass) : \PHPStan\Type\Type
    {
        switch (\strtolower($typeString)) {
            case 'int':
                return new \PHPStan\Type\IntegerType();
            case 'bool':
                return new \PHPStan\Type\BooleanType();
            case 'string':
                return new \PHPStan\Type\StringType();
            case 'float':
                return new \PHPStan\Type\FloatType();
            case 'array':
                return new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType());
            case 'iterable':
                return new \PHPStan\Type\IterableType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType());
            case 'callable':
                return new \PHPStan\Type\CallableType();
            case 'void':
                return new \PHPStan\Type\VoidType();
            case 'object':
                return new \PHPStan\Type\ObjectWithoutClassType();
            case 'self':
                return $selfClass !== null ? new \PHPStan\Type\ObjectType($selfClass) : new \PHPStan\Type\ErrorType();
            case 'parent':
                $broker = \PHPStan\Broker\Broker::getInstance();
                if ($selfClass !== null && $broker->hasClass($selfClass)) {
                    $classReflection = $broker->getClass($selfClass);
                    if ($classReflection->getParentClass() !== \false) {
                        return new \PHPStan\Type\ObjectType($classReflection->getParentClass()->getName());
                    }
                }
                return new \PHPStan\Type\NonexistentParentClassType();
            default:
                return new \PHPStan\Type\ObjectType($typeString);
        }
    }
    public static function decideTypeFromReflection(?\ReflectionType $reflectionType, ?\PHPStan\Type\Type $phpDocType = null, ?string $selfClass = null, bool $isVariadic = \false) : \PHPStan\Type\Type
    {
        if ($reflectionType === null) {
            return $phpDocType ?? new \PHPStan\Type\MixedType();
        }
        $reflectionTypeString = (string) $reflectionType;
        if (\_HumbugBoxb94336daae36\Nette\Utils\Strings::endsWith(\strtolower($reflectionTypeString), '\\object')) {
            $reflectionTypeString = 'object';
        }
        $type = self::getTypeObjectFromTypehint($reflectionTypeString, $selfClass);
        if ($reflectionType->allowsNull()) {
            $type = \PHPStan\Type\TypeCombinator::addNull($type);
        }
        if ($isVariadic) {
            $type = new \PHPStan\Type\ArrayType(new \PHPStan\Type\IntegerType(), $type);
        }
        return self::decideType($type, $phpDocType);
    }
    public static function decideType(\PHPStan\Type\Type $type, ?\PHPStan\Type\Type $phpDocType = null) : \PHPStan\Type\Type
    {
        if ($phpDocType !== null && !$phpDocType instanceof \PHPStan\Type\ErrorType) {
            if ($type instanceof \PHPStan\Type\VoidType || $phpDocType instanceof \PHPStan\Type\VoidType) {
                return new \PHPStan\Type\VoidType();
            }
            if (\PHPStan\Type\TypeCombinator::removeNull($type) instanceof \PHPStan\Type\IterableType) {
                if ($phpDocType instanceof \PHPStan\Type\UnionType) {
                    $innerTypes = [];
                    foreach ($phpDocType->getTypes() as $innerType) {
                        if ($innerType instanceof \PHPStan\Type\ArrayType) {
                            $innerTypes[] = new \PHPStan\Type\IterableType($innerType->getKeyType(), $innerType->getItemType());
                        } else {
                            $innerTypes[] = $innerType;
                        }
                    }
                    $phpDocType = new \PHPStan\Type\UnionType($innerTypes);
                } elseif ($phpDocType instanceof \PHPStan\Type\ArrayType) {
                    $phpDocType = new \PHPStan\Type\IterableType($phpDocType->getKeyType(), $phpDocType->getItemType());
                }
            }
            $resultType = $type->isSuperTypeOf($phpDocType)->yes() ? $phpDocType : $type;
            if (\PHPStan\Type\TypeCombinator::containsNull($type)) {
                $type = \PHPStan\Type\TypeCombinator::addNull($resultType);
            } else {
                $type = $resultType;
            }
        }
        return $type;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PhpParser\Node\Expr\MethodCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\MethodReflection;
interface MethodTypeSpecifyingExtension
{
    public function getClass() : string;
    public function isMethodSupported(\PHPStan\Reflection\MethodReflection $methodReflection, \PhpParser\Node\Expr\MethodCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool;
    public function specifyTypes(\PHPStan\Reflection\MethodReflection $methodReflection, \PhpParser\Node\Expr\MethodCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes;
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\Reflection\TrivialParametersAcceptor;
use PHPStan\TrinaryLogic;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\Traits\MaybeCallableTypeTrait;
use PHPStan\Type\Traits\NonObjectTypeTrait;
use PHPStan\Type\Traits\UndecidedBooleanTypeTrait;
class ArrayType implements \PHPStan\Type\StaticResolvableType
{
    use MaybeCallableTypeTrait;
    use NonObjectTypeTrait;
    use UndecidedBooleanTypeTrait;
    /** @var \PHPStan\Type\Type */
    private $keyType;
    /** @var \PHPStan\Type\Type */
    private $itemType;
    public function __construct(\PHPStan\Type\Type $keyType, \PHPStan\Type\Type $itemType)
    {
        if ($keyType->describe(\PHPStan\Type\VerbosityLevel::value()) === '(int|string)') {
            $keyType = new \PHPStan\Type\MixedType();
        }
        $this->keyType = $keyType;
        $this->itemType = $itemType;
    }
    public function getKeyType() : \PHPStan\Type\Type
    {
        return $this->keyType;
    }
    public function getItemType() : \PHPStan\Type\Type
    {
        return $this->itemType;
    }
    /**
     * @return string[]
     */
    public function getReferencedClasses() : array
    {
        return \array_merge($this->keyType->getReferencedClasses(), $this->getItemType()->getReferencedClasses());
    }
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        $arrays = \PHPStan\Type\TypeUtils::getArrays($type);
        if (\count($arrays) > 0) {
            $result = \PHPStan\TrinaryLogic::createYes();
            foreach ($arrays as $array) {
                $result = $result->and($this->getItemType()->accepts($array->getItemType(), $strictTypes))->and($this->keyType->accepts($array->keyType, $strictTypes));
            }
            return $result;
        }
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return \PHPStan\Type\CompoundTypeHelper::accepts($type, $this, $strictTypes);
        }
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function isSuperTypeOf(\PHPStan\Type\Type $type) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof self) {
            return $this->getItemType()->isSuperTypeOf($type->getItemType())->and($this->keyType->isSuperTypeOf($type->keyType));
        }
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return $type->isSubTypeOf($this);
        }
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function equals(\PHPStan\Type\Type $type) : bool
    {
        return $type instanceof self && $this->getItemType()->equals($type->getItemType()) && $this->keyType->equals($type->keyType);
    }
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        if ($this->keyType instanceof \PHPStan\Type\MixedType || $this->keyType instanceof \PHPStan\Type\NeverType) {
            if ($this->itemType instanceof \PHPStan\Type\MixedType || $this->itemType instanceof \PHPStan\Type\NeverType) {
                return 'array';
            }
            return \sprintf('array<%s>', $this->itemType->describe($level));
        }
        return \sprintf('array<%s, %s>', $this->keyType->describe($level), $this->itemType->describe($level));
    }
    public function generalizeValues() : self
    {
        return new self($this->keyType, \PHPStan\Type\TypeUtils::generalizeType($this->itemType));
    }
    public function getKeysArray() : self
    {
        return new self(new \PHPStan\Type\IntegerType(), $this->keyType);
    }
    public function getValuesArray() : self
    {
        return new self(new \PHPStan\Type\IntegerType(), $this->itemType);
    }
    public function resolveStatic(string $className) : \PHPStan\Type\Type
    {
        if ($this->getItemType() instanceof \PHPStan\Type\StaticResolvableType) {
            return new self($this->keyType, $this->getItemType()->resolveStatic($className));
        }
        return $this;
    }
    public function changeBaseClass(string $className) : \PHPStan\Type\StaticResolvableType
    {
        if ($this->getItemType() instanceof \PHPStan\Type\StaticResolvableType) {
            return new self($this->keyType, $this->getItemType()->changeBaseClass($className));
        }
        return $this;
    }
    public function isIterable() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function isIterableAtLeastOnce() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function getIterableKeyType() : \PHPStan\Type\Type
    {
        $keyType = $this->keyType;
        if ($keyType instanceof \PHPStan\Type\MixedType) {
            return new \PHPStan\Type\BenevolentUnionType([new \PHPStan\Type\IntegerType(), new \PHPStan\Type\StringType()]);
        }
        return $keyType;
    }
    public function getIterableValueType() : \PHPStan\Type\Type
    {
        return $this->getItemType();
    }
    public function isOffsetAccessible() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function hasOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\TrinaryLogic
    {
        $offsetType = self::castToArrayKeyType($offsetType);
        if ($this->getKeyType()->isSuperTypeOf($offsetType)->no()) {
            return \PHPStan\TrinaryLogic::createNo();
        }
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function getOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\Type\Type
    {
        $offsetType = self::castToArrayKeyType($offsetType);
        if ($this->getKeyType()->isSuperTypeOf($offsetType)->no()) {
            return new \PHPStan\Type\ErrorType();
        }
        $type = $this->getItemType();
        if ($type instanceof \PHPStan\Type\ErrorType) {
            return new \PHPStan\Type\MixedType();
        }
        return $type;
    }
    public function setOffsetValueType(?\PHPStan\Type\Type $offsetType, \PHPStan\Type\Type $valueType) : \PHPStan\Type\Type
    {
        if ($offsetType === null) {
            $offsetType = new \PHPStan\Type\IntegerType();
        }
        return new \PHPStan\Type\ArrayType(\PHPStan\Type\TypeCombinator::union($this->keyType, self::castToArrayKeyType($offsetType)), \PHPStan\Type\TypeCombinator::union($this->itemType, $valueType));
    }
    public function isCallable() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createMaybe()->and((new \PHPStan\Type\StringType())->isSuperTypeOf($this->itemType));
    }
    /**
     * @param \PHPStan\Reflection\ClassMemberAccessAnswerer $scope
     * @return \PHPStan\Reflection\ParametersAcceptor[]
     */
    public function getCallableParametersAcceptors(\PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : array
    {
        if ($this->isCallable()->no()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return [new \PHPStan\Reflection\TrivialParametersAcceptor()];
    }
    public function toNumber() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toString() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toArray() : \PHPStan\Type\Type
    {
        return $this;
    }
    public function count() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\IntegerType();
    }
    public static function castToArrayKeyType(\PHPStan\Type\Type $offsetType) : \PHPStan\Type\Type
    {
        if ($offsetType instanceof \PHPStan\Type\UnionType) {
            return \PHPStan\Type\TypeCombinator::union(...\array_map(static function (\PHPStan\Type\Type $type) : Type {
                return self::castToArrayKeyType($type);
            }, $offsetType->getTypes()));
        }
        if ($offsetType instanceof \PHPStan\Type\ConstantScalarType) {
            /** @var int|string $offsetValue */
            $offsetValue = \key([$offsetType->getValue() => null]);
            return \is_int($offsetValue) ? new \PHPStan\Type\Constant\ConstantIntegerType($offsetValue) : new \PHPStan\Type\Constant\ConstantStringType($offsetValue);
        }
        if ($offsetType instanceof \PHPStan\Type\IntegerType || $offsetType instanceof \PHPStan\Type\FloatType || $offsetType instanceof \PHPStan\Type\BooleanType) {
            return new \PHPStan\Type\IntegerType();
        }
        if ($offsetType instanceof \PHPStan\Type\StringType) {
            return new \PHPStan\Type\StringType();
        }
        return new \PHPStan\Type\UnionType([new \PHPStan\Type\IntegerType(), new \PHPStan\Type\StringType()]);
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self($properties['keyType'], $properties['itemType']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PHPStan\Type\BooleanType;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\DynamicFunctionReturnTypeExtension;
use PHPStan\Type\NullType;
use PHPStan\Type\StringType;
use PHPStan\Type\TypeCombinator;
class VarExportFunctionDynamicReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return \in_array($functionReflection->getName(), ['var_export', 'highlight_file', 'highlight_string', 'print_r'], \true);
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        if ($functionReflection->getName() === 'var_export') {
            $fallbackReturnType = new \PHPStan\Type\NullType();
        } elseif ($functionReflection->getName() === 'print_r') {
            $fallbackReturnType = new \PHPStan\Type\Constant\ConstantBooleanType(\true);
        } else {
            $fallbackReturnType = new \PHPStan\Type\BooleanType();
        }
        if (\count($functionCall->args) < 1) {
            return \PHPStan\Type\TypeCombinator::union(new \PHPStan\Type\StringType(), $fallbackReturnType);
        }
        if (\count($functionCall->args) < 2) {
            return $fallbackReturnType;
        }
        $returnArgumentType = $scope->getType($functionCall->args[1]->value);
        if ((new \PHPStan\Type\Constant\ConstantBooleanType(\true))->isSuperTypeOf($returnArgumentType)->yes()) {
            return new \PHPStan\Type\StringType();
        }
        return $fallbackReturnType;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\NullType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
class ArrayKeyFirstDynamicReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'array_key_first';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        if (!isset($functionCall->args[0])) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        $argType = $scope->getType($functionCall->args[0]->value);
        $iterableAtLeastOnce = $argType->isIterableAtLeastOnce();
        if ($iterableAtLeastOnce->no()) {
            return new \PHPStan\Type\NullType();
        }
        $constantArrays = \PHPStan\Type\TypeUtils::getConstantArrays($argType);
        if (\count($constantArrays) > 0) {
            $keyTypes = [];
            foreach ($constantArrays as $constantArray) {
                $arrayKeyTypes = $constantArray->getKeyTypes();
                if (\count($arrayKeyTypes) === 0) {
                    $keyTypes[] = new \PHPStan\Type\NullType();
                    continue;
                }
                $keyTypes[] = $arrayKeyTypes[0];
            }
            return \PHPStan\Type\TypeCombinator::union(...$keyTypes);
        }
        $keyType = $argType->getIterableKeyType();
        if ($iterableAtLeastOnce->yes()) {
            return $keyType;
        }
        return \PHPStan\Type\TypeCombinator::union($keyType, new \PHPStan\Type\NullType());
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
class JsonThrowOnErrorDynamicReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    /** @var array<string, int> */
    private $argumentPositions = ['json_encode' => 1, 'json_decode' => 3];
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return \defined('JSON_THROW_ON_ERROR') && \in_array($functionReflection->getName(), ['json_encode', 'json_decode'], \true);
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        $argumentPosition = $this->argumentPositions[$functionReflection->getName()];
        $defaultReturnType = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        if (!isset($functionCall->args[$argumentPosition])) {
            return $defaultReturnType;
        }
        $valueType = $scope->getType($functionCall->args[$argumentPosition]->value);
        if (!$valueType instanceof \PHPStan\Type\Constant\ConstantIntegerType) {
            return $defaultReturnType;
        }
        $value = $valueType->getValue();
        if (($value & \JSON_THROW_ON_ERROR) !== \JSON_THROW_ON_ERROR) {
            return $defaultReturnType;
        }
        return \PHPStan\Type\TypeCombinator::remove($defaultReturnType, new \PHPStan\Type\Constant\ConstantBooleanType(\false));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
use PHPStan\Type\ObjectWithoutClassType;
class IsObjectFunctionTypeSpecifyingExtension implements \PHPStan\Type\FunctionTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return \strtolower($functionReflection->getName()) === 'is_object' && isset($node->args[0]) && !$context->null();
    }
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        if ($context->null()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $this->typeSpecifier->create($node->args[0]->value, new \PHPStan\Type\ObjectWithoutClassType(), $context);
    }
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\Accessory\HasOffsetType;
use PHPStan\Type\ArrayType;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
use PHPStan\Type\MixedType;
use PHPStan\Type\TypeCombinator;
class ArrayKeyExistsFunctionTypeSpecifyingExtension implements \PHPStan\Type\FunctionTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return $functionReflection->getName() === 'array_key_exists' && \count($node->args) >= 2 && !$context->null();
    }
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        $keyType = $scope->getType($node->args[0]->value);
        if ($context->truthy()) {
            $type = \PHPStan\Type\TypeCombinator::intersect(new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType()), new \PHPStan\Type\Accessory\HasOffsetType($keyType));
        } else {
            $type = new \PHPStan\Type\Accessory\HasOffsetType($keyType);
        }
        return $this->typeSpecifier->create($node->args[1]->value, $type, $context);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\ConstantScalarType;
use PHPStan\Type\DynamicFunctionReturnTypeExtension;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
class SprintfFunctionDynamicReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'sprintf';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        $values = [];
        $returnType = new \PHPStan\Type\StringType();
        foreach ($functionCall->args as $arg) {
            $argType = $scope->getType($arg->value);
            if (!$argType instanceof \PHPStan\Type\ConstantScalarType) {
                return $returnType;
            }
            $values[] = $argType->getValue();
        }
        try {
            $value = \sprintf(...$values);
        } catch (\Throwable $e) {
            return $returnType;
        }
        return $scope->getTypeFromValue($value);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
class ArrayPointerFunctionsDynamicReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    /** @var string[] */
    private $functions = ['reset', 'end'];
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return \in_array($functionReflection->getName(), $this->functions, \true);
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        if (\count($functionCall->args) === 0) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        $argType = $scope->getType($functionCall->args[0]->value);
        $iterableAtLeastOnce = $argType->isIterableAtLeastOnce();
        if ($iterableAtLeastOnce->no()) {
            return new \PHPStan\Type\Constant\ConstantBooleanType(\false);
        }
        $constantArrays = \PHPStan\Type\TypeUtils::getConstantArrays($argType);
        if (\count($constantArrays) > 0) {
            $keyTypes = [];
            foreach ($constantArrays as $constantArray) {
                $arrayKeyTypes = $constantArray->getKeyTypes();
                if (\count($arrayKeyTypes) === 0) {
                    $keyTypes[] = new \PHPStan\Type\Constant\ConstantBooleanType(\false);
                    continue;
                }
                $valueOffset = $functionReflection->getName() === 'reset' ? $arrayKeyTypes[0] : $arrayKeyTypes[\count($arrayKeyTypes) - 1];
                $keyTypes[] = $constantArray->getOffsetValueType($valueOffset);
            }
            return \PHPStan\Type\TypeCombinator::union(...$keyTypes);
        }
        $itemType = $argType->getIterableValueType();
        if ($iterableAtLeastOnce->yes()) {
            return $itemType;
        }
        return \PHPStan\Type\TypeCombinator::union($itemType, new \PHPStan\Type\Constant\ConstantBooleanType(\false));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
use PHPStan\Type\MixedType;
class DefinedConstantTypeSpecifyingExtension implements \PHPStan\Type\FunctionTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var TypeSpecifier */
    private $typeSpecifier;
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return $functionReflection->getName() === 'defined' && \count($node->args) >= 1 && !$context->null();
    }
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        $constantName = $scope->getType($node->args[0]->value);
        if (!$constantName instanceof \PHPStan\Type\Constant\ConstantStringType || $constantName->getValue() === '') {
            return new \PHPStan\Analyser\SpecifiedTypes([], []);
        }
        return $this->typeSpecifier->create(new \PhpParser\Node\Expr\ConstFetch(new \PhpParser\Node\Name\FullyQualified($constantName->getValue())), new \PHPStan\Type\MixedType(), $context);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\Accessory\HasPropertyType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
use PHPStan\Type\IntersectionType;
use PHPStan\Type\ObjectWithoutClassType;
class PropertyExistsTypeSpecifyingExtension implements \PHPStan\Type\FunctionTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var TypeSpecifier */
    private $typeSpecifier;
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return $functionReflection->getName() === 'property_exists' && $context->truthy() && \count($node->args) >= 2;
    }
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        $propertyNameType = $scope->getType($node->args[1]->value);
        if (!$propertyNameType instanceof \PHPStan\Type\Constant\ConstantStringType) {
            return new \PHPStan\Analyser\SpecifiedTypes([], []);
        }
        return $this->typeSpecifier->create($node->args[0]->value, new \PHPStan\Type\IntersectionType([new \PHPStan\Type\ObjectWithoutClassType(), new \PHPStan\Type\Accessory\HasPropertyType($propertyNameType->getValue())]), $context);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
use PHPStan\Type\IterableType;
use PHPStan\Type\MixedType;
class IsIterableFunctionTypeSpecifyingExtension implements \PHPStan\Type\FunctionTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return \strtolower($functionReflection->getName()) === 'is_iterable' && isset($node->args[0]) && !$context->null();
    }
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        if ($context->null()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $this->typeSpecifier->create($node->args[0]->value, new \PHPStan\Type\IterableType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType()), $context);
    }
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
use PHPStan\Type\UnionType;
class PathinfoFunctionDynamicReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'pathinfo';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        $argsCount = \count($functionCall->args);
        if ($argsCount === 0) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        } elseif ($argsCount === 1) {
            $stringType = new \PHPStan\Type\StringType();
            $dirname = new \PHPStan\Type\Constant\ConstantStringType('dirname');
            $basename = new \PHPStan\Type\Constant\ConstantStringType('basename');
            $extension = new \PHPStan\Type\Constant\ConstantStringType('extension');
            $filename = new \PHPStan\Type\Constant\ConstantStringType('filename');
            return new \PHPStan\Type\UnionType([new \PHPStan\Type\Constant\ConstantArrayType([$dirname, $basename, $filename], [$stringType, $stringType, $stringType]), new \PHPStan\Type\Constant\ConstantArrayType([$dirname, $basename, $extension, $filename], [$stringType, $stringType, $stringType, $stringType])]);
        }
        return new \PHPStan\Type\StringType();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PhpParser\Node\Expr\MethodCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Type\Constant\ConstantArrayTypeBuilder;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
class StatDynamicReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension, \PHPStan\Type\DynamicMethodReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return \in_array($functionReflection->getName(), ['stat', 'lstat', 'fstat', 'ssh2_sftp_stat'], \true);
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        return $this->getReturnType();
    }
    public function getClass() : string
    {
        return \SplFileObject::class;
    }
    public function isMethodSupported(\PHPStan\Reflection\MethodReflection $methodReflection) : bool
    {
        return $methodReflection->getName() === 'fstat';
    }
    public function getTypeFromMethodCall(\PHPStan\Reflection\MethodReflection $methodReflection, \PhpParser\Node\Expr\MethodCall $methodCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        return $this->getReturnType();
    }
    private function getReturnType() : \PHPStan\Type\Type
    {
        $valueType = new \PHPStan\Type\IntegerType();
        $builder = \PHPStan\Type\Constant\ConstantArrayTypeBuilder::createEmpty();
        $keys = ['dev', 'ino', 'mode', 'nlink', 'uid', 'gid', 'rdev', 'size', 'atime', 'mtime', 'ctime', 'blksize', 'blocks'];
        foreach ($keys as $key) {
            $builder->setOffsetValueType(null, $valueType);
        }
        foreach ($keys as $key) {
            $builder->setOffsetValueType(new \PHPStan\Type\Constant\ConstantStringType($key), $valueType);
        }
        return \PHPStan\Type\TypeCombinator::union($builder->getArray(), new \PHPStan\Type\Constant\ConstantBooleanType(\false));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
class DefineConstantTypeSpecifyingExtension implements \PHPStan\Type\FunctionTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var TypeSpecifier */
    private $typeSpecifier;
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return $functionReflection->getName() === 'define' && $context->null() && \count($node->args) >= 2;
    }
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        $constantName = $scope->getType($node->args[0]->value);
        if (!$constantName instanceof \PHPStan\Type\Constant\ConstantStringType || $constantName->getValue() === '') {
            return new \PHPStan\Analyser\SpecifiedTypes([], []);
        }
        return $this->typeSpecifier->create(new \PhpParser\Node\Expr\ConstFetch(new \PhpParser\Node\Name\FullyQualified($constantName->getValue())), $scope->getType($node->args[1]->value), \PHPStan\Analyser\TypeSpecifierContext::createTruthy());
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\ArrayType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
use PHPStan\Type\UnionType;
class ArrayKeysFunctionDynamicReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'array_keys';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        $arrayArg = $functionCall->args[0]->value ?? null;
        if ($arrayArg !== null) {
            $valueType = $scope->getType($arrayArg);
            if ($valueType instanceof \PHPStan\Type\ArrayType) {
                return $valueType->getKeysArray();
            }
        }
        return new \PHPStan\Type\ArrayType(new \PHPStan\Type\IntegerType(), new \PHPStan\Type\UnionType([new \PHPStan\Type\StringType(), new \PHPStan\Type\IntegerType()]));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\ArrayType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeUtils;
class ArgumentBasedFunctionReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    /** @var int[] */
    private $functionNames = ['array_unique' => 0, 'array_reverse' => 0, 'array_change_key_case' => 0, 'array_diff_assoc' => 0, 'array_diff_key' => 0, 'array_diff_uassoc' => 0, 'array_diff_ukey' => 0, 'array_diff' => 0, 'array_udiff_assoc' => 0, 'array_udiff_uassoc' => 0, 'array_udiff' => 0, 'array_intersect_assoc' => 0, 'array_intersect_key' => 0, 'array_intersect_uassoc' => 0, 'array_intersect_ukey' => 0, 'array_intersect' => 0, 'array_uintersect_assoc' => 0, 'array_uintersect_uassoc' => 0, 'array_uintersect' => 0];
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return isset($this->functionNames[$functionReflection->getName()]);
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        $argumentPosition = $this->functionNames[$functionReflection->getName()];
        if (!isset($functionCall->args[$argumentPosition])) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        $argument = $functionCall->args[$argumentPosition];
        $argumentType = $scope->getType($argument->value);
        $argumentKeyType = $argumentType->getIterableKeyType();
        $argumentValueType = $argumentType->getIterableValueType();
        if ($argument->unpack) {
            $argumentKeyType = \PHPStan\Type\TypeUtils::generalizeType($argumentKeyType);
            $argumentValueType = \PHPStan\Type\TypeUtils::generalizeType($argumentValueType->getIterableValueType());
        }
        return new \PHPStan\Type\ArrayType($argumentKeyType, $argumentValueType);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\ResourceType;
use PHPStan\Type\Type;
use PHPStan\Type\UnionType;
class CurlInitReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'curl_init';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        $argsCount = \count($functionCall->args);
        if ($argsCount === 0) {
            return new \PHPStan\Type\ResourceType();
        }
        return new \PHPStan\Type\UnionType([new \PHPStan\Type\ResourceType(), new \PHPStan\Type\Constant\ConstantBooleanType(\false)]);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\ArrayType;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
use PHPStan\Type\MixedType;
use PHPStan\Type\ObjectType;
use PHPStan\Type\UnionType;
class IsCountableFunctionTypeSpecifyingExtension implements \PHPStan\Type\FunctionTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return \strtolower($functionReflection->getName()) === 'is_countable' && isset($node->args[0]) && !$context->null();
    }
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        if ($context->null()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $this->typeSpecifier->create($node->args[0]->value, new \PHPStan\Type\UnionType([new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType()), new \PHPStan\Type\ObjectType(\Countable::class)]), $context);
    }
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\NullType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
class ArrayShiftFunctionReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'array_shift';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        if (!isset($functionCall->args[0])) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        $argType = $scope->getType($functionCall->args[0]->value);
        $iterableAtLeastOnce = $argType->isIterableAtLeastOnce();
        if ($iterableAtLeastOnce->no()) {
            return new \PHPStan\Type\NullType();
        }
        $constantArrays = \PHPStan\Type\TypeUtils::getConstantArrays($argType);
        if (\count($constantArrays) > 0) {
            $valueTypes = [];
            foreach ($constantArrays as $constantArray) {
                $arrayKeyTypes = $constantArray->getKeyTypes();
                if (\count($arrayKeyTypes) === 0) {
                    $valueTypes[] = new \PHPStan\Type\NullType();
                    continue;
                }
                $valueTypes[] = $constantArray->getOffsetValueType($arrayKeyTypes[0]);
            }
            return \PHPStan\Type\TypeCombinator::union(...$valueTypes);
        }
        $itemType = $argType->getIterableValueType();
        if ($iterableAtLeastOnce->yes()) {
            return $itemType;
        }
        return \PHPStan\Type\TypeCombinator::union($itemType, new \PHPStan\Type\NullType());
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\ArrayType;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\MixedType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeUtils;
class ExplodeFunctionDynamicReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'explode';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        if (\count($functionCall->args) < 2) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        $delimiterType = $scope->getType($functionCall->args[0]->value);
        $isSuperset = (new \PHPStan\Type\Constant\ConstantStringType(''))->isSuperTypeOf($delimiterType);
        if ($isSuperset->yes()) {
            return new \PHPStan\Type\Constant\ConstantBooleanType(\false);
        } elseif ($isSuperset->no()) {
            return new \PHPStan\Type\ArrayType(new \PHPStan\Type\IntegerType(), new \PHPStan\Type\StringType());
        }
        $returnType = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        if ($delimiterType instanceof \PHPStan\Type\MixedType) {
            return \PHPStan\Type\TypeUtils::toBenevolentUnion($returnType);
        }
        return $returnType;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\FloatType;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
class IsFloatFunctionTypeSpecifyingExtension implements \PHPStan\Type\FunctionTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return \in_array(\strtolower($functionReflection->getName()), ['is_float', 'is_double', 'is_real'], \true) && isset($node->args[0]) && !$context->null();
    }
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        if ($context->null()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $this->typeSpecifier->create($node->args[0]->value, new \PHPStan\Type\FloatType(), $context);
    }
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\Accessory\NonEmptyArrayType;
use PHPStan\Type\ArrayType;
use PHPStan\Type\Constant\ConstantArrayTypeBuilder;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\IntersectionType;
use PHPStan\Type\Type;
class ArrayFillFunctionReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    private const MAX_SIZE_USE_CONSTANT_ARRAY = 100;
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'array_fill';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        if (\count($functionCall->args) < 3) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        $startIndexType = $scope->getType($functionCall->args[0]->value);
        $numberType = $scope->getType($functionCall->args[1]->value);
        $valueType = $scope->getType($functionCall->args[2]->value);
        if ($startIndexType instanceof \PHPStan\Type\Constant\ConstantIntegerType && $numberType instanceof \PHPStan\Type\Constant\ConstantIntegerType && $numberType->getValue() <= static::MAX_SIZE_USE_CONSTANT_ARRAY) {
            $arrayBuilder = \PHPStan\Type\Constant\ConstantArrayTypeBuilder::createEmpty();
            $nextIndex = $startIndexType->getValue();
            for ($i = 0; $i < $numberType->getValue(); $i++) {
                $arrayBuilder->setOffsetValueType(new \PHPStan\Type\Constant\ConstantIntegerType($nextIndex), $valueType);
                if ($nextIndex < 0) {
                    $nextIndex = 0;
                } else {
                    $nextIndex++;
                }
            }
            return $arrayBuilder->getArray();
        }
        if ($numberType instanceof \PHPStan\Type\Constant\ConstantIntegerType && $numberType->getValue() > 0) {
            return new \PHPStan\Type\IntersectionType([new \PHPStan\Type\ArrayType(new \PHPStan\Type\IntegerType(), $valueType), new \PHPStan\Type\Accessory\NonEmptyArrayType()]);
        }
        return new \PHPStan\Type\ArrayType(new \PHPStan\Type\IntegerType(), $valueType);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\ArrayType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
use PHPStan\Type\UnionType;
class ArrayMergeFunctionDynamicReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'array_merge';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        if (!isset($functionCall->args[0])) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        $keyTypes = [];
        $valueTypes = [];
        foreach ($functionCall->args as $arg) {
            $argType = $scope->getType($arg->value);
            if ($arg->unpack) {
                $argType = $argType->getIterableValueType();
                if ($argType instanceof \PHPStan\Type\UnionType) {
                    foreach ($argType->getTypes() as $innerType) {
                        $argType = $innerType;
                    }
                }
            }
            $keyTypes[] = \PHPStan\Type\TypeUtils::generalizeType($argType->getIterableKeyType());
            $valueTypes[] = $argType->getIterableValueType();
        }
        return new \PHPStan\Type\ArrayType(\PHPStan\Type\TypeCombinator::union(...$keyTypes), \PHPStan\Type\TypeCombinator::union(...$valueTypes));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\BooleanType;
use PHPStan\Type\FloatType;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
use PHPStan\Type\IntegerType;
use PHPStan\Type\StringType;
use PHPStan\Type\UnionType;
class IsScalarFunctionTypeSpecifyingExtension implements \PHPStan\Type\FunctionTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return $functionReflection->getName() === 'is_scalar' && isset($node->args[0]) && !$context->null();
    }
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        if ($context->null()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $this->typeSpecifier->create($node->args[0]->value, new \PHPStan\Type\UnionType([new \PHPStan\Type\StringType(), new \PHPStan\Type\IntegerType(), new \PHPStan\Type\FloatType(), new \PHPStan\Type\BooleanType()]), $context);
    }
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\NullType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
class ArrayReduceFunctionReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'array_reduce';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        if (!isset($functionCall->args[1])) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        $callbackType = $scope->getType($functionCall->args[1]->value);
        if ($callbackType->isCallable()->no()) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        $callbackReturnType = \PHPStan\Reflection\ParametersAcceptorSelector::selectFromArgs($scope, $functionCall->args, $callbackType->getCallableParametersAcceptors($scope))->getReturnType();
        if (isset($functionCall->args[2])) {
            $initialType = $scope->getType($functionCall->args[2]->value);
        } else {
            $initialType = new \PHPStan\Type\NullType();
        }
        $arraysType = $scope->getType($functionCall->args[0]->value);
        $constantArrays = \PHPStan\Type\TypeUtils::getConstantArrays($arraysType);
        if (\count($constantArrays) > 0) {
            $onlyEmpty = \true;
            $onlyNonEmpty = \true;
            foreach ($constantArrays as $constantArray) {
                $isEmpty = \count($constantArray->getValueTypes()) === 0;
                $onlyEmpty = $onlyEmpty && $isEmpty;
                $onlyNonEmpty = $onlyNonEmpty && !$isEmpty;
            }
            if ($onlyEmpty) {
                return $initialType;
            }
            if ($onlyNonEmpty) {
                return $callbackReturnType;
            }
        }
        return \PHPStan\Type\TypeCombinator::union($callbackReturnType, $initialType);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\ArrayType;
use PHPStan\Type\Constant\ConstantArrayTypeBuilder;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
class ArrayMapFunctionReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'array_map';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        if (\count($functionCall->args) < 2) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        $valueType = new \PHPStan\Type\MixedType();
        $callableType = $scope->getType($functionCall->args[0]->value);
        if (!$callableType->isCallable()->no()) {
            $valueType = \PHPStan\Reflection\ParametersAcceptorSelector::selectFromArgs($scope, $functionCall->args, $callableType->getCallableParametersAcceptors($scope))->getReturnType();
        }
        $arrayType = $scope->getType($functionCall->args[1]->value);
        $constantArrays = \PHPStan\Type\TypeUtils::getConstantArrays($arrayType);
        if (\count($constantArrays) > 0) {
            $arrayTypes = [];
            foreach ($constantArrays as $constantArray) {
                $returnedArrayBuilder = \PHPStan\Type\Constant\ConstantArrayTypeBuilder::createEmpty();
                foreach ($constantArray->getKeyTypes() as $keyType) {
                    $returnedArrayBuilder->setOffsetValueType($keyType, $valueType);
                }
                $arrayTypes[] = $returnedArrayBuilder->getArray();
            }
            return \PHPStan\Type\TypeCombinator::union(...$arrayTypes);
        } elseif ($arrayType instanceof \PHPStan\Type\ArrayType) {
            return new \PHPStan\Type\ArrayType($arrayType->getIterableKeyType(), $valueType);
        }
        return new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), $valueType);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\ArrayType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
class ArrayValuesFunctionDynamicReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'array_values';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        $arrayArg = $functionCall->args[0]->value ?? null;
        if ($arrayArg !== null) {
            $valueType = $scope->getType($arrayArg);
            if ($valueType instanceof \PHPStan\Type\ArrayType) {
                return $valueType->getValuesArray();
            }
        }
        return new \PHPStan\Type\ArrayType(new \PHPStan\Type\IntegerType(), new \PHPStan\Type\MixedType());
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\ArrayType;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantFloatType;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\FloatType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
use PHPStan\Type\UnionType;
class RangeFunctionReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    private const RANGE_LENGTH_THRESHOLD = 50;
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'range';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        if (\count($functionCall->args) < 2) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        $startType = $scope->getType($functionCall->args[0]->value);
        $endType = $scope->getType($functionCall->args[1]->value);
        $stepType = \count($functionCall->args) >= 3 ? $scope->getType($functionCall->args[2]->value) : new \PHPStan\Type\Constant\ConstantIntegerType(1);
        $constantReturnTypes = [];
        $startConstants = \PHPStan\Type\TypeUtils::getConstantScalars($startType);
        foreach ($startConstants as $startConstant) {
            if (!$startConstant instanceof \PHPStan\Type\Constant\ConstantIntegerType && !$startConstant instanceof \PHPStan\Type\Constant\ConstantFloatType) {
                continue;
            }
            $endConstants = \PHPStan\Type\TypeUtils::getConstantScalars($endType);
            foreach ($endConstants as $endConstant) {
                if (!$endConstant instanceof \PHPStan\Type\Constant\ConstantIntegerType && !$endConstant instanceof \PHPStan\Type\Constant\ConstantFloatType) {
                    continue;
                }
                $stepConstants = \PHPStan\Type\TypeUtils::getConstantScalars($stepType);
                foreach ($stepConstants as $stepConstant) {
                    if (!$stepConstant instanceof \PHPStan\Type\Constant\ConstantIntegerType && !$stepConstant instanceof \PHPStan\Type\Constant\ConstantFloatType) {
                        continue;
                    }
                    $rangeLength = (int) \ceil(\abs($startConstant->getValue() - $endConstant->getValue()) / $stepConstant->getValue()) + 1;
                    if ($rangeLength > self::RANGE_LENGTH_THRESHOLD) {
                        continue;
                    }
                    $keyTypes = [];
                    $valueTypes = [];
                    $rangeValues = \range($startConstant->getValue(), $endConstant->getValue(), $stepConstant->getValue());
                    foreach ($rangeValues as $key => $value) {
                        $keyTypes[] = new \PHPStan\Type\Constant\ConstantIntegerType($key);
                        $valueTypes[] = $scope->getTypeFromValue($value);
                    }
                    $constantReturnTypes[] = new \PHPStan\Type\Constant\ConstantArrayType($keyTypes, $valueTypes, $rangeLength);
                }
            }
        }
        if (\count($constantReturnTypes) > 0) {
            return \PHPStan\Type\TypeCombinator::union(...$constantReturnTypes);
        }
        $startType = \PHPStan\Type\TypeUtils::generalizeType($startType);
        $endType = \PHPStan\Type\TypeUtils::generalizeType($endType);
        $stepType = \PHPStan\Type\TypeUtils::generalizeType($stepType);
        if ($startType instanceof \PHPStan\Type\IntegerType && $endType instanceof \PHPStan\Type\IntegerType && $stepType instanceof \PHPStan\Type\IntegerType) {
            return new \PHPStan\Type\ArrayType(new \PHPStan\Type\IntegerType(), new \PHPStan\Type\IntegerType());
        }
        if ($startType instanceof \PHPStan\Type\FloatType || $endType instanceof \PHPStan\Type\FloatType || $stepType instanceof \PHPStan\Type\FloatType) {
            return new \PHPStan\Type\ArrayType(new \PHPStan\Type\IntegerType(), new \PHPStan\Type\FloatType());
        }
        return new \PHPStan\Type\ArrayType(new \PHPStan\Type\IntegerType(), new \PHPStan\Type\UnionType([new \PHPStan\Type\IntegerType(), new \PHPStan\Type\FloatType()]));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\ConstFetch;
use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\BooleanType;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\DynamicFunctionReturnTypeExtension;
use PHPStan\Type\FloatType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\MixedType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
use PHPStan\Type\UnionType;
class FilterVarDynamicReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    /** @var array<string, Type> */
    private $filterTypesHashMaps;
    public function __construct()
    {
        $booleanType = new \PHPStan\Type\BooleanType();
        $floatOrFalseType = new \PHPStan\Type\UnionType([new \PHPStan\Type\FloatType(), new \PHPStan\Type\Constant\ConstantBooleanType(\false)]);
        $intOrFalseType = new \PHPStan\Type\UnionType([new \PHPStan\Type\IntegerType(), new \PHPStan\Type\Constant\ConstantBooleanType(\false)]);
        $stringOrFalseType = new \PHPStan\Type\UnionType([new \PHPStan\Type\StringType(), new \PHPStan\Type\Constant\ConstantBooleanType(\false)]);
        $this->filterTypesHashMaps = ['FILTER_SANITIZE_EMAIL' => $stringOrFalseType, 'FILTER_SANITIZE_ENCODED' => $stringOrFalseType, 'FILTER_SANITIZE_MAGIC_QUOTES' => $stringOrFalseType, 'FILTER_SANITIZE_NUMBER_FLOAT' => $stringOrFalseType, 'FILTER_SANITIZE_NUMBER_INT' => $stringOrFalseType, 'FILTER_SANITIZE_SPECIAL_CHARS' => $stringOrFalseType, 'FILTER_SANITIZE_STRING' => $stringOrFalseType, 'FILTER_SANITIZE_URL' => $stringOrFalseType, 'FILTER_VALIDATE_BOOLEAN' => $booleanType, 'FILTER_VALIDATE_EMAIL' => $stringOrFalseType, 'FILTER_VALIDATE_FLOAT' => $floatOrFalseType, 'FILTER_VALIDATE_INT' => $intOrFalseType, 'FILTER_VALIDATE_IP' => $stringOrFalseType, 'FILTER_VALIDATE_MAC' => $stringOrFalseType, 'FILTER_VALIDATE_REGEXP' => $stringOrFalseType, 'FILTER_VALIDATE_URL' => $stringOrFalseType];
    }
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return \strtolower($functionReflection->getName()) === 'filter_var';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        $mixedType = new \PHPStan\Type\MixedType();
        $filterArg = $functionCall->args[1] ?? null;
        if ($filterArg === null) {
            return $mixedType;
        }
        $filterExpr = $filterArg->value;
        if (!$filterExpr instanceof \PhpParser\Node\Expr\ConstFetch) {
            return $mixedType;
        }
        $filterName = (string) $filterExpr->name;
        return $this->filterTypesHashMaps[$filterName] ?? $mixedType;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
use PHPStan\Type\NullType;
class IsNullFunctionTypeSpecifyingExtension implements \PHPStan\Type\FunctionTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return \strtolower($functionReflection->getName()) === 'is_null' && isset($node->args[0]) && !$context->null();
    }
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        if ($context->null()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $this->typeSpecifier->create($node->args[0]->value, new \PHPStan\Type\NullType(), $context);
    }
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\ArrayType;
use PHPStan\Type\Constant\ConstantArrayTypeBuilder;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
class ArrayFillKeysFunctionReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'array_fill_keys';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        if (\count($functionCall->args) < 2) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        $valueType = $scope->getType($functionCall->args[1]->value);
        $keysType = $scope->getType($functionCall->args[0]->value);
        $constantArrays = \PHPStan\Type\TypeUtils::getConstantArrays($keysType);
        if (\count($constantArrays) === 0) {
            return new \PHPStan\Type\ArrayType($keysType->getIterableValueType(), $valueType);
        }
        $arrayTypes = [];
        foreach ($constantArrays as $constantArray) {
            $arrayBuilder = \PHPStan\Type\Constant\ConstantArrayTypeBuilder::createEmpty();
            foreach ($constantArray->getValueTypes() as $keyType) {
                $arrayBuilder->setOffsetValueType($keyType, $valueType);
            }
            $arrayTypes[] = $arrayBuilder->getArray();
        }
        return \PHPStan\Type\TypeCombinator::union(...$arrayTypes);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\NullType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
class ArrayKeyDynamicReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'key';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        if (!isset($functionCall->args[0])) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        $argType = $scope->getType($functionCall->args[0]->value);
        $iterableAtLeastOnce = $argType->isIterableAtLeastOnce();
        if ($iterableAtLeastOnce->no()) {
            return new \PHPStan\Type\NullType();
        }
        $keyType = $argType->getIterableKeyType();
        if ($iterableAtLeastOnce->yes()) {
            return $keyType;
        }
        return \PHPStan\Type\TypeCombinator::union($keyType, new \PHPStan\Type\NullType());
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\BooleanType;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
class IsBoolFunctionTypeSpecifyingExtension implements \PHPStan\Type\FunctionTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return \strtolower($functionReflection->getName()) === 'is_bool' && isset($node->args[0]) && !$context->null();
    }
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        if ($context->null()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $this->typeSpecifier->create($node->args[0]->value, new \PHPStan\Type\BooleanType(), $context);
    }
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\ArrayType;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\ConstantScalarType;
use PHPStan\Type\ConstantType;
use PHPStan\Type\ErrorType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\UnionType;
class MinMaxFunctionReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    /** @var string[] */
    private $functionNames = ['min' => '', 'max' => ''];
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return isset($this->functionNames[$functionReflection->getName()]);
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        if (!isset($functionCall->args[0])) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        if (\count($functionCall->args) === 1) {
            $argType = $scope->getType($functionCall->args[0]->value);
            if ($argType instanceof \PHPStan\Type\ArrayType) {
                $iterableValueType = $argType->getIterableValueType();
                $argumentTypes = [];
                if ($iterableValueType instanceof \PHPStan\Type\UnionType) {
                    foreach ($iterableValueType->getTypes() as $innerType) {
                        $argumentTypes[] = $innerType;
                    }
                } else {
                    $argumentTypes[] = $iterableValueType;
                }
                return $this->processType($functionReflection->getName(), $argumentTypes);
            }
            return new \PHPStan\Type\ErrorType();
        }
        $argumentTypes = [];
        foreach ($functionCall->args as $arg) {
            $argType = $scope->getType($arg->value);
            if ($arg->unpack) {
                $iterableValueType = $argType->getIterableValueType();
                if ($iterableValueType instanceof \PHPStan\Type\UnionType) {
                    foreach ($iterableValueType->getTypes() as $innerType) {
                        $argumentTypes[] = $innerType;
                    }
                } else {
                    $argumentTypes[] = $iterableValueType;
                }
                continue;
            }
            $argumentTypes[] = $argType;
        }
        return $this->processType($functionReflection->getName(), $argumentTypes);
    }
    /**
     * @param string $functionName
     * @param \PHPStan\Type\Type[] $types
     * @return Type
     */
    private function processType(string $functionName, array $types) : \PHPStan\Type\Type
    {
        $resultType = null;
        foreach ($types as $type) {
            if (!$type instanceof \PHPStan\Type\ConstantType) {
                return \PHPStan\Type\TypeCombinator::union(...$types);
            }
            if ($resultType === null) {
                $resultType = $type;
                continue;
            }
            $compareResult = $this->compareTypes($resultType, $type);
            if ($functionName === 'min') {
                if ($compareResult === $type) {
                    $resultType = $type;
                }
            } elseif ($functionName === 'max') {
                if ($compareResult === $resultType) {
                    $resultType = $type;
                }
            }
        }
        if ($resultType === null) {
            return new \PHPStan\Type\ErrorType();
        }
        return $resultType;
    }
    private function compareTypes(\PHPStan\Type\Type $firstType, \PHPStan\Type\Type $secondType) : ?\PHPStan\Type\Type
    {
        if ($firstType instanceof \PHPStan\Type\Constant\ConstantArrayType && $secondType instanceof \PHPStan\Type\ConstantScalarType) {
            return $secondType;
        }
        if ($firstType instanceof \PHPStan\Type\ConstantScalarType && $secondType instanceof \PHPStan\Type\Constant\ConstantArrayType) {
            return $firstType;
        }
        if ($firstType instanceof \PHPStan\Type\Constant\ConstantArrayType && $secondType instanceof \PHPStan\Type\Constant\ConstantArrayType) {
            if ($secondType->count() < $firstType->count()) {
                return $secondType;
            } elseif ($firstType->count() < $secondType->count()) {
                return $firstType;
            }
            foreach ($firstType->getValueTypes() as $i => $firstValueType) {
                $secondValueType = $secondType->getValueTypes()[$i];
                $compareResult = $this->compareTypes($firstValueType, $secondValueType);
                if ($compareResult === $firstValueType) {
                    return $firstType;
                }
                if ($compareResult === $secondValueType) {
                    return $secondType;
                }
            }
            return null;
        }
        if ($firstType instanceof \PHPStan\Type\ConstantScalarType && $secondType instanceof \PHPStan\Type\ConstantScalarType) {
            if ($secondType->getValue() < $firstType->getValue()) {
                return $secondType;
            }
            if ($firstType->getValue() < $secondType->getValue()) {
                return $firstType;
            }
        }
        return null;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantArrayTypeBuilder;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\ConstantType;
use PHPStan\Type\DynamicFunctionReturnTypeExtension;
use PHPStan\Type\IntegerType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
final class ParseUrlFunctionDynamicReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    /** @var array<int,Type> */
    private $componentTypesPairedConstants;
    /** @var array<string,Type> */
    private $componentTypesPairedStrings;
    /** @var Type */
    private $allComponentsTogetherType;
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'parse_url';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        $defaultReturnType = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        if (\count($functionCall->args) < 1) {
            return $defaultReturnType;
        }
        $this->cacheReturnTypes();
        $urlType = $scope->getType($functionCall->args[0]->value);
        if (\count($functionCall->args) > 1) {
            $componentType = $scope->getType($functionCall->args[1]->value);
            if (!$componentType instanceof \PHPStan\Type\ConstantType) {
                return $this->createAllComponentsReturnType();
            }
            $componentType = $componentType->toInteger();
            if (!$componentType instanceof \PHPStan\Type\Constant\ConstantIntegerType) {
                throw new \PHPStan\ShouldNotHappenException();
            }
        } else {
            $componentType = new \PHPStan\Type\Constant\ConstantIntegerType(-1);
        }
        if ($urlType instanceof \PHPStan\Type\Constant\ConstantStringType) {
            $result = @\parse_url($urlType->getValue(), $componentType->getValue());
            return $scope->getTypeFromValue($result);
        }
        if ($componentType->getValue() === -1) {
            return $this->createAllComponentsReturnType();
        }
        return $this->componentTypesPairedConstants[$componentType->getValue()] ?? new \PHPStan\Type\Constant\ConstantBooleanType(\false);
    }
    private function createAllComponentsReturnType() : \PHPStan\Type\Type
    {
        if ($this->allComponentsTogetherType === null) {
            $returnTypes = [new \PHPStan\Type\Constant\ConstantBooleanType(\false), new \PHPStan\Type\Constant\ConstantArrayType([], [])];
            $builder = \PHPStan\Type\Constant\ConstantArrayTypeBuilder::createEmpty();
            foreach ($this->componentTypesPairedStrings as $componentName => $componentValueType) {
                $builder->setOffsetValueType(new \PHPStan\Type\Constant\ConstantStringType($componentName), $componentValueType);
            }
            $returnTypes[] = $builder->getArray();
            $this->allComponentsTogetherType = \PHPStan\Type\TypeCombinator::union(...$returnTypes);
        }
        return $this->allComponentsTogetherType;
    }
    private function cacheReturnTypes() : void
    {
        if ($this->componentTypesPairedConstants !== null) {
            return;
        }
        $string = new \PHPStan\Type\StringType();
        $integer = new \PHPStan\Type\IntegerType();
        $stringOrNull = \PHPStan\Type\TypeCombinator::addNull($string);
        $integerOrNull = \PHPStan\Type\TypeCombinator::addNull($integer);
        $this->componentTypesPairedConstants = [\PHP_URL_SCHEME => $stringOrNull, \PHP_URL_HOST => $stringOrNull, \PHP_URL_PORT => $integerOrNull, \PHP_URL_USER => $stringOrNull, \PHP_URL_PASS => $stringOrNull, \PHP_URL_PATH => $stringOrNull, \PHP_URL_QUERY => $stringOrNull, \PHP_URL_FRAGMENT => $stringOrNull];
        $this->componentTypesPairedStrings = ['scheme' => $string, 'host' => $string, 'port' => $integer, 'user' => $string, 'pass' => $string, 'path' => $string, 'query' => $string, 'fragment' => $string];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\BenevolentUnionType;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\FloatType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
use PHPStan\Type\UnionType;
class GettimeofdayDynamicFunctionReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'gettimeofday';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        $arrayType = new \PHPStan\Type\Constant\ConstantArrayType([new \PHPStan\Type\Constant\ConstantStringType('sec'), new \PHPStan\Type\Constant\ConstantStringType('usec'), new \PHPStan\Type\Constant\ConstantStringType('minuteswest'), new \PHPStan\Type\Constant\ConstantStringType('dsttime')], [new \PHPStan\Type\IntegerType(), new \PHPStan\Type\IntegerType(), new \PHPStan\Type\IntegerType(), new \PHPStan\Type\IntegerType()]);
        $floatType = new \PHPStan\Type\FloatType();
        if (!isset($functionCall->args[0])) {
            return $arrayType;
        }
        $argType = $scope->getType($functionCall->args[0]->value);
        $isTrueType = (new \PHPStan\Type\Constant\ConstantBooleanType(\true))->isSuperTypeOf($argType);
        $isFalseType = (new \PHPStan\Type\Constant\ConstantBooleanType(\false))->isSuperTypeOf($argType);
        $compareTypes = $isTrueType->compareTo($isFalseType);
        if ($compareTypes === $isTrueType) {
            return $floatType;
        }
        if ($compareTypes === $isFalseType) {
            return $arrayType;
        }
        if ($argType instanceof \PHPStan\Type\MixedType) {
            return new \PHPStan\Type\BenevolentUnionType([$arrayType, $floatType]);
        }
        return new \PHPStan\Type\UnionType([$arrayType, $floatType]);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\FloatType;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
use PHPStan\Type\IntegerType;
use PHPStan\Type\StringType;
use PHPStan\Type\UnionType;
class IsNumericFunctionTypeSpecifyingExtension implements \PHPStan\Type\FunctionTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return $functionReflection->getName() === 'is_numeric' && isset($node->args[0]) && !$context->null();
    }
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        if ($context->null()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        $numericTypes = [new \PHPStan\Type\IntegerType(), new \PHPStan\Type\FloatType()];
        if ($context->truthy()) {
            $numericTypes[] = new \PHPStan\Type\StringType();
        }
        return $this->typeSpecifier->create($node->args[0]->value, new \PHPStan\Type\UnionType($numericTypes), $context);
    }
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\ArrayType;
use PHPStan\Type\DynamicFunctionReturnTypeExtension;
use PHPStan\Type\MixedType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
class ReplaceFunctionsDynamicReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    /** @var array<string, int> */
    private $functions = ['preg_replace' => 2, 'preg_replace_callback' => 2, 'preg_replace_callback_array' => 1, 'str_replace' => 2, 'str_ireplace' => 2, 'substr_replace' => 0];
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return \array_key_exists($functionReflection->getName(), $this->functions);
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        $type = $this->getPreliminarilyResolvedTypeFromFunctionCall($functionReflection, $functionCall, $scope);
        $possibleTypes = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        if (\PHPStan\Type\TypeCombinator::containsNull($possibleTypes)) {
            $type = \PHPStan\Type\TypeCombinator::addNull($type);
        }
        return $type;
    }
    private function getPreliminarilyResolvedTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        $argumentPosition = $this->functions[$functionReflection->getName()];
        if (\count($functionCall->args) <= $argumentPosition) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        $subjectArgumentType = $scope->getType($functionCall->args[$argumentPosition]->value);
        $defaultReturnType = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        if ($subjectArgumentType instanceof \PHPStan\Type\MixedType) {
            return \PHPStan\Type\TypeUtils::toBenevolentUnion($defaultReturnType);
        }
        $stringType = new \PHPStan\Type\StringType();
        $arrayType = new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType());
        $isStringSuperType = $stringType->isSuperTypeOf($subjectArgumentType);
        $isArraySuperType = $arrayType->isSuperTypeOf($subjectArgumentType);
        $compareSuperTypes = $isStringSuperType->compareTo($isArraySuperType);
        if ($compareSuperTypes === $isStringSuperType) {
            return $stringType;
        } elseif ($compareSuperTypes === $isArraySuperType) {
            if ($subjectArgumentType instanceof \PHPStan\Type\ArrayType) {
                return $subjectArgumentType->generalizeValues();
            }
            return $subjectArgumentType;
        }
        return $defaultReturnType;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\ArrayType;
use PHPStan\Type\BenevolentUnionType;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\ConstantScalarType;
use PHPStan\Type\DynamicFunctionReturnTypeExtension;
use PHPStan\Type\IntersectionType;
use PHPStan\Type\MixedType;
use PHPStan\Type\NullType;
use PHPStan\Type\ObjectWithoutClassType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\UnionType;
final class ArraySearchFunctionDynamicReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'array_search';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        $argsCount = \count($functionCall->args);
        if ($argsCount < 2) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        $haystackArgType = $scope->getType($functionCall->args[1]->value);
        $haystackIsArray = (new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType()))->isSuperTypeOf($haystackArgType);
        if ($haystackIsArray->no()) {
            return new \PHPStan\Type\NullType();
        }
        if ($argsCount < 3) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        $strictArgType = $scope->getType($functionCall->args[2]->value);
        if (!$strictArgType instanceof \PHPStan\Type\Constant\ConstantBooleanType || $strictArgType->getValue() === \false) {
            return \PHPStan\Type\TypeCombinator::union($haystackArgType->getIterableKeyType(), new \PHPStan\Type\Constant\ConstantBooleanType(\false), new \PHPStan\Type\NullType());
        }
        $needleArgType = $scope->getType($functionCall->args[0]->value);
        if ($haystackArgType->getIterableValueType()->isSuperTypeOf($needleArgType)->no()) {
            return new \PHPStan\Type\Constant\ConstantBooleanType(\false);
        }
        $typesFromConstantArrays = [];
        if ($haystackIsArray->maybe()) {
            $typesFromConstantArrays[] = new \PHPStan\Type\NullType();
        }
        $haystackArrays = $this->pickArrays($haystackArgType);
        if (\count($haystackArrays) === 0) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        $arrays = [];
        $typesFromConstantArraysCount = 0;
        foreach ($haystackArrays as $haystackArray) {
            if (!$haystackArray instanceof \PHPStan\Type\Constant\ConstantArrayType) {
                $arrays[] = $haystackArray;
                continue;
            }
            $typesFromConstantArrays[] = $this->resolveTypeFromConstantHaystackAndNeedle($needleArgType, $haystackArray);
            $typesFromConstantArraysCount++;
        }
        if ($typesFromConstantArraysCount > 0 && \count($haystackArrays) === $typesFromConstantArraysCount) {
            return \PHPStan\Type\TypeCombinator::union(...$typesFromConstantArrays);
        }
        $iterableKeyType = \PHPStan\Type\TypeCombinator::union(...$arrays)->getIterableKeyType();
        if ($iterableKeyType instanceof \PHPStan\Type\BenevolentUnionType) {
            $iterableKeyType = new \PHPStan\Type\MixedType();
        }
        return \PHPStan\Type\TypeCombinator::union($iterableKeyType, new \PHPStan\Type\Constant\ConstantBooleanType(\false), ...$typesFromConstantArrays);
    }
    private function resolveTypeFromConstantHaystackAndNeedle(\PHPStan\Type\Type $needle, \PHPStan\Type\Constant\ConstantArrayType $haystack) : \PHPStan\Type\Type
    {
        $matchesByType = [];
        foreach ($haystack->getValueTypes() as $index => $valueType) {
            $isNeedleSuperType = $valueType->isSuperTypeOf($needle);
            if ($isNeedleSuperType->no()) {
                $matchesByType[] = new \PHPStan\Type\Constant\ConstantBooleanType(\false);
                continue;
            }
            if ($needle instanceof \PHPStan\Type\ConstantScalarType && $valueType instanceof \PHPStan\Type\ConstantScalarType && $needle->getValue() === $valueType->getValue()) {
                return $haystack->getKeyTypes()[$index];
            }
            $matchesByType[] = $haystack->getKeyTypes()[$index];
            if (!$isNeedleSuperType->maybe()) {
                continue;
            }
            $matchesByType[] = new \PHPStan\Type\Constant\ConstantBooleanType(\false);
        }
        if (\count($matchesByType) > 0) {
            if ($haystack->getIterableValueType()->accepts($needle, \true)->yes() && $needle->isSuperTypeOf(new \PHPStan\Type\ObjectWithoutClassType())->no()) {
                return \PHPStan\Type\TypeCombinator::union(...$matchesByType);
            }
            return \PHPStan\Type\TypeCombinator::union(new \PHPStan\Type\Constant\ConstantBooleanType(\false), ...$matchesByType);
        }
        return new \PHPStan\Type\Constant\ConstantBooleanType(\false);
    }
    /**
     * @param Type $type
     * @return Type[]
     */
    private function pickArrays(\PHPStan\Type\Type $type) : array
    {
        if ($type instanceof \PHPStan\Type\ArrayType) {
            return [$type];
        }
        if ($type instanceof \PHPStan\Type\UnionType || $type instanceof \PHPStan\Type\IntersectionType) {
            $arrayTypes = [];
            foreach ($type->getTypes() as $innerType) {
                if (!$innerType instanceof \PHPStan\Type\ArrayType) {
                    continue;
                }
                $arrayTypes[] = $innerType;
            }
            return $arrayTypes;
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\CallableType;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
class IsCallableFunctionTypeSpecifyingExtension implements \PHPStan\Type\FunctionTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return \strtolower($functionReflection->getName()) === 'is_callable' && isset($node->args[0]) && !$context->null();
    }
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        if ($context->null()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $this->typeSpecifier->create($node->args[0]->value, new \PHPStan\Type\CallableType(), $context);
    }
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\ArrayType;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\DynamicFunctionReturnTypeExtension;
use PHPStan\Type\IntegerType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
final class StrSplitFunctionReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'str_split';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        $defaultReturnType = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        if (\count($functionCall->args) < 1) {
            return $defaultReturnType;
        }
        $splitLength = 1;
        if (\count($functionCall->args) >= 2) {
            $splitLengthType = $scope->getType($functionCall->args[1]->value);
            if (!$splitLengthType instanceof \PHPStan\Type\Constant\ConstantIntegerType) {
                return $defaultReturnType;
            }
            $splitLength = $splitLengthType->getValue();
            if ($splitLength < 1) {
                return new \PHPStan\Type\Constant\ConstantBooleanType(\false);
            }
        }
        $stringType = $scope->getType($functionCall->args[0]->value);
        if (!$stringType instanceof \PHPStan\Type\Constant\ConstantStringType) {
            return new \PHPStan\Type\ArrayType(new \PHPStan\Type\IntegerType(), new \PHPStan\Type\StringType());
        }
        $stringValue = $stringType->getValue();
        $items = \str_split($stringValue, $splitLength);
        if (!\is_array($items)) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return self::createConstantArrayFrom($items, $scope);
    }
    private static function createConstantArrayFrom(array $constantArray, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Constant\ConstantArrayType
    {
        $keyTypes = [];
        $valueTypes = [];
        $isList = \true;
        $i = 0;
        foreach ($constantArray as $key => $value) {
            $keyType = $scope->getTypeFromValue($key);
            if (!$keyType instanceof \PHPStan\Type\Constant\ConstantIntegerType) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            $keyTypes[] = $keyType;
            $valueTypes[] = $scope->getTypeFromValue($value);
            $isList = $isList && $key === $i;
            $i++;
        }
        return new \PHPStan\Type\Constant\ConstantArrayType($keyTypes, $valueTypes, $isList ? $i : 0);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\BenevolentUnionType;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\FloatType;
use PHPStan\Type\MixedType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
use PHPStan\Type\UnionType;
class MicrotimeFunctionReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'microtime';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        if (\count($functionCall->args) < 1) {
            return new \PHPStan\Type\StringType();
        }
        $argType = $scope->getType($functionCall->args[0]->value);
        $isTrueType = (new \PHPStan\Type\Constant\ConstantBooleanType(\true))->isSuperTypeOf($argType);
        $isFalseType = (new \PHPStan\Type\Constant\ConstantBooleanType(\false))->isSuperTypeOf($argType);
        $compareTypes = $isTrueType->compareTo($isFalseType);
        if ($compareTypes === $isTrueType) {
            return new \PHPStan\Type\FloatType();
        }
        if ($compareTypes === $isFalseType) {
            return new \PHPStan\Type\StringType();
        }
        if ($argType instanceof \PHPStan\Type\MixedType) {
            return new \PHPStan\Type\BenevolentUnionType([new \PHPStan\Type\StringType(), new \PHPStan\Type\FloatType()]);
        }
        return new \PHPStan\Type\UnionType([new \PHPStan\Type\StringType(), new \PHPStan\Type\FloatType()]);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\Constant\ConstantArrayTypeBuilder;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
class DioStatDynamicFunctionReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'dio_stat';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        $valueType = new \PHPStan\Type\IntegerType();
        $builder = \PHPStan\Type\Constant\ConstantArrayTypeBuilder::createEmpty();
        $keys = ['device', 'inode', 'mode', 'nlink', 'uid', 'gid', 'device_type', 'size', 'blocksize', 'blocks', 'atime', 'mtime', 'ctime'];
        foreach ($keys as $key) {
            $builder->setOffsetValueType(new \PHPStan\Type\Constant\ConstantStringType($key), $valueType);
        }
        return \PHPStan\Type\TypeCombinator::addNull($builder->getArray());
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Broker\Broker;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeUtils;
use PHPStan\Type\UnionType;
class GetParentClassDynamicFunctionReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension, \PHPStan\Reflection\BrokerAwareExtension
{
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    public function setBroker(\PHPStan\Broker\Broker $broker) : void
    {
        $this->broker = $broker;
    }
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'get_parent_class';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        $defaultReturnType = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        if (\count($functionCall->args) === 0) {
            if ($scope->isInTrait()) {
                return $defaultReturnType;
            }
            if ($scope->isInClass()) {
                return $this->findParentClassType($scope->getClassReflection());
            }
            return new \PHPStan\Type\Constant\ConstantBooleanType(\false);
        }
        $argType = $scope->getType($functionCall->args[0]->value);
        if ($scope->isInTrait() && \PHPStan\Type\TypeUtils::findThisType($argType) !== null) {
            return $defaultReturnType;
        }
        $constantStrings = \PHPStan\Type\TypeUtils::getConstantStrings($argType);
        if (\count($constantStrings) > 0) {
            return \PHPStan\Type\TypeCombinator::union(...\array_map(function (\PHPStan\Type\Constant\ConstantStringType $stringType) : Type {
                return $this->findParentClassNameType($stringType->getValue());
            }, $constantStrings));
        }
        $classNames = \PHPStan\Type\TypeUtils::getDirectClassNames($argType);
        if (\count($classNames) > 0) {
            return \PHPStan\Type\TypeCombinator::union(...\array_map(function (string $classNames) : Type {
                return $this->findParentClassNameType($classNames);
            }, $classNames));
        }
        return $defaultReturnType;
    }
    private function findParentClassNameType(string $className) : \PHPStan\Type\Type
    {
        if (!$this->broker->hasClass($className)) {
            return new \PHPStan\Type\UnionType([new \PHPStan\Type\StringType(), new \PHPStan\Type\Constant\ConstantBooleanType(\false)]);
        }
        return $this->findParentClassType($this->broker->getClass($className));
    }
    private function findParentClassType(\PHPStan\Reflection\ClassReflection $classReflection) : \PHPStan\Type\Type
    {
        $parentClass = $classReflection->getParentClass();
        if ($parentClass === \false) {
            return new \PHPStan\Type\Constant\ConstantBooleanType(\false);
        }
        return new \PHPStan\Type\Constant\ConstantStringType($parentClass->getName());
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeUtils;
class StrtotimeFunctionReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'strtotime';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        $defaultReturnType = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        if (\count($functionCall->args) === 0) {
            return $defaultReturnType;
        }
        $argType = $scope->getType($functionCall->args[0]->value);
        if ($argType instanceof \PHPStan\Type\MixedType) {
            return \PHPStan\Type\TypeUtils::toBenevolentUnion($defaultReturnType);
        }
        $result = \array_unique(\array_map(static function (\PHPStan\Type\Constant\ConstantStringType $string) : bool {
            return \is_int(\strtotime($string->getValue()));
        }, \PHPStan\Type\TypeUtils::getConstantStrings($argType)));
        if (\count($result) !== 1) {
            return $defaultReturnType;
        }
        return $result[0] ? new \PHPStan\Type\IntegerType() : new \PHPStan\Type\Constant\ConstantBooleanType(\false);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\BooleanType;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
class VersionCompareFunctionDynamicReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'version_compare';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        if (\count($functionCall->args) < 2) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectFromArgs($scope, $functionCall->args, $functionReflection->getVariants())->getReturnType();
        }
        $version1Strings = \PHPStan\Type\TypeUtils::getConstantStrings($scope->getType($functionCall->args[0]->value));
        $version2Strings = \PHPStan\Type\TypeUtils::getConstantStrings($scope->getType($functionCall->args[1]->value));
        $counts = [\count($version1Strings), \count($version2Strings)];
        if (isset($functionCall->args[2])) {
            $operatorStrings = \PHPStan\Type\TypeUtils::getConstantStrings($scope->getType($functionCall->args[2]->value));
            $counts[] = \count($operatorStrings);
            $returnType = new \PHPStan\Type\BooleanType();
        } else {
            $returnType = \PHPStan\Type\TypeCombinator::union(new \PHPStan\Type\Constant\ConstantIntegerType(-1), new \PHPStan\Type\Constant\ConstantIntegerType(0), new \PHPStan\Type\Constant\ConstantIntegerType(1));
        }
        if (\count(\array_filter($counts, static function (int $count) : bool {
            return $count === 0;
        })) > 0) {
            return $returnType;
            // one of the arguments is not a constant string
        }
        if (\count(\array_filter($counts, static function (int $count) : bool {
            return $count > 1;
        })) > 1) {
            return $returnType;
            // more than one argument can have multiple possibilities, avoid combinatorial explosion
        }
        $types = [];
        foreach ($version1Strings as $version1String) {
            foreach ($version2Strings as $version2String) {
                if (isset($operatorStrings)) {
                    foreach ($operatorStrings as $operatorString) {
                        $value = \version_compare($version1String->getValue(), $version2String->getValue(), $operatorString->getValue());
                        $types[$value] = new \PHPStan\Type\Constant\ConstantBooleanType($value);
                    }
                } else {
                    $value = \version_compare($version1String->getValue(), $version2String->getValue());
                    $types[$value] = new \PHPStan\Type\Constant\ConstantIntegerType($value);
                }
            }
        }
        return \PHPStan\Type\TypeCombinator::union(...$types);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\Closure;
use PhpParser\Node\Expr\FuncCall;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Stmt\Return_;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\ArrayType;
use PHPStan\Type\BenevolentUnionType;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantFloatType;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\MixedType;
use PHPStan\Type\NeverType;
use PHPStan\Type\NullType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
use PHPStan\Type\UnionType;
class ArrayFilterFunctionReturnTypeReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'array_filter';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        $arrayArg = $functionCall->args[0]->value ?? null;
        $callbackArg = $functionCall->args[1]->value ?? null;
        $flagArg = $functionCall->args[2]->value ?? null;
        if ($arrayArg !== null) {
            $arrayArgType = $scope->getType($arrayArg);
            $keyType = $arrayArgType->getIterableKeyType();
            $itemType = $arrayArgType->getIterableValueType();
            if ($arrayArgType instanceof \PHPStan\Type\MixedType) {
                return new \PHPStan\Type\BenevolentUnionType([new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType()), new \PHPStan\Type\NullType()]);
            }
            if ($callbackArg === null) {
                return \PHPStan\Type\TypeCombinator::union(...\array_map([$this, 'removeFalsey'], \PHPStan\Type\TypeUtils::getArrays($arrayArgType)));
            }
            if ($flagArg === null && $callbackArg instanceof \PhpParser\Node\Expr\Closure && \count($callbackArg->stmts) === 1) {
                $statement = $callbackArg->stmts[0];
                if ($statement instanceof \PhpParser\Node\Stmt\Return_ && $statement->expr !== null && \count($callbackArg->params) > 0) {
                    if (!$callbackArg->params[0]->var instanceof \PhpParser\Node\Expr\Variable || !\is_string($callbackArg->params[0]->var->name)) {
                        throw new \PHPStan\ShouldNotHappenException();
                    }
                    $itemVariableName = $callbackArg->params[0]->var->name;
                    $scope = $scope->assignVariable($itemVariableName, $itemType);
                    $scope = $scope->filterByTruthyValue($statement->expr);
                    $itemType = $scope->getVariableType($itemVariableName);
                }
            }
        } else {
            $keyType = new \PHPStan\Type\MixedType();
            $itemType = new \PHPStan\Type\MixedType();
        }
        return new \PHPStan\Type\ArrayType($keyType, $itemType);
    }
    public function removeFalsey(\PHPStan\Type\Type $type) : \PHPStan\Type\Type
    {
        $falseyTypes = new \PHPStan\Type\UnionType([new \PHPStan\Type\NullType(), new \PHPStan\Type\Constant\ConstantBooleanType(\false), new \PHPStan\Type\Constant\ConstantIntegerType(0), new \PHPStan\Type\Constant\ConstantFloatType(0.0), new \PHPStan\Type\Constant\ConstantStringType(''), new \PHPStan\Type\Constant\ConstantArrayType([], [])]);
        if ($type instanceof \PHPStan\Type\Constant\ConstantArrayType) {
            $keys = $type->getKeyTypes();
            $values = $type->getValueTypes();
            $generalize = \false;
            foreach ($values as $offset => $value) {
                $isFalsey = $falseyTypes->isSuperTypeOf($value);
                if ($isFalsey->yes()) {
                    unset($keys[$offset], $values[$offset]);
                } elseif ($isFalsey->maybe()) {
                    $values[$offset] = \PHPStan\Type\TypeCombinator::remove($values[$offset], $falseyTypes);
                    $generalize = \true;
                }
            }
            $filteredArray = new \PHPStan\Type\Constant\ConstantArrayType(\array_values($keys), \array_values($values));
            return $generalize ? $filteredArray->generalize() : $filteredArray;
        }
        $keyType = $type->getIterableKeyType();
        $valueType = $type->getIterableValueType();
        $valueType = \PHPStan\Type\TypeCombinator::remove($valueType, $falseyTypes);
        if ($valueType instanceof \PHPStan\Type\NeverType) {
            return new \PHPStan\Type\Constant\ConstantArrayType([], []);
        }
        return new \PHPStan\Type\ArrayType($keyType, $valueType);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\ArrayType;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\MixedType;
use PHPStan\Type\NullType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
class ArraySliceFunctionReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'array_slice';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        $arrayArg = $functionCall->args[0]->value ?? null;
        if ($arrayArg === null) {
            return new \PHPStan\Type\ArrayType(new \PHPStan\Type\IntegerType(), new \PHPStan\Type\MixedType());
        }
        $valueType = $scope->getType($arrayArg);
        if (isset($functionCall->args[1])) {
            $offset = $scope->getType($functionCall->args[1]->value);
            if (!$offset instanceof \PHPStan\Type\Constant\ConstantIntegerType) {
                $offset = new \PHPStan\Type\Constant\ConstantIntegerType(0);
            }
        } else {
            $offset = new \PHPStan\Type\Constant\ConstantIntegerType(0);
        }
        if (isset($functionCall->args[2])) {
            $limit = $scope->getType($functionCall->args[2]->value);
            if (!$limit instanceof \PHPStan\Type\Constant\ConstantIntegerType) {
                $limit = new \PHPStan\Type\NullType();
            }
        } else {
            $limit = new \PHPStan\Type\NullType();
        }
        $constantArrays = \PHPStan\Type\TypeUtils::getConstantArrays($valueType);
        if (\count($constantArrays) === 0) {
            return $valueType;
        }
        if (isset($functionCall->args[3])) {
            $preserveKeys = $scope->getType($functionCall->args[3]->value);
            $preserveKeys = (new \PHPStan\Type\Constant\ConstantBooleanType(\true))->isSuperTypeOf($preserveKeys)->yes();
        } else {
            $preserveKeys = \false;
        }
        $arrayTypes = \array_map(static function (\PHPStan\Type\Constant\ConstantArrayType $constantArray) use($offset, $limit, $preserveKeys) : ConstantArrayType {
            return $constantArray->slice($offset->getValue(), $limit->getValue(), $preserveKeys);
        }, $constantArrays);
        return \PHPStan\Type\TypeCombinator::union(...$arrayTypes);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Broker\Broker;
use PHPStan\Reflection\BrokerAwareExtension;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Rules\Comparison\ImpossibleCheckTypeHelper;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\DynamicFunctionReturnTypeExtension;
use PHPStan\Type\Type;
class TypeSpecifyingFunctionsDynamicReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension, \PHPStan\Reflection\BrokerAwareExtension
{
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    /** @var \PHPStan\Rules\Comparison\ImpossibleCheckTypeHelper|null */
    private $helper;
    public function setBroker(\PHPStan\Broker\Broker $broker) : void
    {
        $this->broker = $broker;
    }
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return \in_array($functionReflection->getName(), ['array_key_exists', 'in_array', 'is_numeric', 'is_int', 'is_array', 'is_bool', 'is_callable', 'is_float', 'is_double', 'is_real', 'is_iterable', 'is_null', 'is_object', 'is_resource', 'is_scalar', 'is_string', 'is_subclass_of'], \true);
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        if (\count($functionCall->args) === 0) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        $isAlways = $this->getHelper()->findSpecifiedType($scope, $functionCall);
        if ($isAlways === null) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        return new \PHPStan\Type\Constant\ConstantBooleanType($isAlways);
    }
    private function getHelper() : \PHPStan\Rules\Comparison\ImpossibleCheckTypeHelper
    {
        if ($this->helper === null) {
            $this->helper = new \PHPStan\Rules\Comparison\ImpossibleCheckTypeHelper($this->broker, $this->typeSpecifier);
        }
        return $this->helper;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\Accessory\NonEmptyArrayType;
use PHPStan\Type\ArrayType;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
use PHPStan\Type\MixedType;
class CountFunctionTypeSpecifyingExtension implements \PHPStan\Type\FunctionTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return !$context->null() && \count($node->args) >= 1 && $functionReflection->getName() === 'count';
    }
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        if (!(new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType()))->isSuperTypeOf($scope->getType($node->args[0]->value))->yes()) {
            return new \PHPStan\Analyser\SpecifiedTypes([], []);
        }
        return $this->typeSpecifier->create($node->args[0]->value, new \PHPStan\Type\Accessory\NonEmptyArrayType(), $context);
    }
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\NullType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
class ArrayPopFunctionReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'array_pop';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        if (!isset($functionCall->args[0])) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        $argType = $scope->getType($functionCall->args[0]->value);
        $iterableAtLeastOnce = $argType->isIterableAtLeastOnce();
        if ($iterableAtLeastOnce->no()) {
            return new \PHPStan\Type\NullType();
        }
        $constantArrays = \PHPStan\Type\TypeUtils::getConstantArrays($argType);
        if (\count($constantArrays) > 0) {
            $valueTypes = [];
            foreach ($constantArrays as $constantArray) {
                $arrayKeyTypes = $constantArray->getKeyTypes();
                if (\count($arrayKeyTypes) === 0) {
                    $valueTypes[] = new \PHPStan\Type\NullType();
                    continue;
                }
                $valueTypes[] = $constantArray->getOffsetValueType($arrayKeyTypes[\count($arrayKeyTypes) - 1]);
            }
            return \PHPStan\Type\TypeCombinator::union(...$valueTypes);
        }
        $itemType = $argType->getIterableValueType();
        if ($iterableAtLeastOnce->yes()) {
            return $itemType;
        }
        return \PHPStan\Type\TypeCombinator::union($itemType, new \PHPStan\Type\NullType());
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\ClassConstFetch;
use PhpParser\Node\Expr\FuncCall;
use PhpParser\Node\Name;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
use PHPStan\Type\ObjectType;
use PHPStan\Type\ObjectWithoutClassType;
use PHPStan\Type\StaticType;
use PHPStan\Type\StringType;
class IsAFunctionTypeSpecifyingExtension implements \PHPStan\Type\FunctionTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return \strtolower($functionReflection->getName()) === 'is_a' && isset($node->args[0]) && isset($node->args[1]) && !$context->null();
    }
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        if ($context->null()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        $classNameArgExpr = $node->args[1]->value;
        $classNameArgExprType = $scope->getType($classNameArgExpr);
        if ($classNameArgExpr instanceof \PhpParser\Node\Expr\ClassConstFetch && $classNameArgExpr->class instanceof \PhpParser\Node\Name && $classNameArgExpr->name instanceof \PhpParser\Node\Identifier && \strtolower($classNameArgExpr->name->name) === 'class') {
            $className = $scope->resolveName($classNameArgExpr->class);
            if (\strtolower($classNameArgExpr->class->toString()) === 'static') {
                $objectType = new \PHPStan\Type\StaticType($className);
            } else {
                $objectType = new \PHPStan\Type\ObjectType($className);
            }
            $types = $this->typeSpecifier->create($node->args[0]->value, $objectType, $context);
        } elseif ($classNameArgExprType instanceof \PHPStan\Type\Constant\ConstantStringType) {
            $objectType = new \PHPStan\Type\ObjectType($classNameArgExprType->getValue());
            $types = $this->typeSpecifier->create($node->args[0]->value, $objectType, $context);
        } elseif ($context->true()) {
            $objectType = new \PHPStan\Type\ObjectWithoutClassType();
            $types = $this->typeSpecifier->create($node->args[0]->value, $objectType, $context);
        } else {
            $types = new \PHPStan\Analyser\SpecifiedTypes();
        }
        if (isset($node->args[2]) && $context->true()) {
            if (!$scope->getType($node->args[2]->value)->isSuperTypeOf(new \PHPStan\Type\Constant\ConstantBooleanType(\true))->no()) {
                $types = $types->intersectWith($this->typeSpecifier->create($node->args[0]->value, new \PHPStan\Type\StringType(), $context));
            }
        }
        return $types;
    }
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\BooleanType;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
use PHPStan\Type\UnionType;
class MbFunctionsReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    /** @var string[] */
    private $supportedEncodings;
    /** @var int[]  */
    private $encodingPositionMap = ['mb_http_output' => 1, 'mb_regex_encoding' => 1, 'mb_internal_encoding' => 1, 'mb_encoding_aliases' => 1, 'mb_strlen' => 2, 'mb_chr' => 2, 'mb_ord' => 2];
    public function __construct()
    {
        $supportedEncodings = [];
        if (\function_exists('mb_list_encodings')) {
            foreach (\mb_list_encodings() as $encoding) {
                $aliases = \mb_encoding_aliases($encoding);
                if ($aliases === \false) {
                    throw new \PHPStan\ShouldNotHappenException();
                }
                $supportedEncodings = \array_merge($supportedEncodings, $aliases, [$encoding]);
            }
        }
        $this->supportedEncodings = \array_map('strtoupper', $supportedEncodings);
    }
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return \array_key_exists($functionReflection->getName(), $this->encodingPositionMap);
    }
    private function isSupportedEncoding(string $encoding) : bool
    {
        return \in_array(\strtoupper($encoding), $this->supportedEncodings, \true);
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        $returnType = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        $positionEncodingParam = $this->encodingPositionMap[$functionReflection->getName()];
        if (\count($functionCall->args) < $positionEncodingParam) {
            return \PHPStan\Type\TypeCombinator::remove($returnType, new \PHPStan\Type\BooleanType());
        }
        $strings = \PHPStan\Type\TypeUtils::getConstantStrings($scope->getType($functionCall->args[$positionEncodingParam - 1]->value));
        $results = \array_unique(\array_map(function (\PHPStan\Type\Constant\ConstantStringType $encoding) : bool {
            return $this->isSupportedEncoding($encoding->getValue());
        }, $strings));
        if ($returnType->equals(new \PHPStan\Type\UnionType([new \PHPStan\Type\StringType(), new \PHPStan\Type\BooleanType()]))) {
            return \count($results) === 1 ? new \PHPStan\Type\Constant\ConstantBooleanType($results[0]) : new \PHPStan\Type\BooleanType();
        }
        if (\count($results) === 1) {
            return $results[0] ? \PHPStan\Type\TypeCombinator::remove($returnType, new \PHPStan\Type\Constant\ConstantBooleanType(\false)) : new \PHPStan\Type\Constant\ConstantBooleanType(\false);
        }
        return $returnType;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
use PHPStan\Type\MixedType;
use PHPStan\Type\ObjectType;
use PHPStan\Type\ObjectWithoutClassType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeWithClassName;
use PHPStan\Type\UnionType;
class IsSubclassOfFunctionTypeSpecifyingExtension implements \PHPStan\Type\FunctionTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return \strtolower($functionReflection->getName()) === 'is_subclass_of' && \count($node->args) >= 2 && !$context->null();
    }
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        $objectType = $scope->getType($node->args[0]->value);
        $stringType = new \PHPStan\Type\StringType();
        if (!$objectType instanceof \PHPStan\Type\MixedType && !$objectType instanceof \PHPStan\Type\UnionType && !$stringType->isSuperTypeOf($objectType)->no()) {
            return new \PHPStan\Analyser\SpecifiedTypes();
        }
        $classType = $scope->getType($node->args[1]->value);
        if ($classType instanceof \PHPStan\Type\Constant\ConstantStringType && $classType->getValue() !== '') {
            $type = new \PHPStan\Type\ObjectType($classType->getValue());
        } elseif ($objectType instanceof \PHPStan\Type\UnionType) {
            $type = \PHPStan\Type\TypeCombinator::union(...\array_filter($objectType->getTypes(), static function (\PHPStan\Type\Type $type) : bool {
                return $type instanceof \PHPStan\Type\ObjectWithoutClassType || $type instanceof \PHPStan\Type\TypeWithClassName;
            }));
        } else {
            $type = new \PHPStan\Type\ObjectWithoutClassType();
        }
        $types = $this->typeSpecifier->create($node->args[0]->value, $type, $context);
        if (!$objectType->isSuperTypeOf(new \PHPStan\Type\StringType())->no() && (!isset($node->args[2]) || $scope->getType($node->args[2]->value)->equals(new \PHPStan\Type\Constant\ConstantBooleanType(\true)))) {
            $stringTypes = $this->typeSpecifier->create($node->args[0]->value, $objectType instanceof \PHPStan\Type\Constant\ConstantStringType ? $objectType : $stringType, $context);
            $types = $types->intersectWith($stringTypes);
        }
        return $types;
    }
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
class AssertFunctionTypeSpecifyingExtension implements \PHPStan\Type\FunctionTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return $functionReflection->getName() === 'assert' && isset($node->args[0]);
    }
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        return $this->typeSpecifier->specifyTypesInCondition($scope, $node->args[0]->value, \PHPStan\Analyser\TypeSpecifierContext::createTruthy());
    }
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
use PHPStan\Type\TypeUtils;
class InArrayFunctionTypeSpecifyingExtension implements \PHPStan\Type\FunctionTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return \strtolower($functionReflection->getName()) === 'in_array' && \count($node->args) >= 3 && !$context->null();
    }
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        $strictNodeType = $scope->getType($node->args[2]->value);
        if (!(new \PHPStan\Type\Constant\ConstantBooleanType(\true))->isSuperTypeOf($strictNodeType)->yes()) {
            return new \PHPStan\Analyser\SpecifiedTypes([], []);
        }
        $arrayValueType = $scope->getType($node->args[1]->value)->getIterableValueType();
        if ($context->truthy() || \count(\PHPStan\Type\TypeUtils::getConstantScalars($arrayValueType)) > 0) {
            return $this->typeSpecifier->create($node->args[0]->value, $arrayValueType, $context);
        }
        return new \PHPStan\Analyser\SpecifiedTypes([], []);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\FloatType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
class HrtimeFunctionReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'hrtime';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        $arrayType = new \PHPStan\Type\Constant\ConstantArrayType([new \PHPStan\Type\Constant\ConstantIntegerType(0), new \PHPStan\Type\Constant\ConstantIntegerType(1)], [new \PHPStan\Type\IntegerType(), new \PHPStan\Type\IntegerType()], 2);
        $numberType = \PHPStan\Type\TypeCombinator::union(new \PHPStan\Type\IntegerType(), new \PHPStan\Type\FloatType());
        if (\count($functionCall->args) < 1) {
            return $arrayType;
        }
        $argType = $scope->getType($functionCall->args[0]->value);
        $isTrueType = (new \PHPStan\Type\Constant\ConstantBooleanType(\true))->isSuperTypeOf($argType);
        $isFalseType = (new \PHPStan\Type\Constant\ConstantBooleanType(\false))->isSuperTypeOf($argType);
        $compareTypes = $isTrueType->compareTo($isFalseType);
        if ($compareTypes === $isTrueType) {
            return $numberType;
        }
        if ($compareTypes === $isFalseType) {
            return $arrayType;
        }
        return \PHPStan\Type\TypeCombinator::union($arrayType, $numberType);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\Accessory\HasMethodType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
use PHPStan\Type\IntersectionType;
use PHPStan\Type\ObjectWithoutClassType;
class MethodExistsTypeSpecifyingExtension implements \PHPStan\Type\FunctionTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var TypeSpecifier */
    private $typeSpecifier;
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return $functionReflection->getName() === 'method_exists' && $context->truthy() && \count($node->args) >= 2;
    }
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        $methodNameType = $scope->getType($node->args[1]->value);
        if (!$methodNameType instanceof \PHPStan\Type\Constant\ConstantStringType) {
            return new \PHPStan\Analyser\SpecifiedTypes([], []);
        }
        return $this->typeSpecifier->create($node->args[0]->value, new \PHPStan\Type\IntersectionType([new \PHPStan\Type\ObjectWithoutClassType(), new \PHPStan\Type\Accessory\HasMethodType($methodNameType->getValue())]), $context);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\NullType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
class ArrayKeyLastDynamicReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'array_key_last';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        if (!isset($functionCall->args[0])) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        $argType = $scope->getType($functionCall->args[0]->value);
        $iterableAtLeastOnce = $argType->isIterableAtLeastOnce();
        if ($iterableAtLeastOnce->no()) {
            return new \PHPStan\Type\NullType();
        }
        $constantArrays = \PHPStan\Type\TypeUtils::getConstantArrays($argType);
        if (\count($constantArrays) > 0) {
            $keyTypes = [];
            foreach ($constantArrays as $constantArray) {
                $arrayKeyTypes = $constantArray->getKeyTypes();
                if (\count($arrayKeyTypes) === 0) {
                    $keyTypes[] = new \PHPStan\Type\NullType();
                    continue;
                }
                $keyTypes[] = $arrayKeyTypes[\count($arrayKeyTypes) - 1];
            }
            return \PHPStan\Type\TypeCombinator::union(...$keyTypes);
        }
        $keyType = $argType->getIterableKeyType();
        if ($iterableAtLeastOnce->yes()) {
            return $keyType;
        }
        return \PHPStan\Type\TypeCombinator::union($keyType, new \PHPStan\Type\NullType());
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
class CountFunctionReturnTypeExtension implements \PHPStan\Type\DynamicFunctionReturnTypeExtension
{
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection) : bool
    {
        return $functionReflection->getName() === 'count';
    }
    public function getTypeFromFunctionCall(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        if (\count($functionCall->args) < 1) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        if (\count($functionCall->args) > 1) {
            $mode = $scope->getType($functionCall->args[1]->value);
            if ($mode->isSuperTypeOf(new \PHPStan\Type\Constant\ConstantIntegerType(\COUNT_RECURSIVE))->yes()) {
                return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
            }
        }
        $arrays = \PHPStan\Type\TypeUtils::getArrays($scope->getType($functionCall->args[0]->value));
        if (\count($arrays) === 0) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
        }
        $countTypes = [];
        foreach ($arrays as $array) {
            $countTypes[] = $array->count();
        }
        return \PHPStan\Type\TypeCombinator::union(...$countTypes);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
use PHPStan\Type\IntegerType;
class IsIntFunctionTypeSpecifyingExtension implements \PHPStan\Type\FunctionTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return \in_array(\strtolower($functionReflection->getName()), ['is_int', 'is_integer', 'is_long'], \true) && isset($node->args[0]) && !$context->null();
    }
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        if ($context->null()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $this->typeSpecifier->create($node->args[0]->value, new \PHPStan\Type\IntegerType(), $context);
    }
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\ArrayType;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
use PHPStan\Type\MixedType;
class IsArrayFunctionTypeSpecifyingExtension implements \PHPStan\Type\FunctionTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return \strtolower($functionReflection->getName()) === 'is_array' && isset($node->args[0]) && !$context->null();
    }
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        if ($context->null()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $this->typeSpecifier->create($node->args[0]->value, new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType()), $context);
    }
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
use PHPStan\Type\StringType;
class IsStringFunctionTypeSpecifyingExtension implements \PHPStan\Type\FunctionTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return \strtolower($functionReflection->getName()) === 'is_string' && isset($node->args[0]) && !$context->null();
    }
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        if ($context->null()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $this->typeSpecifier->create($node->args[0]->value, new \PHPStan\Type\StringType(), $context);
    }
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Php;

use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierAwareExtension;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
use PHPStan\Type\ResourceType;
class IsResourceFunctionTypeSpecifyingExtension implements \PHPStan\Type\FunctionTypeSpecifyingExtension, \PHPStan\Analyser\TypeSpecifierAwareExtension
{
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    public function isFunctionSupported(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool
    {
        return \strtolower($functionReflection->getName()) === 'is_resource' && isset($node->args[0]) && !$context->null();
    }
    public function specifyTypes(\PHPStan\Reflection\FunctionReflection $functionReflection, \PhpParser\Node\Expr\FuncCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes
    {
        if ($context->null()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $this->typeSpecifier->create($node->args[0]->value, new \PHPStan\Type\ResourceType(), $context);
    }
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void
    {
        $this->typeSpecifier = $typeSpecifier;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\Broker\Broker;
use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\Reflection\ConstantReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Reflection\Php\UniversalObjectCratesClassReflectionExtension;
use PHPStan\Reflection\PropertyReflection;
use PHPStan\Reflection\TrivialParametersAcceptor;
use PHPStan\TrinaryLogic;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\Traits\TruthyBooleanTypeTrait;
class ObjectType implements \PHPStan\Type\TypeWithClassName, \PHPStan\Type\SubtractableType
{
    use TruthyBooleanTypeTrait;
    private const EXTRA_OFFSET_CLASSES = ['SimpleXMLElement', 'DOMNodeList'];
    /** @var string */
    private $className;
    /** @var \PHPStan\Type\Type|null */
    private $subtractedType;
    public function __construct(string $className, ?\PHPStan\Type\Type $subtractedType = null)
    {
        $this->className = $className;
        $this->subtractedType = $subtractedType;
    }
    public function getClassName() : string
    {
        return $this->className;
    }
    public function hasProperty(string $propertyName) : \PHPStan\TrinaryLogic
    {
        $broker = \PHPStan\Broker\Broker::getInstance();
        if (!$broker->hasClass($this->className)) {
            return \PHPStan\TrinaryLogic::createMaybe();
        }
        $classReflection = $broker->getClass($this->className);
        if ($classReflection->hasProperty($propertyName)) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        if ($classReflection->isFinal()) {
            return \PHPStan\TrinaryLogic::createNo();
        }
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function getProperty(string $propertyName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\PropertyReflection
    {
        $broker = \PHPStan\Broker\Broker::getInstance();
        return $broker->getClass($this->className)->getProperty($propertyName, $scope);
    }
    /**
     * @return string[]
     */
    public function getReferencedClasses() : array
    {
        return [$this->className];
    }
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof \PHPStan\Type\StaticType) {
            return $this->checkSubclassAcceptability($type->getBaseClass());
        }
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return \PHPStan\Type\CompoundTypeHelper::accepts($type, $this, $strictTypes);
        }
        if ($type instanceof \PHPStan\Type\ClosureType) {
            return $this->isInstanceOf(\Closure::class);
        }
        if ($this->isInstanceOf('SimpleXMLElement')->yes() && $type->isSuperTypeOf($this)->no()) {
            return (new \PHPStan\Type\UnionType([new \PHPStan\Type\IntegerType(), new \PHPStan\Type\FloatType(), new \PHPStan\Type\StringType(), new \PHPStan\Type\BooleanType()]))->accepts($type, $strictTypes);
        }
        if (!$type instanceof \PHPStan\Type\TypeWithClassName) {
            return \PHPStan\TrinaryLogic::createNo();
        }
        return $this->checkSubclassAcceptability($type->getClassName());
    }
    public function isSuperTypeOf(\PHPStan\Type\Type $type) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return $type->isSubTypeOf($this);
        }
        if ($type instanceof \PHPStan\Type\ObjectWithoutClassType) {
            if ($type->getSubtractedType() !== null) {
                $isSuperType = $type->getSubtractedType()->isSuperTypeOf($this);
                if ($isSuperType->yes()) {
                    return \PHPStan\TrinaryLogic::createNo();
                }
            }
            return \PHPStan\TrinaryLogic::createMaybe();
        }
        if (!$type instanceof \PHPStan\Type\TypeWithClassName) {
            return \PHPStan\TrinaryLogic::createNo();
        }
        if ($this->subtractedType !== null) {
            $isSuperType = $this->subtractedType->isSuperTypeOf($type);
            if ($isSuperType->yes()) {
                return \PHPStan\TrinaryLogic::createNo();
            }
        }
        if ($type instanceof \PHPStan\Type\SubtractableType && $type->getSubtractedType() !== null) {
            $isSuperType = $type->getSubtractedType()->isSuperTypeOf($this);
            if ($isSuperType->yes()) {
                return \PHPStan\TrinaryLogic::createNo();
            }
        }
        $thisClassName = $this->className;
        $thatClassName = $type->getClassName();
        if ($thatClassName === $thisClassName) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        $broker = \PHPStan\Broker\Broker::getInstance();
        if (!$broker->hasClass($thisClassName) || !$broker->hasClass($thatClassName)) {
            return \PHPStan\TrinaryLogic::createMaybe();
        }
        $thisClassReflection = $broker->getClass($thisClassName);
        $thatClassReflection = $broker->getClass($thatClassName);
        if ($thisClassReflection->getName() === $thatClassReflection->getName()) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        if ($thatClassReflection->isSubclassOf($thisClassName)) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        if ($thisClassReflection->isSubclassOf($thatClassName)) {
            return \PHPStan\TrinaryLogic::createMaybe();
        }
        if ($thisClassReflection->isInterface() && !$thatClassReflection->getNativeReflection()->isFinal()) {
            return \PHPStan\TrinaryLogic::createMaybe();
        }
        if ($thatClassReflection->isInterface() && !$thisClassReflection->getNativeReflection()->isFinal()) {
            return \PHPStan\TrinaryLogic::createMaybe();
        }
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function equals(\PHPStan\Type\Type $type) : bool
    {
        if (!$type instanceof self) {
            return \false;
        }
        if ($this->className !== $type->className) {
            return \false;
        }
        if ($this->subtractedType === null) {
            if ($type->subtractedType === null) {
                return \true;
            }
            return \false;
        }
        if ($type->subtractedType === null) {
            return \false;
        }
        return $this->subtractedType->equals($type->subtractedType);
    }
    private function checkSubclassAcceptability(string $thatClass) : \PHPStan\TrinaryLogic
    {
        if ($this->className === $thatClass) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        $broker = \PHPStan\Broker\Broker::getInstance();
        if (!$broker->hasClass($this->className) || !$broker->hasClass($thatClass)) {
            return \PHPStan\TrinaryLogic::createNo();
        }
        $thisReflection = $broker->getClass($this->className);
        $thatReflection = $broker->getClass($thatClass);
        if ($thisReflection->getName() === $thatReflection->getName()) {
            // class alias
            return \PHPStan\TrinaryLogic::createYes();
        }
        if ($thisReflection->isInterface() && $thatReflection->isInterface()) {
            return \PHPStan\TrinaryLogic::createFromBoolean($thatReflection->getNativeReflection()->implementsInterface($this->className));
        }
        return \PHPStan\TrinaryLogic::createFromBoolean($thatReflection->isSubclassOf($this->className));
    }
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return $level->handle(function () : string {
            $broker = \PHPStan\Broker\Broker::getInstance();
            if (!$broker->hasClass($this->className)) {
                return $this->className;
            }
            return $broker->getClass($this->className)->getDisplayName();
        }, function () : string {
            return $this->className;
        }, function () use($level) : string {
            $description = $this->className;
            if ($this->subtractedType !== null) {
                $description .= \sprintf('~%s', $this->subtractedType->describe($level));
            }
            return $description;
        });
    }
    public function toNumber() : \PHPStan\Type\Type
    {
        if ($this->isInstanceOf('SimpleXMLElement')->yes()) {
            return new \PHPStan\Type\UnionType([new \PHPStan\Type\FloatType(), new \PHPStan\Type\IntegerType()]);
        }
        return new \PHPStan\Type\ErrorType();
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        if ($this->isInstanceOf('SimpleXMLElement')->yes()) {
            return new \PHPStan\Type\IntegerType();
        }
        return new \PHPStan\Type\ErrorType();
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        if ($this->isInstanceOf('SimpleXMLElement')->yes()) {
            return new \PHPStan\Type\FloatType();
        }
        return new \PHPStan\Type\ErrorType();
    }
    public function toString() : \PHPStan\Type\Type
    {
        $broker = \PHPStan\Broker\Broker::getInstance();
        if (!$broker->hasClass($this->className)) {
            return new \PHPStan\Type\ErrorType();
        }
        $classReflection = $broker->getClass($this->className);
        if ($classReflection->hasNativeMethod('__toString')) {
            return new \PHPStan\Type\StringType();
        }
        return new \PHPStan\Type\ErrorType();
    }
    public function toArray() : \PHPStan\Type\Type
    {
        $broker = \PHPStan\Broker\Broker::getInstance();
        if (!$broker->hasClass($this->className)) {
            return new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType());
        }
        $classReflection = $broker->getClass($this->className);
        if (!$classReflection->getNativeReflection()->isUserDefined() || \PHPStan\Reflection\Php\UniversalObjectCratesClassReflectionExtension::isUniversalObjectCrate($broker, $broker->getUniversalObjectCratesClasses(), $classReflection)) {
            return new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType());
        }
        $arrayKeys = [];
        $arrayValues = [];
        do {
            foreach ($classReflection->getNativeReflection()->getProperties() as $nativeProperty) {
                if ($nativeProperty->isStatic()) {
                    continue;
                }
                $declaringClass = $broker->getClass($nativeProperty->getDeclaringClass()->getName());
                $property = $declaringClass->getNativeProperty($nativeProperty->getName());
                $keyName = $nativeProperty->getName();
                if ($nativeProperty->isPrivate()) {
                    $keyName = \sprintf("\0%s\0%s", $declaringClass->getName(), $keyName);
                } elseif ($nativeProperty->isProtected()) {
                    $keyName = \sprintf("\0*\0%s", $keyName);
                }
                $arrayKeys[] = new \PHPStan\Type\Constant\ConstantStringType($keyName);
                $arrayValues[] = $property->getType();
            }
            $classReflection = $classReflection->getParentClass();
        } while ($classReflection !== \false);
        return new \PHPStan\Type\Constant\ConstantArrayType($arrayKeys, $arrayValues);
    }
    public function canAccessProperties() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function canCallMethods() : \PHPStan\TrinaryLogic
    {
        if (\strtolower($this->className) === 'stdclass') {
            return \PHPStan\TrinaryLogic::createNo();
        }
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function hasMethod(string $methodName) : \PHPStan\TrinaryLogic
    {
        $broker = \PHPStan\Broker\Broker::getInstance();
        if (!$broker->hasClass($this->className)) {
            return \PHPStan\TrinaryLogic::createMaybe();
        }
        $classReflection = $broker->getClass($this->className);
        if ($classReflection->hasMethod($methodName)) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        if ($classReflection->isFinal()) {
            return \PHPStan\TrinaryLogic::createNo();
        }
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function getMethod(string $methodName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\MethodReflection
    {
        $broker = \PHPStan\Broker\Broker::getInstance();
        return $broker->getClass($this->className)->getMethod($methodName, $scope);
    }
    public function canAccessConstants() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function hasConstant(string $constantName) : \PHPStan\TrinaryLogic
    {
        $broker = \PHPStan\Broker\Broker::getInstance();
        if (!$broker->hasClass($this->className)) {
            return \PHPStan\TrinaryLogic::createNo();
        }
        return \PHPStan\TrinaryLogic::createFromBoolean($broker->getClass($this->className)->hasConstant($constantName));
    }
    public function getConstant(string $constantName) : \PHPStan\Reflection\ConstantReflection
    {
        $broker = \PHPStan\Broker\Broker::getInstance();
        return $broker->getClass($this->className)->getConstant($constantName);
    }
    public function isIterable() : \PHPStan\TrinaryLogic
    {
        return $this->isInstanceOf(\Traversable::class);
    }
    public function isIterableAtLeastOnce() : \PHPStan\TrinaryLogic
    {
        return $this->isInstanceOf(\Traversable::class)->and(\PHPStan\TrinaryLogic::createMaybe());
    }
    public function getIterableKeyType() : \PHPStan\Type\Type
    {
        $broker = \PHPStan\Broker\Broker::getInstance();
        if (!$broker->hasClass($this->className)) {
            return new \PHPStan\Type\ErrorType();
        }
        $classReflection = $broker->getClass($this->className);
        if ($this->isInstanceOf(\Iterator::class)->yes()) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($classReflection->getNativeMethod('key')->getVariants())->getReturnType();
        }
        if ($this->isInstanceOf(\IteratorAggregate::class)->yes()) {
            return \PHPStan\Type\RecursionGuard::run($this, static function () use($classReflection) : Type {
                return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($classReflection->getNativeMethod('getIterator')->getVariants())->getReturnType()->getIterableKeyType();
            });
        }
        if ($this->isInstanceOf(\Traversable::class)->yes()) {
            return new \PHPStan\Type\MixedType();
        }
        return new \PHPStan\Type\ErrorType();
    }
    public function getIterableValueType() : \PHPStan\Type\Type
    {
        $broker = \PHPStan\Broker\Broker::getInstance();
        if (!$broker->hasClass($this->className)) {
            return new \PHPStan\Type\ErrorType();
        }
        $classReflection = $broker->getClass($this->className);
        if ($this->isInstanceOf(\Iterator::class)->yes()) {
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($classReflection->getNativeMethod('current')->getVariants())->getReturnType();
        }
        if ($this->isInstanceOf(\IteratorAggregate::class)->yes()) {
            return \PHPStan\Type\RecursionGuard::run($this, static function () use($classReflection) : Type {
                return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($classReflection->getNativeMethod('getIterator')->getVariants())->getReturnType()->getIterableValueType();
            });
        }
        if ($this->isInstanceOf(\Traversable::class)->yes()) {
            return new \PHPStan\Type\MixedType();
        }
        return new \PHPStan\Type\ErrorType();
    }
    private function isExtraOffsetAccessibleClass() : \PHPStan\TrinaryLogic
    {
        $broker = \PHPStan\Broker\Broker::getInstance();
        if (!$broker->hasClass($this->className)) {
            return \PHPStan\TrinaryLogic::createMaybe();
        }
        $classReflection = $broker->getClass($this->className);
        foreach (self::EXTRA_OFFSET_CLASSES as $extraOffsetClass) {
            if ($classReflection->getName() === $extraOffsetClass) {
                return \PHPStan\TrinaryLogic::createYes();
            }
            if ($classReflection->isSubclassOf($extraOffsetClass)) {
                return \PHPStan\TrinaryLogic::createYes();
            }
        }
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function isOffsetAccessible() : \PHPStan\TrinaryLogic
    {
        return $this->isInstanceOf(\ArrayAccess::class)->or($this->isExtraOffsetAccessibleClass());
    }
    public function hasOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\TrinaryLogic
    {
        $broker = \PHPStan\Broker\Broker::getInstance();
        if (!$broker->hasClass($this->className)) {
            return \PHPStan\TrinaryLogic::createNo();
        }
        return $this->isExtraOffsetAccessibleClass()->or($this->isInstanceOf(\ArrayAccess::class))->and(\PHPStan\TrinaryLogic::createMaybe());
    }
    public function getOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\Type\Type
    {
        $broker = \PHPStan\Broker\Broker::getInstance();
        if (!$broker->hasClass($this->className)) {
            return new \PHPStan\Type\ErrorType();
        }
        if (!$this->isExtraOffsetAccessibleClass()->no()) {
            return new \PHPStan\Type\MixedType();
        }
        if ($this->isInstanceOf(\ArrayAccess::class)->yes()) {
            $classReflection = $broker->getClass($this->className);
            return \PHPStan\Type\RecursionGuard::run($this, static function () use($classReflection) : Type {
                return \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($classReflection->getNativeMethod('offsetGet')->getVariants())->getReturnType();
            });
        }
        return new \PHPStan\Type\ErrorType();
    }
    public function setOffsetValueType(?\PHPStan\Type\Type $offsetType, \PHPStan\Type\Type $valueType) : \PHPStan\Type\Type
    {
        if ($this->isOffsetAccessible()->no()) {
            return new \PHPStan\Type\ErrorType();
        }
        $broker = \PHPStan\Broker\Broker::getInstance();
        if ($this->isInstanceOf(\ArrayAccess::class)->yes()) {
            $classReflection = $broker->getClass($this->className);
            $acceptedValueType = new \PHPStan\Type\NeverType();
            $acceptedOffsetType = \PHPStan\Type\RecursionGuard::run($this, function () use($classReflection, &$acceptedValueType) : Type {
                $parameters = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($classReflection->getNativeMethod('offsetSet')->getVariants())->getParameters();
                if (\count($parameters) < 2) {
                    throw new \PHPStan\ShouldNotHappenException(\sprintf('Method %s::%s() has less than 2 parameters.', $this->className, 'offsetSet'));
                }
                $offsetParameter = $parameters[0];
                $acceptedValueType = $parameters[1]->getType();
                return $offsetParameter->getType();
            });
            if ($offsetType === null) {
                $offsetType = new \PHPStan\Type\NullType();
            }
            if (!$offsetType instanceof \PHPStan\Type\MixedType && !$acceptedOffsetType->isSuperTypeOf($offsetType)->yes() || !$valueType instanceof \PHPStan\Type\MixedType && !$acceptedValueType->isSuperTypeOf($valueType)->yes()) {
                return new \PHPStan\Type\ErrorType();
            }
        }
        // in the future we may return intersection of $this and OffsetAccessibleType()
        return $this;
    }
    public function isCallable() : \PHPStan\TrinaryLogic
    {
        $parametersAcceptors = $this->findCallableParametersAcceptors();
        if ($parametersAcceptors === null) {
            return \PHPStan\TrinaryLogic::createNo();
        }
        if (\count($parametersAcceptors) === 1 && $parametersAcceptors[0] instanceof \PHPStan\Reflection\TrivialParametersAcceptor) {
            return \PHPStan\TrinaryLogic::createMaybe();
        }
        return \PHPStan\TrinaryLogic::createYes();
    }
    /**
     * @param \PHPStan\Reflection\ClassMemberAccessAnswerer $scope
     * @return \PHPStan\Reflection\ParametersAcceptor[]
     */
    public function getCallableParametersAcceptors(\PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : array
    {
        if ($this->className === \Closure::class) {
            return [new \PHPStan\Reflection\TrivialParametersAcceptor()];
        }
        $parametersAcceptors = $this->findCallableParametersAcceptors();
        if ($parametersAcceptors === null) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $parametersAcceptors;
    }
    /**
     * @return \PHPStan\Reflection\ParametersAcceptor[]|null
     */
    private function findCallableParametersAcceptors() : ?array
    {
        $broker = \PHPStan\Broker\Broker::getInstance();
        if (!$broker->hasClass($this->className)) {
            return [new \PHPStan\Reflection\TrivialParametersAcceptor()];
        }
        $classReflection = $broker->getClass($this->className);
        if ($classReflection->hasNativeMethod('__invoke')) {
            return $classReflection->getNativeMethod('__invoke')->getVariants();
        }
        if (!$classReflection->getNativeReflection()->isFinal()) {
            return [new \PHPStan\Reflection\TrivialParametersAcceptor()];
        }
        return null;
    }
    public function isCloneable() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self($properties['className'], $properties['subtractedType'] ?? null);
    }
    public function isInstanceOf(string $className) : \PHPStan\TrinaryLogic
    {
        $broker = \PHPStan\Broker\Broker::getInstance();
        if (!$broker->hasClass($this->className)) {
            return \PHPStan\TrinaryLogic::createMaybe();
        }
        $classReflection = $broker->getClass($this->className);
        if ($classReflection->isSubclassOf($className) || $classReflection->getName() === $className) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        if ($classReflection->isInterface()) {
            return \PHPStan\TrinaryLogic::createMaybe();
        }
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function subtract(\PHPStan\Type\Type $type) : \PHPStan\Type\Type
    {
        if ($this->subtractedType !== null) {
            $type = \PHPStan\Type\TypeCombinator::union($this->subtractedType, $type);
        }
        return new self($this->className, $type);
    }
    public function getTypeWithoutSubtractedType() : \PHPStan\Type\Type
    {
        return new self($this->className);
    }
    public function changeSubtractedType(?\PHPStan\Type\Type $subtractedType) : \PHPStan\Type\Type
    {
        return new self($this->className, $subtractedType);
    }
    public function getSubtractedType() : ?\PHPStan\Type\Type
    {
        return $this->subtractedType;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

interface StaticResolvableType extends \PHPStan\Type\Type
{
    public function resolveStatic(string $className) : \PHPStan\Type\Type;
    public function changeBaseClass(string $className) : self;
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

class BenevolentUnionType extends \PHPStan\Type\UnionType
{
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return '(' . parent::describe($level) . ')';
    }
    protected function unionTypes(callable $getType) : \PHPStan\Type\Type
    {
        $resultTypes = [];
        foreach ($this->getTypes() as $type) {
            $result = $getType($type);
            if ($result instanceof \PHPStan\Type\ErrorType) {
                continue;
            }
            $resultTypes[] = $result;
        }
        if (\count($resultTypes) === 0) {
            return new \PHPStan\Type\ErrorType();
        }
        return \PHPStan\Type\TypeCombinator::union(...$resultTypes);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PhpParser\Node;
use PHPStan\Analyser\NameScope;
use PHPStan\Broker\AnonymousClassNameHelper;
use PHPStan\Cache\Cache;
use PHPStan\Parser\Parser;
use PHPStan\PhpDoc\PhpDocStringResolver;
use PHPStan\PhpDoc\ResolvedPhpDocBlock;
use PHPStan\PhpDoc\TypeNodeResolver;
class FileTypeMapper
{
    /** @var \PHPStan\Parser\Parser */
    private $phpParser;
    /** @var \PHPStan\PhpDoc\PhpDocStringResolver */
    private $phpDocStringResolver;
    /** @var \PHPStan\Cache\Cache */
    private $cache;
    /** @var \PHPStan\Broker\AnonymousClassNameHelper */
    private $anonymousClassNameHelper;
    /** @var \PHPStan\PhpDoc\TypeNodeResolver */
    private $typeNodeResolver;
    /** @var \PHPStan\PhpDoc\ResolvedPhpDocBlock[][] */
    private $memoryCache = [];
    /** @var (false|callable|\PHPStan\PhpDoc\ResolvedPhpDocBlock)[][] */
    private $inProcess = [];
    public function __construct(\PHPStan\Parser\Parser $phpParser, \PHPStan\PhpDoc\PhpDocStringResolver $phpDocStringResolver, \PHPStan\Cache\Cache $cache, \PHPStan\Broker\AnonymousClassNameHelper $anonymousClassNameHelper, \PHPStan\PhpDoc\TypeNodeResolver $typeNodeResolver)
    {
        $this->phpParser = $phpParser;
        $this->phpDocStringResolver = $phpDocStringResolver;
        $this->cache = $cache;
        $this->anonymousClassNameHelper = $anonymousClassNameHelper;
        $this->typeNodeResolver = $typeNodeResolver;
    }
    public function getResolvedPhpDoc(string $fileName, ?string $className, ?string $traitName, string $docComment) : \PHPStan\PhpDoc\ResolvedPhpDocBlock
    {
        if ($className === null && $traitName !== null) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        $phpDocKey = $this->getPhpDocKey($className, $traitName, $docComment);
        $phpDocMap = [];
        if (!isset($this->inProcess[$fileName])) {
            $phpDocMap = $this->getResolvedPhpDocMap($fileName);
        }
        if (isset($phpDocMap[$phpDocKey])) {
            return $phpDocMap[$phpDocKey];
        }
        if (!isset($this->inProcess[$fileName][$phpDocKey])) {
            // wrong $fileName due to traits
            return \PHPStan\PhpDoc\ResolvedPhpDocBlock::createEmpty();
        }
        if ($this->inProcess[$fileName][$phpDocKey] === \false) {
            // PHPDoc has cyclic dependency
            return \PHPStan\PhpDoc\ResolvedPhpDocBlock::createEmpty();
        }
        if (\is_callable($this->inProcess[$fileName][$phpDocKey])) {
            $resolveCallback = $this->inProcess[$fileName][$phpDocKey];
            $this->inProcess[$fileName][$phpDocKey] = \false;
            $this->inProcess[$fileName][$phpDocKey] = $resolveCallback();
        }
        \assert($this->inProcess[$fileName][$phpDocKey] instanceof \PHPStan\PhpDoc\ResolvedPhpDocBlock);
        return $this->inProcess[$fileName][$phpDocKey];
    }
    /**
     * @param string $fileName
     * @return \PHPStan\PhpDoc\ResolvedPhpDocBlock[]
     */
    private function getResolvedPhpDocMap(string $fileName) : array
    {
        if (!isset($this->memoryCache[$fileName])) {
            $modifiedTime = \filemtime($fileName);
            if ($modifiedTime === \false) {
                $modifiedTime = \time();
            }
            $cacheKey = \sprintf('%s-%d-%s', $fileName, $modifiedTime, $this->typeNodeResolver->getCacheKey());
            $map = $this->cache->load($cacheKey);
            if ($map === null) {
                $map = $this->createResolvedPhpDocMap($fileName);
                $this->cache->save($cacheKey, $map);
            }
            $this->memoryCache[$fileName] = $map;
        }
        return $this->memoryCache[$fileName];
    }
    /**
     * @param string $fileName
     * @return \PHPStan\PhpDoc\ResolvedPhpDocBlock[]
     */
    private function createResolvedPhpDocMap(string $fileName) : array
    {
        $phpDocMap = $this->createFilePhpDocMap($fileName, null, null);
        try {
            $this->inProcess[$fileName] = $phpDocMap;
            foreach ($phpDocMap as $phpDocKey => $resolveCallback) {
                $this->inProcess[$fileName][$phpDocKey] = \false;
                $this->inProcess[$fileName][$phpDocKey] = $data = $resolveCallback();
                $phpDocMap[$phpDocKey] = $data;
            }
        } finally {
            unset($this->inProcess[$fileName]);
        }
        return $phpDocMap;
    }
    /**
     * @param string $fileName
     * @param string|null $lookForTrait
     * @param string|null $traitUseClass
     * @return callable[]
     */
    private function createFilePhpDocMap(string $fileName, ?string $lookForTrait, ?string $traitUseClass) : array
    {
        /** @var callable[] $phpDocMap */
        $phpDocMap = [];
        /** @var string[] $classStack */
        $classStack = [];
        if ($lookForTrait !== null && $traitUseClass !== null) {
            $classStack[] = $traitUseClass;
        }
        $namespace = null;
        $uses = [];
        $this->processNodes($this->phpParser->parseFile($fileName), function (\PhpParser\Node $node) use($fileName, $lookForTrait, &$phpDocMap, &$classStack, &$namespace, &$uses) {
            if ($node instanceof \PhpParser\Node\Stmt\ClassLike) {
                if ($lookForTrait !== null) {
                    if (!$node instanceof \PhpParser\Node\Stmt\Trait_) {
                        return \false;
                    }
                    if ((string) $node->namespacedName !== $lookForTrait) {
                        return \false;
                    }
                } else {
                    if ($node->name === null) {
                        if (!$node instanceof \PhpParser\Node\Stmt\Class_) {
                            throw new \PHPStan\ShouldNotHappenException();
                        }
                        $className = $this->anonymousClassNameHelper->getAnonymousClassName($node, $fileName);
                    } elseif ((bool) $node->getAttribute('anonymousClass', \false)) {
                        $className = $node->name->name;
                    } else {
                        $className = \ltrim(\sprintf('%s\\%s', $namespace, $node->name->name), '\\');
                    }
                    $classStack[] = $className;
                }
            } elseif ($node instanceof \PhpParser\Node\Stmt\TraitUse) {
                foreach ($node->traits as $traitName) {
                    $traitName = (string) $traitName;
                    if (!\trait_exists($traitName)) {
                        continue;
                    }
                    $traitReflection = new \ReflectionClass($traitName);
                    if ($traitReflection->getFileName() === \false) {
                        continue;
                    }
                    if (!\file_exists($traitReflection->getFileName())) {
                        continue;
                    }
                    $className = $classStack[\count($classStack) - 1] ?? null;
                    if ($className === null) {
                        throw new \PHPStan\ShouldNotHappenException();
                    }
                    $traitPhpDocMap = $this->createFilePhpDocMap($traitReflection->getFileName(), $traitName, $className);
                    $phpDocMap = \array_merge($phpDocMap, $traitPhpDocMap);
                }
                return null;
            } elseif ($node instanceof \PhpParser\Node\Stmt\Namespace_) {
                $namespace = (string) $node->name;
                return null;
            } elseif ($node instanceof \PhpParser\Node\Stmt\Use_ && $node->type === \PhpParser\Node\Stmt\Use_::TYPE_NORMAL) {
                foreach ($node->uses as $use) {
                    $uses[\strtolower($use->getAlias()->name)] = (string) $use->name;
                }
                return null;
            } elseif ($node instanceof \PhpParser\Node\Stmt\GroupUse) {
                $prefix = (string) $node->prefix;
                foreach ($node->uses as $use) {
                    if ($node->type !== \PhpParser\Node\Stmt\Use_::TYPE_NORMAL && $use->type !== \PhpParser\Node\Stmt\Use_::TYPE_NORMAL) {
                        continue;
                    }
                    $uses[\strtolower($use->getAlias()->name)] = \sprintf('%s\\%s', $prefix, (string) $use->name);
                }
                return null;
            } elseif (!\in_array(\get_class($node), [\PhpParser\Node\Stmt\Property::class, \PhpParser\Node\Stmt\ClassMethod::class, \PhpParser\Node\Stmt\Function_::class, \PhpParser\Node\Stmt\Foreach_::class, \PhpParser\Node\Expr\Assign::class, \PhpParser\Node\Expr\AssignRef::class, \PhpParser\Node\Stmt\Class_::class, \PhpParser\Node\Stmt\ClassConst::class, \PhpParser\Node\Stmt\Static_::class], \true)) {
                return null;
            }
            $phpDocString = \PHPStan\Type\CommentHelper::getDocComment($node);
            if ($phpDocString === null) {
                return null;
            }
            $className = $classStack[\count($classStack) - 1] ?? null;
            $nameScope = new \PHPStan\Analyser\NameScope($namespace, $uses, $className);
            $phpDocKey = $this->getPhpDocKey($className, $lookForTrait, $phpDocString);
            $phpDocMap[$phpDocKey] = function () use($phpDocString, $nameScope) : ResolvedPhpDocBlock {
                return $this->phpDocStringResolver->resolve($phpDocString, $nameScope);
            };
        }, static function (\PhpParser\Node $node) use($lookForTrait, &$namespace, &$classStack, &$uses) : void {
            if ($node instanceof \PhpParser\Node\Stmt\ClassLike && $lookForTrait === null) {
                if (\count($classStack) === 0) {
                    throw new \PHPStan\ShouldNotHappenException();
                }
                \array_pop($classStack);
            } elseif ($node instanceof \PhpParser\Node\Stmt\Namespace_) {
                $namespace = null;
                $uses = [];
            }
        });
        return $phpDocMap;
    }
    /**
     * @param \PhpParser\Node[]|\PhpParser\Node|scalar $node
     * @param \Closure(\PhpParser\Node $node): mixed $nodeCallback
     * @param \Closure(\PhpParser\Node $node): void $endNodeCallback
     */
    private function processNodes($node, \Closure $nodeCallback, \Closure $endNodeCallback) : void
    {
        if ($node instanceof \PhpParser\Node) {
            $callbackResult = $nodeCallback($node);
            if ($callbackResult === \false) {
                return;
            }
            foreach ($node->getSubNodeNames() as $subNodeName) {
                $subNode = $node->{$subNodeName};
                $this->processNodes($subNode, $nodeCallback, $endNodeCallback);
            }
            $endNodeCallback($node);
        } elseif (\is_array($node)) {
            foreach ($node as $subNode) {
                $this->processNodes($subNode, $nodeCallback, $endNodeCallback);
            }
        }
    }
    private function getPhpDocKey(?string $class, ?string $trait, string $docComment) : string
    {
        $docComment = \_HumbugBoxb94336daae36\Nette\Utils\Strings::replace($docComment, '#\\s+#', ' ');
        return \md5(\sprintf('%s-%s-%s', $class, $trait, $docComment));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\Analyser\OutOfClassScope;
use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\Reflection\Native\NativeParameterReflection;
use PHPStan\Reflection\ParametersAcceptor;
use PHPStan\TrinaryLogic;
use PHPStan\Type\Traits\MaybeIterableTypeTrait;
use PHPStan\Type\Traits\MaybeObjectTypeTrait;
use PHPStan\Type\Traits\MaybeOffsetAccessibleTypeTrait;
use PHPStan\Type\Traits\TruthyBooleanTypeTrait;
class CallableType implements \PHPStan\Type\CompoundType, \PHPStan\Reflection\ParametersAcceptor
{
    use MaybeIterableTypeTrait;
    use MaybeObjectTypeTrait;
    use MaybeOffsetAccessibleTypeTrait;
    use TruthyBooleanTypeTrait;
    /** @var array<int, \PHPStan\Reflection\Native\NativeParameterReflection> */
    private $parameters;
    /** @var Type */
    private $returnType;
    /** @var bool */
    private $variadic;
    /** @var bool */
    private $isCommonCallable;
    /**
     * @param array<int, \PHPStan\Reflection\Native\NativeParameterReflection> $parameters
     * @param Type $returnType
     * @param bool $variadic
     */
    public function __construct(?array $parameters = null, ?\PHPStan\Type\Type $returnType = null, bool $variadic = \true)
    {
        if ($returnType === null) {
            $returnType = new \PHPStan\Type\MixedType();
        }
        $this->parameters = $parameters ?? [];
        $this->returnType = $returnType;
        $this->variadic = $variadic;
        $this->isCommonCallable = $parameters === null;
    }
    /**
     * @return string[]
     */
    public function getReferencedClasses() : array
    {
        return [];
    }
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return \PHPStan\Type\CompoundTypeHelper::accepts($type, $this, $strictTypes);
        }
        return $this->isSuperTypeOf($type);
    }
    public function isSuperTypeOf(\PHPStan\Type\Type $type) : \PHPStan\TrinaryLogic
    {
        $isCallable = $type->isCallable();
        if ($isCallable->no() || $this->isCommonCallable) {
            return $isCallable;
        }
        static $scope;
        if ($scope === null) {
            $scope = new \PHPStan\Analyser\OutOfClassScope();
        }
        $variantsResult = null;
        foreach ($type->getCallableParametersAcceptors($scope) as $variant) {
            $isSuperType = \PHPStan\Type\CallableTypeHelper::isParametersAcceptorSuperTypeOf($this, $variant);
            if ($variantsResult === null) {
                $variantsResult = $isSuperType;
            } else {
                $variantsResult = $variantsResult->or($isSuperType);
            }
        }
        if ($variantsResult === null) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $isCallable->and($variantsResult);
    }
    public function isSubTypeOf(\PHPStan\Type\Type $otherType) : \PHPStan\TrinaryLogic
    {
        if ($otherType instanceof \PHPStan\Type\IntersectionType || $otherType instanceof \PHPStan\Type\UnionType) {
            return $otherType->isSuperTypeOf($this);
        }
        return $otherType->isCallable()->and($otherType instanceof self ? \PHPStan\TrinaryLogic::createYes() : \PHPStan\TrinaryLogic::createMaybe());
    }
    public function equals(\PHPStan\Type\Type $type) : bool
    {
        return $type instanceof self;
    }
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return $level->handle(static function () : string {
            return 'callable';
        }, function () use($level) : string {
            return \sprintf('callable(%s): %s', \implode(', ', \array_map(static function (\PHPStan\Reflection\Native\NativeParameterReflection $param) use($level) : string {
                return $param->getType()->describe($level);
            }, $this->getParameters())), $this->returnType->describe($level));
        });
    }
    public function isCallable() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    /**
     * @param \PHPStan\Reflection\ClassMemberAccessAnswerer $scope
     * @return \PHPStan\Reflection\ParametersAcceptor[]
     */
    public function getCallableParametersAcceptors(\PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : array
    {
        return [$this];
    }
    public function toNumber() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toString() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toArray() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType());
    }
    /**
     * @return array<int, \PHPStan\Reflection\Native\NativeParameterReflection>
     */
    public function getParameters() : array
    {
        return $this->parameters;
    }
    public function isVariadic() : bool
    {
        return $this->variadic;
    }
    public function getReturnType() : \PHPStan\Type\Type
    {
        return $this->returnType;
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self((bool) $properties['isCommonCallable'] ? null : $properties['parameters'], $properties['returnType'], $properties['variadic']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\TrinaryLogic;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\Traits\NonCallableTypeTrait;
use PHPStan\Type\Traits\NonIterableTypeTrait;
use PHPStan\Type\Traits\NonObjectTypeTrait;
use PHPStan\Type\Traits\UndecidedBooleanTypeTrait;
class IntegerType implements \PHPStan\Type\Type
{
    use JustNullableTypeTrait;
    use NonCallableTypeTrait;
    use NonIterableTypeTrait;
    use NonObjectTypeTrait;
    use UndecidedBooleanTypeTrait;
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return 'int';
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self();
    }
    public function toNumber() : \PHPStan\Type\Type
    {
        return $this;
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\FloatType();
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        return $this;
    }
    public function toString() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\StringType();
    }
    public function toArray() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\Constant\ConstantArrayType([new \PHPStan\Type\Constant\ConstantIntegerType(0)], [$this], 1);
    }
    public function isOffsetAccessible() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function hasOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function getOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\NullType();
    }
    public function setOffsetValueType(?\PHPStan\Type\Type $offsetType, \PHPStan\Type\Type $valueType) : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\Type\Accessory\AccessoryType;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantFloatType;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\Constant\ConstantStringType;
class UnionTypeHelper
{
    /**
     * @param string $className
     * @param \PHPStan\Type\Type[] $types
     * @return \PHPStan\Type\Type[]
     */
    public static function resolveStatic(string $className, array $types) : array
    {
        foreach ($types as $i => $type) {
            if (!$type instanceof \PHPStan\Type\StaticResolvableType) {
                continue;
            }
            $types[$i] = $type->resolveStatic($className);
        }
        return $types;
    }
    /**
     * @param string $className
     * @param \PHPStan\Type\Type[] $types
     * @return \PHPStan\Type\Type[]
     */
    public static function changeBaseClass(string $className, array $types) : array
    {
        foreach ($types as $i => $type) {
            if (!$type instanceof \PHPStan\Type\StaticResolvableType) {
                continue;
            }
            $types[$i] = $type->changeBaseClass($className);
        }
        return $types;
    }
    /**
     * @param \PHPStan\Type\Type[] $types
     * @return string[]
     */
    public static function getReferencedClasses(array $types) : array
    {
        $subTypeClasses = [];
        foreach ($types as $type) {
            $subTypeClasses[] = $type->getReferencedClasses();
        }
        return \array_merge(...$subTypeClasses);
    }
    /**
     * @param \PHPStan\Type\Type[] $types
     * @return \PHPStan\Type\Type[]
     */
    public static function sortTypes(array $types) : array
    {
        \usort($types, static function (\PHPStan\Type\Type $a, \PHPStan\Type\Type $b) : float {
            if ($a instanceof \PHPStan\Type\NullType) {
                return 1;
            } elseif ($b instanceof \PHPStan\Type\NullType) {
                return -1;
            }
            if ($a instanceof \PHPStan\Type\Accessory\AccessoryType) {
                if ($b instanceof \PHPStan\Type\Accessory\AccessoryType) {
                    return \strcasecmp($a->describe(\PHPStan\Type\VerbosityLevel::value()), $b->describe(\PHPStan\Type\VerbosityLevel::value()));
                }
                return 1;
            }
            if ($b instanceof \PHPStan\Type\Accessory\AccessoryType) {
                return -1;
            }
            $aIsBool = $a instanceof \PHPStan\Type\Constant\ConstantBooleanType;
            $bIsBool = $b instanceof \PHPStan\Type\Constant\ConstantBooleanType;
            if ($aIsBool && !$bIsBool) {
                return 1;
            } elseif ($bIsBool && !$aIsBool) {
                return -1;
            }
            if ($a instanceof \PHPStan\Type\ConstantScalarType && !$b instanceof \PHPStan\Type\ConstantScalarType) {
                return -1;
            } elseif (!$a instanceof \PHPStan\Type\ConstantScalarType && $b instanceof \PHPStan\Type\ConstantScalarType) {
                return 1;
            }
            if (($a instanceof \PHPStan\Type\Constant\ConstantIntegerType || $a instanceof \PHPStan\Type\Constant\ConstantFloatType) && ($b instanceof \PHPStan\Type\Constant\ConstantIntegerType || $b instanceof \PHPStan\Type\Constant\ConstantFloatType)) {
                return $a->getValue() - $b->getValue();
            }
            if ($a instanceof \PHPStan\Type\Constant\ConstantStringType && $b instanceof \PHPStan\Type\Constant\ConstantStringType) {
                return \strcasecmp($a->getValue(), $b->getValue());
            }
            return \strcasecmp($a->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $b->describe(\PHPStan\Type\VerbosityLevel::typeOnly()));
        });
        return $types;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\Reflection\ConstantReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\PropertyReflection;
use PHPStan\TrinaryLogic;
use PHPStan\Type\Traits\NonCallableTypeTrait;
use PHPStan\Type\Traits\NonIterableTypeTrait;
use PHPStan\Type\Traits\NonOffsetAccessibleTypeTrait;
use PHPStan\Type\Traits\TruthyBooleanTypeTrait;
class NonexistentParentClassType implements \PHPStan\Type\Type
{
    use JustNullableTypeTrait;
    use NonCallableTypeTrait;
    use NonIterableTypeTrait;
    use NonOffsetAccessibleTypeTrait;
    use TruthyBooleanTypeTrait;
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return 'parent';
    }
    public function canAccessProperties() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function hasProperty(string $propertyName) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function getProperty(string $propertyName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\PropertyReflection
    {
        throw new \PHPStan\ShouldNotHappenException();
    }
    public function canCallMethods() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function hasMethod(string $methodName) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function getMethod(string $methodName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\MethodReflection
    {
        throw new \PHPStan\ShouldNotHappenException();
    }
    public function canAccessConstants() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function hasConstant(string $constantName) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function getConstant(string $constantName) : \PHPStan\Reflection\ConstantReflection
    {
        throw new \PHPStan\ShouldNotHappenException();
    }
    public function isCloneable() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function toNumber() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toString() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toArray() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\TrinaryLogic;
class ThisType extends \PHPStan\Type\StaticType
{
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return \sprintf('$this(%s)', $this->getStaticObjectType()->describe($level));
    }
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return \PHPStan\Type\CompoundTypeHelper::accepts($type, $this, $strictTypes);
        }
        return \PHPStan\TrinaryLogic::createFromBoolean($type instanceof self && $type->getBaseClass() === $this->getBaseClass());
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Constant;

use PHPStan\Type\BooleanType;
use PHPStan\Type\ConstantScalarType;
use PHPStan\Type\Traits\ConstantScalarTypeTrait;
use PHPStan\Type\Type;
use PHPStan\Type\VerbosityLevel;
class ConstantBooleanType extends \PHPStan\Type\BooleanType implements \PHPStan\Type\ConstantScalarType
{
    use ConstantScalarTypeTrait;
    /** @var bool */
    private $value;
    public function __construct(bool $value)
    {
        $this->value = $value;
    }
    public function getValue() : bool
    {
        return $this->value;
    }
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return $this->value ? 'true' : 'false';
    }
    public function toBoolean() : \PHPStan\Type\BooleanType
    {
        return $this;
    }
    public function toNumber() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\Constant\ConstantIntegerType((int) $this->value);
    }
    public function toString() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\Constant\ConstantStringType((string) $this->value);
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\Constant\ConstantIntegerType((int) $this->value);
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\Constant\ConstantFloatType((double) $this->value);
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self($properties['value']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Constant;

use PHPStan\TrinaryLogic;
use PHPStan\Type\Type;
class ConstantArrayTypeAndMethod
{
    /** @var \PHPStan\Type\Type|null */
    private $type;
    /** @var string|null */
    private $method;
    /** @var TrinaryLogic */
    private $certainty;
    private function __construct(?\PHPStan\Type\Type $type, ?string $method, \PHPStan\TrinaryLogic $certainty)
    {
        $this->type = $type;
        $this->method = $method;
        $this->certainty = $certainty;
    }
    public static function createConcrete(\PHPStan\Type\Type $type, string $method, \PHPStan\TrinaryLogic $certainty) : self
    {
        if ($certainty->no()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return new self($type, $method, $certainty);
    }
    public static function createUnknown() : self
    {
        return new self(null, null, \PHPStan\TrinaryLogic::createMaybe());
    }
    public function isUnknown() : bool
    {
        return $this->type === null;
    }
    public function getType() : \PHPStan\Type\Type
    {
        if ($this->type === null) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $this->type;
    }
    public function getMethod() : string
    {
        if ($this->method === null) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $this->method;
    }
    public function getCertainty() : \PHPStan\TrinaryLogic
    {
        return $this->certainty;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Constant;

use PHPStan\Type\BooleanType;
trait ConstantScalarToBooleanTrait
{
    public function toBoolean() : \PHPStan\Type\BooleanType
    {
        return new \PHPStan\Type\Constant\ConstantBooleanType((bool) $this->value);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Constant;

use PHPStan\TrinaryLogic;
use PHPStan\Type\CompoundType;
use PHPStan\Type\ConstantScalarType;
use PHPStan\Type\FloatType;
use PHPStan\Type\Traits\ConstantScalarTypeTrait;
use PHPStan\Type\Type;
use PHPStan\Type\VerbosityLevel;
class ConstantFloatType extends \PHPStan\Type\FloatType implements \PHPStan\Type\ConstantScalarType
{
    use ConstantScalarTypeTrait;
    use ConstantScalarToBooleanTrait;
    /** @var float */
    private $value;
    public function __construct(float $value)
    {
        $this->value = $value;
    }
    public function getValue() : float
    {
        return $this->value;
    }
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return $level->handle(static function () : string {
            return 'float';
        }, function () : string {
            $formatted = (string) $this->value;
            if (\strpos($formatted, '.') === \false) {
                $formatted .= '.0';
            }
            return $formatted;
        });
    }
    public function isSuperTypeOf(\PHPStan\Type\Type $type) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof self) {
            if (!$this->equals($type)) {
                if ($this->describe(\PHPStan\Type\VerbosityLevel::value()) === $type->describe(\PHPStan\Type\VerbosityLevel::value())) {
                    return \PHPStan\TrinaryLogic::createMaybe();
                }
                return \PHPStan\TrinaryLogic::createNo();
            }
            return \PHPStan\TrinaryLogic::createYes();
        }
        if ($type instanceof parent) {
            return \PHPStan\TrinaryLogic::createMaybe();
        }
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return $type->isSubTypeOf($this);
        }
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function toString() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\Constant\ConstantStringType((string) $this->value);
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\Constant\ConstantIntegerType((int) $this->value);
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self($properties['value']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Constant;

use PHPStan\Broker\Broker;
use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\Reflection\InaccessibleMethod;
use PHPStan\Reflection\TrivialParametersAcceptor;
use PHPStan\TrinaryLogic;
use PHPStan\Type\ArrayType;
use PHPStan\Type\BooleanType;
use PHPStan\Type\CompoundType;
use PHPStan\Type\ConstantType;
use PHPStan\Type\ErrorType;
use PHPStan\Type\MixedType;
use PHPStan\Type\NeverType;
use PHPStan\Type\ObjectType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
use PHPStan\Type\UnionType;
use PHPStan\Type\VerbosityLevel;
class ConstantArrayType extends \PHPStan\Type\ArrayType implements \PHPStan\Type\ConstantType
{
    private const DESCRIBE_LIMIT = 8;
    /** @var array<int, ConstantIntegerType|ConstantStringType> */
    private $keyTypes;
    /** @var array<int, Type> */
    private $valueTypes;
    /** @var int */
    private $nextAutoIndex;
    /**
     * @param array<int, ConstantIntegerType|ConstantStringType> $keyTypes
     * @param array<int, Type> $valueTypes
     * @param int $nextAutoIndex
     */
    public function __construct(array $keyTypes, array $valueTypes, int $nextAutoIndex = 0)
    {
        \assert(\count($keyTypes) === \count($valueTypes));
        parent::__construct(\count($keyTypes) > 0 ? \PHPStan\Type\TypeCombinator::union(...$keyTypes) : new \PHPStan\Type\NeverType(), \count($valueTypes) > 0 ? \PHPStan\Type\TypeCombinator::union(...$valueTypes) : new \PHPStan\Type\NeverType());
        $this->keyTypes = $keyTypes;
        $this->valueTypes = $valueTypes;
        $this->nextAutoIndex = $nextAutoIndex;
    }
    public function getNextAutoIndex() : int
    {
        return $this->nextAutoIndex;
    }
    public function getKeyType() : \PHPStan\Type\Type
    {
        if (\count($this->keyTypes) > 1) {
            return new \PHPStan\Type\UnionType($this->keyTypes);
        }
        return parent::getKeyType();
    }
    /**
     * @return array<int, ConstantIntegerType|ConstantStringType>
     */
    public function getKeyTypes() : array
    {
        return $this->keyTypes;
    }
    /**
     * @return array<int, Type>
     */
    public function getValueTypes() : array
    {
        return $this->valueTypes;
    }
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof self) {
            if (\count($this->keyTypes) !== \count($type->keyTypes)) {
                return \PHPStan\TrinaryLogic::createNo();
            }
            $result = \PHPStan\TrinaryLogic::createYes();
            foreach (\array_keys($this->keyTypes) as $i) {
                $result = $result->and($this->keyTypes[$i]->accepts($type->keyTypes[$i], $strictTypes))->and($this->valueTypes[$i]->accepts($type->valueTypes[$i], $strictTypes));
            }
            return $result;
        }
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function isSuperTypeOf(\PHPStan\Type\Type $type) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof self) {
            if (\count($this->keyTypes) !== \count($type->keyTypes)) {
                return \PHPStan\TrinaryLogic::createNo();
            }
            $results = [];
            foreach (\array_keys($this->keyTypes) as $i) {
                $results[] = $this->keyTypes[$i]->isSuperTypeOf($type->keyTypes[$i]);
                $results[] = $this->valueTypes[$i]->isSuperTypeOf($type->valueTypes[$i]);
            }
            return \PHPStan\TrinaryLogic::createYes()->and(...$results);
        }
        if ($type instanceof \PHPStan\Type\ArrayType) {
            $result = \PHPStan\TrinaryLogic::createMaybe();
            if (\count($this->keyTypes) === 0) {
                return $result;
            }
            return $result->and($this->getKeyType()->isSuperTypeOf($type->getKeyType()), $this->getItemType()->isSuperTypeOf($type->getItemType()));
        }
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return $type->isSubTypeOf($this);
        }
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function equals(\PHPStan\Type\Type $type) : bool
    {
        if (!$type instanceof self) {
            return \false;
        }
        if (\count($this->keyTypes) !== \count($type->keyTypes)) {
            return \false;
        }
        foreach ($this->keyTypes as $i => $keyType) {
            $valueType = $this->valueTypes[$i];
            if (!$valueType->equals($type->valueTypes[$i])) {
                return \false;
            }
            if (!$keyType->equals($type->keyTypes[$i])) {
                return \false;
            }
        }
        return \true;
    }
    public function isCallable() : \PHPStan\TrinaryLogic
    {
        $typeAndMethod = $this->findTypeAndMethodName();
        if ($typeAndMethod === null) {
            return \PHPStan\TrinaryLogic::createNo();
        }
        return $typeAndMethod->getCertainty();
    }
    /**
     * @param \PHPStan\Reflection\ClassMemberAccessAnswerer $scope
     * @return \PHPStan\Reflection\ParametersAcceptor[]
     */
    public function getCallableParametersAcceptors(\PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : array
    {
        $typeAndMethodName = $this->findTypeAndMethodName();
        if ($typeAndMethodName === null) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        if ($typeAndMethodName->isUnknown() || !$typeAndMethodName->getCertainty()->yes()) {
            return [new \PHPStan\Reflection\TrivialParametersAcceptor()];
        }
        $method = $typeAndMethodName->getType()->getMethod($typeAndMethodName->getMethod(), $scope);
        if (!$scope->canCallMethod($method)) {
            return [new \PHPStan\Reflection\InaccessibleMethod($method)];
        }
        return $method->getVariants();
    }
    private function findTypeAndMethodName() : ?\PHPStan\Type\Constant\ConstantArrayTypeAndMethod
    {
        if (\count($this->keyTypes) !== 2) {
            return null;
        }
        if ($this->keyTypes[0]->isSuperTypeOf(new \PHPStan\Type\Constant\ConstantIntegerType(0))->no()) {
            return null;
        }
        if ($this->keyTypes[1]->isSuperTypeOf(new \PHPStan\Type\Constant\ConstantIntegerType(1))->no()) {
            return null;
        }
        [$classOrObject, $method] = $this->valueTypes;
        if (!$method instanceof \PHPStan\Type\Constant\ConstantStringType) {
            return \PHPStan\Type\Constant\ConstantArrayTypeAndMethod::createUnknown();
        }
        if ($classOrObject instanceof \PHPStan\Type\Constant\ConstantStringType) {
            $broker = \PHPStan\Broker\Broker::getInstance();
            if (!$broker->hasClass($classOrObject->getValue())) {
                return \PHPStan\Type\Constant\ConstantArrayTypeAndMethod::createUnknown();
            }
            $type = new \PHPStan\Type\ObjectType($broker->getClass($classOrObject->getValue())->getName());
        } elseif ((new \PHPStan\Type\ObjectWithoutClassType())->isSuperTypeOf($classOrObject)->yes()) {
            $type = $classOrObject;
        } else {
            return \PHPStan\Type\Constant\ConstantArrayTypeAndMethod::createUnknown();
        }
        $has = $type->hasMethod($method->getValue());
        if (!$has->no()) {
            return \PHPStan\Type\Constant\ConstantArrayTypeAndMethod::createConcrete($type, $method->getValue(), $has);
        }
        return null;
    }
    public function hasOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\TrinaryLogic
    {
        $offsetType = \PHPStan\Type\ArrayType::castToArrayKeyType($offsetType);
        if ($offsetType instanceof \PHPStan\Type\UnionType) {
            $results = [];
            foreach ($offsetType->getTypes() as $innerType) {
                $results[] = $this->hasOffsetValueType($innerType);
            }
            return \PHPStan\TrinaryLogic::extremeIdentity(...$results);
        }
        return $this->getKeyType()->isSuperTypeOf($offsetType);
    }
    public function getOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\Type\Type
    {
        $offsetType = \PHPStan\Type\ArrayType::castToArrayKeyType($offsetType);
        $matchingValueTypes = [];
        foreach ($this->keyTypes as $i => $keyType) {
            if ($keyType->isSuperTypeOf($offsetType)->no()) {
                continue;
            }
            $matchingValueTypes[] = $this->valueTypes[$i];
        }
        if (\count($matchingValueTypes) > 0) {
            $type = \PHPStan\Type\TypeCombinator::union(...$matchingValueTypes);
            if ($type instanceof \PHPStan\Type\ErrorType) {
                return new \PHPStan\Type\MixedType();
            }
            return $type;
        }
        return new \PHPStan\Type\ErrorType();
        // undefined offset
    }
    public function setOffsetValueType(?\PHPStan\Type\Type $offsetType, \PHPStan\Type\Type $valueType) : \PHPStan\Type\Type
    {
        $builder = \PHPStan\Type\Constant\ConstantArrayTypeBuilder::createFromConstantArray($this);
        $builder->setOffsetValueType($offsetType, $valueType);
        return $builder->getArray();
    }
    public function unsetOffset(\PHPStan\Type\Type $offsetType) : \PHPStan\Type\Type
    {
        $offsetType = \PHPStan\Type\ArrayType::castToArrayKeyType($offsetType);
        if ($offsetType instanceof \PHPStan\Type\Constant\ConstantIntegerType || $offsetType instanceof \PHPStan\Type\Constant\ConstantStringType) {
            foreach ($this->keyTypes as $i => $keyType) {
                if ($keyType->getValue() === $offsetType->getValue()) {
                    $newKeyTypes = $this->keyTypes;
                    unset($newKeyTypes[$i]);
                    $newValueTypes = $this->valueTypes;
                    unset($newValueTypes[$i]);
                    return new self(\array_values($newKeyTypes), \array_values($newValueTypes), $this->nextAutoIndex);
                }
            }
        }
        return $this->generalize();
    }
    public function isIterableAtLeastOnce() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createFromBoolean(\count($this->keyTypes) > 0);
    }
    public function removeLast() : self
    {
        if (\count($this->keyTypes) === 0) {
            return $this;
        }
        $keyTypes = $this->keyTypes;
        $valueTypes = $this->valueTypes;
        $removedKeyType = \array_pop($keyTypes);
        \array_pop($valueTypes);
        $nextAutoindex = $removedKeyType instanceof \PHPStan\Type\Constant\ConstantIntegerType ? $removedKeyType->getValue() : $this->nextAutoIndex;
        return new self($keyTypes, $valueTypes, $nextAutoindex);
    }
    public function removeFirst() : \PHPStan\Type\ArrayType
    {
        $builder = \PHPStan\Type\Constant\ConstantArrayTypeBuilder::createEmpty();
        foreach ($this->keyTypes as $i => $keyType) {
            if ($i === 0) {
                continue;
            }
            $valueType = $this->valueTypes[$i];
            if ($keyType instanceof \PHPStan\Type\Constant\ConstantIntegerType) {
                $keyType = null;
            }
            $builder->setOffsetValueType($keyType, $valueType);
        }
        return $builder->getArray();
    }
    public function slice(int $offset, ?int $limit, bool $preserveKeys = \false) : self
    {
        if (\count($this->keyTypes) === 0) {
            return $this;
        }
        $keyTypes = \array_slice($this->keyTypes, $offset, $limit);
        $valueTypes = \array_slice($this->valueTypes, $offset, $limit);
        if (!$preserveKeys) {
            $i = 0;
            /** @var array<int, ConstantIntegerType|ConstantStringType> $keyTypes */
            $keyTypes = \array_map(static function ($keyType) use(&$i) {
                if ($keyType instanceof \PHPStan\Type\Constant\ConstantIntegerType) {
                    $i++;
                    return new \PHPStan\Type\Constant\ConstantIntegerType($i - 1);
                }
                return $keyType;
            }, $keyTypes);
        }
        /** @var int|float $nextAutoIndex */
        $nextAutoIndex = 0;
        foreach ($keyTypes as $keyType) {
            if (!$keyType instanceof \PHPStan\Type\Constant\ConstantIntegerType) {
                continue;
            }
            /** @var int|float $nextAutoIndex */
            $nextAutoIndex = \max($nextAutoIndex, $keyType->getValue() + 1);
        }
        return new self($keyTypes, $valueTypes, (int) $nextAutoIndex);
    }
    public function toBoolean() : \PHPStan\Type\BooleanType
    {
        return new \PHPStan\Type\Constant\ConstantBooleanType(\count($this->keyTypes) > 0);
    }
    public function generalize() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ArrayType(\PHPStan\Type\TypeUtils::generalizeType($this->getKeyType()), $this->getItemType());
    }
    /**
     * @return static
     */
    public function generalizeValues() : \PHPStan\Type\ArrayType
    {
        $valueTypes = [];
        foreach ($this->valueTypes as $valueType) {
            $valueTypes[] = \PHPStan\Type\TypeUtils::generalizeType($valueType);
        }
        return new self($this->keyTypes, $valueTypes, $this->nextAutoIndex);
    }
    /**
     * @return static
     */
    public function getKeysArray() : \PHPStan\Type\ArrayType
    {
        $keyTypes = [];
        $valueTypes = [];
        $autoIndex = 0;
        foreach ($this->keyTypes as $i => $keyType) {
            $keyTypes[] = new \PHPStan\Type\Constant\ConstantIntegerType($i);
            $valueTypes[] = $keyType;
            $autoIndex++;
        }
        return new self($keyTypes, $valueTypes, $autoIndex);
    }
    /**
     * @return static
     */
    public function getValuesArray() : \PHPStan\Type\ArrayType
    {
        $keyTypes = [];
        $valueTypes = [];
        $autoIndex = 0;
        foreach ($this->valueTypes as $i => $valueType) {
            $keyTypes[] = new \PHPStan\Type\Constant\ConstantIntegerType($i);
            $valueTypes[] = $valueType;
            $autoIndex++;
        }
        return new self($keyTypes, $valueTypes, $autoIndex);
    }
    public function count() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\Constant\ConstantIntegerType(\count($this->getKeyTypes()));
    }
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        $describeValue = function (bool $truncate) use($level) : string {
            $items = [];
            $values = [];
            $exportValuesOnly = \true;
            foreach ($this->keyTypes as $i => $keyType) {
                $valueType = $this->valueTypes[$i];
                if ($keyType->getValue() !== $i) {
                    $exportValuesOnly = \false;
                }
                $items[] = \sprintf('%s => %s', \var_export($keyType->getValue(), \true), $valueType->describe($level));
                $values[] = $valueType->describe($level);
            }
            $append = '';
            if ($truncate && \count($items) > self::DESCRIBE_LIMIT) {
                $items = \array_slice($items, 0, self::DESCRIBE_LIMIT);
                $values = \array_slice($values, 0, self::DESCRIBE_LIMIT);
                $append = ', ...';
            }
            return \sprintf('array(%s%s)', \implode(', ', $exportValuesOnly ? $values : $items), $append);
        };
        return $level->handle(function () use($level) : string {
            return parent::describe($level);
        }, static function () use($describeValue) : string {
            return $describeValue(\true);
        }, static function () use($describeValue) : string {
            return $describeValue(\false);
        });
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self($properties['keyTypes'], $properties['valueTypes'], $properties['nextAutoIndex']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Constant;

use PhpParser\Node\Name;
use PHPStan\Broker\Broker;
use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\Reflection\InaccessibleMethod;
use PHPStan\Reflection\TrivialParametersAcceptor;
use PHPStan\TrinaryLogic;
use PHPStan\Type\ConstantScalarType;
use PHPStan\Type\ErrorType;
use PHPStan\Type\StringType;
use PHPStan\Type\Traits\ConstantScalarTypeTrait;
use PHPStan\Type\Type;
use PHPStan\Type\VerbosityLevel;
class ConstantStringType extends \PHPStan\Type\StringType implements \PHPStan\Type\ConstantScalarType
{
    private const DESCRIBE_LIMIT = 20;
    use ConstantScalarTypeTrait;
    use ConstantScalarToBooleanTrait;
    /** @var string */
    private $value;
    public function __construct(string $value)
    {
        $this->value = $value;
    }
    public function getValue() : string
    {
        return $this->value;
    }
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return $level->handle(static function () : string {
            return 'string';
        }, function () : string {
            return \var_export(\_HumbugBoxb94336daae36\Nette\Utils\Strings::truncate($this->value, self::DESCRIBE_LIMIT), \true);
        }, function () : string {
            return \var_export($this->value, \true);
        });
    }
    public function isCallable() : \PHPStan\TrinaryLogic
    {
        if ($this->value === '') {
            return \PHPStan\TrinaryLogic::createNo();
        }
        $broker = \PHPStan\Broker\Broker::getInstance();
        // 'my_function'
        if ($broker->hasFunction(new \PhpParser\Node\Name($this->value), null)) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        // 'MyClass::myStaticFunction'
        $matches = \_HumbugBoxb94336daae36\Nette\Utils\Strings::match($this->value, '#^([a-zA-Z_\\x7f-\\xff\\\\][a-zA-Z0-9_\\x7f-\\xff\\\\]*)::([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*)\\z#');
        if ($matches !== null) {
            if (!$broker->hasClass($matches[1])) {
                return \PHPStan\TrinaryLogic::createMaybe();
            }
            $classRef = $broker->getClass($matches[1]);
            if ($classRef->hasMethod($matches[2])) {
                return \PHPStan\TrinaryLogic::createYes();
            }
            if (!$classRef->getNativeReflection()->isFinal()) {
                return \PHPStan\TrinaryLogic::createMaybe();
            }
            return \PHPStan\TrinaryLogic::createNo();
        }
        return \PHPStan\TrinaryLogic::createNo();
    }
    /**
     * @param \PHPStan\Reflection\ClassMemberAccessAnswerer $scope
     * @return \PHPStan\Reflection\ParametersAcceptor[]
     */
    public function getCallableParametersAcceptors(\PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : array
    {
        $broker = \PHPStan\Broker\Broker::getInstance();
        // 'my_function'
        $functionName = new \PhpParser\Node\Name($this->value);
        if ($broker->hasFunction($functionName, null)) {
            return $broker->getFunction($functionName, null)->getVariants();
        }
        // 'MyClass::myStaticFunction'
        $matches = \_HumbugBoxb94336daae36\Nette\Utils\Strings::match($this->value, '#^([a-zA-Z_\\x7f-\\xff\\\\][a-zA-Z0-9_\\x7f-\\xff\\\\]*)::([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*)\\z#');
        if ($matches !== null) {
            if (!$broker->hasClass($matches[1])) {
                return [new \PHPStan\Reflection\TrivialParametersAcceptor()];
            }
            $classReflection = $broker->getClass($matches[1]);
            if ($classReflection->hasMethod($matches[2])) {
                $method = $classReflection->getMethod($matches[2], $scope);
                if (!$scope->canCallMethod($method)) {
                    return [new \PHPStan\Reflection\InaccessibleMethod($method)];
                }
                return $method->getVariants();
            }
            if (!$classReflection->getNativeReflection()->isFinal()) {
                return [new \PHPStan\Reflection\TrivialParametersAcceptor()];
            }
        }
        throw new \PHPStan\ShouldNotHappenException();
    }
    public function toNumber() : \PHPStan\Type\Type
    {
        if (\is_numeric($this->value)) {
            /** @var mixed $value */
            $value = $this->value;
            $value = +$value;
            if (\is_float($value)) {
                return new \PHPStan\Type\Constant\ConstantFloatType($value);
            }
            return new \PHPStan\Type\Constant\ConstantIntegerType($value);
        }
        return new \PHPStan\Type\ErrorType();
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        $type = $this->toNumber();
        if ($type instanceof \PHPStan\Type\ErrorType) {
            return $type;
        }
        return $type->toInteger();
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        $type = $this->toNumber();
        if ($type instanceof \PHPStan\Type\ErrorType) {
            return $type;
        }
        return $type->toFloat();
    }
    public function hasOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\TrinaryLogic
    {
        if ($offsetType instanceof \PHPStan\Type\Constant\ConstantIntegerType) {
            return \PHPStan\TrinaryLogic::createFromBoolean($offsetType->getValue() < \strlen($this->value));
        }
        return parent::hasOffsetValueType($offsetType);
    }
    public function getOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\Type\Type
    {
        if ($offsetType instanceof \PHPStan\Type\Constant\ConstantIntegerType) {
            if ($offsetType->getValue() < \strlen($this->value)) {
                return new self($this->value[$offsetType->getValue()]);
            }
            return new \PHPStan\Type\ErrorType();
        }
        return parent::getOffsetValueType($offsetType);
    }
    public function setOffsetValueType(?\PHPStan\Type\Type $offsetType, \PHPStan\Type\Type $valueType) : \PHPStan\Type\Type
    {
        $valueStringType = $valueType->toString();
        if ($valueStringType instanceof \PHPStan\Type\ErrorType) {
            return new \PHPStan\Type\ErrorType();
        }
        if ($offsetType instanceof \PHPStan\Type\Constant\ConstantIntegerType && $valueStringType instanceof \PHPStan\Type\Constant\ConstantStringType) {
            $value = $this->value;
            $value[$offsetType->getValue()] = $valueStringType->getValue();
            return new self($value);
        }
        return parent::setOffsetValueType($offsetType, $valueType);
    }
    public function append(self $otherString) : self
    {
        return new self($this->getValue() . $otherString->getValue());
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self($properties['value']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Constant;

use PHPStan\Type\ArrayType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
class ConstantArrayTypeBuilder
{
    /** @var array<int, Type> */
    private $keyTypes = [];
    /** @var array<int, Type> */
    private $valueTypes = [];
    /** @var int */
    private $nextAutoIndex;
    /** @var bool */
    private $degradeToGeneralArray = \false;
    /**
     * @param array<int, ConstantIntegerType|ConstantStringType> $keyTypes
     * @param array<int, Type> $valueTypes
     * @param int $nextAutoIndex
     */
    private function __construct(array $keyTypes, array $valueTypes, int $nextAutoIndex)
    {
        $this->keyTypes = $keyTypes;
        $this->valueTypes = $valueTypes;
        $this->nextAutoIndex = $nextAutoIndex;
    }
    public static function createEmpty() : self
    {
        return new self([], [], 0);
    }
    public static function createFromConstantArray(\PHPStan\Type\Constant\ConstantArrayType $startArrayType) : self
    {
        return new self($startArrayType->getKeyTypes(), $startArrayType->getValueTypes(), $startArrayType->getNextAutoIndex());
    }
    public function setOffsetValueType(?\PHPStan\Type\Type $offsetType, \PHPStan\Type\Type $valueType) : void
    {
        if ($offsetType === null) {
            $offsetType = new \PHPStan\Type\Constant\ConstantIntegerType($this->nextAutoIndex);
        } else {
            $offsetType = \PHPStan\Type\ArrayType::castToArrayKeyType($offsetType);
        }
        if (!$this->degradeToGeneralArray && ($offsetType instanceof \PHPStan\Type\Constant\ConstantIntegerType || $offsetType instanceof \PHPStan\Type\Constant\ConstantStringType)) {
            /** @var ConstantIntegerType|ConstantStringType $keyType */
            foreach ($this->keyTypes as $i => $keyType) {
                if ($keyType->getValue() === $offsetType->getValue()) {
                    $this->valueTypes[$i] = $valueType;
                    return;
                }
            }
            $this->keyTypes[] = $offsetType;
            $this->valueTypes[] = $valueType;
            /** @var int|float $newNextAutoIndex */
            $newNextAutoIndex = $offsetType instanceof \PHPStan\Type\Constant\ConstantIntegerType ? \max($this->nextAutoIndex, $offsetType->getValue() + 1) : $this->nextAutoIndex;
            if (!\is_float($newNextAutoIndex)) {
                $this->nextAutoIndex = $newNextAutoIndex;
            }
            return;
        }
        $this->keyTypes[] = $offsetType;
        $this->valueTypes[] = $valueType;
        $this->degradeToGeneralArray = \true;
    }
    public function getArray() : \PHPStan\Type\ArrayType
    {
        if (!$this->degradeToGeneralArray) {
            /** @var array<int, ConstantIntegerType|ConstantStringType> $keyTypes */
            $keyTypes = $this->keyTypes;
            return new \PHPStan\Type\Constant\ConstantArrayType($keyTypes, $this->valueTypes, $this->nextAutoIndex);
        }
        return new \PHPStan\Type\ArrayType(\PHPStan\Type\TypeCombinator::union(...$this->keyTypes), \PHPStan\Type\TypeCombinator::union(...$this->valueTypes));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Constant;

use PHPStan\Type\ConstantScalarType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\Traits\ConstantScalarTypeTrait;
use PHPStan\Type\Type;
use PHPStan\Type\VerbosityLevel;
class ConstantIntegerType extends \PHPStan\Type\IntegerType implements \PHPStan\Type\ConstantScalarType
{
    use ConstantScalarTypeTrait;
    use ConstantScalarToBooleanTrait;
    /** @var int */
    private $value;
    public function __construct(int $value)
    {
        $this->value = $value;
    }
    public function getValue() : int
    {
        return $this->value;
    }
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return $level->handle(static function () : string {
            return 'int';
        }, function () : string {
            return \sprintf('%s', $this->value);
        });
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\Constant\ConstantFloatType($this->value);
    }
    public function toString() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\Constant\ConstantStringType((string) $this->value);
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self($properties['value']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\TrinaryLogic;
trait JustNullableTypeTrait
{
    /**
     * @return string[]
     */
    public function getReferencedClasses() : array
    {
        return [];
    }
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof static) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return \PHPStan\Type\CompoundTypeHelper::accepts($type, $this, $strictTypes);
        }
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function isSuperTypeOf(\PHPStan\Type\Type $type) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof self) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return $type->isSubTypeOf($this);
        }
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function equals(\PHPStan\Type\Type $type) : bool
    {
        return $type instanceof self;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\Reflection\ConstantReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\PropertyReflection;
use PHPStan\TrinaryLogic;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantBooleanType;
class UnionType implements \PHPStan\Type\CompoundType, \PHPStan\Type\StaticResolvableType
{
    /** @var \PHPStan\Type\Type[] */
    private $types;
    /**
     * @param Type[] $types
     */
    public function __construct(array $types)
    {
        $throwException = static function () use($types) : void {
            throw new \PHPStan\ShouldNotHappenException(\sprintf('Cannot create %s with: %s', self::class, \implode(', ', \array_map(static function (\PHPStan\Type\Type $type) : string {
                return $type->describe(\PHPStan\Type\VerbosityLevel::value());
            }, $types))));
        };
        if (\count($types) < 2) {
            $throwException();
        }
        foreach ($types as $type) {
            if (!$type instanceof \PHPStan\Type\UnionType) {
                continue;
            }
            $throwException();
        }
        $this->types = \PHPStan\Type\UnionTypeHelper::sortTypes($types);
    }
    /**
     * @return \PHPStan\Type\Type[]
     */
    public function getTypes() : array
    {
        return $this->types;
    }
    /**
     * @return string[]
     */
    public function getReferencedClasses() : array
    {
        return \PHPStan\Type\UnionTypeHelper::getReferencedClasses($this->getTypes());
    }
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return \PHPStan\Type\CompoundTypeHelper::accepts($type, $this, $strictTypes);
        }
        $results = [];
        foreach ($this->getTypes() as $innerType) {
            $results[] = $innerType->accepts($type, $strictTypes);
        }
        return \PHPStan\TrinaryLogic::createNo()->or(...$results);
    }
    public function isSuperTypeOf(\PHPStan\Type\Type $otherType) : \PHPStan\TrinaryLogic
    {
        if ($otherType instanceof self || $otherType instanceof \PHPStan\Type\IterableType) {
            return $otherType->isSubTypeOf($this);
        }
        $results = [];
        foreach ($this->getTypes() as $innerType) {
            $results[] = $innerType->isSuperTypeOf($otherType);
        }
        return \PHPStan\TrinaryLogic::createNo()->or(...$results);
    }
    public function isSubTypeOf(\PHPStan\Type\Type $otherType) : \PHPStan\TrinaryLogic
    {
        $results = [];
        foreach ($this->getTypes() as $innerType) {
            $results[] = $otherType->isSuperTypeOf($innerType);
        }
        return \PHPStan\TrinaryLogic::extremeIdentity(...$results);
    }
    public function equals(\PHPStan\Type\Type $type) : bool
    {
        if (!$type instanceof self) {
            return \false;
        }
        if (\count($this->types) !== \count($type->types)) {
            return \false;
        }
        foreach ($this->types as $i => $innerType) {
            if (!$innerType->equals($type->types[$i])) {
                return \false;
            }
        }
        return \true;
    }
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        $joinTypes = static function (array $types) use($level) : string {
            $typeNames = [];
            foreach ($types as $type) {
                if ($type instanceof \PHPStan\Type\IntersectionType || $type instanceof \PHPStan\Type\ClosureType || $type instanceof \PHPStan\Type\CallableType) {
                    $typeNames[] = \sprintf('(%s)', $type->describe($level));
                } else {
                    $typeNames[] = $type->describe($level);
                }
            }
            return \implode('|', $typeNames);
        };
        return $level->handle(function () use($joinTypes) : string {
            $types = \PHPStan\Type\TypeCombinator::union(...\array_map(static function (\PHPStan\Type\Type $type) : Type {
                if ($type instanceof \PHPStan\Type\ConstantType && !$type instanceof \PHPStan\Type\Constant\ConstantBooleanType) {
                    return $type->generalize();
                }
                return $type;
            }, $this->types));
            if ($types instanceof \PHPStan\Type\UnionType) {
                return $joinTypes($types->getTypes());
            }
            return $joinTypes([$types]);
        }, function () use($joinTypes) : string {
            $arrayDescription = [];
            $constantArrays = [];
            $commonTypes = [];
            foreach ($this->types as $type) {
                if (!$type instanceof \PHPStan\Type\Constant\ConstantArrayType) {
                    $commonTypes[] = $type;
                    continue;
                }
                $constantArrays[] = $type;
                foreach ($type->getKeyTypes() as $i => $keyType) {
                    if (!isset($arrayDescription[$keyType->getValue()])) {
                        $arrayDescription[$keyType->getValue()] = ['key' => $keyType, 'value' => $type->getValueTypes()[$i], 'count' => 1];
                        continue;
                    }
                    $arrayDescription[$keyType->getValue()] = ['key' => $keyType, 'value' => \PHPStan\Type\TypeCombinator::union($arrayDescription[$keyType->getValue()]['value'], $type->getValueTypes()[$i]), 'count' => $arrayDescription[$keyType->getValue()]['count'] + 1];
                }
            }
            $someKeyCountIsHigherThanOne = \false;
            foreach ($arrayDescription as $value) {
                if ($value['count'] > 1) {
                    $someKeyCountIsHigherThanOne = \true;
                    break;
                }
            }
            if (!$someKeyCountIsHigherThanOne) {
                return $joinTypes(\PHPStan\Type\UnionTypeHelper::sortTypes(\array_merge($commonTypes, $constantArrays)));
            }
            $constantArraysCount = \count($constantArrays);
            $constantArraysDescriptions = [];
            foreach ($arrayDescription as $value) {
                $constantArraysDescriptions[] = \sprintf('%s%s => %s', $value['count'] < $constantArraysCount ? '?' : '', $value['key']->describe(\PHPStan\Type\VerbosityLevel::value()), $value['value']->describe(\PHPStan\Type\VerbosityLevel::value()));
            }
            $description = '';
            if (\count($commonTypes) > 0) {
                $description = $joinTypes($commonTypes);
                if (\count($constantArraysDescriptions) > 0) {
                    $description .= '|';
                }
            }
            if (\count($constantArraysDescriptions) > 0) {
                $description .= 'array(' . \implode(', ', $constantArraysDescriptions) . ')';
            }
            return $description;
        });
    }
    /**
     * @param callable(Type $type): TrinaryLogic $canCallback
     * @param callable(Type $type): TrinaryLogic $hasCallback
     * @return TrinaryLogic
     */
    private function hasInternal(callable $canCallback, callable $hasCallback) : \PHPStan\TrinaryLogic
    {
        $results = [];
        foreach ($this->types as $type) {
            if ($canCallback($type)->no()) {
                $results[] = \PHPStan\TrinaryLogic::createNo();
                continue;
            }
            $results[] = $hasCallback($type);
        }
        return \PHPStan\TrinaryLogic::extremeIdentity(...$results);
    }
    /**
     * @param callable(Type $type): TrinaryLogic $hasCallback
     * @param callable(Type $type): object $getCallback
     * @return object
     */
    private function getInternal(callable $hasCallback, callable $getCallback)
    {
        /** @var TrinaryLogic|null $result */
        $result = null;
        /** @var object|null $object */
        $object = null;
        foreach ($this->types as $type) {
            $has = $hasCallback($type);
            if (!$has->yes()) {
                continue;
            }
            if ($result !== null && $result->compareTo($has) !== $has) {
                continue;
            }
            $get = $getCallback($type);
            $result = $has;
            $object = $get;
        }
        if ($object === null) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $object;
    }
    public function canAccessProperties() : \PHPStan\TrinaryLogic
    {
        return $this->unionResults(static function (\PHPStan\Type\Type $type) : TrinaryLogic {
            return $type->canAccessProperties();
        });
    }
    public function hasProperty(string $propertyName) : \PHPStan\TrinaryLogic
    {
        return $this->unionResults(static function (\PHPStan\Type\Type $type) use($propertyName) : TrinaryLogic {
            return $type->hasProperty($propertyName);
        });
    }
    public function getProperty(string $propertyName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\PropertyReflection
    {
        return $this->getInternal(static function (\PHPStan\Type\Type $type) use($propertyName) : TrinaryLogic {
            return $type->hasProperty($propertyName);
        }, static function (\PHPStan\Type\Type $type) use($propertyName, $scope) : PropertyReflection {
            return $type->getProperty($propertyName, $scope);
        });
    }
    public function canCallMethods() : \PHPStan\TrinaryLogic
    {
        return $this->unionResults(static function (\PHPStan\Type\Type $type) : TrinaryLogic {
            return $type->canCallMethods();
        });
    }
    public function hasMethod(string $methodName) : \PHPStan\TrinaryLogic
    {
        return $this->unionResults(static function (\PHPStan\Type\Type $type) use($methodName) : TrinaryLogic {
            return $type->hasMethod($methodName);
        });
    }
    public function getMethod(string $methodName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\MethodReflection
    {
        return $this->getInternal(static function (\PHPStan\Type\Type $type) use($methodName) : TrinaryLogic {
            return $type->hasMethod($methodName);
        }, static function (\PHPStan\Type\Type $type) use($methodName, $scope) : MethodReflection {
            return $type->getMethod($methodName, $scope);
        });
    }
    public function canAccessConstants() : \PHPStan\TrinaryLogic
    {
        return $this->unionResults(static function (\PHPStan\Type\Type $type) : TrinaryLogic {
            return $type->canAccessConstants();
        });
    }
    public function hasConstant(string $constantName) : \PHPStan\TrinaryLogic
    {
        return $this->hasInternal(static function (\PHPStan\Type\Type $type) : TrinaryLogic {
            return $type->canAccessConstants();
        }, static function (\PHPStan\Type\Type $type) use($constantName) : TrinaryLogic {
            return $type->hasConstant($constantName);
        });
    }
    public function getConstant(string $constantName) : \PHPStan\Reflection\ConstantReflection
    {
        return $this->getInternal(static function (\PHPStan\Type\Type $type) use($constantName) : TrinaryLogic {
            return $type->hasConstant($constantName);
        }, static function (\PHPStan\Type\Type $type) use($constantName) : ConstantReflection {
            return $type->getConstant($constantName);
        });
    }
    public function resolveStatic(string $className) : \PHPStan\Type\Type
    {
        return new self(\PHPStan\Type\UnionTypeHelper::resolveStatic($className, $this->getTypes()));
    }
    public function changeBaseClass(string $className) : \PHPStan\Type\StaticResolvableType
    {
        return new self(\PHPStan\Type\UnionTypeHelper::changeBaseClass($className, $this->getTypes()));
    }
    public function isIterable() : \PHPStan\TrinaryLogic
    {
        return $this->unionResults(static function (\PHPStan\Type\Type $type) : TrinaryLogic {
            return $type->isIterable();
        });
    }
    public function isIterableAtLeastOnce() : \PHPStan\TrinaryLogic
    {
        return $this->unionResults(static function (\PHPStan\Type\Type $type) : TrinaryLogic {
            return $type->isIterableAtLeastOnce();
        });
    }
    public function getIterableKeyType() : \PHPStan\Type\Type
    {
        return $this->unionTypes(static function (\PHPStan\Type\Type $type) : Type {
            return $type->getIterableKeyType();
        });
    }
    public function getIterableValueType() : \PHPStan\Type\Type
    {
        return $this->unionTypes(static function (\PHPStan\Type\Type $type) : Type {
            return $type->getIterableValueType();
        });
    }
    public function isOffsetAccessible() : \PHPStan\TrinaryLogic
    {
        return $this->unionResults(static function (\PHPStan\Type\Type $type) : TrinaryLogic {
            return $type->isOffsetAccessible();
        });
    }
    public function hasOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\TrinaryLogic
    {
        return $this->unionResults(static function (\PHPStan\Type\Type $type) use($offsetType) : TrinaryLogic {
            return $type->hasOffsetValueType($offsetType);
        });
    }
    public function getOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\Type\Type
    {
        $types = [];
        foreach ($this->types as $innerType) {
            $valueType = $innerType->getOffsetValueType($offsetType);
            if ($valueType instanceof \PHPStan\Type\ErrorType) {
                continue;
            }
            $types[] = $valueType;
        }
        if (\count($types) === 0) {
            return new \PHPStan\Type\ErrorType();
        }
        return \PHPStan\Type\TypeCombinator::union(...$types);
    }
    public function setOffsetValueType(?\PHPStan\Type\Type $offsetType, \PHPStan\Type\Type $valueType) : \PHPStan\Type\Type
    {
        return $this->unionTypes(static function (\PHPStan\Type\Type $type) use($offsetType, $valueType) : Type {
            return $type->setOffsetValueType($offsetType, $valueType);
        });
    }
    public function isCallable() : \PHPStan\TrinaryLogic
    {
        return $this->unionResults(static function (\PHPStan\Type\Type $type) : TrinaryLogic {
            return $type->isCallable();
        });
    }
    /**
     * @param \PHPStan\Reflection\ClassMemberAccessAnswerer $scope
     * @return \PHPStan\Reflection\ParametersAcceptor[]
     */
    public function getCallableParametersAcceptors(\PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : array
    {
        foreach ($this->types as $type) {
            if ($type->isCallable()->no()) {
                continue;
            }
            return $type->getCallableParametersAcceptors($scope);
        }
        throw new \PHPStan\ShouldNotHappenException();
    }
    public function isCloneable() : \PHPStan\TrinaryLogic
    {
        return $this->unionResults(static function (\PHPStan\Type\Type $type) : TrinaryLogic {
            return $type->isCloneable();
        });
    }
    public function toBoolean() : \PHPStan\Type\BooleanType
    {
        /** @var BooleanType $type */
        $type = $this->unionTypes(static function (\PHPStan\Type\Type $type) : BooleanType {
            return $type->toBoolean();
        });
        return $type;
    }
    public function toNumber() : \PHPStan\Type\Type
    {
        $type = $this->unionTypes(static function (\PHPStan\Type\Type $type) : Type {
            return $type->toNumber();
        });
        return $type;
    }
    public function toString() : \PHPStan\Type\Type
    {
        $type = $this->unionTypes(static function (\PHPStan\Type\Type $type) : Type {
            return $type->toString();
        });
        return $type;
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        $type = $this->unionTypes(static function (\PHPStan\Type\Type $type) : Type {
            return $type->toInteger();
        });
        return $type;
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        $type = $this->unionTypes(static function (\PHPStan\Type\Type $type) : Type {
            return $type->toFloat();
        });
        return $type;
    }
    public function toArray() : \PHPStan\Type\Type
    {
        $type = $this->unionTypes(static function (\PHPStan\Type\Type $type) : Type {
            return $type->toArray();
        });
        return $type;
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self($properties['types']);
    }
    /**
     * @param callable(Type $type): TrinaryLogic $getResult
     * @return TrinaryLogic
     */
    private function unionResults(callable $getResult) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::extremeIdentity(...\array_map($getResult, $this->types));
    }
    /**
     * @param callable(Type $type): Type $getType
     * @return Type
     */
    protected function unionTypes(callable $getType) : \PHPStan\Type\Type
    {
        return \PHPStan\Type\TypeCombinator::union(...\array_map($getType, $this->types));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\Reflection\ConstantReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\PropertyReflection;
use PHPStan\Reflection\TrivialParametersAcceptor;
use PHPStan\TrinaryLogic;
use PHPStan\Type\Traits\FalseyBooleanTypeTrait;
class NeverType implements \PHPStan\Type\CompoundType
{
    use FalseyBooleanTypeTrait;
    /**
     * @return string[]
     */
    public function getReferencedClasses() : array
    {
        return [];
    }
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function isSuperTypeOf(\PHPStan\Type\Type $type) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof self) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function equals(\PHPStan\Type\Type $type) : bool
    {
        return $type instanceof self;
    }
    public function isSubTypeOf(\PHPStan\Type\Type $otherType) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return '*NEVER*';
    }
    public function canAccessProperties() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function hasProperty(string $propertyName) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function getProperty(string $propertyName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\PropertyReflection
    {
        throw new \PHPStan\ShouldNotHappenException();
    }
    public function canCallMethods() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function hasMethod(string $methodName) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function getMethod(string $methodName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\MethodReflection
    {
        throw new \PHPStan\ShouldNotHappenException();
    }
    public function canAccessConstants() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function hasConstant(string $constantName) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function getConstant(string $constantName) : \PHPStan\Reflection\ConstantReflection
    {
        throw new \PHPStan\ShouldNotHappenException();
    }
    public function isIterable() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function isIterableAtLeastOnce() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function getIterableKeyType() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\NeverType();
    }
    public function getIterableValueType() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\NeverType();
    }
    public function isOffsetAccessible() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function hasOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function getOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\NeverType();
    }
    public function setOffsetValueType(?\PHPStan\Type\Type $offsetType, \PHPStan\Type\Type $valueType) : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\NeverType();
    }
    public function isCallable() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    /**
     * @param \PHPStan\Reflection\ClassMemberAccessAnswerer $scope
     * @return \PHPStan\Reflection\ParametersAcceptor[]
     */
    public function getCallableParametersAcceptors(\PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : array
    {
        return [new \PHPStan\Reflection\TrivialParametersAcceptor()];
    }
    public function isCloneable() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function toNumber() : \PHPStan\Type\Type
    {
        return $this;
    }
    public function toString() : \PHPStan\Type\Type
    {
        return $this;
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        return $this;
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        return $this;
    }
    public function toArray() : \PHPStan\Type\Type
    {
        return $this;
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PhpParser\Node\Expr\StaticCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\SpecifiedTypes;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Reflection\MethodReflection;
interface StaticMethodTypeSpecifyingExtension
{
    public function getClass() : string;
    public function isStaticMethodSupported(\PHPStan\Reflection\MethodReflection $staticMethodReflection, \PhpParser\Node\Expr\StaticCall $node, \PHPStan\Analyser\TypeSpecifierContext $context) : bool;
    public function specifyTypes(\PHPStan\Reflection\MethodReflection $staticMethodReflection, \PhpParser\Node\Expr\StaticCall $node, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\TypeSpecifierContext $context) : \PHPStan\Analyser\SpecifiedTypes;
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\Reflection\ConstantReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\PropertyReflection;
use PHPStan\TrinaryLogic;
use PHPStan\Type\Traits\TruthyBooleanTypeTrait;
class StaticType implements \PHPStan\Type\StaticResolvableType, \PHPStan\Type\TypeWithClassName
{
    use TruthyBooleanTypeTrait;
    /** @var string */
    private $baseClass;
    /** @var \PHPStan\Type\ObjectType */
    private $staticObjectType;
    public function __construct(string $baseClass)
    {
        $this->baseClass = $baseClass;
        $this->staticObjectType = new \PHPStan\Type\ObjectType($baseClass);
    }
    public function getClassName() : string
    {
        return $this->baseClass;
    }
    protected function getStaticObjectType() : \PHPStan\Type\ObjectType
    {
        return $this->staticObjectType;
    }
    /**
     * @return string[]
     */
    public function getReferencedClasses() : array
    {
        return $this->staticObjectType->getReferencedClasses();
    }
    public function getBaseClass() : string
    {
        return $this->baseClass;
    }
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        return $this->staticObjectType->accepts($type, $strictTypes);
    }
    public function isSuperTypeOf(\PHPStan\Type\Type $type) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof self) {
            return $this->staticObjectType->isSuperTypeOf($type);
        }
        if ($type instanceof \PHPStan\Type\ObjectWithoutClassType) {
            return \PHPStan\TrinaryLogic::createMaybe();
        }
        if ($type instanceof \PHPStan\Type\ObjectType) {
            return \PHPStan\TrinaryLogic::createMaybe()->and($this->staticObjectType->isSuperTypeOf($type));
        }
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return $type->isSubTypeOf($this);
        }
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function equals(\PHPStan\Type\Type $type) : bool
    {
        if (\get_class($type) !== static::class) {
            return \false;
        }
        /** @var StaticType $type */
        $type = $type;
        return $this->staticObjectType->equals($type->staticObjectType);
    }
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return \sprintf('static(%s)', $this->staticObjectType->describe($level));
    }
    public function canAccessProperties() : \PHPStan\TrinaryLogic
    {
        return $this->staticObjectType->canAccessProperties();
    }
    public function hasProperty(string $propertyName) : \PHPStan\TrinaryLogic
    {
        return $this->staticObjectType->hasProperty($propertyName);
    }
    public function getProperty(string $propertyName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\PropertyReflection
    {
        return $this->staticObjectType->getProperty($propertyName, $scope);
    }
    public function canCallMethods() : \PHPStan\TrinaryLogic
    {
        return $this->staticObjectType->canCallMethods();
    }
    public function hasMethod(string $methodName) : \PHPStan\TrinaryLogic
    {
        return $this->staticObjectType->hasMethod($methodName);
    }
    public function getMethod(string $methodName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\MethodReflection
    {
        return $this->staticObjectType->getMethod($methodName, $scope);
    }
    public function canAccessConstants() : \PHPStan\TrinaryLogic
    {
        return $this->staticObjectType->canAccessConstants();
    }
    public function hasConstant(string $constantName) : \PHPStan\TrinaryLogic
    {
        return $this->staticObjectType->hasConstant($constantName);
    }
    public function getConstant(string $constantName) : \PHPStan\Reflection\ConstantReflection
    {
        return $this->staticObjectType->getConstant($constantName);
    }
    public function resolveStatic(string $className) : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ObjectType($className);
    }
    public function changeBaseClass(string $className) : \PHPStan\Type\StaticResolvableType
    {
        $thisClass = static::class;
        return new $thisClass($className);
    }
    public function isIterable() : \PHPStan\TrinaryLogic
    {
        return $this->staticObjectType->isIterable();
    }
    public function isIterableAtLeastOnce() : \PHPStan\TrinaryLogic
    {
        return $this->staticObjectType->isIterableAtLeastOnce();
    }
    public function getIterableKeyType() : \PHPStan\Type\Type
    {
        return $this->staticObjectType->getIterableKeyType();
    }
    public function getIterableValueType() : \PHPStan\Type\Type
    {
        return $this->staticObjectType->getIterableValueType();
    }
    public function isOffsetAccessible() : \PHPStan\TrinaryLogic
    {
        return $this->staticObjectType->isInstanceOf(\ArrayAccess::class);
    }
    public function hasOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\TrinaryLogic
    {
        return $this->staticObjectType->hasOffsetValueType($offsetType);
    }
    public function getOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\Type\Type
    {
        return $this->staticObjectType->getOffsetValueType($offsetType);
    }
    public function setOffsetValueType(?\PHPStan\Type\Type $offsetType, \PHPStan\Type\Type $valueType) : \PHPStan\Type\Type
    {
        return $this->staticObjectType->setOffsetValueType($offsetType, $valueType);
    }
    public function isCallable() : \PHPStan\TrinaryLogic
    {
        return $this->staticObjectType->isCallable();
    }
    /**
     * @param \PHPStan\Reflection\ClassMemberAccessAnswerer $scope
     * @return \PHPStan\Reflection\ParametersAcceptor[]
     */
    public function getCallableParametersAcceptors(\PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : array
    {
        return $this->staticObjectType->getCallableParametersAcceptors($scope);
    }
    public function isCloneable() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function toNumber() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toString() : \PHPStan\Type\Type
    {
        return $this->staticObjectType->toString();
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toArray() : \PHPStan\Type\Type
    {
        return $this->staticObjectType->toArray();
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new static($properties['baseClass']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\TrinaryLogic;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\Traits\NonCallableTypeTrait;
use PHPStan\Type\Traits\NonIterableTypeTrait;
use PHPStan\Type\Traits\NonObjectTypeTrait;
use PHPStan\Type\Traits\UndecidedBooleanTypeTrait;
class FloatType implements \PHPStan\Type\Type
{
    use NonCallableTypeTrait;
    use NonIterableTypeTrait;
    use NonObjectTypeTrait;
    use UndecidedBooleanTypeTrait;
    /**
     * @return string[]
     */
    public function getReferencedClasses() : array
    {
        return [];
    }
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof self || $type instanceof \PHPStan\Type\IntegerType) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return \PHPStan\Type\CompoundTypeHelper::accepts($type, new \PHPStan\Type\UnionType([$this, new \PHPStan\Type\IntegerType()]), $strictTypes);
        }
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function isSuperTypeOf(\PHPStan\Type\Type $type) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof self) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return $type->isSubTypeOf($this);
        }
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function equals(\PHPStan\Type\Type $type) : bool
    {
        return $type instanceof self;
    }
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return 'float';
    }
    public function toNumber() : \PHPStan\Type\Type
    {
        return $this;
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        return $this;
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\IntegerType();
    }
    public function toString() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\StringType();
    }
    public function toArray() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\Constant\ConstantArrayType([new \PHPStan\Type\Constant\ConstantIntegerType(0)], [$this], 1);
    }
    public function isOffsetAccessible() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function hasOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function getOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\NullType();
    }
    public function setOffsetValueType(?\PHPStan\Type\Type $offsetType, \PHPStan\Type\Type $valueType) : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\Reflection\ParametersAcceptor;
use PHPStan\TrinaryLogic;
class CallableTypeHelper
{
    public static function isParametersAcceptorSuperTypeOf(\PHPStan\Reflection\ParametersAcceptor $ours, \PHPStan\Reflection\ParametersAcceptor $theirs) : \PHPStan\TrinaryLogic
    {
        $theirParameters = $theirs->getParameters();
        $ourParameters = $ours->getParameters();
        if (\count($theirParameters) > \count($ourParameters)) {
            return \PHPStan\TrinaryLogic::createNo();
        }
        $result = null;
        foreach ($theirParameters as $i => $theirParameter) {
            $ourParameter = $ourParameters[$i];
            $isSuperType = $theirParameter->getType()->isSuperTypeOf($ourParameter->getType());
            if ($result === null) {
                $result = $isSuperType;
            } else {
                $result = $result->and($isSuperType);
            }
        }
        $isReturnTypeSuperType = $ours->getReturnType()->isSuperTypeOf($theirs->getReturnType());
        if ($result === null) {
            $result = $isReturnTypeSuperType;
        } else {
            $result = $result->and($isReturnTypeSuperType);
        }
        return $result;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

interface OperatorTypeSpecifyingExtension
{
    public function isOperatorSupported(string $operatorSigil, \PHPStan\Type\Type $leftSide, \PHPStan\Type\Type $rightSide) : bool;
    public function specifyType(string $operatorSigil, \PHPStan\Type\Type $leftSide, \PHPStan\Type\Type $rightSide) : \PHPStan\Type\Type;
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\TrinaryLogic;
use PHPStan\Type\Traits\ObjectTypeTrait;
class ObjectWithoutClassType implements \PHPStan\Type\SubtractableType
{
    use ObjectTypeTrait;
    /** @var \PHPStan\Type\Type|null */
    private $subtractedType;
    public function __construct(?\PHPStan\Type\Type $subtractedType = null)
    {
        $this->subtractedType = $subtractedType;
    }
    /**
     * @return string[]
     */
    public function getReferencedClasses() : array
    {
        return [];
    }
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return \PHPStan\Type\CompoundTypeHelper::accepts($type, $this, $strictTypes);
        }
        return \PHPStan\TrinaryLogic::createFromBoolean($type instanceof self || $type instanceof \PHPStan\Type\TypeWithClassName);
    }
    public function isSuperTypeOf(\PHPStan\Type\Type $type) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return $type->isSubTypeOf($this);
        }
        if ($type instanceof self) {
            if ($this->subtractedType === null) {
                return \PHPStan\TrinaryLogic::createYes();
            }
            if ($type->subtractedType !== null) {
                $isSuperType = $type->subtractedType->isSuperTypeOf($this->subtractedType);
                if ($isSuperType->yes()) {
                    return \PHPStan\TrinaryLogic::createYes();
                }
            }
            return \PHPStan\TrinaryLogic::createMaybe();
        }
        if ($type instanceof \PHPStan\Type\TypeWithClassName) {
            if ($this->subtractedType === null) {
                return \PHPStan\TrinaryLogic::createYes();
            }
            return $this->subtractedType->isSuperTypeOf($type)->negate();
        }
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function equals(\PHPStan\Type\Type $type) : bool
    {
        if (!$type instanceof self) {
            return \false;
        }
        if ($this->subtractedType === null) {
            if ($type->subtractedType === null) {
                return \true;
            }
            return \false;
        }
        if ($type->subtractedType === null) {
            return \false;
        }
        return $this->subtractedType->equals($type->subtractedType);
    }
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return $level->handle(static function () : string {
            return 'object';
        }, static function () : string {
            return 'object';
        }, function () use($level) : string {
            $description = 'object';
            if ($this->subtractedType !== null) {
                $description .= \sprintf('~%s', $this->subtractedType->describe($level));
            }
            return $description;
        });
    }
    public function subtract(\PHPStan\Type\Type $type) : \PHPStan\Type\Type
    {
        if ($type instanceof self) {
            return new \PHPStan\Type\NeverType();
        }
        if ($this->subtractedType !== null) {
            $type = \PHPStan\Type\TypeCombinator::union($this->subtractedType, $type);
        }
        return new self($type);
    }
    public function getTypeWithoutSubtractedType() : \PHPStan\Type\Type
    {
        return new self();
    }
    public function changeSubtractedType(?\PHPStan\Type\Type $subtractedType) : \PHPStan\Type\Type
    {
        return new self($subtractedType);
    }
    public function getSubtractedType() : ?\PHPStan\Type\Type
    {
        return $this->subtractedType;
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self($properties['subtractedType'] ?? null);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\Type\Accessory\AccessoryType;
use PHPStan\Type\Accessory\NonEmptyArrayType;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantArrayTypeBuilder;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantFloatType;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\Constant\ConstantStringType;
class TypeCombinator
{
    private const CONSTANT_ARRAY_UNION_THRESHOLD = 16;
    private const CONSTANT_SCALAR_UNION_THRESHOLD = 8;
    /** @var bool */
    public static $enableSubtractableTypes = \false;
    public static function addNull(\PHPStan\Type\Type $type) : \PHPStan\Type\Type
    {
        return self::union($type, new \PHPStan\Type\NullType());
    }
    public static function remove(\PHPStan\Type\Type $fromType, \PHPStan\Type\Type $typeToRemove) : \PHPStan\Type\Type
    {
        if ($typeToRemove instanceof \PHPStan\Type\UnionType) {
            foreach ($typeToRemove->getTypes() as $unionTypeToRemove) {
                $fromType = self::remove($fromType, $unionTypeToRemove);
            }
            return $fromType;
        }
        if ($fromType instanceof \PHPStan\Type\UnionType) {
            $innerTypes = [];
            foreach ($fromType->getTypes() as $innerType) {
                $innerTypes[] = self::remove($innerType, $typeToRemove);
            }
            return self::union(...$innerTypes);
        }
        if ($fromType instanceof \PHPStan\Type\BooleanType && $fromType->isSuperTypeOf(new \PHPStan\Type\BooleanType())->yes()) {
            if ($typeToRemove instanceof \PHPStan\Type\Constant\ConstantBooleanType) {
                return new \PHPStan\Type\Constant\ConstantBooleanType(!$typeToRemove->getValue());
            }
        } elseif ($fromType instanceof \PHPStan\Type\IterableType) {
            $traversableType = new \PHPStan\Type\ObjectType(\Traversable::class);
            $arrayType = new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType());
            if ($typeToRemove->isSuperTypeOf($arrayType)->yes()) {
                return $traversableType;
            }
            if ($typeToRemove->isSuperTypeOf($traversableType)->yes()) {
                return $arrayType;
            }
        }
        if ($typeToRemove->isSuperTypeOf($fromType)->yes()) {
            return new \PHPStan\Type\NeverType();
        }
        if ((new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType()))->isSuperTypeOf($fromType)->yes()) {
            if ($typeToRemove instanceof \PHPStan\Type\Constant\ConstantArrayType && $typeToRemove->isIterableAtLeastOnce()->no()) {
                return self::intersect($fromType, new \PHPStan\Type\Accessory\NonEmptyArrayType());
            }
            if ($typeToRemove instanceof \PHPStan\Type\Accessory\NonEmptyArrayType) {
                return new \PHPStan\Type\Constant\ConstantArrayType([], []);
            }
        }
        if (self::$enableSubtractableTypes && $fromType instanceof \PHPStan\Type\SubtractableType && $fromType->isSuperTypeOf($typeToRemove)->yes() && $typeToRemove->isSuperTypeOf($fromType)->maybe()) {
            return $fromType->subtract($typeToRemove);
        }
        return $fromType;
    }
    public static function removeNull(\PHPStan\Type\Type $type) : \PHPStan\Type\Type
    {
        if (self::containsNull($type)) {
            return self::remove($type, new \PHPStan\Type\NullType());
        }
        return $type;
    }
    public static function containsNull(\PHPStan\Type\Type $type) : bool
    {
        if ($type instanceof \PHPStan\Type\UnionType) {
            foreach ($type->getTypes() as $innerType) {
                if ($innerType instanceof \PHPStan\Type\NullType) {
                    return \true;
                }
            }
            return \false;
        }
        return $type instanceof \PHPStan\Type\NullType;
    }
    public static function union(\PHPStan\Type\Type ...$types) : \PHPStan\Type\Type
    {
        // transform A | (B | C) to A | B | C
        for ($i = 0; $i < \count($types); $i++) {
            if (!$types[$i] instanceof \PHPStan\Type\UnionType) {
                continue;
            }
            \array_splice($types, $i, 1, $types[$i]->getTypes());
        }
        $typesCount = \count($types);
        $arrayTypes = [];
        $arrayAccessoryTypes = [];
        $scalarTypes = [];
        $hasGenericScalarTypes = [];
        for ($i = 0; $i < $typesCount; $i++) {
            if ($types[$i] instanceof \PHPStan\Type\NeverType) {
                unset($types[$i]);
                continue;
            }
            if (!self::$enableSubtractableTypes && $types[$i] instanceof \PHPStan\Type\MixedType) {
                return $types[$i];
            }
            if ($types[$i] instanceof \PHPStan\Type\ConstantScalarType) {
                $type = $types[$i];
                $scalarTypes[\get_class($type)][\md5($type->describe(\PHPStan\Type\VerbosityLevel::precise()))] = $type;
                unset($types[$i]);
                continue;
            }
            if ($types[$i] instanceof \PHPStan\Type\BooleanType) {
                $hasGenericScalarTypes[\PHPStan\Type\Constant\ConstantBooleanType::class] = \true;
            }
            if ($types[$i] instanceof \PHPStan\Type\FloatType) {
                $hasGenericScalarTypes[\PHPStan\Type\Constant\ConstantFloatType::class] = \true;
            }
            if ($types[$i] instanceof \PHPStan\Type\IntegerType) {
                $hasGenericScalarTypes[\PHPStan\Type\Constant\ConstantIntegerType::class] = \true;
            }
            if ($types[$i] instanceof \PHPStan\Type\StringType) {
                $hasGenericScalarTypes[\PHPStan\Type\Constant\ConstantStringType::class] = \true;
            }
            if ($types[$i] instanceof \PHPStan\Type\IntersectionType) {
                $intermediateArrayType = null;
                $intermediateAccessoryTypes = [];
                foreach ($types[$i]->getTypes() as $innerType) {
                    if ($innerType instanceof \PHPStan\Type\ArrayType) {
                        $intermediateArrayType = $innerType;
                        continue;
                    }
                    if ($innerType instanceof \PHPStan\Type\Accessory\AccessoryType || $innerType instanceof \PHPStan\Type\CallableType) {
                        $intermediateAccessoryTypes[$innerType->describe(\PHPStan\Type\VerbosityLevel::precise())] = $innerType;
                        continue;
                    }
                }
                if ($intermediateArrayType !== null) {
                    $arrayTypes[] = $intermediateArrayType;
                    $arrayAccessoryTypes[] = $intermediateAccessoryTypes;
                    unset($types[$i]);
                    continue;
                }
            }
            if (!$types[$i] instanceof \PHPStan\Type\ArrayType) {
                continue;
            }
            $arrayTypes[] = $types[$i];
            $arrayAccessoryTypes[] = [];
            unset($types[$i]);
        }
        /** @var ArrayType[] $arrayTypes */
        $arrayTypes = $arrayTypes;
        $arrayAccessoryTypesToProcess = [];
        if (\count($arrayAccessoryTypes) > 1) {
            $arrayAccessoryTypesToProcess = \array_values(\array_intersect_key(...$arrayAccessoryTypes));
        } elseif (\count($arrayAccessoryTypes) > 0) {
            $arrayAccessoryTypesToProcess = \array_values($arrayAccessoryTypes[0]);
        }
        $types = \array_values(\array_merge($types, self::processArrayTypes($arrayTypes, $arrayAccessoryTypesToProcess)));
        // simplify string[] | int[] to (string|int)[]
        for ($i = 0; $i < \count($types); $i++) {
            for ($j = $i + 1; $j < \count($types); $j++) {
                if ($types[$i] instanceof \PHPStan\Type\IterableType && $types[$j] instanceof \PHPStan\Type\IterableType) {
                    $types[$i] = new \PHPStan\Type\IterableType(self::union($types[$i]->getIterableKeyType(), $types[$j]->getIterableKeyType()), self::union($types[$i]->getIterableValueType(), $types[$j]->getIterableValueType()));
                    \array_splice($types, $j, 1);
                    continue 2;
                }
            }
        }
        foreach ($scalarTypes as $classType => $scalarTypeItems) {
            if (isset($hasGenericScalarTypes[$classType])) {
                continue;
            }
            if ($classType === \PHPStan\Type\Constant\ConstantBooleanType::class && \count($scalarTypeItems) === 2) {
                $types[] = new \PHPStan\Type\BooleanType();
                continue;
            }
            foreach ($scalarTypeItems as $type) {
                if (\count($scalarTypeItems) > self::CONSTANT_SCALAR_UNION_THRESHOLD) {
                    $types[] = $type->generalize();
                    break;
                }
                $types[] = $type;
            }
        }
        // transform A | A to A
        // transform A | never to A
        for ($i = 0; $i < \count($types); $i++) {
            for ($j = $i + 1; $j < \count($types); $j++) {
                if (self::$enableSubtractableTypes) {
                    if ($types[$i] instanceof \PHPStan\Type\SubtractableType && $types[$i]->getTypeWithoutSubtractedType()->isSuperTypeOf($types[$j])->yes()) {
                        $subtractedType = null;
                        if ($types[$j] instanceof \PHPStan\Type\SubtractableType) {
                            $subtractedType = $types[$j]->getSubtractedType();
                        }
                        $types[$i] = self::intersectWithSubtractedType($types[$i], $subtractedType);
                        \array_splice($types, $j--, 1);
                        continue 1;
                    }
                    if ($types[$j] instanceof \PHPStan\Type\SubtractableType && $types[$j]->getTypeWithoutSubtractedType()->isSuperTypeOf($types[$i])->yes()) {
                        $subtractedType = null;
                        if ($types[$i] instanceof \PHPStan\Type\SubtractableType) {
                            $subtractedType = $types[$i]->getSubtractedType();
                        }
                        $types[$j] = self::intersectWithSubtractedType($types[$j], $subtractedType);
                        \array_splice($types, $i--, 1);
                        continue 2;
                    }
                }
                if (!$types[$j] instanceof \PHPStan\Type\Constant\ConstantArrayType && $types[$j]->isSuperTypeOf($types[$i])->yes()) {
                    \array_splice($types, $i--, 1);
                    continue 2;
                }
                if (!$types[$i] instanceof \PHPStan\Type\Constant\ConstantArrayType && $types[$i]->isSuperTypeOf($types[$j])->yes()) {
                    \array_splice($types, $j--, 1);
                    continue 1;
                }
            }
        }
        if (\count($types) === 0) {
            return new \PHPStan\Type\NeverType();
        } elseif (\count($types) === 1) {
            return $types[0];
        }
        return new \PHPStan\Type\UnionType($types);
    }
    private static function unionWithSubtractedType(\PHPStan\Type\Type $type, ?\PHPStan\Type\Type $subtractedType) : \PHPStan\Type\Type
    {
        if ($subtractedType === null) {
            return $type;
        }
        if ($type instanceof \PHPStan\Type\SubtractableType) {
            if ($type->getSubtractedType() === null) {
                return $type;
            }
            $subtractedType = self::union($type->getSubtractedType(), $subtractedType);
            if ($subtractedType instanceof \PHPStan\Type\NeverType) {
                $subtractedType = null;
            }
            return $type->changeSubtractedType($subtractedType);
        }
        if ($subtractedType->isSuperTypeOf($type)->yes()) {
            return new \PHPStan\Type\NeverType();
        }
        return $type;
    }
    private static function intersectWithSubtractedType(\PHPStan\Type\SubtractableType $subtractableType, ?\PHPStan\Type\Type $subtractedType) : \PHPStan\Type\Type
    {
        if ($subtractableType->getSubtractedType() === null) {
            return $subtractableType;
        }
        if ($subtractedType === null) {
            return $subtractableType->getTypeWithoutSubtractedType();
        }
        $subtractedType = self::intersect($subtractableType->getSubtractedType(), $subtractedType);
        if ($subtractedType instanceof \PHPStan\Type\NeverType) {
            $subtractedType = null;
        }
        return $subtractableType->changeSubtractedType($subtractedType);
    }
    /**
     * @param ArrayType[] $arrayTypes
     * @param Type[] $accessoryTypes
     * @return Type[]
     */
    private static function processArrayTypes(array $arrayTypes, array $accessoryTypes) : array
    {
        foreach ($arrayTypes as $arrayType) {
            if (!$arrayType instanceof \PHPStan\Type\Constant\ConstantArrayType) {
                continue;
            }
            if (\count($arrayType->getKeyTypes()) > 0) {
                continue;
            }
            foreach ($accessoryTypes as $i => $accessoryType) {
                if (!$accessoryType instanceof \PHPStan\Type\Accessory\NonEmptyArrayType) {
                    continue;
                }
                unset($accessoryTypes[$i]);
                break 2;
            }
        }
        if (\count($arrayTypes) === 0) {
            return [];
        } elseif (\count($arrayTypes) === 1) {
            return [self::intersect($arrayTypes[0], ...$accessoryTypes)];
        }
        $keyTypesForGeneralArray = [];
        $valueTypesForGeneralArray = [];
        $generalArrayOcurred = \false;
        $constantKeyTypesNumbered = [];
        /** @var int|float $nextConstantKeyTypeIndex */
        $nextConstantKeyTypeIndex = 1;
        foreach ($arrayTypes as $arrayType) {
            if (!$arrayType instanceof \PHPStan\Type\Constant\ConstantArrayType || $generalArrayOcurred) {
                $keyTypesForGeneralArray[] = $arrayType->getKeyType();
                $valueTypesForGeneralArray[] = $arrayType->getItemType();
                $generalArrayOcurred = \true;
                continue;
            }
            foreach ($arrayType->getKeyTypes() as $i => $keyType) {
                $keyTypesForGeneralArray[] = $keyType;
                $valueTypesForGeneralArray[] = $arrayType->getValueTypes()[$i];
                $keyTypeValue = $keyType->getValue();
                if (\array_key_exists($keyTypeValue, $constantKeyTypesNumbered)) {
                    continue;
                }
                $constantKeyTypesNumbered[$keyTypeValue] = $nextConstantKeyTypeIndex;
                $nextConstantKeyTypeIndex *= 2;
                if (!\is_int($nextConstantKeyTypeIndex)) {
                    $generalArrayOcurred = \true;
                    continue;
                }
            }
        }
        $createGeneralArray = static function () use($keyTypesForGeneralArray, $valueTypesForGeneralArray, $accessoryTypes) : Type {
            return \PHPStan\Type\TypeCombinator::intersect(new \PHPStan\Type\ArrayType(self::union(...$keyTypesForGeneralArray), self::union(...$valueTypesForGeneralArray)), ...$accessoryTypes);
        };
        if ($generalArrayOcurred) {
            return [$createGeneralArray()];
        }
        /** @var ConstantArrayType[] $arrayTypes */
        $arrayTypes = $arrayTypes;
        /** @var int[] $constantKeyTypesNumbered */
        $constantKeyTypesNumbered = $constantKeyTypesNumbered;
        $constantArraysBuckets = [];
        foreach ($arrayTypes as $arrayTypeAgain) {
            $arrayIndex = 0;
            foreach ($arrayTypeAgain->getKeyTypes() as $keyType) {
                $arrayIndex += $constantKeyTypesNumbered[$keyType->getValue()];
            }
            if (!\array_key_exists($arrayIndex, $constantArraysBuckets)) {
                $bucket = [];
                foreach ($arrayTypeAgain->getKeyTypes() as $i => $keyType) {
                    $bucket[$keyType->getValue()] = ['keyType' => $keyType, 'valueType' => $arrayTypeAgain->getValueTypes()[$i]];
                }
                $constantArraysBuckets[$arrayIndex] = $bucket;
                continue;
            }
            $bucket = $constantArraysBuckets[$arrayIndex];
            foreach ($arrayTypeAgain->getKeyTypes() as $i => $keyType) {
                $bucket[$keyType->getValue()]['valueType'] = self::union($bucket[$keyType->getValue()]['valueType'], $arrayTypeAgain->getValueTypes()[$i]);
            }
            $constantArraysBuckets[$arrayIndex] = $bucket;
        }
        if (\count($constantArraysBuckets) > self::CONSTANT_ARRAY_UNION_THRESHOLD) {
            return [$createGeneralArray()];
        }
        $resultArrays = [];
        foreach ($constantArraysBuckets as $bucket) {
            $builder = \PHPStan\Type\Constant\ConstantArrayTypeBuilder::createEmpty();
            foreach ($bucket as $data) {
                $builder->setOffsetValueType($data['keyType'], $data['valueType']);
            }
            $resultArrays[] = self::intersect($builder->getArray(), ...$accessoryTypes);
        }
        return $resultArrays;
    }
    public static function intersect(\PHPStan\Type\Type ...$types) : \PHPStan\Type\Type
    {
        // transform A & (B | C) to (A & B) | (A & C)
        foreach ($types as $i => $type) {
            if ($type instanceof \PHPStan\Type\UnionType) {
                $topLevelUnionSubTypes = [];
                foreach ($type->getTypes() as $innerUnionSubType) {
                    $topLevelUnionSubTypes[] = self::intersect($innerUnionSubType, ...\array_slice($types, 0, $i), ...\array_slice($types, $i + 1));
                }
                return self::union(...$topLevelUnionSubTypes);
            }
        }
        // transform A & (B & C) to A & B & C
        foreach ($types as $i => &$type) {
            if (!$type instanceof \PHPStan\Type\IntersectionType) {
                continue;
            }
            \array_splice($types, $i, 1, $type->getTypes());
        }
        // transform IntegerType & ConstantIntegerType to ConstantIntegerType
        // transform Child & Parent to Child
        // transform Object & ~null to Object
        // transform A & A to A
        // transform int[] & string to never
        // transform callable & int to never
        // transform A & ~A to never
        // transform int & string to never
        for ($i = 0; $i < \count($types); $i++) {
            for ($j = $i + 1; $j < \count($types); $j++) {
                if (self::$enableSubtractableTypes) {
                    if ($types[$j] instanceof \PHPStan\Type\SubtractableType) {
                        $isSuperTypeSubtractableA = $types[$j]->getTypeWithoutSubtractedType()->isSuperTypeOf($types[$i]);
                        if ($isSuperTypeSubtractableA->yes()) {
                            $types[$i] = self::unionWithSubtractedType($types[$i], $types[$j]->getSubtractedType());
                            \array_splice($types, $j--, 1);
                            continue 1;
                        }
                    }
                    if ($types[$i] instanceof \PHPStan\Type\SubtractableType) {
                        $isSuperTypeSubtractableB = $types[$i]->getTypeWithoutSubtractedType()->isSuperTypeOf($types[$j]);
                        if ($isSuperTypeSubtractableB->yes()) {
                            $types[$j] = self::unionWithSubtractedType($types[$j], $types[$i]->getSubtractedType());
                            \array_splice($types, $i--, 1);
                            continue 2;
                        }
                    }
                }
                $isSuperTypeA = $types[$j]->isSuperTypeOf($types[$i]);
                if ($isSuperTypeA->no()) {
                    return new \PHPStan\Type\NeverType();
                } elseif ($isSuperTypeA->yes()) {
                    \array_splice($types, $j--, 1);
                    continue;
                }
                $isSuperTypeB = $types[$i]->isSuperTypeOf($types[$j]);
                if ($isSuperTypeB->maybe()) {
                    continue;
                }
                if ($isSuperTypeB->yes()) {
                    \array_splice($types, $i--, 1);
                    continue 2;
                }
            }
        }
        if (\count($types) === 1) {
            return $types[0];
        }
        return new \PHPStan\Type\IntersectionType($types);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\TrinaryLogic;
use PHPStan\Type\Traits\FalseyBooleanTypeTrait;
use PHPStan\Type\Traits\NonCallableTypeTrait;
use PHPStan\Type\Traits\NonIterableTypeTrait;
use PHPStan\Type\Traits\NonObjectTypeTrait;
use PHPStan\Type\Traits\NonOffsetAccessibleTypeTrait;
class VoidType implements \PHPStan\Type\Type
{
    use NonCallableTypeTrait;
    use NonIterableTypeTrait;
    use NonObjectTypeTrait;
    use NonOffsetAccessibleTypeTrait;
    use FalseyBooleanTypeTrait;
    /**
     * @return string[]
     */
    public function getReferencedClasses() : array
    {
        return [];
    }
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createFromBoolean($type instanceof self);
    }
    public function isSuperTypeOf(\PHPStan\Type\Type $type) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof self) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return $type->isSubTypeOf($this);
        }
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function equals(\PHPStan\Type\Type $type) : bool
    {
        return $type instanceof self;
    }
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return 'void';
    }
    public function toNumber() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toString() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toArray() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Accessory;

use PHPStan\Type\Type;
interface AccessoryType extends \PHPStan\Type\Type
{
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Accessory;

use PHPStan\TrinaryLogic;
use PHPStan\Type\CompoundType;
use PHPStan\Type\CompoundTypeHelper;
use PHPStan\Type\ConstantScalarType;
use PHPStan\Type\ErrorType;
use PHPStan\Type\IntersectionType;
use PHPStan\Type\MixedType;
use PHPStan\Type\Traits\MaybeCallableTypeTrait;
use PHPStan\Type\Traits\MaybeIterableTypeTrait;
use PHPStan\Type\Traits\MaybeObjectTypeTrait;
use PHPStan\Type\Traits\TruthyBooleanTypeTrait;
use PHPStan\Type\Type;
use PHPStan\Type\UnionType;
class HasOffsetType implements \PHPStan\Type\CompoundType, \PHPStan\Type\Accessory\AccessoryType
{
    use MaybeCallableTypeTrait;
    use MaybeIterableTypeTrait;
    use MaybeObjectTypeTrait;
    use TruthyBooleanTypeTrait;
    /** @var \PHPStan\Type\Type */
    private $offsetType;
    public function __construct(\PHPStan\Type\Type $offsetType)
    {
        $this->offsetType = $offsetType;
    }
    public function getReferencedClasses() : array
    {
        return [];
    }
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return \PHPStan\Type\CompoundTypeHelper::accepts($type, $this, $strictTypes);
        }
        return $type->isOffsetAccessible()->and($type->hasOffsetValueType($this->offsetType));
    }
    public function isSuperTypeOf(\PHPStan\Type\Type $type) : \PHPStan\TrinaryLogic
    {
        if ($this->equals($type)) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        return $type->isOffsetAccessible()->and($type->hasOffsetValueType($this->offsetType));
    }
    public function isSubTypeOf(\PHPStan\Type\Type $otherType) : \PHPStan\TrinaryLogic
    {
        if ($otherType instanceof \PHPStan\Type\UnionType || $otherType instanceof \PHPStan\Type\IntersectionType) {
            return $otherType->isSuperTypeOf($this);
        }
        return $otherType->isOffsetAccessible()->and($otherType->hasOffsetValueType($this->offsetType))->and($otherType instanceof self ? \PHPStan\TrinaryLogic::createYes() : \PHPStan\TrinaryLogic::createMaybe());
    }
    public function equals(\PHPStan\Type\Type $type) : bool
    {
        return $type instanceof self && $this->offsetType->equals($type->offsetType);
    }
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return \sprintf('hasOffset(%s)', $this->offsetType->describe($level));
    }
    public function isOffsetAccessible() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function hasOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\TrinaryLogic
    {
        if ($offsetType instanceof \PHPStan\Type\ConstantScalarType && $offsetType->equals($this->offsetType)) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function getOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\MixedType();
    }
    public function setOffsetValueType(?\PHPStan\Type\Type $offsetType, \PHPStan\Type\Type $valueType) : \PHPStan\Type\Type
    {
        return $this;
    }
    public function isIterableAtLeastOnce() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function toNumber() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toString() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toArray() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\MixedType();
    }
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self($properties['offsetType']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Accessory;

use PHPStan\TrinaryLogic;
use PHPStan\Type\ArrayType;
use PHPStan\Type\CompoundType;
use PHPStan\Type\CompoundTypeHelper;
use PHPStan\Type\ErrorType;
use PHPStan\Type\IntersectionType;
use PHPStan\Type\MixedType;
use PHPStan\Type\Traits\MaybeCallableTypeTrait;
use PHPStan\Type\Traits\NonObjectTypeTrait;
use PHPStan\Type\Traits\TruthyBooleanTypeTrait;
use PHPStan\Type\Type;
use PHPStan\Type\UnionType;
class NonEmptyArrayType implements \PHPStan\Type\CompoundType, \PHPStan\Type\Accessory\AccessoryType
{
    use MaybeCallableTypeTrait;
    use NonObjectTypeTrait;
    use TruthyBooleanTypeTrait;
    public function getReferencedClasses() : array
    {
        return [];
    }
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return \PHPStan\Type\CompoundTypeHelper::accepts($type, $this, $strictTypes);
        }
        return (new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType()))->isSuperTypeOf($type)->and($type->isIterableAtLeastOnce());
    }
    public function isSuperTypeOf(\PHPStan\Type\Type $type) : \PHPStan\TrinaryLogic
    {
        if ($this->equals($type)) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        return (new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType()))->isSuperTypeOf($type)->and($type->isIterableAtLeastOnce());
    }
    public function isSubTypeOf(\PHPStan\Type\Type $otherType) : \PHPStan\TrinaryLogic
    {
        if ($otherType instanceof \PHPStan\Type\UnionType || $otherType instanceof \PHPStan\Type\IntersectionType) {
            return $otherType->isSuperTypeOf($this);
        }
        return (new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType()))->isSuperTypeOf($otherType)->and($otherType->isIterableAtLeastOnce())->and($otherType instanceof self ? \PHPStan\TrinaryLogic::createYes() : \PHPStan\TrinaryLogic::createMaybe());
    }
    public function equals(\PHPStan\Type\Type $type) : bool
    {
        return $type instanceof self;
    }
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return 'nonEmpty';
    }
    public function isOffsetAccessible() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function hasOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function getOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\MixedType();
    }
    public function setOffsetValueType(?\PHPStan\Type\Type $offsetType, \PHPStan\Type\Type $valueType) : \PHPStan\Type\Type
    {
        return $this;
    }
    public function isIterable() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function isIterableAtLeastOnce() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function getIterableKeyType() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\MixedType();
    }
    public function getIterableValueType() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\MixedType();
    }
    public function toNumber() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toString() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toArray() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\MixedType();
    }
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Accessory;

use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\Reflection\Dummy\DummyMethodReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\TrivialParametersAcceptor;
use PHPStan\TrinaryLogic;
use PHPStan\Type\CompoundType;
use PHPStan\Type\IntersectionType;
use PHPStan\Type\Traits\ObjectTypeTrait;
use PHPStan\Type\Type;
use PHPStan\Type\UnionType;
class HasMethodType implements \PHPStan\Type\Accessory\AccessoryType, \PHPStan\Type\CompoundType
{
    use ObjectTypeTrait;
    /** @var string */
    private $methodName;
    public function __construct(string $methodName)
    {
        $this->methodName = $methodName;
    }
    public function getReferencedClasses() : array
    {
        return [];
    }
    private function getCanonicalMethodName() : string
    {
        return \strtolower($this->methodName);
    }
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createFromBoolean($this->equals($type));
    }
    public function isSuperTypeOf(\PHPStan\Type\Type $type) : \PHPStan\TrinaryLogic
    {
        return $type->hasMethod($this->methodName);
    }
    public function isSubTypeOf(\PHPStan\Type\Type $otherType) : \PHPStan\TrinaryLogic
    {
        if ($otherType instanceof \PHPStan\Type\UnionType || $otherType instanceof \PHPStan\Type\IntersectionType) {
            return $otherType->isSuperTypeOf($this);
        }
        if ($otherType instanceof self) {
            $limit = \PHPStan\TrinaryLogic::createYes();
        } else {
            $limit = \PHPStan\TrinaryLogic::createMaybe();
        }
        return $limit->and($otherType->hasMethod($this->methodName));
    }
    public function equals(\PHPStan\Type\Type $type) : bool
    {
        return $type instanceof self && $this->getCanonicalMethodName() === $type->getCanonicalMethodName();
    }
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return \sprintf('hasMethod(%s)', $this->methodName);
    }
    public function hasMethod(string $methodName) : \PHPStan\TrinaryLogic
    {
        if ($this->getCanonicalMethodName() === \strtolower($methodName)) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function getMethod(string $methodName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\MethodReflection
    {
        return new \PHPStan\Reflection\Dummy\DummyMethodReflection($this->methodName);
    }
    public function isCallable() : \PHPStan\TrinaryLogic
    {
        if ($this->getCanonicalMethodName() === '__invoke') {
            return \PHPStan\TrinaryLogic::createYes();
        }
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function getCallableParametersAcceptors(\PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : array
    {
        return [new \PHPStan\Reflection\TrivialParametersAcceptor()];
    }
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self($properties['methodName']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type\Accessory;

use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\Reflection\TrivialParametersAcceptor;
use PHPStan\TrinaryLogic;
use PHPStan\Type\CompoundType;
use PHPStan\Type\IntersectionType;
use PHPStan\Type\Traits\ObjectTypeTrait;
use PHPStan\Type\Type;
use PHPStan\Type\UnionType;
class HasPropertyType implements \PHPStan\Type\Accessory\AccessoryType, \PHPStan\Type\CompoundType
{
    use ObjectTypeTrait;
    /** @var string */
    private $propertyName;
    public function __construct(string $propertyName)
    {
        $this->propertyName = $propertyName;
    }
    /**
     * @return string[]
     */
    public function getReferencedClasses() : array
    {
        return [];
    }
    public function getPropertyName() : string
    {
        return $this->propertyName;
    }
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createFromBoolean($this->equals($type));
    }
    public function isSuperTypeOf(\PHPStan\Type\Type $type) : \PHPStan\TrinaryLogic
    {
        return $type->hasProperty($this->propertyName);
    }
    public function isSubTypeOf(\PHPStan\Type\Type $otherType) : \PHPStan\TrinaryLogic
    {
        if ($otherType instanceof \PHPStan\Type\UnionType || $otherType instanceof \PHPStan\Type\IntersectionType) {
            return $otherType->isSuperTypeOf($this);
        }
        if ($otherType instanceof self) {
            $limit = \PHPStan\TrinaryLogic::createYes();
        } else {
            $limit = \PHPStan\TrinaryLogic::createMaybe();
        }
        return $limit->and($otherType->hasProperty($this->propertyName));
    }
    public function equals(\PHPStan\Type\Type $type) : bool
    {
        return $type instanceof self && $this->propertyName === $type->propertyName;
    }
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return \sprintf('hasProperty(%s)', $this->propertyName);
    }
    public function hasProperty(string $propertyName) : \PHPStan\TrinaryLogic
    {
        if ($this->propertyName === $propertyName) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function getCallableParametersAcceptors(\PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : array
    {
        return [new \PHPStan\Reflection\TrivialParametersAcceptor()];
    }
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self($properties['propertyName']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\Reflection\ConstantReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\PropertyReflection;
use PHPStan\Reflection\TrivialParametersAcceptor;
use PHPStan\TrinaryLogic;
use PHPStan\Type\Accessory\AccessoryType;
class IntersectionType implements \PHPStan\Type\CompoundType, \PHPStan\Type\StaticResolvableType
{
    /** @var \PHPStan\Type\Type[] */
    private $types;
    /**
     * @param Type[] $types
     */
    public function __construct(array $types)
    {
        $this->types = \PHPStan\Type\UnionTypeHelper::sortTypes($types);
    }
    /**
     * @return Type[]
     */
    public function getTypes() : array
    {
        return $this->types;
    }
    /**
     * @return string[]
     */
    public function getReferencedClasses() : array
    {
        return \PHPStan\Type\UnionTypeHelper::getReferencedClasses($this->types);
    }
    public function accepts(\PHPStan\Type\Type $otherType, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        foreach ($this->types as $type) {
            if (!$type->accepts($otherType, $strictTypes)->yes()) {
                return \PHPStan\TrinaryLogic::createNo();
            }
        }
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function isSuperTypeOf(\PHPStan\Type\Type $otherType) : \PHPStan\TrinaryLogic
    {
        $results = [];
        foreach ($this->getTypes() as $innerType) {
            $results[] = $innerType->isSuperTypeOf($otherType);
        }
        return \PHPStan\TrinaryLogic::createYes()->and(...$results);
    }
    public function isSubTypeOf(\PHPStan\Type\Type $otherType) : \PHPStan\TrinaryLogic
    {
        if ($otherType instanceof self || $otherType instanceof \PHPStan\Type\UnionType) {
            return $otherType->isSuperTypeOf($this);
        }
        $results = [];
        foreach ($this->getTypes() as $innerType) {
            $results[] = $otherType->isSuperTypeOf($innerType);
        }
        return \PHPStan\TrinaryLogic::maxMin(...$results);
    }
    public function equals(\PHPStan\Type\Type $type) : bool
    {
        if (!$type instanceof self) {
            return \false;
        }
        if (\count($this->types) !== \count($type->types)) {
            return \false;
        }
        foreach ($this->types as $i => $innerType) {
            if (!$innerType->equals($type->types[$i])) {
                return \false;
            }
        }
        return \true;
    }
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return $level->handle(function () use($level) : string {
            $typeNames = [];
            foreach ($this->types as $type) {
                if ($type instanceof \PHPStan\Type\Accessory\AccessoryType) {
                    continue;
                }
                $typeNames[] = \PHPStan\Type\TypeUtils::generalizeType($type)->describe($level);
            }
            return \implode('&', $typeNames);
        }, function () use($level) : string {
            $typeNames = [];
            foreach ($this->types as $type) {
                if ($type instanceof \PHPStan\Type\Accessory\AccessoryType) {
                    continue;
                }
                $typeNames[] = $type->describe($level);
            }
            return \implode('&', $typeNames);
        }, function () use($level) : string {
            $typeNames = [];
            foreach ($this->types as $type) {
                $typeNames[] = $type->describe($level);
            }
            return \implode('&', $typeNames);
        });
    }
    public function canAccessProperties() : \PHPStan\TrinaryLogic
    {
        return $this->intersectResults(static function (\PHPStan\Type\Type $type) : TrinaryLogic {
            return $type->canAccessProperties();
        });
    }
    public function hasProperty(string $propertyName) : \PHPStan\TrinaryLogic
    {
        return $this->intersectResults(static function (\PHPStan\Type\Type $type) use($propertyName) : TrinaryLogic {
            return $type->hasProperty($propertyName);
        });
    }
    public function getProperty(string $propertyName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\PropertyReflection
    {
        foreach ($this->types as $type) {
            if ($type->hasProperty($propertyName)->yes()) {
                return $type->getProperty($propertyName, $scope);
            }
        }
        throw new \PHPStan\ShouldNotHappenException();
    }
    public function canCallMethods() : \PHPStan\TrinaryLogic
    {
        return $this->intersectResults(static function (\PHPStan\Type\Type $type) : TrinaryLogic {
            return $type->canCallMethods();
        });
    }
    public function hasMethod(string $methodName) : \PHPStan\TrinaryLogic
    {
        return $this->intersectResults(static function (\PHPStan\Type\Type $type) use($methodName) : TrinaryLogic {
            return $type->hasMethod($methodName);
        });
    }
    public function getMethod(string $methodName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\MethodReflection
    {
        foreach ($this->types as $type) {
            if ($type->hasMethod($methodName)->yes()) {
                return $type->getMethod($methodName, $scope);
            }
        }
        throw new \PHPStan\ShouldNotHappenException();
    }
    public function canAccessConstants() : \PHPStan\TrinaryLogic
    {
        return $this->intersectResults(static function (\PHPStan\Type\Type $type) : TrinaryLogic {
            return $type->canAccessConstants();
        });
    }
    public function hasConstant(string $constantName) : \PHPStan\TrinaryLogic
    {
        return $this->intersectResults(static function (\PHPStan\Type\Type $type) use($constantName) : TrinaryLogic {
            return $type->hasConstant($constantName);
        });
    }
    public function getConstant(string $constantName) : \PHPStan\Reflection\ConstantReflection
    {
        foreach ($this->types as $type) {
            if ($type->hasConstant($constantName)->yes()) {
                return $type->getConstant($constantName);
            }
        }
        throw new \PHPStan\ShouldNotHappenException();
    }
    public function isIterable() : \PHPStan\TrinaryLogic
    {
        return $this->intersectResults(static function (\PHPStan\Type\Type $type) : TrinaryLogic {
            return $type->isIterable();
        });
    }
    public function isIterableAtLeastOnce() : \PHPStan\TrinaryLogic
    {
        return $this->intersectResults(static function (\PHPStan\Type\Type $type) : TrinaryLogic {
            return $type->isIterableAtLeastOnce();
        });
    }
    public function getIterableKeyType() : \PHPStan\Type\Type
    {
        return $this->intersectTypes(static function (\PHPStan\Type\Type $type) : Type {
            return $type->getIterableKeyType();
        });
    }
    public function getIterableValueType() : \PHPStan\Type\Type
    {
        return $this->intersectTypes(static function (\PHPStan\Type\Type $type) : Type {
            return $type->getIterableValueType();
        });
    }
    public function isOffsetAccessible() : \PHPStan\TrinaryLogic
    {
        return $this->intersectResults(static function (\PHPStan\Type\Type $type) : TrinaryLogic {
            return $type->isOffsetAccessible();
        });
    }
    public function hasOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\TrinaryLogic
    {
        return $this->intersectResults(static function (\PHPStan\Type\Type $type) use($offsetType) : TrinaryLogic {
            return $type->hasOffsetValueType($offsetType);
        });
    }
    public function getOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\Type\Type
    {
        return $this->intersectTypes(static function (\PHPStan\Type\Type $type) use($offsetType) : Type {
            return $type->getOffsetValueType($offsetType);
        });
    }
    public function setOffsetValueType(?\PHPStan\Type\Type $offsetType, \PHPStan\Type\Type $valueType) : \PHPStan\Type\Type
    {
        return $this->intersectTypes(static function (\PHPStan\Type\Type $type) use($offsetType, $valueType) : Type {
            return $type->setOffsetValueType($offsetType, $valueType);
        });
    }
    public function isCallable() : \PHPStan\TrinaryLogic
    {
        return $this->intersectResults(static function (\PHPStan\Type\Type $type) : TrinaryLogic {
            return $type->isCallable();
        });
    }
    /**
     * @param \PHPStan\Reflection\ClassMemberAccessAnswerer $scope
     * @return \PHPStan\Reflection\ParametersAcceptor[]
     */
    public function getCallableParametersAcceptors(\PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : array
    {
        if ($this->isCallable()->no()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return [new \PHPStan\Reflection\TrivialParametersAcceptor()];
    }
    public function isCloneable() : \PHPStan\TrinaryLogic
    {
        return $this->intersectResults(static function (\PHPStan\Type\Type $type) : TrinaryLogic {
            return $type->isCloneable();
        });
    }
    public function toBoolean() : \PHPStan\Type\BooleanType
    {
        /** @var BooleanType $type */
        $type = $this->intersectTypes(static function (\PHPStan\Type\Type $type) : BooleanType {
            return $type->toBoolean();
        });
        return $type;
    }
    public function toNumber() : \PHPStan\Type\Type
    {
        $type = $this->intersectTypes(static function (\PHPStan\Type\Type $type) : Type {
            return $type->toNumber();
        });
        return $type;
    }
    public function toString() : \PHPStan\Type\Type
    {
        $type = $this->intersectTypes(static function (\PHPStan\Type\Type $type) : Type {
            return $type->toString();
        });
        return $type;
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        $type = $this->intersectTypes(static function (\PHPStan\Type\Type $type) : Type {
            return $type->toInteger();
        });
        return $type;
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        $type = $this->intersectTypes(static function (\PHPStan\Type\Type $type) : Type {
            return $type->toFloat();
        });
        return $type;
    }
    public function toArray() : \PHPStan\Type\Type
    {
        $type = $this->intersectTypes(static function (\PHPStan\Type\Type $type) : Type {
            return $type->toArray();
        });
        return $type;
    }
    public function resolveStatic(string $className) : \PHPStan\Type\Type
    {
        return new self(\PHPStan\Type\UnionTypeHelper::resolveStatic($className, $this->getTypes()));
    }
    public function changeBaseClass(string $className) : \PHPStan\Type\StaticResolvableType
    {
        return new self(\PHPStan\Type\UnionTypeHelper::changeBaseClass($className, $this->getTypes()));
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self($properties['types']);
    }
    /**
     * @param callable(Type $type): TrinaryLogic $getResult
     * @return TrinaryLogic
     */
    private function intersectResults(callable $getResult) : \PHPStan\TrinaryLogic
    {
        $operands = \array_map($getResult, $this->types);
        return \PHPStan\TrinaryLogic::maxMin(...$operands);
    }
    /**
     * @param callable(Type $type): Type $getType
     * @return Type
     */
    private function intersectTypes(callable $getType) : \PHPStan\Type\Type
    {
        $operands = \array_map($getType, $this->types);
        return \PHPStan\Type\TypeCombinator::intersect(...$operands);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\Broker\Broker;
use PHPStan\TrinaryLogic;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\Traits\MaybeCallableTypeTrait;
use PHPStan\Type\Traits\NonIterableTypeTrait;
use PHPStan\Type\Traits\NonObjectTypeTrait;
use PHPStan\Type\Traits\UndecidedBooleanTypeTrait;
class StringType implements \PHPStan\Type\Type
{
    use JustNullableTypeTrait;
    use MaybeCallableTypeTrait;
    use NonIterableTypeTrait;
    use NonObjectTypeTrait;
    use UndecidedBooleanTypeTrait;
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return 'string';
    }
    public function isOffsetAccessible() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function hasOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\TrinaryLogic
    {
        return (new \PHPStan\Type\IntegerType())->isSuperTypeOf($offsetType)->and(\PHPStan\TrinaryLogic::createMaybe());
    }
    public function getOffsetValueType(\PHPStan\Type\Type $offsetType) : \PHPStan\Type\Type
    {
        if ($this->hasOffsetValueType($offsetType)->no()) {
            return new \PHPStan\Type\ErrorType();
        }
        return new \PHPStan\Type\StringType();
    }
    public function setOffsetValueType(?\PHPStan\Type\Type $offsetType, \PHPStan\Type\Type $valueType) : \PHPStan\Type\Type
    {
        if ($offsetType === null) {
            return new \PHPStan\Type\ErrorType();
        }
        $valueStringType = $valueType->toString();
        if ($valueStringType instanceof \PHPStan\Type\ErrorType) {
            return new \PHPStan\Type\ErrorType();
        }
        if ((new \PHPStan\Type\IntegerType())->isSuperTypeOf($offsetType)->yes()) {
            return new \PHPStan\Type\StringType();
        }
        return new \PHPStan\Type\ErrorType();
    }
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof self) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return \PHPStan\Type\CompoundTypeHelper::accepts($type, $this, $strictTypes);
        }
        if ($type instanceof \PHPStan\Type\TypeWithClassName && !$strictTypes) {
            $broker = \PHPStan\Broker\Broker::getInstance();
            if (!$broker->hasClass($type->getClassName())) {
                return \PHPStan\TrinaryLogic::createNo();
            }
            $typeClass = $broker->getClass($type->getClassName());
            return \PHPStan\TrinaryLogic::createFromBoolean($typeClass->hasNativeMethod('__toString'));
        }
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function toNumber() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\IntegerType();
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\FloatType();
    }
    public function toString() : \PHPStan\Type\Type
    {
        return $this;
    }
    public function toArray() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\Constant\ConstantArrayType([new \PHPStan\Type\Constant\ConstantIntegerType(0)], [$this], 1);
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\Reflection\ConstantReflection;
use PHPStan\Reflection\Dummy\DummyConstantReflection;
use PHPStan\Reflection\Dummy\DummyMethodReflection;
use PHPStan\Reflection\Dummy\DummyPropertyReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\PropertyReflection;
use PHPStan\Reflection\TrivialParametersAcceptor;
use PHPStan\TrinaryLogic;
use PHPStan\Type\Traits\MaybeIterableTypeTrait;
use PHPStan\Type\Traits\MaybeOffsetAccessibleTypeTrait;
use PHPStan\Type\Traits\UndecidedBooleanTypeTrait;
class MixedType implements \PHPStan\Type\CompoundType, \PHPStan\Type\SubtractableType
{
    use MaybeIterableTypeTrait;
    use MaybeOffsetAccessibleTypeTrait;
    use UndecidedBooleanTypeTrait;
    /** @var bool */
    private $isExplicitMixed;
    /** @var \PHPStan\Type\Type|null */
    private $subtractedType;
    public function __construct(bool $isExplicitMixed = \false, ?\PHPStan\Type\Type $subtractedType = null)
    {
        $this->isExplicitMixed = $isExplicitMixed;
        $this->subtractedType = $subtractedType;
    }
    /**
     * @return string[]
     */
    public function getReferencedClasses() : array
    {
        return [];
    }
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function isSuperTypeOf(\PHPStan\Type\Type $type) : \PHPStan\TrinaryLogic
    {
        if ($this->subtractedType === null) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        if ($type instanceof self) {
            if ($type->subtractedType === null) {
                return \PHPStan\TrinaryLogic::createMaybe();
            }
            $isSuperType = $type->subtractedType->isSuperTypeOf($this->subtractedType);
            if ($isSuperType->yes()) {
                return \PHPStan\TrinaryLogic::createYes();
            }
            return \PHPStan\TrinaryLogic::createMaybe();
        }
        return $this->subtractedType->isSuperTypeOf($type)->negate();
    }
    public function setOffsetValueType(?\PHPStan\Type\Type $offsetType, \PHPStan\Type\Type $valueType) : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\MixedType();
    }
    public function isCallable() : \PHPStan\TrinaryLogic
    {
        if ($this->subtractedType !== null && $this->subtractedType->isCallable()->yes()) {
            return \PHPStan\TrinaryLogic::createNo();
        }
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    /**
     * @param \PHPStan\Reflection\ClassMemberAccessAnswerer $scope
     * @return \PHPStan\Reflection\ParametersAcceptor[]
     */
    public function getCallableParametersAcceptors(\PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : array
    {
        return [new \PHPStan\Reflection\TrivialParametersAcceptor()];
    }
    public function equals(\PHPStan\Type\Type $type) : bool
    {
        if (!$type instanceof self) {
            return \false;
        }
        if ($this->subtractedType === null) {
            if ($type->subtractedType === null) {
                return \true;
            }
            return \false;
        }
        if ($type->subtractedType === null) {
            return \false;
        }
        return $this->subtractedType->equals($type->subtractedType);
    }
    public function isSubTypeOf(\PHPStan\Type\Type $otherType) : \PHPStan\TrinaryLogic
    {
        if ($otherType instanceof self) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        if ($this->subtractedType !== null) {
            $isSuperType = $this->subtractedType->isSuperTypeOf($otherType);
            if ($isSuperType->yes()) {
                return \PHPStan\TrinaryLogic::createNo();
            }
        }
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function canAccessProperties() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function hasProperty(string $propertyName) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function getProperty(string $propertyName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\PropertyReflection
    {
        return new \PHPStan\Reflection\Dummy\DummyPropertyReflection();
    }
    public function canCallMethods() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function hasMethod(string $methodName) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function getMethod(string $methodName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\MethodReflection
    {
        return new \PHPStan\Reflection\Dummy\DummyMethodReflection($methodName);
    }
    public function canAccessConstants() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function hasConstant(string $constantName) : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function getConstant(string $constantName) : \PHPStan\Reflection\ConstantReflection
    {
        return new \PHPStan\Reflection\Dummy\DummyConstantReflection($constantName);
    }
    public function isCloneable() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        return $level->handle(static function () : string {
            return 'mixed';
        }, static function () : string {
            return 'mixed';
        }, function () use($level) : string {
            $description = 'mixed';
            if ($this->subtractedType !== null) {
                $description .= \sprintf('~%s', $this->subtractedType->describe($level));
            }
            return $description;
        });
    }
    public function toNumber() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\UnionType([$this->toInteger(), $this->toFloat()]);
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\IntegerType();
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\FloatType();
    }
    public function toString() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\StringType();
    }
    public function toArray() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType());
    }
    public function isExplicitMixed() : bool
    {
        return $this->isExplicitMixed;
    }
    public function subtract(\PHPStan\Type\Type $type) : \PHPStan\Type\Type
    {
        if ($type instanceof self) {
            return new \PHPStan\Type\NeverType();
        }
        if ($this->subtractedType !== null) {
            $type = \PHPStan\Type\TypeCombinator::union($this->subtractedType, $type);
        }
        return new static($this->isExplicitMixed, $type);
    }
    public function getTypeWithoutSubtractedType() : \PHPStan\Type\Type
    {
        return new self($this->isExplicitMixed);
    }
    public function changeSubtractedType(?\PHPStan\Type\Type $subtractedType) : \PHPStan\Type\Type
    {
        return new self($this->isExplicitMixed, $subtractedType);
    }
    public function getSubtractedType() : ?\PHPStan\Type\Type
    {
        return $this->subtractedType;
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self($properties['isExplicitMixed'], $properties['subtractedType'] ?? null);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Type;

use PHPStan\TrinaryLogic;
use PHPStan\Type\Traits\MaybeCallableTypeTrait;
use PHPStan\Type\Traits\MaybeObjectTypeTrait;
use PHPStan\Type\Traits\MaybeOffsetAccessibleTypeTrait;
use PHPStan\Type\Traits\UndecidedBooleanTypeTrait;
class IterableType implements \PHPStan\Type\StaticResolvableType, \PHPStan\Type\CompoundType
{
    use MaybeCallableTypeTrait;
    use MaybeObjectTypeTrait;
    use MaybeOffsetAccessibleTypeTrait;
    use UndecidedBooleanTypeTrait;
    /** @var \PHPStan\Type\Type */
    private $keyType;
    /** @var \PHPStan\Type\Type */
    private $itemType;
    public function __construct(\PHPStan\Type\Type $keyType, \PHPStan\Type\Type $itemType)
    {
        $this->keyType = $keyType;
        $this->itemType = $itemType;
    }
    public function getItemType() : \PHPStan\Type\Type
    {
        return $this->itemType;
    }
    /**
     * @return string[]
     */
    public function getReferencedClasses() : array
    {
        return \array_merge($this->keyType->getReferencedClasses(), $this->getItemType()->getReferencedClasses());
    }
    public function accepts(\PHPStan\Type\Type $type, bool $strictTypes) : \PHPStan\TrinaryLogic
    {
        if ($type instanceof \PHPStan\Type\CompoundType) {
            return \PHPStan\Type\CompoundTypeHelper::accepts($type, $this, $strictTypes);
        }
        if ($type->isIterable()->yes()) {
            return $this->getIterableValueType()->accepts($type->getIterableValueType(), $strictTypes)->and($this->getIterableKeyType()->accepts($type->getIterableKeyType(), $strictTypes));
        }
        return \PHPStan\TrinaryLogic::createNo();
    }
    public function isSuperTypeOf(\PHPStan\Type\Type $type) : \PHPStan\TrinaryLogic
    {
        return $type->isIterable()->and($this->getIterableValueType()->isSuperTypeOf($type->getIterableValueType()))->and($this->getIterableKeyType()->isSuperTypeOf($type->getIterableKeyType()));
    }
    public function isSubTypeOf(\PHPStan\Type\Type $otherType) : \PHPStan\TrinaryLogic
    {
        if ($otherType instanceof \PHPStan\Type\IntersectionType || $otherType instanceof \PHPStan\Type\UnionType) {
            return $otherType->isSuperTypeOf(new \PHPStan\Type\UnionType([new \PHPStan\Type\ArrayType($this->keyType, $this->itemType), new \PHPStan\Type\IntersectionType([new \PHPStan\Type\ObjectType(\Traversable::class), $this])]));
        }
        if ($otherType instanceof self) {
            $limit = \PHPStan\TrinaryLogic::createYes();
        } else {
            $limit = \PHPStan\TrinaryLogic::createMaybe();
        }
        return $limit->and($otherType->isIterable(), $otherType->getIterableValueType()->isSuperTypeOf($this->itemType), $otherType->getIterableKeyType()->isSuperTypeOf($this->keyType));
    }
    public function equals(\PHPStan\Type\Type $type) : bool
    {
        if (!$type instanceof self) {
            return \false;
        }
        return $this->keyType->equals($type->keyType) && $this->itemType->equals($type->itemType);
    }
    public function describe(\PHPStan\Type\VerbosityLevel $level) : string
    {
        if ($this->keyType instanceof \PHPStan\Type\MixedType) {
            if ($this->itemType instanceof \PHPStan\Type\MixedType) {
                return 'iterable';
            }
            return \sprintf('iterable<%s>', $this->itemType->describe($level));
        }
        return \sprintf('iterable<%s, %s>', $this->keyType->describe($level), $this->itemType->describe($level));
    }
    public function toNumber() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toString() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toInteger() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toFloat() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ErrorType();
    }
    public function toArray() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\ArrayType($this->keyType, $this->getItemType());
    }
    public function resolveStatic(string $className) : \PHPStan\Type\Type
    {
        if ($this->getItemType() instanceof \PHPStan\Type\StaticResolvableType) {
            return new self($this->keyType, $this->getItemType()->resolveStatic($className));
        }
        return $this;
    }
    public function changeBaseClass(string $className) : \PHPStan\Type\StaticResolvableType
    {
        if ($this->getItemType() instanceof \PHPStan\Type\StaticResolvableType) {
            return new self($this->keyType, $this->getItemType()->changeBaseClass($className));
        }
        return $this;
    }
    public function isIterable() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createYes();
    }
    public function isIterableAtLeastOnce() : \PHPStan\TrinaryLogic
    {
        return \PHPStan\TrinaryLogic::createMaybe();
    }
    public function getIterableKeyType() : \PHPStan\Type\Type
    {
        return $this->keyType;
    }
    public function getIterableValueType() : \PHPStan\Type\Type
    {
        return $this->getItemType();
    }
    /**
     * @param mixed[] $properties
     * @return Type
     */
    public static function __set_state(array $properties) : \PHPStan\Type\Type
    {
        return new self($properties['keyType'], $properties['itemType']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Analyser;

interface TypeSpecifierAwareExtension
{
    public function setTypeSpecifier(\PHPStan\Analyser\TypeSpecifier $typeSpecifier) : void;
}
<?php

declare (strict_types=1);
namespace PHPStan\Analyser;

use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\Array_;
use PhpParser\Node\Expr\ArrayDimFetch;
use PhpParser\Node\Expr\ArrayItem;
use PhpParser\Node\Expr\Assign;
use PhpParser\Node\Expr\AssignRef;
use PhpParser\Node\Expr\BinaryOp;
use PhpParser\Node\Expr\BinaryOp\BooleanAnd;
use PhpParser\Node\Expr\BinaryOp\BooleanOr;
use PhpParser\Node\Expr\BinaryOp\Coalesce;
use PhpParser\Node\Expr\BooleanNot;
use PhpParser\Node\Expr\Cast;
use PhpParser\Node\Expr\ConstFetch;
use PhpParser\Node\Expr\ErrorSuppress;
use PhpParser\Node\Expr\Exit_;
use PhpParser\Node\Expr\FuncCall;
use PhpParser\Node\Expr\Instanceof_;
use PhpParser\Node\Expr\List_;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Expr\New_;
use PhpParser\Node\Expr\PropertyFetch;
use PhpParser\Node\Expr\StaticCall;
use PhpParser\Node\Expr\StaticPropertyFetch;
use PhpParser\Node\Expr\Ternary;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Name;
use PhpParser\Node\Stmt\Break_;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\Continue_;
use PhpParser\Node\Stmt\Do_;
use PhpParser\Node\Stmt\Echo_;
use PhpParser\Node\Stmt\For_;
use PhpParser\Node\Stmt\Foreach_;
use PhpParser\Node\Stmt\If_;
use PhpParser\Node\Stmt\Return_;
use PhpParser\Node\Stmt\Static_;
use PhpParser\Node\Stmt\StaticVar;
use PhpParser\Node\Stmt\Switch_;
use PhpParser\Node\Stmt\Throw_;
use PhpParser\Node\Stmt\TryCatch;
use PhpParser\Node\Stmt\Unset_;
use PhpParser\Node\Stmt\While_;
use PHPStan\Broker\Broker;
use PHPStan\File\FileHelper;
use PHPStan\Node\ClosureReturnStatementsNode;
use PHPStan\Node\ExecutionEndNode;
use PHPStan\Node\InClassMethodNode;
use PHPStan\Node\LiteralArrayItem;
use PHPStan\Node\LiteralArrayNode;
use PHPStan\Node\ReturnStatement;
use PHPStan\Node\UnreachableStatementNode;
use PHPStan\Parser\Parser;
use PHPStan\PhpDoc\PhpDocBlock;
use PHPStan\PhpDoc\Tag\ParamTag;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\ParametersAcceptor;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\ArrayType;
use PHPStan\Type\ClosureType;
use PHPStan\Type\CommentHelper;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantArrayTypeBuilder;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\ErrorType;
use PHPStan\Type\FileTypeMapper;
use PHPStan\Type\IntegerType;
use PHPStan\Type\MixedType;
use PHPStan\Type\NullType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
use PHPStan\Type\UnionType;
class NodeScopeResolver
{
    private const LOOP_SCOPE_ITERATIONS = 3;
    private const GENERALIZE_AFTER_ITERATION = 1;
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PHPStan\Parser\Parser */
    private $parser;
    /** @var \PHPStan\Type\FileTypeMapper */
    private $fileTypeMapper;
    /** @var \PHPStan\File\FileHelper */
    private $fileHelper;
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    /** @var bool */
    private $polluteScopeWithLoopInitialAssignments;
    /** @var bool */
    private $polluteCatchScopeWithTryAssignments;
    /** @var bool */
    private $polluteScopeWithAlwaysIterableForeach;
    /** @var string[][] className(string) => methods(string[]) */
    private $earlyTerminatingMethodCalls;
    /** @var bool[] filePath(string) => bool(true) */
    private $analysedFiles;
    /**
     * @param Broker $broker
     * @param Parser $parser
     * @param FileTypeMapper $fileTypeMapper
     * @param FileHelper $fileHelper
     * @param TypeSpecifier $typeSpecifier
     * @param bool $polluteScopeWithLoopInitialAssignments
     * @param bool $polluteCatchScopeWithTryAssignments
     * @param bool $polluteScopeWithAlwaysIterableForeach
     * @param string[][] $earlyTerminatingMethodCalls className(string) => methods(string[])
     */
    public function __construct(\PHPStan\Broker\Broker $broker, \PHPStan\Parser\Parser $parser, \PHPStan\Type\FileTypeMapper $fileTypeMapper, \PHPStan\File\FileHelper $fileHelper, \PHPStan\Analyser\TypeSpecifier $typeSpecifier, bool $polluteScopeWithLoopInitialAssignments, bool $polluteCatchScopeWithTryAssignments, bool $polluteScopeWithAlwaysIterableForeach, array $earlyTerminatingMethodCalls)
    {
        $this->broker = $broker;
        $this->parser = $parser;
        $this->fileTypeMapper = $fileTypeMapper;
        $this->fileHelper = $fileHelper;
        $this->typeSpecifier = $typeSpecifier;
        $this->polluteScopeWithLoopInitialAssignments = $polluteScopeWithLoopInitialAssignments;
        $this->polluteCatchScopeWithTryAssignments = $polluteCatchScopeWithTryAssignments;
        $this->polluteScopeWithAlwaysIterableForeach = $polluteScopeWithAlwaysIterableForeach;
        $this->earlyTerminatingMethodCalls = $earlyTerminatingMethodCalls;
    }
    /**
     * @param string[] $files
     */
    public function setAnalysedFiles(array $files) : void
    {
        $this->analysedFiles = \array_fill_keys($files, \true);
    }
    /**
     * @param \PhpParser\Node[] $nodes
     * @param \PHPStan\Analyser\Scope $scope
     * @param \Closure(\PhpParser\Node $node, Scope $scope): void $nodeCallback
     */
    public function processNodes(array $nodes, \PHPStan\Analyser\Scope $scope, \Closure $nodeCallback) : void
    {
        $nodesCount = \count($nodes);
        $alreadyTerminated = \false;
        foreach ($nodes as $i => $node) {
            if (!$node instanceof \PhpParser\Node\Stmt) {
                continue;
            }
            $statementResult = $this->processStmtNode($node, $scope, $nodeCallback);
            $scope = $statementResult->getScope();
            if ($alreadyTerminated) {
                continue;
            }
            if (!$statementResult->isAlwaysTerminating()) {
                continue;
            }
            $alreadyTerminated = \true;
            if ($i < $nodesCount - 1) {
                $nextStmt = $nodes[$i + 1];
                if (!$nextStmt instanceof \PhpParser\Node\Stmt) {
                    continue;
                }
                $nodeCallback(new \PHPStan\Node\UnreachableStatementNode($nextStmt), $scope);
            }
            // todo break;
        }
    }
    /**
     * @param \PhpParser\Node $parentNode
     * @param \PhpParser\Node\Stmt[] $stmts
     * @param \PHPStan\Analyser\Scope $scope
     * @param \Closure(\PhpParser\Node $node, Scope $scope): void $nodeCallback
     * @return StatementResult
     */
    public function processStmtNodes(\PhpParser\Node $parentNode, array $stmts, \PHPStan\Analyser\Scope $scope, \Closure $nodeCallback) : \PHPStan\Analyser\StatementResult
    {
        $exitPoints = [];
        $alreadyTerminated = \false;
        $hasYield = \false;
        $stmtCount = \count($stmts);
        $shouldCheckLastStatement = $parentNode instanceof \PhpParser\Node\Stmt\Function_ || $parentNode instanceof \PhpParser\Node\Stmt\ClassMethod || $parentNode instanceof \PhpParser\Node\Expr\Closure;
        foreach ($stmts as $i => $stmt) {
            $isLast = $i === $stmtCount - 1;
            $statementResult = $this->processStmtNode($stmt, $scope, $nodeCallback);
            $scope = $statementResult->getScope();
            $hasYield = $hasYield || $statementResult->hasYield();
            if ($alreadyTerminated) {
                continue;
            }
            if ($shouldCheckLastStatement && $isLast) {
                /** @var Node\Stmt\Function_|Node\Stmt\ClassMethod|Expr\Closure $parentNode */
                $parentNode = $parentNode;
                $nodeCallback(new \PHPStan\Node\ExecutionEndNode($stmt, new \PHPStan\Analyser\StatementResult($scope, $hasYield, $statementResult->isAlwaysTerminating(), $statementResult->getExitPoints()), $parentNode->returnType !== null), $scope);
            }
            $exitPoints = \array_merge($exitPoints, $statementResult->getExitPoints());
            if (!$statementResult->isAlwaysTerminating()) {
                continue;
            }
            $alreadyTerminated = \true;
            if ($i < $stmtCount - 1) {
                $nextStmt = $stmts[$i + 1];
                $nodeCallback(new \PHPStan\Node\UnreachableStatementNode($nextStmt), $scope);
            }
            // todo break
        }
        $statementResult = new \PHPStan\Analyser\StatementResult($scope, $hasYield, $alreadyTerminated, $exitPoints);
        if ($stmtCount === 0 && $shouldCheckLastStatement) {
            /** @var Node\Stmt\Function_|Node\Stmt\ClassMethod|Expr\Closure $parentNode */
            $parentNode = $parentNode;
            $nodeCallback(new \PHPStan\Node\ExecutionEndNode($parentNode, $statementResult, $parentNode->returnType !== null), $scope);
        }
        return $statementResult;
    }
    /**
     * @param \PhpParser\Node\Stmt $stmt
     * @param \PHPStan\Analyser\Scope $scope
     * @param \Closure(\PhpParser\Node $node, Scope $scope): void $nodeCallback
     * @return StatementResult
     */
    private function processStmtNode(\PhpParser\Node\Stmt $stmt, \PHPStan\Analyser\Scope $scope, \Closure $nodeCallback) : \PHPStan\Analyser\StatementResult
    {
        $nodeCallback($stmt, $scope);
        // todo handle all stmt descendants
        if ($stmt instanceof \PhpParser\Node\Stmt\Declare_) {
            $hasYield = \false;
            foreach ($stmt->declares as $declare) {
                $nodeCallback($declare, $scope);
                $nodeCallback($declare->value, $scope);
                if ($declare->key->name !== 'strict_types' || !$declare->value instanceof \PhpParser\Node\Scalar\LNumber || $declare->value->value !== 1) {
                    continue;
                }
                $scope = $scope->enterDeclareStrictTypes();
            }
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\Function_) {
            $hasYield = \false;
            [$phpDocParameterTypes, $phpDocReturnType, $phpDocThrowType, $deprecatedDescription, $isDeprecated, $isInternal, $isFinal] = $this->getPhpDocs($scope, $stmt);
            foreach ($stmt->params as $param) {
                $this->processParamNode($param, $scope, $nodeCallback);
            }
            if ($stmt->returnType !== null) {
                $nodeCallback($stmt->returnType, $scope);
            }
            $functionScope = $scope->enterFunction($stmt, $phpDocParameterTypes, $phpDocReturnType, $phpDocThrowType, $deprecatedDescription, $isDeprecated, $isInternal, $isFinal);
            $this->processStmtNodes($stmt, $stmt->stmts, $functionScope, $nodeCallback);
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\ClassMethod) {
            $hasYield = \false;
            [$phpDocParameterTypes, $phpDocReturnType, $phpDocThrowType, $deprecatedDescription, $isDeprecated, $isInternal, $isFinal] = $this->getPhpDocs($scope, $stmt);
            foreach ($stmt->params as $param) {
                $this->processParamNode($param, $scope, $nodeCallback);
            }
            if ($stmt->returnType !== null) {
                $nodeCallback($stmt->returnType, $scope);
            }
            $methodScope = $scope->enterClassMethod($stmt, $phpDocParameterTypes, $phpDocReturnType, $phpDocThrowType, $deprecatedDescription, $isDeprecated, $isInternal, $isFinal);
            $nodeCallback(new \PHPStan\Node\InClassMethodNode($stmt), $methodScope);
            if ($stmt->stmts !== null) {
                $this->processStmtNodes($stmt, $stmt->stmts, $methodScope, $nodeCallback);
            }
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\Echo_) {
            $hasYield = \false;
            foreach ($stmt->exprs as $echoExpr) {
                $result = $this->processExprNode($echoExpr, $scope, $nodeCallback, \PHPStan\Analyser\ExpressionContext::createDeep());
                $scope = $result->getScope();
                $hasYield = $hasYield || $result->hasYield();
            }
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\Return_) {
            if ($stmt->expr !== null) {
                $result = $this->processExprNode($stmt->expr, $scope, $nodeCallback, \PHPStan\Analyser\ExpressionContext::createDeep());
                $scope = $result->getScope();
                $hasYield = $result->hasYield();
            } else {
                $hasYield = \false;
            }
            return new \PHPStan\Analyser\StatementResult($scope, $hasYield, \true, [new \PHPStan\Analyser\StatementExitPoint($stmt, $scope)]);
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\Continue_ || $stmt instanceof \PhpParser\Node\Stmt\Break_) {
            if ($stmt->num !== null) {
                $result = $this->processExprNode($stmt->num, $scope, $nodeCallback, \PHPStan\Analyser\ExpressionContext::createDeep());
                $scope = $result->getScope();
                $hasYield = $result->hasYield();
            } else {
                $hasYield = \false;
            }
            return new \PHPStan\Analyser\StatementResult($scope, $hasYield, \true, [new \PHPStan\Analyser\StatementExitPoint($stmt, $scope)]);
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\Expression) {
            $earlyTerminationExpr = $this->findEarlyTerminatingExpr($stmt->expr, $scope);
            $result = $this->processExprNode($stmt->expr, $scope, $nodeCallback, \PHPStan\Analyser\ExpressionContext::createTopLevel());
            $scope = $result->getScope();
            $scope = $scope->filterBySpecifiedTypes($this->typeSpecifier->specifyTypesInCondition($scope, $stmt->expr, \PHPStan\Analyser\TypeSpecifierContext::createNull()));
            $hasYield = $result->hasYield();
            if ($earlyTerminationExpr !== null) {
                return new \PHPStan\Analyser\StatementResult($scope, $hasYield, \true, [new \PHPStan\Analyser\StatementExitPoint($stmt, $scope)]);
            }
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\Namespace_) {
            if ($stmt->name !== null) {
                $scope = $scope->enterNamespace($stmt->name->toString());
            }
            $scope = $this->processStmtNodes($stmt, $stmt->stmts, $scope, $nodeCallback)->getScope();
            $hasYield = \false;
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\Trait_) {
            return new \PHPStan\Analyser\StatementResult($scope, \false, \false, []);
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\ClassLike) {
            $hasYield = \false;
            if (isset($stmt->namespacedName)) {
                $classScope = $scope->enterClass($this->broker->getClass((string) $stmt->namespacedName));
            } elseif ($stmt instanceof \PhpParser\Node\Stmt\Class_) {
                if ($stmt->name === null) {
                    throw new \PHPStan\ShouldNotHappenException();
                }
                $classScope = $scope->enterClass($this->broker->getClass($stmt->name->toString()));
            } else {
                throw new \PHPStan\ShouldNotHappenException();
            }
            $this->processStmtNodes($stmt, $stmt->stmts, $classScope, $nodeCallback);
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\Property) {
            $hasYield = \false;
            foreach ($stmt->props as $prop) {
                $this->processStmtNode($prop, $scope, $nodeCallback);
            }
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\PropertyProperty) {
            $hasYield = \false;
            if ($stmt->default !== null) {
                $this->processExprNode($stmt->default, $scope, $nodeCallback, \PHPStan\Analyser\ExpressionContext::createDeep());
            }
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\Throw_) {
            $result = $this->processExprNode($stmt->expr, $scope, $nodeCallback, \PHPStan\Analyser\ExpressionContext::createDeep());
            return new \PHPStan\Analyser\StatementResult($result->getScope(), $result->hasYield(), \true, [new \PHPStan\Analyser\StatementExitPoint($stmt, $scope)]);
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\If_) {
            $conditionType = $scope->getType($stmt->cond)->toBoolean();
            $ifAlwaysTrue = $conditionType instanceof \PHPStan\Type\Constant\ConstantBooleanType && $conditionType->getValue();
            $condResult = $this->processExprNode($stmt->cond, $scope, $nodeCallback, \PHPStan\Analyser\ExpressionContext::createDeep());
            $exitPoints = [];
            $finalScope = null;
            $alwaysTerminating = \true;
            $hasYield = \false;
            $branchScopeStatementResult = $this->processStmtNodes($stmt, $stmt->stmts, $condResult->getTruthyScope(), $nodeCallback);
            if (!$conditionType instanceof \PHPStan\Type\Constant\ConstantBooleanType || $conditionType->getValue()) {
                $exitPoints = $branchScopeStatementResult->getExitPoints();
                $branchScope = $branchScopeStatementResult->getScope();
                $finalScope = $branchScopeStatementResult->isAlwaysTerminating() ? null : $branchScope;
                $alwaysTerminating = $branchScopeStatementResult->isAlwaysTerminating();
                $hasYield = $branchScopeStatementResult->hasYield();
            }
            $scope = $condResult->getFalseyScope();
            $lastElseIfConditionIsTrue = \false;
            $condScope = $scope;
            foreach ($stmt->elseifs as $elseif) {
                $nodeCallback($elseif, $scope);
                $elseIfConditionType = $condScope->getType($elseif->cond)->toBoolean();
                $condResult = $this->processExprNode($elseif->cond, $condScope, $nodeCallback, \PHPStan\Analyser\ExpressionContext::createDeep());
                $condScope = $condResult->getScope();
                $branchScopeStatementResult = $this->processStmtNodes($elseif, $elseif->stmts, $condResult->getTruthyScope(), $nodeCallback);
                if (!$ifAlwaysTrue && (!$lastElseIfConditionIsTrue && (!$elseIfConditionType instanceof \PHPStan\Type\Constant\ConstantBooleanType || $elseIfConditionType->getValue()))) {
                    $exitPoints = \array_merge($exitPoints, $branchScopeStatementResult->getExitPoints());
                    $branchScope = $branchScopeStatementResult->getScope();
                    $finalScope = $branchScopeStatementResult->isAlwaysTerminating() ? $finalScope : $branchScope->mergeWith($finalScope);
                    $alwaysTerminating = $alwaysTerminating && $branchScopeStatementResult->isAlwaysTerminating();
                    $hasYield = $hasYield || $branchScopeStatementResult->hasYield();
                }
                if ($elseIfConditionType instanceof \PHPStan\Type\Constant\ConstantBooleanType && $elseIfConditionType->getValue()) {
                    $lastElseIfConditionIsTrue = \true;
                }
                $condScope = $condScope->filterByFalseyValue($elseif->cond);
                $scope = $condScope;
            }
            if ($stmt->else === null) {
                if (!$ifAlwaysTrue) {
                    $finalScope = $scope->mergeWith($finalScope);
                    $alwaysTerminating = \false;
                }
            } else {
                $nodeCallback($stmt->else, $scope);
                $branchScopeStatementResult = $this->processStmtNodes($stmt->else, $stmt->else->stmts, $scope, $nodeCallback);
                if (!$ifAlwaysTrue && !$lastElseIfConditionIsTrue) {
                    $exitPoints = \array_merge($exitPoints, $branchScopeStatementResult->getExitPoints());
                    $branchScope = $branchScopeStatementResult->getScope();
                    $finalScope = $branchScopeStatementResult->isAlwaysTerminating() ? $finalScope : $branchScope->mergeWith($finalScope);
                    $alwaysTerminating = $alwaysTerminating && $branchScopeStatementResult->isAlwaysTerminating();
                    $hasYield = $hasYield || $branchScopeStatementResult->hasYield();
                }
            }
            if ($finalScope === null) {
                $finalScope = $scope;
            }
            return new \PHPStan\Analyser\StatementResult($finalScope, $hasYield, $alwaysTerminating, $exitPoints);
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\TraitUse) {
            $hasYield = \false;
            $this->processTraitUse($stmt, $scope, $nodeCallback);
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\Foreach_) {
            $scope = $this->processExprNode($stmt->expr, $scope, $nodeCallback, \PHPStan\Analyser\ExpressionContext::createDeep())->getScope();
            $bodyScope = $this->enterForeach($scope, $stmt);
            $count = 0;
            do {
                $prevScope = $bodyScope;
                $bodyScope = $bodyScope->mergeWith($scope);
                $bodyScope = $this->enterForeach($bodyScope, $stmt);
                $bodyScopeResult = $this->processStmtNodes($stmt, $stmt->stmts, $bodyScope, static function () : void {
                })->filterOutLoopExitPoints();
                $alwaysTerminating = $bodyScopeResult->isAlwaysTerminating();
                $bodyScope = $bodyScopeResult->getScope();
                foreach ($bodyScopeResult->getExitPointsByType(\PhpParser\Node\Stmt\Continue_::class) as $continueExitPoint) {
                    $bodyScope = $bodyScope->mergeWith($continueExitPoint->getScope());
                }
                if ($bodyScope->equals($prevScope)) {
                    break;
                }
                if ($count >= self::GENERALIZE_AFTER_ITERATION) {
                    $bodyScope = $bodyScope->generalizeWith($prevScope);
                }
                $count++;
            } while (!$alwaysTerminating && $count < self::LOOP_SCOPE_ITERATIONS);
            $bodyScope = $bodyScope->mergeWith($scope);
            $bodyScope = $this->enterForeach($bodyScope, $stmt);
            $finalScopeResult = $this->processStmtNodes($stmt, $stmt->stmts, $bodyScope, $nodeCallback)->filterOutLoopExitPoints();
            $finalScope = $finalScopeResult->getScope();
            foreach ($finalScopeResult->getExitPointsByType(\PhpParser\Node\Stmt\Continue_::class) as $continueExitPoint) {
                $finalScope = $continueExitPoint->getScope()->mergeWith($finalScope);
            }
            foreach ($finalScopeResult->getExitPointsByType(\PhpParser\Node\Stmt\Break_::class) as $breakExitPoint) {
                $finalScope = $breakExitPoint->getScope()->mergeWith($finalScope);
            }
            $isIterableAtLeastOnce = $scope->getType($stmt->expr)->isIterableAtLeastOnce();
            if ($isIterableAtLeastOnce->no() || $finalScopeResult->isAlwaysTerminating()) {
                $finalScope = $scope;
            } elseif ($isIterableAtLeastOnce->maybe()) {
                $finalScope = $finalScope->mergeWith($scope);
            } elseif (!$this->polluteScopeWithAlwaysIterableForeach) {
                $finalScope = $scope->processAlwaysIterableForeachScopeWithoutPollute($finalScope);
                // get types from finalScope, but don't create new variables
            }
            return new \PHPStan\Analyser\StatementResult($finalScope, $finalScopeResult->hasYield(), $isIterableAtLeastOnce->yes() && $finalScopeResult->isAlwaysTerminating(), []);
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\While_) {
            $condResult = $this->processExprNode($stmt->cond, $scope, static function () : void {
            }, \PHPStan\Analyser\ExpressionContext::createDeep());
            $bodyScope = $condResult->getTruthyScope();
            $count = 0;
            do {
                $prevScope = $bodyScope;
                $bodyScope = $bodyScope->mergeWith($scope);
                $bodyScope = $this->processExprNode($stmt->cond, $bodyScope, static function () : void {
                }, \PHPStan\Analyser\ExpressionContext::createDeep())->getTruthyScope();
                $bodyScopeResult = $this->processStmtNodes($stmt, $stmt->stmts, $bodyScope, static function () : void {
                })->filterOutLoopExitPoints();
                $alwaysTerminating = $bodyScopeResult->isAlwaysTerminating();
                $bodyScope = $bodyScopeResult->getScope();
                foreach ($bodyScopeResult->getExitPointsByType(\PhpParser\Node\Stmt\Continue_::class) as $continueExitPoint) {
                    $bodyScope = $bodyScope->mergeWith($continueExitPoint->getScope());
                }
                if ($bodyScope->equals($prevScope)) {
                    break;
                }
                if ($count >= self::GENERALIZE_AFTER_ITERATION) {
                    $bodyScope = $bodyScope->generalizeWith($prevScope);
                }
                $count++;
            } while (!$alwaysTerminating && $count < self::LOOP_SCOPE_ITERATIONS);
            $bodyScope = $bodyScope->mergeWith($scope);
            $bodyScope = $this->processExprNode($stmt->cond, $bodyScope, $nodeCallback, \PHPStan\Analyser\ExpressionContext::createDeep())->getTruthyScope();
            $finalScopeResult = $this->processStmtNodes($stmt, $stmt->stmts, $bodyScope, $nodeCallback)->filterOutLoopExitPoints();
            $finalScope = $finalScopeResult->getScope();
            foreach ($finalScopeResult->getExitPointsByType(\PhpParser\Node\Stmt\Continue_::class) as $continueExitPoint) {
                $finalScope = $finalScope->mergeWith($continueExitPoint->getScope());
            }
            $breakExitPoints = $finalScopeResult->getExitPointsByType(\PhpParser\Node\Stmt\Break_::class);
            foreach ($breakExitPoints as $breakExitPoint) {
                $finalScope = $finalScope->mergeWith($breakExitPoint->getScope());
            }
            $condBooleanType = $scope->getType($stmt->cond)->toBoolean();
            $isIterableAtLeastOnce = $condBooleanType instanceof \PHPStan\Type\Constant\ConstantBooleanType && $condBooleanType->getValue();
            $isAlwaysTerminating = $finalScopeResult->isAlwaysTerminating() && $isIterableAtLeastOnce;
            if (!$isAlwaysTerminating && $isIterableAtLeastOnce && \count($breakExitPoints) === 0 && \count($finalScopeResult->getTerminatingExitPoints()) > 0) {
                $isAlwaysTerminating = \true;
            }
            // todo for all loops - is not falsey when the loop is exited via break
            $condScope = $condResult->getFalseyScope();
            if (!$isIterableAtLeastOnce) {
                if (!$this->polluteScopeWithLoopInitialAssignments) {
                    $condScope = $condScope->mergeWith($scope);
                }
                $finalScope = $finalScope->mergeWith($condScope);
            }
            return new \PHPStan\Analyser\StatementResult($finalScope, $finalScopeResult->hasYield(), $isAlwaysTerminating, []);
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\Do_) {
            $finalScope = null;
            $bodyScope = $scope;
            $count = 0;
            do {
                $prevScope = $bodyScope;
                $bodyScopeResult = $this->processStmtNodes($stmt, $stmt->stmts, $bodyScope, static function () : void {
                })->filterOutLoopExitPoints();
                $alwaysTerminating = $bodyScopeResult->isAlwaysTerminating();
                $bodyScope = $bodyScopeResult->getScope();
                foreach ($bodyScopeResult->getExitPointsByType(\PhpParser\Node\Stmt\Continue_::class) as $continueExitPoint) {
                    $bodyScope = $bodyScope->mergeWith($continueExitPoint->getScope());
                }
                $finalScope = $alwaysTerminating ? $finalScope : $bodyScope->mergeWith($finalScope);
                foreach ($bodyScopeResult->getExitPointsByType(\PhpParser\Node\Stmt\Break_::class) as $breakExitPoint) {
                    $finalScope = $breakExitPoint->getScope()->mergeWith($finalScope);
                }
                $bodyScope = $this->processExprNode($stmt->cond, $bodyScope, static function () : void {
                }, \PHPStan\Analyser\ExpressionContext::createDeep())->getTruthyScope();
                if ($bodyScope->equals($prevScope)) {
                    break;
                }
                if ($count >= self::GENERALIZE_AFTER_ITERATION) {
                    $bodyScope = $bodyScope->generalizeWith($prevScope);
                }
                $count++;
            } while (!$alwaysTerminating && $count < self::LOOP_SCOPE_ITERATIONS);
            $bodyScope = $bodyScope->mergeWith($scope);
            $bodyScopeResult = $this->processStmtNodes($stmt, $stmt->stmts, $bodyScope, $nodeCallback)->filterOutLoopExitPoints();
            $alwaysTerminating = $bodyScopeResult->isAlwaysTerminating();
            $bodyScope = $bodyScopeResult->getScope();
            foreach ($bodyScopeResult->getExitPointsByType(\PhpParser\Node\Stmt\Continue_::class) as $continueExitPoint) {
                $bodyScope = $bodyScope->mergeWith($continueExitPoint->getScope());
            }
            $finalScope = $alwaysTerminating ? $finalScope : $bodyScope->mergeWith($finalScope);
            if ($finalScope === null) {
                $finalScope = $scope;
            }
            if (!$alwaysTerminating) {
                $finalScope = $this->processExprNode($stmt->cond, $bodyScope, $nodeCallback, \PHPStan\Analyser\ExpressionContext::createDeep())->getFalseyScope();
                $condType = $bodyScope->getType($stmt->cond);
                if ($condType instanceof \PHPStan\Type\Constant\ConstantBooleanType && $condType->getValue() && \count($bodyScopeResult->getExitPointsByType(\PhpParser\Node\Stmt\Break_::class)) === 0 && \count($bodyScopeResult->getTerminatingExitPoints()) > 0) {
                    $alwaysTerminating = \true;
                }
                // todo not falsey if it breaks out of the loop using break;
            }
            foreach ($bodyScopeResult->getExitPointsByType(\PhpParser\Node\Stmt\Break_::class) as $breakExitPoint) {
                $finalScope = $breakExitPoint->getScope()->mergeWith($finalScope);
            }
            return new \PHPStan\Analyser\StatementResult($finalScope, $bodyScopeResult->hasYield(), $alwaysTerminating, []);
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\For_) {
            $initScope = $scope;
            foreach ($stmt->init as $initExpr) {
                $initScope = $this->processExprNode($initExpr, $initScope, $nodeCallback, \PHPStan\Analyser\ExpressionContext::createTopLevel())->getScope();
            }
            $bodyScope = $initScope;
            foreach ($stmt->cond as $condExpr) {
                $bodyScope = $this->processExprNode($condExpr, $bodyScope, static function () : void {
                }, \PHPStan\Analyser\ExpressionContext::createDeep())->getTruthyScope();
            }
            $count = 0;
            do {
                $prevScope = $bodyScope;
                $bodyScope = $bodyScope->mergeWith($initScope);
                foreach ($stmt->cond as $condExpr) {
                    $bodyScope = $this->processExprNode($condExpr, $bodyScope, static function () : void {
                    }, \PHPStan\Analyser\ExpressionContext::createDeep())->getTruthyScope();
                }
                $bodyScopeResult = $this->processStmtNodes($stmt, $stmt->stmts, $bodyScope, static function () : void {
                })->filterOutLoopExitPoints();
                $alwaysTerminating = $bodyScopeResult->isAlwaysTerminating();
                $bodyScope = $bodyScopeResult->getScope();
                foreach ($bodyScopeResult->getExitPointsByType(\PhpParser\Node\Stmt\Continue_::class) as $continueExitPoint) {
                    $bodyScope = $bodyScope->mergeWith($continueExitPoint->getScope());
                }
                foreach ($stmt->loop as $loopExpr) {
                    $bodyScope = $this->processExprNode($loopExpr, $bodyScope, static function () : void {
                    }, \PHPStan\Analyser\ExpressionContext::createTopLevel())->getScope();
                }
                if ($bodyScope->equals($prevScope)) {
                    break;
                }
                if ($count >= self::GENERALIZE_AFTER_ITERATION) {
                    $bodyScope = $bodyScope->generalizeWith($prevScope);
                }
                $count++;
            } while (!$alwaysTerminating && $count < self::LOOP_SCOPE_ITERATIONS);
            $bodyScope = $bodyScope->mergeWith($initScope);
            foreach ($stmt->cond as $condExpr) {
                $bodyScope = $this->processExprNode($condExpr, $bodyScope, $nodeCallback, \PHPStan\Analyser\ExpressionContext::createDeep())->getTruthyScope();
            }
            $finalScopeResult = $this->processStmtNodes($stmt, $stmt->stmts, $bodyScope, $nodeCallback)->filterOutLoopExitPoints();
            $finalScope = $finalScopeResult->getScope();
            foreach ($finalScopeResult->getExitPointsByType(\PhpParser\Node\Stmt\Continue_::class) as $continueExitPoint) {
                $finalScope = $continueExitPoint->getScope()->mergeWith($finalScope);
            }
            foreach ($stmt->loop as $loopExpr) {
                $finalScope = $this->processExprNode($loopExpr, $finalScope, $nodeCallback, \PHPStan\Analyser\ExpressionContext::createTopLevel())->getScope();
            }
            foreach ($finalScopeResult->getExitPointsByType(\PhpParser\Node\Stmt\Break_::class) as $breakExitPoint) {
                $finalScope = $breakExitPoint->getScope()->mergeWith($finalScope);
            }
            if ($this->polluteScopeWithLoopInitialAssignments) {
                $scope = $initScope;
            }
            $finalScope = $finalScope->mergeWith($scope);
            /*foreach ($stmt->cond as $condExpr) {
            			// todo not if breaks out of the loop using break;
            			//$finalScope = $finalScope->filterByFalseyValue($condExpr);
            		}*/
            return new \PHPStan\Analyser\StatementResult($finalScope, $finalScopeResult->hasYield(), \false, []);
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\Switch_) {
            $scope = $this->processExprNode($stmt->cond, $scope, $nodeCallback, \PHPStan\Analyser\ExpressionContext::createDeep())->getScope();
            $scopeForBranches = $scope;
            $finalScope = null;
            $prevScope = null;
            $hasDefaultCase = \false;
            $alwaysTerminating = \true;
            $hasYield = \false;
            foreach ($stmt->cases as $caseNode) {
                if ($caseNode->cond !== null) {
                    $condExpr = new \PhpParser\Node\Expr\BinaryOp\Equal($stmt->cond, $caseNode->cond);
                    $scopeForBranches = $this->processExprNode($caseNode->cond, $scopeForBranches, $nodeCallback, \PHPStan\Analyser\ExpressionContext::createDeep())->getScope();
                    $branchScope = $scopeForBranches->filterByTruthyValue($condExpr);
                } else {
                    $hasDefaultCase = \true;
                    $branchScope = $scopeForBranches;
                }
                $branchScope = $branchScope->mergeWith($prevScope);
                $branchScopeResult = $this->processStmtNodes($caseNode, $caseNode->stmts, $branchScope, $nodeCallback);
                $branchScope = $branchScopeResult->getScope();
                $branchFinalScopeResult = $branchScopeResult->filterOutLoopExitPoints();
                $hasYield = $hasYield || $branchFinalScopeResult->hasYield();
                foreach ($branchScopeResult->getExitPointsByType(\PhpParser\Node\Stmt\Break_::class) as $breakExitPoint) {
                    $finalScope = $breakExitPoint->getScope()->mergeWith($finalScope);
                }
                foreach ($branchScopeResult->getExitPointsByType(\PhpParser\Node\Stmt\Continue_::class) as $continueExitPoint) {
                    $finalScope = $continueExitPoint->getScope()->mergeWith($finalScope);
                }
                if ($branchScopeResult->isAlwaysTerminating()) {
                    $alwaysTerminating = $alwaysTerminating && $branchFinalScopeResult->isAlwaysTerminating();
                    $prevScope = null;
                    if (isset($condExpr)) {
                        $scopeForBranches = $scopeForBranches->filterByFalseyValue($condExpr);
                    }
                    if (!$branchFinalScopeResult->isAlwaysTerminating()) {
                        $finalScope = $branchScope->mergeWith($finalScope);
                    }
                } else {
                    $prevScope = $branchScope;
                }
            }
            if (!$hasDefaultCase) {
                $alwaysTerminating = \false;
            }
            if ($prevScope !== null && isset($branchFinalScopeResult)) {
                $finalScope = $prevScope->mergeWith($finalScope);
                $alwaysTerminating = $alwaysTerminating && $branchFinalScopeResult->isAlwaysTerminating();
            }
            if (!$hasDefaultCase || $finalScope === null) {
                $finalScope = $scope->mergeWith($finalScope);
            }
            return new \PHPStan\Analyser\StatementResult($finalScope, $hasYield, $alwaysTerminating, []);
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\TryCatch) {
            $branchScopeResult = $this->processStmtNodes($stmt, $stmt->stmts, $scope, $nodeCallback);
            $branchScope = $branchScopeResult->getScope();
            $tryScope = $branchScope;
            $exitPoints = [];
            $finalScope = $branchScopeResult->isAlwaysTerminating() ? null : $branchScope;
            $alwaysTerminating = $branchScopeResult->isAlwaysTerminating();
            $hasYield = $branchScopeResult->hasYield();
            if ($stmt->finally !== null) {
                $finallyScope = $branchScope;
            } else {
                $finallyScope = null;
            }
            foreach ($branchScopeResult->getExitPoints() as $exitPoint) {
                if ($finallyScope !== null) {
                    $finallyScope = $finallyScope->mergeWith($exitPoint->getScope());
                }
                $exitPoints[] = $exitPoint;
            }
            foreach ($stmt->catches as $catchNode) {
                $nodeCallback($catchNode, $scope);
                if (!\is_string($catchNode->var->name)) {
                    throw new \PHPStan\ShouldNotHappenException();
                }
                if (!$this->polluteCatchScopeWithTryAssignments) {
                    $catchScopeResult = $this->processCatchNode($catchNode, $scope->mergeWith($tryScope), $nodeCallback);
                    $catchScopeForFinally = $catchScopeResult->getScope();
                } else {
                    $catchScopeForFinally = $this->processCatchNode($catchNode, $tryScope, $nodeCallback)->getScope();
                    $catchScopeResult = $this->processCatchNode($catchNode, $scope->mergeWith($tryScope), static function () : void {
                    });
                }
                $finalScope = $catchScopeResult->isAlwaysTerminating() ? $finalScope : $catchScopeResult->getScope()->mergeWith($finalScope);
                $alwaysTerminating = $alwaysTerminating && $catchScopeResult->isAlwaysTerminating();
                $hasYield = $hasYield || $catchScopeResult->hasYield();
                if ($finallyScope !== null) {
                    $finallyScope = $finallyScope->mergeWith($catchScopeForFinally);
                }
                foreach ($catchScopeResult->getExitPoints() as $exitPoint) {
                    if ($finallyScope !== null) {
                        $finallyScope = $finallyScope->mergeWith($exitPoint->getScope());
                    }
                    $exitPoints[] = $exitPoint;
                }
            }
            if ($finalScope === null) {
                $finalScope = $scope;
            }
            if ($finallyScope !== null && $stmt->finally !== null) {
                $originalFinallyScope = $finallyScope;
                $finallyResult = $this->processStmtNodes($stmt->finally, $stmt->finally->stmts, $finallyScope, $nodeCallback);
                $alwaysTerminating = $alwaysTerminating || $finallyResult->isAlwaysTerminating();
                $hasYield = $hasYield || $finallyResult->hasYield();
                $finallyScope = $finallyResult->getScope();
                $finalScope = $finallyResult->isAlwaysTerminating() ? $finalScope : $finalScope->processFinallyScope($finallyScope, $originalFinallyScope);
                $exitPoints = \array_merge($exitPoints, $finallyResult->getExitPoints());
            }
            return new \PHPStan\Analyser\StatementResult($finalScope, $hasYield, $alwaysTerminating, $exitPoints);
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\Unset_) {
            $hasYield = \false;
            foreach ($stmt->vars as $var) {
                $scope = $this->lookForEnterVariableAssign($scope, $var);
                $scope = $this->processExprNode($var, $scope, $nodeCallback, \PHPStan\Analyser\ExpressionContext::createDeep())->getScope();
                $scope = $this->lookForExitVariableAssign($scope, $var);
                $scope = $scope->unsetExpression($var);
            }
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\Use_) {
            $hasYield = \false;
            foreach ($stmt->uses as $use) {
                $this->processStmtNode($use, $scope, $nodeCallback);
            }
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\Global_) {
            $hasYield = \false;
            foreach ($stmt->vars as $var) {
                if (!$var instanceof \PhpParser\Node\Expr\Variable) {
                    throw new \PHPStan\ShouldNotHappenException();
                }
                $scope = $this->lookForEnterVariableAssign($scope, $var);
                $this->processExprNode($var, $scope, $nodeCallback, \PHPStan\Analyser\ExpressionContext::createDeep());
                $scope = $this->lookForExitVariableAssign($scope, $var);
                if (!\is_string($var->name)) {
                    continue;
                }
                $scope = $scope->assignVariable($var->name, new \PHPStan\Type\MixedType());
            }
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\Static_) {
            $hasYield = \false;
            $comment = \PHPStan\Type\CommentHelper::getDocComment($stmt);
            foreach ($stmt->vars as $var) {
                $scope = $this->processStmtNode($var, $scope, $nodeCallback)->getScope();
                if ($comment === null || !\is_string($var->var->name)) {
                    continue;
                }
                $scope = $this->processVarAnnotation($scope, $var->var->name, $comment, \false);
            }
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\StaticVar) {
            $hasYield = \false;
            if (!\is_string($stmt->var->name)) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            if ($stmt->default !== null) {
                $this->processExprNode($stmt->default, $scope, $nodeCallback, \PHPStan\Analyser\ExpressionContext::createDeep());
            }
            $scope = $scope->enterExpressionAssign($stmt->var);
            $this->processExprNode($stmt->var, $scope, $nodeCallback, \PHPStan\Analyser\ExpressionContext::createDeep());
            $scope = $scope->exitExpressionAssign($stmt->var);
            $scope = $scope->assignVariable($stmt->var->name, new \PHPStan\Type\MixedType());
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\Const_ || $stmt instanceof \PhpParser\Node\Stmt\ClassConst) {
            $hasYield = \false;
            foreach ($stmt->consts as $const) {
                $nodeCallback($const, $scope);
                $this->processExprNode($const->value, $scope, $nodeCallback, \PHPStan\Analyser\ExpressionContext::createDeep());
                $scope = $scope->specifyExpressionType(new \PhpParser\Node\Expr\ConstFetch(new \PhpParser\Node\Name\FullyQualified($const->name->toString())), $scope->getType($const->value));
            }
        } elseif ($stmt instanceof \PhpParser\Node\Stmt\Nop) {
            $hasYield = \false;
        } else {
            $hasYield = \false;
        }
        return new \PHPStan\Analyser\StatementResult($scope, $hasYield, \false, []);
    }
    /**
     * @param Node\Stmt\Catch_ $catchNode
     * @param Scope $catchScope
     * @param \Closure(\PhpParser\Node $node, Scope $scope): void $nodeCallback
     * @return StatementResult
     */
    private function processCatchNode(\PhpParser\Node\Stmt\Catch_ $catchNode, \PHPStan\Analyser\Scope $catchScope, \Closure $nodeCallback) : \PHPStan\Analyser\StatementResult
    {
        if (!\is_string($catchNode->var->name)) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        $catchScope = $catchScope->enterCatch($catchNode->types, $catchNode->var->name);
        return $this->processStmtNodes($catchNode, $catchNode->stmts, $catchScope, $nodeCallback);
    }
    private function lookForEnterVariableAssign(\PHPStan\Analyser\Scope $scope, \PhpParser\Node\Expr $expr) : \PHPStan\Analyser\Scope
    {
        if (!$expr instanceof \PhpParser\Node\Expr\ArrayDimFetch || $expr->dim !== null) {
            $scope = $scope->enterExpressionAssign($expr);
        }
        if (!$expr instanceof \PhpParser\Node\Expr\Variable) {
            return $this->lookForVariableAssignCallback($scope, $expr, static function (\PHPStan\Analyser\Scope $scope, \PhpParser\Node\Expr $expr) : Scope {
                return $scope->enterExpressionAssign($expr);
            });
        }
        return $scope;
    }
    private function lookForExitVariableAssign(\PHPStan\Analyser\Scope $scope, \PhpParser\Node\Expr $expr) : \PHPStan\Analyser\Scope
    {
        $scope = $scope->exitExpressionAssign($expr);
        if (!$expr instanceof \PhpParser\Node\Expr\Variable) {
            return $this->lookForVariableAssignCallback($scope, $expr, static function (\PHPStan\Analyser\Scope $scope, \PhpParser\Node\Expr $expr) : Scope {
                return $scope->exitExpressionAssign($expr);
            });
        }
        return $scope;
    }
    /**
     * @param Scope $scope
     * @param Expr $expr
     * @param \Closure(Scope $scope, Expr $expr): Scope $callback
     * @return Scope
     */
    private function lookForVariableAssignCallback(\PHPStan\Analyser\Scope $scope, \PhpParser\Node\Expr $expr, \Closure $callback) : \PHPStan\Analyser\Scope
    {
        if ($expr instanceof \PhpParser\Node\Expr\Variable) {
            $scope = $callback($scope, $expr);
        } elseif ($expr instanceof \PhpParser\Node\Expr\ArrayDimFetch) {
            while ($expr instanceof \PhpParser\Node\Expr\ArrayDimFetch) {
                $expr = $expr->var;
            }
            $scope = $this->lookForVariableAssignCallback($scope, $expr, $callback);
        } elseif ($expr instanceof \PhpParser\Node\Expr\PropertyFetch) {
            $scope = $this->lookForVariableAssignCallback($scope, $expr->var, $callback);
        } elseif ($expr instanceof \PhpParser\Node\Expr\StaticPropertyFetch) {
            if ($expr->class instanceof \PhpParser\Node\Expr) {
                $scope = $this->lookForVariableAssignCallback($scope, $expr->class, $callback);
            }
        } elseif ($expr instanceof \PhpParser\Node\Expr\Array_ || $expr instanceof \PhpParser\Node\Expr\List_) {
            foreach ($expr->items as $item) {
                if ($item === null) {
                    continue;
                }
                $scope = $this->lookForVariableAssignCallback($scope, $item->value, $callback);
            }
        }
        return $scope;
    }
    private function ensureNonNullability(\PHPStan\Analyser\Scope $scope, \PhpParser\Node\Expr $expr, bool $findMethods) : \PHPStan\Analyser\EnsuredNonNullabilityResult
    {
        $exprToSpecify = $expr;
        $specifiedExpressions = [];
        while ($exprToSpecify instanceof \PhpParser\Node\Expr\PropertyFetch || $exprToSpecify instanceof \PhpParser\Node\Expr\StaticPropertyFetch || $findMethods && ($exprToSpecify instanceof \PhpParser\Node\Expr\MethodCall || $exprToSpecify instanceof \PhpParser\Node\Expr\StaticCall)) {
            if ($exprToSpecify instanceof \PhpParser\Node\Expr\PropertyFetch || $exprToSpecify instanceof \PhpParser\Node\Expr\MethodCall) {
                $exprToSpecify = $exprToSpecify->var;
            } elseif ($exprToSpecify->class instanceof \PhpParser\Node\Expr) {
                $exprToSpecify = $exprToSpecify->class;
            } else {
                break;
            }
            $exprType = $scope->getType($exprToSpecify);
            $exprTypeWithoutNull = \PHPStan\Type\TypeCombinator::removeNull($exprType);
            if ($exprType->equals($exprTypeWithoutNull)) {
                continue;
            }
            $specifiedExpressions[] = new \PHPStan\Analyser\EnsuredNonNullabilityResultExpression($exprToSpecify, $exprType);
            $scope = $scope->specifyExpressionType($exprToSpecify, $exprTypeWithoutNull);
        }
        return new \PHPStan\Analyser\EnsuredNonNullabilityResult($scope, $specifiedExpressions);
    }
    /**
     * @param Scope $scope
     * @param EnsuredNonNullabilityResultExpression[] $specifiedExpressions
     * @return Scope
     */
    private function revertNonNullability(\PHPStan\Analyser\Scope $scope, array $specifiedExpressions) : \PHPStan\Analyser\Scope
    {
        foreach ($specifiedExpressions as $specifiedExpressionResult) {
            $scope = $scope->specifyExpressionType($specifiedExpressionResult->getExpression(), $specifiedExpressionResult->getOriginalType());
        }
        return $scope;
    }
    private function findEarlyTerminatingExpr(\PhpParser\Node\Expr $expr, \PHPStan\Analyser\Scope $scope) : ?\PhpParser\Node\Expr
    {
        if (($expr instanceof \PhpParser\Node\Expr\MethodCall || $expr instanceof \PhpParser\Node\Expr\StaticCall) && \count($this->earlyTerminatingMethodCalls) > 0) {
            if ($expr->name instanceof \PhpParser\Node\Expr) {
                return null;
            }
            if ($expr instanceof \PhpParser\Node\Expr\MethodCall) {
                $methodCalledOnType = $scope->getType($expr->var);
            } else {
                if ($expr->class instanceof \PhpParser\Node\Name) {
                    $methodCalledOnType = $scope->getFunctionType($expr->class, \false, \false);
                } else {
                    $methodCalledOnType = $scope->getType($expr->class);
                }
            }
            $directClassNames = \PHPStan\Type\TypeUtils::getDirectClassNames($methodCalledOnType);
            foreach ($directClassNames as $referencedClass) {
                if (!$this->broker->hasClass($referencedClass)) {
                    continue;
                }
                $classReflection = $this->broker->getClass($referencedClass);
                foreach (\array_merge([$referencedClass], $classReflection->getParentClassesNames(), $classReflection->getNativeReflection()->getInterfaceNames()) as $className) {
                    if (!isset($this->earlyTerminatingMethodCalls[$className])) {
                        continue;
                    }
                    if (\in_array((string) $expr->name, $this->earlyTerminatingMethodCalls[$className], \true)) {
                        return $expr;
                    }
                }
            }
        }
        if ($expr instanceof \PhpParser\Node\Expr\Exit_) {
            return $expr;
        }
        return null;
    }
    /**
     * @param \PhpParser\Node\Expr $expr
     * @param \PHPStan\Analyser\Scope $scope
     * @param \Closure(\PhpParser\Node $node, Scope $scope): void $nodeCallback
     * @param \PHPStan\Analyser\ExpressionContext $context
     * @return \PHPStan\Analyser\ExpressionResult
     */
    private function processExprNode(\PhpParser\Node\Expr $expr, \PHPStan\Analyser\Scope $scope, \Closure $nodeCallback, \PHPStan\Analyser\ExpressionContext $context) : \PHPStan\Analyser\ExpressionResult
    {
        $this->callNodeCallbackWithExpression($nodeCallback, $expr, $scope, $context);
        // todo handle all expr descendants
        if ($expr instanceof \PhpParser\Node\Expr\Variable) {
            if ($expr->name instanceof \PhpParser\Node\Expr) {
                return $this->processExprNode($expr->name, $scope, $nodeCallback, $context->enterDeep());
            }
        } elseif ($expr instanceof \PhpParser\Node\Expr\Assign || $expr instanceof \PhpParser\Node\Expr\AssignRef) {
            if (!$expr->var instanceof \PhpParser\Node\Expr\Array_ && !$expr->var instanceof \PhpParser\Node\Expr\List_) {
                $scope = $this->processAssignVar($scope, $expr->var, $expr->expr, $nodeCallback, $context, function (\PHPStan\Analyser\Scope $scope) use($expr, $nodeCallback, $context) : Scope {
                    if ($expr instanceof \PhpParser\Node\Expr\AssignRef) {
                        $scope = $scope->enterExpressionAssign($expr->expr);
                    }
                    if ($expr->var instanceof \PhpParser\Node\Expr\Variable && \is_string($expr->var->name)) {
                        $context = $context->enterRightSideAssign($expr->var->name, $scope->getType($expr->expr));
                    }
                    if ($expr->expr instanceof \PhpParser\Node\Expr\Closure) {
                        $nodeCallback($expr->expr, $scope);
                        $scope = $this->processClosureNode($expr->expr, $scope, $nodeCallback, $context->enterDeep());
                    } else {
                        $scope = $this->processExprNode($expr->expr, $scope, $nodeCallback, $context->enterDeep())->getScope();
                    }
                    if ($expr instanceof \PhpParser\Node\Expr\AssignRef) {
                        $scope = $scope->exitExpressionAssign($expr->expr);
                    }
                    return $scope;
                }, \true);
            } else {
                $scope = $this->processExprNode($expr->expr, $scope, $nodeCallback, $context->enterDeep())->getScope();
                foreach ($expr->var->items as $arrayItem) {
                    if ($arrayItem === null) {
                        continue;
                    }
                    $itemScope = $scope;
                    if ($arrayItem->value instanceof \PhpParser\Node\Expr\ArrayDimFetch && $arrayItem->value->dim === null) {
                        $itemScope = $itemScope->enterExpressionAssign($arrayItem->value);
                    }
                    $itemScope = $this->lookForEnterVariableAssign($itemScope, $arrayItem->value);
                    $this->processExprNode($arrayItem, $itemScope, $nodeCallback, $context->enterDeep());
                }
                $scope = $this->lookForArrayDestructuringArray($scope, $expr->var, $scope->getType($expr->expr));
            }
            if ($expr->var instanceof \PhpParser\Node\Expr\Variable && \is_string($expr->var->name)) {
                $comment = \PHPStan\Type\CommentHelper::getDocComment($expr);
                if ($comment !== null) {
                    $scope = $this->processVarAnnotation($scope, $expr->var->name, $comment, \false);
                }
            }
        } elseif ($expr instanceof \PhpParser\Node\Expr\AssignOp) {
            $scope = $this->processAssignVar($scope, $expr->var, $expr, $nodeCallback, $context, function (\PHPStan\Analyser\Scope $scope) use($expr, $nodeCallback, $context) : Scope {
                return $this->processExprNode($expr->expr, $scope, $nodeCallback, $context->enterDeep())->getScope();
            }, \false);
        } elseif ($expr instanceof \PhpParser\Node\Expr\FuncCall) {
            $parametersAcceptor = null;
            if ($expr->name instanceof \PhpParser\Node\Expr) {
                $scope = $this->processExprNode($expr->name, $scope, $nodeCallback, $context->enterDeep())->getScope();
            } elseif ($this->broker->hasFunction($expr->name, $scope)) {
                $function = $this->broker->getFunction($expr->name, $scope);
                $parametersAcceptor = \PHPStan\Reflection\ParametersAcceptorSelector::selectFromArgs($scope, $expr->args, $function->getVariants());
            }
            $result = $this->processArgs($parametersAcceptor, $expr->args, $scope, $nodeCallback, $context);
            $scope = $result->getScope();
            $hasYield = $result->hasYield();
            if (isset($function) && \in_array($function->getName(), ['array_pop', 'array_shift'], \true) && \count($expr->args) >= 1) {
                $arrayArg = $expr->args[0]->value;
                $constantArrays = \PHPStan\Type\TypeUtils::getConstantArrays($scope->getType($arrayArg));
                if (\count($constantArrays) > 0) {
                    $resultArrayTypes = [];
                    foreach ($constantArrays as $constantArray) {
                        if ($function->getName() === 'array_pop') {
                            $resultArrayTypes[] = $constantArray->removeLast();
                        } else {
                            $resultArrayTypes[] = $constantArray->removeFirst();
                        }
                    }
                    $scope = $scope->specifyExpressionType($arrayArg, \PHPStan\Type\TypeCombinator::union(...$resultArrayTypes));
                }
            }
            if (isset($function) && \in_array($function->getName(), ['array_push', 'array_unshift'], \true) && \count($expr->args) >= 2) {
                $argumentTypes = [];
                foreach (\array_slice($expr->args, 1) as $callArg) {
                    $callArgType = $scope->getType($callArg->value);
                    if ($callArg->unpack) {
                        $iterableValueType = $callArgType->getIterableValueType();
                        if ($iterableValueType instanceof \PHPStan\Type\UnionType) {
                            foreach ($iterableValueType->getTypes() as $innerType) {
                                $argumentTypes[] = $innerType;
                            }
                        } else {
                            $argumentTypes[] = $iterableValueType;
                        }
                        continue;
                    }
                    $argumentTypes[] = $callArgType;
                }
                $arrayArg = $expr->args[0]->value;
                $originalArrayType = $scope->getType($arrayArg);
                $constantArrays = \PHPStan\Type\TypeUtils::getConstantArrays($originalArrayType);
                if ($function->getName() === 'array_push' || $originalArrayType instanceof \PHPStan\Type\ArrayType && \count($constantArrays) === 0) {
                    $arrayType = $originalArrayType;
                    foreach ($argumentTypes as $argType) {
                        $arrayType = $arrayType->setOffsetValueType(null, $argType);
                    }
                    $scope = $scope->specifyExpressionType($arrayArg, $arrayType);
                } elseif (\count($constantArrays) > 0) {
                    $defaultArrayBuilder = \PHPStan\Type\Constant\ConstantArrayTypeBuilder::createEmpty();
                    foreach ($argumentTypes as $argType) {
                        $defaultArrayBuilder->setOffsetValueType(null, $argType);
                    }
                    $defaultArrayType = $defaultArrayBuilder->getArray();
                    $arrayTypes = [];
                    foreach ($constantArrays as $constantArray) {
                        $arrayType = $defaultArrayType;
                        foreach ($constantArray->getKeyTypes() as $i => $keyType) {
                            $valueType = $constantArray->getValueTypes()[$i];
                            if ($keyType instanceof \PHPStan\Type\Constant\ConstantIntegerType) {
                                $keyType = null;
                            }
                            $arrayType = $arrayType->setOffsetValueType($keyType, $valueType);
                        }
                        $arrayTypes[] = $arrayType;
                    }
                    $scope = $scope->specifyExpressionType($arrayArg, \PHPStan\Type\TypeCombinator::union(...$arrayTypes));
                }
            }
            if (isset($function) && \in_array($function->getName(), ['fopen', 'file_get_contents'], \true)) {
                $scope = $scope->assignVariable('http_response_header', new \PHPStan\Type\ArrayType(new \PHPStan\Type\IntegerType(), new \PHPStan\Type\StringType()));
            }
        } elseif ($expr instanceof \PhpParser\Node\Expr\MethodCall) {
            $originalScope = $scope;
            if ($expr->var instanceof \PhpParser\Node\Expr\Closure && $expr->name instanceof \PhpParser\Node\Identifier && \strtolower($expr->name->name) === 'call' && isset($expr->args[0])) {
                $closureCallScope = $scope->enterClosureCall($scope->getType($expr->args[0]->value));
            }
            $scope = $this->processExprNode($expr->var, $closureCallScope ?? $scope, $nodeCallback, $context->enterDeep())->getScope();
            if (isset($closureCallScope)) {
                $scope = $scope->restoreOriginalScopeAfterClosureBind($originalScope);
            }
            $parametersAcceptor = null;
            if ($expr->name instanceof \PhpParser\Node\Expr) {
                $scope = $this->processExprNode($expr->name, $scope, $nodeCallback, $context->enterDeep())->getScope();
            } else {
                $calledOnType = $scope->getType($expr->var);
                $methodName = $expr->name->name;
                if ($calledOnType->hasMethod($methodName)->yes()) {
                    $parametersAcceptor = \PHPStan\Reflection\ParametersAcceptorSelector::selectFromArgs($scope, $expr->args, $calledOnType->getMethod($methodName, $scope)->getVariants());
                }
            }
            $result = $this->processArgs($parametersAcceptor, $expr->args, $scope, $nodeCallback, $context);
            $scope = $result->getScope();
            $hasYield = $result->hasYield();
        } elseif ($expr instanceof \PhpParser\Node\Expr\StaticCall) {
            if ($expr->class instanceof \PhpParser\Node\Expr) {
                $scope = $this->processExprNode($expr->class, $scope, $nodeCallback, $context->enterDeep())->getScope();
            }
            $parametersAcceptor = null;
            if ($expr->name instanceof \PhpParser\Node\Expr) {
                $scope = $this->processExprNode($expr->name, $scope, $nodeCallback, $context->enterDeep())->getScope();
            } elseif ($expr->class instanceof \PhpParser\Node\Name) {
                $className = $scope->resolveName($expr->class);
                if ($this->broker->hasClass($className)) {
                    $classReflection = $this->broker->getClass($className);
                    if (\is_string($expr->name)) {
                        $methodName = $expr->name;
                    } else {
                        $methodName = $expr->name->name;
                    }
                    if ($classReflection->hasMethod($methodName)) {
                        $parametersAcceptor = \PHPStan\Reflection\ParametersAcceptorSelector::selectFromArgs($scope, $expr->args, $classReflection->getMethod($methodName, $scope)->getVariants());
                        if ($classReflection->getName() === 'Closure' && \strtolower($methodName) === 'bind') {
                            $thisType = null;
                            if (isset($expr->args[1])) {
                                $argType = $scope->getType($expr->args[1]->value);
                                if ($argType instanceof \PHPStan\Type\NullType) {
                                    $thisType = null;
                                } else {
                                    $thisType = $argType;
                                }
                            }
                            $scopeClass = 'static';
                            if (isset($expr->args[2])) {
                                $argValue = $expr->args[2]->value;
                                $argValueType = $scope->getType($argValue);
                                $directClassNames = \PHPStan\Type\TypeUtils::getDirectClassNames($argValueType);
                                if (\count($directClassNames) === 1) {
                                    $scopeClass = $directClassNames[0];
                                } elseif ($argValue instanceof \PhpParser\Node\Expr\ClassConstFetch && $argValue->name instanceof \PhpParser\Node\Identifier && \strtolower($argValue->name->name) === 'class' && $argValue->class instanceof \PhpParser\Node\Name) {
                                    $scopeClass = $scope->resolveName($argValue->class);
                                } elseif ($argValueType instanceof \PHPStan\Type\Constant\ConstantStringType) {
                                    $scopeClass = $argValueType->getValue();
                                }
                            }
                            $closureBindScope = $scope->enterClosureBind($thisType, $scopeClass);
                        }
                    }
                }
            }
            $result = $this->processArgs($parametersAcceptor, $expr->args, $scope, $nodeCallback, $context, $closureBindScope ?? null);
            $scope = $result->getScope();
            $hasYield = $result->hasYield();
        } elseif ($expr instanceof \PhpParser\Node\Expr\PropertyFetch) {
            $scope = $this->processExprNode($expr->var, $scope, $nodeCallback, $context->enterDeep())->getScope();
            if ($expr->name instanceof \PhpParser\Node\Expr) {
                $scope = $this->processExprNode($expr->name, $scope, $nodeCallback, $context->enterDeep())->getScope();
            }
        } elseif ($expr instanceof \PhpParser\Node\Expr\StaticPropertyFetch) {
            if ($expr->class instanceof \PhpParser\Node\Expr) {
                $scope = $this->processExprNode($expr->class, $scope, $nodeCallback, $context->enterDeep())->getScope();
            }
            if ($expr->name instanceof \PhpParser\Node\Expr) {
                $scope = $this->processExprNode($expr->name, $scope, $nodeCallback, $context->enterDeep())->getScope();
            }
        } elseif ($expr instanceof \PhpParser\Node\Expr\Closure) {
            $scope = $this->processClosureNode($expr, $scope, $nodeCallback, $context);
        } elseif ($expr instanceof \PhpParser\Node\Expr\ClosureUse) {
            $this->processExprNode($expr->var, $scope, $nodeCallback, $context)->getScope();
        } elseif ($expr instanceof \PhpParser\Node\Expr\ErrorSuppress) {
            $scope = $this->processExprNode($expr->expr, $scope, $nodeCallback, $context)->getScope();
        } elseif ($expr instanceof \PhpParser\Node\Expr\Exit_) {
            if ($expr->expr !== null) {
                $scope = $this->processExprNode($expr->expr, $scope, $nodeCallback, $context->enterDeep())->getScope();
            }
        } elseif ($expr instanceof \PhpParser\Node\Scalar\Encapsed) {
            foreach ($expr->parts as $part) {
                $scope = $this->processExprNode($part, $scope, $nodeCallback, $context->enterDeep())->getScope();
            }
        } elseif ($expr instanceof \PhpParser\Node\Expr\ArrayDimFetch) {
            if ($expr->dim !== null) {
                $scope = $this->processExprNode($expr->dim, $scope, $nodeCallback, $context->enterDeep())->getScope();
            }
            $scope = $this->processExprNode($expr->var, $scope, $nodeCallback, $context->enterDeep())->getScope();
        } elseif ($expr instanceof \PhpParser\Node\Expr\Array_) {
            $itemNodes = [];
            foreach ($expr->items as $arrayItem) {
                $itemNodes[] = new \PHPStan\Node\LiteralArrayItem($scope, $arrayItem);
                $scope = $this->processExprNode($arrayItem, $scope, $nodeCallback, $context->enterDeep())->getScope();
            }
            $nodeCallback(new \PHPStan\Node\LiteralArrayNode($expr, $itemNodes), $scope);
        } elseif ($expr instanceof \PhpParser\Node\Expr\ArrayItem) {
            if ($expr->key !== null) {
                $scope = $this->processExprNode($expr->key, $scope, $nodeCallback, $context->enterDeep())->getScope();
            }
            $scope = $this->processExprNode($expr->value, $scope, $nodeCallback, $context->enterDeep())->getScope();
        } elseif ($expr instanceof \PhpParser\Node\Expr\BinaryOp\BooleanAnd || $expr instanceof \PhpParser\Node\Expr\BinaryOp\LogicalAnd) {
            $leftResult = $this->processExprNode($expr->left, $scope, $nodeCallback, $context->enterDeep());
            $rightResult = $this->processExprNode($expr->right, $leftResult->getTruthyScope(), $nodeCallback, $context);
            $leftMergedWithRightScope = $leftResult->getScope()->mergeWith($rightResult->getScope());
            return new \PHPStan\Analyser\ExpressionResult($leftMergedWithRightScope, $leftResult->hasYield(), static function () use($expr, $rightResult) : Scope {
                return $rightResult->getScope()->filterByTruthyValue($expr);
            }, static function () use($leftMergedWithRightScope, $expr) : Scope {
                return $leftMergedWithRightScope->filterByFalseyValue($expr);
            });
            // todo do not execute right side if the left is false
        } elseif ($expr instanceof \PhpParser\Node\Expr\BinaryOp\BooleanOr || $expr instanceof \PhpParser\Node\Expr\BinaryOp\LogicalOr) {
            $leftResult = $this->processExprNode($expr->left, $scope, $nodeCallback, $context->enterDeep());
            $rightResult = $this->processExprNode($expr->right, $leftResult->getFalseyScope(), $nodeCallback, $context);
            $leftMergedWithRightScope = $leftResult->getScope()->mergeWith($rightResult->getScope());
            return new \PHPStan\Analyser\ExpressionResult($leftMergedWithRightScope, $leftResult->hasYield(), static function () use($leftMergedWithRightScope, $expr) : Scope {
                return $leftMergedWithRightScope->filterByTruthyValue($expr);
            }, static function () use($expr, $rightResult) : Scope {
                return $rightResult->getScope()->filterByFalseyValue($expr);
            });
            // todo do not execute right side if the left is true
        } elseif ($expr instanceof \PhpParser\Node\Expr\BinaryOp\Coalesce) {
            $nonNullabilityResult = $this->ensureNonNullability($scope, $expr->left, \false);
            if ($expr->left instanceof \PhpParser\Node\Expr\PropertyFetch) {
                $scope = $nonNullabilityResult->getScope();
            } else {
                $scope = $this->lookForEnterVariableAssign($nonNullabilityResult->getScope(), $expr->left);
            }
            $scope = $this->processExprNode($expr->left, $scope, $nodeCallback, $context->enterDeep())->getScope();
            $scope = $this->revertNonNullability($scope, $nonNullabilityResult->getSpecifiedExpressions());
            if (!$expr->left instanceof \PhpParser\Node\Expr\PropertyFetch) {
                $scope = $this->lookForExitVariableAssign($scope, $expr->left);
            }
            $scope = $this->processExprNode($expr->right, $scope, $nodeCallback, $context->enterDeep())->getScope()->mergeWith($scope);
        } elseif ($expr instanceof \PhpParser\Node\Expr\BinaryOp) {
            $scope = $this->processExprNode($expr->left, $scope, $nodeCallback, $context->enterDeep())->getScope();
            $scope = $this->processExprNode($expr->right, $scope, $nodeCallback, $context->enterDeep())->getScope();
        } elseif ($expr instanceof \PhpParser\Node\Expr\BitwiseNot || $expr instanceof \PhpParser\Node\Expr\Cast || $expr instanceof \PhpParser\Node\Expr\Clone_ || $expr instanceof \PhpParser\Node\Expr\Eval_ || $expr instanceof \PhpParser\Node\Expr\Include_ || $expr instanceof \PhpParser\Node\Expr\Print_ || $expr instanceof \PhpParser\Node\Expr\UnaryMinus || $expr instanceof \PhpParser\Node\Expr\UnaryPlus || $expr instanceof \PhpParser\Node\Expr\YieldFrom) {
            $result = $this->processExprNode($expr->expr, $scope, $nodeCallback, $context->enterDeep());
            if ($expr instanceof \PhpParser\Node\Expr\YieldFrom) {
                $hasYield = \true;
            } else {
                $hasYield = $result->hasYield();
            }
            $scope = $result->getScope();
        } elseif ($expr instanceof \PhpParser\Node\Expr\BooleanNot) {
            $scope = $scope->enterNegation();
            $scope = $this->processExprNode($expr->expr, $scope, $nodeCallback, $context->enterDeep())->getScope();
            $scope = $scope->enterNegation();
        } elseif ($expr instanceof \PhpParser\Node\Expr\ClassConstFetch) {
            if ($expr->class instanceof \PhpParser\Node\Expr) {
                $scope = $this->processExprNode($expr->class, $scope, $nodeCallback, $context->enterDeep())->getScope();
            }
        } elseif ($expr instanceof \PhpParser\Node\Expr\Empty_) {
            $nonNullabilityResult = $this->ensureNonNullability($scope, $expr->expr, \true);
            $scope = $this->lookForEnterVariableAssign($nonNullabilityResult->getScope(), $expr->expr);
            $scope = $this->processExprNode($expr->expr, $scope, $nodeCallback, $context->enterDeep())->getScope();
            $scope = $this->revertNonNullability($scope, $nonNullabilityResult->getSpecifiedExpressions());
            $scope = $this->lookForExitVariableAssign($scope, $expr->expr);
        } elseif ($expr instanceof \PhpParser\Node\Expr\Isset_) {
            foreach ($expr->vars as $var) {
                $nonNullabilityResult = $this->ensureNonNullability($scope, $var, \true);
                $scope = $this->lookForEnterVariableAssign($nonNullabilityResult->getScope(), $var);
                $scope = $this->processExprNode($var, $scope, $nodeCallback, $context->enterDeep())->getScope();
                $scope = $this->revertNonNullability($scope, $nonNullabilityResult->getSpecifiedExpressions());
                $scope = $this->lookForExitVariableAssign($scope, $var);
            }
        } elseif ($expr instanceof \PhpParser\Node\Expr\Instanceof_) {
            $scope = $this->processExprNode($expr->expr, $scope, $nodeCallback, $context->enterDeep())->getScope();
            if ($expr->class instanceof \PhpParser\Node\Expr) {
                $scope = $this->processExprNode($expr->class, $scope, $nodeCallback, $context->enterDeep())->getScope();
            }
        } elseif ($expr instanceof \PhpParser\Node\Expr\List_) {
            // only in assign and foreach, processed elsewhere
            return new \PHPStan\Analyser\ExpressionResult($scope, \false);
        } elseif ($expr instanceof \PhpParser\Node\Expr\New_) {
            $parametersAcceptor = null;
            if ($expr->class instanceof \PhpParser\Node\Expr) {
                $scope = $this->processExprNode($expr->class, $scope, $nodeCallback, $context->enterDeep())->getScope();
            } elseif ($expr->class instanceof \PhpParser\Node\Stmt\Class_) {
                $this->broker->getAnonymousClassReflection($expr->class, $scope);
                // populates $expr->class->name
                $this->processStmtNode($expr->class, $scope, $nodeCallback);
            } elseif ($this->broker->hasClass($expr->class->toString())) {
                $classReflection = $this->broker->getClass($expr->class->toString());
                if ($classReflection->hasConstructor()) {
                    $parametersAcceptor = \PHPStan\Reflection\ParametersAcceptorSelector::selectFromArgs($scope, $expr->args, $classReflection->getConstructor()->getVariants());
                }
            }
            $result = $this->processArgs($parametersAcceptor, $expr->args, $scope, $nodeCallback, $context);
            $scope = $result->getScope();
            $hasYield = $result->hasYield();
        } elseif ($expr instanceof \PhpParser\Node\Expr\PreInc || $expr instanceof \PhpParser\Node\Expr\PostInc || $expr instanceof \PhpParser\Node\Expr\PreDec || $expr instanceof \PhpParser\Node\Expr\PostDec) {
            $scope = $this->processExprNode($expr->var, $scope, $nodeCallback, $context->enterDeep())->getScope();
            if ($expr->var instanceof \PhpParser\Node\Expr\Variable || $expr->var instanceof \PhpParser\Node\Expr\ArrayDimFetch || $expr->var instanceof \PhpParser\Node\Expr\PropertyFetch || $expr->var instanceof \PhpParser\Node\Expr\StaticPropertyFetch) {
                $expressionType = $scope->getType($expr);
                if (\count(\PHPStan\Type\TypeUtils::getConstantScalars($expressionType)) > 0) {
                    $newExpr = $expr;
                    if ($expr instanceof \PhpParser\Node\Expr\PostInc) {
                        $newExpr = new \PhpParser\Node\Expr\PreInc($expr->var);
                    } elseif ($expr instanceof \PhpParser\Node\Expr\PostDec) {
                        $newExpr = new \PhpParser\Node\Expr\PreDec($expr->var);
                    }
                    $scope = $this->processAssignVar($scope, $expr->var, $newExpr, static function () : void {
                    }, $context, static function (\PHPStan\Analyser\Scope $scope) : Scope {
                        return $scope;
                    }, \false);
                }
            }
        } elseif ($expr instanceof \PhpParser\Node\Expr\Ternary) {
            $ternaryCondResult = $this->processExprNode($expr->cond, $scope, $nodeCallback, $context->enterDeep());
            $ifTrueScope = $ternaryCondResult->getTruthyScope();
            $ifFalseScope = $ternaryCondResult->getFalseyScope();
            if ($expr->if !== null) {
                $ifTrueScope = $this->processExprNode($expr->if, $ifTrueScope, $nodeCallback, $context)->getScope();
                $ifFalseScope = $this->processExprNode($expr->else, $ifFalseScope, $nodeCallback, $context)->getScope();
            } else {
                $ifFalseScope = $this->processExprNode($expr->else, $ifFalseScope, $nodeCallback, $context)->getScope();
            }
            $finalScope = $ifTrueScope->mergeWith($ifFalseScope);
            return new \PHPStan\Analyser\ExpressionResult($finalScope, $ternaryCondResult->hasYield(), static function () use($finalScope, $expr) : Scope {
                return $finalScope->filterByTruthyValue($expr);
            }, static function () use($finalScope, $expr) : Scope {
                return $finalScope->filterByFalseyValue($expr);
            });
            // todo do not run else if cond is always true
            // todo do not run if branch if cond is always false
        } elseif ($expr instanceof \PhpParser\Node\Expr\Yield_) {
            if ($expr->key !== null) {
                $scope = $this->processExprNode($expr->key, $scope, $nodeCallback, $context->enterDeep())->getScope();
            }
            if ($expr->value !== null) {
                $scope = $this->processExprNode($expr->value, $scope, $nodeCallback, $context->enterDeep())->getScope();
            }
            $hasYield = \true;
        }
        if (!isset($hasYield)) {
            // todo
            $hasYield = \false;
        }
        return new \PHPStan\Analyser\ExpressionResult($scope, $hasYield, static function () use($scope, $expr) : Scope {
            return $scope->filterByTruthyValue($expr);
        }, static function () use($scope, $expr) : Scope {
            return $scope->filterByFalseyValue($expr);
        });
    }
    /**
     * @param \Closure(\PhpParser\Node $node, Scope $scope): void $nodeCallback
     * @param Expr $expr
     * @param Scope $scope
     * @param ExpressionContext $context
     */
    private function callNodeCallbackWithExpression(\Closure $nodeCallback, \PhpParser\Node\Expr $expr, \PHPStan\Analyser\Scope $scope, \PHPStan\Analyser\ExpressionContext $context) : void
    {
        if ($context->isDeep()) {
            $scope = $scope->exitFirstLevelStatements();
        }
        $nodeCallback($expr, $scope);
    }
    /**
     * @param \PhpParser\Node\Expr\Closure $expr
     * @param \PHPStan\Analyser\Scope $scope
     * @param \Closure(\PhpParser\Node $node, Scope $scope): void $nodeCallback
     * @param ExpressionContext $context
     * @return \PHPStan\Analyser\Scope $scope
     */
    private function processClosureNode(\PhpParser\Node\Expr\Closure $expr, \PHPStan\Analyser\Scope $scope, \Closure $nodeCallback, \PHPStan\Analyser\ExpressionContext $context) : \PHPStan\Analyser\Scope
    {
        foreach ($expr->params as $param) {
            $this->processParamNode($param, $scope, $nodeCallback);
        }
        $byRefUses = [];
        $useScope = $scope;
        foreach ($expr->uses as $use) {
            if ($use->byRef) {
                $byRefUses[] = $use;
                $useScope = $useScope->enterExpressionAssign($use->var);
                $inAssignRightSideVariableName = $context->getInAssignRightSideVariableName();
                $inAssignRightSideType = $context->getInAssignRightSideType();
                if ($inAssignRightSideVariableName === $use->var->name && $inAssignRightSideType !== null) {
                    if ($inAssignRightSideType instanceof \PHPStan\Type\ClosureType) {
                        $variableType = $inAssignRightSideType;
                    } else {
                        $alreadyHasVariableType = $scope->hasVariableType($inAssignRightSideVariableName);
                        if ($alreadyHasVariableType->no()) {
                            $variableType = \PHPStan\Type\TypeCombinator::union(new \PHPStan\Type\NullType(), $inAssignRightSideType);
                        } else {
                            $variableType = \PHPStan\Type\TypeCombinator::union($scope->getVariableType($inAssignRightSideVariableName), $inAssignRightSideType);
                        }
                    }
                    $scope = $scope->assignVariable($inAssignRightSideVariableName, $variableType);
                }
            }
            $this->processExprNode($use, $useScope, $nodeCallback, $context);
            if (!$use->byRef) {
                continue;
            }
            $useScope = $useScope->exitExpressionAssign($use->var);
        }
        if ($expr->returnType !== null) {
            $nodeCallback($expr->returnType, $scope);
        }
        $closureScope = $scope->enterAnonymousFunction($expr);
        $closureScope = $closureScope->processClosureScope($scope, null, $byRefUses);
        $gatheredReturnStatements = [];
        $closureStmtsCallback = static function (\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) use($nodeCallback, &$gatheredReturnStatements) : void {
            $nodeCallback($node, $scope);
            if (!$node instanceof \PhpParser\Node\Stmt\Return_) {
                return;
            }
            $gatheredReturnStatements[] = new \PHPStan\Node\ReturnStatement($scope, $node);
        };
        if (\count($byRefUses) === 0) {
            $statementResult = $this->processStmtNodes($expr, $expr->stmts, $closureScope, $closureStmtsCallback);
            $nodeCallback(new \PHPStan\Node\ClosureReturnStatementsNode($expr, $gatheredReturnStatements, $statementResult), $scope);
            return $scope;
        }
        $count = 0;
        do {
            $prevScope = $closureScope;
            $intermediaryClosureScopeResult = $this->processStmtNodes($expr, $expr->stmts, $closureScope, static function () : void {
            });
            $intermediaryClosureScope = $intermediaryClosureScopeResult->getScope();
            foreach ($intermediaryClosureScopeResult->getExitPoints() as $exitPoint) {
                $intermediaryClosureScope = $intermediaryClosureScope->mergeWith($exitPoint->getScope());
            }
            $closureScope = $scope->enterAnonymousFunction($expr);
            $closureScope = $closureScope->processClosureScope($intermediaryClosureScope, $prevScope, $byRefUses);
            if ($closureScope->equals($prevScope)) {
                break;
            }
            $count++;
        } while ($count < self::LOOP_SCOPE_ITERATIONS);
        $statementResult = $this->processStmtNodes($expr, $expr->stmts, $closureScope, $closureStmtsCallback);
        $nodeCallback(new \PHPStan\Node\ClosureReturnStatementsNode($expr, $gatheredReturnStatements, $statementResult), $scope);
        return $scope->processClosureScope($closureScope, null, $byRefUses);
    }
    private function lookForArrayDestructuringArray(\PHPStan\Analyser\Scope $scope, \PhpParser\Node\Expr $expr, \PHPStan\Type\Type $valueType) : \PHPStan\Analyser\Scope
    {
        if ($expr instanceof \PhpParser\Node\Expr\Array_ || $expr instanceof \PhpParser\Node\Expr\List_) {
            foreach ($expr->items as $key => $item) {
                /** @var \PhpParser\Node\Expr\ArrayItem|null $itemValue */
                $itemValue = $item;
                if ($itemValue === null) {
                    continue;
                }
                $keyType = $itemValue->key === null ? new \PHPStan\Type\Constant\ConstantIntegerType($key) : $scope->getType($itemValue->key);
                $scope = $this->specifyItemFromArrayDestructuring($scope, $itemValue, $valueType, $keyType);
            }
        } elseif ($expr instanceof \PhpParser\Node\Expr\Variable && \is_string($expr->name)) {
            $scope = $scope->assignVariable($expr->name, new \PHPStan\Type\MixedType());
        } elseif ($expr instanceof \PhpParser\Node\Expr\ArrayDimFetch && $expr->var instanceof \PhpParser\Node\Expr\Variable && \is_string($expr->var->name)) {
            $scope = $scope->assignVariable($expr->var->name, new \PHPStan\Type\MixedType());
        }
        return $scope;
    }
    private function specifyItemFromArrayDestructuring(\PHPStan\Analyser\Scope $scope, \PhpParser\Node\Expr\ArrayItem $arrayItem, \PHPStan\Type\Type $valueType, \PHPStan\Type\Type $keyType) : \PHPStan\Analyser\Scope
    {
        $type = $valueType->getOffsetValueType($keyType);
        $itemNode = $arrayItem->value;
        if ($itemNode instanceof \PhpParser\Node\Expr\Variable && \is_string($itemNode->name)) {
            $scope = $scope->assignVariable($itemNode->name, $type);
        } elseif ($itemNode instanceof \PhpParser\Node\Expr\ArrayDimFetch && $itemNode->var instanceof \PhpParser\Node\Expr\Variable && \is_string($itemNode->var->name)) {
            $currentType = $scope->hasVariableType($itemNode->var->name)->no() ? new \PHPStan\Type\Constant\ConstantArrayType([], []) : $scope->getVariableType($itemNode->var->name);
            $dimType = null;
            if ($itemNode->dim !== null) {
                $dimType = $scope->getType($itemNode->dim);
            }
            $scope = $scope->assignVariable($itemNode->var->name, $currentType->setOffsetValueType($dimType, $type));
        } else {
            $scope = $this->lookForArrayDestructuringArray($scope, $itemNode, $type);
        }
        return $scope;
    }
    /**
     * @param \PhpParser\Node\Param $param
     * @param \PHPStan\Analyser\Scope $scope
     * @param \Closure(\PhpParser\Node $node, Scope $scope): void $nodeCallback
     */
    private function processParamNode(\PhpParser\Node\Param $param, \PHPStan\Analyser\Scope $scope, \Closure $nodeCallback) : void
    {
        if ($param->type !== null) {
            $nodeCallback($param->type, $scope);
        }
        if ($param->default === null) {
            return;
        }
        $this->processExprNode($param->default, $scope, $nodeCallback, \PHPStan\Analyser\ExpressionContext::createDeep());
    }
    /**
     * @param ParametersAcceptor|null $parametersAcceptor
     * @param \PhpParser\Node\Arg[] $args
     * @param \PHPStan\Analyser\Scope $scope
     * @param \Closure(\PhpParser\Node $node, Scope $scope): void $nodeCallback
     * @param ExpressionContext $context
     * @param \PHPStan\Analyser\Scope|null $closureBindScope
     * @return \PHPStan\Analyser\ExpressionResult
     */
    private function processArgs(?\PHPStan\Reflection\ParametersAcceptor $parametersAcceptor, array $args, \PHPStan\Analyser\Scope $scope, \Closure $nodeCallback, \PHPStan\Analyser\ExpressionContext $context, ?\PHPStan\Analyser\Scope $closureBindScope = null) : \PHPStan\Analyser\ExpressionResult
    {
        // todo $scope = $scope->enterFunctionCall();
        if ($parametersAcceptor !== null) {
            $parameters = $parametersAcceptor->getParameters();
        }
        $hasYield = \false;
        foreach ($args as $i => $arg) {
            $nodeCallback($arg, $scope);
            if (isset($parameters) && $parametersAcceptor !== null) {
                $assignByReference = \false;
                if (isset($parameters[$i])) {
                    $assignByReference = $parameters[$i]->passedByReference()->createsNewVariable();
                } elseif (\count($parameters) > 0 && $parametersAcceptor->isVariadic()) {
                    $lastParameter = $parameters[\count($parameters) - 1];
                    $assignByReference = $lastParameter->passedByReference()->createsNewVariable();
                }
                if ($assignByReference) {
                    $argValue = $arg->value;
                    if ($argValue instanceof \PhpParser\Node\Expr\Variable && \is_string($argValue->name)) {
                        $scope = $scope->assignVariable($argValue->name, new \PHPStan\Type\MixedType());
                    }
                }
            }
            $originalScope = $scope;
            $scopeToPass = $scope;
            if ($i === 0 && $closureBindScope !== null) {
                $scopeToPass = $closureBindScope;
            }
            $result = $this->processExprNode($arg->value, $scopeToPass, $nodeCallback, $context->enterDeep());
            $scope = $result->getScope();
            $hasYield = $hasYield || $result->hasYield();
            if ($i !== 0 || $closureBindScope === null) {
                continue;
            }
            $scope = $scope->restoreOriginalScopeAfterClosureBind($originalScope);
        }
        // todo $scope = $scope->exitFunctionCall();
        return new \PHPStan\Analyser\ExpressionResult($scope, $hasYield);
    }
    /**
     * @param \PHPStan\Analyser\Scope $scope
     * @param \PhpParser\Node\Expr $var
     * @param \PhpParser\Node\Expr $assignedExpr
     * @param \Closure(\PhpParser\Node $node, Scope $scope): void $nodeCallback
     * @param ExpressionContext $context
     * @param \Closure(Scope $scope): Scope $processExprCallback
     * @param bool $enterExpressionAssign
     * @return Scope
     */
    private function processAssignVar(\PHPStan\Analyser\Scope $scope, \PhpParser\Node\Expr $var, \PhpParser\Node\Expr $assignedExpr, \Closure $nodeCallback, \PHPStan\Analyser\ExpressionContext $context, \Closure $processExprCallback, bool $enterExpressionAssign) : \PHPStan\Analyser\Scope
    {
        // todo return hasYield too
        $nodeCallback($var, $enterExpressionAssign ? $scope->enterExpressionAssign($var) : $scope);
        if ($var instanceof \PhpParser\Node\Expr\Variable && \is_string($var->name)) {
            $scope = $processExprCallback($scope);
            $scope = $scope->assignVariable($var->name, $scope->getType($assignedExpr));
        } elseif ($var instanceof \PhpParser\Node\Expr\ArrayDimFetch) {
            $dimExprStack = [];
            while ($var instanceof \PhpParser\Node\Expr\ArrayDimFetch) {
                $dimExprStack[] = $var->dim;
                $var = $var->var;
            }
            // 1. eval root expr
            if ($enterExpressionAssign && $var instanceof \PhpParser\Node\Expr\Variable) {
                $scope = $scope->enterExpressionAssign($var);
            }
            $scope = $this->processExprNode($var, $scope, $nodeCallback, $context->enterDeep())->getScope();
            if ($enterExpressionAssign && $var instanceof \PhpParser\Node\Expr\Variable) {
                $scope = $scope->exitExpressionAssign($var);
            }
            // 2. eval dimensions
            $offsetTypes = [];
            foreach (\array_reverse($dimExprStack) as $dimExpr) {
                if ($dimExpr === null) {
                    $offsetTypes[] = null;
                } else {
                    $offsetTypes[] = $scope->getType($dimExpr);
                    if ($enterExpressionAssign) {
                        $scope->enterExpressionAssign($dimExpr);
                    }
                    $scope = $this->processExprNode($dimExpr, $scope, $nodeCallback, $context->enterDeep())->getScope();
                    if ($enterExpressionAssign) {
                        $scope = $scope->exitExpressionAssign($dimExpr);
                    }
                }
            }
            $valueToWrite = $scope->getType($assignedExpr);
            // 3. eval assigned expr
            $scope = $processExprCallback($scope);
            // 4. compose types
            $varType = $scope->getType($var);
            if ($varType instanceof \PHPStan\Type\ErrorType) {
                $varType = new \PHPStan\Type\Constant\ConstantArrayType([], []);
            }
            $offsetValueType = $varType;
            $offsetValueTypeStack = [$offsetValueType];
            foreach (\array_slice($offsetTypes, 0, -1) as $offsetType) {
                if ($offsetType === null) {
                    $offsetValueType = new \PHPStan\Type\Constant\ConstantArrayType([], []);
                } else {
                    $offsetValueType = $offsetValueType->getOffsetValueType($offsetType);
                    if ($offsetValueType instanceof \PHPStan\Type\ErrorType) {
                        $offsetValueType = new \PHPStan\Type\Constant\ConstantArrayType([], []);
                    }
                }
                $offsetValueTypeStack[] = $offsetValueType;
            }
            foreach (\array_reverse($offsetTypes) as $offsetType) {
                /** @var Type $offsetValueType */
                $offsetValueType = \array_pop($offsetValueTypeStack);
                $valueToWrite = $offsetValueType->setOffsetValueType($offsetType, $valueToWrite);
            }
            if ($var instanceof \PhpParser\Node\Expr\Variable && \is_string($var->name)) {
                $scope = $scope->assignVariable($var->name, $valueToWrite);
            } else {
                $scope = $scope->specifyExpressionType($var, $valueToWrite);
            }
        } elseif ($var instanceof \PhpParser\Node\Expr\PropertyFetch) {
            $scope = $processExprCallback($scope);
            $scope = $scope->specifyExpressionType($var, $scope->getType($assignedExpr));
        } elseif ($var instanceof \PhpParser\Node\Expr\StaticPropertyFetch) {
            $scope = $processExprCallback($scope);
            $scope = $scope->specifyExpressionType($var, $scope->getType($assignedExpr));
        }
        return $scope;
    }
    private function processVarAnnotation(\PHPStan\Analyser\Scope $scope, string $variableName, string $comment, bool $strict) : \PHPStan\Analyser\Scope
    {
        $resolvedPhpDoc = $this->fileTypeMapper->getResolvedPhpDoc($scope->getFile(), $scope->isInClass() ? $scope->getClassReflection()->getName() : null, $scope->isInTrait() ? $scope->getTraitReflection()->getName() : null, $comment);
        $varTags = $resolvedPhpDoc->getVarTags();
        if (isset($varTags[$variableName])) {
            $variableType = $varTags[$variableName]->getType();
            return $scope->assignVariable($variableName, $variableType);
        }
        if (!$strict && \count($varTags) === 1 && isset($varTags[0])) {
            $variableType = $varTags[0]->getType();
            return $scope->assignVariable($variableName, $variableType);
        }
        return $scope;
    }
    private function enterForeach(\PHPStan\Analyser\Scope $scope, \PhpParser\Node\Stmt\Foreach_ $stmt) : \PHPStan\Analyser\Scope
    {
        if ($stmt->keyVar !== null && $stmt->keyVar instanceof \PhpParser\Node\Expr\Variable && \is_string($stmt->keyVar->name)) {
            $scope = $scope->assignVariable($stmt->keyVar->name, new \PHPStan\Type\MixedType());
        }
        $comment = \PHPStan\Type\CommentHelper::getDocComment($stmt);
        if ($stmt->valueVar instanceof \PhpParser\Node\Expr\Variable && \is_string($stmt->valueVar->name)) {
            $scope = $scope->enterForeach($stmt->expr, $stmt->valueVar->name, $stmt->keyVar !== null && $stmt->keyVar instanceof \PhpParser\Node\Expr\Variable && \is_string($stmt->keyVar->name) ? $stmt->keyVar->name : null);
            if ($comment !== null) {
                $scope = $this->processVarAnnotation($scope, $stmt->valueVar->name, $comment, \true);
            }
        }
        if ($stmt->keyVar instanceof \PhpParser\Node\Expr\Variable && \is_string($stmt->keyVar->name) && $comment !== null) {
            $scope = $this->processVarAnnotation($scope, $stmt->keyVar->name, $comment, \true);
        }
        if ($stmt->valueVar instanceof \PhpParser\Node\Expr\List_ || $stmt->valueVar instanceof \PhpParser\Node\Expr\Array_) {
            $itemTypes = [];
            $exprType = $scope->getType($stmt->expr);
            $arrayTypes = \PHPStan\Type\TypeUtils::getArrays($exprType);
            foreach ($arrayTypes as $arrayType) {
                $itemTypes[] = $arrayType->getItemType();
            }
            $itemType = \count($itemTypes) > 0 ? \PHPStan\Type\TypeCombinator::union(...$itemTypes) : new \PHPStan\Type\MixedType();
            $scope = $this->lookForArrayDestructuringArray($scope, $stmt->valueVar, $itemType);
        }
        return $scope;
    }
    private function processTraitUse(\PhpParser\Node\Stmt\TraitUse $node, \PHPStan\Analyser\Scope $classScope, \Closure $nodeCallback) : void
    {
        foreach ($node->traits as $trait) {
            $traitName = (string) $trait;
            if (!$this->broker->hasClass($traitName)) {
                continue;
            }
            $traitReflection = $this->broker->getClass($traitName);
            $traitFileName = $traitReflection->getFileName();
            if ($traitFileName === \false) {
                continue;
                // trait from eval or from PHP itself
            }
            $fileName = $this->fileHelper->normalizePath($traitFileName);
            if (!isset($this->analysedFiles[$fileName])) {
                continue;
            }
            $parserNodes = $this->parser->parseFile($fileName);
            $this->processNodesForTraitUse($parserNodes, $traitReflection, $classScope, $nodeCallback);
        }
    }
    /**
     * @param \PhpParser\Node[]|\PhpParser\Node|scalar $node
     * @param ClassReflection $traitReflection
     * @param \PHPStan\Analyser\Scope $scope
     * @param \Closure(\PhpParser\Node $node): void $nodeCallback
     */
    private function processNodesForTraitUse($node, \PHPStan\Reflection\ClassReflection $traitReflection, \PHPStan\Analyser\Scope $scope, \Closure $nodeCallback) : void
    {
        if ($node instanceof \PhpParser\Node) {
            if ($node instanceof \PhpParser\Node\Stmt\Trait_ && $traitReflection->getName() === (string) $node->namespacedName) {
                $this->processStmtNodes($node, $node->stmts, $scope->enterTrait($traitReflection), $nodeCallback);
                return;
            }
            if ($node instanceof \PhpParser\Node\Stmt\ClassLike) {
                return;
            }
            if ($node instanceof \PhpParser\Node\FunctionLike) {
                return;
            }
            foreach ($node->getSubNodeNames() as $subNodeName) {
                $subNode = $node->{$subNodeName};
                $this->processNodesForTraitUse($subNode, $traitReflection, $scope, $nodeCallback);
            }
        } elseif (\is_array($node)) {
            foreach ($node as $subNode) {
                $this->processNodesForTraitUse($subNode, $traitReflection, $scope, $nodeCallback);
            }
        }
    }
    /**
     * @param Scope $scope
     * @param Node\FunctionLike $functionLike
     * @return mixed[]
     */
    private function getPhpDocs(\PHPStan\Analyser\Scope $scope, \PhpParser\Node\FunctionLike $functionLike) : array
    {
        $phpDocParameterTypes = [];
        $phpDocReturnType = null;
        $phpDocThrowType = null;
        $deprecatedDescription = null;
        $isDeprecated = \false;
        $isInternal = \false;
        $isFinal = \false;
        $docComment = $functionLike->getDocComment() !== null ? $functionLike->getDocComment()->getText() : null;
        $file = $scope->getFile();
        $class = $scope->isInClass() ? $scope->getClassReflection()->getName() : null;
        $trait = $scope->isInTrait() ? $scope->getTraitReflection()->getName() : null;
        $isExplicitPhpDoc = \true;
        if ($functionLike instanceof \PhpParser\Node\Stmt\ClassMethod) {
            if (!$scope->isInClass()) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            $phpDocBlock = \PHPStan\PhpDoc\PhpDocBlock::resolvePhpDocBlockForMethod($this->broker, $docComment, $scope->getClassReflection()->getName(), $trait, $functionLike->name->name, $file);
            if ($phpDocBlock !== null) {
                $docComment = $phpDocBlock->getDocComment();
                $file = $phpDocBlock->getFile();
                $class = $phpDocBlock->getClass();
                $trait = $phpDocBlock->getTrait();
                $isExplicitPhpDoc = $phpDocBlock->isExplicit();
            }
        }
        if ($docComment !== null) {
            $resolvedPhpDoc = $this->fileTypeMapper->getResolvedPhpDoc($file, $class, $trait, $docComment);
            $phpDocParameterTypes = \array_map(static function (\PHPStan\PhpDoc\Tag\ParamTag $tag) : Type {
                return $tag->getType();
            }, $resolvedPhpDoc->getParamTags());
            $nativeReturnType = $scope->getFunctionType($functionLike->getReturnType(), \false, \false);
            $phpDocReturnType = null;
            if ($resolvedPhpDoc->getReturnTag() !== null && ($isExplicitPhpDoc || $nativeReturnType->isSuperTypeOf($resolvedPhpDoc->getReturnTag()->getType())->yes())) {
                $phpDocReturnType = $resolvedPhpDoc->getReturnTag()->getType();
            }
            $phpDocThrowType = $resolvedPhpDoc->getThrowsTag() !== null ? $resolvedPhpDoc->getThrowsTag()->getType() : null;
            $deprecatedDescription = $resolvedPhpDoc->getDeprecatedTag() !== null ? $resolvedPhpDoc->getDeprecatedTag()->getMessage() : null;
            $isDeprecated = $resolvedPhpDoc->isDeprecated();
            $isInternal = $resolvedPhpDoc->isInternal();
            $isFinal = $resolvedPhpDoc->isFinal();
        }
        return [$phpDocParameterTypes, $phpDocReturnType, $phpDocThrowType, $deprecatedDescription, $isDeprecated, $isInternal, $isFinal];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Analyser;

use PhpParser\Node\Expr;
use PHPStan\Broker\Broker;
use PHPStan\DependencyInjection\Container;
use PHPStan\Type\Type;
class ScopeFactory
{
    /** @var string */
    private $scopeClass;
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PhpParser\PrettyPrinter\Standard */
    private $printer;
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    /** @var string[] */
    private $dynamicConstantNames;
    public function __construct(string $scopeClass, \PHPStan\Broker\Broker $broker, \PhpParser\PrettyPrinter\Standard $printer, \PHPStan\Analyser\TypeSpecifier $typeSpecifier, \PHPStan\DependencyInjection\Container $container)
    {
        $this->scopeClass = $scopeClass;
        $this->broker = $broker;
        $this->printer = $printer;
        $this->typeSpecifier = $typeSpecifier;
        $this->dynamicConstantNames = $container->getParameter('dynamicConstantNames');
    }
    /**
     * @param \PHPStan\Analyser\ScopeContext $context
     * @param bool $declareStrictTypes
     * @param \PHPStan\Reflection\FunctionReflection|\PHPStan\Reflection\MethodReflection|null $function
     * @param string|null $namespace
     * @param \PHPStan\Analyser\VariableTypeHolder[] $variablesTypes
     * @param \PHPStan\Analyser\VariableTypeHolder[] $moreSpecificTypes
     * @param string|null $inClosureBindScopeClass
     * @param \PHPStan\Type\Type|null $inAnonymousFunctionReturnType
     * @param \PhpParser\Node\Expr\FuncCall|\PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall|null $inFunctionCall
     * @param bool $negated
     * @param bool $inFirstLevelStatement
     * @param array<string, true> $currentlyAssignedExpressions
     *
     * @return Scope
     */
    public function create(\PHPStan\Analyser\ScopeContext $context, bool $declareStrictTypes = \false, $function = null, ?string $namespace = null, array $variablesTypes = [], array $moreSpecificTypes = [], ?string $inClosureBindScopeClass = null, ?\PHPStan\Type\Type $inAnonymousFunctionReturnType = null, ?\PhpParser\Node\Expr $inFunctionCall = null, bool $negated = \false, bool $inFirstLevelStatement = \true, array $currentlyAssignedExpressions = []) : \PHPStan\Analyser\Scope
    {
        $scopeClass = $this->scopeClass;
        if (!\is_a($scopeClass, \PHPStan\Analyser\Scope::class, \true)) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return new $scopeClass($this, $this->broker, $this->printer, $this->typeSpecifier, $context, $declareStrictTypes, $function, $namespace, $variablesTypes, $moreSpecificTypes, $inClosureBindScopeClass, $inAnonymousFunctionReturnType, $inFunctionCall, $negated, $inFirstLevelStatement, $currentlyAssignedExpressions, $this->dynamicConstantNames);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Analyser;

use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\ArrayDimFetch;
use PhpParser\Node\Expr\BinaryOp\BooleanAnd;
use PhpParser\Node\Expr\BinaryOp\BooleanOr;
use PhpParser\Node\Expr\BinaryOp\LogicalAnd;
use PhpParser\Node\Expr\BinaryOp\LogicalOr;
use PhpParser\Node\Expr\ConstFetch;
use PhpParser\Node\Expr\FuncCall;
use PhpParser\Node\Expr\Instanceof_;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Expr\New_;
use PhpParser\Node\Expr\PropertyFetch;
use PhpParser\Node\Expr\StaticCall;
use PhpParser\Node\Expr\StaticPropertyFetch;
use PhpParser\Node\Name;
use PHPStan\Broker\Broker;
use PHPStan\Type\Accessory\HasOffsetType;
use PHPStan\Type\Accessory\HasPropertyType;
use PHPStan\Type\Accessory\NonEmptyArrayType;
use PHPStan\Type\ArrayType;
use PHPStan\Type\BooleanType;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantFloatType;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\IntersectionType;
use PHPStan\Type\MixedType;
use PHPStan\Type\NeverType;
use PHPStan\Type\NonexistentParentClassType;
use PHPStan\Type\NullType;
use PHPStan\Type\ObjectType;
use PHPStan\Type\ObjectWithoutClassType;
use PHPStan\Type\StaticType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
use PHPStan\Type\UnionType;
class TypeSpecifier
{
    /** @var \PhpParser\PrettyPrinter\Standard */
    private $printer;
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PHPStan\Type\FunctionTypeSpecifyingExtension[] */
    private $functionTypeSpecifyingExtensions = [];
    /** @var \PHPStan\Type\MethodTypeSpecifyingExtension[] */
    private $methodTypeSpecifyingExtensions = [];
    /** @var \PHPStan\Type\StaticMethodTypeSpecifyingExtension[] */
    private $staticMethodTypeSpecifyingExtensions = [];
    /** @var \PHPStan\Type\MethodTypeSpecifyingExtension[][]|null */
    private $methodTypeSpecifyingExtensionsByClass;
    /** @var \PHPStan\Type\StaticMethodTypeSpecifyingExtension[][]|null */
    private $staticMethodTypeSpecifyingExtensionsByClass;
    /**
     * @param \PhpParser\PrettyPrinter\Standard $printer
     * @param \PHPStan\Broker\Broker $broker
     * @param \PHPStan\Type\FunctionTypeSpecifyingExtension[] $functionTypeSpecifyingExtensions
     * @param \PHPStan\Type\MethodTypeSpecifyingExtension[] $methodTypeSpecifyingExtensions
     * @param \PHPStan\Type\StaticMethodTypeSpecifyingExtension[] $staticMethodTypeSpecifyingExtensions
     */
    public function __construct(\PhpParser\PrettyPrinter\Standard $printer, \PHPStan\Broker\Broker $broker, array $functionTypeSpecifyingExtensions, array $methodTypeSpecifyingExtensions, array $staticMethodTypeSpecifyingExtensions)
    {
        $this->printer = $printer;
        $this->broker = $broker;
        foreach (\array_merge($functionTypeSpecifyingExtensions, $methodTypeSpecifyingExtensions, $staticMethodTypeSpecifyingExtensions) as $extension) {
            if (!$extension instanceof \PHPStan\Analyser\TypeSpecifierAwareExtension) {
                continue;
            }
            $extension->setTypeSpecifier($this);
        }
        $this->functionTypeSpecifyingExtensions = $functionTypeSpecifyingExtensions;
        $this->methodTypeSpecifyingExtensions = $methodTypeSpecifyingExtensions;
        $this->staticMethodTypeSpecifyingExtensions = $staticMethodTypeSpecifyingExtensions;
    }
    public function specifyTypesInCondition(\PHPStan\Analyser\Scope $scope, \PhpParser\Node\Expr $expr, \PHPStan\Analyser\TypeSpecifierContext $context, bool $defaultHandleFunctions = \false) : \PHPStan\Analyser\SpecifiedTypes
    {
        if ($expr instanceof \PhpParser\Node\Expr\Instanceof_) {
            $exprNode = $expr->expr;
            if ($exprNode instanceof \PhpParser\Node\Expr\Assign) {
                $exprNode = $exprNode->var;
            }
            if ($expr->class instanceof \PhpParser\Node\Name) {
                $className = (string) $expr->class;
                $lowercasedClassName = \strtolower($className);
                if ($lowercasedClassName === 'self' && $scope->isInClass()) {
                    $type = new \PHPStan\Type\ObjectType($scope->getClassReflection()->getName());
                } elseif ($lowercasedClassName === 'static' && $scope->isInClass()) {
                    $type = new \PHPStan\Type\StaticType($scope->getClassReflection()->getName());
                } elseif ($lowercasedClassName === 'parent') {
                    if ($scope->isInClass() && $scope->getClassReflection()->getParentClass() !== \false) {
                        $type = new \PHPStan\Type\ObjectType($scope->getClassReflection()->getParentClass()->getName());
                    } else {
                        $type = new \PHPStan\Type\NonexistentParentClassType();
                    }
                } else {
                    $type = new \PHPStan\Type\ObjectType($className);
                }
                return $this->create($exprNode, $type, $context);
            }
            if ($context->true()) {
                return $this->create($exprNode, new \PHPStan\Type\ObjectWithoutClassType(), $context);
            }
        } elseif ($expr instanceof \PhpParser\Node\Expr\BinaryOp\Identical) {
            $expressions = $this->findTypeExpressionsFromBinaryOperation($scope, $expr);
            if ($expressions !== null) {
                /** @var Expr $exprNode */
                $exprNode = $expressions[0];
                if ($exprNode instanceof \PhpParser\Node\Expr\Assign) {
                    $exprNode = $exprNode->var;
                }
                /** @var \PHPStan\Type\ConstantScalarType $constantType */
                $constantType = $expressions[1];
                if ($constantType->getValue() === \false) {
                    $types = $this->create($exprNode, $constantType, $context);
                    return $types->unionWith($this->specifyTypesInCondition($scope, $exprNode, $context->true() ? \PHPStan\Analyser\TypeSpecifierContext::createFalse() : \PHPStan\Analyser\TypeSpecifierContext::createFalse()->negate()));
                }
                if ($constantType->getValue() === \true) {
                    $types = $this->create($exprNode, $constantType, $context);
                    return $types->unionWith($this->specifyTypesInCondition($scope, $exprNode, $context->true() ? \PHPStan\Analyser\TypeSpecifierContext::createTrue() : \PHPStan\Analyser\TypeSpecifierContext::createTrue()->negate()));
                }
                if ($constantType->getValue() === null) {
                    return $this->create($exprNode, $constantType, $context);
                }
                if (!$context->null() && $exprNode instanceof \PhpParser\Node\Expr\FuncCall && \count($exprNode->args) === 1 && $exprNode->name instanceof \PhpParser\Node\Name && \strtolower((string) $exprNode->name) === 'count' && $constantType instanceof \PHPStan\Type\Constant\ConstantIntegerType) {
                    if ($context->truthy() || $constantType->getValue() === 0) {
                        $newContext = $context;
                        if ($constantType->getValue() === 0) {
                            $newContext = $newContext->negate();
                        }
                        $argType = $scope->getType($exprNode->args[0]->value);
                        if ((new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType()))->isSuperTypeOf($argType)->yes()) {
                            return $this->create($exprNode->args[0]->value, new \PHPStan\Type\Accessory\NonEmptyArrayType(), $newContext);
                        }
                    }
                }
            }
            if ($context->true()) {
                $type = \PHPStan\Type\TypeCombinator::intersect($scope->getType($expr->right), $scope->getType($expr->left));
                $leftTypes = $this->create($expr->left, $type, $context);
                $rightTypes = $this->create($expr->right, $type, $context);
                return $leftTypes->unionWith($rightTypes);
            } elseif ($context->false()) {
                $identicalType = $scope->getType($expr);
                if ($identicalType instanceof \PHPStan\Type\Constant\ConstantBooleanType) {
                    $never = new \PHPStan\Type\NeverType();
                    $contextForTypes = $identicalType->getValue() ? $context->negate() : $context;
                    $leftTypes = $this->create($expr->left, $never, $contextForTypes);
                    $rightTypes = $this->create($expr->right, $never, $contextForTypes);
                    return $leftTypes->unionWith($rightTypes);
                }
                if (($expr->left instanceof \PhpParser\Node\Scalar || $expr->left instanceof \PhpParser\Node\Expr\Array_) && !$expr->right instanceof \PhpParser\Node\Scalar) {
                    return $this->create($expr->right, $scope->getType($expr->left), $context);
                }
                if (($expr->right instanceof \PhpParser\Node\Scalar || $expr->right instanceof \PhpParser\Node\Expr\Array_) && !$expr->left instanceof \PhpParser\Node\Scalar) {
                    return $this->create($expr->left, $scope->getType($expr->right), $context);
                }
            }
        } elseif ($expr instanceof \PhpParser\Node\Expr\BinaryOp\NotIdentical) {
            return $this->specifyTypesInCondition($scope, new \PhpParser\Node\Expr\BooleanNot(new \PhpParser\Node\Expr\BinaryOp\Identical($expr->left, $expr->right)), $context);
        } elseif ($expr instanceof \PhpParser\Node\Expr\BinaryOp\Equal) {
            $expressions = $this->findTypeExpressionsFromBinaryOperation($scope, $expr);
            if ($expressions !== null) {
                /** @var Expr $exprNode */
                $exprNode = $expressions[0];
                /** @var \PHPStan\Type\ConstantScalarType $constantType */
                $constantType = $expressions[1];
                if ($constantType->getValue() === \false || $constantType->getValue() === null) {
                    return $this->specifyTypesInCondition($scope, $exprNode, $context->true() ? \PHPStan\Analyser\TypeSpecifierContext::createFalsey() : \PHPStan\Analyser\TypeSpecifierContext::createFalsey()->negate());
                }
                if ($constantType->getValue() === \true) {
                    return $this->specifyTypesInCondition($scope, $exprNode, $context->true() ? \PHPStan\Analyser\TypeSpecifierContext::createTruthy() : \PHPStan\Analyser\TypeSpecifierContext::createTruthy()->negate());
                }
            }
            $leftType = $scope->getType($expr->left);
            $leftBooleanType = $leftType->toBoolean();
            $rightType = $scope->getType($expr->right);
            if ($leftBooleanType instanceof \PHPStan\Type\Constant\ConstantBooleanType && $rightType instanceof \PHPStan\Type\BooleanType) {
                return $this->specifyTypesInCondition($scope, new \PhpParser\Node\Expr\BinaryOp\Identical(new \PhpParser\Node\Expr\ConstFetch(new \PhpParser\Node\Name($leftBooleanType->getValue() ? 'true' : 'false')), $expr->right), $context);
            }
            $rightBooleanType = $rightType->toBoolean();
            if ($rightBooleanType instanceof \PHPStan\Type\Constant\ConstantBooleanType && $leftType instanceof \PHPStan\Type\BooleanType) {
                return $this->specifyTypesInCondition($scope, new \PhpParser\Node\Expr\BinaryOp\Identical($expr->left, new \PhpParser\Node\Expr\ConstFetch(new \PhpParser\Node\Name($rightBooleanType->getValue() ? 'true' : 'false'))), $context);
            }
            if ($expr->left instanceof \PhpParser\Node\Expr\FuncCall && $expr->left->name instanceof \PhpParser\Node\Name && \strtolower($expr->left->name->toString()) === 'get_class' && isset($expr->left->args[0]) && $rightType instanceof \PHPStan\Type\Constant\ConstantStringType) {
                return $this->specifyTypesInCondition($scope, new \PhpParser\Node\Expr\Instanceof_($expr->left->args[0]->value, new \PhpParser\Node\Name($rightType->getValue())), $context);
            }
            if ($expr->right instanceof \PhpParser\Node\Expr\FuncCall && $expr->right->name instanceof \PhpParser\Node\Name && \strtolower($expr->right->name->toString()) === 'get_class' && isset($expr->right->args[0]) && $leftType instanceof \PHPStan\Type\Constant\ConstantStringType) {
                return $this->specifyTypesInCondition($scope, new \PhpParser\Node\Expr\Instanceof_($expr->right->args[0]->value, new \PhpParser\Node\Name($leftType->getValue())), $context);
            }
        } elseif ($expr instanceof \PhpParser\Node\Expr\BinaryOp\NotEqual) {
            return $this->specifyTypesInCondition($scope, new \PhpParser\Node\Expr\BooleanNot(new \PhpParser\Node\Expr\BinaryOp\Equal($expr->left, $expr->right)), $context);
        } elseif ($expr instanceof \PhpParser\Node\Expr\FuncCall && $expr->name instanceof \PhpParser\Node\Name) {
            if ($this->broker->hasFunction($expr->name, $scope)) {
                $functionReflection = $this->broker->getFunction($expr->name, $scope);
                foreach ($this->getFunctionTypeSpecifyingExtensions() as $extension) {
                    if (!$extension->isFunctionSupported($functionReflection, $expr, $context)) {
                        continue;
                    }
                    return $extension->specifyTypes($functionReflection, $expr, $scope, $context);
                }
            }
            if ($defaultHandleFunctions) {
                return $this->handleDefaultTruthyOrFalseyContext($context, $expr);
            }
        } elseif ($expr instanceof \PhpParser\Node\Expr\MethodCall && $expr->name instanceof \PhpParser\Node\Identifier) {
            $methodCalledOnType = $scope->getType($expr->var);
            $referencedClasses = \PHPStan\Type\TypeUtils::getDirectClassNames($methodCalledOnType);
            if (\count($referencedClasses) === 1 && $this->broker->hasClass($referencedClasses[0])) {
                $methodClassReflection = $this->broker->getClass($referencedClasses[0]);
                if ($methodClassReflection->hasMethod($expr->name->name)) {
                    $methodReflection = $methodClassReflection->getMethod($expr->name->name, $scope);
                    foreach ($this->getMethodTypeSpecifyingExtensionsForClass($methodClassReflection->getName()) as $extension) {
                        if (!$extension->isMethodSupported($methodReflection, $expr, $context)) {
                            continue;
                        }
                        return $extension->specifyTypes($methodReflection, $expr, $scope, $context);
                    }
                }
            }
            if ($defaultHandleFunctions) {
                return $this->handleDefaultTruthyOrFalseyContext($context, $expr);
            }
        } elseif ($expr instanceof \PhpParser\Node\Expr\StaticCall && $expr->name instanceof \PhpParser\Node\Identifier) {
            if ($expr->class instanceof \PhpParser\Node\Name) {
                $calleeType = new \PHPStan\Type\ObjectType($scope->resolveName($expr->class));
            } else {
                $calleeType = $scope->getType($expr->class);
            }
            if ($calleeType->hasMethod($expr->name->name)->yes()) {
                $staticMethodReflection = $calleeType->getMethod($expr->name->name, $scope);
                $referencedClasses = \PHPStan\Type\TypeUtils::getDirectClassNames($calleeType);
                if (\count($referencedClasses) === 1 && $this->broker->hasClass($referencedClasses[0])) {
                    $staticMethodClassReflection = $this->broker->getClass($referencedClasses[0]);
                    foreach ($this->getStaticMethodTypeSpecifyingExtensionsForClass($staticMethodClassReflection->getName()) as $extension) {
                        if (!$extension->isStaticMethodSupported($staticMethodReflection, $expr, $context)) {
                            continue;
                        }
                        return $extension->specifyTypes($staticMethodReflection, $expr, $scope, $context);
                    }
                }
            }
            if ($defaultHandleFunctions) {
                return $this->handleDefaultTruthyOrFalseyContext($context, $expr);
            }
        } elseif ($expr instanceof \PhpParser\Node\Expr\BinaryOp\BooleanAnd || $expr instanceof \PhpParser\Node\Expr\BinaryOp\LogicalAnd) {
            $leftTypes = $this->specifyTypesInCondition($scope, $expr->left, $context);
            $rightTypes = $this->specifyTypesInCondition($scope, $expr->right, $context);
            return $context->true() ? $leftTypes->unionWith($rightTypes) : $leftTypes->intersectWith($rightTypes);
        } elseif ($expr instanceof \PhpParser\Node\Expr\BinaryOp\BooleanOr || $expr instanceof \PhpParser\Node\Expr\BinaryOp\LogicalOr) {
            $leftTypes = $this->specifyTypesInCondition($scope, $expr->left, $context);
            $rightTypes = $this->specifyTypesInCondition($scope, $expr->right, $context);
            return $context->true() ? $leftTypes->intersectWith($rightTypes) : $leftTypes->unionWith($rightTypes);
        } elseif ($expr instanceof \PhpParser\Node\Expr\BooleanNot && !$context->null()) {
            return $this->specifyTypesInCondition($scope, $expr->expr, $context->negate());
        } elseif ($expr instanceof \PhpParser\Node\Expr\Assign) {
            if ($context->null()) {
                return $this->specifyTypesInCondition($scope->exitFirstLevelStatements(), $expr->expr, $context);
            }
            return $this->specifyTypesInCondition($scope->exitFirstLevelStatements(), $expr->var, $context);
        } elseif ($expr instanceof \PhpParser\Node\Expr\Isset_ && \count($expr->vars) > 0 && $context->truthy() || $expr instanceof \PhpParser\Node\Expr\Empty_ && $context->falsey()) {
            $vars = [];
            if ($expr instanceof \PhpParser\Node\Expr\Isset_) {
                $varsToIterate = $expr->vars;
            } else {
                $varsToIterate = [$expr->expr];
            }
            foreach ($varsToIterate as $var) {
                $vars[] = $var;
                while ($var instanceof \PhpParser\Node\Expr\ArrayDimFetch || $var instanceof \PhpParser\Node\Expr\PropertyFetch || $var instanceof \PhpParser\Node\Expr\StaticPropertyFetch && $var->class instanceof \PhpParser\Node\Expr) {
                    if ($var instanceof \PhpParser\Node\Expr\StaticPropertyFetch) {
                        /** @var Expr $var */
                        $var = $var->class;
                    } else {
                        $var = $var->var;
                    }
                    $vars[] = $var;
                }
            }
            if (\count($vars) === 0) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            $types = null;
            foreach ($vars as $var) {
                if ($expr instanceof \PhpParser\Node\Expr\Isset_) {
                    if ($var instanceof \PhpParser\Node\Expr\ArrayDimFetch && $var->dim !== null && !$scope->getType($var->var) instanceof \PHPStan\Type\MixedType) {
                        $type = $this->create($var->var, new \PHPStan\Type\Accessory\HasOffsetType($scope->getType($var->dim)), $context)->unionWith($this->create($var, new \PHPStan\Type\NullType(), \PHPStan\Analyser\TypeSpecifierContext::createFalse()));
                    } else {
                        $type = $this->create($var, new \PHPStan\Type\NullType(), \PHPStan\Analyser\TypeSpecifierContext::createFalse());
                    }
                } else {
                    $type = $this->create($var, new \PHPStan\Type\UnionType([new \PHPStan\Type\NullType(), new \PHPStan\Type\Constant\ConstantBooleanType(\false)]), \PHPStan\Analyser\TypeSpecifierContext::createFalse());
                }
                if ($var instanceof \PhpParser\Node\Expr\PropertyFetch && $var->name instanceof \PhpParser\Node\Identifier) {
                    $type = $type->unionWith($this->create($var->var, new \PHPStan\Type\IntersectionType([new \PHPStan\Type\ObjectWithoutClassType(), new \PHPStan\Type\Accessory\HasPropertyType($var->name->toString())]), \PHPStan\Analyser\TypeSpecifierContext::createTruthy()));
                } elseif ($var instanceof \PhpParser\Node\Expr\StaticPropertyFetch && $var->class instanceof \PhpParser\Node\Expr && $var->name instanceof \PhpParser\Node\VarLikeIdentifier) {
                    $type = $type->unionWith($this->create($var->class, new \PHPStan\Type\IntersectionType([new \PHPStan\Type\ObjectWithoutClassType(), new \PHPStan\Type\Accessory\HasPropertyType($var->name->toString())]), \PHPStan\Analyser\TypeSpecifierContext::createTruthy()));
                }
                if ($types === null) {
                    $types = $type;
                } else {
                    $types = $types->unionWith($type);
                }
            }
            if ($expr instanceof \PhpParser\Node\Expr\Empty_ && (new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType()))->isSuperTypeOf($scope->getType($expr->expr))->yes()) {
                $types = $types->unionWith($this->create($expr->expr, new \PHPStan\Type\Accessory\NonEmptyArrayType(), $context->negate()));
            }
            return $types;
        } elseif ($expr instanceof \PhpParser\Node\Expr\Empty_ && $context->truthy() && (new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType()))->isSuperTypeOf($scope->getType($expr->expr))->yes()) {
            return $this->create($expr->expr, new \PHPStan\Type\Accessory\NonEmptyArrayType(), $context->negate());
        } elseif ($expr instanceof \PhpParser\Node\Expr\ErrorSuppress) {
            return $this->specifyTypesInCondition($scope, $expr->expr, $context, $defaultHandleFunctions);
        } elseif (!$context->null()) {
            return $this->handleDefaultTruthyOrFalseyContext($context, $expr);
        }
        return new \PHPStan\Analyser\SpecifiedTypes();
    }
    private function handleDefaultTruthyOrFalseyContext(\PHPStan\Analyser\TypeSpecifierContext $context, \PhpParser\Node\Expr $expr) : \PHPStan\Analyser\SpecifiedTypes
    {
        if (!$context->truthy()) {
            $type = new \PHPStan\Type\UnionType([new \PHPStan\Type\ObjectWithoutClassType(), new \PHPStan\Type\Accessory\NonEmptyArrayType()]);
            return $this->create($expr, $type, \PHPStan\Analyser\TypeSpecifierContext::createFalse());
        } elseif (!$context->falsey()) {
            $type = new \PHPStan\Type\UnionType([new \PHPStan\Type\NullType(), new \PHPStan\Type\Constant\ConstantBooleanType(\false), new \PHPStan\Type\Constant\ConstantIntegerType(0), new \PHPStan\Type\Constant\ConstantFloatType(0.0), new \PHPStan\Type\Constant\ConstantStringType(''), new \PHPStan\Type\Constant\ConstantArrayType([], [])]);
            return $this->create($expr, $type, \PHPStan\Analyser\TypeSpecifierContext::createFalse());
        }
        return new \PHPStan\Analyser\SpecifiedTypes();
    }
    /**
     * @param \PHPStan\Analyser\Scope $scope
     * @param \PhpParser\Node\Expr\BinaryOp $binaryOperation
     * @return (Expr|\PHPStan\Type\ConstantScalarType)[]|null
     */
    private function findTypeExpressionsFromBinaryOperation(\PHPStan\Analyser\Scope $scope, \PhpParser\Node\Expr\BinaryOp $binaryOperation) : ?array
    {
        $leftType = $scope->getType($binaryOperation->left);
        $rightType = $scope->getType($binaryOperation->right);
        if ($leftType instanceof \PHPStan\Type\ConstantScalarType && !$binaryOperation->right instanceof \PhpParser\Node\Expr\ConstFetch && !$binaryOperation->right instanceof \PhpParser\Node\Expr\ClassConstFetch) {
            return [$binaryOperation->right, $leftType];
        } elseif ($rightType instanceof \PHPStan\Type\ConstantScalarType && !$binaryOperation->left instanceof \PhpParser\Node\Expr\ConstFetch && !$binaryOperation->left instanceof \PhpParser\Node\Expr\ClassConstFetch) {
            return [$binaryOperation->left, $rightType];
        }
        return null;
    }
    public function create(\PhpParser\Node\Expr $expr, \PHPStan\Type\Type $type, \PHPStan\Analyser\TypeSpecifierContext $context, bool $overwrite = \false) : \PHPStan\Analyser\SpecifiedTypes
    {
        if ($expr instanceof \PhpParser\Node\Expr\New_ || $expr instanceof \PhpParser\Node\Expr\Instanceof_) {
            return new \PHPStan\Analyser\SpecifiedTypes();
        }
        $sureTypes = [];
        $sureNotTypes = [];
        $exprString = $this->printer->prettyPrintExpr($expr);
        if ($context->false()) {
            $sureNotTypes[$exprString] = [$expr, $type];
        } elseif ($context->true()) {
            $sureTypes[$exprString] = [$expr, $type];
        }
        return new \PHPStan\Analyser\SpecifiedTypes($sureTypes, $sureNotTypes, $overwrite);
    }
    /**
     * @return \PHPStan\Type\FunctionTypeSpecifyingExtension[]
     */
    private function getFunctionTypeSpecifyingExtensions() : array
    {
        return $this->functionTypeSpecifyingExtensions;
    }
    /**
     * @param string $className
     * @return \PHPStan\Type\MethodTypeSpecifyingExtension[]
     */
    private function getMethodTypeSpecifyingExtensionsForClass(string $className) : array
    {
        if ($this->methodTypeSpecifyingExtensionsByClass === null) {
            $byClass = [];
            foreach ($this->methodTypeSpecifyingExtensions as $extension) {
                $byClass[$extension->getClass()][] = $extension;
            }
            $this->methodTypeSpecifyingExtensionsByClass = $byClass;
        }
        return $this->getTypeSpecifyingExtensionsForType($this->methodTypeSpecifyingExtensionsByClass, $className);
    }
    /**
     * @param string $className
     * @return \PHPStan\Type\StaticMethodTypeSpecifyingExtension[]
     */
    private function getStaticMethodTypeSpecifyingExtensionsForClass(string $className) : array
    {
        if ($this->staticMethodTypeSpecifyingExtensionsByClass === null) {
            $byClass = [];
            foreach ($this->staticMethodTypeSpecifyingExtensions as $extension) {
                $byClass[$extension->getClass()][] = $extension;
            }
            $this->staticMethodTypeSpecifyingExtensionsByClass = $byClass;
        }
        return $this->getTypeSpecifyingExtensionsForType($this->staticMethodTypeSpecifyingExtensionsByClass, $className);
    }
    /**
     * @param \PHPStan\Type\MethodTypeSpecifyingExtension[][]|\PHPStan\Type\StaticMethodTypeSpecifyingExtension[][] $extensions
     * @param string $className
     * @return mixed[]
     */
    private function getTypeSpecifyingExtensionsForType(array $extensions, string $className) : array
    {
        $extensionsForClass = [];
        $class = $this->broker->getClass($className);
        foreach (\array_merge([$className], $class->getParentClassesNames(), $class->getNativeReflection()->getInterfaceNames()) as $extensionClassName) {
            if (!isset($extensions[$extensionClassName])) {
                continue;
            }
            $extensionsForClass = \array_merge($extensionsForClass, $extensions[$extensionClassName]);
        }
        return $extensionsForClass;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Analyser;

use PHPStan\Type\TypeCombinator;
class SpecifiedTypes
{
    /** @var mixed[] */
    private $sureTypes;
    /** @var mixed[] */
    private $sureNotTypes;
    /** @var bool */
    private $overwrite;
    /**
     * @param mixed[] $sureTypes
     * @param mixed[] $sureNotTypes
     * @param bool $overwrite
     */
    public function __construct(array $sureTypes = [], array $sureNotTypes = [], bool $overwrite = \false)
    {
        $this->sureTypes = $sureTypes;
        $this->sureNotTypes = $sureNotTypes;
        $this->overwrite = $overwrite;
    }
    /**
     * @return mixed[]
     */
    public function getSureTypes() : array
    {
        return $this->sureTypes;
    }
    /**
     * @return mixed[]
     */
    public function getSureNotTypes() : array
    {
        return $this->sureNotTypes;
    }
    public function shouldOverwrite() : bool
    {
        return $this->overwrite;
    }
    public function intersectWith(\PHPStan\Analyser\SpecifiedTypes $other) : self
    {
        $sureTypeUnion = [];
        $sureNotTypeUnion = [];
        foreach ($this->sureTypes as $exprString => [$exprNode, $type]) {
            if (!isset($other->sureTypes[$exprString])) {
                continue;
            }
            $sureTypeUnion[$exprString] = [$exprNode, \PHPStan\Type\TypeCombinator::union($type, $other->sureTypes[$exprString][1])];
        }
        foreach ($this->sureNotTypes as $exprString => [$exprNode, $type]) {
            if (!isset($other->sureNotTypes[$exprString])) {
                continue;
            }
            $sureNotTypeUnion[$exprString] = [$exprNode, \PHPStan\Type\TypeCombinator::intersect($type, $other->sureNotTypes[$exprString][1])];
        }
        return new self($sureTypeUnion, $sureNotTypeUnion);
    }
    public function unionWith(\PHPStan\Analyser\SpecifiedTypes $other) : self
    {
        $sureTypeUnion = $this->sureTypes + $other->sureTypes;
        $sureNotTypeUnion = $this->sureNotTypes + $other->sureNotTypes;
        foreach ($this->sureTypes as $exprString => [$exprNode, $type]) {
            if (!isset($other->sureTypes[$exprString])) {
                continue;
            }
            $sureTypeUnion[$exprString] = [$exprNode, \PHPStan\Type\TypeCombinator::intersect($type, $other->sureTypes[$exprString][1])];
        }
        foreach ($this->sureNotTypes as $exprString => [$exprNode, $type]) {
            if (!isset($other->sureNotTypes[$exprString])) {
                continue;
            }
            $sureNotTypeUnion[$exprString] = [$exprNode, \PHPStan\Type\TypeCombinator::union($type, $other->sureNotTypes[$exprString][1])];
        }
        return new self($sureTypeUnion, $sureNotTypeUnion);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Analyser;

use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\ConstantReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\PropertyReflection;
class OutOfClassScope implements \PHPStan\Reflection\ClassMemberAccessAnswerer
{
    public function isInClass() : bool
    {
        return \false;
    }
    public function getClassReflection() : ?\PHPStan\Reflection\ClassReflection
    {
        return null;
    }
    public function canAccessProperty(\PHPStan\Reflection\PropertyReflection $propertyReflection) : bool
    {
        return $propertyReflection->isPublic();
    }
    public function canCallMethod(\PHPStan\Reflection\MethodReflection $methodReflection) : bool
    {
        return $methodReflection->isPublic();
    }
    public function canAccessConstant(\PHPStan\Reflection\ConstantReflection $constantReflection) : bool
    {
        return $constantReflection->isPublic();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Analyser;

use PhpParser\PrettyPrinter\Standard;
use PHPStan\Broker\Broker;
use PHPStan\Broker\BrokerFactory;
use PHPStan\DependencyInjection\Container;
class TypeSpecifierFactory
{
    public const FUNCTION_TYPE_SPECIFYING_EXTENSION_TAG = 'phpstan.typeSpecifier.functionTypeSpecifyingExtension';
    public const METHOD_TYPE_SPECIFYING_EXTENSION_TAG = 'phpstan.typeSpecifier.methodTypeSpecifyingExtension';
    public const STATIC_METHOD_TYPE_SPECIFYING_EXTENSION_TAG = 'phpstan.typeSpecifier.staticMethodTypeSpecifyingExtension';
    /** @var \PHPStan\DependencyInjection\Container */
    private $container;
    public function __construct(\PHPStan\DependencyInjection\Container $container)
    {
        $this->container = $container;
    }
    public function create() : \PHPStan\Analyser\TypeSpecifier
    {
        $typeSpecifier = new \PHPStan\Analyser\TypeSpecifier($this->container->getByType(\PhpParser\PrettyPrinter\Standard::class), $this->container->getByType(\PHPStan\Broker\Broker::class), $this->container->getServicesByTag(self::FUNCTION_TYPE_SPECIFYING_EXTENSION_TAG), $this->container->getServicesByTag(self::METHOD_TYPE_SPECIFYING_EXTENSION_TAG), $this->container->getServicesByTag(self::STATIC_METHOD_TYPE_SPECIFYING_EXTENSION_TAG));
        foreach (\array_merge($this->container->getServicesByTag(\PHPStan\Broker\BrokerFactory::PROPERTIES_CLASS_REFLECTION_EXTENSION_TAG), $this->container->getServicesByTag(\PHPStan\Broker\BrokerFactory::METHODS_CLASS_REFLECTION_EXTENSION_TAG), $this->container->getServicesByTag(\PHPStan\Broker\BrokerFactory::DYNAMIC_METHOD_RETURN_TYPE_EXTENSION_TAG), $this->container->getServicesByTag(\PHPStan\Broker\BrokerFactory::DYNAMIC_STATIC_METHOD_RETURN_TYPE_EXTENSION_TAG), $this->container->getServicesByTag(\PHPStan\Broker\BrokerFactory::DYNAMIC_FUNCTION_RETURN_TYPE_EXTENSION_TAG)) as $extension) {
            if (!$extension instanceof \PHPStan\Analyser\TypeSpecifierAwareExtension) {
                continue;
            }
            $extension->setTypeSpecifier($typeSpecifier);
        }
        return $typeSpecifier;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Analyser;

use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\Array_;
use PhpParser\Node\Expr\BinaryOp;
use PhpParser\Node\Expr\Cast\Bool_;
use PhpParser\Node\Expr\Cast\Double;
use PhpParser\Node\Expr\Cast\Int_;
use PhpParser\Node\Expr\Cast\Object_;
use PhpParser\Node\Expr\Cast\Unset_;
use PhpParser\Node\Expr\ConstFetch;
use PhpParser\Node\Expr\FuncCall;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Expr\New_;
use PhpParser\Node\Expr\PropertyFetch;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Name;
use PhpParser\Node\Scalar\DNumber;
use PhpParser\Node\Scalar\EncapsedStringPart;
use PhpParser\Node\Scalar\LNumber;
use PhpParser\Node\Scalar\String_;
use PHPStan\Broker\Broker;
use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\Reflection\ClassMemberReflection;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\ConstantReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\Native\NativeParameterReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Reflection\PassedByReference;
use PHPStan\Reflection\Php\PhpFunctionFromParserNodeReflection;
use PHPStan\Reflection\Php\PhpMethodFromParserNodeReflection;
use PHPStan\Reflection\PropertyReflection;
use PHPStan\TrinaryLogic;
use PHPStan\Type\ArrayType;
use PHPStan\Type\BenevolentUnionType;
use PHPStan\Type\BooleanType;
use PHPStan\Type\CallableType;
use PHPStan\Type\ClosureType;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantArrayTypeBuilder;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantFloatType;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\ConstantScalarType;
use PHPStan\Type\ConstantType;
use PHPStan\Type\ErrorType;
use PHPStan\Type\FloatType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\IterableType;
use PHPStan\Type\MixedType;
use PHPStan\Type\NeverType;
use PHPStan\Type\NonexistentParentClassType;
use PHPStan\Type\NullType;
use PHPStan\Type\ObjectType;
use PHPStan\Type\ObjectWithoutClassType;
use PHPStan\Type\StaticResolvableType;
use PHPStan\Type\StaticType;
use PHPStan\Type\StringType;
use PHPStan\Type\ThisType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
use PHPStan\Type\TypeWithClassName;
use PHPStan\Type\UnionType;
use PHPStan\Type\VerbosityLevel;
use PHPStan\Type\VoidType;
class Scope implements \PHPStan\Reflection\ClassMemberAccessAnswerer
{
    private const OPERATOR_SIGIL_MAP = [\PhpParser\Node\Expr\AssignOp\Plus::class => '+', \PhpParser\Node\Expr\AssignOp\Minus::class => '-', \PhpParser\Node\Expr\AssignOp\Mul::class => '*', \PhpParser\Node\Expr\AssignOp\Pow::class => '^', \PhpParser\Node\Expr\AssignOp\Div::class => '/'];
    /** @var \PHPStan\Analyser\ScopeFactory */
    private $scopeFactory;
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PhpParser\PrettyPrinter\Standard */
    private $printer;
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    /** @var \PHPStan\Analyser\ScopeContext */
    private $context;
    /** @var \PHPStan\Type\Type[] */
    private $resolvedTypes = [];
    /** @var bool */
    private $declareStrictTypes;
    /** @var \PHPStan\Reflection\FunctionReflection|MethodReflection|null */
    private $function;
    /** @var string|null */
    private $namespace;
    /** @var \PHPStan\Analyser\VariableTypeHolder[] */
    private $variableTypes;
    /** @var \PHPStan\Analyser\VariableTypeHolder[] */
    private $moreSpecificTypes;
    /** @var string|null */
    private $inClosureBindScopeClass;
    /** @var \PHPStan\Type\Type|null */
    private $inAnonymousFunctionReturnType;
    /** @var \PhpParser\Node\Expr\FuncCall|\PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall|null */
    private $inFunctionCall;
    /** @var bool */
    private $negated;
    /** @var bool */
    private $inFirstLevelStatement;
    /** @var array<string, true> */
    private $currentlyAssignedExpressions = [];
    /** @var string[] */
    private $dynamicConstantNames;
    /**
     * @param  \PHPStan\Analyser\ScopeFactory $scopeFactory
     * @param \PHPStan\Broker\Broker $broker
     * @param \PhpParser\PrettyPrinter\Standard $printer
     * @param \PHPStan\Analyser\TypeSpecifier $typeSpecifier
     * @param \PHPStan\Analyser\ScopeContext $context
     * @param bool $declareStrictTypes
     * @param \PHPStan\Reflection\FunctionReflection|MethodReflection|null $function
     * @param string|null $namespace
     * @param \PHPStan\Analyser\VariableTypeHolder[] $variablesTypes
     * @param \PHPStan\Analyser\VariableTypeHolder[] $moreSpecificTypes
     * @param string|null $inClosureBindScopeClass
     * @param \PHPStan\Type\Type|null $inAnonymousFunctionReturnType
     * @param \PhpParser\Node\Expr\FuncCall|\PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall|null $inFunctionCall
     * @param bool $negated
     * @param bool $inFirstLevelStatement
     * @param array<string, true> $currentlyAssignedExpressions
     * @param string[] $dynamicConstantNames
     */
    public function __construct(\PHPStan\Analyser\ScopeFactory $scopeFactory, \PHPStan\Broker\Broker $broker, \PhpParser\PrettyPrinter\Standard $printer, \PHPStan\Analyser\TypeSpecifier $typeSpecifier, \PHPStan\Analyser\ScopeContext $context, bool $declareStrictTypes = \false, $function = null, ?string $namespace = null, array $variablesTypes = [], array $moreSpecificTypes = [], ?string $inClosureBindScopeClass = null, ?\PHPStan\Type\Type $inAnonymousFunctionReturnType = null, ?\PhpParser\Node\Expr $inFunctionCall = null, bool $negated = \false, bool $inFirstLevelStatement = \true, array $currentlyAssignedExpressions = [], array $dynamicConstantNames = [])
    {
        if ($namespace === '') {
            $namespace = null;
        }
        $this->scopeFactory = $scopeFactory;
        $this->broker = $broker;
        $this->printer = $printer;
        $this->typeSpecifier = $typeSpecifier;
        $this->context = $context;
        $this->declareStrictTypes = $declareStrictTypes;
        $this->function = $function;
        $this->namespace = $namespace;
        $this->variableTypes = $variablesTypes;
        $this->moreSpecificTypes = $moreSpecificTypes;
        $this->inClosureBindScopeClass = $inClosureBindScopeClass;
        $this->inAnonymousFunctionReturnType = $inAnonymousFunctionReturnType;
        $this->inFunctionCall = $inFunctionCall;
        $this->negated = $negated;
        $this->inFirstLevelStatement = $inFirstLevelStatement;
        $this->currentlyAssignedExpressions = $currentlyAssignedExpressions;
        $this->dynamicConstantNames = $dynamicConstantNames;
    }
    public function getFile() : string
    {
        return $this->context->getFile();
    }
    public function getFileDescription() : string
    {
        if ($this->context->getTraitReflection() === null) {
            return $this->getFile();
        }
        /** @var ClassReflection $classReflection */
        $classReflection = $this->context->getClassReflection();
        $className = \sprintf('class %s', $classReflection->getDisplayName());
        if ($classReflection->isAnonymous()) {
            $className = 'anonymous class';
        }
        $traitReflection = $this->context->getTraitReflection();
        if ($traitReflection->getFileName() === \false) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return \sprintf('%s (in context of %s)', $traitReflection->getFileName(), $className);
    }
    public function isDeclareStrictTypes() : bool
    {
        return $this->declareStrictTypes;
    }
    public function enterDeclareStrictTypes() : self
    {
        return $this->scopeFactory->create($this->context, \true);
    }
    public function isInClass() : bool
    {
        return $this->context->getClassReflection() !== null;
    }
    public function isInTrait() : bool
    {
        return $this->context->getTraitReflection() !== null;
    }
    public function getClassReflection() : ?\PHPStan\Reflection\ClassReflection
    {
        return $this->context->getClassReflection();
    }
    public function getTraitReflection() : ?\PHPStan\Reflection\ClassReflection
    {
        return $this->context->getTraitReflection();
    }
    /**
     * @return \PHPStan\Reflection\FunctionReflection|\PHPStan\Reflection\MethodReflection|null
     */
    public function getFunction()
    {
        return $this->function;
    }
    public function getFunctionName() : ?string
    {
        return $this->function !== null ? $this->function->getName() : null;
    }
    public function getNamespace() : ?string
    {
        return $this->namespace;
    }
    /**
     * @return array<string, \PHPStan\Analyser\VariableTypeHolder>
     */
    private function getVariableTypes() : array
    {
        return $this->variableTypes;
    }
    public function hasVariableType(string $variableName) : \PHPStan\TrinaryLogic
    {
        if ($this->isGlobalVariable($variableName)) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        if (!isset($this->variableTypes[$variableName])) {
            return \PHPStan\TrinaryLogic::createNo();
        }
        return $this->variableTypes[$variableName]->getCertainty();
    }
    public function getVariableType(string $variableName) : \PHPStan\Type\Type
    {
        if ($this->isGlobalVariable($variableName)) {
            return new \PHPStan\Type\ArrayType(new \PHPStan\Type\StringType(), new \PHPStan\Type\MixedType());
        }
        if ($this->hasVariableType($variableName)->no()) {
            throw new \PHPStan\Analyser\UndefinedVariableException($this, $variableName);
        }
        return $this->variableTypes[$variableName]->getType();
    }
    private function isGlobalVariable(string $variableName) : bool
    {
        return \in_array($variableName, ['GLOBALS', '_SERVER', '_GET', '_POST', '_FILES', '_COOKIE', '_SESSION', '_REQUEST', '_ENV'], \true);
    }
    public function hasConstant(\PhpParser\Node\Name $name) : bool
    {
        $node = new \PhpParser\Node\Expr\ConstFetch(new \PhpParser\Node\Name\FullyQualified($name->toString()));
        if ($this->isSpecified($node)) {
            return \true;
        }
        return $this->broker->hasConstant($name, $this);
    }
    public function isInAnonymousFunction() : bool
    {
        return $this->inAnonymousFunctionReturnType !== null;
    }
    public function getAnonymousFunctionReturnType() : ?\PHPStan\Type\Type
    {
        return $this->inAnonymousFunctionReturnType;
    }
    /**
     * @return \PhpParser\Node\Expr\FuncCall|\PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall|null
     */
    public function getInFunctionCall()
    {
        return $this->inFunctionCall;
    }
    public function getType(\PhpParser\Node\Expr $node) : \PHPStan\Type\Type
    {
        $key = $this->printer->prettyPrintExpr($node);
        if (!\array_key_exists($key, $this->resolvedTypes)) {
            $this->resolvedTypes[$key] = $this->resolveType($node);
        }
        return $this->resolvedTypes[$key];
    }
    private function resolveType(\PhpParser\Node\Expr $node) : \PHPStan\Type\Type
    {
        if ($node instanceof \PhpParser\Node\Expr\Exit_) {
            return new \PHPStan\Type\NeverType();
        }
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\Greater || $node instanceof \PhpParser\Node\Expr\BinaryOp\GreaterOrEqual || $node instanceof \PhpParser\Node\Expr\BinaryOp\Smaller || $node instanceof \PhpParser\Node\Expr\BinaryOp\SmallerOrEqual || $node instanceof \PhpParser\Node\Expr\BinaryOp\Equal || $node instanceof \PhpParser\Node\Expr\BinaryOp\NotEqual || $node instanceof \PhpParser\Node\Expr\Empty_) {
            return new \PHPStan\Type\BooleanType();
        }
        if ($node instanceof \PhpParser\Node\Expr\Isset_) {
            $result = new \PHPStan\Type\Constant\ConstantBooleanType(\true);
            foreach ($node->vars as $var) {
                if ($var instanceof \PhpParser\Node\Expr\ArrayDimFetch && $var->dim !== null) {
                    $hasOffset = $this->getType($var->var)->hasOffsetValueType($this->getType($var->dim))->toBooleanType();
                    if ($hasOffset instanceof \PHPStan\Type\Constant\ConstantBooleanType) {
                        if (!$hasOffset->getValue()) {
                            return $hasOffset;
                        }
                        continue;
                    }
                    $result = $hasOffset;
                    continue;
                }
                if ($var instanceof \PhpParser\Node\Expr\Variable && \is_string($var->name)) {
                    $variableType = $this->resolveType($var);
                    $isNullSuperType = (new \PHPStan\Type\NullType())->isSuperTypeOf($variableType);
                    $has = $this->hasVariableType($var->name);
                    if ($has->no() || $isNullSuperType->yes()) {
                        return new \PHPStan\Type\Constant\ConstantBooleanType(\false);
                    }
                    if ($has->maybe() || !$isNullSuperType->no()) {
                        $result = new \PHPStan\Type\BooleanType();
                    }
                    continue;
                }
                return new \PHPStan\Type\BooleanType();
            }
            return $result;
        }
        if ($node instanceof \PhpParser\Node\Expr\BooleanNot) {
            $exprBooleanType = $this->getType($node->expr)->toBoolean();
            if ($exprBooleanType instanceof \PHPStan\Type\Constant\ConstantBooleanType) {
                return new \PHPStan\Type\Constant\ConstantBooleanType(!$exprBooleanType->getValue());
            }
            return new \PHPStan\Type\BooleanType();
        }
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\BooleanAnd || $node instanceof \PhpParser\Node\Expr\BinaryOp\LogicalAnd) {
            $leftBooleanType = $this->getType($node->left)->toBoolean();
            if ($leftBooleanType instanceof \PHPStan\Type\Constant\ConstantBooleanType && !$leftBooleanType->getValue()) {
                return new \PHPStan\Type\Constant\ConstantBooleanType(\false);
            }
            $rightBooleanType = $this->filterByTruthyValue($node->left)->getType($node->right)->toBoolean();
            if ($rightBooleanType instanceof \PHPStan\Type\Constant\ConstantBooleanType && !$rightBooleanType->getValue()) {
                return new \PHPStan\Type\Constant\ConstantBooleanType(\false);
            }
            if ($leftBooleanType instanceof \PHPStan\Type\Constant\ConstantBooleanType && $leftBooleanType->getValue() && $rightBooleanType instanceof \PHPStan\Type\Constant\ConstantBooleanType && $rightBooleanType->getValue()) {
                return new \PHPStan\Type\Constant\ConstantBooleanType(\true);
            }
            return new \PHPStan\Type\BooleanType();
        }
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\BooleanOr || $node instanceof \PhpParser\Node\Expr\BinaryOp\LogicalOr) {
            $leftBooleanType = $this->getType($node->left)->toBoolean();
            if ($leftBooleanType instanceof \PHPStan\Type\Constant\ConstantBooleanType && $leftBooleanType->getValue()) {
                return new \PHPStan\Type\Constant\ConstantBooleanType(\true);
            }
            $rightBooleanType = $this->filterByFalseyValue($node->left)->getType($node->right)->toBoolean();
            if ($rightBooleanType instanceof \PHPStan\Type\Constant\ConstantBooleanType && $rightBooleanType->getValue()) {
                return new \PHPStan\Type\Constant\ConstantBooleanType(\true);
            }
            if ($leftBooleanType instanceof \PHPStan\Type\Constant\ConstantBooleanType && !$leftBooleanType->getValue() && $rightBooleanType instanceof \PHPStan\Type\Constant\ConstantBooleanType && !$rightBooleanType->getValue()) {
                return new \PHPStan\Type\Constant\ConstantBooleanType(\false);
            }
            return new \PHPStan\Type\BooleanType();
        }
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\LogicalXor) {
            $leftBooleanType = $this->getType($node->left)->toBoolean();
            $rightBooleanType = $this->filterByFalseyValue($node->left)->getType($node->right)->toBoolean();
            if ($leftBooleanType instanceof \PHPStan\Type\Constant\ConstantBooleanType && $rightBooleanType instanceof \PHPStan\Type\Constant\ConstantBooleanType) {
                return new \PHPStan\Type\Constant\ConstantBooleanType($leftBooleanType->getValue() xor $rightBooleanType->getValue());
            }
            return new \PHPStan\Type\BooleanType();
        }
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\Identical) {
            $leftType = $this->getType($node->left);
            $rightType = $this->getType($node->right);
            if (($node->left instanceof \PhpParser\Node\Expr\PropertyFetch || $node->left instanceof \PhpParser\Node\Expr\StaticPropertyFetch) && $rightType instanceof \PHPStan\Type\NullType) {
                return new \PHPStan\Type\BooleanType();
            }
            if (($node->right instanceof \PhpParser\Node\Expr\PropertyFetch || $node->right instanceof \PhpParser\Node\Expr\StaticPropertyFetch) && $leftType instanceof \PHPStan\Type\NullType) {
                return new \PHPStan\Type\BooleanType();
            }
            $isSuperset = $leftType->isSuperTypeOf($rightType);
            if ($isSuperset->no()) {
                return new \PHPStan\Type\Constant\ConstantBooleanType(\false);
            } elseif ($isSuperset->yes() && $leftType instanceof \PHPStan\Type\ConstantScalarType && $rightType instanceof \PHPStan\Type\ConstantScalarType && $leftType->getValue() === $rightType->getValue()) {
                return new \PHPStan\Type\Constant\ConstantBooleanType(\true);
            }
            return new \PHPStan\Type\BooleanType();
        }
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\NotIdentical) {
            $leftType = $this->getType($node->left);
            $rightType = $this->getType($node->right);
            if (($node->left instanceof \PhpParser\Node\Expr\PropertyFetch || $node->left instanceof \PhpParser\Node\Expr\StaticPropertyFetch) && $rightType instanceof \PHPStan\Type\NullType) {
                return new \PHPStan\Type\BooleanType();
            }
            if (($node->right instanceof \PhpParser\Node\Expr\PropertyFetch || $node->right instanceof \PhpParser\Node\Expr\StaticPropertyFetch) && $leftType instanceof \PHPStan\Type\NullType) {
                return new \PHPStan\Type\BooleanType();
            }
            $isSuperset = $leftType->isSuperTypeOf($rightType);
            if ($isSuperset->no()) {
                return new \PHPStan\Type\Constant\ConstantBooleanType(\true);
            } elseif ($isSuperset->yes() && $leftType instanceof \PHPStan\Type\ConstantScalarType && $rightType instanceof \PHPStan\Type\ConstantScalarType && $leftType->getValue() === $rightType->getValue()) {
                return new \PHPStan\Type\Constant\ConstantBooleanType(\false);
            }
            return new \PHPStan\Type\BooleanType();
        }
        if ($node instanceof \PhpParser\Node\Expr\Instanceof_) {
            if ($node->class instanceof \PhpParser\Node\Name) {
                $className = $this->resolveName($node->class);
                $type = new \PHPStan\Type\ObjectType($className);
            } else {
                $type = $this->getType($node->class);
            }
            $expressionType = $this->getType($node->expr);
            if ($this->isInTrait() && \PHPStan\Type\TypeUtils::findThisType($expressionType) !== null) {
                return new \PHPStan\Type\BooleanType();
            }
            if ($expressionType instanceof \PHPStan\Type\NeverType) {
                return new \PHPStan\Type\Constant\ConstantBooleanType(\false);
            }
            $isExpressionObject = (new \PHPStan\Type\ObjectWithoutClassType())->isSuperTypeOf($expressionType);
            if (!$isExpressionObject->no() && !(new \PHPStan\Type\StringType())->isSuperTypeOf($type)->no()) {
                return new \PHPStan\Type\BooleanType();
            }
            $isSuperType = $type->isSuperTypeOf($expressionType)->and($isExpressionObject);
            if ($isSuperType->no()) {
                return new \PHPStan\Type\Constant\ConstantBooleanType(\false);
            } elseif ($isSuperType->yes()) {
                return new \PHPStan\Type\Constant\ConstantBooleanType(\true);
            }
            return new \PHPStan\Type\BooleanType();
        }
        if ($node instanceof \PhpParser\Node\Expr\UnaryPlus) {
            return $this->getType($node->expr)->toNumber();
        }
        if ($node instanceof \PhpParser\Node\Expr\ErrorSuppress || $node instanceof \PhpParser\Node\Expr\Assign) {
            return $this->getType($node->expr);
        }
        if ($node instanceof \PhpParser\Node\Expr\UnaryMinus) {
            $type = $this->getType($node->expr)->toNumber();
            $scalarValues = \PHPStan\Type\TypeUtils::getConstantScalars($type);
            if (\count($scalarValues) > 0) {
                $newTypes = [];
                foreach ($scalarValues as $scalarValue) {
                    if ($scalarValue instanceof \PHPStan\Type\Constant\ConstantIntegerType) {
                        $newTypes[] = new \PHPStan\Type\Constant\ConstantIntegerType(-$scalarValue->getValue());
                    } elseif ($scalarValue instanceof \PHPStan\Type\Constant\ConstantFloatType) {
                        $newTypes[] = new \PHPStan\Type\Constant\ConstantFloatType(-$scalarValue->getValue());
                    }
                }
                return \PHPStan\Type\TypeCombinator::union(...$newTypes);
            }
            return $type;
        }
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\Concat || $node instanceof \PhpParser\Node\Expr\AssignOp\Concat) {
            if ($node instanceof \PhpParser\Node\Expr\AssignOp) {
                $left = $node->var;
                $right = $node->expr;
            } else {
                $left = $node->left;
                $right = $node->right;
            }
            $leftStringType = $this->getType($left)->toString();
            $rightStringType = $this->getType($right)->toString();
            if (\PHPStan\Type\TypeCombinator::union($leftStringType, $rightStringType) instanceof \PHPStan\Type\ErrorType) {
                return new \PHPStan\Type\ErrorType();
            }
            if ($leftStringType instanceof \PHPStan\Type\Constant\ConstantStringType && $rightStringType instanceof \PHPStan\Type\Constant\ConstantStringType) {
                return $leftStringType->append($rightStringType);
            }
            return new \PHPStan\Type\StringType();
        }
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\Div || $node instanceof \PhpParser\Node\Expr\AssignOp\Div || $node instanceof \PhpParser\Node\Expr\BinaryOp\Mod || $node instanceof \PhpParser\Node\Expr\AssignOp\Mod) {
            if ($node instanceof \PhpParser\Node\Expr\AssignOp) {
                $right = $node->expr;
            } else {
                $right = $node->right;
            }
            $rightTypes = \PHPStan\Type\TypeUtils::getConstantScalars($this->getType($right)->toNumber());
            foreach ($rightTypes as $rightType) {
                if ($rightType->getValue() === 0 || $rightType->getValue() === 0.0) {
                    return new \PHPStan\Type\ErrorType();
                }
            }
        }
        if (($node instanceof \PhpParser\Node\Expr\BinaryOp || $node instanceof \PhpParser\Node\Expr\AssignOp) && !$node instanceof \PhpParser\Node\Expr\BinaryOp\Coalesce) {
            if ($node instanceof \PhpParser\Node\Expr\AssignOp) {
                $left = $node->var;
                $right = $node->expr;
            } else {
                $left = $node->left;
                $right = $node->right;
            }
            $leftTypes = \PHPStan\Type\TypeUtils::getConstantScalars($this->getType($left));
            $rightTypes = \PHPStan\Type\TypeUtils::getConstantScalars($this->getType($right));
            if (\count($leftTypes) > 0 && \count($rightTypes) > 0) {
                $resultTypes = [];
                foreach ($leftTypes as $leftType) {
                    foreach ($rightTypes as $rightType) {
                        $resultTypes[] = $this->calculateFromScalars($node, $leftType, $rightType);
                    }
                }
                return \PHPStan\Type\TypeCombinator::union(...$resultTypes);
            }
        }
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\Mod || $node instanceof \PhpParser\Node\Expr\AssignOp\Mod) {
            return new \PHPStan\Type\IntegerType();
        }
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\Spaceship) {
            return new \PHPStan\Type\IntegerType();
        }
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\Coalesce) {
            if ($node->left instanceof \PhpParser\Node\Expr\ArrayDimFetch && $node->left->dim !== null) {
                $dimType = $this->getType($node->left->dim);
                $varType = $this->getType($node->left->var);
                $hasOffset = $varType->hasOffsetValueType($dimType);
                $leftType = $this->getType($node->left);
                $rightType = $this->getType($node->right);
                if ($hasOffset->no()) {
                    return $rightType;
                } elseif ($hasOffset->yes()) {
                    $offsetValueType = $varType->getOffsetValueType($dimType);
                    if ($offsetValueType->isSuperTypeOf(new \PHPStan\Type\NullType())->no()) {
                        return \PHPStan\Type\TypeCombinator::removeNull($leftType);
                    }
                }
                return \PHPStan\Type\TypeCombinator::union(\PHPStan\Type\TypeCombinator::removeNull($leftType), $rightType);
            }
            $leftType = $this->getType($node->left);
            $rightType = $this->getType($node->right);
            if ($leftType instanceof \PHPStan\Type\ErrorType || $leftType instanceof \PHPStan\Type\NullType) {
                return $rightType;
            }
            if (\PHPStan\Type\TypeCombinator::containsNull($leftType) || $node->left instanceof \PhpParser\Node\Expr\PropertyFetch) {
                return \PHPStan\Type\TypeCombinator::union(\PHPStan\Type\TypeCombinator::removeNull($leftType), $rightType);
            }
            return \PHPStan\Type\TypeCombinator::removeNull($leftType);
        }
        if ($node instanceof \PhpParser\Node\Expr\Clone_) {
            return $this->getType($node->expr);
        }
        if ($node instanceof \PhpParser\Node\Expr\AssignOp\ShiftLeft || $node instanceof \PhpParser\Node\Expr\BinaryOp\ShiftLeft || $node instanceof \PhpParser\Node\Expr\AssignOp\ShiftRight || $node instanceof \PhpParser\Node\Expr\BinaryOp\ShiftRight) {
            if ($node instanceof \PhpParser\Node\Expr\AssignOp) {
                $left = $node->var;
                $right = $node->expr;
            } else {
                $left = $node->left;
                $right = $node->right;
            }
            if (\PHPStan\Type\TypeCombinator::union($this->getType($left)->toNumber(), $this->getType($right)->toNumber()) instanceof \PHPStan\Type\ErrorType) {
                return new \PHPStan\Type\ErrorType();
            }
            return new \PHPStan\Type\IntegerType();
        }
        if ($node instanceof \PhpParser\Node\Expr\AssignOp\BitwiseAnd || $node instanceof \PhpParser\Node\Expr\BinaryOp\BitwiseAnd || $node instanceof \PhpParser\Node\Expr\AssignOp\BitwiseOr || $node instanceof \PhpParser\Node\Expr\BinaryOp\BitwiseOr || $node instanceof \PhpParser\Node\Expr\AssignOp\BitwiseXor || $node instanceof \PhpParser\Node\Expr\BinaryOp\BitwiseXor) {
            if ($node instanceof \PhpParser\Node\Expr\AssignOp) {
                $left = $node->var;
                $right = $node->expr;
            } else {
                $left = $node->left;
                $right = $node->right;
            }
            $leftType = $this->getType($left);
            $rightType = $this->getType($right);
            $stringType = new \PHPStan\Type\StringType();
            if ($stringType->isSuperTypeOf($leftType)->yes() && $stringType->isSuperTypeOf($rightType)->yes()) {
                return $stringType;
            }
            if (\PHPStan\Type\TypeCombinator::union($leftType->toNumber(), $rightType->toNumber()) instanceof \PHPStan\Type\ErrorType) {
                return new \PHPStan\Type\ErrorType();
            }
            return new \PHPStan\Type\IntegerType();
        }
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\Plus || $node instanceof \PhpParser\Node\Expr\BinaryOp\Minus || $node instanceof \PhpParser\Node\Expr\BinaryOp\Mul || $node instanceof \PhpParser\Node\Expr\BinaryOp\Pow || $node instanceof \PhpParser\Node\Expr\BinaryOp\Div || $node instanceof \PhpParser\Node\Expr\AssignOp\Plus || $node instanceof \PhpParser\Node\Expr\AssignOp\Minus || $node instanceof \PhpParser\Node\Expr\AssignOp\Mul || $node instanceof \PhpParser\Node\Expr\AssignOp\Pow || $node instanceof \PhpParser\Node\Expr\AssignOp\Div) {
            if ($node instanceof \PhpParser\Node\Expr\AssignOp) {
                $left = $node->var;
                $right = $node->expr;
            } else {
                $left = $node->left;
                $right = $node->right;
            }
            $leftType = $this->getType($left);
            $rightType = $this->getType($right);
            $operatorSigil = null;
            if ($node instanceof \PhpParser\Node\Expr\BinaryOp) {
                $operatorSigil = $node->getOperatorSigil();
            }
            if ($operatorSigil === null) {
                $operatorSigil = self::OPERATOR_SIGIL_MAP[\get_class($node)] ?? null;
            }
            if ($operatorSigil !== null) {
                $operatorTypeSpecifyingExtensions = $this->broker->getOperatorTypeSpecifyingExtensions($operatorSigil, $leftType, $rightType);
                /** @var Type[] $extensionTypes */
                $extensionTypes = [];
                foreach ($operatorTypeSpecifyingExtensions as $extension) {
                    $extensionTypes[] = $extension->specifyType($operatorSigil, $leftType, $rightType);
                }
                if (\count($extensionTypes) > 0) {
                    return \PHPStan\Type\TypeCombinator::union(...$extensionTypes);
                }
            }
            if ($node instanceof \PhpParser\Node\Expr\AssignOp\Plus || $node instanceof \PhpParser\Node\Expr\BinaryOp\Plus) {
                $leftConstantArrays = \PHPStan\Type\TypeUtils::getConstantArrays($leftType);
                $rightConstantArrays = \PHPStan\Type\TypeUtils::getConstantArrays($rightType);
                if (\count($leftConstantArrays) > 0 && \count($rightConstantArrays) > 0) {
                    $resultTypes = [];
                    foreach ($rightConstantArrays as $rightConstantArray) {
                        foreach ($leftConstantArrays as $leftConstantArray) {
                            $newArrayBuilder = \PHPStan\Type\Constant\ConstantArrayTypeBuilder::createFromConstantArray($rightConstantArray);
                            foreach ($leftConstantArray->getKeyTypes() as $leftKeyType) {
                                $newArrayBuilder->setOffsetValueType($leftKeyType, $leftConstantArray->getOffsetValueType($leftKeyType));
                            }
                            $resultTypes[] = $newArrayBuilder->getArray();
                        }
                    }
                    return \PHPStan\Type\TypeCombinator::union(...$resultTypes);
                }
                $arrayType = new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType());
                if ($arrayType->isSuperTypeOf($leftType)->yes() && $arrayType->isSuperTypeOf($rightType)->yes()) {
                    if ($leftType->getIterableKeyType()->equals($rightType->getIterableKeyType())) {
                        // to preserve BenevolentUnionType
                        $keyType = $leftType->getIterableKeyType();
                    } else {
                        $keyTypes = [];
                        foreach ([$leftType->getIterableKeyType(), $rightType->getIterableKeyType()] as $keyType) {
                            if ($keyType instanceof \PHPStan\Type\BenevolentUnionType) {
                                $keyTypes[] = new \PHPStan\Type\MixedType();
                                continue;
                            }
                            $keyTypes[] = $keyType;
                        }
                        $keyType = \PHPStan\Type\TypeCombinator::union(...$keyTypes);
                    }
                    return new \PHPStan\Type\ArrayType($keyType, \PHPStan\Type\TypeCombinator::union($leftType->getIterableValueType(), $rightType->getIterableValueType()));
                }
                if ($leftType instanceof \PHPStan\Type\MixedType && $rightType instanceof \PHPStan\Type\MixedType) {
                    return new \PHPStan\Type\BenevolentUnionType([new \PHPStan\Type\FloatType(), new \PHPStan\Type\IntegerType(), new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType())]);
                }
            }
            $types = \PHPStan\Type\TypeCombinator::union($leftType, $rightType);
            if ($leftType instanceof \PHPStan\Type\ArrayType || $rightType instanceof \PHPStan\Type\ArrayType || $types instanceof \PHPStan\Type\ArrayType) {
                return new \PHPStan\Type\ErrorType();
            }
            $leftNumberType = $leftType->toNumber();
            $rightNumberType = $rightType->toNumber();
            if ((new \PHPStan\Type\FloatType())->isSuperTypeOf($leftNumberType)->yes() || (new \PHPStan\Type\FloatType())->isSuperTypeOf($rightNumberType)->yes()) {
                return new \PHPStan\Type\FloatType();
            }
            if ($node instanceof \PhpParser\Node\Expr\AssignOp\Pow || $node instanceof \PhpParser\Node\Expr\BinaryOp\Pow) {
                return new \PHPStan\Type\BenevolentUnionType([new \PHPStan\Type\FloatType(), new \PHPStan\Type\IntegerType()]);
            }
            $resultType = \PHPStan\Type\TypeCombinator::union($leftNumberType, $rightNumberType);
            if ($node instanceof \PhpParser\Node\Expr\AssignOp\Div || $node instanceof \PhpParser\Node\Expr\BinaryOp\Div) {
                if ($types instanceof \PHPStan\Type\MixedType || $resultType instanceof \PHPStan\Type\IntegerType) {
                    return new \PHPStan\Type\BenevolentUnionType([new \PHPStan\Type\IntegerType(), new \PHPStan\Type\FloatType()]);
                }
                return new \PHPStan\Type\UnionType([new \PHPStan\Type\IntegerType(), new \PHPStan\Type\FloatType()]);
            }
            if ($types instanceof \PHPStan\Type\MixedType) {
                return \PHPStan\Type\TypeUtils::toBenevolentUnion($resultType);
            }
            return $resultType;
        }
        if ($node instanceof \PhpParser\Node\Scalar\LNumber) {
            return new \PHPStan\Type\Constant\ConstantIntegerType($node->value);
        } elseif ($node instanceof \PhpParser\Node\Scalar\String_) {
            return new \PHPStan\Type\Constant\ConstantStringType($node->value);
        } elseif ($node instanceof \PhpParser\Node\Scalar\Encapsed) {
            $constantString = new \PHPStan\Type\Constant\ConstantStringType('');
            foreach ($node->parts as $part) {
                if ($part instanceof \PhpParser\Node\Scalar\EncapsedStringPart) {
                    $partStringType = new \PHPStan\Type\Constant\ConstantStringType($part->value);
                } else {
                    $partStringType = $this->getType($part)->toString();
                    if ($partStringType instanceof \PHPStan\Type\ErrorType) {
                        return new \PHPStan\Type\ErrorType();
                    }
                    if (!$partStringType instanceof \PHPStan\Type\Constant\ConstantStringType) {
                        return new \PHPStan\Type\StringType();
                    }
                }
                $constantString = $constantString->append($partStringType);
            }
            return $constantString;
        } elseif ($node instanceof \PhpParser\Node\Scalar\DNumber) {
            return new \PHPStan\Type\Constant\ConstantFloatType($node->value);
        } elseif ($node instanceof \PhpParser\Node\Expr\Closure) {
            $parameters = [];
            $isVariadic = \false;
            $firstOptionalParameterIndex = null;
            foreach ($node->params as $i => $param) {
                $isOptionalCandidate = $param->default !== null || $param->variadic;
                if ($isOptionalCandidate) {
                    if ($firstOptionalParameterIndex === null) {
                        $firstOptionalParameterIndex = $i;
                    }
                } else {
                    $firstOptionalParameterIndex = null;
                }
            }
            foreach ($node->params as $i => $param) {
                if ($param->variadic) {
                    $isVariadic = \true;
                }
                if (!$param->var instanceof \PhpParser\Node\Expr\Variable || !\is_string($param->var->name)) {
                    throw new \PHPStan\ShouldNotHappenException();
                }
                $parameters[] = new \PHPStan\Reflection\Native\NativeParameterReflection($param->var->name, $firstOptionalParameterIndex !== null && $i >= $firstOptionalParameterIndex, $this->getFunctionType($param->type, $param->type === null, \false), $param->byRef ? \PHPStan\Reflection\PassedByReference::createCreatesNewVariable() : \PHPStan\Reflection\PassedByReference::createNo(), $param->variadic);
            }
            return new \PHPStan\Type\ClosureType($parameters, $this->getFunctionType($node->returnType, $node->returnType === null, \false), $isVariadic);
        } elseif ($node instanceof \PhpParser\Node\Expr\New_) {
            if ($node->class instanceof \PhpParser\Node\Name) {
                $className = $node->class->toString();
                $lowercasedClassName = \strtolower($className);
                $resolvedClassName = $this->resolveName($node->class);
                if ($this->broker->hasClass($resolvedClassName)) {
                    $classReflection = $this->broker->getClass($resolvedClassName);
                    if ($classReflection->hasConstructor()) {
                        $constructorMethod = $classReflection->getConstructor();
                        $resolvedTypes = [];
                        $methodCall = new \PhpParser\Node\Expr\StaticCall($node->class, new \PhpParser\Node\Identifier($constructorMethod->getName()), $node->args);
                        foreach ($this->broker->getDynamicStaticMethodReturnTypeExtensionsForClass($classReflection->getName()) as $dynamicStaticMethodReturnTypeExtension) {
                            if (!$dynamicStaticMethodReturnTypeExtension->isStaticMethodSupported($constructorMethod)) {
                                continue;
                            }
                            $resolvedTypes[] = $dynamicStaticMethodReturnTypeExtension->getTypeFromStaticMethodCall($constructorMethod, $methodCall, $this);
                        }
                        if (\count($resolvedTypes) > 0) {
                            return \PHPStan\Type\TypeCombinator::union(...$resolvedTypes);
                        }
                    }
                }
                if (\in_array($lowercasedClassName, ['static', 'parent'], \true)) {
                    if (!$this->isInClass()) {
                        throw new \PHPStan\ShouldNotHappenException();
                    }
                    if ($lowercasedClassName === 'static') {
                        return new \PHPStan\Type\StaticType($this->getClassReflection()->getName());
                    }
                    if ($this->getClassReflection()->getParentClass() !== \false) {
                        return new \PHPStan\Type\ObjectType($this->getClassReflection()->getParentClass()->getName());
                    }
                    return new \PHPStan\Type\NonexistentParentClassType();
                }
                return new \PHPStan\Type\ObjectType($resolvedClassName);
            }
            if ($node->class instanceof \PhpParser\Node\Stmt\Class_) {
                $anonymousClassReflection = $this->broker->getAnonymousClassReflection($node->class, $this);
                return new \PHPStan\Type\ObjectType($anonymousClassReflection->getName());
            }
        } elseif ($node instanceof \PhpParser\Node\Expr\Array_) {
            $arrayBuilder = \PHPStan\Type\Constant\ConstantArrayTypeBuilder::createEmpty();
            foreach ($node->items as $arrayItem) {
                if ($arrayItem === null) {
                    continue;
                }
                $arrayBuilder->setOffsetValueType($arrayItem->key !== null ? $this->getType($arrayItem->key) : null, $this->getType($arrayItem->value));
            }
            return $arrayBuilder->getArray();
        } elseif ($node instanceof \PhpParser\Node\Expr\Cast\Int_) {
            return $this->getType($node->expr)->toInteger();
        } elseif ($node instanceof \PhpParser\Node\Expr\Cast\Bool_) {
            return $this->getType($node->expr)->toBoolean();
        } elseif ($node instanceof \PhpParser\Node\Expr\Cast\Double) {
            return $this->getType($node->expr)->toFloat();
        } elseif ($node instanceof \PhpParser\Node\Expr\Cast\String_) {
            return $this->getType($node->expr)->toString();
        } elseif ($node instanceof \PhpParser\Node\Expr\Cast\Array_) {
            return $this->getType($node->expr)->toArray();
        } elseif ($node instanceof \PhpParser\Node\Scalar\MagicConst\Line) {
            return new \PHPStan\Type\Constant\ConstantIntegerType($node->getLine());
        } elseif ($node instanceof \PhpParser\Node\Scalar\MagicConst\Class_) {
            if (!$this->isInClass()) {
                return new \PHPStan\Type\Constant\ConstantStringType('');
            }
            return new \PHPStan\Type\Constant\ConstantStringType($this->getClassReflection()->getName());
        } elseif ($node instanceof \PhpParser\Node\Scalar\MagicConst\Dir) {
            return new \PHPStan\Type\Constant\ConstantStringType(\dirname($this->getFile()));
        } elseif ($node instanceof \PhpParser\Node\Scalar\MagicConst\File) {
            return new \PHPStan\Type\Constant\ConstantStringType($this->getFile());
        } elseif ($node instanceof \PhpParser\Node\Scalar\MagicConst\Namespace_) {
            return new \PHPStan\Type\Constant\ConstantStringType($this->namespace ?? '');
        } elseif ($node instanceof \PhpParser\Node\Scalar\MagicConst\Method) {
            if ($this->isInAnonymousFunction()) {
                return new \PHPStan\Type\Constant\ConstantStringType('{closure}');
            }
            $function = $this->getFunction();
            if ($function === null) {
                return new \PHPStan\Type\Constant\ConstantStringType('');
            }
            if ($function instanceof \PHPStan\Reflection\MethodReflection) {
                return new \PHPStan\Type\Constant\ConstantStringType(\sprintf('%s::%s', $function->getDeclaringClass()->getName(), $function->getName()));
            }
            return new \PHPStan\Type\Constant\ConstantStringType($function->getName());
        } elseif ($node instanceof \PhpParser\Node\Scalar\MagicConst\Function_) {
            if ($this->isInAnonymousFunction()) {
                return new \PHPStan\Type\Constant\ConstantStringType('{closure}');
            }
            $function = $this->getFunction();
            if ($function === null) {
                return new \PHPStan\Type\Constant\ConstantStringType('');
            }
            return new \PHPStan\Type\Constant\ConstantStringType($function->getName());
        } elseif ($node instanceof \PhpParser\Node\Scalar\MagicConst\Trait_) {
            if (!$this->isInTrait()) {
                return new \PHPStan\Type\Constant\ConstantStringType('');
            }
            return new \PHPStan\Type\Constant\ConstantStringType($this->getTraitReflection()->getName());
        } elseif ($node instanceof \PhpParser\Node\Expr\Cast\Object_) {
            $castToObject = static function (\PHPStan\Type\Type $type) : Type {
                if ((new \PHPStan\Type\ObjectWithoutClassType())->isSuperTypeOf($type)->yes()) {
                    return $type;
                }
                return new \PHPStan\Type\ObjectType('stdClass');
            };
            $exprType = $this->getType($node->expr);
            if ($exprType instanceof \PHPStan\Type\UnionType) {
                return \PHPStan\Type\TypeCombinator::union(...\array_map($castToObject, $exprType->getTypes()));
            }
            return $castToObject($exprType);
        } elseif ($node instanceof \PhpParser\Node\Expr\Cast\Unset_) {
            return new \PHPStan\Type\NullType();
        } elseif ($node instanceof \PhpParser\Node\Expr\PostInc || $node instanceof \PhpParser\Node\Expr\PostDec) {
            return $this->getType($node->var);
        } elseif ($node instanceof \PhpParser\Node\Expr\PreInc || $node instanceof \PhpParser\Node\Expr\PreDec) {
            $varType = $this->getType($node->var);
            $varScalars = \PHPStan\Type\TypeUtils::getConstantScalars($varType);
            if (\count($varScalars) > 0) {
                $newTypes = [];
                foreach ($varScalars as $scalar) {
                    $varValue = $scalar->getValue();
                    if ($node instanceof \PhpParser\Node\Expr\PreInc) {
                        ++$varValue;
                    } else {
                        --$varValue;
                    }
                    $newTypes[] = $this->getTypeFromValue($varValue);
                }
                return \PHPStan\Type\TypeCombinator::union(...$newTypes);
            }
            $stringType = new \PHPStan\Type\StringType();
            if ($stringType->isSuperTypeOf($varType)->yes()) {
                return $stringType;
            }
            return $varType->toNumber();
        }
        $exprString = $this->printer->prettyPrintExpr($node);
        if (isset($this->moreSpecificTypes[$exprString]) && $this->moreSpecificTypes[$exprString]->getCertainty()->yes()) {
            return $this->moreSpecificTypes[$exprString]->getType();
        }
        if ($node instanceof \PhpParser\Node\Expr\ConstFetch) {
            $constName = \strtolower((string) $node->name);
            if ($constName === 'true') {
                return new \PHPStan\Type\Constant\ConstantBooleanType(\true);
            } elseif ($constName === 'false') {
                return new \PHPStan\Type\Constant\ConstantBooleanType(\false);
            } elseif ($constName === 'null') {
                return new \PHPStan\Type\NullType();
            }
            if ($this->broker->hasConstant($node->name, $this)) {
                /** @var string $resolvedConstantName */
                $resolvedConstantName = $this->broker->resolveConstantName($node->name, $this);
                if ($resolvedConstantName === 'DIRECTORY_SEPARATOR') {
                    return new \PHPStan\Type\UnionType([new \PHPStan\Type\Constant\ConstantStringType('/'), new \PHPStan\Type\Constant\ConstantStringType('\\')]);
                }
                if ($resolvedConstantName === 'PATH_SEPARATOR') {
                    return new \PHPStan\Type\UnionType([new \PHPStan\Type\Constant\ConstantStringType(':'), new \PHPStan\Type\Constant\ConstantStringType(';')]);
                }
                if ($resolvedConstantName === 'PHP_EOL') {
                    return new \PHPStan\Type\UnionType([new \PHPStan\Type\Constant\ConstantStringType("\n"), new \PHPStan\Type\Constant\ConstantStringType("\r\n")]);
                }
                if ($resolvedConstantName === '__COMPILER_HALT_OFFSET__') {
                    return new \PHPStan\Type\IntegerType();
                }
                $constantType = $this->getTypeFromValue(\constant($resolvedConstantName));
                if ($constantType instanceof \PHPStan\Type\ConstantType && \in_array($resolvedConstantName, $this->dynamicConstantNames, \true)) {
                    return $constantType->generalize();
                }
                return $constantType;
            }
            return new \PHPStan\Type\ErrorType();
        } elseif ($node instanceof \PhpParser\Node\Expr\ClassConstFetch && $node->name instanceof \PhpParser\Node\Identifier) {
            $constantName = $node->name->name;
            if ($node->class instanceof \PhpParser\Node\Name) {
                $constantClass = (string) $node->class;
                $constantClassType = new \PHPStan\Type\ObjectType($constantClass);
                $namesToResolve = ['self', 'parent'];
                if ($this->isInClass()) {
                    if ($this->getClassReflection()->isFinal()) {
                        $namesToResolve[] = 'static';
                    } elseif (\strtolower($constantClass) === 'static') {
                        if (\strtolower($constantName) === 'class') {
                            return new \PHPStan\Type\StringType();
                        }
                        return new \PHPStan\Type\MixedType();
                    }
                }
                if (\in_array(\strtolower($constantClass), $namesToResolve, \true)) {
                    $resolvedName = $this->resolveName($node->class);
                    if ($resolvedName === 'parent' && \strtolower($constantName) === 'class') {
                        return new \PHPStan\Type\StringType();
                    }
                    $constantClassType = new \PHPStan\Type\ObjectType($resolvedName);
                }
            } else {
                $constantClassType = $this->getType($node->class);
            }
            if (\strtolower($constantName) === 'class' && $constantClassType instanceof \PHPStan\Type\TypeWithClassName) {
                return new \PHPStan\Type\Constant\ConstantStringType($constantClassType->getClassName());
            }
            $referencedClasses = \PHPStan\Type\TypeUtils::getDirectClassNames($constantClassType);
            $types = [];
            foreach ($referencedClasses as $referencedClass) {
                if (!$this->broker->hasClass($referencedClass)) {
                    continue;
                }
                $propertyClassReflection = $this->broker->getClass($referencedClass);
                if (!$propertyClassReflection->hasConstant($constantName)) {
                    continue;
                }
                $constantType = $this->getTypeFromValue($propertyClassReflection->getConstant($constantName)->getValue());
                if ($constantType instanceof \PHPStan\Type\ConstantType && \in_array(\sprintf('%s::%s', $propertyClassReflection->getName(), $constantName), $this->dynamicConstantNames, \true)) {
                    $constantType = $constantType->generalize();
                }
                $types[] = $constantType;
            }
            if (\count($types) > 0) {
                return \PHPStan\Type\TypeCombinator::union(...$types);
            }
            if (!$constantClassType->hasConstant($constantName)->yes()) {
                return new \PHPStan\Type\ErrorType();
            }
            return $this->getTypeFromValue($constantClassType->getConstant($constantName)->getValue());
        }
        if ($node instanceof \PhpParser\Node\Expr\Ternary) {
            if ($node->if === null) {
                $conditionType = $this->getType($node->cond);
                $booleanConditionType = $conditionType->toBoolean();
                if ($booleanConditionType instanceof \PHPStan\Type\Constant\ConstantBooleanType) {
                    if ($booleanConditionType->getValue()) {
                        return $this->filterByTruthyValue($node->cond, \true)->getType($node->cond);
                    }
                    return $this->filterByFalseyValue($node->cond, \true)->getType($node->else);
                }
                return \PHPStan\Type\TypeCombinator::union($this->filterByTruthyValue($node->cond, \true)->getType($node->cond), $this->filterByFalseyValue($node->cond, \true)->getType($node->else));
            }
            $booleanConditionType = $this->getType($node->cond)->toBoolean();
            if ($booleanConditionType instanceof \PHPStan\Type\Constant\ConstantBooleanType) {
                if ($booleanConditionType->getValue()) {
                    return $this->filterByTruthyValue($node->cond)->getType($node->if);
                }
                return $this->filterByFalseyValue($node->cond)->getType($node->else);
            }
            return \PHPStan\Type\TypeCombinator::union($this->filterByTruthyValue($node->cond)->getType($node->if), $this->filterByFalseyValue($node->cond)->getType($node->else));
        }
        if ($node instanceof \PhpParser\Node\Expr\Variable && \is_string($node->name)) {
            if ($this->hasVariableType($node->name)->no()) {
                return new \PHPStan\Type\ErrorType();
            }
            return $this->getVariableType($node->name);
        }
        if ($node instanceof \PhpParser\Node\Expr\ArrayDimFetch && $node->dim !== null) {
            return $this->getTypeFromArrayDimFetch($node, $this->getType($node->dim), $this->getType($node->var));
        }
        if ($node instanceof \PhpParser\Node\Expr\MethodCall && $node->name instanceof \PhpParser\Node\Identifier) {
            $methodCalledOnType = $this->getType($node->var);
            $referencedClasses = \PHPStan\Type\TypeUtils::getDirectClassNames($methodCalledOnType);
            $resolvedTypes = [];
            foreach ($referencedClasses as $referencedClass) {
                if (!$this->broker->hasClass($referencedClass)) {
                    continue;
                }
                $methodClassReflection = $this->broker->getClass($referencedClass);
                if (!$methodClassReflection->hasMethod($node->name->name)) {
                    continue;
                }
                $methodReflection = $methodClassReflection->getMethod($node->name->name, $this);
                $foundDynamicReturnTypeExtension = \false;
                foreach ($this->broker->getDynamicMethodReturnTypeExtensionsForClass($methodClassReflection->getName()) as $dynamicMethodReturnTypeExtension) {
                    if (!$dynamicMethodReturnTypeExtension->isMethodSupported($methodReflection)) {
                        continue;
                    }
                    $resolvedTypes[] = $dynamicMethodReturnTypeExtension->getTypeFromMethodCall($methodReflection, $node, $this);
                    $foundDynamicReturnTypeExtension = \true;
                }
                if ($foundDynamicReturnTypeExtension) {
                    continue;
                }
                $methodReturnType = \PHPStan\Reflection\ParametersAcceptorSelector::selectFromArgs($this, $node->args, $methodReflection->getVariants())->getReturnType();
                if ($methodReturnType instanceof \PHPStan\Type\StaticResolvableType) {
                    $calledOnThis = $this->getType($node->var) instanceof \PHPStan\Type\ThisType;
                    if ($calledOnThis && $this->isInClass()) {
                        $resolvedTypes[] = $methodReturnType->changeBaseClass($this->getClassReflection()->getName());
                    } else {
                        $resolvedTypes[] = $methodReturnType->resolveStatic($referencedClass);
                    }
                } else {
                    $resolvedTypes[] = $methodReturnType;
                }
            }
            if (\count($resolvedTypes) > 0) {
                return \PHPStan\Type\TypeCombinator::union(...$resolvedTypes);
            }
            if ($methodCalledOnType->hasMethod($node->name->name)->yes()) {
                $methodReflection = $methodCalledOnType->getMethod($node->name->name, $this);
                return \PHPStan\Reflection\ParametersAcceptorSelector::selectFromArgs($this, $node->args, $methodReflection->getVariants())->getReturnType();
            }
            return new \PHPStan\Type\ErrorType();
        }
        if ($node instanceof \PhpParser\Node\Expr\StaticCall && $node->name instanceof \PhpParser\Node\Identifier) {
            if ($node->class instanceof \PhpParser\Node\Name) {
                $calleeType = new \PHPStan\Type\ObjectType($this->resolveName($node->class));
            } else {
                $calleeType = $this->getType($node->class);
            }
            $referencedClasses = \PHPStan\Type\TypeUtils::getDirectClassNames($calleeType);
            $resolvedTypes = [];
            foreach ($referencedClasses as $referencedClass) {
                if (!$this->broker->hasClass($referencedClass)) {
                    continue;
                }
                $staticMethodClassReflection = $this->broker->getClass($referencedClass);
                if (!$staticMethodClassReflection->hasMethod($node->name->name)) {
                    continue;
                }
                $staticMethodReflection = $staticMethodClassReflection->getMethod($node->name->name, $this);
                $foundDynamicReturnTypeExtension = \false;
                foreach ($this->broker->getDynamicStaticMethodReturnTypeExtensionsForClass($staticMethodClassReflection->getName()) as $dynamicStaticMethodReturnTypeExtension) {
                    if (!$dynamicStaticMethodReturnTypeExtension->isStaticMethodSupported($staticMethodReflection)) {
                        continue;
                    }
                    $resolvedTypes[] = $dynamicStaticMethodReturnTypeExtension->getTypeFromStaticMethodCall($staticMethodReflection, $node, $this);
                    $foundDynamicReturnTypeExtension = \true;
                }
                if ($foundDynamicReturnTypeExtension) {
                    continue;
                }
                $staticMethodReturnType = \PHPStan\Reflection\ParametersAcceptorSelector::selectFromArgs($this, $node->args, $staticMethodReflection->getVariants())->getReturnType();
                if ($staticMethodReturnType instanceof \PHPStan\Type\StaticResolvableType) {
                    if ($node->class instanceof \PhpParser\Node\Name) {
                        $nameNodeClassName = (string) $node->class;
                        $lowercasedNameNodeClassName = \strtolower($nameNodeClassName);
                        if (\in_array($lowercasedNameNodeClassName, ['self', 'static', 'parent'], \true) && $this->isInClass()) {
                            $resolvedTypes[] = $staticMethodReturnType->changeBaseClass($this->getClassReflection()->getName());
                        } elseif ($this->broker->hasClass($nameNodeClassName)) {
                            $classReflection = $this->broker->getClass($nameNodeClassName);
                            $resolvedTypes[] = $staticMethodReturnType->resolveStatic($classReflection->getName());
                        } else {
                            $resolvedTypes[] = $staticMethodReturnType;
                        }
                    } else {
                        $resolvedTypes[] = $staticMethodReturnType->resolveStatic($referencedClass);
                    }
                } else {
                    $resolvedTypes[] = $staticMethodReturnType;
                }
            }
            if (\count($resolvedTypes) > 0) {
                return \PHPStan\Type\TypeCombinator::union(...$resolvedTypes);
            }
            if ($calleeType->hasMethod($node->name->name)->yes()) {
                $staticMethodReflection = $calleeType->getMethod($node->name->name, $this);
                return \PHPStan\Reflection\ParametersAcceptorSelector::selectFromArgs($this, $node->args, $staticMethodReflection->getVariants())->getReturnType();
            }
            return new \PHPStan\Type\ErrorType();
        }
        if ($node instanceof \PhpParser\Node\Expr\PropertyFetch && $node->name instanceof \PhpParser\Node\Identifier) {
            $propertyFetchedOnType = $this->getType($node->var);
            $referencedClasses = \PHPStan\Type\TypeUtils::getDirectClassNames($propertyFetchedOnType);
            $propertyName = $node->name->toString();
            $types = [];
            foreach ($referencedClasses as $referencedClass) {
                if (!$this->broker->hasClass($referencedClass)) {
                    continue;
                }
                $propertyClassReflection = $this->broker->getClass($referencedClass);
                if (!$propertyClassReflection->hasProperty($propertyName)) {
                    continue;
                }
                $types[] = $propertyClassReflection->getProperty($propertyName, $this)->getType();
            }
            if (\count($types) > 0) {
                return \PHPStan\Type\TypeCombinator::union(...$types);
            }
            if (!$propertyFetchedOnType->hasProperty($node->name->name)->yes()) {
                return new \PHPStan\Type\ErrorType();
            }
            return $propertyFetchedOnType->getProperty($node->name->name, $this)->getType();
        }
        if ($node instanceof \PhpParser\Node\Expr\StaticPropertyFetch && $node->name instanceof \PhpParser\Node\VarLikeIdentifier) {
            if ($node->class instanceof \PhpParser\Node\Name) {
                $calleeType = new \PHPStan\Type\ObjectType($this->resolveName($node->class));
            } else {
                $calleeType = $this->getType($node->class);
            }
            $referencedClasses = \PHPStan\Type\TypeUtils::getDirectClassNames($calleeType);
            $propertyName = $node->name->toString();
            $types = [];
            foreach ($referencedClasses as $referencedClass) {
                if (!$this->broker->hasClass($referencedClass)) {
                    continue;
                }
                $propertyClassReflection = $this->broker->getClass($referencedClass);
                if (!$propertyClassReflection->hasProperty($propertyName)) {
                    continue;
                }
                $types[] = $propertyClassReflection->getProperty($propertyName, $this)->getType();
            }
            if (\count($types) > 0) {
                return \PHPStan\Type\TypeCombinator::union(...$types);
            }
            if (!$calleeType->hasProperty($node->name->name)->yes()) {
                return new \PHPStan\Type\ErrorType();
            }
            return $calleeType->getProperty($node->name->name, $this)->getType();
        }
        if ($node instanceof \PhpParser\Node\Expr\FuncCall) {
            if ($node->name instanceof \PhpParser\Node\Expr) {
                $calledOnType = $this->getType($node->name);
                if ($calledOnType->isCallable()->no()) {
                    return new \PHPStan\Type\ErrorType();
                }
                return \PHPStan\Reflection\ParametersAcceptorSelector::selectFromArgs($this, $node->args, $calledOnType->getCallableParametersAcceptors($this))->getReturnType();
            }
            if (!$this->broker->hasFunction($node->name, $this)) {
                return new \PHPStan\Type\ErrorType();
            }
            $functionReflection = $this->broker->getFunction($node->name, $this);
            foreach ($this->broker->getDynamicFunctionReturnTypeExtensions() as $dynamicFunctionReturnTypeExtension) {
                if (!$dynamicFunctionReturnTypeExtension->isFunctionSupported($functionReflection)) {
                    continue;
                }
                return $dynamicFunctionReturnTypeExtension->getTypeFromFunctionCall($functionReflection, $node, $this);
            }
            return \PHPStan\Reflection\ParametersAcceptorSelector::selectFromArgs($this, $node->args, $functionReflection->getVariants())->getReturnType();
        }
        return new \PHPStan\Type\MixedType();
    }
    protected function getTypeFromArrayDimFetch(\PhpParser\Node\Expr\ArrayDimFetch $arrayDimFetch, \PHPStan\Type\Type $offsetType, \PHPStan\Type\Type $offsetAccessibleType) : \PHPStan\Type\Type
    {
        if ($arrayDimFetch->dim === null) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        if ((new \PHPStan\Type\ObjectType(\ArrayAccess::class))->isSuperTypeOf($offsetAccessibleType)->yes()) {
            return $this->getType(new \PhpParser\Node\Expr\MethodCall($arrayDimFetch->var, new \PhpParser\Node\Identifier('offsetGet'), [new \PhpParser\Node\Arg($arrayDimFetch->dim)]));
        }
        return $offsetAccessibleType->getOffsetValueType($offsetType);
    }
    private function calculateFromScalars(\PhpParser\Node\Expr $node, \PHPStan\Type\ConstantScalarType $leftType, \PHPStan\Type\ConstantScalarType $rightType) : \PHPStan\Type\Type
    {
        if ($leftType instanceof \PHPStan\Type\StringType && $rightType instanceof \PHPStan\Type\StringType) {
            /** @var string $leftValue */
            $leftValue = $leftType->getValue();
            /** @var string $rightValue */
            $rightValue = $rightType->getValue();
            if ($node instanceof \PhpParser\Node\Expr\BinaryOp\BitwiseAnd || $node instanceof \PhpParser\Node\Expr\AssignOp\BitwiseAnd) {
                return $this->getTypeFromValue($leftValue & $rightValue);
            }
            if ($node instanceof \PhpParser\Node\Expr\BinaryOp\BitwiseOr || $node instanceof \PhpParser\Node\Expr\AssignOp\BitwiseOr) {
                return $this->getTypeFromValue($leftValue | $rightValue);
            }
            if ($node instanceof \PhpParser\Node\Expr\BinaryOp\BitwiseXor || $node instanceof \PhpParser\Node\Expr\AssignOp\BitwiseXor) {
                return $this->getTypeFromValue($leftValue ^ $rightValue);
            }
        }
        $leftValue = $leftType->getValue();
        $rightValue = $rightType->getValue();
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\Spaceship) {
            return $this->getTypeFromValue($leftValue <=> $rightValue);
        }
        $leftNumberType = $leftType->toNumber();
        $rightNumberType = $rightType->toNumber();
        if (\PHPStan\Type\TypeCombinator::union($leftNumberType, $rightNumberType) instanceof \PHPStan\Type\ErrorType) {
            return new \PHPStan\Type\ErrorType();
        }
        if (!$leftNumberType instanceof \PHPStan\Type\ConstantScalarType || !$rightNumberType instanceof \PHPStan\Type\ConstantScalarType) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        /** @var float|int $leftNumberValue */
        $leftNumberValue = $leftNumberType->getValue();
        /** @var float|int $rightNumberValue */
        $rightNumberValue = $rightNumberType->getValue();
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\Plus || $node instanceof \PhpParser\Node\Expr\AssignOp\Plus) {
            return $this->getTypeFromValue($leftNumberValue + $rightNumberValue);
        }
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\Minus || $node instanceof \PhpParser\Node\Expr\AssignOp\Minus) {
            return $this->getTypeFromValue($leftNumberValue - $rightNumberValue);
        }
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\Mul || $node instanceof \PhpParser\Node\Expr\AssignOp\Mul) {
            return $this->getTypeFromValue($leftNumberValue * $rightNumberValue);
        }
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\Pow || $node instanceof \PhpParser\Node\Expr\AssignOp\Pow) {
            return $this->getTypeFromValue($leftNumberValue ** $rightNumberValue);
        }
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\Div || $node instanceof \PhpParser\Node\Expr\AssignOp\Div) {
            return $this->getTypeFromValue($leftNumberValue / $rightNumberValue);
        }
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\Mod || $node instanceof \PhpParser\Node\Expr\AssignOp\Mod) {
            return $this->getTypeFromValue($leftNumberValue % $rightNumberValue);
        }
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\ShiftLeft || $node instanceof \PhpParser\Node\Expr\AssignOp\ShiftLeft) {
            return $this->getTypeFromValue($leftNumberValue << $rightNumberValue);
        }
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\ShiftRight || $node instanceof \PhpParser\Node\Expr\AssignOp\ShiftRight) {
            return $this->getTypeFromValue($leftNumberValue >> $rightNumberValue);
        }
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\BitwiseAnd || $node instanceof \PhpParser\Node\Expr\AssignOp\BitwiseAnd) {
            return $this->getTypeFromValue($leftNumberValue & $rightNumberValue);
        }
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\BitwiseOr || $node instanceof \PhpParser\Node\Expr\AssignOp\BitwiseOr) {
            return $this->getTypeFromValue($leftNumberValue | $rightNumberValue);
        }
        if ($node instanceof \PhpParser\Node\Expr\BinaryOp\BitwiseXor || $node instanceof \PhpParser\Node\Expr\AssignOp\BitwiseXor) {
            return $this->getTypeFromValue($leftNumberValue ^ $rightNumberValue);
        }
        return new \PHPStan\Type\MixedType();
    }
    public function resolveName(\PhpParser\Node\Name $name) : string
    {
        $originalClass = (string) $name;
        if ($this->isInClass()) {
            if (\in_array(\strtolower($originalClass), ['self', 'static'], \true)) {
                return $this->getClassReflection()->getName();
            } elseif ($originalClass === 'parent') {
                $currentClassReflection = $this->getClassReflection();
                if ($currentClassReflection->getParentClass() !== \false) {
                    return $currentClassReflection->getParentClass()->getName();
                }
            }
        }
        return $originalClass;
    }
    /**
     * @param mixed $value
     */
    public function getTypeFromValue($value) : \PHPStan\Type\Type
    {
        if (\is_int($value)) {
            return new \PHPStan\Type\Constant\ConstantIntegerType($value);
        } elseif (\is_float($value)) {
            return new \PHPStan\Type\Constant\ConstantFloatType($value);
        } elseif (\is_bool($value)) {
            return new \PHPStan\Type\Constant\ConstantBooleanType($value);
        } elseif ($value === null) {
            return new \PHPStan\Type\NullType();
        } elseif (\is_string($value)) {
            return new \PHPStan\Type\Constant\ConstantStringType($value);
        } elseif (\is_array($value)) {
            $arrayBuilder = \PHPStan\Type\Constant\ConstantArrayTypeBuilder::createEmpty();
            foreach ($value as $k => $v) {
                $arrayBuilder->setOffsetValueType($this->getTypeFromValue($k), $this->getTypeFromValue($v));
            }
            return $arrayBuilder->getArray();
        }
        return new \PHPStan\Type\MixedType();
    }
    public function isSpecified(\PhpParser\Node\Expr $node) : bool
    {
        $exprString = $this->printer->prettyPrintExpr($node);
        return isset($this->moreSpecificTypes[$exprString]) && $this->moreSpecificTypes[$exprString]->getCertainty()->yes();
    }
    public function enterClass(\PHPStan\Reflection\ClassReflection $classReflection) : self
    {
        return $this->scopeFactory->create($this->context->enterClass($classReflection), $this->isDeclareStrictTypes(), null, $this->getNamespace(), ['this' => \PHPStan\Analyser\VariableTypeHolder::createYes(new \PHPStan\Type\ThisType($classReflection->getName()))]);
    }
    public function enterTrait(\PHPStan\Reflection\ClassReflection $traitReflection) : self
    {
        return $this->scopeFactory->create($this->context->enterTrait($traitReflection), $this->isDeclareStrictTypes(), $this->getFunction(), $this->getNamespace(), $this->getVariableTypes(), $this->moreSpecificTypes, $this->inClosureBindScopeClass, $this->getAnonymousFunctionReturnType(), $this->getInFunctionCall(), $this->isNegated());
    }
    /**
     * @param Node\Stmt\ClassMethod $classMethod
     * @param Type[] $phpDocParameterTypes
     * @param Type|null $phpDocReturnType
     * @param Type|null $throwType
     * @param string|null $deprecatedDescription
     * @param bool $isDeprecated
     * @param bool $isInternal
     * @param bool $isFinal
     * @return self
     */
    public function enterClassMethod(\PhpParser\Node\Stmt\ClassMethod $classMethod, array $phpDocParameterTypes, ?\PHPStan\Type\Type $phpDocReturnType, ?\PHPStan\Type\Type $throwType, ?string $deprecatedDescription, bool $isDeprecated, bool $isInternal, bool $isFinal) : self
    {
        if (!$this->isInClass()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $this->enterFunctionLike(new \PHPStan\Reflection\Php\PhpMethodFromParserNodeReflection($this->getClassReflection(), $classMethod, $this->getRealParameterTypes($classMethod), $phpDocParameterTypes, $classMethod->returnType !== null, $this->getFunctionType($classMethod->returnType, $classMethod->returnType === null, \false), $phpDocReturnType, $throwType, $deprecatedDescription, $isDeprecated, $isInternal, $isFinal));
    }
    /**
     * @param Node\FunctionLike $functionLike
     * @return Type[]
     */
    private function getRealParameterTypes(\PhpParser\Node\FunctionLike $functionLike) : array
    {
        $realParameterTypes = [];
        foreach ($functionLike->getParams() as $parameter) {
            if (!$parameter->var instanceof \PhpParser\Node\Expr\Variable || !\is_string($parameter->var->name)) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            $realParameterTypes[$parameter->var->name] = $this->getFunctionType($parameter->type, $this->isParameterValueNullable($parameter), $parameter->variadic);
        }
        return $realParameterTypes;
    }
    /**
     * @param Node\Stmt\Function_ $function
     * @param Type[] $phpDocParameterTypes
     * @param Type|null $phpDocReturnType
     * @param Type|null $throwType
     * @param string|null $deprecatedDescription
     * @param bool $isDeprecated
     * @param bool $isInternal
     * @param bool $isFinal
     * @return self
     */
    public function enterFunction(\PhpParser\Node\Stmt\Function_ $function, array $phpDocParameterTypes, ?\PHPStan\Type\Type $phpDocReturnType, ?\PHPStan\Type\Type $throwType, ?string $deprecatedDescription, bool $isDeprecated, bool $isInternal, bool $isFinal) : self
    {
        return $this->enterFunctionLike(new \PHPStan\Reflection\Php\PhpFunctionFromParserNodeReflection($function, $this->getRealParameterTypes($function), $phpDocParameterTypes, $function->returnType !== null, $this->getFunctionType($function->returnType, $function->returnType === null, \false), $phpDocReturnType, $throwType, $deprecatedDescription, $isDeprecated, $isInternal, $isFinal));
    }
    private function enterFunctionLike(\PHPStan\Reflection\Php\PhpFunctionFromParserNodeReflection $functionReflection) : self
    {
        $variableTypes = $this->getVariableTypes();
        foreach (\PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getParameters() as $parameter) {
            $variableTypes[$parameter->getName()] = \PHPStan\Analyser\VariableTypeHolder::createYes($parameter->getType());
        }
        return $this->scopeFactory->create($this->context, $this->isDeclareStrictTypes(), $functionReflection, $this->getNamespace(), $variableTypes, [], null, null);
    }
    public function enterNamespace(string $namespaceName) : self
    {
        return $this->scopeFactory->create($this->context->beginFile(), $this->isDeclareStrictTypes(), null, $namespaceName);
    }
    public function enterClosureBind(?\PHPStan\Type\Type $thisType, string $scopeClass) : self
    {
        $variableTypes = $this->getVariableTypes();
        if ($thisType !== null) {
            $variableTypes['this'] = \PHPStan\Analyser\VariableTypeHolder::createYes($thisType);
        } else {
            unset($variableTypes['this']);
        }
        if ($scopeClass === 'static' && $this->isInClass()) {
            $scopeClass = $this->getClassReflection()->getName();
        }
        return $this->scopeFactory->create($this->context, $this->isDeclareStrictTypes(), $this->getFunction(), $this->getNamespace(), $variableTypes, $this->moreSpecificTypes, $scopeClass, $this->getAnonymousFunctionReturnType(), $this->getInFunctionCall(), $this->isNegated());
    }
    public function restoreOriginalScopeAfterClosureBind(self $originalScope) : self
    {
        $variableTypes = $this->getVariableTypes();
        if (isset($originalScope->variableTypes['this'])) {
            $variableTypes['this'] = $originalScope->variableTypes['this'];
        } else {
            unset($variableTypes['this']);
        }
        return $this->scopeFactory->create($this->context, $this->isDeclareStrictTypes(), $this->getFunction(), $this->getNamespace(), $variableTypes, $this->moreSpecificTypes, $originalScope->inClosureBindScopeClass, $this->getAnonymousFunctionReturnType(), $this->getInFunctionCall(), $this->isNegated());
    }
    public function enterClosureCall(\PHPStan\Type\Type $thisType) : self
    {
        $variableTypes = $this->getVariableTypes();
        $variableTypes['this'] = \PHPStan\Analyser\VariableTypeHolder::createYes($thisType);
        return $this->scopeFactory->create($this->context, $this->isDeclareStrictTypes(), $this->getFunction(), $this->getNamespace(), $variableTypes, $this->moreSpecificTypes, $thisType instanceof \PHPStan\Type\TypeWithClassName ? $thisType->getClassName() : null, $this->getAnonymousFunctionReturnType(), $this->getInFunctionCall(), $this->isNegated());
    }
    public function isInClosureBind() : bool
    {
        return $this->inClosureBindScopeClass !== null;
    }
    public function enterAnonymousFunction(\PhpParser\Node\Expr\Closure $closure) : self
    {
        $variableTypes = [];
        foreach ($closure->params as $parameter) {
            $isNullable = $this->isParameterValueNullable($parameter);
            if (!$parameter->var instanceof \PhpParser\Node\Expr\Variable || !\is_string($parameter->var->name)) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            $variableTypes[$parameter->var->name] = \PHPStan\Analyser\VariableTypeHolder::createYes($this->getFunctionType($parameter->type, $isNullable, $parameter->variadic));
        }
        foreach ($closure->uses as $use) {
            if (!\is_string($use->var->name)) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            if ($use->byRef) {
                continue;
            }
            if ($this->hasVariableType($use->var->name)->no()) {
                $variableType = new \PHPStan\Type\ErrorType();
            } else {
                $variableType = $this->getVariableType($use->var->name);
            }
            $variableTypes[$use->var->name] = \PHPStan\Analyser\VariableTypeHolder::createYes($variableType);
        }
        if ($this->hasVariableType('this')->yes() && !$closure->static) {
            $variableTypes['this'] = \PHPStan\Analyser\VariableTypeHolder::createYes($this->getVariableType('this'));
        }
        $returnType = $this->getFunctionType($closure->returnType, $closure->returnType === null, \false);
        return $this->scopeFactory->create($this->context, $this->isDeclareStrictTypes(), $this->getFunction(), $this->getNamespace(), $variableTypes, [], $this->inClosureBindScopeClass, $returnType, $this->getInFunctionCall());
    }
    public function isParameterValueNullable(\PhpParser\Node\Param $parameter) : bool
    {
        if ($parameter->default instanceof \PhpParser\Node\Expr\ConstFetch) {
            return \strtolower((string) $parameter->default->name) === 'null';
        }
        return \false;
    }
    /**
     * @param \PhpParser\Node\Name|\PhpParser\Node\Identifier|\PhpParser\Node\NullableType|null $type
     * @param bool $isNullable
     * @param bool $isVariadic
     * @return Type
     */
    public function getFunctionType($type, bool $isNullable, bool $isVariadic) : \PHPStan\Type\Type
    {
        if ($isNullable) {
            return \PHPStan\Type\TypeCombinator::addNull($this->getFunctionType($type, \false, $isVariadic));
        }
        if ($isVariadic) {
            return new \PHPStan\Type\ArrayType(new \PHPStan\Type\IntegerType(), $this->getFunctionType($type, \false, \false));
        }
        if ($type === null) {
            return new \PHPStan\Type\MixedType();
        } elseif ($type instanceof \PhpParser\Node\Name) {
            $className = (string) $type;
            $lowercasedClassName = \strtolower($className);
            if ($this->isInClass() && \in_array($lowercasedClassName, ['self', 'static'], \true)) {
                $className = $this->getClassReflection()->getName();
            } elseif ($lowercasedClassName === 'parent') {
                if ($this->isInClass() && $this->getClassReflection()->getParentClass() !== \false) {
                    return new \PHPStan\Type\ObjectType($this->getClassReflection()->getParentClass()->getName());
                }
                return new \PHPStan\Type\NonexistentParentClassType();
            }
            return new \PHPStan\Type\ObjectType($className);
        } elseif ($type instanceof \PhpParser\Node\NullableType) {
            return $this->getFunctionType($type->type, \true, $isVariadic);
        }
        $type = $type->name;
        if ($type === 'string') {
            return new \PHPStan\Type\StringType();
        } elseif ($type === 'int') {
            return new \PHPStan\Type\IntegerType();
        } elseif ($type === 'bool') {
            return new \PHPStan\Type\BooleanType();
        } elseif ($type === 'float') {
            return new \PHPStan\Type\FloatType();
        } elseif ($type === 'callable') {
            return new \PHPStan\Type\CallableType();
        } elseif ($type === 'array') {
            return new \PHPStan\Type\ArrayType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType());
        } elseif ($type === 'iterable') {
            return new \PHPStan\Type\IterableType(new \PHPStan\Type\MixedType(), new \PHPStan\Type\MixedType());
        } elseif ($type === 'void') {
            return new \PHPStan\Type\VoidType();
        } elseif ($type === 'object') {
            return new \PHPStan\Type\ObjectWithoutClassType();
        }
        return new \PHPStan\Type\MixedType();
    }
    public function enterForeach(\PhpParser\Node\Expr $iteratee, string $valueName, ?string $keyName) : self
    {
        $iterateeType = $this->getType($iteratee);
        $scope = $this->assignVariable($valueName, $iterateeType->getIterableValueType());
        if ($keyName !== null) {
            $scope = $scope->assignVariable($keyName, $iterateeType->getIterableKeyType());
        }
        return $scope;
    }
    /**
     * @param \PhpParser\Node\Name[] $classes
     * @param string $variableName
     * @return Scope
     */
    public function enterCatch(array $classes, string $variableName) : self
    {
        $type = \PHPStan\Type\TypeCombinator::union(...\array_map(static function (string $class) : ObjectType {
            return new \PHPStan\Type\ObjectType($class);
        }, $classes));
        return $this->assignVariable($variableName, \PHPStan\Type\TypeCombinator::intersect($type, new \PHPStan\Type\ObjectType(\Throwable::class)));
    }
    /**
     * @param \PhpParser\Node\Expr\FuncCall|\PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall $functionCall
     * @return self
     */
    public function enterFunctionCall($functionCall) : self
    {
        return $this->scopeFactory->create($this->context, $this->isDeclareStrictTypes(), $this->getFunction(), $this->getNamespace(), $this->getVariableTypes(), $this->moreSpecificTypes, $this->inClosureBindScopeClass, $this->getAnonymousFunctionReturnType(), $functionCall, $this->isNegated(), $this->inFirstLevelStatement);
    }
    public function enterExpressionAssign(\PhpParser\Node\Expr $expr) : self
    {
        $exprString = $this->printer->prettyPrintExpr($expr);
        $currentlyAssignedExpressions = $this->currentlyAssignedExpressions;
        $currentlyAssignedExpressions[$exprString] = \true;
        return $this->scopeFactory->create($this->context, $this->isDeclareStrictTypes(), $this->getFunction(), $this->getNamespace(), $this->getVariableTypes(), $this->moreSpecificTypes, $this->inClosureBindScopeClass, $this->getAnonymousFunctionReturnType(), $this->getInFunctionCall(), $this->isNegated(), $this->isInFirstLevelStatement(), $currentlyAssignedExpressions);
    }
    public function exitExpressionAssign(\PhpParser\Node\Expr $expr) : self
    {
        $exprString = $this->printer->prettyPrintExpr($expr);
        $currentlyAssignedExpressions = $this->currentlyAssignedExpressions;
        unset($currentlyAssignedExpressions[$exprString]);
        return $this->scopeFactory->create($this->context, $this->isDeclareStrictTypes(), $this->getFunction(), $this->getNamespace(), $this->getVariableTypes(), $this->moreSpecificTypes, $this->inClosureBindScopeClass, $this->getAnonymousFunctionReturnType(), $this->getInFunctionCall(), $this->isNegated(), $this->isInFirstLevelStatement(), $currentlyAssignedExpressions);
    }
    public function isInExpressionAssign(\PhpParser\Node\Expr $expr) : bool
    {
        $exprString = $this->printer->prettyPrintExpr($expr);
        return \array_key_exists($exprString, $this->currentlyAssignedExpressions);
    }
    public function assignVariable(string $variableName, \PHPStan\Type\Type $type) : self
    {
        $variableTypes = $this->getVariableTypes();
        $variableTypes[$variableName] = new \PHPStan\Analyser\VariableTypeHolder($type, \PHPStan\TrinaryLogic::createYes());
        $variableString = $this->printer->prettyPrintExpr(new \PhpParser\Node\Expr\Variable($variableName));
        $moreSpecificTypeHolders = $this->moreSpecificTypes;
        foreach (\array_keys($moreSpecificTypeHolders) as $key) {
            $matches = \_HumbugBoxb94336daae36\Nette\Utils\Strings::match((string) $key, '#(\\$[a-zA-Z_\\x7f-\\xff][a-zA-Z_0-9\\x7f-\\xff]*)#');
            if ($matches === null) {
                continue;
            }
            if ($matches[1] !== $variableString) {
                continue;
            }
            unset($moreSpecificTypeHolders[$key]);
        }
        return $this->scopeFactory->create($this->context, $this->isDeclareStrictTypes(), $this->getFunction(), $this->getNamespace(), $variableTypes, $moreSpecificTypeHolders, $this->inClosureBindScopeClass, $this->getAnonymousFunctionReturnType(), $this->getInFunctionCall(), $this->isNegated(), $this->inFirstLevelStatement, $this->currentlyAssignedExpressions);
    }
    public function unsetExpression(\PhpParser\Node\Expr $expr) : self
    {
        if ($expr instanceof \PhpParser\Node\Expr\Variable && \is_string($expr->name)) {
            if ($this->hasVariableType($expr->name)->no()) {
                return $this;
            }
            $variableTypes = $this->getVariableTypes();
            unset($variableTypes[$expr->name]);
            return $this->scopeFactory->create($this->context, $this->isDeclareStrictTypes(), $this->getFunction(), $this->getNamespace(), $variableTypes, $this->moreSpecificTypes, $this->inClosureBindScopeClass, $this->getAnonymousFunctionReturnType(), $this->getInFunctionCall(), $this->isNegated(), $this->inFirstLevelStatement);
        } elseif ($expr instanceof \PhpParser\Node\Expr\ArrayDimFetch && $expr->dim !== null) {
            $constantArrays = \PHPStan\Type\TypeUtils::getConstantArrays($this->getType($expr->var));
            if (\count($constantArrays) > 0) {
                $unsetArrays = [];
                $dimType = $this->getType($expr->dim);
                foreach ($constantArrays as $constantArray) {
                    $unsetArrays[] = $constantArray->unsetOffset($dimType);
                }
                return $this->specifyExpressionType($expr->var, \PHPStan\Type\TypeCombinator::union(...$unsetArrays));
            }
        }
        return $this;
    }
    public function specifyExpressionType(\PhpParser\Node\Expr $expr, \PHPStan\Type\Type $type) : self
    {
        if ($expr instanceof \PhpParser\Node\Scalar || $expr instanceof \PhpParser\Node\Expr\Array_) {
            return $this;
        }
        $exprString = $this->printer->prettyPrintExpr($expr);
        $scope = $this;
        if ($expr instanceof \PhpParser\Node\Expr\Variable && \is_string($expr->name)) {
            $variableName = $expr->name;
            $variableTypes = $this->getVariableTypes();
            $variableTypes[$variableName] = \PHPStan\Analyser\VariableTypeHolder::createYes($type);
            return $this->scopeFactory->create($this->context, $this->isDeclareStrictTypes(), $this->getFunction(), $this->getNamespace(), $variableTypes, $this->moreSpecificTypes, $this->inClosureBindScopeClass, $this->getAnonymousFunctionReturnType(), $this->getInFunctionCall(), $this->isNegated(), $this->inFirstLevelStatement, $this->currentlyAssignedExpressions);
        } elseif ($expr instanceof \PhpParser\Node\Expr\ArrayDimFetch && $expr->dim !== null) {
            $constantArrays = \PHPStan\Type\TypeUtils::getConstantArrays($this->getType($expr->var));
            if (\count($constantArrays) > 0) {
                $setArrays = [];
                $dimType = $this->getType($expr->dim);
                foreach ($constantArrays as $constantArray) {
                    $setArrays[] = $constantArray->setOffsetValueType($dimType, $type);
                }
                $scope = $this->specifyExpressionType($expr->var, \PHPStan\Type\TypeCombinator::union(...$setArrays));
            }
        }
        return $scope->addMoreSpecificTypes([$exprString => $type]);
    }
    public function unspecifyExpressionType(\PhpParser\Node\Expr $expr) : self
    {
        $exprString = $this->printer->prettyPrintExpr($expr);
        $moreSpecificTypeHolders = $this->moreSpecificTypes;
        if (isset($moreSpecificTypeHolders[$exprString])) {
            unset($moreSpecificTypeHolders[$exprString]);
            return $this->scopeFactory->create($this->context, $this->isDeclareStrictTypes(), $this->getFunction(), $this->getNamespace(), $this->getVariableTypes(), $moreSpecificTypeHolders, $this->inClosureBindScopeClass, $this->getAnonymousFunctionReturnType(), $this->getInFunctionCall(), $this->isNegated(), $this->inFirstLevelStatement);
        }
        return $this;
    }
    public function removeTypeFromExpression(\PhpParser\Node\Expr $expr, \PHPStan\Type\Type $type) : self
    {
        return $this->specifyExpressionType($expr, \PHPStan\Type\TypeCombinator::remove($this->getType($expr), $type));
    }
    public function filterByTruthyValue(\PhpParser\Node\Expr $expr, bool $defaultHandleFunctions = \false) : self
    {
        $specifiedTypes = $this->typeSpecifier->specifyTypesInCondition($this, $expr, \PHPStan\Analyser\TypeSpecifierContext::createTruthy(), $defaultHandleFunctions);
        return $this->filterBySpecifiedTypes($specifiedTypes);
    }
    public function filterByFalseyValue(\PhpParser\Node\Expr $expr, bool $defaultHandleFunctions = \false) : self
    {
        $specifiedTypes = $this->typeSpecifier->specifyTypesInCondition($this, $expr, \PHPStan\Analyser\TypeSpecifierContext::createFalsey(), $defaultHandleFunctions);
        return $this->filterBySpecifiedTypes($specifiedTypes);
    }
    public function filterBySpecifiedTypes(\PHPStan\Analyser\SpecifiedTypes $specifiedTypes) : self
    {
        $typeSpecifications = [];
        foreach ($specifiedTypes->getSureTypes() as $exprString => [$expr, $type]) {
            $typeSpecifications[] = ['sure' => \true, 'exprString' => $exprString, 'expr' => $expr, 'type' => $type];
        }
        foreach ($specifiedTypes->getSureNotTypes() as $exprString => [$expr, $type]) {
            $typeSpecifications[] = ['sure' => \false, 'exprString' => $exprString, 'expr' => $expr, 'type' => $type];
        }
        \usort($typeSpecifications, static function (array $a, array $b) : int {
            $length = \strlen((string) $a['exprString']) - \strlen((string) $b['exprString']);
            if ($length !== 0) {
                return $length;
            }
            return $b['sure'] - $a['sure'];
        });
        $scope = $this;
        foreach ($typeSpecifications as $typeSpecification) {
            $expr = $typeSpecification['expr'];
            $type = $typeSpecification['type'];
            if ($typeSpecification['sure']) {
                if (!$specifiedTypes->shouldOverwrite()) {
                    $type = \PHPStan\Type\TypeCombinator::intersect($type, $this->getType($expr));
                }
                $scope = $scope->specifyExpressionType($expr, $type);
            } else {
                $scope = $scope->removeTypeFromExpression($expr, $type);
            }
        }
        return $scope;
    }
    public function enterNegation() : self
    {
        return $this->scopeFactory->create($this->context, $this->isDeclareStrictTypes(), $this->getFunction(), $this->getNamespace(), $this->getVariableTypes(), $this->moreSpecificTypes, $this->inClosureBindScopeClass, $this->getAnonymousFunctionReturnType(), $this->getInFunctionCall(), !$this->isNegated(), $this->inFirstLevelStatement);
    }
    public function exitFirstLevelStatements() : self
    {
        return $this->scopeFactory->create($this->context, $this->isDeclareStrictTypes(), $this->getFunction(), $this->getNamespace(), $this->getVariableTypes(), $this->moreSpecificTypes, $this->inClosureBindScopeClass, $this->getAnonymousFunctionReturnType(), $this->getInFunctionCall(), $this->isNegated(), \false, $this->currentlyAssignedExpressions);
    }
    public function isInFirstLevelStatement() : bool
    {
        return $this->inFirstLevelStatement;
    }
    public function isNegated() : bool
    {
        return $this->negated;
    }
    /**
     * @phpcsSuppress SlevomatCodingStandard.Classes.UnusedPrivateElements.UnusedMethod
     * @param Type[] $types
     * @return self
     */
    private function addMoreSpecificTypes(array $types) : self
    {
        $moreSpecificTypeHolders = $this->moreSpecificTypes;
        foreach ($types as $exprString => $type) {
            $moreSpecificTypeHolders[$exprString] = \PHPStan\Analyser\VariableTypeHolder::createYes($type);
        }
        return $this->scopeFactory->create($this->context, $this->isDeclareStrictTypes(), $this->getFunction(), $this->getNamespace(), $this->getVariableTypes(), $moreSpecificTypeHolders, $this->inClosureBindScopeClass, $this->getAnonymousFunctionReturnType(), $this->getInFunctionCall(), $this->isNegated(), $this->inFirstLevelStatement, $this->currentlyAssignedExpressions);
    }
    public function mergeWith(?self $otherScope) : self
    {
        if ($otherScope === null) {
            return $this;
        }
        return $this->scopeFactory->create($this->context, $this->isDeclareStrictTypes(), $this->getFunction(), $this->getNamespace(), $this->mergeVariableHolders($this->getVariableTypes(), $otherScope->getVariableTypes()), $this->mergeVariableHolders($this->moreSpecificTypes, $otherScope->moreSpecificTypes), $this->inClosureBindScopeClass, $this->getAnonymousFunctionReturnType(), $this->getInFunctionCall(), $this->isNegated(), $this->inFirstLevelStatement);
    }
    /**
     * @param VariableTypeHolder[] $ourVariableTypeHolders
     * @param VariableTypeHolder[] $theirVariableTypeHolders
     * @return VariableTypeHolder[]
     */
    private function mergeVariableHolders(array $ourVariableTypeHolders, array $theirVariableTypeHolders) : array
    {
        $intersectedVariableTypeHolders = [];
        foreach ($ourVariableTypeHolders as $name => $variableTypeHolder) {
            if (isset($theirVariableTypeHolders[$name])) {
                $intersectedVariableTypeHolders[$name] = $variableTypeHolder->and($theirVariableTypeHolders[$name]);
            } else {
                $intersectedVariableTypeHolders[$name] = \PHPStan\Analyser\VariableTypeHolder::createMaybe($variableTypeHolder->getType());
            }
        }
        foreach ($theirVariableTypeHolders as $name => $variableTypeHolder) {
            if (isset($intersectedVariableTypeHolders[$name])) {
                continue;
            }
            $intersectedVariableTypeHolders[$name] = \PHPStan\Analyser\VariableTypeHolder::createMaybe($variableTypeHolder->getType());
        }
        return $intersectedVariableTypeHolders;
    }
    public function processFinallyScope(self $finallyScope, self $originalFinallyScope) : self
    {
        return $this->scopeFactory->create($this->context, $this->isDeclareStrictTypes(), $this->getFunction(), $this->getNamespace(), $this->processFinallyScopeVariableTypeHolders($this->getVariableTypes(), $finallyScope->getVariableTypes(), $originalFinallyScope->getVariableTypes()), $this->processFinallyScopeVariableTypeHolders($this->moreSpecificTypes, $finallyScope->moreSpecificTypes, $originalFinallyScope->moreSpecificTypes), $this->inClosureBindScopeClass, $this->getAnonymousFunctionReturnType(), $this->getInFunctionCall(), $this->isNegated(), $this->inFirstLevelStatement);
    }
    /**
     * @param VariableTypeHolder[] $ourVariableTypeHolders
     * @param VariableTypeHolder[] $finallyVariableTypeHolders
     * @param VariableTypeHolder[] $originalVariableTypeHolders
     * @return VariableTypeHolder[]
     */
    private function processFinallyScopeVariableTypeHolders(array $ourVariableTypeHolders, array $finallyVariableTypeHolders, array $originalVariableTypeHolders) : array
    {
        foreach ($finallyVariableTypeHolders as $name => $variableTypeHolder) {
            if (isset($originalVariableTypeHolders[$name]) && !$originalVariableTypeHolders[$name]->getType()->equals($variableTypeHolder->getType())) {
                $ourVariableTypeHolders[$name] = $variableTypeHolder;
                continue;
            }
            if (isset($originalVariableTypeHolders[$name])) {
                continue;
            }
            $ourVariableTypeHolders[$name] = $variableTypeHolder;
        }
        return $ourVariableTypeHolders;
    }
    /**
     * @param self $closureScope
     * @param self|null $prevScope
     * @param Expr\ClosureUse[] $byRefUses
     * @return self
     */
    public function processClosureScope(self $closureScope, ?self $prevScope, array $byRefUses) : self
    {
        $variableTypes = $this->variableTypes;
        foreach ($byRefUses as $use) {
            if (!\is_string($use->var->name)) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            $variableName = $use->var->name;
            if (!$closureScope->hasVariableType($variableName)->yes()) {
                $variableTypes[$variableName] = \PHPStan\Analyser\VariableTypeHolder::createYes(new \PHPStan\Type\NullType());
                continue;
            }
            $variableType = $closureScope->getVariableType($variableName);
            if ($prevScope !== null) {
                $prevVariableType = $prevScope->getVariableType($variableName);
                if (!$variableType->equals($prevVariableType)) {
                    $variableType = \PHPStan\Type\TypeCombinator::union($variableType, $prevVariableType);
                    $variableType = self::generalizeType($variableType, $prevVariableType);
                }
            }
            $variableTypes[$variableName] = \PHPStan\Analyser\VariableTypeHolder::createYes($variableType);
        }
        return $this->scopeFactory->create($this->context, $this->isDeclareStrictTypes(), $this->getFunction(), $this->getNamespace(), $variableTypes, [], $this->inClosureBindScopeClass, $this->getAnonymousFunctionReturnType(), $this->getInFunctionCall(), $this->isNegated(), $this->inFirstLevelStatement);
    }
    public function processAlwaysIterableForeachScopeWithoutPollute(self $finalScope) : self
    {
        $variableTypeHolders = $this->variableTypes;
        foreach ($finalScope->variableTypes as $name => $variableTypeHolder) {
            if (!isset($variableTypeHolders[$name])) {
                $variableTypeHolders[$name] = \PHPStan\Analyser\VariableTypeHolder::createMaybe($variableTypeHolder->getType());
                continue;
            }
            $variableTypeHolders[$name] = new \PHPStan\Analyser\VariableTypeHolder($variableTypeHolder->getType(), $variableTypeHolder->getCertainty()->and($variableTypeHolders[$name]->getCertainty()));
        }
        $moreSpecificTypes = $this->moreSpecificTypes;
        foreach ($finalScope->moreSpecificTypes as $exprString => $variableTypeHolder) {
            if (!isset($moreSpecificTypes[$exprString])) {
                $moreSpecificTypes[$exprString] = \PHPStan\Analyser\VariableTypeHolder::createMaybe($variableTypeHolder->getType());
                continue;
            }
            $moreSpecificTypes[$exprString] = new \PHPStan\Analyser\VariableTypeHolder($variableTypeHolder->getType(), $variableTypeHolder->getCertainty()->and($moreSpecificTypes[$exprString]->getCertainty()));
        }
        return $this->scopeFactory->create($this->context, $this->isDeclareStrictTypes(), $this->getFunction(), $this->getNamespace(), $variableTypeHolders, $moreSpecificTypes, $this->inClosureBindScopeClass, $this->getAnonymousFunctionReturnType(), $this->getInFunctionCall(), $this->isNegated(), $this->inFirstLevelStatement);
    }
    public function generalizeWith(self $otherScope) : self
    {
        $variableTypeHolders = $this->generalizeVariableTypeHolders($this->getVariableTypes(), $otherScope->getVariableTypes());
        $moreSpecificTypes = $this->generalizeVariableTypeHolders($this->moreSpecificTypes, $otherScope->moreSpecificTypes);
        return $this->scopeFactory->create($this->context, $this->isDeclareStrictTypes(), $this->getFunction(), $this->getNamespace(), $variableTypeHolders, $moreSpecificTypes, $this->inClosureBindScopeClass, $this->getAnonymousFunctionReturnType(), $this->getInFunctionCall(), $this->isNegated(), $this->inFirstLevelStatement);
    }
    /**
     * @param VariableTypeHolder[] $variableTypeHolders
     * @param VariableTypeHolder[] $otherVariableTypeHolders
     * @return VariableTypeHolder[]
     */
    private function generalizeVariableTypeHolders(array $variableTypeHolders, array $otherVariableTypeHolders) : array
    {
        foreach ($variableTypeHolders as $name => $variableTypeHolder) {
            if (!isset($otherVariableTypeHolders[$name])) {
                continue;
            }
            $variableTypeHolders[$name] = new \PHPStan\Analyser\VariableTypeHolder(self::generalizeType($variableTypeHolder->getType(), $otherVariableTypeHolders[$name]->getType()), $variableTypeHolder->getCertainty());
        }
        return $variableTypeHolders;
    }
    private function generalizeType(\PHPStan\Type\Type $a, \PHPStan\Type\Type $b) : \PHPStan\Type\Type
    {
        if ($a->equals($b)) {
            return $a;
        }
        $constantIntegers = ['a' => [], 'b' => []];
        $constantFloats = ['a' => [], 'b' => []];
        $constantBooleans = ['a' => [], 'b' => []];
        $constantStrings = ['a' => [], 'b' => []];
        $constantArrays = ['a' => [], 'b' => []];
        $generalArrays = ['a' => [], 'b' => []];
        $otherTypes = [];
        foreach (['a' => \PHPStan\Type\TypeUtils::flattenTypes($a), 'b' => \PHPStan\Type\TypeUtils::flattenTypes($b)] as $key => $types) {
            foreach ($types as $type) {
                if ($type instanceof \PHPStan\Type\Constant\ConstantIntegerType) {
                    $constantIntegers[$key][] = $type;
                    continue;
                }
                if ($type instanceof \PHPStan\Type\Constant\ConstantFloatType) {
                    $constantFloats[$key][] = $type;
                    continue;
                }
                if ($type instanceof \PHPStan\Type\Constant\ConstantBooleanType) {
                    $constantBooleans[$key][] = $type;
                    continue;
                }
                if ($type instanceof \PHPStan\Type\Constant\ConstantStringType) {
                    $constantStrings[$key][] = $type;
                    continue;
                }
                if ($type instanceof \PHPStan\Type\Constant\ConstantArrayType) {
                    $constantArrays[$key][] = $type;
                    continue;
                }
                if ($type instanceof \PHPStan\Type\ArrayType) {
                    $generalArrays[$key][] = $type;
                    continue;
                }
                $otherTypes[] = $type;
            }
        }
        $resultTypes = [];
        foreach ([$constantIntegers, $constantFloats, $constantBooleans, $constantStrings] as $constantTypes) {
            if (\count($constantTypes['a']) === 0) {
                continue;
            }
            if (\count($constantTypes['b']) === 0) {
                $resultTypes[] = \PHPStan\Type\TypeCombinator::union(...$constantTypes['a']);
                continue;
            }
            $aTypes = \PHPStan\Type\TypeCombinator::union(...$constantTypes['a']);
            $bTypes = \PHPStan\Type\TypeCombinator::union(...$constantTypes['b']);
            if ($aTypes->equals($bTypes)) {
                $resultTypes[] = $aTypes;
                continue;
            }
            $resultTypes[] = \PHPStan\Type\TypeUtils::generalizeType($constantTypes['a'][0]);
        }
        if (\count($constantArrays['a']) > 0) {
            if (\count($constantArrays['b']) === 0) {
                $resultTypes[] = \PHPStan\Type\TypeCombinator::union(...$constantArrays['a']);
            } else {
                $constantArraysA = \PHPStan\Type\TypeCombinator::union(...$constantArrays['a']);
                $constantArraysB = \PHPStan\Type\TypeCombinator::union(...$constantArrays['b']);
                if ($constantArraysA->getIterableKeyType()->equals($constantArraysB->getIterableKeyType())) {
                    $resultArrayBuilder = \PHPStan\Type\Constant\ConstantArrayTypeBuilder::createEmpty();
                    foreach (\PHPStan\Type\TypeUtils::flattenTypes($constantArraysA->getIterableKeyType()) as $keyType) {
                        $resultArrayBuilder->setOffsetValueType($keyType, self::generalizeType($constantArraysA->getOffsetValueType($keyType), $constantArraysB->getOffsetValueType($keyType)));
                    }
                    $resultTypes[] = $resultArrayBuilder->getArray();
                } else {
                    $resultTypes[] = new \PHPStan\Type\ArrayType(\PHPStan\Type\TypeCombinator::union(self::generalizeType($constantArraysA->getIterableKeyType(), $constantArraysB->getIterableKeyType())), \PHPStan\Type\TypeCombinator::union(self::generalizeType($constantArraysA->getIterableValueType(), $constantArraysB->getIterableValueType())));
                }
            }
        }
        if (\count($generalArrays['a']) > 0) {
            if (\count($generalArrays['b']) === 0) {
                $resultTypes[] = \PHPStan\Type\TypeCombinator::union(...$generalArrays['a']);
            } else {
                $generalArraysA = \PHPStan\Type\TypeCombinator::union(...$generalArrays['a']);
                $generalArraysB = \PHPStan\Type\TypeCombinator::union(...$generalArrays['b']);
                $aValueType = $generalArraysA->getIterableValueType();
                $bValueType = $generalArraysB->getIterableValueType();
                $aArrays = \PHPStan\Type\TypeUtils::getAnyArrays($aValueType);
                $bArrays = \PHPStan\Type\TypeUtils::getAnyArrays($bValueType);
                if (\count($aArrays) === 1 && !$aArrays[0] instanceof \PHPStan\Type\Constant\ConstantArrayType && \count($bArrays) === 1 && !$bArrays[0] instanceof \PHPStan\Type\Constant\ConstantArrayType) {
                    $aDepth = $this->getArrayDepth($aArrays[0]);
                    $bDepth = $this->getArrayDepth($bArrays[0]);
                    if (($aDepth > 2 || $bDepth > 2) && \abs($aDepth - $bDepth) > 0) {
                        $aValueType = new \PHPStan\Type\MixedType();
                        $bValueType = new \PHPStan\Type\MixedType();
                    }
                }
                $resultTypes[] = new \PHPStan\Type\ArrayType(\PHPStan\Type\TypeCombinator::union(self::generalizeType($generalArraysA->getIterableKeyType(), $generalArraysB->getIterableKeyType())), \PHPStan\Type\TypeCombinator::union(self::generalizeType($aValueType, $bValueType)));
            }
        }
        return \PHPStan\Type\TypeCombinator::union(...$resultTypes, ...$otherTypes);
    }
    private function getArrayDepth(\PHPStan\Type\ArrayType $type) : int
    {
        $depth = 0;
        while ($type instanceof \PHPStan\Type\ArrayType) {
            $temp = $type->getIterableValueType();
            $arrays = \PHPStan\Type\TypeUtils::getAnyArrays($temp);
            if (\count($arrays) === 1) {
                $type = $arrays[0];
            } else {
                $type = $temp;
            }
            $depth++;
        }
        return $depth;
    }
    public function equals(self $otherScope) : bool
    {
        if (!$this->context->equals($otherScope->context)) {
            return \false;
        }
        if (!$this->compareVariableTypeHolders($this->variableTypes, $otherScope->variableTypes)) {
            return \false;
        }
        return $this->compareVariableTypeHolders($this->moreSpecificTypes, $otherScope->moreSpecificTypes);
    }
    /**
     * @param VariableTypeHolder[] $variableTypeHolders
     * @param VariableTypeHolder[] $otherVariableTypeHolders
     * @return bool
     */
    private function compareVariableTypeHolders(array $variableTypeHolders, array $otherVariableTypeHolders) : bool
    {
        foreach ($variableTypeHolders as $name => $variableTypeHolder) {
            if (!isset($otherVariableTypeHolders[$name])) {
                return \false;
            }
            if (!$variableTypeHolder->getCertainty()->equals($otherVariableTypeHolders[$name]->getCertainty())) {
                return \false;
            }
            if (!$variableTypeHolder->getType()->equals($otherVariableTypeHolders[$name]->getType())) {
                return \false;
            }
            unset($otherVariableTypeHolders[$name]);
        }
        return \count($otherVariableTypeHolders) === 0;
    }
    public function canAccessProperty(\PHPStan\Reflection\PropertyReflection $propertyReflection) : bool
    {
        return $this->canAccessClassMember($propertyReflection);
    }
    public function canCallMethod(\PHPStan\Reflection\MethodReflection $methodReflection) : bool
    {
        if ($this->canAccessClassMember($methodReflection)) {
            return \true;
        }
        return $this->canAccessClassMember($methodReflection->getPrototype());
    }
    public function canAccessConstant(\PHPStan\Reflection\ConstantReflection $constantReflection) : bool
    {
        return $this->canAccessClassMember($constantReflection);
    }
    private function canAccessClassMember(\PHPStan\Reflection\ClassMemberReflection $classMemberReflection) : bool
    {
        if ($classMemberReflection->isPublic()) {
            return \true;
        }
        if ($this->inClosureBindScopeClass !== null && $this->broker->hasClass($this->inClosureBindScopeClass)) {
            $currentClassReflection = $this->broker->getClass($this->inClosureBindScopeClass);
        } elseif ($this->isInClass()) {
            $currentClassReflection = $this->getClassReflection();
        } else {
            return \false;
        }
        $classReflectionName = $classMemberReflection->getDeclaringClass()->getName();
        if ($classMemberReflection->isPrivate()) {
            return $currentClassReflection->getName() === $classReflectionName;
        }
        // protected
        if ($currentClassReflection->getName() === $classReflectionName || $currentClassReflection->isSubclassOf($classReflectionName)) {
            return \true;
        }
        return $classMemberReflection->getDeclaringClass()->isSubclassOf($currentClassReflection->getName());
    }
    /**
     * @return string[]
     */
    public function debug() : array
    {
        $descriptions = [];
        foreach ($this->getVariableTypes() as $name => $variableTypeHolder) {
            $key = \sprintf('$%s (%s)', $name, $variableTypeHolder->getCertainty()->describe());
            $descriptions[$key] = $variableTypeHolder->getType()->describe(\PHPStan\Type\VerbosityLevel::precise());
        }
        foreach ($this->moreSpecificTypes as $exprString => $typeHolder) {
            $key = \sprintf('%s-specified (%s)', $exprString, $typeHolder->getCertainty()->describe());
            $descriptions[$key] = $typeHolder->getType()->describe(\PHPStan\Type\VerbosityLevel::precise());
        }
        return $descriptions;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Analyser;

class UndefinedVariableException extends \PHPStan\AnalysedCodeException
{
    /** @var \PHPStan\Analyser\Scope */
    private $scope;
    /** @var string */
    private $variableName;
    public function __construct(\PHPStan\Analyser\Scope $scope, string $variableName)
    {
        parent::__construct(\sprintf('Undefined variable: $%s', $variableName));
        $this->scope = $scope;
        $this->variableName = $variableName;
    }
    public function getScope() : \PHPStan\Analyser\Scope
    {
        return $this->scope;
    }
    public function getVariableName() : string
    {
        return $this->variableName;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Analyser;

use PhpParser\Node\Expr;
use PHPStan\Type\Type;
class EnsuredNonNullabilityResultExpression
{
    /** @var Expr */
    private $expression;
    /** @var Type */
    private $originalType;
    public function __construct(\PhpParser\Node\Expr $expression, \PHPStan\Type\Type $originalType)
    {
        $this->expression = $expression;
        $this->originalType = $originalType;
    }
    public function getExpression() : \PhpParser\Node\Expr
    {
        return $this->expression;
    }
    public function getOriginalType() : \PHPStan\Type\Type
    {
        return $this->originalType;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Analyser;

class ExpressionResult
{
    /** @var Scope */
    private $scope;
    /** @var bool */
    private $hasYield;
    /** @var (callable(): Scope)|null */
    private $truthyScopeCallback;
    /** @var Scope|null */
    private $truthyScope;
    /** @var (callable(): Scope)|null */
    private $falseyScopeCallback;
    /** @var Scope|null */
    private $falseyScope;
    /**
     * @param Scope $scope
     * @param bool $hasYield
     * @param (callable(): Scope)|null $truthyScopeCallback
     * @param (callable(): Scope)|null $falseyScopeCallback
     */
    public function __construct(\PHPStan\Analyser\Scope $scope, bool $hasYield, ?callable $truthyScopeCallback = null, ?callable $falseyScopeCallback = null)
    {
        $this->scope = $scope;
        $this->hasYield = $hasYield;
        $this->truthyScopeCallback = $truthyScopeCallback;
        $this->falseyScopeCallback = $falseyScopeCallback;
    }
    public function getScope() : \PHPStan\Analyser\Scope
    {
        return $this->scope;
    }
    public function hasYield() : bool
    {
        return $this->hasYield;
    }
    public function getTruthyScope() : \PHPStan\Analyser\Scope
    {
        if ($this->truthyScopeCallback === null) {
            return $this->scope;
        }
        if ($this->truthyScope !== null) {
            return $this->truthyScope;
        }
        $callback = $this->truthyScopeCallback;
        $this->truthyScope = $callback();
        return $this->truthyScope;
    }
    public function getFalseyScope() : \PHPStan\Analyser\Scope
    {
        if ($this->falseyScopeCallback === null) {
            return $this->scope;
        }
        if ($this->falseyScope !== null) {
            return $this->falseyScope;
        }
        $callback = $this->falseyScopeCallback;
        $this->falseyScope = $callback();
        return $this->falseyScope;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Analyser;

use PhpParser\Node\Stmt;
class StatementExitPoint
{
    /** @var Stmt */
    private $statement;
    /** @var Scope */
    private $scope;
    public function __construct(\PhpParser\Node\Stmt $statement, \PHPStan\Analyser\Scope $scope)
    {
        $this->statement = $statement;
        $this->scope = $scope;
    }
    public function getStatement() : \PhpParser\Node\Stmt
    {
        return $this->statement;
    }
    public function getScope() : \PHPStan\Analyser\Scope
    {
        return $this->scope;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Analyser;

use PHPStan\TrinaryLogic;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
class VariableTypeHolder
{
    /** @var \PHPStan\Type\Type */
    private $type;
    /** @var \PHPStan\TrinaryLogic */
    private $certainty;
    public function __construct(\PHPStan\Type\Type $type, \PHPStan\TrinaryLogic $certainty)
    {
        if ($certainty->no()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        $this->type = $type;
        $this->certainty = $certainty;
    }
    public static function createYes(\PHPStan\Type\Type $type) : self
    {
        return new self($type, \PHPStan\TrinaryLogic::createYes());
    }
    public static function createMaybe(\PHPStan\Type\Type $type) : self
    {
        return new self($type, \PHPStan\TrinaryLogic::createMaybe());
    }
    public function and(self $other) : self
    {
        if ($this->getType()->equals($other->getType())) {
            $type = $this->getType();
        } else {
            $type = \PHPStan\Type\TypeCombinator::union($this->getType(), $other->getType());
        }
        return new self($type, $this->getCertainty()->and($other->getCertainty()));
    }
    public function getType() : \PHPStan\Type\Type
    {
        return $this->type;
    }
    public function getCertainty() : \PHPStan\TrinaryLogic
    {
        return $this->certainty;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Analyser;

use PHPStan\Reflection\ClassReflection;
class ScopeContext
{
    /** @var string */
    private $file;
    /** @var ClassReflection|null */
    private $classReflection;
    /** @var ClassReflection|null */
    private $traitReflection;
    private function __construct(string $file, ?\PHPStan\Reflection\ClassReflection $classReflection, ?\PHPStan\Reflection\ClassReflection $traitReflection)
    {
        $this->file = $file;
        $this->classReflection = $classReflection;
        $this->traitReflection = $traitReflection;
    }
    public static function create(string $file) : self
    {
        return new self($file, null, null);
    }
    public function beginFile() : self
    {
        return new self($this->file, null, null);
    }
    public function enterClass(\PHPStan\Reflection\ClassReflection $classReflection) : self
    {
        if ($this->classReflection !== null && !$classReflection->isAnonymous()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        if ($classReflection->isTrait()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return new self($this->file, $classReflection, null);
    }
    public function enterTrait(\PHPStan\Reflection\ClassReflection $traitReflection) : self
    {
        if ($this->classReflection === null) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        if (!$traitReflection->isTrait()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return new self($this->file, $this->classReflection, $traitReflection);
    }
    public function equals(self $otherContext) : bool
    {
        if ($this->file !== $otherContext->file) {
            return \false;
        }
        if ($this->getClassReflection() === null) {
            return $otherContext->getClassReflection() === null;
        } elseif ($otherContext->getClassReflection() === null) {
            return \false;
        }
        $isSameClass = $this->getClassReflection()->getName() === $otherContext->getClassReflection()->getName();
        if ($this->getTraitReflection() === null) {
            return $otherContext->getTraitReflection() === null && $isSameClass;
        } elseif ($otherContext->getTraitReflection() === null) {
            return \false;
        }
        $isSameTrait = $this->getTraitReflection()->getName() === $otherContext->getTraitReflection()->getName();
        return $isSameClass && $isSameTrait;
    }
    public function getFile() : string
    {
        return $this->file;
    }
    public function getClassReflection() : ?\PHPStan\Reflection\ClassReflection
    {
        return $this->classReflection;
    }
    public function getTraitReflection() : ?\PHPStan\Reflection\ClassReflection
    {
        return $this->traitReflection;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Analyser;

class Error
{
    /** @var string */
    private $message;
    /** @var string */
    private $file;
    /** @var int|NULL */
    private $line;
    /** @var bool */
    private $canBeIgnored;
    public function __construct(string $message, string $file, ?int $line = null, bool $canBeIgnored = \true)
    {
        $this->message = $message;
        $this->file = $file;
        $this->line = $line;
        $this->canBeIgnored = $canBeIgnored;
    }
    public function getMessage() : string
    {
        return $this->message;
    }
    public function getFile() : string
    {
        return $this->file;
    }
    public function getLine() : ?int
    {
        return $this->line;
    }
    public function canBeIgnored() : bool
    {
        return $this->canBeIgnored;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Analyser;

use PHPStan\Type\Type;
class ExpressionContext
{
    /** @var bool */
    private $isDeep;
    /** @var string|null */
    private $inAssignRightSideVariableName;
    /** @var Type|null */
    private $inAssignRightSideType;
    private function __construct(bool $isDeep, ?string $inAssignRightSideVariableName, ?\PHPStan\Type\Type $inAssignRightSideType)
    {
        $this->isDeep = $isDeep;
        $this->inAssignRightSideVariableName = $inAssignRightSideVariableName;
        $this->inAssignRightSideType = $inAssignRightSideType;
    }
    public static function createTopLevel() : self
    {
        return new self(\false, null, null);
    }
    public static function createDeep() : self
    {
        return new self(\true, null, null);
    }
    public function enterDeep() : self
    {
        if ($this->isDeep) {
            return $this;
        }
        return new self(\true, $this->inAssignRightSideVariableName, $this->inAssignRightSideType);
    }
    public function isDeep() : bool
    {
        return $this->isDeep;
    }
    public function enterRightSideAssign(string $variableName, \PHPStan\Type\Type $type) : self
    {
        return new self($this->isDeep, $variableName, $type);
    }
    public function getInAssignRightSideVariableName() : ?string
    {
        return $this->inAssignRightSideVariableName;
    }
    public function getInAssignRightSideType() : ?\PHPStan\Type\Type
    {
        return $this->inAssignRightSideType;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Analyser;

class TypeSpecifierContext
{
    public const CONTEXT_TRUE = 0b1;
    public const CONTEXT_TRUTHY_BUT_NOT_TRUE = 0b10;
    public const CONTEXT_TRUTHY = self::CONTEXT_TRUE | self::CONTEXT_TRUTHY_BUT_NOT_TRUE;
    public const CONTEXT_FALSE = 0b100;
    public const CONTEXT_FALSEY_BUT_NOT_FALSE = 0b1000;
    public const CONTEXT_FALSEY = self::CONTEXT_FALSE | self::CONTEXT_FALSEY_BUT_NOT_FALSE;
    /** @var int|null */
    private $value;
    /** @var self[] */
    private static $registry;
    private function __construct(?int $value)
    {
        $this->value = $value;
    }
    private static function create(?int $value) : self
    {
        self::$registry[$value] = self::$registry[$value] ?? new self($value);
        return self::$registry[$value];
    }
    public static function createTrue() : self
    {
        return self::create(self::CONTEXT_TRUE);
    }
    public static function createTruthy() : self
    {
        return self::create(self::CONTEXT_TRUTHY);
    }
    public static function createFalse() : self
    {
        return self::create(self::CONTEXT_FALSE);
    }
    public static function createFalsey() : self
    {
        return self::create(self::CONTEXT_FALSEY);
    }
    public static function createNull() : self
    {
        return self::create(null);
    }
    public function negate() : self
    {
        if ($this->value === null) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return self::create(~$this->value);
    }
    public function true() : bool
    {
        return $this->value !== null && (bool) ($this->value & self::CONTEXT_TRUE);
    }
    public function truthy() : bool
    {
        return $this->value !== null && (bool) ($this->value & self::CONTEXT_TRUTHY);
    }
    public function false() : bool
    {
        return $this->value !== null && (bool) ($this->value & self::CONTEXT_FALSE);
    }
    public function falsey() : bool
    {
        return $this->value !== null && (bool) ($this->value & self::CONTEXT_FALSEY);
    }
    public function null() : bool
    {
        return $this->value === null;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Analyser;

use _HumbugBoxb94336daae36\Nette\Utils\Json;
use PHPStan\File\FileHelper;
use PHPStan\Parser\Parser;
use PHPStan\Rules\FileRuleError;
use PHPStan\Rules\LineRuleError;
use PHPStan\Rules\Registry;
class Analyser
{
    /** @var \PHPStan\Analyser\ScopeFactory */
    private $scopeFactory;
    /** @var \PHPStan\Parser\Parser */
    private $parser;
    /** @var \PHPStan\Rules\Registry */
    private $registry;
    /** @var \PHPStan\Analyser\NodeScopeResolver */
    private $nodeScopeResolver;
    /** @var \PHPStan\File\FileHelper */
    private $fileHelper;
    /** @var (string|mixed[])[] */
    private $ignoreErrors;
    /** @var bool */
    private $reportUnmatchedIgnoredErrors;
    /** @var int */
    private $internalErrorsCountLimit;
    /** @var string|null */
    private $benchmarkFile;
    /** @var float[] */
    private $benchmarkData = [];
    /**
     * @param \PHPStan\Analyser\ScopeFactory $scopeFactory
     * @param \PHPStan\Parser\Parser $parser
     * @param \PHPStan\Rules\Registry $registry
     * @param \PHPStan\Analyser\NodeScopeResolver $nodeScopeResolver
     * @param \PHPStan\File\FileHelper $fileHelper
     * @param (string|array<string, string>)[] $ignoreErrors
     * @param bool $reportUnmatchedIgnoredErrors
     * @param int $internalErrorsCountLimit
     * @param string|null $benchmarkFile
     */
    public function __construct(\PHPStan\Analyser\ScopeFactory $scopeFactory, \PHPStan\Parser\Parser $parser, \PHPStan\Rules\Registry $registry, \PHPStan\Analyser\NodeScopeResolver $nodeScopeResolver, \PHPStan\File\FileHelper $fileHelper, array $ignoreErrors, bool $reportUnmatchedIgnoredErrors, int $internalErrorsCountLimit, ?string $benchmarkFile = null)
    {
        $this->scopeFactory = $scopeFactory;
        $this->parser = $parser;
        $this->registry = $registry;
        $this->nodeScopeResolver = $nodeScopeResolver;
        $this->fileHelper = $fileHelper;
        $this->ignoreErrors = $ignoreErrors;
        $this->reportUnmatchedIgnoredErrors = $reportUnmatchedIgnoredErrors;
        $this->internalErrorsCountLimit = $internalErrorsCountLimit;
        $this->benchmarkFile = $benchmarkFile;
    }
    /**
     * @param string[] $files
     * @param bool $onlyFiles
     * @param \Closure(string $file): void|null $preFileCallback
     * @param \Closure(string $file): void|null $postFileCallback
     * @param bool $debug
     * @return string[]|\PHPStan\Analyser\Error[] errors
     */
    public function analyse(array $files, bool $onlyFiles, ?\Closure $preFileCallback = null, ?\Closure $postFileCallback = null, bool $debug = \false) : array
    {
        $errors = [];
        foreach ($this->ignoreErrors as $ignoreError) {
            try {
                if (\is_array($ignoreError)) {
                    if (!isset($ignoreError['message'])) {
                        $errors[] = \sprintf('Ignored error %s is missing a message.', \_HumbugBoxb94336daae36\Nette\Utils\Json::encode($ignoreError));
                        continue;
                    }
                    if (!isset($ignoreError['path']) && !isset($ignoreError['paths'])) {
                        $errors[] = \sprintf('Ignored error %s is missing a path.', \_HumbugBoxb94336daae36\Nette\Utils\Json::encode($ignoreError));
                    }
                    $ignoreMessage = $ignoreError['message'];
                } else {
                    $ignoreMessage = $ignoreError;
                }
                \_HumbugBoxb94336daae36\Nette\Utils\Strings::match('', $ignoreMessage);
            } catch (\_HumbugBoxb94336daae36\Nette\Utils\RegexpException $e) {
                $errors[] = $e->getMessage();
            }
        }
        if (\count($errors) > 0) {
            return $errors;
        }
        $this->nodeScopeResolver->setAnalysedFiles($files);
        $internalErrorsCount = 0;
        $reachedInternalErrorsCountLimit = \false;
        foreach ($files as $file) {
            try {
                $fileErrors = [];
                if ($preFileCallback !== null) {
                    $preFileCallback($file);
                }
                if (\is_file($file)) {
                    $parserBenchmarkTime = $this->benchmarkStart();
                    $parserNodes = $this->parser->parseFile($file);
                    $this->benchmarkEnd($parserBenchmarkTime, 'parser');
                    $scopeBenchmarkTime = $this->benchmarkStart();
                    $this->nodeScopeResolver->processNodes($parserNodes, $this->scopeFactory->create(\PHPStan\Analyser\ScopeContext::create($file)), function (\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) use(&$fileErrors, $file, &$scopeBenchmarkTime) : void {
                        $this->benchmarkEnd($scopeBenchmarkTime, 'scope');
                        $uniquedAnalysedCodeExceptionMessages = [];
                        foreach ($this->registry->getRules(\get_class($node)) as $rule) {
                            try {
                                $ruleBenchmarkTime = $this->benchmarkStart();
                                $ruleErrors = $rule->processNode($node, $scope);
                                $this->benchmarkEnd($ruleBenchmarkTime, \sprintf('rule-%s', \get_class($rule)));
                            } catch (\PHPStan\AnalysedCodeException $e) {
                                if (isset($uniquedAnalysedCodeExceptionMessages[$e->getMessage()])) {
                                    continue;
                                }
                                $uniquedAnalysedCodeExceptionMessages[$e->getMessage()] = \true;
                                $fileErrors[] = new \PHPStan\Analyser\Error($e->getMessage(), $file, $node->getLine(), \false);
                                continue;
                            }
                            foreach ($ruleErrors as $ruleError) {
                                $line = $node->getLine();
                                $fileName = $scope->getFileDescription();
                                if (\is_string($ruleError)) {
                                    $message = $ruleError;
                                } else {
                                    $message = $ruleError->getMessage();
                                    if ($ruleError instanceof \PHPStan\Rules\LineRuleError && $ruleError->getLine() !== -1) {
                                        $line = $ruleError->getLine();
                                    }
                                    if ($ruleError instanceof \PHPStan\Rules\FileRuleError && $ruleError->getFile() !== '') {
                                        $fileName = $ruleError->getFile();
                                    }
                                }
                                $fileErrors[] = new \PHPStan\Analyser\Error($message, $fileName, $line);
                            }
                        }
                        $scopeBenchmarkTime = $this->benchmarkStart();
                    });
                } elseif (\is_dir($file)) {
                    $fileErrors[] = new \PHPStan\Analyser\Error(\sprintf('File %s is a directory.', $file), $file, null, \false);
                } else {
                    $fileErrors[] = new \PHPStan\Analyser\Error(\sprintf('File %s does not exist.', $file), $file, null, \false);
                }
                if ($postFileCallback !== null) {
                    $postFileCallback($file);
                }
                $errors = \array_merge($errors, $fileErrors);
            } catch (\PhpParser\Error $e) {
                $errors[] = new \PHPStan\Analyser\Error($e->getMessage(), $file, $e->getStartLine() !== -1 ? $e->getStartLine() : null, \false);
            } catch (\PHPStan\Parser\ParserErrorsException $e) {
                foreach ($e->getErrors() as $error) {
                    $errors[] = new \PHPStan\Analyser\Error($error->getMessage(), $file, $error->getStartLine() !== -1 ? $error->getStartLine() : null, \false);
                }
            } catch (\PHPStan\AnalysedCodeException $e) {
                $errors[] = new \PHPStan\Analyser\Error($e->getMessage(), $file, null, \false);
            } catch (\Throwable $t) {
                if ($debug) {
                    throw $t;
                }
                $internalErrorsCount++;
                $internalErrorMessage = \sprintf('Internal error: %s', $t->getMessage());
                $internalErrorMessage .= \sprintf('%sRun PHPStan with --debug option and post the stack trace to:%s%s', "\n", "\n", 'https://github.com/phpstan/phpstan/issues/new');
                $errors[] = new \PHPStan\Analyser\Error($internalErrorMessage, $file);
                if ($internalErrorsCount >= $this->internalErrorsCountLimit) {
                    $reachedInternalErrorsCountLimit = \true;
                    break;
                }
            }
        }
        if ($this->benchmarkFile !== null) {
            \uasort($this->benchmarkData, static function (float $a, float $b) : int {
                return $b <=> $a;
            });
            \file_put_contents($this->benchmarkFile, \_HumbugBoxb94336daae36\Nette\Utils\Json::encode($this->benchmarkData, \_HumbugBoxb94336daae36\Nette\Utils\Json::PRETTY));
        }
        $unmatchedIgnoredErrors = $this->ignoreErrors;
        $addErrors = [];
        $errors = \array_values(\array_filter($errors, function (\PHPStan\Analyser\Error $error) use(&$unmatchedIgnoredErrors, &$addErrors) : bool {
            foreach ($this->ignoreErrors as $i => $ignore) {
                $shouldBeIgnored = \false;
                if (\is_string($ignore)) {
                    $shouldBeIgnored = \PHPStan\Analyser\IgnoredError::shouldIgnore($this->fileHelper, $error, $ignore, null);
                    if ($shouldBeIgnored) {
                        unset($unmatchedIgnoredErrors[$i]);
                    }
                } else {
                    if (isset($ignore['path'])) {
                        $shouldBeIgnored = \PHPStan\Analyser\IgnoredError::shouldIgnore($this->fileHelper, $error, $ignore['message'], $ignore['path']);
                        if ($shouldBeIgnored) {
                            unset($unmatchedIgnoredErrors[$i]);
                        }
                    } elseif (isset($ignore['paths'])) {
                        foreach ($ignore['paths'] as $j => $ignorePath) {
                            $shouldBeIgnored = \PHPStan\Analyser\IgnoredError::shouldIgnore($this->fileHelper, $error, $ignore['message'], $ignorePath);
                            if ($shouldBeIgnored) {
                                if (isset($unmatchedIgnoredErrors[$i])) {
                                    if (!\is_array($unmatchedIgnoredErrors[$i])) {
                                        throw new \PHPStan\ShouldNotHappenException();
                                    }
                                    unset($unmatchedIgnoredErrors[$i]['paths'][$j]);
                                    if (isset($unmatchedIgnoredErrors[$i]['paths']) && \count($unmatchedIgnoredErrors[$i]['paths']) === 0) {
                                        unset($unmatchedIgnoredErrors[$i]);
                                    }
                                }
                                break;
                            }
                        }
                    } else {
                        throw new \PHPStan\ShouldNotHappenException();
                    }
                }
                if ($shouldBeIgnored) {
                    if (!$error->canBeIgnored()) {
                        $addErrors[] = \sprintf('Error message "%s" cannot be ignored, use excludes_analyse instead.', $error->getMessage());
                        return \true;
                    }
                    return \false;
                }
            }
            return \true;
        }));
        $errors = \array_merge($errors, $addErrors);
        if (!$onlyFiles && $this->reportUnmatchedIgnoredErrors && !$reachedInternalErrorsCountLimit) {
            foreach ($unmatchedIgnoredErrors as $unmatchedIgnoredError) {
                $errors[] = \sprintf('Ignored error pattern %s was not matched in reported errors.', \PHPStan\Analyser\IgnoredError::stringifyPattern($unmatchedIgnoredError));
            }
        }
        if ($reachedInternalErrorsCountLimit) {
            $errors[] = \sprintf('Reached internal errors count limit of %d, exiting...', $this->internalErrorsCountLimit);
        }
        return $errors;
    }
    private function benchmarkStart() : ?float
    {
        if ($this->benchmarkFile === null) {
            return null;
        }
        return \microtime(\true);
    }
    private function benchmarkEnd(?float $startTime, string $description) : void
    {
        if ($this->benchmarkFile === null) {
            return;
        }
        if ($startTime === null) {
            return;
        }
        $elapsedTime = \microtime(\true) - $startTime;
        if (!isset($this->benchmarkData[$description])) {
            $this->benchmarkData[$description] = $elapsedTime;
            return;
        }
        $this->benchmarkData[$description] += $elapsedTime;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Analyser;

class NameScope
{
    /** @var string|null */
    private $namespace;
    /** @var string[] alias(string) => fullName(string) */
    private $uses;
    /** @var string|null */
    private $className;
    /**
     * @param string|null $namespace
     * @param string[] $uses alias(string) => fullName(string)
     * @param string|null $className
     */
    public function __construct(?string $namespace, array $uses, ?string $className = null)
    {
        $this->namespace = $namespace;
        $this->uses = $uses;
        $this->className = $className;
    }
    public function getClassName() : ?string
    {
        return $this->className;
    }
    public function resolveStringName(string $name) : string
    {
        if (\strpos($name, '\\') === 0) {
            return \ltrim($name, '\\');
        }
        $nameParts = \explode('\\', $name);
        $firstNamePart = \strtolower($nameParts[0]);
        if (isset($this->uses[$firstNamePart])) {
            if (\count($nameParts) === 1) {
                return $this->uses[$firstNamePart];
            }
            \array_shift($nameParts);
            return \sprintf('%s\\%s', $this->uses[$firstNamePart], \implode('\\', $nameParts));
        }
        if ($this->namespace !== null) {
            return \sprintf('%s\\%s', $this->namespace, $name);
        }
        return $name;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Analyser;

use PhpParser\Node\Stmt;
class StatementResult
{
    /** @var Scope */
    private $scope;
    /** @var bool */
    private $hasYield;
    /** @var bool */
    private $isAlwaysTerminating;
    /** @var StatementExitPoint[] */
    private $exitPoints;
    /**
     * @param Scope $scope
     * @param bool $hasYield
     * @param bool $isAlwaysTerminating
     * @param StatementExitPoint[] $exitPoints
     */
    public function __construct(\PHPStan\Analyser\Scope $scope, bool $hasYield, bool $isAlwaysTerminating, array $exitPoints)
    {
        $this->scope = $scope;
        $this->hasYield = $hasYield;
        $this->isAlwaysTerminating = $isAlwaysTerminating;
        $this->exitPoints = $exitPoints;
    }
    public function getScope() : \PHPStan\Analyser\Scope
    {
        return $this->scope;
    }
    public function hasYield() : bool
    {
        return $this->hasYield;
    }
    public function isAlwaysTerminating() : bool
    {
        return $this->isAlwaysTerminating;
    }
    public function filterOutLoopExitPoints() : self
    {
        if (!$this->isAlwaysTerminating) {
            return $this;
        }
        foreach ($this->exitPoints as $exitPoint) {
            $statement = $exitPoint->getStatement();
            if ($statement instanceof \PhpParser\Node\Stmt\Break_ || $statement instanceof \PhpParser\Node\Stmt\Continue_) {
                return new self($this->scope, $this->hasYield, \false, $this->exitPoints);
            }
        }
        return $this;
    }
    /**
     * @return StatementExitPoint[]
     */
    public function getExitPoints() : array
    {
        return $this->exitPoints;
    }
    /**
     * @param string $stmtClass
     * @return StatementExitPoint[]
     */
    public function getExitPointsByType(string $stmtClass) : array
    {
        $exitPoints = [];
        foreach ($this->exitPoints as $exitPoint) {
            if (!$exitPoint->getStatement() instanceof $stmtClass) {
                continue;
            }
            $exitPoints[] = $exitPoint;
        }
        return $exitPoints;
    }
    /**
     * @return StatementExitPoint[]
     */
    public function getTerminatingExitPoints() : array
    {
        $exitPoints = [];
        foreach ($this->exitPoints as $exitPoint) {
            if ($exitPoint->getStatement() instanceof \PhpParser\Node\Stmt\Break_) {
                continue;
            }
            if ($exitPoint->getStatement() instanceof \PhpParser\Node\Stmt\Continue_) {
                continue;
            }
            $exitPoints[] = $exitPoint;
        }
        return $exitPoints;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Analyser;

use PHPStan\File\FileExcluder;
use PHPStan\File\FileHelper;
class IgnoredError
{
    /**
     * @phpcsSuppress SlevomatCodingStandard.TypeHints.TypeHintDeclaration.MissingParameterTypeHint
     * @param mixed[]|string $ignoredError
     * @return string Representation of the ignored error
     */
    public static function stringifyPattern($ignoredError) : string
    {
        if (!\is_array($ignoredError)) {
            return $ignoredError;
        }
        // ignore by path
        if (isset($ignoredError['path'])) {
            return \sprintf('%s in path %s', $ignoredError['message'], $ignoredError['path']);
        } elseif (isset($ignoredError['paths'])) {
            if (\count($ignoredError['paths']) === 1) {
                return \sprintf('%s in path %s', $ignoredError['message'], \implode(', ', $ignoredError['paths']));
            }
            return \sprintf('%s in paths: %s', $ignoredError['message'], \implode(', ', $ignoredError['paths']));
        }
        return $ignoredError['message'];
    }
    /**
     * @phpcsSuppress SlevomatCodingStandard.TypeHints.TypeHintDeclaration.MissingParameterTypeHint
     * @param FileHelper $fileHelper
     * @param Error $error
     * @param string $ignoredErrorPattern
     * @param string|null $path
     * @return bool To ignore or not to ignore?
     */
    public static function shouldIgnore(\PHPStan\File\FileHelper $fileHelper, \PHPStan\Analyser\Error $error, string $ignoredErrorPattern, ?string $path) : bool
    {
        if ($path !== null) {
            $fileExcluder = new \PHPStan\File\FileExcluder($fileHelper, [$path]);
            return \_HumbugBoxb94336daae36\Nette\Utils\Strings::match($error->getMessage(), $ignoredErrorPattern) !== null && $fileExcluder->isExcludedFromAnalysing($error->getFile());
        }
        return \_HumbugBoxb94336daae36\Nette\Utils\Strings::match($error->getMessage(), $ignoredErrorPattern) !== null;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Analyser;

class EnsuredNonNullabilityResult
{
    /** @var Scope */
    private $scope;
    /** @var EnsuredNonNullabilityResultExpression[] */
    private $specifiedExpressions;
    /**
     * @param Scope $scope
     * @param EnsuredNonNullabilityResultExpression[] $specifiedExpressions
     */
    public function __construct(\PHPStan\Analyser\Scope $scope, array $specifiedExpressions)
    {
        $this->scope = $scope;
        $this->specifiedExpressions = $specifiedExpressions;
    }
    public function getScope() : \PHPStan\Analyser\Scope
    {
        return $this->scope;
    }
    /**
     * @return EnsuredNonNullabilityResultExpression[]
     */
    public function getSpecifiedExpressions() : array
    {
        return $this->specifiedExpressions;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules;

use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ParametersAcceptor;
use PHPStan\Type\ArrayType;
use PHPStan\Type\IterableType;
use PHPStan\Type\MixedType;
use PHPStan\Type\VerbosityLevel;
use PHPStan\Type\VoidType;
class FunctionCallParametersCheck
{
    /** @var \PHPStan\Rules\RuleLevelHelper */
    private $ruleLevelHelper;
    /** @var bool */
    private $checkArgumentTypes;
    /** @var bool */
    private $checkArgumentsPassedByReference;
    public function __construct(\PHPStan\Rules\RuleLevelHelper $ruleLevelHelper, bool $checkArgumentTypes, bool $checkArgumentsPassedByReference)
    {
        $this->ruleLevelHelper = $ruleLevelHelper;
        $this->checkArgumentTypes = $checkArgumentTypes;
        $this->checkArgumentsPassedByReference = $checkArgumentsPassedByReference;
    }
    /**
     * @param \PHPStan\Reflection\ParametersAcceptor $parametersAcceptor
     * @param \PHPStan\Analyser\Scope $scope
     * @param \PhpParser\Node\Expr\FuncCall|\PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall|\PhpParser\Node\Expr\New_ $funcCall
     * @param string[] $messages Eight message templates
     * @return string[]
     */
    public function check(\PHPStan\Reflection\ParametersAcceptor $parametersAcceptor, \PHPStan\Analyser\Scope $scope, $funcCall, array $messages) : array
    {
        $functionParametersMinCount = 0;
        $functionParametersMaxCount = 0;
        foreach ($parametersAcceptor->getParameters() as $parameter) {
            if (!$parameter->isOptional()) {
                $functionParametersMinCount++;
            }
            $functionParametersMaxCount++;
        }
        if ($parametersAcceptor->isVariadic()) {
            $functionParametersMaxCount = -1;
        }
        $errors = [];
        $invokedParametersCount = \count($funcCall->args);
        foreach ($funcCall->args as $arg) {
            if ($arg->unpack) {
                $invokedParametersCount = \max($functionParametersMinCount, $functionParametersMaxCount);
                break;
            }
        }
        if ($invokedParametersCount < $functionParametersMinCount || $invokedParametersCount > $functionParametersMaxCount) {
            if ($functionParametersMinCount === $functionParametersMaxCount) {
                $errors[] = \sprintf($invokedParametersCount === 1 ? $messages[0] : $messages[1], $invokedParametersCount, $functionParametersMinCount);
            } elseif ($functionParametersMaxCount === -1 && $invokedParametersCount < $functionParametersMinCount) {
                $errors[] = \sprintf($invokedParametersCount === 1 ? $messages[2] : $messages[3], $invokedParametersCount, $functionParametersMinCount);
            } elseif ($functionParametersMaxCount !== -1) {
                $errors[] = \sprintf($invokedParametersCount === 1 ? $messages[4] : $messages[5], $invokedParametersCount, $functionParametersMinCount, $functionParametersMaxCount);
            }
        }
        if ($scope->getType($funcCall) instanceof \PHPStan\Type\VoidType && !$scope->isInFirstLevelStatement() && !$funcCall instanceof \PhpParser\Node\Expr\New_) {
            $errors[] = $messages[7];
        }
        if (!$this->checkArgumentTypes && !$this->checkArgumentsPassedByReference) {
            return $errors;
        }
        $parameters = $parametersAcceptor->getParameters();
        /** @var array<int, \PhpParser\Node\Arg> $args */
        $args = $funcCall->args;
        foreach ($args as $i => $argument) {
            if (!isset($parameters[$i])) {
                if (!$parametersAcceptor->isVariadic() || \count($parameters) === 0) {
                    break;
                }
                $parameter = $parameters[\count($parameters) - 1];
                $parameterType = $parameter->getType();
                if (!$parameterType instanceof \PHPStan\Type\ArrayType) {
                    break;
                }
                if (!$argument->unpack) {
                    $parameterType = $parameterType->getItemType();
                }
            } else {
                $parameter = $parameters[$i];
                $parameterType = $parameter->getType();
                if ($parameter->isVariadic()) {
                    if ($parameterType instanceof \PHPStan\Type\ArrayType && !$argument->unpack) {
                        $parameterType = $parameterType->getItemType();
                    }
                } elseif ($argument->unpack) {
                    continue;
                }
            }
            $argumentValueType = $scope->getType($argument->value);
            $secondAccepts = null;
            if ($parameterType->isIterable()->yes() && $parameter->isVariadic()) {
                $secondAccepts = $this->ruleLevelHelper->accepts(new \PHPStan\Type\IterableType(new \PHPStan\Type\MixedType(), $parameterType->getIterableValueType()), $argumentValueType, $scope->isDeclareStrictTypes());
            }
            if ($this->checkArgumentTypes && !$parameter->passedByReference()->createsNewVariable() && !$this->ruleLevelHelper->accepts($parameterType, $argumentValueType, $scope->isDeclareStrictTypes()) && ($secondAccepts === null || !$secondAccepts)) {
                $verbosityLevel = $parameterType->isCallable()->yes() ? \PHPStan\Type\VerbosityLevel::value() : \PHPStan\Type\VerbosityLevel::typeOnly();
                $errors[] = \sprintf($messages[6], $i + 1, \sprintf('%s$%s', $parameter->isVariadic() ? '...' : '', $parameter->getName()), $parameterType->describe($verbosityLevel), $argumentValueType->describe($verbosityLevel));
            }
            if (!$this->checkArgumentsPassedByReference || !$parameter->passedByReference()->yes() || $argument->value instanceof \PhpParser\Node\Expr\Variable || $argument->value instanceof \PhpParser\Node\Expr\ArrayDimFetch || $argument->value instanceof \PhpParser\Node\Expr\PropertyFetch || $argument->value instanceof \PhpParser\Node\Expr\StaticPropertyFetch) {
                continue;
            }
            $errors[] = \sprintf($messages[8], $i + 1, \sprintf('%s$%s', $parameter->isVariadic() ? '...' : '', $parameter->getName()));
        }
        return $errors;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules;

interface FileRuleError extends \PHPStan\Rules\RuleError
{
    public function getFile() : string;
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\PhpDoc;

use PhpParser\Node;
use PhpParser\Node\Expr\Variable;
use PHPStan\Analyser\Scope;
use PHPStan\Type\ArrayType;
use PHPStan\Type\ErrorType;
use PHPStan\Type\FileTypeMapper;
use PHPStan\Type\NeverType;
use PHPStan\Type\Type;
use PHPStan\Type\VerbosityLevel;
class IncompatiblePhpDocTypeRule implements \PHPStan\Rules\Rule
{
    /** @var FileTypeMapper */
    private $fileTypeMapper;
    public function __construct(\PHPStan\Type\FileTypeMapper $fileTypeMapper)
    {
        $this->fileTypeMapper = $fileTypeMapper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\FunctionLike::class;
    }
    /**
     * @param \PhpParser\Node\FunctionLike $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $docComment = $node->getDocComment();
        if ($docComment === null) {
            return [];
        }
        $resolvedPhpDoc = $this->fileTypeMapper->getResolvedPhpDoc($scope->getFile(), $scope->isInClass() ? $scope->getClassReflection()->getName() : null, $scope->isInTrait() ? $scope->getTraitReflection()->getName() : null, $docComment->getText());
        $nativeParameterTypes = $this->getNativeParameterTypes($node, $scope);
        $nativeReturnType = $this->getNativeReturnType($node, $scope);
        $errors = [];
        foreach ($resolvedPhpDoc->getParamTags() as $parameterName => $phpDocParamTag) {
            $phpDocParamType = $phpDocParamTag->getType();
            if (!isset($nativeParameterTypes[$parameterName])) {
                $errors[] = \sprintf('PHPDoc tag @param references unknown parameter: $%s', $parameterName);
            } elseif ($phpDocParamType instanceof \PHPStan\Type\ErrorType || $phpDocParamType instanceof \PHPStan\Type\NeverType) {
                $errors[] = \sprintf('PHPDoc tag @param for parameter $%s contains unresolvable type.', $parameterName);
            } else {
                $nativeParamType = $nativeParameterTypes[$parameterName];
                $isParamSuperType = $nativeParamType->isSuperTypeOf($phpDocParamType);
                if ($phpDocParamTag->isVariadic() && $nativeParamType instanceof \PHPStan\Type\ArrayType && $nativeParamType->getItemType() instanceof \PHPStan\Type\ArrayType) {
                    continue;
                }
                if ($isParamSuperType->no()) {
                    $errors[] = \sprintf('PHPDoc tag @param for parameter $%s with type %s is incompatible with native type %s.', $parameterName, $phpDocParamType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $nativeParamType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()));
                } elseif ($isParamSuperType->maybe()) {
                    $errors[] = \sprintf('PHPDoc tag @param for parameter $%s with type %s is not subtype of native type %s.', $parameterName, $phpDocParamType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $nativeParamType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()));
                }
            }
        }
        if ($resolvedPhpDoc->getReturnTag() !== null) {
            $phpDocReturnType = $resolvedPhpDoc->getReturnTag()->getType();
            if ($phpDocReturnType instanceof \PHPStan\Type\ErrorType || $phpDocReturnType instanceof \PHPStan\Type\NeverType) {
                $errors[] = 'PHPDoc tag @return contains unresolvable type.';
            } else {
                $isReturnSuperType = $nativeReturnType->isSuperTypeOf($phpDocReturnType);
                if ($isReturnSuperType->no()) {
                    $errors[] = \sprintf('PHPDoc tag @return with type %s is incompatible with native type %s.', $phpDocReturnType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $nativeReturnType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()));
                } elseif ($isReturnSuperType->maybe()) {
                    $errors[] = \sprintf('PHPDoc tag @return with type %s is not subtype of native type %s.', $phpDocReturnType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $nativeReturnType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()));
                }
            }
        }
        return $errors;
    }
    /**
     * @param Node\FunctionLike $node
     * @param Scope $scope
     * @return Type[]
     */
    private function getNativeParameterTypes(\PhpParser\Node\FunctionLike $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $nativeParameterTypes = [];
        foreach ($node->getParams() as $parameter) {
            $isNullable = $scope->isParameterValueNullable($parameter);
            if (!$parameter->var instanceof \PhpParser\Node\Expr\Variable || !\is_string($parameter->var->name)) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            $nativeParameterTypes[$parameter->var->name] = $scope->getFunctionType($parameter->type, $isNullable, $parameter->variadic);
        }
        return $nativeParameterTypes;
    }
    private function getNativeReturnType(\PhpParser\Node\FunctionLike $node, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
    {
        return $scope->getFunctionType($node->getReturnType(), \false, \false);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\PhpDoc;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\Rule;
use PHPStan\Type\ErrorType;
use PHPStan\Type\NeverType;
class IncompatiblePropertyPhpDocTypeRule implements \PHPStan\Rules\Rule
{
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\PropertyProperty::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\PropertyProperty $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$scope->isInClass()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        $propertyName = $node->name->toString();
        $propertyReflection = $scope->getClassReflection()->getNativeProperty($propertyName);
        if ($propertyReflection->getType() instanceof \PHPStan\Type\ErrorType || $propertyReflection->getType() instanceof \PHPStan\Type\NeverType) {
            return [\sprintf('PHPDoc tag @var for property %s::$%s contains unresolvable type.', $propertyReflection->getDeclaringClass()->getName(), $propertyName)];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\PhpDoc;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Type\FileTypeMapper;
use PHPStan\Type\ObjectType;
use PHPStan\Type\VerbosityLevel;
use PHPStan\Type\VoidType;
class InvalidThrowsPhpDocValueRule implements \PHPStan\Rules\Rule
{
    /** @var FileTypeMapper */
    private $fileTypeMapper;
    public function __construct(\PHPStan\Type\FileTypeMapper $fileTypeMapper)
    {
        $this->fileTypeMapper = $fileTypeMapper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\FunctionLike::class;
    }
    /**
     * @param \PhpParser\Node\FunctionLike $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $docComment = $node->getDocComment();
        if ($docComment === null) {
            return [];
        }
        $resolvedPhpDoc = $this->fileTypeMapper->getResolvedPhpDoc($scope->getFile(), $scope->isInClass() ? $scope->getClassReflection()->getName() : null, $scope->isInTrait() ? $scope->getTraitReflection()->getName() : null, $docComment->getText());
        if ($resolvedPhpDoc->getThrowsTag() === null) {
            return [];
        }
        $phpDocThrowsType = $resolvedPhpDoc->getThrowsTag()->getType();
        if ((new \PHPStan\Type\VoidType())->isSuperTypeOf($phpDocThrowsType)->yes()) {
            return [];
        }
        $isThrowsSuperType = (new \PHPStan\Type\ObjectType(\Throwable::class))->isSuperTypeOf($phpDocThrowsType);
        if ($isThrowsSuperType->yes()) {
            return [];
        }
        return [\sprintf('PHPDoc tag @throws with type %s is not subtype of Throwable', $phpDocThrowsType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\PhpDoc;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\PhpDocParser\Ast\PhpDoc\InvalidTagValueNode;
use PHPStan\PhpDocParser\Lexer\Lexer;
use PHPStan\PhpDocParser\Parser\PhpDocParser;
use PHPStan\PhpDocParser\Parser\TokenIterator;
class InvalidPhpDocTagValueRule implements \PHPStan\Rules\Rule
{
    /** @var Lexer */
    private $phpDocLexer;
    /** @var PhpDocParser */
    private $phpDocParser;
    public function __construct(\PHPStan\PhpDocParser\Lexer\Lexer $phpDocLexer, \PHPStan\PhpDocParser\Parser\PhpDocParser $phpDocParser)
    {
        $this->phpDocLexer = $phpDocLexer;
        $this->phpDocParser = $phpDocParser;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node::class;
    }
    /**
     * @param \PhpParser\Node $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node instanceof \PhpParser\Node\Stmt\ClassLike && !$node instanceof \PhpParser\Node\FunctionLike && !$node instanceof \PhpParser\Node\Stmt\Foreach_ && !$node instanceof \PhpParser\Node\Stmt\Property && !$node instanceof \PhpParser\Node\Expr\Assign && !$node instanceof \PhpParser\Node\Expr\AssignRef) {
            return [];
        }
        $docComment = $node->getDocComment();
        if ($docComment === null) {
            return [];
        }
        $phpDocString = $docComment->getText();
        $tokens = new \PHPStan\PhpDocParser\Parser\TokenIterator($this->phpDocLexer->tokenize($phpDocString));
        $phpDocNode = $this->phpDocParser->parse($tokens);
        $errors = [];
        foreach ($phpDocNode->getTags() as $phpDocTag) {
            if (!$phpDocTag->value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\InvalidTagValueNode) {
                continue;
            }
            $errors[] = \sprintf('PHPDoc tag %s has invalid value (%s): %s', $phpDocTag->name, $phpDocTag->value->value, $phpDocTag->value->exception->getMessage());
        }
        return $errors;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\RuleErrors;

use PHPStan\Rules\RuleError;
class RuleErrorWithMessage implements \PHPStan\Rules\RuleError
{
    /** @var string */
    private $message;
    public function __construct(string $message)
    {
        $this->message = $message;
    }
    public function getMessage() : string
    {
        return $this->message;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\RuleErrors;

use PHPStan\Rules\FileRuleError;
class RuleErrorWithMessageAndFile implements \PHPStan\Rules\FileRuleError
{
    /** @var string */
    private $message;
    /** @var string */
    private $file;
    public function __construct(string $message, string $file)
    {
        $this->message = $message;
        $this->file = $file;
    }
    public function getMessage() : string
    {
        return $this->message;
    }
    public function getFile() : string
    {
        return $this->file;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\RuleErrors;

use PHPStan\Rules\LineRuleError;
class RuleErrorWithMessageAndLine implements \PHPStan\Rules\LineRuleError
{
    /** @var string */
    private $message;
    /** @var int */
    private $line;
    public function __construct(string $message, int $line)
    {
        $this->message = $message;
        $this->line = $line;
    }
    public function getMessage() : string
    {
        return $this->message;
    }
    public function getLine() : int
    {
        return $this->line;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\RuleErrors;

use PHPStan\Rules\FileRuleError;
use PHPStan\Rules\LineRuleError;
class RuleErrorWithMessageAndLineAndFile implements \PHPStan\Rules\LineRuleError, \PHPStan\Rules\FileRuleError
{
    /** @var string */
    private $message;
    /** @var int */
    private $line;
    /** @var string */
    private $file;
    public function __construct(string $message, int $line, string $file)
    {
        $this->message = $message;
        $this->line = $line;
        $this->file = $file;
    }
    public function getMessage() : string
    {
        return $this->message;
    }
    public function getLine() : int
    {
        return $this->line;
    }
    public function getFile() : string
    {
        return $this->file;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules;

use PHPStan\Broker\Broker;
use PHPStan\Reflection\ClassReflection;
class ClassCaseSensitivityCheck
{
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    public function __construct(\PHPStan\Broker\Broker $broker)
    {
        $this->broker = $broker;
    }
    /**
     * @param ClassNameNodePair[] $pairs
     * @return RuleError[]
     */
    public function checkClassNames(array $pairs) : array
    {
        $errors = [];
        foreach ($pairs as $pair) {
            $className = $pair->getClassName();
            if (!$this->broker->hasClass($className)) {
                continue;
            }
            $classReflection = $this->broker->getClass($className);
            $realClassName = $classReflection->getName();
            if (\strtolower($realClassName) !== \strtolower($className)) {
                continue;
                // skip class alias
            }
            if ($realClassName === $className) {
                continue;
            }
            $errors[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf('%s %s referenced with incorrect case: %s.', $this->getTypeName($classReflection), $realClassName, $className))->line($pair->getNode()->getLine())->build();
        }
        return $errors;
    }
    private function getTypeName(\PHPStan\Reflection\ClassReflection $classReflection) : string
    {
        if ($classReflection->isInterface()) {
            return 'Interface';
        } elseif ($classReflection->isTrait()) {
            return 'Trait';
        }
        return 'Class';
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Methods;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Node\InClassMethodNode;
use PHPStan\Reflection\Php\PhpMethodFromParserNodeReflection;
use PHPStan\Rules\FunctionDefinitionCheck;
use PHPStan\Rules\RuleError;
class ExistingClassesInTypehintsRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\FunctionDefinitionCheck */
    private $check;
    public function __construct(\PHPStan\Rules\FunctionDefinitionCheck $check)
    {
        $this->check = $check;
    }
    public function getNodeType() : string
    {
        return \PHPStan\Node\InClassMethodNode::class;
    }
    /**
     * @param \PHPStan\Node\InClassMethodNode $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $methodReflection = $scope->getFunction();
        if (!$methodReflection instanceof \PHPStan\Reflection\Php\PhpMethodFromParserNodeReflection) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        if (!$scope->isInClass()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $this->check->checkClassMethod($methodReflection, $node->getOriginalNode(), \sprintf('Parameter $%%s of method %s::%s() has invalid typehint type %%s.', $scope->getClassReflection()->getDisplayName(), $methodReflection->getName()), \sprintf('Return typehint of method %s::%s() has invalid type %%s.', $scope->getClassReflection()->getDisplayName(), $methodReflection->getName()));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Methods;

use PhpParser\Node;
use PhpParser\Node\Stmt\Return_;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Rules\FunctionReturnTypeCheck;
class ReturnTypeRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\FunctionReturnTypeCheck */
    private $returnTypeCheck;
    public function __construct(\PHPStan\Rules\FunctionReturnTypeCheck $returnTypeCheck)
    {
        $this->returnTypeCheck = $returnTypeCheck;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\Return_::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\Return_ $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if ($scope->getFunction() === null) {
            return [];
        }
        if ($scope->isInAnonymousFunction()) {
            return [];
        }
        $method = $scope->getFunction();
        if (!$method instanceof \PHPStan\Reflection\MethodReflection) {
            return [];
        }
        $reflection = null;
        if ($method->getDeclaringClass()->getNativeReflection()->hasMethod($method->getName())) {
            $reflection = $method->getDeclaringClass()->getNativeReflection()->getMethod($method->getName());
        }
        return $this->returnTypeCheck->checkReturnType($scope, \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($method->getVariants())->getReturnType(), $node->expr, \sprintf('Method %s::%s() should return %%s but empty return statement found.', $method->getDeclaringClass()->getDisplayName(), $method->getName()), \sprintf('Method %s::%s() with return type void returns %%s but should not return anything.', $method->getDeclaringClass()->getDisplayName(), $method->getName()), \sprintf('Method %s::%s() should return %%s but returns %%s.', $method->getDeclaringClass()->getDisplayName(), $method->getName()), $reflection !== null && $reflection->isGenerator());
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Methods;

use PhpParser\Node;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\ParameterReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\TrinaryLogic;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
use PHPStan\Type\VerbosityLevel;
use PHPStan\Type\VoidType;
class MethodSignatureRule implements \PHPStan\Rules\Rule
{
    /** @var bool */
    private $reportMaybes;
    /** @var bool */
    private $reportStatic;
    public function __construct(bool $reportMaybes, bool $reportStatic)
    {
        $this->reportMaybes = $reportMaybes;
        $this->reportStatic = $reportStatic;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\ClassMethod::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\ClassMethod $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $methodName = (string) $node->name;
        if ($methodName === '__construct') {
            return [];
        }
        $class = $scope->getClassReflection();
        if ($class === null) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        $method = $class->getNativeMethod($methodName);
        if (!$this->reportStatic && $method->isStatic()) {
            return [];
        }
        if ($method->isPrivate()) {
            return [];
        }
        $parameters = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($method->getVariants());
        $errors = [];
        foreach ($this->collectParentMethods($methodName, $class, $scope) as $parentMethod) {
            $parentParameters = \PHPStan\Reflection\ParametersAcceptorSelector::selectFromTypes(\array_map(static function (\PHPStan\Reflection\ParameterReflection $parameter) : Type {
                return $parameter->getType();
            }, $parameters->getParameters()), $parentMethod->getVariants(), \false);
            $returnTypeCompatibility = $this->checkReturnTypeCompatibility($parameters->getReturnType(), $parentParameters->getReturnType());
            if ($returnTypeCompatibility->no() || !$returnTypeCompatibility->yes() && $this->reportMaybes) {
                $errors[] = \sprintf('Return type (%s) of method %s::%s() should be %s with return type (%s) of method %s::%s()', $parameters->getReturnType()->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $method->getDeclaringClass()->getDisplayName(), $method->getName(), $returnTypeCompatibility->no() ? 'compatible' : 'covariant', $parentParameters->getReturnType()->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $parentMethod->getDeclaringClass()->getDisplayName(), $parentMethod->getName());
            }
            $parameterResults = $this->checkParameterTypeCompatibility($parameters->getParameters(), $parentParameters->getParameters());
            foreach ($parameterResults as $parameterIndex => $parameterResult) {
                if ($parameterResult->yes()) {
                    continue;
                }
                if (!$parameterResult->no() && !$this->reportMaybes) {
                    continue;
                }
                $parameter = $parameters->getParameters()[$parameterIndex];
                $parentParameter = $parentParameters->getParameters()[$parameterIndex];
                $errors[] = \sprintf('Parameter #%d $%s (%s) of method %s::%s() should be %s with parameter $%s (%s) of method %s::%s()', $parameterIndex + 1, $parameter->getName(), $parameter->getType()->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $method->getDeclaringClass()->getDisplayName(), $method->getName(), $parameterResult->no() ? 'compatible' : 'contravariant', $parentParameter->getName(), $parentParameter->getType()->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $parentMethod->getDeclaringClass()->getDisplayName(), $parentMethod->getName());
            }
        }
        return $errors;
    }
    /**
     * @param string $methodName
     * @param \PHPStan\Reflection\ClassReflection $class
     * @param \PHPStan\Analyser\Scope $scope
     * @return \PHPStan\Reflection\MethodReflection[]
     */
    private function collectParentMethods(string $methodName, \PHPStan\Reflection\ClassReflection $class, \PHPStan\Analyser\Scope $scope) : array
    {
        $parentMethods = [];
        $parentClass = $class->getParentClass();
        if ($parentClass !== \false && $parentClass->hasMethod($methodName)) {
            $parentMethod = $parentClass->getMethod($methodName, $scope);
            if (!$parentMethod->isPrivate()) {
                $parentMethods[] = $parentMethod;
            }
        }
        foreach ($class->getInterfaces() as $interface) {
            if (!$interface->hasMethod($methodName)) {
                continue;
            }
            $parentMethods[] = $interface->getMethod($methodName, $scope);
        }
        return $parentMethods;
    }
    private function checkReturnTypeCompatibility(\PHPStan\Type\Type $returnType, \PHPStan\Type\Type $parentReturnType) : \PHPStan\TrinaryLogic
    {
        // Allow adding `void` return type hints when the parent defines no return type
        if ($returnType instanceof \PHPStan\Type\VoidType && $parentReturnType instanceof \PHPStan\Type\MixedType) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        // We can return anything
        if ($parentReturnType instanceof \PHPStan\Type\VoidType) {
            return \PHPStan\TrinaryLogic::createYes();
        }
        return $parentReturnType->isSuperTypeOf($returnType);
    }
    /**
     * @param \PHPStan\Reflection\ParameterReflection[] $parameters
     * @param \PHPStan\Reflection\ParameterReflection[] $parentParameters
     * @return array<int, TrinaryLogic>
     */
    private function checkParameterTypeCompatibility(array $parameters, array $parentParameters) : array
    {
        $parameterResults = [];
        $numberOfParameters = \min(\count($parameters), \count($parentParameters));
        for ($i = 0; $i < $numberOfParameters; $i++) {
            $parameter = $parameters[$i];
            $parentParameter = $parentParameters[$i];
            $parameterType = $parameter->getType();
            $parentParameterType = $parentParameter->getType();
            $parameterResults[] = $parameterType->isSuperTypeOf($parentParameterType);
        }
        return $parameterResults;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Methods;

use PhpParser\Node;
use PhpParser\Node\Expr\StaticCall;
use PhpParser\Node\Name;
use PHPStan\Analyser\Scope;
use PHPStan\Broker\Broker;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Rules\ClassCaseSensitivityCheck;
use PHPStan\Rules\ClassNameNodePair;
use PHPStan\Rules\FunctionCallParametersCheck;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Type\ErrorType;
use PHPStan\Type\ObjectType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
use PHPStan\Type\TypeWithClassName;
use PHPStan\Type\VerbosityLevel;
class CallStaticMethodsRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PHPStan\Rules\FunctionCallParametersCheck */
    private $check;
    /** @var \PHPStan\Rules\RuleLevelHelper */
    private $ruleLevelHelper;
    /** @var \PHPStan\Rules\ClassCaseSensitivityCheck */
    private $classCaseSensitivityCheck;
    /** @var bool */
    private $checkFunctionNameCase;
    /** @var bool */
    private $reportMagicMethods;
    public function __construct(\PHPStan\Broker\Broker $broker, \PHPStan\Rules\FunctionCallParametersCheck $check, \PHPStan\Rules\RuleLevelHelper $ruleLevelHelper, \PHPStan\Rules\ClassCaseSensitivityCheck $classCaseSensitivityCheck, bool $checkFunctionNameCase, bool $reportMagicMethods)
    {
        $this->broker = $broker;
        $this->check = $check;
        $this->ruleLevelHelper = $ruleLevelHelper;
        $this->classCaseSensitivityCheck = $classCaseSensitivityCheck;
        $this->checkFunctionNameCase = $checkFunctionNameCase;
        $this->reportMagicMethods = $reportMagicMethods;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\StaticCall::class;
    }
    /**
     * @param \PhpParser\Node\Expr\StaticCall $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return (string|\PHPStan\Rules\RuleError)[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node->name instanceof \PhpParser\Node\Identifier) {
            return [];
        }
        $methodName = $node->name->name;
        $class = $node->class;
        $errors = [];
        $isInterface = \false;
        if ($class instanceof \PhpParser\Node\Name) {
            $className = (string) $class;
            $lowercasedClassName = \strtolower($className);
            if (\in_array($lowercasedClassName, ['self', 'static'], \true)) {
                if (!$scope->isInClass()) {
                    return [\sprintf('Calling %s::%s() outside of class scope.', $className, $methodName)];
                }
                $className = $scope->getClassReflection()->getName();
            } elseif ($lowercasedClassName === 'parent') {
                if (!$scope->isInClass()) {
                    return [\sprintf('Calling %s::%s() outside of class scope.', $className, $methodName)];
                }
                $currentClassReflection = $scope->getClassReflection();
                if ($currentClassReflection->getParentClass() === \false) {
                    return [\sprintf('%s::%s() calls parent::%s() but %s does not extend any class.', $scope->getClassReflection()->getDisplayName(), $scope->getFunctionName(), $methodName, $scope->getClassReflection()->getDisplayName())];
                }
                if ($scope->getFunctionName() === null) {
                    throw new \PHPStan\ShouldNotHappenException();
                }
                $className = $currentClassReflection->getParentClass()->getName();
            } else {
                if (!$this->broker->hasClass($className)) {
                    return [\sprintf('Call to static method %s() on an unknown class %s.', $methodName, $className)];
                } else {
                    $errors = $this->classCaseSensitivityCheck->checkClassNames([new \PHPStan\Rules\ClassNameNodePair($className, $class)]);
                }
                $classReflection = $this->broker->getClass($className);
                $isInterface = $classReflection->isInterface();
                $className = $classReflection->getName();
            }
            $classType = new \PHPStan\Type\ObjectType($className);
        } else {
            $classTypeResult = $this->ruleLevelHelper->findTypeToCheck($scope, $class, \sprintf('Call to static method %s() on an unknown class %%s.', $methodName), static function (\PHPStan\Type\Type $type) use($methodName) : bool {
                return $type->canCallMethods()->yes() && $type->hasMethod($methodName)->yes();
            });
            $classType = $classTypeResult->getType();
            if ($classType instanceof \PHPStan\Type\ErrorType) {
                return $classTypeResult->getUnknownClassErrors();
            }
        }
        if ((new \PHPStan\Type\StringType())->isSuperTypeOf($classType)->yes()) {
            return [];
        }
        $typeForDescribe = $classType;
        $classType = \PHPStan\Type\TypeCombinator::remove($classType, new \PHPStan\Type\StringType());
        if (!$classType->canCallMethods()->yes()) {
            return \array_merge($errors, [\sprintf('Cannot call static method %s() on %s.', $methodName, $typeForDescribe->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))]);
        }
        if (!$classType->hasMethod($methodName)->yes()) {
            if (!$this->reportMagicMethods) {
                $directClassNames = \PHPStan\Type\TypeUtils::getDirectClassNames($classType);
                foreach ($directClassNames as $className) {
                    if (!$this->broker->hasClass($className)) {
                        continue;
                    }
                    $classReflection = $this->broker->getClass($className);
                    if ($classReflection->hasNativeMethod('__callStatic')) {
                        return [];
                    }
                }
            }
            return \array_merge($errors, [\sprintf('Call to an undefined static method %s::%s().', $typeForDescribe->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $methodName)]);
        }
        $method = $classType->getMethod($methodName, $scope);
        if (!$method->isStatic()) {
            $function = $scope->getFunction();
            if (!$function instanceof \PHPStan\Reflection\MethodReflection || $function->isStatic() || !$scope->isInClass() || $classType instanceof \PHPStan\Type\TypeWithClassName && $scope->getClassReflection()->getName() !== $classType->getClassName() && !$scope->getClassReflection()->isSubclassOf($classType->getClassName())) {
                return \array_merge($errors, [\sprintf('Static call to instance method %s::%s().', $method->getDeclaringClass()->getDisplayName(), $method->getName())]);
            }
        }
        if (!$scope->canCallMethod($method)) {
            $errors = \array_merge($errors, [\sprintf('Call to %s %s %s() of class %s.', $method->isPrivate() ? 'private' : 'protected', $method->isStatic() ? 'static method' : 'method', $method->getName(), $method->getDeclaringClass()->getDisplayName())]);
        }
        if ($isInterface && $method->isStatic()) {
            return [\sprintf('Cannot call static method %s() on interface %s.', $method->getName(), $classType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))];
        }
        $lowercasedMethodName = \sprintf('%s %s', $method->isStatic() ? 'static method' : 'method', $method->getDeclaringClass()->getDisplayName() . '::' . $method->getName() . '()');
        $displayMethodName = \sprintf('%s %s', $method->isStatic() ? 'Static method' : 'Method', $method->getDeclaringClass()->getDisplayName() . '::' . $method->getName() . '()');
        $errors = \array_merge($errors, $this->check->check(\PHPStan\Reflection\ParametersAcceptorSelector::selectFromArgs($scope, $node->args, $method->getVariants()), $scope, $node, [$displayMethodName . ' invoked with %d parameter, %d required.', $displayMethodName . ' invoked with %d parameters, %d required.', $displayMethodName . ' invoked with %d parameter, at least %d required.', $displayMethodName . ' invoked with %d parameters, at least %d required.', $displayMethodName . ' invoked with %d parameter, %d-%d required.', $displayMethodName . ' invoked with %d parameters, %d-%d required.', 'Parameter #%d %s of ' . $lowercasedMethodName . ' expects %s, %s given.', 'Result of ' . $lowercasedMethodName . ' (void) is used.', 'Parameter #%d %s of ' . $lowercasedMethodName . ' is passed by reference, so it expects variables only.']));
        if ($this->checkFunctionNameCase && $method->getName() !== $methodName) {
            $errors[] = \sprintf('Call to %s with incorrect case: %s', $lowercasedMethodName, $methodName);
        }
        return $errors;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Methods;

use PhpParser\Node;
use PhpParser\Node\Expr\MethodCall;
use PHPStan\Analyser\Scope;
use PHPStan\Broker\Broker;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Rules\FunctionCallParametersCheck;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Type\ErrorType;
use PHPStan\Type\Type;
use PHPStan\Type\VerbosityLevel;
class CallMethodsRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PHPStan\Rules\FunctionCallParametersCheck */
    private $check;
    /** @var \PHPStan\Rules\RuleLevelHelper */
    private $ruleLevelHelper;
    /** @var bool */
    private $checkFunctionNameCase;
    /** @var bool */
    private $reportMagicMethods;
    public function __construct(\PHPStan\Broker\Broker $broker, \PHPStan\Rules\FunctionCallParametersCheck $check, \PHPStan\Rules\RuleLevelHelper $ruleLevelHelper, bool $checkFunctionNameCase, bool $reportMagicMethods)
    {
        $this->broker = $broker;
        $this->check = $check;
        $this->ruleLevelHelper = $ruleLevelHelper;
        $this->checkFunctionNameCase = $checkFunctionNameCase;
        $this->reportMagicMethods = $reportMagicMethods;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\MethodCall::class;
    }
    /**
     * @param \PhpParser\Node\Expr\MethodCall $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return (string|\PHPStan\Rules\RuleError)[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node->name instanceof \PhpParser\Node\Identifier) {
            return [];
        }
        $name = $node->name->name;
        $typeResult = $this->ruleLevelHelper->findTypeToCheck($scope, $node->var, \sprintf('Call to method %s() on an unknown class %%s.', $name), static function (\PHPStan\Type\Type $type) use($name) : bool {
            return $type->canCallMethods()->yes() && $type->hasMethod($name)->yes();
        });
        $type = $typeResult->getType();
        if ($type instanceof \PHPStan\Type\ErrorType) {
            return $typeResult->getUnknownClassErrors();
        }
        if (!$type->canCallMethods()->yes()) {
            return [\sprintf('Cannot call method %s() on %s.', $name, $type->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))];
        }
        if (!$type->hasMethod($name)->yes()) {
            $directClassNames = $typeResult->getReferencedClasses();
            if (!$this->reportMagicMethods) {
                foreach ($directClassNames as $className) {
                    if (!$this->broker->hasClass($className)) {
                        continue;
                    }
                    $classReflection = $this->broker->getClass($className);
                    if ($classReflection->hasNativeMethod('__call')) {
                        return [];
                    }
                }
            }
            if (\count($directClassNames) === 1) {
                $referencedClass = $directClassNames[0];
                $methodClassReflection = $this->broker->getClass($referencedClass);
                $parentClassReflection = $methodClassReflection->getParentClass();
                while ($parentClassReflection !== \false) {
                    if ($parentClassReflection->hasMethod($name)) {
                        return [\sprintf('Call to private method %s() of parent class %s.', $parentClassReflection->getMethod($name, $scope)->getName(), $parentClassReflection->getDisplayName())];
                    }
                    $parentClassReflection = $parentClassReflection->getParentClass();
                }
            }
            return [\sprintf('Call to an undefined method %s::%s().', $type->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $name)];
        }
        $methodReflection = $type->getMethod($name, $scope);
        $messagesMethodName = $methodReflection->getDeclaringClass()->getDisplayName() . '::' . $methodReflection->getName() . '()';
        $errors = [];
        if (!$scope->canCallMethod($methodReflection)) {
            $errors[] = \sprintf('Call to %s method %s() of class %s.', $methodReflection->isPrivate() ? 'private' : 'protected', $methodReflection->getName(), $methodReflection->getDeclaringClass()->getDisplayName());
        }
        $errors = \array_merge($errors, $this->check->check(\PHPStan\Reflection\ParametersAcceptorSelector::selectFromArgs($scope, $node->args, $methodReflection->getVariants()), $scope, $node, ['Method ' . $messagesMethodName . ' invoked with %d parameter, %d required.', 'Method ' . $messagesMethodName . ' invoked with %d parameters, %d required.', 'Method ' . $messagesMethodName . ' invoked with %d parameter, at least %d required.', 'Method ' . $messagesMethodName . ' invoked with %d parameters, at least %d required.', 'Method ' . $messagesMethodName . ' invoked with %d parameter, %d-%d required.', 'Method ' . $messagesMethodName . ' invoked with %d parameters, %d-%d required.', 'Parameter #%d %s of method ' . $messagesMethodName . ' expects %s, %s given.', 'Result of method ' . $messagesMethodName . ' (void) is used.', 'Parameter #%d %s of method ' . $messagesMethodName . ' is passed by reference, so it expects variables only.']));
        if ($this->checkFunctionNameCase && \strtolower($methodReflection->getName()) === \strtolower($name) && $methodReflection->getName() !== $name) {
            $errors[] = \sprintf('Call to method %s with incorrect case: %s', $messagesMethodName, $name);
        }
        return $errors;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Methods;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Node\InClassMethodNode;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Reflection\Php\PhpMethodFromParserNodeReflection;
use PHPStan\Rules\Rule;
use PHPStan\Rules\RuleError;
use PHPStan\Rules\RuleErrorBuilder;
use PHPStan\Type\VerbosityLevel;
class IncompatibleDefaultParameterTypeRule implements \PHPStan\Rules\Rule
{
    public function getNodeType() : string
    {
        return \PHPStan\Node\InClassMethodNode::class;
    }
    /**
     * @param InClassMethodNode $node
     * @param Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $method = $scope->getFunction();
        if (!$method instanceof \PHPStan\Reflection\Php\PhpMethodFromParserNodeReflection) {
            return [];
        }
        $parameters = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($method->getVariants());
        $errors = [];
        foreach ($node->getOriginalNode()->getParams() as $paramI => $param) {
            if ($param->default === null) {
                continue;
            }
            if ($param->var instanceof \PhpParser\Node\Expr\Error || !\is_string($param->var->name)) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            $defaultValueType = $scope->getType($param->default);
            $parameterType = $parameters->getParameters()[$paramI]->getType();
            if ($parameterType->isSuperTypeOf($defaultValueType)->yes()) {
                continue;
            }
            $errors[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Default value of the parameter #%d $%s (%s) of method %s::%s() is incompatible with type %s.', $paramI + 1, $param->var->name, $defaultValueType->describe(\PHPStan\Type\VerbosityLevel::value()), $method->getDeclaringClass()->getDisplayName(), $method->getName(), $parameterType->describe(\PHPStan\Type\VerbosityLevel::value())))->line($param->getLine())->build();
        }
        return $errors;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Regexp;

use PhpParser\Node;
use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\TypeUtils;
class RegularExpressionPatternRule implements \PHPStan\Rules\Rule
{
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\FuncCall::class;
    }
    /**
     * @param FuncCall $node
     * @param Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $patterns = $this->extractPatterns($node, $scope);
        $errors = [];
        foreach ($patterns as $pattern) {
            $errorMessage = $this->validatePattern($pattern);
            if ($errorMessage === null) {
                continue;
            }
            $errors[] = \sprintf('Regex pattern is invalid: %s', $errorMessage);
        }
        return $errors;
    }
    /**
     * @param FuncCall $functionCall
     * @param Scope $scope
     * @return string[]
     */
    private function extractPatterns(\PhpParser\Node\Expr\FuncCall $functionCall, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$functionCall->name instanceof \PhpParser\Node\Name) {
            return [];
        }
        $functionName = \strtolower((string) $functionCall->name);
        if (!\_HumbugBoxb94336daae36\Nette\Utils\Strings::startsWith($functionName, 'preg_')) {
            return [];
        }
        if (!isset($functionCall->args[0])) {
            return [];
        }
        $patternNode = $functionCall->args[0]->value;
        $patternType = $scope->getType($patternNode);
        $patternStrings = [];
        foreach (\PHPStan\Type\TypeUtils::getConstantStrings($patternType) as $constantStringType) {
            if (!\in_array($functionName, ['preg_match', 'preg_match_all', 'preg_split', 'preg_grep', 'preg_replace', 'preg_replace_callback', 'preg_filter'], \true)) {
                continue;
            }
            $patternStrings[] = $constantStringType->getValue();
        }
        foreach (\PHPStan\Type\TypeUtils::getConstantArrays($patternType) as $constantArrayType) {
            if (\in_array($functionName, ['preg_replace', 'preg_replace_callback', 'preg_filter'], \true)) {
                foreach ($constantArrayType->getValueTypes() as $arrayKeyType) {
                    if (!$arrayKeyType instanceof \PHPStan\Type\Constant\ConstantStringType) {
                        continue;
                    }
                    $patternStrings[] = $arrayKeyType->getValue();
                }
            }
            if ($functionName !== 'preg_replace_callback_array') {
                continue;
            }
            foreach ($constantArrayType->getKeyTypes() as $arrayKeyType) {
                if (!$arrayKeyType instanceof \PHPStan\Type\Constant\ConstantStringType) {
                    continue;
                }
                $patternStrings[] = $arrayKeyType->getValue();
            }
        }
        return $patternStrings;
    }
    private function validatePattern(string $pattern) : ?string
    {
        try {
            \_HumbugBoxb94336daae36\Nette\Utils\Strings::match('', $pattern);
        } catch (\_HumbugBoxb94336daae36\Nette\Utils\RegexpException $e) {
            return $e->getMessage();
        }
        return null;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules;

use PhpParser\Node\Expr;
use PHPStan\Analyser\Scope;
use PHPStan\Broker\Broker;
use PHPStan\Type\ArrayType;
use PHPStan\Type\BenevolentUnionType;
use PHPStan\Type\CompoundType;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\ErrorType;
use PHPStan\Type\MixedType;
use PHPStan\Type\NeverType;
use PHPStan\Type\NullType;
use PHPStan\Type\ObjectWithoutClassType;
use PHPStan\Type\StaticType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
use PHPStan\Type\UnionType;
class RuleLevelHelper
{
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var bool */
    private $checkNullables;
    /** @var bool */
    private $checkThisOnly;
    /** @var bool */
    private $checkUnionTypes;
    public function __construct(\PHPStan\Broker\Broker $broker, bool $checkNullables, bool $checkThisOnly, bool $checkUnionTypes)
    {
        $this->broker = $broker;
        $this->checkNullables = $checkNullables;
        $this->checkThisOnly = $checkThisOnly;
        $this->checkUnionTypes = $checkUnionTypes;
    }
    public function isThis(\PhpParser\Node\Expr $expression) : bool
    {
        return $expression instanceof \PhpParser\Node\Expr\Variable && $expression->name === 'this';
    }
    public function accepts(\PHPStan\Type\Type $acceptingType, \PHPStan\Type\Type $acceptedType, bool $strictTypes) : bool
    {
        if (!$this->checkNullables && !$acceptingType instanceof \PHPStan\Type\NullType && !$acceptedType instanceof \PHPStan\Type\NullType && !$acceptedType instanceof \PHPStan\Type\BenevolentUnionType) {
            $acceptedType = \PHPStan\Type\TypeCombinator::removeNull($acceptedType);
        }
        $acceptedArrays = \PHPStan\Type\TypeUtils::getArrays($acceptedType);
        if ($acceptingType instanceof \PHPStan\Type\ArrayType && \count($acceptedArrays) > 0) {
            foreach ($acceptedArrays as $acceptedArray) {
                if ($acceptedArray instanceof \PHPStan\Type\Constant\ConstantArrayType) {
                    foreach ($acceptedArray->getKeyTypes() as $i => $keyType) {
                        $valueType = $acceptedArray->getValueTypes()[$i];
                        if (!self::accepts($acceptingType->getKeyType(), $keyType, $strictTypes) || !self::accepts($acceptingType->getItemType(), $valueType, $strictTypes)) {
                            return \false;
                        }
                    }
                } else {
                    if (!self::accepts($acceptingType->getKeyType(), $acceptedArray->getKeyType(), $strictTypes) || !self::accepts($acceptingType->getItemType(), $acceptedArray->getItemType(), $strictTypes)) {
                        return \false;
                    }
                }
            }
            return \true;
        }
        if ($acceptingType instanceof \PHPStan\Type\UnionType && !$acceptedType instanceof \PHPStan\Type\CompoundType) {
            foreach ($acceptingType->getTypes() as $innerType) {
                if (self::accepts($innerType, $acceptedType, $strictTypes)) {
                    return \true;
                }
            }
            return \false;
        }
        if ($acceptedType instanceof \PHPStan\Type\ArrayType && $acceptingType instanceof \PHPStan\Type\ArrayType) {
            return self::accepts($acceptingType->getKeyType(), $acceptedType->getKeyType(), $strictTypes) && self::accepts($acceptingType->getItemType(), $acceptedType->getItemType(), $strictTypes);
        }
        $accepts = $acceptingType->accepts($acceptedType, $strictTypes);
        return $this->checkUnionTypes ? $accepts->yes() : !$accepts->no();
    }
    /**
     * @param Scope $scope
     * @param Expr $var
     * @param string $unknownClassErrorPattern
     * @param callable(Type $type): bool $unionTypeCriteriaCallback
     * @return FoundTypeResult
     */
    public function findTypeToCheck(\PHPStan\Analyser\Scope $scope, \PhpParser\Node\Expr $var, string $unknownClassErrorPattern, callable $unionTypeCriteriaCallback) : \PHPStan\Rules\FoundTypeResult
    {
        if ($this->checkThisOnly && !$this->isThis($var)) {
            return new \PHPStan\Rules\FoundTypeResult(new \PHPStan\Type\ErrorType(), [], []);
        }
        $type = $scope->getType($var);
        if (!$this->checkNullables && !$type instanceof \PHPStan\Type\NullType) {
            $type = \PHPStan\Type\TypeCombinator::removeNull($type);
        }
        if ($type instanceof \PHPStan\Type\MixedType || $type instanceof \PHPStan\Type\NeverType) {
            return new \PHPStan\Rules\FoundTypeResult(new \PHPStan\Type\ErrorType(), [], []);
        }
        if ($type instanceof \PHPStan\Type\StaticType) {
            $type = $type->resolveStatic($type->getBaseClass());
        }
        $errors = [];
        $directClassNames = \PHPStan\Type\TypeUtils::getDirectClassNames($type);
        foreach ($directClassNames as $referencedClass) {
            if ($this->broker->hasClass($referencedClass)) {
                continue;
            }
            $errors[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf($unknownClassErrorPattern, $referencedClass))->line($var->getLine())->build();
        }
        if (\count($errors) > 0) {
            return new \PHPStan\Rules\FoundTypeResult(new \PHPStan\Type\ErrorType(), [], $errors);
        }
        if (!$this->checkUnionTypes) {
            if ($type instanceof \PHPStan\Type\ObjectWithoutClassType) {
                return new \PHPStan\Rules\FoundTypeResult(new \PHPStan\Type\ErrorType(), [], []);
            }
            if ($type instanceof \PHPStan\Type\UnionType) {
                $newTypes = [];
                foreach ($type->getTypes() as $innerType) {
                    if (!$unionTypeCriteriaCallback($innerType)) {
                        continue;
                    }
                    $newTypes[] = $innerType;
                }
                if (\count($newTypes) > 0) {
                    return new \PHPStan\Rules\FoundTypeResult(\PHPStan\Type\TypeCombinator::union(...$newTypes), $directClassNames, []);
                }
            }
        }
        return new \PHPStan\Rules\FoundTypeResult($type, $directClassNames, []);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Operators;

use PHPStan\Type\ErrorType;
use PHPStan\Type\VerbosityLevel;
class InvalidIncDecOperationRule implements \PHPStan\Rules\Rule
{
    /** @var bool */
    private $checkThisOnly;
    public function __construct(bool $checkThisOnly)
    {
        $this->checkThisOnly = $checkThisOnly;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr::class;
    }
    /**
     * @param \PhpParser\Node\Expr $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node instanceof \PhpParser\Node\Expr\PreInc && !$node instanceof \PhpParser\Node\Expr\PostInc && !$node instanceof \PhpParser\Node\Expr\PreDec && !$node instanceof \PhpParser\Node\Expr\PostDec) {
            return [];
        }
        $operatorString = $node instanceof \PhpParser\Node\Expr\PreInc || $node instanceof \PhpParser\Node\Expr\PostInc ? '++' : '--';
        if (!$node->var instanceof \PhpParser\Node\Expr\Variable && !$node->var instanceof \PhpParser\Node\Expr\ArrayDimFetch && !$node->var instanceof \PhpParser\Node\Expr\PropertyFetch && !$node->var instanceof \PhpParser\Node\Expr\StaticPropertyFetch) {
            return [\sprintf('Cannot use %s on a non-variable.', $operatorString)];
        }
        if (!$this->checkThisOnly) {
            $varType = $scope->getType($node->var);
            if (!$varType->toString() instanceof \PHPStan\Type\ErrorType) {
                return [];
            }
            if (!$varType->toNumber() instanceof \PHPStan\Type\ErrorType) {
                return [];
            }
            return [\sprintf('Cannot use %s on %s.', $operatorString, $varType->describe(\PHPStan\Type\VerbosityLevel::value()))];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Operators;

use PHPStan\Analyser\Scope;
use PHPStan\Type\ErrorType;
use PHPStan\Type\VerbosityLevel;
class InvalidUnaryOperationRule implements \PHPStan\Rules\Rule
{
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr::class;
    }
    /**
     * @param \PhpParser\Node\Expr $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node instanceof \PhpParser\Node\Expr\UnaryPlus && !$node instanceof \PhpParser\Node\Expr\UnaryMinus) {
            return [];
        }
        if ($scope->getType($node) instanceof \PHPStan\Type\ErrorType) {
            return [\sprintf('Unary operation "%s" on %s results in an error.', $node instanceof \PhpParser\Node\Expr\UnaryPlus ? '+' : '-', $scope->getType($node->expr)->describe(\PHPStan\Type\VerbosityLevel::value()))];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Operators;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Type\ErrorType;
use PHPStan\Type\FloatType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\ObjectWithoutClassType;
use PHPStan\Type\Type;
use PHPStan\Type\UnionType;
use PHPStan\Type\VerbosityLevel;
class InvalidComparisonOperationRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\RuleLevelHelper */
    private $ruleLevelHelper;
    public function __construct(\PHPStan\Rules\RuleLevelHelper $ruleLevelHelper)
    {
        $this->ruleLevelHelper = $ruleLevelHelper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\BinaryOp::class;
    }
    /**
     * @param Node $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node instanceof \PhpParser\Node\Expr\BinaryOp\Equal && !$node instanceof \PhpParser\Node\Expr\BinaryOp\NotEqual && !$node instanceof \PhpParser\Node\Expr\BinaryOp\Smaller && !$node instanceof \PhpParser\Node\Expr\BinaryOp\SmallerOrEqual && !$node instanceof \PhpParser\Node\Expr\BinaryOp\Greater && !$node instanceof \PhpParser\Node\Expr\BinaryOp\GreaterOrEqual && !$node instanceof \PhpParser\Node\Expr\BinaryOp\Spaceship) {
            return [];
        }
        $isNumericLeft = $this->isNumberType($scope, $node->left);
        $isObjectLeft = $this->isObjectType($scope, $node->left);
        $isNumericRight = $this->isNumberType($scope, $node->right);
        $isObjectRight = $this->isObjectType($scope, $node->right);
        if ($isNumericLeft && $isObjectRight || $isObjectLeft && $isNumericRight) {
            return [\sprintf('Comparison operation "%s" between %s and %s results in an error.', $node->getOperatorSigil(), $scope->getType($node->left)->describe(\PHPStan\Type\VerbosityLevel::value()), $scope->getType($node->right)->describe(\PHPStan\Type\VerbosityLevel::value()))];
        }
        return [];
    }
    private function isNumberType(\PHPStan\Analyser\Scope $scope, \PhpParser\Node\Expr $expr) : bool
    {
        $acceptedType = new \PHPStan\Type\UnionType([new \PHPStan\Type\IntegerType(), new \PHPStan\Type\FloatType()]);
        $onlyNumber = static function (\PHPStan\Type\Type $type) use($acceptedType) : bool {
            return $acceptedType->accepts($type, \true)->yes();
        };
        $type = $this->ruleLevelHelper->findTypeToCheck($scope, $expr, '', $onlyNumber)->getType();
        if ($type instanceof \PHPStan\Type\ErrorType || !$type->equals($scope->getType($expr))) {
            return \false;
        }
        return !$acceptedType->isSuperTypeOf($type)->no();
    }
    private function isObjectType(\PHPStan\Analyser\Scope $scope, \PhpParser\Node\Expr $expr) : bool
    {
        $acceptedType = new \PHPStan\Type\ObjectWithoutClassType();
        $type = $this->ruleLevelHelper->findTypeToCheck($scope, $expr, '', static function (\PHPStan\Type\Type $type) use($acceptedType) : bool {
            return $acceptedType->isSuperTypeOf($type)->yes();
        })->getType();
        if ($type instanceof \PHPStan\Type\ErrorType) {
            return \false;
        }
        $isSuperType = $acceptedType->isSuperTypeOf($type);
        if ($type instanceof \PHPStan\Type\BenevolentUnionType) {
            return !$isSuperType->no();
        }
        return $isSuperType->yes();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Operators;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Type\ErrorType;
use PHPStan\Type\Type;
use PHPStan\Type\VerbosityLevel;
class InvalidBinaryOperationRule implements \PHPStan\Rules\Rule
{
    /** @var \PhpParser\PrettyPrinter\Standard */
    private $printer;
    /** @var \PHPStan\Rules\RuleLevelHelper */
    private $ruleLevelHelper;
    public function __construct(\PhpParser\PrettyPrinter\Standard $printer, \PHPStan\Rules\RuleLevelHelper $ruleLevelHelper)
    {
        $this->printer = $printer;
        $this->ruleLevelHelper = $ruleLevelHelper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr::class;
    }
    /**
     * @param \PhpParser\Node\Expr $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node instanceof \PhpParser\Node\Expr\BinaryOp && !$node instanceof \PhpParser\Node\Expr\AssignOp) {
            return [];
        }
        if ($scope->getType($node) instanceof \PHPStan\Type\ErrorType) {
            $leftName = '__PHPSTAN__LEFT__';
            $rightName = '__PHPSTAN__RIGHT__';
            $leftVariable = new \PhpParser\Node\Expr\Variable($leftName);
            $rightVariable = new \PhpParser\Node\Expr\Variable($rightName);
            if ($node instanceof \PhpParser\Node\Expr\AssignOp) {
                $newNode = clone $node;
                $left = $node->var;
                $right = $node->expr;
                $newNode->var = $leftVariable;
                $newNode->expr = $rightVariable;
            } else {
                $newNode = clone $node;
                $left = $node->left;
                $right = $node->right;
                $newNode->left = $leftVariable;
                $newNode->right = $rightVariable;
            }
            if ($node instanceof \PhpParser\Node\Expr\AssignOp\Concat || $node instanceof \PhpParser\Node\Expr\BinaryOp\Concat) {
                $callback = static function (\PHPStan\Type\Type $type) : bool {
                    return !$type->toString() instanceof \PHPStan\Type\ErrorType;
                };
            } else {
                $callback = static function (\PHPStan\Type\Type $type) : bool {
                    return !$type->toNumber() instanceof \PHPStan\Type\ErrorType;
                };
            }
            $leftType = $this->ruleLevelHelper->findTypeToCheck($scope, $left, '', $callback)->getType();
            if ($leftType instanceof \PHPStan\Type\ErrorType) {
                return [];
            }
            $rightType = $this->ruleLevelHelper->findTypeToCheck($scope, $right, '', $callback)->getType();
            if ($rightType instanceof \PHPStan\Type\ErrorType) {
                return [];
            }
            $scope = $scope->assignVariable($leftName, $leftType)->assignVariable($rightName, $rightType);
            if (!$scope->getType($newNode) instanceof \PHPStan\Type\ErrorType) {
                return [];
            }
            return [\sprintf('Binary operation "%s" between %s and %s results in an error.', \substr(\substr($this->printer->prettyPrintExpr($newNode), \strlen($leftName) + 2), 0, -(\strlen($rightName) + 2)), $scope->getType($left)->describe(\PHPStan\Type\VerbosityLevel::value()), $scope->getType($right)->describe(\PHPStan\Type\VerbosityLevel::value()))];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
interface Rule
{
    /**
     * @return string Class implementing \PhpParser\Node
     */
    public function getNodeType() : string;
    /**
     * @param \PhpParser\Node $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return (string|RuleError)[] errors
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array;
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules;

use PhpParser\Node\Expr;
use PHPStan\Analyser\Scope;
use PHPStan\Type\Type;
use PHPStan\Type\VerbosityLevel;
use PHPStan\Type\VoidType;
class FunctionReturnTypeCheck
{
    /** @var \PHPStan\Rules\RuleLevelHelper */
    private $ruleLevelHelper;
    public function __construct(\PHPStan\Rules\RuleLevelHelper $ruleLevelHelper)
    {
        $this->ruleLevelHelper = $ruleLevelHelper;
    }
    /**
     * @param \PHPStan\Analyser\Scope $scope
     * @param \PHPStan\Type\Type $returnType
     * @param \PhpParser\Node\Expr|null $returnValue
     * @param string $emptyReturnStatementMessage
     * @param string $voidMessage
     * @param string $typeMismatchMessage
     * @param bool $isGenerator
     * @return string[]
     */
    public function checkReturnType(\PHPStan\Analyser\Scope $scope, \PHPStan\Type\Type $returnType, ?\PhpParser\Node\Expr $returnValue, string $emptyReturnStatementMessage, string $voidMessage, string $typeMismatchMessage, bool $isGenerator) : array
    {
        if ($isGenerator) {
            return [];
        }
        $isVoidSuperType = (new \PHPStan\Type\VoidType())->isSuperTypeOf($returnType);
        if ($returnValue === null) {
            if (!$isVoidSuperType->no()) {
                return [];
            }
            return [\sprintf($emptyReturnStatementMessage, $returnType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))];
        }
        $returnValueType = $scope->getType($returnValue);
        if ($isVoidSuperType->yes()) {
            return [\sprintf($voidMessage, $returnValueType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))];
        }
        if (!$this->ruleLevelHelper->accepts($returnType, $returnValueType, $scope->isDeclareStrictTypes())) {
            return [\sprintf($typeMismatchMessage, $returnType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $returnValueType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules;

interface LineRuleError extends \PHPStan\Rules\RuleError
{
    public function getLine() : int;
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Classes;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\ObjectType;
use PHPStan\Type\VerbosityLevel;
class ImpossibleInstanceOfRule implements \PHPStan\Rules\Rule
{
    /** @var bool */
    private $checkAlwaysTrueInstanceof;
    public function __construct(bool $checkAlwaysTrueInstanceof)
    {
        $this->checkAlwaysTrueInstanceof = $checkAlwaysTrueInstanceof;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\Instanceof_::class;
    }
    /**
     * @param \PhpParser\Node\Expr\Instanceof_ $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $instanceofType = $scope->getType($node);
        if (!$instanceofType instanceof \PHPStan\Type\Constant\ConstantBooleanType) {
            return [];
        }
        $expressionType = $scope->getType($node->expr);
        if ($node->class instanceof \PhpParser\Node\Name) {
            $className = $scope->resolveName($node->class);
            $type = new \PHPStan\Type\ObjectType($className);
        } else {
            $type = $scope->getType($node->class);
        }
        if (!$instanceofType->getValue()) {
            return [\sprintf('Instanceof between %s and %s will always evaluate to false.', $expressionType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $type->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))];
        } elseif ($this->checkAlwaysTrueInstanceof) {
            return [\sprintf('Instanceof between %s and %s will always evaluate to true.', $expressionType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $type->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Classes;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\ClassCaseSensitivityCheck;
use PHPStan\Rules\ClassNameNodePair;
use PHPStan\Rules\RuleError;
class ExistingClassInTraitUseRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\ClassCaseSensitivityCheck */
    private $classCaseSensitivityCheck;
    public function __construct(\PHPStan\Rules\ClassCaseSensitivityCheck $classCaseSensitivityCheck)
    {
        $this->classCaseSensitivityCheck = $classCaseSensitivityCheck;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\TraitUse::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\TraitUse $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        return $this->classCaseSensitivityCheck->checkClassNames(\array_map(static function (\PhpParser\Node\Name $traitName) : ClassNameNodePair {
            return new \PHPStan\Rules\ClassNameNodePair((string) $traitName, $traitName);
        }, $node->traits));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Classes;

use PhpParser\Node;
use PhpParser\Node\Expr\Instanceof_;
use PHPStan\Analyser\Scope;
use PHPStan\Broker\Broker;
use PHPStan\Rules\ClassCaseSensitivityCheck;
use PHPStan\Rules\ClassNameNodePair;
use PHPStan\Rules\RuleError;
use PHPStan\Rules\RuleErrorBuilder;
class ExistingClassInInstanceOfRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PHPStan\Rules\ClassCaseSensitivityCheck */
    private $classCaseSensitivityCheck;
    /** @var bool */
    private $checkClassCaseSensitivity;
    public function __construct(\PHPStan\Broker\Broker $broker, \PHPStan\Rules\ClassCaseSensitivityCheck $classCaseSensitivityCheck, bool $checkClassCaseSensitivity)
    {
        $this->broker = $broker;
        $this->classCaseSensitivityCheck = $classCaseSensitivityCheck;
        $this->checkClassCaseSensitivity = $checkClassCaseSensitivity;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\Instanceof_::class;
    }
    /**
     * @param \PhpParser\Node\Expr\Instanceof_ $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $class = $node->class;
        if (!$class instanceof \PhpParser\Node\Name) {
            return [];
        }
        $name = (string) $class;
        $lowercaseName = \strtolower($name);
        if (\in_array($lowercaseName, ['self', 'static', 'parent'], \true)) {
            if (!$scope->isInClass()) {
                return [\PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Using %s outside of class scope.', $lowercaseName))->line($class->getLine())->build()];
            }
            return [];
        }
        if (!$this->broker->hasClass($name)) {
            return [\PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Class %s not found.', $name))->line($class->getLine())->build()];
        } elseif ($this->checkClassCaseSensitivity) {
            return $this->classCaseSensitivityCheck->checkClassNames([new \PHPStan\Rules\ClassNameNodePair($name, $class)]);
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Classes;

use PhpParser\Node;
use PhpParser\Node\Expr\ClassConstFetch;
use PHPStan\Analyser\Scope;
use PHPStan\Broker\Broker;
use PHPStan\Rules\ClassCaseSensitivityCheck;
use PHPStan\Rules\ClassNameNodePair;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Type\ErrorType;
use PHPStan\Type\ObjectType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\VerbosityLevel;
class ClassConstantRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PHPStan\Rules\RuleLevelHelper */
    private $ruleLevelHelper;
    /** @var \PHPStan\Rules\ClassCaseSensitivityCheck */
    private $classCaseSensitivityCheck;
    public function __construct(\PHPStan\Broker\Broker $broker, \PHPStan\Rules\RuleLevelHelper $ruleLevelHelper, \PHPStan\Rules\ClassCaseSensitivityCheck $classCaseSensitivityCheck)
    {
        $this->broker = $broker;
        $this->ruleLevelHelper = $ruleLevelHelper;
        $this->classCaseSensitivityCheck = $classCaseSensitivityCheck;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\ClassConstFetch::class;
    }
    /**
     * @param \PhpParser\Node\Expr\ClassConstFetch $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return (string|\PHPStan\Rules\RuleError)[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node->name instanceof \PhpParser\Node\Identifier) {
            return [];
        }
        $constantName = $node->name->name;
        $class = $node->class;
        $messages = [];
        if ($class instanceof \PhpParser\Node\Name) {
            $className = (string) $class;
            $lowercasedClassName = \strtolower($className);
            if (\in_array($lowercasedClassName, ['self', 'static'], \true)) {
                if (!$scope->isInClass()) {
                    return [\sprintf('Using %s outside of class scope.', $className)];
                }
                $className = $scope->getClassReflection()->getName();
            } elseif ($lowercasedClassName === 'parent') {
                if (!$scope->isInClass()) {
                    return [\sprintf('Using %s outside of class scope.', $className)];
                }
                $currentClassReflection = $scope->getClassReflection();
                if ($currentClassReflection->getParentClass() === \false) {
                    return [\sprintf('Access to parent::%s but %s does not extend any class.', $constantName, $currentClassReflection->getDisplayName())];
                }
                $className = $currentClassReflection->getParentClass()->getName();
            } else {
                if (!$this->broker->hasClass($className)) {
                    if (\strtolower($constantName) === 'class') {
                        return [\sprintf('Class %s not found.', $className)];
                    }
                    return [\sprintf('Access to constant %s on an unknown class %s.', $constantName, $className)];
                } else {
                    $messages = $this->classCaseSensitivityCheck->checkClassNames([new \PHPStan\Rules\ClassNameNodePair($className, $class)]);
                }
                $className = $this->broker->getClass($className)->getName();
            }
            $classType = new \PHPStan\Type\ObjectType($className);
        } else {
            $classTypeResult = $this->ruleLevelHelper->findTypeToCheck($scope, $class, \sprintf('Access to constant %s on an unknown class %%s.', $constantName), static function (\PHPStan\Type\Type $type) use($constantName) : bool {
                return $type->canAccessConstants()->yes() && $type->hasConstant($constantName)->yes();
            });
            $classType = $classTypeResult->getType();
            if ($classType instanceof \PHPStan\Type\ErrorType) {
                return $classTypeResult->getUnknownClassErrors();
            }
        }
        if ((new \PHPStan\Type\StringType())->isSuperTypeOf($classType)->yes()) {
            return $messages;
        }
        $typeForDescribe = $classType;
        $classType = \PHPStan\Type\TypeCombinator::remove($classType, new \PHPStan\Type\StringType());
        if (!$classType->canAccessConstants()->yes()) {
            return \array_merge($messages, [\sprintf('Cannot access constant %s on %s.', $constantName, $typeForDescribe->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))]);
        }
        if (\strtolower($constantName) === 'class') {
            return $messages;
        }
        if (!$classType->hasConstant($constantName)->yes()) {
            return \array_merge($messages, [\sprintf('Access to undefined constant %s::%s.', $typeForDescribe->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $constantName)]);
        }
        $constantReflection = $classType->getConstant($constantName);
        if (!$scope->canAccessConstant($constantReflection)) {
            return \array_merge($messages, [\sprintf('Access to %s constant %s of class %s.', $constantReflection->isPrivate() ? 'private' : 'protected', $constantName, $constantReflection->getDeclaringClass()->getDisplayName())]);
        }
        return $messages;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Classes;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\ClassCaseSensitivityCheck;
use PHPStan\Rules\ClassNameNodePair;
use PHPStan\Rules\RuleError;
class ExistingClassesInInterfaceExtendsRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\ClassCaseSensitivityCheck */
    private $classCaseSensitivityCheck;
    public function __construct(\PHPStan\Rules\ClassCaseSensitivityCheck $classCaseSensitivityCheck)
    {
        $this->classCaseSensitivityCheck = $classCaseSensitivityCheck;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\Interface_::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\Interface_ $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        return $this->classCaseSensitivityCheck->checkClassNames(\array_map(static function (\PhpParser\Node\Name $interfaceName) : ClassNameNodePair {
            return new \PHPStan\Rules\ClassNameNodePair((string) $interfaceName, $interfaceName);
        }, $node->extends));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Classes;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\ClassCaseSensitivityCheck;
use PHPStan\Rules\ClassNameNodePair;
use PHPStan\Rules\RuleError;
class ExistingClassesInClassImplementsRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\ClassCaseSensitivityCheck */
    private $classCaseSensitivityCheck;
    public function __construct(\PHPStan\Rules\ClassCaseSensitivityCheck $classCaseSensitivityCheck)
    {
        $this->classCaseSensitivityCheck = $classCaseSensitivityCheck;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\Class_::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\Class_ $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        return $this->classCaseSensitivityCheck->checkClassNames(\array_map(static function (\PhpParser\Node\Name $interfaceName) : ClassNameNodePair {
            return new \PHPStan\Rules\ClassNameNodePair((string) $interfaceName, $interfaceName);
        }, $node->implements));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Classes;

use PhpParser\Node;
use PhpParser\Node\Expr\New_;
use PHPStan\Analyser\Scope;
use PHPStan\Broker\Broker;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Rules\ClassCaseSensitivityCheck;
use PHPStan\Rules\ClassNameNodePair;
use PHPStan\Rules\FunctionCallParametersCheck;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\TypeUtils;
use PHPStan\Type\TypeWithClassName;
class InstantiationRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PHPStan\Rules\FunctionCallParametersCheck */
    private $check;
    /** @var \PHPStan\Rules\ClassCaseSensitivityCheck */
    private $classCaseSensitivityCheck;
    public function __construct(\PHPStan\Broker\Broker $broker, \PHPStan\Rules\FunctionCallParametersCheck $check, \PHPStan\Rules\ClassCaseSensitivityCheck $classCaseSensitivityCheck)
    {
        $this->broker = $broker;
        $this->check = $check;
        $this->classCaseSensitivityCheck = $classCaseSensitivityCheck;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\New_::class;
    }
    /**
     * @param \PhpParser\Node\Expr\New_ $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return (string|\PHPStan\Rules\RuleError)[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $errors = [];
        foreach ($this->getClassNames($node, $scope) as $class) {
            $errors = \array_merge($errors, $this->checkClassName($class, $node, $scope));
        }
        return $errors;
    }
    /**
     * @param string $class
     * @param \PhpParser\Node\Expr\New_ $node
     * @param Scope $scope
     * @return (string|\PHPStan\Rules\RuleError)[]
     */
    private function checkClassName(string $class, \PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $lowercasedClass = \strtolower($class);
        $messages = [];
        if ($lowercasedClass === 'static') {
            if (!$scope->isInClass()) {
                return [\sprintf('Using %s outside of class scope.', $class)];
            }
            return [];
        } elseif ($lowercasedClass === 'self') {
            if (!$scope->isInClass()) {
                return [\sprintf('Using %s outside of class scope.', $class)];
            }
            $classReflection = $scope->getClassReflection();
        } elseif ($lowercasedClass === 'parent') {
            if (!$scope->isInClass()) {
                return [\sprintf('Using %s outside of class scope.', $class)];
            }
            if ($scope->getClassReflection()->getParentClass() === \false) {
                return [\sprintf('%s::%s() calls new parent but %s does not extend any class.', $scope->getClassReflection()->getDisplayName(), $scope->getFunctionName(), $scope->getClassReflection()->getDisplayName())];
            }
            $classReflection = $scope->getClassReflection()->getParentClass();
        } else {
            if (!$this->broker->hasClass($class)) {
                return [\sprintf('Instantiated class %s not found.', $class)];
            } else {
                $messages = $this->classCaseSensitivityCheck->checkClassNames([new \PHPStan\Rules\ClassNameNodePair($class, $node->class)]);
            }
            $classReflection = $this->broker->getClass($class);
        }
        if ($classReflection->isInterface()) {
            return [\sprintf('Cannot instantiate interface %s.', $classReflection->getDisplayName())];
        }
        if ($classReflection->isAbstract()) {
            return [\sprintf('Instantiated class %s is abstract.', $classReflection->getDisplayName())];
        }
        if (!$classReflection->hasConstructor()) {
            if (\count($node->args) > 0) {
                return \array_merge($messages, [\sprintf('Class %s does not have a constructor and must be instantiated without any parameters.', $classReflection->getDisplayName())]);
            }
            return $messages;
        }
        $constructorReflection = $classReflection->getConstructor();
        if (!$scope->canCallMethod($constructorReflection)) {
            $messages[] = \sprintf('Cannot instantiate class %s via %s constructor %s::%s().', $classReflection->getDisplayName(), $constructorReflection->isPrivate() ? 'private' : 'protected', $constructorReflection->getDeclaringClass()->getDisplayName(), $constructorReflection->getName());
        }
        return \array_merge($messages, $this->check->check(\PHPStan\Reflection\ParametersAcceptorSelector::selectFromArgs($scope, $node->args, $constructorReflection->getVariants()), $scope, $node, [
            'Class ' . $classReflection->getDisplayName() . ' constructor invoked with %d parameter, %d required.',
            'Class ' . $classReflection->getDisplayName() . ' constructor invoked with %d parameters, %d required.',
            'Class ' . $classReflection->getDisplayName() . ' constructor invoked with %d parameter, at least %d required.',
            'Class ' . $classReflection->getDisplayName() . ' constructor invoked with %d parameters, at least %d required.',
            'Class ' . $classReflection->getDisplayName() . ' constructor invoked with %d parameter, %d-%d required.',
            'Class ' . $classReflection->getDisplayName() . ' constructor invoked with %d parameters, %d-%d required.',
            'Parameter #%d %s of class ' . $classReflection->getDisplayName() . ' constructor expects %s, %s given.',
            '',
            // constructor does not have a return type
            'Parameter #%d %s of class ' . $classReflection->getDisplayName() . ' constructor is passed by reference, so it expects variables only',
        ]));
    }
    /**
     * @param \PhpParser\Node\Expr\New_ $node $node
     * @param Scope $scope
     * @return string[]
     */
    private function getClassNames(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if ($node->class instanceof \PhpParser\Node\Name) {
            return [(string) $node->class];
        }
        if ($node->class instanceof \PhpParser\Node\Stmt\Class_) {
            $anonymousClassType = $scope->getType($node);
            if (!$anonymousClassType instanceof \PHPStan\Type\TypeWithClassName) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            return [$anonymousClassType->getClassName()];
        }
        return \array_map(static function (\PHPStan\Type\Constant\ConstantStringType $type) : string {
            return $type->getValue();
        }, \PHPStan\Type\TypeUtils::getConstantStrings($scope->getType($node->class)));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Classes;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\ClassCaseSensitivityCheck;
use PHPStan\Rules\ClassNameNodePair;
use PHPStan\Rules\RuleError;
class ExistingClassInClassExtendsRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\ClassCaseSensitivityCheck */
    private $classCaseSensitivityCheck;
    public function __construct(\PHPStan\Rules\ClassCaseSensitivityCheck $classCaseSensitivityCheck)
    {
        $this->classCaseSensitivityCheck = $classCaseSensitivityCheck;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\Class_::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\Class_ $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if ($node->extends === null) {
            return [];
        }
        return $this->classCaseSensitivityCheck->checkClassNames([new \PHPStan\Rules\ClassNameNodePair((string) $node->extends, $node->extends)]);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Classes;

use PhpParser\Node;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Param;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\UnusedFunctionParametersCheck;
class UnusedConstructorParametersRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\UnusedFunctionParametersCheck */
    private $check;
    public function __construct(\PHPStan\Rules\UnusedFunctionParametersCheck $check)
    {
        $this->check = $check;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\ClassMethod::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\ClassMethod $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$scope->isInClass()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        if ($node->name->name !== '__construct' || $node->stmts === null) {
            return [];
        }
        if (\count($node->params) === 0) {
            return [];
        }
        $message = \sprintf('Constructor of class %s has an unused parameter $%%s.', $scope->getClassReflection()->getDisplayName());
        if ($scope->getClassReflection()->isAnonymous()) {
            $message = 'Constructor of an anonymous class has an unused parameter $%s.';
        }
        return $this->check->getUnusedParameters($scope, \array_map(static function (\PhpParser\Node\Param $parameter) : string {
            if (!$parameter->var instanceof \PhpParser\Node\Expr\Variable || !\is_string($parameter->var->name)) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            return $parameter->var->name;
        }, $node->params), $node->stmts, $message);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Classes;

use PhpParser\Node;
use PhpParser\Node\Name;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Analyser\Scope;
class RequireParentConstructCallRule implements \PHPStan\Rules\Rule
{
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\ClassMethod::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\ClassMethod $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$scope->isInClass()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        if ($scope->isInTrait()) {
            return [];
        }
        if ($node->name->name !== '__construct') {
            return [];
        }
        $classReflection = $scope->getClassReflection()->getNativeReflection();
        if ($classReflection->isInterface() || $classReflection->isAnonymous()) {
            return [];
        }
        if ($this->callsParentConstruct($node)) {
            if ($classReflection->getParentClass() === \false) {
                return [\sprintf('%s::__construct() calls parent constructor but does not extend any class.', $classReflection->getName())];
            }
            if ($this->getParentConstructorClass($classReflection) === \false) {
                return [\sprintf('%s::__construct() calls parent constructor but parent does not have one.', $classReflection->getName())];
            }
        } else {
            $parentClass = $this->getParentConstructorClass($classReflection);
            if ($parentClass !== \false) {
                return [\sprintf('%s::__construct() does not call parent constructor from %s.', $classReflection->getName(), $parentClass->getName())];
            }
        }
        return [];
    }
    private function callsParentConstruct(\PhpParser\Node $parserNode) : bool
    {
        if (!isset($parserNode->stmts)) {
            return \false;
        }
        foreach ($parserNode->stmts as $statement) {
            if ($statement instanceof \PhpParser\Node\Stmt\Expression) {
                $statement = $statement->expr;
            }
            $statement = $this->ignoreErrorSuppression($statement);
            if ($statement instanceof \PhpParser\Node\Expr\StaticCall) {
                if ($statement->class instanceof \PhpParser\Node\Name && (string) $statement->class === 'parent' && $statement->name instanceof \PhpParser\Node\Identifier && $statement->name->name === '__construct') {
                    return \true;
                }
            } else {
                if ($this->callsParentConstruct($statement)) {
                    return \true;
                }
            }
        }
        return \false;
    }
    /**
     * @param \ReflectionClass $classReflection
     * @return \ReflectionClass|false
     */
    private function getParentConstructorClass(\ReflectionClass $classReflection)
    {
        while ($classReflection->getParentClass() !== \false) {
            $constructor = $classReflection->getParentClass()->hasMethod('__construct') ? $classReflection->getParentClass()->getMethod('__construct') : null;
            $constructorWithClassName = $classReflection->getParentClass()->hasMethod($classReflection->getParentClass()->getName()) ? $classReflection->getParentClass()->getMethod($classReflection->getParentClass()->getName()) : null;
            if ($constructor !== null && $constructor->getDeclaringClass()->getName() === $classReflection->getParentClass()->getName() && !$constructor->isAbstract() || $constructorWithClassName !== null && $constructorWithClassName->getDeclaringClass()->getName() === $classReflection->getParentClass()->getName() && !$constructorWithClassName->isAbstract()) {
                return $classReflection->getParentClass();
            }
            $classReflection = $classReflection->getParentClass();
        }
        return \false;
    }
    private function ignoreErrorSuppression(\PhpParser\Node $statement) : \PhpParser\Node
    {
        if ($statement instanceof \PhpParser\Node\Expr\ErrorSuppress) {
            return $statement->expr;
        }
        return $statement;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Classes;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\Rule;
class ClassConstantDeclarationRule implements \PHPStan\Rules\Rule
{
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\ClassConst::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\ClassConst $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$scope->isInClass()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        $classReflection = $scope->getClassReflection();
        foreach ($node->consts as $const) {
            $classReflection->getConstant($const->name->name);
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Cast;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\Rule;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Type\ErrorType;
use PHPStan\Type\Type;
use PHPStan\Type\VerbosityLevel;
class PrintRule implements \PHPStan\Rules\Rule
{
    /** @var RuleLevelHelper */
    private $ruleLevelHelper;
    public function __construct(\PHPStan\Rules\RuleLevelHelper $ruleLevelHelper)
    {
        $this->ruleLevelHelper = $ruleLevelHelper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\Print_::class;
    }
    /**
     * @param \PhpParser\Node\Expr\Print_ $node
     * @param Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        /** @var Node\Expr\Print_ $node */
        $typeResult = $this->ruleLevelHelper->findTypeToCheck($scope, $node->expr, '', static function (\PHPStan\Type\Type $type) : bool {
            return !$type->toString() instanceof \PHPStan\Type\ErrorType;
        });
        if (!$typeResult->getType() instanceof \PHPStan\Type\ErrorType && $typeResult->getType()->toString() instanceof \PHPStan\Type\ErrorType) {
            return [\sprintf('Parameter %s of print cannot be converted to string.', $typeResult->getType()->describe(\PHPStan\Type\VerbosityLevel::value()))];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Cast;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Type\ErrorType;
use PHPStan\Type\Type;
use PHPStan\Type\VerbosityLevel;
class InvalidPartOfEncapsedStringRule implements \PHPStan\Rules\Rule
{
    /** @var \PhpParser\PrettyPrinter\Standard */
    private $printer;
    /** @var \PHPStan\Rules\RuleLevelHelper */
    private $ruleLevelHelper;
    public function __construct(\PhpParser\PrettyPrinter\Standard $printer, \PHPStan\Rules\RuleLevelHelper $ruleLevelHelper)
    {
        $this->printer = $printer;
        $this->ruleLevelHelper = $ruleLevelHelper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Scalar\Encapsed::class;
    }
    /**
     * @param \PhpParser\Node\Scalar\Encapsed $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[] errors
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $messages = [];
        foreach ($node->parts as $part) {
            if ($part instanceof \PhpParser\Node\Scalar\EncapsedStringPart) {
                continue;
            }
            $typeResult = $this->ruleLevelHelper->findTypeToCheck($scope, $part, '', static function (\PHPStan\Type\Type $type) : bool {
                return !$type->toString() instanceof \PHPStan\Type\ErrorType;
            });
            $partType = $typeResult->getType();
            if ($partType instanceof \PHPStan\Type\ErrorType) {
                continue;
            }
            $stringPartType = $partType->toString();
            if (!$stringPartType instanceof \PHPStan\Type\ErrorType) {
                continue;
            }
            $messages[] = \sprintf('Part %s (%s) of encapsed string cannot be cast to string.', $this->printer->prettyPrintExpr($part), $partType->describe(\PHPStan\Type\VerbosityLevel::value()));
        }
        return $messages;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Cast;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Broker\Broker;
use PHPStan\Rules\RuleError;
use PHPStan\Rules\RuleErrorBuilder;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Type\ErrorType;
use PHPStan\Type\Type;
use PHPStan\Type\VerbosityLevel;
class InvalidCastRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PHPStan\Rules\RuleLevelHelper */
    private $ruleLevelHelper;
    public function __construct(\PHPStan\Broker\Broker $broker, \PHPStan\Rules\RuleLevelHelper $ruleLevelHelper)
    {
        $this->broker = $broker;
        $this->ruleLevelHelper = $ruleLevelHelper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\Cast::class;
    }
    /**
     * @param \PhpParser\Node\Expr\Cast $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $castTypeCallback = static function (\PHPStan\Type\Type $type) use($node) : ?Type {
            if ($node instanceof \PhpParser\Node\Expr\Cast\Int_) {
                return $type->toInteger();
            } elseif ($node instanceof \PhpParser\Node\Expr\Cast\Bool_) {
                return $type->toBoolean();
            } elseif ($node instanceof \PhpParser\Node\Expr\Cast\Double) {
                return $type->toFloat();
            } elseif ($node instanceof \PhpParser\Node\Expr\Cast\String_) {
                return $type->toString();
            }
            return null;
        };
        $typeResult = $this->ruleLevelHelper->findTypeToCheck($scope, $node->expr, '', static function (\PHPStan\Type\Type $type) use($castTypeCallback) : bool {
            $castType = $castTypeCallback($type);
            if ($castType === null) {
                return \true;
            }
            return !$castType instanceof \PHPStan\Type\ErrorType;
        });
        $type = $typeResult->getType();
        if ($type instanceof \PHPStan\Type\ErrorType) {
            return [];
        }
        $castType = $castTypeCallback($type);
        if ($castType instanceof \PHPStan\Type\ErrorType) {
            $classReflection = $this->broker->getClass(\get_class($node));
            $shortName = $classReflection->getNativeReflection()->getShortName();
            $shortName = \strtolower($shortName);
            if ($shortName === 'double') {
                $shortName = 'float';
            } else {
                $shortName = \substr($shortName, 0, -1);
            }
            return [\PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Cannot cast %s to %s.', $scope->getType($node->expr)->describe(\PHPStan\Type\VerbosityLevel::value()), $shortName))->build()];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Cast;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\Rule;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Type\ErrorType;
use PHPStan\Type\Type;
use PHPStan\Type\VerbosityLevel;
class EchoRule implements \PHPStan\Rules\Rule
{
    /** @var RuleLevelHelper */
    private $ruleLevelHelper;
    public function __construct(\PHPStan\Rules\RuleLevelHelper $ruleLevelHelper)
    {
        $this->ruleLevelHelper = $ruleLevelHelper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\Echo_::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\Echo_ $node
     * @param Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $messages = [];
        foreach ($node->exprs as $key => $expr) {
            $typeResult = $this->ruleLevelHelper->findTypeToCheck($scope, $expr, '', static function (\PHPStan\Type\Type $type) : bool {
                return !$type->toString() instanceof \PHPStan\Type\ErrorType;
            });
            if ($typeResult->getType() instanceof \PHPStan\Type\ErrorType || !$typeResult->getType()->toString() instanceof \PHPStan\Type\ErrorType) {
                continue;
            }
            $messages[] = \sprintf('Parameter #%d (%s) of echo cannot be converted to string.', $key + 1, $typeResult->getType()->describe(\PHPStan\Type\VerbosityLevel::value()));
        }
        return $messages;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules;

interface RuleError
{
    public function getMessage() : string;
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Constants;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
class ConstantRule implements \PHPStan\Rules\Rule
{
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\ConstFetch::class;
    }
    /**
     * @param \PhpParser\Node\Expr\ConstFetch $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$scope->hasConstant($node->name)) {
            return [\sprintf('Constant %s not found.', (string) $node->name)];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules;

class Registry
{
    /** @var \PHPStan\Rules\Rule[][] */
    private $rules = [];
    /** @var \PHPStan\Rules\Rule[][] */
    private $cache = [];
    /**
     * @param \PHPStan\Rules\Rule[] $rules
     */
    public function __construct(array $rules)
    {
        foreach ($rules as $rule) {
            $this->rules[$rule->getNodeType()][] = $rule;
        }
    }
    /**
     * @param string $nodeType
     * @return \PHPStan\Rules\Rule[]
     */
    public function getRules(string $nodeType) : array
    {
        if (!isset($this->cache[$nodeType])) {
            $parentNodeTypes = [$nodeType] + \class_parents($nodeType) + \class_implements($nodeType);
            $rules = [];
            foreach ($parentNodeTypes as $parentNodeType) {
                foreach ($this->rules[$parentNodeType] ?? [] as $rule) {
                    $rules[] = $rule;
                }
            }
            $this->cache[$nodeType] = $rules;
        }
        return $this->cache[$nodeType];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules;

use PhpParser\Node;
class ClassNameNodePair
{
    /** @var string */
    private $className;
    /** @var Node */
    private $node;
    public function __construct(string $className, \PhpParser\Node $node)
    {
        $this->className = $className;
        $this->node = $node;
    }
    public function getClassName() : string
    {
        return $this->className;
    }
    public function getNode() : \PhpParser\Node
    {
        return $this->node;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Missing;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Node\ClosureReturnStatementsNode;
use PHPStan\Rules\Rule;
use PHPStan\Rules\RuleError;
use PHPStan\Rules\RuleErrorBuilder;
use PHPStan\Type\ArrayType;
use PHPStan\Type\IntersectionType;
use PHPStan\Type\MixedType;
use PHPStan\Type\NeverType;
use PHPStan\Type\NullType;
use PHPStan\Type\ObjectWithoutClassType;
use PHPStan\Type\ResourceType;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
use PHPStan\Type\UnionType;
use PHPStan\Type\VerbosityLevel;
class MissingClosureNativeReturnTypehintRule implements \PHPStan\Rules\Rule
{
    /** @var bool */
    private $checkObjectTypehint;
    public function __construct(bool $checkObjectTypehint)
    {
        $this->checkObjectTypehint = $checkObjectTypehint;
    }
    public function getNodeType() : string
    {
        return \PHPStan\Node\ClosureReturnStatementsNode::class;
    }
    /**
     * @param \PHPStan\Node\ClosureReturnStatementsNode $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return RuleError[] errors
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $closure = $node->getClosureExpr();
        if ($closure->returnType !== null) {
            return [];
        }
        $messagePattern = 'Anonymous function should have native typehint "%s".';
        $statementResult = $node->getStatementResult();
        if ($statementResult->hasYield()) {
            return [\PHPStan\Rules\RuleErrorBuilder::message(\sprintf($messagePattern, 'Generator'))->build()];
        }
        $returnStatements = $node->getReturnStatements();
        if (\count($returnStatements) === 0) {
            return [\PHPStan\Rules\RuleErrorBuilder::message(\sprintf($messagePattern, 'void'))->build()];
        }
        $returnTypes = [];
        $voidReturnNodes = [];
        $hasNull = \false;
        foreach ($returnStatements as $returnStatement) {
            $returnNode = $returnStatement->getReturnNode();
            if ($returnNode->expr === null) {
                $voidReturnNodes[] = $returnNode;
                $hasNull = \true;
                continue;
            }
            $returnTypes[] = $returnStatement->getScope()->getType($returnNode->expr);
        }
        if (\count($returnTypes) === 0) {
            return [\PHPStan\Rules\RuleErrorBuilder::message(\sprintf($messagePattern, 'void'))->build()];
        }
        $messages = [];
        foreach ($voidReturnNodes as $voidReturnStatement) {
            $messages[] = \PHPStan\Rules\RuleErrorBuilder::message('Mixing returning values with empty return statements - return null should be used here.')->line($voidReturnStatement->getLine())->build();
        }
        $returnType = \PHPStan\Type\TypeCombinator::union(...$returnTypes);
        if ($returnType instanceof \PHPStan\Type\MixedType || $returnType instanceof \PHPStan\Type\NeverType || $returnType instanceof \PHPStan\Type\IntersectionType || $returnType instanceof \PHPStan\Type\NullType) {
            return $messages;
        }
        if (\PHPStan\Type\TypeCombinator::containsNull($returnType)) {
            $hasNull = \true;
            $returnType = \PHPStan\Type\TypeCombinator::removeNull($returnType);
        }
        if ($returnType instanceof \PHPStan\Type\UnionType || $returnType instanceof \PHPStan\Type\ResourceType) {
            return $messages;
        }
        if (!$statementResult->isAlwaysTerminating()) {
            $messages[] = \PHPStan\Rules\RuleErrorBuilder::message('Anonymous function sometimes return something but return statement at the end is missing.')->build();
            return $messages;
        }
        $returnType = \PHPStan\Type\TypeUtils::generalizeType($returnType);
        $description = $returnType->describe(\PHPStan\Type\VerbosityLevel::typeOnly());
        if ($returnType instanceof \PHPStan\Type\ArrayType) {
            $description = 'array';
        }
        if ($hasNull) {
            $description = '?' . $description;
        }
        if (!$this->checkObjectTypehint && $returnType instanceof \PHPStan\Type\ObjectWithoutClassType) {
            return $messages;
        }
        $messages[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf($messagePattern, $description))->build();
        return $messages;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Missing;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Node\ExecutionEndNode;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Rules\Rule;
use PHPStan\Rules\RuleError;
use PHPStan\Rules\RuleErrorBuilder;
use PHPStan\Type\MixedType;
use PHPStan\Type\VerbosityLevel;
use PHPStan\Type\VoidType;
class MissingReturnRule implements \PHPStan\Rules\Rule
{
    /** @var bool */
    private $checkExplicitMixedMissingReturn;
    /** @var bool */
    private $checkPhpDocMissingReturn;
    public function __construct(bool $checkExplicitMixedMissingReturn, bool $checkPhpDocMissingReturn)
    {
        $this->checkExplicitMixedMissingReturn = $checkExplicitMixedMissingReturn;
        $this->checkPhpDocMissingReturn = $checkPhpDocMissingReturn;
    }
    public function getNodeType() : string
    {
        return \PHPStan\Node\ExecutionEndNode::class;
    }
    /**
     * @param ExecutionEndNode $node
     * @param Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $statementResult = $node->getStatementResult();
        if ($statementResult->isAlwaysTerminating()) {
            return [];
        }
        if ($statementResult->hasYield()) {
            return [];
        }
        if (!$node->hasNativeReturnTypehint() && !$this->checkPhpDocMissingReturn) {
            return [];
        }
        $anonymousFunctionReturnType = $scope->getAnonymousFunctionReturnType();
        $scopeFunction = $scope->getFunction();
        if ($anonymousFunctionReturnType !== null) {
            $returnType = $anonymousFunctionReturnType;
            $description = 'Anonymous function';
        } elseif ($scopeFunction !== null) {
            $returnType = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($scopeFunction->getVariants())->getReturnType();
            if ($scopeFunction instanceof \PHPStan\Reflection\MethodReflection) {
                $description = \sprintf('Method %s::%s()', $scopeFunction->getDeclaringClass()->getDisplayName(), $scopeFunction->getName());
            } else {
                $description = \sprintf('Function %s()', $scopeFunction->getName());
            }
        } else {
            throw new \PHPStan\ShouldNotHappenException();
        }
        if ($returnType instanceof \PHPStan\Type\VoidType) {
            return [];
        }
        if ($returnType instanceof \PHPStan\Type\MixedType && (!$returnType->isExplicitMixed() || !$this->checkExplicitMixedMissingReturn)) {
            return [];
        }
        return [\PHPStan\Rules\RuleErrorBuilder::message(\sprintf('%s should return %s but return statement is missing.', $description, $returnType->describe(\PHPStan\Type\VerbosityLevel::typeOnly())))->line($node->getNode()->getStartLine())->build()];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Exceptions;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\Rule;
use PHPStan\Rules\RuleError;
use PHPStan\Rules\RuleErrorBuilder;
use PHPStan\Type\ObjectType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\VerbosityLevel;
class DeadCatchRule implements \PHPStan\Rules\Rule
{
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\TryCatch::class;
    }
    /**
     * @param Node\Stmt\TryCatch $node
     * @param Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $catchTypes = \array_map(static function (\PhpParser\Node\Stmt\Catch_ $catch) : Type {
            return \PHPStan\Type\TypeCombinator::union(...\array_map(static function (\PhpParser\Node\Name $className) : ObjectType {
                return new \PHPStan\Type\ObjectType($className->toString());
            }, $catch->types));
        }, $node->catches);
        $catchesCount = \count($catchTypes);
        $errors = [];
        for ($i = 0; $i < $catchesCount - 1; $i++) {
            $firstType = $catchTypes[$i];
            for ($j = $i + 1; $j < $catchesCount; $j++) {
                $secondType = $catchTypes[$j];
                if (!$firstType->isSuperTypeOf($secondType)->yes()) {
                    continue;
                }
                $errors[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Dead catch - %s is already caught by %s above.', $secondType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $firstType->describe(\PHPStan\Type\VerbosityLevel::typeOnly())))->line($node->catches[$j]->getLine())->build();
            }
        }
        return $errors;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Exceptions;

use PhpParser\Node;
use PhpParser\Node\Stmt\Catch_;
use PHPStan\Analyser\Scope;
use PHPStan\Broker\Broker;
use PHPStan\Rules\ClassCaseSensitivityCheck;
use PHPStan\Rules\ClassNameNodePair;
use PHPStan\Rules\RuleError;
use PHPStan\Rules\RuleErrorBuilder;
class CaughtExceptionExistenceRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PHPStan\Rules\ClassCaseSensitivityCheck */
    private $classCaseSensitivityCheck;
    /** @var bool */
    private $checkClassCaseSensitivity;
    public function __construct(\PHPStan\Broker\Broker $broker, \PHPStan\Rules\ClassCaseSensitivityCheck $classCaseSensitivityCheck, bool $checkClassCaseSensitivity)
    {
        $this->broker = $broker;
        $this->classCaseSensitivityCheck = $classCaseSensitivityCheck;
        $this->checkClassCaseSensitivity = $checkClassCaseSensitivity;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\Catch_::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\Catch_ $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $errors = [];
        foreach ($node->types as $class) {
            $className = (string) $class;
            if (!$this->broker->hasClass($className)) {
                $errors[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Caught class %s not found.', $className))->line($class->getLine())->build();
                continue;
            }
            $classReflection = $this->broker->getClass($className);
            if (!$classReflection->isInterface() && !$classReflection->getNativeReflection()->implementsInterface(\Throwable::class)) {
                $errors[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Caught class %s is not an exception.', $classReflection->getDisplayName()))->line($class->getLine())->build();
            }
            if (!$this->checkClassCaseSensitivity) {
                continue;
            }
            $errors = \array_merge($errors, $this->classCaseSensitivityCheck->checkClassNames([new \PHPStan\Rules\ClassNameNodePair($className, $class)]));
        }
        return $errors;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules;

use PHPStan\DependencyInjection\Container;
class RegistryFactory
{
    public const RULE_TAG = 'phpstan.rules.rule';
    /** @var Container */
    private $container;
    public function __construct(\PHPStan\DependencyInjection\Container $container)
    {
        $this->container = $container;
    }
    public function create() : \PHPStan\Rules\Registry
    {
        return new \PHPStan\Rules\Registry($this->container->getServicesByTag(self::RULE_TAG));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Namespaces;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Broker\Broker;
use PHPStan\Rules\ClassCaseSensitivityCheck;
use PHPStan\Rules\ClassNameNodePair;
use PHPStan\Rules\RuleError;
use PHPStan\Rules\RuleErrorBuilder;
class ExistingNamesInUseRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PHPStan\Rules\ClassCaseSensitivityCheck */
    private $classCaseSensitivityCheck;
    /** @var bool */
    private $checkFunctionNameCase;
    public function __construct(\PHPStan\Broker\Broker $broker, \PHPStan\Rules\ClassCaseSensitivityCheck $classCaseSensitivityCheck, bool $checkFunctionNameCase)
    {
        $this->broker = $broker;
        $this->classCaseSensitivityCheck = $classCaseSensitivityCheck;
        $this->checkFunctionNameCase = $checkFunctionNameCase;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\Use_::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\Use_ $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if ($node->type === \PhpParser\Node\Stmt\Use_::TYPE_UNKNOWN) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        foreach ($node->uses as $use) {
            if ($use->type !== \PhpParser\Node\Stmt\Use_::TYPE_UNKNOWN) {
                throw new \PHPStan\ShouldNotHappenException();
            }
        }
        if ($node->type === \PhpParser\Node\Stmt\Use_::TYPE_CONSTANT) {
            return $this->checkConstants($node->uses);
        }
        if ($node->type === \PhpParser\Node\Stmt\Use_::TYPE_FUNCTION) {
            return $this->checkFunctions($node->uses);
        }
        return $this->checkClasses($node->uses);
    }
    /**
     * @param \PhpParser\Node\Stmt\UseUse[] $uses
     * @return RuleError[]
     */
    private function checkConstants(array $uses) : array
    {
        $errors = [];
        foreach ($uses as $use) {
            if ($this->broker->hasConstant($use->name, null)) {
                continue;
            }
            $errors[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Used constant %s not found.', (string) $use->name))->line($use->name->getLine())->build();
        }
        return $errors;
    }
    /**
     * @param \PhpParser\Node\Stmt\UseUse[] $uses
     * @return RuleError[]
     */
    private function checkFunctions(array $uses) : array
    {
        $errors = [];
        foreach ($uses as $use) {
            if (!$this->broker->hasFunction($use->name, null)) {
                $errors[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Used function %s not found.', (string) $use->name))->line($use->name->getLine())->build();
            } elseif ($this->checkFunctionNameCase) {
                $functionReflection = $this->broker->getFunction($use->name, null);
                $realName = $functionReflection->getName();
                $usedName = (string) $use->name;
                if (\strtolower($realName) === \strtolower($usedName) && $realName !== $usedName) {
                    $errors[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Function %s used with incorrect case: %s.', $realName, $usedName))->line($use->name->getLine())->build();
                }
            }
        }
        return $errors;
    }
    /**
     * @param \PhpParser\Node\Stmt\UseUse[] $uses
     * @return RuleError[]
     */
    private function checkClasses(array $uses) : array
    {
        return $this->classCaseSensitivityCheck->checkClassNames(\array_map(static function (\PhpParser\Node\Stmt\UseUse $use) : ClassNameNodePair {
            return new \PHPStan\Rules\ClassNameNodePair((string) $use->name, $use->name);
        }, $uses));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Namespaces;

use PhpParser\Node;
use PhpParser\Node\Stmt\Use_;
use PHPStan\Analyser\Scope;
use PHPStan\Broker\Broker;
use PHPStan\Rules\ClassCaseSensitivityCheck;
use PHPStan\Rules\ClassNameNodePair;
use PHPStan\Rules\RuleError;
use PHPStan\Rules\RuleErrorBuilder;
class ExistingNamesInGroupUseRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PHPStan\Rules\ClassCaseSensitivityCheck */
    private $classCaseSensitivityCheck;
    /** @var bool */
    private $checkFunctionNameCase;
    public function __construct(\PHPStan\Broker\Broker $broker, \PHPStan\Rules\ClassCaseSensitivityCheck $classCaseSensitivityCheck, bool $checkFunctionNameCase)
    {
        $this->broker = $broker;
        $this->classCaseSensitivityCheck = $classCaseSensitivityCheck;
        $this->checkFunctionNameCase = $checkFunctionNameCase;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\GroupUse::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\GroupUse $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $errors = [];
        foreach ($node->uses as $use) {
            $error = null;
            /** @var Node\Name $name */
            $name = \PhpParser\Node\Name::concat($node->prefix, $use->name);
            if ($node->type === \PhpParser\Node\Stmt\Use_::TYPE_CONSTANT || $use->type === \PhpParser\Node\Stmt\Use_::TYPE_CONSTANT) {
                $error = $this->checkConstant($name);
            } elseif ($node->type === \PhpParser\Node\Stmt\Use_::TYPE_FUNCTION || $use->type === \PhpParser\Node\Stmt\Use_::TYPE_FUNCTION) {
                $error = $this->checkFunction($name);
            } elseif ($use->type === \PhpParser\Node\Stmt\Use_::TYPE_NORMAL) {
                $error = $this->checkClass($name);
            } else {
                throw new \PHPStan\ShouldNotHappenException();
            }
            if ($error === null) {
                continue;
            }
            $errors[] = $error;
        }
        return $errors;
    }
    private function checkConstant(\PhpParser\Node\Name $name) : ?\PHPStan\Rules\RuleError
    {
        if (!$this->broker->hasConstant($name, null)) {
            return \PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Used constant %s not found.', (string) $name))->build();
        }
        return null;
    }
    private function checkFunction(\PhpParser\Node\Name $name) : ?\PHPStan\Rules\RuleError
    {
        if (!$this->broker->hasFunction($name, null)) {
            return \PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Used function %s not found.', (string) $name))->build();
        }
        if ($this->checkFunctionNameCase) {
            $functionReflection = $this->broker->getFunction($name, null);
            $realName = $functionReflection->getName();
            $usedName = (string) $name;
            if (\strtolower($realName) === \strtolower($usedName) && $realName !== $usedName) {
                return \PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Function %s used with incorrect case: %s.', $realName, $usedName))->build();
            }
        }
        return null;
    }
    private function checkClass(\PhpParser\Node\Name $name) : ?\PHPStan\Rules\RuleError
    {
        $errors = $this->classCaseSensitivityCheck->checkClassNames([new \PHPStan\Rules\ClassNameNodePair((string) $name, $name)]);
        if (\count($errors) === 0) {
            return null;
        } elseif (\count($errors) === 1) {
            return $errors[0];
        }
        throw new \PHPStan\ShouldNotHappenException();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules;

use PHPStan\Rules\RuleErrors\RuleErrorWithMessage;
use PHPStan\Rules\RuleErrors\RuleErrorWithMessageAndFile;
use PHPStan\Rules\RuleErrors\RuleErrorWithMessageAndLine;
use PHPStan\Rules\RuleErrors\RuleErrorWithMessageAndLineAndFile;
class RuleErrorBuilder
{
    /** @var string */
    private $message;
    /** @var int|null */
    private $line;
    /** @var string|null */
    private $file;
    private function __construct()
    {
    }
    public static function message(string $message) : self
    {
        $self = new self();
        $self->message = $message;
        return $self;
    }
    public function line(int $line) : self
    {
        $this->line = $line;
        return $this;
    }
    public function file(string $file) : self
    {
        $this->file = $file;
        return $this;
    }
    public function build() : \PHPStan\Rules\RuleError
    {
        if ($this->line !== null && $this->file !== null) {
            return new \PHPStan\Rules\RuleErrors\RuleErrorWithMessageAndLineAndFile($this->message, $this->line, $this->file);
        }
        if ($this->line !== null && $this->file === null) {
            return new \PHPStan\Rules\RuleErrors\RuleErrorWithMessageAndLine($this->message, $this->line);
        }
        if ($this->line === null && $this->file !== null) {
            return new \PHPStan\Rules\RuleErrors\RuleErrorWithMessageAndFile($this->message, $this->file);
        }
        return new \PHPStan\Rules\RuleErrors\RuleErrorWithMessage($this->message);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Properties;

use PhpParser\Node\Expr\PropertyFetch;
use PHPStan\Analyser\Scope;
use PHPStan\Broker\Broker;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Type\ErrorType;
use PHPStan\Type\Type;
use PHPStan\Type\VerbosityLevel;
class AccessPropertiesRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PHPStan\Rules\RuleLevelHelper */
    private $ruleLevelHelper;
    /** @var bool */
    private $reportMagicProperties;
    public function __construct(\PHPStan\Broker\Broker $broker, \PHPStan\Rules\RuleLevelHelper $ruleLevelHelper, bool $reportMagicProperties)
    {
        $this->broker = $broker;
        $this->ruleLevelHelper = $ruleLevelHelper;
        $this->reportMagicProperties = $reportMagicProperties;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\PropertyFetch::class;
    }
    /**
     * @param \PhpParser\Node\Expr\PropertyFetch $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return (string|\PHPStan\Rules\RuleError)[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node->name instanceof \PhpParser\Node\Identifier) {
            return [];
        }
        $name = $node->name->name;
        $typeResult = $this->ruleLevelHelper->findTypeToCheck($scope, $node->var, \sprintf('Access to property $%s on an unknown class %%s.', $name), static function (\PHPStan\Type\Type $type) use($name) : bool {
            return $type->canAccessProperties()->yes() && $type->hasProperty($name)->yes();
        });
        $type = $typeResult->getType();
        if ($type instanceof \PHPStan\Type\ErrorType) {
            return $typeResult->getUnknownClassErrors();
        }
        if ($scope->isInExpressionAssign($node)) {
            return [];
        }
        if (!$type->canAccessProperties()->yes()) {
            return [\sprintf('Cannot access property $%s on %s.', $name, $type->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))];
        }
        if (!$type->hasProperty($name)->yes()) {
            if ($scope->isSpecified($node)) {
                return [];
            }
            $classNames = $typeResult->getReferencedClasses();
            if (!$this->reportMagicProperties) {
                foreach ($classNames as $className) {
                    if (!$this->broker->hasClass($className)) {
                        continue;
                    }
                    $classReflection = $this->broker->getClass($className);
                    if ($classReflection->hasNativeMethod('__get') || $classReflection->hasNativeMethod('__set')) {
                        return [];
                    }
                }
            }
            if (\count($classNames) === 1) {
                $referencedClass = $typeResult->getReferencedClasses()[0];
                $propertyClassReflection = $this->broker->getClass($referencedClass);
                $parentClassReflection = $propertyClassReflection->getParentClass();
                while ($parentClassReflection !== \false) {
                    if ($parentClassReflection->hasProperty($name)) {
                        return [\sprintf('Access to private property $%s of parent class %s.', $name, $parentClassReflection->getDisplayName())];
                    }
                    $parentClassReflection = $parentClassReflection->getParentClass();
                }
            }
            return [\sprintf('Access to an undefined property %s::$%s.', $type->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $name)];
        }
        $propertyReflection = $type->getProperty($name, $scope);
        if (!$scope->canAccessProperty($propertyReflection)) {
            return [\sprintf('Access to %s property %s::$%s.', $propertyReflection->isPrivate() ? 'private' : 'protected', $type->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $name)];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Properties;

use PhpParser\Node;
use PhpParser\Node\Stmt\PropertyProperty;
use PHPStan\Analyser\Scope;
use PHPStan\Broker\Broker;
use PHPStan\Rules\ClassCaseSensitivityCheck;
use PHPStan\Rules\ClassNameNodePair;
use PHPStan\Rules\RuleError;
use PHPStan\Rules\RuleErrorBuilder;
class ExistingClassesInPropertiesRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PHPStan\Rules\ClassCaseSensitivityCheck */
    private $classCaseSensitivityCheck;
    /** @var bool */
    private $checkClassCaseSensitivity;
    public function __construct(\PHPStan\Broker\Broker $broker, \PHPStan\Rules\ClassCaseSensitivityCheck $classCaseSensitivityCheck, bool $checkClassCaseSensitivity)
    {
        $this->broker = $broker;
        $this->classCaseSensitivityCheck = $classCaseSensitivityCheck;
        $this->checkClassCaseSensitivity = $checkClassCaseSensitivity;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\PropertyProperty::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\PropertyProperty $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$scope->isInClass()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        $propertyReflection = $scope->getClassReflection()->getNativeProperty($node->name->name);
        $propertyType = $propertyReflection->getType();
        $errors = [];
        foreach ($propertyType->getReferencedClasses() as $referencedClass) {
            if ($this->broker->hasClass($referencedClass)) {
                if ($this->broker->getClass($referencedClass)->isTrait()) {
                    $errors[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Property %s::$%s has invalid type %s.', $propertyReflection->getDeclaringClass()->getDisplayName(), $node->name->name, $referencedClass))->build();
                }
                continue;
            }
            $errors[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Property %s::$%s has unknown class %s as its type.', $propertyReflection->getDeclaringClass()->getDisplayName(), $node->name->name, $referencedClass))->build();
        }
        if ($this->checkClassCaseSensitivity) {
            $errors = \array_merge($errors, $this->classCaseSensitivityCheck->checkClassNames(\array_map(static function (string $class) use($node) : ClassNameNodePair {
                return new \PHPStan\Rules\ClassNameNodePair($class, $node);
            }, $propertyType->getReferencedClasses())));
        }
        return $errors;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Properties;

use PHPStan\Reflection\PropertyReflection;
class PropertyDescriptor
{
    /**
     * @param \PHPStan\Reflection\PropertyReflection $property
     * @param \PhpParser\Node\Expr\PropertyFetch|\PhpParser\Node\Expr\StaticPropertyFetch $propertyFetch
     * @return string
     */
    public function describeProperty(\PHPStan\Reflection\PropertyReflection $property, $propertyFetch) : string
    {
        /** @var \PhpParser\Node\Identifier $name */
        $name = $propertyFetch->name;
        if ($propertyFetch instanceof \PhpParser\Node\Expr\PropertyFetch) {
            return \sprintf('Property %s::$%s', $property->getDeclaringClass()->getDisplayName(), $name->name);
        }
        return \sprintf('Static property %s::$%s', $property->getDeclaringClass()->getDisplayName(), $name->name);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Properties;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\RuleLevelHelper;
class ReadingWriteOnlyPropertiesRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\Properties\PropertyDescriptor */
    private $propertyDescriptor;
    /** @var \PHPStan\Rules\Properties\PropertyReflectionFinder */
    private $propertyReflectionFinder;
    /** @var RuleLevelHelper */
    private $ruleLevelHelper;
    /** @var bool */
    private $checkThisOnly;
    public function __construct(\PHPStan\Rules\Properties\PropertyDescriptor $propertyDescriptor, \PHPStan\Rules\Properties\PropertyReflectionFinder $propertyReflectionFinder, \PHPStan\Rules\RuleLevelHelper $ruleLevelHelper, bool $checkThisOnly)
    {
        $this->propertyDescriptor = $propertyDescriptor;
        $this->propertyReflectionFinder = $propertyReflectionFinder;
        $this->ruleLevelHelper = $ruleLevelHelper;
        $this->checkThisOnly = $checkThisOnly;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr::class;
    }
    /**
     * @param \PhpParser\Node\Expr $node
     * @param Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node instanceof \PhpParser\Node\Expr\PropertyFetch && !$node instanceof \PhpParser\Node\Expr\StaticPropertyFetch) {
            return [];
        }
        if ($node instanceof \PhpParser\Node\Expr\PropertyFetch && $this->checkThisOnly && !$this->ruleLevelHelper->isThis($node->var)) {
            return [];
        }
        if ($scope->isInExpressionAssign($node)) {
            return [];
        }
        $propertyReflection = $this->propertyReflectionFinder->findPropertyReflectionFromNode($node, $scope);
        if ($propertyReflection === null) {
            return [];
        }
        if (!$scope->canAccessProperty($propertyReflection)) {
            return [];
        }
        if (!$propertyReflection->isReadable()) {
            $propertyDescription = $this->propertyDescriptor->describeProperty($propertyReflection, $node);
            return [\sprintf('%s is not readable.', $propertyDescription)];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Properties;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Type\VerbosityLevel;
class TypesAssignedToPropertiesRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\RuleLevelHelper */
    private $ruleLevelHelper;
    /** @var \PHPStan\Rules\Properties\PropertyDescriptor */
    private $propertyDescriptor;
    /** @var \PHPStan\Rules\Properties\PropertyReflectionFinder */
    private $propertyReflectionFinder;
    public function __construct(\PHPStan\Rules\RuleLevelHelper $ruleLevelHelper, \PHPStan\Rules\Properties\PropertyDescriptor $propertyDescriptor, \PHPStan\Rules\Properties\PropertyReflectionFinder $propertyReflectionFinder)
    {
        $this->ruleLevelHelper = $ruleLevelHelper;
        $this->propertyDescriptor = $propertyDescriptor;
        $this->propertyReflectionFinder = $propertyReflectionFinder;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr::class;
    }
    /**
     * @param \PhpParser\Node\Expr $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node instanceof \PhpParser\Node\Expr\Assign && !$node instanceof \PhpParser\Node\Expr\AssignOp) {
            return [];
        }
        if (!$node->var instanceof \PhpParser\Node\Expr\PropertyFetch && !$node->var instanceof \PhpParser\Node\Expr\StaticPropertyFetch) {
            return [];
        }
        /** @var \PhpParser\Node\Expr\PropertyFetch|\PhpParser\Node\Expr\StaticPropertyFetch $propertyFetch */
        $propertyFetch = $node->var;
        $propertyReflection = $this->propertyReflectionFinder->findPropertyReflectionFromNode($propertyFetch, $scope);
        if ($propertyReflection === null) {
            return [];
        }
        $propertyType = $propertyReflection->getType();
        if ($node instanceof \PhpParser\Node\Expr\Assign) {
            $assignedValueType = $scope->getType($node->expr);
        } else {
            $assignedValueType = $scope->getType($node);
        }
        if (!$this->ruleLevelHelper->accepts($propertyType, $assignedValueType, $scope->isDeclareStrictTypes())) {
            $propertyDescription = $this->propertyDescriptor->describeProperty($propertyReflection, $propertyFetch);
            return [\sprintf('%s (%s) does not accept %s.', $propertyDescription, $propertyType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $assignedValueType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Properties;

use PhpParser\Node;
use PhpParser\Node\Stmt\Property;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Type\VerbosityLevel;
class DefaultValueTypesAssignedToPropertiesRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\RuleLevelHelper */
    private $ruleLevelHelper;
    public function __construct(\PHPStan\Rules\RuleLevelHelper $ruleLevelHelper)
    {
        $this->ruleLevelHelper = $ruleLevelHelper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\Property::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\Property $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$scope->isInClass()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        $classReflection = $scope->getClassReflection();
        $errors = [];
        foreach ($node->props as $property) {
            if ($property->default === null) {
                continue;
            }
            if ($property->default instanceof \PhpParser\Node\Expr\ConstFetch && (string) $property->default->name === 'null') {
                continue;
            }
            $propertyReflection = $classReflection->getNativeProperty($property->name->name);
            $propertyType = $propertyReflection->getType();
            $defaultValueType = $scope->getType($property->default);
            if ($this->ruleLevelHelper->accepts($propertyType, $defaultValueType, $scope->isDeclareStrictTypes())) {
                continue;
            }
            $errors[] = \sprintf('%s %s::$%s (%s) does not accept default value of type %s.', $node->isStatic() ? 'Static property' : 'Property', $classReflection->getDisplayName(), $property->name->name, $propertyType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $defaultValueType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()));
        }
        return $errors;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Properties;

use PhpParser\Node;
use PhpParser\Node\Expr\StaticPropertyFetch;
use PhpParser\Node\Name;
use PHPStan\Analyser\Scope;
use PHPStan\Broker\Broker;
use PHPStan\Rules\ClassCaseSensitivityCheck;
use PHPStan\Rules\ClassNameNodePair;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Type\ErrorType;
use PHPStan\Type\ObjectType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
use PHPStan\Type\VerbosityLevel;
class AccessStaticPropertiesRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PHPStan\Rules\RuleLevelHelper */
    private $ruleLevelHelper;
    /** @var \PHPStan\Rules\ClassCaseSensitivityCheck */
    private $classCaseSensitivityCheck;
    public function __construct(\PHPStan\Broker\Broker $broker, \PHPStan\Rules\RuleLevelHelper $ruleLevelHelper, \PHPStan\Rules\ClassCaseSensitivityCheck $classCaseSensitivityCheck)
    {
        $this->broker = $broker;
        $this->ruleLevelHelper = $ruleLevelHelper;
        $this->classCaseSensitivityCheck = $classCaseSensitivityCheck;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\StaticPropertyFetch::class;
    }
    /**
     * @param \PhpParser\Node\Expr\StaticPropertyFetch $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return (string|\PHPStan\Rules\RuleError)[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node->name instanceof \PhpParser\Node\VarLikeIdentifier) {
            return [];
        }
        $name = $node->name->name;
        $messages = [];
        if ($node->class instanceof \PhpParser\Node\Name) {
            $class = (string) $node->class;
            $lowercasedClass = \strtolower($class);
            if (\in_array($lowercasedClass, ['self', 'static'], \true)) {
                if (!$scope->isInClass()) {
                    return [\sprintf('Accessing %s::$%s outside of class scope.', $class, $name)];
                }
                $className = $scope->getClassReflection()->getName();
            } elseif ($lowercasedClass === 'parent') {
                if (!$scope->isInClass()) {
                    return [\sprintf('Accessing %s::$%s outside of class scope.', $class, $name)];
                }
                if ($scope->getClassReflection()->getParentClass() === \false) {
                    return [\sprintf('%s::%s() accesses parent::$%s but %s does not extend any class.', $scope->getClassReflection()->getDisplayName(), $scope->getFunctionName(), $name, $scope->getClassReflection()->getDisplayName())];
                }
                if ($scope->getFunctionName() === null) {
                    throw new \PHPStan\ShouldNotHappenException();
                }
                $currentMethodReflection = $scope->getClassReflection()->getNativeMethod($scope->getFunctionName());
                if (!$currentMethodReflection->isStatic()) {
                    // calling parent::method() from instance method
                    return [];
                }
                $className = $scope->getClassReflection()->getParentClass()->getName();
            } else {
                if (!$this->broker->hasClass($class)) {
                    return [\sprintf('Access to static property $%s on an unknown class %s.', $name, $class)];
                } else {
                    $messages = $this->classCaseSensitivityCheck->checkClassNames([new \PHPStan\Rules\ClassNameNodePair($class, $node->class)]);
                }
                $className = $this->broker->getClass($class)->getName();
            }
            $classType = new \PHPStan\Type\ObjectType($className);
        } else {
            $classTypeResult = $this->ruleLevelHelper->findTypeToCheck($scope, $node->class, \sprintf('Access to static property $%s on an unknown class %%s.', $name), static function (\PHPStan\Type\Type $type) use($name) : bool {
                return $type->canAccessProperties()->yes() && $type->hasProperty($name)->yes();
            });
            $classType = $classTypeResult->getType();
            if ($classType instanceof \PHPStan\Type\ErrorType) {
                return $classTypeResult->getUnknownClassErrors();
            }
        }
        if ((new \PHPStan\Type\StringType())->isSuperTypeOf($classType)->yes()) {
            return [];
        }
        $typeForDescribe = $classType;
        $classType = \PHPStan\Type\TypeCombinator::remove($classType, new \PHPStan\Type\StringType());
        if ($scope->isInExpressionAssign($node)) {
            return [];
        }
        if (!$classType->canAccessProperties()->yes()) {
            return \array_merge($messages, [\sprintf('Cannot access static property $%s on %s.', $name, $typeForDescribe->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))]);
        }
        if (!$classType->hasProperty($name)->yes()) {
            if ($scope->isSpecified($node)) {
                return $messages;
            }
            return \array_merge($messages, [\sprintf('Access to an undefined static property %s::$%s.', $typeForDescribe->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $name)]);
        }
        $property = $classType->getProperty($name, $scope);
        if (!$property->isStatic()) {
            $hasPropertyTypes = \PHPStan\Type\TypeUtils::getHasPropertyTypes($classType);
            foreach ($hasPropertyTypes as $hasPropertyType) {
                if ($hasPropertyType->getPropertyName() === $name) {
                    return [];
                }
            }
            return \array_merge($messages, [\sprintf('Static access to instance property %s::$%s.', $property->getDeclaringClass()->getDisplayName(), $name)]);
        }
        if (!$scope->canAccessProperty($property)) {
            return \array_merge($messages, [\sprintf('Access to %s property $%s of class %s.', $property->isPrivate() ? 'private' : 'protected', $name, $property->getDeclaringClass()->getDisplayName())]);
        }
        return $messages;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Properties;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\Rule;
class AccessPropertiesInAssignRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\Properties\AccessPropertiesRule */
    private $accessPropertiesRule;
    public function __construct(\PHPStan\Rules\Properties\AccessPropertiesRule $accessPropertiesRule)
    {
        $this->accessPropertiesRule = $accessPropertiesRule;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\Assign::class;
    }
    /**
     * @param \PhpParser\Node\Expr\Assign $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return (string|\PHPStan\Rules\RuleError)[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node->var instanceof \PhpParser\Node\Expr\PropertyFetch) {
            return [];
        }
        return $this->accessPropertiesRule->processNode($node->var, $scope);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Properties;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\RuleLevelHelper;
class WritingToReadOnlyPropertiesRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\RuleLevelHelper */
    private $ruleLevelHelper;
    /** @var \PHPStan\Rules\Properties\PropertyDescriptor */
    private $propertyDescriptor;
    /** @var \PHPStan\Rules\Properties\PropertyReflectionFinder */
    private $propertyReflectionFinder;
    /** @var bool */
    private $checkThisOnly;
    public function __construct(\PHPStan\Rules\RuleLevelHelper $ruleLevelHelper, \PHPStan\Rules\Properties\PropertyDescriptor $propertyDescriptor, \PHPStan\Rules\Properties\PropertyReflectionFinder $propertyReflectionFinder, bool $checkThisOnly)
    {
        $this->ruleLevelHelper = $ruleLevelHelper;
        $this->propertyDescriptor = $propertyDescriptor;
        $this->propertyReflectionFinder = $propertyReflectionFinder;
        $this->checkThisOnly = $checkThisOnly;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr::class;
    }
    /**
     * @param \PhpParser\Node\Expr $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node instanceof \PhpParser\Node\Expr\Assign && !$node instanceof \PhpParser\Node\Expr\AssignOp) {
            return [];
        }
        if (!$node->var instanceof \PhpParser\Node\Expr\PropertyFetch && !$node->var instanceof \PhpParser\Node\Expr\StaticPropertyFetch) {
            return [];
        }
        if ($node->var instanceof \PhpParser\Node\Expr\PropertyFetch && $this->checkThisOnly && !$this->ruleLevelHelper->isThis($node->var->var)) {
            return [];
        }
        /** @var \PhpParser\Node\Expr\PropertyFetch|\PhpParser\Node\Expr\StaticPropertyFetch $propertyFetch */
        $propertyFetch = $node->var;
        $propertyReflection = $this->propertyReflectionFinder->findPropertyReflectionFromNode($propertyFetch, $scope);
        if ($propertyReflection === null) {
            return [];
        }
        if (!$scope->canAccessProperty($propertyReflection)) {
            return [];
        }
        if (!$propertyReflection->isWritable()) {
            $propertyDescription = $this->propertyDescriptor->describeProperty($propertyReflection, $propertyFetch);
            return [\sprintf('%s is not writable.', $propertyDescription)];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Properties;

use PHPStan\Analyser\Scope;
use PHPStan\Type\ObjectType;
use PHPStan\Type\Type;
class PropertyReflectionFinder
{
    /**
     * @param \PhpParser\Node\Expr\PropertyFetch|\PhpParser\Node\Expr\StaticPropertyFetch $propertyFetch
     * @param \PHPStan\Analyser\Scope $scope
     * @return \PHPStan\Reflection\PropertyReflection|null
     */
    public function findPropertyReflectionFromNode($propertyFetch, \PHPStan\Analyser\Scope $scope) : ?\PHPStan\Reflection\PropertyReflection
    {
        if ($propertyFetch instanceof \PhpParser\Node\Expr\PropertyFetch) {
            if (!$propertyFetch->name instanceof \PhpParser\Node\Identifier) {
                return null;
            }
            $propertyHolderType = $scope->getType($propertyFetch->var);
            return $this->findPropertyReflection($propertyHolderType, $propertyFetch->name->name, $scope);
        }
        if (!$propertyFetch->name instanceof \PhpParser\Node\Identifier) {
            return null;
        }
        if ($propertyFetch->class instanceof \PhpParser\Node\Name) {
            $propertyHolderType = new \PHPStan\Type\ObjectType($scope->resolveName($propertyFetch->class));
        } else {
            $propertyHolderType = $scope->getType($propertyFetch->class);
        }
        return $this->findPropertyReflection($propertyHolderType, $propertyFetch->name->name, $scope);
    }
    private function findPropertyReflection(\PHPStan\Type\Type $propertyHolderType, string $propertyName, \PHPStan\Analyser\Scope $scope) : ?\PHPStan\Reflection\PropertyReflection
    {
        if (!$propertyHolderType->hasProperty($propertyName)->yes()) {
            return null;
        }
        return $propertyHolderType->getProperty($propertyName, $scope);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Properties;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\Rule;
class AccessStaticPropertiesInAssignRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\Properties\AccessStaticPropertiesRule */
    private $accessStaticPropertiesRule;
    public function __construct(\PHPStan\Rules\Properties\AccessStaticPropertiesRule $accessStaticPropertiesRule)
    {
        $this->accessStaticPropertiesRule = $accessStaticPropertiesRule;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\Assign::class;
    }
    /**
     * @param \PhpParser\Node\Expr\Assign $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return (string|\PHPStan\Rules\RuleError)[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node->var instanceof \PhpParser\Node\Expr\StaticPropertyFetch) {
            return [];
        }
        return $this->accessStaticPropertiesRule->processNode($node->var, $scope);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\DeadCode;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Node\UnreachableStatementNode;
use PHPStan\Rules\Rule;
class UnreachableStatementRule implements \PHPStan\Rules\Rule
{
    public function getNodeType() : string
    {
        return \PHPStan\Node\UnreachableStatementNode::class;
    }
    /**
     * @param UnreachableStatementNode $node
     * @param Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if ($node->getOriginalStatement() instanceof \PhpParser\Node\Stmt\Nop) {
            return [];
        }
        return ['Unreachable statement - code above always terminates.'];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\DeadCode;

use PhpParser\Node;
use PhpParser\PrettyPrinter\Standard;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\Rule;
class NoopRule implements \PHPStan\Rules\Rule
{
    /** @var Standard */
    private $printer;
    public function __construct(\PhpParser\PrettyPrinter\Standard $printer)
    {
        $this->printer = $printer;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\Expression::class;
    }
    /**
     * @param Node\Stmt\Expression $node
     * @param Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $originalExpr = $node->expr;
        $expr = $originalExpr;
        if ($expr instanceof \PhpParser\Node\Expr\Cast || $expr instanceof \PhpParser\Node\Expr\UnaryMinus || $expr instanceof \PhpParser\Node\Expr\UnaryPlus || $expr instanceof \PhpParser\Node\Expr\ErrorSuppress) {
            $expr = $expr->expr;
        }
        if (!$expr instanceof \PhpParser\Node\Expr\Variable && !$expr instanceof \PhpParser\Node\Expr\PropertyFetch && !$expr instanceof \PhpParser\Node\Expr\StaticPropertyFetch && !$expr instanceof \PhpParser\Node\Expr\ArrayDimFetch && !$expr instanceof \PhpParser\Node\Scalar && !$expr instanceof \PhpParser\Node\Expr\Isset_ && !$expr instanceof \PhpParser\Node\Expr\Empty_ && !$expr instanceof \PhpParser\Node\Expr\ConstFetch && !$expr instanceof \PhpParser\Node\Expr\ClassConstFetch) {
            return [];
        }
        return [\sprintf('Expression "%s" on a separate line does not do anything.', $this->printer->prettyPrintExpr($originalExpr))];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Variables;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Type\NullType;
class VariableCertaintyInIssetRule implements \PHPStan\Rules\Rule
{
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\Isset_::class;
    }
    /**
     * @param \PhpParser\Node\Expr\Isset_ $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $messages = [];
        foreach ($node->vars as $var) {
            $isSubNode = \false;
            while ($var instanceof \PhpParser\Node\Expr\ArrayDimFetch || $var instanceof \PhpParser\Node\Expr\PropertyFetch || $var instanceof \PhpParser\Node\Expr\StaticPropertyFetch && $var->class instanceof \PhpParser\Node\Expr) {
                if ($var instanceof \PhpParser\Node\Expr\StaticPropertyFetch) {
                    $var = $var->class;
                } else {
                    $var = $var->var;
                }
                $isSubNode = \true;
            }
            if (!$var instanceof \PhpParser\Node\Expr\Variable || !\is_string($var->name)) {
                continue;
            }
            $certainty = $scope->hasVariableType($var->name);
            if ($certainty->no()) {
                if ($scope->getFunction() !== null || $scope->isInAnonymousFunction()) {
                    $messages[] = \sprintf('Variable $%s in isset() is never defined.', $var->name);
                }
            } elseif ($certainty->yes() && !$isSubNode) {
                $variableType = $scope->getVariableType($var->name);
                if ($variableType->isSuperTypeOf(new \PHPStan\Type\NullType())->no()) {
                    $messages[] = \sprintf('Variable $%s in isset() always exists and is not nullable.', $var->name);
                }
            }
        }
        return $messages;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Variables;

use PhpParser\Node;
use PhpParser\Node\Expr\Variable;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\MethodReflection;
class ThisVariableRule implements \PHPStan\Rules\Rule
{
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\Variable::class;
    }
    /**
     * @param \PhpParser\Node\Expr\Variable $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!\is_string($node->name) || $node->name !== 'this') {
            return [];
        }
        if ($scope->isInClosureBind()) {
            return [];
        }
        if (!$scope->isInClass()) {
            return ['Using $this outside a class.'];
        }
        $function = $scope->getFunction();
        if (!$function instanceof \PHPStan\Reflection\MethodReflection) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        if ($function->isStatic()) {
            return [\sprintf('Using $this in static method %s::%s().', $scope->getClassReflection()->getDisplayName(), $function->getName())];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Variables;

use PhpParser\Node;
use PhpParser\Node\Expr\Clone_;
use PhpParser\Node\Expr\Variable;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Type\ErrorType;
use PHPStan\Type\Type;
use PHPStan\Type\VerbosityLevel;
class VariableCloningRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\RuleLevelHelper */
    private $ruleLevelHelper;
    public function __construct(\PHPStan\Rules\RuleLevelHelper $ruleLevelHelper)
    {
        $this->ruleLevelHelper = $ruleLevelHelper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\Clone_::class;
    }
    /**
     * @param \PhpParser\Node\Expr\Clone_ $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return (string|\PHPStan\Rules\RuleError)[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $typeResult = $this->ruleLevelHelper->findTypeToCheck($scope, $node->expr, 'Cloning object of an unknown class %s.', static function (\PHPStan\Type\Type $type) : bool {
            return $type->isCloneable()->yes();
        });
        $type = $typeResult->getType();
        if ($type instanceof \PHPStan\Type\ErrorType) {
            return $typeResult->getUnknownClassErrors();
        }
        if ($type->isCloneable()->yes()) {
            return [];
        }
        if ($node->expr instanceof \PhpParser\Node\Expr\Variable && \is_string($node->expr->name)) {
            return [\sprintf('Cannot clone non-object variable $%s of type %s.', $node->expr->name, $type->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))];
        }
        return [\sprintf('Cannot clone %s.', $type->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Variables;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Type\ErrorType;
use PHPStan\Type\ObjectType;
use PHPStan\Type\Type;
use PHPStan\Type\VerbosityLevel;
class ThrowTypeRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\RuleLevelHelper */
    private $ruleLevelHelper;
    public function __construct(\PHPStan\Rules\RuleLevelHelper $ruleLevelHelper)
    {
        $this->ruleLevelHelper = $ruleLevelHelper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\Throw_::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\Throw_ $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return (string|\PHPStan\Rules\RuleError)[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $throwableType = new \PHPStan\Type\ObjectType(\Throwable::class);
        $typeResult = $this->ruleLevelHelper->findTypeToCheck($scope, $node->expr, 'Throwing object of an unknown class %s.', static function (\PHPStan\Type\Type $type) use($throwableType) : bool {
            return $throwableType->isSuperTypeOf($type)->yes();
        });
        $foundType = $typeResult->getType();
        if ($foundType instanceof \PHPStan\Type\ErrorType) {
            return $typeResult->getUnknownClassErrors();
        }
        $isSuperType = $throwableType->isSuperTypeOf($foundType);
        if ($isSuperType->yes()) {
            return [];
        }
        return [\sprintf('Invalid type %s to throw.', $foundType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Variables;

use PhpParser\Node;
use PhpParser\Node\Expr\Variable;
use PHPStan\Analyser\Scope;
class DefinedVariableRule implements \PHPStan\Rules\Rule
{
    /** @var bool */
    private $cliArgumentsVariablesRegistered;
    /** @var bool */
    private $checkMaybeUndefinedVariables;
    public function __construct(bool $cliArgumentsVariablesRegistered, bool $checkMaybeUndefinedVariables)
    {
        $this->cliArgumentsVariablesRegistered = $cliArgumentsVariablesRegistered;
        $this->checkMaybeUndefinedVariables = $checkMaybeUndefinedVariables;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\Variable::class;
    }
    /**
     * @param \PhpParser\Node\Expr\Variable $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!\is_string($node->name)) {
            return [];
        }
        if ($this->cliArgumentsVariablesRegistered && \in_array($node->name, ['argc', 'argv'], \true)) {
            $isInMain = !$scope->isInClass() && !$scope->isInAnonymousFunction() && $scope->getFunction() === null;
            if ($isInMain) {
                return [];
            }
        }
        if ($scope->isInExpressionAssign($node)) {
            return [];
        }
        if ($scope->hasVariableType($node->name)->no()) {
            return [\sprintf('Undefined variable: $%s', $node->name)];
        } elseif ($this->checkMaybeUndefinedVariables && !$scope->hasVariableType($node->name)->yes()) {
            return [\sprintf('Variable $%s might not be defined.', $node->name)];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Variables;

use PhpParser\Node;
use PhpParser\Node\Expr\ClosureUse;
use PHPStan\Analyser\Scope;
class DefinedVariableInAnonymousFunctionUseRule implements \PHPStan\Rules\Rule
{
    /** @var bool */
    private $checkMaybeUndefinedVariables;
    public function __construct(bool $checkMaybeUndefinedVariables)
    {
        $this->checkMaybeUndefinedVariables = $checkMaybeUndefinedVariables;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\ClosureUse::class;
    }
    /**
     * @param \PhpParser\Node\Expr\ClosureUse $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if ($node->byRef || !\is_string($node->var->name)) {
            return [];
        }
        if ($scope->hasVariableType($node->var->name)->no()) {
            return [\sprintf('Undefined variable: $%s', $node->var->name)];
        } elseif ($this->checkMaybeUndefinedVariables && !$scope->hasVariableType($node->var->name)->yes()) {
            return [\sprintf('Variable $%s might not be defined.', $node->var->name)];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Arrays;

use PhpParser\Node\Expr\ArrayDimFetch;
use PhpParser\Node\Expr\Assign;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\Properties\PropertyReflectionFinder;
use PHPStan\Type\ArrayType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\UnionType;
use PHPStan\Type\VerbosityLevel;
class AppendedArrayKeyTypeRule implements \PHPStan\Rules\Rule
{
    /** @var PropertyReflectionFinder */
    private $propertyReflectionFinder;
    /** @var bool */
    private $checkUnionTypes;
    public function __construct(\PHPStan\Rules\Properties\PropertyReflectionFinder $propertyReflectionFinder, bool $checkUnionTypes)
    {
        $this->propertyReflectionFinder = $propertyReflectionFinder;
        $this->checkUnionTypes = $checkUnionTypes;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\Assign::class;
    }
    /**
     * @param \PhpParser\Node\Expr\Assign $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node->var instanceof \PhpParser\Node\Expr\ArrayDimFetch) {
            return [];
        }
        if (!$node->var->var instanceof \PhpParser\Node\Expr\PropertyFetch && !$node->var->var instanceof \PhpParser\Node\Expr\StaticPropertyFetch) {
            return [];
        }
        $propertyReflection = $this->propertyReflectionFinder->findPropertyReflectionFromNode($node->var->var, $scope);
        if ($propertyReflection === null) {
            return [];
        }
        $arrayType = $propertyReflection->getType();
        if (!$arrayType instanceof \PHPStan\Type\ArrayType) {
            return [];
        }
        if ($node->var->dim !== null) {
            $dimensionType = $scope->getType($node->var->dim);
            $isValidKey = \PHPStan\Rules\Arrays\AllowedArrayKeysTypes::getType()->isSuperTypeOf($dimensionType);
            if (!$isValidKey->yes()) {
                // already handled by InvalidKeyInArrayDimFetchRule
                return [];
            }
            $keyType = \PHPStan\Type\ArrayType::castToArrayKeyType($dimensionType);
            if (!$this->checkUnionTypes && $keyType instanceof \PHPStan\Type\UnionType) {
                return [];
            }
        } else {
            $keyType = new \PHPStan\Type\IntegerType();
        }
        if (!$arrayType->getIterableKeyType()->isSuperTypeOf($keyType)->yes()) {
            return [\sprintf('Array (%s) does not accept key %s.', $arrayType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $keyType->describe(\PHPStan\Type\VerbosityLevel::value()))];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Arrays;

use PHPStan\Analyser\Scope;
use PHPStan\Type\MixedType;
use PHPStan\Type\VerbosityLevel;
class InvalidKeyInArrayItemRule implements \PHPStan\Rules\Rule
{
    /** @var bool */
    private $reportMaybes;
    public function __construct(bool $reportMaybes)
    {
        $this->reportMaybes = $reportMaybes;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\ArrayItem::class;
    }
    /**
     * @param \PhpParser\Node\Expr\ArrayItem $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if ($node->key === null) {
            return [];
        }
        $dimensionType = $scope->getType($node->key);
        $isSuperType = \PHPStan\Rules\Arrays\AllowedArrayKeysTypes::getType()->isSuperTypeOf($dimensionType);
        if ($isSuperType->no()) {
            return [\sprintf('Invalid array key type %s.', $dimensionType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))];
        } elseif ($this->reportMaybes && $isSuperType->maybe() && !$dimensionType instanceof \PHPStan\Type\MixedType) {
            return [\sprintf('Possibly invalid array key type %s.', $dimensionType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Arrays;

use PHPStan\Analyser\Scope;
use PHPStan\Type\MixedType;
use PHPStan\Type\TypeUtils;
use PHPStan\Type\VerbosityLevel;
class InvalidKeyInArrayDimFetchRule implements \PHPStan\Rules\Rule
{
    /** @var bool */
    private $reportMaybes;
    public function __construct(bool $reportMaybes)
    {
        $this->reportMaybes = $reportMaybes;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\ArrayDimFetch::class;
    }
    /**
     * @param \PhpParser\Node\Expr\ArrayDimFetch $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if ($node->dim === null) {
            return [];
        }
        $varType = $scope->getType($node->var);
        if (\count(\PHPStan\Type\TypeUtils::getArrays($varType)) === 0) {
            return [];
        }
        $dimensionType = $scope->getType($node->dim);
        $isSuperType = \PHPStan\Rules\Arrays\AllowedArrayKeysTypes::getType()->isSuperTypeOf($dimensionType);
        if ($isSuperType->no()) {
            return [\sprintf('Invalid array key type %s.', $dimensionType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))];
        } elseif ($this->reportMaybes && $isSuperType->maybe() && !$dimensionType instanceof \PHPStan\Type\MixedType) {
            return [\sprintf('Possibly invalid array key type %s.', $dimensionType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Arrays;

use PHPStan\Analyser\Scope;
class OffsetAccessWithoutDimForReadingRule implements \PHPStan\Rules\Rule
{
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\ArrayDimFetch::class;
    }
    /**
     * @param \PhpParser\Node\Expr\ArrayDimFetch $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if ($scope->isInExpressionAssign($node)) {
            return [];
        }
        if ($node->dim !== null) {
            return [];
        }
        return ['Cannot use [] for reading.'];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Arrays;

use PhpParser\Node\Expr\ArrayDimFetch;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Type\ErrorType;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
use PHPStan\Type\VerbosityLevel;
class OffsetAccessAssignOpRule implements \PHPStan\Rules\Rule
{
    /** @var RuleLevelHelper */
    private $ruleLevelHelper;
    public function __construct(\PHPStan\Rules\RuleLevelHelper $ruleLevelHelper)
    {
        $this->ruleLevelHelper = $ruleLevelHelper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\AssignOp::class;
    }
    /**
     * @param \PhpParser\Node\Expr\AssignOp $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node->var instanceof \PhpParser\Node\Expr\ArrayDimFetch) {
            return [];
        }
        $arrayDimFetch = $node->var;
        $potentialDimType = null;
        if ($arrayDimFetch->dim !== null) {
            $potentialDimType = $scope->getType($arrayDimFetch->dim);
        }
        $varTypeResult = $this->ruleLevelHelper->findTypeToCheck($scope, $arrayDimFetch->var, '', static function (\PHPStan\Type\Type $varType) use($potentialDimType) : bool {
            $arrayDimType = $varType->setOffsetValueType($potentialDimType, new \PHPStan\Type\MixedType());
            return !$arrayDimType instanceof \PHPStan\Type\ErrorType;
        });
        $varType = $varTypeResult->getType();
        if ($arrayDimFetch->dim !== null) {
            $dimTypeResult = $this->ruleLevelHelper->findTypeToCheck($scope, $arrayDimFetch->dim, '', static function (\PHPStan\Type\Type $dimType) use($varType) : bool {
                $arrayDimType = $varType->setOffsetValueType($dimType, new \PHPStan\Type\MixedType());
                return !$arrayDimType instanceof \PHPStan\Type\ErrorType;
            });
            $dimType = $dimTypeResult->getType();
            if ($varType->hasOffsetValueType($dimType)->no()) {
                return [];
            }
        } else {
            $dimType = $potentialDimType;
        }
        $resultType = $varType->setOffsetValueType($dimType, new \PHPStan\Type\MixedType());
        if (!$resultType instanceof \PHPStan\Type\ErrorType) {
            return [];
        }
        if ($dimType === null) {
            return [\sprintf('Cannot assign new offset to %s.', $varType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))];
        }
        return [\sprintf('Cannot assign offset %s to %s.', $dimType->describe(\PHPStan\Type\VerbosityLevel::value()), $varType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Arrays;

use PHPStan\Analyser\Scope;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Type\ErrorType;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
use PHPStan\Type\VerbosityLevel;
class OffsetAccessAssignmentRule implements \PHPStan\Rules\Rule
{
    /** @var RuleLevelHelper */
    private $ruleLevelHelper;
    public function __construct(\PHPStan\Rules\RuleLevelHelper $ruleLevelHelper)
    {
        $this->ruleLevelHelper = $ruleLevelHelper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\ArrayDimFetch::class;
    }
    /**
     * @param \PhpParser\Node\Expr\ArrayDimFetch $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$scope->isInExpressionAssign($node)) {
            return [];
        }
        $potentialDimType = null;
        if ($node->dim !== null) {
            $potentialDimType = $scope->getType($node->dim);
        }
        $varTypeResult = $this->ruleLevelHelper->findTypeToCheck($scope, $node->var, '', static function (\PHPStan\Type\Type $varType) use($potentialDimType) : bool {
            $arrayDimType = $varType->setOffsetValueType($potentialDimType, new \PHPStan\Type\MixedType());
            return !$arrayDimType instanceof \PHPStan\Type\ErrorType;
        });
        $varType = $varTypeResult->getType();
        if ($node->dim !== null) {
            $dimTypeResult = $this->ruleLevelHelper->findTypeToCheck($scope, $node->dim, '', static function (\PHPStan\Type\Type $dimType) use($varType) : bool {
                $arrayDimType = $varType->setOffsetValueType($dimType, new \PHPStan\Type\MixedType());
                return !$arrayDimType instanceof \PHPStan\Type\ErrorType;
            });
            $dimType = $dimTypeResult->getType();
        } else {
            $dimType = $potentialDimType;
        }
        $resultType = $varType->setOffsetValueType($dimType, new \PHPStan\Type\MixedType());
        if (!$resultType instanceof \PHPStan\Type\ErrorType) {
            return [];
        }
        if ($dimType === null) {
            return [\sprintf('Cannot assign new offset to %s.', $varType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))];
        }
        return [\sprintf('Cannot assign offset %s to %s.', $dimType->describe(\PHPStan\Type\VerbosityLevel::value()), $varType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Arrays;

use PhpParser\Node\Expr\ArrayDimFetch;
use PhpParser\Node\Expr\Assign;
use PhpParser\Node\Expr\AssignOp;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\Properties\PropertyReflectionFinder;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Type\ArrayType;
use PHPStan\Type\VerbosityLevel;
class AppendedArrayItemTypeRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\Properties\PropertyReflectionFinder */
    private $propertyReflectionFinder;
    /** @var \PHPStan\Rules\RuleLevelHelper */
    private $ruleLevelHelper;
    public function __construct(\PHPStan\Rules\Properties\PropertyReflectionFinder $propertyReflectionFinder, \PHPStan\Rules\RuleLevelHelper $ruleLevelHelper)
    {
        $this->propertyReflectionFinder = $propertyReflectionFinder;
        $this->ruleLevelHelper = $ruleLevelHelper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr::class;
    }
    /**
     * @param \PhpParser\Node\Expr $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node instanceof \PhpParser\Node\Expr\Assign && !$node instanceof \PhpParser\Node\Expr\AssignOp) {
            return [];
        }
        if (!$node->var instanceof \PhpParser\Node\Expr\ArrayDimFetch) {
            return [];
        }
        if (!$node->var->var instanceof \PhpParser\Node\Expr\PropertyFetch && !$node->var->var instanceof \PhpParser\Node\Expr\StaticPropertyFetch) {
            return [];
        }
        $propertyReflection = $this->propertyReflectionFinder->findPropertyReflectionFromNode($node->var->var, $scope);
        if ($propertyReflection === null) {
            return [];
        }
        $assignedToType = $propertyReflection->getType();
        if (!$assignedToType instanceof \PHPStan\Type\ArrayType) {
            return [];
        }
        if ($node instanceof \PhpParser\Node\Expr\Assign) {
            $assignedValueType = $scope->getType($node->expr);
        } else {
            $assignedValueType = $scope->getType($node);
        }
        $itemType = $assignedToType->getItemType();
        if (!$this->ruleLevelHelper->accepts($itemType, $assignedValueType, $scope->isDeclareStrictTypes())) {
            $verbosityLevel = $itemType->isCallable()->and($assignedValueType->isCallable())->yes() ? \PHPStan\Type\VerbosityLevel::value() : \PHPStan\Type\VerbosityLevel::typeOnly();
            return [\sprintf('Array (%s) does not accept %s.', $assignedToType->describe($verbosityLevel), $assignedValueType->describe($verbosityLevel))];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Arrays;

use PHPStan\Analyser\Scope;
use PHPStan\Node\LiteralArrayNode;
use PHPStan\Rules\RuleError;
use PHPStan\Rules\RuleErrorBuilder;
use PHPStan\Type\ConstantScalarType;
class DuplicateKeysInLiteralArraysRule implements \PHPStan\Rules\Rule
{
    /** @var \PhpParser\PrettyPrinter\Standard */
    private $printer;
    public function __construct(\PhpParser\PrettyPrinter\Standard $printer)
    {
        $this->printer = $printer;
    }
    public function getNodeType() : string
    {
        return \PHPStan\Node\LiteralArrayNode::class;
    }
    /**
     * @param LiteralArrayNode $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $values = [];
        $duplicateKeys = [];
        $printedValues = [];
        $valueLines = [];
        foreach ($node->getItemNodes() as $itemNode) {
            $item = $itemNode->getArrayItem();
            if ($item->key === null) {
                continue;
            }
            $key = $item->key;
            $keyType = $itemNode->getScope()->getType($key);
            if (!$keyType instanceof \PHPStan\Type\ConstantScalarType) {
                continue;
            }
            $printedValue = $this->printer->prettyPrintExpr($key);
            $value = $keyType->getValue();
            $printedValues[$value][] = $printedValue;
            if (!isset($valueLines[$value])) {
                $valueLines[$value] = $item->getLine();
            }
            $previousCount = \count($values);
            $values[$value] = $printedValue;
            if ($previousCount !== \count($values)) {
                continue;
            }
            $duplicateKeys[$value] = \true;
        }
        $messages = [];
        foreach (\array_keys($duplicateKeys) as $value) {
            $messages[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Array has %d %s with value %s (%s).', \count($printedValues[$value]), \count($printedValues[$value]) === 1 ? 'duplicate key' : 'duplicate keys', \var_export($value, \true), \implode(', ', $printedValues[$value])))->line($valueLines[$value])->build();
        }
        return $messages;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Arrays;

use PHPStan\Type\BooleanType;
use PHPStan\Type\FloatType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\NullType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
use PHPStan\Type\UnionType;
class AllowedArrayKeysTypes
{
    public static function getType() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\UnionType([new \PHPStan\Type\IntegerType(), new \PHPStan\Type\StringType(), new \PHPStan\Type\FloatType(), new \PHPStan\Type\BooleanType(), new \PHPStan\Type\NullType()]);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Arrays;

use PHPStan\Analyser\Scope;
use PHPStan\Rules\RuleError;
use PHPStan\Rules\RuleErrorBuilder;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Type\ErrorType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeUtils;
use PHPStan\Type\UnionType;
use PHPStan\Type\VerbosityLevel;
class NonexistentOffsetInArrayDimFetchRule implements \PHPStan\Rules\Rule
{
    /** @var RuleLevelHelper */
    private $ruleLevelHelper;
    /** @var bool */
    private $reportMaybes;
    public function __construct(\PHPStan\Rules\RuleLevelHelper $ruleLevelHelper, bool $reportMaybes)
    {
        $this->ruleLevelHelper = $ruleLevelHelper;
        $this->reportMaybes = $reportMaybes;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\ArrayDimFetch::class;
    }
    /**
     * @param \PhpParser\Node\Expr\ArrayDimFetch $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if ($node->dim !== null) {
            $dimType = $scope->getType($node->dim);
            $unknownClassPattern = \sprintf('Access to offset %s on an unknown class %%s.', $dimType->describe(\PHPStan\Type\VerbosityLevel::value()));
        } else {
            $dimType = null;
            $unknownClassPattern = 'Access to an offset on an unknown class %s.';
        }
        $typeResult = $this->ruleLevelHelper->findTypeToCheck($scope, $node->var, $unknownClassPattern, static function (\PHPStan\Type\Type $type) use($dimType) : bool {
            if ($dimType === null) {
                return $type->isOffsetAccessible()->yes();
            }
            return $type->isOffsetAccessible()->yes() && $type->hasOffsetValueType($dimType)->yes();
        });
        $type = $typeResult->getType();
        if ($type instanceof \PHPStan\Type\ErrorType) {
            return $typeResult->getUnknownClassErrors();
        }
        $isOffsetAccessible = $type->isOffsetAccessible();
        if ($scope->isInExpressionAssign($node) && !$isOffsetAccessible->no()) {
            return [];
        }
        if (!$isOffsetAccessible->yes()) {
            if ($dimType !== null) {
                return [\PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Cannot access offset %s on %s.', $dimType->describe(\PHPStan\Type\VerbosityLevel::value()), $type->describe(\PHPStan\Type\VerbosityLevel::value())))->build()];
            }
            return [\PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Cannot access an offset on %s.', $type->describe(\PHPStan\Type\VerbosityLevel::typeOnly())))->build()];
        }
        if ($dimType === null) {
            return [];
        }
        $hasOffsetValueType = $type->hasOffsetValueType($dimType);
        $report = $hasOffsetValueType->no();
        if ($hasOffsetValueType->maybe()) {
            $constantArrays = \PHPStan\Type\TypeUtils::getConstantArrays($type);
            if (\count($constantArrays) > 0) {
                foreach ($constantArrays as $constantArray) {
                    if ($constantArray->hasOffsetValueType($dimType)->no()) {
                        $report = \true;
                        break;
                    }
                }
            }
        }
        if (!$report && $this->reportMaybes) {
            foreach (\PHPStan\Type\TypeUtils::flattenTypes($type) as $innerType) {
                if ($dimType instanceof \PHPStan\Type\UnionType) {
                    if ($innerType->hasOffsetValueType($dimType)->no()) {
                        $report = \true;
                        break;
                    }
                    continue;
                }
                foreach (\PHPStan\Type\TypeUtils::flattenTypes($dimType) as $innerDimType) {
                    if ($innerType->hasOffsetValueType($innerDimType)->no()) {
                        $report = \true;
                        break;
                    }
                }
            }
        }
        if ($report) {
            return [\PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Offset %s does not exist on %s.', $dimType->describe(\PHPStan\Type\VerbosityLevel::value()), $type->describe(\PHPStan\Type\VerbosityLevel::value())))->build()];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Arrays;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\Rule;
class DeadForeachRule implements \PHPStan\Rules\Rule
{
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\Foreach_::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\Foreach_ $node
     * @param Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $iterableType = $scope->getType($node->expr);
        if ($iterableType->isIterable()->no()) {
            return [];
        }
        if (!$iterableType->isIterableAtLeastOnce()->no()) {
            return [];
        }
        return ['Empty array passed to foreach.'];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Arrays;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\RuleError;
use PHPStan\Rules\RuleErrorBuilder;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Type\ErrorType;
use PHPStan\Type\Type;
use PHPStan\Type\VerbosityLevel;
class IterableInForeachRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\RuleLevelHelper */
    private $ruleLevelHelper;
    public function __construct(\PHPStan\Rules\RuleLevelHelper $ruleLevelHelper)
    {
        $this->ruleLevelHelper = $ruleLevelHelper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\Foreach_::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\Foreach_ $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $typeResult = $this->ruleLevelHelper->findTypeToCheck($scope, $node->expr, 'Iterating over an object of an unknown class %s.', static function (\PHPStan\Type\Type $type) : bool {
            return $type->isIterable()->yes();
        });
        $type = $typeResult->getType();
        if ($type instanceof \PHPStan\Type\ErrorType) {
            return $typeResult->getUnknownClassErrors();
        }
        if ($type->isIterable()->yes()) {
            return [];
        }
        return [\PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Argument of an invalid type %s supplied for foreach, only iterables are supported.', $type->describe(\PHPStan\Type\VerbosityLevel::typeOnly())))->line($node->expr->getLine())->build()];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Functions;

use PhpParser\Node;
use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Broker\Broker;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Rules\FunctionCallParametersCheck;
class CallToFunctionParametersRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PHPStan\Rules\FunctionCallParametersCheck */
    private $check;
    public function __construct(\PHPStan\Broker\Broker $broker, \PHPStan\Rules\FunctionCallParametersCheck $check)
    {
        $this->broker = $broker;
        $this->check = $check;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\FuncCall::class;
    }
    /**
     * @param \PhpParser\Node\Expr\FuncCall $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node->name instanceof \PhpParser\Node\Name) {
            return [];
        }
        if (!$this->broker->hasFunction($node->name, $scope)) {
            return [];
        }
        $function = $this->broker->getFunction($node->name, $scope);
        return $this->check->check(\PHPStan\Reflection\ParametersAcceptorSelector::selectFromArgs($scope, $node->args, $function->getVariants()), $scope, $node, ['Function ' . $function->getName() . ' invoked with %d parameter, %d required.', 'Function ' . $function->getName() . ' invoked with %d parameters, %d required.', 'Function ' . $function->getName() . ' invoked with %d parameter, at least %d required.', 'Function ' . $function->getName() . ' invoked with %d parameters, at least %d required.', 'Function ' . $function->getName() . ' invoked with %d parameter, %d-%d required.', 'Function ' . $function->getName() . ' invoked with %d parameters, %d-%d required.', 'Parameter #%d %s of function ' . $function->getName() . ' expects %s, %s given.', 'Result of function ' . $function->getName() . ' (void) is used.', 'Parameter #%d %s of function ' . $function->getName() . ' is passed by reference, so it expects variables only.']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Functions;

use PhpParser\Node;
use PhpParser\Node\Stmt\Function_;
use PHPStan\Analyser\Scope;
class InnerFunctionRule implements \PHPStan\Rules\Rule
{
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\Function_::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\Function_ $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if ($scope->getFunction() === null) {
            return [];
        }
        return ['Inner named functions are not supported by PHPStan. Consider refactoring to an anonymous function, class method, or a top-level-defined function. See issue #165 (https://github.com/phpstan/phpstan/issues/165) for more details.'];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Functions;

use PhpParser\Node;
use PhpParser\Node\Stmt\Function_;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\FunctionDefinitionCheck;
use PHPStan\Rules\RuleError;
class ExistingClassesInTypehintsRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\FunctionDefinitionCheck */
    private $check;
    public function __construct(\PHPStan\Rules\FunctionDefinitionCheck $check)
    {
        $this->check = $check;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\Function_::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\Function_ $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        return $this->check->checkFunction($node, \sprintf('Parameter $%%s of function %s() has invalid typehint type %%s.', (string) $node->namespacedName), \sprintf('Return typehint of function %s() has invalid type %%s.', (string) $node->namespacedName));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Functions;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\UnusedFunctionParametersCheck;
class UnusedClosureUsesRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\UnusedFunctionParametersCheck */
    private $check;
    public function __construct(\PHPStan\Rules\UnusedFunctionParametersCheck $check)
    {
        $this->check = $check;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\Closure::class;
    }
    /**
     * @param \PhpParser\Node\Expr\Closure $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (\count($node->uses) === 0) {
            return [];
        }
        return $this->check->getUnusedParameters($scope, \array_map(static function (\PhpParser\Node\Expr\ClosureUse $use) : string {
            if (!\is_string($use->var->name)) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            return $use->var->name;
        }, $node->uses), $node->stmts, 'Anonymous function has an unused use $%s.');
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Functions;

use PhpParser\Node;
use PhpParser\Node\Stmt\Return_;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Reflection\Php\PhpFunctionFromParserNodeReflection;
use PHPStan\Reflection\Php\PhpMethodFromParserNodeReflection;
use PHPStan\Rules\FunctionReturnTypeCheck;
class ReturnTypeRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\FunctionReturnTypeCheck */
    private $returnTypeCheck;
    public function __construct(\PHPStan\Rules\FunctionReturnTypeCheck $returnTypeCheck)
    {
        $this->returnTypeCheck = $returnTypeCheck;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\Return_::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\Return_ $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if ($scope->getFunction() === null) {
            return [];
        }
        if ($scope->isInAnonymousFunction()) {
            return [];
        }
        $function = $scope->getFunction();
        if (!$function instanceof \PHPStan\Reflection\Php\PhpFunctionFromParserNodeReflection || $function instanceof \PHPStan\Reflection\Php\PhpMethodFromParserNodeReflection) {
            return [];
        }
        $reflection = null;
        if (\function_exists($function->getName())) {
            $reflection = new \ReflectionFunction($function->getName());
        }
        return $this->returnTypeCheck->checkReturnType($scope, \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($function->getVariants())->getReturnType(), $node->expr, \sprintf('Function %s() should return %%s but empty return statement found.', $function->getName()), \sprintf('Function %s() with return type void returns %%s but should not return anything.', $function->getName()), \sprintf('Function %s() should return %%s but returns %%s.', $function->getName()), $reflection !== null && $reflection->isGenerator());
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Functions;

use PHPStan\Analyser\Scope;
use PHPStan\Reflection\InaccessibleMethod;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Rules\FunctionCallParametersCheck;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Type\ClosureType;
use PHPStan\Type\ErrorType;
use PHPStan\Type\Type;
use PHPStan\Type\VerbosityLevel;
class CallCallablesRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\FunctionCallParametersCheck */
    private $check;
    /** @var \PHPStan\Rules\RuleLevelHelper */
    private $ruleLevelHelper;
    /** @var bool */
    private $reportMaybes;
    public function __construct(\PHPStan\Rules\FunctionCallParametersCheck $check, \PHPStan\Rules\RuleLevelHelper $ruleLevelHelper, bool $reportMaybes)
    {
        $this->check = $check;
        $this->ruleLevelHelper = $ruleLevelHelper;
        $this->reportMaybes = $reportMaybes;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\FuncCall::class;
    }
    /**
     * @param \PhpParser\Node\Expr\FuncCall $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return (string|\PHPStan\Rules\RuleError)[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node->name instanceof \PhpParser\Node\Expr) {
            return [];
        }
        $typeResult = $this->ruleLevelHelper->findTypeToCheck($scope, $node->name, 'Invoking callable on an unknown class %s.', static function (\PHPStan\Type\Type $type) : bool {
            return $type->isCallable()->yes();
        });
        $type = $typeResult->getType();
        if ($type instanceof \PHPStan\Type\ErrorType) {
            return $typeResult->getUnknownClassErrors();
        }
        $isCallable = $type->isCallable();
        if ($isCallable->no()) {
            return [\sprintf('Trying to invoke %s but it\'s not a callable.', $type->describe(\PHPStan\Type\VerbosityLevel::value()))];
        }
        if ($this->reportMaybes && $isCallable->maybe()) {
            return [\sprintf('Trying to invoke %s but it might not be a callable.', $type->describe(\PHPStan\Type\VerbosityLevel::value()))];
        }
        $parametersAcceptors = $type->getCallableParametersAcceptors($scope);
        $messages = [];
        if (\count($parametersAcceptors) === 1 && $parametersAcceptors[0] instanceof \PHPStan\Reflection\InaccessibleMethod) {
            $method = $parametersAcceptors[0]->getMethod();
            $messages[] = \sprintf('Call to %s method %s() of class %s.', $method->isPrivate() ? 'private' : 'protected', $method->getName(), $method->getDeclaringClass()->getDisplayName());
        }
        $parametersAcceptor = \PHPStan\Reflection\ParametersAcceptorSelector::selectFromArgs($scope, $node->args, $parametersAcceptors);
        if ($type instanceof \PHPStan\Type\ClosureType) {
            $callableDescription = 'closure';
        } else {
            $callableDescription = \sprintf('callable %s', $type->describe(\PHPStan\Type\VerbosityLevel::value()));
        }
        return \array_merge($messages, $this->check->check($parametersAcceptor, $scope, $node, [\ucfirst($callableDescription) . ' invoked with %d parameter, %d required.', \ucfirst($callableDescription) . ' invoked with %d parameters, %d required.', \ucfirst($callableDescription) . ' invoked with %d parameter, at least %d required.', \ucfirst($callableDescription) . ' invoked with %d parameters, at least %d required.', \ucfirst($callableDescription) . ' invoked with %d parameter, %d-%d required.', \ucfirst($callableDescription) . ' invoked with %d parameters, %d-%d required.', 'Parameter #%d %s of ' . $callableDescription . ' expects %s, %s given.', 'Result of ' . $callableDescription . ' (void) is used.', 'Parameter #%d %s of ' . $callableDescription . ' is passed by reference, so it expects variables only.']));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Functions;

use PhpParser\Node;
use PhpParser\Node\Name;
use PhpParser\Node\Stmt\Function_;
use PHPStan\Analyser\Scope;
use PHPStan\Broker\Broker;
class NonExistentDefinedFunctionRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    public function __construct(\PHPStan\Broker\Broker $broker)
    {
        $this->broker = $broker;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\Function_::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\Function_ $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $functionName = $node->name->name;
        if (isset($node->namespacedName)) {
            $functionName = (string) $node->namespacedName;
        }
        $functionNameName = new \PhpParser\Node\Name($functionName);
        if ($this->broker->hasFunction($functionNameName, null)) {
            return [];
        }
        return [\sprintf('Function %s not found while trying to analyse it - autoloading is probably not configured properly.', $functionName)];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Functions;

use PhpParser\Node;
use PhpParser\Node\Stmt\Return_;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\FunctionReturnTypeCheck;
use PHPStan\Type\ObjectType;
class ClosureReturnTypeRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\FunctionReturnTypeCheck */
    private $returnTypeCheck;
    public function __construct(\PHPStan\Rules\FunctionReturnTypeCheck $returnTypeCheck)
    {
        $this->returnTypeCheck = $returnTypeCheck;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\Return_::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\Return_ $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$scope->isInAnonymousFunction()) {
            return [];
        }
        /** @var \PHPStan\Type\Type $returnType */
        $returnType = $scope->getAnonymousFunctionReturnType();
        $generatorType = new \PHPStan\Type\ObjectType(\Generator::class);
        return $this->returnTypeCheck->checkReturnType($scope, $returnType, $node->expr, 'Anonymous function should return %s but empty return statement found.', 'Anonymous function with return type void returns %s but should not return anything.', 'Anonymous function should return %s but returns %s.', $generatorType->isSuperTypeOf($returnType)->yes());
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Functions;

use PhpParser\Node;
use PhpParser\Node\Expr\Closure;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\FunctionDefinitionCheck;
use PHPStan\Rules\RuleError;
class ExistingClassesInClosureTypehintsRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\FunctionDefinitionCheck */
    private $check;
    public function __construct(\PHPStan\Rules\FunctionDefinitionCheck $check)
    {
        $this->check = $check;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\Closure::class;
    }
    /**
     * @param \PhpParser\Node\Expr\Closure $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        return $this->check->checkFunction($node, 'Parameter $%s of anonymous function has invalid typehint type %s.', 'Return typehint of anonymous function has invalid type %s.');
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Functions;

use PhpParser\Node;
use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Type\Constant\ConstantStringType;
class PrintfParametersRule implements \PHPStan\Rules\Rule
{
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\FuncCall::class;
    }
    /**
     * @param \PhpParser\Node\Expr\FuncCall $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node->name instanceof \PhpParser\Node\Name) {
            return [];
        }
        $functionsArgumentPositions = ['printf' => 0, 'sprintf' => 0, 'sscanf' => 1, 'fscanf' => 1];
        $minimumNumberOfArguments = ['printf' => 1, 'sprintf' => 1, 'sscanf' => 3, 'fscanf' => 3];
        $name = \strtolower((string) $node->name);
        if (!isset($functionsArgumentPositions[$name])) {
            return [];
        }
        $formatArgumentPosition = $functionsArgumentPositions[$name];
        $args = $node->args;
        $argsCount = \count($args);
        if ($argsCount < $minimumNumberOfArguments[$name]) {
            return [];
            // caught by CallToFunctionParametersRule
        }
        $formatArgType = $scope->getType($args[$formatArgumentPosition]->value);
        if (!$formatArgType instanceof \PHPStan\Type\Constant\ConstantStringType) {
            return [];
            // inspect only literal string format
        }
        foreach ($node->args as $arg) {
            if ($arg->unpack) {
                return [];
            }
        }
        $format = $formatArgType->getValue();
        $placeHoldersCount = $this->getPlaceholdersCount($name, $format);
        $argsCount -= $formatArgumentPosition;
        if ($argsCount !== $placeHoldersCount + 1) {
            return [\sprintf(\sprintf('%s, %s.', $placeHoldersCount === 1 ? 'Call to %s contains %d placeholder' : 'Call to %s contains %d placeholders', $argsCount - 1 === 1 ? '%d value given' : '%d values given'), $name, $placeHoldersCount, $argsCount - 1)];
        }
        return [];
    }
    private function getPlaceholdersCount(string $functionName, string $format) : int
    {
        $specifiers = \in_array($functionName, ['sprintf', 'printf'], \true) ? '[bcdeEfFgGosuxX]' : '(?:[cdDeEfinosuxX]|\\[[^\\]]+\\])';
        $pattern = '~(?<before>%*)%(?:(?<position>\\d+)\\$)?[-+]?(?:[ 0]|(?:\'[^%]))?-?\\d*(?:\\.\\d*)?' . $specifiers . '~';
        $matches = \_HumbugBoxb94336daae36\Nette\Utils\Strings::matchAll($format, $pattern, \PREG_SET_ORDER);
        if (\count($matches) === 0) {
            return 0;
        }
        $placeholders = \array_filter($matches, static function (array $match) : bool {
            return \strlen($match['before']) % 2 === 0;
        });
        if (\count($placeholders) === 0) {
            return 0;
        }
        $maxPositionedNumber = 0;
        $maxOrdinaryNumber = 0;
        foreach ($placeholders as $placeholder) {
            if (isset($placeholder['position']) && $placeholder['position'] !== '') {
                $maxPositionedNumber = \max((int) $placeholder['position'], $maxPositionedNumber);
            } else {
                $maxOrdinaryNumber++;
            }
        }
        return \max($maxPositionedNumber, $maxOrdinaryNumber);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Functions;

use PhpParser\Node;
use PhpParser\Node\Expr\FuncCall;
use PHPStan\Analyser\Scope;
use PHPStan\Broker\Broker;
class CallToNonExistentFunctionRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var bool */
    private $checkFunctionNameCase;
    public function __construct(\PHPStan\Broker\Broker $broker, bool $checkFunctionNameCase)
    {
        $this->broker = $broker;
        $this->checkFunctionNameCase = $checkFunctionNameCase;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\FuncCall::class;
    }
    /**
     * @param \PhpParser\Node\Expr\FuncCall $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node->name instanceof \PhpParser\Node\Name) {
            return [];
        }
        if (!$this->broker->hasFunction($node->name, $scope)) {
            return [\sprintf('Function %s not found.', (string) $node->name)];
        }
        $function = $this->broker->getFunction($node->name, $scope);
        $name = (string) $node->name;
        if ($this->checkFunctionNameCase) {
            /** @var string $calledFunctionName */
            $calledFunctionName = $this->broker->resolveFunctionName($node->name, $scope);
            if (\strtolower($function->getName()) === \strtolower($calledFunctionName) && $function->getName() !== $calledFunctionName) {
                return [\sprintf('Call to function %s() with incorrect case: %s', $function->getName(), $name)];
            }
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Functions;

use PhpParser\Node;
use PhpParser\Node\FunctionLike;
use PhpParser\Node\Stmt\Function_;
use PHPStan\Analyser\Scope;
use PHPStan\Broker\Broker;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Rules\Rule;
use PHPStan\Rules\RuleError;
use PHPStan\Rules\RuleErrorBuilder;
use PHPStan\Type\VerbosityLevel;
class IncompatibleDefaultParameterTypeRule implements \PHPStan\Rules\Rule
{
    /** @var Broker */
    private $broker;
    public function __construct(\PHPStan\Broker\Broker $broker)
    {
        $this->broker = $broker;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\FunctionLike::class;
    }
    /**
     * @param FunctionLike $node
     * @param Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node instanceof \PhpParser\Node\Stmt\Function_) {
            return [];
        }
        $name = $node->namespacedName;
        if (!$this->broker->hasFunction($name, $scope)) {
            return [];
        }
        $function = $this->broker->getFunction($name, $scope);
        $parameters = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($function->getVariants());
        $errors = [];
        foreach ($node->getParams() as $paramI => $param) {
            if ($param->default === null) {
                continue;
            }
            if ($param->var instanceof \PhpParser\Node\Expr\Error || !\is_string($param->var->name)) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            $defaultValueType = $scope->getType($param->default);
            $parameterType = $parameters->getParameters()[$paramI]->getType();
            if ($parameterType->isSuperTypeOf($defaultValueType)->yes()) {
                continue;
            }
            $errors[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Default value of the parameter #%d $%s (%s) of function %s() is incompatible with type %s.', $paramI + 1, $param->var->name, $defaultValueType->describe(\PHPStan\Type\VerbosityLevel::value()), $function->getName(), $parameterType->describe(\PHPStan\Type\VerbosityLevel::value())))->line($param->getLine())->build();
        }
        return $errors;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules;

use PHPStan\Type\Type;
class FoundTypeResult
{
    /** @var \PHPStan\Type\Type */
    private $type;
    /** @var string[] */
    private $referencedClasses;
    /** @var RuleError[] */
    private $unknownClassErrors;
    /**
     * @param \PHPStan\Type\Type $type
     * @param string[] $referencedClasses
     * @param RuleError[] $unknownClassErrors
     */
    public function __construct(\PHPStan\Type\Type $type, array $referencedClasses, array $unknownClassErrors)
    {
        $this->type = $type;
        $this->referencedClasses = $referencedClasses;
        $this->unknownClassErrors = $unknownClassErrors;
    }
    public function getType() : \PHPStan\Type\Type
    {
        return $this->type;
    }
    /**
     * @return string[]
     */
    public function getReferencedClasses() : array
    {
        return $this->referencedClasses;
    }
    /**
     * @return RuleError[]
     */
    public function getUnknownClassErrors() : array
    {
        return $this->unknownClassErrors;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Comparison;

use PhpParser\Node;
use PhpParser\Node\Expr;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Type\ObjectType;
class ImpossibleCheckTypeStaticMethodCallRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\Comparison\ImpossibleCheckTypeHelper */
    private $impossibleCheckTypeHelper;
    /** @var bool */
    private $checkAlwaysTrueCheckTypeFunctionCall;
    public function __construct(\PHPStan\Rules\Comparison\ImpossibleCheckTypeHelper $impossibleCheckTypeHelper, bool $checkAlwaysTrueCheckTypeFunctionCall)
    {
        $this->impossibleCheckTypeHelper = $impossibleCheckTypeHelper;
        $this->checkAlwaysTrueCheckTypeFunctionCall = $checkAlwaysTrueCheckTypeFunctionCall;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\StaticCall::class;
    }
    /**
     * @param \PhpParser\Node\Expr\StaticCall $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[] errors
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node->name instanceof \PhpParser\Node\Identifier) {
            return [];
        }
        $isAlways = $this->impossibleCheckTypeHelper->findSpecifiedType($scope, $node);
        if ($isAlways === null) {
            return [];
        }
        if (!$isAlways) {
            $method = $this->getMethod($node->class, $node->name->name, $scope);
            return [\sprintf('Call to static method %s::%s()%s will always evaluate to false.', $method->getDeclaringClass()->getDisplayName(), $method->getName(), $this->impossibleCheckTypeHelper->getArgumentsDescription($scope, $node->args))];
        } elseif ($this->checkAlwaysTrueCheckTypeFunctionCall) {
            $method = $this->getMethod($node->class, $node->name->name, $scope);
            return [\sprintf('Call to static method %s::%s()%s will always evaluate to true.', $method->getDeclaringClass()->getDisplayName(), $method->getName(), $this->impossibleCheckTypeHelper->getArgumentsDescription($scope, $node->args))];
        }
        return [];
    }
    /**
     * @param Node\Name|Expr $class
     * @param string $methodName
     * @param Scope $scope
     * @return MethodReflection
     * @throws \PHPStan\ShouldNotHappenException
     */
    private function getMethod($class, string $methodName, \PHPStan\Analyser\Scope $scope) : \PHPStan\Reflection\MethodReflection
    {
        if ($class instanceof \PhpParser\Node\Name) {
            $calledOnType = new \PHPStan\Type\ObjectType($scope->resolveName($class));
        } else {
            $calledOnType = $scope->getType($class);
        }
        if (!$calledOnType->hasMethod($methodName)->yes()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $calledOnType->getMethod($methodName, $scope);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Comparison;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\RuleError;
use PHPStan\Rules\RuleErrorBuilder;
use PHPStan\Type\Constant\ConstantBooleanType;
class UnreachableIfBranchesRule implements \PHPStan\Rules\Rule
{
    /** @var ConstantConditionRuleHelper */
    private $helper;
    public function __construct(\PHPStan\Rules\Comparison\ConstantConditionRuleHelper $helper)
    {
        $this->helper = $helper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\If_::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\If_ $node
     * @param Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $errors = [];
        $conditionType = $scope->getType($node->cond)->toBoolean();
        $nextBranchIsDead = $conditionType instanceof \PHPStan\Type\Constant\ConstantBooleanType && $conditionType->getValue() && $this->helper->shouldSkip($scope, $node->cond) && !$this->helper->shouldReportAlwaysTrueByDefault($node->cond);
        foreach ($node->elseifs as $elseif) {
            if ($nextBranchIsDead) {
                $errors[] = \PHPStan\Rules\RuleErrorBuilder::message('Elseif branch is unreachable because previous condition is always true.')->line($elseif->getLine())->build();
                continue;
            }
            $elseIfConditionType = $scope->getType($elseif->cond)->toBoolean();
            $nextBranchIsDead = $elseIfConditionType instanceof \PHPStan\Type\Constant\ConstantBooleanType && $elseIfConditionType->getValue() && $this->helper->shouldSkip($scope, $elseif->cond) && !$this->helper->shouldReportAlwaysTrueByDefault($elseif->cond);
        }
        if ($node->else !== null && $nextBranchIsDead) {
            $errors[] = \PHPStan\Rules\RuleErrorBuilder::message('Else branch is unreachable because previous condition is always true.')->line($node->else->getLine())->build();
        }
        return $errors;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Comparison;

use PhpParser\Node;
use PhpParser\Node\Expr;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\MethodReflection;
class ImpossibleCheckTypeMethodCallRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\Comparison\ImpossibleCheckTypeHelper */
    private $impossibleCheckTypeHelper;
    /** @var bool */
    private $checkAlwaysTrueCheckTypeFunctionCall;
    public function __construct(\PHPStan\Rules\Comparison\ImpossibleCheckTypeHelper $impossibleCheckTypeHelper, bool $checkAlwaysTrueCheckTypeFunctionCall)
    {
        $this->impossibleCheckTypeHelper = $impossibleCheckTypeHelper;
        $this->checkAlwaysTrueCheckTypeFunctionCall = $checkAlwaysTrueCheckTypeFunctionCall;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\MethodCall::class;
    }
    /**
     * @param \PhpParser\Node\Expr\MethodCall $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[] errors
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node->name instanceof \PhpParser\Node\Identifier) {
            return [];
        }
        $isAlways = $this->impossibleCheckTypeHelper->findSpecifiedType($scope, $node);
        if ($isAlways === null) {
            return [];
        }
        if (!$isAlways) {
            $method = $this->getMethod($node->var, $node->name->name, $scope);
            return [\sprintf('Call to method %s::%s()%s will always evaluate to false.', $method->getDeclaringClass()->getDisplayName(), $method->getName(), $this->impossibleCheckTypeHelper->getArgumentsDescription($scope, $node->args))];
        } elseif ($this->checkAlwaysTrueCheckTypeFunctionCall) {
            $method = $this->getMethod($node->var, $node->name->name, $scope);
            return [\sprintf('Call to method %s::%s()%s will always evaluate to true.', $method->getDeclaringClass()->getDisplayName(), $method->getName(), $this->impossibleCheckTypeHelper->getArgumentsDescription($scope, $node->args))];
        }
        return [];
    }
    private function getMethod(\PhpParser\Node\Expr $var, string $methodName, \PHPStan\Analyser\Scope $scope) : \PHPStan\Reflection\MethodReflection
    {
        $calledOnType = $scope->getType($var);
        if (!$calledOnType->hasMethod($methodName)->yes()) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $calledOnType->getMethod($methodName, $scope);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Comparison;

use PhpParser\Node\Arg;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\FuncCall;
use PhpParser\Node\Expr\MethodCall;
use PHPStan\Analyser\Scope;
use PHPStan\Analyser\TypeSpecifier;
use PHPStan\Analyser\TypeSpecifierContext;
use PHPStan\Broker\Broker;
use PHPStan\Reflection\Php\UniversalObjectCratesClassReflectionExtension;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\ErrorType;
use PHPStan\Type\MixedType;
use PHPStan\Type\NeverType;
use PHPStan\Type\StringType;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypeUtils;
use PHPStan\Type\VerbosityLevel;
class ImpossibleCheckTypeHelper
{
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PHPStan\Analyser\TypeSpecifier */
    private $typeSpecifier;
    public function __construct(\PHPStan\Broker\Broker $broker, \PHPStan\Analyser\TypeSpecifier $typeSpecifier)
    {
        $this->broker = $broker;
        $this->typeSpecifier = $typeSpecifier;
    }
    public function findSpecifiedType(\PHPStan\Analyser\Scope $scope, \PhpParser\Node\Expr $node) : ?bool
    {
        if ($node instanceof \PhpParser\Node\Expr\FuncCall && \count($node->args) > 0) {
            if ($node->name instanceof \PhpParser\Node\Name) {
                $functionName = \strtolower((string) $node->name);
                if ($functionName === 'count') {
                    return null;
                } elseif ($functionName === 'is_numeric') {
                    $argType = $scope->getType($node->args[0]->value);
                    if (\count(\PHPStan\Type\TypeUtils::getConstantScalars($argType)) > 0) {
                        return !$argType->toNumber() instanceof \PHPStan\Type\ErrorType;
                    }
                    if (!(new \PHPStan\Type\StringType())->isSuperTypeOf($argType)->no()) {
                        return null;
                    }
                } elseif ($functionName === 'defined') {
                    return null;
                } elseif ($functionName === 'in_array' && \count($node->args) >= 3) {
                    $haystackType = $scope->getType($node->args[1]->value);
                    if ($haystackType instanceof \PHPStan\Type\MixedType) {
                        return null;
                    }
                    if (!$haystackType instanceof \PHPStan\Type\Constant\ConstantArrayType || \count($haystackType->getValueTypes()) > 1) {
                        $needleType = $scope->getType($node->args[0]->value);
                        $haystackArrayTypes = \PHPStan\Type\TypeUtils::getArrays($haystackType);
                        if (\count($haystackArrayTypes) === 1 && $haystackArrayTypes[0]->getIterableValueType() instanceof \PHPStan\Type\NeverType) {
                            return null;
                        }
                        $valueType = \PHPStan\Type\TypeCombinator::union(...$haystackArrayTypes)->getIterableValueType();
                        $isNeedleSupertype = $needleType->isSuperTypeOf($valueType);
                        if ($isNeedleSupertype->maybe() || $isNeedleSupertype->yes()) {
                            foreach ($haystackArrayTypes as $haystackArrayType) {
                                foreach (\PHPStan\Type\TypeUtils::getConstantScalars($haystackArrayType->getIterableValueType()) as $constantScalarType) {
                                    if ($needleType->isSuperTypeOf($constantScalarType)->yes()) {
                                        continue 2;
                                    }
                                }
                                return null;
                            }
                        }
                        if ($isNeedleSupertype->yes()) {
                            $hasConstantNeedleTypes = \count(\PHPStan\Type\TypeUtils::getConstantScalars($needleType)) > 0;
                            $hasConstantHaystackTypes = \count(\PHPStan\Type\TypeUtils::getConstantScalars($valueType)) > 0;
                            if (!$hasConstantNeedleTypes && !$hasConstantHaystackTypes || $hasConstantNeedleTypes !== $hasConstantHaystackTypes) {
                                return null;
                            }
                        }
                    }
                } elseif ($functionName === 'property_exists' && \count($node->args) >= 2) {
                    $classNames = \PHPStan\Type\TypeUtils::getDirectClassNames($scope->getType($node->args[0]->value));
                    foreach ($classNames as $className) {
                        if (!$this->broker->hasClass($className)) {
                            continue;
                        }
                        if (\PHPStan\Reflection\Php\UniversalObjectCratesClassReflectionExtension::isUniversalObjectCrate($this->broker, $this->broker->getUniversalObjectCratesClasses(), $this->broker->getClass($className))) {
                            return null;
                        }
                    }
                }
            }
        }
        $specifiedTypes = $this->typeSpecifier->specifyTypesInCondition($scope, $node, \PHPStan\Analyser\TypeSpecifierContext::createTruthy());
        $sureTypes = $specifiedTypes->getSureTypes();
        $sureNotTypes = $specifiedTypes->getSureNotTypes();
        $isSpecified = static function (\PhpParser\Node\Expr $expr) use($scope, $node) : bool {
            return ($node instanceof \PhpParser\Node\Expr\FuncCall || $node instanceof \PhpParser\Node\Expr\MethodCall || $node instanceof \PhpParser\Node\Expr\StaticCall) && $scope->isSpecified($expr);
        };
        if (\count($sureTypes) === 1) {
            $sureType = \reset($sureTypes);
            if ($isSpecified($sureType[0])) {
                return null;
            }
            $argumentType = $scope->getType($sureType[0]);
            /** @var \PHPStan\Type\Type $resultType */
            $resultType = $sureType[1];
            $isSuperType = $resultType->isSuperTypeOf($argumentType);
            if ($isSuperType->yes()) {
                return \true;
            } elseif ($isSuperType->no()) {
                return \false;
            }
            return null;
        } elseif (\count($sureNotTypes) === 1) {
            $sureNotType = \reset($sureNotTypes);
            if ($isSpecified($sureNotType[0])) {
                return null;
            }
            $argumentType = $scope->getType($sureNotType[0]);
            /** @var \PHPStan\Type\Type $resultType */
            $resultType = $sureNotType[1];
            $isSuperType = $resultType->isSuperTypeOf($argumentType);
            if ($isSuperType->yes()) {
                return \false;
            } elseif ($isSuperType->no()) {
                return \true;
            }
            return null;
        } elseif (\count($sureTypes) > 0) {
            foreach ($sureTypes as $sureType) {
                if ($isSpecified($sureType[0])) {
                    return null;
                }
            }
            $types = \PHPStan\Type\TypeCombinator::union(...\array_map(static function ($sureType) {
                return $sureType[1];
            }, \array_values($sureTypes)));
            if ($types instanceof \PHPStan\Type\NeverType) {
                return \false;
            }
        } elseif (\count($sureNotTypes) > 0) {
            foreach ($sureNotTypes as $sureNotType) {
                if ($isSpecified($sureNotType[0])) {
                    return null;
                }
            }
            $types = \PHPStan\Type\TypeCombinator::union(...\array_map(static function ($sureNotType) {
                return $sureNotType[1];
            }, \array_values($sureNotTypes)));
            if ($types instanceof \PHPStan\Type\NeverType) {
                return \true;
            }
        }
        return null;
    }
    /**
     * @param Scope $scope
     * @param \PhpParser\Node\Arg[] $args
     * @return string
     */
    public function getArgumentsDescription(\PHPStan\Analyser\Scope $scope, array $args) : string
    {
        if (\count($args) === 0) {
            return '';
        }
        $descriptions = \array_map(static function (\PhpParser\Node\Arg $arg) use($scope) : string {
            return $scope->getType($arg->value)->describe(\PHPStan\Type\VerbosityLevel::value());
        }, $args);
        if (\count($descriptions) < 3) {
            return \sprintf(' with %s', \implode(' and ', $descriptions));
        }
        $lastDescription = \array_pop($descriptions);
        return \sprintf(' with arguments %s and %s', \implode(', ', $descriptions), $lastDescription);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Comparison;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\Rule;
use PHPStan\Rules\RuleError;
use PHPStan\Rules\RuleErrorBuilder;
use PHPStan\Type\Constant\ConstantBooleanType;
class UnreachableTernaryElseBranchRule implements \PHPStan\Rules\Rule
{
    /** @var ConstantConditionRuleHelper */
    private $helper;
    public function __construct(\PHPStan\Rules\Comparison\ConstantConditionRuleHelper $helper)
    {
        $this->helper = $helper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\Ternary::class;
    }
    /**
     * @param \PhpParser\Node\Expr\Ternary $node
     * @param Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $conditionType = $scope->getType($node->cond)->toBoolean();
        if ($conditionType instanceof \PHPStan\Type\Constant\ConstantBooleanType && $conditionType->getValue() && $this->helper->shouldSkip($scope, $node->cond) && !$this->helper->shouldReportAlwaysTrueByDefault($node->cond)) {
            return [\PHPStan\Rules\RuleErrorBuilder::message('Else branch is unreachable because ternary operator condition is always true.')->line($node->else->getLine())->build()];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Comparison;

use PhpParser\Node;
use PhpParser\Node\Expr;
use PHPStan\Analyser\Scope;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\VerbosityLevel;
class StrictComparisonOfDifferentTypesRule implements \PHPStan\Rules\Rule
{
    /** @var bool */
    private $checkAlwaysTrueStrictComparison;
    public function __construct(bool $checkAlwaysTrueStrictComparison)
    {
        $this->checkAlwaysTrueStrictComparison = $checkAlwaysTrueStrictComparison;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\BinaryOp::class;
    }
    /**
     * @param \PhpParser\Node\Expr\BinaryOp $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[] errors
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node instanceof \PhpParser\Node\Expr\BinaryOp\Identical && !$node instanceof \PhpParser\Node\Expr\BinaryOp\NotIdentical) {
            return [];
        }
        if ($this->isSpecifiedFunctionCall($scope, $node->left) || $this->isSpecifiedFunctionCall($scope, $node->right)) {
            return [];
        }
        $nodeType = $scope->getType($node);
        if (!$nodeType instanceof \PHPStan\Type\Constant\ConstantBooleanType) {
            return [];
        }
        $leftType = $scope->getType($node->left);
        $rightType = $scope->getType($node->right);
        if (!$nodeType->getValue()) {
            return [\sprintf('Strict comparison using %s between %s and %s will always evaluate to false.', $node instanceof \PhpParser\Node\Expr\BinaryOp\Identical ? '===' : '!==', $leftType->describe(\PHPStan\Type\VerbosityLevel::value()), $rightType->describe(\PHPStan\Type\VerbosityLevel::value()))];
        } elseif ($this->checkAlwaysTrueStrictComparison) {
            return [\sprintf('Strict comparison using %s between %s and %s will always evaluate to true.', $node instanceof \PhpParser\Node\Expr\BinaryOp\Identical ? '===' : '!==', $leftType->describe(\PHPStan\Type\VerbosityLevel::value()), $rightType->describe(\PHPStan\Type\VerbosityLevel::value()))];
        }
        return [];
    }
    private function isSpecifiedFunctionCall(\PHPStan\Analyser\Scope $scope, \PhpParser\Node\Expr $node) : bool
    {
        return ($node instanceof \PhpParser\Node\Expr\FuncCall || $node instanceof \PhpParser\Node\Expr\MethodCall || $node instanceof \PhpParser\Node\Expr\StaticCall) && $scope->isSpecified($node);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Comparison;

use PHPStan\Rules\RuleError;
use PHPStan\Rules\RuleErrorBuilder;
use PHPStan\Type\Constant\ConstantBooleanType;
class IfConstantConditionRule implements \PHPStan\Rules\Rule
{
    /** @var ConstantConditionRuleHelper */
    private $helper;
    public function __construct(\PHPStan\Rules\Comparison\ConstantConditionRuleHelper $helper)
    {
        $this->helper = $helper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\If_::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\If_ $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $exprType = $this->helper->getBooleanType($scope, $node->cond);
        if ($exprType instanceof \PHPStan\Type\Constant\ConstantBooleanType) {
            return [\PHPStan\Rules\RuleErrorBuilder::message(\sprintf('If condition is always %s.', $exprType->getValue() ? 'true' : 'false'))->line($node->cond->getLine())->build()];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Comparison;

use PHPStan\Rules\RuleError;
use PHPStan\Rules\RuleErrorBuilder;
use PHPStan\Type\Constant\ConstantBooleanType;
class BooleanAndConstantConditionRule implements \PHPStan\Rules\Rule
{
    /** @var ConstantConditionRuleHelper */
    private $helper;
    public function __construct(\PHPStan\Rules\Comparison\ConstantConditionRuleHelper $helper)
    {
        $this->helper = $helper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\BinaryOp\BooleanAnd::class;
    }
    /**
     * @param \PhpParser\Node\Expr\BinaryOp\BooleanAnd $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $errors = [];
        $leftType = $this->helper->getBooleanType($scope, $node->left);
        if ($leftType instanceof \PHPStan\Type\Constant\ConstantBooleanType) {
            $errors[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Left side of && is always %s.', $leftType->getValue() ? 'true' : 'false'))->line($node->left->getLine())->build();
        }
        $rightType = $this->helper->getBooleanType($scope->filterByTruthyValue($node->left), $node->right);
        if ($rightType instanceof \PHPStan\Type\Constant\ConstantBooleanType) {
            $errors[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Right side of && is always %s.', $rightType->getValue() ? 'true' : 'false'))->line($node->right->getLine())->build();
        }
        if (\count($errors) === 0) {
            $nodeType = $scope->getType($node);
            if ($nodeType instanceof \PHPStan\Type\Constant\ConstantBooleanType) {
                $errors[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Result of && is always %s.', $nodeType->getValue() ? 'true' : 'false'))->build();
            }
        }
        return $errors;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Comparison;

use PHPStan\Rules\RuleError;
use PHPStan\Rules\RuleErrorBuilder;
use PHPStan\Type\Constant\ConstantBooleanType;
class ElseIfConstantConditionRule implements \PHPStan\Rules\Rule
{
    /** @var ConstantConditionRuleHelper */
    private $helper;
    public function __construct(\PHPStan\Rules\Comparison\ConstantConditionRuleHelper $helper)
    {
        $this->helper = $helper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Stmt\ElseIf_::class;
    }
    /**
     * @param \PhpParser\Node\Stmt\ElseIf_ $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $exprType = $this->helper->getBooleanType($scope, $node->cond);
        if ($exprType instanceof \PHPStan\Type\Constant\ConstantBooleanType) {
            return [\PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Elseif condition is always %s.', $exprType->getValue() ? 'true' : 'false'))->line($node->cond->getLine())->build()];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Comparison;

use PhpParser\Node\Expr;
use PhpParser\Node\Expr\FuncCall;
use PhpParser\Node\Expr\MethodCall;
use PHPStan\Analyser\Scope;
use PHPStan\Type\BooleanType;
class ConstantConditionRuleHelper
{
    /** @var ImpossibleCheckTypeHelper */
    private $impossibleCheckTypeHelper;
    public function __construct(\PHPStan\Rules\Comparison\ImpossibleCheckTypeHelper $impossibleCheckTypeHelper)
    {
        $this->impossibleCheckTypeHelper = $impossibleCheckTypeHelper;
    }
    public function shouldReportAlwaysTrueByDefault(\PhpParser\Node\Expr $expr) : bool
    {
        return $expr instanceof \PhpParser\Node\Expr\BooleanNot || $expr instanceof \PhpParser\Node\Expr\BinaryOp\BooleanOr || $expr instanceof \PhpParser\Node\Expr\BinaryOp\BooleanAnd || $expr instanceof \PhpParser\Node\Expr\Ternary || $expr instanceof \PhpParser\Node\Expr\Isset_;
    }
    public function shouldSkip(\PHPStan\Analyser\Scope $scope, \PhpParser\Node\Expr $expr) : bool
    {
        if ($expr instanceof \PhpParser\Node\Expr\Instanceof_ || $expr instanceof \PhpParser\Node\Expr\BinaryOp\Identical || $expr instanceof \PhpParser\Node\Expr\BinaryOp\NotIdentical || $expr instanceof \PhpParser\Node\Expr\BooleanNot || $expr instanceof \PhpParser\Node\Expr\BinaryOp\BooleanOr || $expr instanceof \PhpParser\Node\Expr\BinaryOp\BooleanAnd || $expr instanceof \PhpParser\Node\Expr\Ternary || $expr instanceof \PhpParser\Node\Expr\Isset_) {
            // already checked by different rules
            return \true;
        }
        if ($expr instanceof \PhpParser\Node\Expr\FuncCall || $expr instanceof \PhpParser\Node\Expr\MethodCall || $expr instanceof \PhpParser\Node\Expr\StaticCall) {
            $isAlways = $this->impossibleCheckTypeHelper->findSpecifiedType($scope, $expr);
            if ($isAlways !== null) {
                return \true;
            }
        }
        return \false;
    }
    public function getBooleanType(\PHPStan\Analyser\Scope $scope, \PhpParser\Node\Expr $expr) : \PHPStan\Type\BooleanType
    {
        if ($this->shouldSkip($scope, $expr)) {
            return new \PHPStan\Type\BooleanType();
        }
        return $scope->getType($expr)->toBoolean();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Comparison;

use PHPStan\Rules\RuleError;
use PHPStan\Rules\RuleErrorBuilder;
use PHPStan\Type\Constant\ConstantBooleanType;
class BooleanNotConstantConditionRule implements \PHPStan\Rules\Rule
{
    /** @var ConstantConditionRuleHelper */
    private $helper;
    public function __construct(\PHPStan\Rules\Comparison\ConstantConditionRuleHelper $helper)
    {
        $this->helper = $helper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\BooleanNot::class;
    }
    /**
     * @param \PhpParser\Node\Expr\BooleanNot $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $exprType = $this->helper->getBooleanType($scope, $node->expr);
        if ($exprType instanceof \PHPStan\Type\Constant\ConstantBooleanType) {
            return [\PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Negated boolean expression is always %s.', $exprType->getValue() ? 'false' : 'true'))->line($node->expr->getLine())->build()];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Comparison;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
class ImpossibleCheckTypeFunctionCallRule implements \PHPStan\Rules\Rule
{
    /** @var \PHPStan\Rules\Comparison\ImpossibleCheckTypeHelper */
    private $impossibleCheckTypeHelper;
    /** @var bool */
    private $checkAlwaysTrueCheckTypeFunctionCall;
    public function __construct(\PHPStan\Rules\Comparison\ImpossibleCheckTypeHelper $impossibleCheckTypeHelper, bool $checkAlwaysTrueCheckTypeFunctionCall)
    {
        $this->impossibleCheckTypeHelper = $impossibleCheckTypeHelper;
        $this->checkAlwaysTrueCheckTypeFunctionCall = $checkAlwaysTrueCheckTypeFunctionCall;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\FuncCall::class;
    }
    /**
     * @param \PhpParser\Node\Expr\FuncCall $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[] errors
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node->name instanceof \PhpParser\Node\Name) {
            return [];
        }
        $functionName = (string) $node->name;
        if (\strtolower($functionName) === 'is_a') {
            return [];
        }
        $isAlways = $this->impossibleCheckTypeHelper->findSpecifiedType($scope, $node);
        if ($isAlways === null) {
            return [];
        }
        if (!$isAlways) {
            return [\sprintf('Call to function %s()%s will always evaluate to false.', $functionName, $this->impossibleCheckTypeHelper->getArgumentsDescription($scope, $node->args))];
        } elseif ($this->checkAlwaysTrueCheckTypeFunctionCall) {
            return [\sprintf('Call to function %s()%s will always evaluate to true.', $functionName, $this->impossibleCheckTypeHelper->getArgumentsDescription($scope, $node->args))];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Comparison;

use PHPStan\Rules\RuleError;
use PHPStan\Rules\RuleErrorBuilder;
use PHPStan\Type\Constant\ConstantBooleanType;
class BooleanOrConstantConditionRule implements \PHPStan\Rules\Rule
{
    /** @var ConstantConditionRuleHelper */
    private $helper;
    public function __construct(\PHPStan\Rules\Comparison\ConstantConditionRuleHelper $helper)
    {
        $this->helper = $helper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\BinaryOp\BooleanOr::class;
    }
    /**
     * @param \PhpParser\Node\Expr\BinaryOp\BooleanOr $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return RuleError[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $messages = [];
        $leftType = $this->helper->getBooleanType($scope, $node->left);
        if ($leftType instanceof \PHPStan\Type\Constant\ConstantBooleanType) {
            $messages[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Left side of || is always %s.', $leftType->getValue() ? 'true' : 'false'))->line($node->left->getLine())->build();
        }
        $rightType = $this->helper->getBooleanType($scope->filterByFalseyValue($node->left), $node->right);
        if ($rightType instanceof \PHPStan\Type\Constant\ConstantBooleanType) {
            $messages[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Right side of || is always %s.', $rightType->getValue() ? 'true' : 'false'))->line($node->right->getLine())->build();
        }
        if (\count($messages) === 0) {
            $nodeType = $scope->getType($node);
            if ($nodeType instanceof \PHPStan\Type\Constant\ConstantBooleanType) {
                $messages[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf('Result of || is always %s.', $nodeType->getValue() ? 'true' : 'false'))->build();
            }
        }
        return $messages;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Comparison;

use PHPStan\Type\Constant\ConstantBooleanType;
class TernaryOperatorConstantConditionRule implements \PHPStan\Rules\Rule
{
    /** @var ConstantConditionRuleHelper */
    private $helper;
    public function __construct(\PHPStan\Rules\Comparison\ConstantConditionRuleHelper $helper)
    {
        $this->helper = $helper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\Ternary::class;
    }
    /**
     * @param \PhpParser\Node\Expr\Ternary $node
     * @param \PHPStan\Analyser\Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $exprType = $this->helper->getBooleanType($scope, $node->cond);
        if ($exprType instanceof \PHPStan\Type\Constant\ConstantBooleanType) {
            return [\sprintf('Ternary operator condition is always %s.', $exprType->getValue() ? 'true' : 'false')];
        }
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Generators;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Rules\Rule;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Type\IntegerType;
use PHPStan\Type\MixedType;
use PHPStan\Type\NullType;
use PHPStan\Type\VerbosityLevel;
class YieldTypeRule implements \PHPStan\Rules\Rule
{
    /** @var RuleLevelHelper */
    private $ruleLevelHelper;
    public function __construct(\PHPStan\Rules\RuleLevelHelper $ruleLevelHelper)
    {
        $this->ruleLevelHelper = $ruleLevelHelper;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\Yield_::class;
    }
    /**
     * @param Node\Expr\Yield_ $node
     * @param Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $anonymousFunctionReturnType = $scope->getAnonymousFunctionReturnType();
        $scopeFunction = $scope->getFunction();
        if ($anonymousFunctionReturnType !== null) {
            $returnType = $anonymousFunctionReturnType;
        } elseif ($scopeFunction !== null) {
            $returnType = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($scopeFunction->getVariants())->getReturnType();
        } else {
            return [];
            // already reported by YieldInGeneratorRule
        }
        if ($returnType instanceof \PHPStan\Type\MixedType) {
            return [];
        }
        if ($node->key === null) {
            $keyType = new \PHPStan\Type\IntegerType();
        } else {
            $keyType = $scope->getType($node->key);
        }
        if ($node->value === null) {
            $valueType = new \PHPStan\Type\NullType();
        } else {
            $valueType = $scope->getType($node->value);
        }
        $messages = [];
        if (!$this->ruleLevelHelper->accepts($returnType->getIterableKeyType(), $keyType, $scope->isDeclareStrictTypes())) {
            $messages[] = \sprintf('Generator expects key type %s, %s given.', $returnType->getIterableKeyType()->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $keyType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()));
        }
        if (!$this->ruleLevelHelper->accepts($returnType->getIterableValueType(), $valueType, $scope->isDeclareStrictTypes())) {
            $messages[] = \sprintf('Generator expects value type %s, %s given.', $returnType->getIterableValueType()->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $valueType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()));
        }
        return $messages;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Generators;

use PhpParser\Node;
use PhpParser\Node\Expr\YieldFrom;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Rules\Rule;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Type\MixedType;
use PHPStan\Type\VerbosityLevel;
class YieldFromTypeRule implements \PHPStan\Rules\Rule
{
    /** @var RuleLevelHelper */
    private $ruleLevelHelper;
    /** @var bool */
    private $reportMaybes;
    public function __construct(\PHPStan\Rules\RuleLevelHelper $ruleLevelHelper, bool $reportMaybes)
    {
        $this->ruleLevelHelper = $ruleLevelHelper;
        $this->reportMaybes = $reportMaybes;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr\YieldFrom::class;
    }
    /**
     * @param YieldFrom $node
     * @param Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        $exprType = $scope->getType($node->expr);
        $isIterable = $exprType->isIterable();
        $messagePattern = 'Argument of an invalid type %s passed to yield from, only iterables are supported.';
        if ($isIterable->no()) {
            return [\sprintf($messagePattern, $exprType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))];
        } elseif (!$exprType instanceof \PHPStan\Type\MixedType && $this->reportMaybes && $isIterable->maybe()) {
            return [\sprintf($messagePattern, $exprType->describe(\PHPStan\Type\VerbosityLevel::typeOnly()))];
        }
        $anonymousFunctionReturnType = $scope->getAnonymousFunctionReturnType();
        $scopeFunction = $scope->getFunction();
        if ($anonymousFunctionReturnType !== null) {
            $returnType = $anonymousFunctionReturnType;
        } elseif ($scopeFunction !== null) {
            $returnType = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($scopeFunction->getVariants())->getReturnType();
        } else {
            return [];
            // already reported by YieldInGeneratorRule
        }
        if ($returnType instanceof \PHPStan\Type\MixedType) {
            return [];
        }
        $messages = [];
        if (!$this->ruleLevelHelper->accepts($returnType->getIterableKeyType(), $exprType->getIterableKeyType(), $scope->isDeclareStrictTypes())) {
            $messages[] = \sprintf('Generator expects key type %s, %s given.', $returnType->getIterableKeyType()->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $exprType->getIterableKeyType()->describe(\PHPStan\Type\VerbosityLevel::typeOnly()));
        }
        if (!$this->ruleLevelHelper->accepts($returnType->getIterableValueType(), $exprType->getIterableValueType(), $scope->isDeclareStrictTypes())) {
            $messages[] = \sprintf('Generator expects value type %s, %s given.', $returnType->getIterableValueType()->describe(\PHPStan\Type\VerbosityLevel::typeOnly()), $exprType->getIterableValueType()->describe(\PHPStan\Type\VerbosityLevel::typeOnly()));
        }
        return $messages;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules\Generators;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Rules\Rule;
use PHPStan\TrinaryLogic;
use PHPStan\Type\ArrayType;
use PHPStan\Type\MixedType;
class YieldInGeneratorRule implements \PHPStan\Rules\Rule
{
    /** @var bool */
    private $reportMaybes;
    public function __construct(bool $reportMaybes)
    {
        $this->reportMaybes = $reportMaybes;
    }
    public function getNodeType() : string
    {
        return \PhpParser\Node\Expr::class;
    }
    /**
     * @param Node\Expr $node
     * @param Scope $scope
     * @return string[]
     */
    public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope) : array
    {
        if (!$node instanceof \PhpParser\Node\Expr\Yield_ && !$node instanceof \PhpParser\Node\Expr\YieldFrom) {
            return [];
        }
        $anonymousFunctionReturnType = $scope->getAnonymousFunctionReturnType();
        $scopeFunction = $scope->getFunction();
        if ($anonymousFunctionReturnType !== null) {
            $returnType = $anonymousFunctionReturnType;
        } elseif ($scopeFunction !== null) {
            $returnType = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($scopeFunction->getVariants())->getReturnType();
        } else {
            return ['Yield can be used only inside a function.'];
        }
        if ($returnType instanceof \PHPStan\Type\MixedType) {
            return [];
        }
        $isSuperType = $returnType->isIterable()->and(\PHPStan\TrinaryLogic::createFromBoolean($returnType instanceof \PHPStan\Type\ArrayType)->negate());
        if ($isSuperType->yes()) {
            return [];
        }
        if ($isSuperType->maybe() && !$this->reportMaybes) {
            return [];
        }
        return [\sprintf('Yield can be used only with these return types: %s.', 'Generator, Iterator, Traversable, iterable')];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules;

use PhpParser\Node\Expr\Variable;
use PhpParser\Node\FunctionLike;
use PhpParser\Node\Name;
use PhpParser\Node\NullableType;
use PhpParser\Node\Param;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Function_;
use PHPStan\Broker\Broker;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Reflection\ParametersAcceptorWithPhpDocs;
use PHPStan\Reflection\Php\PhpMethodFromParserNodeReflection;
use PHPStan\Type\NonexistentParentClassType;
use PHPStan\Type\VerbosityLevel;
class FunctionDefinitionCheck
{
    private const VALID_TYPEHINTS = ['self', 'array', 'callable', 'string', 'int', 'bool', 'float', 'void', 'iterable', 'object', 'parent'];
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PHPStan\Rules\ClassCaseSensitivityCheck */
    private $classCaseSensitivityCheck;
    /** @var bool */
    private $checkClassCaseSensitivity;
    /** @var bool */
    private $checkThisOnly;
    public function __construct(\PHPStan\Broker\Broker $broker, \PHPStan\Rules\ClassCaseSensitivityCheck $classCaseSensitivityCheck, bool $checkClassCaseSensitivity, bool $checkThisOnly)
    {
        $this->broker = $broker;
        $this->classCaseSensitivityCheck = $classCaseSensitivityCheck;
        $this->checkClassCaseSensitivity = $checkClassCaseSensitivity;
        $this->checkThisOnly = $checkThisOnly;
    }
    /**
     * @param \PhpParser\Node\FunctionLike $function
     * @param string $parameterMessage
     * @param string $returnMessage
     * @return RuleError[]
     */
    public function checkFunction(\PhpParser\Node\FunctionLike $function, string $parameterMessage, string $returnMessage) : array
    {
        if ($function instanceof \PhpParser\Node\Stmt\ClassMethod) {
            throw new \PHPStan\ShouldNotHappenException('Use FunctionDefinitionCheck::checkClassMethod() instead.');
        }
        if ($function instanceof \PhpParser\Node\Stmt\Function_) {
            $functionName = $function->name->name;
            if (isset($function->namespacedName)) {
                $functionName = (string) $function->namespacedName;
            }
            $functionNameName = new \PhpParser\Node\Name($functionName);
            if (!$this->broker->hasCustomFunction($functionNameName, null)) {
                return [];
            }
            $functionReflection = $this->broker->getCustomFunction($functionNameName, null);
            /** @var \PHPStan\Reflection\ParametersAcceptorWithPhpDocs $parametersAcceptor */
            $parametersAcceptor = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionReflection->getVariants());
            return $this->checkParametersAcceptor($parametersAcceptor, $function, $parameterMessage, $returnMessage);
        }
        $errors = [];
        foreach ($function->getParams() as $param) {
            if ($param->type === null) {
                continue;
            }
            $class = $param->type instanceof \PhpParser\Node\NullableType ? (string) $param->type->type : (string) $param->type;
            $lowercasedClass = \strtolower($class);
            if ($lowercasedClass === '' || \in_array($lowercasedClass, self::VALID_TYPEHINTS, \true)) {
                continue;
            }
            if (!$this->broker->hasClass($class) || $this->broker->getClass($class)->isTrait()) {
                if (!$param->var instanceof \PhpParser\Node\Expr\Variable || !\is_string($param->var->name)) {
                    throw new \PHPStan\ShouldNotHappenException();
                }
                $errors[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf($parameterMessage, $param->var->name, $class))->line($param->type->getLine())->build();
            } elseif ($this->checkClassCaseSensitivity) {
                $errors = \array_merge($errors, $this->classCaseSensitivityCheck->checkClassNames([new \PHPStan\Rules\ClassNameNodePair($class, $param->type)]));
            }
        }
        $returnTypeNode = $function->getReturnType();
        if ($returnTypeNode === null) {
            return $errors;
        }
        $returnType = $returnTypeNode instanceof \PhpParser\Node\NullableType ? (string) $returnTypeNode->type : (string) $returnTypeNode;
        $lowercasedReturnType = \strtolower($returnType);
        if ($lowercasedReturnType !== '' && !\in_array($lowercasedReturnType, self::VALID_TYPEHINTS, \true)) {
            if (!$this->broker->hasClass($returnType) || $this->broker->getClass($returnType)->isTrait()) {
                $errors[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf($returnMessage, $returnType))->line($returnTypeNode->getLine())->build();
            } elseif ($this->checkClassCaseSensitivity) {
                $errors = \array_merge($errors, $this->classCaseSensitivityCheck->checkClassNames([new \PHPStan\Rules\ClassNameNodePair($returnType, $returnTypeNode)]));
            }
        }
        return $errors;
    }
    /**
     * @param PhpMethodFromParserNodeReflection $methodReflection
     * @param ClassMethod $methodNode
     * @param string $parameterMessage
     * @param string $returnMessage
     * @return RuleError[]
     */
    public function checkClassMethod(\PHPStan\Reflection\Php\PhpMethodFromParserNodeReflection $methodReflection, \PhpParser\Node\Stmt\ClassMethod $methodNode, string $parameterMessage, string $returnMessage) : array
    {
        /** @var \PHPStan\Reflection\ParametersAcceptorWithPhpDocs $parametersAcceptor */
        $parametersAcceptor = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($methodReflection->getVariants());
        return $this->checkParametersAcceptor($parametersAcceptor, $methodNode, $parameterMessage, $returnMessage);
    }
    /**
     * @param ParametersAcceptorWithPhpDocs $parametersAcceptor
     * @param FunctionLike $functionNode
     * @param string $parameterMessage
     * @param string $returnMessage
     * @return RuleError[]
     */
    private function checkParametersAcceptor(\PHPStan\Reflection\ParametersAcceptorWithPhpDocs $parametersAcceptor, \PhpParser\Node\FunctionLike $functionNode, string $parameterMessage, string $returnMessage) : array
    {
        $errors = [];
        $parameterNodes = $functionNode->getParams();
        $returnTypeNode = $functionNode->getReturnType() ?? $functionNode;
        foreach ($parametersAcceptor->getParameters() as $parameter) {
            if ($this->checkThisOnly) {
                $referencedClasses = $parameter->getType()->getReferencedClasses();
            } else {
                $referencedClasses = \array_merge($parameter->getNativeType()->getReferencedClasses(), $parameter->getPhpDocType()->getReferencedClasses());
            }
            $parameterNode = null;
            $parameterNodeCallback = function () use($parameter, $parameterNodes, &$parameterNode) : Param {
                if ($parameterNode === null) {
                    $parameterNode = $this->getParameterNode($parameter->getName(), $parameterNodes);
                }
                return $parameterNode;
            };
            foreach ($referencedClasses as $class) {
                if ($this->broker->hasClass($class) && !$this->broker->getClass($class)->isTrait()) {
                    continue;
                }
                $errors[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf($parameterMessage, $parameter->getName(), $class))->line($parameterNodeCallback()->getLine())->build();
            }
            if ($this->checkClassCaseSensitivity) {
                $errors = \array_merge($errors, $this->classCaseSensitivityCheck->checkClassNames(\array_map(static function (string $class) use($parameterNodeCallback) : ClassNameNodePair {
                    return new \PHPStan\Rules\ClassNameNodePair($class, $parameterNodeCallback());
                }, $referencedClasses)));
            }
            if (!$parameter->getType() instanceof \PHPStan\Type\NonexistentParentClassType) {
                continue;
            }
            $errors[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf($parameterMessage, $parameter->getName(), $parameter->getType()->describe(\PHPStan\Type\VerbosityLevel::typeOnly())))->line($parameterNodeCallback()->getLine())->build();
        }
        if ($this->checkThisOnly) {
            $returnTypeReferencedClasses = $parametersAcceptor->getReturnType()->getReferencedClasses();
        } else {
            $returnTypeReferencedClasses = \array_merge($parametersAcceptor->getNativeReturnType()->getReferencedClasses(), $parametersAcceptor->getPhpDocReturnType()->getReferencedClasses());
        }
        foreach ($returnTypeReferencedClasses as $class) {
            if ($this->broker->hasClass($class) && !$this->broker->getClass($class)->isTrait()) {
                continue;
            }
            $errors[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf($returnMessage, $class))->line($returnTypeNode->getLine())->build();
        }
        if ($this->checkClassCaseSensitivity) {
            $errors = \array_merge($errors, $this->classCaseSensitivityCheck->checkClassNames(\array_map(static function (string $class) use($returnTypeNode) : ClassNameNodePair {
                return new \PHPStan\Rules\ClassNameNodePair($class, $returnTypeNode);
            }, $returnTypeReferencedClasses)));
        }
        if ($parametersAcceptor->getReturnType() instanceof \PHPStan\Type\NonexistentParentClassType) {
            $errors[] = \PHPStan\Rules\RuleErrorBuilder::message(\sprintf($returnMessage, $parametersAcceptor->getReturnType()->describe(\PHPStan\Type\VerbosityLevel::typeOnly())))->line($returnTypeNode->getLine())->build();
        }
        return $errors;
    }
    /**
     * @param string $parameterName
     * @param Param[] $parameterNodes
     * @return Param
     */
    private function getParameterNode(string $parameterName, array $parameterNodes) : \PhpParser\Node\Param
    {
        foreach ($parameterNodes as $param) {
            if ($param->var instanceof \PhpParser\Node\Expr\Error) {
                continue;
            }
            if (!\is_string($param->var->name)) {
                continue;
            }
            if ($param->var->name === $parameterName) {
                return $param;
            }
        }
        throw new \PHPStan\ShouldNotHappenException(\sprintf('Parameter %s not found.', $parameterName));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Rules;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Type\Constant\ConstantStringType;
class UnusedFunctionParametersCheck
{
    /**
     * @param \PHPStan\Analyser\Scope $scope
     * @param string[] $parameterNames
     * @param \PhpParser\Node[] $statements
     * @param string $unusedParameterMessage
     * @return string[]
     */
    public function getUnusedParameters(\PHPStan\Analyser\Scope $scope, array $parameterNames, array $statements, string $unusedParameterMessage) : array
    {
        $unusedParameters = \array_fill_keys($parameterNames, \true);
        foreach ($this->getUsedVariables($scope, $statements) as $variableName) {
            if (!isset($unusedParameters[$variableName])) {
                continue;
            }
            unset($unusedParameters[$variableName]);
        }
        $errors = [];
        foreach (\array_keys($unusedParameters) as $name) {
            $errors[] = \sprintf($unusedParameterMessage, $name);
        }
        return $errors;
    }
    /**
     * @param \PHPStan\Analyser\Scope $scope
     * @param \PhpParser\Node[]|\PhpParser\Node|scalar $node
     * @return string[]
     */
    private function getUsedVariables(\PHPStan\Analyser\Scope $scope, $node) : array
    {
        $variableNames = [];
        if ($node instanceof \PhpParser\Node) {
            if ($node instanceof \PhpParser\Node\Expr\Variable && \is_string($node->name) && $node->name !== 'this') {
                return [$node->name];
            }
            if ($node instanceof \PhpParser\Node\Expr\ClosureUse && \is_string($node->var->name)) {
                return [$node->var->name];
            }
            if ($node instanceof \PhpParser\Node\Expr\FuncCall && $node->name instanceof \PhpParser\Node\Name && (string) $node->name === 'compact') {
                foreach ($node->args as $arg) {
                    $argType = $scope->getType($arg->value);
                    if (!$argType instanceof \PHPStan\Type\Constant\ConstantStringType) {
                        continue;
                    }
                    $variableNames[] = $argType->getValue();
                }
            }
            foreach ($node->getSubNodeNames() as $subNodeName) {
                if ($node instanceof \PhpParser\Node\Expr\Closure && $subNodeName !== 'uses') {
                    continue;
                }
                $subNode = $node->{$subNodeName};
                $variableNames = \array_merge($variableNames, $this->getUsedVariables($scope, $subNode));
            }
        } elseif (\is_array($node)) {
            foreach ($node as $subNode) {
                $variableNames = \array_merge($variableNames, $this->getUsedVariables($scope, $subNode));
            }
        }
        return $variableNames;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan;

final class ShouldNotHappenException extends \Exception
{
    public function __construct(string $message = 'Internal error.')
    {
        parent::__construct($message);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan;

abstract class AnalysedCodeException extends \Exception
{
}
<?php

declare (strict_types=1);
namespace PHPStan\Command;

use _HumbugBoxb94336daae36\Symfony\Component\Console\Helper\ProgressBar;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
class ErrorsConsoleStyle extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Style\SymfonyStyle
{
    public const OPTION_NO_PROGRESS = 'no-progress';
    /** @var bool */
    private $showProgress;
    /** @var \Symfony\Component\Console\Helper\ProgressBar */
    private $progressBar;
    public function __construct(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output)
    {
        parent::__construct($input, $output);
        $this->showProgress = $input->hasOption(self::OPTION_NO_PROGRESS) && !(bool) $input->getOption(self::OPTION_NO_PROGRESS);
    }
    /**
     * @param string[] $headers
     * @param string[][] $rows
     */
    public function table(array $headers, array $rows) : void
    {
        /** @var int $terminalWidth */
        $terminalWidth = (new \_HumbugBoxb94336daae36\Symfony\Component\Console\Terminal())->getWidth();
        $maxHeaderWidth = \strlen($headers[0]);
        foreach ($rows as $row) {
            $length = \strlen($row[0]);
            if ($maxHeaderWidth !== 0 && $length <= $maxHeaderWidth) {
                continue;
            }
            $maxHeaderWidth = $length;
        }
        $wrap = static function ($rows) use($terminalWidth, $maxHeaderWidth) {
            return \array_map(static function ($row) use($terminalWidth, $maxHeaderWidth) {
                return \array_map(static function ($s) use($terminalWidth, $maxHeaderWidth) {
                    if ($terminalWidth > $maxHeaderWidth + 5) {
                        return \wordwrap($s, $terminalWidth - $maxHeaderWidth - 5, "\n", \true);
                    }
                    return $s;
                }, $row);
            }, $rows);
        };
        parent::table($headers, $wrap($rows));
    }
    /**
     * @phpcsSuppress SlevomatCodingStandard.TypeHints.TypeHintDeclaration.MissingParameterTypeHint
     * @param int $max
     */
    public function createProgressBar($max = 0) : \_HumbugBoxb94336daae36\Symfony\Component\Console\Helper\ProgressBar
    {
        $this->progressBar = parent::createProgressBar($max);
        $this->progressBar->setOverwrite(\true);
        return $this->progressBar;
    }
    /**
     * @phpcsSuppress SlevomatCodingStandard.TypeHints.TypeHintDeclaration.MissingParameterTypeHint
     * @param int $max
     */
    public function progressStart($max = 0) : void
    {
        if (!$this->showProgress) {
            return;
        }
        parent::progressStart($max);
    }
    /**
     * @phpcsSuppress SlevomatCodingStandard.TypeHints.TypeHintDeclaration.MissingParameterTypeHint
     * @param int $step
     */
    public function progressAdvance($step = 1) : void
    {
        if (!$this->showProgress) {
            return;
        }
        if ($step > 0) {
            $stepTime = (\time() - $this->progressBar->getStartTime()) / $step;
            if ($stepTime > 0 && $stepTime < 1) {
                $this->progressBar->setRedrawFrequency((int) (1 / $stepTime));
            } else {
                $this->progressBar->setRedrawFrequency(1);
            }
        }
        $this->progressBar->setProgress($this->progressBar->getProgress() + $step);
    }
    public function progressFinish() : void
    {
        if (!$this->showProgress) {
            return;
        }
        parent::progressFinish();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Command;

use _HumbugBoxb94336daae36\Nette\DI\Config\Adapters\NeonAdapter;
use _HumbugBoxb94336daae36\Nette\DI\Helpers;
use _HumbugBoxb94336daae36\Nette\Schema\Context as SchemaContext;
use _HumbugBoxb94336daae36\Nette\Schema\Processor;
use _HumbugBoxb94336daae36\Nette\Utils\Strings;
use _HumbugBoxb94336daae36\Nette\Utils\Validators;
use PHPStan\DependencyInjection\Container;
use PHPStan\DependencyInjection\ContainerFactory;
use PHPStan\DependencyInjection\LoaderFactory;
use PHPStan\File\FileFinder;
use PHPStan\File\FileHelper;
use PHPStan\Type\TypeCombinator;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\ConsoleOutputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Style\OutputStyle;
class CommandHelper
{
    public const DEFAULT_LEVEL = 0;
    public static function begin(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, array $paths, ?string $pathsFile, ?string $memoryLimit, ?string $autoloadFile, ?string $projectConfigFile, ?string $level) : \PHPStan\Command\InceptionResult
    {
        $errorOutput = $output instanceof \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\ConsoleOutputInterface ? $output->getErrorOutput() : $output;
        $consoleStyle = new \PHPStan\Command\ErrorsConsoleStyle($input, $output);
        if ($memoryLimit !== null) {
            if (\_HumbugBoxb94336daae36\Nette\Utils\Strings::match($memoryLimit, '#^-?\\d+[kMG]?$#i') === null) {
                $errorOutput->writeln(\sprintf('Invalid memory limit format "%s".', $memoryLimit));
                throw new \PHPStan\Command\InceptionNotSuccessfulException();
            }
            if (\ini_set('memory_limit', $memoryLimit) === \false) {
                $errorOutput->writeln(\sprintf('Memory limit "%s" cannot be set.', $memoryLimit));
                throw new \PHPStan\Command\InceptionNotSuccessfulException();
            }
        }
        $currentWorkingDirectory = \getcwd();
        if ($currentWorkingDirectory === \false) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        $fileHelper = new \PHPStan\File\FileHelper($currentWorkingDirectory);
        if ($autoloadFile !== null && \is_file($autoloadFile)) {
            $autoloadFile = $fileHelper->absolutizePath($autoloadFile);
            if (\is_file($autoloadFile)) {
                (static function (string $file) : void {
                    require_once $file;
                })($autoloadFile);
            }
        }
        if ($projectConfigFile === null) {
            foreach (['phpstan.neon', 'phpstan.neon.dist'] as $discoverableConfigName) {
                $discoverableConfigFile = $currentWorkingDirectory . \DIRECTORY_SEPARATOR . $discoverableConfigName;
                if (\is_file($discoverableConfigFile)) {
                    $projectConfigFile = $discoverableConfigFile;
                    $errorOutput->writeln(\sprintf('Note: Using configuration file %s.', $projectConfigFile));
                    break;
                }
            }
        }
        $defaultLevelUsed = \false;
        if ($projectConfigFile === null && $level === null) {
            $level = self::DEFAULT_LEVEL;
            $defaultLevelUsed = \true;
        }
        if (\count($paths) === 0 && $pathsFile !== null) {
            if (!\file_exists($pathsFile)) {
                $errorOutput->writeln(\sprintf('Paths file %s does not exist.', $pathsFile));
                throw new \PHPStan\Command\InceptionNotSuccessfulException();
            }
            $pathsString = \file_get_contents($pathsFile);
            if ($pathsString === \false) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            $paths = \array_values(\array_filter(\explode("\n", $pathsString), static function (string $path) : bool {
                return \trim($path) !== '';
            }));
        }
        $containerFactory = new \PHPStan\DependencyInjection\ContainerFactory($currentWorkingDirectory);
        if ($projectConfigFile !== null) {
            if (!\is_file($projectConfigFile)) {
                $errorOutput->writeln(\sprintf('Project config file at path %s does not exist.', $projectConfigFile));
                throw new \PHPStan\Command\InceptionNotSuccessfulException();
            }
            $loader = (new \PHPStan\DependencyInjection\LoaderFactory($containerFactory->getRootDirectory(), $containerFactory->getCurrentWorkingDirectory()))->createLoader();
            try {
                $projectConfig = $loader->load($projectConfigFile, null);
            } catch (\_HumbugBoxb94336daae36\Nette\InvalidStateException|\_HumbugBoxb94336daae36\Nette\FileNotFoundException $e) {
                $errorOutput->writeln($e->getMessage());
                throw new \PHPStan\Command\InceptionNotSuccessfulException();
            }
            $defaultParameters = ['rootDir' => $containerFactory->getRootDirectory(), 'currentWorkingDirectory' => $containerFactory->getCurrentWorkingDirectory()];
            if (isset($projectConfig['parameters']['tmpDir'])) {
                $tmpDir = \_HumbugBoxb94336daae36\Nette\DI\Helpers::expand($projectConfig['parameters']['tmpDir'], $defaultParameters);
            }
            if ($level === null && isset($projectConfig['parameters']['level'])) {
                $level = $projectConfig['parameters']['level'];
            }
            if (\count($paths) === 0 && isset($projectConfig['parameters']['paths'])) {
                $paths = \_HumbugBoxb94336daae36\Nette\DI\Helpers::expand($projectConfig['parameters']['paths'], $defaultParameters);
            }
        }
        if (\count($paths) === 0) {
            $errorOutput->writeln('At least one path must be specified to analyse.');
            throw new \PHPStan\Command\InceptionNotSuccessfulException();
        }
        $additionalConfigFiles = [];
        if ($level !== null) {
            $levelConfigFile = \sprintf('%s/config.level%s.neon', $containerFactory->getConfigDirectory(), $level);
            if (!\is_file($levelConfigFile)) {
                $errorOutput->writeln(\sprintf('Level config file %s was not found.', $levelConfigFile));
                throw new \PHPStan\Command\InceptionNotSuccessfulException();
            }
            $additionalConfigFiles[] = $levelConfigFile;
        }
        if (\class_exists('PHPStan\\ExtensionInstaller\\GeneratedConfig')) {
            foreach (\PHPStan\ExtensionInstaller\GeneratedConfig::EXTENSIONS as $name => $extensionConfig) {
                foreach ($extensionConfig['extra']['includes'] ?? [] as $includedFile) {
                    if (!\is_string($includedFile)) {
                        $errorOutput->writeln(\sprintf('Cannot include config from package %s, expecting string file path but got %s', $name, \gettype($includedFile)));
                        throw new \PHPStan\Command\InceptionNotSuccessfulException();
                    }
                    $includedFilePath = \sprintf('%s/%s', $extensionConfig['install_path'], $includedFile);
                    if (!\file_exists($includedFilePath) || !\is_readable($includedFilePath)) {
                        $errorOutput->writeln(\sprintf('Config file %s does not exists or isn\'t readable', $includedFilePath));
                        throw new \PHPStan\Command\InceptionNotSuccessfulException();
                    }
                    $additionalConfigFiles[] = $includedFilePath;
                }
            }
        }
        if ($projectConfigFile !== null) {
            $additionalConfigFiles[] = $fileHelper->absolutizePath($projectConfigFile);
        }
        self::detectDuplicateIncludedFiles($errorOutput, $fileHelper, $additionalConfigFiles, ['rootDir' => $containerFactory->getRootDirectory(), 'currentWorkingDirectory' => $containerFactory->getCurrentWorkingDirectory()]);
        if (!isset($tmpDir)) {
            $tmpDir = \sys_get_temp_dir() . '/phpstan';
            if (!@\mkdir($tmpDir, 0777, \true) && !\is_dir($tmpDir)) {
                $errorOutput->writeln(\sprintf('Cannot create a temp directory %s', $tmpDir));
                throw new \PHPStan\Command\InceptionNotSuccessfulException();
            }
        }
        $paths = \array_map(static function (string $path) use($fileHelper) : string {
            return $fileHelper->absolutizePath($path);
        }, $paths);
        try {
            $netteContainer = $containerFactory->create($tmpDir, $additionalConfigFiles, $paths);
        } catch (\_HumbugBoxb94336daae36\Nette\DI\InvalidConfigurationException|\_HumbugBoxb94336daae36\Nette\Utils\AssertionException $e) {
            $errorOutput->writeln('<error>Invalid configuration:</error>');
            $errorOutput->writeln($e->getMessage());
            throw new \PHPStan\Command\InceptionNotSuccessfulException();
        }
        \PHPStan\Type\TypeCombinator::$enableSubtractableTypes = (bool) $netteContainer->parameters['featureToggles']['subtractableTypes'];
        $memoryLimitFile = $netteContainer->parameters['memoryLimitFile'];
        if (\file_exists($memoryLimitFile)) {
            $memoryLimitFileContents = \file_get_contents($memoryLimitFile);
            if ($memoryLimitFileContents === \false) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            $errorOutput->writeln('PHPStan crashed in the previous run probably because of excessive memory consumption.');
            $errorOutput->writeln(\sprintf('It consumed around %s of memory.', $memoryLimitFileContents));
            $errorOutput->writeln('');
            $errorOutput->writeln('');
            $errorOutput->writeln('To avoid this issue, allow to use more memory with the --memory-limit option.');
            @\unlink($memoryLimitFile);
        }
        self::setUpSignalHandler($consoleStyle, $memoryLimitFile);
        if (!isset($netteContainer->parameters['customRulesetUsed'])) {
            $errorOutput->writeln('');
            $errorOutput->writeln('<comment>No rules detected</comment>');
            $errorOutput->writeln('');
            $errorOutput->writeln('You have the following choices:');
            $errorOutput->writeln('');
            $errorOutput->writeln('* while running the analyse option, use the <info>--level</info> option to adjust your rule level - the higher the stricter');
            $errorOutput->writeln('');
            $errorOutput->writeln(\sprintf('* create your own <info>custom ruleset</info> by selecting which rules you want to check by copying the service definitions from the built-in config level files in <options=bold>%s</>.', $fileHelper->normalizePath(__DIR__ . '/../../conf')));
            $errorOutput->writeln('  * in this case, don\'t forget to define parameter <options=bold>customRulesetUsed</> in your config file.');
            $errorOutput->writeln('');
            throw new \PHPStan\Command\InceptionNotSuccessfulException();
        } elseif ((bool) $netteContainer->parameters['customRulesetUsed']) {
            $defaultLevelUsed = \false;
        }
        if ($netteContainer->parameters['featureToggles']['validateParameters']) {
            $schema = $netteContainer->parameters['__parametersSchema'];
            $processor = new \_HumbugBoxb94336daae36\Nette\Schema\Processor();
            $processor->onNewContext[] = static function (\_HumbugBoxb94336daae36\Nette\Schema\Context $context) : void {
                $context->path = ['parameters'];
            };
            try {
                $processor->process($schema, $netteContainer->parameters);
            } catch (\_HumbugBoxb94336daae36\Nette\Schema\ValidationException $e) {
                foreach ($e->getMessages() as $message) {
                    $errorOutput->writeln('<error>Invalid configuration:</error>');
                    $errorOutput->writeln($message);
                }
                throw new \PHPStan\Command\InceptionNotSuccessfulException();
            }
        }
        $container = $netteContainer->getByType(\PHPStan\DependencyInjection\Container::class);
        foreach ($netteContainer->parameters['autoload_files'] as $parameterAutoloadFile) {
            (static function (string $file) use($container) : void {
                require_once $file;
            })($fileHelper->normalizePath($parameterAutoloadFile));
        }
        if (\count($netteContainer->parameters['autoload_directories']) > 0) {
            $robotLoader = new \_HumbugBoxb94336daae36\Nette\Loaders\RobotLoader();
            $robotLoader->acceptFiles = \array_map(static function (string $extension) : string {
                return \sprintf('*.%s', $extension);
            }, $netteContainer->parameters['fileExtensions']);
            $robotLoader->setTempDirectory($tmpDir);
            foreach ($netteContainer->parameters['autoload_directories'] as $directory) {
                $robotLoader->addDirectory($fileHelper->normalizePath($directory));
            }
            foreach ($netteContainer->parameters['excludes_analyse'] as $directory) {
                $robotLoader->excludeDirectory($fileHelper->normalizePath($directory));
            }
            $robotLoader->register();
        }
        $bootstrapFile = $netteContainer->parameters['bootstrap'];
        if ($bootstrapFile !== null) {
            $bootstrapFile = $fileHelper->normalizePath($bootstrapFile);
            if (!\is_file($bootstrapFile)) {
                $errorOutput->writeln(\sprintf('Bootstrap file %s does not exist.', $bootstrapFile));
                throw new \PHPStan\Command\InceptionNotSuccessfulException();
            }
            try {
                (static function (string $file) use($container) : void {
                    require_once $file;
                })($bootstrapFile);
            } catch (\Throwable $e) {
                $errorOutput->writeln($e->getMessage());
                throw new \PHPStan\Command\InceptionNotSuccessfulException();
            }
        }
        /** @var FileFinder $fileFinder */
        $fileFinder = $netteContainer->getByType(\PHPStan\File\FileFinder::class);
        try {
            $fileFinderResult = $fileFinder->findFiles($paths);
        } catch (\PHPStan\File\PathNotFoundException $e) {
            $errorOutput->writeln(\sprintf('<error>%s</error>', $e->getMessage()));
            throw new \PHPStan\Command\InceptionNotSuccessfulException($e->getMessage(), 0, $e);
        }
        return new \PHPStan\Command\InceptionResult($fileFinderResult->getFiles(), $fileFinderResult->isOnlyFiles(), $consoleStyle, $errorOutput, $netteContainer, $defaultLevelUsed, $memoryLimitFile);
    }
    private static function setUpSignalHandler(\_HumbugBoxb94336daae36\Symfony\Component\Console\Style\OutputStyle $consoleStyle, string $memoryLimitFile) : void
    {
        if (!\function_exists('pcntl_signal')) {
            return;
        }
        \pcntl_async_signals(\true);
        \pcntl_signal(\SIGINT, static function () use($consoleStyle, $memoryLimitFile) : void {
            if (\file_exists($memoryLimitFile)) {
                @\unlink($memoryLimitFile);
            }
            $consoleStyle->newLine();
            exit(1);
        });
    }
    private static function detectDuplicateIncludedFiles(\_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output, \PHPStan\File\FileHelper $fileHelper, array $configFiles, array $loaderParameters) : void
    {
        $neonAdapter = new \_HumbugBoxb94336daae36\Nette\DI\Config\Adapters\NeonAdapter();
        $allConfigFiles = $configFiles;
        foreach ($configFiles as $configFile) {
            $allConfigFiles = \array_merge($allConfigFiles, self::getConfigFiles($neonAdapter, $configFile, $loaderParameters));
        }
        $normalized = \array_map(static function (string $file) use($fileHelper) : string {
            return $fileHelper->absolutizePath($fileHelper->normalizePath($file));
        }, $allConfigFiles);
        $deduplicated = \array_unique($normalized);
        if (\count($normalized) > \count($deduplicated)) {
            $duplicateFiles = \array_unique(\array_diff_key($normalized, $deduplicated));
            $format = "<error>These files are included multiple times:</error>\n- %s";
            if (\count($duplicateFiles) === 1) {
                $format = "<error>This file is included multiple times:</error>\n- %s";
            }
            $output->writeln(\sprintf($format, \implode("\n- ", $duplicateFiles)));
            if (\class_exists('PHPStan\\ExtensionInstaller\\GeneratedConfig')) {
                $output->writeln('');
                $output->writeln('It can lead to unexpected results. If you\'re using phpstan/extension-installer, make sure you have removed corresponding neon files from your project config file.');
            }
            throw new \PHPStan\Command\InceptionNotSuccessfulException();
        }
    }
    private static function getConfigFiles(\_HumbugBoxb94336daae36\Nette\DI\Config\Adapters\NeonAdapter $neonAdapter, string $configFile, array $loaderParameters) : array
    {
        if (!\is_file($configFile) || !\is_readable($configFile)) {
            return [];
        }
        $data = $neonAdapter->load($configFile);
        $allConfigFiles = [];
        if (isset($data['includes'])) {
            \_HumbugBoxb94336daae36\Nette\Utils\Validators::assert($data['includes'], 'list', \sprintf("section 'includes' in file '%s'", $configFile));
            $includes = \_HumbugBoxb94336daae36\Nette\DI\Helpers::expand($data['includes'], $loaderParameters);
            foreach ($includes as $include) {
                $include = self::expandIncludedFile($include, $configFile);
                $allConfigFiles[] = $include;
                $allConfigFiles = \array_merge($allConfigFiles, self::getConfigFiles($neonAdapter, $include, $loaderParameters));
            }
        }
        return $allConfigFiles;
    }
    private static function expandIncludedFile(string $includedFile, string $mainFile) : string
    {
        return \_HumbugBoxb94336daae36\Nette\Utils\Strings::match($includedFile, '#([a-z]+:)?[/\\\\]#Ai') !== null ? $includedFile : \dirname($mainFile) . '/' . $includedFile;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Command\ErrorFormatter;

use _HumbugBoxb94336daae36\Nette\Utils\Json;
use PHPStan\Command\AnalysisResult;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Style\OutputStyle;
class JsonErrorFormatter implements \PHPStan\Command\ErrorFormatter\ErrorFormatter
{
    /** @var bool */
    private $pretty;
    public function __construct(bool $pretty)
    {
        $this->pretty = $pretty;
    }
    public function formatErrors(\PHPStan\Command\AnalysisResult $analysisResult, \_HumbugBoxb94336daae36\Symfony\Component\Console\Style\OutputStyle $style) : int
    {
        $errorsArray = ['totals' => ['errors' => \count($analysisResult->getNotFileSpecificErrors()), 'file_errors' => \count($analysisResult->getFileSpecificErrors())], 'files' => [], 'errors' => []];
        foreach ($analysisResult->getFileSpecificErrors() as $fileSpecificError) {
            $file = $fileSpecificError->getFile();
            if (!\array_key_exists($file, $errorsArray['files'])) {
                $errorsArray['files'][$file] = ['errors' => 0, 'messages' => []];
            }
            $errorsArray['files'][$file]['errors']++;
            $errorsArray['files'][$file]['messages'][] = ['message' => $fileSpecificError->getMessage(), 'line' => $fileSpecificError->getLine(), 'ignorable' => $fileSpecificError->canBeIgnored()];
        }
        foreach ($analysisResult->getNotFileSpecificErrors() as $notFileSpecificError) {
            $errorsArray['errors'][] = $notFileSpecificError;
        }
        $json = \_HumbugBoxb94336daae36\Nette\Utils\Json::encode($errorsArray, $this->pretty ? \_HumbugBoxb94336daae36\Nette\Utils\Json::PRETTY : 0);
        $style->write($json);
        return $analysisResult->hasErrors() ? 1 : 0;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Command\ErrorFormatter;

use PHPStan\Command\AnalysisResult;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Style\OutputStyle;
class RawErrorFormatter implements \PHPStan\Command\ErrorFormatter\ErrorFormatter
{
    public function formatErrors(\PHPStan\Command\AnalysisResult $analysisResult, \_HumbugBoxb94336daae36\Symfony\Component\Console\Style\OutputStyle $style) : int
    {
        if (!$analysisResult->hasErrors()) {
            return 0;
        }
        foreach ($analysisResult->getNotFileSpecificErrors() as $notFileSpecificError) {
            $style->writeln(\sprintf('?:?:%s', $notFileSpecificError));
        }
        foreach ($analysisResult->getFileSpecificErrors() as $fileSpecificError) {
            $style->writeln(\sprintf('%s:%d:%s', $fileSpecificError->getFile(), $fileSpecificError->getLine() ?? '?', $fileSpecificError->getMessage()));
        }
        return 1;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Command\ErrorFormatter;

use PHPStan\Command\AnalyseCommand;
use PHPStan\Command\AnalysisResult;
use PHPStan\File\RelativePathHelper;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Style\OutputStyle;
class TableErrorFormatter implements \PHPStan\Command\ErrorFormatter\ErrorFormatter
{
    /** @var RelativePathHelper */
    private $relativePathHelper;
    public function __construct(\PHPStan\File\RelativePathHelper $relativePathHelper)
    {
        $this->relativePathHelper = $relativePathHelper;
    }
    public function formatErrors(\PHPStan\Command\AnalysisResult $analysisResult, \_HumbugBoxb94336daae36\Symfony\Component\Console\Style\OutputStyle $style) : int
    {
        if (!$analysisResult->hasErrors()) {
            $style->success('No errors');
            if ($analysisResult->isDefaultLevelUsed()) {
                $style->note(\sprintf('PHPStan is performing only the most basic checks. You can pass a higher rule level through the --%s option (the default and current level is %d) to analyse code more thoroughly.', \PHPStan\Command\AnalyseCommand::OPTION_LEVEL, \PHPStan\Command\AnalyseCommand::DEFAULT_LEVEL));
            }
            return 0;
        }
        /** @var array<string, \PHPStan\Analyser\Error[]> $fileErrors */
        $fileErrors = [];
        foreach ($analysisResult->getFileSpecificErrors() as $fileSpecificError) {
            if (!isset($fileErrors[$fileSpecificError->getFile()])) {
                $fileErrors[$fileSpecificError->getFile()] = [];
            }
            $fileErrors[$fileSpecificError->getFile()][] = $fileSpecificError;
        }
        foreach ($fileErrors as $file => $errors) {
            $rows = [];
            foreach ($errors as $error) {
                $rows[] = [(string) $error->getLine(), $error->getMessage()];
            }
            $relativeFilePath = $this->relativePathHelper->getRelativePath($file);
            $style->table(['Line', $relativeFilePath], $rows);
        }
        if (\count($analysisResult->getNotFileSpecificErrors()) > 0) {
            $style->table(['Error'], \array_map(static function (string $error) : array {
                return [$error];
            }, $analysisResult->getNotFileSpecificErrors()));
        }
        $style->error(\sprintf($analysisResult->getTotalErrorsCount() === 1 ? 'Found %d error' : 'Found %d errors', $analysisResult->getTotalErrorsCount()));
        return 1;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Command\ErrorFormatter;

use PHPStan\Command\AnalysisResult;
interface ErrorFormatter
{
    /**
     * Formats the errors and outputs them to the console.
     *
     * @param \PHPStan\Command\AnalysisResult $analysisResult
     * @param \Symfony\Component\Console\Style\OutputStyle $style
     * @return int Error code.
     */
    public function formatErrors(\PHPStan\Command\AnalysisResult $analysisResult, \_HumbugBoxb94336daae36\Symfony\Component\Console\Style\OutputStyle $style) : int;
}
<?php

declare (strict_types=1);
namespace PHPStan\Command\ErrorFormatter;

use PHPStan\Command\AnalysisResult;
use PHPStan\File\RelativePathHelper;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Style\OutputStyle;
class CheckstyleErrorFormatter implements \PHPStan\Command\ErrorFormatter\ErrorFormatter
{
    /** @var RelativePathHelper */
    private $relativePathHelper;
    public function __construct(\PHPStan\File\RelativePathHelper $relativePathHelper)
    {
        $this->relativePathHelper = $relativePathHelper;
    }
    /**
     * Formats the errors and outputs them to the console.
     *
     * @param \PHPStan\Command\AnalysisResult $analysisResult
     * @param \Symfony\Component\Console\Style\OutputStyle $style
     * @return int Error code.
     */
    public function formatErrors(\PHPStan\Command\AnalysisResult $analysisResult, \_HumbugBoxb94336daae36\Symfony\Component\Console\Style\OutputStyle $style) : int
    {
        $style->writeln('<?xml version="1.0" encoding="UTF-8"?>');
        $style->writeln('<checkstyle>');
        foreach ($this->groupByFile($analysisResult) as $relativeFilePath => $errors) {
            $style->writeln(\sprintf('<file name="%s">', $this->escape($relativeFilePath)));
            foreach ($errors as $error) {
                $style->writeln(\sprintf('  <error line="%d" column="1" severity="error" message="%s" />', $this->escape((string) $error->getLine()), $this->escape((string) $error->getMessage())));
            }
            $style->writeln('</file>');
        }
        $notFileSpecificErrors = $analysisResult->getNotFileSpecificErrors();
        if (\count($notFileSpecificErrors) > 0) {
            $style->writeln('<file>');
            foreach ($notFileSpecificErrors as $error) {
                $style->writeln(\sprintf('  <error severity="error" message="%s" />', $this->escape($error)));
            }
            $style->writeln('</file>');
        }
        $style->writeln('</checkstyle>');
        return $analysisResult->hasErrors() ? 1 : 0;
    }
    /**
     * Escapes values for using in XML
     *
     * @param string $string
     * @return string
     */
    protected function escape(string $string) : string
    {
        return \htmlspecialchars($string, \ENT_XML1 | \ENT_COMPAT, 'UTF-8');
    }
    /**
     * Group errors by file
     *
     * @param AnalysisResult $analysisResult
     * @return array<string, array> Array that have as key the relative path of file
     *                              and as value an array with occured errors.
     */
    private function groupByFile(\PHPStan\Command\AnalysisResult $analysisResult) : array
    {
        $files = [];
        /** @var \PHPStan\Analyser\Error $fileSpecificError */
        foreach ($analysisResult->getFileSpecificErrors() as $fileSpecificError) {
            $relativeFilePath = $this->relativePathHelper->getRelativePath($fileSpecificError->getFile());
            $files[$relativeFilePath][] = $fileSpecificError;
        }
        return $files;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Command;

use PHPStan\Analyser\Error;
class AnalysisResult
{
    /** @var \PHPStan\Analyser\Error[] sorted by their file name, line number and message */
    private $fileSpecificErrors;
    /** @var string[] */
    private $notFileSpecificErrors;
    /** @var bool */
    private $defaultLevelUsed;
    /** @var string */
    private $currentDirectory;
    /**
     * @param \PHPStan\Analyser\Error[] $fileSpecificErrors
     * @param string[] $notFileSpecificErrors
     * @param bool $defaultLevelUsed
     * @param string $currentDirectory
     */
    public function __construct(array $fileSpecificErrors, array $notFileSpecificErrors, bool $defaultLevelUsed, string $currentDirectory)
    {
        \usort($fileSpecificErrors, static function (\PHPStan\Analyser\Error $a, \PHPStan\Analyser\Error $b) : int {
            return [$a->getFile(), $a->getLine(), $a->getMessage()] <=> [$b->getFile(), $b->getLine(), $b->getMessage()];
        });
        $this->fileSpecificErrors = $fileSpecificErrors;
        $this->notFileSpecificErrors = $notFileSpecificErrors;
        $this->defaultLevelUsed = $defaultLevelUsed;
        $this->currentDirectory = $currentDirectory;
    }
    public function hasErrors() : bool
    {
        return $this->getTotalErrorsCount() > 0;
    }
    public function getTotalErrorsCount() : int
    {
        return \count($this->fileSpecificErrors) + \count($this->notFileSpecificErrors);
    }
    /**
     * @return \PHPStan\Analyser\Error[] sorted by their file name, line number and message
     */
    public function getFileSpecificErrors() : array
    {
        return $this->fileSpecificErrors;
    }
    /**
     * @return string[]
     */
    public function getNotFileSpecificErrors() : array
    {
        return $this->notFileSpecificErrors;
    }
    public function isDefaultLevelUsed() : bool
    {
        return $this->defaultLevelUsed;
    }
    /**
     * @deprecated Use \PHPStan\File\RelativePathHelper instead
     * @return string
     */
    public function getCurrentDirectory() : string
    {
        return $this->currentDirectory;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Command;

use PHPStan\Command\ErrorFormatter\ErrorFormatter;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
class AnalyseCommand extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command
{
    private const NAME = 'analyse';
    public const OPTION_LEVEL = 'level';
    public const DEFAULT_LEVEL = \PHPStan\Command\CommandHelper::DEFAULT_LEVEL;
    protected function configure() : void
    {
        $this->setName(self::NAME)->setDescription('Analyses source code')->setDefinition([new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument('paths', \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument::OPTIONAL | \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument::IS_ARRAY, 'Paths with source code to run analysis on'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption('paths-file', null, \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_REQUIRED, 'Path to a file with a list of paths to run analysis on'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption('configuration', 'c', \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_REQUIRED, 'Path to project configuration file'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption(self::OPTION_LEVEL, 'l', \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_REQUIRED, 'Level of rule options - the higher the stricter'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption(\PHPStan\Command\ErrorsConsoleStyle::OPTION_NO_PROGRESS, null, \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_NONE, 'Do not show progress bar, only results'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption('debug', null, \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_NONE, 'Show debug information - which file is analysed, do not catch internal errors'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption('autoload-file', 'a', \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_REQUIRED, 'Project\'s additional autoload file path'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption('error-format', null, \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_REQUIRED, 'Format in which to print the result of the analysis', 'table'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption('memory-limit', null, \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_REQUIRED, 'Memory limit for analysis')]);
    }
    /**
     * @return string[]
     */
    public function getAliases() : array
    {
        return ['analyze'];
    }
    protected function initialize(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output) : void
    {
        if ((bool) $input->getOption('debug')) {
            $this->getApplication()->setCatchExceptions(\false);
            return;
        }
    }
    protected function execute(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output) : int
    {
        $paths = $input->getArgument('paths');
        $memoryLimit = $input->getOption('memory-limit');
        $autoloadFile = $input->getOption('autoload-file');
        $configuration = $input->getOption('configuration');
        $level = $input->getOption(self::OPTION_LEVEL);
        $pathsFile = $input->getOption('paths-file');
        if (!\is_array($paths) || !\is_string($memoryLimit) && $memoryLimit !== null || !\is_string($autoloadFile) && $autoloadFile !== null || !\is_string($configuration) && $configuration !== null || !\is_string($level) && $level !== null || !\is_string($pathsFile) && $pathsFile !== null) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        try {
            $inceptionResult = \PHPStan\Command\CommandHelper::begin($input, $output, $paths, $pathsFile, $memoryLimit, $autoloadFile, $configuration, $level);
        } catch (\PHPStan\Command\InceptionNotSuccessfulException $e) {
            return 1;
        }
        $errorOutput = $inceptionResult->getErrorOutput();
        $errorFormat = $input->getOption('error-format');
        if (!\is_string($errorFormat) && $errorFormat !== null) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        $container = $inceptionResult->getContainer();
        $errorFormatterServiceName = \sprintf('errorFormatter.%s', $errorFormat);
        if (!$container->hasService($errorFormatterServiceName)) {
            $errorOutput->writeln(\sprintf('Error formatter "%s" not found. Available error formatters are: %s', $errorFormat, \implode(', ', \array_map(static function (string $name) : string {
                return \substr($name, \strlen('errorFormatter.'));
            }, $container->findByType(\PHPStan\Command\ErrorFormatter\ErrorFormatter::class)))));
            return 1;
        }
        /** @var ErrorFormatter $errorFormatter */
        $errorFormatter = $container->getService($errorFormatterServiceName);
        /** @var AnalyseApplication  $application */
        $application = $container->getByType(\PHPStan\Command\AnalyseApplication::class);
        $debug = $input->getOption('debug');
        if (!\is_bool($debug)) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $inceptionResult->handleReturn($application->analyse($inceptionResult->getFiles(), $inceptionResult->isOnlyFiles(), $inceptionResult->getConsoleStyle(), $errorFormatter, $inceptionResult->isDefaultLevelUsed(), $debug));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Command;

class InceptionNotSuccessfulException extends \Exception
{
}
<?php

declare (strict_types=1);
namespace PHPStan\Command;

use _HumbugBoxb94336daae36\Nette\Utils\Json;
use PHPStan\Dependency\DependencyDumper;
use PHPStan\File\FileHelper;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
class DumpDependenciesCommand extends \_HumbugBoxb94336daae36\Symfony\Component\Console\Command\Command
{
    private const NAME = 'dump-deps';
    protected function configure() : void
    {
        $this->setName(self::NAME)->setDescription('Dumps files dependency tree')->setDefinition([new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument('paths', \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument::OPTIONAL | \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputArgument::IS_ARRAY, 'Paths with source code to run dump on'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption('paths-file', null, \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_REQUIRED, 'Path to a file with a list of paths to run analysis on'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption('configuration', 'c', \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_REQUIRED, 'Path to project configuration file'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption(\PHPStan\Command\ErrorsConsoleStyle::OPTION_NO_PROGRESS, null, \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_NONE, 'Do not show progress bar, only results'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption('autoload-file', 'a', \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_REQUIRED, 'Project\'s additional autoload file path'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption('memory-limit', null, \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_REQUIRED, 'Memory limit for the run'), new \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption('analysed-paths', null, \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_IS_ARRAY | \_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputOption::VALUE_REQUIRED, 'Project-scope paths')]);
    }
    protected function execute(\_HumbugBoxb94336daae36\Symfony\Component\Console\Input\InputInterface $input, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $output) : int
    {
        try {
            /** @var string[] $paths */
            $paths = $input->getArgument('paths');
            /** @var string|null $memoryLimit */
            $memoryLimit = $input->getOption('memory-limit');
            /** @var string|null $autoloadFile */
            $autoloadFile = $input->getOption('autoload-file');
            /** @var string|null $configurationFile */
            $configurationFile = $input->getOption('configuration');
            /** @var string|null $pathsFile */
            $pathsFile = $input->getOption('paths-file');
            $inceptionResult = \PHPStan\Command\CommandHelper::begin($input, $output, $paths, $pathsFile, $memoryLimit, $autoloadFile, $configurationFile, '0');
        } catch (\PHPStan\Command\InceptionNotSuccessfulException $e) {
            return 1;
        }
        $consoleStyle = $inceptionResult->getConsoleStyle();
        /** @var DependencyDumper $dependencyDumper */
        $dependencyDumper = $inceptionResult->getContainer()->getByType(\PHPStan\Dependency\DependencyDumper::class);
        /** @var FileHelper $fileHelper */
        $fileHelper = $inceptionResult->getContainer()->getByType(\PHPStan\File\FileHelper::class);
        /** @var string[] $analysedPaths */
        $analysedPaths = $input->getOption('analysed-paths');
        $analysedPaths = \array_map(static function (string $path) use($fileHelper) : string {
            return $fileHelper->absolutizePath($path);
        }, $analysedPaths);
        $dependencies = $dependencyDumper->dumpDependencies($inceptionResult->getFiles(), static function (int $count) use($consoleStyle) : void {
            $consoleStyle->progressStart($count);
        }, static function () use($consoleStyle) : void {
            $consoleStyle->progressAdvance();
        }, \count($analysedPaths) > 0 ? $analysedPaths : null);
        $consoleStyle->progressFinish();
        $consoleStyle->writeln(\_HumbugBoxb94336daae36\Nette\Utils\Json::encode($dependencies, \_HumbugBoxb94336daae36\Nette\Utils\Json::PRETTY));
        return $inceptionResult->handleReturn(0);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Command;

use PHPStan\Analyser\Analyser;
use PHPStan\Command\ErrorFormatter\ErrorFormatter;
use PHPStan\File\FileHelper;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Style\OutputStyle;
class AnalyseApplication
{
    /** @var \PHPStan\Analyser\Analyser */
    private $analyser;
    /** @var string */
    private $memoryLimitFile;
    /** @var \PHPStan\File\FileHelper */
    private $fileHelper;
    /** @var string */
    private $currentWorkingDirectory;
    public function __construct(\PHPStan\Analyser\Analyser $analyser, string $memoryLimitFile, \PHPStan\File\FileHelper $fileHelper, string $currentWorkingDirectory)
    {
        $this->analyser = $analyser;
        $this->memoryLimitFile = $memoryLimitFile;
        $this->fileHelper = $fileHelper;
        $this->currentWorkingDirectory = $currentWorkingDirectory;
    }
    /**
     * @param string[] $files
     * @param bool $onlyFiles
     * @param \Symfony\Component\Console\Style\OutputStyle $style
     * @param \PHPStan\Command\ErrorFormatter\ErrorFormatter $errorFormatter
     * @param bool $defaultLevelUsed
     * @param bool $debug
     * @return int Error code.
     */
    public function analyse(array $files, bool $onlyFiles, \_HumbugBoxb94336daae36\Symfony\Component\Console\Style\OutputStyle $style, \PHPStan\Command\ErrorFormatter\ErrorFormatter $errorFormatter, bool $defaultLevelUsed, bool $debug) : int
    {
        $this->updateMemoryLimitFile();
        $errors = [];
        if (!$debug) {
            $progressStarted = \false;
            $fileOrder = 0;
            $preFileCallback = null;
            $postFileCallback = function () use($style, &$progressStarted, $files, &$fileOrder) : void {
                if (!$progressStarted) {
                    $style->progressStart(\count($files));
                    $progressStarted = \true;
                }
                $style->progressAdvance();
                if ($fileOrder % 100 === 0) {
                    $this->updateMemoryLimitFile();
                }
                $fileOrder++;
            };
        } else {
            $preFileCallback = static function (string $file) use($style) : void {
                $style->writeln($file);
            };
            $postFileCallback = null;
        }
        $errors = \array_merge($errors, $this->analyser->analyse($files, $onlyFiles, $preFileCallback, $postFileCallback, $debug));
        if (isset($progressStarted) && $progressStarted) {
            $style->progressFinish();
        }
        $fileSpecificErrors = [];
        $notFileSpecificErrors = [];
        foreach ($errors as $error) {
            if (\is_string($error)) {
                $notFileSpecificErrors[] = $error;
            } else {
                $fileSpecificErrors[] = $error;
            }
        }
        return $errorFormatter->formatErrors(new \PHPStan\Command\AnalysisResult($fileSpecificErrors, $notFileSpecificErrors, $defaultLevelUsed, $this->fileHelper->normalizePath($this->currentWorkingDirectory)), $style);
    }
    private function updateMemoryLimitFile() : void
    {
        $bytes = \memory_get_peak_usage(\true);
        $megabytes = \ceil($bytes / 1024 / 1024);
        \file_put_contents($this->memoryLimitFile, \sprintf('%d MB', $megabytes));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Command;

use _HumbugBoxb94336daae36\Nette\DI\Container;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface;
use _HumbugBoxb94336daae36\Symfony\Component\Console\Style\OutputStyle;
class InceptionResult
{
    /** @var string[] */
    private $files;
    /** @var bool */
    private $onlyFiles;
    /** @var OutputStyle */
    private $consoleStyle;
    /** @var OutputInterface */
    private $errorOutput;
    /** @var Container */
    private $container;
    /** @var bool */
    private $isDefaultLevelUsed;
    /** @var string */
    private $memoryLimitFile;
    /**
     * @param string[] $files
     * @param bool $onlyFiles
     * @param OutputStyle $consoleStyle
     * @param OutputInterface $errorOutput
     * @param Container $container
     * @param bool $isDefaultLevelUsed
     * @param string $memoryLimitFile
     */
    public function __construct(array $files, bool $onlyFiles, \_HumbugBoxb94336daae36\Symfony\Component\Console\Style\OutputStyle $consoleStyle, \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface $errorOutput, \_HumbugBoxb94336daae36\Nette\DI\Container $container, bool $isDefaultLevelUsed, string $memoryLimitFile)
    {
        $this->files = $files;
        $this->onlyFiles = $onlyFiles;
        $this->consoleStyle = $consoleStyle;
        $this->errorOutput = $errorOutput;
        $this->container = $container;
        $this->isDefaultLevelUsed = $isDefaultLevelUsed;
        $this->memoryLimitFile = $memoryLimitFile;
    }
    /**
     * @return string[]
     */
    public function getFiles() : array
    {
        return $this->files;
    }
    public function isOnlyFiles() : bool
    {
        return $this->onlyFiles;
    }
    public function getConsoleStyle() : \_HumbugBoxb94336daae36\Symfony\Component\Console\Style\OutputStyle
    {
        return $this->consoleStyle;
    }
    public function getErrorOutput() : \_HumbugBoxb94336daae36\Symfony\Component\Console\Output\OutputInterface
    {
        return $this->errorOutput;
    }
    public function getContainer() : \_HumbugBoxb94336daae36\Nette\DI\Container
    {
        return $this->container;
    }
    public function isDefaultLevelUsed() : bool
    {
        return $this->isDefaultLevelUsed;
    }
    public function handleReturn(int $exitCode) : int
    {
        @\unlink($this->memoryLimitFile);
        return $exitCode;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Node;

class InClassMethodNode extends \PhpParser\Node\Stmt implements \PHPStan\Node\VirtualNode
{
    /** @var \PhpParser\Node\Stmt\ClassMethod */
    private $originalNode;
    public function __construct(\PhpParser\Node\Stmt\ClassMethod $originalNode)
    {
        parent::__construct($originalNode->getAttributes());
        $this->originalNode = $originalNode;
    }
    public function getOriginalNode() : \PhpParser\Node\Stmt\ClassMethod
    {
        return $this->originalNode;
    }
    public function getType() : string
    {
        return 'PHPStan_Stmt_InClassMethodNode';
    }
    public function getSubNodeNames() : array
    {
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Node;

use PhpParser\Node\Expr\Closure;
use PhpParser\NodeAbstract;
use PHPStan\Analyser\StatementResult;
class ClosureReturnStatementsNode extends \PhpParser\NodeAbstract implements \PHPStan\Node\VirtualNode
{
    /** @var \PhpParser\Node\Expr\Closure */
    private $closureExpr;
    /** @var \PHPStan\Node\ReturnStatement[] */
    private $returnStatements;
    /** @var StatementResult */
    private $statementResult;
    /**
     * @param \PhpParser\Node\Expr\Closure $closureExpr
     * @param \PHPStan\Node\ReturnStatement[] $returnStatements
     * @param \PHPStan\Analyser\StatementResult $statementResult
     */
    public function __construct(\PhpParser\Node\Expr\Closure $closureExpr, array $returnStatements, \PHPStan\Analyser\StatementResult $statementResult)
    {
        parent::__construct($closureExpr->getAttributes());
        $this->closureExpr = $closureExpr;
        $this->returnStatements = $returnStatements;
        $this->statementResult = $statementResult;
    }
    public function getClosureExpr() : \PhpParser\Node\Expr\Closure
    {
        return $this->closureExpr;
    }
    /**
     * @return \PHPStan\Node\ReturnStatement[]
     */
    public function getReturnStatements() : array
    {
        return $this->returnStatements;
    }
    public function getStatementResult() : \PHPStan\Analyser\StatementResult
    {
        return $this->statementResult;
    }
    public function getType() : string
    {
        return 'PHPStan_Node_ClosureReturnStatementsNode';
    }
    public function getSubNodeNames() : array
    {
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Node;

use PhpParser\Node\Stmt\Return_;
use PHPStan\Analyser\Scope;
class ReturnStatement
{
    /** @var Scope */
    private $scope;
    /** @var \PhpParser\Node\Stmt\Return_ */
    private $returnNode;
    public function __construct(\PHPStan\Analyser\Scope $scope, \PhpParser\Node\Stmt\Return_ $returnNode)
    {
        $this->scope = $scope;
        $this->returnNode = $returnNode;
    }
    public function getScope() : \PHPStan\Analyser\Scope
    {
        return $this->scope;
    }
    public function getReturnNode() : \PhpParser\Node\Stmt\Return_
    {
        return $this->returnNode;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Node;

use PhpParser\Node;
interface VirtualNode extends \PhpParser\Node
{
}
<?php

declare (strict_types=1);
namespace PHPStan\Node;

use PhpParser\Node\Expr\Array_;
use PhpParser\NodeAbstract;
class LiteralArrayNode extends \PhpParser\NodeAbstract implements \PHPStan\Node\VirtualNode
{
    /** @var LiteralArrayItem[] */
    private $itemNodes;
    /**
     * @param Array_ $originalNode
     * @param LiteralArrayItem[] $itemNodes
     */
    public function __construct(\PhpParser\Node\Expr\Array_ $originalNode, array $itemNodes)
    {
        parent::__construct($originalNode->getAttributes());
        $this->itemNodes = $itemNodes;
    }
    /**
     * @return LiteralArrayItem[]
     */
    public function getItemNodes() : array
    {
        return $this->itemNodes;
    }
    public function getType() : string
    {
        return 'PHPStan_Node_LiteralArray';
    }
    public function getSubNodeNames() : array
    {
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Node;

use PhpParser\Node\Expr\ArrayItem;
use PHPStan\Analyser\Scope;
class LiteralArrayItem
{
    /** @var Scope */
    private $scope;
    /** @var ArrayItem */
    private $arrayItem;
    public function __construct(\PHPStan\Analyser\Scope $scope, \PhpParser\Node\Expr\ArrayItem $arrayItem)
    {
        $this->scope = $scope;
        $this->arrayItem = $arrayItem;
    }
    public function getScope() : \PHPStan\Analyser\Scope
    {
        return $this->scope;
    }
    public function getArrayItem() : \PhpParser\Node\Expr\ArrayItem
    {
        return $this->arrayItem;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Node;

use PhpParser\Node\Stmt;
class UnreachableStatementNode extends \PhpParser\Node\Stmt implements \PHPStan\Node\VirtualNode
{
    /** @var Stmt */
    private $originalStatement;
    public function __construct(\PhpParser\Node\Stmt $originalStatement)
    {
        parent::__construct($originalStatement->getAttributes());
        $this->originalStatement = $originalStatement;
    }
    public function getOriginalStatement() : \PhpParser\Node\Stmt
    {
        return $this->originalStatement;
    }
    public function getType() : string
    {
        return 'PHPStan_Stmt_UnreachableStatementNode';
    }
    public function getSubNodeNames() : array
    {
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Node;

use PhpParser\Node;
use PhpParser\NodeAbstract;
use PHPStan\Analyser\StatementResult;
class ExecutionEndNode extends \PhpParser\NodeAbstract implements \PHPStan\Node\VirtualNode
{
    /** @var Node */
    private $node;
    /** @var StatementResult */
    private $statementResult;
    /** @var bool */
    private $hasNativeReturnTypehint;
    public function __construct(\PhpParser\Node $node, \PHPStan\Analyser\StatementResult $statementResult, bool $hasNativeReturnTypehint)
    {
        parent::__construct($node->getAttributes());
        $this->node = $node;
        $this->statementResult = $statementResult;
        $this->hasNativeReturnTypehint = $hasNativeReturnTypehint;
    }
    public function getNode() : \PhpParser\Node
    {
        return $this->node;
    }
    public function getStatementResult() : \PHPStan\Analyser\StatementResult
    {
        return $this->statementResult;
    }
    public function hasNativeReturnTypehint() : bool
    {
        return $this->hasNativeReturnTypehint;
    }
    public function getType() : string
    {
        return 'PHPStan_Node_ExecutionEndNode';
    }
    public function getSubNodeNames() : array
    {
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\DependencyInjection;

use _HumbugBoxb94336daae36\Nette\Schema\Expect;
use PHPStan\Rules\RegistryFactory;
class RulesExtension extends \_HumbugBoxb94336daae36\Nette\DI\CompilerExtension
{
    public function getConfigSchema() : \_HumbugBoxb94336daae36\Nette\Schema\Schema
    {
        return \_HumbugBoxb94336daae36\Nette\Schema\Expect::listOf('string');
    }
    public function loadConfiguration() : void
    {
        /** @var mixed[] $config */
        $config = $this->config;
        $builder = $this->getContainerBuilder();
        foreach ($config as $key => $rule) {
            $builder->addDefinition($this->prefix((string) $key))->setFactory($rule)->setAutowired(\false)->addTag(\PHPStan\Rules\RegistryFactory::RULE_TAG);
        }
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\DependencyInjection;

use _HumbugBoxb94336daae36\Nette\DI\Extensions\PhpExtension;
use Phar;
use PHPStan\Broker\Broker;
use PHPStan\File\FileHelper;
use PHPStan\File\FuzzyRelativePathHelper;
class ContainerFactory
{
    /** @var string */
    private $currentWorkingDirectory;
    /** @var string */
    private $rootDirectory;
    /** @var string */
    private $configDirectory;
    public function __construct(string $currentWorkingDirectory)
    {
        $this->currentWorkingDirectory = $currentWorkingDirectory;
        $fileHelper = new \PHPStan\File\FileHelper($currentWorkingDirectory);
        $rootDir = __DIR__ . '/../..';
        $originalRootDir = $fileHelper->normalizePath($rootDir);
        if (\extension_loaded('phar')) {
            $pharPath = \Phar::running(\false);
            if ($pharPath !== '') {
                $rootDir = \dirname($pharPath);
            }
        }
        $this->rootDirectory = $fileHelper->normalizePath($rootDir);
        $this->configDirectory = $originalRootDir . '/conf';
    }
    /**
     * @param string $tempDirectory
     * @param string[] $additionalConfigFiles
     * @param string[] $analysedPaths
     * @return \Nette\DI\Container
     */
    public function create(string $tempDirectory, array $additionalConfigFiles, array $analysedPaths) : \_HumbugBoxb94336daae36\Nette\DI\Container
    {
        $configurator = new \PHPStan\DependencyInjection\Configurator(new \PHPStan\DependencyInjection\LoaderFactory($this->rootDirectory, $this->currentWorkingDirectory));
        $configurator->defaultExtensions = ['php' => \_HumbugBoxb94336daae36\Nette\DI\Extensions\PhpExtension::class, 'extensions' => \_HumbugBoxb94336daae36\Nette\DI\Extensions\ExtensionsExtension::class];
        $configurator->setDebugMode(\true);
        $configurator->setTempDirectory($tempDirectory);
        $configurator->addParameters(['rootDir' => $this->rootDirectory, 'currentWorkingDirectory' => $this->currentWorkingDirectory, 'cliArgumentsVariablesRegistered' => \ini_get('register_argc_argv') === '1', 'tmpDir' => $tempDirectory]);
        $configurator->addConfig($this->configDirectory . '/config.neon');
        foreach ($additionalConfigFiles as $additionalConfigFile) {
            $configurator->addConfig($additionalConfigFile);
        }
        $configurator->addServices(['relativePathHelper' => new \PHPStan\File\FuzzyRelativePathHelper($this->currentWorkingDirectory, \DIRECTORY_SEPARATOR, $analysedPaths)]);
        $container = $configurator->createContainer();
        /** @var Broker $broker */
        $broker = $container->getService('broker');
        \PHPStan\Broker\Broker::registerInstance($broker);
        $container->getService('typeSpecifier');
        return $container;
    }
    public function getCurrentWorkingDirectory() : string
    {
        return $this->currentWorkingDirectory;
    }
    public function getRootDirectory() : string
    {
        return $this->rootDirectory;
    }
    public function getConfigDirectory() : string
    {
        return $this->configDirectory;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\DependencyInjection;

interface Container
{
    /**
     * @param string $serviceName
     * @return mixed
     */
    public function getService(string $serviceName);
    /**
     * @param string $className
     * @return mixed
     */
    public function getByType(string $className);
    /**
     * @param string $tagName
     * @return mixed[]
     */
    public function getServicesByTag(string $tagName) : array;
    /**
     * @param string $parameterName
     * @return mixed
     */
    public function getParameter(string $parameterName);
}
<?php

declare (strict_types=1);
namespace PHPStan\DependencyInjection;

use _HumbugBoxb94336daae36\Nette\DI\Config\Adapters\NeonAdapter;
use _HumbugBoxb94336daae36\Nette\DI\Config\Loader;
class LoaderFactory
{
    /** @var string */
    private $rootDir;
    /** @var string */
    private $currentWorkingDirectory;
    public function __construct(string $rootDir, string $currentWorkingDirectory)
    {
        $this->rootDir = $rootDir;
        $this->currentWorkingDirectory = $currentWorkingDirectory;
    }
    public function createLoader() : \_HumbugBoxb94336daae36\Nette\DI\Config\Loader
    {
        $loader = new \_HumbugBoxb94336daae36\Nette\DI\Config\Loader();
        $loader->addAdapter('dist', \_HumbugBoxb94336daae36\Nette\DI\Config\Adapters\NeonAdapter::class);
        $loader->setParameters(['rootDir' => $this->rootDir, 'currentWorkingDirectory' => $this->currentWorkingDirectory]);
        return $loader;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\DependencyInjection;

use _HumbugBoxb94336daae36\Nette\DI\Definitions\Statement;
use _HumbugBoxb94336daae36\Nette\Schema\Expect;
use _HumbugBoxb94336daae36\Nette\Schema\Schema;
class ParametersSchemaExtension extends \_HumbugBoxb94336daae36\Nette\DI\CompilerExtension
{
    public function getConfigSchema() : \_HumbugBoxb94336daae36\Nette\Schema\Schema
    {
        return \_HumbugBoxb94336daae36\Nette\Schema\Expect::arrayOf(\_HumbugBoxb94336daae36\Nette\Schema\Expect::type(\_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement::class))->min(1);
    }
    public function loadConfiguration() : void
    {
        $config = $this->config;
        $config['__parametersSchema'] = new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement(\_HumbugBoxb94336daae36\Nette\Schema\Schema::class);
        $builder = $this->getContainerBuilder();
        $builder->parameters['__parametersSchema'] = $this->processArgument(new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement('schema', [new \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement('structure', [$config])]));
    }
    /**
     * @param Statement[] $statements
     * @return \Nette\Schema\Schema
     */
    private function processSchema(array $statements) : \_HumbugBoxb94336daae36\Nette\Schema\Schema
    {
        if (\count($statements) === 0) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        $parameterSchema = null;
        foreach ($statements as $statement) {
            $processedArguments = \array_map(function ($argument) {
                return $this->processArgument($argument);
            }, $statement->arguments);
            if ($parameterSchema === null) {
                /** @var \Nette\Schema\Elements\Type|\Nette\Schema\Elements\AnyOf|\Nette\Schema\Elements\Structure $parameterSchema */
                $parameterSchema = \_HumbugBoxb94336daae36\Nette\Schema\Expect::{$statement->getEntity()}(...$processedArguments);
            } else {
                $parameterSchema->{$statement->getEntity()}(...$processedArguments);
            }
        }
        $parameterSchema->required();
        return $parameterSchema;
    }
    /**
     * @param mixed $argument
     * @return mixed
     */
    private function processArgument($argument)
    {
        if ($argument instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement) {
            if ($argument->entity === 'schema') {
                $arguments = [];
                foreach ($argument->arguments as $schemaArgument) {
                    if (!$schemaArgument instanceof \_HumbugBoxb94336daae36\Nette\DI\Definitions\Statement) {
                        throw new \PHPStan\ShouldNotHappenException('schema() should contain another statement().');
                    }
                    $arguments[] = $schemaArgument;
                }
                if (\count($arguments) === 0) {
                    throw new \PHPStan\ShouldNotHappenException('schema() should have at least one argument.');
                }
                return $this->processSchema($arguments);
            }
            return $this->processSchema([$argument]);
        } elseif (\is_array($argument)) {
            $processedArray = [];
            foreach ($argument as $key => $val) {
                $processedArray[$key] = $this->processArgument($val);
            }
            return $processedArray;
        }
        return $argument;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\DependencyInjection\Nette;

use PHPStan\DependencyInjection\Container;
class NetteContainer implements \PHPStan\DependencyInjection\Container
{
    /** @var \Nette\DI\Container */
    private $container;
    public function __construct(\_HumbugBoxb94336daae36\Nette\DI\Container $container)
    {
        $this->container = $container;
    }
    /**
     * @param string $serviceName
     * @return mixed
     */
    public function getService(string $serviceName)
    {
        return $this->container->getService($serviceName);
    }
    /**
     * @param string $className
     * @return mixed
     */
    public function getByType(string $className)
    {
        return $this->container->getByType($className);
    }
    /**
     * @param string $tagName
     * @return mixed[]
     */
    public function getServicesByTag(string $tagName) : array
    {
        return $this->tagsToServices($this->container->findByTag($tagName));
    }
    /**
     * @param string $parameterName
     * @return mixed
     */
    public function getParameter(string $parameterName)
    {
        return $this->container->parameters[$parameterName] ?? null;
    }
    /**
     * @param mixed[] $tags
     * @return mixed[]
     */
    private function tagsToServices(array $tags) : array
    {
        return \array_map(function (string $serviceName) {
            return $this->getService($serviceName);
        }, \array_keys($tags));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\DependencyInjection;

use _HumbugBoxb94336daae36\Nette;
use _HumbugBoxb94336daae36\Nette\Schema\Expect;
use PHPStan\Analyser\TypeSpecifierFactory;
use PHPStan\Broker\BrokerFactory;
use PHPStan\PhpDoc\TypeNodeResolverFactory;
use PHPStan\Rules\RegistryFactory;
class ConditionalTagsExtension extends \_HumbugBoxb94336daae36\Nette\DI\CompilerExtension
{
    public function getConfigSchema() : \_HumbugBoxb94336daae36\Nette\Schema\Schema
    {
        $bool = \_HumbugBoxb94336daae36\Nette\Schema\Expect::bool();
        return \_HumbugBoxb94336daae36\Nette\Schema\Expect::arrayOf(\_HumbugBoxb94336daae36\Nette\Schema\Expect::structure([\PHPStan\Broker\BrokerFactory::PROPERTIES_CLASS_REFLECTION_EXTENSION_TAG => $bool, \PHPStan\Broker\BrokerFactory::METHODS_CLASS_REFLECTION_EXTENSION_TAG => $bool, \PHPStan\Broker\BrokerFactory::DYNAMIC_METHOD_RETURN_TYPE_EXTENSION_TAG => $bool, \PHPStan\Broker\BrokerFactory::DYNAMIC_STATIC_METHOD_RETURN_TYPE_EXTENSION_TAG => $bool, \PHPStan\Broker\BrokerFactory::DYNAMIC_FUNCTION_RETURN_TYPE_EXTENSION_TAG => $bool, \PHPStan\Broker\BrokerFactory::OPERATOR_TYPE_SPECIFYING_EXTENSION_TAG => $bool, \PHPStan\Rules\RegistryFactory::RULE_TAG => $bool, \PHPStan\PhpDoc\TypeNodeResolverFactory::EXTENSION_TAG => $bool, \PHPStan\Analyser\TypeSpecifierFactory::FUNCTION_TYPE_SPECIFYING_EXTENSION_TAG => $bool, \PHPStan\Analyser\TypeSpecifierFactory::METHOD_TYPE_SPECIFYING_EXTENSION_TAG => $bool, \PHPStan\Analyser\TypeSpecifierFactory::STATIC_METHOD_TYPE_SPECIFYING_EXTENSION_TAG => $bool])->min(1));
    }
    public function beforeCompile() : void
    {
        /** @var mixed[] $config */
        $config = $this->config;
        $builder = $this->getContainerBuilder();
        foreach ($config as $type => $tags) {
            $services = $builder->findByType($type);
            if (\count($services) === 0) {
                throw new \PHPStan\ShouldNotHappenException(\sprintf('No services of type "%s" found.', $type));
            }
            foreach ($services as $service) {
                foreach ($tags as $tag => $parameter) {
                    if ((bool) $parameter) {
                        $service->addTag($tag);
                        continue;
                    }
                }
            }
        }
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\DependencyInjection;

use _HumbugBoxb94336daae36\Nette\DI\Config\Loader;
class Configurator extends \_HumbugBoxb94336daae36\Nette\Configurator
{
    /** @var LoaderFactory */
    private $loaderFactory;
    public function __construct(\PHPStan\DependencyInjection\LoaderFactory $loaderFactory)
    {
        $this->loaderFactory = $loaderFactory;
        parent::__construct();
    }
    protected function createLoader() : \_HumbugBoxb94336daae36\Nette\DI\Config\Loader
    {
        return $this->loaderFactory->createLoader();
    }
    /**
     * @return mixed[]
     */
    protected function getDefaultParameters() : array
    {
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan;

use PHPStan\Type\BooleanType;
use PHPStan\Type\Constant\ConstantBooleanType;
/**
 * @see https://en.wikipedia.org/wiki/Three-valued_logic
 */
class TrinaryLogic
{
    private const YES = 1;
    private const MAYBE = 0;
    private const NO = -1;
    /** @var int */
    private $value;
    /** @var self[] */
    private static $registry = [];
    private function __construct(int $value)
    {
        $this->value = $value;
    }
    public static function createYes() : self
    {
        return self::create(self::YES);
    }
    public static function createNo() : self
    {
        return self::create(self::NO);
    }
    public static function createMaybe() : self
    {
        return self::create(self::MAYBE);
    }
    public static function createFromBoolean(bool $value) : self
    {
        return self::create($value ? self::YES : self::NO);
    }
    private static function create(int $value) : self
    {
        self::$registry[$value] = self::$registry[$value] ?? new self($value);
        return self::$registry[$value];
    }
    public function yes() : bool
    {
        return $this->value === self::YES;
    }
    public function maybe() : bool
    {
        return $this->value === self::MAYBE;
    }
    public function no() : bool
    {
        return $this->value === self::NO;
    }
    public function toBooleanType() : \PHPStan\Type\BooleanType
    {
        if ($this->value === self::MAYBE) {
            return new \PHPStan\Type\BooleanType();
        }
        return new \PHPStan\Type\Constant\ConstantBooleanType($this->value === self::YES);
    }
    public function and(self ...$operands) : self
    {
        $operandValues = \array_column($operands, 'value');
        $operandValues[] = $this->value;
        return self::create(\min($operandValues));
    }
    public function or(self ...$operands) : self
    {
        $operandValues = \array_column($operands, 'value');
        $operandValues[] = $this->value;
        return self::create(\max($operandValues));
    }
    public static function extremeIdentity(self ...$operands) : self
    {
        $operandValues = \array_column($operands, 'value');
        $min = \min($operandValues);
        $max = \max($operandValues);
        return self::create($min === $max ? $min : self::MAYBE);
    }
    public static function maxMin(self ...$operands) : self
    {
        $operandValues = \array_column($operands, 'value');
        return self::create(\max($operandValues) > 0 ? \max($operandValues) : \min($operandValues));
    }
    public function negate() : self
    {
        return self::create(-$this->value);
    }
    public function equals(self $other) : bool
    {
        return $this === $other;
    }
    public function compareTo(self $other) : ?self
    {
        if ($this->value > $other->value) {
            return $this;
        } elseif ($other->value > $this->value) {
            return $other;
        }
        return null;
    }
    public function describe() : string
    {
        static $labels = [self::NO => 'No', self::MAYBE => 'Maybe', self::YES => 'Yes'];
        return $labels[$this->value];
    }
    /**
     * @param mixed[] $properties
     * @return self
     */
    public static function __set_state(array $properties) : self
    {
        return self::create($properties['value']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

use PHPStan\Type\Type;
interface ParametersAcceptor
{
    public const VARIADIC_FUNCTIONS = ['func_get_args', 'func_get_arg', 'func_num_args'];
    /**
     * @return array<int, \PHPStan\Reflection\ParameterReflection>
     */
    public function getParameters() : array;
    public function isVariadic() : bool;
    public function getReturnType() : \PHPStan\Type\Type;
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

use PHPStan\Type\Type;
class FunctionVariantWithPhpDocs extends \PHPStan\Reflection\FunctionVariant implements \PHPStan\Reflection\ParametersAcceptorWithPhpDocs
{
    /** @var Type */
    private $phpDocReturnType;
    /** @var Type */
    private $nativeReturnType;
    /**
     * @param array<int, \PHPStan\Reflection\ParameterReflectionWithPhpDocs> $parameters
     * @param bool $isVariadic
     * @param Type $returnType
     * @param Type $phpDocReturnType
     * @param Type $nativeReturnType
     */
    public function __construct(array $parameters, bool $isVariadic, \PHPStan\Type\Type $returnType, \PHPStan\Type\Type $phpDocReturnType, \PHPStan\Type\Type $nativeReturnType)
    {
        parent::__construct($parameters, $isVariadic, $returnType);
        $this->phpDocReturnType = $phpDocReturnType;
        $this->nativeReturnType = $nativeReturnType;
    }
    /**
     * @return array<int, \PHPStan\Reflection\ParameterReflectionWithPhpDocs>
     */
    public function getParameters() : array
    {
        /** @var \PHPStan\Reflection\ParameterReflectionWithPhpDocs[] $parameters */
        $parameters = parent::getParameters();
        return $parameters;
    }
    public function getPhpDocReturnType() : \PHPStan\Type\Type
    {
        return $this->phpDocReturnType;
    }
    public function getNativeReturnType() : \PHPStan\Type\Type
    {
        return $this->nativeReturnType;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

use PHPStan\Type\Type;
interface ParameterReflection
{
    public function getName() : string;
    public function isOptional() : bool;
    public function getType() : \PHPStan\Type\Type;
    public function passedByReference() : \PHPStan\Reflection\PassedByReference;
    public function isVariadic() : bool;
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

use PHPStan\Analyser\Scope;
use PHPStan\Reflection\Native\NativeParameterReflection;
use PHPStan\TrinaryLogic;
use PHPStan\Type\MixedType;
use PHPStan\Type\TypeCombinator;
class ParametersAcceptorSelector
{
    /**
     * @param ParametersAcceptor[] $parametersAcceptors
     * @return ParametersAcceptor
     */
    public static function selectSingle(array $parametersAcceptors) : \PHPStan\Reflection\ParametersAcceptor
    {
        if (\count($parametersAcceptors) !== 1) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $parametersAcceptors[0];
    }
    /**
     * @param Scope $scope
     * @param \PhpParser\Node\Arg[] $args
     * @param ParametersAcceptor[] $parametersAcceptors
     * @return ParametersAcceptor
     */
    public static function selectFromArgs(\PHPStan\Analyser\Scope $scope, array $args, array $parametersAcceptors) : \PHPStan\Reflection\ParametersAcceptor
    {
        if (\count($parametersAcceptors) === 1) {
            return $parametersAcceptors[0];
        }
        $types = [];
        $unpack = \false;
        foreach ($args as $arg) {
            $type = $scope->getType($arg->value);
            if ($arg->unpack) {
                $unpack = \true;
                $types[] = $type->getIterableValueType();
            } else {
                $types[] = $type;
            }
        }
        return self::selectFromTypes($types, $parametersAcceptors, $unpack);
    }
    /**
     * @param \PHPStan\Type\Type[] $types
     * @param ParametersAcceptor[] $parametersAcceptors
     * @param bool $unpack
     * @return ParametersAcceptor
     */
    public static function selectFromTypes(array $types, array $parametersAcceptors, bool $unpack) : \PHPStan\Reflection\ParametersAcceptor
    {
        if (\count($parametersAcceptors) === 1) {
            return $parametersAcceptors[0];
        }
        if (\count($parametersAcceptors) === 0) {
            throw new \PHPStan\ShouldNotHappenException('getVariants() must return at least one variant.');
        }
        $typesCount = \count($types);
        $acceptableAcceptors = [];
        foreach ($parametersAcceptors as $parametersAcceptor) {
            if ($unpack) {
                $acceptableAcceptors[] = $parametersAcceptor;
                continue;
            }
            $functionParametersMinCount = 0;
            $functionParametersMaxCount = 0;
            foreach ($parametersAcceptor->getParameters() as $parameter) {
                if (!$parameter->isOptional()) {
                    $functionParametersMinCount++;
                }
                $functionParametersMaxCount++;
            }
            if ($typesCount < $functionParametersMinCount) {
                continue;
            }
            if (!$parametersAcceptor->isVariadic() && $typesCount > $functionParametersMaxCount) {
                continue;
            }
            $acceptableAcceptors[] = $parametersAcceptor;
        }
        if (\count($acceptableAcceptors) === 0) {
            return self::combineAcceptors($parametersAcceptors);
        }
        if (\count($acceptableAcceptors) === 1) {
            return $acceptableAcceptors[0];
        }
        $winningAcceptors = [];
        $winningCertainty = null;
        foreach ($acceptableAcceptors as $acceptableAcceptor) {
            $isSuperType = \PHPStan\TrinaryLogic::createYes();
            foreach ($acceptableAcceptor->getParameters() as $i => $parameter) {
                if (!isset($types[$i])) {
                    if (!$unpack || \count($types) <= 0) {
                        break;
                    }
                    $type = $types[\count($types) - 1];
                } else {
                    $type = $types[$i];
                }
                if ($parameter->getType() instanceof \PHPStan\Type\MixedType) {
                    $isSuperType = $isSuperType->and(\PHPStan\TrinaryLogic::createMaybe());
                } else {
                    $isSuperType = $isSuperType->and($parameter->getType()->isSuperTypeOf($type));
                }
            }
            if ($isSuperType->no()) {
                continue;
            }
            if ($winningCertainty === null) {
                $winningAcceptors[] = $acceptableAcceptor;
                $winningCertainty = $isSuperType;
            } else {
                $comparison = $winningCertainty->compareTo($isSuperType);
                if ($comparison === $isSuperType) {
                    $winningAcceptors = [$acceptableAcceptor];
                    $winningCertainty = $isSuperType;
                } elseif ($comparison === null) {
                    $winningAcceptors[] = $acceptableAcceptor;
                }
            }
        }
        if (\count($winningAcceptors) === 0) {
            return self::combineAcceptors($acceptableAcceptors);
        }
        return self::combineAcceptors($winningAcceptors);
    }
    /**
     * @param ParametersAcceptor[] $acceptors
     * @return ParametersAcceptor
     */
    public static function combineAcceptors(array $acceptors) : \PHPStan\Reflection\ParametersAcceptor
    {
        if (\count($acceptors) === 0) {
            throw new \PHPStan\ShouldNotHappenException('getVariants() must return at least one variant.');
        }
        if (\count($acceptors) === 1) {
            return $acceptors[0];
        }
        $minimumNumberOfParameters = null;
        foreach ($acceptors as $acceptor) {
            $acceptorParametersMinCount = 0;
            foreach ($acceptor->getParameters() as $parameter) {
                if ($parameter->isOptional()) {
                    continue;
                }
                $acceptorParametersMinCount++;
            }
            if ($minimumNumberOfParameters !== null && $minimumNumberOfParameters <= $acceptorParametersMinCount) {
                continue;
            }
            $minimumNumberOfParameters = $acceptorParametersMinCount;
        }
        $parameters = [];
        $isVariadic = \false;
        $returnType = null;
        foreach ($acceptors as $acceptor) {
            if ($returnType === null) {
                $returnType = $acceptor->getReturnType();
            } else {
                $returnType = \PHPStan\Type\TypeCombinator::union($returnType, $acceptor->getReturnType());
            }
            $isVariadic = $isVariadic || $acceptor->isVariadic();
            foreach ($acceptor->getParameters() as $i => $parameter) {
                if (!isset($parameters[$i])) {
                    $parameters[$i] = new \PHPStan\Reflection\Native\NativeParameterReflection($parameter->getName(), $i + 1 > $minimumNumberOfParameters, $parameter->getType(), $parameter->passedByReference(), $parameter->isVariadic());
                    continue;
                }
                $isVariadic = $parameters[$i]->isVariadic() || $parameter->isVariadic();
                $parameters[$i] = new \PHPStan\Reflection\Native\NativeParameterReflection($parameters[$i]->getName() !== $parameter->getName() ? \sprintf('%s|%s', $parameters[$i]->getName(), $parameter->getName()) : $parameter->getName(), $i + 1 > $minimumNumberOfParameters, \PHPStan\Type\TypeCombinator::union($parameters[$i]->getType(), $parameter->getType()), $parameters[$i]->passedByReference()->combine($parameter->passedByReference()), $isVariadic);
                if ($isVariadic) {
                    $parameters = \array_slice($parameters, 0, $i + 1);
                    break;
                }
            }
        }
        return new \PHPStan\Reflection\FunctionVariant($parameters, $isVariadic, $returnType);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Dummy;

use PHPStan\Broker\Broker;
use PHPStan\Reflection\ClassMemberReflection;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\TrivialParametersAcceptor;
class DummyMethodReflection implements \PHPStan\Reflection\MethodReflection
{
    /** @var string */
    private $name;
    public function __construct(string $name)
    {
        $this->name = $name;
    }
    public function getDeclaringClass() : \PHPStan\Reflection\ClassReflection
    {
        $broker = \PHPStan\Broker\Broker::getInstance();
        return $broker->getClass(\stdClass::class);
    }
    public function isStatic() : bool
    {
        return \false;
    }
    public function isPrivate() : bool
    {
        return \false;
    }
    public function isPublic() : bool
    {
        return \true;
    }
    public function getName() : string
    {
        return $this->name;
    }
    public function getPrototype() : \PHPStan\Reflection\ClassMemberReflection
    {
        return $this;
    }
    /**
     * @return \PHPStan\Reflection\ParametersAcceptor[]
     */
    public function getVariants() : array
    {
        return [new \PHPStan\Reflection\TrivialParametersAcceptor()];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Dummy;

use PHPStan\Broker\Broker;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\ConstantReflection;
class DummyConstantReflection implements \PHPStan\Reflection\ConstantReflection
{
    /** @var string */
    private $name;
    public function __construct(string $name)
    {
        $this->name = $name;
    }
    public function getDeclaringClass() : \PHPStan\Reflection\ClassReflection
    {
        $broker = \PHPStan\Broker\Broker::getInstance();
        return $broker->getClass(\stdClass::class);
    }
    public function isStatic() : bool
    {
        return \true;
    }
    public function isPrivate() : bool
    {
        return \false;
    }
    public function isPublic() : bool
    {
        return \true;
    }
    public function getName() : string
    {
        return $this->name;
    }
    /**
     * @return mixed
     */
    public function getValue()
    {
        // so that Scope::getTypeFromValue() returns mixed
        return new \stdClass();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Dummy;

use PHPStan\Broker\Broker;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\PropertyReflection;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
class DummyPropertyReflection implements \PHPStan\Reflection\PropertyReflection
{
    public function getDeclaringClass() : \PHPStan\Reflection\ClassReflection
    {
        $broker = \PHPStan\Broker\Broker::getInstance();
        return $broker->getClass(\stdClass::class);
    }
    public function isStatic() : bool
    {
        return \false;
    }
    public function isPrivate() : bool
    {
        return \false;
    }
    public function isPublic() : bool
    {
        return \true;
    }
    public function getType() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\MixedType();
    }
    public function isReadable() : bool
    {
        return \true;
    }
    public function isWritable() : bool
    {
        return \true;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\SignatureMap;

class SignatureMapProvider
{
    /** @var \PHPStan\Reflection\SignatureMap\SignatureMapParser */
    private $parser;
    /** @var mixed[]|null */
    private static $signatureMap;
    public function __construct(\PHPStan\Reflection\SignatureMap\SignatureMapParser $parser)
    {
        $this->parser = $parser;
    }
    public function hasFunctionSignature(string $name) : bool
    {
        $signatureMap = self::getSignatureMap();
        return \array_key_exists($name, $signatureMap);
    }
    public function getFunctionSignature(string $functionName, ?string $className) : \PHPStan\Reflection\SignatureMap\FunctionSignature
    {
        if (!$this->hasFunctionSignature($functionName)) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        $signatureMap = self::getSignatureMap();
        return $this->parser->getFunctionSignature($signatureMap[$functionName], $className);
    }
    /**
     * @return mixed[]
     */
    private static function getSignatureMap() : array
    {
        if (self::$signatureMap === null) {
            $signatureMap = (require __DIR__ . '/functionMap.php');
            if (!\is_array($signatureMap)) {
                throw new \PHPStan\ShouldNotHappenException('Signature map could not be loaded.');
            }
            self::$signatureMap = $signatureMap;
        }
        return self::$signatureMap;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\SignatureMap;

use PHPStan\Type\Type;
class FunctionSignature
{
    /** @var \PHPStan\Reflection\SignatureMap\ParameterSignature[] */
    private $parameters;
    /** @var \PHPStan\Type\Type */
    private $returnType;
    /** @var bool */
    private $variadic;
    /**
     * @param array<int, \PHPStan\Reflection\SignatureMap\ParameterSignature> $parameters
     * @param \PHPStan\Type\Type $returnType
     * @param bool $variadic
     */
    public function __construct(array $parameters, \PHPStan\Type\Type $returnType, bool $variadic)
    {
        $this->parameters = $parameters;
        $this->returnType = $returnType;
        $this->variadic = $variadic;
    }
    /**
     * @return array<int, \PHPStan\Reflection\SignatureMap\ParameterSignature>
     */
    public function getParameters() : array
    {
        return $this->parameters;
    }
    public function getReturnType() : \PHPStan\Type\Type
    {
        return $this->returnType;
    }
    public function isVariadic() : bool
    {
        return $this->variadic;
    }
}
<?php

namespace _HumbugBoxb94336daae36;

// @codingStandardsIgnoreFile (phpcs runs out of memory)
/**
 * Copied over from https://github.com/phan/phan/blob/dbb7ea9bd049ebd116c0b08b043794c697486801/src/Phan/Language/Internal/FunctionSignatureMap.php
 * with some changes like removal of specific array keys and callable definitions
 * Copyright (c) 2015 Rasmus Lerdorf
 * Copyright (c) 2015 Andrew Morrison
 */
/**
 * Format
 *
 * '<function_name>' => ['<return_type>, '<arg_name>'=>'<arg_type>']
 * alternative signature for the same function
 * '<function_name\'1>' => ['<return_type>, '<arg_name>'=>'<arg_type>']
 *
 * A '&' in front of the <arg_name> means the arg is always passed by reference.
 * (i.e. ReflectionParameter->isPassedByReference())
 * This was previously only used in cases where the function actually created the
 * variable in the local scope.
 * Some reference arguments will have prefixes in <arg_name> to indicate the way the argument is used.
 * Currently, the only prefixes with meaning are 'rw_' (read-write) and 'w_' (write).
 * Those prefixes don't mean anything for non-references.
 * Code using these signatures should remove those prefixes from messages rendered to the user.
 * 1. '&rw_<arg_name>' indicates that a parameter with a value is expected to be passed in, and may be modified.
 *    Phan will warn if the variable has an incompatible type, or is undefined.
 * 2. '&w_<arg_name>' indicates that a parameter is expected to be passed in, and the value will be ignored, and may be overwritten.
 * 3. The absence of a prefix is treated by Phan the same way as having the prefix 'w_' (Some may be changed to 'rw_name'). These will have prefixes added later.
 *
 * So, for functions like sort() where technically the arg is by-ref,
 * indicate the reference param's signature by-ref and read-write,
 * as `'&rw_array'=>'array'`
 * so that Phan won't create it in the local scope
 *
 * However, for a function like preg_match() where the 3rd arg is an array of sub-pattern matches (and optional),
 * this arg needs to be marked as by-ref and write-only, as `'&w_matches='=>'array'`.
 *
 * A '=' following the <arg_name> indicates this arg is optional.
 *
 * The <arg_name> can begin with '...' to indicate the arg is variadic.
 * '...args=' indicates it is both variadic and optional.
 *
 * Some reference arguments will have prefixes in <arg_name> to indicate the way the argument is used.
 * Currently, the only prefixes with meaning are 'rw_' and 'w_'.
 * Code using these signatures should remove those prefixes from messages rendered to the user.
 * 1. '&rw_name' indicates that a parameter with a value is expected to be passed in, and may be modified.
 * 2. '&w_name' indicates that a parameter is expected to be passed in, and the value will be ignored, and may be overwritten.
 *
 * Sources of stub info:
 *
 * 1. Reflection
 * 2. docs.php.net's SVN repo or website, and examples (See internal/internalsignatures.php)
 * 3. Various websites documenting individual extensions
 * 4. PHPStorm stubs (For anything missing from the above sources)
 *    See internal/internalsignatures.php
 */
return ['_' => ['string', 'message' => 'string'], '__halt_compiler' => ['void'], 'abs' => ['int', 'number' => 'int'], 'abs\'1' => ['float', 'number' => 'float'], 'accelerator_get_configuration' => ['array'], 'accelerator_get_scripts' => ['array'], 'accelerator_get_status' => ['array', 'fetch_scripts' => 'bool'], 'accelerator_reset' => [''], 'accelerator_set_status' => ['void', 'status' => ''], 'acos' => ['float', 'number' => 'float'], 'acosh' => ['float', 'number' => 'float'], 'addcslashes' => ['string', 'str' => 'string', 'charlist' => 'string'], 'addslashes' => ['string', 'str' => 'string'], 'AMQPChannel::__construct' => ['void', 'amqp_connection' => 'AMQPConnection'], 'AMQPChannel::basicRecover' => ['', 'requeue=' => 'bool|true'], 'AMQPChannel::commitTransaction' => ['bool'], 'AMQPChannel::getChannelId' => ['int'], 'AMQPChannel::getConnection' => ['AMQPConnection'], 'AMQPChannel::getPrefetchCount' => ['int'], 'AMQPChannel::getPrefetchSize' => ['int'], 'AMQPChannel::isConnected' => ['bool'], 'AMQPChannel::qos' => ['bool', 'size' => 'int', 'count' => 'int'], 'AMQPChannel::rollbackTransaction' => ['bool'], 'AMQPChannel::setPrefetchCount' => ['bool', 'count' => 'int'], 'AMQPChannel::setPrefetchSize' => ['bool', 'size' => 'int'], 'AMQPChannel::startTransaction' => ['bool'], 'AMQPConnection::__construct' => ['void', 'credentials=' => 'array'], 'AMQPConnection::connect' => ['bool'], 'AMQPConnection::disconnect' => ['bool'], 'AMQPConnection::getHost' => ['string'], 'AMQPConnection::getLogin' => ['string'], 'AMQPConnection::getMaxChannels' => ['int|null'], 'AMQPConnection::getPassword' => ['string'], 'AMQPConnection::getPort' => ['int'], 'AMQPConnection::getReadTimeout' => ['float'], 'AMQPConnection::getTimeout' => ['float'], 'AMQPConnection::getUsedChannels' => ['int'], 'AMQPConnection::getVhost' => ['string'], 'AMQPConnection::getWriteTimeout' => ['float'], 'AMQPConnection::isConnected' => ['bool'], 'AMQPConnection::isPersistent' => ['bool|null'], 'AMQPConnection::pconnect' => ['bool'], 'AMQPConnection::pdisconnect' => ['bool'], 'AMQPConnection::preconnect' => ['bool'], 'AMQPConnection::reconnect' => ['bool'], 'AMQPConnection::setHost' => ['bool', 'host' => 'string'], 'AMQPConnection::setLogin' => ['bool', 'login' => 'string'], 'AMQPConnection::setPassword' => ['bool', 'password' => 'string'], 'AMQPConnection::setPort' => ['bool', 'port' => 'int'], 'AMQPConnection::setReadTimeout' => ['bool', 'timeout' => 'int'], 'AMQPConnection::setTimeout' => ['bool', 'timeout' => 'int'], 'AMQPConnection::setVhost' => ['bool', 'vhost' => 'string'], 'AMQPConnection::setWriteTimeout' => ['bool', 'timeout' => 'int'], 'AMQPEnvelope::getAppId' => ['string'], 'AMQPEnvelope::getBody' => ['string'], 'AMQPEnvelope::getContentEncoding' => ['string'], 'AMQPEnvelope::getContentType' => ['string'], 'AMQPEnvelope::getCorrelationId' => ['string'], 'AMQPEnvelope::getDeliveryMode' => ['int'], 'AMQPEnvelope::getDeliveryTag' => ['string'], 'AMQPEnvelope::getExchangeName' => ['string'], 'AMQPEnvelope::getExpiration' => ['string'], 'AMQPEnvelope::getHeader' => ['bool|string', 'header_key' => 'string'], 'AMQPEnvelope::getHeaders' => ['array'], 'AMQPEnvelope::getMessageId' => ['string'], 'AMQPEnvelope::getPriority' => ['int'], 'AMQPEnvelope::getReplyTo' => ['string'], 'AMQPEnvelope::getRoutingKey' => ['string'], 'AMQPEnvelope::getTimeStamp' => ['string'], 'AMQPEnvelope::getType' => ['string'], 'AMQPEnvelope::getUserId' => ['string'], 'AMQPEnvelope::isRedelivery' => ['bool'], 'AMQPExchange::__construct' => ['void', 'amqp_channel' => 'AMQPChannel'], 'AMQPExchange::bind' => ['bool', 'exchange_name' => 'string', 'routing_key=' => 'string', 'arguments=' => 'array'], 'AMQPExchange::declareExchange' => ['bool'], 'AMQPExchange::delete' => ['bool', 'exchangeName=' => 'string', 'flags=' => 'int'], 'AMQPExchange::getArgument' => ['bool|int|string', 'key' => 'string'], 'AMQPExchange::getArguments' => ['array'], 'AMQPExchange::getChannel' => ['AMQPChannel'], 'AMQPExchange::getConnection' => ['AMQPConnection'], 'AMQPExchange::getFlags' => ['int'], 'AMQPExchange::getName' => ['string'], 'AMQPExchange::getType' => ['string'], 'AMQPExchange::publish' => ['bool', 'message' => 'string', 'routing_key=' => 'string', 'flags=' => 'int', 'attributes=' => 'array'], 'AMQPExchange::setArgument' => ['bool', 'key' => 'string', 'value' => 'int|string'], 'AMQPExchange::setArguments' => ['bool', 'arguments' => 'array'], 'AMQPExchange::setFlags' => ['bool', 'flags' => 'int'], 'AMQPExchange::setName' => ['bool', 'exchange_name' => 'string'], 'AMQPExchange::setType' => ['bool', 'exchange_type' => 'string'], 'AMQPExchange::unbind' => ['bool', 'exchange_name' => 'string', 'routing_key=' => 'string', 'arguments=' => 'array'], 'AMQPQueue::__construct' => ['void', 'amqp_channel' => 'AMQPChannel'], 'AMQPQueue::ack' => ['bool', 'delivery_tag' => 'string', 'flags=' => 'int'], 'AMQPQueue::bind' => ['bool', 'exchange_name' => 'string', 'routing_key=' => 'string', 'arguments=' => 'array'], 'AMQPQueue::cancel' => ['bool', 'consumer_tag=' => 'string'], 'AMQPQueue::consume' => ['void', 'callback=' => '?callable', 'flags=' => 'int', 'consumerTag=' => 'string'], 'AMQPQueue::declareQueue' => ['int'], 'AMQPQueue::delete' => ['int', 'flags=' => 'int'], 'AMQPQueue::get' => ['AMQPEnvelope|bool', 'flags=' => 'int'], 'AMQPQueue::getArgument' => ['bool|int|string', 'key' => 'string'], 'AMQPQueue::getArguments' => ['array'], 'AMQPQueue::getChannel' => ['AMQPChannel'], 'AMQPQueue::getConnection' => ['AMQPConnection'], 'AMQPQueue::getFlags' => ['int'], 'AMQPQueue::getName' => ['string'], 'AMQPQueue::nack' => ['bool', 'delivery_tag' => 'string', 'flags=' => 'int'], 'AMQPQueue::purge' => ['bool'], 'AMQPQueue::reject' => ['bool', 'delivery_tag' => 'string', 'flags=' => 'int'], 'AMQPQueue::setArgument' => ['bool', 'key' => 'string', 'value' => 'mixed'], 'AMQPQueue::setArguments' => ['bool', 'arguments' => 'array'], 'AMQPQueue::setFlags' => ['bool', 'flags' => 'int'], 'AMQPQueue::setName' => ['bool', 'queue_name' => 'string'], 'AMQPQueue::unbind' => ['bool', 'exchange_name' => 'string', 'routing_key=' => 'string', 'arguments=' => 'array'], 'apache_child_terminate' => ['bool'], 'apache_get_modules' => ['array'], 'apache_get_version' => ['string|false'], 'apache_getenv' => ['string|false', 'variable' => 'string', 'walk_to_top=' => 'bool'], 'apache_lookup_uri' => ['object', 'filename' => 'string'], 'apache_note' => ['string|false', 'note_name' => 'string', 'note_value=' => 'string'], 'apache_request_headers' => ['array|false'], 'apache_reset_timeout' => ['bool'], 'apache_response_headers' => ['array|false'], 'apache_setenv' => ['bool', 'variable' => 'string', 'value' => 'string', 'walk_to_top=' => 'bool'], 'apc_add' => ['bool', 'key' => 'string', 'var' => 'mixed', 'ttl=' => 'int'], 'apc_add\'1' => ['array', 'values' => 'array', 'unused=' => '', 'ttl=' => 'int'], 'apc_bin_dump' => ['string', 'files=' => 'array', 'user_vars=' => 'array'], 'apc_bin_dumpfile' => ['int', 'files' => 'array', 'user_vars' => 'array', 'filename' => 'string', 'flags=' => 'int', 'context=' => 'resource'], 'apc_bin_load' => ['bool', 'data' => 'string', 'flags=' => 'int'], 'apc_bin_loadfile' => ['bool', 'filename' => 'string', 'context=' => 'resource', 'flags=' => 'int'], 'apc_cache_info' => ['array', 'cache_type=' => 'string', 'limited=' => 'bool'], 'apc_cas' => ['bool', 'key' => 'string', 'old' => 'int', 'new' => 'int'], 'apc_clear_cache' => ['bool', 'cache_type=' => 'string'], 'apc_compile_file' => ['mixed', 'filename' => 'string', 'atomic=' => 'bool'], 'apc_dec' => ['int', 'key' => 'string', 'step=' => 'int', '&w_success=' => 'bool'], 'apc_define_constants' => ['bool', 'key' => 'string', 'constants' => 'array', 'case_sensitive=' => 'bool'], 'apc_delete' => ['bool', 'key' => 'string|string[]|APCIterator'], 'apc_delete_file' => ['mixed', 'keys' => 'mixed'], 'apc_exists' => ['bool', 'keys' => 'string'], 'apc_exists\'1' => ['array', 'keys' => 'string[]'], 'apc_fetch' => ['mixed', 'key' => 'mixed', '&w_success=' => 'bool'], 'apc_inc' => ['int', 'key' => 'string', 'step=' => 'int', '&w_success=' => 'bool'], 'apc_load_constants' => ['bool', 'key' => 'string', 'case_sensitive=' => 'bool'], 'apc_sma_info' => ['array', 'limited=' => 'bool'], 'apc_store' => ['bool', 'key' => 'string', 'var' => '', 'ttl=' => 'int'], 'apc_store\'1' => ['array', 'values' => 'array', 'unused=' => '', 'ttl=' => 'int'], 'APCIterator::__construct' => ['void', 'cache' => 'string', 'search=' => '', 'format=' => 'int', 'chunk_size=' => 'int', 'list=' => 'int'], 'APCIterator::current' => ['mixed'], 'APCIterator::getTotalCount' => ['int'], 'APCIterator::getTotalHits' => ['int'], 'APCIterator::getTotalSize' => ['int'], 'APCIterator::key' => ['string'], 'APCIterator::next' => ['void'], 'APCIterator::rewind' => ['void'], 'APCIterator::valid' => ['bool'], 'apcu_add' => ['bool', 'key' => 'string', 'var' => '', 'ttl=' => 'int'], 'apcu_add\'1' => ['array<string,int>', 'values' => 'array<string,mixed>', 'unused=' => '', 'ttl=' => 'int'], 'apcu_cache_info' => ['array<string,mixed>', 'limited=' => 'bool'], 'apcu_cas' => ['bool', 'key' => 'string', 'old' => 'int', 'new' => 'int'], 'apcu_clear_cache' => ['bool'], 'apcu_dec' => ['int', 'key' => 'string', 'step=' => 'int', '&w_success=' => 'bool'], 'apcu_delete' => ['bool|array<int,string>', 'key' => 'string|string[]|APCUIterator'], 'apcu_entry' => ['mixed', 'key' => 'string', 'generator' => 'callable', 'ttl=' => 'int'], 'apcu_exists' => ['bool', 'keys' => 'string'], 'apcu_exists\'1' => ['array', 'keys' => 'string[]'], 'apcu_fetch' => ['mixed', 'key' => 'string|string[]', '&w_success=' => 'bool'], 'apcu_inc' => ['int', 'key' => 'string', 'step=' => 'int', '&w_success=' => 'bool'], 'apcu_sma_info' => ['array', 'limited=' => 'bool'], 'apcu_store' => ['bool', 'key' => 'string', 'var=' => '', 'ttl=' => 'int'], 'apcu_store\'1' => ['array', 'values' => 'array', 'unused=' => '', 'ttl=' => 'int'], 'APCUIterator::__construct' => ['void', 'search=' => 'string|string[]|null', 'format=' => 'int', 'chunk_size=' => 'int', 'list=' => 'int'], 'APCUIterator::current' => ['mixed'], 'APCUIterator::getTotalCount' => ['int'], 'APCUIterator::getTotalHits' => ['int'], 'APCUIterator::getTotalSize' => ['int'], 'APCUIterator::key' => ['string'], 'APCUIterator::next' => ['void'], 'APCUIterator::rewind' => ['void'], 'APCUIterator::valid' => ['bool'], 'apd_breakpoint' => ['bool', 'debug_level' => 'int'], 'apd_callstack' => ['array'], 'apd_clunk' => ['void', 'warning' => 'string', 'delimiter=' => 'string'], 'apd_continue' => ['bool', 'debug_level' => 'int'], 'apd_croak' => ['void', 'warning' => 'string', 'delimiter=' => 'string'], 'apd_dump_function_table' => ['void'], 'apd_dump_persistent_resources' => ['array'], 'apd_dump_regular_resources' => ['array'], 'apd_echo' => ['bool', 'output' => 'string'], 'apd_get_active_symbols' => ['array'], 'apd_set_pprof_trace' => ['string', 'dump_directory=' => 'string', 'fragment=' => 'string'], 'apd_set_session' => ['void', 'debug_level' => 'int'], 'apd_set_session_trace' => ['void', 'debug_level' => 'int', 'dump_directory=' => 'string'], 'apd_set_session_trace_socket' => ['bool', 'tcp_server' => 'string', 'socket_type' => 'int', 'port' => 'int', 'debug_level' => 'int'], 'AppendIterator::__construct' => ['void'], 'AppendIterator::append' => ['void', 'it' => 'iterator'], 'AppendIterator::current' => ['mixed'], 'AppendIterator::getArrayIterator' => ['ArrayIterator'], 'AppendIterator::getInnerIterator' => ['iterator'], 'AppendIterator::getIteratorIndex' => ['int'], 'AppendIterator::key' => ['mixed'], 'AppendIterator::next' => ['void'], 'AppendIterator::rewind' => ['void'], 'AppendIterator::valid' => ['bool'], 'array_change_key_case' => ['array', 'input' => 'array', 'case=' => 'int'], 'array_chunk' => ['array[]', 'input' => 'array', 'size' => 'int', 'preserve_keys=' => 'bool'], 'array_column' => ['array', 'array' => 'array', 'column_key' => 'mixed', 'index_key=' => 'mixed'], 'array_combine' => ['array|false', 'keys' => 'array', 'values' => 'array'], 'array_count_values' => ['int[]', 'input' => 'array'], 'array_diff' => ['array', 'arr1' => 'array', 'arr2' => 'array', '...args=' => 'array'], 'array_diff_assoc' => ['array', 'arr1' => 'array', 'arr2' => 'array', '...args=' => 'array'], 'array_diff_key' => ['array', 'arr1' => 'array', 'arr2' => 'array', '...args=' => 'array'], 'array_diff_uassoc' => ['array', 'arr1' => 'array', 'arr2' => 'array', 'data_comp_func' => 'callable'], 'array_diff_uassoc\'1' => ['array', 'arr1' => 'array', 'arr2' => 'array', 'arr3' => 'array', 'arg4' => 'array|callable', '...rest=' => 'array|callable'], 'array_diff_ukey' => ['array', 'arr1' => 'array', 'arr2' => 'array', 'key_comp_func' => 'callable'], 'array_diff_ukey\'1' => ['array', 'arr1' => 'array', 'arr2' => 'array', 'arr3' => 'array', 'arg4' => 'array|callable', '...rest=' => 'array|callable'], 'array_fill' => ['array', 'start_key' => 'int', 'num' => 'int', 'val' => 'mixed'], 'array_fill_keys' => ['array', 'keys' => 'array', 'val' => 'mixed'], 'array_filter' => ['array', 'input' => 'array', 'callback=' => 'callable', 'flag=' => 'int'], 'array_flip' => ['array', 'input' => 'array'], 'array_intersect' => ['array', 'arr1' => 'array', 'arr2' => 'array', '...args=' => 'array'], 'array_intersect_assoc' => ['array', 'arr1' => 'array', 'arr2' => 'array', '...args=' => 'array'], 'array_intersect_key' => ['array', 'arr1' => 'array', 'arr2' => 'array', '...args=' => 'array'], 'array_intersect_uassoc' => ['array', 'arr1' => 'array', 'arr2' => 'array', 'key_compare_func' => 'callable'], 'array_intersect_uassoc\'1' => ['array', 'arr1' => 'array', 'arr2' => 'array', 'arr3' => 'array', 'arg4' => 'array|callable', '...rest' => 'array|callable'], 'array_intersect_ukey' => ['array', 'arr1' => 'array', 'arr2' => 'array', 'key_compare_func' => 'callable'], 'array_intersect_ukey\'1' => ['array', 'arr1' => 'array', 'arr2' => 'array', 'arr3' => 'array', 'arg4' => 'array|callable', '...rest' => 'array|callable'], 'array_key_first' => ['int|string|null', 'array' => 'array'], 'array_key_last' => ['int|string|null', 'array' => 'array'], 'array_key_exists' => ['bool', 'key' => 'string|int', 'search' => 'array'], 'array_keys' => ['array', 'input' => 'array', 'search_value=' => 'mixed', 'strict=' => 'bool'], 'array_map' => ['array', 'callback' => '?callable', 'input1' => 'array', '...args=' => 'array'], 'array_merge' => ['array', 'arr1' => 'array', '...args=' => 'array'], 'array_merge_recursive' => ['array', 'arr1' => 'array', '...args=' => 'array'], 'array_multisort' => ['bool', '&rw_array1' => 'array', 'array1_sort_order=' => 'array|int', 'array1_sort_flags=' => 'array|int', '...args=' => 'array|int'], 'array_pad' => ['array', 'input' => 'array', 'pad_size' => 'int', 'pad_value' => 'mixed'], 'array_pop' => ['mixed', '&rw_stack' => 'array'], 'array_product' => ['int|float', 'input' => 'array'], 'array_push' => ['int', '&rw_stack' => 'array', 'var' => 'mixed', '...vars=' => 'mixed'], 'array_rand' => ['int|string|array<int,int>|array<int,string>', 'input' => 'array', 'num_req' => 'int'], 'array_rand\'1' => ['int|string', 'input' => 'array'], 'array_reduce' => ['mixed', 'input' => 'array', 'callback' => 'callable', 'initial=' => 'mixed'], 'array_replace' => ['array|null', 'arr1' => 'array', 'arr2' => 'array', '...args=' => 'array'], 'array_replace_recursive' => ['array|null', 'arr1' => 'array', 'arr2' => 'array', '...args=' => 'array'], 'array_reverse' => ['array', 'input' => 'array', 'preserve=' => 'bool'], 'array_search' => ['int|string|false', 'needle' => 'mixed', 'haystack' => 'array', 'strict=' => 'bool'], 'array_shift' => ['mixed', '&rw_stack' => 'array'], 'array_slice' => ['array', 'input' => 'array', 'offset' => 'int', 'length=' => '?int', 'preserve_keys=' => 'bool'], 'array_splice' => ['array', '&rw_input' => 'array', 'offset' => 'int', 'length=' => 'int', 'replacement=' => 'array|string'], 'array_sum' => ['int|float', 'input' => 'array'], 'array_udiff' => ['array', 'arr1' => 'array', 'arr2' => 'array', 'data_comp_func' => 'callable'], 'array_udiff\'1' => ['array', 'arr1' => 'array', 'arr2' => 'array', 'arr3' => 'array', 'arg4' => 'array|callable', '...rest=' => 'array|callable'], 'array_udiff_assoc' => ['array', 'arr1' => 'array', 'arr2' => 'array', 'key_comp_func' => 'callable'], 'array_udiff_assoc\'1' => ['array', 'arr1' => 'array', 'arr2' => 'array', 'arr3' => 'array', 'arg4' => 'array|callable', '...rest=' => 'array|callable'], 'array_udiff_uassoc' => ['array', 'arr1' => 'array', 'arr2' => 'array', 'data_comp_func' => 'callable', 'key_comp_func' => 'callable'], 'array_udiff_uassoc\'1' => ['array', 'arr1' => 'array', 'arr2' => 'array', 'arr3' => 'array', 'arg4' => 'array|callable', 'arg5' => 'array|callable', '...rest=' => 'array|callable'], 'array_uintersect' => ['array', 'arr1' => 'array', 'arr2' => 'array', 'data_compare_func' => 'callable'], 'array_uintersect\'1' => ['array', 'arr1' => 'array', 'arr2' => 'array', 'arr3' => 'array', 'arg4' => 'array|callable', '...rest=' => 'array|callable'], 'array_uintersect_assoc' => ['array', 'arr1' => 'array', 'arr2' => 'array', 'data_compare_func' => 'callable'], 'array_uintersect_assoc\'1' => ['array', 'arr1' => 'array', 'arr2' => 'array', 'arr3' => 'array', 'arg4' => 'array|callable', '...rest=' => 'array|callable'], 'array_uintersect_uassoc' => ['array', 'arr1' => 'array', 'arr2' => 'array', 'data_compare_func' => 'callable', 'key_compare_func' => 'callable'], 'array_uintersect_uassoc\'1' => ['array', 'arr1' => 'array', 'arr2' => 'array', 'arr3' => 'array', 'arg4' => 'array|callable', 'arg5' => 'array|callable', '...rest=' => 'array|callable'], 'array_unique' => ['array', 'input' => 'array', 'sort_flags=' => 'int'], 'array_unshift' => ['int', '&rw_stack' => 'array', 'var' => 'mixed', '...vars=' => 'mixed'], 'array_values' => ['array', 'input' => 'array'], 'array_walk' => ['bool', '&rw_input' => 'array', 'callback' => 'callable', 'userdata=' => 'mixed'], 'array_walk_recursive' => ['bool', '&rw_input' => 'array', 'callback' => 'callable', 'userdata=' => 'mixed'], 'ArrayAccess::offsetExists' => ['bool', 'offset' => 'mixed'], 'ArrayAccess::offsetGet' => ['mixed', 'offset' => 'mixed'], 'ArrayAccess::offsetSet' => ['void', 'offset' => 'mixed', 'value' => 'mixed'], 'ArrayAccess::offsetUnset' => ['void', 'offset' => 'mixed'], 'ArrayIterator::__construct' => ['void', 'array=' => 'array|object', 'flags=' => 'int'], 'ArrayIterator::append' => ['void', 'value' => 'mixed'], 'ArrayIterator::asort' => ['void'], 'ArrayIterator::count' => ['int'], 'ArrayIterator::current' => ['mixed'], 'ArrayIterator::getArrayCopy' => ['array'], 'ArrayIterator::getFlags' => ['void'], 'ArrayIterator::key' => ['int|string|false'], 'ArrayIterator::ksort' => ['void'], 'ArrayIterator::natcasesort' => ['void'], 'ArrayIterator::natsort' => ['void'], 'ArrayIterator::next' => ['void'], 'ArrayIterator::offsetExists' => ['bool', 'index' => 'string|int|bool|null'], 'ArrayIterator::offsetGet' => ['mixed', 'index' => 'string|int|bool|null'], 'ArrayIterator::offsetSet' => ['void', 'index' => 'string|int|bool|null', 'newval' => 'mixed'], 'ArrayIterator::offsetUnset' => ['void', 'index' => 'string|int|bool|null'], 'ArrayIterator::rewind' => ['void'], 'ArrayIterator::seek' => ['void', 'position' => 'int'], 'ArrayIterator::serialize' => ['string'], 'ArrayIterator::setFlags' => ['void', 'flags' => 'string'], 'ArrayIterator::uasort' => ['void', 'cmp_function' => 'callable'], 'ArrayIterator::uksort' => ['void', 'cmp_function' => 'callable'], 'ArrayIterator::unserialize' => ['string', 'serialized' => 'string'], 'ArrayIterator::valid' => ['bool'], 'ArrayObject::__construct' => ['void', 'input=' => 'array|object', 'flags=' => 'int', 'iterator_class=' => 'string'], 'ArrayObject::append' => ['void', 'value' => 'mixed'], 'ArrayObject::asort' => ['void'], 'ArrayObject::count' => ['int'], 'ArrayObject::exchangeArray' => ['array', 'ar' => 'mixed'], 'ArrayObject::getArrayCopy' => ['array'], 'ArrayObject::getFlags' => ['int'], 'ArrayObject::getIterator' => ['ArrayIterator'], 'ArrayObject::getIteratorClass' => ['string'], 'ArrayObject::ksort' => ['void'], 'ArrayObject::natcasesort' => ['void'], 'ArrayObject::natsort' => ['void'], 'ArrayObject::offsetExists' => ['bool', 'index' => 'mixed'], 'ArrayObject::offsetGet' => ['mixed', 'index' => 'mixed'], 'ArrayObject::offsetSet' => ['void', 'index' => 'mixed', 'newval' => 'mixed'], 'ArrayObject::offsetUnset' => ['void', 'index' => 'mixed'], 'ArrayObject::serialize' => ['string'], 'ArrayObject::setFlags' => ['void', 'flags' => 'int'], 'ArrayObject::setIteratorClass' => ['void', 'iterator_class' => 'string'], 'ArrayObject::uasort' => ['void', 'cmp_function' => 'callable'], 'ArrayObject::uksort' => ['void', 'cmp_function' => 'callable'], 'ArrayObject::unserialize' => ['void', 'serialized' => 'string'], 'arsort' => ['bool', '&rw_array_arg' => 'array', 'sort_flags=' => 'int'], 'asin' => ['float', 'number' => 'float'], 'asinh' => ['float', 'number' => 'float'], 'asort' => ['bool', '&rw_array_arg' => 'array', 'sort_flags=' => 'int'], 'assert' => ['bool', 'assertion' => 'string|bool', 'description=' => 'string|Throwable|null'], 'assert_options' => ['mixed', 'what' => 'int', 'value=' => 'mixed'], '_HumbugBoxb94336daae36\\ast\\get_kind_name' => ['string', 'kind' => 'int'], '_HumbugBoxb94336daae36\\ast\\get_metadata' => ['array<int,ast\\Metadata>'], '_HumbugBoxb94336daae36\\ast\\get_supported_versions' => ['array<int,int>', 'exclude_deprecated=' => 'bool'], '_HumbugBoxb94336daae36\\ast\\kind_uses_flags' => ['bool', 'kind' => 'int'], 'ast\\Node::__construct' => ['void', 'kind=' => 'int', 'flags=' => 'int', 'children=' => 'ast\\Node\\Decl[]|ast\\Node[]|array[]|int[]|string[]|float[]|bool[]|null[]', 'start_line=' => 'int'], '_HumbugBoxb94336daae36\\ast\\parse_code' => ['_HumbugBoxb94336daae36\\ast\\Node', 'code' => 'string', 'version' => 'int', 'filename=' => 'string'], '_HumbugBoxb94336daae36\\ast\\parse_file' => ['_HumbugBoxb94336daae36\\ast\\Node', 'filename' => 'string', 'version' => 'int'], 'atan' => ['float', 'number' => 'float'], 'atan2' => ['float', 'y' => 'float', 'x' => 'float'], 'atanh' => ['float', 'number' => 'float'], 'BadFunctionCallException::__clone' => ['void'], 'BadFunctionCallException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?Throwable|?BadFunctionCallException'], 'BadFunctionCallException::__toString' => ['string'], 'BadFunctionCallException::getCode' => ['int'], 'BadFunctionCallException::getFile' => ['string'], 'BadFunctionCallException::getLine' => ['int'], 'BadFunctionCallException::getMessage' => ['string'], 'BadFunctionCallException::getPrevious' => ['?Throwable|?BadFunctionCallException'], 'BadFunctionCallException::getTrace' => ['array'], 'BadFunctionCallException::getTraceAsString' => ['string'], 'BadMethodCallException::__clone' => ['void'], 'BadMethodCallException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?Throwable|?BadMethodCallException'], 'BadMethodCallException::__toString' => ['string'], 'BadMethodCallException::getCode' => ['int'], 'BadMethodCallException::getFile' => ['string'], 'BadMethodCallException::getLine' => ['int'], 'BadMethodCallException::getMessage' => ['string'], 'BadMethodCallException::getPrevious' => ['?Throwable|?BadMethodCallException'], 'BadMethodCallException::getTrace' => ['array'], 'BadMethodCallException::getTraceAsString' => ['string'], 'base64_decode' => ['string|false', 'str' => 'string', 'strict=' => 'bool'], 'base64_encode' => ['string', 'str' => 'string'], 'base_convert' => ['string', 'number' => 'string', 'frombase' => 'int', 'tobase' => 'int'], 'basename' => ['string', 'path' => 'string', 'suffix=' => 'string'], 'bbcode_add_element' => ['bool', 'bbcode_container' => 'resource', 'tag_name' => 'string', 'tag_rules' => 'array'], 'bbcode_add_smiley' => ['bool', 'bbcode_container' => 'resource', 'smiley' => 'string', 'replace_by' => 'string'], 'bbcode_create' => ['resource', 'bbcode_initial_tags=' => 'array'], 'bbcode_destroy' => ['bool', 'bbcode_container' => 'resource'], 'bbcode_parse' => ['string', 'bbcode_container' => 'resource', 'to_parse' => 'string'], 'bbcode_set_arg_parser' => ['bool', 'bbcode_container' => 'resource', 'bbcode_arg_parser' => 'resource'], 'bbcode_set_flags' => ['bool', 'bbcode_container' => 'resource', 'flags' => 'int', 'mode=' => 'int'], 'bcadd' => ['string', 'left_operand' => 'string', 'right_operand' => 'string', 'scale=' => 'int'], 'bccomp' => ['int', 'left_operand' => 'string', 'right_operand' => 'string', 'scale=' => 'int'], 'bcdiv' => ['string', 'left_operand' => 'string', 'right_operand' => 'string', 'scale=' => 'int'], 'bcmod' => ['string', 'left_operand' => 'string', 'right_operand' => 'string', 'scale=' => 'int'], 'bcmul' => ['string', 'left_operand' => 'string', 'right_operand' => 'string', 'scale=' => 'int'], 'bcompiler_load' => ['bool', 'filename' => 'string'], 'bcompiler_load_exe' => ['bool', 'filename' => 'string'], 'bcompiler_parse_class' => ['bool', 'class' => 'string', 'callback' => 'string'], 'bcompiler_read' => ['bool', 'filehandle' => 'resource'], 'bcompiler_write_class' => ['bool', 'filehandle' => 'resource', 'classname' => 'string', 'extends=' => 'string'], 'bcompiler_write_constant' => ['bool', 'filehandle' => 'resource', 'constantname' => 'string'], 'bcompiler_write_exe_footer' => ['bool', 'filehandle' => 'resource', 'startpos' => 'int'], 'bcompiler_write_file' => ['bool', 'filehandle' => 'resource', 'filename' => 'string'], 'bcompiler_write_footer' => ['bool', 'filehandle' => 'resource'], 'bcompiler_write_function' => ['bool', 'filehandle' => 'resource', 'functionname' => 'string'], 'bcompiler_write_functions_from_file' => ['bool', 'filehandle' => 'resource', 'filename' => 'string'], 'bcompiler_write_header' => ['bool', 'filehandle' => 'resource', 'write_ver=' => 'string'], 'bcompiler_write_included_filename' => ['bool', 'filehandle' => 'resource', 'filename' => 'string'], 'bcpow' => ['string', 'base' => 'string', 'exponent' => 'string', 'scale=' => 'int'], 'bcpowmod' => ['string', 'base' => 'string', 'exponent' => 'string', 'modulus' => 'string', 'scale=' => 'int'], 'bcscale' => ['bool', 'scale' => 'int'], 'bcsqrt' => ['string', 'operand' => 'string', 'scale=' => 'int'], 'bcsub' => ['string', 'left_operand' => 'string', 'right_operand' => 'string', 'scale=' => 'int'], 'bin2hex' => ['string', 'data' => 'string'], 'bind_textdomain_codeset' => ['string', 'domain' => 'string', 'codeset' => 'string'], 'bindec' => ['int', 'binary_number' => 'string'], 'bindtextdomain' => ['string', 'domain_name' => 'string', 'dir' => 'string'], 'birdstep_autocommit' => ['bool', 'index' => 'int'], 'birdstep_close' => ['bool', 'id' => 'int'], 'birdstep_commit' => ['bool', 'index' => 'int'], 'birdstep_connect' => ['int', 'server' => 'string', 'user' => 'string', 'pass' => 'string'], 'birdstep_exec' => ['int', 'index' => 'int', 'exec_str' => 'string'], 'birdstep_fetch' => ['bool', 'index' => 'int'], 'birdstep_fieldname' => ['string', 'index' => 'int', 'col' => 'int'], 'birdstep_fieldnum' => ['int', 'index' => 'int'], 'birdstep_freeresult' => ['bool', 'index' => 'int'], 'birdstep_off_autocommit' => ['bool', 'index' => 'int'], 'birdstep_result' => ['', 'index' => 'int', 'col' => ''], 'birdstep_rollback' => ['bool', 'index' => 'int'], 'blenc_encrypt' => ['string', 'plaintext' => 'string', 'encodedfile' => 'string', 'encryption_key=' => 'string'], 'boolval' => ['bool', 'var' => 'mixed'], 'BSON\\Binary::__construct' => ['void', 'data' => 'string', 'subtype' => 'string'], 'BSON\\Binary::getSubType' => [''], '_HumbugBoxb94336daae36\\BSON\\fromArray' => ['string', 'array' => 'string'], '_HumbugBoxb94336daae36\\BSON\\fromJSON' => ['string', 'json' => 'string'], 'BSON\\Javascript::__construct' => ['void', 'javascript' => 'string', 'scope=' => 'string'], 'BSON\\ObjectID::__construct' => ['void', 'id=' => 'string'], 'BSON\\ObjectID::__toString' => ['string'], 'BSON\\Regex::__construct' => ['void', 'pattern' => 'string', 'flags' => 'string'], 'BSON\\Regex::__toString' => ['string'], 'BSON\\Regex::getFlags' => [''], 'BSON\\Regex::getPattern' => [''], 'BSON\\Serializable::bsonSerialize' => ['string'], 'BSON\\Timestamp::__construct' => ['void', 'increment' => 'string', 'timestamp' => 'string'], 'BSON\\Timestamp::__toString' => ['string'], '_HumbugBoxb94336daae36\\BSON\\toArray' => ['array', 'bson' => 'string'], '_HumbugBoxb94336daae36\\BSON\\toJSON' => ['string', 'bson' => 'string'], 'BSON\\Unserializable::bsonUnserialize' => ['', 'data' => 'array'], 'BSON\\UTCDatetime::__construct' => ['void', 'milliseconds' => 'string'], 'BSON\\UTCDatetime::__toString' => ['string'], 'BSON\\UTCDatetime::toDateTime' => [''], 'bson_decode' => ['array', 'bson' => 'string'], 'bson_encode' => ['string', 'anything' => 'mixed'], 'bzclose' => ['bool', 'bz' => 'resource'], 'bzcompress' => ['string', 'source' => 'string', 'blocksize100k=' => 'int', 'workfactor=' => 'int'], 'bzdecompress' => ['string', 'source' => 'string', 'small=' => 'int'], 'bzerrno' => ['int', 'bz' => 'resource'], 'bzerror' => ['array', 'bz' => 'resource'], 'bzerrstr' => ['string', 'bz' => 'resource'], 'bzflush' => ['bool', 'bz' => 'resource'], 'bzopen' => ['resource', 'file' => 'string|resource', 'mode' => 'string'], 'bzread' => ['string', 'bz' => 'resource', 'length=' => 'int'], 'bzwrite' => ['int', 'bz' => 'resource', 'data' => 'string', 'length=' => 'int'], 'CachingIterator::__construct' => ['void', 'it' => 'iterator', 'flags=' => ''], 'CachingIterator::__toString' => ['string'], 'CachingIterator::count' => ['int'], 'CachingIterator::current' => ['mixed'], 'CachingIterator::getCache' => ['array'], 'CachingIterator::getFlags' => ['int'], 'CachingIterator::getInnerIterator' => ['Iterator'], 'CachingIterator::hasNext' => ['bool'], 'CachingIterator::key' => ['mixed'], 'CachingIterator::next' => ['void'], 'CachingIterator::offsetExists' => ['bool', 'index' => 'string'], 'CachingIterator::offsetGet' => ['mixed', 'index' => 'string'], 'CachingIterator::offsetSet' => ['void', 'index' => 'string', 'newval' => 'mixed'], 'CachingIterator::offsetUnset' => ['void', 'index' => 'string'], 'CachingIterator::rewind' => ['void'], 'CachingIterator::setFlags' => ['void', 'flags' => 'int'], 'CachingIterator::valid' => ['bool'], 'Cairo::availableFonts' => ['array'], 'Cairo::availableSurfaces' => ['array'], 'Cairo::statusToString' => ['string', 'status' => 'int'], 'Cairo::version' => ['int'], 'Cairo::versionString' => ['string'], 'cairo_append_path' => ['', 'path' => 'cairopath', 'context' => 'cairocontext'], 'cairo_arc' => ['', 'x' => 'float', 'y' => 'float', 'radius' => 'float', 'angle1' => 'float', 'angle2' => 'float', 'context' => 'cairocontext'], 'cairo_arc_negative' => ['', 'x' => 'float', 'y' => 'float', 'radius' => 'float', 'angle1' => 'float', 'angle2' => 'float', 'context' => 'cairocontext'], 'cairo_available_fonts' => ['array'], 'cairo_available_surfaces' => ['array'], 'cairo_clip' => ['', 'context' => 'cairocontext'], 'cairo_clip_extents' => ['array', 'context' => 'cairocontext'], 'cairo_clip_preserve' => ['', 'context' => 'cairocontext'], 'cairo_clip_rectangle_list' => ['array', 'context' => 'cairocontext'], 'cairo_close_path' => ['', 'context' => 'cairocontext'], 'cairo_copy_page' => ['', 'context' => 'cairocontext'], 'cairo_copy_path' => ['CairoPath', 'context' => 'cairocontext'], 'cairo_copy_path_flat' => ['CairoPath', 'context' => 'cairocontext'], 'cairo_create' => ['CairoContext', 'surface' => 'cairosurface'], 'cairo_curve_to' => ['', 'x1' => 'float', 'y1' => 'float', 'x2' => 'float', 'y2' => 'float', 'x3' => 'float', 'y3' => 'float', 'context' => 'cairocontext'], 'cairo_device_to_user' => ['array', 'x' => 'float', 'y' => 'float', 'context' => 'cairocontext'], 'cairo_device_to_user_distance' => ['array', 'x' => 'float', 'y' => 'float', 'context' => 'cairocontext'], 'cairo_fill' => ['', 'context' => 'cairocontext'], 'cairo_fill_extents' => ['array', 'context' => 'cairocontext'], 'cairo_fill_preserve' => ['', 'context' => 'cairocontext'], 'cairo_font_extents' => ['array', 'context' => 'cairocontext'], 'cairo_font_face_get_type' => ['int', 'fontface' => 'cairofontface'], 'cairo_font_face_status' => ['int', 'fontface' => 'cairofontface'], 'cairo_font_options_create' => ['CairoFontOptions'], 'cairo_font_options_equal' => ['bool', 'options' => 'cairofontoptions', 'other' => 'cairofontoptions'], 'cairo_font_options_get_antialias' => ['int', 'options' => 'cairofontoptions'], 'cairo_font_options_get_hint_metrics' => ['int', 'options' => 'cairofontoptions'], 'cairo_font_options_get_hint_style' => ['int', 'options' => 'cairofontoptions'], 'cairo_font_options_get_subpixel_order' => ['int', 'options' => 'cairofontoptions'], 'cairo_font_options_hash' => ['int', 'options' => 'cairofontoptions'], 'cairo_font_options_merge' => ['void', 'options' => 'cairofontoptions', 'other' => 'cairofontoptions'], 'cairo_font_options_set_antialias' => ['void', 'options' => 'cairofontoptions', 'antialias' => 'int'], 'cairo_font_options_set_hint_metrics' => ['void', 'options' => 'cairofontoptions', 'hint_metrics' => 'int'], 'cairo_font_options_set_hint_style' => ['void', 'options' => 'cairofontoptions', 'hint_style' => 'int'], 'cairo_font_options_set_subpixel_order' => ['void', 'options' => 'cairofontoptions', 'subpixel_order' => 'int'], 'cairo_font_options_status' => ['int', 'options' => 'cairofontoptions'], 'cairo_format_stride_for_width' => ['int', 'format' => 'int', 'width' => 'int'], 'cairo_get_antialias' => ['int', 'context' => 'cairocontext'], 'cairo_get_current_point' => ['array', 'context' => 'cairocontext'], 'cairo_get_dash' => ['array', 'context' => 'cairocontext'], 'cairo_get_dash_count' => ['int', 'context' => 'cairocontext'], 'cairo_get_fill_rule' => ['int', 'context' => 'cairocontext'], 'cairo_get_font_face' => ['', 'context' => 'cairocontext'], 'cairo_get_font_matrix' => ['', 'context' => 'cairocontext'], 'cairo_get_font_options' => ['', 'context' => 'cairocontext'], 'cairo_get_group_target' => ['', 'context' => 'cairocontext'], 'cairo_get_line_cap' => ['int', 'context' => 'cairocontext'], 'cairo_get_line_join' => ['int', 'context' => 'cairocontext'], 'cairo_get_line_width' => ['float', 'context' => 'cairocontext'], 'cairo_get_matrix' => ['', 'context' => 'cairocontext'], 'cairo_get_miter_limit' => ['float', 'context' => 'cairocontext'], 'cairo_get_operator' => ['int', 'context' => 'cairocontext'], 'cairo_get_scaled_font' => ['', 'context' => 'cairocontext'], 'cairo_get_source' => ['', 'context' => 'cairocontext'], 'cairo_get_target' => ['', 'context' => 'cairocontext'], 'cairo_get_tolerance' => ['float', 'context' => 'cairocontext'], 'cairo_glyph_path' => ['', 'glyphs' => 'array', 'context' => 'cairocontext'], 'cairo_has_current_point' => ['bool', 'context' => 'cairocontext'], 'cairo_identity_matrix' => ['', 'context' => 'cairocontext'], 'cairo_image_surface_create' => ['CairoImageSurface', 'format' => 'int', 'width' => 'int', 'height' => 'int'], 'cairo_image_surface_create_for_data' => ['CairoImageSurface', 'data' => 'string', 'format' => 'int', 'width' => 'int', 'height' => 'int', 'stride=' => 'int'], 'cairo_image_surface_create_from_png' => ['CairoImageSurface', 'file' => 'string'], 'cairo_image_surface_get_data' => ['string', 'surface' => 'cairoimagesurface'], 'cairo_image_surface_get_format' => ['int', 'surface' => 'cairoimagesurface'], 'cairo_image_surface_get_height' => ['int', 'surface' => 'cairoimagesurface'], 'cairo_image_surface_get_stride' => ['int', 'surface' => 'cairoimagesurface'], 'cairo_image_surface_get_width' => ['int', 'surface' => 'cairoimagesurface'], 'cairo_in_fill' => ['bool', 'x' => 'string', 'y' => 'string', 'context' => 'cairocontext'], 'cairo_in_stroke' => ['bool', 'x' => 'string', 'y' => 'string', 'context' => 'cairocontext'], 'cairo_line_to' => ['', 'x' => 'string', 'y' => 'string', 'context' => 'cairocontext'], 'cairo_mask' => ['', 'pattern' => 'cairopattern', 'context' => 'cairocontext'], 'cairo_mask_surface' => ['', 'surface' => 'cairosurface', 'x=' => 'string', 'y=' => 'string', 'context=' => 'cairocontext'], 'cairo_matrix_create_scale' => ['object', 'sx' => 'float', 'sy' => 'float'], 'cairo_matrix_init' => ['object', 'xx=' => 'float', 'yx=' => 'float', 'xy=' => 'float', 'yy=' => 'float', 'x0=' => 'float', 'y0=' => 'float'], 'cairo_matrix_init_identity' => ['object'], 'cairo_matrix_init_rotate' => ['object', 'radians' => 'float'], 'cairo_matrix_init_scale' => ['object', 'sx' => 'float', 'sy' => 'float'], 'cairo_matrix_init_translate' => ['object', 'tx' => 'float', 'ty' => 'float'], 'cairo_matrix_invert' => ['void', 'matrix' => 'cairomatrix'], 'cairo_matrix_multiply' => ['CairoMatrix', 'matrix1' => 'cairomatrix', 'matrix2' => 'cairomatrix'], 'cairo_matrix_rotate' => ['', 'matrix' => 'cairomatrix', 'radians' => 'float'], 'cairo_matrix_scale' => ['', 'sx' => 'float', 'sy' => 'float', 'context' => 'cairocontext'], 'cairo_matrix_transform_distance' => ['array', 'matrix' => 'cairomatrix', 'dx' => 'float', 'dy' => 'float'], 'cairo_matrix_transform_point' => ['array', 'matrix' => 'cairomatrix', 'dx' => 'float', 'dy' => 'float'], 'cairo_matrix_translate' => ['void', 'matrix' => 'cairomatrix', 'tx' => 'float', 'ty' => 'float'], 'cairo_move_to' => ['', 'x' => 'string', 'y' => 'string', 'context' => 'cairocontext'], 'cairo_new_path' => ['', 'context' => 'cairocontext'], 'cairo_new_sub_path' => ['', 'context' => 'cairocontext'], 'cairo_paint' => ['', 'context' => 'cairocontext'], 'cairo_paint_with_alpha' => ['', 'alpha' => 'string', 'context' => 'cairocontext'], 'cairo_path_extents' => ['array', 'context' => 'cairocontext'], 'cairo_pattern_add_color_stop_rgb' => ['void', 'pattern' => 'cairogradientpattern', 'offset' => 'float', 'red' => 'float', 'green' => 'float', 'blue' => 'float'], 'cairo_pattern_add_color_stop_rgba' => ['void', 'pattern' => 'cairogradientpattern', 'offset' => 'float', 'red' => 'float', 'green' => 'float', 'blue' => 'float', 'alpha' => 'float'], 'cairo_pattern_create_for_surface' => ['CairoPattern', 'surface' => 'cairosurface'], 'cairo_pattern_create_linear' => ['CairoPattern', 'x0' => 'float', 'y0' => 'float', 'x1' => 'float', 'y1' => 'float'], 'cairo_pattern_create_radial' => ['CairoPattern', 'x0' => 'float', 'y0' => 'float', 'r0' => 'float', 'x1' => 'float', 'y1' => 'float', 'r1' => 'float'], 'cairo_pattern_create_rgb' => ['CairoPattern', 'red' => 'float', 'green' => 'float', 'blue' => 'float'], 'cairo_pattern_create_rgba' => ['CairoPattern', 'red' => 'float', 'green' => 'float', 'blue' => 'float', 'alpha' => 'float'], 'cairo_pattern_get_color_stop_count' => ['int', 'pattern' => 'cairogradientpattern'], 'cairo_pattern_get_color_stop_rgba' => ['array', 'pattern' => 'cairogradientpattern', 'index' => 'int'], 'cairo_pattern_get_extend' => ['int', 'pattern' => 'string'], 'cairo_pattern_get_filter' => ['int', 'pattern' => 'cairosurfacepattern'], 'cairo_pattern_get_linear_points' => ['array', 'pattern' => 'cairolineargradient'], 'cairo_pattern_get_matrix' => ['CairoMatrix', 'pattern' => 'cairopattern'], 'cairo_pattern_get_radial_circles' => ['array', 'pattern' => 'cairoradialgradient'], 'cairo_pattern_get_rgba' => ['array', 'pattern' => 'cairosolidpattern'], 'cairo_pattern_get_surface' => ['CairoSurface', 'pattern' => 'cairosurfacepattern'], 'cairo_pattern_get_type' => ['int', 'pattern' => 'cairopattern'], 'cairo_pattern_set_extend' => ['void', 'pattern' => 'string', 'extend' => 'string'], 'cairo_pattern_set_filter' => ['void', 'pattern' => 'cairosurfacepattern', 'filter' => 'int'], 'cairo_pattern_set_matrix' => ['void', 'pattern' => 'cairopattern', 'matrix' => 'cairomatrix'], 'cairo_pattern_status' => ['int', 'pattern' => 'cairopattern'], 'cairo_pdf_surface_create' => ['CairoPdfSurface', 'file' => 'string', 'width' => 'float', 'height' => 'float'], 'cairo_pdf_surface_set_size' => ['void', 'surface' => 'cairopdfsurface', 'width' => 'float', 'height' => 'float'], 'cairo_pop_group' => ['', 'context' => 'cairocontext'], 'cairo_pop_group_to_source' => ['', 'context' => 'cairocontext'], 'cairo_ps_get_levels' => ['array'], 'cairo_ps_level_to_string' => ['string', 'level' => 'int'], 'cairo_ps_surface_create' => ['CairoPsSurface', 'file' => 'string', 'width' => 'float', 'height' => 'float'], 'cairo_ps_surface_dsc_begin_page_setup' => ['void', 'surface' => 'cairopssurface'], 'cairo_ps_surface_dsc_begin_setup' => ['void', 'surface' => 'cairopssurface'], 'cairo_ps_surface_dsc_comment' => ['void', 'surface' => 'cairopssurface', 'comment' => 'string'], 'cairo_ps_surface_get_eps' => ['bool', 'surface' => 'cairopssurface'], 'cairo_ps_surface_restrict_to_level' => ['void', 'surface' => 'cairopssurface', 'level' => 'int'], 'cairo_ps_surface_set_eps' => ['void', 'surface' => 'cairopssurface', 'level' => 'bool'], 'cairo_ps_surface_set_size' => ['void', 'surface' => 'cairopssurface', 'width' => 'float', 'height' => 'float'], 'cairo_push_group' => ['', 'context' => 'cairocontext'], 'cairo_push_group_with_content' => ['', 'content' => 'string', 'context' => 'cairocontext'], 'cairo_rectangle' => ['', 'x' => 'string', 'y' => 'string', 'width' => 'string', 'height' => 'string', 'context' => 'cairocontext'], 'cairo_rel_curve_to' => ['', 'x1' => 'string', 'y1' => 'string', 'x2' => 'string', 'y2' => 'string', 'x3' => 'string', 'y3' => 'string', 'context' => 'cairocontext'], 'cairo_rel_line_to' => ['', 'x' => 'string', 'y' => 'string', 'context' => 'cairocontext'], 'cairo_rel_move_to' => ['', 'x' => 'string', 'y' => 'string', 'context' => 'cairocontext'], 'cairo_reset_clip' => ['', 'context' => 'cairocontext'], 'cairo_restore' => ['', 'context' => 'cairocontext'], 'cairo_rotate' => ['', 'sx' => 'string', 'sy' => 'string', 'context' => 'cairocontext', 'angle' => 'string'], 'cairo_save' => ['', 'context' => 'cairocontext'], 'cairo_scale' => ['', 'x' => 'string', 'y' => 'string', 'context' => 'cairocontext'], 'cairo_scaled_font_create' => ['CairoScaledFont', 'fontface' => 'cairofontface', 'matrix' => 'cairomatrix', 'ctm' => 'cairomatrix', 'fontoptions' => 'cairofontoptions'], 'cairo_scaled_font_extents' => ['array', 'scaledfont' => 'cairoscaledfont'], 'cairo_scaled_font_get_ctm' => ['CairoMatrix', 'scaledfont' => 'cairoscaledfont'], 'cairo_scaled_font_get_font_face' => ['CairoFontFace', 'scaledfont' => 'cairoscaledfont'], 'cairo_scaled_font_get_font_matrix' => ['CairoFontOptions', 'scaledfont' => 'cairoscaledfont'], 'cairo_scaled_font_get_font_options' => ['CairoFontOptions', 'scaledfont' => 'cairoscaledfont'], 'cairo_scaled_font_get_scale_matrix' => ['CairoMatrix', 'scaledfont' => 'cairoscaledfont'], 'cairo_scaled_font_get_type' => ['int', 'scaledfont' => 'cairoscaledfont'], 'cairo_scaled_font_glyph_extents' => ['array', 'scaledfont' => 'cairoscaledfont', 'glyphs' => 'array'], 'cairo_scaled_font_status' => ['int', 'scaledfont' => 'cairoscaledfont'], 'cairo_scaled_font_text_extents' => ['array', 'scaledfont' => 'cairoscaledfont', 'text' => 'string'], 'cairo_select_font_face' => ['', 'family' => 'string', 'slant=' => 'string', 'weight=' => 'string', 'context=' => 'cairocontext'], 'cairo_set_antialias' => ['', 'antialias=' => 'string', 'context=' => 'cairocontext'], 'cairo_set_dash' => ['', 'dashes' => 'array', 'offset=' => 'string', 'context=' => 'cairocontext'], 'cairo_set_fill_rule' => ['', 'setting' => 'string', 'context' => 'cairocontext'], 'cairo_set_font_face' => ['', 'fontface' => 'cairofontface', 'context' => 'cairocontext'], 'cairo_set_font_matrix' => ['', 'matrix' => 'cairomatrix', 'context' => 'cairocontext'], 'cairo_set_font_options' => ['', 'fontoptions' => 'cairofontoptions', 'context' => 'cairocontext'], 'cairo_set_font_size' => ['', 'size' => 'string', 'context' => 'cairocontext'], 'cairo_set_line_cap' => ['', 'setting' => 'string', 'context' => 'cairocontext'], 'cairo_set_line_join' => ['', 'setting' => 'string', 'context' => 'cairocontext'], 'cairo_set_line_width' => ['', 'width' => 'string', 'context' => 'cairocontext'], 'cairo_set_matrix' => ['', 'matrix' => 'cairomatrix', 'context' => 'cairocontext'], 'cairo_set_miter_limit' => ['', 'limit' => 'string', 'context' => 'cairocontext'], 'cairo_set_operator' => ['', 'setting' => 'string', 'context' => 'cairocontext'], 'cairo_set_scaled_font' => ['', 'scaledfont' => 'cairoscaledfont', 'context' => 'cairocontext'], 'cairo_set_source' => ['', 'red' => 'string', 'green' => 'string', 'blue' => 'string', 'alpha' => 'string', 'context' => 'cairocontext', 'pattern' => 'cairopattern'], 'cairo_set_source_surface' => ['', 'surface' => 'cairosurface', 'x=' => 'string', 'y=' => 'string', 'context=' => 'cairocontext'], 'cairo_set_tolerance' => ['', 'tolerance' => 'string', 'context' => 'cairocontext'], 'cairo_show_page' => ['', 'context' => 'cairocontext'], 'cairo_show_text' => ['', 'text' => 'string', 'context' => 'cairocontext'], 'cairo_status' => ['int', 'context' => 'cairocontext'], 'cairo_status_to_string' => ['string', 'status' => 'int'], 'cairo_stroke' => ['', 'context' => 'cairocontext'], 'cairo_stroke_extents' => ['array', 'context' => 'cairocontext'], 'cairo_stroke_preserve' => ['', 'context' => 'cairocontext'], 'cairo_surface_copy_page' => ['void', 'surface' => 'cairosurface'], 'cairo_surface_create_similar' => ['CairoSurface', 'surface' => 'cairosurface', 'content' => 'int', 'width' => 'float', 'height' => 'float'], 'cairo_surface_finish' => ['void', 'surface' => 'cairosurface'], 'cairo_surface_flush' => ['void', 'surface' => 'cairosurface'], 'cairo_surface_get_content' => ['int', 'surface' => 'cairosurface'], 'cairo_surface_get_device_offset' => ['array', 'surface' => 'cairosurface'], 'cairo_surface_get_font_options' => ['CairoFontOptions', 'surface' => 'cairosurface'], 'cairo_surface_get_type' => ['int', 'surface' => 'cairosurface'], 'cairo_surface_mark_dirty' => ['void', 'surface' => 'cairosurface'], 'cairo_surface_mark_dirty_rectangle' => ['void', 'surface' => 'cairosurface', 'x' => 'float', 'y' => 'float', 'width' => 'float', 'height' => 'float'], 'cairo_surface_set_device_offset' => ['void', 'surface' => 'cairosurface', 'x' => 'float', 'y' => 'float'], 'cairo_surface_set_fallback_resolution' => ['void', 'surface' => 'cairosurface', 'x' => 'float', 'y' => 'float'], 'cairo_surface_show_page' => ['void', 'surface' => 'cairosurface'], 'cairo_surface_status' => ['int', 'surface' => 'cairosurface'], 'cairo_surface_write_to_png' => ['void', 'surface' => 'cairosurface', 'stream' => 'resource'], 'cairo_svg_get_versions' => ['array'], 'cairo_svg_surface_create' => ['CairoSvgSurface', 'file' => 'string', 'width' => 'float', 'height' => 'float'], 'cairo_svg_surface_get_versions' => ['array'], 'cairo_svg_surface_restrict_to_version' => ['void', 'surface' => 'cairosvgsurface', 'version' => 'int'], 'cairo_svg_version_to_string' => ['string', 'version' => 'int'], 'cairo_text_extents' => ['array', 'text' => 'string', 'context' => 'cairocontext'], 'cairo_text_path' => ['', 'string' => 'string', 'context' => 'cairocontext', 'text' => 'string'], 'cairo_transform' => ['', 'matrix' => 'cairomatrix', 'context' => 'cairocontext'], 'cairo_translate' => ['', 'tx' => 'string', 'ty' => 'string', 'context' => 'cairocontext', 'x' => 'string', 'y' => 'string'], 'cairo_user_to_device' => ['array', 'x' => 'string', 'y' => 'string', 'context' => 'cairocontext'], 'cairo_user_to_device_distance' => ['array', 'x' => 'string', 'y' => 'string', 'context' => 'cairocontext'], 'cairo_version' => ['int'], 'cairo_version_string' => ['string'], 'CairoContext::__construct' => ['void', 'surface' => 'CairoSurface'], 'CairoContext::appendPath' => ['', 'path' => 'cairopath', 'context' => 'cairocontext'], 'CairoContext::arc' => ['', 'x' => 'float', 'y' => 'float', 'radius' => 'float', 'angle1' => 'float', 'angle2' => 'float', 'context' => 'cairocontext'], 'CairoContext::arcNegative' => ['', 'x' => 'float', 'y' => 'float', 'radius' => 'float', 'angle1' => 'float', 'angle2' => 'float', 'context' => 'cairocontext'], 'CairoContext::clip' => ['', 'context' => 'cairocontext'], 'CairoContext::clipExtents' => ['array', 'context' => 'cairocontext'], 'CairoContext::clipPreserve' => ['', 'context' => 'cairocontext'], 'CairoContext::clipRectangleList' => ['array', 'context' => 'cairocontext'], 'CairoContext::closePath' => ['', 'context' => 'cairocontext'], 'CairoContext::copyPage' => ['', 'context' => 'cairocontext'], 'CairoContext::copyPath' => ['CairoPath', 'context' => 'cairocontext'], 'CairoContext::copyPathFlat' => ['CairoPath', 'context' => 'cairocontext'], 'CairoContext::curveTo' => ['', 'x1' => 'float', 'y1' => 'float', 'x2' => 'float', 'y2' => 'float', 'x3' => 'float', 'y3' => 'float', 'context' => 'cairocontext'], 'CairoContext::deviceToUser' => ['array', 'x' => 'float', 'y' => 'float', 'context' => 'cairocontext'], 'CairoContext::deviceToUserDistance' => ['array', 'x' => 'float', 'y' => 'float', 'context' => 'cairocontext'], 'CairoContext::fill' => ['', 'context' => 'cairocontext'], 'CairoContext::fillExtents' => ['array', 'context' => 'cairocontext'], 'CairoContext::fillPreserve' => ['', 'context' => 'cairocontext'], 'CairoContext::fontExtents' => ['array', 'context' => 'cairocontext'], 'CairoContext::getAntialias' => ['int', 'context' => 'cairocontext'], 'CairoContext::getCurrentPoint' => ['array', 'context' => 'cairocontext'], 'CairoContext::getDash' => ['array', 'context' => 'cairocontext'], 'CairoContext::getDashCount' => ['int', 'context' => 'cairocontext'], 'CairoContext::getFillRule' => ['int', 'context' => 'cairocontext'], 'CairoContext::getFontFace' => ['', 'context' => 'cairocontext'], 'CairoContext::getFontMatrix' => ['', 'context' => 'cairocontext'], 'CairoContext::getFontOptions' => ['', 'context' => 'cairocontext'], 'CairoContext::getGroupTarget' => ['', 'context' => 'cairocontext'], 'CairoContext::getLineCap' => ['int', 'context' => 'cairocontext'], 'CairoContext::getLineJoin' => ['int', 'context' => 'cairocontext'], 'CairoContext::getLineWidth' => ['float', 'context' => 'cairocontext'], 'CairoContext::getMatrix' => ['', 'context' => 'cairocontext'], 'CairoContext::getMiterLimit' => ['float', 'context' => 'cairocontext'], 'CairoContext::getOperator' => ['int', 'context' => 'cairocontext'], 'CairoContext::getScaledFont' => ['', 'context' => 'cairocontext'], 'CairoContext::getSource' => ['', 'context' => 'cairocontext'], 'CairoContext::getTarget' => ['', 'context' => 'cairocontext'], 'CairoContext::getTolerance' => ['float', 'context' => 'cairocontext'], 'CairoContext::glyphPath' => ['', 'glyphs' => 'array', 'context' => 'cairocontext'], 'CairoContext::hasCurrentPoint' => ['bool', 'context' => 'cairocontext'], 'CairoContext::identityMatrix' => ['', 'context' => 'cairocontext'], 'CairoContext::inFill' => ['bool', 'x' => 'string', 'y' => 'string', 'context' => 'cairocontext'], 'CairoContext::inStroke' => ['bool', 'x' => 'string', 'y' => 'string', 'context' => 'cairocontext'], 'CairoContext::lineTo' => ['', 'x' => 'string', 'y' => 'string', 'context' => 'cairocontext'], 'CairoContext::mask' => ['', 'pattern' => 'cairopattern', 'context' => 'cairocontext'], 'CairoContext::maskSurface' => ['', 'surface' => 'cairosurface', 'x=' => 'string', 'y=' => 'string', 'context=' => 'cairocontext'], 'CairoContext::moveTo' => ['', 'x' => 'string', 'y' => 'string', 'context' => 'cairocontext'], 'CairoContext::newPath' => ['', 'context' => 'cairocontext'], 'CairoContext::newSubPath' => ['', 'context' => 'cairocontext'], 'CairoContext::paint' => ['', 'context' => 'cairocontext'], 'CairoContext::paintWithAlpha' => ['', 'alpha' => 'string', 'context' => 'cairocontext'], 'CairoContext::pathExtents' => ['array', 'context' => 'cairocontext'], 'CairoContext::popGroup' => ['', 'context' => 'cairocontext'], 'CairoContext::popGroupToSource' => ['', 'context' => 'cairocontext'], 'CairoContext::pushGroup' => ['', 'context' => 'cairocontext'], 'CairoContext::pushGroupWithContent' => ['', 'content' => 'string', 'context' => 'cairocontext'], 'CairoContext::rectangle' => ['', 'x' => 'string', 'y' => 'string', 'width' => 'string', 'height' => 'string', 'context' => 'cairocontext'], 'CairoContext::relCurveTo' => ['', 'x1' => 'string', 'y1' => 'string', 'x2' => 'string', 'y2' => 'string', 'x3' => 'string', 'y3' => 'string', 'context' => 'cairocontext'], 'CairoContext::relLineTo' => ['', 'x' => 'string', 'y' => 'string', 'context' => 'cairocontext'], 'CairoContext::relMoveTo' => ['', 'x' => 'string', 'y' => 'string', 'context' => 'cairocontext'], 'CairoContext::resetClip' => ['', 'context' => 'cairocontext'], 'CairoContext::restore' => ['', 'context' => 'cairocontext'], 'CairoContext::rotate' => ['', 'angle' => 'string', 'context' => 'cairocontext'], 'CairoContext::save' => ['', 'context' => 'cairocontext'], 'CairoContext::scale' => ['', 'x' => 'string', 'y' => 'string', 'context' => 'cairocontext'], 'CairoContext::selectFontFace' => ['', 'family' => 'string', 'slant=' => 'string', 'weight=' => 'string', 'context=' => 'cairocontext'], 'CairoContext::setAntialias' => ['', 'antialias=' => 'string', 'context=' => 'cairocontext'], 'CairoContext::setDash' => ['', 'dashes' => 'array', 'offset=' => 'string', 'context=' => 'cairocontext'], 'CairoContext::setFillRule' => ['', 'setting' => 'string', 'context' => 'cairocontext'], 'CairoContext::setFontFace' => ['', 'fontface' => 'cairofontface', 'context' => 'cairocontext'], 'CairoContext::setFontMatrix' => ['', 'matrix' => 'cairomatrix', 'context' => 'cairocontext'], 'CairoContext::setFontOptions' => ['', 'fontoptions' => 'cairofontoptions', 'context' => 'cairocontext'], 'CairoContext::setFontSize' => ['', 'size' => 'string', 'context' => 'cairocontext'], 'CairoContext::setLineCap' => ['', 'setting' => 'string', 'context' => 'cairocontext'], 'CairoContext::setLineJoin' => ['', 'setting' => 'string', 'context' => 'cairocontext'], 'CairoContext::setLineWidth' => ['', 'width' => 'string', 'context' => 'cairocontext'], 'CairoContext::setMatrix' => ['', 'matrix' => 'cairomatrix', 'context' => 'cairocontext'], 'CairoContext::setMiterLimit' => ['', 'limit' => 'string', 'context' => 'cairocontext'], 'CairoContext::setOperator' => ['', 'setting' => 'string', 'context' => 'cairocontext'], 'CairoContext::setScaledFont' => ['', 'scaledfont' => 'cairoscaledfont', 'context' => 'cairocontext'], 'CairoContext::setSource' => ['', 'pattern' => 'cairopattern', 'context' => 'cairocontext'], 'CairoContext::setSourceRGB' => ['', 'red' => 'string', 'green' => 'string', 'blue' => 'string', 'context' => 'cairocontext', 'pattern' => 'cairopattern'], 'CairoContext::setSourceRGBA' => ['', 'red' => 'string', 'green' => 'string', 'blue' => 'string', 'alpha' => 'string', 'context' => 'cairocontext', 'pattern' => 'cairopattern'], 'CairoContext::setSourceSurface' => ['', 'surface' => 'cairosurface', 'x=' => 'string', 'y=' => 'string', 'context=' => 'cairocontext'], 'CairoContext::setTolerance' => ['', 'tolerance' => 'string', 'context' => 'cairocontext'], 'CairoContext::showPage' => ['', 'context' => 'cairocontext'], 'CairoContext::showText' => ['', 'text' => 'string', 'context' => 'cairocontext'], 'CairoContext::status' => ['int', 'context' => 'cairocontext'], 'CairoContext::stroke' => ['', 'context' => 'cairocontext'], 'CairoContext::strokeExtents' => ['array', 'context' => 'cairocontext'], 'CairoContext::strokePreserve' => ['', 'context' => 'cairocontext'], 'CairoContext::textExtents' => ['array', 'text' => 'string', 'context' => 'cairocontext'], 'CairoContext::textPath' => ['', 'string' => 'string', 'context' => 'cairocontext', 'text' => 'string'], 'CairoContext::transform' => ['', 'matrix' => 'cairomatrix', 'context' => 'cairocontext'], 'CairoContext::translate' => ['', 'x' => 'string', 'y' => 'string', 'context' => 'cairocontext'], 'CairoContext::userToDevice' => ['array', 'x' => 'string', 'y' => 'string', 'context' => 'cairocontext'], 'CairoContext::userToDeviceDistance' => ['array', 'x' => 'string', 'y' => 'string', 'context' => 'cairocontext'], 'CairoFontFace::__construct' => ['void'], 'CairoFontFace::getType' => ['int'], 'CairoFontFace::status' => ['int', 'fontface' => 'cairofontface'], 'CairoFontOptions::__construct' => ['void'], 'CairoFontOptions::equal' => ['bool', 'other' => 'string'], 'CairoFontOptions::getAntialias' => ['int', 'context' => 'cairocontext'], 'CairoFontOptions::getHintMetrics' => ['int'], 'CairoFontOptions::getHintStyle' => ['int'], 'CairoFontOptions::getSubpixelOrder' => ['int'], 'CairoFontOptions::hash' => ['int'], 'CairoFontOptions::merge' => ['void', 'other' => 'string'], 'CairoFontOptions::setAntialias' => ['', 'antialias=' => 'string', 'context=' => 'cairocontext'], 'CairoFontOptions::setHintMetrics' => ['void', 'hint_metrics' => 'string'], 'CairoFontOptions::setHintStyle' => ['void', 'hint_style' => 'string'], 'CairoFontOptions::setSubpixelOrder' => ['void', 'subpixel_order' => 'string'], 'CairoFontOptions::status' => ['int', 'context' => 'cairocontext'], 'CairoFormat::strideForWidth' => ['int', 'format' => 'int', 'width' => 'int'], 'CairoGradientPattern::addColorStopRgb' => ['void', 'offset' => 'string', 'red' => 'string', 'green' => 'string', 'blue' => 'string'], 'CairoGradientPattern::addColorStopRgba' => ['void', 'offset' => 'string', 'red' => 'string', 'green' => 'string', 'blue' => 'string', 'alpha' => 'string'], 'CairoGradientPattern::getColorStopCount' => ['int'], 'CairoGradientPattern::getColorStopRgba' => ['array', 'index' => 'string'], 'CairoGradientPattern::getExtend' => ['int'], 'CairoGradientPattern::setExtend' => ['void', 'extend' => 'int'], 'CairoImageSurface::__construct' => ['void', 'format' => 'int', 'width' => 'int', 'height' => 'int'], 'CairoImageSurface::createForData' => ['void', 'data' => 'string', 'format' => 'int', 'width' => 'int', 'height' => 'int', 'stride=' => 'int'], 'CairoImageSurface::createFromPng' => ['CairoImageSurface', 'file' => 'string'], 'CairoImageSurface::getData' => ['string'], 'CairoImageSurface::getFormat' => ['int'], 'CairoImageSurface::getHeight' => ['int'], 'CairoImageSurface::getStride' => ['int'], 'CairoImageSurface::getWidth' => ['int'], 'CairoLinearGradient::__construct' => ['void', 'x0' => 'float', 'y0' => 'float', 'x1' => 'float', 'y1' => 'float'], 'CairoLinearGradient::getPoints' => ['array'], 'CairoMatrix::__construct' => ['void', 'xx=' => 'float', 'yx=' => 'float', 'xy=' => 'float', 'yy=' => 'float', 'x0=' => 'float', 'y0=' => 'float'], 'CairoMatrix::initIdentity' => ['object'], 'CairoMatrix::initRotate' => ['object', 'radians' => 'float'], 'CairoMatrix::initScale' => ['object', 'sx' => 'float', 'sy' => 'float'], 'CairoMatrix::initTranslate' => ['object', 'tx' => 'float', 'ty' => 'float'], 'CairoMatrix::invert' => ['void'], 'CairoMatrix::multiply' => ['CairoMatrix', 'matrix1' => 'cairomatrix', 'matrix2' => 'cairomatrix'], 'CairoMatrix::rotate' => ['', 'sx' => 'string', 'sy' => 'string', 'context' => 'cairocontext', 'angle' => 'string'], 'CairoMatrix::scale' => ['', 'sx' => 'float', 'sy' => 'float', 'context' => 'cairocontext'], 'CairoMatrix::transformDistance' => ['array', 'dx' => 'string', 'dy' => 'string'], 'CairoMatrix::transformPoint' => ['array', 'dx' => 'string', 'dy' => 'string'], 'CairoMatrix::translate' => ['', 'tx' => 'string', 'ty' => 'string', 'context' => 'cairocontext', 'x' => 'string', 'y' => 'string'], 'CairoPattern::__construct' => ['void'], 'CairoPattern::getMatrix' => ['', 'context' => 'cairocontext'], 'CairoPattern::getType' => ['int'], 'CairoPattern::setMatrix' => ['', 'matrix' => 'cairomatrix', 'context' => 'cairocontext'], 'CairoPattern::status' => ['int', 'context' => 'cairocontext'], 'CairoPdfSurface::__construct' => ['void', 'file' => 'string', 'width' => 'float', 'height' => 'float'], 'CairoPdfSurface::setSize' => ['void', 'width' => 'string', 'height' => 'string'], 'CairoPsSurface::__construct' => ['void', 'file' => 'string', 'width' => 'float', 'height' => 'float'], 'CairoPsSurface::dscBeginPageSetup' => ['void'], 'CairoPsSurface::dscBeginSetup' => ['void'], 'CairoPsSurface::dscComment' => ['void', 'comment' => 'string'], 'CairoPsSurface::getEps' => ['bool'], 'CairoPsSurface::getLevels' => ['array'], 'CairoPsSurface::levelToString' => ['string', 'level' => 'int'], 'CairoPsSurface::restrictToLevel' => ['void', 'level' => 'string'], 'CairoPsSurface::setEps' => ['void', 'level' => 'string'], 'CairoPsSurface::setSize' => ['void', 'width' => 'string', 'height' => 'string'], 'CairoRadialGradient::__construct' => ['void', 'x0' => 'float', 'y0' => 'float', 'r0' => 'float', 'x1' => 'float', 'y1' => 'float', 'r1' => 'float'], 'CairoRadialGradient::getCircles' => ['array'], 'CairoScaledFont::__construct' => ['void', 'font_face' => 'CairoFontFace', 'matrix' => 'CairoMatrix', 'ctm' => 'CairoMatrix', 'options' => 'CairoFontOptions'], 'CairoScaledFont::extents' => ['array'], 'CairoScaledFont::getCtm' => ['CairoMatrix'], 'CairoScaledFont::getFontFace' => ['', 'context' => 'cairocontext'], 'CairoScaledFont::getFontMatrix' => ['', 'context' => 'cairocontext'], 'CairoScaledFont::getFontOptions' => ['', 'context' => 'cairocontext'], 'CairoScaledFont::getScaleMatrix' => ['void'], 'CairoScaledFont::getType' => ['int'], 'CairoScaledFont::glyphExtents' => ['array', 'glyphs' => 'string'], 'CairoScaledFont::status' => ['int', 'context' => 'cairocontext'], 'CairoScaledFont::textExtents' => ['array', 'text' => 'string', 'context' => 'cairocontext'], 'CairoSolidPattern::__construct' => ['void', 'red' => 'float', 'green' => 'float', 'blue' => 'float', 'alpha=' => 'float'], 'CairoSolidPattern::getRgba' => ['array'], 'CairoSurface::__construct' => ['void'], 'CairoSurface::copyPage' => ['', 'context' => 'cairocontext'], 'CairoSurface::createSimilar' => ['void', 'other' => 'cairosurface', 'content' => 'int', 'width' => 'string', 'height' => 'string'], 'CairoSurface::finish' => ['void'], 'CairoSurface::flush' => ['void'], 'CairoSurface::getContent' => ['int'], 'CairoSurface::getDeviceOffset' => ['array'], 'CairoSurface::getFontOptions' => ['', 'context' => 'cairocontext'], 'CairoSurface::getType' => ['int'], 'CairoSurface::markDirty' => ['void'], 'CairoSurface::markDirtyRectangle' => ['void', 'x' => 'string', 'y' => 'string', 'width' => 'string', 'height' => 'string'], 'CairoSurface::setDeviceOffset' => ['void', 'x' => 'string', 'y' => 'string'], 'CairoSurface::setFallbackResolution' => ['void', 'x' => 'string', 'y' => 'string'], 'CairoSurface::showPage' => ['', 'context' => 'cairocontext'], 'CairoSurface::status' => ['int', 'context' => 'cairocontext'], 'CairoSurface::writeToPng' => ['void', 'file' => 'string'], 'CairoSurfacePattern::__construct' => ['void', 'surface' => 'CairoSurface'], 'CairoSurfacePattern::getExtend' => ['int'], 'CairoSurfacePattern::getFilter' => ['int'], 'CairoSurfacePattern::getSurface' => ['void'], 'CairoSurfacePattern::setExtend' => ['void', 'extend' => 'int'], 'CairoSurfacePattern::setFilter' => ['void', 'filter' => 'string'], 'CairoSvgSurface::__construct' => ['void', 'file' => 'string', 'width' => 'float', 'height' => 'float'], 'CairoSvgSurface::getVersions' => ['array'], 'CairoSvgSurface::restrictToVersion' => ['void', 'version' => 'string'], 'CairoSvgSurface::versionToString' => ['string', 'version' => 'int'], 'cal_days_in_month' => ['int', 'calendar' => 'int', 'month' => 'int', 'year' => 'int'], 'cal_from_jd' => ['array', 'jd' => 'int', 'calendar' => 'int'], 'cal_info' => ['array', 'calendar=' => 'int'], 'cal_to_jd' => ['int', 'calendar' => 'int', 'month' => 'int', 'day' => 'int', 'year' => 'int'], 'calcul_hmac' => ['string', 'clent' => 'string', 'siretcode' => 'string', 'price' => 'string', 'reference' => 'string', 'validity' => 'string', 'taxation' => 'string', 'devise' => 'string', 'language' => 'string'], 'calculhmac' => ['string', 'clent' => 'string', 'data' => 'string'], 'call_user_func' => ['mixed', 'function' => 'callable', '...parameters=' => 'mixed'], 'call_user_func_array' => ['mixed', 'function' => 'callable', 'parameters' => 'array<int,mixed>'], 'call_user_method' => ['mixed', 'method_name' => 'string', 'obj' => 'object', 'parameter=' => 'mixed', '...args=' => 'mixed'], 'call_user_method_array' => ['mixed', 'method_name' => 'string', 'obj' => 'object', 'params' => 'array<int,mixed>'], 'CallbackFilterIterator::__construct' => ['void', 'it' => 'iterator', 'func' => 'callable'], 'CallbackFilterIterator::accept' => ['bool'], 'CallbackFilterIterator::current' => ['mixed'], 'CallbackFilterIterator::getInnerIterator' => ['iterator'], 'CallbackFilterIterator::key' => ['mixed'], 'CallbackFilterIterator::next' => ['void'], 'CallbackFilterIterator::rewind' => ['void'], 'CallbackFilterIterator::valid' => ['bool'], 'ceil' => ['float|int', 'number' => 'float'], 'chdb::__construct' => ['void', 'pathname' => 'string'], 'chdb::get' => ['string', 'key' => 'string'], 'chdb_create' => ['bool', 'pathname' => 'string', 'data' => 'array'], 'chdir' => ['bool', 'directory' => 'string'], 'checkdate' => ['bool', 'month' => 'int', 'day' => 'int', 'year' => 'int'], 'checkdnsrr' => ['bool', 'host' => 'string', 'type=' => 'string'], 'chgrp' => ['bool', 'filename' => 'string', 'group' => 'string|int'], 'chmod' => ['bool', 'filename' => 'string', 'mode' => 'int'], 'chop' => ['string', 'str' => 'string', 'character_mask=' => 'string'], 'chown' => ['bool', 'filename' => 'string', 'user' => 'string|int'], 'chr' => ['string', 'ascii' => 'int'], 'chroot' => ['bool', 'directory' => 'string'], 'chunk_split' => ['string', 'str' => 'string', 'chunklen=' => 'int', 'ending=' => 'string'], 'class_alias' => ['bool', 'user_class_name' => 'string', 'alias_name' => 'string', 'autoload=' => 'bool'], 'class_exists' => ['bool', 'classname' => 'string', 'autoload=' => 'bool'], 'class_implements' => ['array<string,string>', 'what' => 'object|string', 'autoload=' => 'bool'], 'class_parents' => ['array<string,string>', 'instance' => 'object|string', 'autoload=' => 'bool'], 'class_uses' => ['array<string,string>', 'what' => 'object|string', 'autoload=' => 'bool'], 'classkit_import' => ['array', 'filename' => 'string'], 'classkit_method_add' => ['bool', 'classname' => 'string', 'methodname' => 'string', 'args' => 'string', 'code' => 'string', 'flags=' => 'int'], 'classkit_method_copy' => ['bool', 'dclass' => 'string', 'dmethod' => 'string', 'sclass' => 'string', 'smethod=' => 'string'], 'classkit_method_redefine' => ['bool', 'classname' => 'string', 'methodname' => 'string', 'args' => 'string', 'code' => 'string', 'flags=' => 'int'], 'classkit_method_remove' => ['bool', 'classname' => 'string', 'methodname' => 'string'], 'classkit_method_rename' => ['bool', 'classname' => 'string', 'methodname' => 'string', 'newname' => 'string'], 'classObj::__construct' => ['void', 'layer' => 'layerObj', 'class' => 'classObj'], 'classObj::addLabel' => ['int', 'label' => 'labelObj'], 'classObj::convertToString' => ['string'], 'classObj::createLegendIcon' => ['imageObj', 'width' => 'int', 'height' => 'int'], 'classObj::deletestyle' => ['int', 'index' => 'int'], 'classObj::drawLegendIcon' => ['int', 'width' => 'int', 'height' => 'int', 'im' => 'imageObj', 'dstX' => 'int', 'dstY' => 'int'], 'classObj::free' => ['void'], 'classObj::getExpressionString' => ['string'], 'classObj::getLabel' => ['labelObj', 'index' => 'int'], 'classObj::getMetaData' => ['int', 'name' => 'string'], 'classObj::getStyle' => ['styleObj', 'index' => 'int'], 'classObj::getTextString' => ['string'], 'classObj::movestyledown' => ['int', 'index' => 'int'], 'classObj::movestyleup' => ['int', 'index' => 'int'], 'classObj::ms_newClassObj' => ['classObj', 'layer' => 'layerObj', 'class' => 'classObj'], 'classObj::removeLabel' => ['labelObj', 'index' => 'int'], 'classObj::removeMetaData' => ['int', 'name' => 'string'], 'classObj::set' => ['int', 'property_name' => 'string', 'new_value' => ''], 'classObj::setExpression' => ['int', 'expression' => 'string'], 'classObj::setMetaData' => ['int', 'name' => 'string', 'value' => 'string'], 'classObj::settext' => ['int', 'text' => 'string'], 'classObj::updateFromString' => ['int', 'snippet' => 'string'], 'clearstatcache' => ['void', 'clear_realpath_cache=' => 'bool', 'filename=' => 'string'], 'cli_get_process_title' => ['string'], 'cli_set_process_title' => ['bool', 'arg' => 'string'], 'ClosedGeneratorException::__clone' => ['void'], 'ClosedGeneratorException::__toString' => ['string'], 'ClosedGeneratorException::getCode' => ['int'], 'ClosedGeneratorException::getFile' => ['string'], 'ClosedGeneratorException::getLine' => ['int'], 'ClosedGeneratorException::getMessage' => ['string'], 'ClosedGeneratorException::getPrevious' => ['Throwable|ClosedGeneratorException|null'], 'ClosedGeneratorException::getTrace' => ['array'], 'ClosedGeneratorException::getTraceAsString' => ['string'], 'closedir' => ['void', 'dir_handle=' => 'resource'], 'closelog' => ['bool'], 'Closure::__construct' => ['void'], 'Closure::__invoke' => ['', '...args=' => ''], 'Closure::bind' => ['Closure', 'old' => 'Closure', 'to' => '?object', 'scope=' => 'object|string'], 'Closure::bindTo' => ['Closure', 'new' => '?object', 'newscope=' => 'object|string'], 'Closure::call' => ['', 'to' => 'object', '...parameters=' => ''], 'Closure::fromCallable' => ['Closure', 'callable' => 'callable'], 'clusterObj::convertToString' => ['string'], 'clusterObj::getFilterString' => ['string'], 'clusterObj::getGroupString' => ['string'], 'clusterObj::setFilter' => ['int', 'expression' => 'string'], 'clusterObj::setGroup' => ['int', 'expression' => 'string'], 'Collator::__construct' => ['void', 'locale' => 'string'], 'Collator::asort' => ['bool', '&rw_arr' => 'array', 'sort_flag=' => 'int'], 'Collator::compare' => ['int', 'str1' => 'string', 'str2' => 'string'], 'Collator::create' => ['Collator', 'locale' => 'string'], 'Collator::getAttribute' => ['int', 'attr' => 'int'], 'Collator::getErrorCode' => ['int'], 'Collator::getErrorMessage' => ['string'], 'Collator::getLocale' => ['string', 'type' => 'int'], 'Collator::getSortKey' => ['string', 'str' => 'string'], 'Collator::getStrength' => ['int'], 'Collator::setAttribute' => ['bool', 'attr' => 'int', 'val' => 'int'], 'Collator::setStrength' => ['bool', 'strength' => 'int'], 'Collator::sort' => ['bool', '&rw_arr' => 'array', 'sort_flags=' => 'int'], 'Collator::sortWithSortKeys' => ['bool', '&rw_arr' => 'array'], 'collator_asort' => ['bool', 'coll' => 'collator', '&rw_arr' => 'array', 'sort_flag=' => 'int'], 'collator_compare' => ['int', 'coll' => 'collator', 'str1' => 'string', 'str2' => 'string'], 'collator_create' => ['Collator', 'locale' => 'string'], 'collator_get_attribute' => ['int', 'coll' => 'collator', 'attr' => 'int'], 'collator_get_error_code' => ['int', 'coll' => 'collator'], 'collator_get_error_message' => ['string', 'coll' => 'collator'], 'collator_get_locale' => ['string', 'coll' => 'collator', 'type' => 'int'], 'collator_get_sort_key' => ['string', 'coll' => 'collator', 'str' => 'string'], 'collator_get_strength' => ['int', 'coll' => 'collator'], 'collator_set_attribute' => ['bool', 'coll' => 'collator', 'attr' => 'int', 'val' => 'int'], 'collator_set_strength' => ['bool', 'coll' => 'collator', 'strength' => 'int'], 'collator_sort' => ['bool', 'coll' => 'collator', '&rw_arr' => 'array', 'sort_flag=' => 'int'], 'collator_sort_with_sort_keys' => ['bool', 'coll' => 'collator', '&rw_arr' => 'array'], 'Collectable::isGarbage' => ['bool'], 'Collectable::setGarbage' => ['void'], 'colorObj::setHex' => ['int', 'hex' => 'string'], 'colorObj::toHex' => ['string'], 'COM::__call' => ['', 'name' => '', 'args' => ''], 'COM::__construct' => ['void', 'module_name' => 'string', 'server_name=' => 'mixed', 'codepage=' => 'int', 'typelib=' => 'string'], 'COM::__get' => ['', 'name' => ''], 'COM::__set' => ['', 'name' => '', 'value' => ''], 'com_addref' => [''], 'com_create_guid' => ['string'], 'com_event_sink' => ['bool', 'comobject' => 'object', 'sinkobject' => 'object', 'sinkinterface=' => 'mixed'], 'com_get_active_object' => ['object', 'progid' => 'string', 'code_page=' => 'int'], 'com_isenum' => ['bool', 'com_module' => 'variant'], 'com_load_typelib' => ['bool', 'typelib_name' => 'string', 'case_insensitive=' => 'int'], 'com_message_pump' => ['bool', 'timeoutms=' => 'int'], 'com_print_typeinfo' => ['bool', 'comobject_or_typelib' => 'object', 'dispinterface=' => 'string', 'wantsink=' => 'bool'], 'com_release' => [''], 'compact' => ['array', '...var_names=' => 'string|array'], 'COMPersistHelper::__construct' => ['void', 'com_object' => 'object'], 'COMPersistHelper::GetCurFile' => ['string'], 'COMPersistHelper::GetMaxStreamSize' => ['int'], 'COMPersistHelper::InitNew' => ['int'], 'COMPersistHelper::LoadFromFile' => ['bool', 'filename' => 'string', 'flags' => 'int'], 'COMPersistHelper::LoadFromStream' => ['', 'stream' => ''], 'COMPersistHelper::SaveToFile' => ['bool', 'filename' => 'string', 'remember' => 'bool'], 'COMPersistHelper::SaveToStream' => ['int', 'stream' => ''], '_HumbugBoxb94336daae36\\componere\\cast' => ['Type', 'arg1' => '', 'object' => ''], '_HumbugBoxb94336daae36\\componere\\cast_by_ref' => ['Type', 'arg1' => '', 'object' => ''], 'Cond::broadcast' => ['bool', 'condition' => 'long'], 'Cond::create' => ['long'], 'Cond::destroy' => ['bool', 'condition' => 'long'], 'Cond::signal' => ['bool', 'condition' => 'long'], 'Cond::wait' => ['bool', 'condition' => 'long', 'mutex' => 'long', 'timeout=' => 'long'], 'confirm_pdo_ibm_compiled' => [''], 'connection_aborted' => ['int'], 'connection_status' => ['int'], 'connection_timeout' => ['int'], 'constant' => ['mixed', 'const_name' => 'string'], 'convert_cyr_string' => ['string', 'str' => 'string', 'from' => 'string', 'to' => 'string'], 'convert_uudecode' => ['string', 'data' => 'string'], 'convert_uuencode' => ['string', 'data' => 'string'], 'copy' => ['bool', 'source_file' => 'string', 'destination_file' => 'string', 'context=' => 'resource'], 'cos' => ['float', 'number' => 'float'], 'cosh' => ['float', 'number' => 'float'], 'Couchbase\\AnalyticsQuery::__construct' => ['void'], 'Couchbase\\AnalyticsQuery::fromString' => ['_HumbugBoxb94336daae36\\Couchbase\\AnalyticsQuery', 'statement' => 'string'], '_HumbugBoxb94336daae36\\Couchbase\\basicDecoderV1' => ['mixed', 'bytes' => 'string', 'flags' => 'int', 'datatype' => 'int', 'options' => 'array'], '_HumbugBoxb94336daae36\\Couchbase\\basicEncoderV1' => ['array', 'value' => 'mixed', 'options' => 'array'], 'Couchbase\\BooleanFieldSearchQuery::__construct' => ['void'], 'Couchbase\\BooleanFieldSearchQuery::boost' => ['_HumbugBoxb94336daae36\\Couchbase\\BooleanFieldSearchQuery', 'boost' => 'float'], 'Couchbase\\BooleanFieldSearchQuery::field' => ['_HumbugBoxb94336daae36\\Couchbase\\BooleanFieldSearchQuery', 'field' => 'string'], 'Couchbase\\BooleanFieldSearchQuery::jsonSerialize' => ['array'], 'Couchbase\\BooleanSearchQuery::__construct' => ['void'], 'Couchbase\\BooleanSearchQuery::boost' => ['_HumbugBoxb94336daae36\\Couchbase\\BooleanSearchQuery', 'boost' => 'float'], 'Couchbase\\BooleanSearchQuery::jsonSerialize' => ['array'], 'Couchbase\\BooleanSearchQuery::must' => ['_HumbugBoxb94336daae36\\Couchbase\\BooleanSearchQuery', '...queries=' => 'array<int,Couchbase\\SearchQueryPart>'], 'Couchbase\\BooleanSearchQuery::mustNot' => ['_HumbugBoxb94336daae36\\Couchbase\\BooleanSearchQuery', '...queries=' => 'array<int,Couchbase\\SearchQueryPart>'], 'Couchbase\\BooleanSearchQuery::should' => ['_HumbugBoxb94336daae36\\Couchbase\\BooleanSearchQuery', '...queries=' => 'array<int,Couchbase\\SearchQueryPart>'], 'Couchbase\\Bucket::__construct' => ['void'], 'Couchbase\\Bucket::__get' => ['int', 'name' => 'string'], 'Couchbase\\Bucket::__set' => ['int', 'name' => 'string', 'value' => 'int'], 'Couchbase\\Bucket::append' => ['Couchbase\\Document|array', 'ids' => 'array|string', 'value' => 'mixed', 'options=' => 'array'], 'Couchbase\\Bucket::counter' => ['Couchbase\\Document|array', 'ids' => 'array|string', 'delta=' => 'int', 'options=' => 'array'], 'Couchbase\\Bucket::diag' => ['array', 'reportId=' => 'string'], 'Couchbase\\Bucket::get' => ['Couchbase\\Document|array', 'ids' => 'array|string', 'options=' => 'array'], 'Couchbase\\Bucket::getAndLock' => ['Couchbase\\Document|array', 'ids' => 'array|string', 'lockTime' => 'int', 'options=' => 'array'], 'Couchbase\\Bucket::getAndTouch' => ['Couchbase\\Document|array', 'ids' => 'array|string', 'expiry' => 'int', 'options=' => 'array'], 'Couchbase\\Bucket::getFromReplica' => ['Couchbase\\Document|array', 'ids' => 'array|string', 'options=' => 'array'], 'Couchbase\\Bucket::insert' => ['Couchbase\\Document|array', 'ids' => 'array|string', 'value' => 'mixed', 'options=' => 'array'], 'Couchbase\\Bucket::listExists' => ['bool', 'id' => 'string', 'value' => 'mixed'], 'Couchbase\\Bucket::listGet' => ['mixed', 'id' => 'string', 'index' => 'int'], 'Couchbase\\Bucket::listPush' => ['', 'id' => 'string', 'value' => 'mixed'], 'Couchbase\\Bucket::listRemove' => ['', 'id' => 'string', 'index' => 'int'], 'Couchbase\\Bucket::listSet' => ['', 'id' => 'string', 'index' => 'int', 'value' => 'mixed'], 'Couchbase\\Bucket::listShift' => ['', 'id' => 'string', 'value' => 'mixed'], 'Couchbase\\Bucket::listSize' => ['int', 'id' => 'string'], 'Couchbase\\Bucket::lookupIn' => ['_HumbugBoxb94336daae36\\Couchbase\\LookupInBuilder', 'id' => 'string'], 'Couchbase\\Bucket::manager' => ['_HumbugBoxb94336daae36\\Couchbase\\BucketManager'], 'Couchbase\\Bucket::mapAdd' => ['', 'id' => 'string', 'key' => 'string', 'value' => 'mixed'], 'Couchbase\\Bucket::mapGet' => ['mixed', 'id' => 'string', 'key' => 'string'], 'Couchbase\\Bucket::mapRemove' => ['', 'id' => 'string', 'key' => 'string'], 'Couchbase\\Bucket::mapSize' => ['int', 'id' => 'string'], 'Couchbase\\Bucket::mutateIn' => ['_HumbugBoxb94336daae36\\Couchbase\\MutateInBuilder', 'id' => 'string', 'cas' => 'string'], 'Couchbase\\Bucket::ping' => ['array', 'services=' => 'int', 'reportId=' => 'string'], 'Couchbase\\Bucket::prepend' => ['Couchbase\\Document|array', 'ids' => 'array|string', 'value' => 'mixed', 'options=' => 'array'], 'Couchbase\\Bucket::query' => ['object', 'query' => '_HumbugBoxb94336daae36\\Couchbase\\AnalyticsQuery|Couchbase\\N1qlQuery|Couchbase\\SearchQuery|Couchbase\\SpatialViewQuery|Couchbase\\ViewQuery', 'jsonAsArray=' => 'bool|false'], 'Couchbase\\Bucket::queueAdd' => ['', 'id' => 'string', 'value' => 'mixed'], 'Couchbase\\Bucket::queueExists' => ['bool', 'id' => 'string', 'value' => 'mixed'], 'Couchbase\\Bucket::queueRemove' => ['mixed', 'id' => 'string'], 'Couchbase\\Bucket::queueSize' => ['int', 'id' => 'string'], 'Couchbase\\Bucket::remove' => ['Couchbase\\Document|array', 'ids' => 'array|string', 'options=' => 'array'], 'Couchbase\\Bucket::replace' => ['Couchbase\\Document|array', 'ids' => 'array|string', 'value' => 'mixed', 'options=' => 'array'], 'Couchbase\\Bucket::retrieveIn' => ['_HumbugBoxb94336daae36\\Couchbase\\DocumentFragment', 'id' => 'string', '...paths=' => 'array<int,string>'], 'Couchbase\\Bucket::setAdd' => ['', 'id' => 'string', 'value' => 'bool|float|int|string'], 'Couchbase\\Bucket::setExists' => ['bool', 'id' => 'string', 'value' => 'bool|float|int|string'], 'Couchbase\\Bucket::setRemove' => ['', 'id' => 'string', 'value' => 'bool|float|int|string'], 'Couchbase\\Bucket::setSize' => ['int', 'id' => 'string'], 'Couchbase\\Bucket::setTranscoder' => ['', 'encoder' => 'callable', 'decoder' => 'callable'], 'Couchbase\\Bucket::touch' => ['Couchbase\\Document|array', 'ids' => 'array|string', 'expiry' => 'int', 'options=' => 'array'], 'Couchbase\\Bucket::unlock' => ['Couchbase\\Document|array', 'ids' => 'array|string', 'options=' => 'array'], 'Couchbase\\Bucket::upsert' => ['Couchbase\\Document|array', 'ids' => 'array|string', 'value' => 'mixed', 'options=' => 'array'], 'Couchbase\\BucketManager::__construct' => ['void'], 'Couchbase\\BucketManager::createN1qlIndex' => ['', 'name' => 'string', 'fields' => 'array', 'whereClause=' => 'string', 'ignoreIfExist=' => 'bool|false', 'defer=' => 'bool|false'], 'Couchbase\\BucketManager::createN1qlPrimaryIndex' => ['', 'customName=' => 'string', 'ignoreIfExist=' => 'bool|false', 'defer=' => 'bool|false'], 'Couchbase\\BucketManager::dropN1qlIndex' => ['', 'name' => 'string', 'ignoreIfNotExist=' => 'bool|false'], 'Couchbase\\BucketManager::dropN1qlPrimaryIndex' => ['', 'customName=' => 'string', 'ignoreIfNotExist=' => 'bool|false'], 'Couchbase\\BucketManager::flush' => [''], 'Couchbase\\BucketManager::getDesignDocument' => ['array', 'name' => 'string'], 'Couchbase\\BucketManager::info' => ['array'], 'Couchbase\\BucketManager::insertDesignDocument' => ['', 'name' => 'string', 'document' => 'array'], 'Couchbase\\BucketManager::listDesignDocuments' => ['array'], 'Couchbase\\BucketManager::listN1qlIndexes' => ['array'], 'Couchbase\\BucketManager::removeDesignDocument' => ['', 'name' => 'string'], 'Couchbase\\BucketManager::upsertDesignDocument' => ['', 'name' => 'string', 'document' => 'array'], 'Couchbase\\ClassicAuthenticator::bucket' => ['', 'name' => 'string', 'password' => 'string'], 'Couchbase\\ClassicAuthenticator::cluster' => ['', 'username' => 'string', 'password' => 'string'], 'Couchbase\\Cluster::__construct' => ['void', 'connstr' => 'string'], 'Couchbase\\Cluster::authenticate' => ['null', 'authenticator' => '_HumbugBoxb94336daae36\\Couchbase\\Authenticator'], 'Couchbase\\Cluster::authenticateAs' => ['null', 'username' => 'string', 'password' => 'string'], 'Couchbase\\Cluster::manager' => ['_HumbugBoxb94336daae36\\Couchbase\\ClusterManager', 'username=' => 'string', 'password=' => 'string'], 'Couchbase\\Cluster::openBucket' => ['_HumbugBoxb94336daae36\\Couchbase\\Bucket', 'name=' => 'string', 'password=' => 'string'], 'Couchbase\\ClusterManager::__construct' => ['void'], 'Couchbase\\ClusterManager::createBucket' => ['', 'name' => 'string', 'options=' => 'array'], 'Couchbase\\ClusterManager::getUser' => ['array', 'username' => 'string', 'domain=' => 'int'], 'Couchbase\\ClusterManager::info' => ['array'], 'Couchbase\\ClusterManager::listBuckets' => ['array'], 'Couchbase\\ClusterManager::listUsers' => ['array', 'domain=' => 'int'], 'Couchbase\\ClusterManager::removeBucket' => ['', 'name' => 'string'], 'Couchbase\\ClusterManager::removeUser' => ['', 'name' => 'string', 'domain=' => 'int'], 'Couchbase\\ClusterManager::upsertUser' => ['', 'name' => 'string', 'settings' => '_HumbugBoxb94336daae36\\Couchbase\\UserSettings', 'domain=' => 'int'], 'Couchbase\\ConjunctionSearchQuery::__construct' => ['void'], 'Couchbase\\ConjunctionSearchQuery::boost' => ['_HumbugBoxb94336daae36\\Couchbase\\ConjunctionSearchQuery', 'boost' => 'float'], 'Couchbase\\ConjunctionSearchQuery::every' => ['_HumbugBoxb94336daae36\\Couchbase\\ConjunctionSearchQuery', '...queries=' => 'array<int,Couchbase\\SearchQueryPart>'], 'Couchbase\\ConjunctionSearchQuery::jsonSerialize' => ['array'], 'Couchbase\\DateRangeSearchFacet::__construct' => ['void'], 'Couchbase\\DateRangeSearchFacet::addRange' => ['_HumbugBoxb94336daae36\\Couchbase\\DateSearchFacet', 'name' => 'string', 'start' => 'int|string', 'end' => 'int|string'], 'Couchbase\\DateRangeSearchFacet::jsonSerialize' => ['array'], 'Couchbase\\DateRangeSearchQuery::__construct' => ['void'], 'Couchbase\\DateRangeSearchQuery::boost' => ['_HumbugBoxb94336daae36\\Couchbase\\DateRangeSearchQuery', 'boost' => 'float'], 'Couchbase\\DateRangeSearchQuery::dateTimeParser' => ['_HumbugBoxb94336daae36\\Couchbase\\DateRangeSearchQuery', 'dateTimeParser' => 'string'], 'Couchbase\\DateRangeSearchQuery::end' => ['_HumbugBoxb94336daae36\\Couchbase\\DateRangeSearchQuery', 'end' => 'int|string', 'inclusive=' => 'bool|false'], 'Couchbase\\DateRangeSearchQuery::field' => ['_HumbugBoxb94336daae36\\Couchbase\\DateRangeSearchQuery', 'field' => 'string'], 'Couchbase\\DateRangeSearchQuery::jsonSerialize' => ['array'], 'Couchbase\\DateRangeSearchQuery::start' => ['_HumbugBoxb94336daae36\\Couchbase\\DateRangeSearchQuery', 'start' => 'int|string', 'inclusive=' => 'bool|true'], '_HumbugBoxb94336daae36\\Couchbase\\defaultDecoder' => ['mixed', 'bytes' => 'string', 'flags' => 'int', 'datatype' => 'int'], '_HumbugBoxb94336daae36\\Couchbase\\defaultEncoder' => ['array', 'value' => 'mixed'], 'Couchbase\\DisjunctionSearchQuery::__construct' => ['void'], 'Couchbase\\DisjunctionSearchQuery::boost' => ['_HumbugBoxb94336daae36\\Couchbase\\DisjunctionSearchQuery', 'boost' => 'float'], 'Couchbase\\DisjunctionSearchQuery::either' => ['_HumbugBoxb94336daae36\\Couchbase\\DisjunctionSearchQuery', '...queries=' => 'array<int,Couchbase\\SearchQueryPart>'], 'Couchbase\\DisjunctionSearchQuery::jsonSerialize' => ['array'], 'Couchbase\\DisjunctionSearchQuery::min' => ['_HumbugBoxb94336daae36\\Couchbase\\DisjunctionSearchQuery', 'min' => 'int'], 'Couchbase\\DocIdSearchQuery::__construct' => ['void'], 'Couchbase\\DocIdSearchQuery::boost' => ['_HumbugBoxb94336daae36\\Couchbase\\DocIdSearchQuery', 'boost' => 'float'], 'Couchbase\\DocIdSearchQuery::docIds' => ['_HumbugBoxb94336daae36\\Couchbase\\DocIdSearchQuery', '...documentIds=' => 'array<int,string>'], 'Couchbase\\DocIdSearchQuery::field' => ['_HumbugBoxb94336daae36\\Couchbase\\DocIdSearchQuery', 'field' => 'string'], 'Couchbase\\DocIdSearchQuery::jsonSerialize' => ['array'], '_HumbugBoxb94336daae36\\Couchbase\\fastlzCompress' => ['string', 'data' => 'string'], '_HumbugBoxb94336daae36\\Couchbase\\fastlzDecompress' => ['string', 'data' => 'string'], 'Couchbase\\GeoBoundingBoxSearchQuery::__construct' => ['void'], 'Couchbase\\GeoBoundingBoxSearchQuery::boost' => ['_HumbugBoxb94336daae36\\Couchbase\\GeoBoundingBoxSearchQuery', 'boost' => 'float'], 'Couchbase\\GeoBoundingBoxSearchQuery::field' => ['_HumbugBoxb94336daae36\\Couchbase\\GeoBoundingBoxSearchQuery', 'field' => 'string'], 'Couchbase\\GeoBoundingBoxSearchQuery::jsonSerialize' => ['array'], 'Couchbase\\GeoDistanceSearchQuery::__construct' => ['void'], 'Couchbase\\GeoDistanceSearchQuery::boost' => ['_HumbugBoxb94336daae36\\Couchbase\\GeoDistanceSearchQuery', 'boost' => 'float'], 'Couchbase\\GeoDistanceSearchQuery::field' => ['_HumbugBoxb94336daae36\\Couchbase\\GeoDistanceSearchQuery', 'field' => 'string'], 'Couchbase\\GeoDistanceSearchQuery::jsonSerialize' => ['array'], 'Couchbase\\LookupInBuilder::__construct' => ['void'], 'Couchbase\\LookupInBuilder::execute' => ['_HumbugBoxb94336daae36\\Couchbase\\DocumentFragment'], 'Couchbase\\LookupInBuilder::exists' => ['_HumbugBoxb94336daae36\\Couchbase\\LookupInBuilder', 'path' => 'string', 'options=' => 'array'], 'Couchbase\\LookupInBuilder::get' => ['_HumbugBoxb94336daae36\\Couchbase\\LookupInBuilder', 'path' => 'string', 'options=' => 'array'], 'Couchbase\\LookupInBuilder::getCount' => ['_HumbugBoxb94336daae36\\Couchbase\\LookupInBuilder', 'path' => 'string', 'options=' => 'array'], 'Couchbase\\MatchAllSearchQuery::__construct' => ['void'], 'Couchbase\\MatchAllSearchQuery::boost' => ['_HumbugBoxb94336daae36\\Couchbase\\MatchAllSearchQuery', 'boost' => 'float'], 'Couchbase\\MatchAllSearchQuery::jsonSerialize' => ['array'], 'Couchbase\\MatchNoneSearchQuery::__construct' => ['void'], 'Couchbase\\MatchNoneSearchQuery::boost' => ['_HumbugBoxb94336daae36\\Couchbase\\MatchNoneSearchQuery', 'boost' => 'float'], 'Couchbase\\MatchNoneSearchQuery::jsonSerialize' => ['array'], 'Couchbase\\MatchPhraseSearchQuery::__construct' => ['void'], 'Couchbase\\MatchPhraseSearchQuery::analyzer' => ['_HumbugBoxb94336daae36\\Couchbase\\MatchPhraseSearchQuery', 'analyzer' => 'string'], 'Couchbase\\MatchPhraseSearchQuery::boost' => ['_HumbugBoxb94336daae36\\Couchbase\\MatchPhraseSearchQuery', 'boost' => 'float'], 'Couchbase\\MatchPhraseSearchQuery::field' => ['_HumbugBoxb94336daae36\\Couchbase\\MatchPhraseSearchQuery', 'field' => 'string'], 'Couchbase\\MatchPhraseSearchQuery::jsonSerialize' => ['array'], 'Couchbase\\MatchSearchQuery::__construct' => ['void'], 'Couchbase\\MatchSearchQuery::analyzer' => ['_HumbugBoxb94336daae36\\Couchbase\\MatchSearchQuery', 'analyzer' => 'string'], 'Couchbase\\MatchSearchQuery::boost' => ['_HumbugBoxb94336daae36\\Couchbase\\MatchSearchQuery', 'boost' => 'float'], 'Couchbase\\MatchSearchQuery::field' => ['_HumbugBoxb94336daae36\\Couchbase\\MatchSearchQuery', 'field' => 'string'], 'Couchbase\\MatchSearchQuery::fuzziness' => ['_HumbugBoxb94336daae36\\Couchbase\\MatchSearchQuery', 'fuzziness' => 'int'], 'Couchbase\\MatchSearchQuery::jsonSerialize' => ['array'], 'Couchbase\\MatchSearchQuery::prefixLength' => ['_HumbugBoxb94336daae36\\Couchbase\\MatchSearchQuery', 'prefixLength' => 'int'], 'Couchbase\\MutateInBuilder::__construct' => ['void'], 'Couchbase\\MutateInBuilder::arrayAddUnique' => ['_HumbugBoxb94336daae36\\Couchbase\\MutateInBuilder', 'path' => 'string', 'value' => 'mixed', 'options=' => 'array|bool'], 'Couchbase\\MutateInBuilder::arrayAppend' => ['_HumbugBoxb94336daae36\\Couchbase\\MutateInBuilder', 'path' => 'string', 'value' => 'mixed', 'options=' => 'array|bool'], 'Couchbase\\MutateInBuilder::arrayAppendAll' => ['_HumbugBoxb94336daae36\\Couchbase\\MutateInBuilder', 'path' => 'string', 'values' => 'array', 'options=' => 'array|bool'], 'Couchbase\\MutateInBuilder::arrayInsert' => ['_HumbugBoxb94336daae36\\Couchbase\\MutateInBuilder', 'path' => 'string', 'value' => 'mixed', 'options=' => 'array'], 'Couchbase\\MutateInBuilder::arrayInsertAll' => ['_HumbugBoxb94336daae36\\Couchbase\\MutateInBuilder', 'path' => 'string', 'values' => 'array', 'options=' => 'array'], 'Couchbase\\MutateInBuilder::arrayPrepend' => ['_HumbugBoxb94336daae36\\Couchbase\\MutateInBuilder', 'path' => 'string', 'value' => 'mixed', 'options=' => 'array|bool'], 'Couchbase\\MutateInBuilder::arrayPrependAll' => ['_HumbugBoxb94336daae36\\Couchbase\\MutateInBuilder', 'path' => 'string', 'values' => 'array', 'options=' => 'array|bool'], 'Couchbase\\MutateInBuilder::counter' => ['_HumbugBoxb94336daae36\\Couchbase\\MutateInBuilder', 'path' => 'string', 'delta' => 'int', 'options=' => 'array|bool'], 'Couchbase\\MutateInBuilder::execute' => ['_HumbugBoxb94336daae36\\Couchbase\\DocumentFragment'], 'Couchbase\\MutateInBuilder::insert' => ['_HumbugBoxb94336daae36\\Couchbase\\MutateInBuilder', 'path' => 'string', 'value' => 'mixed', 'options=' => 'array|bool'], 'Couchbase\\MutateInBuilder::modeDocument' => ['', 'mode' => 'int'], 'Couchbase\\MutateInBuilder::remove' => ['_HumbugBoxb94336daae36\\Couchbase\\MutateInBuilder', 'path' => 'string', 'options=' => 'array'], 'Couchbase\\MutateInBuilder::replace' => ['_HumbugBoxb94336daae36\\Couchbase\\MutateInBuilder', 'path' => 'string', 'value' => 'mixed', 'options=' => 'array'], 'Couchbase\\MutateInBuilder::upsert' => ['_HumbugBoxb94336daae36\\Couchbase\\MutateInBuilder', 'path' => 'string', 'value' => 'mixed', 'options=' => 'array|bool'], 'Couchbase\\MutateInBuilder::withExpiry' => ['_HumbugBoxb94336daae36\\Couchbase\\MutateInBuilder', 'expiry' => '_HumbugBoxb94336daae36\\Couchbase\\expiry'], 'Couchbase\\MutationState::__construct' => ['void'], 'Couchbase\\MutationState::add' => ['', 'source' => 'Couchbase\\Document|Couchbase\\DocumentFragment|array'], 'Couchbase\\MutationState::from' => ['_HumbugBoxb94336daae36\\Couchbase\\MutationState', 'source' => 'Couchbase\\Document|Couchbase\\DocumentFragment|array'], 'Couchbase\\MutationToken::__construct' => ['void'], 'Couchbase\\MutationToken::bucketName' => ['string'], 'Couchbase\\MutationToken::from' => ['', 'bucketName' => 'string', 'vbucketId' => 'int', 'vbucketUuid' => 'string', 'sequenceNumber' => 'string'], 'Couchbase\\MutationToken::sequenceNumber' => ['string'], 'Couchbase\\MutationToken::vbucketId' => ['int'], 'Couchbase\\MutationToken::vbucketUuid' => ['string'], 'Couchbase\\N1qlIndex::__construct' => ['void'], 'Couchbase\\N1qlQuery::__construct' => ['void'], 'Couchbase\\N1qlQuery::adhoc' => ['_HumbugBoxb94336daae36\\Couchbase\\N1qlQuery', 'adhoc' => 'bool'], 'Couchbase\\N1qlQuery::consistency' => ['_HumbugBoxb94336daae36\\Couchbase\\N1qlQuery', 'consistency' => 'int'], 'Couchbase\\N1qlQuery::consistentWith' => ['_HumbugBoxb94336daae36\\Couchbase\\N1qlQuery', 'state' => '_HumbugBoxb94336daae36\\Couchbase\\MutationState'], 'Couchbase\\N1qlQuery::crossBucket' => ['_HumbugBoxb94336daae36\\Couchbase\\N1qlQuery', 'crossBucket' => 'bool'], 'Couchbase\\N1qlQuery::fromString' => ['_HumbugBoxb94336daae36\\Couchbase\\N1qlQuery', 'statement' => 'string'], 'Couchbase\\N1qlQuery::maxParallelism' => ['_HumbugBoxb94336daae36\\Couchbase\\N1qlQuery', 'maxParallelism' => 'int'], 'Couchbase\\N1qlQuery::namedParams' => ['_HumbugBoxb94336daae36\\Couchbase\\N1qlQuery', 'params' => 'array'], 'Couchbase\\N1qlQuery::pipelineBatch' => ['_HumbugBoxb94336daae36\\Couchbase\\N1qlQuery', 'pipelineBatch' => 'int'], 'Couchbase\\N1qlQuery::pipelineCap' => ['_HumbugBoxb94336daae36\\Couchbase\\N1qlQuery', 'pipelineCap' => 'int'], 'Couchbase\\N1qlQuery::positionalParams' => ['_HumbugBoxb94336daae36\\Couchbase\\N1qlQuery', 'params' => 'array'], 'Couchbase\\N1qlQuery::readonly' => ['_HumbugBoxb94336daae36\\Couchbase\\N1qlQuery', 'readonly' => 'bool'], 'Couchbase\\N1qlQuery::scanCap' => ['_HumbugBoxb94336daae36\\Couchbase\\N1qlQuery', 'scanCap' => 'int'], 'Couchbase\\NumericRangeSearchFacet::__construct' => ['void'], 'Couchbase\\NumericRangeSearchFacet::addRange' => ['_HumbugBoxb94336daae36\\Couchbase\\NumericSearchFacet', 'name' => 'string', 'min' => 'float', 'max' => 'float'], 'Couchbase\\NumericRangeSearchFacet::jsonSerialize' => ['array'], 'Couchbase\\NumericRangeSearchQuery::__construct' => ['void'], 'Couchbase\\NumericRangeSearchQuery::boost' => ['_HumbugBoxb94336daae36\\Couchbase\\NumericRangeSearchQuery', 'boost' => 'float'], 'Couchbase\\NumericRangeSearchQuery::field' => ['_HumbugBoxb94336daae36\\Couchbase\\NumericRangeSearchQuery', 'field' => 'string'], 'Couchbase\\NumericRangeSearchQuery::jsonSerialize' => ['array'], 'Couchbase\\NumericRangeSearchQuery::max' => ['_HumbugBoxb94336daae36\\Couchbase\\NumericRangeSearchQuery', 'max' => 'float', 'inclusive=' => 'bool|false'], 'Couchbase\\NumericRangeSearchQuery::min' => ['_HumbugBoxb94336daae36\\Couchbase\\NumericRangeSearchQuery', 'min' => 'float', 'inclusive=' => 'bool|true'], '_HumbugBoxb94336daae36\\Couchbase\\passthruDecoder' => ['string', 'bytes' => 'string', 'flags' => 'int', 'datatype' => 'int'], '_HumbugBoxb94336daae36\\Couchbase\\passthruEncoder' => ['array', 'value' => 'string'], 'Couchbase\\PasswordAuthenticator::password' => ['_HumbugBoxb94336daae36\\Couchbase\\PasswordAuthenticator', 'password' => 'string'], 'Couchbase\\PasswordAuthenticator::username' => ['_HumbugBoxb94336daae36\\Couchbase\\PasswordAuthenticator', 'username' => 'string'], 'Couchbase\\PhraseSearchQuery::__construct' => ['void'], 'Couchbase\\PhraseSearchQuery::boost' => ['_HumbugBoxb94336daae36\\Couchbase\\PhraseSearchQuery', 'boost' => 'float'], 'Couchbase\\PhraseSearchQuery::field' => ['_HumbugBoxb94336daae36\\Couchbase\\PhraseSearchQuery', 'field' => 'string'], 'Couchbase\\PhraseSearchQuery::jsonSerialize' => ['array'], 'Couchbase\\PrefixSearchQuery::__construct' => ['void'], 'Couchbase\\PrefixSearchQuery::boost' => ['_HumbugBoxb94336daae36\\Couchbase\\PrefixSearchQuery', 'boost' => 'float'], 'Couchbase\\PrefixSearchQuery::field' => ['_HumbugBoxb94336daae36\\Couchbase\\PrefixSearchQuery', 'field' => 'string'], 'Couchbase\\PrefixSearchQuery::jsonSerialize' => ['array'], 'Couchbase\\QueryStringSearchQuery::__construct' => ['void'], 'Couchbase\\QueryStringSearchQuery::boost' => ['_HumbugBoxb94336daae36\\Couchbase\\QueryStringSearchQuery', 'boost' => 'float'], 'Couchbase\\QueryStringSearchQuery::jsonSerialize' => ['array'], 'Couchbase\\RegexpSearchQuery::__construct' => ['void'], 'Couchbase\\RegexpSearchQuery::boost' => ['_HumbugBoxb94336daae36\\Couchbase\\RegexpSearchQuery', 'boost' => 'float'], 'Couchbase\\RegexpSearchQuery::field' => ['_HumbugBoxb94336daae36\\Couchbase\\RegexpSearchQuery', 'field' => 'string'], 'Couchbase\\RegexpSearchQuery::jsonSerialize' => ['array'], 'Couchbase\\SearchQuery::__construct' => ['void', 'indexName' => 'string', 'queryPart' => '_HumbugBoxb94336daae36\\Couchbase\\SearchQueryPart'], 'Couchbase\\SearchQuery::addFacet' => ['_HumbugBoxb94336daae36\\Couchbase\\SearchQuery', 'name' => 'string', 'facet' => '_HumbugBoxb94336daae36\\Couchbase\\SearchFacet'], 'Couchbase\\SearchQuery::boolean' => ['_HumbugBoxb94336daae36\\Couchbase\\BooleanSearchQuery'], 'Couchbase\\SearchQuery::booleanField' => ['_HumbugBoxb94336daae36\\Couchbase\\BooleanFieldSearchQuery', 'value' => 'bool'], 'Couchbase\\SearchQuery::conjuncts' => ['_HumbugBoxb94336daae36\\Couchbase\\ConjunctionSearchQuery', '...queries=' => 'array<int,Couchbase\\SearchQueryPart>'], 'Couchbase\\SearchQuery::consistentWith' => ['_HumbugBoxb94336daae36\\Couchbase\\SearchQuery', 'state' => '_HumbugBoxb94336daae36\\Couchbase\\MutationState'], 'Couchbase\\SearchQuery::dateRange' => ['_HumbugBoxb94336daae36\\Couchbase\\DateRangeSearchQuery'], 'Couchbase\\SearchQuery::dateRangeFacet' => ['_HumbugBoxb94336daae36\\Couchbase\\DateRangeSearchFacet', 'field' => 'string', 'limit' => 'int'], 'Couchbase\\SearchQuery::disjuncts' => ['_HumbugBoxb94336daae36\\Couchbase\\DisjunctionSearchQuery', '...queries=' => 'array<int,Couchbase\\SearchQueryPart>'], 'Couchbase\\SearchQuery::docId' => ['_HumbugBoxb94336daae36\\Couchbase\\DocIdSearchQuery', '...documentIds=' => 'array<int,string>'], 'Couchbase\\SearchQuery::explain' => ['_HumbugBoxb94336daae36\\Couchbase\\SearchQuery', 'explain' => 'bool'], 'Couchbase\\SearchQuery::fields' => ['_HumbugBoxb94336daae36\\Couchbase\\SearchQuery', '...fields=' => 'array<int,string>'], 'Couchbase\\SearchQuery::geoBoundingBox' => ['_HumbugBoxb94336daae36\\Couchbase\\GeoBoundingBoxSearchQuery', 'topLeftLongitude' => 'float', 'topLeftLatitude' => 'float', 'bottomRightLongitude' => 'float', 'bottomRightLatitude' => 'float'], 'Couchbase\\SearchQuery::geoDistance' => ['_HumbugBoxb94336daae36\\Couchbase\\GeoDistanceSearchQuery', 'longitude' => 'float', 'latitude' => 'float', 'distance' => 'string'], 'Couchbase\\SearchQuery::highlight' => ['_HumbugBoxb94336daae36\\Couchbase\\SearchQuery', 'style' => 'string', '...fields=' => 'array<int,string>'], 'Couchbase\\SearchQuery::jsonSerialize' => ['array'], 'Couchbase\\SearchQuery::limit' => ['_HumbugBoxb94336daae36\\Couchbase\\SearchQuery', 'limit' => 'int'], 'Couchbase\\SearchQuery::match' => ['_HumbugBoxb94336daae36\\Couchbase\\MatchSearchQuery', 'match' => 'string'], 'Couchbase\\SearchQuery::matchAll' => ['_HumbugBoxb94336daae36\\Couchbase\\MatchAllSearchQuery'], 'Couchbase\\SearchQuery::matchNone' => ['_HumbugBoxb94336daae36\\Couchbase\\MatchNoneSearchQuery'], 'Couchbase\\SearchQuery::matchPhrase' => ['_HumbugBoxb94336daae36\\Couchbase\\MatchPhraseSearchQuery', '...terms=' => 'array<int,string>'], 'Couchbase\\SearchQuery::numericRange' => ['_HumbugBoxb94336daae36\\Couchbase\\NumericRangeSearchQuery'], 'Couchbase\\SearchQuery::numericRangeFacet' => ['_HumbugBoxb94336daae36\\Couchbase\\NumericRangeSearchFacet', 'field' => 'string', 'limit' => 'int'], 'Couchbase\\SearchQuery::prefix' => ['_HumbugBoxb94336daae36\\Couchbase\\PrefixSearchQuery', 'prefix' => 'string'], 'Couchbase\\SearchQuery::queryString' => ['_HumbugBoxb94336daae36\\Couchbase\\QueryStringSearchQuery', 'queryString' => 'string'], 'Couchbase\\SearchQuery::regexp' => ['_HumbugBoxb94336daae36\\Couchbase\\RegexpSearchQuery', 'regexp' => 'string'], 'Couchbase\\SearchQuery::serverSideTimeout' => ['_HumbugBoxb94336daae36\\Couchbase\\SearchQuery', 'serverSideTimeout' => 'int'], 'Couchbase\\SearchQuery::skip' => ['_HumbugBoxb94336daae36\\Couchbase\\SearchQuery', 'skip' => 'int'], 'Couchbase\\SearchQuery::sort' => ['_HumbugBoxb94336daae36\\Couchbase\\SearchQuery', '...sort=' => 'array<int,Couchbase\\sort>'], 'Couchbase\\SearchQuery::term' => ['_HumbugBoxb94336daae36\\Couchbase\\TermSearchQuery', 'term' => 'string'], 'Couchbase\\SearchQuery::termFacet' => ['_HumbugBoxb94336daae36\\Couchbase\\TermSearchFacet', 'field' => 'string', 'limit' => 'int'], 'Couchbase\\SearchQuery::termRange' => ['_HumbugBoxb94336daae36\\Couchbase\\TermRangeSearchQuery'], 'Couchbase\\SearchQuery::wildcard' => ['_HumbugBoxb94336daae36\\Couchbase\\WildcardSearchQuery', 'wildcard' => 'string'], 'Couchbase\\SpatialViewQuery::__construct' => ['void'], 'Couchbase\\SpatialViewQuery::bbox' => ['_HumbugBoxb94336daae36\\Couchbase\\SpatialViewQuery', 'bbox' => 'array'], 'Couchbase\\SpatialViewQuery::consistency' => ['_HumbugBoxb94336daae36\\Couchbase\\SpatialViewQuery', 'consistency' => 'int'], 'Couchbase\\SpatialViewQuery::custom' => ['', 'customParameters' => 'array'], 'Couchbase\\SpatialViewQuery::encode' => ['array'], 'Couchbase\\SpatialViewQuery::endRange' => ['_HumbugBoxb94336daae36\\Couchbase\\SpatialViewQuery', 'range' => 'array'], 'Couchbase\\SpatialViewQuery::limit' => ['_HumbugBoxb94336daae36\\Couchbase\\SpatialViewQuery', 'limit' => 'int'], 'Couchbase\\SpatialViewQuery::order' => ['_HumbugBoxb94336daae36\\Couchbase\\SpatialViewQuery', 'order' => 'int'], 'Couchbase\\SpatialViewQuery::skip' => ['_HumbugBoxb94336daae36\\Couchbase\\SpatialViewQuery', 'skip' => 'int'], 'Couchbase\\SpatialViewQuery::startRange' => ['_HumbugBoxb94336daae36\\Couchbase\\SpatialViewQuery', 'range' => 'array'], 'Couchbase\\TermRangeSearchQuery::__construct' => ['void'], 'Couchbase\\TermRangeSearchQuery::boost' => ['_HumbugBoxb94336daae36\\Couchbase\\TermRangeSearchQuery', 'boost' => 'float'], 'Couchbase\\TermRangeSearchQuery::field' => ['_HumbugBoxb94336daae36\\Couchbase\\TermRangeSearchQuery', 'field' => 'string'], 'Couchbase\\TermRangeSearchQuery::jsonSerialize' => ['array'], 'Couchbase\\TermRangeSearchQuery::max' => ['_HumbugBoxb94336daae36\\Couchbase\\TermRangeSearchQuery', 'max' => 'string', 'inclusive=' => 'bool|false'], 'Couchbase\\TermRangeSearchQuery::min' => ['_HumbugBoxb94336daae36\\Couchbase\\TermRangeSearchQuery', 'min' => 'string', 'inclusive=' => 'bool|true'], 'Couchbase\\TermSearchFacet::__construct' => ['void'], 'Couchbase\\TermSearchFacet::jsonSerialize' => ['array'], 'Couchbase\\TermSearchQuery::__construct' => ['void'], 'Couchbase\\TermSearchQuery::boost' => ['_HumbugBoxb94336daae36\\Couchbase\\TermSearchQuery', 'boost' => 'float'], 'Couchbase\\TermSearchQuery::field' => ['_HumbugBoxb94336daae36\\Couchbase\\TermSearchQuery', 'field' => 'string'], 'Couchbase\\TermSearchQuery::fuzziness' => ['_HumbugBoxb94336daae36\\Couchbase\\TermSearchQuery', 'fuzziness' => 'int'], 'Couchbase\\TermSearchQuery::jsonSerialize' => ['array'], 'Couchbase\\TermSearchQuery::prefixLength' => ['_HumbugBoxb94336daae36\\Couchbase\\TermSearchQuery', 'prefixLength' => 'int'], 'Couchbase\\UserSettings::fullName' => ['_HumbugBoxb94336daae36\\Couchbase\\UserSettings', 'fullName' => 'string'], 'Couchbase\\UserSettings::password' => ['_HumbugBoxb94336daae36\\Couchbase\\UserSettings', 'password' => 'string'], 'Couchbase\\UserSettings::role' => ['_HumbugBoxb94336daae36\\Couchbase\\UserSettings', 'role' => 'string', 'bucket=' => 'string'], 'Couchbase\\ViewQuery::__construct' => ['void'], 'Couchbase\\ViewQuery::consistency' => ['_HumbugBoxb94336daae36\\Couchbase\\ViewQuery', 'consistency' => 'int'], 'Couchbase\\ViewQuery::custom' => ['_HumbugBoxb94336daae36\\Couchbase\\ViewQuery', 'customParameters' => 'array'], 'Couchbase\\ViewQuery::encode' => ['array'], 'Couchbase\\ViewQuery::from' => ['_HumbugBoxb94336daae36\\Couchbase\\ViewQuery', 'designDocumentName' => 'string', 'viewName' => 'string'], 'Couchbase\\ViewQuery::fromSpatial' => ['_HumbugBoxb94336daae36\\Couchbase\\SpatialViewQuery', 'designDocumentName' => 'string', 'viewName' => 'string'], 'Couchbase\\ViewQuery::group' => ['_HumbugBoxb94336daae36\\Couchbase\\ViewQuery', 'group' => 'bool'], 'Couchbase\\ViewQuery::groupLevel' => ['_HumbugBoxb94336daae36\\Couchbase\\ViewQuery', 'groupLevel' => 'int'], 'Couchbase\\ViewQuery::idRange' => ['_HumbugBoxb94336daae36\\Couchbase\\ViewQuery', 'startKeyDocumentId' => 'string', 'endKeyDocumentId' => 'string'], 'Couchbase\\ViewQuery::key' => ['_HumbugBoxb94336daae36\\Couchbase\\ViewQuery', 'key' => 'mixed'], 'Couchbase\\ViewQuery::keys' => ['_HumbugBoxb94336daae36\\Couchbase\\ViewQuery', 'keys' => 'array'], 'Couchbase\\ViewQuery::limit' => ['_HumbugBoxb94336daae36\\Couchbase\\ViewQuery', 'limit' => 'int'], 'Couchbase\\ViewQuery::order' => ['_HumbugBoxb94336daae36\\Couchbase\\ViewQuery', 'order' => 'int'], 'Couchbase\\ViewQuery::range' => ['_HumbugBoxb94336daae36\\Couchbase\\ViewQuery', 'startKey' => 'mixed', 'endKey' => 'mixed', 'inclusiveEnd=' => 'bool|false'], 'Couchbase\\ViewQuery::reduce' => ['_HumbugBoxb94336daae36\\Couchbase\\ViewQuery', 'reduce' => 'bool'], 'Couchbase\\ViewQuery::skip' => ['_HumbugBoxb94336daae36\\Couchbase\\ViewQuery', 'skip' => 'int'], 'Couchbase\\ViewQueryEncodable::encode' => ['array'], 'Couchbase\\WildcardSearchQuery::__construct' => ['void'], 'Couchbase\\WildcardSearchQuery::boost' => ['_HumbugBoxb94336daae36\\Couchbase\\WildcardSearchQuery', 'boost' => 'float'], 'Couchbase\\WildcardSearchQuery::field' => ['_HumbugBoxb94336daae36\\Couchbase\\WildcardSearchQuery', 'field' => 'string'], 'Couchbase\\WildcardSearchQuery::jsonSerialize' => ['array'], '_HumbugBoxb94336daae36\\Couchbase\\zlibCompress' => ['string', 'data' => 'string'], '_HumbugBoxb94336daae36\\Couchbase\\zlibDecompress' => ['string', 'data' => 'string'], 'count' => ['int', 'var' => 'Countable|array', 'mode=' => 'int'], 'count_chars' => ['mixed', 'input' => 'string', 'mode=' => 'int'], 'Countable::count' => ['int'], 'crack_check' => ['bool', 'dictionary' => '', 'password' => 'string'], 'crack_closedict' => ['bool', 'dictionary=' => 'resource'], 'crack_getlastmessage' => ['string'], 'crack_opendict' => ['resource', 'dictionary' => 'string'], 'crash' => [''], 'crc32' => ['int', 'str' => 'string'], 'create_function' => ['string', 'args' => 'string', 'code' => 'string'], 'crypt' => ['string', 'str' => 'string', 'salt=' => 'string'], 'ctype_alnum' => ['bool', 'c' => 'string|int'], 'ctype_alpha' => ['bool', 'c' => 'string|int'], 'ctype_cntrl' => ['bool', 'c' => 'string|int'], 'ctype_digit' => ['bool', 'c' => 'string|int'], 'ctype_graph' => ['bool', 'c' => 'string|int'], 'ctype_lower' => ['bool', 'c' => 'string|int'], 'ctype_print' => ['bool', 'c' => 'string|int'], 'ctype_punct' => ['bool', 'c' => 'string|int'], 'ctype_space' => ['bool', 'c' => 'string|int'], 'ctype_upper' => ['bool', 'c' => 'string|int'], 'ctype_xdigit' => ['bool', 'c' => 'string|int'], 'cubrid_affected_rows' => ['int', 'req_identifier=' => ''], 'cubrid_bind' => ['bool', 'req_identifier' => 'resource', 'bind_param' => 'int', 'bind_value' => 'mixed', 'bind_value_type=' => 'string'], 'cubrid_client_encoding' => ['string', 'conn_identifier=' => ''], 'cubrid_close' => ['bool', 'conn_identifier=' => ''], 'cubrid_close_prepare' => ['int', 'req_identifier' => 'resource'], 'cubrid_close_request' => ['bool', 'req_identifier' => 'resource'], 'cubrid_col_get' => ['array', 'conn_identifier' => 'resource', 'oid' => 'string', 'attr_name' => 'string'], 'cubrid_col_size' => ['int', 'conn_identifier' => 'resource', 'oid' => 'string', 'attr_name' => 'string'], 'cubrid_column_names' => ['array', 'req_identifier' => 'resource'], 'cubrid_column_types' => ['array', 'req_identifier' => 'resource'], 'cubrid_commit' => ['bool', 'conn_identifier' => 'resource'], 'cubrid_connect' => ['resource', 'host' => 'string', 'port' => 'int', 'dbname' => 'string', 'userid=' => 'string', 'passwd=' => 'string'], 'cubrid_connect_with_url' => ['resource', 'conn_url' => 'string', 'userid=' => 'string', 'passwd=' => 'string'], 'cubrid_current_oid' => ['string', 'req_identifier' => 'resource'], 'cubrid_data_seek' => ['bool', 'req_identifier' => '', 'row_number' => 'int'], 'cubrid_db_name' => ['string', 'result' => 'array', 'index' => 'int'], 'cubrid_db_parameter' => ['array', 'conn_identifier' => 'resource'], 'cubrid_disconnect' => ['bool', 'conn_identifier' => 'resource'], 'cubrid_drop' => ['bool', 'conn_identifier' => 'resource', 'oid' => 'string'], 'cubrid_errno' => ['int', 'conn_identifier=' => ''], 'cubrid_error' => ['string', 'connection=' => ''], 'cubrid_error_code' => ['int'], 'cubrid_error_code_facility' => ['int'], 'cubrid_error_msg' => ['string'], 'cubrid_execute' => ['bool', 'conn_identifier' => '', 'sql' => 'string', 'option=' => 'int', 'request_identifier=' => ''], 'cubrid_fetch' => ['mixed', 'result' => 'resource', 'type=' => 'int'], 'cubrid_fetch_array' => ['array', 'result' => '', 'type=' => 'int'], 'cubrid_fetch_assoc' => ['array', 'result' => ''], 'cubrid_fetch_field' => ['object', 'result' => '', 'field_offset=' => 'int'], 'cubrid_fetch_lengths' => ['array', 'result' => ''], 'cubrid_fetch_object' => ['object', 'result' => '', 'class_name=' => 'string', 'params=' => 'array'], 'cubrid_fetch_row' => ['array', 'result' => ''], 'cubrid_field_flags' => ['string', 'result' => '', 'field_offset' => 'int'], 'cubrid_field_len' => ['int', 'result' => '', 'field_offset' => 'int'], 'cubrid_field_name' => ['string', 'result' => '', 'field_offset' => 'int'], 'cubrid_field_seek' => ['bool', 'result' => '', 'field_offset=' => 'int'], 'cubrid_field_table' => ['string', 'result' => '', 'field_offset' => 'int'], 'cubrid_field_type' => ['string', 'result' => '', 'field_offset' => 'int'], 'cubrid_free_result' => ['bool', 'req_identifier' => 'resource'], 'cubrid_get' => ['mixed', 'conn_identifier' => 'resource', 'oid' => 'string', 'attr=' => 'mixed'], 'cubrid_get_autocommit' => ['bool', 'conn_identifier' => 'resource'], 'cubrid_get_charset' => ['string', 'conn_identifier' => 'resource'], 'cubrid_get_class_name' => ['string', 'conn_identifier' => 'resource', 'oid' => 'string'], 'cubrid_get_client_info' => ['string'], 'cubrid_get_db_parameter' => ['array', 'conn_identifier' => 'resource'], 'cubrid_get_query_timeout' => ['int', 'req_identifier' => 'resource'], 'cubrid_get_server_info' => ['string', 'conn_identifier' => 'resource'], 'cubrid_insert_id' => ['string', 'conn_identifier=' => 'resource'], 'cubrid_is_instance' => ['int', 'conn_identifier' => 'resource', 'oid' => 'string'], 'cubrid_list_dbs' => ['array', 'conn_identifier' => ''], 'cubrid_load_from_glo' => ['int', 'conn_identifier' => '', 'oid' => 'string', 'file_name' => 'string'], 'cubrid_lob2_bind' => ['bool', 'req_identifier' => 'resource', 'bind_index' => 'int', 'bind_value' => 'mixed', 'bind_value_type=' => 'string'], 'cubrid_lob2_close' => ['bool', 'lob_identifier' => 'resource'], 'cubrid_lob2_export' => ['bool', 'lob_identifier' => 'resource', 'file_name' => 'string'], 'cubrid_lob2_import' => ['bool', 'lob_identifier' => 'resource', 'file_name' => 'string'], 'cubrid_lob2_new' => ['resource', 'conn_identifier=' => 'resource', 'type=' => 'string'], 'cubrid_lob2_read' => ['string', 'lob_identifier' => 'resource', 'len' => 'int'], 'cubrid_lob2_seek' => ['bool', 'lob_identifier' => 'resource', 'offset' => 'int', 'origin=' => 'int'], 'cubrid_lob2_seek64' => ['bool', 'lob_identifier' => 'resource', 'offset' => 'string', 'origin=' => 'int'], 'cubrid_lob2_size' => ['int', 'lob_identifier' => 'resource'], 'cubrid_lob2_size64' => ['string', 'lob_identifier' => 'resource'], 'cubrid_lob2_tell' => ['int', 'lob_identifier' => 'resource'], 'cubrid_lob2_tell64' => ['string', 'lob_identifier' => 'resource'], 'cubrid_lob2_write' => ['bool', 'lob_identifier' => 'resource', 'buf' => 'string'], 'cubrid_lob_close' => ['bool', 'lob_identifier_array' => 'array'], 'cubrid_lob_export' => ['bool', 'conn_identifier' => 'resource', 'lob_identifier' => 'resource', 'path_name' => 'string'], 'cubrid_lob_get' => ['array', 'conn_identifier' => 'resource', 'sql' => 'string'], 'cubrid_lob_send' => ['bool', 'conn_identifier' => 'resource', 'lob_identifier' => 'resource'], 'cubrid_lob_size' => ['string', 'lob_identifier' => 'resource'], 'cubrid_lock_read' => ['bool', 'conn_identifier' => 'resource', 'oid' => 'string'], 'cubrid_lock_write' => ['bool', 'conn_identifier' => 'resource', 'oid' => 'string'], 'cubrid_move_cursor' => ['int', 'req_identifier' => 'resource', 'offset' => 'int', 'origin=' => 'int'], 'cubrid_new_glo' => ['string', 'conn_identifier' => '', 'class_name' => 'string', 'file_name' => 'string'], 'cubrid_next_result' => ['bool', 'result' => 'resource'], 'cubrid_num_cols' => ['int', 'req_identifier' => 'resource'], 'cubrid_num_fields' => ['int', 'result' => ''], 'cubrid_num_rows' => ['int', 'req_identifier' => 'resource'], 'cubrid_pconnect' => ['resource', 'host' => 'string', 'port' => 'int', 'dbname' => 'string', 'userid=' => 'string', 'passwd=' => 'string'], 'cubrid_pconnect_with_url' => ['resource', 'conn_url' => 'string', 'userid=' => 'string', 'passwd=' => 'string'], 'cubrid_ping' => ['bool', 'conn_identifier=' => ''], 'cubrid_prepare' => ['resource', 'conn_identifier' => 'resource', 'prepare_stmt' => 'string', 'option=' => 'int'], 'cubrid_put' => ['int', 'conn_identifier' => 'resource', 'oid' => 'string', 'attr=' => 'string', 'value=' => 'mixed'], 'cubrid_query' => ['resource', 'query' => 'string', 'conn_identifier=' => ''], 'cubrid_real_escape_string' => ['string', 'unescaped_string' => 'string', 'conn_identifier=' => ''], 'cubrid_result' => ['string', 'result' => '', 'row' => 'int', 'field=' => ''], 'cubrid_rollback' => ['bool', 'conn_identifier' => 'resource'], 'cubrid_save_to_glo' => ['int', 'conn_identifier' => '', 'oid' => 'string', 'file_name' => 'string'], 'cubrid_schema' => ['array', 'conn_identifier' => 'resource', 'schema_type' => 'int', 'class_name=' => 'string', 'attr_name=' => 'string'], 'cubrid_send_glo' => ['int', 'conn_identifier' => '', 'oid' => 'string'], 'cubrid_seq_drop' => ['bool', 'conn_identifier' => 'resource', 'oid' => 'string', 'attr_name' => 'string', 'index' => 'int'], 'cubrid_seq_insert' => ['bool', 'conn_identifier' => 'resource', 'oid' => 'string', 'attr_name' => 'string', 'index' => 'int', 'seq_element' => 'string'], 'cubrid_seq_put' => ['bool', 'conn_identifier' => 'resource', 'oid' => 'string', 'attr_name' => 'string', 'index' => 'int', 'seq_element' => 'string'], 'cubrid_set_add' => ['bool', 'conn_identifier' => 'resource', 'oid' => 'string', 'attr_name' => 'string', 'set_element' => 'string'], 'cubrid_set_autocommit' => ['bool', 'conn_identifier' => 'resource', 'mode' => 'bool'], 'cubrid_set_db_parameter' => ['bool', 'conn_identifier' => 'resource', 'param_type' => 'int', 'param_value' => 'int'], 'cubrid_set_drop' => ['bool', 'conn_identifier' => 'resource', 'oid' => 'string', 'attr_name' => 'string', 'set_element' => 'string'], 'cubrid_set_query_timeout' => ['bool', 'req_identifier' => 'resource', 'timeout' => 'int'], 'cubrid_unbuffered_query' => ['resource', 'query' => 'string', 'conn_identifier=' => ''], 'cubrid_version' => ['string'], 'curl_close' => ['void', 'ch' => 'resource'], 'curl_copy_handle' => ['resource', 'ch' => 'resource'], 'curl_errno' => ['int', 'ch' => 'resource'], 'curl_error' => ['string', 'ch' => 'resource'], 'curl_escape' => ['string', 'ch' => 'resource', 'str' => 'string'], 'curl_exec' => ['bool|string', 'ch' => 'resource'], 'curl_file_create' => ['CURLFile', 'filename' => 'string', 'mimetype=' => 'string', 'postfilename=' => 'string'], 'curl_getinfo' => ['mixed', 'ch' => 'resource', 'option=' => 'int'], 'curl_init' => ['resource|false', 'url=' => 'string'], 'curl_multi_add_handle' => ['int', 'mh' => 'resource', 'ch' => 'resource'], 'curl_multi_close' => ['void', 'mh' => 'resource'], 'curl_multi_errno' => ['int', 'mh' => 'resource'], 'curl_multi_exec' => ['int', 'mh' => 'resource', '&w_still_running' => 'int'], 'curl_multi_getcontent' => ['string', 'ch' => 'resource'], 'curl_multi_info_read' => ['array|false', 'mh' => 'resource', '&w_msgs_in_queue=' => 'int'], 'curl_multi_init' => ['resource|false'], 'curl_multi_remove_handle' => ['int', 'mh' => 'resource', 'ch' => 'resource'], 'curl_multi_select' => ['int', 'mh' => 'resource', 'timeout=' => 'float'], 'curl_multi_setopt' => ['bool', 'mh' => 'resource', 'option' => 'int', 'value' => 'mixed'], 'curl_multi_strerror' => ['string', 'code' => 'int'], 'curl_pause' => ['int', 'ch' => 'resource', 'bitmask' => 'int'], 'curl_reset' => ['void', 'ch' => 'resource'], 'curl_setopt' => ['bool', 'ch' => 'resource', 'option' => 'int', 'value' => 'mixed'], 'curl_setopt_array' => ['bool', 'ch' => 'resource', 'options' => 'array'], 'curl_share_close' => ['void', 'sh' => 'resource'], 'curl_share_errno' => ['int', 'sh' => 'resource'], 'curl_share_init' => ['resource'], 'curl_share_setopt' => ['bool', 'sh' => 'resource', 'option' => 'int', 'value' => 'string'], 'curl_share_strerror' => ['string', 'code' => 'int'], 'curl_strerror' => ['string', 'code' => 'int'], 'curl_unescape' => ['string', 'ch' => 'resource', 'str' => 'string'], 'curl_version' => ['array', 'version=' => 'int'], 'CURLFile::__construct' => ['void', 'filename' => 'string', 'mimetype=' => 'string', 'postfilename=' => 'string'], 'CURLFile::__wakeup' => ['void'], 'CURLFile::getFilename' => ['string'], 'CURLFile::getMimeType' => ['string'], 'CURLFile::getPostFilename' => ['string'], 'CURLFile::setMimeType' => ['void', 'mime' => 'string'], 'CURLFile::setPostFilename' => ['void', 'name' => 'string'], 'current' => ['mixed', 'array_arg' => 'array|object'], 'cyrus_authenticate' => ['void', 'connection' => 'resource', 'mechlist=' => 'string', 'service=' => 'string', 'user=' => 'string', 'minssf=' => 'int', 'maxssf=' => 'int', 'authname=' => 'string', 'password=' => 'string'], 'cyrus_bind' => ['bool', 'connection' => 'resource', 'callbacks' => 'array'], 'cyrus_close' => ['bool', 'connection' => 'resource'], 'cyrus_connect' => ['resource', 'host=' => 'string', 'port=' => 'string', 'flags=' => 'int'], 'cyrus_query' => ['array', 'connection' => 'resource', 'query' => 'string'], 'cyrus_unbind' => ['bool', 'connection' => 'resource', 'trigger_name' => 'string'], 'date' => ['string', 'format' => 'string', 'timestamp=' => 'int'], 'date_add' => ['DateTime|false', 'object' => '', 'interval' => ''], 'date_create' => ['DateTime|false', 'time=' => 'string|null', 'timezone=' => '?\\DateTimeZone'], 'date_create_from_format' => ['DateTime|false', 'format' => 'string', 'time' => 'string', 'timezone=' => 'DateTimeZone'], 'date_create_immutable' => ['DateTimeImmutable|false', 'time=' => 'string', 'timezone=' => '?\\DateTimeZone'], 'date_create_immutable_from_format' => ['DateTimeImmutable', 'format' => 'string', 'time' => 'string', 'timezone=' => '?\\DateTimeZone'], 'date_date_set' => ['DateTime|false', 'object' => '', 'year' => '', 'month' => '', 'day' => ''], 'date_default_timezone_get' => ['string'], 'date_default_timezone_set' => ['bool', 'timezone_identifier' => 'string'], 'date_diff' => ['DateInterval', 'obj1' => 'DateTimeInterface', 'obj2' => 'DateTimeInterface', 'absolute=' => 'bool'], 'date_format' => ['string', 'obj' => 'DateTimeInterface', 'format' => 'string'], 'date_get_last_errors' => ['array'], 'date_interval_create_from_date_string' => ['DateInterval', 'time' => ''], 'date_interval_format' => ['DateInterval', 'object' => '', 'format' => ''], 'date_isodate_set' => ['DateTime|false', 'object' => 'DateTime', 'year' => 'int', 'week' => 'int', 'day=' => 'int|mixed'], 'date_modify' => ['DateTime|false', 'object' => 'DateTime', 'modify' => 'string'], 'date_offset_get' => ['int', 'obj' => 'DateTimeInterface'], 'date_parse' => ['array', 'date' => 'string'], 'date_parse_from_format' => ['array', 'format' => 'string', 'date' => 'string'], 'date_sub' => ['DateTime|false', 'object' => 'DateTime', 'interval' => 'DateInterval'], 'date_sun_info' => ['array', 'time' => 'int', 'latitude' => 'float', 'longitude' => 'float'], 'date_sunrise' => ['mixed', 'time' => 'int', 'format=' => 'int', 'latitude=' => 'float', 'longitude=' => 'float', 'zenith=' => 'float', 'gmt_offset=' => 'float'], 'date_sunset' => ['mixed', 'time' => 'int', 'format=' => 'int', 'latitude=' => 'float', 'longitude=' => 'float', 'zenith=' => 'float', 'gmt_offset=' => 'float'], 'date_time_set' => ['DateTime|false', 'object' => '', 'hour' => '', 'minute' => '', 'second' => '', 'microseconds' => ''], 'date_timestamp_get' => ['int', 'obj' => 'DateTimeInterface'], 'date_timestamp_set' => ['DateTime|false', 'object' => 'DateTime', 'unixtimestamp' => 'int'], 'date_timezone_get' => ['DateTimeZone', 'obj' => 'DateTimeInterface'], 'date_timezone_set' => ['DateTime|false', 'object' => 'DateTime', 'timezone' => 'DateTimeZone'], 'datefmt_create' => ['IntlDateFormatter|false', 'locale' => 'string', 'datetype' => 'int', 'timetype' => 'int', 'timezone=' => 'int', 'calendar=' => 'int|IntlCalendar', 'pattern=' => 'string'], 'datefmt_format' => ['string', 'fmt' => 'IntlDateFormatter', 'value' => 'DateTime|IntlCalendar|array|int'], 'datefmt_format_object' => ['string', 'object' => 'object', 'format=' => 'mixed', 'locale=' => 'string'], 'datefmt_get_calendar' => ['int', 'fmt' => 'IntlDateFormatter'], 'datefmt_get_calendar_object' => ['IntlCalendar', 'fmt' => 'IntlDateFormatter'], 'datefmt_get_datetype' => ['int', 'fmt' => 'IntlDateFormatter'], 'datefmt_get_error_code' => ['int', 'fmt' => 'IntlDateFormatter'], 'datefmt_get_error_message' => ['string', 'fmt' => 'IntlDateFormatter'], 'datefmt_get_locale' => ['string', 'fmt' => 'IntlDateFormatter', 'which=' => 'int'], 'datefmt_get_pattern' => ['string', 'fmt' => 'IntlDateFormatter'], 'datefmt_get_timetype' => ['int', 'fmt' => 'IntlDateFormatter'], 'datefmt_get_timezone' => ['IntlTimeZone'], 'datefmt_get_timezone_id' => ['string', 'fmt' => 'IntlDateFormatter'], 'datefmt_is_lenient' => ['bool', 'fmt' => 'IntlDateFormatter'], 'datefmt_localtime' => ['array|bool', 'fmt' => 'IntlDateFormatter', 'text_to_parse=' => 'string', '&rw_parse_pos=' => 'int'], 'datefmt_parse' => ['int|false', 'fmt' => 'IntlDateFormatter', 'text_to_parse=' => 'string', '&rw_parse_pos=' => 'int'], 'datefmt_set_calendar' => ['bool', 'fmt' => 'IntlDateFormatter', 'which' => 'int'], 'datefmt_set_lenient' => ['?bool', 'fmt' => 'IntlDateFormatter', 'lenient' => 'bool'], 'datefmt_set_pattern' => ['bool', 'fmt' => 'IntlDateFormatter', 'pattern' => 'string'], 'datefmt_set_timezone' => ['bool', 'zone' => 'mixed'], 'datefmt_set_timezone_id' => ['bool', 'fmt' => 'IntlDateFormatter', 'zone' => 'string'], 'DateInterval::__construct' => ['void', 'spec' => 'string'], 'DateInterval::__set_state' => ['DateInterval', 'array' => 'array'], 'DateInterval::__wakeup' => ['void'], 'DateInterval::createFromDateString' => ['DateInterval', 'time' => 'string'], 'DateInterval::format' => ['string', 'format' => 'string'], 'DatePeriod::__construct' => ['void', 'start' => 'DateTimeInterface', 'interval' => 'DateInterval', 'recur' => 'int', 'options=' => 'int'], 'DatePeriod::__construct\'1' => ['void', 'start' => 'DateTimeInterface', 'interval' => 'DateInterval', 'end' => 'DateTimeInterface', 'options=' => 'int'], 'DatePeriod::__construct\'2' => ['void', 'iso' => 'string', 'options=' => 'int'], 'DatePeriod::__wakeup' => ['void'], 'DatePeriod::getDateInterval' => ['DateInterval'], 'DatePeriod::getEndDate' => ['DateTimeInterface'], 'DatePeriod::getStartDate' => ['DateTimeInterface'], 'DateTime::__construct' => ['void', 'time=' => 'string|null', 'timezone=' => '?DateTimeZone'], 'DateTime::__set_state' => ['static', 'array' => 'array'], 'DateTime::__wakeup' => ['void'], 'DateTime::add' => ['static', 'interval' => 'DateInterval'], 'DateTime::createFromFormat' => ['static|false', 'format' => 'string', 'time' => 'string', 'timezone=' => 'DateTimeZone|null'], 'DateTime::createFromImmutable' => ['static', 'object' => 'DateTimeImmutable'], 'DateTime::diff' => ['DateInterval', 'datetime2' => 'DateTimeInterface', 'absolute=' => 'bool'], 'DateTime::format' => ['string', 'format' => 'string'], 'DateTime::getLastErrors' => ['array'], 'DateTime::getOffset' => ['int'], 'DateTime::getTimestamp' => ['int'], 'DateTime::getTimezone' => ['DateTimeZone'], 'DateTime::modify' => ['static', 'modify' => 'string'], 'DateTime::setDate' => ['static', 'year' => 'int', 'month' => 'int', 'day' => 'int'], 'DateTime::setISODate' => ['static', 'year' => 'int', 'week' => 'int', 'day=' => 'int'], 'DateTime::setTime' => ['static', 'hour' => 'int', 'minute' => 'int', 'second=' => 'int', 'microseconds=' => 'int'], 'DateTime::setTimestamp' => ['static', 'unixtimestamp' => 'int'], 'DateTime::setTimezone' => ['static', 'timezone' => 'DateTimeZone'], 'DateTime::sub' => ['static', 'interval' => 'DateInterval'], 'DateTimeImmutable::__construct' => ['void', 'time=' => 'string|null', 'timezone=' => '?DateTimeZone'], 'DateTimeImmutable::__set_state' => ['static', 'array' => 'array'], 'DateTimeImmutable::__wakeup' => ['void'], 'DateTimeImmutable::add' => ['static', 'interval' => 'DateInterval'], 'DateTimeImmutable::createFromFormat' => ['static|false', 'format' => 'string', 'time' => 'string', 'timezone=' => 'DateTimeZone|null'], 'DateTimeImmutable::createFromMutable' => ['static', 'datetime' => 'DateTime'], 'DateTimeImmutable::diff' => ['DateInterval', 'datetime2' => 'DateTimeInterface', 'absolute=' => 'bool'], 'DateTimeImmutable::format' => ['string', 'format' => 'string'], 'DateTimeImmutable::getLastErrors' => ['array'], 'DateTimeImmutable::getOffset' => ['int'], 'DateTimeImmutable::getTimestamp' => ['int'], 'DateTimeImmutable::getTimezone' => ['DateTimeZone'], 'DateTimeImmutable::modify' => ['static', 'modify' => 'string'], 'DateTimeImmutable::setDate' => ['static', 'year' => 'int', 'month' => 'int', 'day' => 'int'], 'DateTimeImmutable::setISODate' => ['static', 'year' => 'int', 'week' => 'int', 'day=' => 'int'], 'DateTimeImmutable::setTime' => ['static', 'hour' => 'int', 'minute' => 'int', 'second=' => 'int', 'microseconds=' => 'int'], 'DateTimeImmutable::setTimestamp' => ['static', 'unixtimestamp' => 'int'], 'DateTimeImmutable::setTimezone' => ['static', 'timezone' => 'DateTimeZone'], 'DateTimeImmutable::sub' => ['static', 'interval' => 'DateInterval'], 'DateTimeInterface::diff' => ['DateInterval', 'datetime2' => 'DateTimeInterface', 'absolute=' => 'bool'], 'DateTimeInterface::format' => ['string', 'format' => 'string'], 'DateTimeInterface::getOffset' => ['int'], 'DateTimeInterface::getTimestamp' => ['int'], 'DateTimeInterface::getTimezone' => ['DateTimeZone'], 'DateTimeZone::__construct' => ['void', 'timezone' => 'string'], 'DateTimeZone::__set_state' => ['DateTimeZone', 'array' => 'array'], 'DateTimeZone::__wakeup' => ['void'], 'DateTimeZone::getLocation' => ['array'], 'DateTimeZone::getName' => ['string'], 'DateTimeZone::getOffset' => ['int', 'datetime' => 'DateTimeInterface'], 'DateTimeZone::getTransitions' => ['array', 'timestamp_begin=' => 'int', 'timestamp_end=' => 'int'], 'DateTimeZone::listAbbreviations' => ['array'], 'DateTimeZone::listIdentifiers' => ['array', 'what=' => 'int', 'country=' => 'string'], 'db2_autocommit' => ['mixed', 'connection' => 'resource', 'value=' => 'int'], 'db2_bind_param' => ['bool', 'stmt' => 'resource', 'parameter_number' => 'int', 'variable_name' => 'string', 'parameter_type=' => 'int', 'data_type=' => 'int', 'precision=' => 'int', 'scale=' => 'int'], 'db2_client_info' => ['object|false', 'connection' => 'resource'], 'db2_close' => ['bool', 'connection' => 'resource'], 'db2_column_privileges' => ['resource|false', 'connection' => 'resource', 'qualifier=' => 'string', 'schema=' => 'string', 'table_name=' => 'string', 'column_name=' => 'string'], 'db2_columns' => ['resource|false', 'connection' => 'resource', 'qualifier=' => 'string', 'schema=' => 'string', 'table_name=' => 'string', 'column_name=' => 'string'], 'db2_commit' => ['bool', 'connection' => 'resource'], 'db2_conn_error' => ['string', 'connection=' => 'resource'], 'db2_conn_errormsg' => ['string', 'connection=' => 'resource'], 'db2_connect' => ['resource|false', 'database' => 'string', 'username' => 'string', 'password' => 'string', 'options=' => 'array'], 'db2_cursor_type' => ['int', 'stmt' => 'resource'], 'db2_escape_string' => ['string', 'string_literal' => 'string'], 'db2_exec' => ['resource|false', 'connection' => 'resource', 'statement' => 'string', 'options=' => 'array'], 'db2_execute' => ['bool', 'stmt' => 'resource', 'parameters=' => 'array'], 'db2_fetch_array' => ['array|false', 'stmt' => 'resource', 'row_number=' => 'int'], 'db2_fetch_assoc' => ['array|false', 'stmt' => 'resource', 'row_number=' => 'int'], 'db2_fetch_both' => ['array|false', 'stmt' => 'resource', 'row_number=' => 'int'], 'db2_fetch_object' => ['object|false', 'stmt' => 'resource', 'row_number=' => 'int'], 'db2_fetch_row' => ['bool', 'stmt' => 'resource', 'row_number=' => 'int'], 'db2_field_display_size' => ['int|false', 'stmt' => 'resource', 'column' => 'mixed'], 'db2_field_name' => ['string|false', 'stmt' => 'resource', 'column' => 'mixed'], 'db2_field_num' => ['int|false', 'stmt' => 'resource', 'column' => 'mixed'], 'db2_field_precision' => ['int|false', 'stmt' => 'resource', 'column' => 'mixed'], 'db2_field_scale' => ['int|false', 'stmt' => 'resource', 'column' => 'mixed'], 'db2_field_type' => ['string|false', 'stmt' => 'resource', 'column' => 'mixed'], 'db2_field_width' => ['int|false', 'stmt' => 'resource', 'column' => 'mixed'], 'db2_foreign_keys' => ['resource|false', 'connection' => 'resource', 'qualifier' => 'string', 'schema' => 'string', 'table_name' => 'string'], 'db2_free_result' => ['bool', 'stmt' => 'resource'], 'db2_free_stmt' => ['bool', 'stmt' => 'resource'], 'db2_get_option' => ['string|false', 'resource' => 'resource', 'option' => 'string'], 'db2_last_insert_id' => ['string', 'resource' => 'resource'], 'db2_lob_read' => ['string|false', 'stmt' => 'resource', 'colnum' => 'int', 'length' => 'int'], 'db2_next_result' => ['resource|false', 'stmt' => 'resource'], 'db2_num_fields' => ['int|false', 'stmt' => 'resource'], 'db2_num_rows' => ['int', 'stmt' => 'resource'], 'db2_pclose' => ['bool', 'resource' => 'resource'], 'db2_pconnect' => ['resource|false', 'database' => 'string', 'username' => 'string', 'password' => 'string', 'options=' => 'array'], 'db2_prepare' => ['resource|false', 'connection' => 'resource', 'statement' => 'string', 'options=' => 'array'], 'db2_primary_keys' => ['resource|false', 'connection' => 'resource', 'qualifier' => 'string', 'schema' => 'string', 'table_name' => 'string'], 'db2_primarykeys' => [''], 'db2_procedure_columns' => ['resource|false', 'connection' => 'resource', 'qualifier' => 'string', 'schema' => 'string', 'procedure' => 'string', 'parameter' => 'string'], 'db2_procedurecolumns' => [''], 'db2_procedures' => ['resource|false', 'connection' => 'resource', 'qualifier' => 'string', 'schema' => 'string', 'procedure' => 'string'], 'db2_result' => ['mixed', 'stmt' => 'resource', 'column' => 'mixed'], 'db2_rollback' => ['bool', 'connection' => 'resource'], 'db2_server_info' => ['object|false', 'connection' => 'resource'], 'db2_set_option' => ['bool', 'resource' => 'resource', 'options' => 'array', 'type' => 'int'], 'db2_setoption' => [''], 'db2_special_columns' => ['resource|false', 'connection' => 'resource', 'qualifier' => 'string', 'schema' => 'string', 'table_name' => 'string', 'scope' => 'int'], 'db2_specialcolumns' => [''], 'db2_statistics' => ['resource|false', 'connection' => 'resource', 'qualifier' => 'string', 'schema' => 'string', 'table_name' => 'string', 'unique' => 'bool'], 'db2_stmt_error' => ['string', 'stmt=' => 'resource'], 'db2_stmt_errormsg' => ['string', 'stmt=' => 'resource'], 'db2_table_privileges' => ['resource|false', 'connection' => 'resource', 'qualifier=' => 'string', 'schema=' => 'string', 'table_name=' => 'string'], 'db2_tableprivileges' => [''], 'db2_tables' => ['resource|false', 'connection' => 'resource', 'qualifier=' => 'string', 'schema=' => 'string', 'table_name=' => 'string', 'table_type=' => 'string'], 'dba_close' => ['void', 'handle' => 'resource'], 'dba_delete' => ['bool', 'key' => 'string', 'handle' => 'resource'], 'dba_exists' => ['bool', 'key' => 'string', 'handle' => 'resource'], 'dba_fetch' => ['string', 'key' => 'string', 'skip' => 'int', 'handle' => 'resource'], 'dba_fetch\'1' => ['string', 'key' => 'string', 'handle' => 'resource'], 'dba_firstkey' => ['string', 'handle' => 'resource'], 'dba_handlers' => ['array', 'full_info=' => 'bool'], 'dba_insert' => ['bool', 'key' => 'string', 'value' => 'string', 'handle' => 'resource'], 'dba_key_split' => ['array|false', 'key' => 'string'], 'dba_list' => ['array'], 'dba_nextkey' => ['string', 'handle' => 'resource'], 'dba_open' => ['resource', 'path' => 'string', 'mode' => 'string', 'handlername=' => 'string', '...args=' => 'string'], 'dba_optimize' => ['bool', 'handle' => 'resource'], 'dba_popen' => ['resource', 'path' => 'string', 'mode' => 'string', 'handlername=' => 'string', '...args=' => 'string'], 'dba_replace' => ['bool', 'key' => 'string', 'value' => 'string', 'handle' => 'resource'], 'dba_sync' => ['bool', 'handle' => 'resource'], 'dbase_add_record' => ['bool', 'dbase_identifier' => 'int', 'record' => 'array'], 'dbase_close' => ['bool', 'dbase_identifier' => 'int'], 'dbase_create' => ['int', 'filename' => 'string', 'fields' => 'array'], 'dbase_delete_record' => ['bool', 'dbase_identifier' => 'int', 'record_number' => 'int'], 'dbase_get_header_info' => ['array', 'dbase_identifier' => 'int'], 'dbase_get_record' => ['array', 'dbase_identifier' => 'int', 'record_number' => 'int'], 'dbase_get_record_with_names' => ['array', 'dbase_identifier' => 'int', 'record_number' => 'int'], 'dbase_numfields' => ['int', 'dbase_identifier' => 'int'], 'dbase_numrecords' => ['int', 'dbase_identifier' => 'int'], 'dbase_open' => ['int', 'filename' => 'string', 'mode' => 'int'], 'dbase_pack' => ['bool', 'dbase_identifier' => 'int'], 'dbase_replace_record' => ['bool', 'dbase_identifier' => 'int', 'record' => 'array', 'record_number' => 'int'], 'dbplus_add' => ['int', 'relation' => 'resource', 'tuple' => 'array'], 'dbplus_aql' => ['resource', 'query' => 'string', 'server=' => 'string', 'dbpath=' => 'string'], 'dbplus_chdir' => ['string', 'newdir=' => 'string'], 'dbplus_close' => ['mixed', 'relation' => 'resource'], 'dbplus_curr' => ['int', 'relation' => 'resource', 'tuple' => 'array'], 'dbplus_errcode' => ['string', 'errno=' => 'int'], 'dbplus_errno' => ['int'], 'dbplus_find' => ['int', 'relation' => 'resource', 'constraints' => 'array', 'tuple' => 'mixed'], 'dbplus_first' => ['int', 'relation' => 'resource', 'tuple' => 'array'], 'dbplus_flush' => ['int', 'relation' => 'resource'], 'dbplus_freealllocks' => ['int'], 'dbplus_freelock' => ['int', 'relation' => 'resource', 'tuple' => 'string'], 'dbplus_freerlocks' => ['int', 'relation' => 'resource'], 'dbplus_getlock' => ['int', 'relation' => 'resource', 'tuple' => 'string'], 'dbplus_getunique' => ['int', 'relation' => 'resource', 'uniqueid' => 'int'], 'dbplus_info' => ['int', 'relation' => 'resource', 'key' => 'string', 'result' => 'array'], 'dbplus_last' => ['int', 'relation' => 'resource', 'tuple' => 'array'], 'dbplus_lockrel' => ['int', 'relation' => 'resource'], 'dbplus_next' => ['int', 'relation' => 'resource', 'tuple' => 'array'], 'dbplus_open' => ['resource', 'name' => 'string'], 'dbplus_prev' => ['int', 'relation' => 'resource', 'tuple' => 'array'], 'dbplus_rchperm' => ['int', 'relation' => 'resource', 'mask' => 'int', 'user' => 'string', 'group' => 'string'], 'dbplus_rcreate' => ['resource', 'name' => 'string', 'domlist' => 'mixed', 'overwrite=' => 'bool'], 'dbplus_rcrtexact' => ['mixed', 'name' => 'string', 'relation' => 'resource', 'overwrite=' => 'bool'], 'dbplus_rcrtlike' => ['mixed', 'name' => 'string', 'relation' => 'resource', 'overwrite=' => 'int'], 'dbplus_resolve' => ['array', 'relation_name' => 'string'], 'dbplus_restorepos' => ['int', 'relation' => 'resource', 'tuple' => 'array'], 'dbplus_rkeys' => ['mixed', 'relation' => 'resource', 'domlist' => 'mixed'], 'dbplus_ropen' => ['resource', 'name' => 'string'], 'dbplus_rquery' => ['resource', 'query' => 'string', 'dbpath=' => 'string'], 'dbplus_rrename' => ['int', 'relation' => 'resource', 'name' => 'string'], 'dbplus_rsecindex' => ['mixed', 'relation' => 'resource', 'domlist' => 'mixed', 'type' => 'int'], 'dbplus_runlink' => ['int', 'relation' => 'resource'], 'dbplus_rzap' => ['int', 'relation' => 'resource'], 'dbplus_savepos' => ['int', 'relation' => 'resource'], 'dbplus_setindex' => ['int', 'relation' => 'resource', 'idx_name' => 'string'], 'dbplus_setindexbynumber' => ['int', 'relation' => 'resource', 'idx_number' => 'int'], 'dbplus_sql' => ['resource', 'query' => 'string', 'server=' => 'string', 'dbpath=' => 'string'], 'dbplus_tcl' => ['string', 'sid' => 'int', 'script' => 'string'], 'dbplus_tremove' => ['int', 'relation' => 'resource', 'tuple' => 'array', 'current=' => 'array'], 'dbplus_undo' => ['int', 'relation' => 'resource'], 'dbplus_undoprepare' => ['int', 'relation' => 'resource'], 'dbplus_unlockrel' => ['int', 'relation' => 'resource'], 'dbplus_unselect' => ['int', 'relation' => 'resource'], 'dbplus_update' => ['int', 'relation' => 'resource', 'old' => 'array', 'new' => 'array'], 'dbplus_xlockrel' => ['int', 'relation' => 'resource'], 'dbplus_xunlockrel' => ['int', 'relation' => 'resource'], 'dbx_close' => ['int', 'link_identifier' => 'object'], 'dbx_compare' => ['int', 'row_a' => 'array', 'row_b' => 'array', 'column_key' => 'string', 'flags=' => 'int'], 'dbx_connect' => ['object', 'module' => 'mixed', 'host' => 'string', 'database' => 'string', 'username' => 'string', 'password' => 'string', 'persistent=' => 'int'], 'dbx_error' => ['string', 'link_identifier' => 'object'], 'dbx_escape_string' => ['string', 'link_identifier' => 'object', 'text' => 'string'], 'dbx_fetch_row' => ['mixed', 'result_identifier' => 'object'], 'dbx_query' => ['mixed', 'link_identifier' => 'object', 'sql_statement' => 'string', 'flags=' => 'int'], 'dbx_sort' => ['bool', 'result' => 'object', 'user_compare_function' => 'string'], 'dcgettext' => ['string', 'domain_name' => 'string', 'msgid' => 'string', 'category' => 'int'], 'dcngettext' => ['string', 'domain' => 'string', 'msgid1' => 'string', 'msgid2' => 'string', 'n' => 'int', 'category' => 'int'], 'deaggregate' => ['', 'object' => 'object', 'class_name=' => 'string'], 'debug_backtrace' => ['array<int,array>', 'options=' => 'int|bool', 'limit=' => 'int'], 'debug_print_backtrace' => ['void', 'options=' => 'int|bool', 'limit=' => 'int'], 'debug_zval_dump' => ['void', '...var' => 'mixed'], 'debugger_connect' => [''], 'debugger_connector_pid' => [''], 'debugger_get_server_start_time' => [''], 'debugger_print' => [''], 'debugger_start_debug' => [''], 'decbin' => ['string', 'decimal_number' => 'int'], 'dechex' => ['string', 'decimal_number' => 'int'], 'decoct' => ['string', 'decimal_number' => 'int'], 'define' => ['bool', 'constant_name' => 'string', 'value' => 'mixed', 'case_insensitive=' => 'bool'], 'define_syslog_variables' => ['void'], 'defined' => ['bool', 'name' => 'string'], 'deflate_add' => ['string|false', 'context' => 'resource', 'data' => 'string', 'flush_mode=' => 'int'], 'deflate_init' => ['resource|false', 'encoding' => 'int', 'options=' => 'array'], 'deg2rad' => ['float', 'number' => 'float'], 'dgettext' => ['string', 'domain_name' => 'string', 'msgid' => 'string'], 'dio_close' => ['void', 'fd' => 'resource'], 'dio_fcntl' => ['mixed', 'fd' => 'resource', 'cmd' => 'int', 'args=' => 'mixed'], 'dio_open' => ['resource', 'filename' => 'string', 'flags' => 'int', 'mode=' => 'int'], 'dio_read' => ['string', 'fd' => 'resource', 'len=' => 'int'], 'dio_seek' => ['int', 'fd' => 'resource', 'pos' => 'int', 'whence=' => 'int'], 'dio_stat' => ['array|null', 'fd' => 'resource'], 'dio_tcsetattr' => ['bool', 'fd' => 'resource', 'options' => 'array'], 'dio_truncate' => ['bool', 'fd' => 'resource', 'offset' => 'int'], 'dio_write' => ['int', 'fd' => 'resource', 'data' => 'string', 'len=' => 'int'], 'dir' => ['Directory|false', 'directory' => 'string', 'context=' => 'resource'], 'Directory::close' => ['void', 'dir_handle=' => 'resource'], 'Directory::read' => ['string|false', 'dir_handle=' => 'resource'], 'Directory::rewind' => ['void', 'dir_handle=' => 'resource'], 'DirectoryIterator::__construct' => ['void', 'path' => 'string'], 'DirectoryIterator::__toString' => ['string'], 'DirectoryIterator::current' => ['DirectoryIterator'], 'DirectoryIterator::getATime' => ['int'], 'DirectoryIterator::getBasename' => ['string', 'suffix=' => 'string'], 'DirectoryIterator::getChildren' => ['RecursiveDirectoryIterator'], 'DirectoryIterator::getCTime' => ['int'], 'DirectoryIterator::getExtension' => ['string'], 'DirectoryIterator::getFileInfo' => ['SplFileInfo', 'class_name=' => 'string'], 'DirectoryIterator::getFilename' => ['string'], 'DirectoryIterator::getGroup' => ['int'], 'DirectoryIterator::getInode' => ['int'], 'DirectoryIterator::getLinkTarget' => ['string'], 'DirectoryIterator::getMTime' => ['int'], 'DirectoryIterator::getOwner' => ['int'], 'DirectoryIterator::getPath' => ['string'], 'DirectoryIterator::getPathInfo' => ['SplFileInfo', 'class_name=' => 'string'], 'DirectoryIterator::getPathname' => ['string'], 'DirectoryIterator::getPerms' => ['int'], 'DirectoryIterator::getRealPath' => ['string'], 'DirectoryIterator::getSize' => ['int'], 'DirectoryIterator::getType' => ['string'], 'DirectoryIterator::isDir' => ['bool'], 'DirectoryIterator::isDot' => ['bool'], 'DirectoryIterator::isExecutable' => ['bool'], 'DirectoryIterator::isFile' => ['bool'], 'DirectoryIterator::isLink' => ['bool'], 'DirectoryIterator::isReadable' => ['bool'], 'DirectoryIterator::isWritable' => ['bool'], 'DirectoryIterator::key' => ['string'], 'DirectoryIterator::next' => ['void'], 'DirectoryIterator::openFile' => ['SplFileObject', 'mode=' => 'string', 'use_include_path=' => 'bool', 'context=' => 'resource'], 'DirectoryIterator::rewind' => ['void'], 'DirectoryIterator::seek' => ['void', 'position' => 'int'], 'DirectoryIterator::setFileClass' => ['void', 'class_name=' => 'string'], 'DirectoryIterator::setInfoClass' => ['void', 'class_name=' => 'string'], 'DirectoryIterator::valid' => ['bool'], 'dirname' => ['string', 'path' => 'string', 'levels=' => 'int'], 'disk_free_space' => ['float|false', 'path' => 'string'], 'disk_total_space' => ['float', 'path' => 'string'], 'diskfreespace' => ['float|false', 'path' => 'string'], 'display_disabled_function' => [''], 'dl' => ['bool', 'extension_filename' => 'string'], 'dngettext' => ['string', 'domain' => 'string', 'msgid1' => 'string', 'msgid2' => 'string', 'count' => 'int'], 'dns_check_record' => ['bool', 'host' => 'string', 'type=' => 'string'], 'dns_get_mx' => ['bool', 'hostname' => 'string', '&w_mxhosts' => 'array', '&w_weight' => 'array'], 'dns_get_record' => ['array|false', 'hostname' => 'string', 'type=' => 'int', '&w_authns=' => 'array', '&w_addtl=' => 'array', 'raw=' => 'bool'], 'dom_document_relaxNG_validate_file' => ['bool', 'filename' => 'string'], 'dom_document_relaxNG_validate_xml' => ['bool', 'source' => 'string'], 'dom_document_schema_validate' => ['bool', 'source' => 'string', 'flags' => 'int'], 'dom_document_schema_validate_file' => ['bool', 'filename' => 'string', 'flags' => 'int'], 'dom_document_xinclude' => ['int', 'options' => 'int'], 'dom_import_simplexml' => ['DOMElement|false', 'node' => 'SimpleXMLElement'], 'dom_xpath_evaluate' => ['', 'expr' => 'string', 'context' => 'DOMNode', 'registernodens' => 'bool'], 'dom_xpath_query' => ['DOMNodeList', 'expr' => 'string', 'context' => 'DOMNode', 'registernodens' => 'bool'], 'dom_xpath_register_ns' => ['bool', 'prefix' => 'string', 'uri' => 'string'], 'dom_xpath_register_php_functions' => [''], 'DomainException::__clone' => ['void'], 'DomainException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?Throwable|?DomainException'], 'DomainException::__toString' => ['string'], 'DomainException::__wakeup' => ['void'], 'DomainException::getCode' => ['int'], 'DomainException::getFile' => ['string'], 'DomainException::getLine' => ['int'], 'DomainException::getMessage' => ['string'], 'DomainException::getPrevious' => ['Throwable|DomainException|null'], 'DomainException::getTrace' => ['array'], 'DomainException::getTraceAsString' => ['string'], 'DOMAttr::__construct' => ['void', 'name' => 'string', 'value=' => 'string'], 'DOMAttr::isId' => ['bool'], 'DomAttribute::name' => ['string'], 'DomAttribute::set_value' => ['bool', 'content' => 'string'], 'DomAttribute::specified' => ['bool'], 'DomAttribute::value' => ['string'], 'DOMCdataSection::__construct' => ['void', 'value' => 'string'], 'DOMCharacterData::appendData' => ['void', 'data' => 'string'], 'DOMCharacterData::deleteData' => ['void', 'offset' => 'int', 'count' => 'int'], 'DOMCharacterData::insertData' => ['void', 'offset' => 'int', 'data' => 'string'], 'DOMCharacterData::replaceData' => ['void', 'offset' => 'int', 'count' => 'int', 'data' => 'string'], 'DOMCharacterData::substringData' => ['string', 'offset' => 'int', 'count' => 'int'], 'DOMComment::__construct' => ['void', 'value=' => 'string'], 'DOMDocument::__construct' => ['void', 'version=' => 'string', 'encoding=' => 'string'], 'DOMDocument::createAttribute' => ['DOMAttr', 'name' => 'string'], 'DOMDocument::createAttributeNS' => ['DOMAttr', 'namespaceuri' => 'string', 'qualifiedname' => 'string'], 'DOMDocument::createCDATASection' => ['DOMCDATASection', 'data' => 'string'], 'DOMDocument::createComment' => ['DOMComment', 'data' => 'string'], 'DOMDocument::createDocumentFragment' => ['DOMDocumentFragment'], 'DOMDocument::createElement' => ['DOMElement', 'name' => 'string', 'value=' => 'string'], 'DOMDocument::createElementNS' => ['DOMElement', 'namespaceuri' => 'string', 'qualifiedname' => 'string', 'value=' => 'string'], 'DOMDocument::createEntityReference' => ['DOMEntityReference', 'name' => 'string'], 'DOMDocument::createProcessingInstruction' => ['DOMProcessingInstruction', 'target' => 'string', 'data=' => 'string'], 'DOMDocument::createTextNode' => ['DOMText', 'content' => 'string'], 'DOMDocument::getElementById' => ['DOMElement|null', 'elementid' => 'string'], 'DOMDocument::getElementsByTagName' => ['DOMNodeList', 'name' => 'string'], 'DOMDocument::getElementsByTagNameNS' => ['DOMNodeList', 'namespaceuri' => 'string', 'localname' => 'string'], 'DOMDocument::importNode' => ['DOMNode', 'importednode' => 'DOMNode', 'deep=' => 'bool'], 'DOMDocument::load' => ['mixed', 'filename' => 'string', 'options=' => 'int'], 'DOMDocument::loadHTML' => ['bool', 'source' => 'string', 'options=' => 'int'], 'DOMDocument::loadHTMLFile' => ['bool', 'filename' => 'string', 'options=' => 'int'], 'DOMDocument::loadXML' => ['mixed', 'source' => 'string', 'options=' => 'int'], 'DOMDocument::normalizeDocument' => ['void'], 'DOMDocument::registerNodeClass' => ['bool', 'baseclass' => 'string', 'extendedclass' => 'string'], 'DOMDocument::relaxNGValidate' => ['bool', 'filename' => 'string'], 'DOMDocument::relaxNGValidateSource' => ['bool', 'source' => 'string'], 'DOMDocument::save' => ['int', 'filename' => 'string', 'options=' => 'int'], 'DOMDocument::saveHTML' => ['string|false', 'node=' => '?DOMNode'], 'DOMDocument::saveHTMLFile' => ['int', 'filename' => 'string'], 'DOMDocument::saveXML' => ['string', 'node=' => '?DOMNode', 'options=' => 'int'], 'DOMDocument::schemaValidate' => ['bool', 'filename' => 'string', 'flags=' => 'int'], 'DOMDocument::schemaValidateSource' => ['bool', 'source' => 'string', 'flags=' => 'int'], 'DOMDocument::validate' => ['bool'], 'DOMDocument::xinclude' => ['int', 'options=' => 'int'], 'DOMDocumentFragment::__construct' => ['void'], 'DOMDocumentFragment::appendXML' => ['bool', 'data' => 'string'], 'DomDocumentType::entities' => ['array'], 'DomDocumentType::internal_subset' => ['bool'], 'DomDocumentType::name' => ['string'], 'DomDocumentType::notations' => ['array'], 'DomDocumentType::public_id' => ['string'], 'DomDocumentType::system_id' => ['string'], 'DOMElement::__construct' => ['void', 'name' => 'string', 'value=' => 'string', 'uri=' => 'string'], 'DOMElement::get_attribute' => ['string', 'name' => 'string'], 'DOMElement::get_attribute_node' => ['DomAttribute', 'name' => 'string'], 'DOMElement::get_elements_by_tagname' => ['array', 'name' => 'string'], 'DOMElement::getAttribute' => ['string', 'name' => 'string'], 'DOMElement::getAttributeNode' => ['DOMAttr', 'name' => 'string'], 'DOMElement::getAttributeNodeNS' => ['DOMAttr', 'namespaceuri' => 'string', 'localname' => 'string'], 'DOMElement::getAttributeNS' => ['string', 'namespaceuri' => 'string', 'localname' => 'string'], 'DOMElement::getElementsByTagName' => ['DOMNodeList', 'name' => 'string'], 'DOMElement::getElementsByTagNameNS' => ['DOMNodeList', 'namespaceuri' => 'string', 'localname' => 'string'], 'DOMElement::has_attribute' => ['bool', 'name' => 'string'], 'DOMElement::hasAttribute' => ['bool', 'name' => 'string'], 'DOMElement::hasAttributeNS' => ['bool', 'namespaceuri' => 'string', 'localname' => 'string'], 'DOMElement::remove_attribute' => ['bool', 'name' => 'string'], 'DOMElement::removeAttribute' => ['bool', 'name' => 'string'], 'DOMElement::removeAttributeNode' => ['bool', 'oldnode' => 'DOMAttr'], 'DOMElement::removeAttributeNS' => ['bool', 'namespaceuri' => 'string', 'localname' => 'string'], 'DOMElement::set_attribute' => ['DomAttribute', 'name' => 'string', 'value' => 'string'], 'DOMElement::set_attribute_node' => ['DomNode', 'attr' => 'DOMNode'], 'DOMElement::setAttribute' => ['DOMAttr', 'name' => 'string', 'value' => 'string'], 'DOMElement::setAttributeNode' => ['DOMAttr', 'attr' => 'DOMAttr'], 'DOMElement::setAttributeNodeNS' => ['DOMAttr', 'attr' => 'DOMAttr'], 'DOMElement::setAttributeNS' => ['void', 'namespaceuri' => 'string', 'qualifiedname' => 'string', 'value' => 'string'], 'DOMElement::setIdAttribute' => ['void', 'name' => 'string', 'isid' => 'bool'], 'DOMElement::setIdAttributeNode' => ['void', 'attr' => 'DOMAttr', 'isid' => 'bool'], 'DOMElement::setIdAttributeNS' => ['void', 'namespaceuri' => 'string', 'localname' => 'string', 'isid' => 'bool'], 'DOMElement::tagname' => ['string'], 'DOMEntityReference::__construct' => ['void', 'name' => 'string'], 'DOMImplementation::__construct' => ['void'], 'DOMImplementation::createDocument' => ['DOMDocument', 'namespaceuri=' => 'string', 'qualifiedname=' => 'string', 'doctype=' => 'DOMDocumentType'], 'DOMImplementation::createDocumentType' => ['DOMDocumentType', 'qualifiedname=' => 'string', 'publicid=' => 'string', 'systemid=' => 'string'], 'DOMImplementation::hasFeature' => ['bool', 'feature' => 'string', 'version' => 'string'], 'DOMNamedNodeMap::count' => ['int'], 'DOMNamedNodeMap::getNamedItem' => ['?DOMNode', 'name' => 'string'], 'DOMNamedNodeMap::getNamedItemNS' => ['?DOMNode', 'namespaceuri' => 'string', 'localname' => 'string'], 'DOMNamedNodeMap::item' => ['?DOMNode', 'index' => 'int'], 'DomNode::add_namespace' => ['bool', 'uri' => 'string', 'prefix' => 'string'], 'DomNode::append_child' => ['DOMNode', 'newnode' => 'DOMNode'], 'DOMNode::appendChild' => ['DOMNode', 'newnode' => 'DOMNode'], 'DOMNode::C14N' => ['string', 'exclusive=' => 'bool', 'with_comments=' => 'bool', 'xpath=' => 'array', 'ns_prefixes=' => 'array'], 'DOMNode::C14NFile' => ['int', 'uri=' => 'string', 'exclusive=' => 'bool', 'with_comments=' => 'bool', 'xpath=' => 'array', 'ns_prefixes=' => 'array'], 'DOMNode::cloneNode' => ['DOMNode', 'deep=' => 'bool'], 'DOMNode::getLineNo' => ['int'], 'DOMNode::getNodePath' => ['?string'], 'DOMNode::hasAttributes' => ['bool'], 'DOMNode::hasChildNodes' => ['bool'], 'DOMNode::insertBefore' => ['DOMNode', 'newnode' => 'DOMNode', 'refnode=' => 'DOMNode'], 'DOMNode::isDefaultNamespace' => ['bool', 'namespaceuri' => 'string'], 'DOMNode::isSameNode' => ['bool', 'node' => 'DOMNode'], 'DOMNode::isSupported' => ['bool', 'feature' => 'string', 'version' => 'string'], 'DOMNode::lookupNamespaceURI' => ['string', 'prefix' => 'string'], 'DOMNode::lookupPrefix' => ['string', 'namespaceuri' => 'string'], 'DOMNode::normalize' => ['void'], 'DOMNode::removeChild' => ['DOMNode', 'oldnode' => 'DOMNode'], 'DOMNode::replaceChild' => ['DOMNode', 'newnode' => 'DOMNode', 'oldnode' => 'DOMNode'], 'DOMNodeList::count' => ['int'], 'DOMNodeList::item' => ['?DOMNode', 'index' => 'int'], 'DOMProcessingInstruction::__construct' => ['void', 'name' => 'string', 'value' => 'string'], 'DomProcessingInstruction::data' => ['string'], 'DomProcessingInstruction::target' => ['string'], 'DOMText::__construct' => ['void', 'value=' => 'string'], 'DOMText::isElementContentWhitespace' => ['bool'], 'DOMText::isWhitespaceInElementContent' => ['bool'], 'DOMText::splitText' => ['DOMText', 'offset' => 'int'], 'domxml_new_doc' => ['DomDocument', 'version' => 'string'], 'domxml_open_file' => ['DomDocument', 'filename' => 'string', 'mode=' => 'int', 'error=' => 'array'], 'domxml_open_mem' => ['DomDocument', 'str' => 'string', 'mode=' => 'int', 'error=' => 'array'], 'domxml_version' => ['string'], 'domxml_xmltree' => ['DomDocument', 'str' => 'string'], 'domxml_xslt_stylesheet' => ['DomXsltStylesheet', 'xsl_buf' => 'string'], 'domxml_xslt_stylesheet_doc' => ['DomXsltStylesheet', 'xsl_doc' => 'DOMDocument'], 'domxml_xslt_stylesheet_file' => ['DomXsltStylesheet', 'xsl_file' => 'string'], 'domxml_xslt_version' => ['int'], 'DOMXPath::__construct' => ['void', 'doc' => 'DOMDocument'], 'DOMXPath::evaluate' => ['mixed', 'expression' => 'string', 'contextnode=' => 'DOMNode', 'registernodens=' => 'bool'], 'DOMXPath::query' => ['DOMNodeList', 'expression' => 'string', 'contextnode=' => 'DOMNode', 'registernodens=' => 'bool'], 'DOMXPath::registerNamespace' => ['bool', 'prefix' => 'string', 'namespaceuri' => 'string'], 'DOMXPath::registerPhpFunctions' => ['void', 'restrict=' => 'mixed'], 'DomXsltStylesheet::process' => ['DomDocument', 'xml_doc' => 'DOMDocument', 'xslt_params=' => 'array', 'is_xpath_param=' => 'bool', 'profile_filename=' => 'string'], 'DomXsltStylesheet::result_dump_file' => ['string', 'xmldoc' => 'DOMDocument', 'filename' => 'string'], 'DomXsltStylesheet::result_dump_mem' => ['string', 'xmldoc' => 'DOMDocument'], 'DOTNET::__construct' => ['void', 'assembly_name' => 'string', 'class_name' => 'string', 'codepage=' => 'int'], 'dotnet_load' => ['int', 'assembly_name' => 'string', 'datatype_name=' => 'string', 'codepage=' => 'int'], 'doubleval' => ['float', 'var' => 'mixed'], 'Ds\\Collection::clear' => ['void'], 'Ds\\Collection::copy' => ['_HumbugBoxb94336daae36\\Ds\\Collection'], 'Ds\\Collection::isEmpty' => ['bool'], 'Ds\\Collection::toArray' => ['array'], 'Ds\\Hashable::hash' => ['void'], 'Ds\\Hashable::equals' => ['bool', 'obj' => 'mixed'], 'Ds\\Sequence::allocate' => ['void', 'capacity' => 'int'], 'Ds\\Sequence::apply' => ['void', 'callback' => 'callable'], 'Ds\\Sequence::capacity' => ['int'], 'Ds\\Sequence::contains' => ['bool', '...values=' => 'mixed'], 'Ds\\Sequence::filter' => ['_HumbugBoxb94336daae36\\Ds\\Sequence', 'callback=' => 'callable'], 'Ds\\Sequence::find' => ['mixed', 'value' => 'mixed'], 'Ds\\Sequence::first' => ['mixed'], 'Ds\\Sequence::get' => ['mixed', 'index' => 'int'], 'Ds\\Sequence::insert' => ['void', 'index' => 'int', '...values=' => 'mixed'], 'Ds\\Sequence::join' => ['string', 'glue=' => 'string'], 'Ds\\Sequence::last' => ['void'], 'Ds\\Sequence::map' => ['_HumbugBoxb94336daae36\\Ds\\Sequence', 'callback' => 'callable'], 'Ds\\Sequence::merge' => ['_HumbugBoxb94336daae36\\Ds\\Sequence', 'values' => 'mixed'], 'Ds\\Sequence::pop' => ['mixed'], 'Ds\\Sequence::push' => ['void', '...values=' => 'mixed'], 'Ds\\Sequence::reduce' => ['mixed', 'callback' => 'callable', 'initial=' => 'mixed'], 'Ds\\Sequence::remove' => ['mixed', 'index' => 'int'], 'Ds\\Sequence::reverse' => ['void'], 'Ds\\Sequence::reversed' => ['_HumbugBoxb94336daae36\\Ds\\Sequence'], 'Ds\\Sequence::rotate' => ['void', 'rotations' => 'int'], 'Ds\\Sequence::set' => ['void', 'index' => 'int', 'value' => 'mixed'], 'Ds\\Sequence::shift' => ['mixed'], 'Ds\\Sequence::slice' => ['_HumbugBoxb94336daae36\\Ds\\Sequence', 'index' => 'int', 'length=' => '?int'], 'Ds\\Sequence::sort' => ['void', 'comparator=' => 'callable'], 'Ds\\Sequence::sorted' => ['_HumbugBoxb94336daae36\\Ds\\Sequence', 'comparator=' => 'callable'], 'Ds\\Sequence::sum' => ['int|float'], 'Ds\\Sequence::unshift' => ['void', '...values=' => 'mixed'], 'Ds\\Vector::__construct' => ['void', 'values=' => 'mixed'], 'Ds\\Vector::allocate' => ['void', 'capacity' => 'int'], 'Ds\\Vector::apply' => ['void', 'callback' => 'callable'], 'Ds\\Vector::capacity' => ['int'], 'Ds\\Vector::contains' => ['bool', '...values=' => 'mixed'], 'Ds\\Vector::filter' => ['_HumbugBoxb94336daae36\\Ds\\Vector', 'callback=' => 'callable'], 'Ds\\Vector::find' => ['mixed', 'value' => 'mixed'], 'Ds\\Vector::first' => ['mixed'], 'Ds\\Vector::get' => ['mixed', 'index' => 'int'], 'Ds\\Vector::insert' => ['void', 'index' => 'int', '...values=' => 'mixed'], 'Ds\\Vector::join' => ['string', 'glue=' => 'string'], 'Ds\\Vector::last' => ['mixed'], 'Ds\\Vector::map' => ['_HumbugBoxb94336daae36\\Ds\\Vector', 'callback' => 'callable'], 'Ds\\Vector::merge' => ['_HumbugBoxb94336daae36\\Ds\\Vector', 'values' => 'mixed'], 'Ds\\Vector::pop' => ['mixed'], 'Ds\\Vector::push' => ['void', '...values=' => 'mixed'], 'Ds\\Vector::reduce' => ['mixed', 'callback' => 'callable', 'initial=' => 'mixed'], 'Ds\\Vector::remove' => ['mixed', 'index' => 'int'], 'Ds\\Vector::reverse' => ['void'], 'Ds\\Vector::reversed' => ['_HumbugBoxb94336daae36\\Ds\\Vector'], 'Ds\\Vector::rotate' => ['void', 'rotations' => 'int'], 'Ds\\Vector::set' => ['void', 'index' => 'int', 'value' => 'mixed'], 'Ds\\Vector::shift' => ['mixed'], 'Ds\\Vector::slice' => ['_HumbugBoxb94336daae36\\Ds\\Vector', 'index' => 'int', 'length=' => '?int'], 'Ds\\Vector::sort' => ['void', 'comparator=' => 'callable'], 'Ds\\Vector::sorted' => ['_HumbugBoxb94336daae36\\Ds\\Vector', 'comparator=' => 'callable'], 'Ds\\Vector::sum' => ['int|float'], 'Ds\\Vector::unshift' => ['void', '...values=' => 'mixed'], 'Ds\\Vector::clear' => ['void'], 'Ds\\Vector::copy' => ['_HumbugBoxb94336daae36\\Ds\\Vector'], 'Ds\\Vector::count' => ['int'], 'Ds\\Vector::isEmpty' => ['bool'], 'Ds\\Vector::jsonSerialize' => ['array'], 'Ds\\Vector::toArray' => ['array'], 'Ds\\Deque::__construct' => ['void', 'values=' => 'mixed'], 'Ds\\Deque::clear' => ['void'], 'Ds\\Deque::copy' => ['_HumbugBoxb94336daae36\\Ds\\Deque'], 'Ds\\Deque::count' => ['int'], 'Ds\\Deque::isEmpty' => ['bool'], 'Ds\\Deque::jsonSerialize' => ['array'], 'Ds\\Deque::toArray' => ['array'], 'Ds\\Deque::allocate' => ['void', 'capacity' => 'int'], 'Ds\\Deque::apply' => ['void', 'callback' => 'callable'], 'Ds\\Deque::capacity' => ['int'], 'Ds\\Deque::contains' => ['bool', '...values=' => 'mixed'], 'Ds\\Deque::filter' => ['_HumbugBoxb94336daae36\\Ds\\Deque', 'callback=' => 'callable'], 'Ds\\Deque::find' => ['mixed', 'value' => 'mixed'], 'Ds\\Deque::first' => ['mixed'], 'Ds\\Deque::get' => ['void', 'index' => 'int'], 'Ds\\Deque::insert' => ['void', 'index' => 'int', '...values=' => 'mixed'], 'Ds\\Deque::join' => ['string', 'glue=' => 'string'], 'Ds\\Deque::last' => ['mixed'], 'Ds\\Deque::map' => ['_HumbugBoxb94336daae36\\Ds\\Deque', 'callback' => 'callable'], 'Ds\\Deque::merge' => ['_HumbugBoxb94336daae36\\Ds\\Deque', 'values' => 'mixed'], 'Ds\\Deque::pop' => ['mixed'], 'Ds\\Deque::push' => ['void', '...values=' => 'mixed'], 'Ds\\Deque::reduce' => ['mixed', 'callback' => 'callable', 'initial=' => 'mixed'], 'Ds\\Deque::remove' => ['mixed', 'index' => 'int'], 'Ds\\Deque::reverse' => ['void'], 'Ds\\Deque::reversed' => ['_HumbugBoxb94336daae36\\Ds\\Deque'], 'Ds\\Deque::rotate' => ['void', 'rotations' => 'int'], 'Ds\\Deque::set' => ['void', 'index' => 'int', 'value' => 'mixed'], 'Ds\\Deque::shift' => ['mixed'], 'Ds\\Deque::slice' => ['_HumbugBoxb94336daae36\\Ds\\Deque', 'index' => 'int', 'length=' => '?int'], 'Ds\\Deque::sort' => ['void', 'comparator=' => 'callable'], 'Ds\\Deque::sorted' => ['_HumbugBoxb94336daae36\\Ds\\Deque', 'comparator=' => 'callable'], 'Ds\\Deque::sum' => ['int|float'], 'Ds\\Deque::unshift' => ['void', '...values=' => 'mixed'], 'Ds\\Map::__construct' => ['void', 'values=' => 'mixed'], 'Ds\\Map::allocate' => ['void', 'capacity' => 'int'], 'Ds\\Map::apply' => ['void', 'callback' => 'callable'], 'Ds\\Map::capacity' => ['int'], 'Ds\\Map::diff' => ['_HumbugBoxb94336daae36\\Ds\\Map', 'map' => '_HumbugBoxb94336daae36\\Ds\\Map'], 'Ds\\Map::filter' => ['_HumbugBoxb94336daae36\\Ds\\Map', 'callback=' => 'callable'], 'Ds\\Map::first' => ['_HumbugBoxb94336daae36\\Ds\\Pair'], 'Ds\\Map::get' => ['mixed', 'key' => 'mixed', 'default=' => 'mixed'], 'Ds\\Map::hasKey' => ['bool', 'key' => 'mixed'], 'Ds\\Map::hasValue' => ['bool', 'value' => 'mixed'], 'Ds\\Map::intersect' => ['_HumbugBoxb94336daae36\\Ds\\Map', 'map' => '_HumbugBoxb94336daae36\\Ds\\Map'], 'Ds\\Map::keys' => ['_HumbugBoxb94336daae36\\Ds\\Set'], 'Ds\\Map::ksort' => ['void', 'comparator=' => 'callable'], 'Ds\\Map::ksorted' => ['_HumbugBoxb94336daae36\\Ds\\Map', 'comparator=' => 'callable'], 'Ds\\Map::last' => ['_HumbugBoxb94336daae36\\Ds\\Pair'], 'Ds\\Map::map' => ['_HumbugBoxb94336daae36\\Ds\\Map', 'callback' => 'callable'], 'Ds\\Map::merge' => ['_HumbugBoxb94336daae36\\Ds\\Map', 'values' => 'mixed'], 'Ds\\Map::pairs' => ['_HumbugBoxb94336daae36\\Ds\\Sequence'], 'Ds\\Map::put' => ['void', 'key' => 'mixed', 'value' => 'mixed'], 'Ds\\Map::putAll' => ['void', 'values' => 'mixed'], 'Ds\\Map::reduce' => ['mixed', 'callback' => 'callable', 'initial=' => 'mixed'], 'Ds\\Map::remove' => ['mixed', 'key' => 'mixed', 'default=' => 'mixed'], 'Ds\\Map::reverse' => ['void'], 'Ds\\Map::reversed' => ['_HumbugBoxb94336daae36\\Ds\\Map'], 'Ds\\Map::skip' => ['_HumbugBoxb94336daae36\\Ds\\Pair', 'position' => 'int'], 'Ds\\Map::slice' => ['_HumbugBoxb94336daae36\\Ds\\Map', 'index' => 'int', 'length=' => '?int'], 'Ds\\Map::sort' => ['void', 'comparator=' => 'callable'], 'Ds\\Map::sorted' => ['_HumbugBoxb94336daae36\\Ds\\Map', 'comparator=' => 'callable'], 'Ds\\Map::sum' => ['int|float'], 'Ds\\Map::union' => ['_HumbugBoxb94336daae36\\Ds\\Map', 'map' => 'mixed'], 'Ds\\Map::values' => ['_HumbugBoxb94336daae36\\Ds\\Sequence'], 'Ds\\Map::xor' => ['_HumbugBoxb94336daae36\\Ds\\Map', 'map' => '_HumbugBoxb94336daae36\\Ds\\Map'], 'Ds\\Map::clear' => ['void'], 'Ds\\Map::copy' => ['_HumbugBoxb94336daae36\\Ds\\Map'], 'Ds\\Map::count' => ['int'], 'Ds\\Map::isEmpty' => ['bool'], 'Ds\\Map::jsonSerialize' => ['array'], 'Ds\\Map::toArray' => ['array'], 'Ds\\Pair::__construct' => ['void', 'key=' => 'mixed', 'value=' => 'mixed'], 'Ds\\Pair::copy' => ['_HumbugBoxb94336daae36\\Ds\\Pair'], 'Ds\\Pair::jsonSerialize' => ['array'], 'Ds\\Pair::toArray' => ['array'], 'Ds\\Set::__construct' => ['void', 'values=' => 'mixed'], 'Ds\\Set::add' => ['void', '...values=' => 'mixed'], 'Ds\\Set::allocate' => ['void', 'capacity' => 'int'], 'Ds\\Set::capacity' => ['int'], 'Ds\\Set::contains' => ['bool', '...values=' => 'mixed'], 'Ds\\Set::diff' => ['_HumbugBoxb94336daae36\\Ds\\Set', 'set' => '_HumbugBoxb94336daae36\\Ds\\Set'], 'Ds\\Set::filter' => ['_HumbugBoxb94336daae36\\Ds\\Set', 'callback=' => 'callable'], 'Ds\\Set::first' => ['mixed'], 'Ds\\Set::get' => ['mixed', 'index' => 'int'], 'Ds\\Set::intersect' => ['_HumbugBoxb94336daae36\\Ds\\Set', 'set' => '_HumbugBoxb94336daae36\\Ds\\Set'], 'Ds\\Set::join' => ['string', 'glue=' => 'string'], 'Ds\\Set::last' => ['mixed'], 'Ds\\Set::merge' => ['_HumbugBoxb94336daae36\\Ds\\Set', 'values' => 'mixed'], 'Ds\\Set::reduce' => ['mixed', 'callback' => 'callable', 'initial=' => 'mixed'], 'Ds\\Set::remove' => ['void', '...values=' => 'mixed'], 'Ds\\Set::reverse' => ['void'], 'Ds\\Set::reversed' => ['_HumbugBoxb94336daae36\\Ds\\Set'], 'Ds\\Set::slice' => ['_HumbugBoxb94336daae36\\Ds\\Set', 'index' => 'int', 'length=' => '?int'], 'Ds\\Set::sort' => ['void', 'comparator=' => 'callable'], 'Ds\\Set::sorted' => ['_HumbugBoxb94336daae36\\Ds\\Set', 'comparator=' => 'callable'], 'Ds\\Set::sum' => ['int|float'], 'Ds\\Set::union' => ['_HumbugBoxb94336daae36\\?Ds\\Set', 'set' => '_HumbugBoxb94336daae36\\Ds\\Set'], 'Ds\\Set::xor' => ['_HumbugBoxb94336daae36\\Ds\\Set', 'set' => '_HumbugBoxb94336daae36\\Ds\\Set'], 'Ds\\Set::clear' => ['void'], 'Ds\\Set::copy' => ['_HumbugBoxb94336daae36\\Ds\\Set'], 'Ds\\Set::count' => ['int'], 'Ds\\Set::isEmpty' => ['bool'], 'Ds\\Set::jsonSerialize' => ['array'], 'Ds\\Set::toArray' => ['array'], 'Ds\\Stack::__construct' => ['void', 'values=' => 'mixed'], 'Ds\\Stack::allocate' => ['void', 'capacity' => 'int'], 'Ds\\Stack::capacity' => ['int'], 'Ds\\Stack::peek' => ['mixed'], 'Ds\\Stack::pop' => ['mixed'], 'Ds\\Stack::push' => ['void', '...values=' => 'mixed'], 'Ds\\Stack::clear' => ['void'], 'Ds\\Stack::copy' => ['_HumbugBoxb94336daae36\\Ds\\Stack'], 'Ds\\Stack::count' => ['int'], 'Ds\\Stack::isEmpty' => ['bool'], 'Ds\\Stack::jsonSerialize' => ['array'], 'Ds\\Stack::toArray' => ['array'], 'Ds\\Queue::__construct' => ['void', 'values=' => 'mixed'], 'Ds\\Queue::allocate' => ['void', 'capacity' => 'int'], 'Ds\\Queue::capacity' => ['int'], 'Ds\\Queue::peek' => ['mixed'], 'Ds\\Queue::pop' => ['mixed'], 'Ds\\Queue::push' => ['void', '...values=' => 'mixed'], 'Ds\\Queue::clear' => ['void'], 'Ds\\Queue::copy' => ['_HumbugBoxb94336daae36\\Ds\\Queue'], 'Ds\\Queue::count' => ['int'], 'Ds\\Queue::isEmpty' => ['bool'], 'Ds\\Queue::jsonSerialize' => ['array'], 'Ds\\Queue::toArray' => ['array'], 'Ds\\PriorityQueue::__construct' => ['void'], 'Ds\\PriorityQueue::allocate' => ['void', 'capacity' => 'int'], 'Ds\\PriorityQueue::capacity' => ['int'], 'Ds\\PriorityQueue::peek' => ['mixed'], 'Ds\\PriorityQueue::pop' => ['mixed'], 'Ds\\PriorityQueue::push' => ['void', 'value' => 'mixed', 'priority' => 'int'], 'Ds\\PriorityQueue::clear' => ['void'], 'Ds\\PriorityQueue::copy' => ['_HumbugBoxb94336daae36\\Ds\\PriorityQueue'], 'Ds\\PriorityQueue::count' => ['int'], 'Ds\\PriorityQueue::isEmpty' => ['bool'], 'Ds\\PriorityQueue::jsonSerialize' => ['array'], 'Ds\\PriorityQueue::toArray' => ['array'], 'each' => ['array', '&rw_arr' => 'array'], 'easter_date' => ['int', 'year=' => 'int'], 'easter_days' => ['int', 'year=' => 'int', 'method=' => 'int'], 'echo' => ['void', 'arg1' => 'string', '...args=' => 'string'], 'eio_busy' => ['resource', 'delay' => 'int', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_cancel' => ['void', 'req' => 'resource'], 'eio_chmod' => ['resource', 'path' => 'string', 'mode' => 'int', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_chown' => ['resource', 'path' => 'string', 'uid' => 'int', 'gid=' => 'int', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_close' => ['resource', 'fd' => 'mixed', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_custom' => ['resource', 'execute' => 'callable', 'pri' => 'int', 'callback' => 'callable', 'data=' => 'mixed'], 'eio_dup2' => ['resource', 'fd' => 'mixed', 'fd2' => 'mixed', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_event_loop' => ['bool'], 'eio_fallocate' => ['resource', 'fd' => 'mixed', 'mode' => 'int', 'offset' => 'int', 'length' => 'int', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_fchmod' => ['resource', 'fd' => 'mixed', 'mode' => 'int', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_fchown' => ['resource', 'fd' => 'mixed', 'uid' => 'int', 'gid=' => 'int', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_fdatasync' => ['resource', 'fd' => 'mixed', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_fstat' => ['resource', 'fd' => 'mixed', 'pri' => 'int', 'callback' => 'callable', 'data=' => 'mixed'], 'eio_fstatvfs' => ['resource', 'fd' => 'mixed', 'pri' => 'int', 'callback' => 'callable', 'data=' => 'mixed'], 'eio_fsync' => ['resource', 'fd' => 'mixed', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_ftruncate' => ['resource', 'fd' => 'mixed', 'offset=' => 'int', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_futime' => ['resource', 'fd' => 'mixed', 'atime' => 'float', 'mtime' => 'float', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_get_event_stream' => ['mixed'], 'eio_get_last_error' => ['string', 'req' => 'resource'], 'eio_grp' => ['resource', 'callback' => 'callable', 'data=' => 'string'], 'eio_grp_add' => ['void', 'grp' => 'resource', 'req' => 'resource'], 'eio_grp_cancel' => ['void', 'grp' => 'resource'], 'eio_grp_limit' => ['void', 'grp' => 'resource', 'limit' => 'int'], 'eio_init' => ['void'], 'eio_link' => ['resource', 'path' => 'string', 'new_path' => 'string', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_lstat' => ['resource', 'path' => 'string', 'pri' => 'int', 'callback' => 'callable', 'data=' => 'mixed'], 'eio_mkdir' => ['resource', 'path' => 'string', 'mode' => 'int', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_mknod' => ['resource', 'path' => 'string', 'mode' => 'int', 'dev' => 'int', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_nop' => ['resource', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_npending' => ['int'], 'eio_nready' => ['int'], 'eio_nreqs' => ['int'], 'eio_nthreads' => ['int'], 'eio_open' => ['resource', 'path' => 'string', 'flags' => 'int', 'mode' => 'int', 'pri' => 'int', 'callback' => 'callable', 'data=' => 'mixed'], 'eio_poll' => ['int'], 'eio_read' => ['resource', 'fd' => 'mixed', 'length' => 'int', 'offset' => 'int', 'pri' => 'int', 'callback' => 'callable', 'data=' => 'mixed'], 'eio_readahead' => ['resource', 'fd' => 'mixed', 'offset' => 'int', 'length' => 'int', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_readdir' => ['resource', 'path' => 'string', 'flags' => 'int', 'pri' => 'int', 'callback' => 'callable', 'data=' => 'string'], 'eio_readlink' => ['resource', 'path' => 'string', 'pri' => 'int', 'callback' => 'callable', 'data=' => 'string'], 'eio_realpath' => ['resource', 'path' => 'string', 'pri' => 'int', 'callback' => 'callable', 'data=' => 'string'], 'eio_rename' => ['resource', 'path' => 'string', 'new_path' => 'string', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_rmdir' => ['resource', 'path' => 'string', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_seek' => ['resource', 'fd' => 'mixed', 'offset' => 'int', 'whence' => 'int', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_sendfile' => ['resource', 'out_fd' => 'mixed', 'in_fd' => 'mixed', 'offset' => 'int', 'length' => 'int', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'string'], 'eio_set_max_idle' => ['void', 'nthreads' => 'int'], 'eio_set_max_parallel' => ['void', 'nthreads' => 'int'], 'eio_set_max_poll_reqs' => ['void', 'nreqs' => 'int'], 'eio_set_max_poll_time' => ['void', 'nseconds' => 'float'], 'eio_set_min_parallel' => ['void', 'nthreads' => 'string'], 'eio_stat' => ['resource', 'path' => 'string', 'pri' => 'int', 'callback' => 'callable', 'data=' => 'mixed'], 'eio_statvfs' => ['resource', 'path' => 'string', 'pri' => 'int', 'callback' => 'callable', 'data=' => 'mixed'], 'eio_symlink' => ['resource', 'path' => 'string', 'new_path' => 'string', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_sync' => ['resource', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_sync_file_range' => ['resource', 'fd' => 'mixed', 'offset' => 'int', 'nbytes' => 'int', 'flags' => 'int', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_syncfs' => ['resource', 'fd' => 'mixed', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_truncate' => ['resource', 'path' => 'string', 'offset=' => 'int', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_unlink' => ['resource', 'path' => 'string', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_utime' => ['resource', 'path' => 'string', 'atime' => 'float', 'mtime' => 'float', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'eio_write' => ['resource', 'fd' => 'mixed', 'str' => 'string', 'length=' => 'int', 'offset=' => 'int', 'pri=' => 'int', 'callback=' => 'callable', 'data=' => 'mixed'], 'empty' => ['bool', 'var' => 'mixed'], 'EmptyIterator::current' => ['mixed'], 'EmptyIterator::key' => ['mixed'], 'EmptyIterator::next' => ['void'], 'EmptyIterator::rewind' => ['void'], 'EmptyIterator::valid' => ['bool'], 'enchant_broker_describe' => ['array', 'broker' => 'resource'], 'enchant_broker_dict_exists' => ['bool', 'broker' => 'resource', 'tag' => 'string'], 'enchant_broker_free' => ['bool', 'broker' => 'resource'], 'enchant_broker_free_dict' => ['bool', 'dict' => 'resource'], 'enchant_broker_get_dict_path' => ['string', 'broker' => 'resource', 'dict_type' => 'int'], 'enchant_broker_get_error' => ['string', 'broker' => 'resource'], 'enchant_broker_init' => ['resource'], 'enchant_broker_list_dicts' => ['string', 'broker' => 'resource'], 'enchant_broker_request_dict' => ['resource', 'broker' => 'resource', 'tag' => 'string'], 'enchant_broker_request_pwl_dict' => ['resource', 'broker' => 'resource', 'filename' => 'string'], 'enchant_broker_set_dict_path' => ['bool', 'broker' => 'resource', 'dict_type' => 'int', 'value' => 'string'], 'enchant_broker_set_ordering' => ['bool', 'broker' => 'resource', 'tag' => 'string', 'ordering' => 'string'], 'enchant_dict_add_to_personal' => ['void', 'dict' => 'resource', 'word' => 'string'], 'enchant_dict_add_to_session' => ['void', 'dict' => 'resource', 'word' => 'string'], 'enchant_dict_check' => ['bool', 'dict' => 'resource', 'word' => 'string'], 'enchant_dict_describe' => ['array', 'dict' => 'resource'], 'enchant_dict_get_error' => ['string', 'dict' => 'resource'], 'enchant_dict_is_in_session' => ['bool', 'dict' => 'resource', 'word' => 'string'], 'enchant_dict_quick_check' => ['bool', 'dict' => 'resource', 'word' => 'string', 'suggestions=' => 'array'], 'enchant_dict_store_replacement' => ['void', 'dict' => 'resource', 'mis' => 'string', 'cor' => 'string'], 'enchant_dict_suggest' => ['array', 'dict' => 'resource', 'word' => 'string'], 'end' => ['mixed', '&rw_array_arg' => 'array|object'], 'ereg' => ['int', 'pattern' => 'string', 'string' => 'string', 'regs=' => 'array'], 'ereg_replace' => ['string', 'pattern' => 'string', 'replacement' => 'string', 'string' => 'string'], 'eregi' => ['int', 'pattern' => 'string', 'string' => 'string', 'regs=' => 'array'], 'eregi_replace' => ['string', 'pattern' => 'string', 'replacement' => 'string', 'string' => 'string'], 'Error::__clone' => ['void'], 'Error::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?Throwable|?Error'], 'Error::__toString' => ['string'], 'Error::getCode' => ['int'], 'Error::getFile' => ['string'], 'Error::getLine' => ['int'], 'Error::getMessage' => ['string'], 'Error::getPrevious' => ['Throwable|Error|null'], 'Error::getTrace' => ['array'], 'Error::getTraceAsString' => ['string'], 'error_clear_last' => ['void'], 'error_get_last' => ['?array'], 'error_log' => ['bool', 'message' => 'string', 'message_type=' => 'int', 'destination=' => 'string', 'extra_headers=' => 'string'], 'error_reporting' => ['int', 'new_error_level=' => 'int'], 'ErrorException::__clone' => ['void'], 'ErrorException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'severity=' => 'int', 'filename=' => 'string', 'lineno=' => 'int', 'previous=' => '?Throwable|?ErrorException'], 'ErrorException::__toString' => ['string'], 'ErrorException::getCode' => ['int'], 'ErrorException::getFile' => ['string'], 'ErrorException::getLine' => ['int'], 'ErrorException::getMessage' => ['string'], 'ErrorException::getPrevious' => ['Throwable|ErrorException|null'], 'ErrorException::getSeverity' => ['int'], 'ErrorException::getTrace' => ['array'], 'ErrorException::getTraceAsString' => ['string'], 'escapeshellarg' => ['string', 'arg' => 'string'], 'escapeshellcmd' => ['string', 'command' => 'string'], 'Ev::backend' => ['int'], 'Ev::depth' => ['int'], 'Ev::embeddableBackends' => ['void'], 'Ev::feedSignal' => ['void', 'signum' => 'int'], 'Ev::feedSignalEvent' => ['void', 'signum' => 'int'], 'Ev::iteration' => ['int'], 'Ev::now' => ['float'], 'Ev::nowUpdate' => ['void'], 'Ev::recommendedBackends' => ['void'], 'Ev::resume' => ['void'], 'Ev::run' => ['void', 'flags=' => 'int'], 'Ev::sleep' => ['void', 'seconds' => 'float'], 'Ev::stop' => ['void', 'how=' => 'int'], 'Ev::supportedBackends' => ['void'], 'Ev::suspend' => ['void'], 'Ev::time' => ['float'], 'Ev::verify' => ['void'], 'eval' => ['mixed', 'code_str' => 'string'], 'EvCheck::__construct' => ['void', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvCheck::createStopped' => ['object', 'callback' => 'string', 'data=' => 'string', 'priority=' => 'string'], 'EvChild::__construct' => ['void', 'pid' => 'int', 'trace' => 'bool', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvChild::createStopped' => ['object', 'pid' => 'int', 'trace' => 'bool', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvChild::set' => ['void', 'pid' => 'int', 'trace' => 'bool'], 'EvEmbed::__construct' => ['void', 'other' => 'object', 'callback=' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvEmbed::createStopped' => ['void', 'other' => 'object', 'callback=' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvEmbed::set' => ['void', 'other' => 'object'], 'EvEmbed::sweep' => ['void'], 'Event::__construct' => ['void', 'base' => 'EventBase', 'fd' => 'mixed', 'what' => 'int', 'cb' => 'callable', 'arg=' => 'mixed'], 'Event::add' => ['bool', 'timeout=' => 'float'], 'Event::addSignal' => ['bool', 'timeout=' => 'float'], 'Event::addTimer' => ['bool', 'timeout=' => 'float'], 'Event::del' => ['bool'], 'Event::delSignal' => ['bool'], 'Event::delTimer' => ['bool'], 'Event::free' => ['void'], 'Event::getSupportedMethods' => ['array'], 'Event::pending' => ['bool', 'flags' => 'int'], 'Event::set' => ['bool', 'base' => 'EventBase', 'fd' => 'mixed', 'what=' => 'int', 'cb=' => 'callable', 'arg=' => 'mixed'], 'Event::setPriority' => ['bool', 'priority' => 'int'], 'Event::setTimer' => ['bool', 'base' => 'EventBase', 'cb' => 'callable', 'arg=' => 'mixed'], 'Event::signal' => ['Event', 'base' => 'EventBase', 'signum' => 'int', 'cb' => 'callable', 'arg=' => 'mixed'], 'Event::timer' => ['Event', 'base' => 'EventBase', 'cb' => 'callable', 'arg=' => 'mixed'], 'event_add' => ['bool', 'event' => 'resource', 'timeout=' => 'int'], 'event_base_free' => ['void', 'event_base' => 'resource'], 'event_base_loop' => ['int', 'event_base' => 'resource', 'flags=' => 'int'], 'event_base_loopbreak' => ['bool', 'event_base' => 'resource'], 'event_base_loopexit' => ['bool', 'event_base' => 'resource', 'timeout=' => 'int'], 'event_base_new' => ['resource'], 'event_base_priority_init' => ['bool', 'event_base' => 'resource', 'npriorities' => 'int'], 'event_base_reinit' => ['bool', 'event_base' => 'resource'], 'event_base_set' => ['bool', 'event' => 'resource', 'event_base' => 'resource'], 'event_buffer_base_set' => ['bool', 'bevent' => 'resource', 'event_base' => 'resource'], 'event_buffer_disable' => ['bool', 'bevent' => 'resource', 'events' => 'int'], 'event_buffer_enable' => ['bool', 'bevent' => 'resource', 'events' => 'int'], 'event_buffer_fd_set' => ['void', 'bevent' => 'resource', 'fd' => 'resource'], 'event_buffer_free' => ['void', 'bevent' => 'resource'], 'event_buffer_new' => ['resource', 'stream' => 'resource', 'readcb' => 'mixed', 'writecb' => 'mixed', 'errorcb' => 'mixed', 'arg=' => 'mixed'], 'event_buffer_priority_set' => ['bool', 'bevent' => 'resource', 'priority' => 'int'], 'event_buffer_read' => ['string', 'bevent' => 'resource', 'data_size' => 'int'], 'event_buffer_set_callback' => ['bool', 'event' => 'resource', 'readcb' => 'mixed', 'writecb' => 'mixed', 'errorcb' => 'mixed', 'arg=' => 'mixed'], 'event_buffer_timeout_set' => ['void', 'bevent' => 'resource', 'read_timeout' => 'int', 'write_timeout' => 'int'], 'event_buffer_watermark_set' => ['void', 'bevent' => 'resource', 'events' => 'int', 'lowmark' => 'int', 'highmark' => 'int'], 'event_buffer_write' => ['bool', 'bevent' => 'resource', 'data' => 'string', 'data_size=' => 'int'], 'event_del' => ['bool', 'event' => 'resource'], 'event_free' => ['void', 'event' => 'resource'], 'event_new' => ['resource'], 'event_priority_set' => ['bool', 'event' => 'resource', 'priority' => 'int'], 'event_set' => ['bool', 'event' => 'resource', 'fd' => 'mixed', 'events' => 'int', 'callback' => 'mixed', 'arg=' => 'mixed'], 'event_timer_add' => ['bool', 'event' => 'resource', 'timeout=' => 'int'], 'event_timer_del' => ['bool', 'event' => 'resource'], 'event_timer_new' => ['bool|resource'], 'event_timer_pending' => ['bool', 'event' => 'resource', 'timeout=' => 'int'], 'event_timer_set' => ['bool', 'event' => 'resource', 'callback' => 'callable', 'arg=' => 'mixed'], 'EventBase::__construct' => ['void', 'cfg=' => 'EventConfig'], 'EventBase::dispatch' => ['void'], 'EventBase::exit' => ['bool', 'timeout=' => 'float'], 'EventBase::free' => ['void'], 'EventBase::getFeatures' => ['int'], 'EventBase::getMethod' => ['string', 'cfg=' => 'EventConfig'], 'EventBase::getTimeOfDayCached' => ['float'], 'EventBase::gotExit' => ['bool'], 'EventBase::gotStop' => ['bool'], 'EventBase::loop' => ['bool', 'flags=' => 'int'], 'EventBase::priorityInit' => ['bool', 'n_priorities' => 'int'], 'EventBase::reInit' => ['bool'], 'EventBase::stop' => ['bool'], 'EventBuffer::__construct' => ['void'], 'EventBuffer::add' => ['bool', 'data' => 'string'], 'EventBuffer::addBuffer' => ['bool', 'buf' => 'EventBuffer'], 'EventBuffer::appendFrom' => ['int', 'buf' => 'EventBuffer', 'len' => 'int'], 'EventBuffer::copyout' => ['int', '&w_data' => 'string', 'max_bytes' => 'int'], 'EventBuffer::drain' => ['bool', 'len' => 'int'], 'EventBuffer::enableLocking' => ['void'], 'EventBuffer::expand' => ['bool', 'len' => 'int'], 'EventBuffer::freeze' => ['bool', 'at_front' => 'bool'], 'EventBuffer::lock' => ['void'], 'EventBuffer::prepend' => ['bool', 'data' => 'string'], 'EventBuffer::prependBuffer' => ['bool', 'buf' => 'EventBuffer'], 'EventBuffer::pullup' => ['string', 'size' => 'int'], 'EventBuffer::read' => ['string', 'max_bytes' => 'int'], 'EventBuffer::readFrom' => ['int', 'fd' => 'mixed', 'howmuch' => 'int'], 'EventBuffer::readLine' => ['string', 'eol_style' => 'int'], 'EventBuffer::search' => ['mixed', 'what' => 'string', 'start=' => 'int', 'end=' => 'int'], 'EventBuffer::searchEol' => ['mixed', 'start=' => 'int', 'eol_style=' => 'int'], 'EventBuffer::substr' => ['string', 'start' => 'int', 'length=' => 'int'], 'EventBuffer::unfreeze' => ['bool', 'at_front' => 'bool'], 'EventBuffer::unlock' => ['bool'], 'EventBuffer::write' => ['int', 'fd' => 'mixed', 'howmuch=' => 'int'], 'EventBufferEvent::__construct' => ['void', 'base' => 'EventBase', 'socket=' => 'mixed', 'options=' => 'int', 'readcb=' => 'callable', 'writecb=' => 'callable', 'eventcb=' => 'callable'], 'EventBufferEvent::close' => ['void'], 'EventBufferEvent::connect' => ['bool', 'addr' => 'string'], 'EventBufferEvent::connectHost' => ['bool', 'dns_base' => 'EventDnsBase', 'hostname' => 'string', 'port' => 'int', 'family=' => 'int'], 'EventBufferEvent::createPair' => ['array', 'base' => 'EventBase', 'options=' => 'int'], 'EventBufferEvent::disable' => ['bool', 'events' => 'int'], 'EventBufferEvent::enable' => ['bool', 'events' => 'int'], 'EventBufferEvent::free' => ['void'], 'EventBufferEvent::getDnsErrorString' => ['string'], 'EventBufferEvent::getEnabled' => ['int'], 'EventBufferEvent::getInput' => ['EventBuffer'], 'EventBufferEvent::getOutput' => ['EventBuffer'], 'EventBufferEvent::read' => ['string', 'size' => 'int'], 'EventBufferEvent::readBuffer' => ['bool', 'buf' => 'EventBuffer'], 'EventBufferEvent::setCallbacks' => ['void', 'readcb' => 'callable', 'writecb' => 'callable', 'eventcb' => 'callable', 'arg=' => 'string'], 'EventBufferEvent::setPriority' => ['bool', 'priority' => 'int'], 'EventBufferEvent::setTimeouts' => ['bool', 'timeout_read' => 'float', 'timeout_write' => 'float'], 'EventBufferEvent::setWatermark' => ['void', 'events' => 'int', 'lowmark' => 'int', 'highmark' => 'int'], 'EventBufferEvent::sslError' => ['string'], 'EventBufferEvent::sslFilter' => ['EventBufferEvent', 'base' => 'EventBase', 'underlying' => 'EventBufferEvent', 'ctx' => 'EventSslContext', 'state' => 'int', 'options=' => 'int'], 'EventBufferEvent::sslGetCipherInfo' => ['string'], 'EventBufferEvent::sslGetCipherName' => ['string'], 'EventBufferEvent::sslGetCipherVersion' => ['string'], 'EventBufferEvent::sslGetProtocol' => ['string'], 'EventBufferEvent::sslRenegotiate' => ['void'], 'EventBufferEvent::sslSocket' => ['EventBufferEvent', 'base' => 'EventBase', 'socket' => 'mixed', 'ctx' => 'EventSslContext', 'state' => 'int', 'options=' => 'int'], 'EventBufferEvent::write' => ['bool', 'data' => 'string'], 'EventBufferEvent::writeBuffer' => ['bool', 'buf' => 'EventBuffer'], 'EventConfig::__construct' => ['void'], 'EventConfig::avoidMethod' => ['bool', 'method' => 'string'], 'EventConfig::requireFeatures' => ['bool', 'feature' => 'int'], 'EventConfig::setMaxDispatchInterval' => ['void', 'max_interval' => 'int', 'max_callbacks' => 'int', 'min_priority' => 'int'], 'EventDnsBase::__construct' => ['void', 'base' => 'EventBase', 'initialize' => 'bool'], 'EventDnsBase::addNameserverIp' => ['bool', 'ip' => 'string'], 'EventDnsBase::addSearch' => ['void', 'domain' => 'string'], 'EventDnsBase::clearSearch' => ['void'], 'EventDnsBase::countNameservers' => ['int'], 'EventDnsBase::loadHosts' => ['bool', 'hosts' => 'string'], 'EventDnsBase::parseResolvConf' => ['bool', 'flags' => 'int', 'filename' => 'string'], 'EventDnsBase::setOption' => ['bool', 'option' => 'string', 'value' => 'string'], 'EventDnsBase::setSearchNdots' => ['bool', 'ndots' => 'int'], 'EventHttp::__construct' => ['void', 'base' => 'EventBase', 'ctx=' => 'EventSslContext'], 'EventHttp::accept' => ['bool', 'socket' => 'mixed'], 'EventHttp::addServerAlias' => ['bool', 'alias' => 'string'], 'EventHttp::bind' => ['void', 'address' => 'string', 'port' => 'int'], 'EventHttp::removeServerAlias' => ['bool', 'alias' => 'string'], 'EventHttp::setAllowedMethods' => ['void', 'methods' => 'int'], 'EventHttp::setCallback' => ['void', 'path' => 'string', 'cb' => 'string', 'arg=' => 'string'], 'EventHttp::setDefaultCallback' => ['void', 'cb' => 'string', 'arg=' => 'string'], 'EventHttp::setMaxBodySize' => ['void', 'value' => 'int'], 'EventHttp::setMaxHeadersSize' => ['void', 'value' => 'int'], 'EventHttp::setTimeout' => ['void', 'value' => 'int'], 'EventHttpConnection::__construct' => ['void', 'base' => 'EventBase', 'dns_base' => 'EventDnsBase', 'address' => 'string', 'port' => 'int', 'ctx=' => 'EventSslContext'], 'EventHttpConnection::getBase' => ['EventBase'], 'EventHttpConnection::getPeer' => ['void', '&w_address' => 'string', '&w_port' => 'int'], 'EventHttpConnection::makeRequest' => ['bool', 'req' => 'EventHttpRequest', 'type' => 'int', 'uri' => 'string'], 'EventHttpConnection::setCloseCallback' => ['void', 'callback' => 'callable', 'data=' => 'mixed'], 'EventHttpConnection::setLocalAddress' => ['void', 'address' => 'string'], 'EventHttpConnection::setLocalPort' => ['void', 'port' => 'int'], 'EventHttpConnection::setMaxBodySize' => ['void', 'max_size' => 'string'], 'EventHttpConnection::setMaxHeadersSize' => ['void', 'max_size' => 'string'], 'EventHttpConnection::setRetries' => ['void', 'retries' => 'int'], 'EventHttpConnection::setTimeout' => ['void', 'timeout' => 'int'], 'EventHttpRequest::__construct' => ['void', 'callback' => 'callable', 'data=' => 'mixed'], 'EventHttpRequest::addHeader' => ['bool', 'key' => 'string', 'value' => 'string', 'type' => 'int'], 'EventHttpRequest::cancel' => ['void'], 'EventHttpRequest::clearHeaders' => ['void'], 'EventHttpRequest::closeConnection' => ['void'], 'EventHttpRequest::findHeader' => ['void', 'key' => 'string', 'type' => 'string'], 'EventHttpRequest::free' => ['void'], 'EventHttpRequest::getBufferEvent' => ['EventBufferEvent'], 'EventHttpRequest::getCommand' => ['void'], 'EventHttpRequest::getConnection' => ['EventHttpConnection'], 'EventHttpRequest::getHost' => ['string'], 'EventHttpRequest::getInputBuffer' => ['EventBuffer'], 'EventHttpRequest::getInputHeaders' => ['array'], 'EventHttpRequest::getOutputBuffer' => ['EventBuffer'], 'EventHttpRequest::getOutputHeaders' => ['void'], 'EventHttpRequest::getResponseCode' => ['int'], 'EventHttpRequest::getUri' => ['string'], 'EventHttpRequest::removeHeader' => ['void', 'key' => 'string', 'type' => 'string'], 'EventHttpRequest::sendError' => ['void', 'error' => 'int', 'reason=' => 'string'], 'EventHttpRequest::sendReply' => ['void', 'code' => 'int', 'reason' => 'string', 'buf=' => 'EventBuffer'], 'EventHttpRequest::sendReplyChunk' => ['void', 'buf' => 'EventBuffer'], 'EventHttpRequest::sendReplyEnd' => ['void'], 'EventHttpRequest::sendReplyStart' => ['void', 'code' => 'int', 'reason' => 'string'], 'EventListener::__construct' => ['void', 'base' => 'EventBase', 'cb' => 'callable', 'data' => 'mixed', 'flags' => 'int', 'backlog' => 'int', 'target' => 'mixed'], 'EventListener::disable' => ['bool'], 'EventListener::enable' => ['bool'], 'EventListener::getBase' => ['void'], 'EventListener::getSocketName' => ['bool', '&w_address' => 'string', '&w_port=' => 'mixed'], 'EventListener::setCallback' => ['void', 'cb' => 'callable', 'arg=' => 'mixed'], 'EventListener::setErrorCallback' => ['void', 'cb' => 'string'], 'EventSslContext::__construct' => ['void', 'method' => 'string', 'options' => 'string'], 'EventUtil::__construct' => ['void'], 'EventUtil::getLastSocketErrno' => ['int', 'socket=' => 'mixed'], 'EventUtil::getLastSocketError' => ['string', 'socket=' => 'mixed'], 'EventUtil::getSocketFd' => ['int', 'socket' => 'mixed'], 'EventUtil::getSocketName' => ['bool', 'socket' => 'mixed', '&w_address' => 'string', '&w_port=' => 'mixed'], 'EventUtil::setSocketOption' => ['bool', 'socket' => 'mixed', 'level' => 'int', 'optname' => 'int', 'optval' => 'mixed'], 'EventUtil::sslRandPoll' => ['void'], 'EvFork::__construct' => ['void', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvFork::createStopped' => ['object', 'callback' => 'string', 'data=' => 'string', 'priority=' => 'string'], 'EvIdle::__construct' => ['void', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvIdle::createStopped' => ['object', 'callback' => 'string', 'data=' => 'mixed', 'priority=' => 'int'], 'EvIo::__construct' => ['void', 'fd' => 'mixed', 'events' => 'int', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvIo::createStopped' => ['EvIo', 'fd' => 'mixed', 'events' => 'int', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvIo::set' => ['void', 'fd' => 'mixed', 'events' => 'int'], 'EvLoop::__construct' => ['void', 'flags=' => 'int', 'data=' => 'mixed', 'io_interval=' => 'float', 'timeout_interval=' => 'float'], 'EvLoop::backend' => ['int'], 'EvLoop::check' => ['EvCheck', 'callback' => 'string', 'data=' => 'string', 'priority=' => 'string'], 'EvLoop::child' => ['EvChild', 'pid' => 'string', 'trace' => 'string', 'callback' => 'string', 'data=' => 'string', 'priority=' => 'string'], 'EvLoop::defaultLoop' => ['EvLoop', 'flags=' => 'int', 'data=' => 'mixed', 'io_interval=' => 'float', 'timeout_interval=' => 'float'], 'EvLoop::embed' => ['EvEmbed', 'other' => 'string', 'callback=' => 'string', 'data=' => 'string', 'priority=' => 'string'], 'EvLoop::fork' => ['EvFork', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvLoop::idle' => ['EvIdle', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvLoop::invokePending' => ['void'], 'EvLoop::io' => ['EvIo', 'fd' => 'mixed', 'events' => 'int', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvLoop::loopFork' => ['void'], 'EvLoop::now' => ['float'], 'EvLoop::nowUpdate' => ['void'], 'EvLoop::periodic' => ['EvPeriodic', 'offset' => 'float', 'interval' => 'float', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvLoop::prepare' => ['EvPrepare', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvLoop::resume' => ['void'], 'EvLoop::run' => ['void', 'flags=' => 'int'], 'EvLoop::signal' => ['EvSignal', 'signum' => 'int', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvLoop::stat' => ['EvStat', 'path' => 'string', 'interval' => 'float', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvLoop::stop' => ['void', 'how=' => 'int'], 'EvLoop::suspend' => ['void'], 'EvLoop::timer' => ['EvTimer', 'after' => 'float', 'repeat' => 'float', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvLoop::verify' => ['void'], 'EvPeriodic::__construct' => ['void', 'offset' => 'float', 'interval' => 'string', 'reschedule_cb' => 'callable', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvPeriodic::again' => ['void'], 'EvPeriodic::at' => ['float'], 'EvPeriodic::createStopped' => ['EvPeriodic', 'offset' => 'float', 'interval' => 'float', 'reschedule_cb' => 'callable', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvPeriodic::set' => ['void', 'offset' => 'float', 'interval' => 'float'], 'EvPrepare::__construct' => ['void', 'callback' => 'string', 'data=' => 'string', 'priority=' => 'string'], 'EvPrepare::createStopped' => ['EvPrepare', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvSignal::__construct' => ['void', 'signum' => 'int', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvSignal::createStopped' => ['EvSignal', 'signum' => 'int', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvSignal::set' => ['void', 'signum' => 'int'], 'EvStat::__construct' => ['void', 'path' => 'string', 'interval' => 'float', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvStat::attr' => ['array'], 'EvStat::createStopped' => ['void', 'path' => 'string', 'interval' => 'float', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvStat::prev' => ['void'], 'EvStat::set' => ['void', 'path' => 'string', 'interval' => 'float'], 'EvStat::stat' => ['bool'], 'EvTimer::__construct' => ['void', 'after' => 'float', 'repeat' => 'float', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvTimer::again' => ['void'], 'EvTimer::createStopped' => ['EvTimer', 'after' => 'float', 'repeat' => 'float', 'callback' => 'callable', 'data=' => 'mixed', 'priority=' => 'int'], 'EvTimer::set' => ['void', 'after' => 'float', 'repeat' => 'float'], 'EvWatcher::__construct' => ['void'], 'EvWatcher::clear' => ['int'], 'EvWatcher::feed' => ['void', 'revents' => 'int'], 'EvWatcher::getLoop' => ['EvLoop'], 'EvWatcher::invoke' => ['void', 'revents' => 'int'], 'EvWatcher::keepalive' => ['bool', 'value=' => 'bool'], 'EvWatcher::setCallback' => ['void', 'callback' => 'callable'], 'EvWatcher::start' => ['void'], 'EvWatcher::stop' => ['void'], 'Exception::__clone' => ['void'], 'Exception::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?Throwable|?Exception'], 'Exception::__toString' => ['string'], 'Exception::getCode' => ['mixed'], 'Exception::getFile' => ['string'], 'Exception::getLine' => ['int'], 'Exception::getMessage' => ['string'], 'Exception::getPrevious' => ['?Throwable|?Exception'], 'Exception::getTrace' => ['array'], 'Exception::getTraceAsString' => ['string'], 'exec' => ['string', 'command' => 'string', '&w_output=' => 'array', '&w_return_value=' => 'int'], 'exif_imagetype' => ['int|false', 'imagefile' => 'string'], 'exif_read_data' => ['array|false', 'filename' => 'string', 'sections_needed=' => 'string', 'sub_arrays=' => 'bool', 'read_thumbnail=' => 'bool'], 'exif_tagname' => ['string', 'index' => 'int'], 'exif_thumbnail' => ['string', 'filename' => 'string', '&w_width=' => 'int', '&w_height=' => 'int', '&w_imagetype=' => 'int'], 'exit' => ['', 'status' => 'string|int'], 'exp' => ['float', 'number' => 'float'], 'expect_expectl' => ['int', 'expect' => 'resource', 'cases' => 'array', 'match=' => 'array'], 'expect_popen' => ['resource', 'command' => 'string'], 'explode' => ['array<int,string>|false', 'separator' => 'string', 'str' => 'string', 'limit=' => 'int'], 'expm1' => ['float', 'number' => 'float'], 'extension_loaded' => ['bool', 'extension_name' => 'string'], 'extract' => ['int', '&rw_var_array' => 'array', 'extract_type=' => 'int', 'prefix=' => 'string|null'], 'ezmlm_hash' => ['int', 'addr' => 'string'], 'fam_cancel_monitor' => ['bool', 'fam' => 'resource', 'fam_monitor' => 'resource'], 'fam_close' => ['void', 'fam' => 'resource'], 'fam_monitor_collection' => ['resource', 'fam' => 'resource', 'dirname' => 'string', 'depth' => 'int', 'mask' => 'string'], 'fam_monitor_directory' => ['resource', 'fam' => 'resource', 'dirname' => 'string'], 'fam_monitor_file' => ['resource', 'fam' => 'resource', 'filename' => 'string'], 'fam_next_event' => ['array', 'fam' => 'resource'], 'fam_open' => ['resource', 'appname=' => 'string'], 'fam_pending' => ['int', 'fam' => 'resource'], 'fam_resume_monitor' => ['bool', 'fam' => 'resource', 'fam_monitor' => 'resource'], 'fam_suspend_monitor' => ['bool', 'fam' => 'resource', 'fam_monitor' => 'resource'], 'fann_cascadetrain_on_data' => ['bool', 'ann' => 'resource', 'data' => 'resource', 'max_neurons' => 'int', 'neurons_between_reports' => 'int', 'desired_error' => 'float'], 'fann_cascadetrain_on_file' => ['bool', 'ann' => 'resource', 'filename' => 'string', 'max_neurons' => 'int', 'neurons_between_reports' => 'int', 'desired_error' => 'float'], 'fann_clear_scaling_params' => ['bool', 'ann' => 'resource'], 'fann_copy' => ['resource', 'ann' => 'resource'], 'fann_create_from_file' => ['resource', 'configuration_file' => 'string'], 'fann_create_shortcut' => ['reference', 'num_layers' => 'int', 'num_neurons1' => 'int', 'num_neurons2' => 'int', '...args=' => 'int'], 'fann_create_shortcut_array' => ['resource', 'num_layers' => 'int', 'layers' => 'array'], 'fann_create_sparse' => ['resource|false', 'connection_rate' => 'float', 'num_layers' => 'int', 'num_neurons1' => 'int', 'num_neurons2' => 'int', '...args=' => 'int'], 'fann_create_sparse_array' => ['resource|false', 'connection_rate' => 'float', 'num_layers' => 'int', 'layers' => 'array'], 'fann_create_standard' => ['resource', 'num_layers' => 'int', 'num_neurons1' => 'int', 'num_neurons2' => 'int', '...args=' => 'int'], 'fann_create_standard_array' => ['resource', 'num_layers' => 'int', 'layers' => 'array'], 'fann_create_train' => ['resource', 'num_data' => 'int', 'num_input' => 'int', 'num_output' => 'int'], 'fann_create_train_from_callback' => ['resource', 'num_data' => 'int', 'num_input' => 'int', 'num_output' => 'int', 'user_function' => 'callable'], 'fann_descale_input' => ['bool', 'ann' => 'resource', 'input_vector' => 'array'], 'fann_descale_output' => ['bool', 'ann' => 'resource', 'output_vector' => 'array'], 'fann_descale_train' => ['bool', 'ann' => 'resource', 'train_data' => 'resource'], 'fann_destroy' => ['bool', 'ann' => 'resource'], 'fann_destroy_train' => ['bool', 'train_data' => 'resource'], 'fann_duplicate_train_data' => ['resource', 'data' => 'resource'], 'fann_get_activation_function' => ['int', 'ann' => 'resource', 'layer' => 'int', 'neuron' => 'int'], 'fann_get_activation_steepness' => ['float', 'ann' => 'resource', 'layer' => 'int', 'neuron' => 'int'], 'fann_get_bias_array' => ['array', 'ann' => 'resource'], 'fann_get_bit_fail' => ['int', 'ann' => 'resource'], 'fann_get_bit_fail_limit' => ['float', 'ann' => 'resource'], 'fann_get_cascade_activation_functions' => ['array', 'ann' => 'resource'], 'fann_get_cascade_activation_functions_count' => ['int', 'ann' => 'resource'], 'fann_get_cascade_activation_steepnesses' => ['array', 'ann' => 'resource'], 'fann_get_cascade_activation_steepnesses_count' => ['int', 'ann' => 'resource'], 'fann_get_cascade_candidate_change_fraction' => ['float', 'ann' => 'resource'], 'fann_get_cascade_candidate_limit' => ['float', 'ann' => 'resource'], 'fann_get_cascade_candidate_stagnation_epochs' => ['float', 'ann' => 'resource'], 'fann_get_cascade_max_cand_epochs' => ['int', 'ann' => 'resource'], 'fann_get_cascade_max_out_epochs' => ['int', 'ann' => 'resource'], 'fann_get_cascade_min_cand_epochs' => ['int', 'ann' => 'resource'], 'fann_get_cascade_min_out_epochs' => ['int', 'ann' => 'resource'], 'fann_get_cascade_num_candidate_groups' => ['int', 'ann' => 'resource'], 'fann_get_cascade_num_candidates' => ['int', 'ann' => 'resource'], 'fann_get_cascade_output_change_fraction' => ['float', 'ann' => 'resource'], 'fann_get_cascade_output_stagnation_epochs' => ['int', 'ann' => 'resource'], 'fann_get_cascade_weight_multiplier' => ['float', 'ann' => 'resource'], 'fann_get_connection_array' => ['array', 'ann' => 'resource'], 'fann_get_connection_rate' => ['float', 'ann' => 'resource'], 'fann_get_errno' => ['int', 'errdat' => 'resource'], 'fann_get_errstr' => ['string', 'errdat' => 'resource'], 'fann_get_layer_array' => ['array', 'ann' => 'resource'], 'fann_get_learning_momentum' => ['float', 'ann' => 'resource'], 'fann_get_learning_rate' => ['float', 'ann' => 'resource'], 'fann_get_MSE' => ['float', 'ann' => 'resource'], 'fann_get_network_type' => ['int', 'ann' => 'resource'], 'fann_get_num_input' => ['int', 'ann' => 'resource'], 'fann_get_num_layers' => ['int', 'ann' => 'resource'], 'fann_get_num_output' => ['int', 'ann' => 'resource'], 'fann_get_quickprop_decay' => ['float', 'ann' => 'resource'], 'fann_get_quickprop_mu' => ['float', 'ann' => 'resource'], 'fann_get_rprop_decrease_factor' => ['float', 'ann' => 'resource'], 'fann_get_rprop_delta_max' => ['float', 'ann' => 'resource'], 'fann_get_rprop_delta_min' => ['float', 'ann' => 'resource'], 'fann_get_rprop_delta_zero' => ['float|false', 'ann' => 'resource'], 'fann_get_rprop_increase_factor' => ['float', 'ann' => 'resource'], 'fann_get_sarprop_step_error_shift' => ['float', 'ann' => 'resource'], 'fann_get_sarprop_step_error_threshold_factor' => ['float', 'ann' => 'resource'], 'fann_get_sarprop_temperature' => ['float', 'ann' => 'resource'], 'fann_get_sarprop_weight_decay_shift' => ['float', 'ann' => 'resource'], 'fann_get_total_connections' => ['int', 'ann' => 'resource'], 'fann_get_total_neurons' => ['int', 'ann' => 'resource'], 'fann_get_train_error_function' => ['int', 'ann' => 'resource'], 'fann_get_train_stop_function' => ['int', 'ann' => 'resource'], 'fann_get_training_algorithm' => ['int', 'ann' => 'resource'], 'fann_init_weights' => ['bool', 'ann' => 'resource', 'train_data' => 'resource'], 'fann_length_train_data' => ['int', 'data' => 'resource'], 'fann_merge_train_data' => ['resource', 'data1' => 'resource', 'data2' => 'resource'], 'fann_num_input_train_data' => ['int', 'data' => 'resource'], 'fann_num_output_train_data' => ['int', 'data' => 'resource'], 'fann_print_error' => ['void', 'errdat' => 'string'], 'fann_randomize_weights' => ['bool', 'ann' => 'resource', 'min_weight' => 'float', 'max_weight' => 'float'], 'fann_read_train_from_file' => ['resource', 'filename' => 'string'], 'fann_reset_errno' => ['void', 'errdat' => 'resource'], 'fann_reset_errstr' => ['void', 'errdat' => 'resource'], 'fann_reset_MSE' => ['bool', 'ann' => 'string'], 'fann_run' => ['array', 'ann' => 'resource', 'input' => 'array'], 'fann_save' => ['bool', 'ann' => 'resource', 'configuration_file' => 'string'], 'fann_save_train' => ['bool', 'data' => 'resource', 'file_name' => 'string'], 'fann_scale_input' => ['bool', 'ann' => 'resource', 'input_vector' => 'array'], 'fann_scale_input_train_data' => ['bool', 'train_data' => 'resource', 'new_min' => 'float', 'new_max' => 'float'], 'fann_scale_output' => ['bool', 'ann' => 'resource', 'output_vector' => 'array'], 'fann_scale_output_train_data' => ['bool', 'train_data' => 'resource', 'new_min' => 'float', 'new_max' => 'float'], 'fann_scale_train' => ['bool', 'ann' => 'resource', 'train_data' => 'resource'], 'fann_scale_train_data' => ['bool', 'train_data' => 'resource', 'new_min' => 'float', 'new_max' => 'float'], 'fann_set_activation_function' => ['bool', 'ann' => 'resource', 'activation_function' => 'int', 'layer' => 'int', 'neuron' => 'int'], 'fann_set_activation_function_hidden' => ['bool', 'ann' => 'resource', 'activation_function' => 'int'], 'fann_set_activation_function_layer' => ['bool', 'ann' => 'resource', 'activation_function' => 'int', 'layer' => 'int'], 'fann_set_activation_function_output' => ['bool', 'ann' => 'resource', 'activation_function' => 'int'], 'fann_set_activation_steepness' => ['bool', 'ann' => 'resource', 'activation_steepness' => 'float', 'layer' => 'int', 'neuron' => 'int'], 'fann_set_activation_steepness_hidden' => ['bool', 'ann' => 'resource', 'activation_steepness' => 'float'], 'fann_set_activation_steepness_layer' => ['bool', 'ann' => 'resource', 'activation_steepness' => 'float', 'layer' => 'int'], 'fann_set_activation_steepness_output' => ['bool', 'ann' => 'resource', 'activation_steepness' => 'float'], 'fann_set_bit_fail_limit' => ['bool', 'ann' => 'resource', 'bit_fail_limit' => 'float'], 'fann_set_callback' => ['bool', 'ann' => 'resource', 'callback' => 'callable'], 'fann_set_cascade_activation_functions' => ['bool', 'ann' => 'resource', 'cascade_activation_functions' => 'array'], 'fann_set_cascade_activation_steepnesses' => ['bool', 'ann' => 'resource', 'cascade_activation_steepnesses_count' => 'array'], 'fann_set_cascade_candidate_change_fraction' => ['bool', 'ann' => 'resource', 'cascade_candidate_change_fraction' => 'float'], 'fann_set_cascade_candidate_limit' => ['bool', 'ann' => 'resource', 'cascade_candidate_limit' => 'float'], 'fann_set_cascade_candidate_stagnation_epochs' => ['bool', 'ann' => 'resource', 'cascade_candidate_stagnation_epochs' => 'int'], 'fann_set_cascade_max_cand_epochs' => ['bool', 'ann' => 'resource', 'cascade_max_cand_epochs' => 'int'], 'fann_set_cascade_max_out_epochs' => ['bool', 'ann' => 'resource', 'cascade_max_out_epochs' => 'int'], 'fann_set_cascade_min_cand_epochs' => ['bool', 'ann' => 'resource', 'cascade_min_cand_epochs' => 'int'], 'fann_set_cascade_min_out_epochs' => ['bool', 'ann' => 'resource', 'cascade_min_out_epochs' => 'int'], 'fann_set_cascade_num_candidate_groups' => ['bool', 'ann' => 'resource', 'cascade_num_candidate_groups' => 'int'], 'fann_set_cascade_output_change_fraction' => ['bool', 'ann' => 'resource', 'cascade_output_change_fraction' => 'float'], 'fann_set_cascade_output_stagnation_epochs' => ['bool', 'ann' => 'resource', 'cascade_output_stagnation_epochs' => 'int'], 'fann_set_cascade_weight_multiplier' => ['bool', 'ann' => 'resource', 'cascade_weight_multiplier' => 'float'], 'fann_set_error_log' => ['void', 'errdat' => 'resource', 'log_file' => 'string'], 'fann_set_input_scaling_params' => ['bool', 'ann' => 'resource', 'train_data' => 'resource', 'new_input_min' => 'float', 'new_input_max' => 'float'], 'fann_set_learning_momentum' => ['bool', 'ann' => 'resource', 'learning_momentum' => 'float'], 'fann_set_learning_rate' => ['bool', 'ann' => 'resource', 'learning_rate' => 'float'], 'fann_set_output_scaling_params' => ['bool', 'ann' => 'resource', 'train_data' => 'resource', 'new_output_min' => 'float', 'new_output_max' => 'float'], 'fann_set_quickprop_decay' => ['bool', 'ann' => 'resource', 'quickprop_decay' => 'float'], 'fann_set_quickprop_mu' => ['bool', 'ann' => 'resource', 'quickprop_mu' => 'float'], 'fann_set_rprop_decrease_factor' => ['bool', 'ann' => 'resource', 'rprop_decrease_factor' => 'float'], 'fann_set_rprop_delta_max' => ['bool', 'ann' => 'resource', 'rprop_delta_max' => 'float'], 'fann_set_rprop_delta_min' => ['bool', 'ann' => 'resource', 'rprop_delta_min' => 'float'], 'fann_set_rprop_delta_zero' => ['bool', 'ann' => 'resource', 'rprop_delta_zero' => 'float'], 'fann_set_rprop_increase_factor' => ['bool', 'ann' => 'resource', 'rprop_increase_factor' => 'float'], 'fann_set_sarprop_step_error_shift' => ['bool', 'ann' => 'resource', 'sarprop_step_error_shift' => 'float'], 'fann_set_sarprop_step_error_threshold_factor' => ['bool', 'ann' => 'resource', 'sarprop_step_error_threshold_factor' => 'float'], 'fann_set_sarprop_temperature' => ['bool', 'ann' => 'resource', 'sarprop_temperature' => 'float'], 'fann_set_sarprop_weight_decay_shift' => ['bool', 'ann' => 'resource', 'sarprop_weight_decay_shift' => 'float'], 'fann_set_scaling_params' => ['bool', 'ann' => 'resource', 'train_data' => 'resource', 'new_input_min' => 'float', 'new_input_max' => 'float', 'new_output_min' => 'float', 'new_output_max' => 'float'], 'fann_set_train_error_function' => ['bool', 'ann' => 'resource', 'error_function' => 'int'], 'fann_set_train_stop_function' => ['bool', 'ann' => 'resource', 'stop_function' => 'int'], 'fann_set_training_algorithm' => ['bool', 'ann' => 'resource', 'training_algorithm' => 'int'], 'fann_set_weight' => ['bool', 'ann' => 'resource', 'from_neuron' => 'int', 'to_neuron' => 'int', 'weight' => 'float'], 'fann_set_weight_array' => ['bool', 'ann' => 'resource', 'connections' => 'array'], 'fann_shuffle_train_data' => ['bool', 'train_data' => 'resource'], 'fann_subset_train_data' => ['resource', 'data' => 'resource', 'pos' => 'int', 'length' => 'int'], 'fann_test' => ['bool', 'ann' => 'resource', 'input' => 'array', 'desired_output' => 'array'], 'fann_test_data' => ['float', 'ann' => 'resource', 'data' => 'resource'], 'fann_train' => ['bool', 'ann' => 'resource', 'input' => 'array', 'desired_output' => 'array'], 'fann_train_epoch' => ['float', 'ann' => 'resource', 'data' => 'resource'], 'fann_train_on_data' => ['bool', 'ann' => 'resource', 'data' => 'resource', 'max_epochs' => 'int', 'epochs_between_reports' => 'int', 'desired_error' => 'float'], 'fann_train_on_file' => ['bool', 'ann' => 'resource', 'filename' => 'string', 'max_epochs' => 'int', 'epochs_between_reports' => 'int', 'desired_error' => 'float'], 'FANNConnection::__construct' => ['void', 'from_neuron' => 'int', 'to_neuron' => 'int', 'weight' => 'float'], 'FANNConnection::getFromNeuron' => ['int'], 'FANNConnection::getToNeuron' => ['int'], 'FANNConnection::getWeight' => ['void'], 'FANNConnection::setWeight' => ['bool', 'weight' => 'float'], 'fastcgi_finish_request' => ['bool'], 'fbsql_affected_rows' => ['int', 'link_identifier=' => '?resource'], 'fbsql_autocommit' => ['bool', 'link_identifier' => 'resource', 'onoff=' => 'bool'], 'fbsql_blob_size' => ['int', 'blob_handle' => 'string', 'link_identifier=' => '?resource'], 'fbsql_change_user' => ['bool', 'user' => 'string', 'password' => 'string', 'database=' => 'string', 'link_identifier=' => '?resource'], 'fbsql_clob_size' => ['int', 'clob_handle' => 'string', 'link_identifier=' => '?resource'], 'fbsql_close' => ['bool', 'link_identifier=' => '?resource'], 'fbsql_commit' => ['bool', 'link_identifier=' => '?resource'], 'fbsql_connect' => ['resource', 'hostname=' => 'string', 'username=' => 'string', 'password=' => 'string'], 'fbsql_create_blob' => ['string', 'blob_data' => 'string', 'link_identifier=' => '?resource'], 'fbsql_create_clob' => ['string', 'clob_data' => 'string', 'link_identifier=' => '?resource'], 'fbsql_create_db' => ['bool', 'database_name' => 'string', 'link_identifier=' => '?resource', 'database_options=' => 'string'], 'fbsql_data_seek' => ['bool', 'result' => 'resource', 'row_number' => 'int'], 'fbsql_database' => ['string', 'link_identifier' => 'resource', 'database=' => 'string'], 'fbsql_database_password' => ['string', 'link_identifier' => 'resource', 'database_password=' => 'string'], 'fbsql_db_query' => ['resource', 'database' => 'string', 'query' => 'string', 'link_identifier=' => '?resource'], 'fbsql_db_status' => ['int', 'database_name' => 'string', 'link_identifier=' => '?resource'], 'fbsql_drop_db' => ['bool', 'database_name' => 'string', 'link_identifier=' => '?resource'], 'fbsql_errno' => ['int', 'link_identifier=' => '?resource'], 'fbsql_error' => ['string', 'link_identifier=' => '?resource'], 'fbsql_fetch_array' => ['array', 'result' => 'resource', 'result_type=' => 'int'], 'fbsql_fetch_assoc' => ['array', 'result' => 'resource'], 'fbsql_fetch_field' => ['object', 'result' => 'resource', 'field_offset=' => 'int'], 'fbsql_fetch_lengths' => ['array', 'result' => 'resource'], 'fbsql_fetch_object' => ['object', 'result' => 'resource'], 'fbsql_fetch_row' => ['array', 'result' => 'resource'], 'fbsql_field_flags' => ['string', 'result' => 'resource', 'field_offset=' => 'int'], 'fbsql_field_len' => ['int', 'result' => 'resource', 'field_offset=' => 'int'], 'fbsql_field_name' => ['string', 'result' => 'resource', 'field_index=' => 'int'], 'fbsql_field_seek' => ['bool', 'result' => 'resource', 'field_offset=' => 'int'], 'fbsql_field_table' => ['string', 'result' => 'resource', 'field_offset=' => 'int'], 'fbsql_field_type' => ['string', 'result' => 'resource', 'field_offset=' => 'int'], 'fbsql_free_result' => ['bool', 'result' => 'resource'], 'fbsql_get_autostart_info' => ['array', 'link_identifier=' => '?resource'], 'fbsql_hostname' => ['string', 'link_identifier' => 'resource', 'host_name=' => 'string'], 'fbsql_insert_id' => ['int', 'link_identifier=' => '?resource'], 'fbsql_list_dbs' => ['resource', 'link_identifier=' => '?resource'], 'fbsql_list_fields' => ['resource', 'database_name' => 'string', 'table_name' => 'string', 'link_identifier=' => '?resource'], 'fbsql_list_tables' => ['resource', 'database' => 'string', 'link_identifier=' => '?resource'], 'fbsql_next_result' => ['bool', 'result' => 'resource'], 'fbsql_num_fields' => ['int', 'result' => 'resource'], 'fbsql_num_rows' => ['int', 'result' => 'resource'], 'fbsql_password' => ['string', 'link_identifier' => 'resource', 'password=' => 'string'], 'fbsql_pconnect' => ['resource', 'hostname=' => 'string', 'username=' => 'string', 'password=' => 'string'], 'fbsql_query' => ['resource', 'query' => 'string', 'link_identifier=' => '?resource', 'batch_size=' => 'int'], 'fbsql_read_blob' => ['string', 'blob_handle' => 'string', 'link_identifier=' => '?resource'], 'fbsql_read_clob' => ['string', 'clob_handle' => 'string', 'link_identifier=' => '?resource'], 'fbsql_result' => ['mixed', 'result' => 'resource', 'row=' => 'int', 'field=' => 'mixed'], 'fbsql_rollback' => ['bool', 'link_identifier=' => '?resource'], 'fbsql_rows_fetched' => ['int', 'result' => 'resource'], 'fbsql_select_db' => ['bool', 'database_name=' => 'string', 'link_identifier=' => '?resource'], 'fbsql_set_characterset' => ['void', 'link_identifier' => 'resource', 'characterset' => 'int', 'in_out_both=' => 'int'], 'fbsql_set_lob_mode' => ['bool', 'result' => 'resource', 'lob_mode' => 'int'], 'fbsql_set_password' => ['bool', 'link_identifier' => 'resource', 'user' => 'string', 'password' => 'string', 'old_password' => 'string'], 'fbsql_set_transaction' => ['void', 'link_identifier' => 'resource', 'locking' => 'int', 'isolation' => 'int'], 'fbsql_start_db' => ['bool', 'database_name' => 'string', 'link_identifier=' => '?resource', 'database_options=' => 'string'], 'fbsql_stop_db' => ['bool', 'database_name' => 'string', 'link_identifier=' => '?resource'], 'fbsql_table_name' => ['string', 'result' => 'resource', 'index' => 'int'], 'fbsql_username' => ['string', 'link_identifier' => 'resource', 'username=' => 'string'], 'fbsql_warnings' => ['bool', 'onoff=' => 'bool'], 'fclose' => ['bool', 'fp' => 'resource'], 'fdf_add_doc_javascript' => ['bool', 'fdf_document' => 'resource', 'script_name' => 'string', 'script_code' => 'string'], 'fdf_add_template' => ['bool', 'fdf_document' => 'resource', 'newpage' => 'int', 'filename' => 'string', 'template' => 'string', 'rename' => 'int'], 'fdf_close' => ['void', 'fdf_document' => 'resource'], 'fdf_create' => ['resource'], 'fdf_enum_values' => ['bool', 'fdf_document' => 'resource', 'function' => 'callable', 'userdata=' => 'mixed'], 'fdf_errno' => ['int'], 'fdf_error' => ['string', 'error_code=' => 'int'], 'fdf_get_ap' => ['bool', 'fdf_document' => 'resource', 'field' => 'string', 'face' => 'int', 'filename' => 'string'], 'fdf_get_attachment' => ['array', 'fdf_document' => 'resource', 'fieldname' => 'string', 'savepath' => 'string'], 'fdf_get_encoding' => ['string', 'fdf_document' => 'resource'], 'fdf_get_file' => ['string', 'fdf_document' => 'resource'], 'fdf_get_flags' => ['int', 'fdf_document' => 'resource', 'fieldname' => 'string', 'whichflags' => 'int'], 'fdf_get_opt' => ['mixed', 'fdf_document' => 'resource', 'fieldname' => 'string', 'element=' => 'int'], 'fdf_get_status' => ['string', 'fdf_document' => 'resource'], 'fdf_get_value' => ['mixed', 'fdf_document' => 'resource', 'fieldname' => 'string', 'which=' => 'int'], 'fdf_get_version' => ['string', 'fdf_document=' => 'resource'], 'fdf_header' => ['void'], 'fdf_next_field_name' => ['string', 'fdf_document' => 'resource', 'fieldname=' => 'string'], 'fdf_open' => ['resource', 'filename' => 'string'], 'fdf_open_string' => ['resource', 'fdf_data' => 'string'], 'fdf_remove_item' => ['bool', 'fdf_document' => 'resource', 'fieldname' => 'string', 'item' => 'int'], 'fdf_save' => ['bool', 'fdf_document' => 'resource', 'filename=' => 'string'], 'fdf_save_string' => ['string', 'fdf_document' => 'resource'], 'fdf_set_ap' => ['bool', 'fdf_document' => 'resource', 'field_name' => 'string', 'face' => 'int', 'filename' => 'string', 'page_number' => 'int'], 'fdf_set_encoding' => ['bool', 'fdf_document' => 'resource', 'encoding' => 'string'], 'fdf_set_file' => ['bool', 'fdf_document' => 'resource', 'url' => 'string', 'target_frame=' => 'string'], 'fdf_set_flags' => ['bool', 'fdf_document' => 'resource', 'fieldname' => 'string', 'whichflags' => 'int', 'newflags' => 'int'], 'fdf_set_javascript_action' => ['bool', 'fdf_document' => 'resource', 'fieldname' => 'string', 'trigger' => 'int', 'script' => 'string'], 'fdf_set_on_import_javascript' => ['bool', 'fdf_document' => 'resource', 'script' => 'string', 'before_data_import' => 'bool'], 'fdf_set_opt' => ['bool', 'fdf_document' => 'resource', 'fieldname' => 'string', 'element' => 'int', 'str1' => 'string', 'str2' => 'string'], 'fdf_set_status' => ['bool', 'fdf_document' => 'resource', 'status' => 'string'], 'fdf_set_submit_form_action' => ['bool', 'fdf_document' => 'resource', 'fieldname' => 'string', 'trigger' => 'int', 'script' => 'string', 'flags' => 'int'], 'fdf_set_target_frame' => ['bool', 'fdf_document' => 'resource', 'frame_name' => 'string'], 'fdf_set_value' => ['bool', 'fdf_document' => 'resource', 'fieldname' => 'string', 'value' => 'mixed', 'isname=' => 'int'], 'fdf_set_version' => ['bool', 'fdf_document' => 'resource', 'version' => 'string'], 'feof' => ['bool', 'fp' => 'resource'], 'fflush' => ['bool', 'fp' => 'resource'], 'ffmpeg_animated_gif::__construct' => ['void', 'output_file_path' => 'string', 'width' => 'int', 'height' => 'int', 'frame_rate' => 'int', 'loop_count=' => 'int'], 'ffmpeg_animated_gif::addFrame' => ['', 'frame_to_add' => 'ffmpeg_frame'], 'ffmpeg_frame::__construct' => ['void', 'gd_image' => 'resource'], 'ffmpeg_frame::crop' => ['', 'crop_top' => 'int', 'crop_bottom=' => 'int', 'crop_left=' => 'int', 'crop_right=' => 'int'], 'ffmpeg_frame::getHeight' => ['int'], 'ffmpeg_frame::getPresentationTimestamp' => ['int'], 'ffmpeg_frame::getPTS' => ['int'], 'ffmpeg_frame::getWidth' => ['int'], 'ffmpeg_frame::resize' => ['', 'width' => 'int', 'height' => 'int', 'crop_top=' => 'int', 'crop_bottom=' => 'int', 'crop_left=' => 'int', 'crop_right=' => 'int'], 'ffmpeg_frame::toGDImage' => ['resource'], 'ffmpeg_movie::__construct' => ['void', 'path_to_media' => 'string', 'persistent' => 'bool'], 'ffmpeg_movie::getArtist' => ['string'], 'ffmpeg_movie::getAudioBitRate' => ['int'], 'ffmpeg_movie::getAudioChannels' => ['int'], 'ffmpeg_movie::getAudioCodec' => ['string'], 'ffmpeg_movie::getAudioSampleRate' => ['int'], 'ffmpeg_movie::getAuthor' => ['string'], 'ffmpeg_movie::getBitRate' => ['int'], 'ffmpeg_movie::getComment' => ['string'], 'ffmpeg_movie::getCopyright' => ['string'], 'ffmpeg_movie::getDuration' => ['int'], 'ffmpeg_movie::getFilename' => ['string'], 'ffmpeg_movie::getFrame' => ['ffmpeg_frame', 'framenumber' => 'int'], 'ffmpeg_movie::getFrameCount' => ['int'], 'ffmpeg_movie::getFrameHeight' => ['int'], 'ffmpeg_movie::getFrameNumber' => ['int'], 'ffmpeg_movie::getFrameRate' => ['int'], 'ffmpeg_movie::getFrameWidth' => ['int'], 'ffmpeg_movie::getGenre' => ['string'], 'ffmpeg_movie::getNextKeyFrame' => ['ffmpeg_frame'], 'ffmpeg_movie::getPixelFormat' => [''], 'ffmpeg_movie::getTitle' => ['string'], 'ffmpeg_movie::getTrackNumber' => ['int|string'], 'ffmpeg_movie::getVideoBitRate' => ['int'], 'ffmpeg_movie::getVideoCodec' => ['string'], 'ffmpeg_movie::getYear' => ['int|string'], 'ffmpeg_movie::hasAudio' => ['bool'], 'ffmpeg_movie::hasVideo' => ['bool'], 'fgetc' => ['string|false', 'fp' => 'resource'], 'fgetcsv' => ['?array|?false', 'fp' => 'resource', 'length=' => 'int', 'delimiter=' => 'string', 'enclosure=' => 'string', 'escape=' => 'string'], 'fgets' => ['string|false', 'fp' => 'resource', 'length=' => 'int'], 'fgetss' => ['string|false', 'fp' => 'resource', 'length=' => 'int', 'allowable_tags=' => 'string'], 'file' => ['array<int,string>|false', 'filename' => 'string', 'flags=' => 'int', 'context=' => 'resource'], 'file_exists' => ['bool', 'filename' => 'string'], 'file_get_contents' => ['string|false', 'filename' => 'string', 'use_include_path=' => 'bool', 'context=' => '?resource', 'offset=' => 'int', 'maxlen=' => 'int'], 'file_put_contents' => ['int|false', 'file' => 'string', 'data' => 'mixed', 'flags=' => 'int', 'context=' => 'resource'], 'fileatime' => ['int|false', 'filename' => 'string'], 'filectime' => ['int|false', 'filename' => 'string'], 'filegroup' => ['int|false', 'filename' => 'string'], 'fileinode' => ['int|false', 'filename' => 'string'], 'filemtime' => ['int|false', 'filename' => 'string'], 'fileowner' => ['int|false', 'filename' => 'string'], 'fileperms' => ['int|false', 'filename' => 'string'], 'filepro' => ['bool', 'directory' => 'string'], 'filepro_fieldcount' => ['int'], 'filepro_fieldname' => ['string', 'field_number' => 'int'], 'filepro_fieldtype' => ['string', 'field_number' => 'int'], 'filepro_fieldwidth' => ['int', 'field_number' => 'int'], 'filepro_retrieve' => ['string', 'row_number' => 'int', 'field_number' => 'int'], 'filepro_rowcount' => ['int'], 'filesize' => ['int|false', 'filename' => 'string'], 'FilesystemIterator::__construct' => ['void', 'path' => 'string', 'flags=' => 'int'], 'FilesystemIterator::current' => ['string|SplFileInfo'], 'FilesystemIterator::getFlags' => ['int'], 'FilesystemIterator::key' => ['string'], 'FilesystemIterator::next' => ['void'], 'FilesystemIterator::rewind' => ['void'], 'FilesystemIterator::setFlags' => ['void', 'flags=' => 'int'], 'filetype' => ['string|false', 'filename' => 'string'], 'filter_has_var' => ['bool', 'type' => 'int', 'variable_name' => 'string'], 'filter_id' => ['int|false', 'filtername' => 'string'], 'filter_input' => ['mixed', 'type' => 'int', 'variable_name' => 'string', 'filter=' => 'int', 'options=' => 'array|int'], 'filter_input_array' => ['mixed', 'type' => 'int', 'definition=' => 'int|array', 'add_empty=' => 'bool'], 'filter_list' => ['array'], 'filter_var' => ['mixed', 'variable' => 'mixed', 'filter=' => 'int', 'options=' => 'mixed'], 'filter_var_array' => ['mixed', 'data' => 'array', 'definition=' => 'mixed', 'add_empty=' => 'bool'], 'FilterIterator::__construct' => ['void', 'it' => 'iterator'], 'FilterIterator::accept' => ['bool'], 'FilterIterator::current' => ['mixed'], 'FilterIterator::getInnerIterator' => ['Iterator'], 'FilterIterator::key' => ['mixed'], 'FilterIterator::next' => ['void'], 'FilterIterator::rewind' => ['void'], 'FilterIterator::valid' => ['bool'], 'finfo::__construct' => ['void', 'options=' => 'int', 'magic_file=' => 'string'], 'finfo::buffer' => ['string|false', 'string' => 'string', 'options=' => 'int', 'context=' => 'resource'], 'finfo::file' => ['string|false', 'file_name' => 'string', 'options=' => 'int', 'context=' => 'resource'], 'finfo::set_flags' => ['bool', 'options' => 'int'], 'finfo_buffer' => ['string|false', 'finfo' => 'resource', 'string' => 'string', 'options=' => 'int', 'context=' => 'resource'], 'finfo_close' => ['bool', 'finfo' => 'resource'], 'finfo_file' => ['string|false', 'finfo' => 'resource', 'file_name' => 'string', 'options=' => 'int', 'context=' => 'resource'], 'finfo_open' => ['resource|false', 'options=' => 'int', 'arg=' => 'string'], 'finfo_set_flags' => ['bool', 'finfo' => 'resource', 'options' => 'int'], 'floatval' => ['float', 'var' => 'mixed'], 'flock' => ['bool', 'fp' => 'resource', 'operation' => 'int', '&w_wouldblock=' => 'int'], 'floor' => ['float', 'number' => 'float'], 'flush' => ['void'], 'fmod' => ['float', 'x' => 'float', 'y' => 'float'], 'fnmatch' => ['bool', 'pattern' => 'string', 'filename' => 'string', 'flags=' => 'int'], 'fopen' => ['resource|false', 'filename' => 'string', 'mode' => 'string', 'use_include_path=' => 'bool', 'context=' => 'resource'], 'forward_static_call' => ['mixed', 'function' => 'callable', '...parameters=' => 'mixed'], 'forward_static_call_array' => ['mixed', 'function' => 'callable', 'parameters' => 'array<int,mixed>'], 'fpassthru' => ['int', 'fp' => 'resource'], 'fpm_get_status' => ['array|false'], 'fprintf' => ['int', 'stream' => 'resource', 'format' => 'string', '...args=' => 'string|int|float'], 'fputcsv' => ['int|false', 'fp' => 'resource', 'fields' => 'array', 'delimiter=' => 'string', 'enclosure=' => 'string', 'escape_char=' => 'string'], 'fputs' => ['int|false', 'fp' => 'resource', 'str' => 'string', 'length=' => 'int'], 'fread' => ['string|false', 'fp' => 'resource', 'length' => 'int'], 'frenchtojd' => ['int', 'month' => 'int', 'day' => 'int', 'year' => 'int'], 'fribidi_log2vis' => ['string', 'str' => 'string', 'direction' => 'string', 'charset' => 'int'], 'fscanf' => ['array|int', 'stream' => 'resource', 'format' => 'string', '&...w_vars=' => 'string|int|float|null'], 'fseek' => ['int', 'fp' => 'resource', 'offset' => 'int', 'whence=' => 'int'], 'fsockopen' => ['resource|false', 'hostname' => 'string', 'port=' => 'int', '&w_errno=' => 'int', '&w_errstr=' => 'string', 'timeout=' => 'float'], 'fstat' => ['array|false', 'fp' => 'resource'], 'ftell' => ['int|false', 'fp' => 'resource'], 'ftok' => ['int', 'pathname' => 'string', 'proj' => 'string'], 'ftp_alloc' => ['bool', 'stream' => 'resource', 'size' => 'int', '&w_response=' => 'string'], 'ftp_append' => ['bool', 'ftp' => 'resource', 'remote_file' => 'string', 'local_file' => 'string', 'mode=' => 'int'], 'ftp_cdup' => ['bool', 'stream' => 'resource'], 'ftp_chdir' => ['bool', 'stream' => 'resource', 'directory' => 'string'], 'ftp_chmod' => ['int|false', 'stream' => 'resource', 'mode' => 'int', 'filename' => 'string'], 'ftp_close' => ['bool', 'stream' => 'resource'], 'ftp_connect' => ['resource|false', 'host' => 'string', 'port=' => 'int', 'timeout=' => 'int'], 'ftp_delete' => ['bool', 'stream' => 'resource', 'file' => 'string'], 'ftp_exec' => ['bool', 'stream' => 'resource', 'command' => 'string'], 'ftp_fget' => ['bool', 'stream' => 'resource', 'fp' => 'resource', 'remote_file' => 'string', 'mode=' => 'int', 'resumepos=' => 'int'], 'ftp_fput' => ['bool', 'stream' => 'resource', 'remote_file' => 'string', 'fp' => 'resource', 'mode=' => 'int', 'startpos=' => 'int'], 'ftp_get' => ['bool', 'stream' => 'resource', 'local_file' => 'string', 'remote_file' => 'string', 'mode=' => 'int', 'resume_pos=' => 'int'], 'ftp_get_option' => ['mixed', 'stream' => 'resource', 'option' => 'int'], 'ftp_login' => ['bool', 'stream' => 'resource', 'username' => 'string', 'password' => 'string'], 'ftp_mdtm' => ['int', 'stream' => 'resource', 'filename' => 'string'], 'ftp_mkdir' => ['string|false', 'stream' => 'resource', 'directory' => 'string'], 'ftp_mlsd' => ['array', 'ftp_stream' => 'resource', 'directory' => 'string'], 'ftp_nb_continue' => ['int', 'stream' => 'resource'], 'ftp_nb_fget' => ['int', 'stream' => 'resource', 'fp' => 'resource', 'remote_file' => 'string', 'mode' => 'int', 'resumepos=' => 'int'], 'ftp_nb_fput' => ['int', 'stream' => 'resource', 'remote_file' => 'string', 'fp' => 'resource', 'mode' => 'int', 'startpos=' => 'int'], 'ftp_nb_get' => ['int', 'stream' => 'resource', 'local_file' => 'string', 'remote_file' => 'string', 'mode' => 'int', 'resume_pos=' => 'int'], 'ftp_nb_put' => ['int', 'stream' => 'resource', 'remote_file' => 'string', 'local_file' => 'string', 'mode' => 'int', 'startpos=' => 'int'], 'ftp_nlist' => ['array|false', 'stream' => 'resource', 'directory' => 'string'], 'ftp_pasv' => ['bool', 'stream' => 'resource', 'pasv' => 'bool'], 'ftp_put' => ['bool', 'stream' => 'resource', 'remote_file' => 'string', 'local_file' => 'string', 'mode' => 'int', 'startpos=' => 'int'], 'ftp_pwd' => ['string|false', 'stream' => 'resource'], 'ftp_raw' => ['array', 'stream' => 'resource', 'command' => 'string'], 'ftp_rawlist' => ['array|false', 'stream' => 'resource', 'directory' => 'string', 'recursive=' => 'bool'], 'ftp_rename' => ['bool', 'stream' => 'resource', 'src' => 'string', 'dest' => 'string'], 'ftp_rmdir' => ['bool', 'stream' => 'resource', 'directory' => 'string'], 'ftp_set_option' => ['bool', 'stream' => 'resource', 'option' => 'int', 'value' => 'mixed'], 'ftp_site' => ['bool', 'stream' => 'resource', 'cmd' => 'string'], 'ftp_size' => ['int', 'stream' => 'resource', 'filename' => 'string'], 'ftp_ssl_connect' => ['resource|false', 'host' => 'string', 'port=' => 'int', 'timeout=' => 'int'], 'ftp_systype' => ['string|false', 'stream' => 'resource'], 'ftruncate' => ['bool', 'fp' => 'resource', 'size' => 'int'], 'func_get_arg' => ['mixed', 'arg_num' => 'int'], 'func_get_args' => ['array'], 'func_num_args' => ['int'], 'function_exists' => ['bool', 'function_name' => 'string'], 'fwrite' => ['int|false', 'fp' => 'resource', 'str' => 'string', 'length=' => 'int'], 'gc_collect_cycles' => ['int'], 'gc_disable' => ['void'], 'gc_enable' => ['void'], 'gc_enabled' => ['bool'], 'gc_mem_caches' => ['int'], 'gc_status' => ['array'], 'gd_info' => ['array'], 'gearman_bugreport' => [''], 'gearman_client_add_options' => ['', 'client_object' => '', 'option' => ''], 'gearman_client_add_server' => ['', 'client_object' => '', 'host' => '', 'port' => ''], 'gearman_client_add_servers' => ['', 'client_object' => '', 'servers' => ''], 'gearman_client_add_task' => ['', 'client_object' => '', 'function_name' => '', 'workload' => '', 'context' => '', 'unique' => ''], 'gearman_client_add_task_background' => ['', 'client_object' => '', 'function_name' => '', 'workload' => '', 'context' => '', 'unique' => ''], 'gearman_client_add_task_high' => ['', 'client_object' => '', 'function_name' => '', 'workload' => '', 'context' => '', 'unique' => ''], 'gearman_client_add_task_high_background' => ['', 'client_object' => '', 'function_name' => '', 'workload' => '', 'context' => '', 'unique' => ''], 'gearman_client_add_task_low' => ['', 'client_object' => '', 'function_name' => '', 'workload' => '', 'context' => '', 'unique' => ''], 'gearman_client_add_task_low_background' => ['', 'client_object' => '', 'function_name' => '', 'workload' => '', 'context' => '', 'unique' => ''], 'gearman_client_add_task_status' => ['', 'client_object' => '', 'job_handle' => '', 'context' => ''], 'gearman_client_clear_fn' => ['', 'client_object' => ''], 'gearman_client_clone' => ['', 'client_object' => ''], 'gearman_client_context' => ['', 'client_object' => ''], 'gearman_client_create' => ['', 'client_object' => ''], 'gearman_client_do' => ['', 'client_object' => '', 'function_name' => '', 'workload' => '', 'unique' => ''], 'gearman_client_do_background' => ['', 'client_object' => '', 'function_name' => '', 'workload' => '', 'unique' => ''], 'gearman_client_do_high' => ['', 'client_object' => '', 'function_name' => '', 'workload' => '', 'unique' => ''], 'gearman_client_do_high_background' => ['', 'client_object' => '', 'function_name' => '', 'workload' => '', 'unique' => ''], 'gearman_client_do_job_handle' => ['', 'client_object' => ''], 'gearman_client_do_low' => ['', 'client_object' => '', 'function_name' => '', 'workload' => '', 'unique' => ''], 'gearman_client_do_low_background' => ['', 'client_object' => '', 'function_name' => '', 'workload' => '', 'unique' => ''], 'gearman_client_do_normal' => ['', 'client_object' => '', 'function_name' => 'string', 'workload' => 'string', 'unique' => 'string'], 'gearman_client_do_status' => ['', 'client_object' => ''], 'gearman_client_echo' => ['', 'client_object' => '', 'workload' => ''], 'gearman_client_errno' => ['', 'client_object' => ''], 'gearman_client_error' => ['', 'client_object' => ''], 'gearman_client_job_status' => ['', 'client_object' => '', 'job_handle' => ''], 'gearman_client_options' => ['', 'client_object' => ''], 'gearman_client_remove_options' => ['', 'client_object' => '', 'option' => ''], 'gearman_client_return_code' => ['', 'client_object' => ''], 'gearman_client_run_tasks' => ['', 'data' => ''], 'gearman_client_set_complete_fn' => ['', 'client_object' => '', 'callback' => ''], 'gearman_client_set_context' => ['', 'client_object' => '', 'context' => ''], 'gearman_client_set_created_fn' => ['', 'client_object' => '', 'callback' => ''], 'gearman_client_set_data_fn' => ['', 'client_object' => '', 'callback' => ''], 'gearman_client_set_exception_fn' => ['', 'client_object' => '', 'callback' => ''], 'gearman_client_set_fail_fn' => ['', 'client_object' => '', 'callback' => ''], 'gearman_client_set_options' => ['', 'client_object' => '', 'option' => ''], 'gearman_client_set_status_fn' => ['', 'client_object' => '', 'callback' => ''], 'gearman_client_set_timeout' => ['', 'client_object' => '', 'timeout' => ''], 'gearman_client_set_warning_fn' => ['', 'client_object' => '', 'callback' => ''], 'gearman_client_set_workload_fn' => ['', 'client_object' => '', 'callback' => ''], 'gearman_client_timeout' => ['', 'client_object' => ''], 'gearman_client_wait' => ['', 'client_object' => ''], 'gearman_job_function_name' => ['', 'job_object' => ''], 'gearman_job_handle' => ['string'], 'gearman_job_return_code' => ['', 'job_object' => ''], 'gearman_job_send_complete' => ['', 'job_object' => '', 'result' => ''], 'gearman_job_send_data' => ['', 'job_object' => '', 'data' => ''], 'gearman_job_send_exception' => ['', 'job_object' => '', 'exception' => ''], 'gearman_job_send_fail' => ['', 'job_object' => ''], 'gearman_job_send_status' => ['', 'job_object' => '', 'numerator' => '', 'denominator' => ''], 'gearman_job_send_warning' => ['', 'job_object' => '', 'warning' => ''], 'gearman_job_status' => ['array', 'job_handle' => 'string'], 'gearman_job_unique' => ['', 'job_object' => ''], 'gearman_job_workload' => ['', 'job_object' => ''], 'gearman_job_workload_size' => ['', 'job_object' => ''], 'gearman_task_data' => ['', 'task_object' => ''], 'gearman_task_data_size' => ['', 'task_object' => ''], 'gearman_task_denominator' => ['', 'task_object' => ''], 'gearman_task_function_name' => ['', 'task_object' => ''], 'gearman_task_is_known' => ['', 'task_object' => ''], 'gearman_task_is_running' => ['', 'task_object' => ''], 'gearman_task_job_handle' => ['', 'task_object' => ''], 'gearman_task_numerator' => ['', 'task_object' => ''], 'gearman_task_recv_data' => ['', 'task_object' => '', 'data_len' => ''], 'gearman_task_return_code' => ['', 'task_object' => ''], 'gearman_task_send_workload' => ['', 'task_object' => '', 'data' => ''], 'gearman_task_unique' => ['', 'task_object' => ''], 'gearman_verbose_name' => ['', 'verbose' => ''], 'gearman_version' => [''], 'gearman_worker_add_function' => ['', 'worker_object' => '', 'function_name' => '', 'function' => '', 'data' => '', 'timeout' => ''], 'gearman_worker_add_options' => ['', 'worker_object' => '', 'option' => ''], 'gearman_worker_add_server' => ['', 'worker_object' => '', 'host' => '', 'port' => ''], 'gearman_worker_add_servers' => ['', 'worker_object' => '', 'servers' => ''], 'gearman_worker_clone' => ['', 'worker_object' => ''], 'gearman_worker_create' => [''], 'gearman_worker_echo' => ['', 'worker_object' => '', 'workload' => ''], 'gearman_worker_errno' => ['', 'worker_object' => ''], 'gearman_worker_error' => ['', 'worker_object' => ''], 'gearman_worker_grab_job' => ['', 'worker_object' => ''], 'gearman_worker_options' => ['', 'worker_object' => ''], 'gearman_worker_register' => ['', 'worker_object' => '', 'function_name' => '', 'timeout' => ''], 'gearman_worker_remove_options' => ['', 'worker_object' => '', 'option' => ''], 'gearman_worker_return_code' => ['', 'worker_object' => ''], 'gearman_worker_set_options' => ['', 'worker_object' => '', 'option' => ''], 'gearman_worker_set_timeout' => ['', 'worker_object' => '', 'timeout' => ''], 'gearman_worker_timeout' => ['', 'worker_object' => ''], 'gearman_worker_unregister' => ['', 'worker_object' => '', 'function_name' => ''], 'gearman_worker_unregister_all' => ['', 'worker_object' => ''], 'gearman_worker_wait' => ['', 'worker_object' => ''], 'gearman_worker_work' => ['', 'worker_object' => ''], 'GearmanClient::__construct' => ['void'], 'GearmanClient::addOptions' => ['bool', 'options' => 'int'], 'GearmanClient::addServer' => ['bool', 'host=' => 'string', 'port=' => 'int'], 'GearmanClient::addServers' => ['bool', 'servers=' => 'string'], 'GearmanClient::addTask' => ['GearmanTask', 'function_name' => 'string', 'workload' => 'string', 'context=' => 'mixed', 'unique=' => 'string'], 'GearmanClient::addTaskBackground' => ['GearmanTask', 'function_name' => 'string', 'workload' => 'string', 'context=' => 'mixed', 'unique=' => 'string'], 'GearmanClient::addTaskHigh' => ['GearmanTask', 'function_name' => 'string', 'workload' => 'string', 'context=' => 'mixed', 'unique=' => 'string'], 'GearmanClient::addTaskHighBackground' => ['GearmanTask', 'function_name' => 'string', 'workload' => 'string', 'context=' => 'mixed', 'unique=' => 'string'], 'GearmanClient::addTaskLow' => ['GearmanTask', 'function_name' => 'string', 'workload' => 'string', 'context=' => 'mixed', 'unique=' => 'string'], 'GearmanClient::addTaskLowBackground' => ['GearmanTask', 'function_name' => 'string', 'workload' => 'string', 'context=' => 'mixed', 'unique=' => 'string'], 'GearmanClient::addTaskStatus' => ['GearmanTask', 'job_handle' => 'string', 'context=' => 'string'], 'GearmanClient::clearCallbacks' => ['bool'], 'GearmanClient::clone' => ['GearmanClient'], 'GearmanClient::context' => ['string'], 'GearmanClient::data' => ['string'], 'GearmanClient::do' => ['string', 'function_name' => 'string', 'workload' => 'string', 'unique=' => 'string'], 'GearmanClient::doBackground' => ['string', 'function_name' => 'string', 'workload' => 'string', 'unique=' => 'string'], 'GearmanClient::doHigh' => ['string', 'function_name' => 'string', 'workload' => 'string', 'unique=' => 'string'], 'GearmanClient::doHighBackground' => ['string', 'function_name' => 'string', 'workload' => 'string', 'unique=' => 'string'], 'GearmanClient::doJobHandle' => ['string'], 'GearmanClient::doLow' => ['string', 'function_name' => 'string', 'workload' => 'string', 'unique=' => 'string'], 'GearmanClient::doLowBackground' => ['string', 'function_name' => 'string', 'workload' => 'string', 'unique=' => 'string'], 'GearmanClient::doNormal' => ['string', 'function_name' => 'string', 'workload' => 'string', 'unique=' => 'string'], 'GearmanClient::doStatus' => ['array'], 'GearmanClient::echo' => ['bool', 'workload' => 'string'], 'GearmanClient::error' => ['string'], 'GearmanClient::getErrno' => ['int'], 'GearmanClient::jobStatus' => ['array', 'job_handle' => 'string'], 'GearmanClient::options' => [''], 'GearmanClient::ping' => ['bool', 'workload' => 'string'], 'GearmanClient::removeOptions' => ['bool', 'options' => 'int'], 'GearmanClient::returnCode' => ['int'], 'GearmanClient::runTasks' => ['bool'], 'GearmanClient::setClientCallback' => ['void', 'callback' => 'callable'], 'GearmanClient::setCompleteCallback' => ['bool', 'callback' => 'callable'], 'GearmanClient::setContext' => ['bool', 'context' => 'string'], 'GearmanClient::setCreatedCallback' => ['bool', 'callback' => 'string'], 'GearmanClient::setData' => ['bool', 'data' => 'string'], 'GearmanClient::setDataCallback' => ['bool', 'callback' => 'callable'], 'GearmanClient::setExceptionCallback' => ['bool', 'callback' => 'callable'], 'GearmanClient::setFailCallback' => ['bool', 'callback' => 'callable'], 'GearmanClient::setOptions' => ['bool', 'options' => 'int'], 'GearmanClient::setStatusCallback' => ['bool', 'callback' => 'callable'], 'GearmanClient::setTimeout' => ['bool', 'timeout' => 'int'], 'GearmanClient::setWarningCallback' => ['bool', 'callback' => 'callable'], 'GearmanClient::setWorkloadCallback' => ['bool', 'callback' => 'callable'], 'GearmanClient::timeout' => ['int'], 'GearmanClient::wait' => [''], 'GearmanJob::__construct' => ['void'], 'GearmanJob::complete' => ['bool', 'result' => 'string'], 'GearmanJob::data' => ['bool', 'data' => 'string'], 'GearmanJob::exception' => ['bool', 'exception' => 'string'], 'GearmanJob::fail' => ['bool'], 'GearmanJob::functionName' => ['string'], 'GearmanJob::handle' => ['string'], 'GearmanJob::returnCode' => ['int'], 'GearmanJob::sendComplete' => ['bool', 'result' => 'string'], 'GearmanJob::sendData' => ['bool', 'data' => 'string'], 'GearmanJob::sendException' => ['bool', 'exception' => 'string'], 'GearmanJob::sendFail' => ['bool'], 'GearmanJob::sendStatus' => ['bool', 'numerator' => 'int', 'denominator' => 'int'], 'GearmanJob::sendWarning' => ['bool', 'warning' => 'string'], 'GearmanJob::setReturn' => ['bool', 'gearman_return_t' => 'string'], 'GearmanJob::status' => ['bool', 'numerator' => 'int', 'denominator' => 'int'], 'GearmanJob::unique' => ['string'], 'GearmanJob::warning' => ['bool', 'warning' => 'string'], 'GearmanJob::workload' => ['string'], 'GearmanJob::workloadSize' => ['int'], 'GearmanTask::__construct' => ['void'], 'GearmanTask::create' => ['GearmanTask'], 'GearmanTask::data' => ['string'], 'GearmanTask::dataSize' => ['int'], 'GearmanTask::function' => ['string'], 'GearmanTask::functionName' => ['string'], 'GearmanTask::isKnown' => ['bool'], 'GearmanTask::isRunning' => ['bool'], 'GearmanTask::jobHandle' => ['string'], 'GearmanTask::recvData' => ['array', 'data_len' => 'int'], 'GearmanTask::returnCode' => ['int'], 'GearmanTask::sendData' => ['int', 'data' => 'string'], 'GearmanTask::sendWorkload' => ['int', 'data' => 'string'], 'GearmanTask::taskDenominator' => ['int'], 'GearmanTask::taskNumerator' => ['int'], 'GearmanTask::unique' => ['string'], 'GearmanTask::uuid' => ['string'], 'GearmanWorker::__construct' => ['void'], 'GearmanWorker::addFunction' => ['bool', 'function_name' => 'string', 'function' => 'callable', 'context=' => 'mixed', 'timeout=' => 'int'], 'GearmanWorker::addOptions' => ['bool', 'option' => 'int'], 'GearmanWorker::addServer' => ['bool', 'host=' => 'string', 'port=' => 'int'], 'GearmanWorker::addServers' => ['bool', 'servers' => 'string'], 'GearmanWorker::clone' => ['void'], 'GearmanWorker::echo' => ['bool', 'workload' => 'string'], 'GearmanWorker::error' => ['string'], 'GearmanWorker::getErrno' => ['int'], 'GearmanWorker::grabJob' => [''], 'GearmanWorker::options' => ['int'], 'GearmanWorker::register' => ['bool', 'function_name' => 'string', 'timeout=' => 'int'], 'GearmanWorker::removeOptions' => ['bool', 'option' => 'int'], 'GearmanWorker::returnCode' => ['int'], 'GearmanWorker::setId' => ['bool', 'id' => 'string'], 'GearmanWorker::setOptions' => ['bool', 'option' => 'int'], 'GearmanWorker::setTimeout' => ['bool', 'timeout' => 'int'], 'GearmanWorker::timeout' => ['int'], 'GearmanWorker::unregister' => ['bool', 'function_name' => 'string'], 'GearmanWorker::unregisterAll' => ['bool'], 'GearmanWorker::wait' => ['bool'], 'GearmanWorker::work' => ['bool'], 'Gender\\Gender::__construct' => ['void', 'dsn=' => 'string'], 'Gender\\Gender::connect' => ['bool', 'dsn' => 'string'], 'Gender\\Gender::country' => ['array', 'country' => 'int'], 'Gender\\Gender::get' => ['int', 'name' => 'string', 'country=' => 'int'], 'Gender\\Gender::isNick' => ['array', 'name0' => 'string', 'name1' => 'string', 'country=' => 'int'], 'Gender\\Gender::similarNames' => ['array', 'name' => 'string', 'country=' => 'int'], 'Generator::__wakeup' => ['void'], 'Generator::current' => ['mixed'], 'Generator::getReturn' => ['mixed'], 'Generator::key' => ['mixed'], 'Generator::next' => ['void'], 'Generator::rewind' => ['void'], 'Generator::send' => ['mixed', 'value' => 'mixed'], 'Generator::throw' => ['mixed', 'exception' => 'Exception|Throwable'], 'Generator::valid' => ['bool'], 'geoip_asnum_by_name' => ['string', 'hostname' => 'string'], 'geoip_continent_code_by_name' => ['string', 'hostname' => 'string'], 'geoip_country_code3_by_name' => ['string', 'hostname' => 'string'], 'geoip_country_code_by_name' => ['string', 'hostname' => 'string'], 'geoip_country_name_by_name' => ['string', 'hostname' => 'string'], 'geoip_database_info' => ['string', 'database=' => 'int'], 'geoip_db_avail' => ['bool', 'database' => 'int'], 'geoip_db_filename' => ['string', 'database' => 'int'], 'geoip_db_get_all_info' => ['array'], 'geoip_domain_by_name' => ['string', 'hostname' => 'string'], 'geoip_id_by_name' => ['int', 'hostname' => 'string'], 'geoip_isp_by_name' => ['string', 'hostname' => 'string'], 'geoip_netspeedcell_by_name' => ['string', 'hostname' => 'string'], 'geoip_org_by_name' => ['string', 'hostname' => 'string'], 'geoip_record_by_name' => ['array', 'hostname' => 'string'], 'geoip_region_by_name' => ['array', 'hostname' => 'string'], 'geoip_region_name_by_code' => ['string', 'country_code' => 'string', 'region_code' => 'string'], 'geoip_setup_custom_directory' => ['void', 'path' => 'string'], 'geoip_time_zone_by_country_and_region' => ['string|false', 'country_code' => 'string', 'region_code=' => 'string'], 'get_browser' => ['mixed', 'browser_name=' => 'string', 'return_array=' => 'bool'], 'get_call_stack' => [''], 'get_called_class' => ['string'], 'get_cfg_var' => ['mixed', 'option_name' => 'string'], 'get_class' => ['string', 'object=' => 'object'], 'get_class_methods' => ['array', 'class' => 'mixed'], 'get_class_vars' => ['array', 'class_name' => 'string'], 'get_current_user' => ['string'], 'get_declared_classes' => ['array'], 'get_declared_interfaces' => ['array'], 'get_declared_traits' => ['array'], 'get_defined_constants' => ['array', 'categorize=' => 'bool'], 'get_defined_functions' => ['array<string,array<string,string>>', 'exclude_disabled=' => 'bool'], 'get_defined_vars' => ['array'], 'get_extension_funcs' => ['array', 'extension_name' => 'string'], 'get_headers' => ['array|false', 'url' => 'string', 'format=' => 'int', 'context=' => 'resource'], 'get_html_translation_table' => ['array', 'table=' => 'int', 'flags=' => 'int', 'encoding=' => 'string'], 'get_include_path' => ['string'], 'get_included_files' => ['array'], 'get_loaded_extensions' => ['array', 'zend_extensions=' => 'bool'], 'get_magic_quotes_gpc' => ['bool'], 'get_magic_quotes_runtime' => ['bool'], 'get_meta_tags' => ['array', 'filename' => 'string', 'use_include_path=' => 'bool'], 'get_object_vars' => ['array', 'obj' => 'object'], 'get_parent_class' => ['string|false', 'object=' => 'mixed'], 'get_required_files' => ['string[]'], 'get_resource_type' => ['string', 'res' => 'resource'], 'get_resources' => ['resource[]', 'resource_type' => 'string'], 'getallheaders' => ['array'], 'getcwd' => ['string|false'], 'getdate' => ['array', 'timestamp=' => 'int'], 'getenv' => ['string|false', 'varname' => 'string', 'local_only=' => 'bool'], 'getenv\'1' => ['string[]'], 'gethostbyaddr' => ['string|false', 'ip_address' => 'string'], 'gethostbyname' => ['string', 'hostname' => 'string'], 'gethostbynamel' => ['array|false', 'hostname' => 'string'], 'gethostname' => ['string|false'], 'getimagesize' => ['array|false', 'imagefile' => 'string', '&w_info=' => 'array'], 'getimagesizefromstring' => ['array|false', 'data' => 'string', '&w_info=' => 'array'], 'getlastmod' => ['int'], 'getmxrr' => ['bool', 'hostname' => 'string', '&w_mxhosts' => 'array', '&w_weight=' => 'array'], 'getmygid' => ['int'], 'getmyinode' => ['int'], 'getmypid' => ['int'], 'getmyuid' => ['int'], 'getopt' => ['array<string,string>|array<string,false>|array<string,array<int,mixed>>', 'options' => 'string', 'longopts=' => 'array', '&w_optind=' => 'int'], 'getprotobyname' => ['int|false', 'name' => 'string'], 'getprotobynumber' => ['string', 'proto' => 'int'], 'getrandmax' => ['int'], 'getrusage' => ['array', 'who=' => 'int'], 'getservbyname' => ['int|false', 'service' => 'string', 'protocol' => 'string'], 'getservbyport' => ['string|false', 'port' => 'int', 'protocol' => 'string'], 'gettext' => ['string', 'msgid' => 'string'], 'gettimeofday' => ['array|float', 'get_as_float=' => 'bool'], 'gettype' => ['string', 'var' => 'mixed'], 'glob' => ['array<int, string>|false', 'pattern' => 'string', 'flags=' => 'int'], 'GlobIterator::__construct' => ['void', 'path' => 'string', 'flags=' => 'int'], 'GlobIterator::cont' => ['int'], 'GlobIterator::count' => ['int'], 'Gmagick::__construct' => ['void', 'filename=' => 'string'], 'Gmagick::addimage' => ['Gmagick', 'gmagick' => 'gmagick'], 'Gmagick::addnoiseimage' => ['Gmagick', 'noise' => 'int'], 'Gmagick::annotateimage' => ['Gmagick', 'gmagickdraw' => 'gmagickdraw', 'x' => 'float', 'y' => 'float', 'angle' => 'float', 'text' => 'string'], 'Gmagick::blurimage' => ['Gmagick', 'radius' => 'float', 'sigma' => 'float', 'channel=' => 'int'], 'Gmagick::borderimage' => ['Gmagick', 'color' => 'gmagickpixel', 'width' => 'int', 'height' => 'int'], 'Gmagick::charcoalimage' => ['Gmagick', 'radius' => 'float', 'sigma' => 'float'], 'Gmagick::chopimage' => ['Gmagick', 'width' => 'int', 'height' => 'int', 'x' => 'int', 'y' => 'int'], 'Gmagick::clear' => ['Gmagick'], 'Gmagick::commentimage' => ['Gmagick', 'comment' => 'string'], 'Gmagick::compositeimage' => ['Gmagick', 'source' => 'gmagick', 'compose' => 'int', 'x' => 'int', 'y' => 'int'], 'Gmagick::cropimage' => ['Gmagick', 'width' => 'int', 'height' => 'int', 'x' => 'int', 'y' => 'int'], 'Gmagick::cropthumbnailimage' => ['Gmagick', 'width' => 'int', 'height' => 'int'], 'Gmagick::current' => ['Gmagick'], 'Gmagick::cyclecolormapimage' => ['Gmagick', 'displace' => 'int'], 'Gmagick::deconstructimages' => ['Gmagick'], 'Gmagick::despeckleimage' => ['Gmagick'], 'Gmagick::destroy' => ['bool'], 'Gmagick::drawimage' => ['Gmagick', 'gmagickdraw' => 'gmagickdraw'], 'Gmagick::edgeimage' => ['Gmagick', 'radius' => 'float'], 'Gmagick::embossimage' => ['Gmagick', 'radius' => 'float', 'sigma' => 'float'], 'Gmagick::enhanceimage' => ['Gmagick'], 'Gmagick::equalizeimage' => ['Gmagick'], 'Gmagick::flipimage' => ['Gmagick'], 'Gmagick::flopimage' => ['Gmagick'], 'Gmagick::frameimage' => ['Gmagick', 'color' => 'gmagickpixel', 'width' => 'int', 'height' => 'int', 'inner_bevel' => 'int', 'outer_bevel' => 'int'], 'Gmagick::gammaimage' => ['Gmagick', 'gamma' => 'float'], 'Gmagick::getcopyright' => ['string'], 'Gmagick::getfilename' => ['string'], 'Gmagick::getimagebackgroundcolor' => ['GmagickPixel'], 'Gmagick::getimageblueprimary' => ['array'], 'Gmagick::getimagebordercolor' => ['GmagickPixel'], 'Gmagick::getimagechanneldepth' => ['int', 'channel_type' => 'int'], 'Gmagick::getimagecolors' => ['int'], 'Gmagick::getimagecolorspace' => ['int'], 'Gmagick::getimagecompose' => ['int'], 'Gmagick::getimagedelay' => ['int'], 'Gmagick::getimagedepth' => ['int'], 'Gmagick::getimagedispose' => ['int'], 'Gmagick::getimageextrema' => ['array'], 'Gmagick::getimagefilename' => ['string'], 'Gmagick::getimageformat' => ['string'], 'Gmagick::getimagegamma' => ['float'], 'Gmagick::getimagegreenprimary' => ['array'], 'Gmagick::getimageheight' => ['int'], 'Gmagick::getimagehistogram' => ['array'], 'Gmagick::getimageindex' => ['int'], 'Gmagick::getimageinterlacescheme' => ['int'], 'Gmagick::getimageiterations' => ['int'], 'Gmagick::getimagematte' => ['int'], 'Gmagick::getimagemattecolor' => ['GmagickPixel'], 'Gmagick::getimageprofile' => ['string', 'name' => 'string'], 'Gmagick::getimageredprimary' => ['array'], 'Gmagick::getimagerenderingintent' => ['int'], 'Gmagick::getimageresolution' => ['array'], 'Gmagick::getimagescene' => ['int'], 'Gmagick::getimagesignature' => ['string'], 'Gmagick::getimagetype' => ['int'], 'Gmagick::getimageunits' => ['int'], 'Gmagick::getimagewhitepoint' => ['array'], 'Gmagick::getimagewidth' => ['int'], 'Gmagick::getpackagename' => ['string'], 'Gmagick::getquantumdepth' => ['array'], 'Gmagick::getreleasedate' => ['string'], 'Gmagick::getsamplingfactors' => ['array'], 'Gmagick::getsize' => ['array'], 'Gmagick::getversion' => ['array'], 'Gmagick::hasnextimage' => ['bool'], 'Gmagick::haspreviousimage' => ['bool'], 'Gmagick::implodeimage' => ['mixed', 'radius' => 'float'], 'Gmagick::labelimage' => ['mixed', 'label' => 'string'], 'Gmagick::levelimage' => ['mixed', 'blackpoint' => 'float', 'gamma' => 'float', 'whitepoint' => 'float', 'channel=' => 'int'], 'Gmagick::magnifyimage' => ['mixed'], 'Gmagick::mapimage' => ['Gmagick', 'gmagick' => 'gmagick', 'dither' => 'bool'], 'Gmagick::medianfilterimage' => ['void', 'radius' => 'float'], 'Gmagick::minifyimage' => ['Gmagick'], 'Gmagick::modulateimage' => ['Gmagick', 'brightness' => 'float', 'saturation' => 'float', 'hue' => 'float'], 'Gmagick::motionblurimage' => ['Gmagick', 'radius' => 'float', 'sigma' => 'float', 'angle' => 'float'], 'Gmagick::newimage' => ['Gmagick', 'width' => 'int', 'height' => 'int', 'background' => 'string', 'format=' => 'string'], 'Gmagick::nextimage' => ['bool'], 'Gmagick::normalizeimage' => ['Gmagick', 'channel=' => 'int'], 'Gmagick::oilpaintimage' => ['Gmagick', 'radius' => 'float'], 'Gmagick::previousimage' => ['bool'], 'Gmagick::profileimage' => ['Gmagick', 'name' => 'string', 'profile' => 'string'], 'Gmagick::quantizeimage' => ['Gmagick', 'numcolors' => 'int', 'colorspace' => 'int', 'treedepth' => 'int', 'dither' => 'bool', 'measureerror' => 'bool'], 'Gmagick::quantizeimages' => ['Gmagick', 'numcolors' => 'int', 'colorspace' => 'int', 'treedepth' => 'int', 'dither' => 'bool', 'measureerror' => 'bool'], 'Gmagick::queryfontmetrics' => ['array', 'draw' => 'gmagickdraw', 'text' => 'string'], 'Gmagick::queryfonts' => ['array', 'pattern=' => 'string'], 'Gmagick::queryformats' => ['array', 'pattern=' => 'string'], 'Gmagick::radialblurimage' => ['Gmagick', 'angle' => 'float', 'channel=' => 'int'], 'Gmagick::raiseimage' => ['Gmagick', 'width' => 'int', 'height' => 'int', 'x' => 'int', 'y' => 'int', 'raise' => 'bool'], 'Gmagick::read' => ['Gmagick', 'filename' => 'string'], 'Gmagick::readimage' => ['Gmagick', 'filename' => 'string'], 'Gmagick::readimageblob' => ['Gmagick', 'imagecontents' => 'string', 'filename=' => 'string'], 'Gmagick::readimagefile' => ['Gmagick', 'fp' => 'resource', 'filename=' => 'string'], 'Gmagick::reducenoiseimage' => ['Gmagick', 'radius' => 'float'], 'Gmagick::removeimage' => ['Gmagick'], 'Gmagick::removeimageprofile' => ['string', 'name' => 'string'], 'Gmagick::resampleimage' => ['Gmagick', 'xresolution' => 'float', 'yresolution' => 'float', 'filter' => 'int', 'blur' => 'float'], 'Gmagick::resizeimage' => ['Gmagick', 'width' => 'int', 'height' => 'int', 'filter' => 'int', 'blur' => 'float', 'fit=' => 'bool'], 'Gmagick::rollimage' => ['Gmagick', 'x' => 'int', 'y' => 'int'], 'Gmagick::rotateimage' => ['Gmagick', 'color' => 'mixed', 'degrees' => 'float'], 'Gmagick::scaleimage' => ['Gmagick', 'width' => 'int', 'height' => 'int', 'fit=' => 'bool'], 'Gmagick::separateimagechannel' => ['Gmagick', 'channel' => 'int'], 'Gmagick::setCompressionQuality' => ['Gmagick', 'quality' => 'int'], 'Gmagick::setfilename' => ['Gmagick', 'filename' => 'string'], 'Gmagick::setimagebackgroundcolor' => ['Gmagick', 'color' => 'gmagickpixel'], 'Gmagick::setimageblueprimary' => ['Gmagick', 'x' => 'float', 'y' => 'float'], 'Gmagick::setimagebordercolor' => ['Gmagick', 'color' => 'gmagickpixel'], 'Gmagick::setimagechanneldepth' => ['Gmagick', 'channel' => 'int', 'depth' => 'int'], 'Gmagick::setimagecolorspace' => ['Gmagick', 'colorspace' => 'int'], 'Gmagick::setimagecompose' => ['Gmagick', 'composite' => 'int'], 'Gmagick::setimagedelay' => ['Gmagick', 'delay' => 'int'], 'Gmagick::setimagedepth' => ['Gmagick', 'depth' => 'int'], 'Gmagick::setimagedispose' => ['Gmagick', 'disposetype' => 'int'], 'Gmagick::setimagefilename' => ['Gmagick', 'filename' => 'string'], 'Gmagick::setimageformat' => ['Gmagick', 'imageformat' => 'string'], 'Gmagick::setimagegamma' => ['Gmagick', 'gamma' => 'float'], 'Gmagick::setimagegreenprimary' => ['Gmagick', 'x' => 'float', 'y' => 'float'], 'Gmagick::setimageindex' => ['Gmagick', 'index' => 'int'], 'Gmagick::setimageinterlacescheme' => ['Gmagick', 'interlace' => 'int'], 'Gmagick::setimageiterations' => ['Gmagick', 'iterations' => 'int'], 'Gmagick::setimageprofile' => ['Gmagick', 'name' => 'string', 'profile' => 'string'], 'Gmagick::setimageredprimary' => ['Gmagick', 'x' => 'float', 'y' => 'float'], 'Gmagick::setimagerenderingintent' => ['Gmagick', 'rendering_intent' => 'int'], 'Gmagick::setimageresolution' => ['Gmagick', 'xresolution' => 'float', 'yresolution' => 'float'], 'Gmagick::setimagescene' => ['Gmagick', 'scene' => 'int'], 'Gmagick::setimagetype' => ['Gmagick', 'imgtype' => 'int'], 'Gmagick::setimageunits' => ['Gmagick', 'resolution' => 'int'], 'Gmagick::setimagewhitepoint' => ['Gmagick', 'x' => 'float', 'y' => 'float'], 'Gmagick::setsamplingfactors' => ['Gmagick', 'factors' => 'array'], 'Gmagick::setsize' => ['Gmagick', 'columns' => 'int', 'rows' => 'int'], 'Gmagick::shearimage' => ['Gmagick', 'color' => 'mixed', 'xshear' => 'float', 'yshear' => 'float'], 'Gmagick::solarizeimage' => ['Gmagick', 'threshold' => 'int'], 'Gmagick::spreadimage' => ['Gmagick', 'radius' => 'float'], 'Gmagick::stripimage' => ['Gmagick'], 'Gmagick::swirlimage' => ['Gmagick', 'degrees' => 'float'], 'Gmagick::thumbnailimage' => ['Gmagick', 'width' => 'int', 'height' => 'int', 'fit=' => 'bool'], 'Gmagick::trimimage' => ['Gmagick', 'fuzz' => 'float'], 'Gmagick::write' => ['', 'filename' => 'string'], 'Gmagick::writeimage' => ['Gmagick', 'filename' => 'string', 'all_frames=' => 'bool'], 'GmagickDraw::annotate' => ['GmagickDraw', 'x' => 'float', 'y' => 'float', 'text' => 'string'], 'GmagickDraw::arc' => ['GmagickDraw', 'sx' => 'float', 'sy' => 'float', 'ex' => 'float', 'ey' => 'float', 'sd' => 'float', 'ed' => 'float'], 'GmagickDraw::bezier' => ['GmagickDraw', 'coordinate_array' => 'array'], 'GmagickDraw::ellipse' => ['GmagickDraw', 'ox' => 'float', 'oy' => 'float', 'rx' => 'float', 'ry' => 'float', 'start' => 'float', 'end' => 'float'], 'GmagickDraw::getfillcolor' => ['GmagickPixel'], 'GmagickDraw::getfillopacity' => ['float'], 'GmagickDraw::getfont' => ['string'], 'GmagickDraw::getfontsize' => ['float'], 'GmagickDraw::getfontstyle' => ['int'], 'GmagickDraw::getfontweight' => ['int'], 'GmagickDraw::getstrokecolor' => ['GmagickPixel'], 'GmagickDraw::getstrokeopacity' => ['float'], 'GmagickDraw::getstrokewidth' => ['float'], 'GmagickDraw::gettextdecoration' => ['int'], 'GmagickDraw::gettextencoding' => ['string'], 'GmagickDraw::line' => ['GmagickDraw', 'sx' => 'float', 'sy' => 'float', 'ex' => 'float', 'ey' => 'float'], 'GmagickDraw::point' => ['GmagickDraw', 'x' => 'float', 'y' => 'float'], 'GmagickDraw::polygon' => ['GmagickDraw', 'coordinates' => 'array'], 'GmagickDraw::polyline' => ['GmagickDraw', 'coordinate_array' => 'array'], 'GmagickDraw::rectangle' => ['GmagickDraw', 'x1' => 'float', 'y1' => 'float', 'x2' => 'float', 'y2' => 'float'], 'GmagickDraw::rotate' => ['GmagickDraw', 'degrees' => 'float'], 'GmagickDraw::roundrectangle' => ['GmagickDraw', 'x1' => 'float', 'y1' => 'float', 'x2' => 'float', 'y2' => 'float', 'rx' => 'float', 'ry' => 'float'], 'GmagickDraw::scale' => ['GmagickDraw', 'x' => 'float', 'y' => 'float'], 'GmagickDraw::setfillcolor' => ['GmagickDraw', 'color' => 'string'], 'GmagickDraw::setfillopacity' => ['GmagickDraw', 'fill_opacity' => 'float'], 'GmagickDraw::setfont' => ['GmagickDraw', 'font' => 'string'], 'GmagickDraw::setfontsize' => ['GmagickDraw', 'pointsize' => 'float'], 'GmagickDraw::setfontstyle' => ['GmagickDraw', 'style' => 'int'], 'GmagickDraw::setfontweight' => ['GmagickDraw', 'weight' => 'int'], 'GmagickDraw::setstrokecolor' => ['GmagickDraw', 'color' => 'gmagickpixel'], 'GmagickDraw::setstrokeopacity' => ['GmagickDraw', 'stroke_opacity' => 'float'], 'GmagickDraw::setstrokewidth' => ['GmagickDraw', 'width' => 'float'], 'GmagickDraw::settextdecoration' => ['GmagickDraw', 'decoration' => 'int'], 'GmagickDraw::settextencoding' => ['GmagickDraw', 'encoding' => 'string'], 'GmagickPixel::__construct' => ['void', 'color=' => 'string'], 'GmagickPixel::getcolor' => ['mixed', 'as_array=' => 'bool', 'normalize_array=' => 'bool'], 'GmagickPixel::getcolorcount' => ['int'], 'GmagickPixel::getcolorvalue' => ['float', 'color' => 'int'], 'GmagickPixel::setcolor' => ['GmagickPixel', 'color' => 'string'], 'GmagickPixel::setcolorvalue' => ['GmagickPixel', 'color' => 'int', 'value' => 'float'], 'gmdate' => ['string', 'format' => 'string', 'timestamp=' => 'int'], 'gmmktime' => ['int', 'hour=' => 'int', 'min=' => 'int', 'sec=' => 'int', 'mon=' => 'int', 'day=' => 'int', 'year=' => 'int'], 'GMP::__construct' => ['void'], 'GMP::serialize' => ['string'], 'GMP::__toString' => ['string'], 'GMP::unserialize' => ['void', 'serialized' => 'string'], 'gmp_abs' => ['GMP', 'a' => 'GMP|string|int'], 'gmp_add' => ['GMP', 'a' => 'GMP|string|int', 'b' => 'GMP|string|int'], 'gmp_and' => ['GMP', 'a' => 'GMP|string|int', 'b' => 'GMP|string|int'], 'gmp_binomial' => ['GMP|false', 'n' => 'GMP|string|int', 'k' => 'int'], 'gmp_clrbit' => ['void', 'a' => 'GMP|string|int', 'index' => 'int'], 'gmp_cmp' => ['int', 'a' => 'GMP|string|int', 'b' => 'GMP|string|int'], 'gmp_com' => ['GMP', 'a' => 'GMP|string|int'], 'gmp_div' => ['resource', 'a' => 'GMP|resource|string', 'b' => 'GMP|resource|string', 'round=' => 'int'], 'gmp_div_q' => ['GMP', 'a' => 'GMP|string|int', 'b' => 'GMP|string|int', 'round=' => 'int'], 'gmp_div_qr' => ['array', 'a' => 'GMP|string|int', 'b' => 'GMP|string|int', 'round=' => 'int'], 'gmp_div_r' => ['GMP', 'a' => 'GMP|string|int', 'b' => 'GMP|string|int', 'round=' => 'int'], 'gmp_divexact' => ['GMP', 'a' => 'GMP|string|int', 'b' => 'GMP|string|int'], 'gmp_export' => ['string', 'gmpnumber' => 'GMP|string|int', 'word_size=' => 'int', 'options=' => 'int'], 'gmp_fact' => ['GMP', 'a' => 'int'], 'gmp_gcd' => ['GMP', 'a' => 'GMP|string|int', 'b' => 'GMP|string|int'], 'gmp_gcdext' => ['array', 'a' => 'GMP|string|int', 'b' => 'GMP|string|int'], 'gmp_hamdist' => ['int', 'a' => 'GMP|string|int', 'b' => 'GMP|string|int'], 'gmp_import' => ['GMP', 'data' => 'string', 'word_size=' => 'int', 'options=' => 'int'], 'gmp_init' => ['GMP', 'number' => 'int|string', 'base=' => 'int'], 'gmp_intval' => ['int', 'gmpnumber' => 'GMP|string|int'], 'gmp_invert' => ['GMP', 'a' => 'GMP|string|int', 'b' => 'GMP|string|int'], 'gmp_jacobi' => ['int', 'a' => 'GMP|string|int', 'b' => 'GMP|string|int'], 'gmp_kronecker' => ['int', 'a' => 'GMP|string|int', 'b' => 'GMP|string|int'], 'gmp_lcm' => ['GMP', 'a' => 'GMP|string|int', 'b' => 'GMP|string|int'], 'gmp_legendre' => ['int', 'a' => 'GMP|string|int', 'b' => 'GMP|string|int'], 'gmp_mod' => ['GMP', 'a' => 'GMP|string|int', 'b' => 'GMP|string|int'], 'gmp_mul' => ['GMP', 'a' => 'GMP|string|int', 'b' => 'GMP|string|int'], 'gmp_neg' => ['GMP', 'a' => 'GMP|string|int'], 'gmp_nextprime' => ['GMP', 'a' => 'GMP|string|int'], 'gmp_or' => ['GMP', 'a' => 'GMP|string|int', 'b' => 'GMP|string|int'], 'gmp_perfect_power' => ['bool', 'a' => 'GMP|string|int'], 'gmp_perfect_square' => ['bool', 'a' => 'GMP|string|int'], 'gmp_popcount' => ['int', 'a' => 'GMP|string|int'], 'gmp_pow' => ['GMP', 'base' => 'GMP|string|int', 'exp' => 'int'], 'gmp_powm' => ['GMP', 'base' => 'GMP|string|int', 'exp' => 'GMP|string|int', 'mod' => 'GMP|string|int'], 'gmp_prob_prime' => ['int', 'a' => 'GMP|string|int', 'reps=' => 'int'], 'gmp_random' => ['GMP', 'limiter=' => 'int'], 'gmp_random_bits' => ['GMP', 'bits' => 'int'], 'gmp_random_range' => ['GMP', 'min' => 'GMP|string|int', 'max' => 'GMP|string|int'], 'gmp_random_seed' => ['GMP', 'seed' => 'GMP|string|int'], 'gmp_root' => ['GMP', 'a' => 'GMP|string|int', 'nth' => 'int'], 'gmp_rootrem' => ['array<int,GMP>', 'a' => 'GMP|string|int', 'nth' => 'int'], 'gmp_scan0' => ['int', 'a' => 'GMP|string|int', 'start' => 'int'], 'gmp_scan1' => ['int', 'a' => 'GMP|string|int', 'start' => 'int'], 'gmp_setbit' => ['void', 'a' => 'GMP|string|int', 'index' => 'int', 'set_clear=' => 'bool'], 'gmp_sign' => ['int', 'a' => 'GMP|string|int'], 'gmp_sqrt' => ['GMP', 'a' => 'GMP|string|int'], 'gmp_sqrtrem' => ['array', 'a' => 'GMP|string|int'], 'gmp_strval' => ['string', 'gmpnumber' => 'GMP|string|int', 'base=' => 'int'], 'gmp_sub' => ['GMP', 'a' => 'GMP|string|int', 'b' => 'GMP|string|int'], 'gmp_testbit' => ['bool', 'a' => 'GMP|string|int', 'index' => 'int'], 'gmp_xor' => ['GMP', 'a' => 'GMP|string|int', 'b' => 'GMP|string|int'], 'gmstrftime' => ['string', 'format' => 'string', 'timestamp=' => 'int'], 'gnupg::adddecryptkey' => ['bool', 'fingerprint' => 'string', 'passphrase' => 'string'], 'gnupg::addencryptkey' => ['bool', 'fingerprint' => 'string'], 'gnupg::addsignkey' => ['bool', 'fingerprint' => 'string', 'passphrase=' => 'string'], 'gnupg::cleardecryptkeys' => ['bool'], 'gnupg::clearencryptkeys' => ['bool'], 'gnupg::clearsignkeys' => ['bool'], 'gnupg::decrypt' => ['string', 'text' => 'string'], 'gnupg::decryptverify' => ['array', 'text' => 'string', '&plaintext' => 'string'], 'gnupg::encrypt' => ['string', 'plaintext' => 'string'], 'gnupg::encryptsign' => ['string', 'plaintext' => 'string'], 'gnupg::export' => ['string', 'fingerprint' => 'string'], 'gnupg::geterror' => ['string'], 'gnupg::getprotocol' => ['int'], 'gnupg::import' => ['array', 'keydata' => 'string'], 'gnupg::init' => ['resource'], 'gnupg::keyinfo' => ['array', 'pattern' => 'string'], 'gnupg::setarmor' => ['bool', 'armor' => 'int'], 'gnupg::seterrormode' => ['void', 'errormode' => 'int'], 'gnupg::setsignmode' => ['bool', 'signmode' => 'int'], 'gnupg::sign' => ['string', 'plaintext' => 'string'], 'gnupg::verify' => ['array', 'signed_text' => 'string', 'signature' => 'string', '&plaintext=' => 'string'], 'gnupg_adddecryptkey' => ['bool', 'identifier' => 'resource', 'fingerprint' => 'string', 'passphrase' => 'string'], 'gnupg_addencryptkey' => ['bool', 'identifier' => 'resource', 'fingerprint' => 'string'], 'gnupg_addsignkey' => ['bool', 'identifier' => 'resource', 'fingerprint' => 'string', 'passphrase=' => 'string'], 'gnupg_cleardecryptkeys' => ['bool', 'identifier' => 'resource'], 'gnupg_clearencryptkeys' => ['bool', 'identifier' => 'resource'], 'gnupg_clearsignkeys' => ['bool', 'identifier' => 'resource'], 'gnupg_decrypt' => ['string', 'identifier' => 'resource', 'text' => 'string'], 'gnupg_decryptverify' => ['array', 'identifier' => 'resource', 'text' => 'string', 'plaintext' => 'string'], 'gnupg_encrypt' => ['string', 'identifier' => 'resource', 'plaintext' => 'string'], 'gnupg_encryptsign' => ['string', 'identifier' => 'resource', 'plaintext' => 'string'], 'gnupg_export' => ['string', 'identifier' => 'resource', 'fingerprint' => 'string'], 'gnupg_geterror' => ['string', 'identifier' => 'resource'], 'gnupg_getprotocol' => ['int', 'identifier' => 'resource'], 'gnupg_import' => ['array', 'identifier' => 'resource', 'keydata' => 'string'], 'gnupg_init' => ['resource'], 'gnupg_keyinfo' => ['array', 'identifier' => 'resource', 'pattern' => 'string'], 'gnupg_setarmor' => ['bool', 'identifier' => 'resource', 'armor' => 'int'], 'gnupg_seterrormode' => ['void', 'identifier' => 'resource', 'errormode' => 'int'], 'gnupg_setsignmode' => ['bool', 'identifier' => 'resource', 'signmode' => 'int'], 'gnupg_sign' => ['string', 'identifier' => 'resource', 'plaintext' => 'string'], 'gnupg_verify' => ['array', 'identifier' => 'resource', 'signed_text' => 'string', 'signature' => 'string', 'plaintext=' => 'string'], 'gopher_parsedir' => ['array', 'dirent' => 'string'], 'grapheme_extract' => ['string|false', 'str' => 'string', 'size' => 'int', 'extract_type=' => 'int', 'start=' => 'int', '&w_next=' => 'int'], 'grapheme_stripos' => ['int|false', 'haystack' => 'string', 'needle' => 'string', 'offset=' => 'int'], 'grapheme_stristr' => ['string|false', 'haystack' => 'string', 'needle' => 'string', 'part=' => 'bool'], 'grapheme_strlen' => ['int|false', 'str' => 'string'], 'grapheme_strpos' => ['int|false', 'haystack' => 'string', 'needle' => 'string', 'offset=' => 'int'], 'grapheme_strripos' => ['int|false', 'haystack' => 'string', 'needle' => 'string', 'offset=' => 'int'], 'grapheme_strrpos' => ['int|false', 'haystack' => 'string', 'needle' => 'string', 'offset=' => 'int'], 'grapheme_strstr' => ['string|false', 'haystack' => 'string', 'needle' => 'string', 'part=' => 'bool'], 'grapheme_substr' => ['string|false', 'str' => 'string', 'start' => 'int', 'length=' => 'int'], 'gregoriantojd' => ['int', 'month' => 'int', 'day' => 'int', 'year' => 'int'], 'gridObj::set' => ['int', 'property_name' => 'string', 'new_value' => ''], 'Grpc\\Call::__construct' => ['void', 'channel' => '_HumbugBoxb94336daae36\\Grpc\\Channel', 'method' => 'string', 'absolute_deadline' => '_HumbugBoxb94336daae36\\Grpc\\Timeval', 'host_override=' => 'mixed'], 'Grpc\\Call::cancel' => [''], 'Grpc\\Call::getPeer' => ['string'], 'Grpc\\Call::setCredentials' => ['int', 'creds_obj' => '_HumbugBoxb94336daae36\\Grpc\\CallCredentials'], 'Grpc\\Call::startBatch' => ['object', 'batch' => 'array'], 'Grpc\\CallCredentials::createComposite' => ['_HumbugBoxb94336daae36\\Grpc\\CallCredentials', 'cred1' => '_HumbugBoxb94336daae36\\Grpc\\CallCredentials', 'cred2' => '_HumbugBoxb94336daae36\\Grpc\\CallCredentials'], 'Grpc\\CallCredentials::createFromPlugin' => ['_HumbugBoxb94336daae36\\Grpc\\CallCredentials', 'callback' => 'Closure'], 'Grpc\\Channel::__construct' => ['void', 'target' => 'string', 'args=' => 'array'], 'Grpc\\Channel::close' => [''], 'Grpc\\Channel::getConnectivityState' => ['int', 'try_to_connect=' => 'bool|false'], 'Grpc\\Channel::getTarget' => ['string'], 'Grpc\\Channel::watchConnectivityState' => ['bool', 'last_state' => 'int', 'deadline_obj' => '_HumbugBoxb94336daae36\\Grpc\\Timeval'], 'Grpc\\ChannelCredentials::createComposite' => ['_HumbugBoxb94336daae36\\Grpc\\ChannelCredentials', 'cred1' => '_HumbugBoxb94336daae36\\Grpc\\ChannelCredentials', 'cred2' => '_HumbugBoxb94336daae36\\Grpc\\CallCredentials'], 'Grpc\\ChannelCredentials::createDefault' => ['_HumbugBoxb94336daae36\\Grpc\\ChannelCredentials'], 'Grpc\\ChannelCredentials::createInsecure' => ['null'], 'Grpc\\ChannelCredentials::createSsl' => ['_HumbugBoxb94336daae36\\Grpc\\ChannelCredentials', 'pem_root_certs' => 'string', 'pem_private_key=' => 'string', 'pem_cert_chain=' => 'string'], 'Grpc\\ChannelCredentials::setDefaultRootsPem' => ['', 'pem_roots' => 'string'], 'Grpc\\Server::__construct' => ['void', 'args' => 'array'], 'Grpc\\Server::addHttp2Port' => ['bool', 'addr' => 'string'], 'Grpc\\Server::addSecureHttp2Port' => ['bool', 'addr' => 'string', 'creds_obj' => '_HumbugBoxb94336daae36\\Grpc\\ServerCredentials'], 'Grpc\\Server::requestCall' => ['', 'tag_new' => 'int', 'tag_cancel' => 'int'], 'Grpc\\Server::start' => [''], 'Grpc\\ServerCredentials::createSsl' => ['object', 'pem_root_certs' => 'string', 'pem_private_key' => 'string', 'pem_cert_chain' => 'string'], 'Grpc\\Timeval::__construct' => ['void', 'usec' => 'int'], 'Grpc\\Timeval::add' => ['_HumbugBoxb94336daae36\\Grpc\\Timeval', 'other' => '_HumbugBoxb94336daae36\\Grpc\\Timeval'], 'Grpc\\Timeval::compare' => ['int', 'a' => '_HumbugBoxb94336daae36\\Grpc\\Timeval', 'b' => '_HumbugBoxb94336daae36\\Grpc\\Timeval'], 'Grpc\\Timeval::infFuture' => ['_HumbugBoxb94336daae36\\Grpc\\Timeval'], 'Grpc\\Timeval::infPast' => ['_HumbugBoxb94336daae36\\Grpc\\Timeval'], 'Grpc\\Timeval::now' => ['_HumbugBoxb94336daae36\\Grpc\\Timeval'], 'Grpc\\Timeval::similar' => ['bool', 'a' => '_HumbugBoxb94336daae36\\Grpc\\Timeval', 'b' => '_HumbugBoxb94336daae36\\Grpc\\Timeval', 'threshold' => '_HumbugBoxb94336daae36\\Grpc\\Timeval'], 'Grpc\\Timeval::sleepUntil' => [''], 'Grpc\\Timeval::subtract' => ['_HumbugBoxb94336daae36\\Grpc\\Timeval', 'other' => '_HumbugBoxb94336daae36\\Grpc\\Timeval'], 'Grpc\\Timeval::zero' => ['_HumbugBoxb94336daae36\\Grpc\\Timeval'], 'gupnp_context_get_host_ip' => ['string', 'context' => 'resource'], 'gupnp_context_get_port' => ['int', 'context' => 'resource'], 'gupnp_context_get_subscription_timeout' => ['int', 'context' => 'resource'], 'gupnp_context_host_path' => ['bool', 'context' => 'resource', 'local_path' => 'string', 'server_path' => 'string'], 'gupnp_context_new' => ['resource', 'host_ip=' => 'string', 'port=' => 'int'], 'gupnp_context_set_subscription_timeout' => ['void', 'context' => 'resource', 'timeout' => 'int'], 'gupnp_context_timeout_add' => ['bool', 'context' => 'resource', 'timeout' => 'int', 'callback' => 'mixed', 'arg=' => 'mixed'], 'gupnp_context_unhost_path' => ['bool', 'context' => 'resource', 'server_path' => 'string'], 'gupnp_control_point_browse_start' => ['bool', 'cpoint' => 'resource'], 'gupnp_control_point_browse_stop' => ['bool', 'cpoint' => 'resource'], 'gupnp_control_point_callback_set' => ['bool', 'cpoint' => 'resource', 'signal' => 'int', 'callback' => 'mixed', 'arg=' => 'mixed'], 'gupnp_control_point_new' => ['resource', 'context' => 'resource', 'target' => 'string'], 'gupnp_device_action_callback_set' => ['bool', 'root_device' => 'resource', 'signal' => 'int', 'action_name' => 'string', 'callback' => 'mixed', 'arg=' => 'mixed'], 'gupnp_device_info_get' => ['array', 'root_device' => 'resource'], 'gupnp_device_info_get_service' => ['resource', 'root_device' => 'resource', 'type' => 'string'], 'gupnp_root_device_get_available' => ['bool', 'root_device' => 'resource'], 'gupnp_root_device_get_relative_location' => ['string', 'root_device' => 'resource'], 'gupnp_root_device_new' => ['resource', 'context' => 'resource', 'location' => 'string', 'description_dir' => 'string'], 'gupnp_root_device_set_available' => ['bool', 'root_device' => 'resource', 'available' => 'bool'], 'gupnp_root_device_start' => ['bool', 'root_device' => 'resource'], 'gupnp_root_device_stop' => ['bool', 'root_device' => 'resource'], 'gupnp_service_action_get' => ['mixed', 'action' => 'resource', 'name' => 'string', 'type' => 'int'], 'gupnp_service_action_return' => ['bool', 'action' => 'resource'], 'gupnp_service_action_return_error' => ['bool', 'action' => 'resource', 'error_code' => 'int', 'error_description=' => 'string'], 'gupnp_service_action_set' => ['bool', 'action' => 'resource', 'name' => 'string', 'type' => 'int', 'value' => 'mixed'], 'gupnp_service_freeze_notify' => ['bool', 'service' => 'resource'], 'gupnp_service_info_get' => ['array', 'proxy' => 'resource'], 'gupnp_service_info_get_introspection' => ['mixed', 'proxy' => 'resource', 'callback=' => 'mixed', 'arg=' => 'mixed'], 'gupnp_service_introspection_get_state_variable' => ['array', 'introspection' => 'resource', 'variable_name' => 'string'], 'gupnp_service_notify' => ['bool', 'service' => 'resource', 'name' => 'string', 'type' => 'int', 'value' => 'mixed'], 'gupnp_service_proxy_action_get' => ['mixed', 'proxy' => 'resource', 'action' => 'string', 'name' => 'string', 'type' => 'int'], 'gupnp_service_proxy_action_set' => ['bool', 'proxy' => 'resource', 'action' => 'string', 'name' => 'string', 'value' => 'mixed', 'type' => 'int'], 'gupnp_service_proxy_add_notify' => ['bool', 'proxy' => 'resource', 'value' => 'string', 'type' => 'int', 'callback' => 'mixed', 'arg=' => 'mixed'], 'gupnp_service_proxy_callback_set' => ['bool', 'proxy' => 'resource', 'signal' => 'int', 'callback' => 'mixed', 'arg=' => 'mixed'], 'gupnp_service_proxy_get_subscribed' => ['bool', 'proxy' => 'resource'], 'gupnp_service_proxy_remove_notify' => ['bool', 'proxy' => 'resource', 'value' => 'string'], 'gupnp_service_proxy_send_action' => ['array', 'proxy' => 'resource', 'action' => 'string', 'in_params' => 'array', 'out_params' => 'array'], 'gupnp_service_proxy_set_subscribed' => ['bool', 'proxy' => 'resource', 'subscribed' => 'bool'], 'gupnp_service_thaw_notify' => ['bool', 'service' => 'resource'], 'gzclose' => ['bool', 'zp' => 'resource'], 'gzcompress' => ['string|false', 'data' => 'string', 'level=' => 'int', 'encoding=' => 'int'], 'gzdecode' => ['string|false', 'data' => 'string', 'length=' => 'int'], 'gzdeflate' => ['string|false', 'data' => 'string', 'level=' => 'int', 'encoding=' => 'int'], 'gzencode' => ['string|false', 'data' => 'string', 'level=' => 'int', 'encoding_mode=' => 'int'], 'gzeof' => ['int', 'zp' => 'resource'], 'gzfile' => ['array', 'filename' => 'string', 'use_include_path=' => 'int'], 'gzgetc' => ['string|false', 'zp' => 'resource'], 'gzgets' => ['string|false', 'zp' => 'resource', 'length=' => 'int'], 'gzgetss' => ['string|false', 'zp' => 'resource', 'length' => 'int', 'allowable_tags=' => 'string'], 'gzinflate' => ['string|false', 'data' => 'string', 'length=' => 'int'], 'gzopen' => ['resource|false', 'filename' => 'string', 'mode' => 'string', 'use_include_path=' => 'int'], 'gzpassthru' => ['int|false', 'zp' => 'resource'], 'gzputs' => ['int', 'zp' => 'resource', 'string' => 'string', 'length=' => 'int'], 'gzread' => ['string', 'zp' => 'resource', 'length' => 'int'], 'gzrewind' => ['bool', 'zp' => 'resource'], 'gzseek' => ['int', 'zp' => 'resource', 'offset' => 'int', 'whence=' => 'int'], 'gztell' => ['int|false', 'zp' => 'resource'], 'gzuncompress' => ['string|false', 'data' => 'string', 'length=' => 'int'], 'gzwrite' => ['int', 'zp' => 'resource', 'string' => 'string', 'length=' => 'int'], 'HaruAnnotation::setBorderStyle' => ['bool', 'width' => 'float', 'dash_on' => 'int', 'dash_off' => 'int'], 'HaruAnnotation::setHighlightMode' => ['bool', 'mode' => 'int'], 'HaruAnnotation::setIcon' => ['bool', 'icon' => 'int'], 'HaruAnnotation::setOpened' => ['bool', 'opened' => 'bool'], 'HaruDestination::setFit' => ['bool'], 'HaruDestination::setFitB' => ['bool'], 'HaruDestination::setFitBH' => ['bool', 'top' => 'float'], 'HaruDestination::setFitBV' => ['bool', 'left' => 'float'], 'HaruDestination::setFitH' => ['bool', 'top' => 'float'], 'HaruDestination::setFitR' => ['bool', 'left' => 'float', 'bottom' => 'float', 'right' => 'float', 'top' => 'float'], 'HaruDestination::setFitV' => ['bool', 'left' => 'float'], 'HaruDestination::setXYZ' => ['bool', 'left' => 'float', 'top' => 'float', 'zoom' => 'float'], 'HaruDoc::__construct' => ['void'], 'HaruDoc::addPage' => ['object'], 'HaruDoc::addPageLabel' => ['bool', 'first_page' => 'int', 'style' => 'int', 'first_num' => 'int', 'prefix=' => 'string'], 'HaruDoc::createOutline' => ['object', 'title' => 'string', 'parent_outline=' => 'object', 'encoder=' => 'object'], 'HaruDoc::getCurrentEncoder' => ['object'], 'HaruDoc::getCurrentPage' => ['object'], 'HaruDoc::getEncoder' => ['object', 'encoding' => 'string'], 'HaruDoc::getFont' => ['object', 'fontname' => 'string', 'encoding=' => 'string'], 'HaruDoc::getInfoAttr' => ['string', 'type' => 'int'], 'HaruDoc::getPageLayout' => ['int'], 'HaruDoc::getPageMode' => ['int'], 'HaruDoc::getStreamSize' => ['int'], 'HaruDoc::insertPage' => ['object', 'page' => 'object'], 'HaruDoc::loadJPEG' => ['object', 'filename' => 'string'], 'HaruDoc::loadPNG' => ['object', 'filename' => 'string', 'deferred=' => 'bool'], 'HaruDoc::loadRaw' => ['object', 'filename' => 'string', 'width' => 'int', 'height' => 'int', 'color_space' => 'int'], 'HaruDoc::loadTTC' => ['string', 'fontfile' => 'string', 'index' => 'int', 'embed=' => 'bool'], 'HaruDoc::loadTTF' => ['string', 'fontfile' => 'string', 'embed=' => 'bool'], 'HaruDoc::loadType1' => ['string', 'afmfile' => 'string', 'pfmfile=' => 'string'], 'HaruDoc::output' => ['bool'], 'HaruDoc::readFromStream' => ['string', 'bytes' => 'int'], 'HaruDoc::resetError' => ['bool'], 'HaruDoc::resetStream' => ['bool'], 'HaruDoc::save' => ['bool', 'file' => 'string'], 'HaruDoc::saveToStream' => ['bool'], 'HaruDoc::setCompressionMode' => ['bool', 'mode' => 'int'], 'HaruDoc::setCurrentEncoder' => ['bool', 'encoding' => 'string'], 'HaruDoc::setEncryptionMode' => ['bool', 'mode' => 'int', 'key_len=' => 'int'], 'HaruDoc::setInfoAttr' => ['bool', 'type' => 'int', 'info' => 'string'], 'HaruDoc::setInfoDateAttr' => ['bool', 'type' => 'int', 'year' => 'int', 'month' => 'int', 'day' => 'int', 'hour' => 'int', 'min' => 'int', 'sec' => 'int', 'ind' => 'string', 'off_hour' => 'int', 'off_min' => 'int'], 'HaruDoc::setOpenAction' => ['bool', 'destination' => 'object'], 'HaruDoc::setPageLayout' => ['bool', 'layout' => 'int'], 'HaruDoc::setPageMode' => ['bool', 'mode' => 'int'], 'HaruDoc::setPagesConfiguration' => ['bool', 'page_per_pages' => 'int'], 'HaruDoc::setPassword' => ['bool', 'owner_password' => 'string', 'user_password' => 'string'], 'HaruDoc::setPermission' => ['bool', 'permission' => 'int'], 'HaruDoc::useCNSEncodings' => ['bool'], 'HaruDoc::useCNSFonts' => ['bool'], 'HaruDoc::useCNTEncodings' => ['bool'], 'HaruDoc::useCNTFonts' => ['bool'], 'HaruDoc::useJPEncodings' => ['bool'], 'HaruDoc::useJPFonts' => ['bool'], 'HaruDoc::useKREncodings' => ['bool'], 'HaruDoc::useKRFonts' => ['bool'], 'HaruEncoder::getByteType' => ['int', 'text' => 'string', 'index' => 'int'], 'HaruEncoder::getType' => ['int'], 'HaruEncoder::getUnicode' => ['int', 'character' => 'int'], 'HaruEncoder::getWritingMode' => ['int'], 'HaruFont::getAscent' => ['int'], 'HaruFont::getCapHeight' => ['int'], 'HaruFont::getDescent' => ['int'], 'HaruFont::getEncodingName' => ['string'], 'HaruFont::getFontName' => ['string'], 'HaruFont::getTextWidth' => ['array', 'text' => 'string'], 'HaruFont::getUnicodeWidth' => ['int', 'character' => 'int'], 'HaruFont::getXHeight' => ['int'], 'HaruFont::measureText' => ['int', 'text' => 'string', 'width' => 'float', 'font_size' => 'float', 'char_space' => 'float', 'word_space' => 'float', 'word_wrap=' => 'bool'], 'HaruImage::getBitsPerComponent' => ['int'], 'HaruImage::getColorSpace' => ['string'], 'HaruImage::getHeight' => ['int'], 'HaruImage::getSize' => ['array'], 'HaruImage::getWidth' => ['int'], 'HaruImage::setColorMask' => ['bool', 'rmin' => 'int', 'rmax' => 'int', 'gmin' => 'int', 'gmax' => 'int', 'bmin' => 'int', 'bmax' => 'int'], 'HaruImage::setMaskImage' => ['bool', 'mask_image' => 'object'], 'HaruOutline::setDestination' => ['bool', 'destination' => 'object'], 'HaruOutline::setOpened' => ['bool', 'opened' => 'bool'], 'HaruPage::arc' => ['bool', 'x' => 'float', 'y' => 'float', 'ray' => 'float', 'ang1' => 'float', 'ang2' => 'float'], 'HaruPage::beginText' => ['bool'], 'HaruPage::circle' => ['bool', 'x' => 'float', 'y' => 'float', 'ray' => 'float'], 'HaruPage::closePath' => ['bool'], 'HaruPage::concat' => ['bool', 'a' => 'float', 'b' => 'float', 'c' => 'float', 'd' => 'float', 'x' => 'float', 'y' => 'float'], 'HaruPage::createDestination' => ['object'], 'HaruPage::createLinkAnnotation' => ['object', 'rectangle' => 'array', 'destination' => 'object'], 'HaruPage::createTextAnnotation' => ['object', 'rectangle' => 'array', 'text' => 'string', 'encoder=' => 'object'], 'HaruPage::createURLAnnotation' => ['object', 'rectangle' => 'array', 'url' => 'string'], 'HaruPage::curveTo' => ['bool', 'x1' => 'float', 'y1' => 'float', 'x2' => 'float', 'y2' => 'float', 'x3' => 'float', 'y3' => 'float'], 'HaruPage::curveTo2' => ['bool', 'x2' => 'float', 'y2' => 'float', 'x3' => 'float', 'y3' => 'float'], 'HaruPage::curveTo3' => ['bool', 'x1' => 'float', 'y1' => 'float', 'x3' => 'float', 'y3' => 'float'], 'HaruPage::drawImage' => ['bool', 'image' => 'object', 'x' => 'float', 'y' => 'float', 'width' => 'float', 'height' => 'float'], 'HaruPage::ellipse' => ['bool', 'x' => 'float', 'y' => 'float', 'xray' => 'float', 'yray' => 'float'], 'HaruPage::endPath' => ['bool'], 'HaruPage::endText' => ['bool'], 'HaruPage::eofill' => ['bool'], 'HaruPage::eoFillStroke' => ['bool', 'close_path=' => 'bool'], 'HaruPage::fill' => ['bool'], 'HaruPage::fillStroke' => ['bool', 'close_path=' => 'bool'], 'HaruPage::getCharSpace' => ['float'], 'HaruPage::getCMYKFill' => ['array'], 'HaruPage::getCMYKStroke' => ['array'], 'HaruPage::getCurrentFont' => ['object'], 'HaruPage::getCurrentFontSize' => ['float'], 'HaruPage::getCurrentPos' => ['array'], 'HaruPage::getCurrentTextPos' => ['array'], 'HaruPage::getDash' => ['array'], 'HaruPage::getFillingColorSpace' => ['int'], 'HaruPage::getFlatness' => ['float'], 'HaruPage::getGMode' => ['int'], 'HaruPage::getGrayFill' => ['float'], 'HaruPage::getGrayStroke' => ['float'], 'HaruPage::getHeight' => ['float'], 'HaruPage::getHorizontalScaling' => ['float'], 'HaruPage::getLineCap' => ['int'], 'HaruPage::getLineJoin' => ['int'], 'HaruPage::getLineWidth' => ['float'], 'HaruPage::getMiterLimit' => ['float'], 'HaruPage::getRGBFill' => ['array'], 'HaruPage::getRGBStroke' => ['array'], 'HaruPage::getStrokingColorSpace' => ['int'], 'HaruPage::getTextLeading' => ['float'], 'HaruPage::getTextMatrix' => ['array'], 'HaruPage::getTextRenderingMode' => ['int'], 'HaruPage::getTextRise' => ['float'], 'HaruPage::getTextWidth' => ['float', 'text' => 'string'], 'HaruPage::getTransMatrix' => ['array'], 'HaruPage::getWidth' => ['float'], 'HaruPage::getWordSpace' => ['float'], 'HaruPage::lineTo' => ['bool', 'x' => 'float', 'y' => 'float'], 'HaruPage::measureText' => ['int', 'text' => 'string', 'width' => 'float', 'wordwrap=' => 'bool'], 'HaruPage::moveTextPos' => ['bool', 'x' => 'float', 'y' => 'float', 'set_leading=' => 'bool'], 'HaruPage::moveTo' => ['bool', 'x' => 'float', 'y' => 'float'], 'HaruPage::moveToNextLine' => ['bool'], 'HaruPage::rectangle' => ['bool', 'x' => 'float', 'y' => 'float', 'width' => 'float', 'height' => 'float'], 'HaruPage::setCharSpace' => ['bool', 'char_space' => 'float'], 'HaruPage::setCMYKFill' => ['bool', 'c' => 'float', 'm' => 'float', 'y' => 'float', 'k' => 'float'], 'HaruPage::setCMYKStroke' => ['bool', 'c' => 'float', 'm' => 'float', 'y' => 'float', 'k' => 'float'], 'HaruPage::setDash' => ['bool', 'pattern' => 'array', 'phase' => 'int'], 'HaruPage::setFlatness' => ['bool', 'flatness' => 'float'], 'HaruPage::setFontAndSize' => ['bool', 'font' => 'object', 'size' => 'float'], 'HaruPage::setGrayFill' => ['bool', 'value' => 'float'], 'HaruPage::setGrayStroke' => ['bool', 'value' => 'float'], 'HaruPage::setHeight' => ['bool', 'height' => 'float'], 'HaruPage::setHorizontalScaling' => ['bool', 'scaling' => 'float'], 'HaruPage::setLineCap' => ['bool', 'cap' => 'int'], 'HaruPage::setLineJoin' => ['bool', 'join' => 'int'], 'HaruPage::setLineWidth' => ['bool', 'width' => 'float'], 'HaruPage::setMiterLimit' => ['bool', 'limit' => 'float'], 'HaruPage::setRGBFill' => ['bool', 'r' => 'float', 'g' => 'float', 'b' => 'float'], 'HaruPage::setRGBStroke' => ['bool', 'r' => 'float', 'g' => 'float', 'b' => 'float'], 'HaruPage::setRotate' => ['bool', 'angle' => 'int'], 'HaruPage::setSize' => ['bool', 'size' => 'int', 'direction' => 'int'], 'HaruPage::setSlideShow' => ['bool', 'type' => 'int', 'disp_time' => 'float', 'trans_time' => 'float'], 'HaruPage::setTextLeading' => ['bool', 'text_leading' => 'float'], 'HaruPage::setTextMatrix' => ['bool', 'a' => 'float', 'b' => 'float', 'c' => 'float', 'd' => 'float', 'x' => 'float', 'y' => 'float'], 'HaruPage::setTextRenderingMode' => ['bool', 'mode' => 'int'], 'HaruPage::setTextRise' => ['bool', 'rise' => 'float'], 'HaruPage::setWidth' => ['bool', 'width' => 'float'], 'HaruPage::setWordSpace' => ['bool', 'word_space' => 'float'], 'HaruPage::showText' => ['bool', 'text' => 'string'], 'HaruPage::showTextNextLine' => ['bool', 'text' => 'string', 'word_space=' => 'float', 'char_space=' => 'float'], 'HaruPage::stroke' => ['bool', 'close_path=' => 'bool'], 'HaruPage::textOut' => ['bool', 'x' => 'float', 'y' => 'float', 'text' => 'string'], 'HaruPage::textRect' => ['bool', 'left' => 'float', 'top' => 'float', 'right' => 'float', 'bottom' => 'float', 'text' => 'string', 'align=' => 'int'], 'hash' => ['string', 'algo' => 'string', 'data' => 'string', 'raw_output=' => 'bool'], 'hash_algos' => ['array'], 'hash_copy' => ['HashContext', 'context' => 'HashContext'], 'hash_equals' => ['bool', 'known_string' => 'string', 'user_string' => 'string'], 'hash_file' => ['string', 'algo' => 'string', 'filename' => 'string', 'raw_output=' => 'bool'], 'hash_final' => ['string', 'context' => 'HashContext', 'raw_output=' => 'bool'], 'hash_hkdf' => ['string', 'algo' => 'string', 'ikm' => 'string', 'length=' => 'int', 'info=' => 'string', 'salt=' => 'string'], 'hash_hmac' => ['string', 'algo' => 'string', 'data' => 'string', 'key' => 'string', 'raw_output=' => 'bool'], 'hash_hmac_algos' => ['array<int,string>'], 'hash_hmac_file' => ['string', 'algo' => 'string', 'filename' => 'string', 'key' => 'string', 'raw_output=' => 'bool'], 'hash_init' => ['HashContext', 'algo' => 'string', 'options=' => 'int', 'key=' => 'string'], 'hash_pbkdf2' => ['string', 'algo' => 'string', 'password' => 'string', 'salt' => 'string', 'iterations' => 'int', 'length=' => 'int', 'raw_output=' => 'bool'], 'hash_update' => ['bool', 'context' => 'HashContext', 'data' => 'string'], 'hash_update_file' => ['bool', 'context=' => 'HashContext', 'filename' => 'string', 'scontext=' => '?HashContext'], 'hash_update_stream' => ['int', 'context' => 'HashContext', 'handle' => 'resource', 'length=' => 'int'], 'hashTableObj::clear' => ['void'], 'hashTableObj::get' => ['string', 'key' => 'string'], 'hashTableObj::nextkey' => ['string', 'previousKey' => 'string'], 'hashTableObj::remove' => ['int', 'key' => 'string'], 'hashTableObj::set' => ['int', 'key' => 'string', 'value' => 'string'], 'header' => ['void', 'header' => 'string', 'replace=' => 'bool', 'http_response_code=' => 'int'], 'header_register_callback' => ['bool', 'callback' => 'callable'], 'header_remove' => ['void', 'name=' => 'string'], 'headers_list' => ['array'], 'headers_sent' => ['bool', '&w_file=' => 'string', '&w_line=' => 'int'], 'hebrev' => ['string', 'str' => 'string', 'max_chars_per_line=' => 'int'], 'hebrevc' => ['string', 'str' => 'string', 'max_chars_per_line=' => 'int'], 'hex2bin' => ['string|false', 'data' => 'string'], 'hexdec' => ['int|float', 'hexadecimal_number' => 'string'], 'highlight_file' => ['string|bool', 'file_name' => 'string', 'return=' => 'bool'], 'highlight_string' => ['string|bool', 'string' => 'string', 'return=' => 'bool'], 'hrtime' => ['array|integer|float', 'get_as_number' => 'bool'], 'HRTime\\PerformanceCounter::getElapsedTicks' => ['int'], 'HRTime\\PerformanceCounter::getFrequency' => ['int'], 'HRTime\\PerformanceCounter::getLastElapsedTicks' => ['int'], 'HRTime\\PerformanceCounter::getTicks' => ['int'], 'HRTime\\PerformanceCounter::getTicksSince' => ['int', 'start' => 'int'], 'HRTime\\PerformanceCounter::isRunning' => ['bool'], 'HRTime\\PerformanceCounter::start' => ['void'], 'HRTime\\PerformanceCounter::stop' => ['void'], 'HRTime\\StopWatch::getElapsedTicks' => ['int'], 'HRTime\\StopWatch::getElapsedTime' => ['float', 'unit=' => 'int'], 'HRTime\\StopWatch::getLastElapsedTicks' => ['int'], 'HRTime\\StopWatch::getLastElapsedTime' => ['float', 'unit=' => 'int'], 'HRTime\\StopWatch::isRunning' => ['bool'], 'HRTime\\StopWatch::start' => ['void'], 'HRTime\\StopWatch::stop' => ['void'], 'html_entity_decode' => ['string', 'string' => 'string', 'quote_style=' => 'int', 'encoding=' => 'string'], 'htmlentities' => ['string', 'string' => 'string', 'quote_style=' => 'int', 'encoding=' => 'string', 'double_encode=' => 'bool'], 'htmlspecialchars' => ['string', 'string' => 'string', 'quote_style=' => 'int', 'encoding=' => 'string', 'double_encode=' => 'bool'], 'htmlspecialchars_decode' => ['string', 'string' => 'string', 'quote_style=' => 'int'], 'http\\Env\\Request::__construct' => ['void'], 'http\\Env\\Request::getCookie' => ['mixed', 'name=' => 'string', 'type=' => 'mixed', 'defval=' => 'mixed', 'delete=' => 'bool|false'], 'http\\Env\\Request::getFiles' => ['array'], 'http\\Env\\Request::getForm' => ['mixed', 'name=' => 'string', 'type=' => 'mixed', 'defval=' => 'mixed', 'delete=' => 'bool|false'], 'http\\Env\\Request::getQuery' => ['mixed', 'name=' => 'string', 'type=' => 'mixed', 'defval=' => 'mixed', 'delete=' => 'bool|false'], 'http\\Env\\Response::__construct' => ['void'], 'http\\Env\\Response::__invoke' => ['bool', 'data' => 'string', 'ob_flags=' => 'int'], 'http\\Env\\Response::isCachedByETag' => ['int', 'header_name=' => 'string'], 'http\\Env\\Response::isCachedByLastModified' => ['int', 'header_name=' => 'string'], 'http\\Env\\Response::send' => ['bool', 'stream=' => 'resource'], 'http\\Env\\Response::setCacheControl' => ['_HumbugBoxb94336daae36\\http\\Env\\Response', 'cache_control' => 'string'], 'http\\Env\\Response::setContentDisposition' => ['_HumbugBoxb94336daae36\\http\\Env\\Response', 'disposition_params' => 'array'], 'http\\Env\\Response::setContentEncoding' => ['_HumbugBoxb94336daae36\\http\\Env\\Response', 'content_encoding' => 'int'], 'http\\Env\\Response::setContentType' => ['_HumbugBoxb94336daae36\\http\\Env\\Response', 'content_type' => 'string'], 'http\\Env\\Response::setCookie' => ['_HumbugBoxb94336daae36\\http\\Env\\Response', 'cookie' => 'mixed'], 'http\\Env\\Response::setEnvRequest' => ['_HumbugBoxb94336daae36\\http\\Env\\Response', 'env_request' => '_HumbugBoxb94336daae36\\http\\Message'], 'http\\Env\\Response::setEtag' => ['_HumbugBoxb94336daae36\\http\\Env\\Response', 'etag' => 'string'], 'http\\Env\\Response::setLastModified' => ['_HumbugBoxb94336daae36\\http\\Env\\Response', 'last_modified' => 'int'], 'http\\Env\\Response::setThrottleRate' => ['_HumbugBoxb94336daae36\\http\\Env\\Response', 'chunk_size' => 'int', 'delay=' => 'float|int'], 'http\\QueryString::__construct' => ['void', 'querystring' => 'string'], 'http\\QueryString::__toString' => ['string'], 'http\\QueryString::get' => ['', 'name=' => 'string', 'type=' => 'mixed', 'defval=' => 'mixed', 'delete=' => 'bool|false'], 'http\\QueryString::getArray' => ['array', 'name' => 'string', 'defval=' => 'mixed', 'delete=' => 'bool|false'], 'http\\QueryString::getBool' => ['bool', 'name' => 'string', 'defval=' => 'mixed', 'delete=' => 'bool|false'], 'http\\QueryString::getFloat' => ['float', 'name' => 'string', 'defval=' => 'mixed', 'delete=' => 'bool|false'], 'http\\QueryString::getGlobalInstance' => ['_HumbugBoxb94336daae36\\http\\QueryString'], 'http\\QueryString::getInt' => ['int', 'name' => 'string', 'defval=' => 'mixed', 'delete=' => 'bool|false'], 'http\\QueryString::getIterator' => ['IteratorAggregate'], 'http\\QueryString::getObject' => ['', 'name' => 'string', 'defval=' => 'mixed', 'delete=' => 'bool|false'], 'http\\QueryString::getString' => ['string', 'name' => 'string', 'defval=' => 'mixed', 'delete=' => 'bool|false'], 'http\\QueryString::mod' => ['_HumbugBoxb94336daae36\\http\\QueryString', 'params=' => 'mixed'], 'http\\QueryString::offsetExists' => ['bool', 'offset' => 'mixed'], 'http\\QueryString::offsetGet' => ['mixed', 'offset' => 'mixed'], 'http\\QueryString::offsetSet' => ['void', 'offset' => 'mixed', 'value' => 'mixed'], 'http\\QueryString::offsetUnset' => ['void', 'offset' => 'mixed'], 'http\\QueryString::serialize' => ['string'], 'http\\QueryString::set' => ['_HumbugBoxb94336daae36\\http\\QueryString', 'params' => 'mixed'], 'http\\QueryString::toArray' => ['mixed[]'], 'http\\QueryString::toString' => ['string'], 'http\\QueryString::unserialize' => ['void', 'serialized' => ''], 'http\\QueryString::xlate' => ['_HumbugBoxb94336daae36\\http\\QueryString'], 'http\\Url::__construct' => ['void', 'old_url=' => 'mixed', 'new_url=' => 'mixed', 'flags=' => 'int'], 'http\\Url::__toString' => [''], 'http\\Url::mod' => ['_HumbugBoxb94336daae36\\http\\Url', 'parts' => 'mixed', 'flags=' => 'float|int|mixed'], 'http\\Url::toArray' => ['string[]'], 'http\\Url::toString' => ['string'], 'http_build_cookie' => ['string', 'cookie' => 'array'], 'http_build_query' => ['string', 'querydata' => 'array|object', 'prefix=' => 'string', 'arg_separator=' => 'string', 'enc_type=' => 'int'], 'http_build_str' => ['string', 'query' => 'array', 'prefix=' => '?string', 'arg_separator=' => 'string'], 'http_build_url' => ['string', 'url=' => 'string|array', 'parts=' => 'string|array', 'flags=' => 'int', 'new_url=' => 'array'], 'http_cache_etag' => ['bool', 'etag=' => 'string'], 'http_cache_last_modified' => ['bool', 'timestamp_or_expires=' => 'int'], 'http_chunked_decode' => ['string', 'encoded' => 'string'], 'http_date' => ['string', 'timestamp=' => 'int'], 'http_deflate' => ['string', 'data' => 'string', 'flags=' => 'int'], 'http_get' => ['string', 'url' => 'string', 'options=' => 'array', 'info=' => 'array'], 'http_get_request_body' => ['string'], 'http_get_request_body_stream' => ['resource'], 'http_get_request_headers' => ['array'], 'http_head' => ['string', 'url' => 'string', 'options=' => 'array', 'info=' => 'array'], 'http_inflate' => ['string', 'data' => 'string'], 'http_match_etag' => ['bool', 'etag' => 'string', 'for_range=' => 'bool'], 'http_match_modified' => ['bool', 'timestamp=' => 'int', 'for_range=' => 'bool'], 'http_match_request_header' => ['bool', 'header' => 'string', 'value' => 'string', 'match_case=' => 'bool'], 'http_negotiate_charset' => ['string', 'supported' => 'array', 'result=' => 'array'], 'http_negotiate_content_type' => ['string', 'supported' => 'array', 'result=' => 'array'], 'http_negotiate_language' => ['string', 'supported' => 'array', 'result=' => 'array'], 'http_parse_cookie' => ['object', 'cookie' => 'string', 'flags=' => 'int', 'allowed_extras=' => 'array'], 'http_parse_headers' => ['array', 'header' => 'string'], 'http_parse_message' => ['object', 'message' => 'string'], 'http_parse_params' => ['object', 'param' => 'string', 'flags=' => 'int'], 'http_persistent_handles_clean' => ['string', 'ident=' => 'string'], 'http_persistent_handles_count' => ['object'], 'http_persistent_handles_ident' => ['string', 'ident=' => 'string'], 'http_post_data' => ['string', 'url' => 'string', 'data' => 'string', 'options=' => 'array', 'info=' => 'array'], 'http_post_fields' => ['string', 'url' => 'string', 'data' => 'array', 'files=' => 'array', 'options=' => 'array', 'info=' => 'array'], 'http_put_data' => ['string', 'url' => 'string', 'data' => 'string', 'options=' => 'array', 'info=' => 'array'], 'http_put_file' => ['string', 'url' => 'string', 'file' => 'string', 'options=' => 'array', 'info=' => 'array'], 'http_put_stream' => ['string', 'url' => 'string', 'stream' => '', 'options=' => 'array', 'info=' => 'array'], 'http_redirect' => ['bool', 'url=' => 'string', 'params=' => 'array', 'session=' => 'bool', 'status=' => 'int'], 'http_request' => ['string', 'method' => 'int', 'url' => 'string', 'body=' => 'string', 'options=' => 'array', 'info=' => 'array'], 'http_request_body_encode' => ['string', 'fields' => 'array', 'files' => 'array'], 'http_request_method_exists' => ['int', 'method' => ''], 'http_request_method_name' => ['string', 'method' => 'int'], 'http_request_method_register' => ['int', 'method' => 'string'], 'http_request_method_unregister' => ['bool', 'method' => ''], 'http_response_code' => ['int|bool', 'response_code=' => 'int'], 'http_send_content_disposition' => ['bool', 'filename' => 'string', 'inline=' => 'bool'], 'http_send_content_type' => ['bool', 'content_type=' => 'string'], 'http_send_data' => ['bool', 'data' => 'string'], 'http_send_file' => ['bool', 'file' => 'string'], 'http_send_last_modified' => ['bool', 'timestamp=' => 'int'], 'http_send_status' => ['bool', 'status' => 'int'], 'http_send_stream' => ['bool', 'stream' => ''], 'http_support' => ['int', 'feature=' => 'int'], 'http_throttle' => ['', 'sec' => 'float', 'bytes=' => 'int'], 'HttpDeflateStream::__construct' => ['void', 'flags=' => 'int'], 'HttpDeflateStream::factory' => ['HttpDeflateStream', 'flags=' => 'int', 'class_name=' => 'string'], 'HttpDeflateStream::finish' => ['string', 'data=' => 'string'], 'HttpDeflateStream::flush' => ['string', 'data=' => 'string'], 'HttpDeflateStream::update' => ['string', 'data' => 'string'], 'HttpInflateStream::__construct' => ['void', 'flags=' => 'int'], 'HttpInflateStream::factory' => ['HttpInflateStream', 'flags=' => 'int', 'class_name=' => 'string'], 'HttpInflateStream::finish' => ['string', 'data=' => 'string'], 'HttpInflateStream::flush' => ['string', 'data=' => 'string'], 'HttpInflateStream::update' => ['string', 'data' => 'string'], 'HttpMessage::__construct' => ['void', 'message=' => 'string'], 'HttpMessage::__toString' => ['string'], 'HttpMessage::addHeaders' => ['', 'headers' => 'array', 'append=' => 'bool'], 'HttpMessage::count' => ['int'], 'HttpMessage::current' => ['mixed'], 'HttpMessage::detach' => ['HttpMessage'], 'HttpMessage::factory' => ['HttpMessage', 'raw_message=' => 'string', 'class_name=' => 'string'], 'HttpMessage::fromEnv' => ['HttpMessage', 'message_type' => 'int', 'class_name=' => 'string'], 'HttpMessage::fromString' => ['HttpMessage', 'raw_message=' => 'string', 'class_name=' => 'string'], 'HttpMessage::getBody' => ['string'], 'HttpMessage::getHeader' => ['string', 'header' => 'string'], 'HttpMessage::getHeaders' => ['array'], 'HttpMessage::getHttpVersion' => ['string'], 'HttpMessage::getInfo' => [''], 'HttpMessage::getParentMessage' => ['HttpMessage'], 'HttpMessage::getRequestMethod' => ['string'], 'HttpMessage::getRequestUrl' => ['string'], 'HttpMessage::getResponseCode' => ['int'], 'HttpMessage::getResponseStatus' => ['string'], 'HttpMessage::getType' => ['int'], 'HttpMessage::guessContentType' => ['string', 'magic_file' => 'string', 'magic_mode=' => 'int'], 'HttpMessage::key' => ['int|string'], 'HttpMessage::next' => ['void'], 'HttpMessage::prepend' => ['', 'message' => 'httpmessage', 'top=' => 'bool'], 'HttpMessage::reverse' => ['HttpMessage'], 'HttpMessage::rewind' => ['void'], 'HttpMessage::send' => ['bool'], 'HttpMessage::serialize' => ['string'], 'HttpMessage::setBody' => ['', 'body' => 'string'], 'HttpMessage::setHeaders' => ['', 'headers' => 'array'], 'HttpMessage::setHttpVersion' => ['bool', 'version' => 'string'], 'HttpMessage::setInfo' => ['', 'http_info' => ''], 'HttpMessage::setRequestMethod' => ['bool', 'method' => 'string'], 'HttpMessage::setRequestUrl' => ['bool', 'url' => 'string'], 'HttpMessage::setResponseCode' => ['bool', 'code' => 'int'], 'HttpMessage::setResponseStatus' => ['bool', 'status' => 'string'], 'HttpMessage::setType' => ['', 'type' => 'int'], 'HttpMessage::toMessageTypeObject' => ['HttpRequest|HttpResponse'], 'HttpMessage::toString' => ['string', 'include_parent=' => 'bool'], 'HttpMessage::unserialize' => ['void', 'serialized' => ''], 'HttpMessage::valid' => ['bool'], 'HttpQueryString::__construct' => ['void', 'global=' => 'bool', 'add=' => ''], 'HttpQueryString::__toString' => ['string'], 'HttpQueryString::factory' => ['', 'global' => '', 'params' => '', 'class_name' => ''], 'HttpQueryString::get' => ['', 'key=' => 'string', 'type=' => '', 'defval=' => '', 'delete=' => 'bool'], 'HttpQueryString::getArray' => ['', 'name' => '', 'defval' => '', 'delete' => ''], 'HttpQueryString::getBool' => ['', 'name' => '', 'defval' => '', 'delete' => ''], 'HttpQueryString::getFloat' => ['', 'name' => '', 'defval' => '', 'delete' => ''], 'HttpQueryString::getInt' => ['', 'name' => '', 'defval' => '', 'delete' => ''], 'HttpQueryString::getObject' => ['', 'name' => '', 'defval' => '', 'delete' => ''], 'HttpQueryString::getString' => ['', 'name' => '', 'defval' => '', 'delete' => ''], 'HttpQueryString::mod' => ['HttpQueryString', 'params' => ''], 'HttpQueryString::offsetExists' => ['bool', 'offset' => 'mixed'], 'HttpQueryString::offsetGet' => ['mixed', 'offset' => 'mixed'], 'HttpQueryString::offsetSet' => ['void', 'offset' => 'mixed', 'value' => 'mixed'], 'HttpQueryString::offsetUnset' => ['void', 'offset' => 'mixed'], 'HttpQueryString::serialize' => ['string'], 'HttpQueryString::set' => ['string', 'params' => ''], 'HttpQueryString::singleton' => ['HttpQueryString', 'global=' => 'bool'], 'HttpQueryString::toArray' => ['array'], 'HttpQueryString::toString' => ['string'], 'HttpQueryString::unserialize' => ['void', 'serialized' => 'string'], 'HttpQueryString::xlate' => ['bool', 'ie' => 'string', 'oe' => 'string'], 'HttpRequest::__construct' => ['void', 'url=' => 'string', 'request_method=' => 'int', 'options=' => 'array'], 'HttpRequest::addBody' => ['', 'request_body_data' => ''], 'HttpRequest::addCookies' => ['bool', 'cookies' => 'array'], 'HttpRequest::addHeaders' => ['bool', 'headers' => 'array'], 'HttpRequest::addPostFields' => ['bool', 'post_data' => 'array'], 'HttpRequest::addPostFile' => ['bool', 'name' => 'string', 'file' => 'string', 'content_type=' => 'string'], 'HttpRequest::addPutData' => ['bool', 'put_data' => 'string'], 'HttpRequest::addQueryData' => ['bool', 'query_params' => 'array'], 'HttpRequest::addRawPostData' => ['bool', 'raw_post_data' => 'string'], 'HttpRequest::addSslOptions' => ['bool', 'options' => 'array'], 'HttpRequest::clearHistory' => [''], 'HttpRequest::enableCookies' => ['bool'], 'HttpRequest::encodeBody' => ['', 'fields' => '', 'files' => ''], 'HttpRequest::factory' => ['', 'url' => '', 'method' => '', 'options' => '', 'class_name' => ''], 'HttpRequest::flushCookies' => [''], 'HttpRequest::get' => ['', 'url' => '', 'options' => '', '&info' => ''], 'HttpRequest::getBody' => [''], 'HttpRequest::getContentType' => ['string'], 'HttpRequest::getCookies' => ['array'], 'HttpRequest::getHeaders' => ['array'], 'HttpRequest::getHistory' => ['HttpMessage'], 'HttpRequest::getMethod' => ['int'], 'HttpRequest::getOptions' => ['array'], 'HttpRequest::getPostFields' => ['array'], 'HttpRequest::getPostFiles' => ['array'], 'HttpRequest::getPutData' => ['string'], 'HttpRequest::getPutFile' => ['string'], 'HttpRequest::getQueryData' => ['string'], 'HttpRequest::getRawPostData' => ['string'], 'HttpRequest::getRawRequestMessage' => ['string'], 'HttpRequest::getRawResponseMessage' => ['string'], 'HttpRequest::getRequestMessage' => ['HttpMessage'], 'HttpRequest::getResponseBody' => ['string'], 'HttpRequest::getResponseCode' => ['int'], 'HttpRequest::getResponseCookies' => ['array', 'flags=' => 'int', 'allowed_extras=' => 'array'], 'HttpRequest::getResponseData' => ['array'], 'HttpRequest::getResponseHeader' => ['', 'name=' => 'string'], 'HttpRequest::getResponseInfo' => ['', 'name=' => 'string'], 'HttpRequest::getResponseMessage' => ['HttpMessage'], 'HttpRequest::getResponseStatus' => ['string'], 'HttpRequest::getSslOptions' => ['array'], 'HttpRequest::getUrl' => ['string'], 'HttpRequest::head' => ['', 'url' => '', 'options' => '', '&info' => ''], 'HttpRequest::methodExists' => ['', 'method' => ''], 'HttpRequest::methodName' => ['', 'method_id' => ''], 'HttpRequest::methodRegister' => ['', 'method_name' => ''], 'HttpRequest::methodUnregister' => ['', 'method' => ''], 'HttpRequest::postData' => ['', 'url' => '', 'data' => '', 'options' => '', '&info' => ''], 'HttpRequest::postFields' => ['', 'url' => '', 'data' => '', 'options' => '', '&info' => ''], 'HttpRequest::putData' => ['', 'url' => '', 'data' => '', 'options' => '', '&info' => ''], 'HttpRequest::putFile' => ['', 'url' => '', 'file' => '', 'options' => '', '&info' => ''], 'HttpRequest::putStream' => ['', 'url' => '', 'stream' => '', 'options' => '', '&info' => ''], 'HttpRequest::resetCookies' => ['bool', 'session_only=' => 'bool'], 'HttpRequest::send' => ['HttpMessage'], 'HttpRequest::setBody' => ['bool', 'request_body_data=' => 'string'], 'HttpRequest::setContentType' => ['bool', 'content_type' => 'string'], 'HttpRequest::setCookies' => ['bool', 'cookies=' => 'array'], 'HttpRequest::setHeaders' => ['bool', 'headers=' => 'array'], 'HttpRequest::setMethod' => ['bool', 'request_method' => 'int'], 'HttpRequest::setOptions' => ['bool', 'options=' => 'array'], 'HttpRequest::setPostFields' => ['bool', 'post_data' => 'array'], 'HttpRequest::setPostFiles' => ['bool', 'post_files' => 'array'], 'HttpRequest::setPutData' => ['bool', 'put_data=' => 'string'], 'HttpRequest::setPutFile' => ['bool', 'file=' => 'string'], 'HttpRequest::setQueryData' => ['bool', 'query_data' => ''], 'HttpRequest::setRawPostData' => ['bool', 'raw_post_data=' => 'string'], 'HttpRequest::setSslOptions' => ['bool', 'options=' => 'array'], 'HttpRequest::setUrl' => ['bool', 'url' => 'string'], 'HttpRequestDataShare::__construct' => ['void'], 'HttpRequestDataShare::__destruct' => [''], 'HttpRequestDataShare::attach' => ['', 'request' => 'HttpRequest'], 'HttpRequestDataShare::count' => ['int'], 'HttpRequestDataShare::detach' => ['', 'request' => 'HttpRequest'], 'HttpRequestDataShare::factory' => ['', 'global' => '', 'class_name' => ''], 'HttpRequestDataShare::reset' => [''], 'HttpRequestDataShare::singleton' => ['', 'global' => ''], 'HttpRequestPool::__construct' => ['void', 'request=' => 'httprequest'], 'HttpRequestPool::__destruct' => [''], 'HttpRequestPool::attach' => ['bool', 'request' => 'httprequest'], 'HttpRequestPool::count' => ['int'], 'HttpRequestPool::current' => ['mixed'], 'HttpRequestPool::detach' => ['bool', 'request' => 'httprequest'], 'HttpRequestPool::enableEvents' => ['', 'enable' => ''], 'HttpRequestPool::enablePipelining' => ['', 'enable' => ''], 'HttpRequestPool::getAttachedRequests' => ['array'], 'HttpRequestPool::getFinishedRequests' => ['array'], 'HttpRequestPool::key' => ['int|string'], 'HttpRequestPool::next' => ['void'], 'HttpRequestPool::reset' => [''], 'HttpRequestPool::rewind' => ['void'], 'HttpRequestPool::send' => ['bool'], 'HttpRequestPool::socketPerform' => ['bool'], 'HttpRequestPool::socketSelect' => ['bool', 'timeout=' => 'float'], 'HttpRequestPool::valid' => ['bool'], 'HttpResponse::capture' => [''], 'HttpResponse::getBufferSize' => ['int'], 'HttpResponse::getCache' => ['bool'], 'HttpResponse::getCacheControl' => ['string'], 'HttpResponse::getContentDisposition' => ['string'], 'HttpResponse::getContentType' => ['string'], 'HttpResponse::getData' => ['string'], 'HttpResponse::getETag' => ['string'], 'HttpResponse::getFile' => ['string'], 'HttpResponse::getGzip' => ['bool'], 'HttpResponse::getHeader' => ['', 'name=' => 'string'], 'HttpResponse::getLastModified' => ['int'], 'HttpResponse::getRequestBody' => ['string'], 'HttpResponse::getRequestBodyStream' => ['resource'], 'HttpResponse::getRequestHeaders' => ['array'], 'HttpResponse::getStream' => ['resource'], 'HttpResponse::getThrottleDelay' => ['float'], 'HttpResponse::guessContentType' => ['string', 'magic_file' => 'string', 'magic_mode=' => 'int'], 'HttpResponse::redirect' => ['', 'url=' => 'string', 'params=' => 'array', 'session=' => 'bool', 'status=' => 'int'], 'HttpResponse::send' => ['bool', 'clean_ob=' => 'bool'], 'HttpResponse::setBufferSize' => ['bool', 'bytes' => 'int'], 'HttpResponse::setCache' => ['bool', 'cache' => 'bool'], 'HttpResponse::setCacheControl' => ['bool', 'control' => 'string', 'max_age=' => 'int', 'must_revalidate=' => 'bool'], 'HttpResponse::setContentDisposition' => ['bool', 'filename' => 'string', 'inline=' => 'bool'], 'HttpResponse::setContentType' => ['bool', 'content_type' => 'string'], 'HttpResponse::setData' => ['bool', 'data' => ''], 'HttpResponse::setETag' => ['bool', 'etag' => 'string'], 'HttpResponse::setFile' => ['bool', 'file' => 'string'], 'HttpResponse::setGzip' => ['bool', 'gzip' => 'bool'], 'HttpResponse::setHeader' => ['bool', 'name' => 'string', 'value=' => '', 'replace=' => 'bool'], 'HttpResponse::setLastModified' => ['bool', 'timestamp' => 'int'], 'HttpResponse::setStream' => ['bool', 'stream' => ''], 'HttpResponse::setThrottleDelay' => ['bool', 'seconds' => 'float'], 'HttpResponse::status' => ['bool', 'status' => 'int'], 'HttpUtil::buildCookie' => ['', 'cookie_array' => ''], 'HttpUtil::buildStr' => ['', 'query' => '', 'prefix' => '', 'arg_sep' => ''], 'HttpUtil::buildUrl' => ['', 'url' => '', 'parts' => '', 'flags' => '', '&composed' => ''], 'HttpUtil::chunkedDecode' => ['', 'encoded_string' => ''], 'HttpUtil::date' => ['', 'timestamp' => ''], 'HttpUtil::deflate' => ['', 'plain' => '', 'flags' => ''], 'HttpUtil::inflate' => ['', 'encoded' => ''], 'HttpUtil::matchEtag' => ['', 'plain_etag' => '', 'for_range' => ''], 'HttpUtil::matchModified' => ['', 'last_modified' => '', 'for_range' => ''], 'HttpUtil::matchRequestHeader' => ['', 'header_name' => '', 'header_value' => '', 'case_sensitive' => ''], 'HttpUtil::negotiateCharset' => ['', 'supported' => '', '&result' => ''], 'HttpUtil::negotiateContentType' => ['', 'supported' => '', '&result' => ''], 'HttpUtil::negotiateLanguage' => ['', 'supported' => '', '&result' => ''], 'HttpUtil::parseCookie' => ['', 'cookie_string' => ''], 'HttpUtil::parseHeaders' => ['', 'headers_string' => ''], 'HttpUtil::parseMessage' => ['', 'message_string' => ''], 'HttpUtil::parseParams' => ['', 'param_string' => '', 'flags' => ''], 'HttpUtil::support' => ['', 'feature' => ''], 'hw_api::checkin' => ['bool', 'parameter' => 'array'], 'hw_api::checkout' => ['bool', 'parameter' => 'array'], 'hw_api::children' => ['array', 'parameter' => 'array'], 'hw_api::content' => ['HW_API_Content', 'parameter' => 'array'], 'hw_api::copy' => ['hw_api_content', 'parameter' => 'array'], 'hw_api::dbstat' => ['hw_api_object', 'parameter' => 'array'], 'hw_api::dcstat' => ['hw_api_object', 'parameter' => 'array'], 'hw_api::dstanchors' => ['array', 'parameter' => 'array'], 'hw_api::dstofsrcanchor' => ['hw_api_object', 'parameter' => 'array'], 'hw_api::find' => ['array', 'parameter' => 'array'], 'hw_api::ftstat' => ['hw_api_object', 'parameter' => 'array'], 'hw_api::hwstat' => ['hw_api_object', 'parameter' => 'array'], 'hw_api::identify' => ['bool', 'parameter' => 'array'], 'hw_api::info' => ['array', 'parameter' => 'array'], 'hw_api::insert' => ['hw_api_object', 'parameter' => 'array'], 'hw_api::insertanchor' => ['hw_api_object', 'parameter' => 'array'], 'hw_api::insertcollection' => ['hw_api_object', 'parameter' => 'array'], 'hw_api::insertdocument' => ['hw_api_object', 'parameter' => 'array'], 'hw_api::link' => ['bool', 'parameter' => 'array'], 'hw_api::lock' => ['bool', 'parameter' => 'array'], 'hw_api::move' => ['bool', 'parameter' => 'array'], 'hw_api::object' => ['hw_api_object', 'parameter' => 'array'], 'hw_api::objectbyanchor' => ['hw_api_object', 'parameter' => 'array'], 'hw_api::parents' => ['array', 'parameter' => 'array'], 'hw_api::remove' => ['bool', 'parameter' => 'array'], 'hw_api::replace' => ['hw_api_object', 'parameter' => 'array'], 'hw_api::setcommittedversion' => ['hw_api_object', 'parameter' => 'array'], 'hw_api::srcanchors' => ['array', 'parameter' => 'array'], 'hw_api::srcsofdst' => ['array', 'parameter' => 'array'], 'hw_api::unlock' => ['bool', 'parameter' => 'array'], 'hw_api::user' => ['hw_api_object', 'parameter' => 'array'], 'hw_api::userlist' => ['array', 'parameter' => 'array'], 'hw_api_attribute' => ['HW_API_Attribute', 'name=' => 'string', 'value=' => 'string'], 'hw_api_attribute::key' => ['string'], 'hw_api_attribute::langdepvalue' => ['string', 'language' => 'string'], 'hw_api_attribute::value' => ['string'], 'hw_api_attribute::values' => ['array'], 'hw_api_content' => ['HW_API_Content', 'content' => 'string', 'mimetype' => 'string'], 'hw_api_content::mimetype' => ['string'], 'hw_api_content::read' => ['string', 'buffer' => 'string', 'len' => 'int'], 'hw_api_error::count' => ['int'], 'hw_api_error::reason' => ['HW_API_Reason'], 'hw_api_object' => ['hw_api_object', 'parameter' => 'array'], 'hw_api_object::assign' => ['bool', 'parameter' => 'array'], 'hw_api_object::attreditable' => ['bool', 'parameter' => 'array'], 'hw_api_object::count' => ['int', 'parameter' => 'array'], 'hw_api_object::insert' => ['bool', 'attribute' => 'hw_api_attribute'], 'hw_api_object::remove' => ['bool', 'name' => 'string'], 'hw_api_object::title' => ['string', 'parameter' => 'array'], 'hw_api_object::value' => ['string', 'name' => 'string'], 'hw_api_reason::description' => ['string'], 'hw_api_reason::type' => ['HW_API_Reason'], 'hw_Array2Objrec' => ['string', 'object_array' => 'array'], 'hw_changeobject' => ['bool', 'link' => 'int', 'objid' => 'int', 'attributes' => 'array'], 'hw_Children' => ['array', 'connection' => 'int', 'objectid' => 'int'], 'hw_ChildrenObj' => ['array', 'connection' => 'int', 'objectid' => 'int'], 'hw_Close' => ['bool', 'connection' => 'int'], 'hw_Connect' => ['int', 'host' => 'string', 'port' => 'int', 'username=' => 'string', 'password=' => 'string'], 'hw_connection_info' => ['', 'link' => 'int'], 'hw_cp' => ['int', 'connection' => 'int', 'object_id_array' => 'array', 'destination_id' => 'int'], 'hw_Deleteobject' => ['bool', 'connection' => 'int', 'object_to_delete' => 'int'], 'hw_DocByAnchor' => ['int', 'connection' => 'int', 'anchorid' => 'int'], 'hw_DocByAnchorObj' => ['string', 'connection' => 'int', 'anchorid' => 'int'], 'hw_Document_Attributes' => ['string', 'hw_document' => 'int'], 'hw_Document_BodyTag' => ['string', 'hw_document' => 'int', 'prefix=' => 'string'], 'hw_Document_Content' => ['string', 'hw_document' => 'int'], 'hw_Document_SetContent' => ['bool', 'hw_document' => 'int', 'content' => 'string'], 'hw_Document_Size' => ['int', 'hw_document' => 'int'], 'hw_dummy' => ['string', 'link' => 'int', 'id' => 'int', 'msgid' => 'int'], 'hw_EditText' => ['bool', 'connection' => 'int', 'hw_document' => 'int'], 'hw_Error' => ['int', 'connection' => 'int'], 'hw_ErrorMsg' => ['string', 'connection' => 'int'], 'hw_Free_Document' => ['bool', 'hw_document' => 'int'], 'hw_GetAnchors' => ['array', 'connection' => 'int', 'objectid' => 'int'], 'hw_GetAnchorsObj' => ['array', 'connection' => 'int', 'objectid' => 'int'], 'hw_GetAndLock' => ['string', 'connection' => 'int', 'objectid' => 'int'], 'hw_GetChildColl' => ['array', 'connection' => 'int', 'objectid' => 'int'], 'hw_GetChildCollObj' => ['array', 'connection' => 'int', 'objectid' => 'int'], 'hw_GetChildDocColl' => ['array', 'connection' => 'int', 'objectid' => 'int'], 'hw_GetChildDocCollObj' => ['array', 'connection' => 'int', 'objectid' => 'int'], 'hw_GetObject' => ['', 'connection' => 'int', 'objectid' => '', 'query=' => 'string'], 'hw_GetObjectByQuery' => ['array', 'connection' => 'int', 'query' => 'string', 'max_hits' => 'int'], 'hw_GetObjectByQueryColl' => ['array', 'connection' => 'int', 'objectid' => 'int', 'query' => 'string', 'max_hits' => 'int'], 'hw_GetObjectByQueryCollObj' => ['array', 'connection' => 'int', 'objectid' => 'int', 'query' => 'string', 'max_hits' => 'int'], 'hw_GetObjectByQueryObj' => ['array', 'connection' => 'int', 'query' => 'string', 'max_hits' => 'int'], 'hw_GetParents' => ['array', 'connection' => 'int', 'objectid' => 'int'], 'hw_GetParentsObj' => ['array', 'connection' => 'int', 'objectid' => 'int'], 'hw_getrellink' => ['string', 'link' => 'int', 'rootid' => 'int', 'sourceid' => 'int', 'destid' => 'int'], 'hw_GetRemote' => ['int', 'connection' => 'int', 'objectid' => 'int'], 'hw_getremotechildren' => ['', 'connection' => 'int', 'object_record' => 'string'], 'hw_GetSrcByDestObj' => ['array', 'connection' => 'int', 'objectid' => 'int'], 'hw_GetText' => ['int', 'connection' => 'int', 'objectid' => 'int', 'prefix=' => ''], 'hw_getusername' => ['string', 'connection' => 'int'], 'hw_Identify' => ['string', 'link' => 'int', 'username' => 'string', 'password' => 'string'], 'hw_InCollections' => ['array', 'connection' => 'int', 'object_id_array' => 'array', 'collection_id_array' => 'array', 'return_collections' => 'int'], 'hw_Info' => ['string', 'connection' => 'int'], 'hw_InsColl' => ['int', 'connection' => 'int', 'objectid' => 'int', 'object_array' => 'array'], 'hw_InsDoc' => ['int', 'connection' => '', 'parentid' => 'int', 'object_record' => 'string', 'text=' => 'string'], 'hw_insertanchors' => ['bool', 'hwdoc' => 'int', 'anchorecs' => 'array', 'dest' => 'array', 'urlprefixes=' => 'array'], 'hw_InsertDocument' => ['int', 'connection' => 'int', 'parent_id' => 'int', 'hw_document' => 'int'], 'hw_InsertObject' => ['int', 'connection' => 'int', 'object_rec' => 'string', 'parameter' => 'string'], 'hw_mapid' => ['int', 'connection' => 'int', 'server_id' => 'int', 'object_id' => 'int'], 'hw_Modifyobject' => ['bool', 'connection' => 'int', 'object_to_change' => 'int', 'remove' => 'array', 'add' => 'array', 'mode=' => 'int'], 'hw_mv' => ['int', 'connection' => 'int', 'object_id_array' => 'array', 'source_id' => 'int', 'destination_id' => 'int'], 'hw_New_Document' => ['int', 'object_record' => 'string', 'document_data' => 'string', 'document_size' => 'int'], 'hw_objrec2array' => ['array', 'object_record' => 'string', 'format=' => 'array'], 'hw_Output_Document' => ['bool', 'hw_document' => 'int'], 'hw_pConnect' => ['int', 'host' => 'string', 'port' => 'int', 'username=' => 'string', 'password=' => 'string'], 'hw_PipeDocument' => ['int', 'connection' => 'int', 'objectid' => 'int', 'url_prefixes=' => 'array'], 'hw_Root' => ['int'], 'hw_setlinkroot' => ['int', 'link' => 'int', 'rootid' => 'int'], 'hw_stat' => ['string', 'link' => 'int'], 'hw_Unlock' => ['bool', 'connection' => 'int', 'objectid' => 'int'], 'hw_Who' => ['array', 'connection' => 'int'], 'hwapi_attribute_new' => ['HW_API_Attribute', 'name=' => 'string', 'value=' => 'string'], 'hwapi_content_new' => ['HW_API_Content', 'content' => 'string', 'mimetype' => 'string'], 'hwapi_hgcsp' => ['HW_API', 'hostname' => 'string', 'port=' => 'int'], 'hwapi_object_new' => ['hw_api_object', 'parameter' => 'array'], 'hypot' => ['float', 'num1' => 'float', 'num2' => 'float'], 'ibase_add_user' => ['bool', 'service_handle' => 'resource', 'user_name' => 'string', 'password' => 'string', 'first_name=' => 'string', 'middle_name=' => 'string', 'last_name=' => 'string'], 'ibase_affected_rows' => ['int', 'link_identifier=' => 'resource'], 'ibase_backup' => ['mixed', 'service_handle' => 'resource', 'source_db' => 'string', 'dest_file' => 'string', 'options=' => 'int', 'verbose=' => 'bool'], 'ibase_blob_add' => ['void', 'blob_handle' => 'resource', 'data' => 'string'], 'ibase_blob_cancel' => ['bool', 'blob_handle' => 'resource'], 'ibase_blob_close' => ['string', 'blob_handle' => 'resource'], 'ibase_blob_create' => ['resource', 'link_identifier=' => 'resource'], 'ibase_blob_echo' => ['bool', 'link_identifier' => '', 'blob_id' => 'string'], 'ibase_blob_echo\'1' => ['bool', 'blob_id' => 'string'], 'ibase_blob_get' => ['string', 'blob_handle' => 'resource', 'len' => 'int'], 'ibase_blob_import' => ['string', 'link_identifier' => '', 'file_handle' => ''], 'ibase_blob_info' => ['array', 'link_identifier' => '', 'blob_id' => 'string'], 'ibase_blob_info\'1' => ['array', 'blob_id' => 'string'], 'ibase_blob_open' => ['resource', 'link_identifier' => '', 'blob_id' => 'string'], 'ibase_blob_open\'1' => ['resource', 'blob_id' => 'string'], 'ibase_close' => ['bool', 'link_identifier=' => 'resource'], 'ibase_commit' => ['bool', 'link_identifier=' => 'resource'], 'ibase_commit_ret' => ['bool', 'link_identifier=' => 'resource'], 'ibase_connect' => ['resource', 'database=' => 'string', 'username=' => 'string', 'password=' => 'string', 'charset=' => 'string', 'buffers=' => 'int', 'dialect=' => 'int', 'role=' => 'string'], 'ibase_db_info' => ['string', 'service_handle' => 'resource', 'db' => 'string', 'action' => 'int', 'argument=' => 'int'], 'ibase_delete_user' => ['bool', 'service_handle' => 'resource', 'user_name' => 'string', 'password=' => 'string', 'first_name=' => 'string', 'middle_name=' => 'string', 'last_name=' => 'string'], 'ibase_drop_db' => ['bool', 'link_identifier=' => 'resource'], 'ibase_errcode' => ['int'], 'ibase_errmsg' => ['string'], 'ibase_execute' => ['resource', 'query' => 'resource', 'bind_arg=' => 'mixed', '...args=' => 'mixed'], 'ibase_fetch_assoc' => ['array', 'result' => 'resource', 'fetch_flags=' => 'int'], 'ibase_fetch_object' => ['object', 'result' => 'resource', 'fetch_flags=' => 'int'], 'ibase_fetch_row' => ['array', 'result' => 'resource', 'fetch_flags=' => 'int'], 'ibase_field_info' => ['array', 'query_result' => 'resource', 'field_number' => 'int'], 'ibase_free_event_handler' => ['bool', 'event' => 'resource'], 'ibase_free_query' => ['bool', 'query' => 'resource'], 'ibase_free_result' => ['bool', 'result' => 'resource'], 'ibase_gen_id' => ['int', 'generator' => 'string', 'increment=' => 'int', 'link_identifier=' => 'resource'], 'ibase_maintain_db' => ['bool', 'service_handle' => 'resource', 'db' => 'string', 'action' => 'int', 'argument=' => 'int'], 'ibase_modify_user' => ['bool', 'service_handle' => 'resource', 'user_name' => 'string', 'password' => 'string', 'first_name=' => 'string', 'middle_name=' => 'string', 'last_name=' => 'string'], 'ibase_name_result' => ['bool', 'result' => 'resource', 'name' => 'string'], 'ibase_num_fields' => ['int', 'query_result' => 'resource'], 'ibase_num_params' => ['int', 'query' => 'resource'], 'ibase_num_rows' => ['int', 'result_identifier' => ''], 'ibase_param_info' => ['array', 'query' => 'resource', 'field_number' => 'int'], 'ibase_pconnect' => ['resource', 'database=' => 'string', 'username=' => 'string', 'password=' => 'string', 'charset=' => 'string', 'buffers=' => 'int', 'dialect=' => 'int', 'role=' => 'string'], 'ibase_prepare' => ['resource', 'link_identifier' => '', 'query' => 'string', 'trans_identifier' => ''], 'ibase_query' => ['resource', 'link_identifier=' => 'resource', 'string=' => 'string', 'bind_arg=' => 'int', '...args=' => ''], 'ibase_restore' => ['mixed', 'service_handle' => 'resource', 'source_file' => 'string', 'dest_db' => 'string', 'options=' => 'int', 'verbose=' => 'bool'], 'ibase_rollback' => ['bool', 'link_identifier=' => 'resource'], 'ibase_rollback_ret' => ['bool', 'link_identifier=' => 'resource'], 'ibase_server_info' => ['string', 'service_handle' => 'resource', 'action' => 'int'], 'ibase_service_attach' => ['resource', 'host' => 'string', 'dba_username' => 'string', 'dba_password' => 'string'], 'ibase_service_detach' => ['bool', 'service_handle' => 'resource'], 'ibase_set_event_handler' => ['resource', 'link_identifier' => '', 'callback' => 'callable', 'event=' => 'string', '...args=' => ''], 'ibase_set_event_handler\'1' => ['resource', 'callback' => 'callable', 'event' => 'string', '...args' => ''], 'ibase_timefmt' => ['bool', 'format' => 'string', 'columntype=' => 'int'], 'ibase_trans' => ['resource', 'trans_args=' => 'int', 'link_identifier=' => '', '...args=' => ''], 'ibase_wait_event' => ['string', 'link_identifier' => '', 'event=' => 'string', '...args=' => ''], 'ibase_wait_event\'1' => ['string', 'event' => 'string', '...args' => ''], 'iconv' => ['string|false', 'in_charset' => 'string', 'out_charset' => 'string', 'str' => 'string'], 'iconv_get_encoding' => ['mixed', 'type=' => 'string'], 'iconv_mime_decode' => ['string|false', 'encoded_string' => 'string', 'mode=' => 'int', 'charset=' => 'string'], 'iconv_mime_decode_headers' => ['array|false', 'headers' => 'string', 'mode=' => 'int', 'charset=' => 'string'], 'iconv_mime_encode' => ['string|false', 'field_name' => 'string', 'field_value' => 'string', 'preference=' => 'array'], 'iconv_set_encoding' => ['bool', 'type' => 'string', 'charset' => 'string'], 'iconv_strlen' => ['int', 'str' => 'string', 'charset=' => 'string'], 'iconv_strpos' => ['int|false', 'haystack' => 'string', 'needle' => 'string', 'offset=' => 'int', 'charset=' => 'string'], 'iconv_strrpos' => ['int|false', 'haystack' => 'string', 'needle' => 'string', 'charset=' => 'string'], 'iconv_substr' => ['string|false', 'str' => 'string', 'offset' => 'int', 'length=' => 'int', 'charset=' => 'string'], 'id3_get_frame_long_name' => ['string', 'frameid' => 'string'], 'id3_get_frame_short_name' => ['string', 'frameid' => 'string'], 'id3_get_genre_id' => ['int', 'genre' => 'string'], 'id3_get_genre_list' => ['array'], 'id3_get_genre_name' => ['string', 'genre_id' => 'int'], 'id3_get_tag' => ['array', 'filename' => 'string', 'version=' => 'int'], 'id3_get_version' => ['int', 'filename' => 'string'], 'id3_remove_tag' => ['bool', 'filename' => 'string', 'version=' => 'int'], 'id3_set_tag' => ['bool', 'filename' => 'string', 'tag' => 'array', 'version=' => 'int'], 'idate' => ['int', 'format' => 'string', 'timestamp=' => 'int'], 'idn_strerror' => ['string', 'errorcode' => 'int'], 'idn_to_ascii' => ['string|false', 'domain' => 'string', 'options=' => 'int', 'variant=' => 'int', '&w_idna_info=' => 'array'], 'idn_to_utf8' => ['string|false', 'domain' => 'string', 'options=' => 'int', 'variant=' => 'int', '&w_idna_info=' => 'array'], 'ifx_affected_rows' => ['int', 'result_id' => 'resource'], 'ifx_blobinfile_mode' => ['bool', 'mode' => 'int'], 'ifx_byteasvarchar' => ['bool', 'mode' => 'int'], 'ifx_close' => ['bool', 'link_identifier=' => 'resource'], 'ifx_connect' => ['resource', 'database=' => 'string', 'userid=' => 'string', 'password=' => 'string'], 'ifx_copy_blob' => ['int', 'bid' => 'int'], 'ifx_create_blob' => ['int', 'type' => 'int', 'mode' => 'int', 'param' => 'string'], 'ifx_create_char' => ['int', 'param' => 'string'], 'ifx_do' => ['bool', 'result_id' => 'resource'], 'ifx_error' => ['string', 'link_identifier=' => 'resource'], 'ifx_errormsg' => ['string', 'errorcode=' => 'int'], 'ifx_fetch_row' => ['array', 'result_id' => 'resource', 'position=' => 'mixed'], 'ifx_fieldproperties' => ['array', 'result_id' => 'resource'], 'ifx_fieldtypes' => ['array', 'result_id' => 'resource'], 'ifx_free_blob' => ['bool', 'bid' => 'int'], 'ifx_free_char' => ['bool', 'bid' => 'int'], 'ifx_free_result' => ['bool', 'result_id' => 'resource'], 'ifx_get_blob' => ['string', 'bid' => 'int'], 'ifx_get_char' => ['string', 'bid' => 'int'], 'ifx_getsqlca' => ['array', 'result_id' => 'resource'], 'ifx_htmltbl_result' => ['int', 'result_id' => 'resource', 'html_table_options=' => 'string'], 'ifx_nullformat' => ['bool', 'mode' => 'int'], 'ifx_num_fields' => ['int', 'result_id' => 'resource'], 'ifx_num_rows' => ['int', 'result_id' => 'resource'], 'ifx_pconnect' => ['resource', 'database=' => 'string', 'userid=' => 'string', 'password=' => 'string'], 'ifx_prepare' => ['resource', 'query' => 'string', 'link_identifier' => 'resource', 'cursor_def=' => 'int', 'blobidarray=' => 'mixed'], 'ifx_query' => ['resource', 'query' => 'string', 'link_identifier' => 'resource', 'cursor_type=' => 'int', 'blobidarray=' => 'mixed'], 'ifx_textasvarchar' => ['bool', 'mode' => 'int'], 'ifx_update_blob' => ['bool', 'bid' => 'int', 'content' => 'string'], 'ifx_update_char' => ['bool', 'bid' => 'int', 'content' => 'string'], 'ifxus_close_slob' => ['bool', 'bid' => 'int'], 'ifxus_create_slob' => ['int', 'mode' => 'int'], 'ifxus_free_slob' => ['bool', 'bid' => 'int'], 'ifxus_open_slob' => ['int', 'bid' => 'int', 'mode' => 'int'], 'ifxus_read_slob' => ['string', 'bid' => 'int', 'nbytes' => 'int'], 'ifxus_seek_slob' => ['int', 'bid' => 'int', 'mode' => 'int', 'offset' => 'int'], 'ifxus_tell_slob' => ['int', 'bid' => 'int'], 'ifxus_write_slob' => ['int', 'bid' => 'int', 'content' => 'string'], 'igbinary_serialize' => ['string|false', 'value' => ''], 'igbinary_unserialize' => ['', 'str' => 'string'], 'ignore_user_abort' => ['int', 'value=' => 'bool'], 'iis_add_server' => ['int', 'path' => 'string', 'comment' => 'string', 'server_ip' => 'string', 'port' => 'int', 'host_name' => 'string', 'rights' => 'int', 'start_server' => 'int'], 'iis_get_dir_security' => ['int', 'server_instance' => 'int', 'virtual_path' => 'string'], 'iis_get_script_map' => ['string', 'server_instance' => 'int', 'virtual_path' => 'string', 'script_extension' => 'string'], 'iis_get_server_by_comment' => ['int', 'comment' => 'string'], 'iis_get_server_by_path' => ['int', 'path' => 'string'], 'iis_get_server_rights' => ['int', 'server_instance' => 'int', 'virtual_path' => 'string'], 'iis_get_service_state' => ['int', 'service_id' => 'string'], 'iis_remove_server' => ['int', 'server_instance' => 'int'], 'iis_set_app_settings' => ['int', 'server_instance' => 'int', 'virtual_path' => 'string', 'application_scope' => 'string'], 'iis_set_dir_security' => ['int', 'server_instance' => 'int', 'virtual_path' => 'string', 'directory_flags' => 'int'], 'iis_set_script_map' => ['int', 'server_instance' => 'int', 'virtual_path' => 'string', 'script_extension' => 'string', 'engine_path' => 'string', 'allow_scripting' => 'int'], 'iis_set_server_rights' => ['int', 'server_instance' => 'int', 'virtual_path' => 'string', 'directory_flags' => 'int'], 'iis_start_server' => ['int', 'server_instance' => 'int'], 'iis_start_service' => ['int', 'service_id' => 'string'], 'iis_stop_server' => ['int', 'server_instance' => 'int'], 'iis_stop_service' => ['int', 'service_id' => 'string'], 'image2wbmp' => ['bool', 'im' => 'resource', 'filename=' => '?string', 'threshold=' => 'int'], 'image_type_to_extension' => ['string', 'imagetype' => 'int', 'include_dot=' => 'bool'], 'image_type_to_mime_type' => ['string', 'imagetype' => 'int'], 'imageaffine' => ['resource', 'src' => 'resource', 'affine' => 'array', 'clip=' => 'array'], 'imageaffineconcat' => ['array', 'm1' => 'array', 'm2' => 'array'], 'imageaffinematrixconcat' => ['array', 'm1' => 'array', 'm2' => 'array'], 'imageaffinematrixget' => ['array', 'type' => 'int', 'options' => 'array'], 'imagealphablending' => ['bool', 'im' => 'resource', 'on' => 'bool'], 'imageantialias' => ['bool', 'im' => 'resource', 'on' => 'bool'], 'imagearc' => ['bool', 'im' => 'resource', 'cx' => 'int', 'cy' => 'int', 'w' => 'int', 'h' => 'int', 's' => 'int', 'e' => 'int', 'col' => 'int'], 'imagebmp' => ['bool', 'image' => 'resource', 'to=' => 'mixed', 'compressed=' => 'bool'], 'imagechar' => ['bool', 'im' => 'resource', 'font' => 'int', 'x' => 'int', 'y' => 'int', 'c' => 'string', 'col' => 'int'], 'imagecharup' => ['bool', 'im' => 'resource', 'font' => 'int', 'x' => 'int', 'y' => 'int', 'c' => 'string', 'col' => 'int'], 'imagecolorallocate' => ['int', 'im' => 'resource', 'red' => 'int', 'green' => 'int', 'blue' => 'int'], 'imagecolorallocatealpha' => ['int', 'im' => 'resource', 'red' => 'int', 'green' => 'int', 'blue' => 'int', 'alpha' => 'int'], 'imagecolorat' => ['int', 'im' => 'resource', 'x' => 'int', 'y' => 'int'], 'imagecolorclosest' => ['int', 'im' => 'resource', 'red' => 'int', 'green' => 'int', 'blue' => 'int'], 'imagecolorclosestalpha' => ['int', 'im' => 'resource', 'red' => 'int', 'green' => 'int', 'blue' => 'int', 'alpha' => 'int'], 'imagecolorclosesthwb' => ['int', 'im' => 'resource', 'red' => 'int', 'green' => 'int', 'blue' => 'int'], 'imagecolordeallocate' => ['bool', 'im' => 'resource', 'index' => 'int'], 'imagecolorexact' => ['int', 'im' => 'resource', 'red' => 'int', 'green' => 'int', 'blue' => 'int'], 'imagecolorexactalpha' => ['int', 'im' => 'resource', 'red' => 'int', 'green' => 'int', 'blue' => 'int', 'alpha' => 'int'], 'imagecolormatch' => ['bool', 'im1' => 'resource', 'im2' => 'resource'], 'imagecolorresolve' => ['int', 'im' => 'resource', 'red' => 'int', 'green' => 'int', 'blue' => 'int'], 'imagecolorresolvealpha' => ['int', 'im' => 'resource', 'red' => 'int', 'green' => 'int', 'blue' => 'int', 'alpha' => 'int'], 'imagecolorset' => ['void', 'im' => 'resource', 'col' => 'int', 'red' => 'int', 'green' => 'int', 'blue' => 'int', 'alpha=' => 'int'], 'imagecolorsforindex' => ['array', 'im' => 'resource', 'col' => 'int'], 'imagecolorstotal' => ['int', 'im' => 'resource'], 'imagecolortransparent' => ['int', 'im' => 'resource', 'col=' => 'int'], 'imageconvolution' => ['resource', 'src_im' => 'resource', 'matrix3x3' => 'array', 'div' => 'float', 'offset' => 'float'], 'imagecopy' => ['bool', 'dst_im' => 'resource', 'src_im' => 'resource', 'dst_x' => 'int', 'dst_y' => 'int', 'src_x' => 'int', 'src_y' => 'int', 'src_w' => 'int', 'src_h' => 'int'], 'imagecopymerge' => ['bool', 'src_im' => 'resource', 'dst_im' => 'resource', 'dst_x' => 'int', 'dst_y' => 'int', 'src_x' => 'int', 'src_y' => 'int', 'src_w' => 'int', 'src_h' => 'int', 'pct' => 'int'], 'imagecopymergegray' => ['bool', 'src_im' => 'resource', 'dst_im' => 'resource', 'dst_x' => 'int', 'dst_y' => 'int', 'src_x' => 'int', 'src_y' => 'int', 'src_w' => 'int', 'src_h' => 'int', 'pct' => 'int'], 'imagecopyresampled' => ['bool', 'dst_im' => 'resource', 'src_im' => 'resource', 'dst_x' => 'int', 'dst_y' => 'int', 'src_x' => 'int', 'src_y' => 'int', 'dst_w' => 'int', 'dst_h' => 'int', 'src_w' => 'int', 'src_h' => 'int'], 'imagecopyresized' => ['bool', 'dst_im' => 'resource', 'src_im' => 'resource', 'dst_x' => 'int', 'dst_y' => 'int', 'src_x' => 'int', 'src_y' => 'int', 'dst_w' => 'int', 'dst_h' => 'int', 'src_w' => 'int', 'src_h' => 'int'], 'imagecreate' => ['resource|false', 'x_size' => 'int', 'y_size' => 'int'], 'imagecreatefrombmp' => ['resource|false', 'filename' => 'string'], 'imagecreatefromgd' => ['resource|false', 'filename' => 'string'], 'imagecreatefromgd2' => ['resource|false', 'filename' => 'string'], 'imagecreatefromgd2part' => ['resource|false', 'filename' => 'string', 'srcx' => 'int', 'srcy' => 'int', 'width' => 'int', 'height' => 'int'], 'imagecreatefromgif' => ['resource|false', 'filename' => 'string'], 'imagecreatefromjpeg' => ['resource|false', 'filename' => 'string'], 'imagecreatefrompng' => ['resource|false', 'filename' => 'string'], 'imagecreatefromstring' => ['resource|false', 'image' => 'string'], 'imagecreatefromwbmp' => ['resource|false', 'filename' => 'string'], 'imagecreatefromwebp' => ['resource|false', 'filename' => 'string'], 'imagecreatefromxbm' => ['resource|false', 'filename' => 'string'], 'imagecreatefromxpm' => ['resource|false', 'filename' => 'string'], 'imagecreatetruecolor' => ['resource|false', 'x_size' => 'int', 'y_size' => 'int'], 'imagecrop' => ['resource', 'im' => 'resource', 'rect' => 'array'], 'imagecropauto' => ['resource', 'im' => 'resource', 'mode' => 'int', 'threshold' => 'float', 'color' => 'int'], 'imagedashedline' => ['bool', 'im' => 'resource', 'x1' => 'int', 'y1' => 'int', 'x2' => 'int', 'y2' => 'int', 'col' => 'int'], 'imagedestroy' => ['bool', 'im' => 'resource'], 'imageellipse' => ['bool', 'im' => 'resource', 'cx' => 'int', 'cy' => 'int', 'w' => 'int', 'h' => 'int', 'color' => 'int'], 'imagefill' => ['bool', 'im' => 'resource', 'x' => 'int', 'y' => 'int', 'col' => 'int'], 'imagefilledarc' => ['bool', 'im' => 'resource', 'cx' => 'int', 'cy' => 'int', 'w' => 'int', 'h' => 'int', 's' => 'int', 'e' => 'int', 'col' => 'int', 'style' => 'int'], 'imagefilledellipse' => ['bool', 'im' => 'resource', 'cx' => 'int', 'cy' => 'int', 'w' => 'int', 'h' => 'int', 'color' => 'int'], 'imagefilledpolygon' => ['bool', 'im' => 'resource', 'point' => 'array', 'num_points' => 'int', 'col' => 'int'], 'imagefilledrectangle' => ['bool', 'im' => 'resource', 'x1' => 'int', 'y1' => 'int', 'x2' => 'int', 'y2' => 'int', 'col' => 'int'], 'imagefilltoborder' => ['bool', 'im' => 'resource', 'x' => 'int', 'y' => 'int', 'border' => 'int', 'col' => 'int'], 'imagefilter' => ['bool', 'src_im' => 'resource', 'filtertype' => 'int', 'arg1=' => 'int', 'arg2=' => 'int', 'arg3=' => 'int', 'arg4=' => 'int'], 'imageflip' => ['bool', 'im' => 'resource', 'mode' => 'int'], 'imagefontheight' => ['int', 'font' => 'int'], 'imagefontwidth' => ['int', 'font' => 'int'], 'imageftbbox' => ['array', 'size' => 'float', 'angle' => 'float', 'font_file' => 'string', 'text' => 'string', 'extrainfo=' => 'array'], 'imagefttext' => ['array', 'im' => 'resource', 'size' => 'float', 'angle' => 'float', 'x' => 'int', 'y' => 'int', 'col' => 'int', 'font_file' => 'string', 'text' => 'string', 'extrainfo=' => 'array'], 'imagegammacorrect' => ['bool', 'im' => 'resource', 'inputgamma' => 'float', 'outputgamma' => 'float'], 'imagegd' => ['bool', 'im' => 'resource', 'filename=' => '?string'], 'imagegd2' => ['bool', 'im' => 'resource', 'filename=' => '?string', 'chunk_size=' => 'int', 'type=' => 'int'], 'imagegetclip' => ['array', 'im' => 'resource'], 'imagegif' => ['bool', 'im' => 'resource', 'filename=' => '?string'], 'imagegrabscreen' => ['resource'], 'imagegrabwindow' => ['resource', 'window_handle' => 'int', 'client_area=' => 'int'], 'imageinterlace' => ['int', 'im' => 'resource', 'interlace=' => 'int'], 'imageistruecolor' => ['bool', 'im' => 'resource'], 'imagejpeg' => ['bool', 'im' => 'resource', 'filename=' => '?string', 'quality=' => 'int'], 'imagelayereffect' => ['bool', 'im' => 'resource', 'effect' => 'int'], 'imageline' => ['bool', 'im' => 'resource', 'x1' => 'int', 'y1' => 'int', 'x2' => 'int', 'y2' => 'int', 'col' => 'int'], 'imageloadfont' => ['int', 'filename' => 'string'], 'imageObj::pasteImage' => ['void', 'srcImg' => 'imageObj', 'transparentColorHex' => 'int', 'dstX' => 'int', 'dstY' => 'int', 'angle' => 'int'], 'imageObj::saveImage' => ['int', 'filename' => 'string', 'oMap' => 'MapObj'], 'imageObj::saveWebImage' => ['string'], 'imageopenpolygon' => ['bool', 'image' => 'resource', 'points' => 'array', 'num_points' => 'int', 'color' => 'int'], 'imagepalettecopy' => ['void', 'dst' => 'resource', 'src' => 'resource'], 'imagepalettetotruecolor' => ['bool', 'src' => 'resource'], 'imagepng' => ['bool', 'im' => 'resource', 'filename=' => '?string', 'quality=' => 'int', 'filters=' => 'int'], 'imagepolygon' => ['bool', 'im' => 'resource', 'point' => 'array', 'num_points' => 'int', 'col' => 'int'], 'imagepsbbox' => ['array', 'text' => 'string', 'font' => '', 'size' => 'int', 'space' => 'int', 'tightness' => 'int', 'angle' => 'float'], 'imagepsencodefont' => ['bool', 'font_index' => 'resource', 'encodingfile' => 'string'], 'imagepsextendfont' => ['bool', 'font_index' => 'resource', 'extend' => 'float'], 'imagepsfreefont' => ['bool', 'font_index' => 'resource'], 'imagepsloadfont' => ['resource', 'filename' => 'string'], 'imagepsslantfont' => ['bool', 'font_index' => 'resource', 'slant' => 'float'], 'imagepstext' => ['array', 'image' => 'resource', 'text' => 'string', 'font_index' => 'resource', 'size' => 'int', 'foreground' => 'int', 'background' => 'int', 'x' => 'int', 'y' => 'int', 'space=' => 'int', 'tightness=' => 'int', 'angle=' => 'float', 'antialias_steps=' => 'int'], 'imagerectangle' => ['bool', 'im' => 'resource', 'x1' => 'int', 'y1' => 'int', 'x2' => 'int', 'y2' => 'int', 'col' => 'int'], 'imageresolution' => ['mixed', 'image' => 'resource', 'res_x=' => 'int', 'res_y=' => 'int'], 'imagerotate' => ['resource', 'src_im' => 'resource', 'angle' => 'float', 'bgdcolor' => 'int', 'ignoretransparent=' => 'int'], 'imagesavealpha' => ['bool', 'im' => 'resource', 'on' => 'bool'], 'imagescale' => ['resource', 'im' => 'resource', 'new_width' => 'int', 'new_height=' => 'int', 'method=' => 'int'], 'imagesetbrush' => ['bool', 'image' => 'resource', 'brush' => 'resource'], 'imagesetclip' => ['bool', 'im' => 'resource', 'x1' => 'int', 'y1' => 'int', 'x2' => 'int', 'y2' => 'int'], 'imagesetinterpolation' => ['bool', 'im' => 'resource', 'method' => 'int'], 'imagesetpixel' => ['bool', 'im' => 'resource', 'x' => 'int', 'y' => 'int', 'col' => 'int'], 'imagesetstyle' => ['bool', 'im' => 'resource', 'styles' => 'array'], 'imagesetthickness' => ['bool', 'im' => 'resource', 'thickness' => 'int'], 'imagesettile' => ['bool', 'image' => 'resource', 'tile' => 'resource'], 'imagestring' => ['bool', 'im' => 'resource', 'font' => 'int', 'x' => 'int', 'y' => 'int', 'str' => 'string', 'col' => 'int'], 'imagestringup' => ['bool', 'im' => 'resource', 'font' => 'int', 'x' => 'int', 'y' => 'int', 'str' => 'string', 'col' => 'int'], 'imagesx' => ['int', 'im' => 'resource'], 'imagesy' => ['int', 'im' => 'resource'], 'imagetruecolortopalette' => ['bool', 'im' => 'resource', 'ditherflag' => 'bool', 'colorswanted' => 'int'], 'imagettfbbox' => ['array', 'size' => 'float', 'angle' => 'float', 'font_file' => 'string', 'text' => 'string'], 'imagettftext' => ['array', 'im' => 'resource', 'size' => 'float', 'angle' => 'float', 'x' => 'int', 'y' => 'int', 'col' => 'int', 'font_file' => 'string', 'text' => 'string'], 'imagetypes' => ['int'], 'imagewbmp' => ['bool', 'im' => 'resource', 'filename=' => '?string', 'foreground=' => 'int'], 'imagewebp' => ['bool', 'im' => 'resource', 'filename=' => '?string', 'quality=' => 'int'], 'imagexbm' => ['bool', 'im' => 'resource', 'filename' => '?string', 'foreground=' => 'int'], 'Imagick::__construct' => ['void', 'files=' => ''], 'Imagick::__toString' => ['string'], 'Imagick::adaptiveBlurImage' => ['bool', 'radius' => 'float', 'sigma' => 'float', 'channel=' => 'int'], 'Imagick::adaptiveResizeImage' => ['bool', 'columns' => 'int', 'rows' => 'int', 'bestfit=' => 'bool'], 'Imagick::adaptiveSharpenImage' => ['bool', 'radius' => 'float', 'sigma' => 'float', 'channel=' => 'int'], 'Imagick::adaptiveThresholdImage' => ['bool', 'width' => 'int', 'height' => 'int', 'offset' => 'int'], 'Imagick::addImage' => ['bool', 'source' => 'imagick'], 'Imagick::addNoiseImage' => ['bool', 'noise_type' => 'int', 'channel=' => 'int'], 'Imagick::affineTransformImage' => ['bool', 'matrix' => 'imagickdraw'], 'Imagick::animateImages' => ['bool', 'x_server' => 'string'], 'Imagick::annotateImage' => ['bool', 'draw_settings' => 'imagickdraw', 'x' => 'float', 'y' => 'float', 'angle' => 'float', 'text' => 'string'], 'Imagick::appendImages' => ['Imagick', 'stack' => 'bool'], 'Imagick::autoGammaImage' => ['bool', 'channel=' => 'int'], 'Imagick::autoLevelImage' => ['void', 'CHANNEL=' => 'string'], 'Imagick::autoOrient' => ['bool'], 'Imagick::averageImages' => ['Imagick'], 'Imagick::blackThresholdImage' => ['bool', 'threshold' => 'mixed'], 'Imagick::blueShiftImage' => ['void', 'factor=' => 'float'], 'Imagick::blurImage' => ['bool', 'radius' => 'float', 'sigma' => 'float', 'channel=' => 'int'], 'Imagick::borderImage' => ['bool', 'bordercolor' => 'mixed', 'width' => 'int', 'height' => 'int'], 'Imagick::brightnessContrastImage' => ['void', 'brightness' => 'string', 'contrast' => 'string', 'CHANNEL=' => 'string'], 'Imagick::charcoalImage' => ['bool', 'radius' => 'float', 'sigma' => 'float'], 'Imagick::chopImage' => ['bool', 'width' => 'int', 'height' => 'int', 'x' => 'int', 'y' => 'int'], 'Imagick::clampImage' => ['void', 'CHANNEL=' => 'string'], 'Imagick::clear' => ['bool'], 'Imagick::clipImage' => ['bool'], 'Imagick::clipImagePath' => ['void', 'pathname' => 'string', 'inside' => 'string'], 'Imagick::clipPathImage' => ['bool', 'pathname' => 'string', 'inside' => 'bool'], 'Imagick::clone' => ['Imagick'], 'Imagick::clutImage' => ['bool', 'lookup_table' => 'imagick', 'channel=' => 'float'], 'Imagick::coalesceImages' => ['Imagick'], 'Imagick::colorFloodfillImage' => ['bool', 'fill' => 'mixed', 'fuzz' => 'float', 'bordercolor' => 'mixed', 'x' => 'int', 'y' => 'int'], 'Imagick::colorizeImage' => ['bool', 'colorize' => 'mixed', 'opacity' => 'mixed'], 'Imagick::colorMatrixImage' => ['void', 'color_matrix' => 'string'], 'Imagick::combineImages' => ['Imagick', 'channeltype' => 'int'], 'Imagick::commentImage' => ['bool', 'comment' => 'string'], 'Imagick::compareImageChannels' => ['array', 'image' => 'imagick', 'channeltype' => 'int', 'metrictype' => 'int'], 'Imagick::compareImageLayers' => ['Imagick', 'method' => 'int'], 'Imagick::compareImages' => ['array', 'compare' => 'imagick', 'metric' => 'int'], 'Imagick::compositeImage' => ['bool', 'composite_object' => 'imagick', 'composite' => 'int', 'x' => 'int', 'y' => 'int', 'channel=' => 'int'], 'Imagick::compositeImageGravity' => ['bool', 'imagick' => 'Imagick', 'COMPOSITE_CONSTANT' => 'int', 'GRAVITY_CONSTANT' => 'int'], 'Imagick::contrastImage' => ['bool', 'sharpen' => 'bool'], 'Imagick::contrastStretchImage' => ['bool', 'black_point' => 'float', 'white_point' => 'float', 'channel=' => 'int'], 'Imagick::convolveImage' => ['bool', 'kernel' => 'array', 'channel=' => 'int'], 'Imagick::count' => ['void', 'mode=' => 'string'], 'Imagick::cropImage' => ['bool', 'width' => 'int', 'height' => 'int', 'x' => 'int', 'y' => 'int'], 'Imagick::cropThumbnailImage' => ['bool', 'width' => 'int', 'height' => 'int'], 'Imagick::current' => ['Imagick'], 'Imagick::cycleColormapImage' => ['bool', 'displace' => 'int'], 'Imagick::decipherImage' => ['bool', 'passphrase' => 'string'], 'Imagick::deconstructImages' => ['Imagick'], 'Imagick::deleteImageArtifact' => ['bool', 'artifact' => 'string'], 'Imagick::deleteImageProperty' => ['void', 'name' => 'string'], 'Imagick::deskewImage' => ['bool', 'threshold' => 'float'], 'Imagick::despeckleImage' => ['bool'], 'Imagick::destroy' => ['bool'], 'Imagick::displayImage' => ['bool', 'servername' => 'string'], 'Imagick::displayImages' => ['bool', 'servername' => 'string'], 'Imagick::distortImage' => ['bool', 'method' => 'int', 'arguments' => 'array', 'bestfit' => 'bool'], 'Imagick::drawImage' => ['bool', 'draw' => 'imagickdraw'], 'Imagick::edgeImage' => ['bool', 'radius' => 'float'], 'Imagick::embossImage' => ['bool', 'radius' => 'float', 'sigma' => 'float'], 'Imagick::encipherImage' => ['bool', 'passphrase' => 'string'], 'Imagick::enhanceImage' => ['bool'], 'Imagick::equalizeImage' => ['bool'], 'Imagick::evaluateImage' => ['bool', 'op' => 'int', 'constant' => 'float', 'channel=' => 'int'], 'Imagick::evaluateImages' => ['bool', 'EVALUATE_CONSTANT' => 'int'], 'Imagick::exportImagePixels' => ['array', 'x' => 'int', 'y' => 'int', 'width' => 'int', 'height' => 'int', 'map' => 'string', 'storage' => 'int'], 'Imagick::extentImage' => ['bool', 'width' => 'int', 'height' => 'int', 'x' => 'int', 'y' => 'int'], 'Imagick::filter' => ['void', 'ImagickKernel' => 'ImagickKernel', 'CHANNEL=' => 'int'], 'Imagick::flattenImages' => ['Imagick'], 'Imagick::flipImage' => ['bool'], 'Imagick::floodFillPaintImage' => ['bool', 'fill' => 'mixed', 'fuzz' => 'float', 'target' => 'mixed', 'x' => 'int', 'y' => 'int', 'invert' => 'bool', 'channel=' => 'int'], 'Imagick::flopImage' => ['bool'], 'Imagick::forwardFourierTransformimage' => ['void', 'magnitude' => 'bool'], 'Imagick::frameImage' => ['bool', 'matte_color' => 'mixed', 'width' => 'int', 'height' => 'int', 'inner_bevel' => 'int', 'outer_bevel' => 'int'], 'Imagick::functionImage' => ['bool', 'function' => 'int', 'arguments' => 'array', 'channel=' => 'int'], 'Imagick::fxImage' => ['Imagick', 'expression' => 'string', 'channel=' => 'int'], 'Imagick::gammaImage' => ['bool', 'gamma' => 'float', 'channel=' => 'int'], 'Imagick::gaussianBlurImage' => ['bool', 'radius' => 'float', 'sigma' => 'float', 'channel=' => 'int'], 'Imagick::getColorspace' => ['int'], 'Imagick::getCompression' => ['int'], 'Imagick::getCompressionQuality' => ['int'], 'Imagick::getConfigureOptions' => ['string'], 'Imagick::getCopyright' => ['string'], 'Imagick::getFeatures' => ['string'], 'Imagick::getFilename' => ['string'], 'Imagick::getFont' => ['string'], 'Imagick::getFormat' => ['string'], 'Imagick::getGravity' => ['int'], 'Imagick::getHDRIEnabled' => ['int'], 'Imagick::getHomeURL' => ['string'], 'Imagick::getImage' => ['Imagick'], 'Imagick::getImageAlphaChannel' => ['int'], 'Imagick::getImageArtifact' => ['string', 'artifact' => 'string'], 'Imagick::getImageAttribute' => ['string', 'key' => 'string'], 'Imagick::getImageBackgroundColor' => ['ImagickPixel'], 'Imagick::getImageBlob' => ['string'], 'Imagick::getImageBluePrimary' => ['array'], 'Imagick::getImageBorderColor' => ['ImagickPixel'], 'Imagick::getImageChannelDepth' => ['int', 'channel' => 'int'], 'Imagick::getImageChannelDistortion' => ['float', 'reference' => 'imagick', 'channel' => 'int', 'metric' => 'int'], 'Imagick::getImageChannelDistortions' => ['float', 'reference' => 'imagick', 'metric' => 'int', 'channel=' => 'int'], 'Imagick::getImageChannelExtrema' => ['array', 'channel' => 'int'], 'Imagick::getImageChannelKurtosis' => ['array', 'channel=' => 'int'], 'Imagick::getImageChannelMean' => ['array', 'channel' => 'int'], 'Imagick::getImageChannelRange' => ['array', 'channel' => 'int'], 'Imagick::getImageChannelStatistics' => ['array'], 'Imagick::getImageClipMask' => ['Imagick'], 'Imagick::getImageColormapColor' => ['ImagickPixel', 'index' => 'int'], 'Imagick::getImageColors' => ['int'], 'Imagick::getImageColorspace' => ['int'], 'Imagick::getImageCompose' => ['int'], 'Imagick::getImageCompression' => ['int'], 'Imagick::getImageCompressionQuality' => ['int'], 'Imagick::getImageDelay' => ['int'], 'Imagick::getImageDepth' => ['int'], 'Imagick::getImageDispose' => ['int'], 'Imagick::getImageDistortion' => ['float', 'reference' => 'magickwand', 'metric' => 'int'], 'Imagick::getImageExtrema' => ['array'], 'Imagick::getImageFilename' => ['string'], 'Imagick::getImageFormat' => ['string'], 'Imagick::getImageGamma' => ['float'], 'Imagick::getImageGeometry' => ['array'], 'Imagick::getImageGravity' => ['int'], 'Imagick::getImageGreenPrimary' => ['array'], 'Imagick::getImageHeight' => ['int'], 'Imagick::getImageHistogram' => ['array'], 'Imagick::getImageIndex' => ['int'], 'Imagick::getImageInterlaceScheme' => ['int'], 'Imagick::getImageInterpolateMethod' => ['int'], 'Imagick::getImageIterations' => ['int'], 'Imagick::getImageLength' => ['int'], 'Imagick::getImageMagickLicense' => ['string'], 'Imagick::getImageMatte' => ['bool'], 'Imagick::getImageMatteColor' => ['ImagickPixel'], 'Imagick::getImageMimeType' => ['string'], 'Imagick::getImageOrientation' => ['int'], 'Imagick::getImagePage' => ['array'], 'Imagick::getImagePixelColor' => ['ImagickPixel', 'x' => 'int', 'y' => 'int'], 'Imagick::getImageProfile' => ['string', 'name' => 'string'], 'Imagick::getImageProfiles' => ['array', 'pattern=' => 'string', 'only_names=' => 'bool'], 'Imagick::getImageProperties' => ['array', 'pattern=' => 'string', 'only_names=' => 'bool'], 'Imagick::getImageProperty' => ['string', 'name' => 'string'], 'Imagick::getImageRedPrimary' => ['array'], 'Imagick::getImageRegion' => ['Imagick', 'width' => 'int', 'height' => 'int', 'x' => 'int', 'y' => 'int'], 'Imagick::getImageRenderingIntent' => ['int'], 'Imagick::getImageResolution' => ['array'], 'Imagick::getImagesBlob' => ['string'], 'Imagick::getImageScene' => ['int'], 'Imagick::getImageSignature' => ['string'], 'Imagick::getImageSize' => ['int'], 'Imagick::getImageTicksPerSecond' => ['int'], 'Imagick::getImageTotalInkDensity' => ['float'], 'Imagick::getImageType' => ['int'], 'Imagick::getImageUnits' => ['int'], 'Imagick::getImageVirtualPixelMethod' => ['int'], 'Imagick::getImageWhitePoint' => ['array'], 'Imagick::getImageWidth' => ['int'], 'Imagick::getInterlaceScheme' => ['int'], 'Imagick::getIteratorIndex' => ['int'], 'Imagick::getNumberImages' => ['int'], 'Imagick::getOption' => ['string', 'key' => 'string'], 'Imagick::getPackageName' => ['string'], 'Imagick::getPage' => ['array'], 'Imagick::getPixelIterator' => ['ImagickPixelIterator'], 'Imagick::getPixelRegionIterator' => ['ImagickPixelIterator', 'x' => 'int', 'y' => 'int', 'columns' => 'int', 'rows' => 'int'], 'Imagick::getPointSize' => ['float'], 'Imagick::getQuantum' => ['int'], 'Imagick::getQuantumDepth' => ['array'], 'Imagick::getQuantumRange' => ['array'], 'Imagick::getRegistry' => ['string', 'key' => 'string'], 'Imagick::getReleaseDate' => ['string'], 'Imagick::getResource' => ['int', 'type' => 'int'], 'Imagick::getResourceLimit' => ['int', 'type' => 'int'], 'Imagick::getSamplingFactors' => ['array'], 'Imagick::getSize' => ['array'], 'Imagick::getSizeOffset' => ['int'], 'Imagick::getVersion' => ['array'], 'Imagick::haldClutImage' => ['bool', 'clut' => 'imagick', 'channel=' => 'int'], 'Imagick::hasNextImage' => ['bool'], 'Imagick::hasPreviousImage' => ['bool'], 'Imagick::identifyFormat' => ['string|false', 'embedText' => 'string'], 'Imagick::identifyImage' => ['array', 'appendrawoutput=' => 'bool'], 'Imagick::identifyImageType' => ['int'], 'Imagick::implodeImage' => ['bool', 'radius' => 'float'], 'Imagick::importImagePixels' => ['bool', 'x' => 'int', 'y' => 'int', 'width' => 'int', 'height' => 'int', 'map' => 'string', 'storage' => 'int', 'pixels' => 'array'], 'Imagick::inverseFourierTransformImage' => ['void', 'complement' => 'string', 'magnitude' => 'string'], 'Imagick::key' => ['int|string'], 'Imagick::labelImage' => ['bool', 'label' => 'string'], 'Imagick::levelImage' => ['bool', 'blackpoint' => 'float', 'gamma' => 'float', 'whitepoint' => 'float', 'channel=' => 'int'], 'Imagick::linearStretchImage' => ['bool', 'blackpoint' => 'float', 'whitepoint' => 'float'], 'Imagick::liquidRescaleImage' => ['bool', 'width' => 'int', 'height' => 'int', 'delta_x' => 'float', 'rigidity' => 'float'], 'Imagick::listRegistry' => ['array'], 'Imagick::localContrastImage' => ['bool', 'radius' => 'float', 'strength' => 'float'], 'Imagick::magnifyImage' => ['bool'], 'Imagick::mapImage' => ['bool', 'map' => 'imagick', 'dither' => 'bool'], 'Imagick::matteFloodfillImage' => ['bool', 'alpha' => 'float', 'fuzz' => 'float', 'bordercolor' => 'mixed', 'x' => 'int', 'y' => 'int'], 'Imagick::medianFilterImage' => ['bool', 'radius' => 'float'], 'Imagick::mergeImageLayers' => ['bool', 'layer_method' => 'int'], 'Imagick::minifyImage' => ['bool'], 'Imagick::modulateImage' => ['bool', 'brightness' => 'float', 'saturation' => 'float', 'hue' => 'float'], 'Imagick::montageImage' => ['Imagick', 'draw' => 'imagickdraw', 'tile_geometry' => 'string', 'thumbnail_geometry' => 'string', 'mode' => 'int', 'frame' => 'string'], 'Imagick::morphImages' => ['Imagick', 'number_frames' => 'int'], 'Imagick::morphology' => ['void', 'morphologyMethod' => 'int', 'iterations' => 'int', 'ImagickKernel' => 'ImagickKernel', 'CHANNEL=' => 'string'], 'Imagick::mosaicImages' => ['Imagick'], 'Imagick::motionBlurImage' => ['bool', 'radius' => 'float', 'sigma' => 'float', 'angle' => 'float', 'channel=' => 'int'], 'Imagick::negateImage' => ['bool', 'gray' => 'bool', 'channel=' => 'int'], 'Imagick::newImage' => ['bool', 'cols' => 'int', 'rows' => 'int', 'background' => 'mixed', 'format=' => 'string'], 'Imagick::newPseudoImage' => ['bool', 'columns' => 'int', 'rows' => 'int', 'pseudostring' => 'string'], 'Imagick::next' => ['void'], 'Imagick::nextImage' => ['bool'], 'Imagick::normalizeImage' => ['bool', 'channel=' => 'int'], 'Imagick::oilPaintImage' => ['bool', 'radius' => 'float'], 'Imagick::opaquePaintImage' => ['bool', 'target' => 'mixed', 'fill' => 'mixed', 'fuzz' => 'float', 'invert' => 'bool', 'channel=' => 'int'], 'Imagick::optimizeImageLayers' => ['bool'], 'Imagick::orderedPosterizeImage' => ['bool', 'threshold_map' => 'string', 'channel=' => 'int'], 'Imagick::paintFloodfillImage' => ['bool', 'fill' => 'mixed', 'fuzz' => 'float', 'bordercolor' => 'mixed', 'x' => 'int', 'y' => 'int', 'channel=' => 'int'], 'Imagick::paintOpaqueImage' => ['bool', 'target' => 'mixed', 'fill' => 'mixed', 'fuzz' => 'float', 'channel=' => 'int'], 'Imagick::paintTransparentImage' => ['bool', 'target' => 'mixed', 'alpha' => 'float', 'fuzz' => 'float'], 'Imagick::pingImage' => ['bool', 'filename' => 'string'], 'Imagick::pingImageBlob' => ['bool', 'image' => 'string'], 'Imagick::pingImageFile' => ['bool', 'filehandle' => 'resource', 'filename=' => 'string'], 'Imagick::polaroidImage' => ['bool', 'properties' => 'imagickdraw', 'angle' => 'float'], 'Imagick::posterizeImage' => ['bool', 'levels' => 'int', 'dither' => 'bool'], 'Imagick::previewImages' => ['bool', 'preview' => 'int'], 'Imagick::previousImage' => ['bool'], 'Imagick::profileImage' => ['bool', 'name' => 'string', 'profile' => 'string'], 'Imagick::quantizeImage' => ['bool', 'numbercolors' => 'int', 'colorspace' => 'int', 'treedepth' => 'int', 'dither' => 'bool', 'measureerror' => 'bool'], 'Imagick::quantizeImages' => ['bool', 'numbercolors' => 'int', 'colorspace' => 'int', 'treedepth' => 'int', 'dither' => 'bool', 'measureerror' => 'bool'], 'Imagick::queryFontMetrics' => ['array', 'properties' => 'imagickdraw', 'text' => 'string', 'multiline=' => 'bool'], 'Imagick::queryFonts' => ['array', 'pattern=' => 'string'], 'Imagick::queryFormats' => ['array', 'pattern=' => 'string'], 'Imagick::radialBlurImage' => ['bool', 'angle' => 'float', 'channel=' => 'int'], 'Imagick::raiseImage' => ['bool', 'width' => 'int', 'height' => 'int', 'x' => 'int', 'y' => 'int', 'raise' => 'bool'], 'Imagick::randomThresholdImage' => ['bool', 'low' => 'float', 'high' => 'float', 'channel=' => 'int'], 'Imagick::readImage' => ['bool', 'filename' => 'string'], 'Imagick::readImageBlob' => ['bool', 'image' => 'string', 'filename=' => 'string'], 'Imagick::readImageFile' => ['bool', 'filehandle' => 'resource', 'filename=' => 'string'], 'Imagick::readImages' => ['Imagick', 'filenames' => 'string'], 'Imagick::recolorImage' => ['bool', 'matrix' => 'array'], 'Imagick::reduceNoiseImage' => ['bool', 'radius' => 'float'], 'Imagick::remapImage' => ['bool', 'replacement' => 'imagick', 'dither' => 'int'], 'Imagick::removeImage' => ['bool'], 'Imagick::removeImageProfile' => ['string', 'name' => 'string'], 'Imagick::render' => ['bool'], 'Imagick::resampleImage' => ['bool', 'x_resolution' => 'float', 'y_resolution' => 'float', 'filter' => 'int', 'blur' => 'float'], 'Imagick::resetImagePage' => ['bool', 'page' => 'string'], 'Imagick::resetIterator' => [''], 'Imagick::resizeImage' => ['bool', 'columns' => 'int', 'rows' => 'int', 'filter' => 'int', 'blur' => 'float', 'bestfit=' => 'bool'], 'Imagick::rewind' => ['void'], 'Imagick::rollImage' => ['bool', 'x' => 'int', 'y' => 'int'], 'Imagick::rotateImage' => ['bool', 'background' => 'mixed', 'degrees' => 'float'], 'Imagick::rotationalBlurImage' => ['void', 'angle' => 'string', 'CHANNEL=' => 'string'], 'Imagick::roundCorners' => ['bool', 'x_rounding' => 'float', 'y_rounding' => 'float', 'stroke_width=' => 'float', 'displace=' => 'float', 'size_correction=' => 'float'], 'Imagick::roundCornersImage' => ['', 'xRounding' => '', 'yRounding' => '', 'strokeWidth' => '', 'displace' => '', 'sizeCorrection' => ''], 'Imagick::sampleImage' => ['bool', 'columns' => 'int', 'rows' => 'int'], 'Imagick::scaleImage' => ['bool', 'cols' => 'int', 'rows' => 'int', 'bestfit=' => 'bool'], 'Imagick::segmentImage' => ['bool', 'colorspace' => 'int', 'cluster_threshold' => 'float', 'smooth_threshold' => 'float', 'verbose=' => 'bool'], 'Imagick::selectiveBlurImage' => ['void', 'radius' => 'float', 'sigma' => 'float', 'threshold' => 'float', 'CHANNEL' => 'int'], 'Imagick::separateImageChannel' => ['bool', 'channel' => 'int'], 'Imagick::sepiaToneImage' => ['bool', 'threshold' => 'float'], 'Imagick::setAntiAlias' => ['int', 'antialias' => 'bool'], 'Imagick::setBackgroundColor' => ['bool', 'background' => 'mixed'], 'Imagick::setColorspace' => ['bool', 'colorspace' => 'int'], 'Imagick::setCompression' => ['bool', 'compression' => 'int'], 'Imagick::setCompressionQuality' => ['bool', 'quality' => 'int'], 'Imagick::setFilename' => ['bool', 'filename' => 'string'], 'Imagick::setFirstIterator' => ['bool'], 'Imagick::setFont' => ['bool', 'font' => 'string'], 'Imagick::setFormat' => ['bool', 'format' => 'string'], 'Imagick::setGravity' => ['bool', 'gravity' => 'int'], 'Imagick::setImage' => ['bool', 'replace' => 'imagick'], 'Imagick::setImageAlpha' => ['bool', 'alpha' => 'float'], 'Imagick::setImageAlphaChannel' => ['bool', 'mode' => 'int'], 'Imagick::setImageArtifact' => ['bool', 'artifact' => 'string', 'value' => 'string'], 'Imagick::setImageAttribute' => ['void', 'key' => 'string', 'value' => 'string'], 'Imagick::setImageBackgroundColor' => ['bool', 'background' => 'mixed'], 'Imagick::setImageBias' => ['bool', 'bias' => 'float'], 'Imagick::setImageBiasQuantum' => ['void', 'bias' => 'string'], 'Imagick::setImageBluePrimary' => ['bool', 'x' => 'float', 'y' => 'float'], 'Imagick::setImageBorderColor' => ['bool', 'border' => 'mixed'], 'Imagick::setImageChannelDepth' => ['bool', 'channel' => 'int', 'depth' => 'int'], 'Imagick::setImageChannelMask' => ['', 'channel' => 'int'], 'Imagick::setImageClipMask' => ['bool', 'clip_mask' => 'imagick'], 'Imagick::setImageColormapColor' => ['bool', 'index' => 'int', 'color' => 'imagickpixel'], 'Imagick::setImageColorspace' => ['bool', 'colorspace' => 'int'], 'Imagick::setImageCompose' => ['bool', 'compose' => 'int'], 'Imagick::setImageCompression' => ['bool', 'compression' => 'int'], 'Imagick::setImageCompressionQuality' => ['bool', 'quality' => 'int'], 'Imagick::setImageDelay' => ['bool', 'delay' => 'int'], 'Imagick::setImageDepth' => ['bool', 'depth' => 'int'], 'Imagick::setImageDispose' => ['bool', 'dispose' => 'int'], 'Imagick::setImageExtent' => ['bool', 'columns' => 'int', 'rows' => 'int'], 'Imagick::setImageFilename' => ['bool', 'filename' => 'string'], 'Imagick::setImageFormat' => ['bool', 'format' => 'string'], 'Imagick::setImageGamma' => ['bool', 'gamma' => 'float'], 'Imagick::setImageGravity' => ['bool', 'gravity' => 'int'], 'Imagick::setImageGreenPrimary' => ['bool', 'x' => 'float', 'y' => 'float'], 'Imagick::setImageIndex' => ['bool', 'index' => 'int'], 'Imagick::setImageInterlaceScheme' => ['bool', 'interlace_scheme' => 'int'], 'Imagick::setImageInterpolateMethod' => ['bool', 'method' => 'int'], 'Imagick::setImageIterations' => ['bool', 'iterations' => 'int'], 'Imagick::setImageMatte' => ['bool', 'matte' => 'bool'], 'Imagick::setImageMatteColor' => ['bool', 'matte' => 'mixed'], 'Imagick::setImageOpacity' => ['bool', 'opacity' => 'float'], 'Imagick::setImageOrientation' => ['bool', 'orientation' => 'int'], 'Imagick::setImagePage' => ['bool', 'width' => 'int', 'height' => 'int', 'x' => 'int', 'y' => 'int'], 'Imagick::setImageProfile' => ['bool', 'name' => 'string', 'profile' => 'string'], 'Imagick::setImageProgressMonitor' => ['', 'filename' => ''], 'Imagick::setImageProperty' => ['bool', 'name' => 'string', 'value' => 'string'], 'Imagick::setImageRedPrimary' => ['bool', 'x' => 'float', 'y' => 'float'], 'Imagick::setImageRenderingIntent' => ['bool', 'rendering_intent' => 'int'], 'Imagick::setImageResolution' => ['bool', 'x_resolution' => 'float', 'y_resolution' => 'float'], 'Imagick::setImageScene' => ['bool', 'scene' => 'int'], 'Imagick::setImageTicksPerSecond' => ['bool', 'ticks_per_second' => 'int'], 'Imagick::setImageType' => ['bool', 'image_type' => 'int'], 'Imagick::setImageUnits' => ['bool', 'units' => 'int'], 'Imagick::setImageVirtualPixelMethod' => ['bool', 'method' => 'int'], 'Imagick::setImageWhitePoint' => ['bool', 'x' => 'float', 'y' => 'float'], 'Imagick::setInterlaceScheme' => ['bool', 'interlace_scheme' => 'int'], 'Imagick::setIteratorIndex' => ['bool', 'index' => 'int'], 'Imagick::setLastIterator' => ['bool'], 'Imagick::setOption' => ['bool', 'key' => 'string', 'value' => 'string'], 'Imagick::setPage' => ['bool', 'width' => 'int', 'height' => 'int', 'x' => 'int', 'y' => 'int'], 'Imagick::setPointSize' => ['bool', 'point_size' => 'float'], 'Imagick::setProgressMonitor' => ['void', 'callback' => 'callable'], 'Imagick::setRegistry' => ['void', 'key' => 'string', 'value' => 'string'], 'Imagick::setResolution' => ['bool', 'x_resolution' => 'float', 'y_resolution' => 'float'], 'Imagick::setResourceLimit' => ['bool', 'type' => 'int', 'limit' => 'int'], 'Imagick::setSamplingFactors' => ['bool', 'factors' => 'array'], 'Imagick::setSize' => ['bool', 'columns' => 'int', 'rows' => 'int'], 'Imagick::setSizeOffset' => ['bool', 'columns' => 'int', 'rows' => 'int', 'offset' => 'int'], 'Imagick::setType' => ['bool', 'image_type' => 'int'], 'Imagick::shadeImage' => ['bool', 'gray' => 'bool', 'azimuth' => 'float', 'elevation' => 'float'], 'Imagick::shadowImage' => ['bool', 'opacity' => 'float', 'sigma' => 'float', 'x' => 'int', 'y' => 'int'], 'Imagick::sharpenImage' => ['bool', 'radius' => 'float', 'sigma' => 'float', 'channel=' => 'int'], 'Imagick::shaveImage' => ['bool', 'columns' => 'int', 'rows' => 'int'], 'Imagick::shearImage' => ['bool', 'background' => 'mixed', 'x_shear' => 'float', 'y_shear' => 'float'], 'Imagick::sigmoidalContrastImage' => ['bool', 'sharpen' => 'bool', 'alpha' => 'float', 'beta' => 'float', 'channel=' => 'int'], 'Imagick::similarityImage' => ['Imagick', 'imagick' => 'Imagick', '&bestMatch' => 'array', '&similarity' => 'float', 'similarity_threshold' => 'float', 'metric' => 'int'], 'Imagick::sketchImage' => ['bool', 'radius' => 'float', 'sigma' => 'float', 'angle' => 'float'], 'Imagick::smushImages' => ['Imagick', 'stack' => 'string', 'offset' => 'string'], 'Imagick::solarizeImage' => ['bool', 'threshold' => 'int'], 'Imagick::sparseColorImage' => ['bool', 'sparse_method' => 'int', 'arguments' => 'array', 'channel=' => 'int'], 'Imagick::spliceImage' => ['bool', 'width' => 'int', 'height' => 'int', 'x' => 'int', 'y' => 'int'], 'Imagick::spreadImage' => ['bool', 'radius' => 'float'], 'Imagick::statisticImage' => ['void', 'type' => 'int', 'width' => 'int', 'height' => 'int', 'CHANNEL=' => 'string'], 'Imagick::steganoImage' => ['Imagick', 'watermark_wand' => 'imagick', 'offset' => 'int'], 'Imagick::stereoImage' => ['bool', 'offset_wand' => 'imagick'], 'Imagick::stripImage' => ['bool'], 'Imagick::subImageMatch' => ['Imagick', 'Imagick' => 'Imagick', '&w_offset=' => 'array', '&w_similarity=' => 'float'], 'Imagick::swirlImage' => ['bool', 'degrees' => 'float'], 'Imagick::textureImage' => ['bool', 'texture_wand' => 'imagick'], 'Imagick::thresholdImage' => ['bool', 'threshold' => 'float', 'channel=' => 'int'], 'Imagick::thumbnailImage' => ['bool', 'columns' => 'int', 'rows' => 'int', 'bestfit=' => 'bool', 'fill=' => 'bool'], 'Imagick::tintImage' => ['bool', 'tint' => 'mixed', 'opacity' => 'mixed'], 'Imagick::transformImage' => ['Imagick', 'crop' => 'string', 'geometry' => 'string'], 'Imagick::transformImageColorspace' => ['bool', 'colorspace' => 'int'], 'Imagick::transparentPaintImage' => ['bool', 'target' => 'mixed', 'alpha' => 'float', 'fuzz' => 'float', 'invert' => 'bool'], 'Imagick::transposeImage' => ['bool'], 'Imagick::transverseImage' => ['bool'], 'Imagick::trimImage' => ['bool', 'fuzz' => 'float'], 'Imagick::uniqueImageColors' => ['bool'], 'Imagick::unsharpMaskImage' => ['bool', 'radius' => 'float', 'sigma' => 'float', 'amount' => 'float', 'threshold' => 'float', 'channel=' => 'int'], 'Imagick::valid' => ['bool'], 'Imagick::vignetteImage' => ['bool', 'blackpoint' => 'float', 'whitepoint' => 'float', 'x' => 'int', 'y' => 'int'], 'Imagick::waveImage' => ['bool', 'amplitude' => 'float', 'length' => 'float'], 'Imagick::whiteThresholdImage' => ['bool', 'threshold' => 'mixed'], 'Imagick::writeImage' => ['bool', 'filename=' => 'string'], 'Imagick::writeImageFile' => ['bool', 'filehandle' => 'resource'], 'Imagick::writeImages' => ['bool', 'filename' => 'string', 'adjoin' => 'bool'], 'Imagick::writeImagesFile' => ['bool', 'filehandle' => 'resource'], 'ImagickDraw::__construct' => ['void'], 'ImagickDraw::affine' => ['bool', 'affine' => 'array'], 'ImagickDraw::annotation' => ['bool', 'x' => 'float', 'y' => 'float', 'text' => 'string'], 'ImagickDraw::arc' => ['bool', 'sx' => 'float', 'sy' => 'float', 'ex' => 'float', 'ey' => 'float', 'sd' => 'float', 'ed' => 'float'], 'ImagickDraw::bezier' => ['bool', 'coordinates' => 'array'], 'ImagickDraw::circle' => ['bool', 'ox' => 'float', 'oy' => 'float', 'px' => 'float', 'py' => 'float'], 'ImagickDraw::clear' => ['bool'], 'ImagickDraw::clone' => ['ImagickDraw'], 'ImagickDraw::color' => ['bool', 'x' => 'float', 'y' => 'float', 'paintmethod' => 'int'], 'ImagickDraw::comment' => ['bool', 'comment' => 'string'], 'ImagickDraw::composite' => ['bool', 'compose' => 'int', 'x' => 'float', 'y' => 'float', 'width' => 'float', 'height' => 'float', 'compositewand' => 'imagick'], 'ImagickDraw::destroy' => ['bool'], 'ImagickDraw::ellipse' => ['bool', 'ox' => 'float', 'oy' => 'float', 'rx' => 'float', 'ry' => 'float', 'start' => 'float', 'end' => 'float'], 'ImagickDraw::getBorderColor' => ['ImagickPixel'], 'ImagickDraw::getClipPath' => ['string'], 'ImagickDraw::getClipRule' => ['int'], 'ImagickDraw::getClipUnits' => ['int'], 'ImagickDraw::getDensity' => ['null|string'], 'ImagickDraw::getFillColor' => ['ImagickPixel'], 'ImagickDraw::getFillOpacity' => ['float'], 'ImagickDraw::getFillRule' => ['int'], 'ImagickDraw::getFont' => ['string'], 'ImagickDraw::getFontFamily' => ['string'], 'ImagickDraw::getFontResolution' => ['array'], 'ImagickDraw::getFontSize' => ['float'], 'ImagickDraw::getFontStretch' => ['int'], 'ImagickDraw::getFontStyle' => ['int'], 'ImagickDraw::getFontWeight' => ['int'], 'ImagickDraw::getGravity' => ['int'], 'ImagickDraw::getOpacity' => ['float'], 'ImagickDraw::getStrokeAntialias' => ['bool'], 'ImagickDraw::getStrokeColor' => ['ImagickPixel'], 'ImagickDraw::getStrokeDashArray' => ['array'], 'ImagickDraw::getStrokeDashOffset' => ['float'], 'ImagickDraw::getStrokeLineCap' => ['int'], 'ImagickDraw::getStrokeLineJoin' => ['int'], 'ImagickDraw::getStrokeMiterLimit' => ['int'], 'ImagickDraw::getStrokeOpacity' => ['float'], 'ImagickDraw::getStrokeWidth' => ['float'], 'ImagickDraw::getTextAlignment' => ['int'], 'ImagickDraw::getTextAntialias' => ['bool'], 'ImagickDraw::getTextDecoration' => ['int'], 'ImagickDraw::getTextDirection' => ['bool'], 'ImagickDraw::getTextEncoding' => ['string'], 'ImagickDraw::getTextInterlineSpacing' => ['float'], 'ImagickDraw::getTextInterwordSpacing' => ['float'], 'ImagickDraw::getTextKerning' => ['float'], 'ImagickDraw::getTextUnderColor' => ['ImagickPixel'], 'ImagickDraw::getVectorGraphics' => ['string'], 'ImagickDraw::line' => ['bool', 'sx' => 'float', 'sy' => 'float', 'ex' => 'float', 'ey' => 'float'], 'ImagickDraw::matte' => ['bool', 'x' => 'float', 'y' => 'float', 'paintmethod' => 'int'], 'ImagickDraw::pathClose' => ['bool'], 'ImagickDraw::pathCurveToAbsolute' => ['bool', 'x1' => 'float', 'y1' => 'float', 'x2' => 'float', 'y2' => 'float', 'x' => 'float', 'y' => 'float'], 'ImagickDraw::pathCurveToQuadraticBezierAbsolute' => ['bool', 'x1' => 'float', 'y1' => 'float', 'x' => 'float', 'y' => 'float'], 'ImagickDraw::pathCurveToQuadraticBezierRelative' => ['bool', 'x1' => 'float', 'y1' => 'float', 'x' => 'float', 'y' => 'float'], 'ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute' => ['bool', 'x' => 'float', 'y' => 'float'], 'ImagickDraw::pathCurveToQuadraticBezierSmoothRelative' => ['bool', 'x' => 'float', 'y' => 'float'], 'ImagickDraw::pathCurveToRelative' => ['bool', 'x1' => 'float', 'y1' => 'float', 'x2' => 'float', 'y2' => 'float', 'x' => 'float', 'y' => 'float'], 'ImagickDraw::pathCurveToSmoothAbsolute' => ['bool', 'x2' => 'float', 'y2' => 'float', 'x' => 'float', 'y' => 'float'], 'ImagickDraw::pathCurveToSmoothRelative' => ['bool', 'x2' => 'float', 'y2' => 'float', 'x' => 'float', 'y' => 'float'], 'ImagickDraw::pathEllipticArcAbsolute' => ['bool', 'rx' => 'float', 'ry' => 'float', 'x_axis_rotation' => 'float', 'large_arc_flag' => 'bool', 'sweep_flag' => 'bool', 'x' => 'float', 'y' => 'float'], 'ImagickDraw::pathEllipticArcRelative' => ['bool', 'rx' => 'float', 'ry' => 'float', 'x_axis_rotation' => 'float', 'large_arc_flag' => 'bool', 'sweep_flag' => 'bool', 'x' => 'float', 'y' => 'float'], 'ImagickDraw::pathFinish' => ['bool'], 'ImagickDraw::pathLineToAbsolute' => ['bool', 'x' => 'float', 'y' => 'float'], 'ImagickDraw::pathLineToHorizontalAbsolute' => ['bool', 'x' => 'float'], 'ImagickDraw::pathLineToHorizontalRelative' => ['bool', 'x' => 'float'], 'ImagickDraw::pathLineToRelative' => ['bool', 'x' => 'float', 'y' => 'float'], 'ImagickDraw::pathLineToVerticalAbsolute' => ['bool', 'y' => 'float'], 'ImagickDraw::pathLineToVerticalRelative' => ['bool', 'y' => 'float'], 'ImagickDraw::pathMoveToAbsolute' => ['bool', 'x' => 'float', 'y' => 'float'], 'ImagickDraw::pathMoveToRelative' => ['bool', 'x' => 'float', 'y' => 'float'], 'ImagickDraw::pathStart' => ['bool'], 'ImagickDraw::point' => ['bool', 'x' => 'float', 'y' => 'float'], 'ImagickDraw::polygon' => ['bool', 'coordinates' => 'array'], 'ImagickDraw::polyline' => ['bool', 'coordinates' => 'array'], 'ImagickDraw::pop' => ['bool'], 'ImagickDraw::popClipPath' => ['bool'], 'ImagickDraw::popDefs' => ['bool'], 'ImagickDraw::popPattern' => ['bool'], 'ImagickDraw::push' => ['bool'], 'ImagickDraw::pushClipPath' => ['bool', 'clip_mask_id' => 'string'], 'ImagickDraw::pushDefs' => ['bool'], 'ImagickDraw::pushPattern' => ['bool', 'pattern_id' => 'string', 'x' => 'float', 'y' => 'float', 'width' => 'float', 'height' => 'float'], 'ImagickDraw::rectangle' => ['bool', 'x1' => 'float', 'y1' => 'float', 'x2' => 'float', 'y2' => 'float'], 'ImagickDraw::render' => ['bool'], 'ImagickDraw::resetVectorGraphics' => ['void'], 'ImagickDraw::rotate' => ['bool', 'degrees' => 'float'], 'ImagickDraw::roundRectangle' => ['bool', 'x1' => 'float', 'y1' => 'float', 'x2' => 'float', 'y2' => 'float', 'rx' => 'float', 'ry' => 'float'], 'ImagickDraw::scale' => ['bool', 'x' => 'float', 'y' => 'float'], 'ImagickDraw::setBorderColor' => ['bool', 'color' => 'ImagickPixel'], 'ImagickDraw::setClipPath' => ['bool', 'clip_mask' => 'string'], 'ImagickDraw::setClipRule' => ['bool', 'fill_rule' => 'int'], 'ImagickDraw::setClipUnits' => ['bool', 'clip_units' => 'int'], 'ImagickDraw::setDensity' => ['bool', 'density_string' => 'string'], 'ImagickDraw::setFillAlpha' => ['bool', 'opacity' => 'float'], 'ImagickDraw::setFillColor' => ['bool', 'fill_pixel' => 'imagickpixel'], 'ImagickDraw::setFillOpacity' => ['bool', 'fillopacity' => 'float'], 'ImagickDraw::setFillPatternURL' => ['bool', 'fill_url' => 'string'], 'ImagickDraw::setFillRule' => ['bool', 'fill_rule' => 'int'], 'ImagickDraw::setFont' => ['bool', 'font_name' => 'string'], 'ImagickDraw::setFontFamily' => ['bool', 'font_family' => 'string'], 'ImagickDraw::setFontResolution' => ['bool', 'x' => 'float', 'y' => 'float'], 'ImagickDraw::setFontSize' => ['bool', 'pointsize' => 'float'], 'ImagickDraw::setFontStretch' => ['bool', 'fontstretch' => 'int'], 'ImagickDraw::setFontStyle' => ['bool', 'style' => 'int'], 'ImagickDraw::setFontWeight' => ['bool', 'font_weight' => 'int'], 'ImagickDraw::setGravity' => ['bool', 'gravity' => 'int'], 'ImagickDraw::setOpacity' => ['void', 'opacity' => 'float'], 'ImagickDraw::setResolution' => ['void', 'x_resolution' => 'string', 'y_resolution' => 'string'], 'ImagickDraw::setStrokeAlpha' => ['bool', 'opacity' => 'float'], 'ImagickDraw::setStrokeAntialias' => ['bool', 'stroke_antialias' => 'bool'], 'ImagickDraw::setStrokeColor' => ['bool', 'stroke_pixel' => 'imagickpixel'], 'ImagickDraw::setStrokeDashArray' => ['bool', 'dasharray' => 'array'], 'ImagickDraw::setStrokeDashOffset' => ['bool', 'dash_offset' => 'float'], 'ImagickDraw::setStrokeLineCap' => ['bool', 'linecap' => 'int'], 'ImagickDraw::setStrokeLineJoin' => ['bool', 'linejoin' => 'int'], 'ImagickDraw::setStrokeMiterLimit' => ['bool', 'miterlimit' => 'int'], 'ImagickDraw::setStrokeOpacity' => ['bool', 'stroke_opacity' => 'float'], 'ImagickDraw::setStrokePatternURL' => ['bool', 'stroke_url' => 'string'], 'ImagickDraw::setStrokeWidth' => ['bool', 'stroke_width' => 'float'], 'ImagickDraw::setTextAlignment' => ['bool', 'alignment' => 'int'], 'ImagickDraw::setTextAntialias' => ['bool', 'antialias' => 'bool'], 'ImagickDraw::setTextDecoration' => ['bool', 'decoration' => 'int'], 'ImagickDraw::setTextDirection' => ['bool', 'direction' => 'int'], 'ImagickDraw::setTextEncoding' => ['bool', 'encoding' => 'string'], 'ImagickDraw::setTextInterlineSpacing' => ['void', 'spacing' => 'float'], 'ImagickDraw::setTextInterwordSpacing' => ['void', 'spacing' => 'float'], 'ImagickDraw::setTextKerning' => ['void', 'kerning' => 'float'], 'ImagickDraw::setTextUnderColor' => ['bool', 'under_color' => 'imagickpixel'], 'ImagickDraw::setVectorGraphics' => ['bool', 'xml' => 'string'], 'ImagickDraw::setViewbox' => ['bool', 'x1' => 'int', 'y1' => 'int', 'x2' => 'int', 'y2' => 'int'], 'ImagickDraw::skewX' => ['bool', 'degrees' => 'float'], 'ImagickDraw::skewY' => ['bool', 'degrees' => 'float'], 'ImagickDraw::translate' => ['bool', 'x' => 'float', 'y' => 'float'], 'ImagickKernel::addKernel' => ['void', 'ImagickKernel' => 'ImagickKernel'], 'ImagickKernel::addUnityKernel' => ['void'], 'ImagickKernel::fromBuiltin' => ['ImagickKernel', 'kernelType' => 'string', 'kernelString' => 'string'], 'ImagickKernel::fromMatrix' => ['ImagickKernel', 'matrix' => 'array', 'origin=' => 'array'], 'ImagickKernel::getMatrix' => ['array'], 'ImagickKernel::scale' => ['void'], 'ImagickKernel::separate' => ['array'], 'ImagickKernel::seperate' => ['void'], 'ImagickPixel::__construct' => ['void', 'color=' => 'string'], 'ImagickPixel::clear' => ['bool'], 'ImagickPixel::clone' => ['void'], 'ImagickPixel::destroy' => ['bool'], 'ImagickPixel::getColor' => ['array', 'normalized=' => 'bool'], 'ImagickPixel::getColorAsString' => ['string'], 'ImagickPixel::getColorCount' => ['int'], 'ImagickPixel::getColorQuantum' => ['mixed'], 'ImagickPixel::getColorValue' => ['float', 'color' => 'int'], 'ImagickPixel::getColorValueQuantum' => ['mixed'], 'ImagickPixel::getHSL' => ['array'], 'ImagickPixel::getIndex' => ['int'], 'ImagickPixel::isPixelSimilar' => ['bool', 'color' => 'ImagickPixel', 'fuzz' => 'float'], 'ImagickPixel::isPixelSimilarQuantum' => ['bool', 'color' => 'string', 'fuzz=' => 'string'], 'ImagickPixel::isSimilar' => ['bool', 'color' => 'imagickpixel', 'fuzz' => 'float'], 'ImagickPixel::setColor' => ['bool', 'color' => 'string'], 'ImagickPixel::setcolorcount' => ['void', 'colorCount' => 'string'], 'ImagickPixel::setColorFromPixel' => ['bool', 'srcPixel' => 'ImagickPixel'], 'ImagickPixel::setColorValue' => ['bool', 'color' => 'int', 'value' => 'float'], 'ImagickPixel::setColorValueQuantum' => ['void', 'color' => 'int', 'value' => 'mixed'], 'ImagickPixel::setHSL' => ['bool', 'hue' => 'float', 'saturation' => 'float', 'luminosity' => 'float'], 'ImagickPixel::setIndex' => ['void', 'index' => 'int'], 'ImagickPixelIterator::__construct' => ['void', 'wand' => 'imagick'], 'ImagickPixelIterator::clear' => ['bool'], 'ImagickPixelIterator::current' => ['mixed'], 'ImagickPixelIterator::destroy' => ['bool'], 'ImagickPixelIterator::getCurrentIteratorRow' => ['array'], 'ImagickPixelIterator::getIteratorRow' => ['int'], 'ImagickPixelIterator::getNextIteratorRow' => ['array'], 'ImagickPixelIterator::getpixeliterator' => ['', 'Imagick' => 'Imagick'], 'ImagickPixelIterator::getpixelregioniterator' => ['', 'Imagick' => 'Imagick', 'x' => '', 'y' => '', 'columns' => '', 'rows' => ''], 'ImagickPixelIterator::getPreviousIteratorRow' => ['array'], 'ImagickPixelIterator::key' => ['int|string'], 'ImagickPixelIterator::newPixelIterator' => ['bool', 'wand' => 'imagick'], 'ImagickPixelIterator::newPixelRegionIterator' => ['bool', 'wand' => 'imagick', 'x' => 'int', 'y' => 'int', 'columns' => 'int', 'rows' => 'int'], 'ImagickPixelIterator::next' => ['void'], 'ImagickPixelIterator::resetIterator' => ['bool'], 'ImagickPixelIterator::rewind' => ['void'], 'ImagickPixelIterator::setIteratorFirstRow' => ['bool'], 'ImagickPixelIterator::setIteratorLastRow' => ['bool'], 'ImagickPixelIterator::setIteratorRow' => ['bool', 'row' => 'int'], 'ImagickPixelIterator::syncIterator' => ['bool'], 'ImagickPixelIterator::valid' => ['bool'], 'imap_8bit' => ['string|false', 'text' => 'string'], 'imap_alerts' => ['array|false'], 'imap_append' => ['bool', 'stream_id' => 'resource', 'folder' => 'string', 'message' => 'string', 'options=' => 'string', 'internal_date=' => 'string'], 'imap_base64' => ['string|false', 'text' => 'string'], 'imap_binary' => ['string|false', 'text' => 'string'], 'imap_body' => ['string|false', 'stream_id' => 'resource', 'msg_no' => 'int', 'options=' => 'int'], 'imap_bodystruct' => ['stdClass|false', 'stream_id' => 'resource', 'msg_no' => 'int', 'section' => 'string'], 'imap_check' => ['stdClass|false', 'stream_id' => 'resource'], 'imap_clearflag_full' => ['bool', 'stream_id' => 'resource', 'sequence' => 'string', 'flag' => 'string', 'options=' => 'int'], 'imap_close' => ['bool', 'stream_id' => 'resource', 'options=' => 'int'], 'imap_create' => ['bool', 'stream_id' => 'resource', 'mailbox' => 'string'], 'imap_createmailbox' => ['bool', 'stream_id' => 'resource', 'mailbox' => 'string'], 'imap_delete' => ['bool', 'stream_id' => 'resource', 'msg_no' => 'int', 'options=' => 'int'], 'imap_deletemailbox' => ['bool', 'stream_id' => 'resource', 'mailbox' => 'string'], 'imap_errors' => ['array|false'], 'imap_expunge' => ['bool', 'stream_id' => 'resource'], 'imap_fetch_overview' => ['array|false', 'stream_id' => 'resource', 'sequence' => 'string', 'options=' => 'int'], 'imap_fetchbody' => ['string|false', 'stream_id' => 'resource', 'msg_no' => 'int', 'section' => 'string', 'options=' => 'int'], 'imap_fetchheader' => ['string|false', 'stream_id' => 'resource', 'msg_no' => 'int', 'options=' => 'int'], 'imap_fetchmime' => ['string|false', 'stream_id' => 'resource', 'msg_no' => 'int', 'section' => 'string', 'options=' => 'int'], 'imap_fetchstructure' => ['stdClass|false', 'stream_id' => 'resource', 'msg_no' => 'int', 'options=' => 'int'], 'imap_fetchtext' => ['string|false', 'stream_id' => 'resource', 'msg_no' => 'int', 'options=' => 'int'], 'imap_gc' => ['bool', 'stream_id' => 'resource', 'flags' => 'int'], 'imap_get_quota' => ['array|false', 'stream_id' => 'resource', 'qroot' => 'string'], 'imap_get_quotaroot' => ['array|false', 'stream_id' => 'resource', 'mbox' => 'string'], 'imap_getacl' => ['array|false', 'stream_id' => 'resource', 'mailbox' => 'string'], 'imap_getmailboxes' => ['array|false', 'stream_id' => 'resource', 'ref' => 'string', 'pattern' => 'string'], 'imap_getsubscribed' => ['array|false', 'stream_id' => 'resource', 'ref' => 'string', 'pattern' => 'string'], 'imap_header' => ['stdClass|false', 'stream_id' => 'resource', 'msg_no' => 'int', 'from_length=' => 'int', 'subject_length=' => 'int', 'default_host=' => 'string'], 'imap_headerinfo' => ['stdClass|false', 'stream_id' => 'resource', 'msg_no' => 'int', 'from_length=' => 'int', 'subject_length=' => 'int', 'default_host=' => 'string'], 'imap_headers' => ['array|false', 'stream_id' => 'resource'], 'imap_last_error' => ['string|false'], 'imap_list' => ['array|false', 'stream_id' => 'resource', 'ref' => 'string', 'pattern' => 'string'], 'imap_listmailbox' => ['array|false', 'stream_id' => 'resource', 'ref' => 'string', 'pattern' => 'string'], 'imap_listscan' => ['array|false', 'stream_id' => 'resource', 'ref' => 'string', 'pattern' => 'string', 'content' => 'string'], 'imap_listsubscribed' => ['array|false', 'stream_id' => 'resource', 'ref' => 'string', 'pattern' => 'string'], 'imap_lsub' => ['array|false', 'stream_id' => 'resource', 'ref' => 'string', 'pattern' => 'string'], 'imap_mail' => ['bool', 'to' => 'string', 'subject' => 'string', 'message' => 'string', 'additional_headers=' => 'string', 'cc=' => 'string', 'bcc=' => 'string', 'rpath=' => 'string'], 'imap_mail_compose' => ['string|false', 'envelope' => 'array', 'body' => 'array'], 'imap_mail_copy' => ['bool', 'stream_id' => 'resource', 'msglist' => 'string', 'mailbox' => 'string', 'options=' => 'int'], 'imap_mail_move' => ['bool', 'stream_id' => 'resource', 'sequence' => 'string', 'mailbox' => 'string', 'options=' => 'int'], 'imap_mailboxmsginfo' => ['stdClass|false', 'stream_id' => 'resource'], 'imap_mime_header_decode' => ['array|false', 'str' => 'string'], 'imap_msgno' => ['int|false', 'stream_id' => 'resource', 'unique_msg_id' => 'int'], 'imap_mutf7_to_utf8' => ['string|false', 'in' => 'string'], 'imap_num_msg' => ['int|false', 'stream_id' => 'resource'], 'imap_num_recent' => ['int|false', 'stream_id' => 'resource'], 'imap_open' => ['resource|false', 'mailbox' => 'string', 'user' => 'string', 'password' => 'string', 'options=' => 'int', 'n_retries=' => 'int', 'params=' => 'array|null'], 'imap_ping' => ['bool', 'stream_id' => 'resource'], 'imap_qprint' => ['string|false', 'text' => 'string'], 'imap_rename' => ['bool', 'stream_id' => 'resource', 'old_name' => 'string', 'new_name' => 'string'], 'imap_renamemailbox' => ['bool', 'stream_id' => 'resource', 'old_name' => 'string', 'new_name' => 'string'], 'imap_reopen' => ['bool', 'stream_id' => 'resource', 'mailbox' => 'string', 'options=' => 'int', 'n_retries=' => 'int'], 'imap_rfc822_parse_adrlist' => ['array', 'address_string' => 'string', 'default_host' => 'string'], 'imap_rfc822_parse_headers' => ['stdClass', 'headers' => 'string', 'default_host=' => 'string'], 'imap_rfc822_write_address' => ['string|false', 'mailbox' => '?string', 'host' => '?string', 'personal' => '?string'], 'imap_savebody' => ['bool', 'stream_id' => 'resource', 'file' => 'string|resource', 'msg_no' => 'int', 'section=' => 'string', 'options=' => 'int'], 'imap_scan' => ['array|false', 'stream_id' => 'resource', 'ref' => 'string', 'pattern' => 'string', 'content' => 'string'], 'imap_scanmailbox' => ['array|false', 'stream_id' => 'resource', 'ref' => 'string', 'pattern' => 'string', 'content' => 'string'], 'imap_search' => ['array|false', 'stream_id' => 'resource', 'criteria' => 'string', 'options=' => 'int', 'charset=' => 'string'], 'imap_set_quota' => ['bool', 'stream_id' => 'resource', 'qroot' => 'string', 'mailbox_size' => 'int'], 'imap_setacl' => ['bool', 'stream_id' => 'resource', 'mailbox' => 'string', 'id' => 'string', 'rights' => 'string'], 'imap_setflag_full' => ['bool', 'stream_id' => 'resource', 'sequence' => 'string', 'flag' => 'string', 'options=' => 'int'], 'imap_sort' => ['array|false', 'stream_id' => 'resource', 'criteria' => 'int', 'reverse' => 'int', 'options=' => 'int', 'search_criteria=' => 'string', 'charset=' => 'string'], 'imap_status' => ['stdClass|false', 'stream_id' => 'resource', 'mailbox' => 'string', 'options' => 'int'], 'imap_subscribe' => ['bool', 'stream_id' => 'resource', 'mailbox' => 'string'], 'imap_thread' => ['array|false', 'stream_id' => 'resource', 'options=' => 'int'], 'imap_timeout' => ['mixed', 'timeout_type' => 'int', 'timeout=' => 'int'], 'imap_uid' => ['int|false', 'stream_id' => 'resource', 'msg_no' => 'int'], 'imap_undelete' => ['bool', 'stream_id' => 'resource', 'msg_no' => 'int', 'flags=' => 'int'], 'imap_unsubscribe' => ['bool', 'stream_id' => 'resource', 'mailbox' => 'string'], 'imap_utf7_decode' => ['string|false', 'buf' => 'string'], 'imap_utf7_encode' => ['string', 'buf' => 'string'], 'imap_utf8' => ['string', 'mime_encoded_text' => 'string'], 'imap_utf8_to_mutf7' => ['string|false', 'in' => 'string'], 'implode' => ['string', 'glue' => 'string', 'pieces' => 'array'], 'implode\'1' => ['string', 'pieces' => 'array', 'glue=' => 'string'], 'import_request_variables' => ['bool', 'types' => 'string', 'prefix=' => 'string'], 'in_array' => ['bool', 'needle' => 'mixed', 'haystack' => 'array', 'strict=' => 'bool'], 'inclued_get_data' => ['array'], 'inet_ntop' => ['string|false', 'in_addr' => 'string'], 'inet_pton' => ['string|false', 'ip_address' => 'string'], 'InfiniteIterator::__construct' => ['void', 'it' => 'iterator'], 'InfiniteIterator::next' => ['void'], 'inflate_add' => ['string|false', 'context' => 'resource', 'encoded_data' => 'string', 'flush_mode=' => 'int'], 'inflate_get_read_len' => ['int|false', 'resource' => 'resource'], 'inflate_get_status' => ['int|false', 'resource' => 'resource'], 'inflate_init' => ['resource|false', 'encoding' => 'int', 'options=' => 'array'], 'ingres_autocommit' => ['bool', 'link' => 'resource'], 'ingres_autocommit_state' => ['bool', 'link' => 'resource'], 'ingres_charset' => ['string', 'link' => 'resource'], 'ingres_close' => ['bool', 'link' => 'resource'], 'ingres_commit' => ['bool', 'link' => 'resource'], 'ingres_connect' => ['resource', 'database=' => 'string', 'username=' => 'string', 'password=' => 'string', 'options=' => 'array'], 'ingres_cursor' => ['string', 'result' => 'resource'], 'ingres_errno' => ['int', 'link=' => 'resource'], 'ingres_error' => ['string', 'link=' => 'resource'], 'ingres_errsqlstate' => ['string', 'link=' => 'resource'], 'ingres_escape_string' => ['string', 'link' => 'resource', 'source_string' => 'string'], 'ingres_execute' => ['bool', 'result' => 'resource', 'params=' => 'array', 'types=' => 'string'], 'ingres_fetch_array' => ['array', 'result' => 'resource', 'result_type=' => 'int'], 'ingres_fetch_assoc' => ['array', 'result' => 'resource'], 'ingres_fetch_object' => ['object', 'result' => 'resource', 'result_type=' => 'int'], 'ingres_fetch_proc_return' => ['int', 'result' => 'resource'], 'ingres_fetch_row' => ['array', 'result' => 'resource'], 'ingres_field_length' => ['int', 'result' => 'resource', 'index' => 'int'], 'ingres_field_name' => ['string', 'result' => 'resource', 'index' => 'int'], 'ingres_field_nullable' => ['bool', 'result' => 'resource', 'index' => 'int'], 'ingres_field_precision' => ['int', 'result' => 'resource', 'index' => 'int'], 'ingres_field_scale' => ['int', 'result' => 'resource', 'index' => 'int'], 'ingres_field_type' => ['string', 'result' => 'resource', 'index' => 'int'], 'ingres_free_result' => ['bool', 'result' => 'resource'], 'ingres_next_error' => ['bool', 'link=' => 'resource'], 'ingres_num_fields' => ['int', 'result' => 'resource'], 'ingres_num_rows' => ['int', 'result' => 'resource'], 'ingres_pconnect' => ['resource', 'database=' => 'string', 'username=' => 'string', 'password=' => 'string', 'options=' => 'array'], 'ingres_prepare' => ['mixed', 'link' => 'resource', 'query' => 'string'], 'ingres_query' => ['mixed', 'link' => 'resource', 'query' => 'string', 'params=' => 'array', 'types=' => 'string'], 'ingres_result_seek' => ['bool', 'result' => 'resource', 'position' => 'int'], 'ingres_rollback' => ['bool', 'link' => 'resource'], 'ingres_set_environment' => ['bool', 'link' => 'resource', 'options' => 'array'], 'ingres_unbuffered_query' => ['mixed', 'link' => 'resource', 'query' => 'string', 'params=' => 'array', 'types=' => 'string'], 'ini_alter' => ['string|false', 'varname' => 'string', 'newvalue' => 'string|int|float|bool'], 'ini_get' => ['string|false', 'varname' => 'string'], 'ini_get_all' => ['array', 'extension=' => '?string', 'details=' => 'bool'], 'ini_restore' => ['void', 'varname' => 'string'], 'ini_set' => ['string|false', 'varname' => 'string', 'newvalue' => 'string|int|float|bool'], 'inotify_add_watch' => ['int', 'inotify_instance' => 'resource', 'pathname' => 'string', 'mask' => 'int'], 'inotify_init' => ['resource'], 'inotify_queue_len' => ['int', 'inotify_instance' => 'resource'], 'inotify_read' => ['array', 'inotify_instance' => 'resource'], 'inotify_rm_watch' => ['bool', 'inotify_instance' => 'resource', 'watch_descriptor' => 'int'], 'intdiv' => ['int', 'numerator' => 'int', 'divisor' => 'int'], 'interface_exists' => ['bool', 'classname' => 'string', 'autoload=' => 'bool'], 'intl_error_name' => ['string', 'error_code' => 'int'], 'intl_get_error_code' => ['int'], 'intl_get_error_message' => ['string'], 'intl_is_failure' => ['bool', 'error_code' => 'int'], 'IntlBreakIterator::__construct' => ['void'], 'IntlBreakIterator::createCharacterInstance' => ['IntlRuleBasedBreakIterator', 'locale=' => 'string'], 'IntlBreakIterator::createCodePointInstance' => ['IntlCodePointBreakIterator'], 'IntlBreakIterator::createLineInstance' => ['IntlRuleBasedBreakIterator', 'locale=' => 'string'], 'IntlBreakIterator::createSentenceInstance' => ['IntlRuleBasedBreakIterator', 'locale=' => 'string'], 'IntlBreakIterator::createTitleInstance' => ['IntlRuleBasedBreakIterator', 'locale=' => 'string'], 'IntlBreakIterator::createWordInstance' => ['IntlRuleBasedBreakIterator', 'locale=' => 'string'], 'IntlBreakIterator::current' => ['int'], 'IntlBreakIterator::first' => ['int'], 'IntlBreakIterator::following' => ['int', 'offset' => 'string'], 'IntlBreakIterator::getErrorCode' => ['int'], 'IntlBreakIterator::getErrorMessage' => ['string'], 'IntlBreakIterator::getLocale' => ['string', 'locale_type' => 'string'], 'IntlBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type=' => 'string'], 'IntlBreakIterator::getText' => ['string'], 'IntlBreakIterator::isBoundary' => ['bool', 'offset' => 'string'], 'IntlBreakIterator::last' => ['int'], 'IntlBreakIterator::next' => ['int', 'offset=' => 'int'], 'IntlBreakIterator::preceding' => ['int', 'offset' => 'int'], 'IntlBreakIterator::previous' => ['int'], 'IntlBreakIterator::setText' => ['bool', 'text' => 'string'], 'intlcal_add' => ['bool', 'cal' => 'IntlCalendar', 'field' => 'int', 'amount' => 'int'], 'intlcal_after' => ['bool', 'cal' => 'IntlCalendar', 'other' => 'IntlCalendar'], 'intlcal_before' => ['bool', 'cal' => 'IntlCalendar', 'other' => 'IntlCalendar'], 'intlcal_clear' => ['bool', 'cal' => 'IntlCalendar', 'field=' => 'int'], 'intlcal_create_instance' => ['IntlCalendar', 'timeZone=' => 'mixed', 'locale=' => 'string'], 'intlcal_equals' => ['bool', 'cal' => 'IntlCalendar', 'other' => 'IntlCalendar'], 'intlcal_field_difference' => ['int', 'cal' => 'IntlCalendar', 'when' => 'float', 'field' => 'int'], 'intlcal_from_date_time' => ['IntlCalendar', 'dateTime' => 'DateTime|string'], 'intlcal_get' => ['int', 'cal' => 'IntlCalendar', 'field' => 'int'], 'intlcal_get_actual_maximum' => ['int', 'cal' => 'IntlCalendar', 'field' => 'int'], 'intlcal_get_actual_minimum' => ['int', 'cal' => 'IntlCalendar', 'field' => 'int'], 'intlcal_get_available_locales' => ['array'], 'intlcal_get_day_of_week_type' => ['int', 'cal' => 'IntlCalendar', 'dayOfWeek' => 'int'], 'intlcal_get_first_day_of_week' => ['int', 'cal' => 'IntlCalendar'], 'intlcal_get_greatest_minimum' => ['int', 'cal' => 'IntlCalendar', 'field' => 'int'], 'intlcal_get_keyword_values_for_locale' => ['Iterator', 'key' => 'string', 'locale' => 'string', 'commonlyUsed' => 'bool'], 'intlcal_get_least_maximum' => ['int', 'cal' => 'IntlCalendar', 'field' => 'int'], 'intlcal_get_locale' => ['string', 'cal' => 'IntlCalendar', 'localeType' => 'int'], 'intlcal_get_maximum' => ['int', 'cal' => 'IntlCalendar', 'field' => 'int'], 'intlcal_get_minimal_days_in_first_week' => ['int', 'cal' => 'IntlCalendar'], 'intlcal_get_minimum' => ['int', 'cal' => 'IntlCalendar', 'field' => 'int'], 'intlcal_get_now' => ['float'], 'intlcal_get_repeated_wall_time_option' => ['int', 'cal' => 'IntlCalendar'], 'intlcal_get_skipped_wall_time_option' => ['int', 'cal' => 'IntlCalendar'], 'intlcal_get_time' => ['float', 'cal' => 'IntlCalendar'], 'intlcal_get_time_zone' => ['IntlTimeZone', 'cal' => 'IntlCalendar'], 'intlcal_get_type' => ['string', 'cal' => 'IntlCalendar'], 'intlcal_get_weekend_transition' => ['int', 'cal' => 'IntlCalendar', 'dayOfWeek' => 'string'], 'intlcal_in_daylight_time' => ['bool', 'cal' => 'IntlCalendar'], 'intlcal_is_equivalent_to' => ['bool', 'cal' => 'IntlCalendar', 'other' => 'IntlCalendar'], 'intlcal_is_lenient' => ['bool', 'cal' => 'IntlCalendar'], 'intlcal_is_set' => ['bool', 'cal' => 'IntlCalendar', 'field' => 'int'], 'intlcal_is_weekend' => ['bool', 'cal' => 'IntlCalendar', 'date=' => 'float'], 'intlcal_roll' => ['bool', 'cal' => 'IntlCalendar', 'field' => 'int', 'amountOrUpOrDown' => 'mixed'], 'intlcal_set' => ['bool', 'cal' => 'IntlCalendar', 'field' => 'int', 'value' => 'int'], 'intlcal_set\'1' => ['bool', 'cal' => 'IntlCalendar', 'year' => 'int', 'month' => 'int', 'dayOfMonth=' => 'int', 'hour=' => 'int', 'minute=' => 'int', 'second=' => 'int'], 'intlcal_set_first_day_of_week' => ['bool', 'cal' => 'IntlCalendar', 'dayOfWeek' => 'int'], 'intlcal_set_lenient' => ['bool', 'cal' => 'IntlCalendar', 'isLenient' => 'bool'], 'intlcal_set_repeated_wall_time_option' => ['bool', 'cal' => 'IntlCalendar', 'wallTimeOption' => 'int'], 'intlcal_set_skipped_wall_time_option' => ['bool', 'cal' => 'IntlCalendar', 'wallTimeOption' => 'int'], 'intlcal_set_time' => ['bool', 'cal' => 'IntlCalendar', 'date' => 'float'], 'intlcal_set_time_zone' => ['bool', 'cal' => 'IntlCalendar', 'timeZone' => 'mixed'], 'intlcal_to_date_time' => ['DateTime', 'cal' => 'IntlCalendar'], 'IntlCalendar::__construct' => ['void'], 'IntlCalendar::add' => ['bool', 'field' => 'int', 'amount' => 'int'], 'IntlCalendar::after' => ['bool', 'other' => 'IntlCalendar'], 'IntlCalendar::before' => ['bool', 'other' => 'IntlCalendar'], 'IntlCalendar::clear' => ['bool', 'field=' => 'int'], 'IntlCalendar::createInstance' => ['IntlCalendar', 'timeZone=' => 'mixed', 'locale=' => 'string'], 'IntlCalendar::equals' => ['bool', 'other' => 'IntlCalendar'], 'IntlCalendar::fieldDifference' => ['int', 'when' => 'float', 'field' => 'int'], 'IntlCalendar::fromDateTime' => ['IntlCalendar', 'dateTime' => 'DateTime|string'], 'IntlCalendar::get' => ['int', 'field' => 'int'], 'IntlCalendar::getActualMaximum' => ['int', 'field' => 'int'], 'IntlCalendar::getActualMinimum' => ['int', 'field' => 'int'], 'IntlCalendar::getAvailableLocales' => ['array'], 'IntlCalendar::getDayOfWeekType' => ['int', 'dayOfWeek' => 'int'], 'IntlCalendar::getErrorCode' => ['int'], 'IntlCalendar::getErrorMessage' => ['string'], 'IntlCalendar::getFirstDayOfWeek' => ['int'], 'IntlCalendar::getGreatestMinimum' => ['int', 'field' => 'int'], 'IntlCalendar::getKeywordValuesForLocale' => ['Iterator', 'key' => 'string', 'locale' => 'string', 'commonlyUsed' => 'bool'], 'IntlCalendar::getLeastMaximum' => ['int', 'field' => 'int'], 'IntlCalendar::getLocale' => ['string', 'localeType' => 'int'], 'IntlCalendar::getMaximum' => ['int', 'field' => 'int'], 'IntlCalendar::getMinimalDaysInFirstWeek' => ['int'], 'IntlCalendar::getMinimum' => ['int', 'field' => 'int'], 'IntlCalendar::getNow' => ['float'], 'IntlCalendar::getRepeatedWallTimeOption' => ['int'], 'IntlCalendar::getSkippedWallTimeOption' => ['int'], 'IntlCalendar::getTime' => ['float'], 'IntlCalendar::getTimeZone' => ['IntlTimeZone'], 'IntlCalendar::getType' => ['string'], 'IntlCalendar::getWeekendTransition' => ['int', 'dayOfWeek' => 'string'], 'IntlCalendar::inDaylightTime' => ['bool'], 'IntlCalendar::isEquivalentTo' => ['bool', 'other' => 'IntlCalendar'], 'IntlCalendar::isLenient' => ['bool'], 'IntlCalendar::isSet' => ['bool', 'field' => 'int'], 'IntlCalendar::isWeekend' => ['bool', 'date=' => 'float'], 'IntlCalendar::roll' => ['bool', 'field' => 'int', 'amountOrUpOrDown' => 'mixed'], 'IntlCalendar::set' => ['bool', 'field' => 'int', 'value' => 'int'], 'IntlCalendar::set\'1' => ['bool', 'year' => 'int', 'month' => 'int', 'dayOfMonth=' => 'int', 'hour=' => 'int', 'minute=' => 'int', 'second=' => 'int'], 'IntlCalendar::setFirstDayOfWeek' => ['bool', 'dayOfWeek' => 'int'], 'IntlCalendar::setLenient' => ['bool', 'isLenient' => 'string'], 'IntlCalendar::setMinimalDaysInFirstWeek' => ['bool', 'minimalDays' => 'int'], 'IntlCalendar::setRepeatedWallTimeOption' => ['bool', 'wallTimeOption' => 'int'], 'IntlCalendar::setSkippedWallTimeOption' => ['bool', 'wallTimeOption' => 'int'], 'IntlCalendar::setTime' => ['bool', 'date' => 'float'], 'IntlCalendar::setTimeZone' => ['bool', 'timeZone' => 'mixed'], 'IntlCalendar::toDateTime' => ['DateTime'], 'IntlChar::charAge' => ['array', 'char' => 'int|string'], 'IntlChar::charDigitValue' => ['int', 'codepoint' => 'mixed'], 'IntlChar::charDirection' => ['int', 'codepoint' => 'mixed'], 'IntlChar::charFromName' => ['int', 'name' => 'string', 'namechoice=' => 'int'], 'IntlChar::charMirror' => ['mixed', 'codepoint' => 'mixed'], 'IntlChar::charName' => ['string', 'char' => 'int|string', 'namechoice=' => 'int'], 'IntlChar::charType' => ['int', 'codepoint' => 'mixed'], 'IntlChar::chr' => ['string', 'codepoint' => 'mixed'], 'IntlChar::digit' => ['int', 'char' => 'int|string', 'radix=' => 'int'], 'IntlChar::enumCharNames' => ['void', 'start' => 'mixed', 'limit' => 'mixed', 'callback' => 'callable', 'nameChoice=' => 'int'], 'IntlChar::enumCharTypes' => ['void', 'cb=' => 'callable'], 'IntlChar::foldCase' => ['int|string', 'char' => 'int|string', 'options=' => 'int'], 'IntlChar::forDigit' => ['int', 'digit' => 'int', 'radix' => 'int'], 'IntlChar::getBidiPairedBracket' => ['mixed', 'codepoint' => 'mixed'], 'IntlChar::getBlockCode' => ['int', 'char' => 'int|string'], 'IntlChar::getCombiningClass' => ['int', 'codepoint' => 'mixed'], 'IntlChar::getFC_NFKC_Closure' => ['string', 'char' => 'int|string'], 'IntlChar::getIntPropertyMaxValue' => ['int', 'property' => 'int'], 'IntlChar::getIntPropertyMinValue' => ['int', 'property' => 'int'], 'IntlChar::getIntPropertyMxValue' => ['int', 'property' => 'int'], 'IntlChar::getIntPropertyValue' => ['int', 'char' => 'int|string', 'property' => 'int'], 'IntlChar::getNumericValue' => ['float', 'char' => 'int|string'], 'IntlChar::getPropertyEnum' => ['int', 'alias' => 'string'], 'IntlChar::getPropertyName' => ['string', 'property' => 'int', 'namechoice=' => 'int'], 'IntlChar::getPropertyValueEnum' => ['int', 'property' => 'int', 'name' => 'string'], 'IntlChar::getPropertyValueName' => ['string', 'prop' => 'int', 'val' => 'int', 'namechoice=' => 'int'], 'IntlChar::getUnicodeVersion' => ['array'], 'IntlChar::hasBinaryProperty' => ['bool', 'char' => 'int|string', 'property' => 'int'], 'IntlChar::isalnum' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::isalpha' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::isbase' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::isblank' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::iscntrl' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::isdefined' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::isdigit' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::isgraph' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::isIDIgnorable' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::isIDPart' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::isIDStart' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::isISOControl' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::isJavaIDPart' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::isJavaIDStart' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::isJavaSpaceChar' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::islower' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::isMirrored' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::isprint' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::ispunct' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::isspace' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::istitle' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::isUAlphabetic' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::isULowercase' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::isupper' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::isUUppercase' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::isUWhiteSpace' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::isWhitespace' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::isxdigit' => ['bool', 'codepoint' => 'mixed'], 'IntlChar::ord' => ['int', 'character' => 'mixed'], 'IntlChar::tolower' => ['mixed', 'codepoint' => 'mixed'], 'IntlChar::totitle' => ['mixed', 'codepoint' => 'mixed'], 'IntlChar::toupper' => ['mixed', 'codepoint' => 'mixed'], 'IntlCodePointBreakIterator::getLastCodePoint' => ['int'], 'IntlDateFormatter::__construct' => ['void', 'locale' => 'string', 'datetype' => '?int', 'timetype' => '?int', 'timezone=' => 'null|string|IntlTimeZone|DateTimeZone', 'calendar=' => 'null|int|IntlCalendar', 'pattern=' => 'string'], 'IntlDateFormatter::create' => ['IntlDateFormatter|false', 'locale' => 'string', 'datetype' => 'int', 'timetype' => 'int', 'timezone=' => 'null|string|IntlTimeZone|DateTimeZone', 'calendar=' => 'int|IntlCalendar', 'pattern=' => 'string'], 'IntlDateFormatter::format' => ['string', 'args' => ''], 'IntlDateFormatter::formatObject' => ['string', 'object' => 'object', 'format=' => 'mixed', 'locale=' => 'string'], 'IntlDateFormatter::getCalendar' => ['int'], 'IntlDateFormatter::getCalendarObject' => ['IntlCalendar'], 'IntlDateFormatter::getDateType' => ['int'], 'IntlDateFormatter::getErrorCode' => ['int'], 'IntlDateFormatter::getErrorMessage' => ['string'], 'IntlDateFormatter::getLocale' => ['string'], 'IntlDateFormatter::getPattern' => ['string'], 'IntlDateFormatter::getTimeType' => ['int'], 'IntlDateFormatter::getTimeZone' => ['IntlTimeZone'], 'IntlDateFormatter::getTimeZoneId' => ['string'], 'IntlDateFormatter::isLenient' => ['bool'], 'IntlDateFormatter::localtime' => ['array', 'text_to_parse' => 'string', '&w_parse_pos=' => 'int'], 'IntlDateFormatter::parse' => ['int', 'text_to_parse' => 'string', '&rw_parse_pos=' => 'int'], 'IntlDateFormatter::setCalendar' => ['bool', 'calendar' => ''], 'IntlDateFormatter::setLenient' => ['bool', 'lenient' => 'bool'], 'IntlDateFormatter::setPattern' => ['bool', 'pattern' => 'string'], 'IntlDateFormatter::setTimeZone' => ['bool', 'timezone' => ''], 'IntlDateFormatter::setTimeZoneId' => ['bool', 'zone' => 'string', 'fmt=' => 'IntlDateFormatter'], 'IntlGregorianCalendar::getGregorianChange' => ['float'], 'IntlGregorianCalendar::isLeapYear' => ['bool', 'year' => 'int'], 'IntlGregorianCalendar::setGregorianChange' => ['bool', 'date' => 'float'], 'IntlIterator::current' => ['mixed'], 'IntlIterator::key' => ['string'], 'IntlIterator::next' => ['void'], 'IntlIterator::rewind' => ['void'], 'IntlIterator::valid' => ['bool'], 'IntlPartsIterator::getBreakIterator' => ['IntlBreakIterator'], 'IntlRuleBasedBreakIterator::__construct' => ['void', 'rules' => 'string', 'areCompiled=' => 'string'], 'IntlRuleBasedBreakIterator::createCharacterInstance' => ['IntlRuleBasedBreakIterator', 'locale' => 'string'], 'IntlRuleBasedBreakIterator::createCodePointInstance' => ['IntlCodePointBreakIterator'], 'IntlRuleBasedBreakIterator::createLineInstance' => ['IntlRuleBasedBreakIterator', 'locale' => 'string'], 'IntlRuleBasedBreakIterator::createSentenceInstance' => ['IntlRuleBasedBreakIterator', 'locale' => 'string'], 'IntlRuleBasedBreakIterator::createTitleInstance' => ['IntlRuleBasedBreakIterator', 'locale' => 'string'], 'IntlRuleBasedBreakIterator::createWordInstance' => ['IntlRuleBasedBreakIterator', 'locale' => 'string'], 'IntlRuleBasedBreakIterator::current' => ['int'], 'IntlRuleBasedBreakIterator::first' => ['int'], 'IntlRuleBasedBreakIterator::following' => ['int', 'offset' => 'string'], 'IntlRuleBasedBreakIterator::getBinaryRules' => ['string'], 'IntlRuleBasedBreakIterator::getErrorCode' => ['int'], 'IntlRuleBasedBreakIterator::getErrorMessage' => ['string'], 'IntlRuleBasedBreakIterator::getLocale' => ['string', 'locale_type' => 'string'], 'IntlRuleBasedBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type=' => 'string'], 'IntlRuleBasedBreakIterator::getRules' => ['string'], 'IntlRuleBasedBreakIterator::getRuleStatus' => ['int'], 'IntlRuleBasedBreakIterator::getRuleStatusVec' => ['array'], 'IntlRuleBasedBreakIterator::getText' => ['string'], 'IntlRuleBasedBreakIterator::isBoundary' => ['bool', 'offset' => 'string'], 'IntlRuleBasedBreakIterator::last' => ['int'], 'IntlRuleBasedBreakIterator::next' => ['int', 'offset=' => 'string'], 'IntlRuleBasedBreakIterator::preceding' => ['int', 'offset' => 'string'], 'IntlRuleBasedBreakIterator::previous' => ['int'], 'IntlRuleBasedBreakIterator::setText' => ['bool', 'text' => 'string'], 'IntlTimeZone::countEquivalentIDs' => ['int', 'zoneId' => 'string'], 'IntlTimeZone::createDefault' => ['IntlTimeZone'], 'IntlTimeZone::createEnumeration' => ['IntlIterator', 'countryOrRawOffset=' => 'mixed'], 'IntlTimeZone::createTimeZone' => ['IntlTimeZone', 'zoneId' => 'string'], 'IntlTimeZone::createTimeZoneIDEnumeration' => ['IntlIterator', 'zoneType' => 'int', 'region=' => 'string', 'rawOffset=' => 'int'], 'IntlTimeZone::fromDateTimeZone' => ['IntlTimeZone', 'zoneId' => 'DateTimeZone'], 'IntlTimeZone::getCanonicalID' => ['string', 'zoneId' => 'string', '&w_isSystemID=' => 'bool'], 'IntlTimeZone::getDisplayName' => ['string', 'isDaylight=' => 'bool', 'style=' => 'int', 'locale=' => 'string'], 'IntlTimeZone::getDSTSavings' => ['int'], 'IntlTimeZone::getEquivalentID' => ['string', 'zoneId' => 'string', 'index' => 'int'], 'IntlTimeZone::getErrorCode' => ['int'], 'IntlTimeZone::getErrorMessage' => ['string'], 'IntlTimeZone::getGMT' => ['IntlTimeZone'], 'IntlTimeZone::getID' => ['string'], 'IntlTimeZone::getIDForWindowsID' => ['string', 'timezone' => 'string', 'region=' => 'string'], 'IntlTimeZone::getOffset' => ['int', 'date' => 'float', 'local' => 'bool', '&w_rawOffset' => 'int', '&w_dstOffset' => 'int'], 'IntlTimeZone::getRawOffset' => ['int'], 'IntlTimeZone::getRegion' => ['string', 'zoneId' => 'string'], 'IntlTimeZone::getTZDataVersion' => ['string'], 'IntlTimeZone::getUnknown' => ['IntlTimeZone'], 'IntlTimeZone::getWindowsID' => ['string', 'timezone' => 'string'], 'IntlTimeZone::hasSameRules' => ['bool', 'otherTimeZone' => 'IntlTimeZone'], 'IntlTimeZone::toDateTimeZone' => ['DateTimeZone'], 'IntlTimeZone::useDaylightTime' => ['bool'], 'intltz_count_equivalent_ids' => ['int', 'zoneId' => 'string'], 'intltz_create_enumeration' => ['IntlIterator', 'countryOrRawOffset' => 'mixed'], 'intltz_create_time_zone' => ['IntlTimeZone', 'zoneId' => 'string'], 'intltz_from_date_time_zone' => ['IntlTimeZone', 'zoneId' => 'DateTimeZone'], 'intltz_get_canonical_id' => ['string', 'zoneId' => 'string', '&isSystemID' => 'bool'], 'intltz_get_display_name' => ['string', 'obj' => 'IntlTimeZone', 'isDaylight' => 'bool', 'style' => 'int', 'locale' => 'string'], 'intltz_get_dst_savings' => ['int', 'obj' => 'IntlTimeZone'], 'intltz_get_equivalent_id' => ['string', 'zoneId' => 'string', 'index' => 'int'], 'intltz_get_error_code' => ['int', 'obj' => 'IntlTimeZone'], 'intltz_get_error_message' => ['string', 'obj' => 'IntlTimeZone'], 'intltz_get_id' => ['string', 'obj' => 'IntlTimeZone'], 'intltz_get_offset' => ['int', 'obj' => 'IntlTimeZone', 'date' => 'float', 'local' => 'bool', '&rawOffset' => 'int', '&dstOffset' => 'int'], 'intltz_get_raw_offset' => ['int', 'obj' => 'IntlTimeZone'], 'intltz_get_tz_data_version' => ['string', 'obj' => 'IntlTimeZone'], 'intltz_getGMT' => ['IntlTimeZone'], 'intltz_has_same_rules' => ['bool', 'obj' => 'IntlTimeZone', 'otherTimeZone' => 'IntlTimeZone'], 'intltz_to_date_time_zone' => ['DateTimeZone', 'obj' => ''], 'intltz_use_daylight_time' => ['bool', 'obj' => ''], 'intlz_create_default' => ['IntlTimeZone'], 'intval' => ['int', 'var' => 'mixed', 'base=' => 'int'], 'InvalidArgumentException::__clone' => ['void'], 'InvalidArgumentException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?Throwable|?InvalidArgumentException'], 'InvalidArgumentException::__toString' => ['string'], 'InvalidArgumentException::getCode' => ['int'], 'InvalidArgumentException::getFile' => ['string'], 'InvalidArgumentException::getLine' => ['int'], 'InvalidArgumentException::getMessage' => ['string'], 'InvalidArgumentException::getPrevious' => ['Throwable|InvalidArgumentException|null'], 'InvalidArgumentException::getTrace' => ['array'], 'InvalidArgumentException::getTraceAsString' => ['string'], 'ip2long' => ['int|false', 'ip_address' => 'string'], 'iptcembed' => ['array', 'iptcdata' => 'string', 'jpeg_file_name' => 'string', 'spool=' => 'int'], 'iptcparse' => ['array|false', 'iptcdata' => 'string'], 'is_a' => ['bool', 'object_or_string' => 'object|string', 'class_name' => 'string', 'allow_string=' => 'bool'], 'is_array' => ['bool', 'var' => 'mixed'], 'is_bool' => ['bool', 'var' => 'mixed'], 'is_callable' => ['bool', 'var' => 'mixed', 'syntax_only=' => 'bool', '&w_callable_name=' => 'string'], 'is_countable' => ['bool', 'var' => 'mixed'], 'is_dir' => ['bool', 'filename' => 'string'], 'is_double' => ['bool', 'var' => ''], 'is_executable' => ['bool', 'filename' => 'string'], 'is_file' => ['bool', 'filename' => 'string'], 'is_finite' => ['bool', 'val' => 'float'], 'is_float' => ['bool', 'var' => 'mixed'], 'is_infinite' => ['bool', 'val' => 'float'], 'is_int' => ['bool', 'var' => 'mixed'], 'is_integer' => ['bool', 'var' => ''], 'is_iterable' => ['bool', 'var' => 'mixed'], 'is_link' => ['bool', 'filename' => 'string'], 'is_long' => ['bool', 'var' => ''], 'is_nan' => ['bool', 'val' => 'float'], 'is_null' => ['bool', 'var' => 'mixed'], 'is_numeric' => ['bool', 'value' => 'mixed'], 'is_object' => ['bool', 'var' => 'mixed'], 'is_readable' => ['bool', 'filename' => 'string'], 'is_real' => ['bool', 'var' => ''], 'is_resource' => ['bool', 'var' => 'mixed'], 'is_scalar' => ['bool', 'value' => 'mixed'], 'is_soap_fault' => ['bool', 'object' => 'mixed'], 'is_string' => ['bool', 'var' => 'mixed'], 'is_subclass_of' => ['bool', 'object_or_string' => 'object|string', 'class_name' => 'string', 'allow_string=' => 'bool'], 'is_tainted' => ['bool', 'string' => 'string'], 'is_uploaded_file' => ['bool', 'path' => 'string'], 'is_writable' => ['bool', 'filename' => 'string'], 'is_writeable' => ['bool', 'filename' => 'string'], 'isset' => ['bool', 'var' => 'mixed', '...rest=' => 'mixed'], 'Iterator::current' => ['mixed'], 'Iterator::key' => ['mixed'], 'Iterator::next' => ['void'], 'Iterator::rewind' => ['void'], 'Iterator::valid' => ['bool'], 'iterator_apply' => ['int', 'it' => 'Traversable', 'function' => 'callable', 'params=' => 'array'], 'iterator_count' => ['int', 'it' => 'Traversable'], 'iterator_to_array' => ['array', 'it' => 'Traversable', 'use_keys=' => 'bool'], 'IteratorAggregate::getIterator' => ['Traversable'], 'IteratorIterator::__construct' => ['void', 'it' => 'Traversable'], 'IteratorIterator::current' => ['mixed'], 'IteratorIterator::getInnerIterator' => ['Traversable'], 'IteratorIterator::key' => ['mixed'], 'IteratorIterator::next' => ['void'], 'IteratorIterator::rewind' => ['void'], 'IteratorIterator::valid' => ['bool'], 'java_last_exception_clear' => [''], 'java_last_exception_get' => ['object'], 'java_reload' => ['array', 'new_jarpath' => 'new_jarpath'], 'java_require' => ['array', 'new_classpath' => 'new_classpath'], 'java_set_encoding' => ['array', 'encoding' => 'encoding'], 'java_set_ignore_case' => ['void', 'ignore' => 'ignore'], 'java_throw_exceptions' => ['void', 'throw' => 'throw'], 'JavaException::getCause' => ['object'], 'jddayofweek' => ['mixed', 'juliandaycount' => 'int', 'mode=' => 'int'], 'jdmonthname' => ['string', 'juliandaycount' => 'int', 'mode' => 'int'], 'jdtofrench' => ['string', 'juliandaycount' => 'int'], 'jdtogregorian' => ['string', 'juliandaycount' => 'int'], 'jdtojewish' => ['string', 'juliandaycount' => 'int', 'hebrew=' => 'bool', 'fl=' => 'int'], 'jdtojulian' => ['string', 'juliandaycount' => 'int'], 'jdtounix' => ['int|false', 'jday' => 'int'], 'jewishtojd' => ['int', 'month' => 'int', 'day' => 'int', 'year' => 'int'], 'jobqueue_license_info' => ['array'], 'join' => ['string', 'glue' => 'string', 'pieces' => 'array'], 'join\'1' => ['string', 'pieces' => 'array'], 'jpeg2wbmp' => ['bool', 'jpegname' => 'string', 'wbmpname' => 'string', 'dest_height' => 'int', 'dest_width' => 'int', 'threshold' => 'int'], 'json_decode' => ['mixed', 'json' => 'string', 'assoc=' => 'bool', 'depth=' => 'int', 'options=' => 'int'], 'json_encode' => ['string|false', 'data' => 'mixed', 'options=' => 'int', 'depth=' => 'int'], 'json_last_error' => ['int'], 'json_last_error_msg' => ['string'], 'JsonIncrementalParser::__construct' => ['void', 'depth' => '', 'options' => ''], 'JsonIncrementalParser::get' => ['', 'options' => ''], 'JsonIncrementalParser::getError' => [''], 'JsonIncrementalParser::parse' => ['', 'json' => ''], 'JsonIncrementalParser::parseFile' => ['', 'filename' => ''], 'JsonIncrementalParser::reset' => [''], 'JsonSerializable::jsonSerialize' => ['mixed'], 'Judy::__construct' => ['void', 'judy_type' => 'int'], 'Judy::__destruct' => [''], 'Judy::byCount' => ['int', 'nth_index' => 'int'], 'Judy::count' => ['int', 'index_start=' => 'int', 'index_end=' => 'int'], 'Judy::first' => ['mixed', 'index=' => 'mixed'], 'Judy::firstEmpty' => ['int', 'index=' => 'mixed'], 'Judy::free' => ['int'], 'Judy::getType' => ['int'], 'Judy::last' => ['void', 'index=' => 'string'], 'Judy::lastEmpty' => ['int', 'index=' => 'int'], 'Judy::memoryUsage' => ['int'], 'Judy::next' => ['mixed', 'index' => 'mixed'], 'Judy::nextEmpty' => ['int', 'index' => 'int'], 'Judy::offsetExists' => ['bool', 'offset' => 'mixed'], 'Judy::offsetGet' => ['mixed', 'offset' => 'mixed'], 'Judy::offsetSet' => ['bool', 'offset' => 'mixed', 'value' => 'mixed'], 'Judy::offsetUnset' => ['bool', 'offset' => 'mixed'], 'Judy::prev' => ['mixed', 'index' => 'mixed'], 'Judy::prevEmpty' => ['int', 'index' => 'mixed'], 'Judy::size' => ['void'], 'judy_type' => ['int', 'array' => 'judy'], 'judy_version' => ['string'], 'juliantojd' => ['int', 'month' => 'int', 'day' => 'int', 'year' => 'int'], 'kadm5_chpass_principal' => ['bool', 'handle' => 'resource', 'principal' => 'string', 'password' => 'string'], 'kadm5_create_principal' => ['bool', 'handle' => 'resource', 'principal' => 'string', 'password=' => 'string', 'options=' => 'array'], 'kadm5_delete_principal' => ['bool', 'handle' => 'resource', 'principal' => 'string'], 'kadm5_destroy' => ['bool', 'handle' => 'resource'], 'kadm5_flush' => ['bool', 'handle' => 'resource'], 'kadm5_get_policies' => ['array', 'handle' => 'resource'], 'kadm5_get_principal' => ['array', 'handle' => 'resource', 'principal' => 'string'], 'kadm5_get_principals' => ['array', 'handle' => 'resource'], 'kadm5_init_with_password' => ['resource', 'admin_server' => 'string', 'realm' => 'string', 'principal' => 'string', 'password' => 'string'], 'kadm5_modify_principal' => ['bool', 'handle' => 'resource', 'principal' => 'string', 'options' => 'array'], 'key' => ['int|string|null', 'array_arg' => 'array|object'], 'key_exists' => ['bool', 'key' => 'string|int', 'search' => 'array'], 'krsort' => ['bool', '&rw_array_arg' => 'array', 'sort_flags=' => 'int'], 'ksort' => ['bool', '&rw_array_arg' => 'array', 'sort_flags=' => 'int'], 'KTaglib_ID3v2_AttachedPictureFrame::getDescription' => ['string'], 'KTaglib_ID3v2_AttachedPictureFrame::getMimeType' => ['string'], 'KTaglib_ID3v2_AttachedPictureFrame::getType' => ['int'], 'KTaglib_ID3v2_AttachedPictureFrame::savePicture' => ['bool', 'filename' => 'string'], 'KTaglib_ID3v2_AttachedPictureFrame::setMimeType' => ['string', 'type' => 'string'], 'KTaglib_ID3v2_AttachedPictureFrame::setPicture' => ['', 'filename' => 'string'], 'KTaglib_ID3v2_AttachedPictureFrame::setType' => ['', 'type' => 'int'], 'KTaglib_ID3v2_Frame::__toString' => ['string'], 'KTaglib_ID3v2_Frame::getSize' => ['int'], 'KTaglib_ID3v2_Tag::addFrame' => ['bool', 'frame' => 'ktaglib_id3v2_frame'], 'KTaglib_ID3v2_Tag::getFrameList' => ['array'], 'KTaglib_MPEG_AudioProperties::getBitrate' => ['int'], 'KTaglib_MPEG_AudioProperties::getChannels' => ['int'], 'KTaglib_MPEG_AudioProperties::getLayer' => ['int'], 'KTaglib_MPEG_AudioProperties::getLength' => ['int'], 'KTaglib_MPEG_AudioProperties::getSampleBitrate' => ['int'], 'KTaglib_MPEG_AudioProperties::getVersion' => ['int'], 'KTaglib_MPEG_AudioProperties::isCopyrighted' => ['bool'], 'KTaglib_MPEG_AudioProperties::isOriginal' => ['bool'], 'KTaglib_MPEG_AudioProperties::isProtectionEnabled' => ['bool'], 'KTaglib_MPEG_File::getAudioProperties' => ['KTaglib_MPEG_File'], 'KTaglib_MPEG_File::getID3v1Tag' => ['KTaglib_ID3v1_Tag', 'create=' => 'bool'], 'KTaglib_MPEG_File::getID3v2Tag' => ['KTaglib_ID3v2_Tag', 'create=' => 'bool'], 'KTaglib_Tag::getAlbum' => ['string'], 'KTaglib_Tag::getArtist' => ['string'], 'KTaglib_Tag::getComment' => ['string'], 'KTaglib_Tag::getGenre' => ['string'], 'KTaglib_Tag::getTitle' => ['string'], 'KTaglib_Tag::getTrack' => ['int'], 'KTaglib_Tag::getYear' => ['int'], 'KTaglib_Tag::isEmpty' => ['bool'], 'labelcacheObj::freeCache' => ['bool'], 'labelObj::__construct' => ['void'], 'labelObj::convertToString' => ['string'], 'labelObj::deleteStyle' => ['int', 'index' => 'int'], 'labelObj::free' => ['void'], 'labelObj::getBinding' => ['string', 'labelbinding' => 'mixed'], 'labelObj::getExpressionString' => ['string'], 'labelObj::getStyle' => ['styleObj', 'index' => 'int'], 'labelObj::getTextString' => ['string'], 'labelObj::moveStyleDown' => ['int', 'index' => 'int'], 'labelObj::moveStyleUp' => ['int', 'index' => 'int'], 'labelObj::removeBinding' => ['int', 'labelbinding' => 'mixed'], 'labelObj::set' => ['int', 'property_name' => 'string', 'new_value' => ''], 'labelObj::setBinding' => ['int', 'labelbinding' => 'mixed', 'value' => 'string'], 'labelObj::setExpression' => ['int', 'expression' => 'string'], 'labelObj::setText' => ['int', 'text' => 'string'], 'labelObj::updateFromString' => ['int', 'snippet' => 'string'], 'Lapack::eigenValues' => ['array', 'a' => 'array', 'left=' => 'array', 'right=' => 'array'], 'Lapack::identity' => ['array', 'n' => 'int'], 'Lapack::leastSquaresByFactorisation' => ['array', 'a' => 'array', 'b' => 'array'], 'Lapack::leastSquaresBySVD' => ['array', 'a' => 'array', 'b' => 'array'], 'Lapack::pseudoInverse' => ['array', 'a' => 'array'], 'Lapack::singularValues' => ['array', 'a' => 'array'], 'Lapack::solveLinearEquation' => ['array', 'a' => 'array', 'b' => 'array'], 'layerObj::addFeature' => ['int', 'shape' => 'shapeObj'], 'layerObj::applySLD' => ['int', 'sldxml' => 'string', 'namedlayer' => 'string'], 'layerObj::applySLDURL' => ['int', 'sldurl' => 'string', 'namedlayer' => 'string'], 'layerObj::clearProcessing' => ['void'], 'layerObj::close' => ['void'], 'layerObj::convertToString' => ['string'], 'layerObj::draw' => ['int', 'image' => 'imageObj'], 'layerObj::drawQuery' => ['int', 'image' => 'imageObj'], 'layerObj::free' => ['void'], 'layerObj::generateSLD' => ['string'], 'layerObj::getClass' => ['classObj', 'classIndex' => 'int'], 'layerObj::getClassIndex' => ['int', 'shape' => '', 'classgroup' => '', 'numclasses' => ''], 'layerObj::getExtent' => ['rectObj'], 'layerObj::getFilterString' => ['string'], 'layerObj::getGridIntersectionCoordinates' => ['array'], 'layerObj::getItems' => ['array'], 'layerObj::getMetaData' => ['int', 'name' => 'string'], 'layerObj::getNumResults' => ['int'], 'layerObj::getProcessing' => ['array'], 'layerObj::getProjection' => ['string'], 'layerObj::getResult' => ['resultObj', 'index' => 'int'], 'layerObj::getResultsBounds' => ['rectObj'], 'layerObj::getShape' => ['shapeObj', 'result' => 'resultObj'], 'layerObj::getWMSFeatureInfoURL' => ['string', 'clickX' => 'int', 'clickY' => 'int', 'featureCount' => 'int', 'infoFormat' => 'string'], 'layerObj::isVisible' => ['bool'], 'layerObj::moveclassdown' => ['int', 'index' => 'int'], 'layerObj::moveclassup' => ['int', 'index' => 'int'], 'layerObj::ms_newLayerObj' => ['layerObj', 'map' => 'MapObj', 'layer' => 'layerObj'], 'layerObj::nextShape' => ['shapeObj'], 'layerObj::open' => ['int'], 'layerObj::queryByAttributes' => ['int', 'qitem' => 'string', 'qstring' => 'string', 'mode' => 'int'], 'layerObj::queryByFeatures' => ['int', 'slayer' => 'int'], 'layerObj::queryByPoint' => ['int', 'point' => 'pointObj', 'mode' => 'int', 'buffer' => 'float'], 'layerObj::queryByRect' => ['int', 'rect' => 'rectObj'], 'layerObj::queryByShape' => ['int', 'shape' => 'shapeObj'], 'layerObj::removeClass' => ['classObj', 'index' => 'int'], 'layerObj::removeMetaData' => ['int', 'name' => 'string'], 'layerObj::set' => ['int', 'property_name' => 'string', 'new_value' => ''], 'layerObj::setConnectionType' => ['int', 'connectiontype' => 'int', 'plugin_library' => 'string'], 'layerObj::setFilter' => ['int', 'expression' => 'string'], 'layerObj::setMetaData' => ['int', 'name' => 'string', 'value' => 'string'], 'layerObj::setProjection' => ['int', 'proj_params' => 'string'], 'layerObj::setWKTProjection' => ['int', 'proj_params' => 'string'], 'layerObj::updateFromString' => ['int', 'snippet' => 'string'], 'lcfirst' => ['string', 'str' => 'string'], 'lcg_value' => ['float'], 'lchgrp' => ['bool', 'filename' => 'string', 'group' => 'string|int'], 'lchown' => ['bool', 'filename' => 'string', 'user' => 'string|int'], 'ldap_8859_to_t61' => ['string', 'value' => 'string'], 'ldap_add' => ['bool', 'link_identifier' => 'resource', 'dn' => 'string', 'entry' => 'array', 'servercontrols=' => 'array'], 'ldap_add_ext' => ['resource|false', 'link_identifier' => 'resource', 'dn' => 'string', 'entry' => 'array', 'servercontrols=' => 'array'], 'ldap_bind' => ['bool', 'link_identifier' => 'resource', 'dn=' => 'string', 'password=' => 'string'], 'ldap_bind_ext' => ['resource|false', 'link_identifier' => 'resource', 'dn=' => 'string', 'password=' => 'string'], 'ldap_close' => ['bool', 'link_identifier' => 'resource'], 'ldap_compare' => ['bool', 'link_identifier' => 'resource', 'dn' => 'string', 'attr' => 'string', 'value' => 'string'], 'ldap_connect' => ['resource|false', 'host=' => 'string', 'port=' => 'int', 'wallet=' => 'string', 'wallet_passwd=' => 'string', 'authmode=' => 'int'], 'ldap_control_paged_result' => ['bool', 'link_identifier' => 'resource', 'pagesize' => 'int', 'iscritical=' => 'bool', 'cookie=' => 'string'], 'ldap_control_paged_result_response' => ['bool', 'link_identifier' => 'resource', 'result_identifier' => 'resource', '&w_cookie=' => 'string', '&w_estimated=' => 'int'], 'ldap_count_entries' => ['int', 'link_identifier' => 'resource', 'result' => 'resource'], 'ldap_delete' => ['bool', 'link_identifier' => 'resource', 'dn' => 'string'], 'ldap_delete_ext' => ['resource|false', 'link_identifier' => 'resource', 'dn' => 'string', 'servercontrols=' => 'array'], 'ldap_dn2ufn' => ['string', 'dn' => 'string'], 'ldap_err2str' => ['string', 'errno' => 'int'], 'ldap_errno' => ['int', 'link_identifier' => 'resource'], 'ldap_error' => ['string', 'link_identifier' => 'resource'], 'ldap_escape' => ['string', 'value' => 'string', 'ignore=' => 'string', 'flags=' => 'int'], 'ldap_exop' => ['mixed', 'link' => 'resource', 'reqoid' => 'string', 'reqdata=' => 'string', 'servercontrols=' => 'array', '&w_retdata=' => 'string', '&w_retoid=' => 'string'], 'ldap_exop_passwd' => ['mixed', 'link' => 'resource', 'user=' => 'string', 'oldpw=' => 'string', 'newpw=' => 'string', 'serverctrls=' => 'array'], 'ldap_exop_refresh' => ['int|false', 'link' => 'resource', 'dn' => 'string', 'ttl' => 'int'], 'ldap_exop_whoami' => ['string', 'link' => 'resource'], 'ldap_explode_dn' => ['array', 'dn' => 'string', 'with_attrib' => 'int'], 'ldap_first_attribute' => ['string', 'link_identifier' => 'resource', 'result_entry_identifier' => 'resource'], 'ldap_first_entry' => ['resource|false', 'link_identifier' => 'resource', 'result_identifier' => 'resource'], 'ldap_first_reference' => ['resource|false', 'link_identifier' => 'resource', 'result_identifier' => 'resource'], 'ldap_free_result' => ['bool', 'result_identifier' => 'resource'], 'ldap_get_attributes' => ['array', 'link_identifier' => 'resource', 'result_entry_identifier' => 'resource'], 'ldap_get_dn' => ['string', 'link_identifier' => 'resource', 'result_entry_identifier' => 'resource'], 'ldap_get_entries' => ['array|false', 'link_identifier' => 'resource', 'result_identifier' => 'resource'], 'ldap_get_option' => ['bool', 'link_identifier' => 'resource', 'option' => 'int', '&w_retval' => 'mixed'], 'ldap_get_values' => ['array', 'link_identifier' => 'resource', 'result_entry_identifier' => 'resource', 'attribute' => 'string'], 'ldap_get_values_len' => ['array', 'link_identifier' => 'resource', 'result_entry_identifier' => 'resource', 'attribute' => 'string'], 'ldap_list' => ['resource|false', 'link' => 'resource|array', 'base_dn' => 'string', 'filter' => 'string', 'attrs=' => 'array', 'attrsonly=' => 'int', 'sizelimit=' => 'int', 'timelimit=' => 'int', 'deref=' => 'int'], 'ldap_mod_add' => ['bool', 'link_identifier' => 'resource', 'dn' => 'string', 'entry' => 'array'], 'ldap_mod_add_ext' => ['resource|false', 'link_identifier' => 'resource', 'dn' => 'string', 'entry' => 'array', 'servercontrols=' => 'array'], 'ldap_mod_del' => ['bool', 'link_identifier' => 'resource', 'dn' => 'string', 'entry' => 'array'], 'ldap_mod_del_ext' => ['resource|false', 'link_identifier' => 'resource', 'dn' => 'string', 'entry' => 'array', 'servercontrols=' => 'array'], 'ldap_mod_replace' => ['bool', 'link_identifier' => 'resource', 'dn' => 'string', 'entry' => 'array'], 'ldap_mod_replace_ext' => ['resource|false', 'link_identifier' => 'resource', 'dn' => 'string', 'entry' => 'array', 'servercontrols=' => 'array'], 'ldap_modify' => ['bool', 'link_identifier' => 'resource', 'dn' => 'string', 'entry' => 'array'], 'ldap_modify_batch' => ['bool', 'link_identifier' => 'resource', 'dn' => 'string', 'modifs' => 'array'], 'ldap_next_attribute' => ['string', 'link_identifier' => 'resource', 'result_entry_identifier' => 'resource'], 'ldap_next_entry' => ['resource|false', 'link_identifier' => 'resource', 'result_entry_identifier' => 'resource'], 'ldap_next_reference' => ['resource|false', 'link_identifier' => 'resource', 'reference_entry_identifier' => 'resource'], 'ldap_parse_exop' => ['bool', 'link' => 'resource', 'result' => 'resource', '&w_retdata=' => 'string', '&w_retoid=' => 'string'], 'ldap_parse_reference' => ['bool', 'link_identifier' => 'resource', 'reference_entry_identifier' => 'resource', 'referrals' => 'array'], 'ldap_parse_result' => ['bool', 'link_identifier' => 'resource', 'result' => 'resource', '&w_errcode' => 'int', '&w_matcheddn=' => 'string', '&w_errmsg=' => 'string', '&w_referrals=' => 'array', '&w_serverctrls=' => 'array'], 'ldap_read' => ['resource|false', 'link' => 'resource|array', 'base_dn' => 'string', 'filter' => 'string', 'attrs=' => 'array', 'attrsonly=' => 'int', 'sizelimit=' => 'int', 'timelimit=' => 'int', 'deref=' => 'int'], 'ldap_rename' => ['bool', 'link_identifier' => 'resource', 'dn' => 'string', 'newrdn' => 'string', 'newparent' => 'string', 'deleteoldrdn' => 'bool'], 'ldap_rename_ext' => ['resource|false', 'link_identifier' => 'resource', 'dn' => 'string', 'newrdn' => 'string', 'newparent' => 'string', 'deleteoldrdn' => 'bool', 'servercontrols=' => 'array'], 'ldap_sasl_bind' => ['bool', 'link_identifier' => 'resource', 'binddn=' => 'string', 'password=' => 'string', 'sasl_mech=' => 'string', 'sasl_realm=' => 'string', 'sasl_authc_id=' => 'string', 'sasl_authz_id=' => 'string', 'props=' => 'string'], 'ldap_search' => ['resource|false', 'link_identifier' => 'resource|array', 'base_dn' => 'string', 'filter' => 'string', 'attrs=' => 'array', 'attrsonly=' => 'int', 'sizelimit=' => 'int', 'timelimit=' => 'int', 'deref=' => 'int'], 'ldap_set_option' => ['bool', 'link_identifier' => 'resource', 'option' => 'int', 'newval' => 'mixed'], 'ldap_set_rebind_proc' => ['bool', 'link_identifier' => 'resource', 'callback' => 'string'], 'ldap_sort' => ['bool', 'link_identifier' => 'resource', 'result_identifier' => 'resource', 'sortfilter' => 'string'], 'ldap_start_tls' => ['bool', 'link_identifier' => 'resource'], 'ldap_t61_to_8859' => ['string', 'value' => 'string'], 'ldap_unbind' => ['bool', 'link_identifier' => 'resource'], 'leak' => ['', 'num_bytes' => 'int'], 'leak_variable' => ['', 'variable' => '', 'leak_data' => 'bool'], 'legendObj::convertToString' => ['string'], 'legendObj::free' => ['void'], 'legendObj::set' => ['int', 'property_name' => 'string', 'new_value' => ''], 'legendObj::updateFromString' => ['int', 'snippet' => 'string'], 'LengthException::__clone' => ['void'], 'LengthException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?Throwable|?LengthException'], 'LengthException::__toString' => ['string'], 'LengthException::getCode' => ['int'], 'LengthException::getFile' => ['string'], 'LengthException::getLine' => ['int'], 'LengthException::getMessage' => ['string'], 'LengthException::getPrevious' => ['Throwable|LengthException|null'], 'LengthException::getTrace' => ['array'], 'LengthException::getTraceAsString' => ['string'], 'levenshtein' => ['int', 'str1' => 'string', 'str2' => 'string'], 'levenshtein\'1' => ['int', 'str1' => 'string', 'str2' => 'string', 'cost_ins' => 'int', 'cost_rep' => 'int', 'cost_del' => 'int'], 'libxml_clear_errors' => ['void'], 'libxml_disable_entity_loader' => ['bool', 'disable=' => 'bool'], 'libxml_get_errors' => ['array<int,libXMLError>'], 'libxml_get_last_error' => ['libXMLError|false'], 'libxml_set_external_entity_loader' => ['bool', 'resolver_function' => 'callable'], 'libxml_set_streams_context' => ['void', 'streams_context' => 'resource'], 'libxml_use_internal_errors' => ['bool', 'use_errors=' => 'bool'], 'LimitIterator::__construct' => ['void', 'iterator' => 'Iterator', 'offset=' => 'int', 'count=' => 'int'], 'LimitIterator::current' => ['mixed'], 'LimitIterator::getInnerIterator' => ['Iterator'], 'LimitIterator::getPosition' => ['int'], 'LimitIterator::key' => ['mixed'], 'LimitIterator::next' => ['void'], 'LimitIterator::rewind' => ['void'], 'LimitIterator::seek' => ['int', 'position' => 'int'], 'LimitIterator::valid' => ['bool'], 'lineObj::__construct' => ['void'], 'lineObj::add' => ['int', 'point' => 'pointObj'], 'lineObj::addXY' => ['int', 'x' => 'float', 'y' => 'float', 'm' => 'float'], 'lineObj::addXYZ' => ['int', 'x' => 'float', 'y' => 'float', 'z' => 'float', 'm' => 'float'], 'lineObj::ms_newLineObj' => ['lineObj'], 'lineObj::point' => ['pointObj', 'i' => 'int'], 'lineObj::project' => ['int', 'in' => 'projectionObj', 'out' => 'projectionObj'], 'link' => ['bool', 'target' => 'string', 'link' => 'string'], 'linkinfo' => ['int', 'filename' => 'string'], 'litespeed_request_headers' => ['array'], 'litespeed_response_headers' => ['array'], 'Locale::acceptFromHttp' => ['string|false', 'header' => 'string'], 'Locale::canonicalize' => ['string', 'locale' => 'string'], 'Locale::composeLocale' => ['string', 'subtags' => 'array'], 'Locale::filterMatches' => ['bool', 'langtag' => 'string', 'locale' => 'string', 'canonicalize=' => 'bool'], 'Locale::getAllVariants' => ['array', 'locale' => 'string'], 'Locale::getDefault' => ['string'], 'Locale::getDisplayLanguage' => ['string', 'locale' => 'string', 'in_locale=' => 'string'], 'Locale::getDisplayName' => ['string', 'locale' => 'string', 'in_locale=' => 'string'], 'Locale::getDisplayRegion' => ['string', 'locale' => 'string', 'in_locale=' => 'string'], 'Locale::getDisplayScript' => ['string', 'locale' => 'string', 'in_locale=' => 'string'], 'Locale::getDisplayVariant' => ['string', 'locale' => 'string', 'in_locale=' => 'string'], 'Locale::getKeywords' => ['array|false', 'locale' => 'string'], 'Locale::getPrimaryLanguage' => ['string', 'locale' => 'string'], 'Locale::getRegion' => ['string', 'locale' => 'string'], 'Locale::getScript' => ['string', 'locale' => 'string'], 'Locale::lookup' => ['string', 'langtag' => 'array', 'locale' => 'string', 'canonicalize=' => 'bool', 'default=' => 'string'], 'Locale::parseLocale' => ['array', 'locale' => 'string'], 'Locale::setDefault' => ['bool', 'locale' => 'string'], 'locale_accept_from_http' => ['string|false', 'header' => 'string'], 'locale_canonicalize' => ['', 'arg1' => ''], 'locale_compose' => ['string|false', 'subtags' => 'array'], 'locale_filter_matches' => ['bool', 'langtag' => 'string', 'locale' => 'string', 'canonicalize=' => 'bool'], 'locale_get_all_variants' => ['array', 'locale' => 'string'], 'locale_get_default' => ['string'], 'locale_get_display_language' => ['string', 'locale' => 'string', 'in_locale=' => 'string'], 'locale_get_display_name' => ['string', 'locale' => 'string', 'in_locale=' => 'string'], 'locale_get_display_region' => ['string', 'locale' => 'string', 'in_locale=' => 'string'], 'locale_get_display_script' => ['string', 'locale' => 'string', 'in_locale=' => 'string'], 'locale_get_display_variant' => ['string', 'locale' => 'string', 'in_locale=' => 'string'], 'locale_get_keywords' => ['array|false', 'locale' => 'string'], 'locale_get_primary_language' => ['string', 'locale' => 'string'], 'locale_get_region' => ['string', 'locale' => 'string'], 'locale_get_script' => ['string', 'locale' => 'string'], 'locale_lookup' => ['string', 'langtag' => 'array', 'locale' => 'string', 'canonicalize=' => 'bool', 'default=' => 'string'], 'locale_parse' => ['array', 'locale' => 'string'], 'locale_set_default' => ['bool', 'locale' => 'string'], 'localeconv' => ['array'], 'localtime' => ['array', 'timestamp=' => 'int', 'associative_array=' => 'bool'], 'log' => ['float', 'number' => 'float', 'base=' => 'float'], 'log10' => ['float', 'number' => 'float'], 'log1p' => ['float', 'number' => 'float'], 'LogicException::__clone' => ['void'], 'LogicException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?Throwable|?LogicException'], 'LogicException::__toString' => ['string'], 'LogicException::getCode' => ['int'], 'LogicException::getFile' => ['string'], 'LogicException::getLine' => ['int'], 'LogicException::getMessage' => ['string'], 'LogicException::getPrevious' => ['Throwable|LogicException|null'], 'LogicException::getTrace' => ['array'], 'LogicException::getTraceAsString' => ['string'], 'long2ip' => ['string', 'proper_address' => 'int'], 'lstat' => ['array|false', 'filename' => 'string'], 'ltrim' => ['string', 'str' => 'string', 'character_mask=' => 'string'], 'Lua::__call' => ['mixed', 'lua_func' => 'callable', 'args=' => 'array', 'use_self=' => 'int'], 'Lua::__construct' => ['void', 'lua_script_file' => 'string'], 'Lua::assign' => ['mixed', 'name' => 'string', 'value' => 'string'], 'Lua::call' => ['mixed', 'lua_func' => 'callable', 'args=' => 'array', 'use_self=' => 'int'], 'Lua::eval' => ['mixed', 'statements' => 'string'], 'Lua::getVersion' => ['string'], 'Lua::include' => ['mixed', 'file' => 'string'], 'Lua::registerCallback' => ['mixed', 'name' => 'string', 'function' => 'callable'], 'LuaClosure::__invoke' => ['void', 'arg' => 'mixed', '...args=' => 'mixed'], 'lzf_compress' => ['string', 'data' => 'string'], 'lzf_decompress' => ['string', 'data' => 'string'], 'lzf_optimized_for' => ['int'], 'm_checkstatus' => ['int', 'conn' => 'resource', 'identifier' => 'int'], 'm_completeauthorizations' => ['int', 'conn' => 'resource', 'array' => 'int'], 'm_connect' => ['int', 'conn' => 'resource'], 'm_connectionerror' => ['string', 'conn' => 'resource'], 'm_deletetrans' => ['bool', 'conn' => 'resource', 'identifier' => 'int'], 'm_destroyconn' => ['bool', 'conn' => 'resource'], 'm_destroyengine' => ['void'], 'm_getcell' => ['string', 'conn' => 'resource', 'identifier' => 'int', 'column' => 'string', 'row' => 'int'], 'm_getcellbynum' => ['string', 'conn' => 'resource', 'identifier' => 'int', 'column' => 'int', 'row' => 'int'], 'm_getcommadelimited' => ['string', 'conn' => 'resource', 'identifier' => 'int'], 'm_getheader' => ['string', 'conn' => 'resource', 'identifier' => 'int', 'column_num' => 'int'], 'm_initconn' => ['resource'], 'm_initengine' => ['int', 'location' => 'string'], 'm_iscommadelimited' => ['int', 'conn' => 'resource', 'identifier' => 'int'], 'm_maxconntimeout' => ['bool', 'conn' => 'resource', 'secs' => 'int'], 'm_monitor' => ['int', 'conn' => 'resource'], 'm_numcolumns' => ['int', 'conn' => 'resource', 'identifier' => 'int'], 'm_numrows' => ['int', 'conn' => 'resource', 'identifier' => 'int'], 'm_parsecommadelimited' => ['int', 'conn' => 'resource', 'identifier' => 'int'], 'm_responsekeys' => ['array', 'conn' => 'resource', 'identifier' => 'int'], 'm_responseparam' => ['string', 'conn' => 'resource', 'identifier' => 'int', 'key' => 'string'], 'm_returnstatus' => ['int', 'conn' => 'resource', 'identifier' => 'int'], 'm_setblocking' => ['int', 'conn' => 'resource', 'tf' => 'int'], 'm_setdropfile' => ['int', 'conn' => 'resource', 'directory' => 'string'], 'm_setip' => ['int', 'conn' => 'resource', 'host' => 'string', 'port' => 'int'], 'm_setssl' => ['int', 'conn' => 'resource', 'host' => 'string', 'port' => 'int'], 'm_setssl_cafile' => ['int', 'conn' => 'resource', 'cafile' => 'string'], 'm_setssl_files' => ['int', 'conn' => 'resource', 'sslkeyfile' => 'string', 'sslcertfile' => 'string'], 'm_settimeout' => ['int', 'conn' => 'resource', 'seconds' => 'int'], 'm_sslcert_gen_hash' => ['string', 'filename' => 'string'], 'm_transactionssent' => ['int', 'conn' => 'resource'], 'm_transinqueue' => ['int', 'conn' => 'resource'], 'm_transkeyval' => ['int', 'conn' => 'resource', 'identifier' => 'int', 'key' => 'string', 'value' => 'string'], 'm_transnew' => ['int', 'conn' => 'resource'], 'm_transsend' => ['int', 'conn' => 'resource', 'identifier' => 'int'], 'm_uwait' => ['int', 'microsecs' => 'int'], 'm_validateidentifier' => ['int', 'conn' => 'resource', 'tf' => 'int'], 'm_verifyconnection' => ['bool', 'conn' => 'resource', 'tf' => 'int'], 'm_verifysslcert' => ['bool', 'conn' => 'resource', 'tf' => 'int'], 'magic_quotes_runtime' => ['', 'new_setting' => ''], 'mail' => ['bool', 'to' => 'string', 'subject' => 'string', 'message' => 'string', 'additional_headers=' => 'string', 'additional_parameters=' => 'string'], 'mailparse_determine_best_xfer_encoding' => ['string', 'fp' => 'resource'], 'mailparse_msg_create' => ['resource'], 'mailparse_msg_extract_part' => ['void', 'mimemail' => 'resource', 'msgbody' => 'string', 'callbackfunc=' => 'callable'], 'mailparse_msg_extract_part_file' => ['string', 'mimemail' => 'resource', 'filename' => 'mixed', 'callbackfunc=' => 'callable'], 'mailparse_msg_extract_whole_part_file' => ['string', 'mimemail' => 'resource', 'filename' => 'string', 'callbackfunc=' => 'callable'], 'mailparse_msg_free' => ['bool', 'mimemail' => 'resource'], 'mailparse_msg_get_part' => ['resource', 'mimemail' => 'resource', 'mimesection' => 'string'], 'mailparse_msg_get_part_data' => ['array', 'mimemail' => 'resource'], 'mailparse_msg_get_structure' => ['array', 'mimemail' => 'resource'], 'mailparse_msg_parse' => ['bool', 'mimemail' => 'resource', 'data' => 'string'], 'mailparse_msg_parse_file' => ['resource', 'filename' => 'string'], 'mailparse_rfc822_parse_addresses' => ['array', 'addresses' => 'string'], 'mailparse_stream_encode' => ['bool', 'sourcefp' => 'resource', 'destfp' => 'resource', 'encoding' => 'string'], 'mailparse_uudecode_all' => ['array', 'fp' => 'resource'], 'mapObj::__construct' => ['void', 'map_file_name' => 'string', 'new_map_path' => 'string'], 'mapObj::appendOutputFormat' => ['int', 'outputFormat' => 'outputformatObj'], 'mapObj::applyconfigoptions' => ['int'], 'mapObj::applySLD' => ['int', 'sldxml' => 'string'], 'mapObj::applySLDURL' => ['int', 'sldurl' => 'string'], 'mapObj::convertToString' => ['string'], 'mapObj::draw' => ['imageObj'], 'mapObj::drawLabelCache' => ['int', 'image' => 'imageObj'], 'mapObj::drawLegend' => ['imageObj'], 'mapObj::drawQuery' => ['imageObj'], 'mapObj::drawReferenceMap' => ['imageObj'], 'mapObj::drawScaleBar' => ['imageObj'], 'mapObj::embedLegend' => ['int', 'image' => 'imageObj'], 'mapObj::embedScalebar' => ['int', 'image' => 'imageObj'], 'mapObj::free' => ['void'], 'mapObj::generateSLD' => ['string'], 'mapObj::getAllGroupNames' => ['array'], 'mapObj::getAllLayerNames' => ['array'], 'mapObj::getColorbyIndex' => ['colorObj', 'iCloIndex' => 'int'], 'mapObj::getConfigOption' => ['string', 'key' => 'string'], 'mapObj::getLabel' => ['labelcacheMemberObj', 'index' => 'int'], 'mapObj::getLayer' => ['layerObj', 'index' => 'int'], 'mapObj::getLayerByName' => ['layerObj', 'layer_name' => 'string'], 'mapObj::getLayersDrawingOrder' => ['array'], 'mapObj::getLayersIndexByGroup' => ['array', 'groupname' => 'string'], 'mapObj::getMetaData' => ['int', 'name' => 'string'], 'mapObj::getNumSymbols' => ['int'], 'mapObj::getOutputFormat' => ['outputformatObj', 'index' => 'int'], 'mapObj::getProjection' => ['string'], 'mapObj::getSymbolByName' => ['int', 'symbol_name' => 'string'], 'mapObj::getSymbolObjectById' => ['symbolObj', 'symbolid' => 'int'], 'mapObj::loadMapContext' => ['int', 'filename' => 'string', 'unique_layer_name' => 'bool'], 'mapObj::loadOWSParameters' => ['int', 'request' => 'OwsrequestObj', 'version' => 'string'], 'mapObj::moveLayerDown' => ['int', 'layerindex' => 'int'], 'mapObj::moveLayerUp' => ['int', 'layerindex' => 'int'], 'mapObj::ms_newMapObjFromString' => ['MapObj', 'map_file_string' => 'string', 'new_map_path' => 'string'], 'mapObj::offsetExtent' => ['int', 'x' => 'float', 'y' => 'float'], 'mapObj::owsDispatch' => ['int', 'request' => 'OwsrequestObj'], 'mapObj::prepareImage' => ['imageObj'], 'mapObj::prepareQuery' => ['void'], 'mapObj::processLegendTemplate' => ['string', 'params' => 'array'], 'mapObj::processQueryTemplate' => ['string', 'params' => 'array', 'generateimages' => 'bool'], 'mapObj::processTemplate' => ['string', 'params' => 'array', 'generateimages' => 'bool'], 'mapObj::queryByFeatures' => ['int', 'slayer' => 'int'], 'mapObj::queryByIndex' => ['int', 'layerindex' => '', 'tileindex' => '', 'shapeindex' => '', 'addtoquery' => ''], 'mapObj::queryByPoint' => ['int', 'point' => 'pointObj', 'mode' => 'int', 'buffer' => 'float'], 'mapObj::queryByRect' => ['int', 'rect' => 'rectObj'], 'mapObj::queryByShape' => ['int', 'shape' => 'shapeObj'], 'mapObj::removeLayer' => ['layerObj', 'nIndex' => 'int'], 'mapObj::removeMetaData' => ['int', 'name' => 'string'], 'mapObj::removeOutputFormat' => ['int', 'name' => 'string'], 'mapObj::save' => ['int', 'filename' => 'string'], 'mapObj::saveMapContext' => ['int', 'filename' => 'string'], 'mapObj::saveQuery' => ['int', 'filename' => 'string', 'results' => 'int'], 'mapObj::scaleExtent' => ['int', 'zoomfactor' => 'float', 'minscaledenom' => 'float', 'maxscaledenom' => 'float'], 'mapObj::selectOutputFormat' => ['int', 'type' => 'string'], 'mapObj::set' => ['int', 'property_name' => 'string', 'new_value' => ''], 'mapObj::setCenter' => ['int', 'center' => 'pointObj'], 'mapObj::setConfigOption' => ['int', 'key' => 'string', 'value' => 'string'], 'mapObj::setExtent' => ['void', 'minx' => 'float', 'miny' => 'float', 'maxx' => 'float', 'maxy' => 'float'], 'mapObj::setFontSet' => ['int', 'fileName' => 'string'], 'mapObj::setMetaData' => ['int', 'name' => 'string', 'value' => 'string'], 'mapObj::setProjection' => ['int', 'proj_params' => 'string', 'bSetUnitsAndExtents' => 'bool'], 'mapObj::setRotation' => ['int', 'rotation_angle' => 'float'], 'mapObj::setSize' => ['int', 'width' => 'int', 'height' => 'int'], 'mapObj::setSymbolSet' => ['int', 'fileName' => 'string'], 'mapObj::setWKTProjection' => ['int', 'proj_params' => 'string', 'bSetUnitsAndExtents' => 'bool'], 'mapObj::zoomPoint' => ['int', 'nZoomFactor' => 'int', 'oPixelPos' => 'pointObj', 'nImageWidth' => 'int', 'nImageHeight' => 'int', 'oGeorefExt' => 'rectObj'], 'mapObj::zoomRectangle' => ['int', 'oPixelExt' => 'rectObj', 'nImageWidth' => 'int', 'nImageHeight' => 'int', 'oGeorefExt' => 'rectObj'], 'mapObj::zoomScale' => ['int', 'nScaleDenom' => 'float', 'oPixelPos' => 'pointObj', 'nImageWidth' => 'int', 'nImageHeight' => 'int', 'oGeorefExt' => 'rectObj', 'oMaxGeorefExt' => 'rectObj'], 'max' => ['', '...arg1' => 'array'], 'max\'1' => ['', 'arg1' => '', 'arg2' => '', '...args=' => ''], 'maxdb::__construct' => ['void', 'host=' => 'string', 'username=' => 'string', 'passwd=' => 'string', 'dbname=' => 'string', 'port=' => 'int', 'socket=' => 'string'], 'maxdb::affected_rows' => ['int', 'link' => ''], 'maxdb::auto_commit' => ['bool', 'link' => '', 'mode' => 'bool'], 'maxdb::change_user' => ['bool', 'link' => '', 'user' => 'string', 'password' => 'string', 'database' => 'string'], 'maxdb::character_set_name' => ['string', 'link' => ''], 'maxdb::close' => ['bool', 'link' => ''], 'maxdb::commit' => ['bool', 'link' => ''], 'maxdb::disable_reads_from_master' => ['', 'link' => ''], 'maxdb::errno' => ['int', 'link' => ''], 'maxdb::error' => ['string', 'link' => ''], 'maxdb::field_count' => ['int', 'link' => ''], 'maxdb::get_host_info' => ['string', 'link' => ''], 'maxdb::info' => ['string', 'link' => ''], 'maxdb::insert_id' => ['', 'link' => ''], 'maxdb::kill' => ['bool', 'link' => '', 'processid' => 'int'], 'maxdb::more_results' => ['bool', 'link' => ''], 'maxdb::multi_query' => ['bool', 'link' => '', 'query' => 'string'], 'maxdb::next_result' => ['bool', 'link' => ''], 'maxdb::num_rows' => ['int', 'result' => ''], 'maxdb::options' => ['bool', 'link' => '', 'option' => 'int', 'value' => ''], 'maxdb::ping' => ['bool', 'link' => ''], 'maxdb::prepare' => ['maxdb_stmt', 'link' => '', 'query' => 'string'], 'maxdb::protocol_version' => ['string', 'link' => ''], 'maxdb::query' => ['', 'link' => '', 'query' => 'string', 'resultmode=' => 'int'], 'maxdb::real_connect' => ['bool', 'link' => '', 'hostname=' => 'string', 'username=' => 'string', 'passwd=' => 'string', 'dbname=' => 'string', 'port=' => 'int', 'socket=' => 'string'], 'maxdb::real_escape_string' => ['string', 'link' => '', 'escapestr' => 'string'], 'maxdb::real_query' => ['bool', 'link' => '', 'query' => 'string'], 'maxdb::rollback' => ['bool', 'link' => ''], 'maxdb::rpl_query_type' => ['int', 'link' => ''], 'maxdb::select_db' => ['bool', 'link' => '', 'dbname' => 'string'], 'maxdb::send_query' => ['bool', 'link' => '', 'query' => 'string'], 'maxdb::server_info' => ['string', 'link' => ''], 'maxdb::server_version' => ['int', 'link' => ''], 'maxdb::sqlstate' => ['string', 'link' => ''], 'maxdb::ssl_set' => ['bool', 'link' => '', 'key' => 'string', 'cert' => 'string', 'ca' => 'string', 'capath' => 'string', 'cipher' => 'string'], 'maxdb::stat' => ['string', 'link' => ''], 'maxdb::stmt_init' => ['object', 'link' => ''], 'maxdb::store_result' => ['bool', 'link' => ''], 'maxdb::thread_id' => ['int', 'link' => ''], 'maxdb::use_result' => ['resource', 'link' => ''], 'maxdb::warning_count' => ['int', 'link' => ''], 'maxdb_affected_rows' => ['int', 'link' => 'resource'], 'maxdb_autocommit' => ['bool', 'link' => '', 'mode' => 'bool'], 'maxdb_change_user' => ['bool', 'link' => '', 'user' => 'string', 'password' => 'string', 'database' => 'string'], 'maxdb_character_set_name' => ['string', 'link' => ''], 'maxdb_close' => ['bool', 'link' => ''], 'maxdb_commit' => ['bool', 'link' => ''], 'maxdb_connect' => ['resource', 'host=' => 'string', 'username=' => 'string', 'passwd=' => 'string', 'dbname=' => 'string', 'port=' => 'int', 'socket=' => 'string'], 'maxdb_connect_errno' => ['int'], 'maxdb_connect_error' => ['string'], 'maxdb_data_seek' => ['bool', 'result' => '', 'offset' => 'int'], 'maxdb_debug' => ['void', 'debug' => 'string'], 'maxdb_disable_reads_from_master' => ['', 'link' => ''], 'maxdb_disable_rpl_parse' => ['bool', 'link' => 'resource'], 'maxdb_dump_debug_info' => ['bool', 'link' => 'resource'], 'maxdb_embedded_connect' => ['resource', 'dbname=' => 'string'], 'maxdb_enable_reads_from_master' => ['bool', 'link' => 'resource'], 'maxdb_enable_rpl_parse' => ['bool', 'link' => 'resource'], 'maxdb_errno' => ['int', 'link' => 'resource'], 'maxdb_error' => ['string', 'link' => 'resource'], 'maxdb_fetch_array' => ['', 'result' => '', 'resulttype=' => 'int'], 'maxdb_fetch_assoc' => ['array', 'result' => ''], 'maxdb_fetch_field' => ['', 'result' => ''], 'maxdb_fetch_field_direct' => ['', 'result' => '', 'fieldnr' => 'int'], 'maxdb_fetch_fields' => ['', 'result' => ''], 'maxdb_fetch_lengths' => ['array', 'result' => 'resource'], 'maxdb_fetch_object' => ['object', 'result' => 'object'], 'maxdb_fetch_row' => ['', 'result' => ''], 'maxdb_field_count' => ['int', 'link' => ''], 'maxdb_field_seek' => ['bool', 'result' => '', 'fieldnr' => 'int'], 'maxdb_field_tell' => ['int', 'result' => 'resource'], 'maxdb_free_result' => ['', 'result' => ''], 'maxdb_get_client_info' => ['string'], 'maxdb_get_client_version' => ['int'], 'maxdb_get_host_info' => ['string', 'link' => 'resource'], 'maxdb_get_proto_info' => ['string', 'link' => 'resource'], 'maxdb_get_server_info' => ['string', 'link' => 'resource'], 'maxdb_get_server_version' => ['int', 'link' => 'resource'], 'maxdb_info' => ['string', 'link' => 'resource'], 'maxdb_init' => ['resource'], 'maxdb_insert_id' => ['mixed', 'link' => 'resource'], 'maxdb_kill' => ['bool', 'link' => '', 'processid' => 'int'], 'maxdb_master_query' => ['bool', 'link' => 'resource', 'query' => 'string'], 'maxdb_more_results' => ['bool', 'link' => 'resource'], 'maxdb_multi_query' => ['bool', 'link' => '', 'query' => 'string'], 'maxdb_next_result' => ['bool', 'link' => 'resource'], 'maxdb_num_fields' => ['int', 'result' => 'resource'], 'maxdb_num_rows' => ['int', 'result' => 'resource'], 'maxdb_options' => ['bool', 'link' => '', 'option' => 'int', 'value' => ''], 'maxdb_ping' => ['bool', 'link' => ''], 'maxdb_prepare' => ['maxdb_stmt', 'link' => '', 'query' => 'string'], 'maxdb_query' => ['', 'link' => '', 'query' => 'string', 'resultmode=' => 'int'], 'maxdb_real_connect' => ['bool', 'link' => '', 'hostname=' => 'string', 'username=' => 'string', 'passwd=' => 'string', 'dbname=' => 'string', 'port=' => 'int', 'socket=' => 'string'], 'maxdb_real_escape_string' => ['string', 'link' => '', 'escapestr' => 'string'], 'maxdb_real_query' => ['bool', 'link' => '', 'query' => 'string'], 'maxdb_report' => ['bool', 'flags' => 'int'], 'maxdb_result::current_field' => ['int', 'result' => ''], 'maxdb_result::data_seek' => ['bool', 'result' => '', 'offset' => 'int'], 'maxdb_result::fetch_array' => ['', 'result' => '', 'resulttype=' => 'int'], 'maxdb_result::fetch_assoc' => ['array', 'result' => ''], 'maxdb_result::fetch_field' => ['', 'result' => ''], 'maxdb_result::fetch_field_direct' => ['', 'result' => '', 'fieldnr' => 'int'], 'maxdb_result::fetch_fields' => ['', 'result' => ''], 'maxdb_result::fetch_object' => ['object', 'result' => 'object'], 'maxdb_result::fetch_row' => ['', 'result' => ''], 'maxdb_result::field_count' => ['int', 'result' => ''], 'maxdb_result::field_seek' => ['bool', 'result' => '', 'fieldnr' => 'int'], 'maxdb_result::free' => ['', 'result' => ''], 'maxdb_result::lengths' => ['array', 'result' => ''], 'maxdb_rollback' => ['bool', 'link' => ''], 'maxdb_rpl_parse_enabled' => ['int', 'link' => 'resource'], 'maxdb_rpl_probe' => ['bool', 'link' => 'resource'], 'maxdb_rpl_query_type' => ['int', 'link' => ''], 'maxdb_select_db' => ['bool', 'link' => 'resource', 'dbname' => 'string'], 'maxdb_send_query' => ['bool', 'link' => '', 'query' => 'string'], 'maxdb_server_end' => ['void'], 'maxdb_server_init' => ['bool', 'server=' => 'array', 'groups=' => 'array'], 'maxdb_sqlstate' => ['string', 'link' => 'resource'], 'maxdb_ssl_set' => ['bool', 'link' => '', 'key' => 'string', 'cert' => 'string', 'ca' => 'string', 'capath' => 'string', 'cipher' => 'string'], 'maxdb_stat' => ['string', 'link' => ''], 'maxdb_stmt::affected_rows' => ['int', 'stmt' => ''], 'maxdb_stmt::bind_param' => ['bool', 'stmt' => '', 'types' => 'string', '&...rw_var' => ''], 'maxdb_stmt::bind_param\'1' => ['bool', 'stmt' => '', 'types' => 'string', '&rw_var' => 'array'], 'maxdb_stmt::bind_result' => ['bool', 'stmt' => '', '&rw_var1' => '', '&...rw_vars=' => ''], 'maxdb_stmt::close' => ['bool', 'stmt' => ''], 'maxdb_stmt::close_long_data' => ['bool', 'stmt' => '', 'param_nr' => 'int'], 'maxdb_stmt::data_seek' => ['bool', 'statement' => '', 'offset' => 'int'], 'maxdb_stmt::errno' => ['int', 'stmt' => ''], 'maxdb_stmt::error' => ['string', 'stmt' => ''], 'maxdb_stmt::execute' => ['bool', 'stmt' => ''], 'maxdb_stmt::fetch' => ['bool', 'stmt' => ''], 'maxdb_stmt::free_result' => ['', 'stmt' => ''], 'maxdb_stmt::num_rows' => ['int', 'stmt' => ''], 'maxdb_stmt::param_count' => ['int', 'stmt' => ''], 'maxdb_stmt::prepare' => ['', 'stmt' => '', 'query' => 'string'], 'maxdb_stmt::reset' => ['bool', 'stmt' => ''], 'maxdb_stmt::result_metadata' => ['resource', 'stmt' => ''], 'maxdb_stmt::send_long_data' => ['bool', 'stmt' => '', 'param_nr' => 'int', 'data' => 'string'], 'maxdb_stmt::stmt_send_long_data' => ['bool', 'param_nr' => 'int', 'data' => 'string'], 'maxdb_stmt::store_result' => ['bool'], 'maxdb_stmt_affected_rows' => ['int', 'stmt' => 'resource'], 'maxdb_stmt_bind_param' => ['bool', 'stmt' => '', 'types' => 'string', 'var1' => '', '...args=' => '', 'var=' => 'array'], 'maxdb_stmt_bind_result' => ['bool', 'stmt' => '', '&rw_var1' => '', '&...rw_vars=' => ''], 'maxdb_stmt_close' => ['bool', 'stmt' => ''], 'maxdb_stmt_close_long_data' => ['bool', 'stmt' => '', 'param_nr' => 'int'], 'maxdb_stmt_data_seek' => ['bool', 'statement' => '', 'offset' => 'int'], 'maxdb_stmt_errno' => ['int', 'stmt' => 'resource'], 'maxdb_stmt_error' => ['string', 'stmt' => 'resource'], 'maxdb_stmt_execute' => ['bool', 'stmt' => ''], 'maxdb_stmt_fetch' => ['bool', 'stmt' => ''], 'maxdb_stmt_free_result' => ['', 'stmt' => ''], 'maxdb_stmt_init' => ['object', 'link' => ''], 'maxdb_stmt_num_rows' => ['int', 'stmt' => 'resource'], 'maxdb_stmt_param_count' => ['int', 'stmt' => 'resource'], 'maxdb_stmt_prepare' => ['', 'stmt' => '', 'query' => 'string'], 'maxdb_stmt_reset' => ['bool', 'stmt' => ''], 'maxdb_stmt_result_metadata' => ['resource', 'stmt' => ''], 'maxdb_stmt_send_long_data' => ['bool', 'stmt' => '', 'param_nr' => 'int', 'data' => 'string'], 'maxdb_stmt_sqlstate' => ['string', 'stmt' => 'resource'], 'maxdb_stmt_store_result' => ['bool', 'stmt' => ''], 'maxdb_store_result' => ['bool', 'link' => ''], 'maxdb_thread_id' => ['int', 'link' => 'resource'], 'maxdb_thread_safe' => ['bool'], 'maxdb_use_result' => ['resource', 'link' => ''], 'maxdb_warning_count' => ['int', 'link' => 'resource'], 'mb_check_encoding' => ['bool', 'var=' => 'string', 'encoding=' => 'string'], 'mb_chr' => ['string|false', 'cp' => 'int', 'encoding=' => 'string'], 'mb_convert_case' => ['string', 'sourcestring' => 'string', 'mode' => 'int', 'encoding=' => 'string'], 'mb_convert_encoding' => ['string', 'str' => 'string', 'to_encoding' => 'string', 'from_encoding=' => 'mixed'], 'mb_convert_kana' => ['string', 'str' => 'string', 'option=' => 'string', 'encoding=' => 'string'], 'mb_convert_variables' => ['string|false', 'to_encoding' => 'string', 'from_encoding' => 'array|string', '&rw_vars' => 'string|array|object', '&...rw_vars=' => 'string|array|object'], 'mb_decode_mimeheader' => ['string', 'string' => 'string'], 'mb_decode_numericentity' => ['string', 'string' => 'string', 'convmap' => 'array', 'encoding' => 'string'], 'mb_detect_encoding' => ['string|false', 'str' => 'string', 'encoding_list=' => 'mixed', 'strict=' => 'bool'], 'mb_detect_order' => ['bool|array', 'encoding_list=' => 'mixed'], 'mb_encode_mimeheader' => ['string', 'str' => 'string', 'charset=' => 'string', 'transfer_encoding=' => 'string', 'linefeed=' => 'string', 'indent=' => 'int'], 'mb_encode_numericentity' => ['string', 'string' => 'string', 'convmap' => 'array', 'encoding' => 'string', 'is_hex=' => 'bool'], 'mb_encoding_aliases' => ['array|false', 'encoding' => 'string'], 'mb_ereg' => ['int|false', 'pattern' => 'string', 'string' => 'string', '&w_registers=' => 'array'], 'mb_ereg_match' => ['bool', 'pattern' => 'string', 'string' => 'string', 'option=' => 'string'], 'mb_ereg_replace' => ['string|false', 'pattern' => 'string', 'replacement' => 'string', 'string' => 'string', 'option=' => 'string'], 'mb_ereg_replace_callback' => ['string|false', 'pattern' => 'string', 'callback' => 'string', 'string' => 'string', 'option=' => 'string'], 'mb_ereg_search' => ['bool', 'pattern=' => 'string', 'option=' => 'string'], 'mb_ereg_search_getpos' => ['int'], 'mb_ereg_search_getregs' => ['array|false'], 'mb_ereg_search_init' => ['bool', 'string' => 'string', 'pattern=' => 'string', 'option=' => 'string'], 'mb_ereg_search_pos' => ['array|false', 'pattern=' => 'string', 'option=' => 'string'], 'mb_ereg_search_regs' => ['array|false', 'pattern=' => 'string', 'option=' => 'string'], 'mb_ereg_search_setpos' => ['bool', 'position' => 'int'], 'mb_eregi' => ['int', 'pattern' => 'string', 'string' => 'string', '&w_registers=' => 'array'], 'mb_eregi_replace' => ['string|false', 'pattern' => 'string', 'replacement' => 'string', 'string' => 'string', 'option=' => 'string'], 'mb_get_info' => ['mixed', 'type=' => 'string'], 'mb_http_input' => ['mixed', 'type=' => 'string'], 'mb_http_output' => ['string|bool', 'encoding=' => 'string'], 'mb_internal_encoding' => ['string|bool', 'encoding=' => 'string'], 'mb_language' => ['string|bool', 'language=' => 'string'], 'mb_list_encodings' => ['array'], 'mb_ord' => ['int|false', 'str' => 'string', 'enc=' => 'string'], 'mb_output_handler' => ['string', 'contents' => 'string', 'status' => 'int'], 'mb_parse_str' => ['bool', 'encoded_string' => 'string', '&w_result=' => 'array'], 'mb_preferred_mime_name' => ['string', 'encoding' => 'string'], 'mb_regex_encoding' => ['string|bool', 'encoding=' => 'string'], 'mb_regex_set_options' => ['string', 'options=' => 'string'], 'mb_scrub' => ['string', 'str' => 'string', 'enc=' => 'string'], 'mb_send_mail' => ['bool', 'to' => 'string', 'subject' => 'string', 'message' => 'string', 'additional_headers=' => 'string', 'additional_parameter=' => 'string'], 'mb_split' => ['array', 'pattern' => 'string', 'string' => 'string', 'limit=' => 'int'], 'mb_strcut' => ['string', 'str' => 'string', 'start' => 'int', 'length=' => 'int', 'encoding=' => 'string'], 'mb_strimwidth' => ['string', 'str' => 'string', 'start' => 'int', 'width' => 'int', 'trimmarker=' => 'string', 'encoding=' => 'string'], 'mb_stripos' => ['int|false', 'haystack' => 'string', 'needle' => 'string', 'offset=' => 'int', 'encoding=' => 'string'], 'mb_stristr' => ['string|false', 'haystack' => 'string', 'needle' => 'string', 'part=' => 'bool', 'encoding=' => 'string'], 'mb_strlen' => ['int|false', 'str' => 'string', 'encoding=' => 'string'], 'mb_strpos' => ['int|false', 'haystack' => 'string', 'needle' => 'string', 'offset=' => 'int', 'encoding=' => 'string'], 'mb_strrchr' => ['string|false', 'haystack' => 'string', 'needle' => 'string', 'part=' => 'bool', 'encoding=' => 'string'], 'mb_strrichr' => ['string|false', 'haystack' => 'string', 'needle' => 'string', 'part=' => 'bool', 'encoding=' => 'string'], 'mb_strripos' => ['int|false', 'haystack' => 'string', 'needle' => 'string', 'offset=' => 'int', 'encoding=' => 'string'], 'mb_strrpos' => ['int|false', 'haystack' => 'string', 'needle' => 'string', 'offset=' => 'int', 'encoding=' => 'string'], 'mb_strstr' => ['string|false', 'haystack' => 'string', 'needle' => 'string', 'part=' => 'bool', 'encoding=' => 'string'], 'mb_strtolower' => ['string', 'str' => 'string', 'encoding=' => 'string'], 'mb_strtoupper' => ['string', 'str' => 'string', 'encoding=' => 'string'], 'mb_strwidth' => ['int', 'str' => 'string', 'encoding=' => 'string'], 'mb_substitute_character' => ['mixed', 'substchar=' => 'mixed'], 'mb_substr' => ['string', 'str' => 'string', 'start' => 'int', 'length=' => '?int', 'encoding=' => 'string'], 'mb_substr_count' => ['int', 'haystack' => 'string', 'needle' => 'string', 'encoding=' => 'string'], 'mcrypt_cbc' => ['string', 'cipher' => 'string', 'key' => 'string', 'data' => 'string', 'mode' => 'int', 'iv=' => 'string'], 'mcrypt_cfb' => ['string', 'cipher' => 'string', 'key' => 'string', 'data' => 'string', 'mode' => 'int', 'iv=' => 'string'], 'mcrypt_create_iv' => ['string', 'size' => 'int', 'source=' => 'int'], 'mcrypt_decrypt' => ['string', 'cipher' => 'string', 'key' => 'string', 'data' => 'string', 'mode' => 'string', 'iv=' => 'string'], 'mcrypt_ecb' => ['string', 'cipher' => 'string', 'key' => 'string', 'data' => 'string', 'mode' => 'int', 'iv=' => 'string'], 'mcrypt_enc_get_algorithms_name' => ['string', 'td' => 'resource'], 'mcrypt_enc_get_block_size' => ['int', 'td' => 'resource'], 'mcrypt_enc_get_iv_size' => ['int', 'td' => 'resource'], 'mcrypt_enc_get_key_size' => ['int', 'td' => 'resource'], 'mcrypt_enc_get_modes_name' => ['string', 'td' => 'resource'], 'mcrypt_enc_get_supported_key_sizes' => ['array', 'td' => 'resource'], 'mcrypt_enc_is_block_algorithm' => ['bool', 'td' => 'resource'], 'mcrypt_enc_is_block_algorithm_mode' => ['bool', 'td' => 'resource'], 'mcrypt_enc_is_block_mode' => ['bool', 'td' => 'resource'], 'mcrypt_enc_self_test' => ['int', 'td' => 'resource'], 'mcrypt_encrypt' => ['string', 'cipher' => 'string', 'key' => 'string', 'data' => 'string', 'mode' => 'string', 'iv=' => 'string'], 'mcrypt_generic' => ['string', 'td' => 'resource', 'data' => 'string'], 'mcrypt_generic_deinit' => ['bool', 'td' => 'resource'], 'mcrypt_generic_end' => ['bool', 'td' => 'resource'], 'mcrypt_generic_init' => ['int', 'td' => 'resource', 'key' => 'string', 'iv' => 'string'], 'mcrypt_get_block_size' => ['int', 'cipher' => 'string', 'module' => 'string'], 'mcrypt_get_cipher_name' => ['string', 'cipher' => 'string'], 'mcrypt_get_iv_size' => ['int', 'cipher' => 'string', 'module' => 'string'], 'mcrypt_get_key_size' => ['int', 'cipher' => 'string', 'module' => 'string'], 'mcrypt_list_algorithms' => ['array', 'lib_dir=' => 'string'], 'mcrypt_list_modes' => ['array', 'lib_dir=' => 'string'], 'mcrypt_module_close' => ['bool', 'td' => 'resource'], 'mcrypt_module_get_algo_block_size' => ['int', 'algorithm' => 'string', 'lib_dir=' => 'string'], 'mcrypt_module_get_algo_key_size' => ['int', 'algorithm' => 'string', 'lib_dir=' => 'string'], 'mcrypt_module_get_supported_key_sizes' => ['array', 'algorithm' => 'string', 'lib_dir=' => 'string'], 'mcrypt_module_is_block_algorithm' => ['bool', 'algorithm' => 'string', 'lib_dir=' => 'string'], 'mcrypt_module_is_block_algorithm_mode' => ['bool', 'mode' => 'string', 'lib_dir=' => 'string'], 'mcrypt_module_is_block_mode' => ['bool', 'mode' => 'string', 'lib_dir=' => 'string'], 'mcrypt_module_open' => ['resource', 'cipher' => 'string', 'cipher_directory' => 'string', 'mode' => 'string', 'mode_directory' => 'string'], 'mcrypt_module_self_test' => ['bool', 'algorithm' => 'string', 'lib_dir=' => 'string'], 'mcrypt_ofb' => ['string', 'cipher' => 'string', 'key' => 'string', 'data' => 'string', 'mode' => 'int', 'iv=' => 'string'], 'md5' => ['string', 'str' => 'string', 'raw_output=' => 'bool'], 'md5_file' => ['string|false', 'filename' => 'string', 'raw_output=' => 'bool'], 'mdecrypt_generic' => ['string', 'td' => 'resource', 'data' => 'string'], 'Memcache::add' => ['bool', 'key' => 'string', 'var' => 'mixed', 'flag=' => 'int', 'expire=' => 'int'], 'Memcache::addServer' => ['bool', 'host' => 'string', 'port=' => 'int', 'persistent=' => 'bool', 'weight=' => 'int', 'timeout=' => 'int', 'retry_interval=' => 'int', 'status=' => 'bool', 'failure_callback=' => 'callable', 'timeoutms=' => 'int'], 'Memcache::close' => ['bool'], 'Memcache::connect' => ['bool', 'host' => 'string', 'port=' => 'int', 'timeout=' => 'int'], 'Memcache::decrement' => ['int', 'key' => 'string', 'value=' => 'int'], 'Memcache::delete' => ['bool', 'key' => 'string', 'timeout=' => 'int'], 'Memcache::flush' => ['bool'], 'Memcache::get' => ['array', 'key' => 'string', 'flags=' => 'array', 'keys=' => 'array'], 'Memcache::getExtendedStats' => ['array', 'type=' => 'string', 'slabid=' => 'int', 'limit=' => 'int'], 'Memcache::getServerStatus' => ['int', 'host' => 'string', 'port=' => 'int'], 'Memcache::getStats' => ['array', 'type=' => 'string', 'slabid=' => 'int', 'limit=' => 'int'], 'Memcache::getVersion' => ['string'], 'Memcache::increment' => ['int', 'key' => 'string', 'value=' => 'int'], 'Memcache::pconnect' => ['bool', 'host' => 'string', 'port=' => 'int', 'timeout=' => 'int'], 'Memcache::replace' => ['bool', 'key' => 'string', 'var' => 'mixed', 'flag=' => 'int', 'expire=' => 'int'], 'Memcache::set' => ['bool', 'key' => 'string', 'var' => 'mixed', 'flag=' => 'int', 'expire=' => 'int'], 'Memcache::setCompressThreshold' => ['bool', 'threshold' => 'int', 'min_savings=' => 'float'], 'Memcache::setServerParams' => ['bool', 'host' => 'string', 'port=' => 'int', 'timeout=' => 'int', 'retry_interval=' => 'int', 'status=' => 'bool', 'failure_callback=' => 'callable'], 'memcache_debug' => ['bool', 'on_off' => 'bool'], 'Memcached::add' => ['bool', 'key' => 'string', 'value' => 'mixed', 'expiration=' => 'int'], 'Memcached::addByKey' => ['bool', 'server_key' => 'string', 'key' => 'string', 'value' => 'mixed', 'expiration=' => 'int'], 'Memcached::addServer' => ['bool', 'host' => 'string', 'port' => 'int', 'weight=' => 'int'], 'Memcached::addServers' => ['bool', 'servers' => 'array'], 'Memcached::append' => ['bool', 'key' => 'string', 'value' => 'string'], 'Memcached::appendByKey' => ['bool', 'server_key' => 'string', 'key' => 'string', 'value' => 'string'], 'Memcached::cas' => ['bool', 'cas_token' => 'float', 'key' => 'string', 'value' => 'mixed', 'expiration=' => 'int'], 'Memcached::casByKey' => ['bool', 'cas_token' => 'float', 'server_key' => 'string', 'key' => 'string', 'value' => 'mixed', 'expiration=' => 'int'], 'Memcached::decrement' => ['int|false', 'key' => 'string', 'offset=' => 'int', 'initial_value=' => 'int', 'expiry=' => 'int'], 'Memcached::decrementByKey' => ['int|false', 'server_key' => 'string', 'key' => 'string', 'offset=' => 'int', 'initial_value=' => 'int', 'expiry=' => 'int'], 'Memcached::delete' => ['bool', 'key' => 'string', 'time=' => 'int'], 'Memcached::deleteByKey' => ['bool', 'server_key' => 'string', 'key' => 'string', 'time=' => 'int'], 'Memcached::deleteMulti' => ['bool', 'keys' => 'array', 'time=' => 'int'], 'Memcached::deleteMultiByKey' => ['bool', 'server_key' => 'string', 'keys' => 'array', 'time=' => 'int'], 'Memcached::fetch' => ['array'], 'Memcached::fetchAll' => ['array'], 'Memcached::flush' => ['bool', 'delay=' => 'int'], 'Memcached::get' => ['mixed', 'key' => 'string', 'cache_cb=' => '?callable', 'flags=' => 'int'], 'Memcached::getAllKeys' => ['array|false'], 'Memcached::getByKey' => ['mixed', 'server_key' => 'string', 'key' => 'string', 'value_cb=' => '?callable', 'flags=' => 'int'], 'Memcached::getDelayed' => ['bool', 'keys' => 'array', 'with_cas=' => 'bool', 'value_cb=' => 'callable'], 'Memcached::getDelayedByKey' => ['bool', 'server_key' => 'string', 'keys' => 'array', 'with_cas=' => 'bool', 'value_cb=' => '?callable'], 'Memcached::getMulti' => ['array|false', 'keys' => 'array', 'flags=' => 'int'], 'Memcached::getMultiByKey' => ['array', 'server_key' => 'string', 'keys' => 'array', 'flags=' => 'int'], 'Memcached::getOption' => ['mixed', 'option' => 'int'], 'Memcached::getResultCode' => ['int'], 'Memcached::getResultMessage' => ['string'], 'Memcached::getServerByKey' => ['array', 'server_key' => 'string'], 'Memcached::getServerList' => ['array'], 'Memcached::getStats' => ['array', 'type=' => '?string'], 'Memcached::getVersion' => ['array'], 'Memcached::increment' => ['int|false', 'key' => 'string', 'offset=' => 'int', 'initial_value=' => 'int', 'expiry=' => 'int'], 'Memcached::incrementByKey' => ['int|false', 'server_key' => 'string', 'key' => 'string', 'offset=' => 'int', 'initial_value=' => 'int', 'expiry=' => 'int'], 'Memcached::isPersistent' => ['bool'], 'Memcached::isPristine' => ['bool'], 'Memcached::prepend' => ['bool', 'key' => 'string', 'value' => 'string'], 'Memcached::prependByKey' => ['bool', 'server_key' => 'string', 'key' => 'string', 'value' => 'string'], 'Memcached::quit' => ['bool'], 'Memcached::replace' => ['bool', 'key' => 'string', 'value' => 'mixed', 'expiration=' => 'int'], 'Memcached::replaceByKey' => ['bool', 'server_key' => 'string', 'key' => 'string', 'value' => 'mixed', 'expiration=' => 'int'], 'Memcached::resetServerList' => ['bool'], 'Memcached::set' => ['bool', 'key' => 'string', 'value' => 'mixed', 'expiration=' => 'int'], 'Memcached::setByKey' => ['bool', 'server_key' => 'string', 'key' => 'string', 'value' => 'mixed', 'expiration=' => 'int'], 'Memcached::setMulti' => ['bool', 'items' => 'array', 'expiration=' => 'int'], 'Memcached::setMultiByKey' => ['bool', 'server_key' => 'string', 'items' => 'array', 'expiration=' => 'int'], 'Memcached::setOption' => ['bool', 'option' => 'int', 'value' => 'mixed'], 'Memcached::setOptions' => ['bool', 'options' => 'array'], 'Memcached::setSaslAuthData' => ['void', 'username' => 'string', 'password' => 'string'], 'Memcached::touch' => ['bool', 'key' => 'string', 'expiration' => 'int'], 'Memcached::touchByKey' => ['bool', 'server_key' => 'string', 'key' => 'string', 'expiration' => 'int'], 'memory_get_peak_usage' => ['int', 'real_usage=' => 'bool'], 'memory_get_usage' => ['int', 'real_usage=' => 'bool'], 'MessageFormatter::__construct' => ['void', 'locale' => 'string', 'pattern' => 'string'], 'MessageFormatter::create' => ['MessageFormatter', 'locale' => 'string', 'pattern' => 'string'], 'MessageFormatter::format' => ['false|string', 'args' => 'array'], 'MessageFormatter::formatMessage' => ['false|string', 'locale' => 'string', 'pattern' => 'string', 'args' => 'array'], 'MessageFormatter::getErrorCode' => ['int'], 'MessageFormatter::getErrorMessage' => ['string'], 'MessageFormatter::getLocale' => ['string'], 'MessageFormatter::getPattern' => ['string'], 'MessageFormatter::parse' => ['array', 'value' => 'string'], 'MessageFormatter::parseMessage' => ['array', 'locale' => 'string', 'pattern' => 'string', 'source' => 'string'], 'MessageFormatter::setPattern' => ['bool', 'pattern' => 'string'], 'metaphone' => ['string', 'text' => 'string', 'phones=' => 'int'], 'method_exists' => ['bool', 'object' => 'object|string', 'method' => 'string'], 'mhash' => ['string', 'hash' => 'int', 'data' => 'string', 'key=' => 'string'], 'mhash_count' => ['int'], 'mhash_get_block_size' => ['int', 'hash' => 'int'], 'mhash_get_hash_name' => ['string', 'hash' => 'int'], 'mhash_keygen_s2k' => ['string', 'hash' => 'int', 'input_password' => 'string', 'salt' => 'string', 'bytes' => 'int'], 'microtime' => ['mixed', 'get_as_float=' => 'bool'], 'mime_content_type' => ['string|false', 'filename_or_stream' => 'string'], 'min' => ['', '...arg1' => 'array'], 'min\'1' => ['', 'arg1' => '', 'arg2' => '', '...args=' => ''], 'ming_keypress' => ['int', 'char' => 'string'], 'ming_setcubicthreshold' => ['void', 'threshold' => 'int'], 'ming_setscale' => ['void', 'scale' => 'float'], 'ming_setswfcompression' => ['void', 'level' => 'int'], 'ming_useconstants' => ['void', 'use' => 'int'], 'ming_useswfversion' => ['void', 'version' => 'int'], 'mkdir' => ['bool', 'pathname' => 'string', 'mode=' => 'int', 'recursive=' => 'bool', 'context=' => 'resource'], 'mktime' => ['int', 'hour=' => 'int', 'min=' => 'int', 'sec=' => 'int', 'mon=' => 'int', 'day=' => 'int', 'year=' => 'int'], 'money_format' => ['string', 'format' => 'string', 'value' => 'float'], 'Mongo::__get' => ['MongoDB', 'dbname' => 'string'], 'Mongo::__toString' => ['string'], 'Mongo::close' => ['bool'], 'Mongo::connect' => ['bool'], 'Mongo::connectUtil' => ['bool'], 'Mongo::dropDB' => ['array', 'db' => ''], 'Mongo::forceError' => ['bool'], 'Mongo::getConnections' => ['array'], 'Mongo::getHosts' => ['array'], 'Mongo::getPoolSize' => ['int'], 'Mongo::getReadPreference' => ['array'], 'Mongo::getSlave' => ['string'], 'Mongo::getSlaveOkay' => ['bool'], 'Mongo::getWriteConcern' => ['array'], 'Mongo::killCursor' => ['', 'server_hash' => 'string', 'id' => 'MongoInt64|int'], 'Mongo::lastError' => ['array|null'], 'Mongo::listDBs' => ['array'], 'Mongo::pairConnect' => ['bool'], 'Mongo::pairPersistConnect' => ['bool', 'username=' => 'string', 'password=' => 'string'], 'Mongo::persistConnect' => ['bool', 'username=' => 'string', 'password=' => 'string'], 'Mongo::poolDebug' => ['array'], 'Mongo::prevError' => ['array'], 'Mongo::resetError' => ['array'], 'Mongo::selectCollection' => ['MongoCollection', 'db' => 'string', 'collection' => 'string'], 'Mongo::selectDB' => ['MongoDB', 'name' => 'string'], 'Mongo::setPoolSize' => ['bool', 'size' => 'int'], 'Mongo::setReadPreference' => ['bool', 'readPreference' => 'string', 'tags=' => 'array'], 'Mongo::setSlaveOkay' => ['bool', 'ok=' => 'bool'], 'Mongo::switchSlave' => ['string'], 'MongoBinData::__construct' => ['void', 'data' => 'string', 'type=' => 'int'], 'MongoBinData::__toString' => ['string'], 'MongoClient::__construct' => ['void', 'server=' => 'string', 'options=' => 'array', 'driver_options' => 'array'], 'MongoClient::__get' => ['MongoDB', 'dbname' => 'string'], 'MongoClient::__toString' => ['string'], 'MongoClient::close' => ['bool', 'connection=' => 'bool|string'], 'MongoClient::connect' => ['bool'], 'MongoClient::dropDB' => ['array', 'db' => 'mixed'], 'MongoClient::getConnections' => ['array'], 'MongoClient::getHosts' => ['array'], 'MongoClient::getReadPreference' => ['array'], 'MongoClient::getWriteConcern' => ['array'], 'MongoClient::killCursor' => ['bool', 'server_hash' => 'string', 'id' => 'int|MongoInt64'], 'MongoClient::listDBs' => ['array'], 'MongoClient::selectCollection' => ['MongoCollection', 'db' => 'string', 'collection' => 'string'], 'MongoClient::selectDB' => ['MongoDB', 'name' => 'string'], 'MongoClient::setReadPreference' => ['bool', 'read_preference' => 'string', 'tags=' => 'array'], 'MongoClient::setWriteConcern' => ['bool', 'w' => 'mixed', 'wtimeout=' => 'int'], 'MongoClient::switchSlave' => ['string'], 'MongoCode::__construct' => ['void', 'code' => 'string', 'scope=' => 'array'], 'MongoCode::__toString' => ['string'], 'MongoCollection::__construct' => ['void', 'db' => 'MongoDB', 'name' => 'string'], 'MongoCollection::__get' => ['MongoCollection', 'name' => 'string'], 'MongoCollection::__toString' => ['string'], 'MongoCollection::aggregate' => ['array', 'op' => 'array', 'op=' => 'array', '...args=' => 'array'], 'MongoCollection::aggregate\'1' => ['array', 'pipeline' => 'array', 'options=' => 'array'], 'MongoCollection::aggregateCursor' => ['MongoCommandCursor', 'command' => 'array', 'options=' => 'array'], 'MongoCollection::batchInsert' => ['mixed', 'a' => 'array', 'options=' => 'array'], 'MongoCollection::count' => ['int', 'query=' => 'array', 'limit=' => 'int', 'skip=' => 'int'], 'MongoCollection::createDBRef' => ['array', 'a' => 'array'], 'MongoCollection::createIndex' => ['bool', 'keys' => 'array', 'options=' => 'array'], 'MongoCollection::deleteIndex' => ['array', 'keys' => 'string|array'], 'MongoCollection::deleteIndexes' => ['array'], 'MongoCollection::distinct' => ['array', 'key' => 'string', 'query=' => 'array'], 'MongoCollection::drop' => ['array'], 'MongoCollection::ensureIndex' => ['bool', 'keys' => 'array', 'options=' => 'array'], 'MongoCollection::find' => ['MongoCursor', 'query=' => 'array', 'fields=' => 'array'], 'MongoCollection::findAndModify' => ['array', 'query' => 'array', 'update=' => 'array', 'fields=' => 'array', 'options=' => 'array'], 'MongoCollection::findOne' => ['array', 'query=' => 'array', 'fields=' => 'array'], 'MongoCollection::getDBRef' => ['array', 'ref' => 'array'], 'MongoCollection::getIndexInfo' => ['array'], 'MongoCollection::getName' => ['string'], 'MongoCollection::getReadPreference' => ['array'], 'MongoCollection::getSlaveOkay' => ['bool'], 'MongoCollection::getWriteConcern' => ['array'], 'MongoCollection::group' => ['array', 'keys' => 'mixed', 'initial' => 'array', 'reduce' => 'mongocode', 'options=' => 'array'], 'MongoCollection::insert' => ['bool|array', 'a' => 'array', 'options=' => 'array'], 'MongoCollection::parallelCollectionScan' => ['MongoCommandCursor[]', 'num_cursors' => 'int'], 'MongoCollection::remove' => ['bool|array', 'criteria=' => 'array', 'options=' => 'array'], 'MongoCollection::save' => ['mixed', 'a' => 'array', 'options=' => 'array'], 'MongoCollection::setReadPreference' => ['bool', 'read_preference' => 'string', 'tags=' => 'array'], 'MongoCollection::setSlaveOkay' => ['bool', 'ok=' => 'bool'], 'MongoCollection::setWriteConcern' => ['bool', 'w' => 'mixed', 'wtimeout=' => 'int'], 'MongoCollection::toIndexString' => ['string', 'keys' => 'mixed'], 'MongoCollection::update' => ['bool', 'criteria' => 'array', 'newobj' => 'array', 'options=' => 'array'], 'MongoCollection::validate' => ['array', 'scan_data=' => 'bool'], 'MongoCommandCursor::__construct' => ['void', 'connection' => 'MongoClient', 'ns' => 'string', 'command' => 'array'], 'MongoCommandCursor::batchSize' => ['MongoCommandCursor', 'batchSize' => 'int'], 'MongoCommandCursor::createFromDocument' => ['MongoCommandCursor', 'connection' => 'MongoClient', 'hash' => 'string', 'document' => 'array'], 'MongoCommandCursor::current' => ['array'], 'MongoCommandCursor::dead' => ['bool'], 'MongoCommandCursor::getReadPreference' => ['array'], 'MongoCommandCursor::info' => ['array'], 'MongoCommandCursor::key' => ['int'], 'MongoCommandCursor::next' => ['void'], 'MongoCommandCursor::rewind' => ['array'], 'MongoCommandCursor::setReadPreference' => ['MongoCommandCursor', 'read_preference' => 'string', 'tags=' => 'array'], 'MongoCommandCursor::timeout' => ['MongoCommandCursor', 'ms' => 'int'], 'MongoCommandCursor::valid' => ['bool'], 'MongoCursor::__construct' => ['void', 'connection' => 'MongoClient', 'ns' => 'string', 'query=' => 'array', 'fields=' => 'array'], 'MongoCursor::addOption' => ['MongoCursor', 'key' => 'string', 'value' => 'mixed'], 'MongoCursor::awaitData' => ['MongoCursor', 'wait=' => 'bool'], 'MongoCursor::batchSize' => ['MongoCursor', 'num' => 'int'], 'MongoCursor::count' => ['int', 'foundonly=' => 'bool'], 'MongoCursor::current' => ['array'], 'MongoCursor::dead' => ['bool'], 'MongoCursor::doQuery' => ['void'], 'MongoCursor::explain' => ['array'], 'MongoCursor::fields' => ['MongoCursor', 'f' => 'array'], 'MongoCursor::getNext' => ['array'], 'MongoCursor::getReadPreference' => ['array'], 'MongoCursor::hasNext' => ['bool'], 'MongoCursor::hint' => ['MongoCursor', 'key_pattern' => 'array'], 'MongoCursor::immortal' => ['MongoCursor', 'liveforever=' => 'bool'], 'MongoCursor::info' => ['array'], 'MongoCursor::key' => ['string'], 'MongoCursor::limit' => ['MongoCursor', 'num' => 'int'], 'MongoCursor::maxTimeMS' => ['MongoCursor', 'ms' => 'int'], 'MongoCursor::next' => ['array'], 'MongoCursor::partial' => ['MongoCursor', 'okay=' => 'bool'], 'MongoCursor::reset' => ['void'], 'MongoCursor::rewind' => ['void'], 'MongoCursor::setFlag' => ['MongoCursor', 'flag' => 'int', 'set=' => 'bool'], 'MongoCursor::setReadPreference' => ['MongoCursor', 'read_preference' => 'string', 'tags=' => 'array'], 'MongoCursor::skip' => ['MongoCursor', 'num' => 'int'], 'MongoCursor::slaveOkay' => ['MongoCursor', 'okay=' => 'bool'], 'MongoCursor::snapshot' => ['MongoCursor'], 'MongoCursor::sort' => ['MongoCursor', 'fields' => 'array'], 'MongoCursor::tailable' => ['MongoCursor', 'tail=' => 'bool'], 'MongoCursor::timeout' => ['MongoCursor', 'ms' => 'int'], 'MongoCursor::valid' => ['bool'], 'MongoCursorException::__clone' => ['void'], 'MongoCursorException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?\\Exception|?\\Throwable'], 'MongoCursorException::__toString' => ['string'], 'MongoCursorException::__wakeup' => ['void'], 'MongoCursorException::getCode' => ['int'], 'MongoCursorException::getFile' => ['string'], 'MongoCursorException::getHost' => ['string'], 'MongoCursorException::getLine' => ['int'], 'MongoCursorException::getMessage' => ['string'], 'MongoCursorException::getPrevious' => ['Exception|Throwable'], 'MongoCursorException::getTrace' => ['array'], 'MongoCursorException::getTraceAsString' => ['string'], 'MongoCursorInterface::__construct' => ['void'], 'MongoCursorInterface::batchSize' => ['MongoCursorInterface', 'batchSize' => 'int'], 'MongoCursorInterface::current' => ['mixed'], 'MongoCursorInterface::dead' => ['bool'], 'MongoCursorInterface::getReadPreference' => ['array'], 'MongoCursorInterface::info' => ['array'], 'MongoCursorInterface::key' => ['int|string'], 'MongoCursorInterface::next' => ['void'], 'MongoCursorInterface::rewind' => ['void'], 'MongoCursorInterface::setReadPreference' => ['MongoCursorInterface', 'read_preference' => 'string', 'tags=' => 'array'], 'MongoCursorInterface::timeout' => ['MongoCursorInterface', 'ms' => 'int'], 'MongoCursorInterface::valid' => ['bool'], 'MongoDate::__construct' => ['void', 'sec=' => 'int', 'usec=' => 'int'], 'MongoDate::__toString' => ['string'], 'MongoDate::toDateTime' => ['DateTime'], 'MongoDB::__construct' => ['void', 'conn' => 'MongoClient', 'name' => 'string'], 'MongoDB::__get' => ['MongoCollection', 'name' => 'string'], 'MongoDB::__toString' => ['string'], 'MongoDB::authenticate' => ['array', 'username' => 'string', 'password' => 'string'], 'MongoDB::command' => ['array', 'command' => 'array'], 'MongoDB::createCollection' => ['MongoCollection', 'name' => 'string', 'capped=' => 'bool', 'size=' => 'int', 'max=' => 'int'], 'MongoDB::createDBRef' => ['array', 'collection' => 'string', 'a' => ''], 'MongoDB::drop' => ['array'], 'MongoDB::dropCollection' => ['array', 'coll' => ''], 'MongoDB::execute' => ['array', 'code' => '', 'args=' => 'array'], 'MongoDB::forceError' => ['bool'], 'MongoDB::getCollectionInfo' => ['array', 'options=' => 'array'], 'MongoDB::getCollectionNames' => ['array', 'options=' => 'array'], 'MongoDB::getDBRef' => ['array', 'ref' => 'array'], 'MongoDB::getGridFS' => ['MongoGridFS', 'prefix=' => 'string'], 'MongoDB::getProfilingLevel' => ['int'], 'MongoDB::getReadPreference' => ['array'], 'MongoDB::getSlaveOkay' => ['bool'], 'MongoDB::getWriteConcern' => ['array'], 'MongoDB::lastError' => ['array'], 'MongoDB::listCollections' => ['array'], 'MongoDB::prevError' => ['array'], 'MongoDB::repair' => ['array', 'preserve_cloned_files=' => 'bool', 'backup_original_files=' => 'bool'], 'MongoDB::resetError' => ['array'], 'MongoDB::selectCollection' => ['MongoCollection', 'name' => 'string'], 'MongoDB::setProfilingLevel' => ['int', 'level' => 'int'], 'MongoDB::setReadPreference' => ['bool', 'read_preference' => 'string', 'tags=' => 'array'], 'MongoDB::setSlaveOkay' => ['bool', 'ok=' => 'bool'], 'MongoDB::setWriteConcern' => ['bool', 'w' => 'mixed', 'wtimeout=' => 'int'], 'MongoDB\\BSON\\Binary::__construct' => ['void', 'data' => 'string', 'type' => 'int'], 'MongoDB\\BSON\\Binary::getData' => ['string'], 'MongoDB\\BSON\\Binary::getType' => ['int'], 'MongoDB\\BSON\\Decimal128::__construct' => ['void', 'value=' => 'string'], 'MongoDB\\BSON\\Decimal128::__toString' => ['string'], '_HumbugBoxb94336daae36\\MongoDB\\BSON\\fromJSON' => ['string', 'json' => 'string'], '_HumbugBoxb94336daae36\\MongoDB\\BSON\\fromPHP' => ['string', 'value' => 'array|object'], 'MongoDB\\BSON\\Javascript::__construct' => ['void', 'code' => 'string', 'scope=' => 'array|object'], 'MongoDB\\BSON\\ObjectId::__construct' => ['void', 'id=' => 'string'], 'MongoDB\\BSON\\ObjectId::__toString' => ['string'], 'MongoDB\\BSON\\Regex::__construct' => ['void', 'pattern' => 'string', 'flags=' => 'string'], 'MongoDB\\BSON\\Regex::__toString' => ['string'], 'MongoDB\\BSON\\Regex::getFlags' => [''], 'MongoDB\\BSON\\Regex::getPattern' => ['string'], 'MongoDB\\BSON\\Serializable::bsonSerialize' => ['array|object'], 'MongoDB\\BSON\\Timestamp::__construct' => ['void', 'increment' => 'int', 'timestamp' => 'int'], 'MongoDB\\BSON\\Timestamp::__toString' => ['string'], '_HumbugBoxb94336daae36\\MongoDB\\BSON\\toJSON' => ['string', 'bson' => 'string'], '_HumbugBoxb94336daae36\\MongoDB\\BSON\\toPHP' => ['object', 'bson' => 'string', 'typeMap' => 'array'], 'MongoDB\\BSON\\Unserializable::bsonUnserialize' => ['', 'data' => 'array'], 'MongoDB\\BSON\\UTCDateTime::__construct' => ['void', 'milliseconds=' => 'int|DateTimeInterface'], 'MongoDB\\BSON\\UTCDateTime::__toString' => ['string'], 'MongoDB\\BSON\\UTCDateTime::toDateTime' => ['DateTime'], 'MongoDB\\Driver\\BulkWrite::__construct' => ['void', 'ordered=' => 'bool'], 'MongoDB\\Driver\\BulkWrite::count' => ['int'], 'MongoDB\\Driver\\BulkWrite::delete' => ['void', 'filter' => 'array|object', 'deleteOptions=' => 'array'], 'MongoDB\\Driver\\BulkWrite::insert' => ['_HumbugBoxb94336daae36\\MongoDB\\Driver\\ObjectID', 'document' => 'array|object'], 'MongoDB\\Driver\\BulkWrite::update' => ['void', 'filter' => 'array|object', 'newObj' => 'array|object', 'updateOptions=' => 'array'], 'MongoDB\\Driver\\Command::__construct' => ['void', 'document' => 'array|object'], 'MongoDB\\Driver\\Cursor::__construct' => ['void', 'server' => 'Server', 'responseDocument' => 'string'], 'MongoDB\\Driver\\Cursor::getId' => ['_HumbugBoxb94336daae36\\MongoDB\\Driver\\CursorId'], 'MongoDB\\Driver\\Cursor::getServer' => ['_HumbugBoxb94336daae36\\MongoDB\\Driver\\Server'], 'MongoDB\\Driver\\Cursor::isDead' => ['bool'], 'MongoDB\\Driver\\Cursor::setTypeMap' => ['void', 'typemap' => 'array'], 'MongoDB\\Driver\\Cursor::toArray' => ['array'], 'MongoDB\\Driver\\CursorId::__construct' => ['void', 'id' => 'string'], 'MongoDB\\Driver\\CursorId::__toString' => ['string'], 'MongoDB\\Driver\\Exception\\RuntimeException::__clone' => ['void'], 'MongoDB\\Driver\\Exception\\RuntimeException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?\\RuntimeException|?\\Throwable'], 'MongoDB\\Driver\\Exception\\RuntimeException::__toString' => ['string'], 'MongoDB\\Driver\\Exception\\RuntimeException::__wakeup' => ['void'], 'MongoDB\\Driver\\Exception\\RuntimeException::getCode' => ['int'], 'MongoDB\\Driver\\Exception\\RuntimeException::getFile' => ['string'], 'MongoDB\\Driver\\Exception\\RuntimeException::getLine' => ['int'], 'MongoDB\\Driver\\Exception\\RuntimeException::getMessage' => ['string'], 'MongoDB\\Driver\\Exception\\RuntimeException::getPrevious' => ['RuntimeException|Throwable'], 'MongoDB\\Driver\\Exception\\RuntimeException::getTrace' => ['array'], 'MongoDB\\Driver\\Exception\\RuntimeException::getTraceAsString' => ['string'], 'MongoDB\\Driver\\Exception\\WriteException::__clone' => ['void'], 'MongoDB\\Driver\\Exception\\WriteException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?\\RuntimeException|?\\Throwable'], 'MongoDB\\Driver\\Exception\\WriteException::__toString' => ['string'], 'MongoDB\\Driver\\Exception\\WriteException::__wakeup' => ['void'], 'MongoDB\\Driver\\Exception\\WriteException::getCode' => ['int'], 'MongoDB\\Driver\\Exception\\WriteException::getFile' => ['string'], 'MongoDB\\Driver\\Exception\\WriteException::getLine' => ['int'], 'MongoDB\\Driver\\Exception\\WriteException::getMessage' => ['string'], 'MongoDB\\Driver\\Exception\\WriteException::getPrevious' => ['RuntimeException|Throwable'], 'MongoDB\\Driver\\Exception\\WriteException::getTrace' => ['array'], 'MongoDB\\Driver\\Exception\\WriteException::getTraceAsString' => ['string'], 'MongoDB\\Driver\\Exception\\WriteException::getWriteResult' => ['_HumbugBoxb94336daae36\\MongoDB\\Driver\\WriteResult'], 'MongoDB\\Driver\\Manager::__construct' => ['void', 'uri' => 'string', 'options=' => 'array', 'driverOptions=' => 'array'], 'MongoDB\\Driver\\Manager::executeBulkWrite' => ['_HumbugBoxb94336daae36\\MongoDB\\Driver\\WriteResult', 'namespace' => 'string', 'bulk' => '_HumbugBoxb94336daae36\\MongoDB\\Driver\\BulkWrite', 'writeConcern=' => '_HumbugBoxb94336daae36\\MongoDB\\Driver\\WriteConcern'], 'MongoDB\\Driver\\Manager::executeCommand' => ['_HumbugBoxb94336daae36\\MongoDB\\Driver\\Cursor', 'db' => 'string', 'command' => '_HumbugBoxb94336daae36\\MongoDB\\Driver\\Command', 'readPreference=' => '_HumbugBoxb94336daae36\\MongoDB\\Driver\\ReadPreference'], 'MongoDB\\Driver\\Manager::executeDelete' => ['_HumbugBoxb94336daae36\\MongoDB\\Driver\\WriteResult', 'namespace' => 'string', 'filter' => 'array|object', 'deleteOptions=' => 'array', 'writeConcern=' => '_HumbugBoxb94336daae36\\MongoDB\\Driver\\WriteConcern'], 'MongoDB\\Driver\\Manager::executeInsert' => ['_HumbugBoxb94336daae36\\MongoDB\\Driver\\WriteResult', 'namespace' => 'string', 'document' => 'array|object', 'writeConcern=' => '_HumbugBoxb94336daae36\\MongoDB\\Driver\\WriteConcern'], 'MongoDB\\Driver\\Manager::executeQuery' => ['_HumbugBoxb94336daae36\\MongoDB\\Driver\\Cursor', 'namespace' => 'string', 'query' => '_HumbugBoxb94336daae36\\MongoDB\\Driver\\Query', 'readPreference=' => '_HumbugBoxb94336daae36\\MongoDB\\Driver\\ReadPreference'], 'MongoDB\\Driver\\Manager::executeUpdate' => ['_HumbugBoxb94336daae36\\MongoDB\\Driver\\WriteResult', 'namespace' => 'string', 'filter' => 'array|object', 'newObj' => 'array|object', 'updateOptions=' => 'array', 'writeConcern=' => '_HumbugBoxb94336daae36\\MongoDB\\Driver\\WriteConcern'], 'MongoDB\\Driver\\Manager::getReadConcern' => ['_HumbugBoxb94336daae36\\MongoDB\\Driver\\ReadConcern'], 'MongoDB\\Driver\\Manager::getReadPreference' => ['_HumbugBoxb94336daae36\\MongoDB\\Driver\\ReadPreference'], 'MongoDB\\Driver\\Manager::getServers' => ['array'], 'MongoDB\\Driver\\Manager::getWriteConcern' => ['_HumbugBoxb94336daae36\\MongoDB\\Driver\\WriteConcern'], 'MongoDB\\Driver\\Manager::selectServer' => ['_HumbugBoxb94336daae36\\MongoDB\\Driver\\Server', 'readPreference' => '_HumbugBoxb94336daae36\\MongoDB\\Driver\\ReadPreference'], 'MongoDB\\Driver\\Query::__construct' => ['void', 'filter' => 'array|object', 'queryOptions=' => 'array'], 'MongoDB\\Driver\\ReadConcern::__construct' => ['void', 'level=' => 'string'], 'MongoDB\\Driver\\ReadConcern::bsonSerialize' => ['object'], 'MongoDB\\Driver\\ReadConcern::getLevel' => ['null|string'], 'MongoDB\\Driver\\ReadPreference::__construct' => ['void', 'readPreference' => 'string', 'tagSets=' => 'array', 'options=' => 'array'], 'MongoDB\\Driver\\ReadPreference::bsonSerialize' => ['object'], 'MongoDB\\Driver\\ReadPreference::getMode' => ['int'], 'MongoDB\\Driver\\ReadPreference::getTagSets' => ['array'], 'MongoDB\\Driver\\Server::__construct' => ['void', 'host' => 'string', 'port' => 'string', 'options=' => 'array', 'driverOptions=' => 'array'], 'MongoDB\\Driver\\Server::executeBulkWrite' => ['', 'namespace' => 'string', 'zwrite' => 'BulkWrite'], 'MongoDB\\Driver\\Server::executeCommand' => ['', 'db' => 'string', 'command' => 'Command'], 'MongoDB\\Driver\\Server::executeQuery' => ['', 'namespace' => 'string', 'zquery' => 'Query'], 'MongoDB\\Driver\\Server::getHost' => [''], 'MongoDB\\Driver\\Server::getInfo' => [''], 'MongoDB\\Driver\\Server::getLatency' => [''], 'MongoDB\\Driver\\Server::getPort' => [''], 'MongoDB\\Driver\\Server::getState' => [''], 'MongoDB\\Driver\\Server::getTags' => ['array'], 'MongoDB\\Driver\\Server::getType' => [''], 'MongoDB\\Driver\\Server::isArbiter' => ['bool'], 'MongoDB\\Driver\\Server::isDelayed' => [''], 'MongoDB\\Driver\\Server::isHidden' => ['bool'], 'MongoDB\\Driver\\Server::isPassive' => [''], 'MongoDB\\Driver\\Server::isPrimary' => ['bool'], 'MongoDB\\Driver\\Server::isSecondary' => ['bool'], 'MongoDB\\Driver\\WriteConcern::__construct' => ['void', 'w' => 'string|int', 'wtimeout=' => 'int', 'journal=' => 'bool', 'fsync=' => 'bool'], 'MongoDB\\Driver\\WriteConcern::getJurnal' => ['bool|null'], 'MongoDB\\Driver\\WriteConcern::getW' => ['int|null|string'], 'MongoDB\\Driver\\WriteConcern::getWtimeout' => ['int'], 'MongoDB\\Driver\\WriteConcernError::getCode' => [''], 'MongoDB\\Driver\\WriteConcernError::getInfo' => [''], 'MongoDB\\Driver\\WriteConcernError::getMessage' => [''], 'MongoDB\\Driver\\WriteError::getCode' => [''], 'MongoDB\\Driver\\WriteError::getIndex' => [''], 'MongoDB\\Driver\\WriteError::getInfo' => ['mixed'], 'MongoDB\\Driver\\WriteError::getMessage' => [''], 'MongoDB\\Driver\\WriteException::getWriteResult' => [''], 'MongoDB\\Driver\\WriteResult::getDeletedCount' => ['int'], 'MongoDB\\Driver\\WriteResult::getInfo' => [''], 'MongoDB\\Driver\\WriteResult::getInsertedCount' => ['int'], 'MongoDB\\Driver\\WriteResult::getMatchedCount' => ['int'], 'MongoDB\\Driver\\WriteResult::getModifiedCount' => ['int'], 'MongoDB\\Driver\\WriteResult::getServer' => [''], 'MongoDB\\Driver\\WriteResult::getUpsertedCount' => ['int'], 'MongoDB\\Driver\\WriteResult::getUpsertedIds' => [''], 'MongoDB\\Driver\\WriteResult::getWriteConcernError' => [''], 'MongoDB\\Driver\\WriteResult::getWriteErrors' => [''], 'MongoDB\\Driver\\WriteResult::isAcknowledged' => ['bool'], 'MongoDBRef::create' => ['array', 'collection' => 'string', 'id' => 'mixed', 'database=' => 'string'], 'MongoDBRef::get' => ['array', 'db' => 'mongodb', 'ref' => 'array'], 'MongoDBRef::isRef' => ['bool', 'ref' => 'mixed'], 'MongoDeleteBatch::__construct' => ['void', 'collection' => 'MongoCollection', 'write_options=' => 'array'], 'MongoException::__clone' => ['void'], 'MongoException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?\\Exception|?\\Throwable'], 'MongoException::__toString' => ['string'], 'MongoException::__wakeup' => ['void'], 'MongoException::getCode' => ['int'], 'MongoException::getFile' => ['string'], 'MongoException::getLine' => ['int'], 'MongoException::getMessage' => ['string'], 'MongoException::getPrevious' => ['Exception|Throwable'], 'MongoException::getTrace' => ['array'], 'MongoException::getTraceAsString' => ['string'], 'MongoGridFS::__construct' => ['void', 'db' => 'MongoDB', 'prefix=' => 'string', 'chunks=' => 'mixed'], 'MongoGridFS::__get' => ['MongoCollection', 'name' => 'string'], 'MongoGridFS::__toString' => ['string'], 'MongoGridFS::aggregate' => ['array', 'pipeline' => 'array', 'op' => 'array', 'pipelineOperators' => 'array'], 'MongoGridFS::aggregateCursor' => ['MongoCommandCursor', 'pipeline' => 'array', 'options' => 'array'], 'MongoGridFS::batchInsert' => ['mixed', 'a' => 'array', 'options=' => 'array'], 'MongoGridFS::count' => ['int', 'query=' => 'stdClass|array'], 'MongoGridFS::createDBRef' => ['array', 'a' => 'array'], 'MongoGridFS::createIndex' => ['array', 'keys' => 'array', 'options=' => 'array'], 'MongoGridFS::delete' => ['bool', 'id' => 'mixed'], 'MongoGridFS::deleteIndex' => ['array', 'keys' => 'array|string'], 'MongoGridFS::deleteIndexes' => ['array'], 'MongoGridFS::distinct' => ['array|bool', 'key' => 'string', 'query=' => '?array'], 'MongoGridFS::drop' => ['array'], 'MongoGridFS::ensureIndex' => ['bool', 'keys' => 'array', 'options=' => 'array'], 'MongoGridFS::find' => ['MongoGridFSCursor', 'query=' => 'array', 'fields=' => 'array'], 'MongoGridFS::findAndModify' => ['array', 'query' => 'array', 'update=' => '?array', 'fields=' => '?array', 'options=' => '?array'], 'MongoGridFS::findOne' => ['MongoGridFSFile', 'query=' => 'mixed', 'fields=' => 'mixed'], 'MongoGridFS::get' => ['MongoGridFSFile', 'id' => 'mixed'], 'MongoGridFS::getDBRef' => ['array', 'ref' => 'array'], 'MongoGridFS::getIndexInfo' => ['array'], 'MongoGridFS::getName' => ['string'], 'MongoGridFS::getReadPreference' => ['array'], 'MongoGridFS::getSlaveOkay' => ['bool'], 'MongoGridFS::group' => ['array', 'keys' => 'mixed', 'initial' => 'array', 'reduce' => 'MongoCode', 'condition=' => 'array'], 'MongoGridFS::insert' => ['array|bool', 'a' => 'array|object', 'options=' => 'array'], 'MongoGridFS::put' => ['mixed', 'filename' => 'string', 'extra=' => 'array'], 'MongoGridFS::remove' => ['bool', 'criteria=' => 'array', 'options=' => 'array'], 'MongoGridFS::save' => ['array|bool', 'a' => 'array|object', 'options=' => 'array'], 'MongoGridFS::setReadPreference' => ['bool', 'read_preference' => 'string', 'tags' => 'array'], 'MongoGridFS::setSlaveOkay' => ['bool', 'ok=' => 'bool|true'], 'MongoGridFS::storeBytes' => ['mixed', 'bytes' => 'string', 'extra=' => 'array', 'options=' => 'array'], 'MongoGridFS::storeFile' => ['mixed', 'filename' => 'string', 'extra=' => 'array', 'options=' => 'array'], 'MongoGridFS::storeUpload' => ['mixed', 'name' => 'string', 'filename=' => 'string'], 'MongoGridFS::toIndexString' => ['string', 'keys' => 'mixed'], 'MongoGridFS::update' => ['bool', 'criteria' => 'array', 'newobj' => 'array', 'options=' => 'array'], 'MongoGridFS::validate' => ['array', 'scan_data=' => 'bool|false'], 'MongoGridFSCursor::__construct' => ['void', 'gridfs' => 'MongoGridFS', 'connection' => 'resource', 'ns' => 'string', 'query' => 'array', 'fields' => 'array'], 'MongoGridFSCursor::addOption' => ['MongoCursor', 'key' => 'string', 'value' => 'mixed'], 'MongoGridFSCursor::awaitData' => ['MongoCursor', 'wait=' => 'bool|true'], 'MongoGridFSCursor::batchSize' => ['MongoCursor', 'batchSize' => 'int'], 'MongoGridFSCursor::count' => ['int', 'all=' => 'bool|false'], 'MongoGridFSCursor::current' => ['MongoGridFSFile'], 'MongoGridFSCursor::dead' => ['bool'], 'MongoGridFSCursor::doQuery' => ['void'], 'MongoGridFSCursor::explain' => ['array'], 'MongoGridFSCursor::fields' => ['MongoCursor', 'f' => 'array'], 'MongoGridFSCursor::getNext' => ['MongoGridFSFile'], 'MongoGridFSCursor::getReadPreference' => ['array'], 'MongoGridFSCursor::hasNext' => ['bool'], 'MongoGridFSCursor::hint' => ['MongoCursor', 'key_pattern' => 'mixed'], 'MongoGridFSCursor::immortal' => ['MongoCursor', 'liveForever=' => 'bool|true'], 'MongoGridFSCursor::info' => ['array'], 'MongoGridFSCursor::key' => ['string'], 'MongoGridFSCursor::limit' => ['MongoCursor', 'num' => 'int'], 'MongoGridFSCursor::maxTimeMS' => ['MongoCursor', 'ms' => 'int'], 'MongoGridFSCursor::next' => ['void'], 'MongoGridFSCursor::partial' => ['MongoCursor', 'okay=' => 'bool|true'], 'MongoGridFSCursor::reset' => ['void'], 'MongoGridFSCursor::rewind' => ['void'], 'MongoGridFSCursor::setFlag' => ['MongoCursor', 'flag' => 'int', 'set=' => 'bool|true'], 'MongoGridFSCursor::setReadPreference' => ['MongoCursor', 'read_preference' => 'string', 'tags' => 'array'], 'MongoGridFSCursor::skip' => ['MongoCursor', 'num' => 'int'], 'MongoGridFSCursor::slaveOkay' => ['MongoCursor', 'okay=' => 'bool|true'], 'MongoGridFSCursor::snapshot' => ['MongoCursor'], 'MongoGridFSCursor::sort' => ['MongoCursor', 'fields' => 'array'], 'MongoGridFSCursor::tailable' => ['MongoCursor', 'tail=' => 'bool|true'], 'MongoGridFSCursor::timeout' => ['MongoCursor', 'ms' => 'int'], 'MongoGridFSCursor::valid' => ['bool'], 'MongoGridfsFile::__construct' => ['void', 'gridfs' => 'MongoGridFS', 'file' => 'array'], 'MongoGridFSFile::getBytes' => ['string'], 'MongoGridFSFile::getFilename' => ['string'], 'MongoGridFSFile::getResource' => ['resource'], 'MongoGridFSFile::getSize' => ['int'], 'MongoGridFSFile::write' => ['int', 'filename=' => 'string'], 'MongoId::__construct' => ['void', 'id=' => 'string|MongoId'], 'MongoId::__set_state' => ['MongoId', 'props' => 'array'], 'MongoId::__toString' => ['string'], 'MongoId::getHostname' => ['string'], 'MongoId::getInc' => ['int'], 'MongoId::getPID' => ['int'], 'MongoId::getTimestamp' => ['int'], 'MongoId::isValid' => ['bool', 'value' => 'mixed'], 'MongoInsertBatch::__construct' => ['void', 'collection' => 'MongoCollection', 'write_options=' => 'array'], 'MongoInt32::__construct' => ['void', 'value' => 'string'], 'MongoInt32::__toString' => ['string'], 'MongoInt64::__construct' => ['void', 'value' => 'string'], 'MongoInt64::__toString' => ['string'], 'MongoLog::getCallback' => ['callable'], 'MongoLog::getLevel' => ['int'], 'MongoLog::getModule' => ['int'], 'MongoLog::setCallback' => ['void', 'log_function' => 'callable'], 'MongoLog::setLevel' => ['void', 'level' => 'int'], 'MongoLog::setModule' => ['void', 'module' => 'int'], 'MongoPool::getSize' => ['int'], 'MongoPool::info' => ['array'], 'MongoPool::setSize' => ['bool', 'size' => 'int'], 'MongoRegex::__construct' => ['void', 'regex' => 'string'], 'MongoRegex::__toString' => ['string'], 'MongoResultException::__clone' => ['void'], 'MongoResultException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?\\Exception|?\\Throwable'], 'MongoResultException::__toString' => ['string'], 'MongoResultException::__wakeup' => ['void'], 'MongoResultException::getCode' => ['int'], 'MongoResultException::getDocument' => ['array'], 'MongoResultException::getFile' => ['string'], 'MongoResultException::getLine' => ['int'], 'MongoResultException::getMessage' => ['string'], 'MongoResultException::getPrevious' => ['Exception|Throwable'], 'MongoResultException::getTrace' => ['array'], 'MongoResultException::getTraceAsString' => ['string'], 'MongoTimestamp::__construct' => ['void', 'sec=' => 'int', 'inc=' => 'int'], 'MongoTimestamp::__toString' => ['string'], 'MongoUpdateBatch::__construct' => ['void', 'collection' => 'MongoCollection', 'write_options=' => 'array'], 'MongoUpdateBatch::add' => ['bool', 'item' => 'array'], 'MongoUpdateBatch::execute' => ['array', 'write_options' => 'array'], 'MongoWriteBatch::__construct' => ['void', 'collection' => 'MongoCollection', 'batch_type' => 'string', 'write_options' => 'array'], 'MongoWriteBatch::add' => ['bool', 'item' => 'array'], 'MongoWriteBatch::execute' => ['array', 'write_options' => 'array'], 'MongoWriteConcernException::__clone' => ['void'], 'MongoWriteConcernException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?\\Exception|?\\Throwable'], 'MongoWriteConcernException::__toString' => ['string'], 'MongoWriteConcernException::__wakeup' => ['void'], 'MongoWriteConcernException::getCode' => ['int'], 'MongoWriteConcernException::getDocument' => ['array'], 'MongoWriteConcernException::getFile' => ['string'], 'MongoWriteConcernException::getLine' => ['int'], 'MongoWriteConcernException::getMessage' => ['string'], 'MongoWriteConcernException::getPrevious' => ['Exception|Throwable'], 'MongoWriteConcernException::getTrace' => ['array'], 'MongoWriteConcernException::getTraceAsString' => ['string'], 'monitor_custom_event' => ['void', 'class' => 'class', 'text' => 'text', 'severe=' => 'severe', 'user_data=' => 'user_data'], 'monitor_httperror_event' => ['void', 'error_code' => 'error_code', 'url' => 'url', 'severe=' => 'severe'], 'monitor_license_info' => ['array'], 'monitor_pass_error' => ['void', 'errno' => '', 'errstr' => '', 'errfile' => '', 'errline' => ''], 'monitor_set_aggregation_hint' => ['void', 'hint' => 'hint'], 'move_uploaded_file' => ['bool', 'path' => 'string', 'new_path' => 'string'], 'mqseries_back' => ['void', 'hconn' => 'resource', 'compcode' => 'resource', 'reason' => 'resource'], 'mqseries_begin' => ['void', 'hconn' => 'resource', 'beginoptions' => 'array', 'compcode' => 'resource', 'reason' => 'resource'], 'mqseries_close' => ['void', 'hconn' => 'resource', 'hobj' => 'resource', 'options' => 'int', 'compcode' => 'resource', 'reason' => 'resource'], 'mqseries_cmit' => ['void', 'hconn' => 'resource', 'compcode' => 'resource', 'reason' => 'resource'], 'mqseries_conn' => ['void', 'qmanagername' => 'string', 'hconn' => 'resource', 'compcode' => 'resource', 'reason' => 'resource'], 'mqseries_connx' => ['void', 'qmanagername' => 'string', 'connoptions' => 'array', 'hconn' => 'resource', 'compcode' => 'resource', 'reason' => 'resource'], 'mqseries_disc' => ['void', 'hconn' => 'resource', 'compcode' => 'resource', 'reason' => 'resource'], 'mqseries_get' => ['void', 'hconn' => 'resource', 'hobj' => 'resource', 'md' => 'array', 'gmo' => 'array', 'bufferlength' => 'int', 'msg' => 'string', 'data_length' => 'int', 'compcode' => 'resource', 'reason' => 'resource'], 'mqseries_inq' => ['void', 'hconn' => 'resource', 'hobj' => 'resource', 'selectorcount' => 'int', 'selectors' => 'array', 'intattrcount' => 'int', 'intattr' => 'resource', 'charattrlength' => 'int', 'charattr' => 'resource', 'compcode' => 'resource', 'reason' => 'resource'], 'mqseries_open' => ['void', 'hconn' => 'resource', 'objdesc' => 'array', 'option' => 'int', 'hobj' => 'resource', 'compcode' => 'resource', 'reason' => 'resource'], 'mqseries_put' => ['void', 'hconn' => 'resource', 'hobj' => 'resource', 'md' => 'array', 'pmo' => 'array', 'message' => 'string', 'compcode' => 'resource', 'reason' => 'resource'], 'mqseries_put1' => ['void', 'hconn' => 'resource', 'objdesc' => 'resource', 'msgdesc' => 'resource', 'pmo' => 'resource', 'buffer' => 'string', 'compcode' => 'resource', 'reason' => 'resource'], 'mqseries_set' => ['void', 'hconn' => 'resource', 'hobj' => 'resource', 'selectorcount' => 'int', 'selectors' => 'array', 'intattrcount' => 'int', 'intattrs' => 'array', 'charattrlength' => 'int', 'charattrs' => 'array', 'compcode' => 'resource', 'reason' => 'resource'], 'mqseries_strerror' => ['string', 'reason' => 'int'], 'ms_GetErrorObj' => ['errorObj'], 'ms_GetVersion' => ['string'], 'ms_GetVersionInt' => ['int'], 'ms_iogetStdoutBufferBytes' => ['int'], 'ms_iogetstdoutbufferstring' => ['void'], 'ms_ioinstallstdinfrombuffer' => ['void'], 'ms_ioinstallstdouttobuffer' => ['void'], 'ms_ioresethandlers' => ['void'], 'ms_iostripstdoutbuffercontentheaders' => ['void'], 'ms_iostripstdoutbuffercontenttype' => ['string'], 'ms_ResetErrorList' => ['void'], 'ms_TokenizeMap' => ['array', 'map_file_name' => 'string'], 'msession_connect' => ['bool', 'host' => 'string', 'port' => 'string'], 'msession_count' => ['int'], 'msession_create' => ['bool', 'session' => 'string', 'classname=' => 'string', 'data=' => 'string'], 'msession_destroy' => ['bool', 'name' => 'string'], 'msession_disconnect' => ['void'], 'msession_find' => ['array', 'name' => 'string', 'value' => 'string'], 'msession_get' => ['string', 'session' => 'string', 'name' => 'string', 'value' => 'string'], 'msession_get_array' => ['array', 'session' => 'string'], 'msession_get_data' => ['string', 'session' => 'string'], 'msession_inc' => ['string', 'session' => 'string', 'name' => 'string'], 'msession_list' => ['array'], 'msession_listvar' => ['array', 'name' => 'string'], 'msession_lock' => ['int', 'name' => 'string'], 'msession_plugin' => ['string', 'session' => 'string', 'val' => 'string', 'param=' => 'string'], 'msession_randstr' => ['string', 'param' => 'int'], 'msession_set' => ['bool', 'session' => 'string', 'name' => 'string', 'value' => 'string'], 'msession_set_array' => ['void', 'session' => 'string', 'tuples' => 'array'], 'msession_set_data' => ['bool', 'session' => 'string', 'value' => 'string'], 'msession_timeout' => ['int', 'session' => 'string', 'param=' => 'int'], 'msession_uniq' => ['string', 'param' => 'int', 'classname=' => 'string', 'data=' => 'string'], 'msession_unlock' => ['int', 'session' => 'string', 'key' => 'int'], 'msg_get_queue' => ['resource', 'key' => 'int', 'perms=' => 'int'], 'msg_queue_exists' => ['bool', 'key' => 'int'], 'msg_receive' => ['bool', 'queue' => 'resource', 'desiredmsgtype' => 'int', '&w_msgtype' => 'int', 'maxsize' => 'int', '&w_message' => 'mixed', 'unserialize=' => 'bool', 'flags=' => 'int', '&w_errorcode=' => 'int'], 'msg_remove_queue' => ['bool', 'queue' => 'resource'], 'msg_send' => ['bool', 'queue' => 'resource', 'msgtype' => 'int', 'message' => 'mixed', 'serialize=' => 'bool', 'blocking=' => 'bool', '&w_errorcode=' => 'int'], 'msg_set_queue' => ['bool', 'queue' => 'resource', 'data' => 'array'], 'msg_stat_queue' => ['array', 'queue' => 'resource'], 'msgfmt_create' => ['MessageFormatter', 'locale' => 'string', 'pattern' => 'string'], 'msgfmt_format' => ['string', 'fmt' => 'messageformatter', 'args' => 'array'], 'msgfmt_format_message' => ['string', 'locale' => 'string', 'pattern' => 'string', 'args' => 'array'], 'msgfmt_get_error_code' => ['int', 'fmt' => 'messageformatter'], 'msgfmt_get_error_message' => ['string', 'fmt' => 'messageformatter'], 'msgfmt_get_locale' => ['string', 'formatter' => 'messageformatter'], 'msgfmt_get_pattern' => ['string', 'fmt' => 'messageformatter'], 'msgfmt_parse' => ['array', 'fmt' => 'messageformatter', 'value' => 'string'], 'msgfmt_parse_message' => ['array', 'locale' => 'string', 'pattern' => 'string', 'source' => 'string'], 'msgfmt_set_pattern' => ['bool', 'fmt' => 'messageformatter', 'pattern' => 'string'], 'msql_affected_rows' => ['int', 'result' => 'resource'], 'msql_close' => ['bool', 'link_identifier=' => '?resource'], 'msql_connect' => ['resource', 'hostname=' => 'string'], 'msql_create_db' => ['bool', 'database_name' => 'string', 'link_identifier=' => '?resource'], 'msql_data_seek' => ['bool', 'result' => 'resource', 'row_number' => 'int'], 'msql_db_query' => ['resource', 'database' => 'string', 'query' => 'string', 'link_identifier=' => '?resource'], 'msql_drop_db' => ['bool', 'database_name' => 'string', 'link_identifier=' => '?resource'], 'msql_error' => ['string'], 'msql_fetch_array' => ['array', 'result' => 'resource', 'result_type=' => 'int'], 'msql_fetch_field' => ['object', 'result' => 'resource', 'field_offset=' => 'int'], 'msql_fetch_object' => ['object', 'result' => 'resource'], 'msql_fetch_row' => ['array', 'result' => 'resource'], 'msql_field_flags' => ['string', 'result' => 'resource', 'field_offset' => 'int'], 'msql_field_len' => ['int', 'result' => 'resource', 'field_offset' => 'int'], 'msql_field_name' => ['string', 'result' => 'resource', 'field_offset' => 'int'], 'msql_field_seek' => ['bool', 'result' => 'resource', 'field_offset' => 'int'], 'msql_field_table' => ['int', 'result' => 'resource', 'field_offset' => 'int'], 'msql_field_type' => ['string', 'result' => 'resource', 'field_offset' => 'int'], 'msql_free_result' => ['bool', 'result' => 'resource'], 'msql_list_dbs' => ['resource', 'link_identifier=' => '?resource'], 'msql_list_fields' => ['resource', 'database' => 'string', 'tablename' => 'string', 'link_identifier=' => '?resource'], 'msql_list_tables' => ['resource', 'database' => 'string', 'link_identifier=' => '?resource'], 'msql_num_fields' => ['int', 'result' => 'resource'], 'msql_num_rows' => ['int', 'query_identifier' => 'resource'], 'msql_pconnect' => ['resource', 'hostname=' => 'string'], 'msql_query' => ['resource', 'query' => 'string', 'link_identifier=' => '?resource'], 'msql_result' => ['string', 'result' => 'resource', 'row' => 'int', 'field=' => 'mixed'], 'msql_select_db' => ['bool', 'database_name' => 'string', 'link_identifier=' => '?resource'], 'mssql_bind' => ['bool', 'stmt' => 'resource', 'param_name' => 'string', 'var' => 'mixed', 'type' => 'int', 'is_output=' => 'bool', 'is_null=' => 'bool', 'maxlen=' => 'int'], 'mssql_close' => ['bool', 'link_identifier=' => 'resource'], 'mssql_connect' => ['resource', 'servername=' => 'string', 'username=' => 'string', 'password=' => 'string', 'new_link=' => 'bool'], 'mssql_data_seek' => ['bool', 'result_identifier' => 'resource', 'row_number' => 'int'], 'mssql_execute' => ['mixed', 'stmt' => 'resource', 'skip_results=' => 'bool'], 'mssql_fetch_array' => ['array', 'result' => 'resource', 'result_type=' => 'int'], 'mssql_fetch_assoc' => ['array', 'result_id' => 'resource'], 'mssql_fetch_batch' => ['int', 'result' => 'resource'], 'mssql_fetch_field' => ['object', 'result' => 'resource', 'field_offset=' => 'int'], 'mssql_fetch_object' => ['object', 'result' => 'resource'], 'mssql_fetch_row' => ['array', 'result' => 'resource'], 'mssql_field_length' => ['int', 'result' => 'resource', 'offset=' => 'int'], 'mssql_field_name' => ['string', 'result' => 'resource', 'offset=' => 'int'], 'mssql_field_seek' => ['bool', 'result' => 'resource', 'field_offset' => 'int'], 'mssql_field_type' => ['string', 'result' => 'resource', 'offset=' => 'int'], 'mssql_free_result' => ['bool', 'result' => 'resource'], 'mssql_free_statement' => ['bool', 'stmt' => 'resource'], 'mssql_get_last_message' => ['string'], 'mssql_guid_string' => ['string', 'binary' => 'string', 'short_format=' => 'bool'], 'mssql_init' => ['resource', 'sp_name' => 'string', 'link_identifier=' => 'resource'], 'mssql_min_error_severity' => ['void', 'severity' => 'int'], 'mssql_min_message_severity' => ['void', 'severity' => 'int'], 'mssql_next_result' => ['bool', 'result_id' => 'resource'], 'mssql_num_fields' => ['int', 'result' => 'resource'], 'mssql_num_rows' => ['int', 'result' => 'resource'], 'mssql_pconnect' => ['resource', 'servername=' => 'string', 'username=' => 'string', 'password=' => 'string', 'new_link=' => 'bool'], 'mssql_query' => ['mixed', 'query' => 'string', 'link_identifier=' => 'resource', 'batch_size=' => 'int'], 'mssql_result' => ['string', 'result' => 'resource', 'row' => 'int', 'field' => 'mixed'], 'mssql_rows_affected' => ['int', 'link_identifier' => 'resource'], 'mssql_select_db' => ['bool', 'database_name' => 'string', 'link_identifier=' => 'resource'], 'mt_getrandmax' => ['int'], 'mt_rand' => ['int', 'min' => 'int', 'max' => 'int'], 'mt_rand\'1' => ['int'], 'mt_srand' => ['void', 'seed=' => 'int', 'mode=' => 'int'], 'MultipleIterator::__construct' => ['void', 'flags=' => 'int'], 'MultipleIterator::attachIterator' => ['void', 'iterator' => 'iterator', 'infos=' => 'string'], 'MultipleIterator::containsIterator' => ['bool', 'iterator' => 'iterator'], 'MultipleIterator::countIterators' => ['int'], 'MultipleIterator::current' => ['array'], 'MultipleIterator::detachIterator' => ['void', 'iterator' => 'iterator'], 'MultipleIterator::getFlags' => ['int'], 'MultipleIterator::key' => ['array'], 'MultipleIterator::next' => ['void'], 'MultipleIterator::rewind' => ['void'], 'MultipleIterator::setFlags' => ['int', 'flags' => 'int'], 'MultipleIterator::valid' => ['bool'], 'Mutex::create' => ['long', 'lock=' => 'bool'], 'Mutex::destroy' => ['bool', 'mutex' => 'long'], 'Mutex::lock' => ['bool', 'mutex' => 'long'], 'Mutex::trylock' => ['bool', 'mutex' => 'long'], 'Mutex::unlock' => ['bool', 'mutex' => 'long', 'destroy=' => 'bool'], 'mysql_affected_rows' => ['int', 'link_identifier=' => 'resource'], 'mysql_client_encoding' => ['string', 'link_identifier=' => 'resource'], 'mysql_close' => ['bool', 'link_identifier=' => 'resource'], 'mysql_connect' => ['resource', 'server=' => 'string', 'username=' => 'string', 'password=' => 'string', 'new_link=' => 'bool', 'client_flags=' => 'int'], 'mysql_create_db' => ['bool', 'database_name' => 'string', 'link_identifier=' => 'resource'], 'mysql_data_seek' => ['bool', 'result' => 'resource', 'row_number' => 'int'], 'mysql_db_name' => ['string', 'result' => 'resource', 'row' => 'int', 'field=' => 'mixed'], 'mysql_db_query' => ['resource', 'database' => 'string', 'query' => 'string', 'link_identifier=' => 'resource'], 'mysql_drop_db' => ['bool', 'database_name' => 'string', 'link_identifier=' => 'resource'], 'mysql_errno' => ['int', 'link_identifier=' => 'resource'], 'mysql_error' => ['string', 'link_identifier=' => 'resource'], 'mysql_escape_string' => ['string', 'unescaped_string' => 'string'], 'mysql_fetch_array' => ['array', 'result' => 'resource', 'result_type=' => 'int'], 'mysql_fetch_assoc' => ['array', 'result' => 'resource'], 'mysql_fetch_field' => ['object', 'result' => 'resource', 'field_offset=' => 'int'], 'mysql_fetch_lengths' => ['array', 'result' => 'resource'], 'mysql_fetch_object' => ['object', 'result' => 'resource', 'class_name=' => 'string', 'params=' => 'array'], 'mysql_fetch_row' => ['array', 'result' => 'resource'], 'mysql_field_flags' => ['string', 'result' => 'resource', 'field_offset' => 'int'], 'mysql_field_len' => ['int', 'result' => 'resource', 'field_offset' => 'int'], 'mysql_field_name' => ['string', 'result' => 'resource', 'field_offset' => 'int'], 'mysql_field_seek' => ['bool', 'result' => 'resource', 'field_offset' => 'int'], 'mysql_field_table' => ['string', 'result' => 'resource', 'field_offset' => 'int'], 'mysql_field_type' => ['string', 'result' => 'resource', 'field_offset' => 'int'], 'mysql_free_result' => ['bool', 'result' => 'resource'], 'mysql_get_client_info' => ['string'], 'mysql_get_host_info' => ['string', 'link_identifier=' => 'resource'], 'mysql_get_proto_info' => ['int', 'link_identifier=' => 'resource'], 'mysql_get_server_info' => ['string', 'link_identifier=' => 'resource'], 'mysql_info' => ['string', 'link_identifier=' => 'resource'], 'mysql_insert_id' => ['int', 'link_identifier=' => 'resource'], 'mysql_list_dbs' => ['resource', 'link_identifier=' => 'resource'], 'mysql_list_fields' => ['resource', 'database_name' => 'string', 'table_name' => 'string', 'link_identifier=' => 'resource'], 'mysql_list_processes' => ['resource', 'link_identifier=' => 'resource'], 'mysql_list_tables' => ['resource', 'database' => 'string', 'link_identifier=' => 'resource'], 'mysql_num_fields' => ['int', 'result' => 'resource'], 'mysql_num_rows' => ['int', 'result' => 'resource'], 'mysql_pconnect' => ['resource', 'server=' => 'string', 'username=' => 'string', 'password=' => 'string', 'client_flags=' => 'int'], 'mysql_ping' => ['bool', 'link_identifier=' => 'resource'], 'mysql_query' => ['resource', 'query' => 'string', 'link_identifier=' => 'resource'], 'mysql_real_escape_string' => ['string', 'unescaped_string' => 'string', 'link_identifier=' => 'resource'], 'mysql_result' => ['string', 'result' => 'resource', 'row' => 'int', 'field=' => 'mixed'], 'mysql_select_db' => ['bool', 'database_name' => 'string', 'link_identifier=' => 'resource'], 'mysql_set_charset' => ['bool', 'charset' => 'string', 'link_identifier=' => 'resource'], 'mysql_stat' => ['string', 'link_identifier=' => 'resource'], 'mysql_tablename' => ['string', 'result' => 'resource', 'i' => 'int'], 'mysql_thread_id' => ['int', 'link_identifier=' => 'resource'], 'mysql_unbuffered_query' => ['resource', 'query' => 'string', 'link_identifier=' => 'resource'], 'mysqli::__construct' => ['void', 'host=' => 'string', 'username=' => 'string', 'passwd=' => 'string', 'dbname=' => 'string', 'port=' => 'int', 'socket=' => 'string'], 'mysqli::autocommit' => ['bool', 'mode' => 'bool'], 'mysqli::begin_transaction' => ['bool', 'flags=' => 'int', 'name=' => 'string'], 'mysqli::change_user' => ['bool', 'user' => 'string', 'password' => 'string', 'database' => 'string'], 'mysqli::character_set_name' => ['string'], 'mysqli::close' => ['bool'], 'mysqli::commit' => ['bool', 'flags=' => 'int', 'name=' => 'string'], 'mysqli::debug' => ['bool', 'message' => 'string'], 'mysqli::disable_reads_from_master' => ['bool'], 'mysqli::dump_debug_info' => ['bool'], 'mysqli::get_charset' => ['object'], 'mysqli::get_client_info' => ['string'], 'mysqli::get_connection_stats' => ['array|false'], 'mysqli::get_warnings' => ['mysqli_warning'], 'mysqli::init' => ['mysqli'], 'mysqli::kill' => ['bool', 'processid' => 'int'], 'mysqli::more_results' => ['bool'], 'mysqli::multi_query' => ['bool', 'query' => 'string'], 'mysqli::next_result' => ['bool'], 'mysqli::options' => ['bool', 'option' => 'int', 'value' => 'mixed'], 'mysqli::ping' => ['bool'], 'mysqli::poll' => ['int|false', '&w_read' => 'array', '&w_error' => 'array', '&w_reject' => 'array', 'sec' => 'int', 'usec=' => 'int'], 'mysqli::prepare' => ['mysqli_stmt|false', 'query' => 'string'], 'mysqli::query' => ['bool|mysqli_result', 'query' => 'string', 'resultmode=' => 'int'], 'mysqli::real_connect' => ['bool', 'host=' => 'string', 'username=' => 'string', 'passwd=' => 'string', 'dbname=' => 'string', 'port=' => 'int', 'socket=' => 'string', 'flags=' => 'int'], 'mysqli::real_escape_string' => ['string', 'escapestr' => 'string'], 'mysqli::real_query' => ['bool', 'query' => 'string'], 'mysqli::reap_async_query' => ['mysqli_result|false'], 'mysqli::refresh' => ['bool', 'options' => 'int'], 'mysqli::release_savepoint' => ['bool', 'name' => 'string'], 'mysqli::rollback' => ['bool', 'flags=' => 'int', 'name=' => 'string'], 'mysqli::rpl_query_type' => ['int', 'query' => 'string'], 'mysqli::savepoint' => ['bool', 'name' => 'string'], 'mysqli::select_db' => ['bool', 'dbname' => 'string'], 'mysqli::send_query' => ['bool', 'query' => 'string'], 'mysqli::set_charset' => ['bool', 'charset' => 'string'], 'mysqli::set_local_infile_default' => ['void'], 'mysqli::set_local_infile_handler' => ['bool', 'read_func=' => 'callable'], 'mysqli::ssl_set' => ['bool', 'key' => 'string', 'cert' => 'string', 'ca' => 'string', 'capath' => 'string', 'cipher' => 'string'], 'mysqli::stat' => ['string|false'], 'mysqli::stmt_init' => ['mysqli_stmt'], 'mysqli::store_result' => ['mysqli_result|false', 'option=' => 'int'], 'mysqli::thread_safe' => ['bool'], 'mysqli::use_result' => ['mysqli_result|false'], 'mysqli_affected_rows' => ['int', 'link' => 'mysqli'], 'mysqli_autocommit' => ['bool', 'link' => 'mysqli', 'mode' => 'bool'], 'mysqli_begin_transaction' => ['bool', 'link' => 'mysqli', 'flags' => 'int', 'name' => 'string'], 'mysqli_change_user' => ['bool', 'link' => 'mysqli', 'user' => 'string', 'password' => 'string', 'database' => 'string'], 'mysqli_character_set_name' => ['string', 'link' => 'mysqli'], 'mysqli_close' => ['bool', 'link' => 'mysqli'], 'mysqli_commit' => ['bool', 'link' => 'mysqli', 'flags=' => 'int', 'name=' => 'string'], 'mysqli_connect' => ['mysqli|false', 'host=' => 'string', 'username=' => 'string', 'passwd=' => 'string', 'dbname=' => 'string', 'port=' => 'int', 'socket=' => 'string'], 'mysqli_connect_errno' => ['int'], 'mysqli_connect_error' => ['string'], 'mysqli_data_seek' => ['bool', 'result' => 'mysqli_result', 'offset' => 'int'], 'mysqli_debug' => ['bool', 'message' => 'string'], 'mysqli_disable_reads_from_master' => ['bool', 'link' => 'mysqli'], 'mysqli_disable_rpl_parse' => ['bool', 'link' => 'mysqli'], 'mysqli_driver::embedded_server_end' => ['void'], 'mysqli_driver::embedded_server_start' => ['bool', 'start' => 'int', 'arguments' => 'array', 'groups' => 'array'], 'mysqli_dump_debug_info' => ['bool', 'link' => 'mysqli'], 'mysqli_embedded_server_end' => ['void'], 'mysqli_embedded_server_start' => ['bool', 'start' => 'int', 'arguments' => 'array', 'groups' => 'array'], 'mysqli_enable_reads_from_master' => ['bool', 'link' => 'mysqli'], 'mysqli_enable_rpl_parse' => ['bool', 'link' => 'mysqli'], 'mysqli_errno' => ['int', 'link' => 'mysqli'], 'mysqli_error' => ['string', 'link' => 'mysqli'], 'mysqli_error_list' => ['array', 'connection' => 'mysqli'], 'mysqli_fetch_all' => ['array', 'result' => 'mysqli_result', 'resulttype=' => 'int'], 'mysqli_fetch_array' => ['array|null', 'result' => 'mysqli_result', 'resulttype=' => 'int'], 'mysqli_fetch_assoc' => ['array<string,string>|null', 'result' => 'mysqli_result'], 'mysqli_fetch_field' => ['object|false', 'result' => 'mysqli_result'], 'mysqli_fetch_field_direct' => ['object|false', 'result' => 'mysqli_result', 'fieldnr' => 'int'], 'mysqli_fetch_fields' => ['array|false', 'result' => 'mysqli_result'], 'mysqli_fetch_lengths' => ['array|false', 'result' => 'mysqli_result'], 'mysqli_fetch_object' => ['object|null', 'result' => 'mysqli_result', 'class_name=' => 'string', 'params=' => '?array'], 'mysqli_fetch_row' => ['array|null', 'result' => 'mysqli_result'], 'mysqli_field_count' => ['int', 'link' => 'mysqli'], 'mysqli_field_seek' => ['bool', 'result' => 'mysqli_result', 'fieldnr' => 'int'], 'mysqli_field_tell' => ['int', 'result' => 'mysqli_result'], 'mysqli_free_result' => ['void', 'link' => 'mysqli_result'], 'mysqli_get_cache_stats' => ['array'], 'mysqli_get_charset' => ['object', 'link' => 'mysqli'], 'mysqli_get_client_info' => ['string', 'link' => 'mysqli'], 'mysqli_get_client_stats' => ['array|false'], 'mysqli_get_client_version' => ['int', 'link' => 'mysqli'], 'mysqli_get_connection_stats' => ['array|false', 'link' => 'mysqli'], 'mysqli_get_host_info' => ['string', 'link' => 'mysqli'], 'mysqli_get_links_stats' => ['array'], 'mysqli_get_proto_info' => ['int', 'link' => 'mysqli'], 'mysqli_get_server_info' => ['string', 'link' => 'mysqli'], 'mysqli_get_server_version' => ['int', 'link' => 'mysqli'], 'mysqli_get_warnings' => ['mysqli_warning', 'link' => 'mysqli'], 'mysqli_info' => ['?string', 'link' => 'mysqli'], 'mysqli_init' => ['mysqli'], 'mysqli_insert_id' => ['int|string', 'link' => 'mysqli'], 'mysqli_kill' => ['bool', 'link' => 'mysqli', 'processid' => 'int'], 'mysqli_link_construct' => ['object'], 'mysqli_master_query' => ['bool', 'link' => 'mysqli', 'query' => 'string'], 'mysqli_more_results' => ['bool', 'link' => 'mysqli'], 'mysqli_multi_query' => ['bool', 'link' => 'mysqli', 'query' => 'string'], 'mysqli_next_result' => ['bool', 'link' => 'mysqli'], 'mysqli_num_fields' => ['int', 'link' => 'mysqli_result'], 'mysqli_num_rows' => ['int', 'link' => 'mysqli_result'], 'mysqli_options' => ['bool', 'link' => 'mysqli', 'option' => 'int', 'value' => 'mixed'], 'mysqli_ping' => ['bool', 'link' => 'mysqli'], 'mysqli_poll' => ['int|false', 'read' => 'array', 'error' => 'array', 'reject' => 'array', 'sec' => 'int', 'usec=' => 'int'], 'mysqli_prepare' => ['mysqli_stmt|false', 'link' => 'mysqli', 'query' => 'string'], 'mysqli_query' => ['mysqli_result|bool', 'link' => 'mysqli', 'query' => 'string', 'resultmode=' => 'int'], 'mysqli_real_connect' => ['bool', 'link=' => 'mysqli', 'host=' => 'string', 'username=' => 'string', 'passwd=' => 'string', 'dbname=' => 'string', 'port=' => 'int', 'socket=' => 'string', 'flags=' => 'int'], 'mysqli_real_escape_string' => ['string', 'link' => 'mysqli', 'escapestr' => 'string'], 'mysqli_real_query' => ['bool', 'link' => 'mysqli', 'query' => 'string'], 'mysqli_reap_async_query' => ['mysqli_result|false', 'link' => 'mysqli'], 'mysqli_refresh' => ['bool', 'link' => 'mysqli', 'options' => 'int'], 'mysqli_release_savepoint' => ['bool', 'link' => 'mysqli', 'name' => 'string'], 'mysqli_report' => ['bool', 'flags' => 'int'], 'mysqli_result::__construct' => ['void', 'link' => 'mysqli', 'resultmode=' => 'int'], 'mysqli_result::close' => ['void'], 'mysqli_result::data_seek' => ['bool', 'offset' => 'int'], 'mysqli_result::fetch_all' => ['array', 'resulttype=' => 'int'], 'mysqli_result::fetch_array' => ['array|null', 'resulttype=' => 'int'], 'mysqli_result::fetch_assoc' => ['array<string,string>|null'], 'mysqli_result::fetch_field' => ['object|false'], 'mysqli_result::fetch_field_direct' => ['object|false', 'fieldnr' => 'int'], 'mysqli_result::fetch_fields' => ['array|false'], 'mysqli_result::fetch_object' => ['object|null', 'class_name=' => 'string', 'params=' => 'array'], 'mysqli_result::fetch_row' => ['array|null'], 'mysqli_result::field_seek' => ['bool', 'fieldnr' => 'int'], 'mysqli_result::free' => ['void'], 'mysqli_result::free_result' => ['void'], 'mysqli_rollback' => ['bool', 'link' => 'mysqli', 'flags=' => 'int', 'name=' => 'string'], 'mysqli_rpl_parse_enabled' => ['int', 'link' => 'mysqli'], 'mysqli_rpl_probe' => ['bool', 'link' => 'mysqli'], 'mysqli_rpl_query_type' => ['int', 'link' => 'mysqli', 'query' => 'string'], 'mysqli_savepoint' => ['bool', 'link' => 'mysqli', 'name' => 'string'], 'mysqli_savepoint_libmysql' => ['bool'], 'mysqli_select_db' => ['bool', 'link' => 'mysqli', 'dbname' => 'string'], 'mysqli_send_query' => ['bool', 'link' => 'mysqli', 'query' => 'string'], 'mysqli_set_charset' => ['bool', 'link' => 'mysqli', 'charset' => 'string'], 'mysqli_set_local_infile_default' => ['void', 'link' => 'mysqli'], 'mysqli_set_local_infile_handler' => ['bool', 'link' => 'mysqli', 'read_func' => 'callable'], 'mysqli_slave_query' => ['bool', 'link' => 'mysqli', 'query' => 'string'], 'mysqli_sqlstate' => ['string', 'link' => 'mysqli'], 'mysqli_ssl_set' => ['bool', 'link' => 'mysqli', 'key' => 'string', 'cert' => 'string', 'ca' => 'string', 'capath' => 'string', 'cipher' => 'string'], 'mysqli_stat' => ['string|false', 'link' => 'mysqli'], 'mysqli_stmt::__construct' => ['void', 'query=' => 'string'], 'mysqli_stmt::attr_get' => ['false|int', 'attr' => 'int'], 'mysqli_stmt::attr_set' => ['bool', 'attr' => 'int', 'mode' => 'int'], 'mysqli_stmt::bind_param' => ['bool', 'types' => 'string', 'var1' => 'mixed', '...args=' => 'mixed'], 'mysqli_stmt::bind_result' => ['bool', 'var1' => 'mixed', '...args=' => 'mixed'], 'mysqli_stmt::close' => ['bool'], 'mysqli_stmt::data_seek' => ['void', 'offset' => 'int'], 'mysqli_stmt::execute' => ['bool'], 'mysqli_stmt::fetch' => ['bool'], 'mysqli_stmt::free_result' => ['void'], 'mysqli_stmt::get_result' => ['mysqli_result|false'], 'mysqli_stmt::get_warnings' => ['object'], 'mysqli_stmt::more_results' => ['bool'], 'mysqli_stmt::next_result' => ['bool'], 'mysqli_stmt::num_rows' => ['int'], 'mysqli_stmt::prepare' => ['bool', 'query' => 'string'], 'mysqli_stmt::reset' => ['bool'], 'mysqli_stmt::result_metadata' => ['mysqli_result|false'], 'mysqli_stmt::send_long_data' => ['bool', 'param_nr' => 'int', 'data' => 'string'], 'mysqli_stmt::store_result' => ['bool'], 'mysqli_stmt_affected_rows' => ['int|string', 'stmt' => 'mysqli_stmt'], 'mysqli_stmt_attr_get' => ['int|false', 'stmt' => 'mysqli_stmt', 'attr' => 'int'], 'mysqli_stmt_attr_set' => ['bool', 'stmt' => 'mysqli_stmt', 'attr' => 'int', 'mode' => 'int'], 'mysqli_stmt_bind_param' => ['bool', 'stmt' => 'mysqli_stmt', 'types' => 'string', 'var1' => 'mixed', '...args=' => 'mixed'], 'mysqli_stmt_bind_result' => ['bool', 'stmt' => 'mysqli_stmt', 'var1=' => 'mixed', '...args=' => 'mixed'], 'mysqli_stmt_close' => ['bool', 'stmt' => 'mysqli_stmt'], 'mysqli_stmt_data_seek' => ['void', 'stmt' => 'mysqli_stmt', 'offset' => 'int'], 'mysqli_stmt_errno' => ['int', 'stmt' => 'mysqli_stmt'], 'mysqli_stmt_error' => ['string', 'stmt' => 'mysqli_stmt'], 'mysqli_stmt_error_list' => ['array', 'stmt' => 'mysqli_stmt'], 'mysqli_stmt_execute' => ['bool', 'stmt' => 'mysqli_stmt'], 'mysqli_stmt_fetch' => ['bool', 'stmt' => 'mysqli_stmt'], 'mysqli_stmt_field_count' => ['int', 'stmt' => 'mysqli_stmt'], 'mysqli_stmt_free_result' => ['void', 'stmt' => 'mysqli_stmt'], 'mysqli_stmt_get_result' => ['mysqli_result|false', 'stmt' => 'mysqli_stmt'], 'mysqli_stmt_get_warnings' => ['object', 'stmt' => 'mysqli_stmt'], 'mysqli_stmt_init' => ['mysqli_stmt', 'link' => 'mysqli'], 'mysqli_stmt_insert_id' => ['', 'stmt' => 'mysqli_stmt'], 'mysqli_stmt_more_results' => ['bool', 'stmt' => 'mysqli_stmt'], 'mysqli_stmt_next_result' => ['bool', 'stmt' => 'mysqli_stmt'], 'mysqli_stmt_num_rows' => ['int', 'stmt' => 'mysqli_stmt'], 'mysqli_stmt_param_count' => ['int', 'stmt' => 'mysqli_stmt'], 'mysqli_stmt_prepare' => ['bool', 'stmt' => 'mysqli_stmt', 'query' => 'string'], 'mysqli_stmt_reset' => ['bool', 'stmt' => 'mysqli_stmt'], 'mysqli_stmt_result_metadata' => ['mysqli_result|false', 'stmt' => 'mysqli_stmt'], 'mysqli_stmt_send_long_data' => ['bool', 'stmt' => 'mysqli_stmt', 'param_nr' => 'int', 'data' => 'string'], 'mysqli_stmt_sqlstate' => ['string', 'stmt' => 'mysqli_stmt'], 'mysqli_stmt_store_result' => ['bool', 'stmt' => 'mysqli_stmt'], 'mysqli_store_result' => ['mysqli_result|false', 'link' => 'mysqli', 'option=' => 'int'], 'mysqli_thread_id' => ['int', 'link' => 'mysqli'], 'mysqli_thread_safe' => ['bool'], 'mysqli_use_result' => ['mysqli_result|false', 'link' => 'mysqli'], 'mysqli_warning::__construct' => ['void'], 'mysqli_warning::next' => ['void'], 'mysqli_warning_count' => ['int', 'link' => 'mysqli'], 'mysqlnd_memcache_get_config' => ['array', 'connection' => 'mixed'], 'mysqlnd_memcache_set' => ['bool', 'mysql_connection' => 'mixed', 'memcache_connection=' => 'Memcached', 'pattern=' => 'string', 'callback=' => 'callable'], 'mysqlnd_ms_dump_servers' => ['array', 'connection' => 'mixed'], 'mysqlnd_ms_fabric_select_global' => ['array', 'connection' => 'mixed', 'table_name' => 'mixed'], 'mysqlnd_ms_fabric_select_shard' => ['array', 'connection' => 'mixed', 'table_name' => 'mixed', 'shard_key' => 'mixed'], 'mysqlnd_ms_get_last_gtid' => ['string', 'connection' => 'mixed'], 'mysqlnd_ms_get_last_used_connection' => ['array', 'connection' => 'mixed'], 'mysqlnd_ms_get_stats' => ['array'], 'mysqlnd_ms_match_wild' => ['bool', 'table_name' => 'string', 'wildcard' => 'string'], 'mysqlnd_ms_query_is_select' => ['int', 'query' => 'string'], 'mysqlnd_ms_set_qos' => ['bool', 'connection' => 'mixed', 'service_level' => 'int', 'service_level_option=' => 'int', 'option_value=' => 'mixed'], 'mysqlnd_ms_set_user_pick_server' => ['bool', 'function' => 'string'], 'mysqlnd_ms_xa_begin' => ['int', 'connection' => 'mixed', 'gtrid' => 'string', 'timeout=' => 'int'], 'mysqlnd_ms_xa_commit' => ['int', 'connection' => 'mixed', 'gtrid' => 'string'], 'mysqlnd_ms_xa_gc' => ['int', 'connection' => 'mixed', 'gtrid=' => 'string', 'ignore_max_retries=' => 'bool'], 'mysqlnd_ms_xa_rollback' => ['int', 'connection' => 'mixed', 'gtrid' => 'string'], 'mysqlnd_qc_change_handler' => ['bool', 'handler' => ''], 'mysqlnd_qc_clear_cache' => ['bool'], 'mysqlnd_qc_get_available_handlers' => ['array'], 'mysqlnd_qc_get_cache_info' => ['array'], 'mysqlnd_qc_get_core_stats' => ['array'], 'mysqlnd_qc_get_handler' => ['array'], 'mysqlnd_qc_get_normalized_query_trace_log' => ['array'], 'mysqlnd_qc_get_query_trace_log' => ['array'], 'mysqlnd_qc_set_cache_condition' => ['bool', 'condition_type' => 'int', 'condition' => 'mixed', 'condition_option' => 'mixed'], 'mysqlnd_qc_set_is_select' => ['mixed', 'callback' => 'string'], 'mysqlnd_qc_set_storage_handler' => ['bool', 'handler' => 'string'], 'mysqlnd_qc_set_user_handlers' => ['bool', 'get_hash' => 'string', 'find_query_in_cache' => 'string', 'return_to_cache' => 'string', 'add_query_to_cache_if_not_exists' => 'string', 'query_is_select' => 'string', 'update_query_run_time_stats' => 'string', 'get_stats' => 'string', 'clear_cache' => 'string'], 'mysqlnd_uh_convert_to_mysqlnd' => ['resource', '&rw_mysql_connection' => 'mysqli'], 'mysqlnd_uh_set_connection_proxy' => ['bool', '&rw_connection_proxy' => 'MysqlndUhConnection', '&rw_mysqli_connection=' => 'mysqli'], 'mysqlnd_uh_set_statement_proxy' => ['bool', '&rw_statement_proxy' => 'MysqlndUhStatement'], 'MysqlndUhConnection::__construct' => ['void'], 'MysqlndUhConnection::changeUser' => ['bool', 'connection' => 'mysqlnd_connection', 'user' => 'string', 'password' => 'string', 'database' => 'string', 'silent' => 'bool', 'passwd_len' => 'int'], 'MysqlndUhConnection::charsetName' => ['string', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::close' => ['bool', 'connection' => 'mysqlnd_connection', 'close_type' => 'int'], 'MysqlndUhConnection::connect' => ['bool', 'connection' => 'mysqlnd_connection', 'host' => 'string', 'use' => 'string', 'password' => 'string', 'database' => 'string', 'port' => 'int', 'socket' => 'string', 'mysql_flags' => 'int'], 'MysqlndUhConnection::endPSession' => ['bool', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::escapeString' => ['string', 'connection' => 'mysqlnd_connection', 'escape_string' => 'string'], 'MysqlndUhConnection::getAffectedRows' => ['int', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::getErrorNumber' => ['int', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::getErrorString' => ['string', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::getFieldCount' => ['int', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::getHostInformation' => ['string', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::getLastInsertId' => ['int', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::getLastMessage' => ['void', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::getProtocolInformation' => ['string', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::getServerInformation' => ['string', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::getServerStatistics' => ['string', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::getServerVersion' => ['int', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::getSqlstate' => ['string', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::getStatistics' => ['array', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::getThreadId' => ['int', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::getWarningCount' => ['int', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::init' => ['bool', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::killConnection' => ['bool', 'connection' => 'mysqlnd_connection', 'pid' => 'int'], 'MysqlndUhConnection::listFields' => ['array', 'connection' => 'mysqlnd_connection', 'table' => 'string', 'achtung_wild' => 'string'], 'MysqlndUhConnection::listMethod' => ['void', 'connection' => 'mysqlnd_connection', 'query' => 'string', 'achtung_wild' => 'string', 'par1' => 'string'], 'MysqlndUhConnection::moreResults' => ['bool', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::nextResult' => ['bool', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::ping' => ['bool', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::query' => ['bool', 'connection' => 'mysqlnd_connection', 'query' => 'string'], 'MysqlndUhConnection::queryReadResultsetHeader' => ['bool', 'connection' => 'mysqlnd_connection', 'mysqlnd_stmt' => 'mysqlnd_statement'], 'MysqlndUhConnection::reapQuery' => ['bool', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::refreshServer' => ['bool', 'connection' => 'mysqlnd_connection', 'options' => 'int'], 'MysqlndUhConnection::restartPSession' => ['bool', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::selectDb' => ['bool', 'connection' => 'mysqlnd_connection', 'database' => 'string'], 'MysqlndUhConnection::sendClose' => ['bool', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::sendQuery' => ['bool', 'connection' => 'mysqlnd_connection', 'query' => 'string'], 'MysqlndUhConnection::serverDumpDebugInformation' => ['bool', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::setAutocommit' => ['bool', 'connection' => 'mysqlnd_connection', 'mode' => 'int'], 'MysqlndUhConnection::setCharset' => ['bool', 'connection' => 'mysqlnd_connection', 'charset' => 'string'], 'MysqlndUhConnection::setClientOption' => ['bool', 'connection' => 'mysqlnd_connection', 'option' => 'int', 'value' => 'int'], 'MysqlndUhConnection::setServerOption' => ['void', 'connection' => 'mysqlnd_connection', 'option' => 'int'], 'MysqlndUhConnection::shutdownServer' => ['void', 'MYSQLND_UH_RES_MYSQLND_NAME' => 'string', 'level' => 'string'], 'MysqlndUhConnection::simpleCommand' => ['bool', 'connection' => 'mysqlnd_connection', 'command' => 'int', 'arg' => 'string', 'ok_packet' => 'int', 'silent' => 'bool', 'ignore_upsert_status' => 'bool'], 'MysqlndUhConnection::simpleCommandHandleResponse' => ['bool', 'connection' => 'mysqlnd_connection', 'ok_packet' => 'int', 'silent' => 'bool', 'command' => 'int', 'ignore_upsert_status' => 'bool'], 'MysqlndUhConnection::sslSet' => ['bool', 'connection' => 'mysqlnd_connection', 'key' => 'string', 'cert' => 'string', 'ca' => 'string', 'capath' => 'string', 'cipher' => 'string'], 'MysqlndUhConnection::stmtInit' => ['resource', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::storeResult' => ['resource', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::txCommit' => ['bool', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::txRollback' => ['bool', 'connection' => 'mysqlnd_connection'], 'MysqlndUhConnection::useResult' => ['resource', 'connection' => 'mysqlnd_connection'], 'MysqlndUhPreparedStatement::__construct' => ['void'], 'MysqlndUhPreparedStatement::execute' => ['bool', 'statement' => 'mysqlnd_prepared_statement'], 'MysqlndUhPreparedStatement::prepare' => ['bool', 'statement' => 'mysqlnd_prepared_statement', 'query' => 'string'], 'natcasesort' => ['bool', '&rw_array_arg' => 'array'], 'natsort' => ['bool', '&rw_array_arg' => 'array'], 'ncurses_addch' => ['int', 'ch' => 'int'], 'ncurses_addchnstr' => ['int', 's' => 'string', 'n' => 'int'], 'ncurses_addchstr' => ['int', 's' => 'string'], 'ncurses_addnstr' => ['int', 's' => 'string', 'n' => 'int'], 'ncurses_addstr' => ['int', 'text' => 'string'], 'ncurses_assume_default_colors' => ['int', 'fg' => 'int', 'bg' => 'int'], 'ncurses_attroff' => ['int', 'attributes' => 'int'], 'ncurses_attron' => ['int', 'attributes' => 'int'], 'ncurses_attrset' => ['int', 'attributes' => 'int'], 'ncurses_baudrate' => ['int'], 'ncurses_beep' => ['int'], 'ncurses_bkgd' => ['int', 'attrchar' => 'int'], 'ncurses_bkgdset' => ['void', 'attrchar' => 'int'], 'ncurses_border' => ['int', 'left' => 'int', 'right' => 'int', 'top' => 'int', 'bottom' => 'int', 'tl_corner' => 'int', 'tr_corner' => 'int', 'bl_corner' => 'int', 'br_corner' => 'int'], 'ncurses_bottom_panel' => ['int', 'panel' => 'resource'], 'ncurses_can_change_color' => ['bool'], 'ncurses_cbreak' => ['bool'], 'ncurses_clear' => ['bool'], 'ncurses_clrtobot' => ['bool'], 'ncurses_clrtoeol' => ['bool'], 'ncurses_color_content' => ['int', 'color' => 'int', 'r' => 'int', 'g' => 'int', 'b' => 'int'], 'ncurses_color_set' => ['int', 'pair' => 'int'], 'ncurses_curs_set' => ['int', 'visibility' => 'int'], 'ncurses_def_prog_mode' => ['bool'], 'ncurses_def_shell_mode' => ['bool'], 'ncurses_define_key' => ['int', 'definition' => 'string', 'keycode' => 'int'], 'ncurses_del_panel' => ['bool', 'panel' => 'resource'], 'ncurses_delay_output' => ['int', 'milliseconds' => 'int'], 'ncurses_delch' => ['bool'], 'ncurses_deleteln' => ['bool'], 'ncurses_delwin' => ['bool', 'window' => 'resource'], 'ncurses_doupdate' => ['bool'], 'ncurses_echo' => ['bool'], 'ncurses_echochar' => ['int', 'character' => 'int'], 'ncurses_end' => ['int'], 'ncurses_erase' => ['bool'], 'ncurses_erasechar' => ['string'], 'ncurses_filter' => ['void'], 'ncurses_flash' => ['bool'], 'ncurses_flushinp' => ['bool'], 'ncurses_getch' => ['int'], 'ncurses_getmaxyx' => ['void', 'window' => 'resource', 'y' => 'int', 'x' => 'int'], 'ncurses_getmouse' => ['bool', 'mevent' => 'array'], 'ncurses_getyx' => ['void', 'window' => 'resource', 'y' => 'int', 'x' => 'int'], 'ncurses_halfdelay' => ['int', 'tenth' => 'int'], 'ncurses_has_colors' => ['bool'], 'ncurses_has_ic' => ['bool'], 'ncurses_has_il' => ['bool'], 'ncurses_has_key' => ['int', 'keycode' => 'int'], 'ncurses_hide_panel' => ['int', 'panel' => 'resource'], 'ncurses_hline' => ['int', 'charattr' => 'int', 'n' => 'int'], 'ncurses_inch' => ['string'], 'ncurses_init' => ['void'], 'ncurses_init_color' => ['int', 'color' => 'int', 'r' => 'int', 'g' => 'int', 'b' => 'int'], 'ncurses_init_pair' => ['int', 'pair' => 'int', 'fg' => 'int', 'bg' => 'int'], 'ncurses_insch' => ['int', 'character' => 'int'], 'ncurses_insdelln' => ['int', 'count' => 'int'], 'ncurses_insertln' => ['int'], 'ncurses_insstr' => ['int', 'text' => 'string'], 'ncurses_instr' => ['int', 'buffer' => 'string'], 'ncurses_isendwin' => ['bool'], 'ncurses_keyok' => ['int', 'keycode' => 'int', 'enable' => 'bool'], 'ncurses_keypad' => ['int', 'window' => 'resource', 'bf' => 'bool'], 'ncurses_killchar' => ['string'], 'ncurses_longname' => ['string'], 'ncurses_meta' => ['int', 'window' => 'resource', '_8bit' => 'bool'], 'ncurses_mouse_trafo' => ['bool', 'y' => 'int', 'x' => 'int', 'toscreen' => 'bool'], 'ncurses_mouseinterval' => ['int', 'milliseconds' => 'int'], 'ncurses_mousemask' => ['int', 'newmask' => 'int', 'oldmask' => 'int'], 'ncurses_move' => ['int', 'y' => 'int', 'x' => 'int'], 'ncurses_move_panel' => ['int', 'panel' => 'resource', 'startx' => 'int', 'starty' => 'int'], 'ncurses_mvaddch' => ['int', 'y' => 'int', 'x' => 'int', 'c' => 'int'], 'ncurses_mvaddchnstr' => ['int', 'y' => 'int', 'x' => 'int', 's' => 'string', 'n' => 'int'], 'ncurses_mvaddchstr' => ['int', 'y' => 'int', 'x' => 'int', 's' => 'string'], 'ncurses_mvaddnstr' => ['int', 'y' => 'int', 'x' => 'int', 's' => 'string', 'n' => 'int'], 'ncurses_mvaddstr' => ['int', 'y' => 'int', 'x' => 'int', 's' => 'string'], 'ncurses_mvcur' => ['int', 'old_y' => 'int', 'old_x' => 'int', 'new_y' => 'int', 'new_x' => 'int'], 'ncurses_mvdelch' => ['int', 'y' => 'int', 'x' => 'int'], 'ncurses_mvgetch' => ['int', 'y' => 'int', 'x' => 'int'], 'ncurses_mvhline' => ['int', 'y' => 'int', 'x' => 'int', 'attrchar' => 'int', 'n' => 'int'], 'ncurses_mvinch' => ['int', 'y' => 'int', 'x' => 'int'], 'ncurses_mvvline' => ['int', 'y' => 'int', 'x' => 'int', 'attrchar' => 'int', 'n' => 'int'], 'ncurses_mvwaddstr' => ['int', 'window' => 'resource', 'y' => 'int', 'x' => 'int', 'text' => 'string'], 'ncurses_napms' => ['int', 'milliseconds' => 'int'], 'ncurses_new_panel' => ['resource', 'window' => 'resource'], 'ncurses_newpad' => ['resource', 'rows' => 'int', 'cols' => 'int'], 'ncurses_newwin' => ['resource', 'rows' => 'int', 'cols' => 'int', 'y' => 'int', 'x' => 'int'], 'ncurses_nl' => ['bool'], 'ncurses_nocbreak' => ['bool'], 'ncurses_noecho' => ['bool'], 'ncurses_nonl' => ['bool'], 'ncurses_noqiflush' => ['void'], 'ncurses_noraw' => ['bool'], 'ncurses_pair_content' => ['int', 'pair' => 'int', 'f' => 'int', 'b' => 'int'], 'ncurses_panel_above' => ['resource', 'panel' => 'resource'], 'ncurses_panel_below' => ['resource', 'panel' => 'resource'], 'ncurses_panel_window' => ['resource', 'panel' => 'resource'], 'ncurses_pnoutrefresh' => ['int', 'pad' => 'resource', 'pminrow' => 'int', 'pmincol' => 'int', 'sminrow' => 'int', 'smincol' => 'int', 'smaxrow' => 'int', 'smaxcol' => 'int'], 'ncurses_prefresh' => ['int', 'pad' => 'resource', 'pminrow' => 'int', 'pmincol' => 'int', 'sminrow' => 'int', 'smincol' => 'int', 'smaxrow' => 'int', 'smaxcol' => 'int'], 'ncurses_putp' => ['int', 'text' => 'string'], 'ncurses_qiflush' => ['void'], 'ncurses_raw' => ['bool'], 'ncurses_refresh' => ['int', 'ch' => 'int'], 'ncurses_replace_panel' => ['int', 'panel' => 'resource', 'window' => 'resource'], 'ncurses_reset_prog_mode' => ['int'], 'ncurses_reset_shell_mode' => ['int'], 'ncurses_resetty' => ['bool'], 'ncurses_savetty' => ['bool'], 'ncurses_scr_dump' => ['int', 'filename' => 'string'], 'ncurses_scr_init' => ['int', 'filename' => 'string'], 'ncurses_scr_restore' => ['int', 'filename' => 'string'], 'ncurses_scr_set' => ['int', 'filename' => 'string'], 'ncurses_scrl' => ['int', 'count' => 'int'], 'ncurses_show_panel' => ['int', 'panel' => 'resource'], 'ncurses_slk_attr' => ['int'], 'ncurses_slk_attroff' => ['int', 'intarg' => 'int'], 'ncurses_slk_attron' => ['int', 'intarg' => 'int'], 'ncurses_slk_attrset' => ['int', 'intarg' => 'int'], 'ncurses_slk_clear' => ['bool'], 'ncurses_slk_color' => ['int', 'intarg' => 'int'], 'ncurses_slk_init' => ['bool', 'format' => 'int'], 'ncurses_slk_noutrefresh' => ['bool'], 'ncurses_slk_refresh' => ['int'], 'ncurses_slk_restore' => ['int'], 'ncurses_slk_set' => ['bool', 'labelnr' => 'int', 'label' => 'string', 'format' => 'int'], 'ncurses_slk_touch' => ['int'], 'ncurses_standend' => ['int'], 'ncurses_standout' => ['int'], 'ncurses_start_color' => ['int'], 'ncurses_termattrs' => ['bool'], 'ncurses_termname' => ['string'], 'ncurses_timeout' => ['void', 'millisec' => 'int'], 'ncurses_top_panel' => ['int', 'panel' => 'resource'], 'ncurses_typeahead' => ['int', 'fd' => 'int'], 'ncurses_ungetch' => ['int', 'keycode' => 'int'], 'ncurses_ungetmouse' => ['bool', 'mevent' => 'array'], 'ncurses_update_panels' => ['void'], 'ncurses_use_default_colors' => ['bool'], 'ncurses_use_env' => ['void', 'flag' => 'bool'], 'ncurses_use_extended_names' => ['int', 'flag' => 'bool'], 'ncurses_vidattr' => ['int', 'intarg' => 'int'], 'ncurses_vline' => ['int', 'charattr' => 'int', 'n' => 'int'], 'ncurses_waddch' => ['int', 'window' => 'resource', 'ch' => 'int'], 'ncurses_waddstr' => ['int', 'window' => 'resource', 'str' => 'string', 'n=' => 'int'], 'ncurses_wattroff' => ['int', 'window' => 'resource', 'attrs' => 'int'], 'ncurses_wattron' => ['int', 'window' => 'resource', 'attrs' => 'int'], 'ncurses_wattrset' => ['int', 'window' => 'resource', 'attrs' => 'int'], 'ncurses_wborder' => ['int', 'window' => 'resource', 'left' => 'int', 'right' => 'int', 'top' => 'int', 'bottom' => 'int', 'tl_corner' => 'int', 'tr_corner' => 'int', 'bl_corner' => 'int', 'br_corner' => 'int'], 'ncurses_wclear' => ['int', 'window' => 'resource'], 'ncurses_wcolor_set' => ['int', 'window' => 'resource', 'color_pair' => 'int'], 'ncurses_werase' => ['int', 'window' => 'resource'], 'ncurses_wgetch' => ['int', 'window' => 'resource'], 'ncurses_whline' => ['int', 'window' => 'resource', 'charattr' => 'int', 'n' => 'int'], 'ncurses_wmouse_trafo' => ['bool', 'window' => 'resource', 'y' => 'int', 'x' => 'int', 'toscreen' => 'bool'], 'ncurses_wmove' => ['int', 'window' => 'resource', 'y' => 'int', 'x' => 'int'], 'ncurses_wnoutrefresh' => ['int', 'window' => 'resource'], 'ncurses_wrefresh' => ['int', 'window' => 'resource'], 'ncurses_wstandend' => ['int', 'window' => 'resource'], 'ncurses_wstandout' => ['int', 'window' => 'resource'], 'ncurses_wvline' => ['int', 'window' => 'resource', 'charattr' => 'int', 'n' => 'int'], 'net_get_interfaces' => ['array|false'], 'newrelic_add_custom_parameter' => ['bool', 'key' => 'string', 'value' => ''], 'newrelic_add_custom_tracer' => ['bool', 'function_name' => 'string'], 'newrelic_background_job' => ['void', 'flag=' => 'bool'], 'newrelic_capture_params' => ['void', 'enable=' => 'bool'], 'newrelic_custom_metric' => ['bool', 'metric_name' => 'string', 'value' => 'float'], 'newrelic_disable_autorum' => ['bool'], 'newrelic_end_of_transaction' => ['void'], 'newrelic_end_transaction' => ['bool', 'ignore=' => 'bool'], 'newrelic_get_browser_timing_footer' => ['string', 'include_tags=' => 'bool'], 'newrelic_get_browser_timing_header' => ['string', 'include_tags=' => 'bool'], 'newrelic_ignore_apdex' => ['void'], 'newrelic_ignore_transaction' => ['void'], 'newrelic_name_transaction' => ['bool', 'name' => 'string'], 'newrelic_notice_error' => ['void', 'message' => 'string', 'exception=' => 'Exception|Throwable'], 'newrelic_notice_error\'1' => ['void', 'unused_1' => 'string', 'message' => 'string', 'unused_2' => 'string', 'unused_3' => 'int', 'unused_4=' => ''], 'newrelic_record_custom_event' => ['void', 'name' => 'string', 'attributes' => 'array'], 'newrelic_record_datastore_segment' => ['mixed', 'func' => 'callable', 'parameters' => 'array'], 'newrelic_set_appname' => ['bool', 'name' => 'string', 'license=' => 'string', 'xmit=' => 'bool'], 'newrelic_set_user_attributes' => ['bool', 'user' => 'string', 'account' => 'string', 'product' => 'string'], 'newrelic_start_transaction' => ['bool', 'appname' => 'string', 'license=' => 'string'], 'newt_bell' => ['void'], 'newt_button' => ['resource', 'left' => 'int', 'top' => 'int', 'text' => 'string'], 'newt_button_bar' => ['resource', 'buttons' => 'array'], 'newt_centered_window' => ['int', 'width' => 'int', 'height' => 'int', 'title=' => 'string'], 'newt_checkbox' => ['resource', 'left' => 'int', 'top' => 'int', 'text' => 'string', 'def_value' => 'string', 'seq=' => 'string'], 'newt_checkbox_get_value' => ['string', 'checkbox' => 'resource'], 'newt_checkbox_set_flags' => ['void', 'checkbox' => 'resource', 'flags' => 'int', 'sense' => 'int'], 'newt_checkbox_set_value' => ['void', 'checkbox' => 'resource', 'value' => 'string'], 'newt_checkbox_tree' => ['resource', 'left' => 'int', 'top' => 'int', 'height' => 'int', 'flags=' => 'int'], 'newt_checkbox_tree_add_item' => ['void', 'checkboxtree' => 'resource', 'text' => 'string', 'data' => 'mixed', 'flags' => 'int', 'index' => 'int', '...args=' => 'int'], 'newt_checkbox_tree_find_item' => ['array', 'checkboxtree' => 'resource', 'data' => 'mixed'], 'newt_checkbox_tree_get_current' => ['mixed', 'checkboxtree' => 'resource'], 'newt_checkbox_tree_get_entry_value' => ['string', 'checkboxtree' => 'resource', 'data' => 'mixed'], 'newt_checkbox_tree_get_multi_selection' => ['array', 'checkboxtree' => 'resource', 'seqnum' => 'string'], 'newt_checkbox_tree_get_selection' => ['array', 'checkboxtree' => 'resource'], 'newt_checkbox_tree_multi' => ['resource', 'left' => 'int', 'top' => 'int', 'height' => 'int', 'seq' => 'string', 'flags=' => 'int'], 'newt_checkbox_tree_set_current' => ['void', 'checkboxtree' => 'resource', 'data' => 'mixed'], 'newt_checkbox_tree_set_entry' => ['void', 'checkboxtree' => 'resource', 'data' => 'mixed', 'text' => 'string'], 'newt_checkbox_tree_set_entry_value' => ['void', 'checkboxtree' => 'resource', 'data' => 'mixed', 'value' => 'string'], 'newt_checkbox_tree_set_width' => ['void', 'checkbox_tree' => 'resource', 'width' => 'int'], 'newt_clear_key_buffer' => ['void'], 'newt_cls' => ['void'], 'newt_compact_button' => ['resource', 'left' => 'int', 'top' => 'int', 'text' => 'string'], 'newt_component_add_callback' => ['void', 'component' => 'resource', 'func_name' => 'mixed', 'data' => 'mixed'], 'newt_component_takes_focus' => ['void', 'component' => 'resource', 'takes_focus' => 'bool'], 'newt_create_grid' => ['resource', 'cols' => 'int', 'rows' => 'int'], 'newt_cursor_off' => ['void'], 'newt_cursor_on' => ['void'], 'newt_delay' => ['void', 'microseconds' => 'int'], 'newt_draw_form' => ['void', 'form' => 'resource'], 'newt_draw_root_text' => ['void', 'left' => 'int', 'top' => 'int', 'text' => 'string'], 'newt_entry' => ['resource', 'left' => 'int', 'top' => 'int', 'width' => 'int', 'init_value=' => 'string', 'flags=' => 'int'], 'newt_entry_get_value' => ['string', 'entry' => 'resource'], 'newt_entry_set' => ['void', 'entry' => 'resource', 'value' => 'string', 'cursor_at_end=' => 'bool'], 'newt_entry_set_filter' => ['void', 'entry' => 'resource', 'filter' => 'callable', 'data' => 'mixed'], 'newt_entry_set_flags' => ['void', 'entry' => 'resource', 'flags' => 'int', 'sense' => 'int'], 'newt_finished' => ['int'], 'newt_form' => ['resource', 'vert_bar=' => 'resource', 'help=' => 'string', 'flags=' => 'int'], 'newt_form_add_component' => ['void', 'form' => 'resource', 'component' => 'resource'], 'newt_form_add_components' => ['void', 'form' => 'resource', 'components' => 'array'], 'newt_form_add_hot_key' => ['void', 'form' => 'resource', 'key' => 'int'], 'newt_form_destroy' => ['void', 'form' => 'resource'], 'newt_form_get_current' => ['resource', 'form' => 'resource'], 'newt_form_run' => ['void', 'form' => 'resource', 'exit_struct' => 'array'], 'newt_form_set_background' => ['void', 'from' => 'resource', 'background' => 'int'], 'newt_form_set_height' => ['void', 'form' => 'resource', 'height' => 'int'], 'newt_form_set_size' => ['void', 'form' => 'resource'], 'newt_form_set_timer' => ['void', 'form' => 'resource', 'milliseconds' => 'int'], 'newt_form_set_width' => ['void', 'form' => 'resource', 'width' => 'int'], 'newt_form_watch_fd' => ['void', 'form' => 'resource', 'stream' => 'resource', 'flags=' => 'int'], 'newt_get_screen_size' => ['void', 'cols' => 'int', 'rows' => 'int'], 'newt_grid_add_components_to_form' => ['void', 'grid' => 'resource', 'form' => 'resource', 'recurse' => 'bool'], 'newt_grid_basic_window' => ['resource', 'text' => 'resource', 'middle' => 'resource', 'buttons' => 'resource'], 'newt_grid_free' => ['void', 'grid' => 'resource', 'recurse' => 'bool'], 'newt_grid_get_size' => ['void', 'grid' => 'resource', 'width' => 'int', 'height' => 'int'], 'newt_grid_h_close_stacked' => ['resource', 'element1_type' => 'int', 'element1' => 'resource', '...args=' => 'resource'], 'newt_grid_h_stacked' => ['resource', 'element1_type' => 'int', 'element1' => 'resource', '...args=' => 'resource'], 'newt_grid_place' => ['void', 'grid' => 'resource', 'left' => 'int', 'top' => 'int'], 'newt_grid_set_field' => ['void', 'grid' => 'resource', 'col' => 'int', 'row' => 'int', 'type' => 'int', 'val' => 'resource', 'pad_left' => 'int', 'pad_top' => 'int', 'pad_right' => 'int', 'pad_bottom' => 'int', 'anchor' => 'int', 'flags=' => 'int'], 'newt_grid_simple_window' => ['resource', 'text' => 'resource', 'middle' => 'resource', 'buttons' => 'resource'], 'newt_grid_v_close_stacked' => ['resource', 'element1_type' => 'int', 'element1' => 'resource', '...args=' => 'resource'], 'newt_grid_v_stacked' => ['resource', 'element1_type' => 'int', 'element1' => 'resource', '...args=' => 'resource'], 'newt_grid_wrapped_window' => ['void', 'grid' => 'resource', 'title' => 'string'], 'newt_grid_wrapped_window_at' => ['void', 'grid' => 'resource', 'title' => 'string', 'left' => 'int', 'top' => 'int'], 'newt_init' => ['int'], 'newt_label' => ['resource', 'left' => 'int', 'top' => 'int', 'text' => 'string'], 'newt_label_set_text' => ['void', 'label' => 'resource', 'text' => 'string'], 'newt_listbox' => ['resource', 'left' => 'int', 'top' => 'int', 'height' => 'int', 'flags=' => 'int'], 'newt_listbox_append_entry' => ['void', 'listbox' => 'resource', 'text' => 'string', 'data' => 'mixed'], 'newt_listbox_clear' => ['void', 'listobx' => 'resource'], 'newt_listbox_clear_selection' => ['void', 'listbox' => 'resource'], 'newt_listbox_delete_entry' => ['void', 'listbox' => 'resource', 'key' => 'mixed'], 'newt_listbox_get_current' => ['string', 'listbox' => 'resource'], 'newt_listbox_get_selection' => ['array', 'listbox' => 'resource'], 'newt_listbox_insert_entry' => ['void', 'listbox' => 'resource', 'text' => 'string', 'data' => 'mixed', 'key' => 'mixed'], 'newt_listbox_item_count' => ['int', 'listbox' => 'resource'], 'newt_listbox_select_item' => ['void', 'listbox' => 'resource', 'key' => 'mixed', 'sense' => 'int'], 'newt_listbox_set_current' => ['void', 'listbox' => 'resource', 'num' => 'int'], 'newt_listbox_set_current_by_key' => ['void', 'listbox' => 'resource', 'key' => 'mixed'], 'newt_listbox_set_data' => ['void', 'listbox' => 'resource', 'num' => 'int', 'data' => 'mixed'], 'newt_listbox_set_entry' => ['void', 'listbox' => 'resource', 'num' => 'int', 'text' => 'string'], 'newt_listbox_set_width' => ['void', 'listbox' => 'resource', 'width' => 'int'], 'newt_listitem' => ['resource', 'left' => 'int', 'top' => 'int', 'text' => 'string', 'is_default' => 'bool', 'prev_item' => 'resource', 'data' => 'mixed', 'flags=' => 'int'], 'newt_listitem_get_data' => ['mixed', 'item' => 'resource'], 'newt_listitem_set' => ['void', 'item' => 'resource', 'text' => 'string'], 'newt_open_window' => ['int', 'left' => 'int', 'top' => 'int', 'width' => 'int', 'height' => 'int', 'title=' => 'string'], 'newt_pop_help_line' => ['void'], 'newt_pop_window' => ['void'], 'newt_push_help_line' => ['void', 'text=' => 'string'], 'newt_radio_get_current' => ['resource', 'set_member' => 'resource'], 'newt_radiobutton' => ['resource', 'left' => 'int', 'top' => 'int', 'text' => 'string', 'is_default' => 'bool', 'prev_button=' => 'resource'], 'newt_redraw_help_line' => ['void'], 'newt_reflow_text' => ['string', 'text' => 'string', 'width' => 'int', 'flex_down' => 'int', 'flex_up' => 'int', 'actual_width' => 'int', 'actual_height' => 'int'], 'newt_refresh' => ['void'], 'newt_resize_screen' => ['void', 'redraw=' => 'bool'], 'newt_resume' => ['void'], 'newt_run_form' => ['resource', 'form' => 'resource'], 'newt_scale' => ['resource', 'left' => 'int', 'top' => 'int', 'width' => 'int', 'full_value' => 'int'], 'newt_scale_set' => ['void', 'scale' => 'resource', 'amount' => 'int'], 'newt_scrollbar_set' => ['void', 'scrollbar' => 'resource', 'where' => 'int', 'total' => 'int'], 'newt_set_help_callback' => ['void', 'function' => 'mixed'], 'newt_set_suspend_callback' => ['void', 'function' => 'callable', 'data' => 'mixed'], 'newt_suspend' => ['void'], 'newt_textbox' => ['resource', 'left' => 'int', 'top' => 'int', 'width' => 'int', 'height' => 'int', 'flags=' => 'int'], 'newt_textbox_get_num_lines' => ['int', 'textbox' => 'resource'], 'newt_textbox_reflowed' => ['resource', 'left' => 'int', 'top' => 'int', 'text' => 'char', 'width' => 'int', 'flex_down' => 'int', 'flex_up' => 'int', 'flags=' => 'int'], 'newt_textbox_set_height' => ['void', 'textbox' => 'resource', 'height' => 'int'], 'newt_textbox_set_text' => ['void', 'textbox' => 'resource', 'text' => 'string'], 'newt_vertical_scrollbar' => ['resource', 'left' => 'int', 'top' => 'int', 'height' => 'int', 'normal_colorset=' => 'int', 'thumb_colorset=' => 'int'], 'newt_wait_for_key' => ['void'], 'newt_win_choice' => ['int', 'title' => 'string', 'button1_text' => 'string', 'button2_text' => 'string', 'format' => 'string', 'args=' => 'mixed', '...args=' => 'mixed'], 'newt_win_entries' => ['int', 'title' => 'string', 'text' => 'string', 'suggested_width' => 'int', 'flex_down' => 'int', 'flex_up' => 'int', 'data_width' => 'int', 'items' => 'array', 'button1' => 'string', '...args=' => 'string'], 'newt_win_menu' => ['int', 'title' => 'string', 'text' => 'string', 'suggestedwidth' => 'int', 'flexdown' => 'int', 'flexup' => 'int', 'maxlistheight' => 'int', 'items' => 'array', 'listitem' => 'int', 'button1=' => 'string', '...args=' => 'string'], 'newt_win_message' => ['void', 'title' => 'string', 'button_text' => 'string', 'format' => 'string', 'args=' => 'mixed', '...args=' => 'mixed'], 'newt_win_messagev' => ['void', 'title' => 'string', 'button_text' => 'string', 'format' => 'string', 'args' => 'array'], 'newt_win_ternary' => ['int', 'title' => 'string', 'button1_text' => 'string', 'button2_text' => 'string', 'button3_text' => 'string', 'format' => 'string', 'args=' => 'mixed', '...args=' => 'mixed'], 'next' => ['mixed', '&rw_array_arg' => 'array|object'], 'ngettext' => ['string', 'msgid1' => 'string', 'msgid2' => 'string', 'n' => 'int'], 'nl2br' => ['string', 'str' => 'string', 'is_xhtml=' => 'bool'], 'nl_langinfo' => ['string', 'item' => 'int'], 'NoRewindIterator::__construct' => ['void', 'it' => 'iterator'], 'NoRewindIterator::current' => ['mixed'], 'NoRewindIterator::getInnerIterator' => ['iterator'], 'NoRewindIterator::key' => ['mixed'], 'NoRewindIterator::next' => ['void'], 'NoRewindIterator::rewind' => ['void'], 'NoRewindIterator::valid' => ['bool'], 'Normalizer::getRawDecomposition' => ['string|null', 'input' => 'string'], 'Normalizer::isNormalized' => ['bool', 'input' => 'string', 'form=' => 'int'], 'Normalizer::normalize' => ['string', 'input' => 'string', 'form=' => 'int'], 'normalizer_get_raw_decomposition' => ['string|null', 'input' => 'string'], 'normalizer_is_normalized' => ['bool', 'input' => 'string', 'form=' => 'int'], 'normalizer_normalize' => ['string', 'input' => 'string', 'form=' => 'int'], 'notes_body' => ['array', 'server' => 'string', 'mailbox' => 'string', 'msg_number' => 'int'], 'notes_copy_db' => ['bool', 'from_database_name' => 'string', 'to_database_name' => 'string'], 'notes_create_db' => ['bool', 'database_name' => 'string'], 'notes_create_note' => ['bool', 'database_name' => 'string', 'form_name' => 'string'], 'notes_drop_db' => ['bool', 'database_name' => 'string'], 'notes_find_note' => ['int', 'database_name' => 'string', 'name' => 'string', 'type=' => 'string'], 'notes_header_info' => ['object', 'server' => 'string', 'mailbox' => 'string', 'msg_number' => 'int'], 'notes_list_msgs' => ['bool', 'db' => 'string'], 'notes_mark_read' => ['bool', 'database_name' => 'string', 'user_name' => 'string', 'note_id' => 'string'], 'notes_mark_unread' => ['bool', 'database_name' => 'string', 'user_name' => 'string', 'note_id' => 'string'], 'notes_nav_create' => ['bool', 'database_name' => 'string', 'name' => 'string'], 'notes_search' => ['array', 'database_name' => 'string', 'keywords' => 'string'], 'notes_unread' => ['array', 'database_name' => 'string', 'user_name' => 'string'], 'notes_version' => ['float', 'database_name' => 'string'], 'nsapi_request_headers' => ['array'], 'nsapi_response_headers' => ['array'], 'nsapi_virtual' => ['bool', 'uri' => 'string'], 'nthmac' => ['string', 'clent' => 'string', 'data' => 'string'], 'number_format' => ['string', 'number' => 'float', 'num_decimal_places=' => 'int'], 'number_format\'1' => ['string', 'number' => 'float', 'num_decimal_places' => 'int', 'dec_separator' => 'string', 'thousands_separator' => 'string'], 'NumberFormatter::__construct' => ['void', 'locale' => 'string', 'style' => 'int', 'pattern=' => 'string'], 'NumberFormatter::create' => ['NumberFormatter', 'locale' => 'string', 'style' => 'int', 'pattern=' => 'string'], 'NumberFormatter::format' => ['string', 'num' => '', 'type=' => 'int'], 'NumberFormatter::formatCurrency' => ['string', 'num' => 'float', 'currency' => 'string'], 'NumberFormatter::getAttribute' => ['int', 'attr' => 'int'], 'NumberFormatter::getErrorCode' => ['int'], 'NumberFormatter::getErrorMessage' => ['string'], 'NumberFormatter::getLocale' => ['string', 'type=' => 'int'], 'NumberFormatter::getPattern' => ['string'], 'NumberFormatter::getSymbol' => ['string', 'attr' => 'int'], 'NumberFormatter::getTextAttribute' => ['string', 'attr' => 'int'], 'NumberFormatter::parse' => ['float|false', 'str' => 'string', 'type=' => 'int', '&rw_position=' => 'int'], 'NumberFormatter::parseCurrency' => ['float', 'str' => 'string', '&w_currency' => 'string', '&rw_position=' => 'int'], 'NumberFormatter::setAttribute' => ['bool', 'attr' => 'int', 'value' => ''], 'NumberFormatter::setPattern' => ['bool', 'pattern' => 'string'], 'NumberFormatter::setSymbol' => ['bool', 'attr' => 'int', 'symbol' => 'string'], 'NumberFormatter::setTextAttribute' => ['bool', 'attr' => 'int', 'value' => 'string'], 'numfmt_create' => ['NumberFormatter', 'locale' => 'string', 'style' => 'int', 'pattern=' => 'string'], 'numfmt_format' => ['string', 'fmt' => 'numberformatter', 'value=' => 'float', 'type=' => 'int'], 'numfmt_format_currency' => ['string|false', 'fmt' => 'numberformatter', 'value' => 'float', 'currency' => 'string'], 'numfmt_get_attribute' => ['int', 'fmt' => 'numberformatter', 'attr' => 'int'], 'numfmt_get_error_code' => ['int', 'fmt' => 'numberformatter'], 'numfmt_get_error_message' => ['string', 'fmt' => 'numberformatter'], 'numfmt_get_locale' => ['string', 'fmt' => 'numberformatter', 'type=' => 'int'], 'numfmt_get_pattern' => ['string', 'fmt' => 'numberformatter'], 'numfmt_get_symbol' => ['string', 'fmt' => 'numberformatter', 'attr' => 'int'], 'numfmt_get_text_attribute' => ['string', 'fmt' => 'numberformatter', 'attr' => 'int'], 'numfmt_parse' => ['float|false', 'fmt' => 'numberformatter', 'value' => 'string', 'type=' => 'int', '&rw_position=' => 'int'], 'numfmt_parse_currency' => ['float|false', 'fmt' => 'numberformatter', 'value' => 'string', '&w_currency' => 'string', '&rw_position=' => 'int'], 'numfmt_set_attribute' => ['bool', 'fmt' => 'numberformatter', 'attr' => 'int', 'value' => 'int'], 'numfmt_set_pattern' => ['bool', 'fmt' => 'numberformatter', 'pattern' => 'string'], 'numfmt_set_symbol' => ['bool', 'fmt' => 'numberformatter', 'attr' => 'int', 'value' => 'string'], 'numfmt_set_text_attribute' => ['bool', 'fmt' => 'numberformatter', 'attr' => 'int', 'value' => 'string'], 'OAuth::__construct' => ['void', 'consumer_key' => 'string', 'consumer_secret' => 'string', 'signature_method=' => 'string', 'auth_type=' => 'int'], 'OAuth::__destruct' => [''], 'OAuth::disableDebug' => ['bool'], 'OAuth::disableRedirects' => ['bool'], 'OAuth::disableSSLChecks' => ['bool'], 'OAuth::enableDebug' => ['bool'], 'OAuth::enableRedirects' => ['bool'], 'OAuth::enableSSLChecks' => ['bool'], 'OAuth::fetch' => ['mixed', 'protected_resource_url' => 'string', 'extra_parameters=' => 'array', 'http_method=' => 'string', 'http_headers=' => 'array'], 'OAuth::generateSignature' => ['string', 'http_method' => 'string', 'url' => 'string', 'extra_parameters=' => 'mixed'], 'OAuth::getAccessToken' => ['array|false', 'access_token_url' => 'string', 'auth_session_handle=' => 'string', 'verifier_token=' => 'string'], 'OAuth::getCAPath' => ['array'], 'OAuth::getLastResponse' => ['string'], 'OAuth::getLastResponseHeaders' => ['string|false'], 'OAuth::getLastResponseInfo' => ['array'], 'OAuth::getRequestHeader' => ['string|false', 'http_method' => 'string', 'url' => 'string', 'extra_parameters=' => 'mixed'], 'OAuth::getRequestToken' => ['array|false', 'request_token_url' => 'string', 'callback_url=' => 'string'], 'OAuth::setAuthType' => ['bool', 'auth_type' => 'int'], 'OAuth::setCAPath' => ['mixed', 'ca_path=' => 'string', 'ca_info=' => 'string'], 'OAuth::setNonce' => ['mixed', 'nonce' => 'string'], 'OAuth::setRequestEngine' => ['void', 'reqengine' => 'int'], 'OAuth::setRSACertificate' => ['mixed', 'cert' => 'string'], 'OAuth::setSSLChecks' => ['bool', 'sslcheck' => 'int'], 'OAuth::setTimestamp' => ['mixed', 'timestamp' => 'string'], 'OAuth::setToken' => ['bool', 'token' => 'string', 'token_secret' => 'string'], 'OAuth::setVersion' => ['bool', 'version' => 'string'], 'oauth_get_sbs' => ['string', 'http_method' => 'string', 'uri' => 'string', 'request_parameters=' => 'array'], 'oauth_urlencode' => ['string', 'uri' => 'string'], 'OAuthProvider::__construct' => ['void', 'params_array=' => 'array'], 'OAuthProvider::addRequiredParameter' => ['bool', 'req_params' => 'string'], 'OAuthProvider::callconsumerHandler' => ['void'], 'OAuthProvider::callTimestampNonceHandler' => ['void'], 'OAuthProvider::calltokenHandler' => ['void'], 'OAuthProvider::checkOAuthRequest' => ['void', 'uri=' => 'string', 'method=' => 'string'], 'OAuthProvider::consumerHandler' => ['void', 'callback_function' => 'callable'], 'OAuthProvider::generateToken' => ['string', 'size' => 'int', 'strong=' => 'bool'], 'OAuthProvider::is2LeggedEndpoint' => ['void', 'params_array' => 'mixed'], 'OAuthProvider::isRequestTokenEndpoint' => ['void', 'will_issue_request_token' => 'bool'], 'OAuthProvider::removeRequiredParameter' => ['bool', 'req_params' => 'string'], 'OAuthProvider::reportProblem' => ['string', 'oauthexception' => 'string', 'send_headers=' => 'bool'], 'OAuthProvider::setParam' => ['bool', 'param_key' => 'string', 'param_val=' => 'mixed'], 'OAuthProvider::setRequestTokenPath' => ['bool', 'path' => 'string'], 'OAuthProvider::timestampNonceHandler' => ['void', 'callback_function' => 'callable'], 'OAuthProvider::tokenHandler' => ['void', 'callback_function' => 'callable'], 'ob_clean' => ['bool'], 'ob_deflatehandler' => ['string', 'data' => 'string', 'mode' => 'int'], 'ob_end_clean' => ['bool'], 'ob_end_flush' => ['bool'], 'ob_etaghandler' => ['string', 'data' => 'string', 'mode' => 'int'], 'ob_flush' => ['bool'], 'ob_get_clean' => ['string|false'], 'ob_get_contents' => ['string|false'], 'ob_get_flush' => ['string|false'], 'ob_get_length' => ['int|false'], 'ob_get_level' => ['int'], 'ob_get_status' => ['array', 'full_status=' => 'bool'], 'ob_gzhandler' => ['string|false', 'data' => 'string', 'flags' => 'int'], 'ob_iconv_handler' => ['string', 'contents' => 'string', 'status' => 'int'], 'ob_implicit_flush' => ['void', 'flag=' => 'int'], 'ob_inflatehandler' => ['string', 'data' => 'string', 'mode' => 'int'], 'ob_list_handlers' => ['false|array'], 'ob_start' => ['bool', 'user_function=' => 'string|array|?callable', 'chunk_size=' => 'int', 'flags=' => 'int'], 'ob_tidyhandler' => ['string', 'input' => 'string', 'mode=' => 'int'], 'OCI-Collection::assignElem' => ['bool', 'index' => 'int', 'value' => ''], 'OCI-Collection::getElem' => ['', 'index' => 'int'], 'OCI-Lob::append' => ['bool', 'lob_from' => 'OCI-Lob'], 'OCI-Lob::close' => ['bool'], 'OCI-Lob::eof' => ['bool'], 'OCI-Lob::erase' => ['int', 'offset=' => 'int', 'length=' => 'int'], 'OCI-Lob::export' => ['bool', 'filename' => 'string', 'start=' => 'int', 'length=' => 'int'], 'OCI-Lob::flush' => ['bool', 'flag=' => 'int'], 'OCI-Lob::free' => ['bool'], 'OCI-Lob::getBuffering' => ['bool'], 'OCI-Lob::import' => ['bool', 'filename' => 'string'], 'OCI-Lob::load' => ['string'], 'OCI-Lob::read' => ['string', 'length' => 'int'], 'OCI-Lob::rewind' => ['bool'], 'OCI-Lob::save' => ['bool', 'data' => 'string', 'offset=' => 'int'], 'OCI-Lob::seek' => ['bool', 'offset' => 'int', 'whence=' => 'int'], 'OCI-Lob::setBuffering' => ['bool', 'on_off' => 'bool'], 'OCI-Lob::size' => ['int'], 'OCI-Lob::tell' => ['int'], 'OCI-Lob::truncate' => ['bool', 'length=' => 'int'], 'OCI-Lob::write' => ['int', 'data' => 'string', 'length=' => 'int'], 'OCI-Lob::writeTemporary' => ['bool', 'data' => 'string', 'lob_type=' => 'int'], 'oci_bind_array_by_name' => ['bool', 'stmt' => 'resource', 'name' => 'string', '&rw_var' => 'array', 'max_table_length' => 'int', 'max_item_length=' => 'int', 'type=' => 'int'], 'oci_bind_by_name' => ['bool', 'stmt' => 'resource', 'name' => 'string', '&rw_var' => 'mixed', 'maxlength=' => 'int', 'type=' => 'int'], 'oci_cancel' => ['bool', 'stmt' => 'resource'], 'oci_client_version' => ['string'], 'oci_close' => ['bool', 'connection' => 'resource'], 'OCI-Collection::append' => ['bool', 'value' => 'mixed'], 'OCI-Collection::assign' => ['bool', 'from' => 'OCI-Collection'], 'OCI-Collection::assignelem' => ['bool', 'index' => 'int', 'value' => 'mixed'], 'OCI-Collection::free' => ['bool'], 'OCI-Collection::getelem' => ['mixed', 'index' => 'int'], 'OCI-Collection::max' => ['int'], 'OCI-Collection::size' => ['int'], 'OCI-Collection::trim' => ['bool', 'num' => 'int'], 'oci_collection_append' => ['bool', 'value' => 'string'], 'oci_collection_assign' => ['bool', 'from' => 'OCI-Collection'], 'oci_collection_element_assign' => ['bool', 'index' => 'int', 'val' => 'string'], 'oci_collection_element_get' => ['string', 'ndx' => 'int'], 'oci_collection_max' => ['int'], 'oci_collection_size' => ['int'], 'oci_collection_trim' => ['bool', 'num' => 'int'], 'oci_commit' => ['bool', 'connection' => 'resource'], 'oci_connect' => ['resource|false', 'user' => 'string', 'pass' => 'string', 'db=' => 'string', 'charset=' => 'string', 'session_mode=' => 'int'], 'oci_define_by_name' => ['bool', 'stmt' => 'resource', 'name' => 'string', '&w_var' => 'mixed', 'type=' => 'int'], 'oci_error' => ['array|false', 'resource=' => 'resource'], 'oci_execute' => ['bool', 'stmt' => 'resource', 'mode=' => 'int'], 'oci_fetch' => ['bool', 'stmt' => 'resource'], 'oci_fetch_all' => ['int|false', 'stmt' => 'resource', '&w_output' => 'array', 'skip=' => 'int', 'maxrows=' => 'int', 'flags=' => 'int'], 'oci_fetch_array' => ['array|false', 'stmt' => 'resource', 'mode=' => 'int'], 'oci_fetch_assoc' => ['array|false', 'stmt' => 'resource'], 'oci_fetch_object' => ['object|false', 'stmt' => 'resource'], 'oci_fetch_row' => ['array|false', 'stmt' => 'resource'], 'oci_field_is_null' => ['bool', 'stmt' => 'resource', 'col' => 'mixed'], 'oci_field_name' => ['string|false', 'stmt' => 'resource', 'col' => 'mixed'], 'oci_field_precision' => ['int|false', 'stmt' => 'resource', 'col' => 'mixed'], 'oci_field_scale' => ['int|false', 'stmt' => 'resource', 'col' => 'mixed'], 'oci_field_size' => ['int|false', 'stmt' => 'resource', 'col' => 'mixed'], 'oci_field_type' => ['mixed', 'stmt' => 'resource', 'col' => 'mixed'], 'oci_field_type_raw' => ['int|false', 'stmt' => 'resource', 'col' => 'mixed'], 'oci_free_collection' => ['bool'], 'oci_free_cursor' => ['bool', 'stmt' => 'resource'], 'oci_free_descriptor' => ['bool'], 'oci_free_statement' => ['bool', 'stmt' => 'resource'], 'oci_get_implicit' => ['bool', 'stmt' => ''], 'oci_get_implicit_resultset' => ['resource|false', 'statement' => 'resource'], 'oci_internal_debug' => ['void', 'onoff' => 'bool'], 'OCI-Lob::getbuffering' => ['bool'], 'OCI-Lob::savefile' => ['bool', 'filename' => ''], 'OCI-Lob::setbuffering' => ['bool', 'on_off' => 'bool'], 'OCI-Lob::writetofile' => ['bool', 'filename' => '', 'start' => '', 'length' => ''], 'oci_lob_append' => ['bool', 'lob' => 'OCI-Lob'], 'oci_lob_close' => ['bool'], 'oci_lob_copy' => ['bool', 'lob_to' => 'OCI-Lob', 'lob_from' => 'OCI-Lob', 'length=' => 'int'], 'oci_lob_eof' => ['bool'], 'oci_lob_erase' => ['int', 'offset' => 'int', 'length' => 'int'], 'oci_lob_export' => ['bool', 'filename' => 'string', 'start' => 'int', 'length' => 'int'], 'oci_lob_flush' => ['bool', 'flag' => 'int'], 'oci_lob_import' => ['bool', 'filename' => 'string'], 'oci_lob_is_equal' => ['bool', 'lob1' => 'OCI-Lob', 'lob2' => 'OCI-Lob'], 'oci_lob_load' => ['string'], 'oci_lob_read' => ['string', 'length' => 'int'], 'oci_lob_rewind' => ['bool'], 'oci_lob_save' => ['bool', 'data' => 'string', 'offset' => 'int'], 'oci_lob_seek' => ['bool', 'offset' => 'int', 'whence' => 'int'], 'oci_lob_size' => ['int'], 'oci_lob_tell' => ['int'], 'oci_lob_truncate' => ['bool', 'length' => 'int'], 'oci_lob_write' => ['int', 'string' => 'string', 'length' => 'int'], 'oci_lob_write_temporary' => ['bool', 'var' => 'string', 'lob_type' => 'int'], 'oci_new_collection' => ['OCI-Collection|false', 'connection' => 'resource', 'tdo' => 'string', 'schema=' => 'string'], 'oci_new_connect' => ['resource|false', 'user' => 'string', 'pass' => 'string', 'db=' => 'string', 'charset=' => 'string', 'session_mode=' => 'int'], 'oci_new_cursor' => ['resource|false', 'connection' => 'resource'], 'oci_new_descriptor' => ['OCI-Lob|false', 'connection' => 'resource', 'type=' => 'int'], 'oci_num_fields' => ['int|false', 'stmt' => 'resource'], 'oci_num_rows' => ['int|false', 'stmt' => 'resource'], 'oci_parse' => ['resource|false', 'connection' => 'resource', 'statement' => 'string'], 'oci_password_change' => ['bool', 'connection' => '', 'username' => 'string', 'old_password' => 'string', 'new_password' => 'string'], 'oci_pconnect' => ['resource|false', 'user' => 'string', 'pass' => 'string', 'db=' => 'string', 'charset=' => 'string', 'session_mode=' => 'int'], 'oci_register_taf_callback' => ['bool', 'connection' => 'resource', 'callback=' => 'callable'], 'oci_result' => ['string|false', 'stmt' => 'resource', 'column' => 'mixed'], 'oci_rollback' => ['bool', 'connection' => 'resource'], 'oci_server_version' => ['string|false', 'connection' => 'resource'], 'oci_set_action' => ['bool', 'connection' => 'resource', 'value' => 'string'], 'oci_set_client_identifier' => ['bool', 'connection' => 'resource', 'value' => 'string'], 'oci_set_client_info' => ['bool', 'connection' => 'resource', 'value' => 'string'], 'oci_set_db_operation' => ['bool', 'connection' => 'resource', 'value' => 'string'], 'oci_set_edition' => ['bool', 'value' => 'string'], 'oci_set_module_name' => ['bool', 'connection' => 'resource', 'value' => 'string'], 'oci_set_prefetch' => ['bool', 'stmt' => 'resource', 'prefetch_rows' => 'int'], 'oci_statement_type' => ['string|false', 'stmt' => 'resource'], 'oci_unregister_taf_callback' => ['bool', 'connection' => 'resource'], 'ocifetchinto' => ['int', 'stmt' => '', '&w_output' => 'array', 'mode=' => 'int'], 'ocigetbufferinglob' => ['bool'], 'ocisetbufferinglob' => ['bool', 'flag' => 'bool'], 'octdec' => ['int', 'octal_number' => 'string'], 'odbc_autocommit' => ['mixed', 'connection_id' => 'resource', 'onoff=' => 'bool'], 'odbc_binmode' => ['bool', 'result_id' => 'int', 'mode' => 'int'], 'odbc_close' => ['void', 'connection_id' => 'resource'], 'odbc_close_all' => ['void'], 'odbc_columnprivileges' => ['resource', 'connection_id' => 'resource', 'catalog' => 'string', 'schema' => 'string', 'table' => 'string', 'column' => 'string'], 'odbc_columns' => ['resource', 'connection_id' => 'resource', 'qualifier=' => 'string', 'owner=' => 'string', 'table_name=' => 'string', 'column_name=' => 'string'], 'odbc_commit' => ['bool', 'connection_id' => 'resource'], 'odbc_connect' => ['resource', 'dsn' => 'string', 'user' => 'string', 'password' => 'string', 'cursor_option=' => 'int'], 'odbc_cursor' => ['string', 'result_id' => 'resource'], 'odbc_data_source' => ['array', 'connection_id' => 'resource', 'fetch_type' => 'int'], 'odbc_do' => ['resource', 'connection_id' => 'resource', 'query' => 'string', 'flags=' => 'int'], 'odbc_error' => ['string', 'connection_id=' => 'resource'], 'odbc_errormsg' => ['string', 'connection_id=' => 'resource'], 'odbc_exec' => ['resource', 'connection_id' => 'resource', 'query' => 'string', 'flags=' => 'int'], 'odbc_execute' => ['bool', 'result_id' => 'resource', 'parameters_array=' => 'array'], 'odbc_fetch_array' => ['array', 'result' => 'resource', 'rownumber=' => 'int'], 'odbc_fetch_into' => ['int', 'result_id' => 'resource', '&w_result_array' => 'array', 'rownumber=' => 'int'], 'odbc_fetch_object' => ['object', 'result' => 'int', 'rownumber=' => 'int'], 'odbc_fetch_row' => ['bool', 'result_id' => 'resource', 'row_number=' => 'int'], 'odbc_field_len' => ['int', 'result_id' => 'resource', 'field_number' => 'int'], 'odbc_field_name' => ['string', 'result_id' => 'resource', 'field_number' => 'int'], 'odbc_field_num' => ['int', 'result_id' => 'resource', 'field_name' => 'string'], 'odbc_field_precision' => ['int', 'result_id' => 'resource', 'field_number' => 'int'], 'odbc_field_scale' => ['int', 'result_id' => 'resource', 'field_number' => 'int'], 'odbc_field_type' => ['string', 'result_id' => 'resource', 'field_number' => 'int'], 'odbc_foreignkeys' => ['resource', 'connection_id' => 'resource', 'pk_qualifier' => 'string', 'pk_owner' => 'string', 'pk_table' => 'string', 'fk_qualifier' => 'string', 'fk_owner' => 'string', 'fk_table' => 'string'], 'odbc_free_result' => ['bool', 'result_id' => 'resource'], 'odbc_gettypeinfo' => ['resource', 'connection_id' => 'resource', 'data_type=' => 'int'], 'odbc_longreadlen' => ['bool', 'result_id' => 'resource', 'length' => 'int'], 'odbc_next_result' => ['bool', 'result_id' => 'resource'], 'odbc_num_fields' => ['int', 'result_id' => 'resource'], 'odbc_num_rows' => ['int', 'result_id' => 'resource'], 'odbc_pconnect' => ['resource', 'dsn' => 'string', 'user' => 'string', 'password' => 'string', 'cursor_option=' => 'int'], 'odbc_prepare' => ['resource', 'connection_id' => 'resource', 'query' => 'string'], 'odbc_primarykeys' => ['resource', 'connection_id' => 'resource', 'qualifier' => 'string', 'owner' => 'string', 'table' => 'string'], 'odbc_procedurecolumns' => ['resource', 'connection_id' => '', 'qualifier' => 'string', 'owner' => 'string', 'proc' => 'string', 'column' => 'string'], 'odbc_procedures' => ['resource', 'connection_id' => '', 'qualifier' => 'string', 'owner' => 'string', 'name' => 'string'], 'odbc_result' => ['mixed', 'result_id' => 'resource', 'field' => 'mixed'], 'odbc_result_all' => ['int', 'result_id' => 'resource', 'format=' => 'string'], 'odbc_rollback' => ['bool', 'connection_id' => 'resource'], 'odbc_setoption' => ['bool', 'result_id' => 'resource', 'which' => 'int', 'option' => 'int', 'value' => 'int'], 'odbc_specialcolumns' => ['resource', 'connection_id' => 'resource', 'type' => 'int', 'qualifier' => 'string', 'owner' => 'string', 'table' => 'string', 'scope' => 'int', 'nullable' => 'int'], 'odbc_statistics' => ['resource', 'connection_id' => 'resource', 'qualifier' => 'string', 'owner' => 'string', 'name' => 'string', 'unique' => 'int', 'accuracy' => 'int'], 'odbc_tableprivileges' => ['resource', 'connection_id' => 'resource', 'qualifier' => 'string', 'owner' => 'string', 'name' => 'string'], 'odbc_tables' => ['resource', 'connection_id' => 'resource', 'qualifier=' => 'string', 'owner=' => 'string', 'name=' => 'string', 'table_types=' => 'string'], 'opcache_compile_file' => ['bool', 'file' => 'string'], 'opcache_get_configuration' => ['array'], 'opcache_get_status' => ['array|false', 'get_scripts=' => 'bool'], 'opcache_invalidate' => ['bool', 'script' => 'string', 'force=' => 'bool'], 'opcache_is_script_cached' => ['bool', 'script' => 'string'], 'opcache_reset' => ['bool'], 'openal_buffer_create' => ['resource'], 'openal_buffer_data' => ['bool', 'buffer' => 'resource', 'format' => 'int', 'data' => 'string', 'freq' => 'int'], 'openal_buffer_destroy' => ['bool', 'buffer' => 'resource'], 'openal_buffer_get' => ['int', 'buffer' => 'resource', 'property' => 'int'], 'openal_buffer_loadwav' => ['bool', 'buffer' => 'resource', 'wavfile' => 'string'], 'openal_context_create' => ['resource', 'device' => 'resource'], 'openal_context_current' => ['bool', 'context' => 'resource'], 'openal_context_destroy' => ['bool', 'context' => 'resource'], 'openal_context_process' => ['bool', 'context' => 'resource'], 'openal_context_suspend' => ['bool', 'context' => 'resource'], 'openal_device_close' => ['bool', 'device' => 'resource'], 'openal_device_open' => ['resource', 'device_desc=' => 'string'], 'openal_listener_get' => ['mixed', 'property' => 'int'], 'openal_listener_set' => ['bool', 'property' => 'int', 'setting' => 'mixed'], 'openal_source_create' => ['resource'], 'openal_source_destroy' => ['bool', 'source' => 'resource'], 'openal_source_get' => ['mixed', 'source' => 'resource', 'property' => 'int'], 'openal_source_pause' => ['bool', 'source' => 'resource'], 'openal_source_play' => ['bool', 'source' => 'resource'], 'openal_source_rewind' => ['bool', 'source' => 'resource'], 'openal_source_set' => ['bool', 'source' => 'resource', 'property' => 'int', 'setting' => 'mixed'], 'openal_source_stop' => ['bool', 'source' => 'resource'], 'openal_stream' => ['resource', 'source' => 'resource', 'format' => 'int', 'rate' => 'int'], 'opendir' => ['resource|false', 'path' => 'string', 'context=' => 'resource'], 'openlog' => ['bool', 'ident' => 'string', 'option' => 'int', 'facility' => 'int'], 'openssl_cipher_iv_length' => ['int|false', 'method' => 'string'], 'openssl_csr_export' => ['bool', 'csr' => 'string|resource', '&w_out' => 'string', 'notext=' => 'bool'], 'openssl_csr_export_to_file' => ['bool', 'csr' => 'string|resource', 'outfilename' => 'string', 'notext=' => 'bool'], 'openssl_csr_get_public_key' => ['resource|false', 'csr' => 'string|resource', 'use_shortnames=' => 'bool'], 'openssl_csr_get_subject' => ['array|false', 'csr' => 'string|resource', 'use_shortnames=' => 'bool'], 'openssl_csr_new' => ['resource|false', 'dn' => 'array', '&w_privkey' => 'resource', 'configargs=' => 'array', 'extraattribs=' => 'array'], 'openssl_csr_sign' => ['resource|false', 'csr' => 'string|resource', 'x509' => 'string|resource|null', 'priv_key' => 'string|resource|array', 'days' => 'int', 'config_args=' => 'array', 'serial=' => 'int'], 'openssl_decrypt' => ['string|false', 'data' => 'string', 'method' => 'string', 'key' => 'string', 'options=' => 'int', 'iv=' => 'string', 'tag=' => 'string', 'aad=' => 'string'], 'openssl_dh_compute_key' => ['string|false', 'pub_key' => 'string', 'dh_key' => 'resource'], 'openssl_digest' => ['string|false', 'data' => 'string', 'method' => 'string', 'raw_output=' => 'bool'], 'openssl_encrypt' => ['string|false', 'data' => 'string', 'method' => 'string', 'key' => 'string', 'options=' => 'int', 'iv=' => 'string', '&w_tag=' => 'string', 'aad=' => 'string', 'tag_length=' => 'int'], 'openssl_error_string' => ['string|false'], 'openssl_free_key' => ['void', 'key_identifier' => 'resource'], 'openssl_get_cert_locations' => ['array'], 'openssl_get_cipher_methods' => ['array', 'aliases=' => 'bool'], 'openssl_get_curve_names' => ['array<int,string>'], 'openssl_get_md_methods' => ['array', 'aliases=' => 'bool'], 'openssl_get_privatekey' => ['resource|false', 'key' => 'string', 'passphrase=' => 'string'], 'openssl_get_publickey' => ['resource|false', 'cert' => 'resource|string'], 'openssl_open' => ['bool', 'sealed_data' => 'string', '&w_open_data' => 'string', 'env_key' => 'string', 'priv_key_id' => 'string|array|resource', 'method=' => 'string', 'iv=' => 'string'], 'openssl_pbkdf2' => ['string|false', 'password' => 'string', 'salt' => 'string', 'key_length' => 'int', 'iterations' => 'int', 'digest_algorithm' => 'string'], 'openssl_pkcs12_export' => ['bool', 'x509' => 'string|resource', '&w_out' => 'string', 'priv_key' => 'string|array|resource', 'pass' => 'string', 'args=' => 'array'], 'openssl_pkcs12_export_to_file' => ['bool', 'x509' => 'string|resource', 'filename' => 'string', 'priv_key' => 'string|array|resource', 'pass' => 'string', 'args=' => 'array'], 'openssl_pkcs12_read' => ['bool', 'pkcs12' => 'string', '&w_certs' => 'array', 'pass' => 'string'], 'openssl_pkcs7_decrypt' => ['bool', 'infilename' => 'string', 'outfilename' => 'string', 'recipcert' => 'string|resource', 'recipkey=' => 'string|resource|array'], 'openssl_pkcs7_encrypt' => ['bool', 'infile' => 'string', 'outfile' => 'string', 'recipcerts' => 'string|resource|array', 'headers' => 'array', 'flags=' => 'int', 'cipherid=' => 'int'], 'openssl_pkcs7_read' => ['bool', 'infilename' => 'string', '&w_certs' => 'array'], 'openssl_pkcs7_sign' => ['bool', 'infile' => 'string', 'outfile' => 'string', 'signcert' => 'string|resource', 'privkey' => 'string|resource|array', 'headers' => 'array', 'flags=' => 'int', 'extracerts=' => 'string'], 'openssl_pkcs7_verify' => ['bool|int', 'filename' => 'string', 'flags' => 'int', 'outfilename=' => 'string', 'cainfo=' => 'array', 'extracerts=' => 'string', 'content=' => 'string', 'p7bfilename=' => 'string'], 'openssl_pkey_derive' => ['string|false', 'pub_key' => 'resource', 'priv_key' => 'resource', 'keylen=' => 'int'], 'openssl_pkey_export' => ['bool', 'key' => 'resource', '&w_out' => 'string', 'passphrase=' => 'string', 'configargs=' => 'array'], 'openssl_pkey_export_to_file' => ['bool', 'key' => 'resource|string|array', 'outfilename' => 'string', 'passphrase=' => 'string', 'configargs=' => 'array'], 'openssl_pkey_free' => ['void', 'key' => 'resource'], 'openssl_pkey_get_details' => ['array|false', 'key' => 'resource'], 'openssl_pkey_get_private' => ['resource|false', 'key' => 'string', 'passphrase=' => 'string'], 'openssl_pkey_get_public' => ['resource|false', 'certificate' => 'resource|string'], 'openssl_pkey_new' => ['resource|false', 'configargs=' => 'array'], 'openssl_private_decrypt' => ['bool', 'data' => 'string', '&w_decrypted' => 'string', 'key' => 'string|resource|array', 'padding=' => 'int'], 'openssl_private_encrypt' => ['bool', 'data' => 'string', '&w_crypted' => 'string', 'key' => 'string|resource|array', 'padding=' => 'int'], 'openssl_public_decrypt' => ['bool', 'data' => 'string', '&w_decrypted' => 'string', 'key' => 'string|resource', 'padding=' => 'int'], 'openssl_public_encrypt' => ['bool', 'data' => 'string', '&w_crypted' => 'string', 'key' => 'string|resource', 'padding=' => 'int'], 'openssl_random_pseudo_bytes' => ['string|false', 'length' => 'int', '&w_crypto_strong=' => 'bool'], 'openssl_seal' => ['int|false', 'data' => 'string', '&w_sealed_data' => 'string', '&rw_env_keys' => 'array', 'pub_key_ids' => 'array', 'method=' => 'string'], 'openssl_sign' => ['bool', 'data' => 'string', '&w_signature' => 'string', 'priv_key_id' => 'resource|string', 'signature_alg=' => 'int|string'], 'openssl_spki_export' => ['string|null', 'spkac' => 'string'], 'openssl_spki_export_challenge' => ['string|null', 'spkac' => 'string'], 'openssl_spki_new' => ['string|null', 'privkey' => 'resource', 'challenge' => 'string', 'algorithm=' => 'int'], 'openssl_spki_verify' => ['bool', 'spkac' => 'string'], 'openssl_verify' => ['int', 'data' => 'string', 'signature' => 'string', 'pub_key_id' => 'resource|string', 'signature_alg=' => 'int|string'], 'openssl_x509_check_private_key' => ['bool', 'cert' => 'string|resource', 'key' => 'string|resource|array'], 'openssl_x509_checkpurpose' => ['bool|int', 'x509cert' => 'string|resource', 'purpose' => 'int', 'cainfo=' => 'array', 'untrustedfile=' => 'string'], 'openssl_x509_export' => ['bool', 'x509' => 'string|resource', '&w_output' => 'string', 'notext=' => 'bool'], 'openssl_x509_export_to_file' => ['bool', 'x509' => 'string|resource', 'outfilename' => 'string', 'notext=' => 'bool'], 'openssl_x509_fingerprint' => ['string|false', 'x509' => 'string|resource', 'hash_algorithm=' => 'string', 'raw_output=' => 'bool'], 'openssl_x509_free' => ['void', 'x509' => 'resource'], 'openssl_x509_parse' => ['array|false', 'x509cert' => 'string|resource', 'shortnames=' => 'bool'], 'openssl_x509_read' => ['resource|false', 'x509certdata' => 'string|resource'], 'ord' => ['int', 'character' => 'string'], 'OuterIterator::getInnerIterator' => ['Iterator'], 'OutOfBoundsException::__clone' => ['void'], 'OutOfBoundsException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?Throwable|?OutOfBoundsException'], 'OutOfBoundsException::__toString' => ['string'], 'OutOfBoundsException::getCode' => ['int'], 'OutOfBoundsException::getFile' => ['string'], 'OutOfBoundsException::getLine' => ['int'], 'OutOfBoundsException::getMessage' => ['string'], 'OutOfBoundsException::getPrevious' => ['Throwable|OutOfBoundsException|null'], 'OutOfBoundsException::getTrace' => ['array'], 'OutOfBoundsException::getTraceAsString' => ['string'], 'OutOfRangeException::__clone' => ['void'], 'OutOfRangeException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?Throwable|?OutOfRangeException'], 'OutOfRangeException::__toString' => ['string'], 'OutOfRangeException::getCode' => ['int'], 'OutOfRangeException::getFile' => ['string'], 'OutOfRangeException::getLine' => ['int'], 'OutOfRangeException::getMessage' => ['string'], 'OutOfRangeException::getPrevious' => ['Throwable|OutOfRangeException|null'], 'OutOfRangeException::getTrace' => ['array'], 'OutOfRangeException::getTraceAsString' => ['string'], 'output_add_rewrite_var' => ['bool', 'name' => 'string', 'value' => 'string'], 'output_reset_rewrite_vars' => ['bool'], 'OverflowException::__clone' => ['void'], 'OverflowException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?Throwable|?OverflowException'], 'OverflowException::__toString' => ['string'], 'OverflowException::getCode' => ['int'], 'OverflowException::getFile' => ['string'], 'OverflowException::getLine' => ['int'], 'OverflowException::getMessage' => ['string'], 'OverflowException::getPrevious' => ['Throwable|OverflowException|null'], 'OverflowException::getTrace' => ['array'], 'OverflowException::getTraceAsString' => ['string'], 'overload' => ['', 'class_name' => 'string'], 'override_function' => ['bool', 'function_name' => 'string', 'function_args' => 'string', 'function_code' => 'string'], 'pack' => ['string', 'format' => 'string', '...args=' => 'mixed'], 'ParentIterator::__construct' => ['void', 'it' => 'recursiveiterator'], 'ParentIterator::accept' => ['bool'], 'ParentIterator::getChildren' => ['ParentIterator'], 'ParentIterator::hasChildren' => ['bool'], 'ParentIterator::next' => ['void'], 'ParentIterator::rewind' => ['void'], 'ParentIterator::valid' => [''], 'Parle\\Lexer::advance' => ['void'], 'Parle\\Lexer::build' => ['void'], 'Parle\\Lexer::callout' => ['void', 'id' => 'int', 'callback' => 'callable'], 'Parle\\Lexer::consume' => ['void', 'data' => 'string'], 'Parle\\Lexer::dump' => ['void'], 'Parle\\Lexer::getToken' => ['_HumbugBoxb94336daae36\\Parle\\Token'], 'Parle\\Lexer::insertMacro' => ['void', 'name' => 'string', 'regex' => 'string'], 'Parle\\Lexer::push' => ['void', 'regex' => 'string', 'id' => 'int'], 'Parle\\Lexer::reset' => ['void', 'pos' => 'int'], 'Parle\\Parser::advance' => ['void'], 'Parle\\Parser::build' => ['void'], 'Parle\\Parser::consume' => ['void', 'data' => 'string', 'lexer' => '_HumbugBoxb94336daae36\\Parle\\Lexer'], 'Parle\\Parser::dump' => ['void'], 'Parle\\Parser::errorInfo' => ['_HumbugBoxb94336daae36\\Parle\\ErrorInfo'], 'Parle\\Parser::left' => ['void', 'token' => 'string'], 'Parle\\Parser::nonassoc' => ['void', 'token' => 'string'], 'Parle\\Parser::precedence' => ['void', 'token' => 'string'], 'Parle\\Parser::push' => ['int', 'name' => 'string', 'rule' => 'string'], 'Parle\\Parser::reset' => ['void', 'tokenId' => 'int'], 'Parle\\Parser::right' => ['void', 'token' => 'string'], 'Parle\\Parser::sigil' => ['string', 'idx' => 'array'], 'Parle\\Parser::token' => ['void', 'token' => 'string'], 'Parle\\Parser::tokenId' => ['int', 'token' => 'string'], 'Parle\\Parser::trace' => ['string'], 'Parle\\Parser::validate' => ['bool', 'data' => 'string', 'lexer' => '_HumbugBoxb94336daae36\\Parle\\Lexer'], 'Parle\\RLexer::advance' => ['void'], 'Parle\\RLexer::build' => ['void'], 'Parle\\RLexer::callout' => ['void', 'id' => 'int', 'callback' => 'callable'], 'Parle\\RLexer::consume' => ['void', 'data' => 'string'], 'Parle\\RLexer::dump' => ['void'], 'Parle\\RLexer::getToken' => ['_HumbugBoxb94336daae36\\Parle\\Token'], 'Parle\\RLexer::push' => ['void', 'state' => 'string', 'regex' => 'string', 'newState' => 'string'], 'Parle\\RLexer::pushState' => ['int', 'state' => 'string'], 'Parle\\RLexer::reset' => ['void', 'pos' => 'int'], 'Parle\\RParser::advance' => ['void'], 'Parle\\RParser::build' => ['void'], 'Parle\\RParser::consume' => ['void', 'data' => 'string', 'lexer' => '_HumbugBoxb94336daae36\\Parle\\Lexer'], 'Parle\\RParser::dump' => ['void'], 'Parle\\RParser::errorInfo' => ['_HumbugBoxb94336daae36\\Parle\\ErrorInfo'], 'Parle\\RParser::left' => ['void', 'token' => 'string'], 'Parle\\RParser::nonassoc' => ['void', 'token' => 'string'], 'Parle\\RParser::precedence' => ['void', 'token' => 'string'], 'Parle\\RParser::push' => ['int', 'name' => 'string', 'rule' => 'string'], 'Parle\\RParser::reset' => ['void', 'tokenId' => 'int'], 'Parle\\RParser::right' => ['void', 'token' => 'string'], 'Parle\\RParser::sigil' => ['string', 'idx' => 'array'], 'Parle\\RParser::token' => ['void', 'token' => 'string'], 'Parle\\RParser::tokenId' => ['int', 'token' => 'string'], 'Parle\\RParser::trace' => ['string'], 'Parle\\RParser::validate' => ['bool', 'data' => 'string', 'lexer' => '_HumbugBoxb94336daae36\\Parle\\Lexer'], 'Parle\\Stack::pop' => ['void'], 'Parle\\Stack::push' => ['void', 'item' => ''], 'parse_ini_file' => ['array|false', 'filename' => 'string', 'process_sections=' => 'bool', 'scanner_mode=' => 'int'], 'parse_ini_string' => ['array|false', 'ini_string' => 'string', 'process_sections=' => 'bool', 'scanner_mode=' => 'int'], 'parse_str' => ['void', 'encoded_string' => 'string', '&w_result=' => 'array'], 'parse_url' => ['mixed', 'url' => 'string', 'url_component=' => 'int'], 'ParseError::__clone' => ['void'], 'ParseError::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?Throwable|?ParseError'], 'ParseError::__toString' => ['string'], 'ParseError::getCode' => ['int'], 'ParseError::getFile' => ['string'], 'ParseError::getLine' => ['int'], 'ParseError::getMessage' => ['string'], 'ParseError::getPrevious' => ['Throwable|ParseError|null'], 'ParseError::getTrace' => ['array'], 'ParseError::getTraceAsString' => ['string'], 'parsekit_compile_file' => ['array', 'filename' => 'string', 'errors=' => 'array', 'options=' => 'int'], 'parsekit_compile_string' => ['array', 'phpcode' => 'string', 'errors=' => 'array', 'options=' => 'int'], 'parsekit_func_arginfo' => ['array', 'function' => 'mixed'], 'passthru' => ['void', 'command' => 'string', '&w_return_value=' => 'int'], 'password_get_info' => ['array', 'hash' => 'string'], 'password_hash' => ['string|false', 'password' => 'string', 'algo' => 'int', 'options=' => 'array'], 'password_make_salt' => ['bool', 'password' => 'string', 'hash' => 'string'], 'password_needs_rehash' => ['bool', 'hash' => 'string', 'algo' => 'int', 'options=' => 'array'], 'password_verify' => ['bool', 'password' => 'string', 'hash' => 'string'], 'pathinfo' => ['array|string', 'path' => 'string', 'options=' => 'int'], 'pclose' => ['int', 'fp' => 'resource'], 'pcnlt_sigwaitinfo' => ['int', 'set' => 'array', '&w_siginfo' => 'array'], 'pcntl_alarm' => ['int', 'seconds' => 'int'], 'pcntl_async_signals' => ['bool', 'on=' => 'bool'], 'pcntl_errno' => ['int'], 'pcntl_exec' => ['bool', 'path' => 'string', 'args=' => 'array', 'envs=' => 'array'], 'pcntl_fork' => ['int'], 'pcntl_get_last_error' => ['int'], 'pcntl_getpriority' => ['int', 'pid=' => 'int', 'process_identifier=' => 'int'], 'pcntl_setpriority' => ['bool', 'priority' => 'int', 'pid=' => 'int', 'process_identifier=' => 'int'], 'pcntl_signal' => ['bool', 'signo' => 'int', 'handle' => 'callable|int', 'restart_syscalls=' => 'bool'], 'pcntl_signal_dispatch' => ['bool'], 'pcntl_signal_get_handler' => ['int|string', 'signo' => 'int'], 'pcntl_sigprocmask' => ['bool', 'how' => 'int', 'set' => 'array', '&w_oldset=' => 'array'], 'pcntl_sigtimedwait' => ['int', 'set' => 'array', '&w_siginfo=' => 'array', 'seconds=' => 'int', 'nanoseconds=' => 'int'], 'pcntl_sigwaitinfo' => ['int', 'set' => 'array', '&w_siginfo=' => 'array'], 'pcntl_strerror' => ['string', 'errno' => 'int'], 'pcntl_wait' => ['int', '&w_status' => 'int', 'options=' => 'int', '&w_rusage=' => 'array'], 'pcntl_waitpid' => ['int', 'pid' => 'int', '&w_status' => 'int', 'options=' => 'int', '&w_rusage=' => 'array'], 'pcntl_wexitstatus' => ['int', 'status' => 'int'], 'pcntl_wifcontinued' => ['bool', 'status' => 'int'], 'pcntl_wifexited' => ['bool', 'status' => 'int'], 'pcntl_wifsignaled' => ['bool', 'status' => 'int'], 'pcntl_wifstopped' => ['bool', 'status' => 'int'], 'pcntl_wstopsig' => ['int', 'status' => 'int'], 'pcntl_wtermsig' => ['int', 'status' => 'int'], 'PDF_activate_item' => ['bool', 'pdfdoc' => 'resource', 'id' => 'int'], 'PDF_add_launchlink' => ['bool', 'pdfdoc' => 'resource', 'llx' => 'float', 'lly' => 'float', 'urx' => 'float', 'ury' => 'float', 'filename' => 'string'], 'PDF_add_locallink' => ['bool', 'pdfdoc' => 'resource', 'lowerleftx' => 'float', 'lowerlefty' => 'float', 'upperrightx' => 'float', 'upperrighty' => 'float', 'page' => 'int', 'dest' => 'string'], 'PDF_add_nameddest' => ['bool', 'pdfdoc' => 'resource', 'name' => 'string', 'optlist' => 'string'], 'PDF_add_note' => ['bool', 'pdfdoc' => 'resource', 'llx' => 'float', 'lly' => 'float', 'urx' => 'float', 'ury' => 'float', 'contents' => 'string', 'title' => 'string', 'icon' => 'string', 'open' => 'int'], 'PDF_add_pdflink' => ['bool', 'pdfdoc' => 'resource', 'bottom_left_x' => 'float', 'bottom_left_y' => 'float', 'up_right_x' => 'float', 'up_right_y' => 'float', 'filename' => 'string', 'page' => 'int', 'dest' => 'string'], 'PDF_add_table_cell' => ['int', 'pdfdoc' => 'resource', 'table' => 'int', 'column' => 'int', 'row' => 'int', 'text' => 'string', 'optlist' => 'string'], 'PDF_add_textflow' => ['int', 'pdfdoc' => 'resource', 'textflow' => 'int', 'text' => 'string', 'optlist' => 'string'], 'PDF_add_thumbnail' => ['bool', 'pdfdoc' => 'resource', 'image' => 'int'], 'PDF_add_weblink' => ['bool', 'pdfdoc' => 'resource', 'lowerleftx' => 'float', 'lowerlefty' => 'float', 'upperrightx' => 'float', 'upperrighty' => 'float', 'url' => 'string'], 'PDF_arc' => ['bool', 'p' => 'resource', 'x' => 'float', 'y' => 'float', 'r' => 'float', 'alpha' => 'float', 'beta' => 'float'], 'PDF_arcn' => ['bool', 'p' => 'resource', 'x' => 'float', 'y' => 'float', 'r' => 'float', 'alpha' => 'float', 'beta' => 'float'], 'PDF_attach_file' => ['bool', 'pdfdoc' => 'resource', 'llx' => 'float', 'lly' => 'float', 'urx' => 'float', 'ury' => 'float', 'filename' => 'string', 'description' => 'string', 'author' => 'string', 'mimetype' => 'string', 'icon' => 'string'], 'PDF_begin_document' => ['int', 'pdfdoc' => 'resource', 'filename' => 'string', 'optlist' => 'string'], 'PDF_begin_font' => ['bool', 'pdfdoc' => 'resource', 'filename' => 'string', 'a' => 'float', 'b' => 'float', 'c' => 'float', 'd' => 'float', 'e' => 'float', 'f' => 'float', 'optlist' => 'string'], 'PDF_begin_glyph' => ['bool', 'pdfdoc' => 'resource', 'glyphname' => 'string', 'wx' => 'float', 'llx' => 'float', 'lly' => 'float', 'urx' => 'float', 'ury' => 'float'], 'PDF_begin_item' => ['int', 'pdfdoc' => 'resource', 'tag' => 'string', 'optlist' => 'string'], 'PDF_begin_layer' => ['bool', 'pdfdoc' => 'resource', 'layer' => 'int'], 'PDF_begin_page' => ['bool', 'pdfdoc' => 'resource', 'width' => 'float', 'height' => 'float'], 'PDF_begin_page_ext' => ['bool', 'pdfdoc' => 'resource', 'width' => 'float', 'height' => 'float', 'optlist' => 'string'], 'PDF_begin_pattern' => ['int', 'pdfdoc' => 'resource', 'width' => 'float', 'height' => 'float', 'xstep' => 'float', 'ystep' => 'float', 'painttype' => 'int'], 'PDF_begin_template' => ['int', 'pdfdoc' => 'resource', 'width' => 'float', 'height' => 'float'], 'PDF_begin_template_ext' => ['int', 'pdfdoc' => 'resource', 'width' => 'float', 'height' => 'float', 'optlist' => 'string'], 'PDF_circle' => ['bool', 'pdfdoc' => 'resource', 'x' => 'float', 'y' => 'float', 'r' => 'float'], 'PDF_clip' => ['bool', 'p' => 'resource'], 'PDF_close' => ['bool', 'p' => 'resource'], 'PDF_close_image' => ['bool', 'p' => 'resource', 'image' => 'int'], 'PDF_close_pdi' => ['bool', 'p' => 'resource', 'doc' => 'int'], 'PDF_close_pdi_page' => ['bool', 'p' => 'resource', 'page' => 'int'], 'PDF_closepath' => ['bool', 'p' => 'resource'], 'PDF_closepath_fill_stroke' => ['bool', 'p' => 'resource'], 'PDF_closepath_stroke' => ['bool', 'p' => 'resource'], 'PDF_concat' => ['bool', 'p' => 'resource', 'a' => 'float', 'b' => 'float', 'c' => 'float', 'd' => 'float', 'e' => 'float', 'f' => 'float'], 'PDF_continue_text' => ['bool', 'p' => 'resource', 'text' => 'string'], 'PDF_create_3dview' => ['int', 'pdfdoc' => 'resource', 'username' => 'string', 'optlist' => 'string'], 'PDF_create_action' => ['int', 'pdfdoc' => 'resource', 'type' => 'string', 'optlist' => 'string'], 'PDF_create_annotation' => ['bool', 'pdfdoc' => 'resource', 'llx' => 'float', 'lly' => 'float', 'urx' => 'float', 'ury' => 'float', 'type' => 'string', 'optlist' => 'string'], 'PDF_create_bookmark' => ['int', 'pdfdoc' => 'resource', 'text' => 'string', 'optlist' => 'string'], 'PDF_create_field' => ['bool', 'pdfdoc' => 'resource', 'llx' => 'float', 'lly' => 'float', 'urx' => 'float', 'ury' => 'float', 'name' => 'string', 'type' => 'string', 'optlist' => 'string'], 'PDF_create_fieldgroup' => ['bool', 'pdfdoc' => 'resource', 'name' => 'string', 'optlist' => 'string'], 'PDF_create_gstate' => ['int', 'pdfdoc' => 'resource', 'optlist' => 'string'], 'PDF_create_pvf' => ['bool', 'pdfdoc' => 'resource', 'filename' => 'string', 'data' => 'string', 'optlist' => 'string'], 'PDF_create_textflow' => ['int', 'pdfdoc' => 'resource', 'text' => 'string', 'optlist' => 'string'], 'PDF_curveto' => ['bool', 'p' => 'resource', 'x1' => 'float', 'y1' => 'float', 'x2' => 'float', 'y2' => 'float', 'x3' => 'float', 'y3' => 'float'], 'PDF_define_layer' => ['int', 'pdfdoc' => 'resource', 'name' => 'string', 'optlist' => 'string'], 'PDF_delete' => ['bool', 'pdfdoc' => 'resource'], 'PDF_delete_pvf' => ['int', 'pdfdoc' => 'resource', 'filename' => 'string'], 'PDF_delete_table' => ['bool', 'pdfdoc' => 'resource', 'table' => 'int', 'optlist' => 'string'], 'PDF_delete_textflow' => ['bool', 'pdfdoc' => 'resource', 'textflow' => 'int'], 'PDF_encoding_set_char' => ['bool', 'pdfdoc' => 'resource', 'encoding' => 'string', 'slot' => 'int', 'glyphname' => 'string', 'uv' => 'int'], 'PDF_end_document' => ['bool', 'pdfdoc' => 'resource', 'optlist' => 'string'], 'PDF_end_font' => ['bool', 'pdfdoc' => 'resource'], 'PDF_end_glyph' => ['bool', 'pdfdoc' => 'resource'], 'PDF_end_item' => ['bool', 'pdfdoc' => 'resource', 'id' => 'int'], 'PDF_end_layer' => ['bool', 'pdfdoc' => 'resource'], 'PDF_end_page' => ['bool', 'p' => 'resource'], 'PDF_end_page_ext' => ['bool', 'pdfdoc' => 'resource', 'optlist' => 'string'], 'PDF_end_pattern' => ['bool', 'p' => 'resource'], 'PDF_end_template' => ['bool', 'p' => 'resource'], 'PDF_endpath' => ['bool', 'p' => 'resource'], 'PDF_fill' => ['bool', 'p' => 'resource'], 'PDF_fill_imageblock' => ['int', 'pdfdoc' => 'resource', 'page' => 'int', 'blockname' => 'string', 'image' => 'int', 'optlist' => 'string'], 'PDF_fill_pdfblock' => ['int', 'pdfdoc' => 'resource', 'page' => 'int', 'blockname' => 'string', 'contents' => 'int', 'optlist' => 'string'], 'PDF_fill_stroke' => ['bool', 'p' => 'resource'], 'PDF_fill_textblock' => ['int', 'pdfdoc' => 'resource', 'page' => 'int', 'blockname' => 'string', 'text' => 'string', 'optlist' => 'string'], 'PDF_findfont' => ['int', 'p' => 'resource', 'fontname' => 'string', 'encoding' => 'string', 'embed' => 'int'], 'PDF_fit_image' => ['bool', 'pdfdoc' => 'resource', 'image' => 'int', 'x' => 'float', 'y' => 'float', 'optlist' => 'string'], 'PDF_fit_pdi_page' => ['bool', 'pdfdoc' => 'resource', 'page' => 'int', 'x' => 'float', 'y' => 'float', 'optlist' => 'string'], 'PDF_fit_table' => ['string', 'pdfdoc' => 'resource', 'table' => 'int', 'llx' => 'float', 'lly' => 'float', 'urx' => 'float', 'ury' => 'float', 'optlist' => 'string'], 'PDF_fit_textflow' => ['string', 'pdfdoc' => 'resource', 'textflow' => 'int', 'llx' => 'float', 'lly' => 'float', 'urx' => 'float', 'ury' => 'float', 'optlist' => 'string'], 'PDF_fit_textline' => ['bool', 'pdfdoc' => 'resource', 'text' => 'string', 'x' => 'float', 'y' => 'float', 'optlist' => 'string'], 'PDF_get_apiname' => ['string', 'pdfdoc' => 'resource'], 'PDF_get_buffer' => ['string', 'p' => 'resource'], 'PDF_get_errmsg' => ['string', 'pdfdoc' => 'resource'], 'PDF_get_errnum' => ['int', 'pdfdoc' => 'resource'], 'PDF_get_majorversion' => ['int'], 'PDF_get_minorversion' => ['int'], 'PDF_get_parameter' => ['string', 'p' => 'resource', 'key' => 'string', 'modifier' => 'float'], 'PDF_get_pdi_parameter' => ['string', 'p' => 'resource', 'key' => 'string', 'doc' => 'int', 'page' => 'int', 'reserved' => 'int'], 'PDF_get_pdi_value' => ['float', 'p' => 'resource', 'key' => 'string', 'doc' => 'int', 'page' => 'int', 'reserved' => 'int'], 'PDF_get_value' => ['float', 'p' => 'resource', 'key' => 'string', 'modifier' => 'float'], 'PDF_info_font' => ['float', 'pdfdoc' => 'resource', 'font' => 'int', 'keyword' => 'string', 'optlist' => 'string'], 'PDF_info_matchbox' => ['float', 'pdfdoc' => 'resource', 'boxname' => 'string', 'num' => 'int', 'keyword' => 'string'], 'PDF_info_table' => ['float', 'pdfdoc' => 'resource', 'table' => 'int', 'keyword' => 'string'], 'PDF_info_textflow' => ['float', 'pdfdoc' => 'resource', 'textflow' => 'int', 'keyword' => 'string'], 'PDF_info_textline' => ['float', 'pdfdoc' => 'resource', 'text' => 'string', 'keyword' => 'string', 'optlist' => 'string'], 'PDF_initgraphics' => ['bool', 'p' => 'resource'], 'PDF_lineto' => ['bool', 'p' => 'resource', 'x' => 'float', 'y' => 'float'], 'PDF_load_3ddata' => ['int', 'pdfdoc' => 'resource', 'filename' => 'string', 'optlist' => 'string'], 'PDF_load_font' => ['int', 'pdfdoc' => 'resource', 'fontname' => 'string', 'encoding' => 'string', 'optlist' => 'string'], 'PDF_load_iccprofile' => ['int', 'pdfdoc' => 'resource', 'profilename' => 'string', 'optlist' => 'string'], 'PDF_load_image' => ['int', 'pdfdoc' => 'resource', 'imagetype' => 'string', 'filename' => 'string', 'optlist' => 'string'], 'PDF_makespotcolor' => ['int', 'p' => 'resource', 'spotname' => 'string'], 'PDF_moveto' => ['bool', 'p' => 'resource', 'x' => 'float', 'y' => 'float'], 'PDF_new' => ['resource'], 'PDF_open_ccitt' => ['int', 'pdfdoc' => 'resource', 'filename' => 'string', 'width' => 'int', 'height' => 'int', 'bitreverse' => 'int', 'k' => 'int', 'blackls1' => 'int'], 'PDF_open_file' => ['bool', 'p' => 'resource', 'filename' => 'string'], 'PDF_open_image' => ['int', 'p' => 'resource', 'imagetype' => 'string', 'source' => 'string', 'data' => 'string', 'length' => 'int', 'width' => 'int', 'height' => 'int', 'components' => 'int', 'bpc' => 'int', 'params' => 'string'], 'PDF_open_image_file' => ['int', 'p' => 'resource', 'imagetype' => 'string', 'filename' => 'string', 'stringparam' => 'string', 'intparam' => 'int'], 'PDF_open_memory_image' => ['int', 'p' => 'resource', 'image' => 'resource'], 'PDF_open_pdi' => ['int', 'pdfdoc' => 'resource', 'filename' => 'string', 'optlist' => 'string', 'len' => 'int'], 'PDF_open_pdi_document' => ['int', 'p' => 'resource', 'filename' => 'string', 'optlist' => 'string'], 'PDF_open_pdi_page' => ['int', 'p' => 'resource', 'doc' => 'int', 'pagenumber' => 'int', 'optlist' => 'string'], 'PDF_pcos_get_number' => ['float', 'p' => 'resource', 'doc' => 'int', 'path' => 'string'], 'PDF_pcos_get_stream' => ['string', 'p' => 'resource', 'doc' => 'int', 'optlist' => 'string', 'path' => 'string'], 'PDF_pcos_get_string' => ['string', 'p' => 'resource', 'doc' => 'int', 'path' => 'string'], 'PDF_place_image' => ['bool', 'pdfdoc' => 'resource', 'image' => 'int', 'x' => 'float', 'y' => 'float', 'scale' => 'float'], 'PDF_place_pdi_page' => ['bool', 'pdfdoc' => 'resource', 'page' => 'int', 'x' => 'float', 'y' => 'float', 'sx' => 'float', 'sy' => 'float'], 'PDF_process_pdi' => ['int', 'pdfdoc' => 'resource', 'doc' => 'int', 'page' => 'int', 'optlist' => 'string'], 'PDF_rect' => ['bool', 'p' => 'resource', 'x' => 'float', 'y' => 'float', 'width' => 'float', 'height' => 'float'], 'PDF_restore' => ['bool', 'p' => 'resource'], 'PDF_resume_page' => ['bool', 'pdfdoc' => 'resource', 'optlist' => 'string'], 'PDF_rotate' => ['bool', 'p' => 'resource', 'phi' => 'float'], 'PDF_save' => ['bool', 'p' => 'resource'], 'PDF_scale' => ['bool', 'p' => 'resource', 'sx' => 'float', 'sy' => 'float'], 'PDF_set_border_color' => ['bool', 'p' => 'resource', 'red' => 'float', 'green' => 'float', 'blue' => 'float'], 'PDF_set_border_dash' => ['bool', 'pdfdoc' => 'resource', 'black' => 'float', 'white' => 'float'], 'PDF_set_border_style' => ['bool', 'pdfdoc' => 'resource', 'style' => 'string', 'width' => 'float'], 'PDF_set_gstate' => ['bool', 'pdfdoc' => 'resource', 'gstate' => 'int'], 'PDF_set_info' => ['bool', 'p' => 'resource', 'key' => 'string', 'value' => 'string'], 'PDF_set_layer_dependency' => ['bool', 'pdfdoc' => 'resource', 'type' => 'string', 'optlist' => 'string'], 'PDF_set_parameter' => ['bool', 'p' => 'resource', 'key' => 'string', 'value' => 'string'], 'PDF_set_text_pos' => ['bool', 'p' => 'resource', 'x' => 'float', 'y' => 'float'], 'PDF_set_value' => ['bool', 'p' => 'resource', 'key' => 'string', 'value' => 'float'], 'PDF_setcolor' => ['bool', 'p' => 'resource', 'fstype' => 'string', 'colorspace' => 'string', 'c1' => 'float', 'c2' => 'float', 'c3' => 'float', 'c4' => 'float'], 'PDF_setdash' => ['bool', 'pdfdoc' => 'resource', 'b' => 'float', 'w' => 'float'], 'PDF_setdashpattern' => ['bool', 'pdfdoc' => 'resource', 'optlist' => 'string'], 'PDF_setflat' => ['bool', 'pdfdoc' => 'resource', 'flatness' => 'float'], 'PDF_setfont' => ['bool', 'pdfdoc' => 'resource', 'font' => 'int', 'fontsize' => 'float'], 'PDF_setgray' => ['bool', 'p' => 'resource', 'g' => 'float'], 'PDF_setgray_fill' => ['bool', 'p' => 'resource', 'g' => 'float'], 'PDF_setgray_stroke' => ['bool', 'p' => 'resource', 'g' => 'float'], 'PDF_setlinecap' => ['bool', 'p' => 'resource', 'linecap' => 'int'], 'PDF_setlinejoin' => ['bool', 'p' => 'resource', 'value' => 'int'], 'PDF_setlinewidth' => ['bool', 'p' => 'resource', 'width' => 'float'], 'PDF_setmatrix' => ['bool', 'p' => 'resource', 'a' => 'float', 'b' => 'float', 'c' => 'float', 'd' => 'float', 'e' => 'float', 'f' => 'float'], 'PDF_setmiterlimit' => ['bool', 'pdfdoc' => 'resource', 'miter' => 'float'], 'PDF_setrgbcolor' => ['bool', 'p' => 'resource', 'red' => 'float', 'green' => 'float', 'blue' => 'float'], 'PDF_setrgbcolor_fill' => ['bool', 'p' => 'resource', 'red' => 'float', 'green' => 'float', 'blue' => 'float'], 'PDF_setrgbcolor_stroke' => ['bool', 'p' => 'resource', 'red' => 'float', 'green' => 'float', 'blue' => 'float'], 'PDF_shading' => ['int', 'pdfdoc' => 'resource', 'shtype' => 'string', 'x0' => 'float', 'y0' => 'float', 'x1' => 'float', 'y1' => 'float', 'c1' => 'float', 'c2' => 'float', 'c3' => 'float', 'c4' => 'float', 'optlist' => 'string'], 'PDF_shading_pattern' => ['int', 'pdfdoc' => 'resource', 'shading' => 'int', 'optlist' => 'string'], 'PDF_shfill' => ['bool', 'pdfdoc' => 'resource', 'shading' => 'int'], 'PDF_show' => ['bool', 'pdfdoc' => 'resource', 'text' => 'string'], 'PDF_show_boxed' => ['int', 'p' => 'resource', 'text' => 'string', 'left' => 'float', 'top' => 'float', 'width' => 'float', 'height' => 'float', 'mode' => 'string', 'feature' => 'string'], 'PDF_show_xy' => ['bool', 'p' => 'resource', 'text' => 'string', 'x' => 'float', 'y' => 'float'], 'PDF_skew' => ['bool', 'p' => 'resource', 'alpha' => 'float', 'beta' => 'float'], 'PDF_stringwidth' => ['float', 'p' => 'resource', 'text' => 'string', 'font' => 'int', 'fontsize' => 'float'], 'PDF_stroke' => ['bool', 'p' => 'resource'], 'PDF_suspend_page' => ['bool', 'pdfdoc' => 'resource', 'optlist' => 'string'], 'PDF_translate' => ['bool', 'p' => 'resource', 'tx' => 'float', 'ty' => 'float'], 'PDF_utf16_to_utf8' => ['string', 'pdfdoc' => 'resource', 'utf16string' => 'string'], 'PDF_utf32_to_utf16' => ['string', 'pdfdoc' => 'resource', 'utf32string' => 'string', 'ordering' => 'string'], 'PDF_utf8_to_utf16' => ['string', 'pdfdoc' => 'resource', 'utf8string' => 'string', 'ordering' => 'string'], 'PDO::__construct' => ['void', 'dsn' => 'string', 'username=' => '?string', 'passwd=' => '?string', 'options=' => '?array'], 'PDO::__sleep' => ['int'], 'PDO::__wakeup' => ['void'], 'PDO::beginTransaction' => ['bool'], 'PDO::commit' => ['bool'], 'PDO::cubrid_schema' => ['array', 'schema_type' => 'int', 'table_name=' => 'string', 'col_name=' => 'string'], 'PDO::errorCode' => ['string'], 'PDO::errorInfo' => ['array'], 'PDO::exec' => ['int', 'query' => 'string'], 'PDO::getAttribute' => ['', 'attribute' => 'int'], 'PDO::getAvailableDrivers' => ['array'], 'PDO::inTransaction' => ['bool'], 'PDO::lastInsertId' => ['string', 'seqname=' => 'string'], 'PDO::pgsqlCopyFromArray' => ['bool', 'table_name' => 'string', 'rows' => 'array', 'delimiter' => 'string', 'null_as' => 'string', 'fields' => 'string'], 'PDO::pgsqlCopyFromFile' => ['bool', 'table_name' => 'string', 'filename' => 'string', 'delimiter' => 'string', 'null_as' => 'string', 'fields' => 'string'], 'PDO::pgsqlCopyToArray' => ['array', 'table_name' => 'string', 'delimiter' => 'string', 'null_as' => 'string', 'fields' => 'string'], 'PDO::pgsqlCopyToFile' => ['bool', 'table_name' => 'string', 'filename' => 'string', 'delimiter' => 'string', 'null_as' => 'string', 'fields' => 'string'], 'PDO::pgsqlGetNotify' => ['array', 'result_type' => 'int', 'ms_timeout' => 'int'], 'PDO::pgsqlGetPid' => ['int'], 'PDO::pgsqlLOBCreate' => ['string'], 'PDO::pgsqlLOBOpen' => ['resource', 'oid' => 'string', 'mode=' => 'string'], 'PDO::pgsqlLOBUnlink' => ['bool', 'oid' => 'string'], 'PDO::prepare' => ['PDOStatement', 'statement' => 'string', 'options=' => 'array'], 'PDO::query' => ['PDOStatement|false', 'sql' => 'string'], 'PDO::query\'1' => ['PDOStatement|false', 'sql' => 'string', 'fetch_column' => 'int', 'colno' => 'int'], 'PDO::query\'2' => ['PDOStatement|false', 'sql' => 'string', 'fetch_class' => 'int', 'classname' => 'string', 'ctorargs' => 'array'], 'PDO::query\'3' => ['PDOStatement|false', 'sql' => 'string', 'fetch_into' => 'int', 'object' => 'object'], 'PDO::quote' => ['string', 'string' => 'string', 'paramtype=' => 'int'], 'PDO::rollBack' => ['bool'], 'PDO::setAttribute' => ['bool', 'attribute' => 'int', 'value' => ''], 'PDO::sqliteCreateAggregate' => ['bool', 'function_name' => 'string', 'step_func' => 'callable', 'finalize_func' => 'callable', 'num_args=' => 'int'], 'PDO::sqliteCreateCollation' => ['bool', 'name' => 'string', 'callback' => 'callable'], 'PDO::sqliteCreateFunction' => ['bool', 'function_name' => 'string', 'callback' => 'callable', 'num_args=' => 'int'], 'pdo_drivers' => ['array'], 'PDOException::getCode' => [''], 'PDOException::getFile' => [''], 'PDOException::getLine' => [''], 'PDOException::getMessage' => [''], 'PDOException::getPrevious' => [''], 'PDOException::getTrace' => [''], 'PDOException::getTraceAsString' => [''], 'PDOStatement::__sleep' => ['int'], 'PDOStatement::__wakeup' => ['void'], 'PDOStatement::bindColumn' => ['bool', 'column' => 'mixed', '&rw_param' => 'mixed', 'type=' => 'int', 'maxlen=' => 'int', 'driverdata=' => 'mixed'], 'PDOStatement::bindParam' => ['bool', 'paramno' => 'mixed', '&rw_param' => 'mixed', 'type=' => 'int', 'maxlen=' => 'int', 'driverdata=' => 'mixed'], 'PDOStatement::bindValue' => ['bool', 'paramno' => 'mixed', 'param' => 'mixed', 'type=' => 'int'], 'PDOStatement::closeCursor' => ['bool'], 'PDOStatement::columnCount' => ['int'], 'PDOStatement::debugDumpParams' => ['void'], 'PDOStatement::errorCode' => ['string'], 'PDOStatement::errorInfo' => ['array'], 'PDOStatement::execute' => ['bool', 'bound_input_params=' => '?array'], 'PDOStatement::fetch' => ['mixed', 'how=' => 'int', 'orientation=' => 'int', 'offset=' => 'int'], 'PDOStatement::fetchAll' => ['array|false', 'how=' => 'int', 'fetch_argument=' => 'int|string|callable', 'ctor_args=' => '?array'], 'PDOStatement::fetchColumn' => ['string|null|false', 'column_number=' => 'int'], 'PDOStatement::fetchObject' => ['mixed', 'class_name=' => 'string', 'ctor_args=' => '?array'], 'PDOStatement::getAttribute' => ['mixed', 'attribute' => 'int'], 'PDOStatement::getColumnMeta' => ['array', 'column' => 'int'], 'PDOStatement::nextRowset' => ['bool'], 'PDOStatement::rowCount' => ['int'], 'PDOStatement::setAttribute' => ['bool', 'attribute' => 'int', 'value' => 'mixed'], 'PDOStatement::setFetchMode' => ['bool', 'mode' => 'int'], 'PDOStatement::setFetchMode\'1' => ['bool', 'fetch_column' => 'int', 'colno' => 'int'], 'PDOStatement::setFetchMode\'2' => ['bool', 'fetch_class' => 'int', 'classname' => 'string', 'ctorargs' => 'array'], 'PDOStatement::setFetchMode\'3' => ['bool', 'fetch_into' => 'int', 'object' => 'object'], 'pfsockopen' => ['resource', 'hostname' => 'string', 'port=' => 'int', '&w_errno=' => 'int', '&w_errstr=' => 'string', 'timeout=' => 'float'], 'pg_affected_rows' => ['int', 'result' => 'resource'], 'pg_cancel_query' => ['bool', 'connection' => 'resource'], 'pg_client_encoding' => ['string', 'connection=' => 'resource'], 'pg_close' => ['bool', 'connection=' => 'resource'], 'pg_connect' => ['resource|false', 'connection_string' => 'string', 'connect_type=' => 'int'], 'pg_connect_poll' => ['int', 'connection' => 'resource'], 'pg_connection_busy' => ['bool', 'connection' => 'resource'], 'pg_connection_reset' => ['bool', 'connection' => 'resource'], 'pg_connection_status' => ['int', 'connection' => 'resource'], 'pg_consume_input' => ['bool', 'connection' => 'resource'], 'pg_convert' => ['array', 'db' => 'resource', 'table' => 'string', 'values' => 'array', 'options=' => 'int'], 'pg_copy_from' => ['bool', 'connection' => 'resource', 'table_name' => 'string', 'rows' => 'array', 'delimiter=' => 'string', 'null_as=' => 'string'], 'pg_copy_to' => ['array', 'connection' => 'resource', 'table_name' => 'string', 'delimiter=' => 'string', 'null_as=' => 'string'], 'pg_dbname' => ['string', 'connection=' => 'resource'], 'pg_delete' => ['mixed', 'db' => 'resource', 'table' => 'string', 'ids' => 'array', 'options=' => 'int'], 'pg_end_copy' => ['bool', 'connection=' => 'resource'], 'pg_escape_bytea' => ['string', 'connection' => 'resource', 'data' => 'string'], 'pg_escape_bytea\'1' => ['string', 'data' => 'string'], 'pg_escape_identifier' => ['string', 'connection' => 'resource', 'data' => 'string'], 'pg_escape_identifier\'1' => ['string', 'data' => 'string'], 'pg_escape_literal' => ['string', 'connection' => 'resource', 'data' => 'string'], 'pg_escape_literal\'1' => ['string', 'data' => 'string'], 'pg_escape_string' => ['string', 'connection' => 'resource', 'data' => 'string'], 'pg_escape_string\'1' => ['string', 'data' => 'string'], 'pg_execute' => ['resource|false', 'connection' => 'resource', 'stmtname' => 'string', 'params' => 'array'], 'pg_execute\'1' => ['resource|false', 'stmtname' => 'string', 'params' => 'array'], 'pg_fetch_all' => ['array|false', 'result' => 'resource', 'result_type=' => 'int'], 'pg_fetch_all_columns' => ['array|false', 'result' => 'resource', 'column_number=' => 'int'], 'pg_fetch_array' => ['array|false', 'result' => 'resource', 'row=' => '?int', 'result_type=' => 'int'], 'pg_fetch_assoc' => ['array|false', 'result' => 'resource', 'row=' => '?int'], 'pg_fetch_object' => ['object', 'result' => '', 'row=' => '?int', 'result_type=' => 'int'], 'pg_fetch_object\'1' => ['object', 'result' => '', 'row=' => '?int', 'class_name=' => 'string', 'ctor_params=' => 'array'], 'pg_fetch_result' => ['', 'result' => '', 'field_name' => 'string|int'], 'pg_fetch_result\'1' => ['', 'result' => '', 'row_number' => 'int', 'field_name' => 'string|int'], 'pg_fetch_row' => ['array', 'result' => 'resource', 'row=' => '?int', 'result_type=' => 'int'], 'pg_field_is_null' => ['int', 'result' => '', 'field_name_or_number' => 'string|int'], 'pg_field_is_null\'1' => ['int', 'result' => '', 'row' => 'int', 'field_name_or_number' => 'string|int'], 'pg_field_name' => ['string', 'result' => 'resource', 'field_number' => 'int'], 'pg_field_num' => ['int', 'result' => 'resource', 'field_name' => 'string'], 'pg_field_prtlen' => ['int', 'result' => '', 'field_name_or_number' => ''], 'pg_field_prtlen\'1' => ['int', 'result' => '', 'row' => 'int', 'field_name_or_number' => 'string|int'], 'pg_field_size' => ['int', 'result' => 'resource', 'field_number' => 'int'], 'pg_field_table' => ['mixed', 'result' => 'resource', 'field_number' => 'int', 'oid_only=' => 'bool'], 'pg_field_type' => ['string', 'result' => 'resource', 'field_number' => 'int'], 'pg_field_type_oid' => ['int|false', 'result' => 'resource', 'field_number' => 'int'], 'pg_flush' => ['mixed', 'connection' => 'resource'], 'pg_free_result' => ['bool', 'result' => 'resource'], 'pg_get_notify' => ['array', 'connection' => 'resource', 'result_type=' => 'int'], 'pg_get_pid' => ['int|false', 'connection' => 'resource'], 'pg_get_result' => ['resource|false', 'connection=' => 'resource'], 'pg_host' => ['string', 'connection=' => 'resource'], 'pg_insert' => ['mixed', 'db' => 'resource', 'table' => 'string', 'values' => 'array', 'options=' => 'int'], 'pg_last_error' => ['string', 'connection=' => 'resource', 'operation=' => 'int'], 'pg_last_notice' => ['string', 'connection' => 'resource', 'option=' => 'int'], 'pg_last_oid' => ['string', 'result' => 'resource'], 'pg_lo_close' => ['bool', 'large_object' => 'resource'], 'pg_lo_create' => ['int', 'connection=' => 'resource', 'large_object_oid=' => ''], 'pg_lo_export' => ['bool', 'connection' => 'resource', 'oid' => 'int', 'filename' => 'string'], 'pg_lo_export\'1' => ['bool', 'oid' => 'int', 'pathname' => 'string'], 'pg_lo_import' => ['int', 'connection' => 'resource', 'pathname' => 'string', 'oid' => ''], 'pg_lo_import\'1' => ['int', 'pathname' => 'string', 'oid' => ''], 'pg_lo_open' => ['resource|false', 'connection' => 'resource', 'oid' => 'int', 'mode' => 'string'], 'pg_lo_read' => ['string', 'large_object' => 'resource', 'len=' => 'int'], 'pg_lo_read_all' => ['int', 'large_object' => 'resource'], 'pg_lo_seek' => ['bool', 'large_object' => 'resource', 'offset' => 'int', 'whence=' => 'int'], 'pg_lo_tell' => ['int', 'large_object' => 'resource'], 'pg_lo_truncate' => ['bool', 'large_object' => 'resource', 'size' => 'int'], 'pg_lo_unlink' => ['bool', 'connection' => 'resource', 'oid' => 'int'], 'pg_lo_write' => ['int', 'large_object' => 'resource', 'data' => 'string', 'len=' => 'int'], 'pg_meta_data' => ['array', 'db' => 'resource', 'table' => 'string', 'extended=' => 'bool'], 'pg_num_fields' => ['int', 'result' => 'resource'], 'pg_num_rows' => ['int', 'result' => 'resource'], 'pg_options' => ['string', 'connection=' => 'resource'], 'pg_parameter_status' => ['string|false', 'connection' => 'resource', 'param_name' => 'string'], 'pg_parameter_status\'1' => ['string|false', 'param_name' => 'string'], 'pg_pconnect' => ['resource|false', 'connection_string' => 'string', 'host=' => 'string', 'port=' => 'string|int', 'options=' => 'string', 'tty=' => 'string', 'database=' => 'string'], 'pg_ping' => ['bool', 'connection=' => 'resource'], 'pg_port' => ['int', 'connection=' => 'resource'], 'pg_prepare' => ['resource|false', 'connection' => 'resource', 'stmtname' => 'string', 'query' => 'string'], 'pg_prepare\'1' => ['resource|false', 'stmtname' => 'string', 'query' => 'string'], 'pg_put_line' => ['bool', 'connection' => 'resource', 'data' => 'string'], 'pg_put_line\'1' => ['bool', 'data' => 'string'], 'pg_query' => ['resource|false', 'connection' => 'resource', 'query' => 'string'], 'pg_query\'1' => ['resource|false', 'query' => 'string'], 'pg_query_params' => ['resource|false', 'connection' => 'resource', 'query' => 'string', 'params' => 'array'], 'pg_query_params\'1' => ['resource|false', 'query' => 'string', 'params' => 'array'], 'pg_result_error' => ['string|false', 'result' => 'resource'], 'pg_result_error_field' => ['string|?false', 'result' => 'resource', 'fieldcode' => 'int'], 'pg_result_seek' => ['bool', 'result' => 'resource', 'offset' => 'int'], 'pg_result_status' => ['mixed', 'result' => 'resource', 'result_type=' => 'int'], 'pg_select' => ['mixed', 'db' => 'resource', 'table' => 'string', 'ids' => 'array', 'options=' => 'int', 'result_type=' => 'int'], 'pg_send_execute' => ['bool', 'connection' => 'resource', 'stmtname' => 'string', 'params' => 'array'], 'pg_send_prepare' => ['bool', 'connection' => 'resource', 'stmtname' => 'string', 'query' => 'string'], 'pg_send_query' => ['bool', 'connection' => 'resource', 'query' => 'string'], 'pg_send_query_params' => ['bool', 'connection' => 'resource', 'query' => 'string', 'params' => 'array'], 'pg_set_client_encoding' => ['int', 'connection' => 'resource', 'encoding' => 'string'], 'pg_set_client_encoding\'1' => ['int', 'encoding' => 'string'], 'pg_set_error_verbosity' => ['int', 'connection' => 'resource', 'verbosity' => 'int'], 'pg_set_error_verbosity\'1' => ['int', 'verbosity' => 'int'], 'pg_socket' => ['resource|false', 'connection' => 'resource'], 'pg_trace' => ['bool', 'filename' => 'string', 'mode=' => 'string', 'connection=' => 'resource'], 'pg_transaction_status' => ['int', 'connection' => 'resource'], 'pg_tty' => ['string', 'connection=' => 'resource'], 'pg_tty\'1' => ['string'], 'pg_unescape_bytea' => ['string', 'data' => 'string'], 'pg_untrace' => ['bool', 'connection=' => 'resource'], 'pg_untrace\'1' => ['bool'], 'pg_update' => ['mixed', 'db' => 'resource', 'table' => 'string', 'fields' => 'array', 'ids' => 'array', 'options=' => 'int'], 'pg_version' => ['array', 'connection=' => 'resource'], 'Phar::__construct' => ['void', 'fname' => 'string', 'flags=' => 'int', 'alias=' => 'string'], 'Phar::addEmptyDir' => ['', 'dirname' => 'string'], 'Phar::addFile' => ['', 'file' => 'string', 'localname=' => 'string'], 'Phar::addFromString' => ['', 'localname' => 'string', 'contents' => 'string'], 'Phar::apiVersion' => ['string'], 'Phar::buildFromDirectory' => ['array', 'base_dir' => 'string', 'regex=' => 'string'], 'Phar::buildFromIterator' => ['array', 'iter' => 'iterator', 'base_directory=' => 'string'], 'Phar::canCompress' => ['bool', 'method=' => 'int'], 'Phar::canWrite' => ['bool'], 'Phar::compress' => ['object', 'compression' => 'int', 'extension=' => 'string'], 'Phar::compressAllFilesBZIP2' => ['bool'], 'Phar::compressAllFilesGZ' => ['bool'], 'Phar::compressFiles' => ['', 'compression' => 'int'], 'Phar::convertToData' => ['PharData', 'format=' => 'int', 'compression=' => 'int', 'extension=' => 'string'], 'Phar::convertToExecutable' => ['Phar', 'format=' => 'int', 'compression=' => 'int', 'extension=' => 'string'], 'Phar::copy' => ['bool', 'oldfile' => 'string', 'newfile' => 'string'], 'Phar::count' => ['int'], 'Phar::createDefaultStub' => ['string', 'indexfile=' => 'string', 'webindexfile=' => 'string'], 'Phar::decompress' => ['object', 'extension=' => 'string'], 'Phar::decompressFiles' => ['bool'], 'Phar::delete' => ['bool', 'entry' => 'string'], 'Phar::delMetadata' => ['bool'], 'Phar::extractTo' => ['bool', 'pathto' => 'string', 'files=' => 'string|array', 'overwrite=' => 'bool'], 'Phar::getAlias' => ['string'], 'Phar::getMetadata' => ['mixed'], 'Phar::getModified' => ['bool'], 'Phar::getPath' => ['string'], 'Phar::getSignature' => ['array'], 'Phar::getStub' => ['string'], 'Phar::getSupportedCompression' => ['array'], 'Phar::getSupportedSignatures' => ['array'], 'Phar::getVersion' => ['string'], 'Phar::hasMetadata' => ['bool'], 'Phar::interceptFileFuncs' => [''], 'Phar::isBuffering' => ['bool'], 'Phar::isCompressed' => [''], 'Phar::isFileFormat' => ['bool', 'format' => 'int'], 'Phar::isValidPharFilename' => ['bool', 'filename' => 'string', 'executable=' => 'bool'], 'Phar::isWritable' => ['bool'], 'Phar::loadPhar' => ['bool', 'filename' => 'string', 'alias=' => 'string'], 'Phar::mapPhar' => ['bool', 'alias=' => 'string', 'dataoffset=' => 'int'], 'Phar::mount' => ['void', 'pharpath' => 'string', 'externalpath' => 'string'], 'Phar::mungServer' => ['', 'munglist' => 'array'], 'Phar::offsetExists' => ['bool', 'offset' => 'string'], 'Phar::offsetGet' => ['int', 'offset' => 'string'], 'Phar::offsetSet' => ['', 'offset' => 'string', 'value' => 'string'], 'Phar::offsetUnset' => ['bool', 'offset' => 'string'], 'Phar::running' => ['string', 'retphar=' => 'bool'], 'Phar::setAlias' => ['bool', 'alias' => 'string'], 'Phar::setDefaultStub' => ['bool', 'index=' => 'string', 'webindex=' => 'string'], 'Phar::setMetadata' => ['', 'metadata' => ''], 'Phar::setSignatureAlgorithm' => ['', 'sigtype' => 'int', 'privatekey=' => 'string'], 'Phar::setStub' => ['bool', 'stub' => 'string', 'len=' => 'int'], 'Phar::startBuffering' => [''], 'Phar::stopBuffering' => [''], 'Phar::uncompressAllFiles' => ['bool'], 'Phar::unlinkArchive' => ['bool', 'archive' => 'string'], 'Phar::webPhar' => ['', 'alias=' => 'string', 'index=' => 'string', 'f404=' => 'string', 'mimetypes=' => 'array', 'rewrites=' => 'array'], 'PharData::__construct' => ['void', 'fname' => 'string', 'flags=' => 'int', 'alias=' => 'string', 'format=' => 'int'], 'PharData::addEmptyDir' => ['bool', 'dirname' => 'string'], 'PharData::addFile' => ['', 'file' => 'string', 'localname=' => 'string'], 'PharData::addFromString' => ['bool', 'localname' => 'string', 'contents' => 'string'], 'PharData::buildFromDirectory' => ['array', 'base_dir' => 'string', 'regex=' => 'string'], 'PharData::buildFromIterator' => ['array', 'iter' => 'iterator', 'base_directory=' => 'string'], 'PharData::compress' => ['object', 'compression' => 'int', 'extension=' => 'string'], 'PharData::compressFiles' => ['bool', 'compression' => 'int'], 'PharData::convertToData' => ['PharData', 'format=' => 'int', 'compression=' => 'int', 'extension=' => 'string'], 'PharData::convertToExecutable' => ['Phar', 'format=' => 'int', 'compression=' => 'int', 'extension=' => 'string'], 'PharData::copy' => ['bool', 'oldfile' => 'string', 'newfile' => 'string'], 'PharData::decompress' => ['object', 'extension=' => 'string'], 'PharData::decompressFiles' => ['bool'], 'PharData::delete' => ['bool', 'entry' => 'string'], 'PharData::delMetadata' => ['bool'], 'PharData::extractTo' => ['bool', 'pathto' => 'string', 'files=' => 'string|array', 'overwrite=' => 'bool'], 'PharData::isWritable' => ['bool'], 'PharData::offsetSet' => ['', 'offset' => 'string', 'value' => 'string'], 'PharData::offsetUnset' => ['bool', 'offset' => 'string'], 'PharData::setAlias' => ['bool', 'alias' => 'string'], 'PharData::setDefaultStub' => ['bool', 'index=' => 'string', 'webindex=' => 'string'], 'PharData::setStub' => ['bool', 'stub' => 'string'], 'PharFileInfo::__construct' => ['void', 'entry' => 'string'], 'PharFileInfo::chmod' => ['void', 'permissions' => 'int'], 'PharFileInfo::compress' => ['bool', 'compression' => 'int'], 'PharFileInfo::decompress' => ['bool'], 'PharFileInfo::delMetadata' => ['bool'], 'PharFileInfo::getCompressedSize' => ['int'], 'PharFileInfo::getContent' => ['string'], 'PharFileInfo::getCRC32' => ['int'], 'PharFileInfo::getMetadata' => ['mixed'], 'PharFileInfo::getPharFlags' => ['int'], 'PharFileInfo::hasMetadata' => ['bool'], 'PharFileInfo::isCompressed' => ['bool', 'compression_type=' => 'int'], 'PharFileInfo::isCompressedBZIP2' => ['bool'], 'PharFileInfo::isCompressedGZ' => ['bool'], 'PharFileInfo::isCRCChecked' => ['bool'], 'PharFileInfo::setCompressedBZIP2' => ['bool'], 'PharFileInfo::setCompressedGZ' => ['bool'], 'PharFileInfo::setMetadata' => ['void', 'metadata' => 'mixed'], 'PharFileInfo::setUncompressed' => ['bool'], 'phdfs::__construct' => ['void', 'ip' => 'string', 'port' => 'string'], 'phdfs::__destruct' => [''], 'phdfs::connect' => ['bool'], 'phdfs::copy' => ['bool', 'source_file' => 'string', 'destination_file' => 'string'], 'phdfs::create_directory' => ['bool', 'path' => 'string'], 'phdfs::delete' => ['bool', 'path' => 'string'], 'phdfs::disconnect' => ['bool'], 'phdfs::exists' => ['bool', 'path' => 'string'], 'phdfs::file_info' => ['array', 'path' => 'string'], 'phdfs::list_directory' => ['array', 'path' => 'string'], 'phdfs::read' => ['string', 'path' => 'string', 'length=' => 'string'], 'phdfs::rename' => ['bool', 'old_path' => 'string', 'new_path' => 'string'], 'phdfs::tell' => ['int', 'path' => 'string'], 'phdfs::write' => ['bool', 'path' => 'string', 'buffer' => 'string', 'mode=' => 'string'], 'php_check_syntax' => ['bool', 'filename' => 'string', 'error_message=' => 'string'], 'php_ini_loaded_file' => ['string'], 'php_ini_scanned_files' => ['string'], 'php_logo_guid' => ['string'], 'php_sapi_name' => ['string'], 'php_strip_whitespace' => ['string', 'file_name' => 'string'], 'php_uname' => ['string', 'mode=' => 'string'], 'php_user_filter::filter' => ['int', 'in' => 'resource', 'out' => 'resource', '&rw_consumed' => 'int', 'closing' => 'bool'], 'php_user_filter::onClose' => ['void'], 'php_user_filter::onCreate' => ['bool'], 'phpcredits' => ['bool', 'flag=' => 'int'], 'phpdbg_break_file' => ['', 'file' => 'string', 'line' => 'int'], 'phpdbg_break_function' => ['', 'function' => 'string'], 'phpdbg_break_method' => ['', 'class' => 'string', 'method' => 'string'], 'phpdbg_break_next' => [''], 'phpdbg_clear' => [''], 'phpdbg_color' => ['', 'element' => 'int', 'color' => 'string'], 'phpdbg_end_oplog' => ['array', 'options=' => 'array'], 'phpdbg_prompt' => ['', 'prompt' => 'string'], 'phpdbg_start_oplog' => [''], 'phpinfo' => ['bool', 'what=' => 'int'], 'phpversion' => ['string|false', 'extension=' => 'string'], 'pht\\AtomicInteger::__construct' => ['void', 'value=' => 'int'], 'pht\\AtomicInteger::dec' => ['void'], 'pht\\AtomicInteger::get' => ['int'], 'pht\\AtomicInteger::inc' => ['void'], 'pht\\AtomicInteger::lock' => ['void'], 'pht\\AtomicInteger::set' => ['void', 'value' => 'int'], 'pht\\AtomicInteger::unlock' => ['void'], 'pht\\HashTable::lock' => ['void'], 'pht\\HashTable::size' => ['int'], 'pht\\HashTable::unlock' => ['void'], 'pht\\Queue::front' => ['mixed'], 'pht\\Queue::lock' => ['void'], 'pht\\Queue::pop' => ['mixed'], 'pht\\Queue::push' => ['void', 'value' => 'mixed'], 'pht\\Queue::size' => ['int'], 'pht\\Queue::unlock' => ['void'], 'pht\\Runnable::run' => ['void'], 'pht\\Vector::__construct' => ['void', 'size=' => 'int', 'value=' => 'mixed'], 'pht\\Vector::deleteAt' => ['void', 'offset' => 'int'], 'pht\\Vector::insertAt' => ['void', 'value' => 'mixed', 'offset' => 'int'], 'pht\\Vector::lock' => ['void'], 'pht\\Vector::pop' => ['mixed'], 'pht\\Vector::push' => ['void', 'value' => 'mixed'], 'pht\\Vector::resize' => ['void', 'size' => 'int', 'value=' => 'mixed'], 'pht\\Vector::shift' => ['mixed'], 'pht\\Vector::size' => ['int'], 'pht\\Vector::unlock' => ['void'], 'pht\\Vector::unshift' => ['void', 'value' => 'mixed'], 'pht\\Vector::updateAt' => ['void', 'value' => 'mixed', 'offset' => 'int'], 'pi' => ['float'], 'png2wbmp' => ['bool', 'pngname' => 'string', 'wbmpname' => 'string', 'dest_height' => 'int', 'dest_width' => 'int', 'threshold' => 'int'], 'pointObj::__construct' => ['void'], 'pointObj::distanceToLine' => ['float', 'p1' => 'pointObj', 'p2' => 'pointObj'], 'pointObj::distanceToPoint' => ['float', 'poPoint' => 'pointObj'], 'pointObj::distanceToShape' => ['float', 'shape' => 'shapeObj'], 'pointObj::draw' => ['int', 'map' => 'MapObj', 'layer' => 'layerObj', 'img' => 'imageObj', 'class_index' => 'int', 'text' => 'string'], 'pointObj::ms_newPointObj' => ['pointObj'], 'pointObj::project' => ['int', 'in' => 'projectionObj', 'out' => 'projectionObj'], 'pointObj::setXY' => ['int', 'x' => 'float', 'y' => 'float', 'm' => 'float'], 'pointObj::setXYZ' => ['int', 'x' => 'float', 'y' => 'float', 'z' => 'float', 'm' => 'float'], 'Pool::__construct' => ['void', 'size' => 'int', 'class' => 'string', 'ctor=' => 'array'], 'Pool::collect' => ['int', 'collector' => 'Callable'], 'Pool::resize' => ['void', 'size' => 'int'], 'Pool::shutdown' => ['void'], 'Pool::submit' => ['int', 'task' => 'Threaded'], 'Pool::submitTo' => ['int', 'worker' => 'int', 'task' => 'Threaded'], 'popen' => ['resource|false', 'command' => 'string', 'mode' => 'string'], 'pos' => ['mixed', 'array_arg' => 'array'], 'posix_access' => ['bool', 'file' => 'string', 'mode=' => 'int'], 'posix_ctermid' => ['string'], 'posix_errno' => ['int'], 'posix_get_last_error' => ['int'], 'posix_getcwd' => ['string'], 'posix_getegid' => ['int'], 'posix_geteuid' => ['int'], 'posix_getgid' => ['int'], 'posix_getgrgid' => ['array', 'gid' => 'int'], 'posix_getgrnam' => ['array|false', 'groupname' => 'string'], 'posix_getgroups' => ['array'], 'posix_getlogin' => ['string'], 'posix_getpgid' => ['int|false', 'pid' => 'int'], 'posix_getpgrp' => ['int'], 'posix_getpid' => ['int'], 'posix_getppid' => ['int'], 'posix_getpwnam' => ['array|false', 'groupname' => 'string'], 'posix_getpwuid' => ['array', 'uid' => 'int'], 'posix_getrlimit' => ['array'], 'posix_getsid' => ['int', 'pid' => 'int'], 'posix_getuid' => ['int'], 'posix_initgroups' => ['bool', 'name' => 'string', 'base_group_id' => 'int'], 'posix_isatty' => ['bool', 'fd' => 'resource|int'], 'posix_kill' => ['bool', 'pid' => 'int', 'sig' => 'int'], 'posix_mkfifo' => ['bool', 'pathname' => 'string', 'mode' => 'int'], 'posix_mknod' => ['bool', 'pathname' => 'string', 'mode' => 'int', 'major=' => 'int', 'minor=' => 'int'], 'posix_setegid' => ['bool', 'uid' => 'int'], 'posix_seteuid' => ['bool', 'uid' => 'int'], 'posix_setgid' => ['bool', 'uid' => 'int'], 'posix_setpgid' => ['bool', 'pid' => 'int', 'pgid' => 'int'], 'posix_setrlimit' => ['bool', 'resource' => 'int', 'softlimit' => 'int', 'hardlimit' => 'int'], 'posix_setsid' => ['int'], 'posix_setuid' => ['bool', 'uid' => 'int'], 'posix_strerror' => ['string', 'errno' => 'int'], 'posix_times' => ['array'], 'posix_ttyname' => ['string|false', 'fd' => 'resource|int'], 'posix_uname' => ['array'], 'Postal\\Expand::expand_address' => ['string[]', 'address' => 'string', 'options=' => 'array<string, mixed>'], 'Postal\\Parser::parse_address' => ['array<string,string>', 'address' => 'string', 'options=' => 'array<string, string>'], 'pow' => ['float|int', 'base' => 'int|float', 'exponent' => 'int|float'], 'preg_filter' => ['mixed', 'regex' => 'mixed', 'replace' => 'mixed', 'subject' => 'mixed', 'limit=' => 'int', '&w_count=' => 'int'], 'preg_grep' => ['array', 'regex' => 'string', 'input' => 'array', 'flags=' => 'int'], 'preg_last_error' => ['int'], 'preg_match' => ['int|false', 'pattern' => 'string', 'subject' => 'string', '&w_subpatterns=' => 'string[]', 'flags=' => 'int', 'offset=' => 'int'], 'preg_match_all' => ['int|false', 'pattern' => 'string', 'subject' => 'string', '&w_subpatterns=' => 'array', 'flags=' => 'int', 'offset=' => 'int'], 'preg_quote' => ['string', 'str' => 'string', 'delim_char=' => 'string'], 'preg_replace' => ['string|array|null', 'regex' => 'string|array', 'replace' => 'string|array', 'subject' => 'string|array', 'limit=' => 'int', '&w_count=' => 'int'], 'preg_replace_callback' => ['string|array|null', 'regex' => 'string|array', 'callback' => 'callable', 'subject' => 'string|array', 'limit=' => 'int', '&w_count=' => 'int'], 'preg_replace_callback_array' => ['string|array|null', 'pattern' => 'array<string,callable>', 'subject' => 'string|array', 'limit=' => 'int', '&w_count=' => 'int'], 'preg_split' => ['array<int, string>|false', 'pattern' => 'string', 'subject' => 'string', 'limit=' => '?int', 'flags=' => 'int'], 'prev' => ['mixed', '&rw_array_arg' => 'array|object'], 'print' => ['int', 'arg' => 'string'], 'print_r' => ['string|true', 'var' => 'mixed', 'return=' => 'bool'], 'printf' => ['int', 'format' => 'string', '...args=' => 'string|int|float'], 'proc_close' => ['int', 'process' => 'resource'], 'proc_get_status' => ['array', 'process' => 'resource'], 'proc_nice' => ['bool', 'priority' => 'int'], 'proc_open' => ['resource|false', 'command' => 'string', 'descriptorspec' => 'array', '&w_pipes' => 'resource[]', 'cwd=' => '?string', 'env=' => '?array', 'other_options=' => 'array'], 'proc_terminate' => ['bool', 'process' => 'resource', 'signal=' => 'int'], 'projectionObj::__construct' => ['void', 'projectionString' => 'string'], 'projectionObj::getUnits' => ['int'], 'projectionObj::ms_newProjectionObj' => ['projectionObj', 'projectionString' => 'string'], 'property_exists' => ['bool', 'object_or_class' => 'object|string', 'property_name' => 'string'], 'ps_add_bookmark' => ['int', 'psdoc' => 'resource', 'text' => 'string', 'parent=' => 'int', 'open=' => 'int'], 'ps_add_launchlink' => ['bool', 'psdoc' => 'resource', 'llx' => 'float', 'lly' => 'float', 'urx' => 'float', 'ury' => 'float', 'filename' => 'string'], 'ps_add_locallink' => ['bool', 'psdoc' => 'resource', 'llx' => 'float', 'lly' => 'float', 'urx' => 'float', 'ury' => 'float', 'page' => 'int', 'dest' => 'string'], 'ps_add_note' => ['bool', 'psdoc' => 'resource', 'llx' => 'float', 'lly' => 'float', 'urx' => 'float', 'ury' => 'float', 'contents' => 'string', 'title' => 'string', 'icon' => 'string', 'open' => 'int'], 'ps_add_pdflink' => ['bool', 'psdoc' => 'resource', 'llx' => 'float', 'lly' => 'float', 'urx' => 'float', 'ury' => 'float', 'filename' => 'string', 'page' => 'int', 'dest' => 'string'], 'ps_add_weblink' => ['bool', 'psdoc' => 'resource', 'llx' => 'float', 'lly' => 'float', 'urx' => 'float', 'ury' => 'float', 'url' => 'string'], 'ps_arc' => ['bool', 'psdoc' => 'resource', 'x' => 'float', 'y' => 'float', 'radius' => 'float', 'alpha' => 'float', 'beta' => 'float'], 'ps_arcn' => ['bool', 'psdoc' => 'resource', 'x' => 'float', 'y' => 'float', 'radius' => 'float', 'alpha' => 'float', 'beta' => 'float'], 'ps_begin_page' => ['bool', 'psdoc' => 'resource', 'width' => 'float', 'height' => 'float'], 'ps_begin_pattern' => ['int', 'psdoc' => 'resource', 'width' => 'float', 'height' => 'float', 'xstep' => 'float', 'ystep' => 'float', 'painttype' => 'int'], 'ps_begin_template' => ['int', 'psdoc' => 'resource', 'width' => 'float', 'height' => 'float'], 'ps_circle' => ['bool', 'psdoc' => 'resource', 'x' => 'float', 'y' => 'float', 'radius' => 'float'], 'ps_clip' => ['bool', 'psdoc' => 'resource'], 'ps_close' => ['bool', 'psdoc' => 'resource'], 'ps_close_image' => ['void', 'psdoc' => 'resource', 'imageid' => 'int'], 'ps_closepath' => ['bool', 'psdoc' => 'resource'], 'ps_closepath_stroke' => ['bool', 'psdoc' => 'resource'], 'ps_continue_text' => ['bool', 'psdoc' => 'resource', 'text' => 'string'], 'ps_curveto' => ['bool', 'psdoc' => 'resource', 'x1' => 'float', 'y1' => 'float', 'x2' => 'float', 'y2' => 'float', 'x3' => 'float', 'y3' => 'float'], 'ps_delete' => ['bool', 'psdoc' => 'resource'], 'ps_end_page' => ['bool', 'psdoc' => 'resource'], 'ps_end_pattern' => ['bool', 'psdoc' => 'resource'], 'ps_end_template' => ['bool', 'psdoc' => 'resource'], 'ps_fill' => ['bool', 'psdoc' => 'resource'], 'ps_fill_stroke' => ['bool', 'psdoc' => 'resource'], 'ps_findfont' => ['int', 'psdoc' => 'resource', 'fontname' => 'string', 'encoding' => 'string', 'embed=' => 'bool'], 'ps_get_buffer' => ['string', 'psdoc' => 'resource'], 'ps_get_parameter' => ['string', 'psdoc' => 'resource', 'name' => 'string', 'modifier=' => 'float'], 'ps_get_value' => ['float', 'psdoc' => 'resource', 'name' => 'string', 'modifier=' => 'float'], 'ps_hyphenate' => ['array', 'psdoc' => 'resource', 'text' => 'string'], 'ps_include_file' => ['bool', 'psdoc' => 'resource', 'file' => 'string'], 'ps_lineto' => ['bool', 'psdoc' => 'resource', 'x' => 'float', 'y' => 'float'], 'ps_makespotcolor' => ['int', 'psdoc' => 'resource', 'name' => 'string', 'reserved=' => 'int'], 'ps_moveto' => ['bool', 'psdoc' => 'resource', 'x' => 'float', 'y' => 'float'], 'ps_new' => ['resource'], 'ps_open_file' => ['bool', 'psdoc' => 'resource', 'filename=' => 'string'], 'ps_open_image' => ['int', 'psdoc' => 'resource', 'type' => 'string', 'source' => 'string', 'data' => 'string', 'length' => 'int', 'width' => 'int', 'height' => 'int', 'components' => 'int', 'bpc' => 'int', 'params' => 'string'], 'ps_open_image_file' => ['int', 'psdoc' => 'resource', 'type' => 'string', 'filename' => 'string', 'stringparam=' => 'string', 'intparam=' => 'int'], 'ps_open_memory_image' => ['int', 'psdoc' => 'resource', 'gd' => 'int'], 'ps_place_image' => ['bool', 'psdoc' => 'resource', 'imageid' => 'int', 'x' => 'float', 'y' => 'float', 'scale' => 'float'], 'ps_rect' => ['bool', 'psdoc' => 'resource', 'x' => 'float', 'y' => 'float', 'width' => 'float', 'height' => 'float'], 'ps_restore' => ['bool', 'psdoc' => 'resource'], 'ps_rotate' => ['bool', 'psdoc' => 'resource', 'rot' => 'float'], 'ps_save' => ['bool', 'psdoc' => 'resource'], 'ps_scale' => ['bool', 'psdoc' => 'resource', 'x' => 'float', 'y' => 'float'], 'ps_set_border_color' => ['bool', 'psdoc' => 'resource', 'red' => 'float', 'green' => 'float', 'blue' => 'float'], 'ps_set_border_dash' => ['bool', 'psdoc' => 'resource', 'black' => 'float', 'white' => 'float'], 'ps_set_border_style' => ['bool', 'psdoc' => 'resource', 'style' => 'string', 'width' => 'float'], 'ps_set_info' => ['bool', 'p' => 'resource', 'key' => 'string', 'val' => 'string'], 'ps_set_parameter' => ['bool', 'psdoc' => 'resource', 'name' => 'string', 'value' => 'string'], 'ps_set_text_pos' => ['bool', 'psdoc' => 'resource', 'x' => 'float', 'y' => 'float'], 'ps_set_value' => ['bool', 'psdoc' => 'resource', 'name' => 'string', 'value' => 'float'], 'ps_setcolor' => ['bool', 'psdoc' => 'resource', 'type' => 'string', 'colorspace' => 'string', 'c1' => 'float', 'c2' => 'float', 'c3' => 'float', 'c4' => 'float'], 'ps_setdash' => ['bool', 'psdoc' => 'resource', 'on' => 'float', 'off' => 'float'], 'ps_setflat' => ['bool', 'psdoc' => 'resource', 'value' => 'float'], 'ps_setfont' => ['bool', 'psdoc' => 'resource', 'fontid' => 'int', 'size' => 'float'], 'ps_setgray' => ['bool', 'psdoc' => 'resource', 'gray' => 'float'], 'ps_setlinecap' => ['bool', 'psdoc' => 'resource', 'type' => 'int'], 'ps_setlinejoin' => ['bool', 'psdoc' => 'resource', 'type' => 'int'], 'ps_setlinewidth' => ['bool', 'psdoc' => 'resource', 'width' => 'float'], 'ps_setmiterlimit' => ['bool', 'psdoc' => 'resource', 'value' => 'float'], 'ps_setoverprintmode' => ['bool', 'psdoc' => 'resource', 'mode' => 'int'], 'ps_setpolydash' => ['bool', 'psdoc' => 'resource', 'arr' => 'float'], 'ps_shading' => ['int', 'psdoc' => 'resource', 'type' => 'string', 'x0' => 'float', 'y0' => 'float', 'x1' => 'float', 'y1' => 'float', 'c1' => 'float', 'c2' => 'float', 'c3' => 'float', 'c4' => 'float', 'optlist' => 'string'], 'ps_shading_pattern' => ['int', 'psdoc' => 'resource', 'shadingid' => 'int', 'optlist' => 'string'], 'ps_shfill' => ['bool', 'psdoc' => 'resource', 'shadingid' => 'int'], 'ps_show' => ['bool', 'psdoc' => 'resource', 'text' => 'string'], 'ps_show2' => ['bool', 'psdoc' => 'resource', 'text' => 'string', 'len' => 'int'], 'ps_show_boxed' => ['int', 'psdoc' => 'resource', 'text' => 'string', 'left' => 'float', 'bottom' => 'float', 'width' => 'float', 'height' => 'float', 'hmode' => 'string', 'feature=' => 'string'], 'ps_show_xy' => ['bool', 'psdoc' => 'resource', 'text' => 'string', 'x' => 'float', 'y' => 'float'], 'ps_show_xy2' => ['bool', 'psdoc' => 'resource', 'text' => 'string', 'len' => 'int', 'xcoor' => 'float', 'ycoor' => 'float'], 'ps_string_geometry' => ['array', 'psdoc' => 'resource', 'text' => 'string', 'fontid=' => 'int', 'size=' => 'float'], 'ps_stringwidth' => ['float', 'psdoc' => 'resource', 'text' => 'string', 'fontid=' => 'int', 'size=' => 'float'], 'ps_stroke' => ['bool', 'psdoc' => 'resource'], 'ps_symbol' => ['bool', 'psdoc' => 'resource', 'ord' => 'int'], 'ps_symbol_name' => ['string', 'psdoc' => 'resource', 'ord' => 'int', 'fontid=' => 'int'], 'ps_symbol_width' => ['float', 'psdoc' => 'resource', 'ord' => 'int', 'fontid=' => 'int', 'size=' => 'float'], 'ps_translate' => ['bool', 'psdoc' => 'resource', 'x' => 'float', 'y' => 'float'], 'pspell_add_to_personal' => ['bool', 'pspell' => 'int', 'word' => 'string'], 'pspell_add_to_session' => ['bool', 'pspell' => 'int', 'word' => 'string'], 'pspell_check' => ['bool', 'pspell' => 'int', 'word' => 'string'], 'pspell_clear_session' => ['bool', 'pspell' => 'int'], 'pspell_config_create' => ['int|false', 'language' => 'string', 'spelling=' => 'string', 'jargon=' => 'string', 'encoding=' => 'string'], 'pspell_config_data_dir' => ['bool', 'conf' => 'int', 'directory' => 'string'], 'pspell_config_dict_dir' => ['bool', 'conf' => 'int', 'directory' => 'string'], 'pspell_config_ignore' => ['bool', 'conf' => 'int', 'ignore' => 'int'], 'pspell_config_mode' => ['bool', 'conf' => 'int', 'mode' => 'int'], 'pspell_config_personal' => ['bool', 'conf' => 'int', 'personal' => 'string'], 'pspell_config_repl' => ['bool', 'conf' => 'int', 'repl' => 'string'], 'pspell_config_runtogether' => ['bool', 'conf' => 'int', 'runtogether' => 'bool'], 'pspell_config_save_repl' => ['bool', 'conf' => 'int', 'save' => 'bool'], 'pspell_new' => ['int|false', 'language' => 'string', 'spelling=' => 'string', 'jargon=' => 'string', 'encoding=' => 'string', 'mode=' => 'int'], 'pspell_new_config' => ['int|false', 'config' => 'int'], 'pspell_new_personal' => ['int|false', 'personal' => 'string', 'language' => 'string', 'spelling=' => 'string', 'jargon=' => 'string', 'encoding=' => 'string', 'mode=' => 'int'], 'pspell_save_wordlist' => ['bool', 'pspell' => 'int'], 'pspell_store_replacement' => ['bool', 'pspell' => 'int', 'misspell' => 'string', 'correct' => 'string'], 'pspell_suggest' => ['array', 'pspell' => 'int', 'word' => 'string'], 'putenv' => ['bool', 'setting' => 'string'], 'px_close' => ['bool', 'pxdoc' => 'resource'], 'px_create_fp' => ['bool', 'pxdoc' => 'resource', 'file' => 'resource', 'fielddesc' => 'array'], 'px_date2string' => ['string', 'pxdoc' => 'resource', 'value' => 'int', 'format' => 'string'], 'px_delete' => ['bool', 'pxdoc' => 'resource'], 'px_delete_record' => ['bool', 'pxdoc' => 'resource', 'num' => 'int'], 'px_get_field' => ['array', 'pxdoc' => 'resource', 'fieldno' => 'int'], 'px_get_info' => ['array', 'pxdoc' => 'resource'], 'px_get_parameter' => ['string', 'pxdoc' => 'resource', 'name' => 'string'], 'px_get_record' => ['array', 'pxdoc' => 'resource', 'num' => 'int', 'mode=' => 'int'], 'px_get_schema' => ['array', 'pxdoc' => 'resource', 'mode=' => 'int'], 'px_get_value' => ['float', 'pxdoc' => 'resource', 'name' => 'string'], 'px_insert_record' => ['int', 'pxdoc' => 'resource', 'data' => 'array'], 'px_new' => ['resource'], 'px_numfields' => ['int', 'pxdoc' => 'resource'], 'px_numrecords' => ['int', 'pxdoc' => 'resource'], 'px_open_fp' => ['bool', 'pxdoc' => 'resource', 'file' => 'resource'], 'px_put_record' => ['bool', 'pxdoc' => 'resource', 'record' => 'array', 'recpos=' => 'int'], 'px_retrieve_record' => ['array', 'pxdoc' => 'resource', 'num' => 'int', 'mode=' => 'int'], 'px_set_blob_file' => ['bool', 'pxdoc' => 'resource', 'filename' => 'string'], 'px_set_parameter' => ['bool', 'pxdoc' => 'resource', 'name' => 'string', 'value' => 'string'], 'px_set_tablename' => ['void', 'pxdoc' => 'resource', 'name' => 'string'], 'px_set_targetencoding' => ['bool', 'pxdoc' => 'resource', 'encoding' => 'string'], 'px_set_value' => ['bool', 'pxdoc' => 'resource', 'name' => 'string', 'value' => 'float'], 'px_timestamp2string' => ['string', 'pxdoc' => 'resource', 'value' => 'float', 'format' => 'string'], 'px_update_record' => ['bool', 'pxdoc' => 'resource', 'data' => 'array', 'num' => 'int'], 'qdom_error' => ['string'], 'qdom_tree' => ['QDomDocument', 'doc' => 'string'], 'querymapObj::convertToString' => ['string'], 'querymapObj::free' => ['void'], 'querymapObj::set' => ['int', 'property_name' => 'string', 'new_value' => ''], 'querymapObj::updateFromString' => ['int', 'snippet' => 'string'], 'QuickHashIntHash::__construct' => ['void', 'size' => 'int', 'options=' => 'int'], 'QuickHashIntHash::add' => ['bool', 'key' => 'int', 'value=' => 'int'], 'QuickHashIntHash::delete' => ['bool', 'key' => 'int'], 'QuickHashIntHash::exists' => ['bool', 'key' => 'int'], 'QuickHashIntHash::get' => ['int', 'key' => 'int'], 'QuickHashIntHash::getSize' => ['int'], 'QuickHashIntHash::loadFromFile' => ['QuickHashIntHash', 'filename' => 'string', 'options=' => 'int'], 'QuickHashIntHash::loadFromString' => ['QuickHashIntHash', 'contents' => 'string', 'options=' => 'int'], 'QuickHashIntHash::saveToFile' => ['void', 'filename' => 'string'], 'QuickHashIntHash::saveToString' => ['string'], 'QuickHashIntHash::set' => ['bool', 'key' => 'int', 'value' => 'int'], 'QuickHashIntHash::update' => ['bool', 'key' => 'int', 'value' => 'int'], 'QuickHashIntSet::__construct' => ['void', 'size' => 'int', 'options=' => 'int'], 'QuickHashIntSet::add' => ['bool', 'key' => 'int'], 'QuickHashIntSet::delete' => ['bool', 'key' => 'int'], 'QuickHashIntSet::exists' => ['bool', 'key' => 'int'], 'QuickHashIntSet::getSize' => ['int'], 'QuickHashIntSet::loadFromFile' => ['QuickHashIntSet', 'filename' => 'string', 'size=' => 'int', 'options=' => 'int'], 'QuickHashIntSet::loadFromString' => ['QuickHashIntSet', 'contents' => 'string', 'size=' => 'int', 'options=' => 'int'], 'QuickHashIntSet::saveToFile' => ['void', 'filename' => 'string'], 'QuickHashIntSet::saveToString' => ['string'], 'QuickHashIntStringHash::__construct' => ['void', 'size' => 'int', 'options=' => 'int'], 'QuickHashIntStringHash::add' => ['bool', 'key' => 'int', 'value' => 'string'], 'QuickHashIntStringHash::delete' => ['bool', 'key' => 'int'], 'QuickHashIntStringHash::exists' => ['bool', 'key' => 'int'], 'QuickHashIntStringHash::get' => ['mixed', 'key' => 'int'], 'QuickHashIntStringHash::getSize' => ['int'], 'QuickHashIntStringHash::loadFromFile' => ['QuickHashIntStringHash', 'filename' => 'string', 'size=' => 'int', 'options=' => 'int'], 'QuickHashIntStringHash::loadFromString' => ['QuickHashIntStringHash', 'contents' => 'string', 'size=' => 'int', 'options=' => 'int'], 'QuickHashIntStringHash::saveToFile' => ['void', 'filename' => 'string'], 'QuickHashIntStringHash::saveToString' => ['string'], 'QuickHashIntStringHash::set' => ['int', 'key' => 'int', 'value' => 'string'], 'QuickHashIntStringHash::update' => ['bool', 'key' => 'int', 'value' => 'string'], 'QuickHashStringIntHash::__construct' => ['void', 'size' => 'int', 'options=' => 'int'], 'QuickHashStringIntHash::add' => ['bool', 'key' => 'string', 'value' => 'int'], 'QuickHashStringIntHash::delete' => ['bool', 'key' => 'string'], 'QuickHashStringIntHash::exists' => ['bool', 'key' => 'string'], 'QuickHashStringIntHash::get' => ['mixed', 'key' => 'string'], 'QuickHashStringIntHash::getSize' => ['int'], 'QuickHashStringIntHash::loadFromFile' => ['QuickHashStringIntHash', 'filename' => 'string', 'size=' => 'int', 'options=' => 'int'], 'QuickHashStringIntHash::loadFromString' => ['QuickHashStringIntHash', 'contents' => 'string', 'size=' => 'int', 'options=' => 'int'], 'QuickHashStringIntHash::saveToFile' => ['void', 'filename' => 'string'], 'QuickHashStringIntHash::saveToString' => ['string'], 'QuickHashStringIntHash::set' => ['int', 'key' => 'string', 'value' => 'int'], 'QuickHashStringIntHash::update' => ['bool', 'key' => 'string', 'value' => 'int'], 'quoted_printable_decode' => ['string', 'str' => 'string'], 'quoted_printable_encode' => ['string', 'str' => 'string'], 'quotemeta' => ['string', 'str' => 'string'], 'rad2deg' => ['float', 'number' => 'float'], 'radius_acct_open' => ['resource'], 'radius_add_server' => ['bool', 'radius_handle' => 'resource', 'hostname' => 'string', 'port' => 'int', 'secret' => 'string', 'timeout' => 'int', 'max_tries' => 'int'], 'radius_auth_open' => ['resource'], 'radius_close' => ['bool', 'radius_handle' => 'resource'], 'radius_config' => ['bool', 'radius_handle' => 'resource', 'file' => 'string'], 'radius_create_request' => ['bool', 'radius_handle' => 'resource', 'type' => 'int'], 'radius_cvt_addr' => ['string', 'data' => 'string'], 'radius_cvt_int' => ['int', 'data' => 'string'], 'radius_cvt_string' => ['string', 'data' => 'string'], 'radius_demangle' => ['string', 'radius_handle' => 'resource', 'mangled' => 'string'], 'radius_demangle_mppe_key' => ['string', 'radius_handle' => 'resource', 'mangled' => 'string'], 'radius_get_attr' => ['mixed', 'radius_handle' => 'resource'], 'radius_get_tagged_attr_data' => ['string', 'data' => 'string'], 'radius_get_tagged_attr_tag' => ['int', 'data' => 'string'], 'radius_get_vendor_attr' => ['array', 'data' => 'string'], 'radius_put_addr' => ['bool', 'radius_handle' => 'resource', 'type' => 'int', 'addr' => 'string'], 'radius_put_attr' => ['bool', 'radius_handle' => 'resource', 'type' => 'int', 'value' => 'string'], 'radius_put_int' => ['bool', 'radius_handle' => 'resource', 'type' => 'int', 'value' => 'int'], 'radius_put_string' => ['bool', 'radius_handle' => 'resource', 'type' => 'int', 'value' => 'string'], 'radius_put_vendor_addr' => ['bool', 'radius_handle' => 'resource', 'vendor' => 'int', 'type' => 'int', 'addr' => 'string'], 'radius_put_vendor_attr' => ['bool', 'radius_handle' => 'resource', 'vendor' => 'int', 'type' => 'int', 'value' => 'string'], 'radius_put_vendor_int' => ['bool', 'radius_handle' => 'resource', 'vendor' => 'int', 'type' => 'int', 'value' => 'int'], 'radius_put_vendor_string' => ['bool', 'radius_handle' => 'resource', 'vendor' => 'int', 'type' => 'int', 'value' => 'string'], 'radius_request_authenticator' => ['string', 'radius_handle' => 'resource'], 'radius_salt_encrypt_attr' => ['string', 'radius_handle' => 'resource', 'data' => 'string'], 'radius_send_request' => ['int', 'radius_handle' => 'resource'], 'radius_server_secret' => ['string', 'radius_handle' => 'resource'], 'radius_strerror' => ['string', 'radius_handle' => 'resource'], 'rand' => ['int', 'min' => 'int', 'max' => 'int'], 'rand\'1' => ['int'], 'random_bytes' => ['string', 'length' => 'int'], 'random_int' => ['int', 'min' => 'int', 'max' => 'int'], 'range' => ['array', 'low' => 'mixed', 'high' => 'mixed', 'step=' => 'int|float'], 'RangeException::__clone' => ['void'], 'RangeException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?Throwable|?RangeException'], 'RangeException::__toString' => ['string'], 'RangeException::getCode' => ['int'], 'RangeException::getFile' => ['string'], 'RangeException::getLine' => ['int'], 'RangeException::getMessage' => ['string'], 'RangeException::getPrevious' => ['Throwable|RangeException|null'], 'RangeException::getTrace' => ['array'], 'RangeException::getTraceAsString' => ['string'], 'rar_allow_broken_set' => ['bool', 'rarfile' => 'RarArchive', 'allow_broken' => 'bool'], 'rar_broken_is' => ['bool', 'rarfile' => 'rararchive'], 'rar_close' => ['bool', 'rarfile' => 'rararchive'], 'rar_comment_get' => ['string', 'rarfile' => 'rararchive'], 'rar_entry_get' => ['RarEntry', 'entryname' => 'string', 'rarfile' => 'rararchive'], 'rar_list' => ['RarArchive', 'rarfile' => 'rararchive'], 'rar_open' => ['RarArchive', 'filename' => 'string', 'password=' => 'string', 'volume_callback=' => 'callable'], 'rar_solid_is' => ['bool', 'rarfile' => 'rararchive'], 'rar_wrapper_cache_stats' => ['string'], 'RarArchive::__toString' => ['string'], 'RarArchive::close' => ['bool', 'rarfile' => 'rararchive'], 'RarArchive::getComment' => ['string', 'rarfile' => 'rararchive'], 'RarArchive::getEntries' => ['RarArchive', 'rarfile' => 'rararchive'], 'RarArchive::getEntry' => ['RarEntry', 'entryname' => 'string', 'rarfile' => 'rararchive'], 'RarArchive::isBroken' => ['bool', 'rarfile' => 'rararchive'], 'RarArchive::isSolid' => ['bool', 'rarfile' => 'rararchive'], 'RarArchive::open' => ['RarArchive', 'filename' => 'string', 'password=' => 'string', 'volume_callback=' => 'callable'], 'RarArchive::setAllowBroken' => ['bool', 'allow_broken' => 'bool', 'rarfile' => 'rararchive'], 'RarEntry::__toString' => ['string'], 'RarEntry::extract' => ['bool', 'dir' => 'string', 'filepath=' => 'string', 'password=' => 'string', 'extended_data=' => 'bool'], 'RarEntry::getAttr' => ['int'], 'RarEntry::getCrc' => ['string'], 'RarEntry::getFileTime' => ['string'], 'RarEntry::getHostOs' => ['int'], 'RarEntry::getMethod' => ['int'], 'RarEntry::getName' => ['string'], 'RarEntry::getPackedSize' => ['int'], 'RarEntry::getStream' => ['resource', 'password=' => 'string'], 'RarEntry::getUnpackedSize' => ['int'], 'RarEntry::getVersion' => ['int'], 'RarEntry::isDirectory' => ['bool'], 'RarEntry::isEncrypted' => ['bool'], 'RarException::getCode' => ['int'], 'RarException::getFile' => ['string'], 'RarException::getLine' => ['int'], 'RarException::getMessage' => ['string'], 'RarException::getPrevious' => ['Exception|Throwable'], 'RarException::getTrace' => ['array'], 'RarException::getTraceAsString' => ['string'], 'RarException::isUsingExceptions' => ['bool'], 'RarException::setUsingExceptions' => ['RarEntry', 'using_exceptions' => 'bool'], 'rawurldecode' => ['string', 'str' => 'string'], 'rawurlencode' => ['string', 'str' => 'string'], 'read_exif_data' => ['array', 'filename' => 'string', 'sections_needed=' => 'string', 'sub_arrays=' => 'bool', 'read_thumbnail=' => 'bool'], 'readdir' => ['string|false', 'dir_handle=' => 'resource'], 'readfile' => ['int|false', 'filename' => 'string', 'use_include_path=' => 'bool', 'context=' => 'resource'], 'readgzfile' => ['int|false', 'filename' => 'string', 'use_include_path=' => 'int'], 'readline' => ['string', 'prompt=' => '?string'], 'readline_add_history' => ['bool', 'prompt' => 'string'], 'readline_callback_handler_install' => ['bool', 'prompt' => 'string', 'callback' => 'callable'], 'readline_callback_handler_remove' => ['bool'], 'readline_callback_read_char' => ['void'], 'readline_clear_history' => ['bool'], 'readline_completion_function' => ['bool', 'funcname' => 'callable'], 'readline_info' => ['mixed', 'varname=' => 'string', 'newvalue=' => 'string'], 'readline_list_history' => ['array'], 'readline_on_new_line' => ['void'], 'readline_read_history' => ['bool', 'filename=' => 'string'], 'readline_redisplay' => ['void'], 'readline_write_history' => ['bool', 'filename=' => 'string'], 'readlink' => ['string', 'filename' => 'string'], 'realpath' => ['string|false', 'path' => 'string'], 'realpath_cache_get' => ['array'], 'realpath_cache_size' => ['int'], 'recode' => ['string', 'request' => 'string', 'str' => 'string'], 'recode_file' => ['bool', 'request' => 'string', 'input' => 'resource', 'output' => 'resource'], 'recode_string' => ['string', 'request' => 'string', 'str' => 'string'], 'rectObj::__construct' => ['void'], 'rectObj::draw' => ['int', 'map' => 'MapObj', 'layer' => 'layerObj', 'img' => 'imageObj', 'class_index' => 'int', 'text' => 'string'], 'rectObj::fit' => ['float', 'width' => 'int', 'height' => 'int'], 'rectObj::ms_newRectObj' => ['rectObj'], 'rectObj::project' => ['int', 'in' => 'projectionObj', 'out' => 'projectionObj'], 'rectObj::set' => ['int', 'property_name' => 'string', 'new_value' => ''], 'rectObj::setextent' => ['void', 'minx' => 'float', 'miny' => 'float', 'maxx' => 'float', 'maxy' => 'float'], 'RecursiveArrayIterator::getChildren' => ['RecursiveArrayIterator'], 'RecursiveArrayIterator::hasChildren' => ['bool'], 'RecursiveCachingIterator::__construct' => ['void', 'it' => 'Iterator', 'flags' => ''], 'RecursiveCachingIterator::getChildren' => ['RecursiveCachingIterator'], 'RecursiveCachingIterator::hasChildren' => ['bool'], 'RecursiveCallbackFilterIterator::__construct' => ['void', 'it' => 'recursiveiterator', 'func' => 'callable'], 'RecursiveCallbackFilterIterator::getChildren' => ['RecursiveCallbackFilterIterator'], 'RecursiveCallbackFilterIterator::hasChildren' => ['void'], 'RecursiveDirectoryIterator::__construct' => ['void', 'path' => 'string', 'flags=' => 'int'], 'RecursiveDirectoryIterator::getChildren' => ['object'], 'RecursiveDirectoryIterator::getSubPath' => ['string'], 'RecursiveDirectoryIterator::getSubPathname' => ['string'], 'RecursiveDirectoryIterator::hasChildren' => ['bool', 'allow_links=' => 'bool'], 'RecursiveDirectoryIterator::key' => ['string'], 'RecursiveDirectoryIterator::next' => ['void'], 'RecursiveDirectoryIterator::rewind' => ['void'], 'RecursiveFilterIterator::__construct' => ['void', 'it' => 'recursiveiterator'], 'RecursiveFilterIterator::getChildren' => ['RecursiveFilterIterator'], 'RecursiveFilterIterator::hasChildren' => ['bool'], 'RecursiveIterator::getChildren' => ['RecursiveIterator'], 'RecursiveIterator::hasChildren' => ['bool'], 'RecursiveIteratorIterator::__construct' => ['void', 'it' => 'RecursiveIterator|IteratorAggregate', 'mode=' => 'int', 'flags=' => 'int'], 'RecursiveIteratorIterator::beginChildren' => ['void'], 'RecursiveIteratorIterator::beginIteration' => ['RecursiveIterator'], 'RecursiveIteratorIterator::callGetChildren' => ['RecursiveIterator'], 'RecursiveIteratorIterator::callHasChildren' => ['bool'], 'RecursiveIteratorIterator::current' => ['mixed'], 'RecursiveIteratorIterator::endChildren' => ['void'], 'RecursiveIteratorIterator::endIteration' => ['RecursiveIterator'], 'RecursiveIteratorIterator::getDepth' => ['int'], 'RecursiveIteratorIterator::getInnerIterator' => ['RecursiveIterator'], 'RecursiveIteratorIterator::getMaxDepth' => ['int|false'], 'RecursiveIteratorIterator::getSubIterator' => ['RecursiveIterator', 'level=' => 'int'], 'RecursiveIteratorIterator::key' => ['mixed'], 'RecursiveIteratorIterator::next' => ['void'], 'RecursiveIteratorIterator::nextElement' => ['void'], 'RecursiveIteratorIterator::rewind' => ['void'], 'RecursiveIteratorIterator::setMaxDepth' => ['void', 'max_depth=' => 'int'], 'RecursiveIteratorIterator::valid' => ['bool'], 'RecursiveRegexIterator::__construct' => ['void', 'it' => 'recursiveiterator', 'regex=' => 'string', 'mode=' => 'int', 'flags=' => 'int', 'preg_flags=' => 'int'], 'RecursiveRegexIterator::getChildren' => ['RecursiveRegexIterator'], 'RecursiveRegexIterator::hasChildren' => ['bool'], 'RecursiveTreeIterator::__construct' => ['void', 'it' => 'recursiveiterator|iteratoraggregate', 'flags' => 'int', 'cit_flags' => 'int', 'mode' => 'int'], 'RecursiveTreeIterator::beginChildren' => ['void'], 'RecursiveTreeIterator::beginIteration' => ['RecursiveIterator'], 'RecursiveTreeIterator::callGetChildren' => ['RecursiveIterator'], 'RecursiveTreeIterator::callHasChildren' => ['bool'], 'RecursiveTreeIterator::current' => ['string'], 'RecursiveTreeIterator::endChildren' => ['void'], 'RecursiveTreeIterator::endIteration' => ['void'], 'RecursiveTreeIterator::getEntry' => ['string'], 'RecursiveTreeIterator::getPostfix' => ['string'], 'RecursiveTreeIterator::getPrefix' => ['string'], 'RecursiveTreeIterator::key' => ['string'], 'RecursiveTreeIterator::next' => ['void'], 'RecursiveTreeIterator::nextElement' => ['void'], 'RecursiveTreeIterator::rewind' => ['void'], 'RecursiveTreeIterator::setPostfix' => ['void', 'prefix' => 'string'], 'RecursiveTreeIterator::setPrefixPart' => ['void', 'part' => 'int', 'prefix' => 'string'], 'RecursiveTreeIterator::valid' => ['bool'], 'Redis::__construct' => ['void'], 'Redis::_prefix' => ['string', 'value' => 'mixed'], 'Redis::_serialize' => ['mixed', 'value' => 'mixed'], 'Redis::_unserialize' => ['mixed', 'value' => 'string'], 'Redis::append' => ['int', 'key' => 'string', 'value' => 'string'], 'Redis::auth' => ['bool', 'password' => 'string'], 'Redis::bgRewriteAOF' => ['bool'], 'Redis::bgrewriteaof' => ['bool'], 'Redis::bgSave' => ['bool'], 'Redis::bitCount' => ['int', 'key' => 'string'], 'Redis::bitcount' => ['int', 'key' => 'string'], 'Redis::bitOp' => ['int', 'operation' => 'string', '...args' => 'string'], 'Redis::bitop' => ['int', 'operation' => 'string', '...args' => 'string'], 'Redis::bitpos' => ['int', 'key' => 'string', 'bit' => 'int', 'start=' => 'int', 'end=' => 'int'], 'Redis::blPop' => ['array', 'keys' => 'array', 'timeout' => 'int'], 'Redis::brPop' => ['array', 'keys' => 'array', 'timeout' => 'int'], 'Redis::brpoplpush' => ['string|false', 'srcKey' => 'string', 'dstKey' => 'string', 'timeout' => 'int'], 'Redis::clearLastError' => ['bool'], 'Redis::client' => ['mixed', 'command' => 'string', 'arg=' => 'string'], 'Redis::close' => ['bool'], 'Redis::config' => ['string', 'key' => 'string', 'value=' => 'string'], 'Redis::connect' => ['bool', 'host' => 'string', 'port=' => 'int', 'timeout=' => 'float', 'retry_interval=' => '?int'], 'Redis::dbSize' => ['int'], 'Redis::decr' => ['int', 'key' => 'string'], 'Redis::decrBy' => ['int', 'key' => 'string', 'value' => 'int'], 'Redis::decrByFloat' => ['float', 'key' => 'string', 'value' => 'float'], 'Redis::del' => ['int', 'key' => 'string', '...args' => 'string'], 'Redis::del\'1' => ['int', 'key' => 'string[]'], 'Redis::delete' => ['int', 'key' => 'string', '...args' => 'string'], 'Redis::delete\'1' => ['int', 'key' => 'string[]'], 'Redis::discard' => [''], 'Redis::dump' => ['string|false', 'key' => 'string'], 'Redis::echo' => ['string', 'message' => 'string'], 'Redis::eval' => ['mixed', 'script' => '', 'args=' => '', 'numKeys=' => ''], 'Redis::evalSha' => ['mixed', 'scriptSha' => 'string', 'args=' => 'array', 'numKeys=' => 'int'], 'Redis::evalsha' => ['mixed', 'scriptSha' => 'string', 'args=' => 'array', 'numKeys=' => 'int'], 'Redis::evaluate' => ['mixed', 'script' => 'string', 'args=' => 'array', 'numKeys=' => 'int'], 'Redis::evaluateSha' => ['', 'scriptSha' => 'string', 'args=' => 'array', 'numKeys=' => 'int'], 'Redis::exec' => ['array'], 'Redis::exists' => ['bool', 'key' => 'string'], 'Redis::expire' => ['bool', 'key' => 'string', 'ttl' => 'int'], 'Redis::expireAt' => ['bool', 'key' => 'string', 'expiry' => 'int'], 'Redis::flushAll' => ['bool'], 'Redis::flushDb' => ['bool'], 'Redis::flushDB' => ['bool'], 'Redis::get' => ['string|false', 'key' => 'string'], 'Redis::getBit' => ['int', 'key' => 'string', 'offset' => 'int'], 'Redis::getKeys' => ['array<int,string>', 'pattern' => 'string'], 'Redis::getLastError' => ['null|string'], 'Redis::getMode' => ['int'], 'Redis::getMultiple' => ['array', 'keys' => 'string[]'], 'Redis::getOption' => ['int', 'name' => 'int'], 'Redis::getRange' => ['int', 'key' => 'string', 'start' => 'int', 'end' => 'int'], 'Redis::getSet' => ['string', 'key' => 'string', 'string' => 'string'], 'Redis::hDel' => ['int|false', 'key' => 'string', 'hashKey1' => 'string', 'hashKey2=' => 'string', 'hashKeyN=' => 'string'], 'Redis::hExists' => ['bool', 'key' => 'string', 'hashKey' => 'string'], 'Redis::hGet' => ['string|false', 'key' => 'string', 'hashKey' => 'string'], 'Redis::hGetAll' => ['array', 'key' => 'string'], 'Redis::hIncrBy' => ['int', 'key' => 'string', 'hashKey' => 'string', 'value' => 'int'], 'Redis::hIncrByFloat' => ['float', 'key' => 'string', 'field' => 'string', 'increment' => 'float'], 'Redis::hKeys' => ['array', 'key' => 'string'], 'Redis::hLen' => ['int|false', 'key' => 'string'], 'Redis::hMGet' => ['array', 'key' => 'string', 'hashKeys' => 'array'], 'Redis::hMget' => ['array', 'key' => 'string', 'hashKeys' => 'array'], 'Redis::hMSet' => ['bool', 'key' => 'string', 'hashKeys' => 'array'], 'Redis::hMset' => ['bool', 'key' => 'string', 'hashKeys' => 'array'], 'Redis::hScan' => ['array', 'key' => 'string', 'iterator' => 'int', 'pattern=' => 'string', 'count=' => 'int'], 'Redis::hscan' => ['array', 'key' => 'string', 'iterator' => 'int', 'pattern=' => 'string', 'count=' => 'int'], 'Redis::hSet' => ['int|false', 'key' => 'string', 'hashKey' => 'string', 'value' => 'string'], 'Redis::hSetNx' => ['bool', 'key' => 'string', 'hashKey' => 'string', 'value' => 'string'], 'Redis::hVals' => ['array', 'key' => 'string'], 'Redis::incr' => ['int', 'key' => 'string'], 'Redis::incrBy' => ['int', 'key' => 'string', 'value' => 'int'], 'Redis::incrByFloat' => ['float', 'key' => 'string'], 'Redis::info' => ['array', 'option=' => 'string'], 'Redis::keys' => ['array<int,string>', 'pattern' => 'string'], 'Redis::lastSave' => ['int'], 'Redis::lGet' => ['', 'key' => 'string', 'index' => 'int'], 'Redis::lGetRange' => ['', 'key' => 'string', 'start' => 'int', 'end' => 'int'], 'Redis::lIndex' => ['string|false', 'key' => 'string', 'index' => 'int'], 'Redis::lindex' => ['string|false', 'key' => 'string', 'index' => 'int'], 'Redis::lInsert' => ['int', 'key' => 'string', 'position' => 'int', 'pivot' => 'string', 'value' => 'string'], 'Redis::listTrim' => ['', 'key' => 'string', 'start' => 'int', 'stop' => 'int'], 'Redis::lLen' => ['int|false', 'key' => 'string'], 'Redis::lPop' => ['string', 'key' => 'string'], 'Redis::lPush' => ['bool|int', 'key' => 'string', 'value1' => 'string', 'value2=' => 'string', 'valueN=' => 'string'], 'Redis::lPushx' => ['int', 'key' => 'string', 'value' => 'string'], 'Redis::lRange' => ['array', 'key' => 'string', 'start' => 'int', 'end' => 'int'], 'Redis::lrange' => ['array', 'key' => 'string', 'start' => 'int', 'end' => 'int'], 'Redis::lRem' => ['int|false', 'key' => 'string', 'value' => 'string', 'count' => 'int'], 'Redis::lrem' => ['int|false', 'key' => 'string', 'value' => 'string', 'count' => 'int'], 'Redis::lRemove' => ['', 'key' => 'string', 'value' => 'string', 'count' => 'int'], 'Redis::lSet' => ['bool', 'key' => 'string', 'index' => 'int', 'value' => 'string'], 'Redis::lSize' => ['', 'key' => 'string'], 'Redis::lTrim' => ['array|false', 'key' => 'string', 'start' => 'int', 'stop' => 'int'], 'Redis::ltrim' => ['array|false', 'key' => 'string', 'start' => 'int', 'stop' => 'int'], 'Redis::mGet' => ['array', 'keys' => 'string[]'], 'Redis::mget' => ['array', 'keys' => 'string[]'], 'Redis::migrate' => ['bool', 'host' => 'string', 'port' => 'int', 'db' => 'int', 'timeout' => 'int', 'copy=' => 'bool', 'replace=' => 'bool'], 'Redis::move' => ['bool', 'key' => 'string', 'dbindex' => 'int'], 'Redis::mSet' => ['bool', 'pairs' => 'array'], 'Redis::mset' => ['bool', 'pairs' => 'array'], 'Redis::mSetNx' => ['bool', 'pairs' => 'array'], 'Redis::msetnx' => ['bool', 'pairs' => 'array'], 'Redis::multi' => ['Redis', 'mode=' => 'int'], 'Redis::object' => ['string|long|false', 'info' => 'string', 'key' => 'string'], 'Redis::open' => ['bool', 'host' => 'string', 'port=' => 'int', 'timeout=' => 'float', 'retry_interval=' => '?int'], 'Redis::pconnect' => ['bool', 'host' => 'string', 'port=' => 'int', 'timeout=' => 'float', 'persistent_id=' => 'string', 'retry_interval=' => '?int'], 'Redis::persist' => ['bool', 'key' => 'string'], 'Redis::pExpire' => ['bool', 'key' => 'string', 'ttl' => 'int'], 'Redis::pexpire' => ['bool', 'key' => 'string', 'ttl' => 'int'], 'Redis::pexpireAt' => ['bool', 'key' => 'string', 'expiry' => 'int'], 'Redis::pfAdd' => ['bool', 'key' => 'string', 'elements' => 'array'], 'Redis::pfadd' => ['bool', 'key' => 'string', 'elements' => 'array'], 'Redis::pfCount' => ['int', 'key' => 'array|string'], 'Redis::pfcount' => ['int', 'key' => 'array|string'], 'Redis::pfMerge' => ['bool', 'destkey' => 'string', 'sourcekeys' => 'array'], 'Redis::pfmerge' => ['bool', 'destkey' => 'string', 'sourcekeys' => 'array'], 'Redis::ping' => ['string'], 'Redis::popen' => ['bool', 'host' => 'string', 'port=' => 'int', 'timeout=' => 'float', 'persistent_id=' => 'string', 'retry_interval=' => '?int'], 'Redis::psetex' => ['bool', 'key' => 'string', 'ttl' => 'int', 'value' => 'string'], 'Redis::psubscribe' => ['', 'patterns' => 'array', 'callback' => 'array|string'], 'Redis::pttl' => ['int|false', 'key' => 'string'], 'Redis::publish' => ['int', 'channel' => 'string', 'message' => 'string'], 'Redis::pubsub' => ['array|int', 'keyword' => 'string', 'argument' => 'array|string'], 'Redis::randomKey' => ['string'], 'Redis::rawCommand' => ['mixed', 'command' => 'string', 'arguments' => 'mixed'], 'Redis::rawcommand' => ['mixed', 'command' => 'string', 'arguments' => 'mixed'], 'Redis::rename' => ['bool', 'srckey' => 'string', 'dstkey' => 'string'], 'Redis::renameKey' => ['bool', 'srckey' => 'string', 'dstkey' => 'string'], 'Redis::renameNx' => ['bool', 'srckey' => 'string', 'dstkey' => 'string'], 'Redis::resetStat' => ['bool'], 'Redis::restore' => ['bool', 'key' => 'string', 'ttl' => 'int', 'value' => 'string'], 'Redis::rPop' => ['string', 'key' => 'string'], 'Redis::rpoplpush' => ['string', 'srcKey' => 'string', 'dstKey' => 'string'], 'Redis::rPush' => ['bool|int', 'key' => 'string', 'value1' => 'string', 'value2=' => 'string', 'valueN=' => 'string'], 'Redis::rPushx' => ['int', 'key' => 'string', 'value' => 'string'], 'Redis::sAdd' => ['int|false', 'key' => 'string', 'value1' => 'string', 'value2=' => 'string', 'valueN=' => 'string'], 'Redis::sAddArray' => ['bool', 'key' => 'string', 'values' => 'array'], 'Redis::save' => ['bool'], 'Redis::scan' => ['array<int,string>|false', '&rw_iterator' => '?int', 'pattern=' => '?string', 'count=' => '?int'], 'Redis::sCard' => ['int', 'key' => 'string'], 'Redis::scard' => ['int', 'key' => 'string'], 'Redis::sContains' => ['', 'key' => 'string', 'value' => 'string'], 'Redis::script' => ['mixed', 'command' => 'string', 'script' => 'string'], 'Redis::sDiff' => ['array', 'key1' => 'string', 'key2' => 'string', 'keyN=' => 'string'], 'Redis::sDiffStore' => ['int|false', 'dstKey' => 'string', 'key1' => 'string', 'key2' => 'string', 'keyN=' => 'string'], 'Redis::select' => ['bool', 'dbindex' => 'int'], 'Redis::set' => ['bool', 'key' => 'string', 'value' => 'string', 'options=' => 'array'], 'Redis::set\'1' => ['bool', 'key' => 'string', 'value' => 'string', 'timeout=' => 'int'], 'Redis::setBit' => ['int', 'key' => 'string', 'offset' => 'int', 'value' => 'int'], 'Redis::setEx' => ['bool', 'key' => 'string', 'ttl' => 'int', 'value' => 'string'], 'Redis::setex' => ['bool', 'key' => 'string', 'ttl' => 'int', 'value' => 'string'], 'Redis::setNx' => ['bool', 'key' => 'string', 'value' => 'string'], 'Redis::setnx' => ['bool', 'key' => 'string', 'value' => 'string'], 'Redis::setOption' => ['bool', 'name' => 'int', 'value' => 'string'], 'Redis::setRange' => ['int', 'key' => 'string', 'offset' => 'int', 'end' => 'int'], 'Redis::setTimeout' => ['', 'key' => 'string', 'ttl' => 'int'], 'Redis::sGetMembers' => ['', 'key' => 'string'], 'Redis::sInter' => ['array|false', 'key1' => 'string', 'key2' => 'string', 'keyN=' => 'string'], 'Redis::sInterStore' => ['int|false', 'dstKey' => 'string', 'key1' => 'string', 'key2' => 'string', 'keyN=' => 'string'], 'Redis::sIsMember' => ['bool', 'key' => 'string', 'value' => 'string'], 'Redis::sismember' => ['bool', 'key' => 'string', 'value' => 'string'], 'Redis::slave' => ['bool', 'host' => 'string', 'port' => 'int'], 'Redis::slave\'1' => ['bool', 'host' => 'string', 'port' => 'int'], 'Redis::slaveof' => ['bool', 'host=' => 'string', 'port=' => 'int'], 'Redis::slowLog' => ['mixed', 'operation' => 'string', 'length=' => 'int'], 'Redis::slowlog' => ['mixed', 'operation' => 'string', 'length=' => 'int'], 'Redis::sMembers' => ['array', 'key' => 'string'], 'Redis::sMove' => ['bool', 'srcKey' => 'string', 'dstKey' => 'string', 'member' => 'string'], 'Redis::sort' => ['array|int', 'options=' => '?array'], 'Redis::sPop' => ['string|false', 'key' => 'string'], 'Redis::sRandMember' => ['array|string|false', 'key' => 'string', 'count=' => 'int'], 'Redis::sRem' => ['int', 'key' => 'string', 'member1' => 'string', 'member2=' => 'string', 'memberN=' => 'string'], 'Redis::srem' => ['int', 'key' => 'string', 'member1' => 'string', 'member2=' => 'string', 'memberN=' => 'string'], 'Redis::sRemove' => ['', 'key' => 'string', 'member1' => 'string', 'member2=' => 'string', 'memberN=' => 'string'], 'Redis::sScan' => ['array|bool', 'key' => 'string', 'iterator' => 'int', 'pattern=' => 'string', 'count=' => 'int'], 'Redis::sscan' => ['array|bool', 'key' => 'string', 'iterator' => 'int', 'pattern=' => 'string', 'count=' => 'int'], 'Redis::strLen' => ['int', 'key' => 'string'], 'Redis::strlen' => ['int', 'key' => 'string'], 'Redis::subscribe' => ['', 'channels' => 'array', 'callback' => 'string'], 'Redis::substr' => ['', 'key' => 'string', 'start' => 'int', 'end' => 'int'], 'Redis::sUnion' => ['array', 'key1' => 'string', 'key2' => 'string', 'keyN=' => 'string'], 'Redis::sUnionStore' => ['int', 'dstKey' => 'string', 'key1' => 'string', 'key2' => 'string', 'keyN=' => 'string'], 'Redis::time' => ['array'], 'Redis::ttl' => ['int|false', 'key' => 'string'], 'Redis::type' => ['int', 'key' => 'string'], 'Redis::unlink' => ['int', 'key' => 'string', '...args' => 'string'], 'Redis::unlink\'1' => ['int', 'key' => 'string[]'], 'Redis::unwatch' => [''], 'Redis::wait' => ['int', 'numSlaves' => 'int', 'timeout' => 'int'], 'Redis::watch' => ['void', 'key' => 'string'], 'Redis::zAdd' => ['int', 'key' => 'string', 'score1' => 'float', 'value1' => 'string', 'score2=' => 'float', 'value2=' => 'string', 'scoreN=' => 'float', 'valueN=' => 'string'], 'Redis::zCard' => ['int', 'key' => 'string'], 'Redis::zCount' => ['int', 'key' => 'string', 'start' => 'string', 'end' => 'string'], 'Redis::zDelete' => ['int', 'key' => 'string', 'member1' => 'string', 'member2=' => 'string', 'memberN=' => 'string'], 'Redis::zDeleteRangeByRank' => ['', 'key' => 'string', 'start' => 'int', 'end' => 'int'], 'Redis::zDeleteRangeByScore' => ['', 'key' => 'string', 'start' => 'float', 'end' => 'float'], 'Redis::zIncrBy' => ['float', 'key' => 'string', 'value' => 'float', 'member' => 'string'], 'Redis::zInter' => ['int', 'Output' => 'string', 'ZSetKeys' => 'array', 'Weights=' => '?array', 'aggregateFunction=' => 'string'], 'Redis::zRange' => ['array', 'key' => 'string', 'start' => 'int', 'end' => 'int', 'withscores=' => 'bool'], 'Redis::zRangeByLex' => ['array|false', 'key' => 'string', 'min' => 'int', 'max' => 'int', 'offset=' => 'int', 'limit=' => 'int'], 'Redis::zRangeByScore' => ['array', 'key' => 'string', 'start' => 'int', 'end' => 'int', 'options=' => 'array'], 'Redis::zRank' => ['int', 'key' => 'string', 'member' => 'string'], 'Redis::zRem' => ['int', 'key' => 'string', 'member1' => 'string', 'member2=' => 'string', 'memberN=' => 'string'], 'Redis::zRemRangeByRank' => ['int', 'key' => 'string', 'start' => 'int', 'end' => 'int'], 'Redis::zRemRangeByScore' => ['int', 'key' => 'string', 'start' => 'float|string', 'end' => 'float|string'], 'Redis::zRevRange' => ['array', 'key' => 'string', 'start' => 'int', 'end' => 'int', 'withscore=' => 'bool'], 'Redis::zRevRangeByLex' => ['array', 'key' => 'string', 'min' => 'int', 'max' => 'int', 'offset=' => 'int', 'limit=' => 'int'], 'Redis::zRevRangeByScore' => ['array', 'key' => 'string', 'start' => 'int', 'end' => 'int', 'options=' => 'array'], 'Redis::zRevRank' => ['int', 'key' => 'string', 'member' => 'string'], 'Redis::zScan' => ['array|bool', 'key' => 'string', 'iterator' => 'int', 'pattern=' => 'string', 'count=' => 'int'], 'Redis::zscan' => ['array|bool', 'key' => 'string', 'iterator' => 'int', 'pattern=' => 'string', 'count=' => 'int'], 'Redis::zScore' => ['float', 'key' => 'string', 'member' => 'string'], 'Redis::zSize' => ['', 'key' => 'string'], 'Redis::zUnion' => ['int', 'Output' => 'string', 'ZSetKeys' => 'array', 'Weights=' => '?array', 'aggregateFunction=' => 'string'], 'RedisArray::__construct' => ['void', 'name=' => 'string', 'hosts=' => '?array', 'opts=' => '?array'], 'RedisArray::_function' => ['string'], 'RedisArray::_hosts' => ['array'], 'RedisArray::_rehash' => [''], 'RedisArray::_target' => ['string', 'key' => 'string'], 'RedisCluster::__construct' => ['void', 'name' => 'string', 'seeds' => 'array', 'timeout=' => 'float', 'readTimeout=' => 'float', 'persistent=' => 'bool|false'], 'RedisCluster::_masters' => ['array'], 'RedisCluster::_prefix' => ['string', 'value' => 'mixed'], 'RedisCluster::_serialize' => ['mixed', 'value' => 'mixed'], 'RedisCluster::_unserialize' => ['mixed', 'value' => 'string'], 'RedisCluster::append' => ['int', 'key' => 'string', 'value' => 'string'], 'RedisCluster::bgrewriteaof' => ['bool', 'nodeParams' => 'string'], 'RedisCluster::bgsave' => ['bool', 'nodeParams' => 'string'], 'RedisCluster::bitCount' => ['int', 'key' => 'string'], 'RedisCluster::bitOp' => ['int', 'operation' => 'string', 'retKey' => 'string', 'key1' => 'string', 'key2' => 'string', 'key3=' => 'string'], 'RedisCluster::bitpos' => ['int', 'key' => 'string', 'bit' => 'int', 'start=' => 'int', 'end=' => 'int'], 'RedisCluster::blPop' => ['array', 'keys' => 'array', 'timeout' => 'int'], 'RedisCluster::brPop' => ['array', 'keys' => 'array', 'timeout' => 'int'], 'RedisCluster::brpoplpush' => ['string', 'srcKey' => 'string', 'dstKey' => 'string', 'timeout' => 'int'], 'RedisCluster::clearLastError' => ['bool'], 'RedisCluster::client' => ['', 'nodeParams' => 'string', 'subCmd' => '', 'args' => ''], 'RedisCluster::close' => [''], 'RedisCluster::cluster' => ['mixed', 'nodeParams' => 'string', 'command' => 'string', 'arguments' => 'mixed'], 'RedisCluster::command' => ['mixed'], 'RedisCluster::config' => ['array', 'nodeParams' => 'string', 'operation' => 'string', 'key' => 'string', 'value' => 'string'], 'RedisCluster::dbSize' => ['int', 'nodeParams' => 'string'], 'RedisCluster::decr' => ['int', 'key' => 'string'], 'RedisCluster::decrBy' => ['int', 'key' => 'string', 'value' => 'int'], 'RedisCluster::del' => ['int', 'key1' => 'int', 'key2=' => 'string', 'key3=' => 'string'], 'RedisCluster::discard' => [''], 'RedisCluster::dump' => ['string', 'key' => 'string'], 'RedisCluster::echo' => ['mixed', 'nodeParams' => 'string', 'msg' => 'string'], 'RedisCluster::eval' => ['mixed', 'script' => '', 'args=' => '', 'numKeys=' => ''], 'RedisCluster::evalSha' => ['mixed', 'scriptSha' => 'string', 'args=' => 'array', 'numKeys=' => 'int'], 'RedisCluster::exec' => ['array|void'], 'RedisCluster::exists' => ['bool', 'key' => 'string'], 'RedisCluster::expire' => ['bool', 'key' => 'string', 'ttl' => 'int'], 'RedisCluster::expireAt' => ['bool', 'key' => 'string', 'timestamp' => 'int'], 'RedisCluster::flushAll' => ['bool', 'nodeParams' => 'string'], 'RedisCluster::flushDB' => ['bool', 'nodeParams' => 'string'], 'RedisCluster::geoAdd' => ['', 'key' => 'string', 'longitude' => 'float', 'latitude' => 'float', 'member' => 'string'], 'RedisCluster::geoDist' => ['', 'key' => 'string', 'member1' => 'string', 'member2' => 'string', 'unit=' => 'string'], 'RedisCluster::geohash' => ['', 'key' => '', 'member1' => '', 'member2=' => 'mixed', 'memberN=' => 'mixed'], 'RedisCluster::geopos' => ['', 'key' => '', 'member1' => '', 'member2=' => 'mixed', 'memberN=' => 'mixed'], 'RedisCluster::geoRadius' => ['', 'key' => 'string', 'longitude' => 'float', 'latitude' => 'float', 'radius' => 'float', 'radiusUnit' => 'string', 'options' => 'array'], 'RedisCluster::geoRadiusByMember' => ['', 'key' => 'string', 'member' => 'string', 'radius' => 'float', 'radiusUnit' => 'string', 'options' => 'array'], 'RedisCluster::get' => ['bool|string', 'key' => 'string'], 'RedisCluster::getBit' => ['int', 'key' => 'string', 'offset' => 'int'], 'RedisCluster::getLastError' => ['string'], 'RedisCluster::getMode' => ['int'], 'RedisCluster::getOption' => ['int', 'name' => 'string'], 'RedisCluster::getRange' => ['string', 'key' => 'string', 'start' => 'int', 'end' => 'int'], 'RedisCluster::getSet' => ['string', 'key' => 'string', 'value' => 'string'], 'RedisCluster::hDel' => ['int', 'key' => 'string', 'hashKey1' => 'string', 'hashKey2=' => 'string', 'hashKeyN=' => 'string'], 'RedisCluster::hExists' => ['bool', 'key' => 'string', 'hashKey' => 'string'], 'RedisCluster::hGet' => ['string', 'key' => 'string', 'hashKey' => 'string'], 'RedisCluster::hGetAll' => ['array', 'key' => 'string'], 'RedisCluster::hIncrBy' => ['int', 'key' => 'string', 'hashKey' => 'string', 'value' => 'int'], 'RedisCluster::hIncrByFloat' => ['float', 'key' => 'string', 'field' => 'string', 'increment' => 'float'], 'RedisCluster::hKeys' => ['array', 'key' => 'string'], 'RedisCluster::hLen' => ['int', 'key' => 'string'], 'RedisCluster::hMGet' => ['array', 'key' => 'string', 'hashKeys' => 'array'], 'RedisCluster::hMSet' => ['bool', 'key' => 'string', 'hashKeys' => 'array'], 'RedisCluster::hScan' => ['array', 'key' => 'string', '&iterator' => 'int', 'pattern=' => 'string', 'count=' => 'int'], 'RedisCluster::hSet' => ['int', 'key' => 'string', 'hashKey' => 'string', 'value' => 'string'], 'RedisCluster::hSetNx' => ['bool', 'key' => 'string', 'hashKey' => 'string', 'value' => 'string'], 'RedisCluster::hVals' => ['array', 'key' => 'string'], 'RedisCluster::incr' => ['int', 'key' => 'string'], 'RedisCluster::incrBy' => ['int', 'key' => 'string', 'value' => 'int'], 'RedisCluster::incrByFloat' => ['float', 'key' => 'string', 'increment' => 'float'], 'RedisCluster::info' => ['string', 'option=' => 'string'], 'RedisCluster::keys' => ['array', 'pattern' => 'string'], 'RedisCluster::lastSave' => ['int', 'nodeParams' => 'string'], 'RedisCluster::lGet' => ['', 'key' => 'string', 'index' => 'int'], 'RedisCluster::lIndex' => ['string', 'key' => 'string', 'index' => 'int'], 'RedisCluster::lInsert' => ['int', 'key' => 'string', 'position' => 'int', 'pivot' => 'string', 'value' => 'string'], 'RedisCluster::lLen' => ['int', 'key' => 'string'], 'RedisCluster::lPop' => ['string', 'key' => 'string'], 'RedisCluster::lPush' => ['int', 'key' => 'string', 'value1' => 'string', 'value2=' => 'string', 'valueN=' => 'string'], 'RedisCluster::lPushx' => ['int', 'key' => 'string', 'value' => 'string'], 'RedisCluster::lRange' => ['array', 'key' => 'string', 'start' => 'int', 'end' => 'int'], 'RedisCluster::lRem' => ['int', 'key' => 'string', 'value' => 'string', 'count' => 'int'], 'RedisCluster::lSet' => ['bool', 'key' => 'string', 'index' => 'int', 'value' => 'string'], 'RedisCluster::lTrim' => ['array', 'key' => 'string', 'start' => 'int', 'stop' => 'int'], 'RedisCluster::mget' => ['array', 'array' => 'array'], 'RedisCluster::mset' => ['bool', 'array' => 'array'], 'RedisCluster::msetnx' => ['int', 'array' => 'array'], 'RedisCluster::multi' => ['Redis', 'mode=' => 'int'], 'RedisCluster::object' => ['string', 'string=' => 'string', 'key=' => 'string'], 'RedisCluster::persist' => ['bool', 'key' => 'string'], 'RedisCluster::pExpire' => ['bool', 'key' => 'string', 'ttl' => 'int'], 'RedisCluster::pExpireAt' => ['bool', 'key' => 'string', 'timestamp' => 'int'], 'RedisCluster::pfAdd' => ['bool', 'key' => 'string', 'elements' => 'array'], 'RedisCluster::pfCount' => ['int', 'key' => 'string'], 'RedisCluster::pfMerge' => ['bool', 'destKey' => 'string', 'sourceKeys' => 'array'], 'RedisCluster::ping' => ['string', 'nodeParams' => 'string'], 'RedisCluster::psetex' => ['bool', 'key' => 'string', 'ttl' => 'int', 'value' => 'string'], 'RedisCluster::psubscribe' => ['mixed', 'patterns' => 'array', 'callback' => 'string'], 'RedisCluster::pttl' => ['int', 'key' => 'string'], 'RedisCluster::publish' => ['int', 'channel' => 'string', 'message' => 'string'], 'RedisCluster::pubsub' => ['array', 'nodeParams' => 'string', 'keyword' => 'string', 'argument' => 'string'], 'RedisCluster::punSubscribe' => ['', 'channels' => '', 'callback' => ''], 'RedisCluster::randomKey' => ['string', 'nodeParams' => 'string'], 'RedisCluster::rawCommand' => ['mixed', 'nodeParams' => 'string', 'command' => 'string', 'arguments' => 'mixed'], 'RedisCluster::rename' => ['bool', 'srcKey' => 'string', 'dstKey' => 'string'], 'RedisCluster::renameNx' => ['bool', 'srcKey' => 'string', 'dstKey' => 'string'], 'RedisCluster::restore' => ['bool', 'key' => 'string', 'ttl' => 'int', 'value' => 'string'], 'RedisCluster::role' => ['array', 'nodeParams' => 'string'], 'RedisCluster::rPop' => ['string', 'key' => 'string'], 'RedisCluster::rpoplpush' => ['string', 'srcKey' => 'string', 'dstKey' => 'string'], 'RedisCluster::rPush' => ['int', 'key' => 'string', 'value1' => 'string', 'value2=' => 'string', 'valueN=' => 'string'], 'RedisCluster::rPushx' => ['int', 'key' => 'string', 'value' => 'string'], 'RedisCluster::sAdd' => ['int', 'key' => 'string', 'value1' => 'string', 'value2=' => 'string', 'valueN=' => 'string'], 'RedisCluster::sAddArray' => ['int', 'key' => 'string', 'valueArray' => 'array'], 'RedisCluster::save' => ['bool', 'nodeParams' => 'string'], 'RedisCluster::scan' => ['array', '&iterator' => 'int', 'pattern=' => 'string', 'count=' => 'int'], 'RedisCluster::sCard' => ['int', 'key' => 'string'], 'RedisCluster::script' => ['mixed', 'nodeParams' => 'string', 'command' => 'string', 'script' => 'string'], 'RedisCluster::sDiff' => ['array', 'key1' => 'string', 'key2' => 'string', 'keyN=' => 'string'], 'RedisCluster::sDiffStore' => ['int', 'dstKey' => 'string', 'key1' => 'string', 'key2' => 'string', 'keyN=' => 'string'], 'RedisCluster::set' => ['bool', 'key' => 'string', 'value' => 'string', 'timeout=' => 'array|int'], 'RedisCluster::setBit' => ['int', 'key' => 'string', 'offset' => 'int', 'value' => 'bool|int'], 'RedisCluster::setex' => ['bool', 'key' => 'string', 'ttl' => 'int', 'value' => 'string'], 'RedisCluster::setnx' => ['bool', 'key' => 'string', 'value' => 'string'], 'RedisCluster::setOption' => ['bool', 'name' => 'string', 'value' => 'string'], 'RedisCluster::setRange' => ['string', 'key' => 'string', 'offset' => 'int', 'value' => 'string'], 'RedisCluster::sInter' => ['array', 'key1' => 'string', 'key2' => 'string', 'keyN=' => 'string'], 'RedisCluster::sInterStore' => ['int', 'dstKey' => 'string', 'key1' => 'string', 'key2' => 'string', 'keyN=' => 'string'], 'RedisCluster::sIsMember' => ['bool', 'key' => 'string', 'value' => 'string'], 'RedisCluster::slowLog' => ['', 'nodeParams' => 'string', 'command' => 'string', 'argument' => 'mixed'], 'RedisCluster::sMembers' => ['array', 'key' => 'string'], 'RedisCluster::sMove' => ['bool', 'srcKey' => 'string', 'dstKey' => 'string', 'member' => 'string'], 'RedisCluster::sort' => ['array', 'key' => 'string', 'option=' => 'array'], 'RedisCluster::sPop' => ['string', 'key' => 'string'], 'RedisCluster::sRandMember' => ['array|string', 'key' => 'string', 'count=' => 'int'], 'RedisCluster::sRem' => ['int', 'key' => 'string', 'member1' => 'string', 'member2=' => 'string', 'memberN=' => 'string'], 'RedisCluster::sScan' => ['array', 'key' => 'string', '&iterator' => 'int', 'pattern=' => 'null', 'count=' => 'int'], 'RedisCluster::strlen' => ['int', 'key' => 'string'], 'RedisCluster::subscribe' => ['mixed', 'channels' => 'array', 'callback' => 'string'], 'RedisCluster::sUnion' => ['array', 'key1' => 'string', 'key2' => 'string', 'keyN=' => 'string'], 'RedisCluster::sUnionStore' => ['int', 'dstKey' => 'string', 'key1' => 'string', 'key2' => 'string', 'keyN=' => 'string'], 'RedisCluster::time' => ['array', 'nodeParams' => 'string'], 'RedisCluster::ttl' => ['int', 'key' => 'string'], 'RedisCluster::type' => ['int', 'key' => 'string'], 'RedisCluster::unSubscribe' => ['', 'channels' => '', 'callback' => ''], 'RedisCluster::unwatch' => [''], 'RedisCluster::watch' => ['void', 'key' => 'string'], 'RedisCluster::zAdd' => ['int', 'key' => 'string', 'score1' => 'float', 'value1' => 'string', 'score2=' => 'float', 'value2=' => 'string', 'scoreN=' => 'float', 'valueN=' => 'string'], 'RedisCluster::zCard' => ['int', 'key' => 'string'], 'RedisCluster::zCount' => ['int', 'key' => 'string', 'start' => 'string', 'end' => 'string'], 'RedisCluster::zIncrBy' => ['float', 'key' => 'string', 'value' => 'float', 'member' => 'string'], 'RedisCluster::zInterStore' => ['int', 'Output' => 'string', 'ZSetKeys' => 'array', 'Weights=' => '?array', 'aggregateFunction=' => 'string'], 'RedisCluster::zLexCount' => ['int', 'key' => 'string', 'min' => 'int', 'max' => 'int'], 'RedisCluster::zRange' => ['array', 'key' => 'string', 'start' => 'int', 'end' => 'int', 'withscores=' => 'bool'], 'RedisCluster::zRangeByLex' => ['array', 'key' => 'string', 'min' => 'int', 'max' => 'int', 'offset=' => 'int', 'limit=' => 'int'], 'RedisCluster::zRangeByScore' => ['array', 'key' => 'string', 'start' => 'int', 'end' => 'int', 'options=' => 'array'], 'RedisCluster::zRank' => ['int', 'key' => 'string', 'member' => 'string'], 'RedisCluster::zRem' => ['int', 'key' => 'string', 'member1' => 'string', 'member2=' => 'string', 'memberN=' => 'string'], 'RedisCluster::zRemRangeByLex' => ['array', 'key' => 'string', 'min' => 'int', 'max' => 'int'], 'RedisCluster::zRemRangeByRank' => ['int', 'key' => 'string', 'start' => 'int', 'end' => 'int'], 'RedisCluster::zRemRangeByScore' => ['int', 'key' => 'string', 'start' => 'float|string', 'end' => 'float|string'], 'RedisCluster::zRevRange' => ['array', 'key' => 'string', 'start' => 'int', 'end' => 'int', 'withscore=' => 'bool'], 'RedisCluster::zRevRangeByLex' => ['array', 'key' => 'string', 'min' => 'int', 'max' => 'int', 'offset=' => 'int', 'limit=' => 'int'], 'RedisCluster::zRevRangeByScore' => ['array', 'key' => 'string', 'start' => 'int', 'end' => 'int', 'options=' => 'array'], 'RedisCluster::zRevRank' => ['int', 'key' => 'string', 'member' => 'string'], 'RedisCluster::zScan' => ['array', 'key' => 'string', '&iterator' => 'int', 'pattern=' => 'string', 'count=' => 'int'], 'RedisCluster::zScore' => ['float', 'key' => 'string', 'member' => 'string'], 'RedisCluster::zUnionStore' => ['int', 'Output' => 'string', 'ZSetKeys' => 'array', 'Weights=' => '?array', 'aggregateFunction=' => 'string'], 'Reflection::export' => ['string|null', 'r' => 'reflector', 'return=' => 'bool'], 'Reflection::getModifierNames' => ['array', 'modifiers' => 'int'], 'ReflectionClass::__clone' => ['void'], 'ReflectionClass::__construct' => ['void', 'argument' => ''], 'ReflectionClass::__toString' => ['string'], 'ReflectionClass::export' => ['string|null', 'argument' => 'string|object', 'return=' => 'bool'], 'ReflectionClass::getConstant' => ['mixed', 'name' => 'string'], 'ReflectionClass::getConstants' => ['array<string,mixed>'], 'ReflectionClass::getConstructor' => ['ReflectionMethod|null'], 'ReflectionClass::getDefaultProperties' => ['array'], 'ReflectionClass::getDocComment' => ['string|false'], 'ReflectionClass::getEndLine' => ['int|false'], 'ReflectionClass::getExtension' => ['ReflectionExtension|null'], 'ReflectionClass::getExtensionName' => ['string|false'], 'ReflectionClass::getFileName' => ['string|false'], 'ReflectionClass::getInterfaceNames' => ['string[]'], 'ReflectionClass::getInterfaces' => ['array<string, ReflectionClass>'], 'ReflectionClass::getMethod' => ['ReflectionMethod', 'name' => 'string'], 'ReflectionClass::getMethods' => ['ReflectionMethod[]', 'filter=' => 'int'], 'ReflectionClass::getModifiers' => ['int'], 'ReflectionClass::getName' => ['string'], 'ReflectionClass::getNamespaceName' => ['string'], 'ReflectionClass::getParentClass' => ['ReflectionClass|false'], 'ReflectionClass::getProperties' => ['ReflectionProperty[]', 'filter=' => 'int'], 'ReflectionClass::getProperty' => ['ReflectionProperty', 'name' => 'string'], 'ReflectionClass::getReflectionConstant' => ['ReflectionClassConstant|false', 'name' => 'string'], 'ReflectionClass::getReflectionConstants' => ['array<int,ReflectionClassConstant>'], 'ReflectionClass::getShortName' => ['string'], 'ReflectionClass::getStartLine' => ['int|false'], 'ReflectionClass::getStaticProperties' => ['ReflectionProperty[]'], 'ReflectionClass::getStaticPropertyValue' => ['mixed', 'name' => 'string', 'default=' => 'mixed'], 'ReflectionClass::getTraitAliases' => ['array<string,string>'], 'ReflectionClass::getTraitNames' => ['array<int,string>'], 'ReflectionClass::getTraits' => ['array<string,ReflectionClass>'], 'ReflectionClass::hasConstant' => ['bool', 'name' => 'string'], 'ReflectionClass::hasMethod' => ['bool', 'name' => 'string'], 'ReflectionClass::hasProperty' => ['bool', 'name' => 'string'], 'ReflectionClass::implementsInterface' => ['bool', 'interface_name' => 'string|reflectionclass'], 'ReflectionClass::inNamespace' => ['bool'], 'ReflectionClass::isAbstract' => ['bool'], 'ReflectionClass::isAnonymous' => ['bool'], 'ReflectionClass::isCloneable' => ['bool'], 'ReflectionClass::isFinal' => ['bool'], 'ReflectionClass::isInstance' => ['bool', 'object' => 'object'], 'ReflectionClass::isInstantiable' => ['bool'], 'ReflectionClass::isInterface' => ['bool'], 'ReflectionClass::isInternal' => ['bool'], 'ReflectionClass::isIterable' => ['bool'], 'ReflectionClass::isIterateable' => ['bool'], 'ReflectionClass::isSubclassOf' => ['bool', 'class' => 'string|reflectionclass'], 'ReflectionClass::isTrait' => ['bool'], 'ReflectionClass::isUserDefined' => ['bool'], 'ReflectionClass::newInstance' => ['object', 'args=' => 'mixed', '...args=' => 'mixed'], 'ReflectionClass::newInstanceArgs' => ['object', 'args=' => 'array'], 'ReflectionClass::newInstanceWithoutConstructor' => ['object'], 'ReflectionClass::setStaticPropertyValue' => ['void', 'name' => 'string', 'value' => 'string'], 'ReflectionClassConstant::__construct' => ['void', 'class' => 'mixed', 'name' => 'string'], 'ReflectionClassConstant::__toString' => ['string'], 'ReflectionClassConstant::export' => ['string', 'class' => 'mixed', 'name' => 'string', 'return=' => 'bool'], 'ReflectionClassConstant::getDeclaringClass' => ['ReflectionClass'], 'ReflectionClassConstant::getDocComment' => ['string|false'], 'ReflectionClassConstant::getModifiers' => ['int'], 'ReflectionClassConstant::getName' => ['string'], 'ReflectionClassConstant::getValue' => ['mixed'], 'ReflectionClassConstant::isPrivate' => ['bool'], 'ReflectionClassConstant::isProtected' => ['bool'], 'ReflectionClassConstant::isPublic' => ['bool'], 'ReflectionExtension::__clone' => ['void'], 'ReflectionExtension::__construct' => ['void', 'name' => 'string'], 'ReflectionExtension::__toString' => ['string'], 'ReflectionExtension::export' => ['string|null', 'name' => 'string', 'return=' => 'bool'], 'ReflectionExtension::getClasses' => ['array<string,ReflectionClass>'], 'ReflectionExtension::getClassNames' => ['array<int,string>'], 'ReflectionExtension::getConstants' => ['array<string,mixed>'], 'ReflectionExtension::getDependencies' => ['array<string,string>'], 'ReflectionExtension::getFunctions' => ['array<string,ReflectionFunction>'], 'ReflectionExtension::getINIEntries' => ['array<string,mixed>'], 'ReflectionExtension::getName' => ['string'], 'ReflectionExtension::getVersion' => ['string'], 'ReflectionExtension::info' => ['void'], 'ReflectionExtension::isPersistent' => ['void'], 'ReflectionExtension::isTemporary' => ['bool'], 'ReflectionFunction::__construct' => ['void', 'name' => 'string|Closure'], 'ReflectionFunction::__toString' => ['string'], 'ReflectionFunction::export' => ['string|null', 'name' => 'string', 'return=' => 'bool'], 'ReflectionFunction::getClosure' => ['?Closure'], 'ReflectionFunction::getClosureScopeClass' => ['ReflectionClass'], 'ReflectionFunction::getClosureThis' => ['bool'], 'ReflectionFunction::getDocComment' => ['string|false'], 'ReflectionFunction::getEndLine' => ['int|false'], 'ReflectionFunction::getExtension' => ['ReflectionExtension|null'], 'ReflectionFunction::getExtensionName' => ['string|false'], 'ReflectionFunction::getFileName' => ['string|false'], 'ReflectionFunction::getName' => ['string'], 'ReflectionFunction::getNamespaceName' => ['string'], 'ReflectionFunction::getNumberOfParameters' => ['int'], 'ReflectionFunction::getNumberOfRequiredParameters' => ['int'], 'ReflectionFunction::getParameters' => ['array<int,ReflectionParameter>'], 'ReflectionFunction::getReturnType' => ['?ReflectionType'], 'ReflectionFunction::getShortName' => ['string'], 'ReflectionFunction::getStartLine' => ['int|false'], 'ReflectionFunction::getStaticVariables' => ['array'], 'ReflectionFunction::inNamespace' => ['bool'], 'ReflectionFunction::invoke' => ['mixed', '...args=' => 'mixed'], 'ReflectionFunction::invokeArgs' => ['mixed', 'args' => 'array'], 'ReflectionFunction::isClosure' => ['bool'], 'ReflectionFunction::isDeprecated' => ['bool'], 'ReflectionFunction::isDisabled' => ['bool'], 'ReflectionFunction::isGenerator' => ['bool'], 'ReflectionFunction::isInternal' => ['bool'], 'ReflectionFunction::isUserDefined' => ['bool'], 'ReflectionFunction::isVariadic' => ['bool'], 'ReflectionFunction::returnsReference' => ['bool'], 'ReflectionFunctionAbstract::__clone' => ['void'], 'ReflectionFunctionAbstract::__toString' => ['string'], 'ReflectionFunctionAbstract::getClosureScopeClass' => ['ReflectionClass'], 'ReflectionFunctionAbstract::getClosureThis' => ['object'], 'ReflectionFunctionAbstract::getDocComment' => ['string|false'], 'ReflectionFunctionAbstract::getEndLine' => ['int|false'], 'ReflectionFunctionAbstract::getExtension' => ['ReflectionExtension'], 'ReflectionFunctionAbstract::getExtensionName' => ['string'], 'ReflectionFunctionAbstract::getFileName' => ['string|false'], 'ReflectionFunctionAbstract::getName' => ['string'], 'ReflectionFunctionAbstract::getNamespaceName' => ['string'], 'ReflectionFunctionAbstract::getNumberOfParameters' => ['int'], 'ReflectionFunctionAbstract::getNumberOfRequiredParameters' => ['int'], 'ReflectionFunctionAbstract::getParameters' => ['array<int,ReflectionParameter>'], 'ReflectionFunctionAbstract::getReturnType' => ['?ReflectionType'], 'ReflectionFunctionAbstract::getShortName' => ['string'], 'ReflectionFunctionAbstract::getStartLine' => ['int|false'], 'ReflectionFunctionAbstract::getStaticVariables' => ['array'], 'ReflectionFunctionAbstract::hasReturnType' => ['bool'], 'ReflectionFunctionAbstract::inNamespace' => ['bool'], 'ReflectionFunctionAbstract::isClosure' => ['bool'], 'ReflectionFunctionAbstract::isDeprecated' => ['bool'], 'ReflectionFunctionAbstract::isGenerator' => ['bool'], 'ReflectionFunctionAbstract::isInternal' => ['bool'], 'ReflectionFunctionAbstract::isUserDefined' => ['bool'], 'ReflectionFunctionAbstract::isVariadic' => ['bool'], 'ReflectionFunctionAbstract::returnsReference' => ['bool'], 'ReflectionGenerator::__construct' => ['void', 'generator' => 'object'], 'ReflectionGenerator::getExecutingFile' => ['string'], 'ReflectionGenerator::getExecutingGenerator' => ['Generator'], 'ReflectionGenerator::getExecutingLine' => ['int'], 'ReflectionGenerator::getFunction' => ['ReflectionFunctionAbstract'], 'ReflectionGenerator::getThis' => ['object'], 'ReflectionGenerator::getTrace' => ['array', 'options' => 'int'], 'ReflectionMethod::__construct' => ['void', 'class' => 'string|object', 'name' => 'string'], 'ReflectionMethod::__construct\'1' => ['void', 'class_method' => 'string'], 'ReflectionMethod::__toString' => ['string'], 'ReflectionMethod::export' => ['string|null', 'class' => 'string', 'name' => 'string', 'return=' => 'bool'], 'ReflectionMethod::getClosure' => ['?Closure', 'object' => '?object'], 'ReflectionMethod::getDeclaringClass' => ['ReflectionClass'], 'ReflectionMethod::getModifiers' => ['int'], 'ReflectionMethod::getPrototype' => ['ReflectionMethod'], 'ReflectionMethod::invoke' => ['mixed', 'object' => '?object', '...args=' => 'mixed'], 'ReflectionMethod::invokeArgs' => ['mixed', 'object' => '?object', 'args' => 'array'], 'ReflectionMethod::isAbstract' => ['bool'], 'ReflectionMethod::isConstructor' => ['bool'], 'ReflectionMethod::isDestructor' => ['bool'], 'ReflectionMethod::isFinal' => ['bool'], 'ReflectionMethod::isPrivate' => ['bool'], 'ReflectionMethod::isProtected' => ['bool'], 'ReflectionMethod::isPublic' => ['bool'], 'ReflectionMethod::isStatic' => ['bool'], 'ReflectionMethod::setAccessible' => ['void', 'visible' => 'bool'], 'ReflectionNamedType::getName' => ['string'], 'ReflectionObject::__construct' => ['void', 'argument' => 'object'], 'ReflectionObject::export' => ['string|null', 'argument' => 'object', 'return=' => 'bool'], 'ReflectionParameter::__clone' => ['void'], 'ReflectionParameter::__construct' => ['void', 'function' => '', 'parameter' => ''], 'ReflectionParameter::__toString' => ['string'], 'ReflectionParameter::allowsNull' => ['bool'], 'ReflectionParameter::canBePassedByValue' => ['bool'], 'ReflectionParameter::export' => ['string|null', 'function' => 'string', 'parameter' => 'string', 'return=' => 'bool'], 'ReflectionParameter::getClass' => ['ReflectionClass|null'], 'ReflectionParameter::getDeclaringClass' => ['ReflectionClass|null'], 'ReflectionParameter::getDeclaringFunction' => ['ReflectionFunctionAbstract'], 'ReflectionParameter::getDefaultValue' => ['mixed'], 'ReflectionParameter::getDefaultValueConstantName' => ['string'], 'ReflectionParameter::getName' => ['string'], 'ReflectionParameter::getPosition' => ['int'], 'ReflectionParameter::getType' => ['ReflectionType|null'], 'ReflectionParameter::hasType' => ['bool'], 'ReflectionParameter::isArray' => ['bool'], 'ReflectionParameter::isCallable' => ['bool'], 'ReflectionParameter::isDefaultValueAvailable' => ['bool'], 'ReflectionParameter::isDefaultValueConstant' => ['bool'], 'ReflectionParameter::isOptional' => ['bool'], 'ReflectionParameter::isPassedByReference' => ['bool'], 'ReflectionParameter::isVariadic' => ['bool'], 'ReflectionProperty::__clone' => ['void'], 'ReflectionProperty::__construct' => ['void', 'class' => '', 'name' => 'string'], 'ReflectionProperty::__toString' => ['string'], 'ReflectionProperty::export' => ['string|null', 'class' => 'mixed', 'name' => 'string', 'return=' => 'bool'], 'ReflectionProperty::getDeclaringClass' => ['ReflectionClass'], 'ReflectionProperty::getDocComment' => ['string|false'], 'ReflectionProperty::getModifiers' => ['int'], 'ReflectionProperty::getName' => ['string'], 'ReflectionProperty::getValue' => ['mixed', 'object=' => 'object'], 'ReflectionProperty::isDefault' => ['bool'], 'ReflectionProperty::isPrivate' => ['bool'], 'ReflectionProperty::isProtected' => ['bool'], 'ReflectionProperty::isPublic' => ['bool'], 'ReflectionProperty::isStatic' => ['bool'], 'ReflectionProperty::setAccessible' => ['void', 'visible' => 'bool'], 'ReflectionProperty::setValue' => ['void', 'object' => 'object', 'value' => ''], 'ReflectionProperty::setValue\'1' => ['void', 'value' => ''], 'ReflectionType::__toString' => ['string'], 'ReflectionType::allowsNull' => ['bool'], 'ReflectionType::getName' => ['string'], 'ReflectionType::isBuiltin' => ['bool'], 'ReflectionZendExtension::__clone' => ['void'], 'ReflectionZendExtension::__construct' => ['void', 'name' => 'string'], 'ReflectionZendExtension::__toString' => ['string'], 'ReflectionZendExtension::export' => ['string|null', 'name' => 'string', 'return=' => 'bool'], 'ReflectionZendExtension::getAuthor' => ['string'], 'ReflectionZendExtension::getCopyright' => ['string'], 'ReflectionZendExtension::getName' => ['string'], 'ReflectionZendExtension::getURL' => ['string'], 'ReflectionZendExtension::getVersion' => ['string'], 'Reflector::__toString' => ['string'], 'Reflector::export' => ['?string'], 'RegexIterator::__construct' => ['void', 'it' => 'iterator', 'regex' => 'string', 'mode=' => 'int', 'flags=' => 'int', 'preg_flags=' => 'int'], 'RegexIterator::accept' => ['bool'], 'RegexIterator::getFlags' => ['int'], 'RegexIterator::getMode' => ['int'], 'RegexIterator::getPregFlags' => ['int'], 'RegexIterator::getRegex' => ['string'], 'RegexIterator::setFlags' => ['bool', 'new_flags' => 'int'], 'RegexIterator::setMode' => ['bool', 'new_mode' => 'int'], 'RegexIterator::setPregFlags' => ['bool', 'new_flags' => 'int'], 'register_event_handler' => ['bool', 'event_handler_func' => 'event_handler_func', 'handler_register_name' => 'handler_register_name', 'event_type_mask' => 'event_type_mask'], 'register_shutdown_function' => ['void', 'function' => 'callable', '...parameter=' => 'mixed'], 'register_tick_function' => ['bool', 'function' => 'callable', '...args=' => 'mixed'], 'rename' => ['bool', 'old_name' => 'string', 'new_name' => 'string', 'context=' => 'resource'], 'rename_function' => ['bool', 'original_name' => 'string', 'new_name' => 'string'], 'reset' => ['mixed', '&rw_array_arg' => 'array|object'], 'ResourceBundle::__construct' => ['void', 'locale' => 'string', 'bundlename' => 'string', 'fallback=' => 'bool'], 'ResourceBundle::count' => ['int'], 'ResourceBundle::create' => ['?ResourceBundle', 'locale' => 'string', 'bundlename' => 'string', 'fallback=' => 'bool'], 'ResourceBundle::get' => ['', 'index' => 'string|int', 'fallback=' => 'bool'], 'ResourceBundle::getErrorCode' => ['int'], 'ResourceBundle::getErrorMessage' => ['string'], 'ResourceBundle::getLocales' => ['array', 'bundlename' => 'string'], 'resourcebundle_count' => ['int', 'r' => 'resourcebundle'], 'resourcebundle_create' => ['?ResourceBundle', 'locale' => 'string', 'bundlename' => 'string', 'fallback=' => 'bool'], 'resourcebundle_get' => ['', 'r' => 'resourcebundle', 'index' => 'string|int', 'fallback=' => 'bool'], 'resourcebundle_get_error_code' => ['int', 'r' => 'resourcebundle'], 'resourcebundle_get_error_message' => ['string', 'r' => 'resourcebundle'], 'resourcebundle_locales' => ['array', 'bundlename' => 'string'], 'restore_error_handler' => ['bool'], 'restore_exception_handler' => ['bool'], 'restore_include_path' => ['void'], 'rewind' => ['bool', 'fp' => 'resource'], 'rewinddir' => ['void', 'dir_handle=' => 'resource'], 'rmdir' => ['bool', 'dirname' => 'string', 'context=' => 'resource'], 'round' => ['float', 'number' => 'float', 'precision=' => 'int', 'mode=' => 'int'], 'rpm_close' => ['bool', 'rpmr' => 'resource'], 'rpm_get_tag' => ['mixed', 'rpmr' => 'resource', 'tagnum' => 'int'], 'rpm_is_valid' => ['bool', 'filename' => 'string'], 'rpm_open' => ['resource', 'filename' => 'string'], 'rpm_version' => ['string'], 'rrd_create' => ['bool', 'filename' => 'string', 'options' => 'array'], 'rrd_error' => ['string'], 'rrd_fetch' => ['array', 'filename' => 'string', 'options' => 'array'], 'rrd_first' => ['int', 'file' => 'string', 'raaindex=' => 'int'], 'rrd_graph' => ['array', 'filename' => 'string', 'options' => 'array'], 'rrd_info' => ['array', 'filename' => 'string'], 'rrd_last' => ['int', 'filename' => 'string'], 'rrd_lastupdate' => ['array', 'filename' => 'string'], 'rrd_restore' => ['bool', 'xml_file' => 'string', 'rrd_file' => 'string', 'options=' => 'array'], 'rrd_tune' => ['bool', 'filename' => 'string', 'options' => 'array'], 'rrd_update' => ['bool', 'filename' => 'string', 'options' => 'array'], 'rrd_version' => ['string'], 'rrd_xport' => ['array', 'options' => 'array'], 'rrdc_disconnect' => ['void'], 'RRDCreator::__construct' => ['void', 'path' => 'string', 'starttime=' => 'string', 'step=' => 'int'], 'RRDCreator::addArchive' => ['void', 'description' => 'string'], 'RRDCreator::addDataSource' => ['void', 'description' => 'string'], 'RRDCreator::save' => ['bool'], 'RRDGraph::__construct' => ['void', 'path' => 'string'], 'RRDGraph::save' => ['array'], 'RRDGraph::saveVerbose' => ['array'], 'RRDGraph::setOptions' => ['void', 'options' => 'array'], 'RRDUpdater::__construct' => ['void', 'path' => 'string'], 'RRDUpdater::update' => ['bool', 'values' => 'array', 'time=' => 'string'], 'rsort' => ['bool', '&rw_array_arg' => 'array', 'sort_flags=' => 'int'], 'rtrim' => ['string', 'str' => 'string', 'character_mask=' => 'string'], 'runkit_class_adopt' => ['bool', 'classname' => 'string', 'parentname' => 'string'], 'runkit_class_emancipate' => ['bool', 'classname' => 'string'], 'runkit_constant_add' => ['bool', 'constname' => 'string', 'value' => 'mixed'], 'runkit_constant_redefine' => ['bool', 'constname' => 'string', 'newvalue' => 'mixed'], 'runkit_constant_remove' => ['bool', 'constname' => 'string'], 'runkit_function_add' => ['bool', 'funcname' => 'string', 'arglist' => 'string', 'code' => 'string', 'doccomment=' => '?string'], 'runkit_function_add\'1' => ['bool', 'funcname' => 'string', 'closure' => 'Closure', 'doccomment=' => '?string'], 'runkit_function_copy' => ['bool', 'funcname' => 'string', 'targetname' => 'string'], 'runkit_function_redefine' => ['bool', 'funcname' => 'string', 'arglist' => 'string', 'code' => 'string', 'doccomment=' => '?string'], 'runkit_function_redefine\'1' => ['bool', 'funcname' => 'string', 'closure' => 'Closure', 'doccomment=' => '?string'], 'runkit_function_remove' => ['bool', 'funcname' => 'string'], 'runkit_function_rename' => ['bool', 'funcname' => 'string', 'newname' => 'string'], 'runkit_import' => ['bool', 'filename' => 'string', 'flags=' => 'int'], 'runkit_lint' => ['bool', 'code' => 'string'], 'runkit_lint_file' => ['bool', 'filename' => 'string'], 'runkit_method_add' => ['bool', 'classname' => 'string', 'methodname' => 'string', 'args' => 'string', 'code' => 'string', 'flags=' => 'int', 'doccomment=' => '?string'], 'runkit_method_add\'1' => ['bool', 'classname' => 'string', 'methodname' => 'string', 'closure' => 'Closure', 'flags=' => 'int', 'doccomment=' => '?string'], 'runkit_method_copy' => ['bool', 'dclass' => 'string', 'dmethod' => 'string', 'sclass' => 'string', 'smethod=' => 'string'], 'runkit_method_redefine' => ['bool', 'classname' => 'string', 'methodname' => 'string', 'args' => 'string', 'code' => 'string', 'flags=' => 'int', 'doccomment=' => '?string'], 'runkit_method_redefine\'1' => ['bool', 'classname' => 'string', 'methodname' => 'string', 'closure' => 'Closure', 'flags=' => 'int', 'doccomment=' => '?string'], 'runkit_method_remove' => ['bool', 'classname' => 'string', 'methodname' => 'string'], 'runkit_method_rename' => ['bool', 'classname' => 'string', 'methodname' => 'string', 'newname' => 'string'], 'runkit_return_value_used' => ['bool'], 'Runkit_Sandbox::__construct' => ['void', 'options=' => 'array'], 'runkit_sandbox_output_handler' => ['mixed', 'sandbox' => 'object', 'callback=' => 'mixed'], 'Runkit_Sandbox_Parent' => [''], 'Runkit_Sandbox_Parent::__construct' => ['void'], 'runkit_superglobals' => ['array'], 'RuntimeException::__clone' => ['void'], 'RuntimeException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?Throwable|?RuntimeException'], 'RuntimeException::__toString' => ['string'], 'RuntimeException::getCode' => ['int'], 'RuntimeException::getFile' => ['string'], 'RuntimeException::getLine' => ['int'], 'RuntimeException::getMessage' => ['string'], 'RuntimeException::getPrevious' => ['Throwable|RuntimeException|null'], 'RuntimeException::getTrace' => ['array'], 'RuntimeException::getTraceAsString' => ['string'], 'SAMConnection::commit' => ['bool'], 'SAMConnection::connect' => ['bool', 'protocol' => 'string', 'properties=' => 'array'], 'SAMConnection::disconnect' => ['bool'], 'SAMConnection::errno' => ['int'], 'SAMConnection::error' => ['string'], 'SAMConnection::isConnected' => ['bool'], 'SAMConnection::peek' => ['SAMMessage', 'target' => 'string', 'properties=' => 'array'], 'SAMConnection::peekAll' => ['array', 'target' => 'string', 'properties=' => 'array'], 'SAMConnection::receive' => ['SAMMessage', 'target' => 'string', 'properties=' => 'array'], 'SAMConnection::remove' => ['SAMMessage', 'target' => 'string', 'properties=' => 'array'], 'SAMConnection::rollback' => ['bool'], 'SAMConnection::send' => ['string', 'target' => 'string', 'msg' => 'sammessage', 'properties=' => 'array'], 'SAMConnection::setDebug' => ['', 'switch' => 'bool'], 'SAMConnection::subscribe' => ['string', 'targettopic' => 'string'], 'SAMConnection::unsubscribe' => ['bool', 'subscriptionid' => 'string', 'targettopic=' => 'string'], 'SAMMessage::body' => ['string'], 'SAMMessage::header' => ['object'], 'sapi_windows_cp_conv' => ['string', 'in_codepage' => 'int|string', 'out_codepage' => 'int|string', 'subject' => 'string'], 'sapi_windows_cp_get' => ['int'], 'sapi_windows_cp_is_utf8' => ['bool'], 'sapi_windows_cp_set' => ['bool', 'code_page' => 'int'], 'sapi_windows_vt100_support' => ['bool', 'stream' => 'resource', 'enable=' => 'bool'], 'SCA::createDataObject' => ['SDO_DataObject', 'type_namespace_uri' => 'string', 'type_name' => 'string'], 'SCA::getService' => ['', 'target' => 'string', 'binding=' => 'string', 'config=' => 'array'], 'SCA_LocalProxy::createDataObject' => ['SDO_DataObject', 'type_namespace_uri' => 'string', 'type_name' => 'string'], 'SCA_SoapProxy::createDataObject' => ['SDO_DataObject', 'type_namespace_uri' => 'string', 'type_name' => 'string'], 'scalebarObj::convertToString' => ['string'], 'scalebarObj::free' => ['void'], 'scalebarObj::set' => ['int', 'property_name' => 'string', 'new_value' => ''], 'scalebarObj::setImageColor' => ['int', 'red' => 'int', 'green' => 'int', 'blue' => 'int'], 'scalebarObj::updateFromString' => ['int', 'snippet' => 'string'], 'scandir' => ['array<int,string>|false', 'dir' => 'string', 'sorting_order=' => 'int', 'context=' => 'resource'], 'SDO_DAS_ChangeSummary::beginLogging' => [''], 'SDO_DAS_ChangeSummary::endLogging' => [''], 'SDO_DAS_ChangeSummary::getChangedDataObjects' => ['SDO_List'], 'SDO_DAS_ChangeSummary::getChangeType' => ['int', 'dataobject' => 'sdo_dataobject'], 'SDO_DAS_ChangeSummary::getOldContainer' => ['SDO_DataObject', 'data_object' => 'sdo_dataobject'], 'SDO_DAS_ChangeSummary::getOldValues' => ['SDO_List', 'data_object' => 'sdo_dataobject'], 'SDO_DAS_ChangeSummary::isLogging' => ['bool'], 'SDO_DAS_DataFactory::addPropertyToType' => ['', 'parent_type_namespace_uri' => 'string', 'parent_type_name' => 'string', 'property_name' => 'string', 'type_namespace_uri' => 'string', 'type_name' => 'string', 'options=' => 'array'], 'SDO_DAS_DataFactory::addType' => ['', 'type_namespace_uri' => 'string', 'type_name' => 'string', 'options=' => 'array'], 'SDO_DAS_DataFactory::getDataFactory' => ['SDO_DAS_DataFactory'], 'SDO_DAS_DataObject::getChangeSummary' => ['SDO_DAS_ChangeSummary'], 'SDO_DAS_Relational::__construct' => ['void', 'database_metadata' => 'array', 'application_root_type=' => 'string', 'sdo_containment_references_metadata=' => 'array'], 'SDO_DAS_Relational::applyChanges' => ['', 'database_handle' => 'pdo', 'root_data_object' => 'sdodataobject'], 'SDO_DAS_Relational::createRootDataObject' => ['SDODataObject'], 'SDO_DAS_Relational::executePreparedQuery' => ['SDODataObject', 'database_handle' => 'pdo', 'prepared_statement' => 'pdostatement', 'value_list' => 'array', 'column_specifier=' => 'array'], 'SDO_DAS_Relational::executeQuery' => ['SDODataObject', 'database_handle' => 'pdo', 'sql_statement' => 'string', 'column_specifier=' => 'array'], 'SDO_DAS_Setting::getListIndex' => ['int'], 'SDO_DAS_Setting::getPropertyIndex' => ['int'], 'SDO_DAS_Setting::getPropertyName' => ['string'], 'SDO_DAS_Setting::getValue' => [''], 'SDO_DAS_Setting::isSet' => ['bool'], 'SDO_DAS_XML::addTypes' => ['', 'xsd_file' => 'string'], 'SDO_DAS_XML::create' => ['SDO_DAS_XML', 'xsd_file=' => 'mixed', 'key=' => 'string'], 'SDO_DAS_XML::createDataObject' => ['SDO_DataObject', 'namespace_uri' => 'string', 'type_name' => 'string'], 'SDO_DAS_XML::createDocument' => ['SDO_DAS_XML_Document', 'document_element_name' => 'string', 'document_element_namespace_uri' => 'string', 'dataobject=' => 'sdo_dataobject'], 'SDO_DAS_XML::loadFile' => ['SDO_XMLDocument', 'xml_file' => 'string'], 'SDO_DAS_XML::loadString' => ['SDO_DAS_XML_Document', 'xml_string' => 'string'], 'SDO_DAS_XML::saveFile' => ['', 'xdoc' => 'sdo_xmldocument', 'xml_file' => 'string', 'indent=' => 'int'], 'SDO_DAS_XML::saveString' => ['string', 'xdoc' => 'sdo_xmldocument', 'indent=' => 'int'], 'SDO_DAS_XML_Document::getRootDataObject' => ['SDO_DataObject'], 'SDO_DAS_XML_Document::getRootElementName' => ['string'], 'SDO_DAS_XML_Document::getRootElementURI' => ['string'], 'SDO_DAS_XML_Document::setEncoding' => ['', 'encoding' => 'string'], 'SDO_DAS_XML_Document::setXMLDeclaration' => ['', 'xmldeclatation' => 'bool'], 'SDO_DAS_XML_Document::setXMLVersion' => ['', 'xmlversion' => 'string'], 'SDO_DataFactory::create' => ['void', 'type_namespace_uri' => 'string', 'type_name' => 'string'], 'SDO_DataObject::clear' => ['void'], 'SDO_DataObject::createDataObject' => ['SDO_DataObject', 'identifier' => ''], 'SDO_DataObject::getContainer' => ['SDO_DataObject'], 'SDO_DataObject::getSequence' => ['SDO_Sequence'], 'SDO_DataObject::getTypeName' => ['string'], 'SDO_DataObject::getTypeNamespaceURI' => ['string'], 'SDO_Exception::getCause' => [''], 'SDO_List::insert' => ['void', 'value' => 'mixed', 'index=' => 'int'], 'SDO_Model_Property::getContainingType' => ['SDO_Model_Type'], 'SDO_Model_Property::getDefault' => [''], 'SDO_Model_Property::getName' => ['string'], 'SDO_Model_Property::getType' => ['SDO_Model_Type'], 'SDO_Model_Property::isContainment' => ['bool'], 'SDO_Model_Property::isMany' => ['bool'], 'SDO_Model_ReflectionDataObject::__construct' => ['void', 'data_object' => 'sdo_dataobject'], 'SDO_Model_ReflectionDataObject::export' => ['mixed', 'rdo' => 'sdo_model_reflectiondataobject', 'return=' => 'bool'], 'SDO_Model_ReflectionDataObject::getContainmentProperty' => ['SDO_Model_Property'], 'SDO_Model_ReflectionDataObject::getInstanceProperties' => ['array'], 'SDO_Model_ReflectionDataObject::getType' => ['SDO_Model_Type'], 'SDO_Model_Type::getBaseType' => ['SDO_Model_Type'], 'SDO_Model_Type::getName' => ['string'], 'SDO_Model_Type::getNamespaceURI' => ['string'], 'SDO_Model_Type::getProperties' => ['array'], 'SDO_Model_Type::getProperty' => ['SDO_Model_Property', 'identifier' => ''], 'SDO_Model_Type::isAbstractType' => ['bool'], 'SDO_Model_Type::isDataType' => ['bool'], 'SDO_Model_Type::isInstance' => ['bool', 'data_object' => 'sdo_dataobject'], 'SDO_Model_Type::isOpenType' => ['bool'], 'SDO_Model_Type::isSequencedType' => ['bool'], 'SDO_Sequence::getProperty' => ['SDO_Model_Property', 'sequence_index' => 'int'], 'SDO_Sequence::insert' => ['void', 'value' => 'mixed', 'sequenceindex=' => 'int', 'propertyidentifier=' => 'mixed'], 'SDO_Sequence::move' => ['void', 'toindex' => 'int', 'fromindex' => 'int'], 'SeekableIterator::seek' => ['void', 'position' => 'int'], 'sem_acquire' => ['bool', 'sem_identifier' => 'resource', 'nowait=' => 'bool'], 'sem_get' => ['resource', 'key' => 'int', 'max_acquire=' => 'int', 'perm=' => 'int', 'auto_release=' => 'int'], 'sem_release' => ['bool', 'sem_identifier' => 'resource'], 'sem_remove' => ['bool', 'sem_identifier' => 'resource'], 'Serializable::serialize' => ['string'], 'Serializable::unserialize' => ['void', 'serialized' => 'string'], 'serialize' => ['string', 'variable' => 'mixed'], 'ServerRequest::withInput' => ['ServerRequest', 'input' => 'mixed'], 'ServerRequest::withoutParams' => ['ServerRequest', 'params' => 'int|string'], 'ServerRequest::withParam' => ['ServerRequest', 'key' => 'int|string', 'val' => 'mixed'], 'ServerRequest::withParams' => ['ServerRequest', 'params' => 'mixed'], 'ServerRequest::withUrl' => ['ServerRequest', 'url' => 'array'], 'ServerResponse::addHeader' => ['void', 'label' => 'string', 'value' => 'string'], 'ServerResponse::date' => ['string', 'date' => 'string|DateTimeInterface'], 'ServerResponse::getHeader' => ['string', 'label' => 'string'], 'ServerResponse::getHeaders' => ['string[]'], 'ServerResponse::getStatus' => ['int'], 'ServerResponse::getVersion' => ['string'], 'ServerResponse::setHeader' => ['void', 'label' => 'string', 'value' => 'string'], 'ServerResponse::setStatus' => ['void', 'status' => 'int'], 'ServerResponse::setVersion' => ['void', 'version' => 'string'], 'session_abort' => ['bool'], 'session_cache_expire' => ['int', 'new_cache_expire=' => 'int'], 'session_cache_limiter' => ['string', 'new_cache_limiter=' => 'string'], 'session_commit' => ['bool'], 'session_create_id' => ['string', 'prefix=' => 'string'], 'session_decode' => ['bool', 'data' => 'string'], 'session_destroy' => ['bool'], 'session_encode' => ['string'], 'session_gc' => ['int'], 'session_get_cookie_params' => ['array'], 'session_id' => ['string', 'newid=' => 'string'], 'session_is_registered' => ['bool', 'name' => 'string'], 'session_module_name' => ['string', 'newname=' => 'string'], 'session_name' => ['string', 'newname=' => 'string'], 'session_pgsql_add_error' => ['bool', 'error_level' => 'int', 'error_message=' => 'string'], 'session_pgsql_get_error' => ['array', 'with_error_message=' => 'bool'], 'session_pgsql_get_field' => ['string'], 'session_pgsql_reset' => ['bool'], 'session_pgsql_set_field' => ['bool', 'value' => 'string'], 'session_pgsql_status' => ['array'], 'session_regenerate_id' => ['bool', 'delete_old_session=' => 'bool'], 'session_register' => ['bool', 'name' => 'mixed', '...args=' => 'mixed'], 'session_register_shutdown' => ['void'], 'session_reset' => ['bool'], 'session_save_path' => ['string', 'newname=' => 'string'], 'session_set_cookie_params' => ['bool', 'lifetime' => 'int', 'path=' => 'string', 'domain=' => '?string', 'secure=' => 'bool', 'httponly=' => 'bool'], 'session_set_save_handler' => ['bool', 'open' => 'callable', 'close' => 'callable', 'read' => 'callable', 'write' => 'callable', 'destroy' => 'callable', 'gc' => 'callable', 'create_sid=' => 'callable', 'validate_sid=' => 'callable', 'update_timestamp=' => 'callable'], 'session_set_save_handler\'1' => ['bool', 'sessionhandler' => 'SessionHandlerInterface', 'register_shutdown=' => 'bool'], 'session_start' => ['bool', 'options=' => 'array'], 'session_status' => ['int'], 'session_unregister' => ['bool', 'name' => 'string'], 'session_unset' => ['bool'], 'session_write_close' => ['bool'], 'SessionHandler::close' => ['bool'], 'SessionHandler::create_sid' => ['char'], 'SessionHandler::destroy' => ['bool', 'id' => 'string'], 'SessionHandler::gc' => ['bool', 'maxlifetime' => 'int'], 'SessionHandler::open' => ['bool', 'save_path' => 'string', 'session_name' => 'string'], 'SessionHandler::read' => ['string', 'id' => 'string'], 'SessionHandler::updateTimestamp' => ['bool', 'session_id' => 'string', 'session_data' => 'string'], 'SessionHandler::validateId' => ['bool', 'session_id' => 'string'], 'SessionHandler::write' => ['bool', 'id' => 'string', 'data' => 'string'], 'SessionHandlerInterface::close' => ['bool'], 'SessionHandlerInterface::destroy' => ['bool', 'session_id' => 'string'], 'SessionHandlerInterface::gc' => ['bool', 'maxlifetime' => 'int'], 'SessionHandlerInterface::open' => ['bool', 'save_path' => 'string', 'name' => 'string'], 'SessionHandlerInterface::read' => ['string', 'session_id' => 'string'], 'SessionHandlerInterface::write' => ['bool', 'session_id' => 'string', 'session_data' => 'string'], 'SessionIdInterface::create_sid' => ['string'], 'SessionUpdateTimestampHandler::updateTimestamp' => ['bool', 'id' => 'string', 'data' => 'string'], 'SessionUpdateTimestampHandler::validateId' => ['char', 'id' => 'string'], 'SessionUpdateTimestampHandlerInterface::updateTimestamp' => ['bool', 'key' => 'string', 'val' => 'string'], 'SessionUpdateTimestampHandlerInterface::validateId' => ['bool', 'key' => 'string'], 'set_error_handler' => ['?callable', 'error_handler' => 'callable', 'error_types=' => 'int'], 'set_exception_handler' => ['?callable', 'exception_handler' => 'callable'], 'set_file_buffer' => ['int', 'fp' => 'resource', 'buffer' => 'int'], 'set_include_path' => ['string', 'new_include_path' => 'string'], 'set_magic_quotes_runtime' => ['bool', 'new_setting' => 'bool'], 'set_time_limit' => ['bool', 'seconds' => 'int'], 'setcookie' => ['bool', 'name' => 'string', 'value=' => 'string', 'expires=' => 'int', 'path=' => 'string', 'domain=' => 'string', 'secure=' => 'bool', 'httponly=' => 'bool'], 'setLeftFill' => ['void', 'red' => 'int', 'green' => 'int', 'blue' => 'int', 'a=' => 'int'], 'setLine' => ['void', 'width' => 'int', 'red' => 'int', 'green' => 'int', 'blue' => 'int', 'a=' => 'int'], 'setlocale' => ['string|false', 'category' => 'int', 'locale' => 'string', '...args=' => 'string'], 'setlocale\'1' => ['string|false', 'category' => 'int', 'locale' => '?array'], 'setproctitle' => ['void', 'title' => 'string'], 'setrawcookie' => ['bool', 'name' => 'string', 'value=' => 'string', 'expires=' => 'int', 'path=' => 'string', 'domain=' => 'string', 'secure=' => 'bool', 'httponly=' => 'bool'], 'setRightFill' => ['void', 'red' => 'int', 'green' => 'int', 'blue' => 'int', 'a=' => 'int'], 'setthreadtitle' => ['bool', 'title' => 'string'], 'settype' => ['bool', '&rw_var' => 'mixed', 'type' => 'string'], 'sha1' => ['string', 'str' => 'string', 'raw_output=' => 'bool'], 'sha1_file' => ['string|false', 'filename' => 'string', 'raw_output=' => 'bool'], 'sha256' => ['string', 'str' => 'string', 'raw_output=' => 'bool'], 'sha256_file' => ['string', 'filename' => 'string', 'raw_output=' => 'bool'], 'shapefileObj::__construct' => ['void', 'filename' => 'string', 'type' => 'int'], 'shapefileObj::addPoint' => ['int', 'point' => 'pointObj'], 'shapefileObj::addShape' => ['int', 'shape' => 'shapeObj'], 'shapefileObj::free' => ['void'], 'shapefileObj::getExtent' => ['rectObj', 'i' => 'int'], 'shapefileObj::getPoint' => ['shapeObj', 'i' => 'int'], 'shapefileObj::getShape' => ['shapeObj', 'i' => 'int'], 'shapefileObj::getTransformed' => ['shapeObj', 'map' => 'MapObj', 'i' => 'int'], 'shapefileObj::ms_newShapefileObj' => ['shapefileObj', 'filename' => 'string', 'type' => 'int'], 'shapeObj::__construct' => ['void', 'type' => 'int'], 'shapeObj::add' => ['int', 'line' => 'lineObj'], 'shapeObj::boundary' => ['shapeObj'], 'shapeObj::contains' => ['bool', 'point' => 'pointObj'], 'shapeObj::containsShape' => ['int', 'shape2' => 'shapeObj'], 'shapeObj::convexhull' => ['shapeObj'], 'shapeObj::crosses' => ['int', 'shape' => 'shapeObj'], 'shapeObj::difference' => ['shapeObj', 'shape' => 'shapeObj'], 'shapeObj::disjoint' => ['int', 'shape' => 'shapeObj'], 'shapeObj::draw' => ['int', 'map' => 'MapObj', 'layer' => 'layerObj', 'img' => 'imageObj'], 'shapeObj::equals' => ['int', 'shape' => 'shapeObj'], 'shapeObj::free' => ['void'], 'shapeObj::getArea' => ['float'], 'shapeObj::getCentroid' => ['pointObj'], 'shapeObj::getLabelPoint' => ['pointObj'], 'shapeObj::getLength' => ['float'], 'shapeObj::getPointUsingMeasure' => ['pointObj', 'm' => 'float'], 'shapeObj::getValue' => ['string', 'layer' => 'layerObj', 'filedname' => 'string'], 'shapeObj::intersection' => ['shapeObj', 'shape' => 'shapeObj'], 'shapeObj::intersects' => ['bool', 'shape' => 'shapeObj'], 'shapeObj::line' => ['lineObj', 'i' => 'int'], 'shapeObj::ms_shapeObjFromWkt' => ['shapeObj', 'wkt' => 'string'], 'shapeObj::overlaps' => ['int', 'shape' => 'shapeObj'], 'shapeObj::project' => ['int', 'in' => 'projectionObj', 'out' => 'projectionObj'], 'shapeObj::set' => ['int', 'property_name' => 'string', 'new_value' => ''], 'shapeObj::setBounds' => ['int'], 'shapeObj::simplify' => ['shapeObj', 'tolerance' => 'float'], 'shapeObj::symdifference' => ['shapeObj', 'shape' => 'shapeObj'], 'shapeObj::topologyPreservingSimplify' => ['shapeObj', 'tolerance' => 'float'], 'shapeObj::touches' => ['int', 'shape' => 'shapeObj'], 'shapeObj::toWkt' => ['string'], 'shapeObj::union' => ['shapeObj', 'shape' => 'shapeObj'], 'shapeObj::within' => ['int', 'shape2' => 'shapeObj'], 'shell_exec' => ['?string', 'cmd' => 'string'], 'shm_attach' => ['resource', 'key' => 'int', 'memsize=' => 'int', 'perm=' => 'int'], 'shm_detach' => ['bool', 'shm_identifier' => 'resource'], 'shm_get_var' => ['mixed', 'id' => 'resource', 'variable_key' => 'int'], 'shm_has_var' => ['bool', 'shm_identifier' => 'resource', 'variable_key' => 'int'], 'shm_put_var' => ['bool', 'shm_identifier' => 'resource', 'variable_key' => 'int', 'variable' => 'mixed'], 'shm_remove' => ['bool', 'shm_identifier' => 'resource'], 'shm_remove_var' => ['bool', 'shm_identifier' => 'resource', 'variable_key' => 'int'], 'shmop_close' => ['void', 'shmid' => 'resource'], 'shmop_delete' => ['bool', 'shmid' => 'resource'], 'shmop_open' => ['resource|false', 'key' => 'int', 'flags' => 'string', 'mode' => 'int', 'size' => 'int'], 'shmop_read' => ['string', 'shmid' => 'resource', 'start' => 'int', 'count' => 'int'], 'shmop_size' => ['int', 'shmid' => 'resource'], 'shmop_write' => ['int', 'shmid' => 'resource', 'data' => 'string', 'offset' => 'int'], 'show_source' => ['', 'file_name' => '', 'return' => ''], 'shuffle' => ['bool', '&rw_array_arg' => 'array'], 'signeurlpaiement' => ['string', 'clent' => 'string', 'data' => 'string'], 'similar_text' => ['int', 'str1' => 'string', 'str2' => 'string', '&w_percent=' => 'float'], 'simplexml_import_dom' => ['SimpleXMLElement|false', 'node' => 'DOMNode', 'class_name=' => 'string'], 'simplexml_load_file' => ['SimpleXMLElement|false', 'filename' => 'string', 'class_name=' => 'string', 'options=' => 'int', 'ns=' => 'string', 'is_prefix=' => 'bool'], 'simplexml_load_string' => ['SimpleXMLElement|false', 'data' => 'string', 'class_name=' => 'string', 'options=' => 'int', 'ns=' => 'string', 'is_prefix=' => 'bool'], 'SimpleXMLElement::__construct' => ['void', 'data' => 'string', 'options=' => 'int', 'data_is_url=' => 'bool', 'ns=' => 'string', 'is_prefix=' => 'bool'], 'SimpleXMLElement::__toString' => ['string'], 'SimpleXMLElement::__get' => ['SimpleXMLElement', 'name' => 'string'], 'SimpleXMLElement::addAttribute' => ['void', 'name' => 'string', 'value=' => 'string', 'ns=' => 'string'], 'SimpleXMLElement::addChild' => ['SimpleXMLElement', 'name' => 'string', 'value=' => 'string', 'ns=' => 'string'], 'SimpleXMLElement::asXML' => ['string|bool', 'filename=' => 'string'], 'SimpleXMLElement::attributes' => ['SimpleXMLElement|null', 'ns=' => 'string', 'is_prefix=' => 'bool'], 'SimpleXMLElement::children' => ['SimpleXMLElement', 'ns=' => 'string', 'is_prefix=' => 'bool'], 'SimpleXMLElement::count' => ['int'], 'SimpleXMLElement::getDocNamespaces' => ['string[]', 'recursive=' => 'bool', 'from_root=' => 'bool'], 'SimpleXMLElement::getName' => ['string'], 'SimpleXMLElement::getNamespaces' => ['string[]', 'recursive=' => 'bool'], 'SimpleXMLElement::registerXPathNamespace' => ['bool', 'prefix' => 'string', 'ns' => 'string'], 'SimpleXMLElement::xpath' => ['SimpleXMLElement[]|false', 'path' => 'string'], 'SimpleXMLIterator::current' => ['SimpleXMLIterator|null'], 'SimpleXMLIterator::getChildren' => ['SimpleXMLIterator'], 'SimpleXMLIterator::hasChildren' => ['bool'], 'SimpleXMLIterator::key' => ['string|false'], 'SimpleXMLIterator::next' => ['void'], 'SimpleXMLIterator::rewind' => ['void'], 'SimpleXMLIterator::valid' => ['bool'], 'sin' => ['float', 'number' => 'float'], 'sinh' => ['float', 'number' => 'float'], 'sizeof' => ['int', 'var' => 'Countable|array', 'mode=' => 'int'], 'sleep' => ['int|false', 'seconds' => 'int'], 'snmp2_get' => ['string|false', 'host' => 'string', 'community' => 'string', 'object_id' => 'string', 'timeout=' => 'int', 'retries=' => 'int'], 'snmp2_getnext' => ['string|false', 'host' => 'string', 'community' => 'string', 'object_id' => 'string', 'timeout=' => 'int', 'retries=' => 'int'], 'snmp2_real_walk' => ['array|false', 'host' => 'string', 'community' => 'string', 'object_id' => 'string', 'timeout=' => 'int', 'retries=' => 'int'], 'snmp2_set' => ['bool', 'host' => 'string', 'community' => 'string', 'object_id' => 'string', 'type' => 'string', 'value' => 'string', 'timeout=' => 'int', 'retries=' => 'int'], 'snmp2_walk' => ['array|false', 'host' => 'string', 'community' => 'string', 'object_id' => 'string', 'timeout=' => 'int', 'retries=' => 'int'], 'snmp3_get' => ['string|false', 'host' => 'string', 'sec_name' => 'string', 'sec_level' => 'string', 'auth_protocol' => 'string', 'auth_passphrase' => 'string', 'priv_protocol' => 'string', 'priv_passphrase' => 'string', 'object_id' => 'string', 'timeout=' => 'int', 'retries=' => 'int'], 'snmp3_getnext' => ['string|false', 'host' => 'string', 'sec_name' => 'string', 'sec_level' => 'string', 'auth_protocol' => 'string', 'auth_passphrase' => 'string', 'priv_protocol' => 'string', 'priv_passphrase' => 'string', 'object_id' => 'string', 'timeout=' => 'int', 'retries=' => 'int'], 'snmp3_real_walk' => ['array|false', 'host' => 'string', 'sec_name' => 'string', 'sec_level' => 'string', 'auth_protocol' => 'string', 'auth_passphrase' => 'string', 'priv_protocol' => 'string', 'priv_passphrase' => 'string', 'object_id' => 'string', 'timeout=' => 'int', 'retries=' => 'int'], 'snmp3_set' => ['bool', 'host' => 'string', 'sec_name' => 'string', 'sec_level' => 'string', 'auth_protocol' => 'string', 'auth_passphrase' => 'string', 'priv_protocol' => 'string', 'priv_passphrase' => 'string', 'object_id' => 'string', 'type' => 'string', 'value' => 'string', 'timeout=' => 'int', 'retries=' => 'int'], 'snmp3_walk' => ['array|false', 'host' => 'string', 'sec_name' => 'string', 'sec_level' => 'string', 'auth_protocol' => 'string', 'auth_passphrase' => 'string', 'priv_protocol' => 'string', 'priv_passphrase' => 'string', 'object_id' => 'string', 'timeout=' => 'int', 'retries=' => 'int'], 'SNMP::__construct' => ['void', 'version' => 'int', 'hostname' => 'string', 'community' => 'string', 'timeout' => 'int', 'retries' => 'int'], 'SNMP::close' => ['bool'], 'SNMP::get' => ['mixed', 'object_id' => 'mixed', 'preserve_keys' => 'bool'], 'SNMP::getErrno' => ['int'], 'SNMP::getError' => ['int'], 'SNMP::getnext' => ['mixed', 'object_id' => 'mixed'], 'SNMP::set' => ['bool', 'object_id' => 'mixed', 'type' => 'mixed', 'value' => 'mixed'], 'SNMP::setSecurity' => ['bool', 'sec_level' => 'string', 'auth_protocol' => 'string', 'auth_passphrase' => 'string', 'priv_protocol' => 'string', 'priv_passphrase' => 'string', 'contextname' => 'string', 'contextengineid' => 'string'], 'SNMP::walk' => ['array', 'object_id' => 'string', 'suffix_as_key' => 'bool', 'max_repetitions' => 'int', 'non_repeaters' => 'int'], 'snmp_get_quick_print' => ['bool'], 'snmp_get_valueretrieval' => ['int'], 'snmp_read_mib' => ['bool', 'filename' => 'string'], 'snmp_set_enum_print' => ['bool', 'enum_print' => 'int'], 'snmp_set_oid_numeric_print' => ['void', 'oid_format' => 'int'], 'snmp_set_oid_output_format' => ['bool', 'oid_format' => 'int'], 'snmp_set_quick_print' => ['bool', 'quick_print' => 'int'], 'snmp_set_valueretrieval' => ['bool', 'method' => 'int'], 'snmpget' => ['string|false', 'host' => 'string', 'community' => 'string', 'object_id' => 'string', 'timeout=' => 'int', 'retries=' => 'int'], 'snmpgetnext' => ['string|false', 'host' => 'string', 'community' => 'string', 'object_id' => 'string', 'timeout=' => 'int', 'retries=' => 'int'], 'snmprealwalk' => ['array|false', 'host' => 'string', 'community' => 'string', 'object_id' => 'string', 'timeout=' => 'int', 'retries=' => 'int'], 'snmpset' => ['bool', 'host' => 'string', 'community' => 'string', 'object_id' => 'string', 'type' => 'string', 'value' => 'mixed', 'timeout=' => 'int', 'retries=' => 'int'], 'snmpwalk' => ['array|false', 'host' => 'string', 'community' => 'string', 'object_id' => 'string', 'timeout=' => 'int', 'retries=' => 'int'], 'snmpwalkoid' => ['array|false', 'hostname' => 'string', 'community' => 'string', 'object_id' => 'string', 'timeout=' => 'int', 'retries=' => 'int'], 'SoapClient::__call' => ['', 'function_name' => 'string', 'arguments' => 'string'], 'SoapClient::__construct' => ['void', 'wsdl' => 'mixed', 'options=' => 'array'], 'SoapClient::__doRequest' => ['string', 'request' => 'string', 'location' => 'string', 'action' => 'string', 'version' => 'int', 'one_way=' => 'int'], 'SoapClient::__getCookies' => ['array'], 'SoapClient::__getFunctions' => ['array'], 'SoapClient::__getLastRequest' => ['string'], 'SoapClient::__getLastRequestHeaders' => ['string'], 'SoapClient::__getLastResponse' => ['string'], 'SoapClient::__getLastResponseHeaders' => ['string'], 'SoapClient::__getTypes' => ['array'], 'SoapClient::__setCookie' => ['', 'name' => 'string', 'value=' => 'string'], 'SoapClient::__setLocation' => ['string', 'new_location=' => 'string'], 'SoapClient::__setSoapHeaders' => ['bool', 'soapheaders=' => ''], 'SoapClient::__soapCall' => ['', 'function_name' => 'string', 'arguments' => 'array', 'options=' => 'array', 'input_headers=' => '', '&w_output_headers=' => 'array'], 'SoapClient::SoapClient' => ['object', 'wsdl' => 'mixed', 'options=' => 'array'], 'SoapFault::__construct' => ['void', 'faultcode' => 'string', 'faultstring' => 'string', 'faultactor=' => 'string', 'detail=' => 'string', 'faultname=' => 'string', 'headerfault=' => 'string'], 'SoapFault::__toString' => ['string'], 'SoapFault::SoapFault' => ['object', 'faultcode' => 'string', 'faultstring' => 'string', 'faultactor=' => 'string', 'detail=' => 'string', 'faultname=' => 'string', 'headerfault=' => 'string'], 'SoapHeader::__construct' => ['void', 'namespace' => 'string', 'name' => 'string', 'data=' => 'mixed', 'mustunderstand=' => 'bool', 'actor=' => 'string'], 'SoapHeader::SoapHeader' => ['object', 'namespace' => 'string', 'name' => 'string', 'data=' => 'mixed', 'mustunderstand=' => 'bool', 'actor=' => 'string'], 'SoapParam::__construct' => ['void', 'data' => 'mixed', 'name' => 'string'], 'SoapParam::SoapParam' => ['object', 'data' => 'mixed', 'name' => 'string'], 'SoapServer::__construct' => ['void', 'wsdl' => '?string', 'options=' => 'array'], 'SoapServer::addFunction' => ['void', 'functions' => 'mixed'], 'SoapServer::addSoapHeader' => ['void', 'object' => 'soapheader'], 'SoapServer::fault' => ['void', 'code' => 'string', 'string' => 'string', 'actor=' => 'string', 'details=' => 'string', 'name=' => 'string'], 'SoapServer::getFunctions' => ['array'], 'SoapServer::handle' => ['void', 'soap_request=' => 'string'], 'SoapServer::setClass' => ['void', 'class_name' => 'string', '...args=' => 'mixed'], 'SoapServer::setObject' => ['void', 'obj' => 'object'], 'SoapServer::setPersistence' => ['void', 'mode' => 'int'], 'SoapServer::SoapServer' => ['object', 'wsdl' => '?string', 'options' => 'array'], 'SoapVar::__construct' => ['void', 'data' => 'mixed', 'encoding' => 'int', 'type_name=' => 'string', 'type_namespace=' => 'string', 'node_name=' => 'string', 'node_namespace=' => 'string'], 'SoapVar::SoapVar' => ['object', 'data' => 'mixed', 'encoding' => 'int', 'type_name=' => 'string', 'type_namespace=' => 'string', 'node_name=' => 'string', 'node_namespace=' => 'string'], 'socket_accept' => ['resource|false', 'socket' => 'resource'], 'socket_addrinfo_bind' => ['resource|null', 'addrinfo' => 'resource'], 'socket_addrinfo_connect' => ['resource|null', 'addrinfo' => 'resource'], 'socket_addrinfo_explain' => ['array', 'addrinfo' => 'resource'], 'socket_addrinfo_lookup' => ['resource[]', 'node' => 'string', 'service=' => 'mixed', 'hints=' => 'array'], 'socket_bind' => ['bool', 'socket' => 'resource', 'addr' => 'string', 'port=' => 'int'], 'socket_clear_error' => ['void', 'socket=' => 'resource'], 'socket_close' => ['void', 'socket' => 'resource'], 'socket_cmsg_space' => ['int', 'level' => 'int', 'type' => 'int'], 'socket_connect' => ['bool', 'socket' => 'resource', 'addr' => 'string', 'port=' => 'int'], 'socket_create' => ['resource|false', 'domain' => 'int', 'type' => 'int', 'protocol' => 'int'], 'socket_create_listen' => ['resource|false', 'port' => 'int', 'backlog=' => 'int'], 'socket_create_pair' => ['bool', 'domain' => 'int', 'type' => 'int', 'protocol' => 'int', '&w_fd' => 'resource[]'], 'socket_export_stream' => ['resource|false', 'socket' => 'resource'], 'socket_get_option' => ['mixed', 'socket' => 'resource', 'level' => 'int', 'optname' => 'int'], 'socket_getopt' => ['mixed', 'socket' => 'resource', 'level' => 'int', 'optname' => 'int'], 'socket_getpeername' => ['bool', 'socket' => 'resource', '&w_addr' => 'string', '&w_port=' => 'int'], 'socket_getsockname' => ['bool', 'socket' => 'resource', '&w_addr' => 'string', '&w_port=' => 'int'], 'socket_import_stream' => ['resource|false', 'stream' => 'resource'], 'socket_last_error' => ['int', 'socket=' => 'resource'], 'socket_listen' => ['bool', 'socket' => 'resource', 'backlog=' => 'int'], 'socket_read' => ['string|false', 'socket' => 'resource', 'length' => 'int', 'type=' => 'int'], 'socket_recv' => ['int|false', 'socket' => 'resource', '&w_buf' => 'string', 'len' => 'int', 'flags' => 'int'], 'socket_recvfrom' => ['int|false', 'socket' => 'resource', '&w_buf' => 'string', 'len' => 'int', 'flags' => 'int', '&w_name' => 'string', '&w_port=' => 'int'], 'socket_recvmsg' => ['int|false', 'socket' => 'resource', '&w_message' => 'string', 'flags=' => 'int'], 'socket_select' => ['int|false', '&rw_read_fds' => 'resource[]|null', '&rw_write_fds' => 'resource[]|null', '&rw_except_fds' => 'resource[]|null', 'tv_sec' => 'int', 'tv_usec=' => 'int'], 'socket_send' => ['int|false', 'socket' => 'resource', 'buf' => 'string', 'len' => 'int', 'flags' => 'int'], 'socket_sendmsg' => ['int|false', 'socket' => 'resource', 'message' => 'array', 'flags' => 'int'], 'socket_sendto' => ['int|false', 'socket' => 'resource', 'buf' => 'string', 'len' => 'int', 'flags' => 'int', 'addr' => 'string', 'port=' => 'int'], 'socket_set_block' => ['bool', 'socket' => 'resource'], 'socket_set_nonblock' => ['bool', 'socket' => 'resource'], 'socket_set_option' => ['bool', 'socket' => 'resource', 'level' => 'int', 'optname' => 'int', 'optval' => 'int|string|array'], 'socket_shutdown' => ['bool', 'socket' => 'resource', 'how=' => 'int'], 'socket_strerror' => ['string', 'errno' => 'int'], 'socket_write' => ['int|false', 'socket' => 'resource', 'buf' => 'string', 'length=' => 'int'], 'socket_wsaprotocol_info_export' => ['string|false', 'stream' => 'resource', 'target_pid' => 'int'], 'socket_wsaprotocol_info_import' => ['resource|false', 'id' => 'string'], 'socket_wsaprotocol_info_release' => ['bool', 'id' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\add' => ['', '&left' => 'string', 'right' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\bin2hex' => ['string', 'binary' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\compare' => ['int', 'left' => 'string', 'right' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_aead_aes256gcm_decrypt' => ['string', 'msg' => 'string', 'nonce' => 'string', 'key' => 'string', 'ad=' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_aead_aes256gcm_encrypt' => ['string', 'msg' => 'string', 'nonce' => 'string', 'key' => 'string', 'ad=' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_aead_aes256gcm_is_available' => ['bool'], '_HumbugBoxb94336daae36\\Sodium\\crypto_aead_chacha20poly1305_decrypt' => ['string', 'msg' => 'string', 'nonce' => 'string', 'key' => 'string', 'ad=' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_aead_chacha20poly1305_encrypt' => ['string', 'msg' => 'string', 'nonce' => 'string', 'key' => 'string', 'ad=' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_auth' => ['string', 'msg' => 'string', 'key' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_auth_verify' => ['bool', 'mac' => 'string', 'msg' => 'string', 'key' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_box' => ['string', 'msg' => 'string', 'nonce' => 'string', 'keypair' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_box_keypair' => ['string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_box_keypair_from_secretkey_and_publickey' => ['string', 'secretkey' => 'string', 'publickey' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_box_open' => ['string', 'msg' => 'string', 'nonce' => 'string', 'keypair' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_box_publickey' => ['string', 'keypair' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_box_publickey_from_secretkey' => ['string', 'secretkey' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_box_seal' => ['string', 'message' => 'string', 'publickey' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_box_seal_open' => ['string', 'encrypted' => 'string', 'keypair' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_box_secretkey' => ['string', 'keypair' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_box_seed_keypair' => ['string', 'seed' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_generichash' => ['string', 'input' => 'string', 'key=' => 'string', 'length=' => 'int'], '_HumbugBoxb94336daae36\\Sodium\\crypto_generichash_final' => ['string', 'state' => 'string', 'length=' => 'int'], '_HumbugBoxb94336daae36\\Sodium\\crypto_generichash_init' => ['string', 'key=' => 'string', 'length=' => 'int'], '_HumbugBoxb94336daae36\\Sodium\\crypto_generichash_update' => ['bool', '&hashState' => 'string', 'append' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_kx' => ['string', 'secretkey' => 'string', 'publickey' => 'string', 'client_publickey' => 'string', 'server_publickey' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_pwhash' => ['string', 'out_len' => 'int', 'passwd' => 'string', 'salt' => 'string', 'opslimit' => 'int', 'memlimit' => 'int'], '_HumbugBoxb94336daae36\\Sodium\\crypto_pwhash_scryptsalsa208sha256' => ['string', 'out_len' => 'int', 'passwd' => 'string', 'salt' => 'string', 'opslimit' => 'int', 'memlimit' => 'int'], '_HumbugBoxb94336daae36\\Sodium\\crypto_pwhash_scryptsalsa208sha256_str' => ['string', 'passwd' => 'string', 'opslimit' => 'int', 'memlimit' => 'int'], '_HumbugBoxb94336daae36\\Sodium\\crypto_pwhash_scryptsalsa208sha256_str_verify' => ['bool', 'hash' => 'string', 'passwd' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_pwhash_str' => ['string', 'passwd' => 'string', 'opslimit' => 'int', 'memlimit' => 'int'], '_HumbugBoxb94336daae36\\Sodium\\crypto_pwhash_str_verify' => ['bool', 'hash' => 'string', 'passwd' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_scalarmult' => ['string', 'ecdhA' => 'string', 'ecdhB' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_scalarmult_base' => ['string', 'sk' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_secretbox' => ['string', 'plaintext' => 'string', 'nonce' => 'string', 'key' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_secretbox_open' => ['string', 'ciphertext' => 'string', 'nonce' => 'string', 'key' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_shorthash' => ['string', 'message' => 'string', 'key' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_sign' => ['string', 'message' => 'string', 'secretkey' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_sign_detached' => ['string', 'message' => 'string', 'secretkey' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_sign_ed25519_pk_to_curve25519' => ['string', 'sign_pk' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_sign_ed25519_sk_to_curve25519' => ['string', 'sign_sk' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_sign_keypair' => ['string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_sign_keypair_from_secretkey_and_publickey' => ['string', 'secretkey' => 'string', 'publickey' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_sign_open' => ['string|false', 'signed_message' => 'string', 'publickey' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_sign_publickey' => ['string', 'keypair' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_sign_publickey_from_secretkey' => ['string', 'secretkey' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_sign_secretkey' => ['string', 'keypair' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_sign_seed_keypair' => ['string', 'seed' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_sign_verify_detached' => ['bool', 'signature' => 'string', 'msg' => 'string', 'publickey' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_stream' => ['string', 'length' => 'int', 'nonce' => 'string', 'key' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\crypto_stream_xor' => ['string', 'plaintext' => 'string', 'nonce' => 'string', 'key' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\hex2bin' => ['string', 'hex' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\increment' => ['string', '&nonce' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\library_version_major' => ['int'], '_HumbugBoxb94336daae36\\Sodium\\library_version_minor' => ['int'], '_HumbugBoxb94336daae36\\Sodium\\memcmp' => ['int', 'left' => 'string', 'right' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\memzero' => ['', '&target' => 'string'], '_HumbugBoxb94336daae36\\Sodium\\randombytes_buf' => ['string', 'length' => 'int'], '_HumbugBoxb94336daae36\\Sodium\\randombytes_random16' => ['int|string'], '_HumbugBoxb94336daae36\\Sodium\\randombytes_uniform' => ['int', 'upperBoundNonInclusive' => 'int'], '_HumbugBoxb94336daae36\\Sodium\\version_string' => ['string'], 'sodium_add' => ['string', 'string_1' => 'string', 'string_2' => 'string'], 'sodium_base642bin' => ['string', 'base64' => 'string', 'variant' => 'int', 'ignore' => 'string'], 'sodium_bin2base64' => ['string', 'binary' => 'string', 'variant' => 'int'], 'sodium_bin2hex' => ['string', 'binary' => 'string'], 'sodium_compare' => ['int', 'string_1' => 'string', 'string_2' => 'string'], 'sodium_crypto_aead_aes256gcm_decrypt' => ['string|false', 'confidential_message' => 'string', 'public_message' => 'string', 'nonce' => 'string', 'key' => 'string'], 'sodium_crypto_aead_aes256gcm_encrypt' => ['string', 'confidential_message' => 'string', 'public_message' => 'string', 'nonce' => 'string', 'key' => 'string'], 'sodium_crypto_aead_aes256gcm_is_available' => ['bool'], 'sodium_crypto_aead_aes256gcm_keygen' => ['string'], 'sodium_crypto_aead_chacha20poly1305_decrypt' => ['string', 'confidential_message' => 'string', 'public_message' => 'string', 'nonce' => 'string', 'key' => 'string'], 'sodium_crypto_aead_chacha20poly1305_encrypt' => ['string', 'confidential_message' => 'string', 'public_message' => 'string', 'nonce' => 'string', 'key' => 'string'], 'sodium_crypto_aead_chacha20poly1305_ietf_decrypt' => ['string|false', 'confidential_message' => 'string', 'public_message' => 'string', 'nonce' => 'string', 'key' => 'string'], 'sodium_crypto_aead_chacha20poly1305_ietf_encrypt' => ['string', 'confidential_message' => 'string', 'public_message' => 'string', 'nonce' => 'string', 'key' => 'string'], 'sodium_crypto_aead_chacha20poly1305_ietf_keygen' => ['string'], 'sodium_crypto_aead_chacha20poly1305_keygen' => ['string'], 'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt' => ['string|false', 'confidential_message' => 'string', 'public_message' => 'string', 'nonce' => 'string', 'key' => 'string'], 'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt' => ['string', 'confidential_message' => 'string', 'public_message' => 'string', 'nonce' => 'string', 'key' => 'string'], 'sodium_crypto_aead_xchacha20poly1305_ietf_keygen' => ['string'], 'sodium_crypto_auth' => ['string', 'message' => 'string', 'key' => 'string'], 'sodium_crypto_auth_keygen' => ['string'], 'sodium_crypto_auth_verify' => ['bool', 'mac' => 'string', 'message' => 'string', 'key' => 'string'], 'sodium_crypto_box' => ['string', 'string' => 'string', 'nonce' => 'string', 'key' => 'string'], 'sodium_crypto_box_keypair' => ['string'], 'sodium_crypto_box_keypair_from_secretkey_and_publickey' => ['string', 'secret_key' => 'string', 'public_key' => 'string'], 'sodium_crypto_box_open' => ['string|false', 'message' => 'string', 'nonce' => 'string', 'message_keypair' => 'string'], 'sodium_crypto_box_publickey' => ['string', 'keypair' => 'string'], 'sodium_crypto_box_publickey_from_secretkey' => ['string', 'secretkey' => 'string'], 'sodium_crypto_box_seal' => ['string', 'message' => 'string', 'publickey' => 'string'], 'sodium_crypto_box_seal_open' => ['string|false', 'message' => 'string', 'recipient_keypair' => 'string'], 'sodium_crypto_box_secretkey' => ['string', 'keypair' => 'string'], 'sodium_crypto_box_seed_keypair' => ['string', 'seed' => 'string'], 'sodium_crypto_generichash' => ['string', 'msg' => 'string', 'key=' => '?string', 'length=' => '?int'], 'sodium_crypto_generichash_final' => ['string', 'state' => 'string', 'length=' => '?int'], 'sodium_crypto_generichash_init' => ['string', 'key=' => '?string', 'length=' => '?int'], 'sodium_crypto_generichash_keygen' => ['string'], 'sodium_crypto_generichash_update' => ['bool', 'state' => 'string', 'string' => 'string'], 'sodium_crypto_kdf_derive_from_key' => ['string', 'subkey_len' => 'int', 'subkey_id' => 'int', 'context' => 'string', 'key' => 'string'], 'sodium_crypto_kdf_keygen' => ['string'], 'sodium_crypto_kx' => ['string', 'secretkey' => 'string', 'publickey' => 'string', 'client_publickey' => 'string', 'server_publickey' => 'string'], 'sodium_crypto_kx_client_session_keys' => ['string', 'client_keypair' => 'string', 'server_key' => 'string'], 'sodium_crypto_kx_keypair' => ['string'], 'sodium_crypto_kx_publickey' => ['string', 'keypair' => 'string'], 'sodium_crypto_kx_secretkey' => ['string', 'keypair' => 'string'], 'sodium_crypto_kx_seed_keypair' => ['string', 'seed' => 'string'], 'sodium_crypto_kx_server_session_keys' => ['string', 'server_keypair' => 'string', 'client_key' => 'string'], 'sodium_crypto_pwhash' => ['string', 'length' => 'int', 'password' => 'string', 'salt' => 'string', 'opslimit' => 'int', 'memlimit' => 'int', 'alg=' => 'int'], 'sodium_crypto_pwhash_scryptsalsa208sha256' => ['string', 'length' => 'int', 'password' => 'string', 'salt' => 'string', 'opslimit' => 'int', 'memlimit' => 'int'], 'sodium_crypto_pwhash_scryptsalsa208sha256_str' => ['string', 'password' => 'string', 'opslimit' => 'int', 'memlimit' => 'int'], 'sodium_crypto_pwhash_scryptsalsa208sha256_str_verify' => ['bool', 'hash' => 'string', 'password' => 'string'], 'sodium_crypto_pwhash_str' => ['string', 'password' => 'string', 'opslimit' => 'int', 'memlimit' => 'int'], 'sodium_crypto_pwhash_str_needs_rehash' => ['bool', 'password' => 'string', 'opslimit' => 'int', 'memlimit' => 'int'], 'sodium_crypto_pwhash_str_verify' => ['bool', 'hash' => 'string', 'password' => 'string'], 'sodium_crypto_scalarmult' => ['string', 'string_1' => 'string', 'string_2' => 'string'], 'sodium_crypto_scalarmult_base' => ['string', 'key' => 'string'], 'sodium_crypto_secretbox' => ['string', 'plaintext' => 'string', 'nonce' => 'string', 'key' => 'string'], 'sodium_crypto_secretbox_keygen' => ['string'], 'sodium_crypto_secretbox_open' => ['string|false', 'ciphertext' => 'string', 'nonce' => 'string', 'key' => 'string'], 'sodium_crypto_secretstream_xchacha20poly1305_init_pull' => ['string', 'header' => 'string', 'key' => 'string'], 'sodium_crypto_secretstream_xchacha20poly1305_init_push' => ['array', 'key' => 'string'], 'sodium_crypto_secretstream_xchacha20poly1305_keygen' => ['string'], 'sodium_crypto_secretstream_xchacha20poly1305_pull' => ['array', 'state' => 'string', 'c' => 'string', 'ad=' => 'string'], 'sodium_crypto_secretstream_xchacha20poly1305_push' => ['string', 'state' => 'string', 'msg' => 'string', 'ad=' => 'string', 'tag=' => 'int'], 'sodium_crypto_secretstream_xchacha20poly1305_rekey' => ['void', 'state' => 'string'], 'sodium_crypto_shorthash' => ['string', 'message' => 'string', 'key' => 'string'], 'sodium_crypto_shorthash_keygen' => ['string'], 'sodium_crypto_sign' => ['string', 'message' => 'string', 'secretkey' => 'string'], 'sodium_crypto_sign_detached' => ['string', 'message' => 'string', 'secretkey' => 'string'], 'sodium_crypto_sign_ed25519_pk_to_curve25519' => ['string', 'ed25519pk' => 'string'], 'sodium_crypto_sign_ed25519_sk_to_curve25519' => ['string', 'ed25519sk' => 'string'], 'sodium_crypto_sign_keypair' => ['string'], 'sodium_crypto_sign_keypair_from_secretkey_and_publickey' => ['string', 'secret_key' => 'string', 'public_key' => 'string'], 'sodium_crypto_sign_open' => ['string|false', 'message' => 'string', 'publickey' => 'string'], 'sodium_crypto_sign_publickey' => ['string', 'keypair' => 'string'], 'sodium_crypto_sign_publickey_from_secretkey' => ['string', 'secretkey' => 'string'], 'sodium_crypto_sign_secretkey' => ['string', 'keypair' => 'string'], 'sodium_crypto_sign_seed_keypair' => ['string', 'seed' => 'string'], 'sodium_crypto_sign_verify_detached' => ['bool', 'signature' => 'string', 'message' => 'string', 'publickey' => 'string'], 'sodium_crypto_stream' => ['string', 'length' => 'int', 'nonce' => 'string', 'key' => 'string'], 'sodium_crypto_stream_keygen' => ['string'], 'sodium_crypto_stream_xor' => ['string', 'message' => 'string', 'nonce' => 'string', 'key' => 'string'], 'sodium_hex2bin' => ['string', 'hex' => 'string', 'ignore=' => 'string'], 'sodium_increment' => ['string', '&binary_string' => 'string'], 'sodium_library_version_major' => ['int'], 'sodium_library_version_minor' => ['int'], 'sodium_memcmp' => ['int', 'string_1' => 'string', 'string_2' => 'string'], 'sodium_memzero' => ['void', '&secret' => 'string'], 'sodium_pad' => ['string', 'unpadded' => 'string', 'length' => 'int'], 'sodium_randombytes_buf' => ['string', 'length' => 'int'], 'sodium_randombytes_random16' => ['int|string'], 'sodium_randombytes_uniform' => ['int', 'upperBoundNonInclusive' => 'int'], 'sodium_unpad' => ['string', 'padded' => 'string', 'length' => 'int'], 'sodium_version_string' => ['string'], 'solid_fetch_prev' => ['bool', 'result_id' => ''], 'solr_get_version' => ['string'], 'SolrClient::__construct' => ['void', 'clientOptions' => 'array'], 'SolrClient::__destruct' => [''], 'SolrClient::addDocument' => ['SolrUpdateResponse', 'doc' => 'solrinputdocument', 'allowdups=' => 'bool', 'commitwithin=' => 'int'], 'SolrClient::addDocuments' => ['SolrUpdateResponse', 'docs' => 'array', 'allowdups=' => 'bool', 'commitwithin=' => 'int'], 'SolrClient::commit' => ['SolrUpdateResponse', 'maxsegments=' => 'int', 'waitflush=' => 'bool', 'waitsearcher=' => 'bool'], 'SolrClient::deleteById' => ['SolrUpdateResponse', 'id' => 'string'], 'SolrClient::deleteByIds' => ['SolrUpdateResponse', 'ids' => 'array'], 'SolrClient::deleteByQueries' => ['SolrUpdateResponse', 'queries' => 'array'], 'SolrClient::deleteByQuery' => ['SolrUpdateResponse', 'query' => 'string'], 'SolrClient::getById' => ['SolrQueryResponse', 'id' => 'string'], 'SolrClient::getByIds' => ['SolrQueryResponse', 'ids' => 'array'], 'SolrClient::getDebug' => ['string'], 'SolrClient::getOptions' => ['array'], 'SolrClient::optimize' => ['SolrUpdateResponse', 'maxsegments=' => 'int', 'waitflush=' => 'bool', 'waitsearcher=' => 'bool'], 'SolrClient::ping' => ['SolrPingResponse'], 'SolrClient::query' => ['SolrQueryResponse', 'query' => 'solrparams'], 'SolrClient::request' => ['SolrUpdateResponse', 'raw_request' => 'string'], 'SolrClient::rollback' => ['SolrUpdateResponse'], 'SolrClient::setResponseWriter' => ['void', 'responsewriter' => 'string'], 'SolrClient::setServlet' => ['bool', 'type' => 'int', 'value' => 'string'], 'SolrClient::system' => ['void'], 'SolrClient::threads' => ['void'], 'SolrClientException::getInternalInfo' => ['array'], 'SolrCollapseFunction::__toString' => ['string'], 'SolrCollapseFunction::getField' => ['string'], 'SolrCollapseFunction::getHint' => ['string'], 'SolrCollapseFunction::getMax' => ['string'], 'SolrCollapseFunction::getMin' => ['string'], 'SolrCollapseFunction::getNullPolicy' => ['string'], 'SolrCollapseFunction::getSize' => ['int'], 'SolrCollapseFunction::setField' => ['SolrCollapseFunction', 'fieldName' => 'string'], 'SolrCollapseFunction::setHint' => ['SolrCollapseFunction', 'hint' => 'string'], 'SolrCollapseFunction::setMax' => ['SolrCollapseFunction', 'max' => 'string'], 'SolrCollapseFunction::setMin' => ['SolrCollapseFunction', 'min' => 'string'], 'SolrCollapseFunction::setNullPolicy' => ['SolrCollapseFunction', 'nullPolicy' => 'string'], 'SolrCollapseFunction::setSize' => ['SolrCollapseFunction', 'size' => 'int'], 'SolrDisMaxQuery::__construct' => ['void', 'q=' => 'string'], 'SolrDisMaxQuery::addBigramPhraseField' => ['SolrDisMaxQuery', 'field' => 'string', 'boost' => 'string', 'slop=' => 'string'], 'SolrDisMaxQuery::addBoostQuery' => ['SolrDisMaxQuery', 'field' => 'string', 'value' => 'string', 'boost=' => 'string'], 'SolrDisMaxQuery::addExpandFilterQuery' => ['SolrQuery', 'fq' => 'string'], 'SolrDisMaxQuery::addExpandSortField' => ['SolrQuery', 'field' => 'string', 'order' => 'string'], 'SolrDisMaxQuery::addFacetDateField' => ['SolrQuery', 'dateField' => 'string'], 'SolrDisMaxQuery::addFacetDateOther' => ['SolrQuery', 'value' => 'string', 'field_override' => 'string'], 'SolrDisMaxQuery::addFacetField' => ['SolrQuery', 'field' => 'string'], 'SolrDisMaxQuery::addFacetQuery' => ['SolrQuery', 'facetQuery' => 'string'], 'SolrDisMaxQuery::addField' => ['SolrQuery', 'field' => 'string'], 'SolrDisMaxQuery::addFilterQuery' => ['SolrQuery', 'fq' => 'string'], 'SolrDisMaxQuery::addGroupField' => ['SolrQuery', 'value' => 'string'], 'SolrDisMaxQuery::addGroupFunction' => ['SolrQuery', 'value' => 'string'], 'SolrDisMaxQuery::addGroupQuery' => ['SolrQuery', 'value' => 'string'], 'SolrDisMaxQuery::addGroupSortField' => ['SolrQuery', 'field' => 'string', 'order' => 'int'], 'SolrDisMaxQuery::addHighlightField' => ['SolrQuery', 'field' => 'string'], 'SolrDisMaxQuery::addMltField' => ['SolrQuery', 'field' => 'string'], 'SolrDisMaxQuery::addMltQueryField' => ['SolrQuery', 'field' => 'string', 'boost' => 'float'], 'SolrDisMaxQuery::addParam' => ['SolrParams', 'name' => 'string', 'value' => 'string'], 'SolrDisMaxQuery::addPhraseField' => ['SolrDisMaxQuery', 'field' => 'string', 'boost' => 'string', 'slop=' => 'string'], 'SolrDisMaxQuery::addQueryField' => ['SolrDisMaxQuery', 'field' => 'string', 'boost=' => 'string'], 'SolrDisMaxQuery::addSortField' => ['SolrQuery', 'field' => 'string', 'order=' => 'int'], 'SolrDisMaxQuery::addStatsFacet' => ['SolrQuery', 'field' => 'string'], 'SolrDisMaxQuery::addStatsField' => ['SolrQuery', 'field' => 'string'], 'SolrDisMaxQuery::addTrigramPhraseField' => ['SolrDisMaxQuery', 'field' => 'string', 'boost' => 'string', 'slop=' => 'string'], 'SolrDisMaxQuery::addUserField' => ['SolrDisMaxQuery', 'field' => 'string'], 'SolrDisMaxQuery::collapse' => ['SolrQuery', 'collapseFunction' => 'SolrCollapseFunction'], 'SolrDisMaxQuery::get' => ['mixed', 'param_name' => 'string'], 'SolrDisMaxQuery::getExpand' => ['bool'], 'SolrDisMaxQuery::getExpandFilterQueries' => ['array'], 'SolrDisMaxQuery::getExpandQuery' => ['array'], 'SolrDisMaxQuery::getExpandRows' => ['int'], 'SolrDisMaxQuery::getExpandSortFields' => ['array'], 'SolrDisMaxQuery::getFacet' => ['bool'], 'SolrDisMaxQuery::getFacetDateEnd' => ['string', 'field_override' => 'string'], 'SolrDisMaxQuery::getFacetDateFields' => ['array'], 'SolrDisMaxQuery::getFacetDateGap' => ['string', 'field_override' => 'string'], 'SolrDisMaxQuery::getFacetDateHardEnd' => ['string', 'field_override' => 'string'], 'SolrDisMaxQuery::getFacetDateOther' => ['string', 'field_override' => 'string'], 'SolrDisMaxQuery::getFacetDateStart' => ['string', 'field_override' => 'string'], 'SolrDisMaxQuery::getFacetFields' => ['array'], 'SolrDisMaxQuery::getFacetLimit' => ['int', 'field_override' => 'string'], 'SolrDisMaxQuery::getFacetMethod' => ['string', 'field_override' => 'string'], 'SolrDisMaxQuery::getFacetMinCount' => ['int', 'field_override' => 'string'], 'SolrDisMaxQuery::getFacetMissing' => ['string', 'field_override' => 'string'], 'SolrDisMaxQuery::getFacetOffset' => ['int', 'field_override' => 'string'], 'SolrDisMaxQuery::getFacetPrefix' => ['string', 'field_override' => 'string'], 'SolrDisMaxQuery::getFacetQueries' => ['string'], 'SolrDisMaxQuery::getFacetSort' => ['int', 'field_override' => 'string'], 'SolrDisMaxQuery::getFields' => ['string'], 'SolrDisMaxQuery::getFilterQueries' => ['string'], 'SolrDisMaxQuery::getGroup' => ['bool'], 'SolrDisMaxQuery::getGroupCachePercent' => ['int'], 'SolrDisMaxQuery::getGroupFacet' => ['bool'], 'SolrDisMaxQuery::getGroupFields' => ['array'], 'SolrDisMaxQuery::getGroupFormat' => ['string'], 'SolrDisMaxQuery::getGroupFunctions' => ['array'], 'SolrDisMaxQuery::getGroupLimit' => ['int'], 'SolrDisMaxQuery::getGroupMain' => ['bool'], 'SolrDisMaxQuery::getGroupNGroups' => ['bool'], 'SolrDisMaxQuery::getGroupOffset' => ['bool'], 'SolrDisMaxQuery::getGroupQueries' => ['array'], 'SolrDisMaxQuery::getGroupSortFields' => ['array'], 'SolrDisMaxQuery::getGroupTruncate' => ['bool'], 'SolrDisMaxQuery::getHighlight' => ['bool'], 'SolrDisMaxQuery::getHighlightAlternateField' => ['string', 'field_override' => 'string'], 'SolrDisMaxQuery::getHighlightFields' => ['array'], 'SolrDisMaxQuery::getHighlightFormatter' => ['string', 'field_override' => 'string'], 'SolrDisMaxQuery::getHighlightFragmenter' => ['string', 'field_override' => 'string'], 'SolrDisMaxQuery::getHighlightFragsize' => ['int', 'field_override' => 'string'], 'SolrDisMaxQuery::getHighlightHighlightMultiTerm' => ['bool'], 'SolrDisMaxQuery::getHighlightMaxAlternateFieldLength' => ['int', 'field_override' => 'string'], 'SolrDisMaxQuery::getHighlightMaxAnalyzedChars' => ['int'], 'SolrDisMaxQuery::getHighlightMergeContiguous' => ['bool', 'field_override' => 'string'], 'SolrDisMaxQuery::getHighlightRegexMaxAnalyzedChars' => ['int'], 'SolrDisMaxQuery::getHighlightRegexPattern' => ['string'], 'SolrDisMaxQuery::getHighlightRegexSlop' => ['float'], 'SolrDisMaxQuery::getHighlightRequireFieldMatch' => ['bool'], 'SolrDisMaxQuery::getHighlightSimplePost' => ['string', 'field_override' => 'string'], 'SolrDisMaxQuery::getHighlightSimplePre' => ['string', 'field_override' => 'string'], 'SolrDisMaxQuery::getHighlightSnippets' => ['int', 'field_override' => 'string'], 'SolrDisMaxQuery::getHighlightUsePhraseHighlighter' => ['bool'], 'SolrDisMaxQuery::getMlt' => ['bool'], 'SolrDisMaxQuery::getMltBoost' => ['bool'], 'SolrDisMaxQuery::getMltCount' => ['int'], 'SolrDisMaxQuery::getMltFields' => ['array'], 'SolrDisMaxQuery::getMltMaxNumQueryTerms' => ['int'], 'SolrDisMaxQuery::getMltMaxNumTokens' => ['int'], 'SolrDisMaxQuery::getMltMaxWordLength' => ['int'], 'SolrDisMaxQuery::getMltMinDocFrequency' => ['int'], 'SolrDisMaxQuery::getMltMinTermFrequency' => ['int'], 'SolrDisMaxQuery::getMltMinWordLength' => ['int'], 'SolrDisMaxQuery::getMltQueryFields' => ['array'], 'SolrDisMaxQuery::getParam' => ['mixed', 'param_name' => 'string'], 'SolrDisMaxQuery::getParams' => ['array'], 'SolrDisMaxQuery::getPreparedParams' => ['array'], 'SolrDisMaxQuery::getQuery' => ['string'], 'SolrDisMaxQuery::getRows' => ['int'], 'SolrDisMaxQuery::getSortFields' => ['array'], 'SolrDisMaxQuery::getStart' => ['int'], 'SolrDisMaxQuery::getStats' => ['bool'], 'SolrDisMaxQuery::getStatsFacets' => ['array'], 'SolrDisMaxQuery::getStatsFields' => ['array'], 'SolrDisMaxQuery::getTerms' => ['bool'], 'SolrDisMaxQuery::getTermsField' => ['string'], 'SolrDisMaxQuery::getTermsIncludeLowerBound' => ['bool'], 'SolrDisMaxQuery::getTermsIncludeUpperBound' => ['bool'], 'SolrDisMaxQuery::getTermsLimit' => ['int'], 'SolrDisMaxQuery::getTermsLowerBound' => ['string'], 'SolrDisMaxQuery::getTermsMaxCount' => ['int'], 'SolrDisMaxQuery::getTermsMinCount' => ['int'], 'SolrDisMaxQuery::getTermsPrefix' => ['string'], 'SolrDisMaxQuery::getTermsReturnRaw' => ['bool'], 'SolrDisMaxQuery::getTermsSort' => ['int'], 'SolrDisMaxQuery::getTermsUpperBound' => ['string'], 'SolrDisMaxQuery::getTimeAllowed' => ['int'], 'SolrDisMaxQuery::removeBigramPhraseField' => ['SolrDisMaxQuery', 'field' => 'string'], 'SolrDisMaxQuery::removeBoostQuery' => ['SolrDisMaxQuery', 'field' => 'string'], 'SolrDisMaxQuery::removeExpandFilterQuery' => ['SolrQuery', 'fq' => 'string'], 'SolrDisMaxQuery::removeExpandSortField' => ['SolrQuery', 'field' => 'string'], 'SolrDisMaxQuery::removeFacetDateField' => ['SolrQuery', 'field' => 'string'], 'SolrDisMaxQuery::removeFacetDateOther' => ['SolrQuery', 'value' => 'string', 'field_override' => 'string'], 'SolrDisMaxQuery::removeFacetField' => ['SolrQuery', 'field' => 'string'], 'SolrDisMaxQuery::removeFacetQuery' => ['SolrQuery', 'value' => 'string'], 'SolrDisMaxQuery::removeField' => ['SolrQuery', 'field' => 'string'], 'SolrDisMaxQuery::removeFilterQuery' => ['SolrQuery', 'fq' => 'string'], 'SolrDisMaxQuery::removeHighlightField' => ['SolrQuery', 'field' => 'string'], 'SolrDisMaxQuery::removeMltField' => ['SolrQuery', 'field' => 'string'], 'SolrDisMaxQuery::removeMltQueryField' => ['SolrQuery', 'queryField' => 'string'], 'SolrDisMaxQuery::removePhraseField' => ['SolrDisMaxQuery', 'field' => 'string'], 'SolrDisMaxQuery::removeQueryField' => ['SolrDisMaxQuery', 'field' => 'string'], 'SolrDisMaxQuery::removeSortField' => ['SolrQuery', 'field' => 'string'], 'SolrDisMaxQuery::removeStatsFacet' => ['SolrQuery', 'value' => 'string'], 'SolrDisMaxQuery::removeStatsField' => ['SolrQuery', 'field' => 'string'], 'SolrDisMaxQuery::removeTrigramPhraseField' => ['SolrDisMaxQuery', 'field' => 'string'], 'SolrDisMaxQuery::removeUserField' => ['SolrDisMaxQuery', 'field' => 'string'], 'SolrDisMaxQuery::serialize' => ['string'], 'SolrDisMaxQuery::set' => ['SolrParams', 'name' => 'string', 'value' => ''], 'SolrDisMaxQuery::setBigramPhraseFields' => ['SolrDisMaxQuery', 'fields' => 'string'], 'SolrDisMaxQuery::setBigramPhraseSlop' => ['SolrDisMaxQuery', 'slop' => 'string'], 'SolrDisMaxQuery::setBoostFunction' => ['SolrDisMaxQuery', 'function' => 'string'], 'SolrDisMaxQuery::setBoostQuery' => ['SolrDisMaxQuery', 'q' => 'string'], 'SolrDisMaxQuery::setEchoHandler' => ['SolrQuery', 'flag' => 'bool'], 'SolrDisMaxQuery::setEchoParams' => ['SolrQuery', 'type' => 'string'], 'SolrDisMaxQuery::setExpand' => ['SolrQuery', 'value' => 'bool'], 'SolrDisMaxQuery::setExpandQuery' => ['SolrQuery', 'q' => 'string'], 'SolrDisMaxQuery::setExpandRows' => ['SolrQuery', 'value' => 'int'], 'SolrDisMaxQuery::setExplainOther' => ['SolrQuery', 'query' => 'string'], 'SolrDisMaxQuery::setFacet' => ['SolrQuery', 'flag' => 'bool'], 'SolrDisMaxQuery::setFacetDateEnd' => ['SolrQuery', 'value' => 'string', 'field_override' => 'string'], 'SolrDisMaxQuery::setFacetDateGap' => ['SolrQuery', 'value' => 'string', 'field_override' => 'string'], 'SolrDisMaxQuery::setFacetDateHardEnd' => ['SolrQuery', 'value' => 'string', 'field_override' => 'string'], 'SolrDisMaxQuery::setFacetDateStart' => ['SolrQuery', 'value' => 'string', 'field_override' => 'string'], 'SolrDisMaxQuery::setFacetEnumCacheMinDefaultFrequency' => ['SolrQuery', 'frequency' => 'int', 'field_override' => 'string'], 'SolrDisMaxQuery::setFacetLimit' => ['SolrQuery', 'limit' => 'int', 'field_override' => 'string'], 'SolrDisMaxQuery::setFacetMethod' => ['SolrQuery', 'method' => 'string', 'field_override' => 'string'], 'SolrDisMaxQuery::setFacetMinCount' => ['SolrQuery', 'mincount' => 'int', 'field_override' => 'string'], 'SolrDisMaxQuery::setFacetMissing' => ['SolrQuery', 'flag' => 'bool', 'field_override' => 'string'], 'SolrDisMaxQuery::setFacetOffset' => ['SolrQuery', 'offset' => 'int', 'field_override' => 'string'], 'SolrDisMaxQuery::setFacetPrefix' => ['SolrQuery', 'prefix' => 'string', 'field_override' => 'string'], 'SolrDisMaxQuery::setFacetSort' => ['SolrQuery', 'facetSort' => 'int', 'field_override' => 'string'], 'SolrDisMaxQuery::setGroup' => ['SolrQuery', 'value' => 'bool'], 'SolrDisMaxQuery::setGroupCachePercent' => ['SolrQuery', 'percent' => 'int'], 'SolrDisMaxQuery::setGroupFacet' => ['SolrQuery', 'value' => 'bool'], 'SolrDisMaxQuery::setGroupFormat' => ['SolrQuery', 'value' => 'string'], 'SolrDisMaxQuery::setGroupLimit' => ['SolrQuery', 'value' => 'int'], 'SolrDisMaxQuery::setGroupMain' => ['SolrQuery', 'value' => 'string'], 'SolrDisMaxQuery::setGroupNGroups' => ['SolrQuery', 'value' => 'bool'], 'SolrDisMaxQuery::setGroupOffset' => ['SolrQuery', 'value' => 'int'], 'SolrDisMaxQuery::setGroupTruncate' => ['SolrQuery', 'value' => 'bool'], 'SolrDisMaxQuery::setHighlight' => ['SolrQuery', 'flag' => 'bool'], 'SolrDisMaxQuery::setHighlightAlternateField' => ['SolrQuery', 'field' => 'string', 'field_override' => 'string'], 'SolrDisMaxQuery::setHighlightFormatter' => ['SolrQuery', 'formatter' => 'string', 'field_override' => 'string'], 'SolrDisMaxQuery::setHighlightFragmenter' => ['SolrQuery', 'fragmenter' => 'string', 'field_override' => 'string'], 'SolrDisMaxQuery::setHighlightFragsize' => ['SolrQuery', 'size' => 'int', 'field_override' => 'string'], 'SolrDisMaxQuery::setHighlightHighlightMultiTerm' => ['SolrQuery', 'flag' => 'bool'], 'SolrDisMaxQuery::setHighlightMaxAlternateFieldLength' => ['SolrQuery', 'fieldLength' => 'string', 'field_override' => 'string'], 'SolrDisMaxQuery::setHighlightMaxAnalyzedChars' => ['SolrQuery', 'value' => 'int'], 'SolrDisMaxQuery::setHighlightMergeContiguous' => ['SolrQuery', 'flag' => 'bool', 'field_override' => 'string'], 'SolrDisMaxQuery::setHighlightRegexMaxAnalyzedChars' => ['SolrQuery', 'maxAnalyzedChars' => 'int'], 'SolrDisMaxQuery::setHighlightRegexPattern' => ['SolrQuery', 'value' => 'string'], 'SolrDisMaxQuery::setHighlightRegexSlop' => ['SolrQuery', 'factor' => 'float'], 'SolrDisMaxQuery::setHighlightRequireFieldMatch' => ['SolrQuery', 'flag' => 'bool'], 'SolrDisMaxQuery::setHighlightSimplePost' => ['SolrQuery', 'simplePost' => 'string', 'field_override' => 'string'], 'SolrDisMaxQuery::setHighlightSimplePre' => ['SolrQuery', 'simplePre' => 'string', 'field_override' => 'string'], 'SolrDisMaxQuery::setHighlightSnippets' => ['SolrQuery', 'value' => 'int', 'field_override' => 'string'], 'SolrDisMaxQuery::setHighlightUsePhraseHighlighter' => ['SolrQuery', 'flag' => 'bool'], 'SolrDisMaxQuery::setMinimumMatch' => ['SolrDisMaxQuery', 'value' => 'string'], 'SolrDisMaxQuery::setMlt' => ['SolrQuery', 'flag' => 'bool'], 'SolrDisMaxQuery::setMltBoost' => ['SolrQuery', 'flag' => 'bool'], 'SolrDisMaxQuery::setMltCount' => ['SolrQuery', 'count' => 'int'], 'SolrDisMaxQuery::setMltMaxNumQueryTerms' => ['SolrQuery', 'value' => 'int'], 'SolrDisMaxQuery::setMltMaxNumTokens' => ['SolrQuery', 'value' => 'int'], 'SolrDisMaxQuery::setMltMaxWordLength' => ['SolrQuery', 'maxWordLength' => 'int'], 'SolrDisMaxQuery::setMltMinDocFrequency' => ['SolrQuery', 'minDocFrequency' => 'int'], 'SolrDisMaxQuery::setMltMinTermFrequency' => ['SolrQuery', 'minTermFrequency' => 'int'], 'SolrDisMaxQuery::setMltMinWordLength' => ['SolrQuery', 'minWordLength' => 'int'], 'SolrDisMaxQuery::setOmitHeader' => ['SolrQuery', 'flag' => 'bool'], 'SolrDisMaxQuery::setParam' => ['SolrParams', 'name' => 'string', 'value' => ''], 'SolrDisMaxQuery::setPhraseFields' => ['SolrDisMaxQuery', 'fields' => 'string'], 'SolrDisMaxQuery::setPhraseSlop' => ['SolrDisMaxQuery', 'slop' => 'string'], 'SolrDisMaxQuery::setQuery' => ['SolrQuery', 'query' => 'string'], 'SolrDisMaxQuery::setQueryAlt' => ['SolrDisMaxQuery', 'q' => 'string'], 'SolrDisMaxQuery::setQueryPhraseSlop' => ['SolrDisMaxQuery', 'slop' => 'string'], 'SolrDisMaxQuery::setRows' => ['SolrQuery', 'rows' => 'int'], 'SolrDisMaxQuery::setShowDebugInfo' => ['SolrQuery', 'flag' => 'bool'], 'SolrDisMaxQuery::setStart' => ['SolrQuery', 'start' => 'int'], 'SolrDisMaxQuery::setStats' => ['SolrQuery', 'flag' => 'bool'], 'SolrDisMaxQuery::setTerms' => ['SolrQuery', 'flag' => 'bool'], 'SolrDisMaxQuery::setTermsField' => ['SolrQuery', 'fieldname' => 'string'], 'SolrDisMaxQuery::setTermsIncludeLowerBound' => ['SolrQuery', 'flag' => 'bool'], 'SolrDisMaxQuery::setTermsIncludeUpperBound' => ['SolrQuery', 'flag' => 'bool'], 'SolrDisMaxQuery::setTermsLimit' => ['SolrQuery', 'limit' => 'int'], 'SolrDisMaxQuery::setTermsLowerBound' => ['SolrQuery', 'lowerBound' => 'string'], 'SolrDisMaxQuery::setTermsMaxCount' => ['SolrQuery', 'frequency' => 'int'], 'SolrDisMaxQuery::setTermsMinCount' => ['SolrQuery', 'frequency' => 'int'], 'SolrDisMaxQuery::setTermsPrefix' => ['SolrQuery', 'prefix' => 'string'], 'SolrDisMaxQuery::setTermsReturnRaw' => ['SolrQuery', 'flag' => 'bool'], 'SolrDisMaxQuery::setTermsSort' => ['SolrQuery', 'sortType' => 'int'], 'SolrDisMaxQuery::setTermsUpperBound' => ['SolrQuery', 'upperBound' => 'string'], 'SolrDisMaxQuery::setTieBreaker' => ['SolrDisMaxQuery', 'tieBreaker' => 'string'], 'SolrDisMaxQuery::setTimeAllowed' => ['SolrQuery', 'timeAllowed' => 'int'], 'SolrDisMaxQuery::setTrigramPhraseFields' => ['SolrDisMaxQuery', 'fields' => 'string'], 'SolrDisMaxQuery::setTrigramPhraseSlop' => ['SolrDisMaxQuery', 'slop' => 'string'], 'SolrDisMaxQuery::setUserFields' => ['SolrDisMaxQuery', 'fields' => 'string'], 'SolrDisMaxQuery::toString' => ['string', 'url_encode=' => 'bool|false'], 'SolrDisMaxQuery::unserialize' => ['void', 'serialized' => 'string'], 'SolrDisMaxQuery::useDisMaxQueryParser' => ['SolrDisMaxQuery'], 'SolrDisMaxQuery::useEDisMaxQueryParser' => ['SolrDisMaxQuery'], 'SolrDocument::__clone' => ['void'], 'SolrDocument::__construct' => ['void'], 'SolrDocument::__destruct' => [''], 'SolrDocument::__get' => ['SolrDocumentField', 'fieldname' => 'string'], 'SolrDocument::__isset' => ['bool', 'fieldname' => 'string'], 'SolrDocument::__set' => ['bool', 'fieldname' => 'string', 'fieldvalue' => 'string'], 'SolrDocument::__unset' => ['bool', 'fieldname' => 'string'], 'SolrDocument::addField' => ['bool', 'fieldname' => 'string', 'fieldvalue' => 'string'], 'SolrDocument::clear' => ['bool'], 'SolrDocument::current' => ['SolrDocumentField'], 'SolrDocument::deleteField' => ['bool', 'fieldname' => 'string'], 'SolrDocument::fieldExists' => ['bool', 'fieldname' => 'string'], 'SolrDocument::getChildDocuments' => ['array'], 'SolrDocument::getChildDocumentsCount' => ['int'], 'SolrDocument::getField' => ['SolrDocumentField', 'fieldname' => 'string'], 'SolrDocument::getFieldCount' => ['int'], 'SolrDocument::getFieldNames' => ['array'], 'SolrDocument::getInputDocument' => ['SolrInputDocument'], 'SolrDocument::hasChildDocuments' => ['bool'], 'SolrDocument::key' => ['string'], 'SolrDocument::merge' => ['bool', 'sourcedoc' => 'solrdocument', 'overwrite=' => 'bool'], 'SolrDocument::next' => ['void'], 'SolrDocument::offsetExists' => ['bool', 'fieldname' => 'string'], 'SolrDocument::offsetGet' => ['SolrDocumentField', 'fieldname' => 'string'], 'SolrDocument::offsetSet' => ['void', 'fieldname' => 'string', 'fieldvalue' => 'string'], 'SolrDocument::offsetUnset' => ['void', 'fieldname' => 'string'], 'SolrDocument::reset' => ['bool'], 'SolrDocument::rewind' => ['void'], 'SolrDocument::serialize' => ['string'], 'SolrDocument::sort' => ['bool', 'sortorderby' => 'int', 'sortdirection=' => 'int'], 'SolrDocument::toArray' => ['array'], 'SolrDocument::unserialize' => ['void', 'serialized' => 'string'], 'SolrDocument::valid' => ['bool'], 'SolrDocumentField::__construct' => ['void'], 'SolrDocumentField::__destruct' => [''], 'SolrException::__clone' => ['void'], 'SolrException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?\\Exception|?\\Throwable'], 'SolrException::__toString' => ['string'], 'SolrException::__wakeup' => ['void'], 'SolrException::getCode' => ['int'], 'SolrException::getFile' => ['string'], 'SolrException::getInternalInfo' => ['array'], 'SolrException::getLine' => ['int'], 'SolrException::getMessage' => ['string'], 'SolrException::getPrevious' => ['Exception|Throwable'], 'SolrException::getTrace' => ['array'], 'SolrException::getTraceAsString' => ['string'], 'SolrGenericResponse::__construct' => ['void'], 'SolrGenericResponse::__destruct' => [''], 'SolrGenericResponse::getDigestedResponse' => ['string'], 'SolrGenericResponse::getHttpStatus' => ['int'], 'SolrGenericResponse::getHttpStatusMessage' => ['string'], 'SolrGenericResponse::getRawRequest' => ['string'], 'SolrGenericResponse::getRawRequestHeaders' => ['string'], 'SolrGenericResponse::getRawResponse' => ['string'], 'SolrGenericResponse::getRawResponseHeaders' => ['string'], 'SolrGenericResponse::getRequestUrl' => ['string'], 'SolrGenericResponse::getResponse' => ['SolrObject'], 'SolrGenericResponse::setParseMode' => ['bool', 'parser_mode=' => 'int'], 'SolrGenericResponse::success' => ['bool'], 'SolrIllegalArgumentException::__clone' => ['void'], 'SolrIllegalArgumentException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?\\Exception|?\\Throwable'], 'SolrIllegalArgumentException::__toString' => ['string'], 'SolrIllegalArgumentException::__wakeup' => ['void'], 'SolrIllegalArgumentException::getCode' => ['int'], 'SolrIllegalArgumentException::getFile' => ['string'], 'SolrIllegalArgumentException::getInternalInfo' => ['array'], 'SolrIllegalArgumentException::getLine' => ['int'], 'SolrIllegalArgumentException::getMessage' => ['string'], 'SolrIllegalArgumentException::getPrevious' => ['Exception|Throwable'], 'SolrIllegalArgumentException::getTrace' => ['array'], 'SolrIllegalArgumentException::getTraceAsString' => ['string'], 'SolrIllegalOperationException::__clone' => ['void'], 'SolrIllegalOperationException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?\\Exception|?\\Throwable'], 'SolrIllegalOperationException::__toString' => ['string'], 'SolrIllegalOperationException::__wakeup' => ['void'], 'SolrIllegalOperationException::getCode' => ['int'], 'SolrIllegalOperationException::getFile' => ['string'], 'SolrIllegalOperationException::getInternalInfo' => ['array'], 'SolrIllegalOperationException::getLine' => ['int'], 'SolrIllegalOperationException::getMessage' => ['string'], 'SolrIllegalOperationException::getPrevious' => ['Exception|Throwable'], 'SolrIllegalOperationException::getTrace' => ['array'], 'SolrIllegalOperationException::getTraceAsString' => ['string'], 'SolrInputDocument::__clone' => ['void'], 'SolrInputDocument::__construct' => ['void'], 'SolrInputDocument::__destruct' => [''], 'SolrInputDocument::addChildDocument' => ['void', 'child' => 'SolrInputDocument'], 'SolrInputDocument::addChildDocuments' => ['void', 'docs' => 'array'], 'SolrInputDocument::addField' => ['bool', 'fieldname' => 'string', 'fieldvalue' => 'string', 'fieldboostvalue=' => 'float'], 'SolrInputDocument::clear' => ['bool'], 'SolrInputDocument::deleteField' => ['bool', 'fieldname' => 'string'], 'SolrInputDocument::fieldExists' => ['bool', 'fieldname' => 'string'], 'SolrInputDocument::getBoost' => ['float'], 'SolrInputDocument::getChildDocuments' => ['array'], 'SolrInputDocument::getChildDocumentsCount' => ['int'], 'SolrInputDocument::getField' => ['SolrDocumentField', 'fieldname' => 'string'], 'SolrInputDocument::getFieldBoost' => ['float', 'fieldname' => 'string'], 'SolrInputDocument::getFieldCount' => ['int'], 'SolrInputDocument::getFieldNames' => ['array'], 'SolrInputDocument::hasChildDocuments' => ['bool'], 'SolrInputDocument::merge' => ['bool', 'sourcedoc' => 'solrinputdocument', 'overwrite=' => 'bool'], 'SolrInputDocument::reset' => ['bool'], 'SolrInputDocument::setBoost' => ['bool', 'documentboostvalue' => 'float'], 'SolrInputDocument::setFieldBoost' => ['bool', 'fieldname' => 'string', 'fieldboostvalue' => 'float'], 'SolrInputDocument::sort' => ['bool', 'sortorderby' => 'int', 'sortdirection=' => 'int'], 'SolrInputDocument::toArray' => ['array'], 'SolrModifiableParams::__construct' => ['void'], 'SolrModifiableParams::__destruct' => [''], 'SolrModifiableParams::add' => ['SolrParams', 'name' => 'string', 'value' => 'string'], 'SolrModifiableParams::addParam' => ['SolrParams', 'name' => 'string', 'value' => 'string'], 'SolrModifiableParams::get' => ['mixed', 'param_name' => 'string'], 'SolrModifiableParams::getParam' => ['mixed', 'param_name' => 'string'], 'SolrModifiableParams::getParams' => ['array'], 'SolrModifiableParams::getPreparedParams' => ['array'], 'SolrModifiableParams::serialize' => ['string'], 'SolrModifiableParams::set' => ['SolrParams', 'name' => 'string', 'value' => ''], 'SolrModifiableParams::setParam' => ['SolrParams', 'name' => 'string', 'value' => ''], 'SolrModifiableParams::toString' => ['string', 'url_encode=' => 'bool|false'], 'SolrModifiableParams::unserialize' => ['void', 'serialized' => 'string'], 'SolrObject::__construct' => ['void'], 'SolrObject::__destruct' => [''], 'SolrObject::getPropertyNames' => ['array'], 'SolrObject::offsetExists' => ['bool', 'property_name' => 'string'], 'SolrObject::offsetGet' => ['mixed', 'property_name' => 'string'], 'SolrObject::offsetSet' => ['void', 'property_name' => 'string', 'property_value' => 'string'], 'SolrObject::offsetUnset' => ['void', 'property_name' => 'string'], 'SolrParams::__construct' => ['void'], 'SolrParams::add' => ['SolrParams', 'name' => 'string', 'value' => 'string'], 'SolrParams::addParam' => ['SolrParams', 'name' => 'string', 'value' => 'string'], 'SolrParams::get' => ['mixed', 'param_name' => 'string'], 'SolrParams::getParam' => ['mixed', 'param_name=' => 'string'], 'SolrParams::getParams' => ['array'], 'SolrParams::getPreparedParams' => ['array'], 'SolrParams::serialize' => ['string'], 'SolrParams::set' => ['void', 'name' => 'string', 'value' => 'string'], 'SolrParams::setParam' => ['SolrParams', 'name' => 'string', 'value' => 'string'], 'SolrParams::toString' => ['string', 'url_encode=' => 'bool'], 'SolrParams::unserialize' => ['void', 'serialized' => 'string'], 'SolrPingResponse::__construct' => ['void'], 'SolrPingResponse::__destruct' => [''], 'SolrPingResponse::getDigestedResponse' => ['string'], 'SolrPingResponse::getHttpStatus' => ['int'], 'SolrPingResponse::getHttpStatusMessage' => ['string'], 'SolrPingResponse::getRawRequest' => ['string'], 'SolrPingResponse::getRawRequestHeaders' => ['string'], 'SolrPingResponse::getRawResponse' => ['string'], 'SolrPingResponse::getRawResponseHeaders' => ['string'], 'SolrPingResponse::getRequestUrl' => ['string'], 'SolrPingResponse::getResponse' => ['string'], 'SolrPingResponse::setParseMode' => ['bool', 'parser_mode=' => 'int'], 'SolrPingResponse::success' => ['bool'], 'SolrQuery::__construct' => ['void', 'q=' => 'string'], 'SolrQuery::__destruct' => [''], 'SolrQuery::add' => ['SolrParams', 'name' => 'string', 'value' => 'string'], 'SolrQuery::addExpandFilterQuery' => ['SolrQuery', 'fq' => 'string'], 'SolrQuery::addExpandSortField' => ['SolrQuery', 'field' => 'string', 'order=' => 'string'], 'SolrQuery::addFacetDateField' => ['SolrQuery', 'datefield' => 'string'], 'SolrQuery::addFacetDateOther' => ['SolrQuery', 'value' => 'string', 'field_override=' => 'string'], 'SolrQuery::addFacetField' => ['SolrQuery', 'field' => 'string'], 'SolrQuery::addFacetQuery' => ['SolrQuery', 'facetquery' => 'string'], 'SolrQuery::addField' => ['SolrQuery', 'field' => 'string'], 'SolrQuery::addFilterQuery' => ['SolrQuery', 'fq' => 'string'], 'SolrQuery::addGroupField' => ['SolrQuery', 'value' => 'string'], 'SolrQuery::addGroupFunction' => ['SolrQuery', 'value' => 'string'], 'SolrQuery::addGroupQuery' => ['SolrQuery', 'value' => 'string'], 'SolrQuery::addGroupSortField' => ['SolrQuery', 'field' => 'string', 'order=' => 'int'], 'SolrQuery::addHighlightField' => ['SolrQuery', 'field' => 'string'], 'SolrQuery::addMltField' => ['SolrQuery', 'field' => 'string'], 'SolrQuery::addMltQueryField' => ['SolrQuery', 'field' => 'string', 'boost' => 'float'], 'SolrQuery::addParam' => ['SolrParams', 'name' => 'string', 'value' => 'string'], 'SolrQuery::addSortField' => ['SolrQuery', 'field' => 'string', 'order=' => 'int'], 'SolrQuery::addStatsFacet' => ['SolrQuery', 'field' => 'string'], 'SolrQuery::addStatsField' => ['SolrQuery', 'field' => 'string'], 'SolrQuery::collapse' => ['SolrQuery', 'collapseFunction' => 'SolrCollapseFunction'], 'SolrQuery::get' => ['mixed', 'param_name' => 'string'], 'SolrQuery::getExpand' => ['bool'], 'SolrQuery::getExpandFilterQueries' => ['array'], 'SolrQuery::getExpandQuery' => ['array'], 'SolrQuery::getExpandRows' => ['int'], 'SolrQuery::getExpandSortFields' => ['array'], 'SolrQuery::getFacet' => ['bool'], 'SolrQuery::getFacetDateEnd' => ['string', 'field_override=' => 'string'], 'SolrQuery::getFacetDateFields' => ['array'], 'SolrQuery::getFacetDateGap' => ['string', 'field_override=' => 'string'], 'SolrQuery::getFacetDateHardEnd' => ['string', 'field_override=' => 'string'], 'SolrQuery::getFacetDateOther' => ['array', 'field_override=' => 'string'], 'SolrQuery::getFacetDateStart' => ['string', 'field_override=' => 'string'], 'SolrQuery::getFacetFields' => ['array'], 'SolrQuery::getFacetLimit' => ['int', 'field_override=' => 'string'], 'SolrQuery::getFacetMethod' => ['string', 'field_override=' => 'string'], 'SolrQuery::getFacetMinCount' => ['int', 'field_override=' => 'string'], 'SolrQuery::getFacetMissing' => ['bool', 'field_override=' => 'string'], 'SolrQuery::getFacetOffset' => ['int', 'field_override=' => 'string'], 'SolrQuery::getFacetPrefix' => ['string', 'field_override=' => 'string'], 'SolrQuery::getFacetQueries' => ['array'], 'SolrQuery::getFacetSort' => ['int', 'field_override=' => 'string'], 'SolrQuery::getFields' => ['array'], 'SolrQuery::getFilterQueries' => ['array'], 'SolrQuery::getGroup' => ['bool'], 'SolrQuery::getGroupCachePercent' => ['int'], 'SolrQuery::getGroupFacet' => ['bool'], 'SolrQuery::getGroupFields' => ['array'], 'SolrQuery::getGroupFormat' => ['string'], 'SolrQuery::getGroupFunctions' => ['array'], 'SolrQuery::getGroupLimit' => ['int'], 'SolrQuery::getGroupMain' => ['bool'], 'SolrQuery::getGroupNGroups' => ['bool'], 'SolrQuery::getGroupOffset' => ['int'], 'SolrQuery::getGroupQueries' => ['array'], 'SolrQuery::getGroupSortFields' => ['array'], 'SolrQuery::getGroupTruncate' => ['bool'], 'SolrQuery::getHighlight' => ['bool'], 'SolrQuery::getHighlightAlternateField' => ['string', 'field_override=' => 'string'], 'SolrQuery::getHighlightFields' => ['array'], 'SolrQuery::getHighlightFormatter' => ['string', 'field_override=' => 'string'], 'SolrQuery::getHighlightFragmenter' => ['string', 'field_override=' => 'string'], 'SolrQuery::getHighlightFragsize' => ['int', 'field_override=' => 'string'], 'SolrQuery::getHighlightHighlightMultiTerm' => ['bool'], 'SolrQuery::getHighlightMaxAlternateFieldLength' => ['int', 'field_override=' => 'string'], 'SolrQuery::getHighlightMaxAnalyzedChars' => ['int'], 'SolrQuery::getHighlightMergeContiguous' => ['bool', 'field_override=' => 'string'], 'SolrQuery::getHighlightRegexMaxAnalyzedChars' => ['int'], 'SolrQuery::getHighlightRegexPattern' => ['string'], 'SolrQuery::getHighlightRegexSlop' => ['float'], 'SolrQuery::getHighlightRequireFieldMatch' => ['bool'], 'SolrQuery::getHighlightSimplePost' => ['string', 'field_override=' => 'string'], 'SolrQuery::getHighlightSimplePre' => ['string', 'field_override=' => 'string'], 'SolrQuery::getHighlightSnippets' => ['int', 'field_override=' => 'string'], 'SolrQuery::getHighlightUsePhraseHighlighter' => ['bool'], 'SolrQuery::getMlt' => ['bool'], 'SolrQuery::getMltBoost' => ['bool'], 'SolrQuery::getMltCount' => ['int'], 'SolrQuery::getMltFields' => ['array'], 'SolrQuery::getMltMaxNumQueryTerms' => ['int'], 'SolrQuery::getMltMaxNumTokens' => ['int'], 'SolrQuery::getMltMaxWordLength' => ['int'], 'SolrQuery::getMltMinDocFrequency' => ['int'], 'SolrQuery::getMltMinTermFrequency' => ['int'], 'SolrQuery::getMltMinWordLength' => ['int'], 'SolrQuery::getMltQueryFields' => ['array'], 'SolrQuery::getParam' => ['mixed', 'param_name' => 'string'], 'SolrQuery::getParams' => ['array'], 'SolrQuery::getPreparedParams' => ['array'], 'SolrQuery::getQuery' => ['string'], 'SolrQuery::getRows' => ['int'], 'SolrQuery::getSortFields' => ['array'], 'SolrQuery::getStart' => ['int'], 'SolrQuery::getStats' => ['bool'], 'SolrQuery::getStatsFacets' => ['array'], 'SolrQuery::getStatsFields' => ['array'], 'SolrQuery::getTerms' => ['bool'], 'SolrQuery::getTermsField' => ['string'], 'SolrQuery::getTermsIncludeLowerBound' => ['bool'], 'SolrQuery::getTermsIncludeUpperBound' => ['bool'], 'SolrQuery::getTermsLimit' => ['int'], 'SolrQuery::getTermsLowerBound' => ['string'], 'SolrQuery::getTermsMaxCount' => ['int'], 'SolrQuery::getTermsMinCount' => ['int'], 'SolrQuery::getTermsPrefix' => ['string'], 'SolrQuery::getTermsReturnRaw' => ['bool'], 'SolrQuery::getTermsSort' => ['int'], 'SolrQuery::getTermsUpperBound' => ['string'], 'SolrQuery::getTimeAllowed' => ['int'], 'SolrQuery::removeExpandFilterQuery' => ['SolrQuery', 'fq' => 'string'], 'SolrQuery::removeExpandSortField' => ['SolrQuery', 'field' => 'string'], 'SolrQuery::removeFacetDateField' => ['SolrQuery', 'field' => 'string'], 'SolrQuery::removeFacetDateOther' => ['SolrQuery', 'value' => 'string', 'field_override=' => 'string'], 'SolrQuery::removeFacetField' => ['SolrQuery', 'field' => 'string'], 'SolrQuery::removeFacetQuery' => ['SolrQuery', 'value' => 'string'], 'SolrQuery::removeField' => ['SolrQuery', 'field' => 'string'], 'SolrQuery::removeFilterQuery' => ['SolrQuery', 'fq' => 'string'], 'SolrQuery::removeHighlightField' => ['SolrQuery', 'field' => 'string'], 'SolrQuery::removeMltField' => ['SolrQuery', 'field' => 'string'], 'SolrQuery::removeMltQueryField' => ['SolrQuery', 'queryfield' => 'string'], 'SolrQuery::removeSortField' => ['SolrQuery', 'field' => 'string'], 'SolrQuery::removeStatsFacet' => ['SolrQuery', 'value' => 'string'], 'SolrQuery::removeStatsField' => ['SolrQuery', 'field' => 'string'], 'SolrQuery::serialize' => ['string'], 'SolrQuery::set' => ['SolrParams', 'name' => 'string', 'value' => ''], 'SolrQuery::setEchoHandler' => ['SolrQuery', 'flag' => 'bool'], 'SolrQuery::setEchoParams' => ['SolrQuery', 'type' => 'string'], 'SolrQuery::setExpand' => ['SolrQuery', 'value' => 'bool'], 'SolrQuery::setExpandQuery' => ['SolrQuery', 'q' => 'string'], 'SolrQuery::setExpandRows' => ['SolrQuery', 'value' => 'int'], 'SolrQuery::setExplainOther' => ['SolrQuery', 'query' => 'string'], 'SolrQuery::setFacet' => ['SolrQuery', 'flag' => 'bool'], 'SolrQuery::setFacetDateEnd' => ['SolrQuery', 'value' => 'string', 'field_override=' => 'string'], 'SolrQuery::setFacetDateGap' => ['SolrQuery', 'value' => 'string', 'field_override=' => 'string'], 'SolrQuery::setFacetDateHardEnd' => ['SolrQuery', 'value' => 'bool', 'field_override=' => 'string'], 'SolrQuery::setFacetDateStart' => ['SolrQuery', 'value' => 'string', 'field_override=' => 'string'], 'SolrQuery::setFacetEnumCacheMinDefaultFrequency' => ['SolrQuery', 'frequency' => 'int', 'field_override=' => 'string'], 'SolrQuery::setFacetLimit' => ['SolrQuery', 'limit' => 'int', 'field_override=' => 'string'], 'SolrQuery::setFacetMethod' => ['SolrQuery', 'method' => 'string', 'field_override=' => 'string'], 'SolrQuery::setFacetMinCount' => ['SolrQuery', 'mincount' => 'int', 'field_override=' => 'string'], 'SolrQuery::setFacetMissing' => ['SolrQuery', 'flag' => 'bool', 'field_override=' => 'string'], 'SolrQuery::setFacetOffset' => ['SolrQuery', 'offset' => 'int', 'field_override=' => 'string'], 'SolrQuery::setFacetPrefix' => ['SolrQuery', 'prefix' => 'string', 'field_override=' => 'string'], 'SolrQuery::setFacetSort' => ['SolrQuery', 'facetsort' => 'int', 'field_override=' => 'string'], 'SolrQuery::setGroup' => ['SolrQuery', 'value' => 'bool'], 'SolrQuery::setGroupCachePercent' => ['SolrQuery', 'percent' => 'int'], 'SolrQuery::setGroupFacet' => ['SolrQuery', 'value' => 'bool'], 'SolrQuery::setGroupFormat' => ['SolrQuery', 'value' => 'string'], 'SolrQuery::setGroupLimit' => ['SolrQuery', 'value' => 'int'], 'SolrQuery::setGroupMain' => ['SolrQuery', 'value' => 'string'], 'SolrQuery::setGroupNGroups' => ['SolrQuery', 'value' => 'bool'], 'SolrQuery::setGroupOffset' => ['SolrQuery', 'value' => 'int'], 'SolrQuery::setGroupTruncate' => ['SolrQuery', 'value' => 'bool'], 'SolrQuery::setHighlight' => ['SolrQuery', 'flag' => 'bool'], 'SolrQuery::setHighlightAlternateField' => ['SolrQuery', 'field' => 'string', 'field_override=' => 'string'], 'SolrQuery::setHighlightFormatter' => ['SolrQuery', 'formatter' => 'string', 'field_override=' => 'string'], 'SolrQuery::setHighlightFragmenter' => ['SolrQuery', 'fragmenter' => 'string', 'field_override=' => 'string'], 'SolrQuery::setHighlightFragsize' => ['SolrQuery', 'size' => 'int', 'field_override=' => 'string'], 'SolrQuery::setHighlightHighlightMultiTerm' => ['SolrQuery', 'flag' => 'bool'], 'SolrQuery::setHighlightMaxAlternateFieldLength' => ['SolrQuery', 'fieldlength' => 'int', 'field_override=' => 'string'], 'SolrQuery::setHighlightMaxAnalyzedChars' => ['SolrQuery', 'value' => 'int'], 'SolrQuery::setHighlightMergeContiguous' => ['SolrQuery', 'flag' => 'bool', 'field_override=' => 'string'], 'SolrQuery::setHighlightRegexMaxAnalyzedChars' => ['SolrQuery', 'maxanalyzedchars' => 'int'], 'SolrQuery::setHighlightRegexPattern' => ['SolrQuery', 'value' => 'string'], 'SolrQuery::setHighlightRegexSlop' => ['SolrQuery', 'factor' => 'float'], 'SolrQuery::setHighlightRequireFieldMatch' => ['SolrQuery', 'flag' => 'bool'], 'SolrQuery::setHighlightSimplePost' => ['SolrQuery', 'simplepost' => 'string', 'field_override=' => 'string'], 'SolrQuery::setHighlightSimplePre' => ['SolrQuery', 'simplepre' => 'string', 'field_override=' => 'string'], 'SolrQuery::setHighlightSnippets' => ['SolrQuery', 'value' => 'int', 'field_override=' => 'string'], 'SolrQuery::setHighlightUsePhraseHighlighter' => ['SolrQuery', 'flag' => 'bool'], 'SolrQuery::setMlt' => ['SolrQuery', 'flag' => 'bool'], 'SolrQuery::setMltBoost' => ['SolrQuery', 'flag' => 'bool'], 'SolrQuery::setMltCount' => ['SolrQuery', 'count' => 'int'], 'SolrQuery::setMltMaxNumQueryTerms' => ['SolrQuery', 'value' => 'int'], 'SolrQuery::setMltMaxNumTokens' => ['SolrQuery', 'value' => 'int'], 'SolrQuery::setMltMaxWordLength' => ['SolrQuery', 'maxwordlength' => 'int'], 'SolrQuery::setMltMinDocFrequency' => ['SolrQuery', 'mindocfrequency' => 'int'], 'SolrQuery::setMltMinTermFrequency' => ['SolrQuery', 'mintermfrequency' => 'int'], 'SolrQuery::setMltMinWordLength' => ['SolrQuery', 'minwordlength' => 'int'], 'SolrQuery::setOmitHeader' => ['SolrQuery', 'flag' => 'bool'], 'SolrQuery::setParam' => ['SolrParams', 'name' => 'string', 'value' => ''], 'SolrQuery::setQuery' => ['SolrQuery', 'query' => 'string'], 'SolrQuery::setRows' => ['SolrQuery', 'rows' => 'int'], 'SolrQuery::setShowDebugInfo' => ['SolrQuery', 'flag' => 'bool'], 'SolrQuery::setStart' => ['SolrQuery', 'start' => 'int'], 'SolrQuery::setStats' => ['SolrQuery', 'flag' => 'bool'], 'SolrQuery::setTerms' => ['SolrQuery', 'flag' => 'bool'], 'SolrQuery::setTermsField' => ['SolrQuery', 'fieldname' => 'string'], 'SolrQuery::setTermsIncludeLowerBound' => ['SolrQuery', 'flag' => 'bool'], 'SolrQuery::setTermsIncludeUpperBound' => ['SolrQuery', 'flag' => 'bool'], 'SolrQuery::setTermsLimit' => ['SolrQuery', 'limit' => 'int'], 'SolrQuery::setTermsLowerBound' => ['SolrQuery', 'lowerbound' => 'string'], 'SolrQuery::setTermsMaxCount' => ['SolrQuery', 'frequency' => 'int'], 'SolrQuery::setTermsMinCount' => ['SolrQuery', 'frequency' => 'int'], 'SolrQuery::setTermsPrefix' => ['SolrQuery', 'prefix' => 'string'], 'SolrQuery::setTermsReturnRaw' => ['SolrQuery', 'flag' => 'bool'], 'SolrQuery::setTermsSort' => ['SolrQuery', 'sorttype' => 'int'], 'SolrQuery::setTermsUpperBound' => ['SolrQuery', 'upperbound' => 'string'], 'SolrQuery::setTimeAllowed' => ['SolrQuery', 'timeallowed' => 'int'], 'SolrQuery::toString' => ['string', 'url_encode=' => 'bool|false'], 'SolrQuery::unserialize' => ['void', 'serialized' => 'string'], 'SolrQueryResponse::__construct' => ['void'], 'SolrQueryResponse::__destruct' => [''], 'SolrQueryResponse::getDigestedResponse' => ['string'], 'SolrQueryResponse::getHttpStatus' => ['int'], 'SolrQueryResponse::getHttpStatusMessage' => ['string'], 'SolrQueryResponse::getRawRequest' => ['string'], 'SolrQueryResponse::getRawRequestHeaders' => ['string'], 'SolrQueryResponse::getRawResponse' => ['string'], 'SolrQueryResponse::getRawResponseHeaders' => ['string'], 'SolrQueryResponse::getRequestUrl' => ['string'], 'SolrQueryResponse::getResponse' => ['SolrObject'], 'SolrQueryResponse::setParseMode' => ['bool', 'parser_mode=' => 'int'], 'SolrQueryResponse::success' => ['bool'], 'SolrResponse::getDigestedResponse' => ['string'], 'SolrResponse::getHttpStatus' => ['int'], 'SolrResponse::getHttpStatusMessage' => ['string'], 'SolrResponse::getRawRequest' => ['string'], 'SolrResponse::getRawRequestHeaders' => ['string'], 'SolrResponse::getRawResponse' => ['string'], 'SolrResponse::getRawResponseHeaders' => ['string'], 'SolrResponse::getRequestUrl' => ['string'], 'SolrResponse::getResponse' => ['SolrObject'], 'SolrResponse::setParseMode' => ['bool', 'parser_mode=' => 'int'], 'SolrResponse::success' => ['bool'], 'SolrServerException::__clone' => ['void'], 'SolrServerException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?\\Exception|?\\Throwable'], 'SolrServerException::__toString' => ['string'], 'SolrServerException::__wakeup' => ['void'], 'SolrServerException::getCode' => ['int'], 'SolrServerException::getFile' => ['string'], 'SolrServerException::getInternalInfo' => ['array'], 'SolrServerException::getLine' => ['int'], 'SolrServerException::getMessage' => ['string'], 'SolrServerException::getPrevious' => ['Exception|Throwable'], 'SolrServerException::getTrace' => ['array'], 'SolrServerException::getTraceAsString' => ['string'], 'SolrUpdateResponse::__construct' => ['void'], 'SolrUpdateResponse::__destruct' => [''], 'SolrUpdateResponse::getDigestedResponse' => ['string'], 'SolrUpdateResponse::getHttpStatus' => ['int'], 'SolrUpdateResponse::getHttpStatusMessage' => ['string'], 'SolrUpdateResponse::getRawRequest' => ['string'], 'SolrUpdateResponse::getRawRequestHeaders' => ['string'], 'SolrUpdateResponse::getRawResponse' => ['string'], 'SolrUpdateResponse::getRawResponseHeaders' => ['string'], 'SolrUpdateResponse::getRequestUrl' => ['string'], 'SolrUpdateResponse::getResponse' => ['SolrObject'], 'SolrUpdateResponse::setParseMode' => ['bool', 'parser_mode=' => 'int'], 'SolrUpdateResponse::success' => ['bool'], 'SolrUtils::digestXmlResponse' => ['SolrObject', 'xmlresponse' => 'string', 'parse_mode=' => 'int'], 'SolrUtils::escapeQueryChars' => ['string', 'str' => 'string'], 'SolrUtils::getSolrVersion' => ['string'], 'SolrUtils::queryPhrase' => ['string', 'str' => 'string'], 'sort' => ['bool', '&rw_array_arg' => 'array', 'sort_flags=' => 'int'], 'soundex' => ['string', 'str' => 'string'], 'SphinxClient::__construct' => ['void'], 'SphinxClient::addQuery' => ['int', 'query' => 'string', 'index=' => 'string', 'comment=' => 'string'], 'SphinxClient::buildExcerpts' => ['array', 'docs' => 'array', 'index' => 'string', 'words' => 'string', 'opts=' => 'array'], 'SphinxClient::buildKeywords' => ['array', 'query' => 'string', 'index' => 'string', 'hits' => 'bool'], 'SphinxClient::close' => ['bool'], 'SphinxClient::escapeString' => ['string', 'string' => 'string'], 'SphinxClient::getLastError' => ['string'], 'SphinxClient::getLastWarning' => ['string'], 'SphinxClient::open' => ['bool'], 'SphinxClient::query' => ['array', 'query' => 'string', 'index=' => 'string', 'comment=' => 'string'], 'SphinxClient::resetFilters' => ['void'], 'SphinxClient::resetGroupBy' => ['void'], 'SphinxClient::runQueries' => ['array'], 'SphinxClient::setArrayResult' => ['bool', 'array_result' => 'bool'], 'SphinxClient::setConnectTimeout' => ['bool', 'timeout' => 'float'], 'SphinxClient::setFieldWeights' => ['bool', 'weights' => 'array'], 'SphinxClient::setFilter' => ['bool', 'attribute' => 'string', 'values' => 'array', 'exclude=' => 'bool'], 'SphinxClient::setFilterFloatRange' => ['bool', 'attribute' => 'string', 'min' => 'float', 'max' => 'float', 'exclude=' => 'bool'], 'SphinxClient::setFilterRange' => ['bool', 'attribute' => 'string', 'min' => 'int', 'max' => 'int', 'exclude=' => 'bool'], 'SphinxClient::setGeoAnchor' => ['bool', 'attrlat' => 'string', 'attrlong' => 'string', 'latitude' => 'float', 'longitude' => 'float'], 'SphinxClient::setGroupBy' => ['bool', 'attribute' => 'string', 'func' => 'int', 'groupsort=' => 'string'], 'SphinxClient::setGroupDistinct' => ['bool', 'attribute' => 'string'], 'SphinxClient::setIDRange' => ['bool', 'min' => 'int', 'max' => 'int'], 'SphinxClient::setIndexWeights' => ['bool', 'weights' => 'array'], 'SphinxClient::setLimits' => ['bool', 'offset' => 'int', 'limit' => 'int', 'max_matches=' => 'int', 'cutoff=' => 'int'], 'SphinxClient::setMatchMode' => ['bool', 'mode' => 'int'], 'SphinxClient::setMaxQueryTime' => ['bool', 'qtime' => 'int'], 'SphinxClient::setOverride' => ['bool', 'attribute' => 'string', 'type' => 'int', 'values' => 'array'], 'SphinxClient::setRankingMode' => ['bool', 'ranker' => 'int'], 'SphinxClient::setRetries' => ['bool', 'count' => 'int', 'delay=' => 'int'], 'SphinxClient::setSelect' => ['bool', 'clause' => 'string'], 'SphinxClient::setServer' => ['bool', 'server' => 'string', 'port' => 'int'], 'SphinxClient::setSortMode' => ['bool', 'mode' => 'int', 'sortby=' => 'string'], 'SphinxClient::status' => ['array'], 'SphinxClient::updateAttributes' => ['int', 'index' => 'string', 'attributes' => 'array', 'values' => 'array', 'mva=' => 'bool'], 'spl_autoload' => ['void', 'class_name' => 'string', 'file_extensions=' => 'string'], 'spl_autoload_call' => ['void', 'class_name' => 'string'], 'spl_autoload_extensions' => ['string', 'file_extensions=' => 'string'], 'spl_autoload_functions' => ['false|array'], 'spl_autoload_register' => ['bool', 'autoload_function=' => 'callable', 'throw=' => 'bool', 'prepend=' => 'bool'], 'spl_autoload_unregister' => ['bool', 'autoload_function' => 'mixed'], 'spl_classes' => ['array'], 'spl_object_hash' => ['string', 'obj' => 'object'], 'spl_object_id' => ['int', 'obj' => 'object'], 'SplDoublyLinkedList::add' => ['void', 'index' => 'mixed', 'newval' => 'mixed'], 'SplDoublyLinkedList::bottom' => ['mixed'], 'SplDoublyLinkedList::count' => ['int'], 'SplDoublyLinkedList::current' => ['mixed'], 'SplDoublyLinkedList::getIteratorMode' => ['int'], 'SplDoublyLinkedList::isEmpty' => ['bool'], 'SplDoublyLinkedList::key' => ['mixed'], 'SplDoublyLinkedList::next' => ['void'], 'SplDoublyLinkedList::offsetExists' => ['bool', 'index' => 'mixed'], 'SplDoublyLinkedList::offsetGet' => ['mixed', 'index' => 'mixed'], 'SplDoublyLinkedList::offsetSet' => ['void', 'index' => 'mixed', 'newval' => 'mixed'], 'SplDoublyLinkedList::offsetUnset' => ['void', 'index' => 'mixed'], 'SplDoublyLinkedList::pop' => ['mixed'], 'SplDoublyLinkedList::prev' => ['void'], 'SplDoublyLinkedList::push' => ['void', 'value' => 'mixed'], 'SplDoublyLinkedList::rewind' => ['void'], 'SplDoublyLinkedList::serialize' => ['string'], 'SplDoublyLinkedList::setIteratorMode' => ['int', 'flags' => 'int'], 'SplDoublyLinkedList::shift' => ['mixed'], 'SplDoublyLinkedList::top' => ['mixed'], 'SplDoublyLinkedList::unserialize' => ['void', 'serialized' => 'string'], 'SplDoublyLinkedList::unshift' => ['bool', 'value' => 'mixed'], 'SplDoublyLinkedList::valid' => ['bool'], 'SplEnum::__construct' => ['void', 'initial_value=' => 'mixed', 'strict=' => 'bool|true'], 'SplEnum::getConstList' => ['array', 'include_default=' => 'bool'], 'SplFileInfo::__construct' => ['void', 'file_name' => 'string'], 'SplFileInfo::__toString' => ['string'], 'SplFileInfo::getATime' => ['int'], 'SplFileInfo::getBasename' => ['string', 'suffix=' => 'string'], 'SplFileInfo::getCTime' => ['int'], 'SplFileInfo::getExtension' => ['string'], 'SplFileInfo::getFileInfo' => ['SplFileInfo', 'class_name=' => 'string'], 'SplFileInfo::getFilename' => ['string'], 'SplFileInfo::getGroup' => ['int'], 'SplFileInfo::getInode' => ['int'], 'SplFileInfo::getLinkTarget' => ['string'], 'SplFileInfo::getMTime' => ['int'], 'SplFileInfo::getOwner' => ['int'], 'SplFileInfo::getPath' => ['string'], 'SplFileInfo::getPathInfo' => ['SplFileInfo', 'class_name=' => 'string'], 'SplFileInfo::getPathname' => ['string'], 'SplFileInfo::getPerms' => ['int'], 'SplFileInfo::getRealPath' => ['string|false'], 'SplFileInfo::getSize' => ['int'], 'SplFileInfo::getType' => ['string'], 'SplFileInfo::isDir' => ['bool'], 'SplFileInfo::isExecutable' => ['bool'], 'SplFileInfo::isFile' => ['bool'], 'SplFileInfo::isLink' => ['bool'], 'SplFileInfo::isReadable' => ['bool'], 'SplFileInfo::isWritable' => ['bool'], 'SplFileInfo::openFile' => ['SplFileObject', 'mode=' => 'string', 'use_include_path=' => 'bool', 'context=' => 'resource'], 'SplFileInfo::setFileClass' => ['void', 'class_name=' => 'string'], 'SplFileInfo::setInfoClass' => ['void', 'class_name=' => 'string'], 'SplFileObject::__construct' => ['void', 'filename' => 'string', 'mode=' => 'string', 'use_include_path=' => 'bool', 'context=' => ''], 'SplFileObject::__toString' => ['string'], 'SplFileObject::current' => ['string|array|false'], 'SplFileObject::eof' => ['bool'], 'SplFileObject::fflush' => ['bool'], 'SplFileObject::fgetc' => ['string|false'], 'SplFileObject::fgetcsv' => ['?array|false', 'delimiter=' => 'string', 'enclosure=' => 'string', 'escape=' => 'string'], 'SplFileObject::fgets' => ['string'], 'SplFileObject::fgetss' => ['string', 'allowable_tags=' => 'string'], 'SplFileObject::flock' => ['bool', 'operation' => 'int', '&w_wouldblock=' => 'int'], 'SplFileObject::fpassthru' => ['int'], 'SplFileObject::fputcsv' => ['int|false', 'fields' => 'array', 'delimiter=' => 'string', 'enclosure=' => 'string', 'escape=' => 'string'], 'SplFileObject::fread' => ['string|false', 'length' => 'int'], 'SplFileObject::fscanf' => ['bool', 'format' => 'string', '&...w_vars=' => 'string|int|float'], 'SplFileObject::fseek' => ['int', 'pos' => 'int', 'whence=' => 'int'], 'SplFileObject::fstat' => ['array|false'], 'SplFileObject::ftell' => ['int|false'], 'SplFileObject::ftruncate' => ['bool', 'size' => 'int'], 'SplFileObject::fwrite' => ['int', 'str' => 'string', 'length=' => 'int'], 'SplFileObject::getChildren' => ['bool'], 'SplFileObject::getCsvControl' => ['array'], 'SplFileObject::getFlags' => ['int'], 'SplFileObject::getMaxLineLen' => ['int'], 'SplFileObject::hasChildren' => ['bool'], 'SplFileObject::key' => ['int'], 'SplFileObject::next' => ['void'], 'SplFileObject::rewind' => ['void'], 'SplFileObject::seek' => ['void', 'line_pos' => 'int'], 'SplFileObject::setCsvControl' => ['void', 'delimiter=' => 'string', 'enclosure=' => 'string', 'escape=' => 'string'], 'SplFileObject::setFlags' => ['void', 'flags' => 'int'], 'SplFileObject::setMaxLineLen' => ['void', 'max_len' => 'int'], 'SplFileObject::valid' => ['bool'], 'SplFixedArray::__construct' => ['void', 'size=' => 'int'], 'SplFixedArray::__wakeup' => ['void'], 'SplFixedArray::count' => ['int'], 'SplFixedArray::current' => ['mixed'], 'SplFixedArray::fromArray' => ['SplFixedArray', 'data' => 'array', 'save_indexes=' => 'bool'], 'SplFixedArray::getSize' => ['int'], 'SplFixedArray::key' => ['int'], 'SplFixedArray::next' => ['void'], 'SplFixedArray::offsetExists' => ['bool', 'index' => 'int'], 'SplFixedArray::offsetGet' => ['mixed', 'index' => 'int'], 'SplFixedArray::offsetSet' => ['void', 'index' => 'int', 'newval' => 'mixed'], 'SplFixedArray::offsetUnset' => ['void', 'index' => 'int'], 'SplFixedArray::rewind' => ['void'], 'SplFixedArray::setSize' => ['bool', 'size' => 'int'], 'SplFixedArray::toArray' => ['array'], 'SplFixedArray::valid' => ['bool'], 'SplHeap::compare' => ['int', 'value1' => 'mixed', 'value2' => 'mixed'], 'SplHeap::count' => ['int'], 'SplHeap::current' => ['mixed'], 'SplHeap::extract' => ['mixed'], 'SplHeap::insert' => ['bool', 'value' => 'mixed'], 'SplHeap::isCorrupted' => ['int'], 'SplHeap::isEmpty' => ['bool'], 'SplHeap::key' => ['int'], 'SplHeap::next' => ['void'], 'SplHeap::recoverFromCorruption' => ['int'], 'SplHeap::rewind' => ['void'], 'SplHeap::top' => ['mixed'], 'SplHeap::valid' => ['bool'], 'split' => ['array', 'pattern' => 'string', 'string' => 'string', 'limit=' => 'int'], 'spliti' => ['array', 'pattern' => 'string', 'string' => 'string', 'limit=' => 'int'], 'SplMaxHeap::compare' => ['int', 'a' => 'mixed', 'b' => 'mixed'], 'SplMinHeap::compare' => ['int', 'a' => 'mixed', 'b' => 'mixed'], 'SplObjectStorage::addAll' => ['void', 'os' => 'splobjectstorage'], 'SplObjectStorage::attach' => ['void', 'obj' => 'object', 'inf=' => 'mixed'], 'SplObjectStorage::contains' => ['bool', 'obj' => 'object'], 'SplObjectStorage::count' => ['int'], 'SplObjectStorage::current' => ['object'], 'SplObjectStorage::detach' => ['void', 'obj' => 'object'], 'SplObjectStorage::getHash' => ['string', 'obj' => 'object'], 'SplObjectStorage::getInfo' => ['mixed'], 'SplObjectStorage::key' => ['int'], 'SplObjectStorage::next' => ['void'], 'SplObjectStorage::offsetExists' => ['bool', 'object' => 'object'], 'SplObjectStorage::offsetGet' => ['mixed', 'obj' => 'object'], 'SplObjectStorage::offsetSet' => ['object', 'object' => 'object', 'data=' => 'mixed'], 'SplObjectStorage::offsetUnset' => ['object', 'object' => 'object'], 'SplObjectStorage::removeAll' => ['void', 'os' => 'splobjectstorage'], 'SplObjectStorage::removeAllExcept' => ['void', 'os' => 'splobjectstorage'], 'SplObjectStorage::rewind' => ['void'], 'SplObjectStorage::serialize' => ['string'], 'SplObjectStorage::setInfo' => ['void', 'inf' => 'mixed'], 'SplObjectStorage::unserialize' => ['void', 'serialized' => 'string'], 'SplObjectStorage::valid' => ['bool'], 'SplObserver::update' => ['void', 'subject' => 'splsubject'], 'SplPriorityQueue::compare' => ['int', 'a' => 'mixed', 'b' => 'mixed'], 'SplPriorityQueue::count' => ['int'], 'SplPriorityQueue::current' => ['mixed'], 'SplPriorityQueue::extract' => ['mixed'], 'SplPriorityQueue::getExtractFlags' => ['int'], 'SplPriorityQueue::insert' => ['bool', 'value' => 'mixed', 'priority' => 'mixed'], 'SplPriorityQueue::isEmpty' => ['bool'], 'SplPriorityQueue::key' => ['mixed'], 'SplPriorityQueue::next' => ['void'], 'SplPriorityQueue::recoverFromCorruption' => ['void'], 'SplPriorityQueue::rewind' => ['void'], 'SplPriorityQueue::setExtractFlags' => ['void', 'flags' => 'int'], 'SplPriorityQueue::top' => ['mixed'], 'SplPriorityQueue::valid' => ['bool'], 'SplQueue::dequeue' => ['mixed'], 'SplQueue::enqueue' => ['void', 'value' => 'mixed'], 'SplQueue::setIteratorMode' => ['void', 'mode' => 'int'], 'SplStack::setIteratorMode' => ['void', 'mode' => 'int'], 'SplSubject::attach' => ['void', 'observer' => 'splobserver'], 'SplSubject::detach' => ['void', 'observer' => 'splobserver'], 'SplSubject::notify' => ['void'], 'SplTempFileObject::__construct' => ['void', 'max_memory=' => 'int'], 'SplType::__construct' => ['void', 'initial_value=' => 'mixed', 'strict=' => 'bool'], 'Spoofchecker::__construct' => ['void'], 'Spoofchecker::areConfusable' => ['bool', 's1' => 'string', 's2' => 'string', '&w_error=' => 'string'], 'Spoofchecker::isSuspicious' => ['bool', 'text' => 'string', '&w_error=' => 'string'], 'Spoofchecker::setAllowedLocales' => ['void', 'locale_list' => 'string'], 'Spoofchecker::setChecks' => ['void', 'checks' => 'long'], 'Spoofchecker::setRestrictionLevel' => ['void', 'restriction_level' => 'int'], 'sprintf' => ['string', 'format' => 'string', '...args=' => 'string|int|float'], 'sql_regcase' => ['string', 'string' => 'string'], 'SQLite3::__construct' => ['void', 'filename' => 'string', 'flags=' => 'int', 'encryption_key=' => 'string|null'], 'SQLite3::busyTimeout' => ['bool', 'msecs' => 'int'], 'SQLite3::changes' => ['int'], 'SQLite3::close' => ['bool'], 'SQLite3::createAggregate' => ['bool', 'name' => 'string', 'step_callback' => 'callable', 'final_callback' => 'callable', 'argument_count=' => 'int'], 'SQLite3::createCollation' => ['bool', 'name' => 'string', 'callback' => 'callable'], 'SQLite3::createFunction' => ['bool', 'name' => 'string', 'callback' => 'callable', 'argument_count=' => 'int', 'flags=' => 'int'], 'SQLite3::enableExceptions' => ['bool', 'enableexceptions=' => 'bool'], 'SQLite3::escapeString' => ['string', 'value' => 'string'], 'SQLite3::exec' => ['bool', 'query' => 'string'], 'SQLite3::lastErrorCode' => ['int'], 'SQLite3::lastErrorMsg' => ['string'], 'SQLite3::lastInsertRowID' => ['int'], 'SQLite3::loadExtension' => ['bool', 'shared_library' => 'string'], 'SQLite3::open' => ['void', 'filename' => 'string', 'flags=' => 'int', 'encryption_key=' => 'string|null'], 'SQLite3::openBlob' => ['resource', 'table' => 'string', 'column' => 'string', 'rowid' => 'int', 'dbname' => 'string', 'flags=' => 'int'], 'SQLite3::prepare' => ['SQLite3Stmt|false', 'query' => 'string'], 'SQLite3::query' => ['SQLite3Result|false', 'query' => 'string'], 'SQLite3::querySingle' => ['array|int|string|bool|float|null|false', 'query' => 'string', 'entire_row=' => 'bool'], 'SQLite3::version' => ['array'], 'SQLite3Result::__construct' => ['void'], 'SQLite3Result::columnName' => ['string', 'column_number' => 'int'], 'SQLite3Result::columnType' => ['int', 'column_number' => 'int'], 'SQLite3Result::fetchArray' => ['array', 'mode=' => 'int'], 'SQLite3Result::finalize' => ['bool'], 'SQLite3Result::numColumns' => ['int'], 'SQLite3Result::reset' => ['bool'], 'SQLite3Stmt::__construct' => ['void', 'dbobject' => 'sqlite3', 'statement' => 'string'], 'SQLite3Stmt::bindParam' => ['bool', 'parameter_name_or_number' => 'string|int', '&rw_parameter' => 'mixed', 'type=' => 'int'], 'SQLite3Stmt::bindValue' => ['bool', 'parameter_name_or_number' => 'string|int', 'parameter' => 'mixed', 'type=' => 'int'], 'SQLite3Stmt::clear' => ['bool'], 'SQLite3Stmt::close' => ['bool'], 'SQLite3Stmt::execute' => ['SQLite3Result'], 'SQLite3Stmt::paramCount' => ['int'], 'SQLite3Stmt::readOnly' => ['bool'], 'SQLite3Stmt::reset' => ['bool'], 'sqlite_array_query' => ['array', 'dbhandle' => '', 'query' => 'string', 'result_type=' => 'int', 'decode_binary=' => 'bool'], 'sqlite_busy_timeout' => ['', 'dbhandle' => '', 'milliseconds' => 'int'], 'sqlite_changes' => ['int', 'dbhandle' => ''], 'sqlite_close' => ['void', 'dbhandle' => 'resource'], 'sqlite_column' => ['', 'result' => '', 'index_or_name' => '', 'decode_binary=' => 'bool'], 'sqlite_create_aggregate' => ['', 'dbhandle' => '', 'function_name' => 'string', 'step_func' => 'callable', 'finalize_func' => 'callable', 'num_args=' => 'int'], 'sqlite_create_function' => ['', 'dbhandle' => '', 'function_name' => 'string', 'callback' => 'callable', 'num_args=' => 'int'], 'sqlite_current' => ['array', 'result' => '', 'result_type=' => 'int', 'decode_binary=' => 'bool'], 'sqlite_error_string' => ['string', 'error_code' => 'int'], 'sqlite_escape_string' => ['string', 'item' => 'string'], 'sqlite_exec' => ['bool', 'dbhandle' => '', 'query' => 'string', 'error_msg=' => 'string'], 'sqlite_factory' => ['SQLiteDatabase', 'filename' => 'string', 'mode=' => 'int', 'error_message=' => 'string'], 'sqlite_fetch_all' => ['array', 'result' => '', 'result_type=' => 'int', 'decode_binary=' => 'bool'], 'sqlite_fetch_array' => ['array', 'result' => '', 'result_type=' => 'int', 'decode_binary=' => 'bool'], 'sqlite_fetch_column_types' => ['array', 'table_name' => 'string', 'dbhandle' => '', 'result_type=' => 'int'], 'sqlite_fetch_object' => ['object', 'result' => '', 'class_name=' => 'string', 'ctor_params=' => 'array', 'decode_binary=' => 'bool'], 'sqlite_fetch_single' => ['string', 'result' => '', 'decode_binary=' => 'bool'], 'sqlite_field_name' => ['string', 'result' => '', 'field_index' => 'int'], 'sqlite_has_more' => ['bool', 'result' => 'resource'], 'sqlite_has_prev' => ['bool', 'result' => ''], 'sqlite_key' => ['int', 'result' => ''], 'sqlite_last_error' => ['int', 'dbhandle' => ''], 'sqlite_last_insert_rowid' => ['int', 'dbhandle' => ''], 'sqlite_libencoding' => ['string'], 'sqlite_libversion' => ['string'], 'sqlite_next' => ['bool', 'result' => ''], 'sqlite_num_fields' => ['int', 'result' => ''], 'sqlite_num_rows' => ['int', 'result' => ''], 'sqlite_open' => ['resource', 'filename' => 'string', 'mode=' => 'int', 'error_message=' => 'string'], 'sqlite_popen' => ['resource', 'filename' => 'string', 'mode=' => 'int', 'error_message=' => 'string'], 'sqlite_prev' => ['bool', 'result' => ''], 'sqlite_query' => ['SQLiteResult', 'dbhandle' => '', 'query' => 'string', 'result_type=' => 'int', 'error_msg=' => 'string'], 'sqlite_rewind' => ['bool', 'result' => ''], 'sqlite_seek' => ['bool', 'result' => '', 'rownum' => 'int'], 'sqlite_single_query' => ['array', 'db' => '', 'query' => 'string', 'first_row_only=' => 'bool', 'decode_binary=' => 'bool'], 'sqlite_udf_decode_binary' => ['string', 'data' => 'string'], 'sqlite_udf_encode_binary' => ['string', 'data' => 'string'], 'sqlite_unbuffered_query' => ['SQLiteUnbuffered', 'dbhandle' => '', 'query' => 'string', 'result_type=' => 'int', 'error_msg=' => 'string'], 'sqlite_valid' => ['bool', 'result' => ''], 'SQLiteDatabase::arrayQuery' => ['array', 'dbhandle' => '', 'query' => 'string', 'result_type=' => 'int', 'decode_binary=' => 'bool'], 'SQLiteDatabase::busyTimeout' => ['', 'dbhandle' => '', 'milliseconds' => 'int'], 'SQLiteDatabase::changes' => ['int', 'dbhandle' => ''], 'SQLiteDatabase::createAggregate' => ['', 'dbhandle' => '', 'function_name' => 'string', 'step_func' => 'callable', 'finalize_func' => 'callable', 'num_args=' => 'int'], 'SQLiteDatabase::createFunction' => ['', 'dbhandle' => '', 'function_name' => 'string', 'callback' => 'callable', 'num_args=' => 'int'], 'SQLiteDatabase::exec' => ['bool', 'dbhandle' => '', 'query' => 'string', 'error_msg=' => 'string'], 'SQLiteDatabase::fetchColumnTypes' => ['array', 'table_name' => 'string', 'dbhandle' => '', 'result_type=' => 'int'], 'SQLiteDatabase::lastError' => ['int', 'dbhandle' => ''], 'SQLiteDatabase::lastInsertRowid' => ['int', 'dbhandle' => ''], 'SQLiteDatabase::query' => ['SQLiteResult', 'dbhandle' => '', 'query' => 'string', 'result_type=' => 'int', 'error_msg=' => 'string'], 'SQLiteDatabase::queryExec' => ['bool', 'query' => 'string', '&w_error_msg=' => 'string'], 'SQLiteDatabase::singleQuery' => ['array', 'db' => '', 'query' => 'string', 'first_row_only=' => 'bool', 'decode_binary=' => 'bool'], 'SQLiteDatabase::unbufferedQuery' => ['SQLiteUnbuffered', 'dbhandle' => '', 'query' => 'string', 'result_type=' => 'int', 'error_msg=' => 'string'], 'SQLiteResult::column' => ['', 'result' => '', 'index_or_name' => '', 'decode_binary=' => 'bool'], 'SQLiteResult::current' => ['array', 'result' => '', 'result_type=' => 'int', 'decode_binary=' => 'bool'], 'SQLiteResult::fetch' => ['array', 'result' => '', 'result_type=' => 'int', 'decode_binary=' => 'bool'], 'SQLiteResult::fetchAll' => ['array', 'result' => '', 'result_type=' => 'int', 'decode_binary=' => 'bool'], 'SQLiteResult::fetchObject' => ['object', 'result' => '', 'class_name=' => 'string', 'ctor_params=' => 'array', 'decode_binary=' => 'bool'], 'SQLiteResult::fetchSingle' => ['string', 'result' => '', 'decode_binary=' => 'bool'], 'SQLiteResult::fieldName' => ['string', 'result' => '', 'field_index' => 'int'], 'SQLiteResult::hasPrev' => ['bool', 'result' => ''], 'SQLiteResult::key' => ['int', 'result' => ''], 'SQLiteResult::next' => ['bool', 'result' => ''], 'SQLiteResult::numFields' => ['int', 'result' => ''], 'SQLiteResult::numRows' => ['int', 'result' => ''], 'SQLiteResult::prev' => ['bool', 'result' => ''], 'SQLiteResult::rewind' => ['bool', 'result' => ''], 'SQLiteResult::seek' => ['bool', 'result' => '', 'rownum' => 'int'], 'SQLiteResult::valid' => ['bool', 'result' => ''], 'SQLiteUnbuffered::column' => ['', 'result' => '', 'index_or_name' => '', 'decode_binary=' => 'bool'], 'SQLiteUnbuffered::current' => ['array', 'result' => '', 'result_type=' => 'int', 'decode_binary=' => 'bool'], 'SQLiteUnbuffered::fetch' => ['array', 'result' => '', 'result_type=' => 'int', 'decode_binary=' => 'bool'], 'SQLiteUnbuffered::fetchAll' => ['array', 'result' => '', 'result_type=' => 'int', 'decode_binary=' => 'bool'], 'SQLiteUnbuffered::fetchObject' => ['object', 'result' => '', 'class_name=' => 'string', 'ctor_params=' => 'array', 'decode_binary=' => 'bool'], 'SQLiteUnbuffered::fetchSingle' => ['string', 'result' => '', 'decode_binary=' => 'bool'], 'SQLiteUnbuffered::fieldName' => ['string', 'result' => '', 'field_index' => 'int'], 'SQLiteUnbuffered::next' => ['bool', 'result' => ''], 'SQLiteUnbuffered::numFields' => ['int', 'result' => ''], 'SQLiteUnbuffered::valid' => ['bool', 'result' => ''], 'sqlsrv_begin_transaction' => ['bool', 'conn' => 'resource'], 'sqlsrv_cancel' => ['bool', 'stmt' => 'resource'], 'sqlsrv_client_info' => ['array|false', 'conn' => 'resource'], 'sqlsrv_close' => ['bool', 'conn' => 'resource'], 'sqlsrv_commit' => ['bool', 'conn' => 'resource'], 'sqlsrv_configure' => ['bool', 'setting' => 'string', 'value' => 'mixed'], 'sqlsrv_connect' => ['resource|false', 'serverName' => 'string', 'connectionInfo=' => 'array'], 'sqlsrv_errors' => ['array|null', 'errorsOrWarnings=' => 'int'], 'sqlsrv_execute' => ['bool', 'stmt' => 'resource'], 'sqlsrv_fetch' => ['bool|null', 'stmt' => 'resource', 'row=' => 'int', 'offset=' => 'int'], 'sqlsrv_fetch_array' => ['array|null|false', 'stmt' => 'resource', 'fetchType=' => 'int', 'row=' => 'int', 'offset=' => 'int'], 'sqlsrv_fetch_object' => ['object|null|false', 'stmt' => 'resource', 'className=' => 'string', 'ctorParams=' => 'array', 'row=' => 'int', 'offset=' => 'int'], 'sqlsrv_field_metadata' => ['array|false', 'stmt' => 'resource'], 'sqlsrv_free_stmt' => ['bool', 'stmt' => 'resource'], 'sqlsrv_get_config' => ['mixed', 'setting' => 'string'], 'sqlsrv_get_field' => ['mixed', 'stmt' => 'resource', 'fieldIndex' => 'int', 'getAsType=' => 'int'], 'sqlsrv_has_rows' => ['bool', 'stmt' => 'resource'], 'sqlsrv_next_result' => ['bool|null', 'stmt' => 'resource'], 'sqlsrv_num_fields' => ['int|false', 'stmt' => 'resource'], 'sqlsrv_num_rows' => ['int|false', 'stmt' => 'resource'], 'sqlsrv_prepare' => ['resource|false', 'conn' => 'resource', 'sql' => 'string', 'params=' => 'array', 'options=' => 'array'], 'sqlsrv_query' => ['resource|false', 'conn' => 'resource', 'sql' => 'string', 'params=' => 'array', 'options=' => 'array'], 'sqlsrv_rollback' => ['bool', 'conn' => 'resource'], 'sqlsrv_rows_affected' => ['int|false', 'stmt' => 'resource'], 'sqlsrv_send_stream_data' => ['bool', 'stmt' => 'resource'], 'sqlsrv_server_info' => ['array', 'conn' => 'resource'], 'sqrt' => ['float', 'number' => 'float'], 'srand' => ['void', 'seed=' => 'int', 'mode=' => 'int'], 'sscanf' => ['mixed', 'str' => 'string', 'format' => 'string', '&...w_vars=' => 'string|int|float|null'], 'ssdeep_fuzzy_compare' => ['int', 'signature1' => 'string', 'signature2' => 'string'], 'ssdeep_fuzzy_hash' => ['string', 'to_hash' => 'string'], 'ssdeep_fuzzy_hash_filename' => ['string', 'file_name' => 'string'], 'ssh2_auth_agent' => ['bool', 'session' => 'resource', 'username' => 'string'], 'ssh2_auth_hostbased_file' => ['bool', 'session' => 'resource', 'username' => 'string', 'hostname' => 'string', 'pubkeyfile' => 'string', 'privkeyfile' => 'string', 'passphrase=' => 'string', 'local_username=' => 'string'], 'ssh2_auth_none' => ['true|string[]', 'session' => 'resource', 'username' => 'string'], 'ssh2_auth_password' => ['bool', 'session' => 'resource', 'username' => 'string', 'password' => 'string'], 'ssh2_auth_pubkey_file' => ['bool', 'session' => 'resource', 'username' => 'string', 'pubkeyfile' => 'string', 'privkeyfile' => 'string', 'passphrase=' => 'string'], 'ssh2_connect' => ['resource|false', 'host' => 'string', 'port=' => 'int', 'methods=' => 'array', 'callbacks=' => 'array'], 'ssh2_disconnect' => ['bool', 'session' => 'resource'], 'ssh2_exec' => ['resource|false', 'session' => 'resource', 'command' => 'string', 'pty=' => 'string', 'env=' => 'array', 'width=' => 'int', 'height=' => 'int', 'width_height_type=' => 'int'], 'ssh2_fetch_stream' => ['resource', 'channel' => 'resource', 'streamid' => 'int'], 'ssh2_fingerprint' => ['string', 'session' => 'resource', 'flags=' => 'int'], 'ssh2_methods_negotiated' => ['array', 'session' => 'resource'], 'ssh2_publickey_add' => ['bool', 'pkey' => 'resource', 'algoname' => 'string', 'blob' => 'string', 'overwrite=' => 'bool', 'attributes=' => 'array'], 'ssh2_publickey_init' => ['resource|false', 'session' => 'resource'], 'ssh2_publickey_list' => ['array', 'pkey' => 'resource'], 'ssh2_publickey_remove' => ['bool', 'pkey' => 'resource', 'algoname' => 'string', 'blob' => 'string'], 'ssh2_scp_recv' => ['bool', 'session' => 'resource', 'remote_file' => 'string', 'local_file' => 'string'], 'ssh2_scp_send' => ['bool', 'session' => 'resource', 'local_file' => 'string', 'remote_file' => 'string', 'create_mode=' => 'int'], 'ssh2_sftp' => ['resource', 'session' => 'resource'], 'ssh2_sftp_chmod' => ['bool', 'sftp' => 'resource', 'filename' => 'string', 'mode' => 'int'], 'ssh2_sftp_lstat' => ['array', 'sftp' => 'resource', 'path' => 'string'], 'ssh2_sftp_mkdir' => ['bool', 'sftp' => 'resource', 'dirname' => 'string', 'mode=' => 'int', 'recursive=' => 'bool'], 'ssh2_sftp_readlink' => ['string', 'sftp' => 'resource', 'link' => 'string'], 'ssh2_sftp_realpath' => ['string', 'sftp' => 'resource', 'filename' => 'string'], 'ssh2_sftp_rename' => ['bool', 'sftp' => 'resource', 'from' => 'string', 'to' => 'string'], 'ssh2_sftp_rmdir' => ['bool', 'sftp' => 'resource', 'dirname' => 'string'], 'ssh2_sftp_stat' => ['array|false', 'sftp' => 'resource', 'path' => 'string'], 'ssh2_sftp_symlink' => ['bool', 'sftp' => 'resource', 'target' => 'string', 'link' => 'string'], 'ssh2_sftp_unlink' => ['bool', 'sftp' => 'resource', 'filename' => 'string'], 'ssh2_shell' => ['resource', 'session' => 'resource', 'term_type=' => 'string', 'env=' => 'array', 'width=' => 'int', 'height=' => 'int', 'width_height_type=' => 'int'], 'ssh2_tunnel' => ['resource', 'session' => 'resource', 'host' => 'string', 'port' => 'int'], 'stat' => ['array|false', 'filename' => 'string'], 'stats_absolute_deviation' => ['float', 'a' => 'array'], 'stats_cdf_beta' => ['float', 'par1' => 'float', 'par2' => 'float', 'par3' => 'float', 'which' => 'int'], 'stats_cdf_binomial' => ['float', 'par1' => 'float', 'par2' => 'float', 'par3' => 'float', 'which' => 'int'], 'stats_cdf_cauchy' => ['float', 'par1' => 'float', 'par2' => 'float', 'par3' => 'float', 'which' => 'int'], 'stats_cdf_chisquare' => ['float', 'par1' => 'float', 'par2' => 'float', 'which' => 'int'], 'stats_cdf_exponential' => ['float', 'par1' => 'float', 'par2' => 'float', 'which' => 'int'], 'stats_cdf_f' => ['float', 'par1' => 'float', 'par2' => 'float', 'par3' => 'float', 'which' => 'int'], 'stats_cdf_gamma' => ['float', 'par1' => 'float', 'par2' => 'float', 'par3' => 'float', 'which' => 'int'], 'stats_cdf_laplace' => ['float', 'par1' => 'float', 'par2' => 'float', 'par3' => 'float', 'which' => 'int'], 'stats_cdf_logistic' => ['float', 'par1' => 'float', 'par2' => 'float', 'par3' => 'float', 'which' => 'int'], 'stats_cdf_negative_binomial' => ['float', 'par1' => 'float', 'par2' => 'float', 'par3' => 'float', 'which' => 'int'], 'stats_cdf_noncentral_chisquare' => ['float', 'par1' => 'float', 'par2' => 'float', 'par3' => 'float', 'which' => 'int'], 'stats_cdf_noncentral_f' => ['float', 'par1' => 'float', 'par2' => 'float', 'par3' => 'float', 'par4' => 'float', 'which' => 'int'], 'stats_cdf_noncentral_t' => ['float', 'par1' => 'float', 'par2' => 'float', 'par3' => 'float', 'which' => 'int'], 'stats_cdf_normal' => ['float', 'par1' => 'float', 'par2' => 'float', 'par3' => 'float', 'which' => 'int'], 'stats_cdf_poisson' => ['float', 'par1' => 'float', 'par2' => 'float', 'which' => 'int'], 'stats_cdf_t' => ['float', 'par1' => 'float', 'par2' => 'float', 'which' => 'int'], 'stats_cdf_uniform' => ['float', 'par1' => 'float', 'par2' => 'float', 'par3' => 'float', 'which' => 'int'], 'stats_cdf_weibull' => ['float', 'par1' => 'float', 'par2' => 'float', 'par3' => 'float', 'which' => 'int'], 'stats_covariance' => ['float', 'a' => 'array', 'b' => 'array'], 'stats_den_uniform' => ['float', 'x' => 'float', 'a' => 'float', 'b' => 'float'], 'stats_dens_beta' => ['float', 'x' => 'float', 'a' => 'float', 'b' => 'float'], 'stats_dens_cauchy' => ['float', 'x' => 'float', 'ave' => 'float', 'stdev' => 'float'], 'stats_dens_chisquare' => ['float', 'x' => 'float', 'dfr' => 'float'], 'stats_dens_exponential' => ['float', 'x' => 'float', 'scale' => 'float'], 'stats_dens_f' => ['float', 'x' => 'float', 'dfr1' => 'float', 'dfr2' => 'float'], 'stats_dens_gamma' => ['float', 'x' => 'float', 'shape' => 'float', 'scale' => 'float'], 'stats_dens_laplace' => ['float', 'x' => 'float', 'ave' => 'float', 'stdev' => 'float'], 'stats_dens_logistic' => ['float', 'x' => 'float', 'ave' => 'float', 'stdev' => 'float'], 'stats_dens_negative_binomial' => ['float', 'x' => 'float', 'n' => 'float', 'pi' => 'float'], 'stats_dens_normal' => ['float', 'x' => 'float', 'ave' => 'float', 'stdev' => 'float'], 'stats_dens_pmf_binomial' => ['float', 'x' => 'float', 'n' => 'float', 'pi' => 'float'], 'stats_dens_pmf_hypergeometric' => ['float', 'n1' => 'float', 'n2' => 'float', 'N1' => 'float', 'N2' => 'float'], 'stats_dens_pmf_negative_binomial' => ['float', 'x' => 'float', 'n' => 'float', 'pi' => 'float'], 'stats_dens_pmf_poisson' => ['float', 'x' => 'float', 'lb' => 'float'], 'stats_dens_t' => ['float', 'x' => 'float', 'dfr' => 'float'], 'stats_dens_uniform' => ['float', 'x' => 'float', 'a' => 'float', 'b' => 'float'], 'stats_dens_weibull' => ['float', 'x' => 'float', 'a' => 'float', 'b' => 'float'], 'stats_harmonic_mean' => ['float', 'a' => 'array'], 'stats_kurtosis' => ['float', 'a' => 'array'], 'stats_rand_gen_beta' => ['float', 'a' => 'float', 'b' => 'float'], 'stats_rand_gen_chisquare' => ['float', 'df' => 'float'], 'stats_rand_gen_exponential' => ['float', 'av' => 'float'], 'stats_rand_gen_f' => ['float', 'dfn' => 'float', 'dfd' => 'float'], 'stats_rand_gen_funiform' => ['float', 'low' => 'float', 'high' => 'float'], 'stats_rand_gen_gamma' => ['float', 'a' => 'float', 'r' => 'float'], 'stats_rand_gen_ibinomial' => ['int', 'n' => 'int', 'pp' => 'float'], 'stats_rand_gen_ibinomial_negative' => ['int', 'n' => 'int', 'p' => 'float'], 'stats_rand_gen_int' => ['int'], 'stats_rand_gen_ipoisson' => ['int', 'mu' => 'float'], 'stats_rand_gen_iuniform' => ['int', 'low' => 'int', 'high' => 'int'], 'stats_rand_gen_noncenral_chisquare' => ['float', 'df' => 'float', 'xnonc' => 'float'], 'stats_rand_gen_noncentral_chisquare' => ['float', 'df' => 'float', 'xnonc' => 'float'], 'stats_rand_gen_noncentral_f' => ['float', 'dfn' => 'float', 'dfd' => 'float', 'xnonc' => 'float'], 'stats_rand_gen_noncentral_t' => ['float', 'df' => 'float', 'xnonc' => 'float'], 'stats_rand_gen_normal' => ['float', 'av' => 'float', 'sd' => 'float'], 'stats_rand_gen_t' => ['float', 'df' => 'float'], 'stats_rand_get_seeds' => ['array'], 'stats_rand_phrase_to_seeds' => ['array', 'phrase' => 'string'], 'stats_rand_ranf' => ['float'], 'stats_rand_setall' => ['void', 'iseed1' => 'int', 'iseed2' => 'int'], 'stats_skew' => ['float', 'a' => 'array'], 'stats_standard_deviation' => ['float', 'a' => 'array', 'sample=' => 'bool'], 'stats_stat_binomial_coef' => ['float', 'x' => 'int', 'n' => 'int'], 'stats_stat_correlation' => ['float', 'arr1' => 'array', 'arr2' => 'array'], 'stats_stat_factorial' => ['float', 'n' => 'int'], 'stats_stat_gennch' => ['float', 'n' => 'int'], 'stats_stat_independent_t' => ['float', 'arr1' => 'array', 'arr2' => 'array'], 'stats_stat_innerproduct' => ['float', 'arr1' => 'array', 'arr2' => 'array'], 'stats_stat_noncentral_t' => ['float', 'par1' => 'float', 'par2' => 'float', 'par3' => 'float', 'which' => 'int'], 'stats_stat_paired_t' => ['float', 'arr1' => 'array', 'arr2' => 'array'], 'stats_stat_percentile' => ['float', 'df' => 'float', 'xnonc' => 'float'], 'stats_stat_powersum' => ['float', 'arr' => 'array', 'power' => 'float'], 'stats_variance' => ['float', 'a' => 'array', 'sample=' => 'bool'], 'Stomp::__construct' => ['void', 'broker=' => 'string', 'username=' => 'string', 'password=' => 'string', 'headers=' => 'array'], 'Stomp::__destruct' => ['bool', 'link' => ''], 'Stomp::abort' => ['bool', 'transaction_id' => 'string', 'headers=' => 'array', 'link=' => ''], 'Stomp::ack' => ['bool', 'msg' => '', 'headers=' => 'array', 'link=' => ''], 'Stomp::begin' => ['bool', 'transaction_id' => 'string', 'headers=' => 'array', 'link=' => ''], 'Stomp::commit' => ['bool', 'transaction_id' => 'string', 'headers=' => 'array', 'link=' => ''], 'Stomp::error' => ['string', 'link' => ''], 'Stomp::getReadTimeout' => ['array', 'link' => ''], 'Stomp::getSessionId' => ['string', 'link' => ''], 'Stomp::hasFrame' => ['bool', 'link' => ''], 'Stomp::readFrame' => ['array', 'class_name=' => 'string', 'link=' => ''], 'Stomp::send' => ['bool', 'destination' => 'string', 'msg' => '', 'headers=' => 'array', 'link=' => ''], 'Stomp::setReadTimeout' => ['', 'seconds' => 'int', 'microseconds=' => 'int', 'link=' => ''], 'Stomp::subscribe' => ['bool', 'destination' => 'string', 'headers=' => 'array', 'link=' => ''], 'Stomp::unsubscribe' => ['bool', 'destination' => 'string', 'headers=' => 'array', 'link=' => ''], 'stomp_abort' => ['bool', 'transaction_id' => 'string', 'headers=' => 'array', 'link=' => ''], 'stomp_ack' => ['bool', 'msg' => '', 'headers=' => 'array', 'link=' => ''], 'stomp_begin' => ['bool', 'transaction_id' => 'string', 'headers=' => 'array', 'link=' => ''], 'stomp_close' => ['bool', 'link' => ''], 'stomp_commit' => ['bool', 'transaction_id' => 'string', 'headers=' => 'array', 'link=' => ''], 'stomp_connect' => ['resource', 'broker=' => 'string', 'username=' => 'string', 'password=' => 'string', 'headers=' => 'array'], 'stomp_connect_error' => ['string'], 'stomp_error' => ['string', 'link' => ''], 'stomp_get_read_timeout' => ['array', 'link' => ''], 'stomp_get_session_id' => ['string', 'link' => ''], 'stomp_has_frame' => ['bool', 'link' => ''], 'stomp_read_frame' => ['array', 'class_name=' => 'string', 'link=' => ''], 'stomp_send' => ['bool', 'destination' => 'string', 'msg' => '', 'headers=' => 'array', 'link=' => ''], 'stomp_set_read_timeout' => ['', 'seconds' => 'int', 'microseconds=' => 'int', 'link=' => ''], 'stomp_subscribe' => ['bool', 'destination' => 'string', 'headers=' => 'array', 'link=' => ''], 'stomp_unsubscribe' => ['bool', 'destination' => 'string', 'headers=' => 'array', 'link=' => ''], 'stomp_version' => ['string'], 'StompException::getDetails' => ['string'], 'StompFrame::__construct' => ['void', 'command=' => 'string', 'headers=' => 'array', 'body=' => 'string'], 'str_getcsv' => ['array', 'input' => 'string', 'delimiter=' => 'string', 'enclosure=' => 'string', 'escape=' => 'string'], 'str_ireplace' => ['string|string[]', 'search' => 'string|array', 'replace' => 'string|array', 'subject' => 'string|array', '&w_replace_count=' => 'int'], 'str_pad' => ['string', 'input' => 'string', 'pad_length' => 'int', 'pad_string=' => 'string', 'pad_type=' => 'int'], 'str_repeat' => ['string', 'input' => 'string', 'multiplier' => 'int'], 'str_replace' => ['string|array', 'search' => 'string|array', 'replace' => 'string|array', 'subject' => 'string|array', '&w_replace_count=' => 'int'], 'str_rot13' => ['string', 'str' => 'string'], 'str_shuffle' => ['string', 'str' => 'string'], 'str_split' => ['array<int,string>|false', 'str' => 'string', 'split_length=' => 'int'], 'str_word_count' => ['array|int', 'string' => 'string', 'format=' => 'int', 'charlist=' => 'string'], 'strcasecmp' => ['int', 'str1' => 'string', 'str2' => 'string'], 'strchr' => ['string|false', 'haystack' => 'string', 'needle' => 'string', 'before_needle=' => 'bool'], 'strcmp' => ['int', 'str1' => 'string', 'str2' => 'string'], 'strcoll' => ['int', 'str1' => 'string', 'str2' => 'string'], 'strcspn' => ['int', 'str' => 'string', 'mask' => 'string', 'start=' => 'int', 'length=' => 'int'], 'stream_bucket_append' => ['void', 'brigade' => 'resource', 'bucket' => 'object'], 'stream_bucket_make_writeable' => ['object', 'brigade' => 'resource'], 'stream_bucket_new' => ['resource', 'stream' => 'resource', 'buffer' => 'string'], 'stream_bucket_prepend' => ['void', 'brigade' => 'resource', 'bucket' => 'object'], 'stream_context_create' => ['resource', 'options=' => 'array', 'params=' => 'array'], 'stream_context_get_default' => ['resource', 'options=' => 'array'], 'stream_context_get_options' => ['array', 'context' => 'resource'], 'stream_context_get_params' => ['array', 'context' => 'resource'], 'stream_context_set_default' => ['resource', 'options' => 'array'], 'stream_context_set_option' => ['bool', 'context' => '', 'wrappername' => 'string', 'optionname' => 'string', 'value' => ''], 'stream_context_set_option\'1' => ['bool', 'context' => '', 'options' => 'array'], 'stream_context_set_params' => ['bool', 'context' => 'resource', 'options' => 'array'], 'stream_copy_to_stream' => ['int|false', 'source' => 'resource', 'dest' => 'resource', 'maxlen=' => 'int', 'pos=' => 'int'], 'stream_encoding' => ['bool', 'stream' => 'resource', 'encoding=' => 'string'], 'stream_filter_append' => ['resource|false', 'stream' => 'resource', 'filtername' => 'string', 'read_write=' => 'int', 'filterparams=' => 'array'], 'stream_filter_prepend' => ['resource|false', 'stream' => 'resource', 'filtername' => 'string', 'read_write=' => 'int', 'filterparams=' => 'array'], 'stream_filter_register' => ['bool', 'filtername' => 'string', 'classname' => 'string'], 'stream_filter_remove' => ['bool', 'stream_filter' => 'resource'], 'stream_get_contents' => ['string|false', 'source' => 'resource', 'maxlen=' => 'int', 'offset=' => 'int'], 'stream_get_filters' => ['array'], 'stream_get_line' => ['string|false', 'stream' => 'resource', 'maxlen' => 'int', 'ending=' => 'string'], 'stream_get_meta_data' => ['array', 'fp' => 'resource'], 'stream_get_transports' => ['array'], 'stream_get_wrappers' => ['array'], 'stream_is_local' => ['bool', 'stream' => 'resource|string'], 'stream_isatty' => ['bool', 'stream' => 'resource'], 'stream_notification_callback' => ['callback', 'notification_code' => 'int', 'severity' => 'int', 'message' => 'string', 'message_code' => 'int', 'bytes_transferred' => 'int', 'bytes_max' => 'int'], 'stream_resolve_include_path' => ['string|false', 'filename' => 'string'], 'stream_select' => ['int|false', '&rw_read_streams' => 'resource[]', '&rw_write_streams' => '?resource[]', '&rw_except_streams' => '?resource[]', 'tv_sec' => '?int', 'tv_usec=' => '?int'], 'stream_set_blocking' => ['bool', 'socket' => 'resource', 'mode' => 'bool'], 'stream_set_chunk_size' => ['int|false', 'fp' => 'resource', 'chunk_size' => 'int'], 'stream_set_read_buffer' => ['int', 'fp' => 'resource', 'buffer' => 'int'], 'stream_set_timeout' => ['bool', 'stream' => 'resource', 'seconds' => 'int', 'microseconds=' => 'int'], 'stream_set_write_buffer' => ['int', 'fp' => 'resource', 'buffer' => 'int'], 'stream_socket_accept' => ['resource|false', 'serverstream' => 'resource', 'timeout=' => 'float', '&w_peername=' => 'string'], 'stream_socket_client' => ['resource|false', 'remoteaddress' => 'string', '&w_errcode=' => 'int', '&w_errstring=' => 'string', 'timeout=' => 'float', 'flags=' => 'int', 'context=' => 'resource'], 'stream_socket_enable_crypto' => ['int', 'stream' => 'resource', 'enable' => 'bool', 'cryptokind=' => 'int', 'sessionstream=' => 'resource'], 'stream_socket_get_name' => ['string', 'stream' => 'resource', 'want_peer' => 'bool'], 'stream_socket_pair' => ['resource[]|false', 'domain' => 'int', 'type' => 'int', 'protocol' => 'int'], 'stream_socket_recvfrom' => ['string', 'stream' => 'resource', 'amount' => 'int', 'flags=' => 'int', '&w_remote_addr=' => 'string'], 'stream_socket_sendto' => ['int', 'stream' => 'resource', 'data' => 'string', 'flags=' => 'int', 'target_addr=' => 'string'], 'stream_socket_server' => ['resource|false', 'localaddress' => 'string', '&w_errcode=' => 'int', '&w_errstring=' => 'string', 'flags=' => 'int', 'context=' => 'resource'], 'stream_socket_shutdown' => ['bool', 'stream' => 'resource', 'how' => 'int'], 'stream_supports_lock' => ['bool', 'stream' => 'resource'], 'stream_wrapper_register' => ['bool', 'protocol' => 'string', 'classname' => 'string', 'flags=' => 'int'], 'stream_wrapper_restore' => ['bool', 'protocol' => 'string'], 'stream_wrapper_unregister' => ['bool', 'protocol' => 'string'], 'streamWrapper::__construct' => ['void'], 'streamWrapper::__destruct' => [''], 'streamWrapper::dir_closedir' => ['bool'], 'streamWrapper::dir_opendir' => ['bool', 'path' => 'string', 'options' => 'int'], 'streamWrapper::dir_readdir' => ['string'], 'streamWrapper::dir_rewinddir' => ['bool'], 'streamWrapper::mkdir' => ['bool', 'path' => 'string', 'mode' => 'int', 'options' => 'int'], 'streamWrapper::rename' => ['bool', 'path_from' => 'string', 'path_to' => 'string'], 'streamWrapper::rmdir' => ['bool', 'path' => 'string', 'options' => 'int'], 'streamWrapper::stream_cast' => ['resource', 'cast_as' => 'int'], 'streamWrapper::stream_close' => ['void'], 'streamWrapper::stream_eof' => ['bool'], 'streamWrapper::stream_flush' => ['bool'], 'streamWrapper::stream_lock' => ['bool', 'operation' => 'mode'], 'streamWrapper::stream_metadata' => ['bool', 'path' => 'string', 'option' => 'int', 'value' => 'mixed'], 'streamWrapper::stream_open' => ['bool', 'path' => 'string', 'mode' => 'string', 'options' => 'int', 'opened_path' => 'string'], 'streamWrapper::stream_read' => ['string', 'count' => 'int'], 'streamWrapper::stream_seek' => ['bool', 'offset' => 'int', 'whence' => 'int'], 'streamWrapper::stream_set_option' => ['bool', 'option' => 'int', 'arg1' => 'int', 'arg2' => 'int'], 'streamWrapper::stream_stat' => ['array'], 'streamWrapper::stream_tell' => ['int'], 'streamWrapper::stream_truncate' => ['bool', 'new_size' => 'int'], 'streamWrapper::stream_write' => ['int', 'data' => 'string'], 'streamWrapper::unlink' => ['bool', 'path' => 'string'], 'streamWrapper::url_stat' => ['array', 'path' => 'string', 'flags' => 'int'], 'strftime' => ['string', 'format' => 'string', 'timestamp=' => 'int'], 'strip_tags' => ['string', 'str' => 'string', 'allowable_tags=' => 'string'], 'stripcslashes' => ['string', 'str' => 'string'], 'stripos' => ['int|false', 'haystack' => 'string', 'needle' => 'string|int', 'offset=' => 'int'], 'stripslashes' => ['string', 'str' => 'string'], 'stristr' => ['string|false', 'haystack' => 'string', 'needle' => 'mixed', 'before_needle=' => 'bool'], 'strlen' => ['int', 'string' => 'string'], 'strnatcasecmp' => ['int', 's1' => 'string', 's2' => 'string'], 'strnatcmp' => ['int', 's1' => 'string', 's2' => 'string'], 'strncasecmp' => ['int', 'str1' => 'string', 'str2' => 'string', 'len' => 'int'], 'strncmp' => ['int', 'str1' => 'string', 'str2' => 'string', 'len' => 'int'], 'strpbrk' => ['string|false', 'haystack' => 'string', 'char_list' => 'string'], 'strpos' => ['int|false', 'haystack' => 'string', 'needle' => 'string|int', 'offset=' => 'int'], 'strptime' => ['array|false', 'datestr' => 'string', 'format' => 'string'], 'strrchr' => ['string|false', 'haystack' => 'string', 'needle' => 'mixed'], 'strrev' => ['string', 'str' => 'string'], 'strripos' => ['int|false', 'haystack' => 'string', 'needle' => 'string|int', 'offset=' => 'int'], 'strrpos' => ['int|false', 'haystack' => 'string', 'needle' => 'string|int', 'offset=' => 'int'], 'strspn' => ['int', 'str' => 'string', 'mask' => 'string', 'start=' => 'int', 'len=' => 'int'], 'strstr' => ['string|false', 'haystack' => 'string', 'needle' => 'mixed', 'before_needle=' => 'bool'], 'strtok' => ['string|false', 'str' => 'string', 'token' => 'string'], 'strtok\'1' => ['string|false', 'token' => 'string'], 'strtolower' => ['string', 'str' => 'string'], 'strtotime' => ['int|false', 'time' => 'string', 'now=' => 'int'], 'strtoupper' => ['string', 'str' => 'string'], 'strtr' => ['string', 'str' => 'string', 'from' => 'string', 'to' => 'string'], 'strtr\'1' => ['string', 'str' => 'string', 'replace_pairs' => 'array'], 'strval' => ['string', 'var' => 'mixed'], 'substr' => ['string', 'str' => 'string', 'start' => 'int', 'length=' => 'int'], 'substr_compare' => ['int|false', 'main_str' => 'string', 'str' => 'string', 'offset' => 'int', 'length=' => 'int', 'case_sensitivity=' => 'bool'], 'substr_count' => ['int', 'haystack' => 'string', 'needle' => 'string', 'offset=' => 'int', 'length=' => 'int'], 'substr_replace' => ['string|array', 'str' => 'string|array', 'repl' => 'mixed', 'start' => 'mixed', 'length=' => 'mixed'], 'suhosin_encrypt_cookie' => ['string', 'name' => 'string', 'value' => 'string'], 'suhosin_get_raw_cookies' => ['array'], 'SVM::__construct' => ['void'], 'svm::crossvalidate' => ['float', 'problem' => 'array', 'number_of_folds' => 'int'], 'SVM::getOptions' => ['array'], 'SVM::setOptions' => ['bool', 'params' => 'array'], 'svm::train' => ['SVMModel', 'problem' => 'array', 'weights=' => 'array'], 'SVMModel::__construct' => ['void', 'filename=' => 'string'], 'SVMModel::checkProbabilityModel' => ['bool'], 'SVMModel::getLabels' => ['array'], 'SVMModel::getNrClass' => ['int'], 'SVMModel::getSvmType' => ['int'], 'SVMModel::getSvrProbability' => ['float'], 'SVMModel::load' => ['bool', 'filename' => 'string'], 'SVMModel::predict' => ['float', 'data' => 'array'], 'SVMModel::predict_probability' => ['float', 'data' => 'array'], 'SVMModel::save' => ['bool', 'filename' => 'string'], 'svn_add' => ['bool', 'path' => 'string', 'recursive=' => 'bool', 'force=' => 'bool'], 'svn_auth_get_parameter' => ['string', 'key' => 'string'], 'svn_auth_set_parameter' => ['void', 'key' => 'string', 'value' => 'string'], 'svn_blame' => ['array', 'repository_url' => 'string', 'revision_no=' => 'int'], 'svn_cat' => ['string', 'repos_url' => 'string', 'revision_no=' => 'int'], 'svn_checkout' => ['bool', 'repos' => 'string', 'targetpath' => 'string', 'revision=' => 'int', 'flags=' => 'int'], 'svn_cleanup' => ['bool', 'workingdir' => 'string'], 'svn_client_version' => ['string'], 'svn_commit' => ['array', 'log' => 'string', 'targets' => 'array', 'dontrecurse=' => 'bool'], 'svn_delete' => ['bool', 'path' => 'string', 'force=' => 'bool'], 'svn_diff' => ['array', 'path1' => 'string', 'rev1' => 'int', 'path2' => 'string', 'rev2' => 'int'], 'svn_export' => ['bool', 'frompath' => 'string', 'topath' => 'string', 'working_copy=' => 'bool', 'revision_no=' => 'int'], 'svn_fs_abort_txn' => ['bool', 'txn' => 'resource'], 'svn_fs_apply_text' => ['resource', 'root' => 'resource', 'path' => 'string'], 'svn_fs_begin_txn2' => ['resource', 'repos' => 'resource', 'rev' => 'int'], 'svn_fs_change_node_prop' => ['bool', 'root' => 'resource', 'path' => 'string', 'name' => 'string', 'value' => 'string'], 'svn_fs_check_path' => ['int', 'fsroot' => 'resource', 'path' => 'string'], 'svn_fs_contents_changed' => ['bool', 'root1' => 'resource', 'path1' => 'string', 'root2' => 'resource', 'path2' => 'string'], 'svn_fs_copy' => ['bool', 'from_root' => 'resource', 'from_path' => 'string', 'to_root' => 'resource', 'to_path' => 'string'], 'svn_fs_delete' => ['bool', 'root' => 'resource', 'path' => 'string'], 'svn_fs_dir_entries' => ['array', 'fsroot' => 'resource', 'path' => 'string'], 'svn_fs_file_contents' => ['resource', 'fsroot' => 'resource', 'path' => 'string'], 'svn_fs_file_length' => ['int', 'fsroot' => 'resource', 'path' => 'string'], 'svn_fs_is_dir' => ['bool', 'root' => 'resource', 'path' => 'string'], 'svn_fs_is_file' => ['bool', 'root' => 'resource', 'path' => 'string'], 'svn_fs_make_dir' => ['bool', 'root' => 'resource', 'path' => 'string'], 'svn_fs_make_file' => ['bool', 'root' => 'resource', 'path' => 'string'], 'svn_fs_node_created_rev' => ['int', 'fsroot' => 'resource', 'path' => 'string'], 'svn_fs_node_prop' => ['string', 'fsroot' => 'resource', 'path' => 'string', 'propname' => 'string'], 'svn_fs_props_changed' => ['bool', 'root1' => 'resource', 'path1' => 'string', 'root2' => 'resource', 'path2' => 'string'], 'svn_fs_revision_prop' => ['string', 'fs' => 'resource', 'revnum' => 'int', 'propname' => 'string'], 'svn_fs_revision_root' => ['resource', 'fs' => 'resource', 'revnum' => 'int'], 'svn_fs_txn_root' => ['resource', 'txn' => 'resource'], 'svn_fs_youngest_rev' => ['int', 'fs' => 'resource'], 'svn_import' => ['bool', 'path' => 'string', 'url' => 'string', 'nonrecursive' => 'bool'], 'svn_log' => ['array', 'repos_url' => 'string', 'start_revision=' => 'int', 'end_revision=' => 'int', 'limit=' => 'int', 'flags=' => 'int'], 'svn_ls' => ['array', 'repos_url' => 'string', 'revision_no=' => 'int', 'recurse=' => 'bool', 'peg=' => 'bool'], 'svn_mkdir' => ['bool', 'path' => 'string', 'log_message=' => 'string'], 'svn_move' => ['mixed', 'src_path' => 'string', 'dst_path' => 'string', 'force=' => 'bool|false'], 'svn_propget' => ['mixed', 'path' => 'string', 'property_name' => 'string', 'recurse=' => 'bool|false', 'revision' => 'int'], 'svn_proplist' => ['mixed', 'path' => 'string', 'recurse=' => 'bool|false', 'revision' => 'int'], 'svn_repos_create' => ['resource', 'path' => 'string', 'config=' => 'array', 'fsconfig=' => 'array'], 'svn_repos_fs' => ['resource', 'repos' => 'resource'], 'svn_repos_fs_begin_txn_for_commit' => ['resource', 'repos' => 'resource', 'rev' => 'int', 'author' => 'string', 'log_msg' => 'string'], 'svn_repos_fs_commit_txn' => ['int', 'txn' => 'resource'], 'svn_repos_hotcopy' => ['bool', 'repospath' => 'string', 'destpath' => 'string', 'cleanlogs' => 'bool'], 'svn_repos_open' => ['resource', 'path' => 'string'], 'svn_repos_recover' => ['bool', 'path' => 'string'], 'svn_revert' => ['bool', 'path' => 'string', 'recursive=' => 'bool'], 'svn_status' => ['array', 'path' => 'string', 'flags=' => 'int'], 'svn_update' => ['int', 'path' => 'string', 'revno=' => 'int', 'recurse=' => 'bool'], 'swf_actiongeturl' => ['', 'url' => 'string', 'target' => 'string'], 'swf_actiongotoframe' => ['', 'framenumber' => 'int'], 'swf_actiongotolabel' => ['', 'label' => 'string'], 'swf_actionnextframe' => [''], 'swf_actionplay' => [''], 'swf_actionprevframe' => [''], 'swf_actionsettarget' => ['', 'target' => 'string'], 'swf_actionstop' => [''], 'swf_actiontogglequality' => [''], 'swf_actionwaitforframe' => ['', 'framenumber' => 'int', 'skipcount' => 'int'], 'swf_addbuttonrecord' => ['', 'states' => 'int', 'shapeid' => 'int', 'depth' => 'int'], 'swf_addcolor' => ['', 'r' => 'float', 'g' => 'float', 'b' => 'float', 'a' => 'float'], 'swf_closefile' => ['', 'return_file=' => 'int'], 'swf_definebitmap' => ['', 'objid' => 'int', 'image_name' => 'string'], 'swf_definefont' => ['', 'fontid' => 'int', 'fontname' => 'string'], 'swf_defineline' => ['', 'objid' => 'int', 'x1' => 'float', 'y1' => 'float', 'x2' => 'float', 'y2' => 'float', 'width' => 'float'], 'swf_definepoly' => ['', 'objid' => 'int', 'coords' => 'array', 'npoints' => 'int', 'width' => 'float'], 'swf_definerect' => ['', 'objid' => 'int', 'x1' => 'float', 'y1' => 'float', 'x2' => 'float', 'y2' => 'float', 'width' => 'float'], 'swf_definetext' => ['', 'objid' => 'int', 'str' => 'string', 'docenter' => 'int'], 'swf_endbutton' => [''], 'swf_enddoaction' => [''], 'swf_endshape' => [''], 'swf_endsymbol' => [''], 'swf_fontsize' => ['', 'size' => 'float'], 'swf_fontslant' => ['', 'slant' => 'float'], 'swf_fonttracking' => ['', 'tracking' => 'float'], 'swf_getbitmapinfo' => ['array', 'bitmapid' => 'int'], 'swf_getfontinfo' => ['array'], 'swf_getframe' => ['int'], 'swf_labelframe' => ['', 'name' => 'string'], 'swf_lookat' => ['', 'view_x' => 'float', 'view_y' => 'float', 'view_z' => 'float', 'reference_x' => 'float', 'reference_y' => 'float', 'reference_z' => 'float', 'twist' => 'float'], 'swf_modifyobject' => ['', 'depth' => 'int', 'how' => 'int'], 'swf_mulcolor' => ['', 'r' => 'float', 'g' => 'float', 'b' => 'float', 'a' => 'float'], 'swf_nextid' => ['int'], 'swf_oncondition' => ['', 'transition' => 'int'], 'swf_openfile' => ['', 'filename' => 'string', 'width' => 'float', 'height' => 'float', 'framerate' => 'float', 'r' => 'float', 'g' => 'float', 'b' => 'float'], 'swf_ortho' => ['', 'xmin' => 'float', 'xmax' => 'float', 'ymin' => 'float', 'ymax' => 'float', 'zmin' => 'float', 'zmax' => 'float'], 'swf_ortho2' => ['', 'xmin' => 'float', 'xmax' => 'float', 'ymin' => 'float', 'ymax' => 'float'], 'swf_perspective' => ['', 'fovy' => 'float', 'aspect' => 'float', 'near' => 'float', 'far' => 'float'], 'swf_placeobject' => ['', 'objid' => 'int', 'depth' => 'int'], 'swf_polarview' => ['', 'dist' => 'float', 'azimuth' => 'float', 'incidence' => 'float', 'twist' => 'float'], 'swf_popmatrix' => [''], 'swf_posround' => ['', 'round' => 'int'], 'swf_pushmatrix' => [''], 'swf_removeobject' => ['', 'depth' => 'int'], 'swf_rotate' => ['', 'angle' => 'float', 'axis' => 'string'], 'swf_scale' => ['', 'x' => 'float', 'y' => 'float', 'z' => 'float'], 'swf_setfont' => ['', 'fontid' => 'int'], 'swf_setframe' => ['', 'framenumber' => 'int'], 'swf_shapearc' => ['', 'x' => 'float', 'y' => 'float', 'r' => 'float', 'ang1' => 'float', 'ang2' => 'float'], 'swf_shapecurveto' => ['', 'x1' => 'float', 'y1' => 'float', 'x2' => 'float', 'y2' => 'float'], 'swf_shapecurveto3' => ['', 'x1' => 'float', 'y1' => 'float', 'x2' => 'float', 'y2' => 'float', 'x3' => 'float', 'y3' => 'float'], 'swf_shapefillbitmapclip' => ['', 'bitmapid' => 'int'], 'swf_shapefillbitmaptile' => ['', 'bitmapid' => 'int'], 'swf_shapefilloff' => [''], 'swf_shapefillsolid' => ['', 'r' => 'float', 'g' => 'float', 'b' => 'float', 'a' => 'float'], 'swf_shapelinesolid' => ['', 'r' => 'float', 'g' => 'float', 'b' => 'float', 'a' => 'float', 'width' => 'float'], 'swf_shapelineto' => ['', 'x' => 'float', 'y' => 'float'], 'swf_shapemoveto' => ['', 'x' => 'float', 'y' => 'float'], 'swf_showframe' => [''], 'swf_startbutton' => ['', 'objid' => 'int', 'type' => 'int'], 'swf_startdoaction' => [''], 'swf_startshape' => ['', 'objid' => 'int'], 'swf_startsymbol' => ['', 'objid' => 'int'], 'swf_textwidth' => ['float', 'str' => 'string'], 'swf_translate' => ['', 'x' => 'float', 'y' => 'float', 'z' => 'float'], 'swf_viewport' => ['', 'xmin' => 'float', 'xmax' => 'float', 'ymin' => 'float', 'ymax' => 'float'], 'SWFAction::__construct' => ['void', 'script' => 'string'], 'SWFBitmap::__construct' => ['void', 'file' => '', 'alphafile=' => ''], 'SWFBitmap::getHeight' => ['float'], 'SWFBitmap::getWidth' => ['float'], 'SWFButton::__construct' => ['void'], 'SWFButton::addAction' => ['void', 'action' => 'swfaction', 'flags' => 'int'], 'SWFButton::addASound' => ['SWFSoundInstance', 'sound' => 'swfsound', 'flags' => 'int'], 'SWFButton::addShape' => ['void', 'shape' => 'swfshape', 'flags' => 'int'], 'SWFButton::setAction' => ['void', 'action' => 'swfaction'], 'SWFButton::setDown' => ['void', 'shape' => 'swfshape'], 'SWFButton::setHit' => ['void', 'shape' => 'swfshape'], 'SWFButton::setMenu' => ['void', 'flag' => 'int'], 'SWFButton::setOver' => ['void', 'shape' => 'swfshape'], 'SWFButton::setUp' => ['void', 'shape' => 'swfshape'], 'SWFDisplayItem::addAction' => ['void', 'action' => 'swfaction', 'flags' => 'int'], 'SWFDisplayItem::addColor' => ['void', 'red' => 'int', 'green' => 'int', 'blue' => 'int', 'a=' => 'int'], 'SWFDisplayItem::endMask' => ['void'], 'SWFDisplayItem::getRot' => ['float'], 'SWFDisplayItem::getX' => ['float'], 'SWFDisplayItem::getXScale' => ['float'], 'SWFDisplayItem::getXSkew' => ['float'], 'SWFDisplayItem::getY' => ['float'], 'SWFDisplayItem::getYScale' => ['float'], 'SWFDisplayItem::getYSkew' => ['float'], 'SWFDisplayItem::move' => ['void', 'dx' => 'float', 'dy' => 'float'], 'SWFDisplayItem::moveTo' => ['void', 'x' => 'float', 'y' => 'float'], 'SWFDisplayItem::multColor' => ['void', 'red' => 'float', 'green' => 'float', 'blue' => 'float', 'a=' => 'float'], 'SWFDisplayItem::remove' => ['void'], 'SWFDisplayItem::rotate' => ['void', 'angle' => 'float'], 'SWFDisplayItem::rotateTo' => ['void', 'angle' => 'float'], 'SWFDisplayItem::scale' => ['void', 'dx' => 'float', 'dy' => 'float'], 'SWFDisplayItem::scaleTo' => ['void', 'x' => 'float', 'y=' => 'float'], 'SWFDisplayItem::setDepth' => ['void', 'depth' => 'int'], 'SWFDisplayItem::setMaskLevel' => ['void', 'level' => 'int'], 'SWFDisplayItem::setMatrix' => ['void', 'a' => 'float', 'b' => 'float', 'c' => 'float', 'd' => 'float', 'x' => 'float', 'y' => 'float'], 'SWFDisplayItem::setName' => ['void', 'name' => 'string'], 'SWFDisplayItem::setRatio' => ['void', 'ratio' => 'float'], 'SWFDisplayItem::skewX' => ['void', 'ddegrees' => 'float'], 'SWFDisplayItem::skewXTo' => ['void', 'degrees' => 'float'], 'SWFDisplayItem::skewY' => ['void', 'ddegrees' => 'float'], 'SWFDisplayItem::skewYTo' => ['void', 'degrees' => 'float'], 'SWFFill::moveTo' => ['void', 'x' => 'float', 'y' => 'float'], 'SWFFill::rotateTo' => ['void', 'angle' => 'float'], 'SWFFill::scaleTo' => ['void', 'x' => 'float', 'y=' => 'float'], 'SWFFill::skewXTo' => ['void', 'x' => 'float'], 'SWFFill::skewYTo' => ['void', 'y' => 'float'], 'SWFFont::__construct' => ['void', 'filename' => 'string'], 'SWFFont::getAscent' => ['float'], 'SWFFont::getDescent' => ['float'], 'SWFFont::getLeading' => ['float'], 'SWFFont::getShape' => ['string', 'code' => 'int'], 'SWFFont::getUTF8Width' => ['float', 'string' => 'string'], 'SWFFont::getWidth' => ['float', 'string' => 'string'], 'SWFFontChar::addChars' => ['void', 'char' => 'string'], 'SWFFontChar::addUTF8Chars' => ['void', 'char' => 'string'], 'SWFGradient::__construct' => ['void'], 'SWFGradient::addEntry' => ['void', 'ratio' => 'float', 'red' => 'int', 'green' => 'int', 'blue' => 'int', 'alpha=' => 'int'], 'SWFMorph::__construct' => ['void'], 'SWFMorph::getShape1' => ['SWFShape'], 'SWFMorph::getShape2' => ['SWFShape'], 'SWFMovie::__construct' => ['void', 'version=' => 'int'], 'SWFMovie::add' => ['mixed', 'instance' => 'object'], 'SWFMovie::addExport' => ['void', 'char' => 'swfcharacter', 'name' => 'string'], 'SWFMovie::addFont' => ['mixed', 'font' => 'swffont'], 'SWFMovie::importChar' => ['SWFSprite', 'libswf' => 'string', 'name' => 'string'], 'SWFMovie::importFont' => ['SWFFontChar', 'libswf' => 'string', 'name' => 'string'], 'SWFMovie::labelFrame' => ['void', 'label' => 'string'], 'SWFMovie::nextFrame' => ['void'], 'SWFMovie::output' => ['int', 'compression=' => 'int'], 'SWFMovie::remove' => ['void', 'instance' => 'object'], 'SWFMovie::save' => ['int', 'filename' => 'string', 'compression=' => 'int'], 'SWFMovie::saveToFile' => ['int', 'x' => 'resource', 'compression=' => 'int'], 'SWFMovie::setbackground' => ['void', 'red' => 'int', 'green' => 'int', 'blue' => 'int'], 'SWFMovie::setDimension' => ['void', 'width' => 'float', 'height' => 'float'], 'SWFMovie::setFrames' => ['void', 'number' => 'int'], 'SWFMovie::setRate' => ['void', 'rate' => 'float'], 'SWFMovie::startSound' => ['SWFSoundInstance', 'sound' => 'swfsound'], 'SWFMovie::stopSound' => ['void', 'sound' => 'swfsound'], 'SWFMovie::streamMP3' => ['int', 'mp3file' => 'mixed', 'skip=' => 'float'], 'SWFMovie::writeExports' => ['void'], 'SWFPrebuiltClip::__construct' => ['void', 'file' => ''], 'SWFShape::__construct' => ['void'], 'SWFShape::addFill' => ['SWFFill', 'red' => 'int', 'green' => 'int', 'blue' => 'int', 'alpha=' => 'int', 'bitmap=' => 'swfbitmap', 'flags=' => 'int', 'gradient=' => 'swfgradient'], 'SWFShape::addFill\'1' => ['SWFFill', 'bitmap' => 'SWFBitmap', 'flags=' => 'int'], 'SWFShape::addFill\'2' => ['SWFFill', 'gradient' => 'SWFGradient', 'flags=' => 'int'], 'SWFShape::drawArc' => ['void', 'r' => 'float', 'startangle' => 'float', 'endangle' => 'float'], 'SWFShape::drawCircle' => ['void', 'r' => 'float'], 'SWFShape::drawCubic' => ['int', 'bx' => 'float', 'by' => 'float', 'cx' => 'float', 'cy' => 'float', 'dx' => 'float', 'dy' => 'float'], 'SWFShape::drawCubicTo' => ['int', 'bx' => 'float', 'by' => 'float', 'cx' => 'float', 'cy' => 'float', 'dx' => 'float', 'dy' => 'float'], 'SWFShape::drawCurve' => ['int', 'controldx' => 'float', 'controldy' => 'float', 'anchordx' => 'float', 'anchordy' => 'float', 'targetdx=' => 'float', 'targetdy=' => 'float'], 'SWFShape::drawCurveTo' => ['int', 'controlx' => 'float', 'controly' => 'float', 'anchorx' => 'float', 'anchory' => 'float', 'targetx=' => 'float', 'targety=' => 'float'], 'SWFShape::drawGlyph' => ['void', 'font' => 'swffont', 'character' => 'string', 'size=' => 'int'], 'SWFShape::drawLine' => ['void', 'dx' => 'float', 'dy' => 'float'], 'SWFShape::drawLineTo' => ['void', 'x' => 'float', 'y' => 'float'], 'SWFShape::movePen' => ['void', 'dx' => 'float', 'dy' => 'float'], 'SWFShape::movePenTo' => ['void', 'x' => 'float', 'y' => 'float'], 'SWFShape::setLeftFill' => ['', 'fill' => 'swfgradient', 'red' => 'int', 'green' => 'int', 'blue' => 'int', 'a=' => 'int'], 'SWFShape::setLine' => ['', 'shape' => 'swfshape', 'width' => 'int', 'red' => 'int', 'green' => 'int', 'blue' => 'int', 'a=' => 'int'], 'SWFShape::setRightFill' => ['', 'fill' => 'swfgradient', 'red' => 'int', 'green' => 'int', 'blue' => 'int', 'a=' => 'int'], 'SWFSound' => ['SWFSound', 'filename' => 'string', 'flags=' => 'int'], 'SWFSound::__construct' => ['void', 'filename' => 'string', 'flags=' => 'int'], 'SWFSoundInstance::loopCount' => ['void', 'point' => 'int'], 'SWFSoundInstance::loopInPoint' => ['void', 'point' => 'int'], 'SWFSoundInstance::loopOutPoint' => ['void', 'point' => 'int'], 'SWFSoundInstance::noMultiple' => ['void'], 'SWFSprite::__construct' => ['void'], 'SWFSprite::add' => ['void', 'object' => 'object'], 'SWFSprite::labelFrame' => ['void', 'label' => 'string'], 'SWFSprite::nextFrame' => ['void'], 'SWFSprite::remove' => ['void', 'object' => 'object'], 'SWFSprite::setFrames' => ['void', 'number' => 'int'], 'SWFSprite::startSound' => ['SWFSoundInstance', 'sount' => 'swfsound'], 'SWFSprite::stopSound' => ['void', 'sount' => 'swfsound'], 'SWFText::__construct' => ['void'], 'SWFText::addString' => ['void', 'string' => 'string'], 'SWFText::addUTF8String' => ['void', 'text' => 'string'], 'SWFText::getAscent' => ['float'], 'SWFText::getDescent' => ['float'], 'SWFText::getLeading' => ['float'], 'SWFText::getUTF8Width' => ['float', 'string' => 'string'], 'SWFText::getWidth' => ['float', 'string' => 'string'], 'SWFText::moveTo' => ['void', 'x' => 'float', 'y' => 'float'], 'SWFText::setColor' => ['void', 'red' => 'int', 'green' => 'int', 'blue' => 'int', 'a=' => 'int'], 'SWFText::setFont' => ['void', 'font' => 'swffont'], 'SWFText::setHeight' => ['void', 'height' => 'float'], 'SWFText::setSpacing' => ['void', 'spacing' => 'float'], 'SWFTextField::__construct' => ['void', 'flags=' => 'int'], 'SWFTextField::addChars' => ['void', 'chars' => 'string'], 'SWFTextField::addString' => ['void', 'string' => 'string'], 'SWFTextField::align' => ['void', 'alignement' => 'int'], 'SWFTextField::setBounds' => ['void', 'width' => 'float', 'height' => 'float'], 'SWFTextField::setColor' => ['void', 'red' => 'int', 'green' => 'int', 'blue' => 'int', 'a=' => 'int'], 'SWFTextField::setFont' => ['void', 'font' => 'swffont'], 'SWFTextField::setHeight' => ['void', 'height' => 'float'], 'SWFTextField::setIndentation' => ['void', 'width' => 'float'], 'SWFTextField::setLeftMargin' => ['void', 'width' => 'float'], 'SWFTextField::setLineSpacing' => ['void', 'height' => 'float'], 'SWFTextField::setMargins' => ['void', 'left' => 'float', 'right' => 'float'], 'SWFTextField::setName' => ['void', 'name' => 'string'], 'SWFTextField::setPadding' => ['void', 'padding' => 'float'], 'SWFTextField::setRightMargin' => ['void', 'width' => 'float'], 'SWFVideoStream::__construct' => ['void', 'file=' => 'string'], 'SWFVideoStream::getNumFrames' => ['int'], 'SWFVideoStream::setDimension' => ['void', 'x' => 'int', 'y' => 'int'], 'Swish::__construct' => ['void', 'index_names' => 'string'], 'Swish::getMetaList' => ['array', 'index_name' => 'string'], 'Swish::getPropertyList' => ['array', 'index_name' => 'string'], 'Swish::prepare' => ['object', 'query=' => 'string'], 'Swish::query' => ['object', 'query' => 'string'], 'SwishResult::getMetaList' => ['array'], 'SwishResult::stem' => ['array', 'word' => 'string'], 'SwishResults::getParsedWords' => ['array', 'index_name' => 'string'], 'SwishResults::getRemovedStopwords' => ['array', 'index_name' => 'string'], 'SwishResults::nextResult' => ['object'], 'SwishResults::seekResult' => ['int', 'position' => 'int'], 'SwishSearch::execute' => ['object', 'query=' => 'string'], 'SwishSearch::resetLimit' => [''], 'SwishSearch::setLimit' => ['', 'property' => 'string', 'low' => 'string', 'high' => 'string'], 'SwishSearch::setPhraseDelimiter' => ['', 'delimiter' => 'string'], 'SwishSearch::setSort' => ['', 'sort' => 'string'], 'SwishSearch::setStructure' => ['', 'structure' => 'int'], 'swoole_async_dns_lookup' => ['bool', 'hostname' => 'string', 'callback' => 'callable'], 'swoole_async_read' => ['bool', 'filename' => 'string', 'callback' => 'callable', 'chunk_size=' => 'int', 'offset=' => 'int'], 'swoole_async_readfile' => ['bool', 'filename' => 'string', 'callback' => 'string'], 'swoole_async_set' => ['void', 'settings' => 'array'], 'swoole_async_write' => ['bool', 'filename' => 'string', 'content' => 'string', 'offset=' => 'int', 'callback=' => 'callable'], 'swoole_async_writefile' => ['bool', 'filename' => 'string', 'content' => 'string', 'callback=' => 'string', 'flags=' => 'int'], 'swoole_client_select' => ['int', 'read_array' => 'array', 'write_array' => 'array', 'error_array' => 'array', 'timeout=' => 'float'], 'swoole_cpu_num' => ['int'], 'swoole_errno' => ['int'], 'swoole_event_add' => ['int', 'fd' => 'int', 'read_callback=' => 'callable', 'write_callback=' => 'callable', 'events=' => 'int'], 'swoole_event_defer' => ['bool', 'callback' => 'callable'], 'swoole_event_del' => ['bool', 'fd' => 'int'], 'swoole_event_exit' => ['void'], 'swoole_event_set' => ['bool', 'fd' => 'int', 'read_callback=' => 'callable', 'write_callback=' => 'callable', 'events=' => 'int'], 'swoole_event_wait' => ['void'], 'swoole_event_write' => ['bool', 'fd' => 'int', 'data' => 'string'], 'swoole_get_local_ip' => ['array'], 'swoole_last_error' => ['int'], 'swoole_load_module' => ['mixed', 'filename' => 'string'], 'swoole_select' => ['int', 'read_array' => 'array', 'write_array' => 'array', 'error_array' => 'array', 'timeout=' => 'float'], 'swoole_set_process_name' => ['void', 'process_name' => 'string', 'size=' => 'int'], 'swoole_strerror' => ['string', 'errno' => 'int', 'error_type=' => 'int'], 'swoole_timer_after' => ['int', 'ms' => 'int', 'callback' => 'callable', 'param=' => 'mixed'], 'swoole_timer_exists' => ['bool', 'timer_id' => 'int'], 'swoole_timer_tick' => ['int', 'ms' => 'int', 'callback' => 'callable', 'param=' => 'mixed'], 'swoole_version' => ['string'], 'sybase_affected_rows' => ['int', 'link_identifier=' => 'resource'], 'sybase_close' => ['bool', 'link_identifier=' => 'resource'], 'sybase_connect' => ['resource', 'servername=' => 'string', 'username=' => 'string', 'password=' => 'string', 'charset=' => 'string', 'appname=' => 'string', 'new=' => 'bool'], 'sybase_data_seek' => ['bool', 'result_identifier' => 'resource', 'row_number' => 'int'], 'sybase_deadlock_retry_count' => ['void', 'retry_count' => 'int'], 'sybase_fetch_array' => ['array', 'result' => 'resource'], 'sybase_fetch_assoc' => ['array', 'result' => 'resource'], 'sybase_fetch_field' => ['object', 'result' => 'resource', 'field_offset=' => 'int'], 'sybase_fetch_object' => ['object', 'result' => 'resource', 'object=' => 'mixed'], 'sybase_fetch_row' => ['array', 'result' => 'resource'], 'sybase_field_seek' => ['bool', 'result' => 'resource', 'field_offset' => 'int'], 'sybase_free_result' => ['bool', 'result' => 'resource'], 'sybase_get_last_message' => ['string'], 'sybase_min_client_severity' => ['void', 'severity' => 'int'], 'sybase_min_error_severity' => ['void', 'severity' => 'int'], 'sybase_min_message_severity' => ['void', 'severity' => 'int'], 'sybase_min_server_severity' => ['void', 'severity' => 'int'], 'sybase_num_fields' => ['int', 'result' => 'resource'], 'sybase_num_rows' => ['int', 'result' => 'resource'], 'sybase_pconnect' => ['resource', 'servername=' => 'string', 'username=' => 'string', 'password=' => 'string', 'charset=' => 'string', 'appname=' => 'string'], 'sybase_query' => ['mixed', 'query' => 'string', 'link_identifier=' => 'resource'], 'sybase_result' => ['string', 'result' => 'resource', 'row' => 'int', 'field' => 'mixed'], 'sybase_select_db' => ['bool', 'database_name' => 'string', 'link_identifier=' => 'resource'], 'sybase_set_message_handler' => ['bool', 'handler' => 'callable', 'connection=' => 'resource'], 'sybase_unbuffered_query' => ['resource', 'query' => 'string', 'link_identifier' => 'resource', 'store_result=' => 'bool'], 'symbolObj::__construct' => ['void', 'map' => 'MapObj', 'symbolname' => 'string'], 'symbolObj::free' => ['void'], 'symbolObj::getPatternArray' => ['array'], 'symbolObj::getPointsArray' => ['array'], 'symbolObj::ms_newSymbolObj' => ['int', 'map' => 'MapObj', 'symbolname' => 'string'], 'symbolObj::set' => ['int', 'property_name' => 'string', 'new_value' => ''], 'symbolObj::setImagePath' => ['int', 'filename' => 'string'], 'symbolObj::setPattern' => ['int', 'int' => 'array'], 'symbolObj::setPoints' => ['int', 'double' => 'array'], 'symlink' => ['bool', 'target' => 'string', 'link' => 'string'], 'SyncEvent::__construct' => ['void', 'name=' => 'string', 'manual=' => 'bool'], 'SyncEvent::fire' => ['bool'], 'SyncEvent::reset' => ['bool'], 'SyncEvent::wait' => ['bool', 'wait=' => 'int'], 'SyncMutex::__construct' => ['void', 'name=' => 'string'], 'SyncMutex::lock' => ['bool', 'wait=' => 'int'], 'SyncMutex::unlock' => ['bool', 'all=' => 'bool'], 'SyncReaderWriter::__construct' => ['void', 'name=' => 'string', 'autounlock=' => 'bool'], 'SyncReaderWriter::readlock' => ['bool', 'wait=' => 'int'], 'SyncReaderWriter::readunlock' => ['bool'], 'SyncReaderWriter::writelock' => ['bool', 'wait=' => 'int'], 'SyncReaderWriter::writeunlock' => ['bool'], 'SyncSemaphore::__construct' => ['void', 'name=' => 'string', 'initialval=' => 'int', 'autounlock=' => 'bool'], 'SyncSemaphore::lock' => ['bool', 'wait=' => 'int'], 'SyncSemaphore::unlock' => ['bool', '&w_prevcount=' => 'int'], 'SyncSharedMemory::__construct' => ['void', 'name' => 'string', 'size' => 'int'], 'SyncSharedMemory::first' => ['bool'], 'SyncSharedMemory::read' => ['', 'start=' => 'int', 'length=' => 'int'], 'SyncSharedMemory::size' => ['bool'], 'SyncSharedMemory::write' => ['', 'string=' => 'string', 'start=' => 'int'], 'sys_get_temp_dir' => ['string'], 'sys_getloadavg' => ['array'], 'syslog' => ['bool', 'priority' => 'int', 'message' => 'string'], 'system' => ['string', 'command' => 'string', '&w_return_value=' => 'int'], 'taint' => ['bool', '&rw_string' => 'string', '&...w_other_strings=' => 'string'], 'tan' => ['float', 'number' => 'float'], 'tanh' => ['float', 'number' => 'float'], 'tcpwrap_check' => ['bool', 'daemon' => 'string', 'address' => 'string', 'user=' => 'string', 'nodns=' => 'bool'], 'tempnam' => ['string|false', 'dir' => 'string', 'prefix' => 'string'], 'textdomain' => ['string', 'domain' => 'string'], 'Thread::__construct' => ['void'], 'Thread::chunk' => ['array', 'size' => 'int', 'preserve' => 'bool'], 'Thread::count' => ['int'], 'Thread::detach' => ['void'], 'Thread::getCreatorId' => ['int'], 'Thread::getCurrentThread' => ['Thread'], 'Thread::getCurrentThreadId' => ['int'], 'Thread::getTerminationInfo' => ['array'], 'Thread::getThreadId' => ['int'], 'Thread::globally' => ['mixed'], 'Thread::isJoined' => ['bool'], 'Thread::isRunning' => ['bool'], 'Thread::isStarted' => ['bool'], 'Thread::isTerminated' => ['bool'], 'Thread::isWaiting' => ['bool'], 'Thread::join' => ['bool'], 'Thread::kill' => ['void'], 'Thread::lock' => ['bool'], 'Thread::merge' => ['bool', 'from' => '', 'overwrite=' => 'mixed'], 'Thread::notify' => ['bool'], 'Thread::offsetExists' => ['bool', 'offset' => 'mixed'], 'Thread::offsetGet' => ['mixed', 'offset' => 'mixed'], 'Thread::offsetSet' => ['void', 'offset' => 'mixed', 'value' => 'mixed'], 'Thread::offsetUnset' => ['void', 'offset' => 'mixed'], 'Thread::pop' => ['bool'], 'Thread::run' => ['void'], 'Thread::shift' => ['bool'], 'Thread::start' => ['bool', 'options=' => 'int'], 'Thread::synchronized' => ['mixed', 'block' => 'Closure', '_=' => 'mixed'], 'Thread::unlock' => ['bool'], 'Thread::wait' => ['bool', 'timeout=' => 'int'], 'Threaded::__construct' => ['void'], 'Threaded::chunk' => ['array', 'size' => 'int', 'preserve' => 'bool'], 'Threaded::count' => ['int'], 'Threaded::extend' => ['bool', 'class' => 'string'], 'Threaded::from' => ['Threaded', 'run' => 'Closure', 'construct=' => 'Closure', 'args=' => 'array'], 'Threaded::getTerminationInfo' => ['array'], 'Threaded::isRunning' => ['bool'], 'Threaded::isTerminated' => ['bool'], 'Threaded::isWaiting' => ['bool'], 'Threaded::lock' => ['bool'], 'Threaded::merge' => ['bool', 'from' => 'mixed', 'overwrite=' => 'bool'], 'Threaded::notify' => ['bool'], 'Threaded::notifyOne' => ['bool'], 'Threaded::offsetExists' => ['bool', 'offset' => 'mixed'], 'Threaded::offsetGet' => ['mixed', 'offset' => 'mixed'], 'Threaded::offsetSet' => ['void', 'offset' => 'mixed', 'value' => 'mixed'], 'Threaded::offsetUnset' => ['void', 'offset' => 'mixed'], 'Threaded::pop' => ['bool'], 'Threaded::run' => ['void'], 'Threaded::shift' => ['mixed'], 'Threaded::synchronized' => ['mixed', 'block' => 'Closure', '...args=' => 'mixed'], 'Threaded::unlock' => ['bool'], 'Threaded::wait' => ['bool', 'timeout=' => 'int'], 'Throwable::__toString' => ['string'], 'Throwable::getCode' => ['mixed'], 'Throwable::getFile' => ['string'], 'Throwable::getLine' => ['int'], 'Throwable::getMessage' => ['string'], 'Throwable::getPrevious' => ['Throwable|null'], 'Throwable::getTrace' => ['array'], 'Throwable::getTraceAsString' => ['string'], 'tidy::__construct' => ['void', 'filename=' => 'string', 'config=' => '', 'encoding=' => 'string', 'use_include_path=' => 'bool'], 'tidy::body' => ['tidyNode'], 'tidy::cleanRepair' => ['bool'], 'tidy::diagnose' => ['bool'], 'tidy::getConfig' => ['array'], 'tidy::getHtmlVer' => ['int'], 'tidy::getOpt' => ['', 'option' => 'string'], 'tidy::getOptDoc' => ['string', 'optname' => 'string'], 'tidy::getRelease' => ['string'], 'tidy::getStatus' => ['int'], 'tidy::head' => ['tidyNode'], 'tidy::html' => ['tidyNode'], 'tidy::htmlver' => ['int'], 'tidy::isXhtml' => ['bool'], 'tidy::isXml' => ['bool'], 'tidy::parseFile' => ['bool', 'filename' => 'string', 'config=' => '', 'encoding=' => 'string', 'use_include_path=' => 'bool'], 'tidy::parseString' => ['bool', 'input' => 'string', 'config=' => '', 'encoding=' => 'string'], 'tidy::repairFile' => ['string', 'filename' => 'string', 'config=' => '', 'encoding=' => 'string', 'use_include_path=' => 'bool'], 'tidy::repairString' => ['string', 'data' => 'string', 'config=' => '', 'encoding=' => 'string'], 'tidy::root' => ['tidyNode'], 'tidy_access_count' => ['int', 'obj' => 'tidy'], 'tidy_clean_repair' => ['bool', 'obj' => 'tidy'], 'tidy_config_count' => ['int', 'obj' => 'tidy'], 'tidy_diagnose' => ['bool', 'obj' => 'tidy'], 'tidy_error_count' => ['int', 'obj' => 'tidy'], 'tidy_get_body' => ['tidyNode', 'obj' => 'tidy'], 'tidy_get_config' => ['array', 'obj' => 'tidy'], 'tidy_get_error_buffer' => ['string', 'obj' => 'tidy'], 'tidy_get_head' => ['tidyNode', 'obj' => 'tidy'], 'tidy_get_html' => ['tidyNode', 'obj' => 'tidy'], 'tidy_get_html_ver' => ['int', 'obj' => 'tidy'], 'tidy_get_opt_doc' => ['string', 'obj' => 'tidy', 'optname' => 'string'], 'tidy_get_output' => ['string', 'obj' => 'tidy'], 'tidy_get_release' => ['string'], 'tidy_get_root' => ['tidyNode', 'obj' => 'tidy'], 'tidy_get_status' => ['int', 'obj' => 'tidy'], 'tidy_getopt' => ['', 'option' => 'string', 'obj' => 'tidy'], 'tidy_is_xhtml' => ['bool', 'obj' => 'tidy'], 'tidy_is_xml' => ['bool', 'obj' => 'tidy'], 'tidy_load_config' => ['void', 'filename' => 'string', 'encoding' => 'string'], 'tidy_parse_file' => ['tidy', 'file' => 'string', 'config_options=' => '', 'encoding=' => 'string', 'use_include_path=' => 'bool'], 'tidy_parse_string' => ['tidy', 'input' => 'string', 'config_options=' => '', 'encoding=' => 'string'], 'tidy_repair_file' => ['string', 'filename' => 'string', 'config_file=' => '', 'encoding=' => 'string', 'use_include_path=' => 'bool'], 'tidy_repair_string' => ['string', 'data' => 'string', 'config_file=' => '', 'encoding=' => 'string'], 'tidy_reset_config' => ['bool'], 'tidy_save_config' => ['bool', 'filename' => 'string'], 'tidy_set_encoding' => ['bool', 'encoding' => 'string'], 'tidy_setopt' => ['bool', 'option' => 'string', 'value' => 'mixed'], 'tidy_warning_count' => ['int', 'obj' => 'tidy'], 'tidyNode::__construct' => ['void'], 'tidyNode::getParent' => ['tidyNode'], 'tidyNode::hasChildren' => ['bool'], 'tidyNode::hasSiblings' => ['bool'], 'tidyNode::isAsp' => ['bool'], 'tidyNode::isComment' => ['bool'], 'tidyNode::isHtml' => ['bool'], 'tidyNode::isJste' => ['bool'], 'tidyNode::isPhp' => ['bool'], 'tidyNode::isText' => ['bool'], 'time' => ['int'], 'time_nanosleep' => ['array|bool', 'seconds' => 'int', 'nanoseconds' => 'int'], 'time_sleep_until' => ['bool', 'timestamp' => 'float'], 'timezone_abbreviations_list' => ['array'], 'timezone_identifiers_list' => ['array', 'what=' => 'int', 'country=' => '?string'], 'timezone_location_get' => ['array|false', 'object' => 'DateTimeZone'], 'timezone_name_from_abbr' => ['string|false', 'abbr' => 'string', 'gmtoffset=' => 'int', 'isdst=' => 'int'], 'timezone_name_get' => ['string', 'object' => 'DateTimeZone'], 'timezone_offset_get' => ['int', 'object' => 'DateTimeZone', 'datetime' => 'DateTime'], 'timezone_open' => ['DateTimeZone', 'timezone' => 'string'], 'timezone_transitions_get' => ['array|false', 'object' => 'DateTimeZone', 'timestamp_begin=' => 'int', 'timestamp_end=' => 'int'], 'timezone_version_get' => ['string'], 'tmpfile' => ['resource|false'], 'token_get_all' => ['array<int,mixed>', 'source' => 'string', 'flags=' => 'int'], 'token_name' => ['string', 'type' => 'int'], 'TokyoTyrant::__construct' => ['void', 'host=' => 'string', 'port=' => 'int', 'options=' => 'array'], 'TokyoTyrant::add' => ['int|float', 'key' => 'string', 'increment' => 'float', 'type=' => 'int'], 'TokyoTyrant::connect' => ['TokyoTyrant', 'host' => 'string', 'port=' => 'int', 'options=' => 'array'], 'TokyoTyrant::connectUri' => ['TokyoTyrant', 'uri' => 'string'], 'TokyoTyrant::copy' => ['TokyoTyrant', 'path' => 'string'], 'TokyoTyrant::ext' => ['string', 'name' => 'string', 'options' => 'int', 'key' => 'string', 'value' => 'string'], 'TokyoTyrant::fwmKeys' => ['array', 'prefix' => 'string', 'max_recs' => 'int'], 'TokyoTyrant::get' => ['array', 'keys' => 'mixed'], 'TokyoTyrant::getIterator' => ['TokyoTyrantIterator'], 'TokyoTyrant::num' => ['int'], 'TokyoTyrant::out' => ['string', 'keys' => 'mixed'], 'TokyoTyrant::put' => ['TokyoTyrant', 'keys' => 'mixed', 'value=' => 'string'], 'TokyoTyrant::putCat' => ['TokyoTyrant', 'keys' => 'mixed', 'value=' => 'string'], 'TokyoTyrant::putKeep' => ['TokyoTyrant', 'keys' => 'mixed', 'value=' => 'string'], 'TokyoTyrant::putNr' => ['TokyoTyrant', 'keys' => 'mixed', 'value=' => 'string'], 'TokyoTyrant::putShl' => ['mixed', 'key' => 'string', 'value' => 'string', 'width' => 'int'], 'TokyoTyrant::restore' => ['mixed', 'log_dir' => 'string', 'timestamp' => 'int', 'check_consistency=' => 'bool'], 'TokyoTyrant::setMaster' => ['mixed', 'host' => 'string', 'port' => 'int', 'timestamp' => 'int', 'check_consistency=' => 'bool'], 'TokyoTyrant::size' => ['int', 'key' => 'string'], 'TokyoTyrant::stat' => ['array'], 'TokyoTyrant::sync' => ['mixed'], 'TokyoTyrant::tune' => ['TokyoTyrant', 'timeout' => 'float', 'options=' => 'int'], 'TokyoTyrant::vanish' => ['mixed'], 'TokyoTyrantIterator::__construct' => ['void', 'object' => 'mixed'], 'TokyoTyrantIterator::current' => ['mixed'], 'TokyoTyrantIterator::key' => ['mixed'], 'TokyoTyrantIterator::next' => ['mixed'], 'TokyoTyrantIterator::rewind' => ['void'], 'TokyoTyrantIterator::valid' => ['bool'], 'TokyoTyrantQuery::__construct' => ['void', 'table' => 'TokyoTyrantTable'], 'TokyoTyrantQuery::addCond' => ['mixed', 'name' => 'string', 'op' => 'int', 'expr' => 'string'], 'TokyoTyrantQuery::count' => ['int'], 'TokyoTyrantQuery::current' => ['array'], 'TokyoTyrantQuery::hint' => ['string'], 'TokyoTyrantQuery::key' => ['string'], 'TokyoTyrantQuery::metaSearch' => ['array', 'queries' => 'array', 'type' => 'int'], 'TokyoTyrantQuery::next' => ['array'], 'TokyoTyrantQuery::out' => ['TokyoTyrantQuery'], 'TokyoTyrantQuery::rewind' => ['bool'], 'TokyoTyrantQuery::search' => ['array'], 'TokyoTyrantQuery::setLimit' => ['mixed', 'max=' => 'int', 'skip=' => 'int'], 'TokyoTyrantQuery::setOrder' => ['mixed', 'name' => 'string', 'type' => 'int'], 'TokyoTyrantQuery::valid' => ['bool'], 'TokyoTyrantTable::add' => ['void', 'key' => 'string', 'increment' => 'mixed', 'type=' => 'string'], 'TokyoTyrantTable::genUid' => ['int'], 'TokyoTyrantTable::get' => ['array', 'keys' => 'mixed'], 'TokyoTyrantTable::getIterator' => ['TokyoTyrantIterator'], 'TokyoTyrantTable::getQuery' => ['TokyoTyrantQuery'], 'TokyoTyrantTable::out' => ['void', 'keys' => 'mixed'], 'TokyoTyrantTable::put' => ['int', 'key' => 'string', 'columns' => 'array'], 'TokyoTyrantTable::putCat' => ['void', 'key' => 'string', 'columns' => 'array'], 'TokyoTyrantTable::putKeep' => ['void', 'key' => 'string', 'columns' => 'array'], 'TokyoTyrantTable::putNr' => ['void', 'keys' => 'mixed', 'value=' => 'string'], 'TokyoTyrantTable::putShl' => ['void', 'key' => 'string', 'value' => 'string', 'width' => 'int'], 'TokyoTyrantTable::setIndex' => ['mixed', 'column' => 'string', 'type' => 'int'], 'touch' => ['bool', 'filename' => 'string', 'time=' => 'int', 'atime=' => 'int'], 'trader_acos' => ['array', 'real' => 'array'], 'trader_ad' => ['array', 'high' => 'array', 'low' => 'array', 'close' => 'array', 'volume' => 'array'], 'trader_add' => ['array', 'real0' => 'array', 'real1' => 'array'], 'trader_adosc' => ['array', 'high' => 'array', 'low' => 'array', 'close' => 'array', 'volume' => 'array', 'fastPeriod=' => 'int', 'slowPeriod=' => 'int'], 'trader_adx' => ['array', 'high' => 'array', 'low' => 'array', 'close' => 'array', 'timePeriod=' => 'int'], 'trader_adxr' => ['array', 'high' => 'array', 'low' => 'array', 'close' => 'array', 'timePeriod=' => 'int'], 'trader_apo' => ['array', 'real' => 'array', 'fastPeriod=' => 'int', 'slowPeriod=' => 'int', 'mAType=' => 'int'], 'trader_aroon' => ['array', 'high' => 'array', 'low' => 'array', 'timePeriod=' => 'int'], 'trader_aroonosc' => ['array', 'high' => 'array', 'low' => 'array', 'timePeriod=' => 'int'], 'trader_asin' => ['array', 'real' => 'array'], 'trader_atan' => ['array', 'real' => 'array'], 'trader_atr' => ['array', 'high' => 'array', 'low' => 'array', 'close' => 'array', 'timePeriod=' => 'int'], 'trader_avgprice' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_bbands' => ['array', 'real' => 'array', 'timePeriod=' => 'int', 'nbDevUp=' => 'float', 'nbDevDn=' => 'float', 'mAType=' => 'int'], 'trader_beta' => ['array', 'real0' => 'array', 'real1' => 'array', 'timePeriod=' => 'int'], 'trader_bop' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cci' => ['array', 'high' => 'array', 'low' => 'array', 'close' => 'array', 'timePeriod=' => 'int'], 'trader_cdl2crows' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdl3blackcrows' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdl3inside' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdl3linestrike' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdl3outside' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdl3starsinsouth' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdl3whitesoldiers' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlabandonedbaby' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array', 'penetration=' => 'float'], 'trader_cdladvanceblock' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlbelthold' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlbreakaway' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlclosingmarubozu' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlconcealbabyswall' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlcounterattack' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdldarkcloudcover' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array', 'penetration=' => 'float'], 'trader_cdldoji' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdldojistar' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdldragonflydoji' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlengulfing' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdleveningdojistar' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array', 'penetration=' => 'float'], 'trader_cdleveningstar' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array', 'penetration=' => 'float'], 'trader_cdlgapsidesidewhite' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlgravestonedoji' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlhammer' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlhangingman' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlharami' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlharamicross' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlhighwave' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlhikkake' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlhikkakemod' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlhomingpigeon' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlidentical3crows' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlinneck' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlinvertedhammer' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlkicking' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlkickingbylength' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlladderbottom' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdllongleggeddoji' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdllongline' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlmarubozu' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlmatchinglow' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlmathold' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array', 'penetration=' => 'float'], 'trader_cdlmorningdojistar' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array', 'penetration=' => 'float'], 'trader_cdlmorningstar' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array', 'penetration=' => 'float'], 'trader_cdlonneck' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlpiercing' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlrickshawman' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlrisefall3methods' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlseparatinglines' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlshootingstar' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlshortline' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlspinningtop' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlstalledpattern' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlsticksandwich' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdltakuri' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdltasukigap' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlthrusting' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdltristar' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlunique3river' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlupsidegap2crows' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_cdlxsidegap3methods' => ['array', 'open' => 'array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_ceil' => ['array', 'real' => 'array'], 'trader_cmo' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_correl' => ['array', 'real0' => 'array', 'real1' => 'array', 'timePeriod=' => 'int'], 'trader_cos' => ['array', 'real' => 'array'], 'trader_cosh' => ['array', 'real' => 'array'], 'trader_dema' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_div' => ['array', 'real0' => 'array', 'real1' => 'array'], 'trader_dx' => ['array', 'high' => 'array', 'low' => 'array', 'close' => 'array', 'timePeriod=' => 'int'], 'trader_ema' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_errno' => ['int'], 'trader_exp' => ['array', 'real' => 'array'], 'trader_floor' => ['array', 'real' => 'array'], 'trader_get_compat' => ['int'], 'trader_get_unstable_period' => ['int', 'functionId' => 'int'], 'trader_ht_dcperiod' => ['array', 'real' => 'array'], 'trader_ht_dcphase' => ['array', 'real' => 'array'], 'trader_ht_phasor' => ['array', 'real' => 'array'], 'trader_ht_sine' => ['array', 'real' => 'array'], 'trader_ht_trendline' => ['array', 'real' => 'array'], 'trader_ht_trendmode' => ['array', 'real' => 'array'], 'trader_kama' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_linearreg' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_linearreg_angle' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_linearreg_intercept' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_linearreg_slope' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_ln' => ['array', 'real' => 'array'], 'trader_log10' => ['array', 'real' => 'array'], 'trader_ma' => ['array', 'real' => 'array', 'timePeriod=' => 'int', 'mAType=' => 'int'], 'trader_macd' => ['array', 'real' => 'array', 'fastPeriod=' => 'int', 'slowPeriod=' => 'int', 'signalPeriod=' => 'int'], 'trader_macdext' => ['array', 'real' => 'array', 'fastPeriod=' => 'int', 'fastMAType=' => 'int', 'slowPeriod=' => 'int', 'slowMAType=' => 'int', 'signalPeriod=' => 'int', 'signalMAType=' => 'int'], 'trader_macdfix' => ['array', 'real' => 'array', 'signalPeriod=' => 'int'], 'trader_mama' => ['array', 'real' => 'array', 'fastLimit=' => 'float', 'slowLimit=' => 'float'], 'trader_mavp' => ['array', 'real' => 'array', 'periods' => 'array', 'minPeriod=' => 'int', 'maxPeriod=' => 'int', 'mAType=' => 'int'], 'trader_max' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_maxindex' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_medprice' => ['array', 'high' => 'array', 'low' => 'array'], 'trader_mfi' => ['array', 'high' => 'array', 'low' => 'array', 'close' => 'array', 'volume' => 'array', 'timePeriod=' => 'int'], 'trader_midpoint' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_midprice' => ['array', 'high' => 'array', 'low' => 'array', 'timePeriod=' => 'int'], 'trader_min' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_minindex' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_minmax' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_minmaxindex' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_minus_di' => ['array', 'high' => 'array', 'low' => 'array', 'close' => 'array', 'timePeriod=' => 'int'], 'trader_minus_dm' => ['array', 'high' => 'array', 'low' => 'array', 'timePeriod=' => 'int'], 'trader_mom' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_mult' => ['array', 'real0' => 'array', 'real1' => 'array'], 'trader_natr' => ['array', 'high' => 'array', 'low' => 'array', 'close' => 'array', 'timePeriod=' => 'int'], 'trader_obv' => ['array', 'real' => 'array', 'volume' => 'array'], 'trader_plus_di' => ['array', 'high' => 'array', 'low' => 'array', 'close' => 'array', 'timePeriod=' => 'int'], 'trader_plus_dm' => ['array', 'high' => 'array', 'low' => 'array', 'timePeriod=' => 'int'], 'trader_ppo' => ['array', 'real' => 'array', 'fastPeriod=' => 'int', 'slowPeriod=' => 'int', 'mAType=' => 'int'], 'trader_roc' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_rocp' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_rocr' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_rocr100' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_rsi' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_sar' => ['array', 'high' => 'array', 'low' => 'array', 'acceleration=' => 'float', 'maximum=' => 'float'], 'trader_sarext' => ['array', 'high' => 'array', 'low' => 'array', 'startValue=' => 'float', 'offsetOnReverse=' => 'float', 'accelerationInitLong=' => 'float', 'accelerationLong=' => 'float', 'accelerationMaxLong=' => 'float', 'accelerationInitShort=' => 'float', 'accelerationShort=' => 'float', 'accelerationMaxShort=' => 'float'], 'trader_set_compat' => ['void', 'compatId' => 'int'], 'trader_set_unstable_period' => ['void', 'functionId' => 'int', 'timePeriod' => 'int'], 'trader_sin' => ['array', 'real' => 'array'], 'trader_sinh' => ['array', 'real' => 'array'], 'trader_sma' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_sqrt' => ['array', 'real' => 'array'], 'trader_stddev' => ['array', 'real' => 'array', 'timePeriod=' => 'int', 'nbDev=' => 'float'], 'trader_stoch' => ['array', 'high' => 'array', 'low' => 'array', 'close' => 'array', 'fastK_Period=' => 'int', 'slowK_Period=' => 'int', 'slowK_MAType=' => 'int', 'slowD_Period=' => 'int', 'slowD_MAType=' => 'int'], 'trader_stochf' => ['array', 'high' => 'array', 'low' => 'array', 'close' => 'array', 'fastK_Period=' => 'int', 'fastD_Period=' => 'int', 'fastD_MAType=' => 'int'], 'trader_stochrsi' => ['array', 'real' => 'array', 'timePeriod=' => 'int', 'fastK_Period=' => 'int', 'fastD_Period=' => 'int', 'fastD_MAType=' => 'int'], 'trader_sub' => ['array', 'real0' => 'array', 'real1' => 'array'], 'trader_sum' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_t3' => ['array', 'real' => 'array', 'timePeriod=' => 'int', 'vFactor=' => 'float'], 'trader_tan' => ['array', 'real' => 'array'], 'trader_tanh' => ['array', 'real' => 'array'], 'trader_tema' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_trange' => ['array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_trima' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_trix' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_tsf' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trader_typprice' => ['array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_ultosc' => ['array', 'high' => 'array', 'low' => 'array', 'close' => 'array', 'timePeriod1=' => 'int', 'timePeriod2=' => 'int', 'timePeriod3=' => 'int'], 'trader_var' => ['array', 'real' => 'array', 'timePeriod=' => 'int', 'nbDev=' => 'float'], 'trader_wclprice' => ['array', 'high' => 'array', 'low' => 'array', 'close' => 'array'], 'trader_willr' => ['array', 'high' => 'array', 'low' => 'array', 'close' => 'array', 'timePeriod=' => 'int'], 'trader_wma' => ['array', 'real' => 'array', 'timePeriod=' => 'int'], 'trait_exists' => ['bool', 'traitname' => 'string', 'autoload=' => 'bool'], 'Transliterator::create' => ['?Transliterator', 'id' => 'string', 'direction=' => 'int'], 'Transliterator::createFromRules' => ['?Transliterator', 'rules' => 'string', 'direction=' => 'int'], 'Transliterator::createInverse' => ['Transliterator'], 'Transliterator::getErrorCode' => ['int'], 'Transliterator::getErrorMessage' => ['string'], 'Transliterator::listIDs' => ['array'], 'Transliterator::transliterate' => ['string|false', 'subject' => 'string', 'start=' => 'int', 'end=' => 'int'], 'transliterator_create' => ['?Transliterator', 'id' => 'string', 'direction=' => 'int'], 'transliterator_create_from_rules' => ['?Transliterator', 'rules' => 'string', 'direction=' => 'int'], 'transliterator_create_inverse' => ['Transliterator', 'obj' => 'Transliterator'], 'transliterator_get_error_code' => ['int', 'obj' => 'Transliterator'], 'transliterator_get_error_message' => ['string', 'obj' => 'Transliterator'], 'transliterator_list_ids' => ['array'], 'transliterator_transliterate' => ['string|false', 'obj' => 'Transliterator|string', 'subject' => 'string', 'start=' => 'int', 'end=' => 'int'], 'trigger_error' => ['bool', 'message' => 'string', 'error_type=' => 'int'], 'trim' => ['string', 'str' => 'string', 'character_mask=' => 'string'], 'TypeError::__clone' => ['void'], 'TypeError::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?Throwable|?TypeError'], 'TypeError::__toString' => ['string'], 'TypeError::getCode' => ['int'], 'TypeError::getFile' => ['string'], 'TypeError::getLine' => ['int'], 'TypeError::getMessage' => ['string'], 'TypeError::getPrevious' => ['Throwable|TypeError|null'], 'TypeError::getTrace' => ['array'], 'TypeError::getTraceAsString' => ['string'], 'uasort' => ['bool', '&rw_array_arg' => 'array', 'cmp_function' => 'callable'], 'ucfirst' => ['string', 'str' => 'string'], 'UConverter::__construct' => ['void', 'destination_encoding' => 'string', 'source_encoding=' => 'string'], 'UConverter::convert' => ['string', 'str' => 'string', 'reverse=' => 'bool'], 'UConverter::fromUCallback' => ['mixed', 'reason' => 'int', 'source' => 'string', 'codePoint' => 'string', '&w_error' => 'int'], 'UConverter::getAliases' => ['array', 'name=' => 'string'], 'UConverter::getAvailable' => ['array'], 'UConverter::getDestinationEncoding' => ['string'], 'UConverter::getDestinationType' => ['int'], 'UConverter::getErrorCode' => ['int'], 'UConverter::getErrorMessage' => ['string'], 'UConverter::getSourceEncoding' => ['string'], 'UConverter::getSourceType' => ['int'], 'UConverter::getStandards' => ['array'], 'UConverter::getSubstChars' => ['string'], 'UConverter::reasonText' => ['string', 'reason=' => 'int'], 'UConverter::setDestinationEncoding' => ['bool', 'encoding' => 'string'], 'UConverter::setSourceEncoding' => ['bool', 'encoding' => 'string'], 'UConverter::setSubstChars' => ['bool', 'chars' => 'string'], 'UConverter::toUCallback' => ['mixed', 'reason' => 'int', 'source' => 'string', 'codeUnits' => 'string', '&w_error' => 'int'], 'UConverter::transcode' => ['string', 'str' => 'string', 'toEncoding' => 'string', 'fromEncoding' => 'string', 'options=' => 'array'], 'ucwords' => ['string', 'str' => 'string', 'delims=' => 'string'], 'udm_add_search_limit' => ['bool', 'agent' => 'resource', 'var' => 'int', 'val' => 'string'], 'udm_alloc_agent' => ['resource', 'dbaddr' => 'string', 'dbmode=' => 'string'], 'udm_alloc_agent_array' => ['resource', 'databases' => 'array'], 'udm_api_version' => ['int'], 'udm_cat_list' => ['array', 'agent' => 'resource', 'category' => 'string'], 'udm_cat_path' => ['array', 'agent' => 'resource', 'category' => 'string'], 'udm_check_charset' => ['bool', 'agent' => 'resource', 'charset' => 'string'], 'udm_check_stored' => ['int', 'agent' => '', 'link' => 'int', 'doc_id' => 'string'], 'udm_clear_search_limits' => ['bool', 'agent' => 'resource'], 'udm_close_stored' => ['int', 'agent' => '', 'link' => 'int'], 'udm_crc32' => ['int', 'agent' => 'resource', 'str' => 'string'], 'udm_errno' => ['int', 'agent' => 'resource'], 'udm_error' => ['string', 'agent' => 'resource'], 'udm_find' => ['resource', 'agent' => 'resource', 'query' => 'string'], 'udm_free_agent' => ['int', 'agent' => 'resource'], 'udm_free_ispell_data' => ['bool', 'agent' => 'int'], 'udm_free_res' => ['bool', 'res' => 'resource'], 'udm_get_doc_count' => ['int', 'agent' => 'resource'], 'udm_get_res_field' => ['string', 'res' => 'resource', 'row' => 'int', 'field' => 'int'], 'udm_get_res_param' => ['string', 'res' => 'resource', 'param' => 'int'], 'udm_hash32' => ['int', 'agent' => 'resource', 'str' => 'string'], 'udm_load_ispell_data' => ['bool', 'agent' => 'resource', 'var' => 'int', 'val1' => 'string', 'val2' => 'string', 'flag' => 'int'], 'udm_open_stored' => ['int', 'agent' => '', 'storedaddr' => 'string'], 'udm_set_agent_param' => ['bool', 'agent' => 'resource', 'var' => 'int', 'val' => 'string'], '_HumbugBoxb94336daae36\\ui\\draw\\text\\font\\fontfamilies' => ['array'], '_HumbugBoxb94336daae36\\ui\\quit' => ['void'], '_HumbugBoxb94336daae36\\ui\\run' => ['void', 'flags=' => 'int'], 'uksort' => ['bool', '&rw_array_arg' => 'array', 'cmp_function' => 'callable'], 'umask' => ['int', 'mask=' => 'int'], 'UnderflowException::__clone' => ['void'], 'UnderflowException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?Throwable|?UnderflowException'], 'UnderflowException::__toString' => ['string'], 'UnderflowException::getCode' => ['int'], 'UnderflowException::getFile' => ['string'], 'UnderflowException::getLine' => ['int'], 'UnderflowException::getMessage' => ['string'], 'UnderflowException::getPrevious' => ['Throwable|UnderflowException|null'], 'UnderflowException::getTrace' => ['array'], 'UnderflowException::getTraceAsString' => ['string'], 'UnexpectedValueException::__clone' => ['void'], 'UnexpectedValueException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?Throwable|?UnexpectedValueException'], 'UnexpectedValueException::__toString' => ['string'], 'UnexpectedValueException::getCode' => ['int'], 'UnexpectedValueException::getFile' => ['string'], 'UnexpectedValueException::getLine' => ['int'], 'UnexpectedValueException::getMessage' => ['string'], 'UnexpectedValueException::getPrevious' => ['Throwable|UnexpectedValueException|null'], 'UnexpectedValueException::getTrace' => ['array'], 'UnexpectedValueException::getTraceAsString' => ['string'], 'uniqid' => ['string', 'prefix=' => 'string', 'more_entropy=' => 'bool'], 'unixtojd' => ['int', 'timestamp=' => 'int'], 'unlink' => ['bool', 'filename' => 'string', 'context=' => 'resource'], 'unpack' => ['array', 'format' => 'string', 'data' => 'string', 'offset=' => 'int'], 'unregister_tick_function' => ['void', 'function_name' => 'string'], 'unserialize' => ['mixed', 'variable_representation' => 'string', 'allowed_classes=' => 'array'], 'unset' => ['void', 'var=' => 'mixed', '...args=' => 'mixed'], 'untaint' => ['bool', '&rw_string' => 'string', '&...rw_strings=' => 'string'], 'uopz_allow_exit' => ['void', 'allow' => 'bool'], 'uopz_backup' => ['void', 'class' => 'string', 'function' => 'string'], 'uopz_backup\'1' => ['void', 'function' => 'string'], 'uopz_compose' => ['void', 'name' => 'string', 'classes' => 'array', 'methods=' => 'array', 'properties=' => 'array', 'flags=' => 'int'], 'uopz_copy' => ['Closure', 'class' => 'string', 'function' => 'string'], 'uopz_copy\'1' => ['Closure', 'function' => 'string'], 'uopz_delete' => ['void', 'class' => 'string', 'function' => 'string'], 'uopz_delete\'1' => ['void', 'function' => 'string'], 'uopz_extend' => ['void', 'class' => 'string', 'parent' => 'string'], 'uopz_flags' => ['int', 'class' => 'string', 'function' => 'string', 'flags' => 'int'], 'uopz_flags\'1' => ['int', 'function' => 'string', 'flags' => 'int'], 'uopz_function' => ['void', 'class' => 'string', 'function' => 'string', 'handler' => 'Closure', 'modifiers=' => 'int'], 'uopz_function\'1' => ['void', 'function' => 'string', 'handler' => 'Closure', 'modifiers=' => 'int'], 'uopz_get_exit_status' => ['mixed'], 'uopz_get_mock' => ['mixed', 'class' => 'string'], 'uopz_get_return' => ['mixed', 'class=' => 'string', 'function' => 'string'], 'uopz_implement' => ['void', 'class' => 'string', 'interface' => 'string'], 'uopz_overload' => ['void', 'opcode' => 'int', 'callable' => 'Callable'], 'uopz_redefine' => ['void', 'class' => 'string', 'constant' => 'string', 'value' => 'mixed'], 'uopz_redefine\'1' => ['void', 'constant' => 'string', 'value' => 'mixed'], 'uopz_rename' => ['void', 'class' => 'string', 'function' => 'string', 'rename' => 'string'], 'uopz_rename\'1' => ['void', 'function' => 'string', 'rename' => 'string'], 'uopz_restore' => ['void', 'class' => 'string', 'function' => 'string'], 'uopz_restore\'1' => ['void', 'function' => 'string'], 'uopz_set_mock' => ['void', 'class' => 'string', 'mock' => 'object|string'], 'uopz_set_return' => ['bool', 'class=' => 'string', 'function' => 'string', 'value' => 'mixed', 'execute=' => 'bool'], 'uopz_set_return\'1' => ['bool', 'function' => 'string', 'value' => 'mixed', 'execute=' => 'bool'], 'uopz_undefine' => ['void', 'class' => 'string', 'constant' => 'string'], 'uopz_undefine\'1' => ['void', 'constant' => 'string'], 'uopz_unset_mock' => ['void', 'class' => 'string'], 'uopz_unset_return' => ['bool', 'class=' => 'string', 'function' => 'string'], 'uopz_unset_return\'1' => ['bool', 'function' => 'string'], 'urldecode' => ['string', 'str' => 'string'], 'urlencode' => ['string', 'str' => 'string'], 'use_soap_error_handler' => ['bool', 'handler=' => 'bool'], 'usleep' => ['void', 'micro_seconds' => 'int'], 'usort' => ['bool', '&rw_array_arg' => 'array', 'cmp_function' => 'callable'], 'utf8_decode' => ['string', 'data' => 'string'], 'utf8_encode' => ['string', 'data' => 'string'], 'V8Js::__construct' => ['void', 'object_name=' => 'string', 'variables=' => 'array', 'extensions=' => 'array', 'report_uncaught_exceptions=' => 'bool', 'snapshot_blob=' => 'string'], 'V8Js::clearPendingException' => [''], 'V8Js::compileString' => ['resource', 'script' => '', 'identifier=' => 'string'], 'V8Js::createSnapshot' => ['false|string', 'embed_source' => 'string'], 'V8Js::executeScript' => ['', 'script' => 'resource', 'flags=' => 'int', 'time_limit=' => 'int', 'memory_limit=' => 'int'], 'V8Js::executeString' => ['mixed', 'script' => 'string', 'identifier=' => 'string', 'flags=' => 'int'], 'V8Js::getExtensions' => ['array'], 'V8Js::getPendingException' => ['V8JsException'], 'V8Js::registerExtension' => ['bool', 'extension_name' => 'string', 'script' => 'string', 'dependencies=' => 'array', 'auto_enable=' => 'bool'], 'V8Js::setAverageObjectSize' => ['', 'average_object_size' => 'int'], 'V8Js::setMemoryLimit' => ['', 'limit' => 'int'], 'V8Js::setModuleLoader' => ['', 'loader' => 'callable'], 'V8Js::setModuleNormaliser' => ['', 'normaliser' => 'callable'], 'V8Js::setTimeLimit' => ['', 'limit' => 'int'], 'V8JsException::getJsFileName' => ['string'], 'V8JsException::getJsLineNumber' => ['int'], 'V8JsException::getJsSourceLine' => ['int'], 'V8JsException::getJsTrace' => ['string'], 'V8JsScriptException::__clone' => ['void'], 'V8JsScriptException::__construct' => ['void', 'message=' => 'string', 'code=' => 'int', 'previous=' => '?\\Exception|?\\Throwable'], 'V8JsScriptException::__toString' => ['string'], 'V8JsScriptException::__wakeup' => ['void'], 'V8JsScriptException::getCode' => ['int'], 'V8JsScriptException::getFile' => ['string'], 'V8JsScriptException::getJsEndColumn' => ['int'], 'V8JsScriptException::getJsFileName' => ['string'], 'V8JsScriptException::getJsLineNumber' => ['int'], 'V8JsScriptException::getJsSourceLine' => ['string'], 'V8JsScriptException::getJsStartColumn' => ['int'], 'V8JsScriptException::getJsTrace' => ['string'], 'V8JsScriptException::getLine' => ['int'], 'V8JsScriptException::getMessage' => ['string'], 'V8JsScriptException::getPrevious' => ['Exception|Throwable'], 'V8JsScriptException::getTrace' => ['array'], 'V8JsScriptException::getTraceAsString' => ['string'], 'var_dump' => ['void', 'var' => 'mixed', '...args=' => 'mixed'], 'var_export' => ['string|null', 'var' => 'mixed', 'return=' => 'bool'], 'VARIANT::__construct' => ['void', 'value=' => 'mixed', 'type=' => 'int', 'codepage=' => 'int'], 'variant_abs' => ['mixed', 'left' => 'mixed'], 'variant_add' => ['mixed', 'left' => 'mixed', 'right' => 'mixed'], 'variant_and' => ['mixed', 'left' => 'mixed', 'right' => 'mixed'], 'variant_cast' => ['object', 'variant' => 'object', 'type' => 'int'], 'variant_cat' => ['mixed', 'left' => 'mixed', 'right' => 'mixed'], 'variant_cmp' => ['int', 'left' => 'mixed', 'right' => 'mixed', 'lcid=' => 'int', 'flags=' => 'int'], 'variant_date_from_timestamp' => ['object', 'timestamp' => 'int'], 'variant_date_to_timestamp' => ['int', 'variant' => 'object'], 'variant_div' => ['mixed', 'left' => 'mixed', 'right' => 'mixed'], 'variant_eqv' => ['mixed', 'left' => 'mixed', 'right' => 'mixed'], 'variant_fix' => ['mixed', 'left' => 'mixed'], 'variant_get_type' => ['int', 'variant' => 'object'], 'variant_idiv' => ['mixed', 'left' => 'mixed', 'right' => 'mixed'], 'variant_imp' => ['mixed', 'left' => 'mixed', 'right' => 'mixed'], 'variant_int' => ['mixed', 'left' => 'mixed'], 'variant_mod' => ['mixed', 'left' => 'mixed', 'right' => 'mixed'], 'variant_mul' => ['mixed', 'left' => 'mixed', 'right' => 'mixed'], 'variant_neg' => ['mixed', 'left' => 'mixed'], 'variant_not' => ['mixed', 'left' => 'mixed'], 'variant_or' => ['mixed', 'left' => 'mixed', 'right' => 'mixed'], 'variant_pow' => ['mixed', 'left' => 'mixed', 'right' => 'mixed'], 'variant_round' => ['mixed', 'left' => 'mixed', 'decimals' => 'int'], 'variant_set' => ['void', 'variant' => 'object', 'value' => 'mixed'], 'variant_set_type' => ['void', 'variant' => 'object', 'type' => 'int'], 'variant_sub' => ['mixed', 'left' => 'mixed', 'right' => 'mixed'], 'variant_xor' => ['mixed', 'left' => 'mixed', 'right' => 'mixed'], 'VarnishAdmin::__construct' => ['void', 'args=' => 'array'], 'VarnishAdmin::auth' => ['bool'], 'VarnishAdmin::ban' => ['int', 'vcl_regex' => 'string'], 'VarnishAdmin::banUrl' => ['int', 'vcl_regex' => 'string'], 'VarnishAdmin::clearPanic' => ['int'], 'VarnishAdmin::connect' => ['bool'], 'VarnishAdmin::disconnect' => ['bool'], 'VarnishAdmin::getPanic' => ['string'], 'VarnishAdmin::getParams' => ['array'], 'VarnishAdmin::isRunning' => ['bool'], 'VarnishAdmin::setCompat' => ['void', 'compat' => 'int'], 'VarnishAdmin::setHost' => ['void', 'host' => 'string'], 'VarnishAdmin::setIdent' => ['void', 'ident' => 'string'], 'VarnishAdmin::setParam' => ['int', 'name' => 'string', 'value' => 'string|int'], 'VarnishAdmin::setPort' => ['void', 'port' => 'int'], 'VarnishAdmin::setSecret' => ['void', 'secret' => 'string'], 'VarnishAdmin::setTimeout' => ['void', 'timeout' => 'int'], 'VarnishAdmin::start' => ['int'], 'VarnishAdmin::stop' => ['int'], 'VarnishLog::__construct' => ['void', 'args=' => 'array'], 'VarnishLog::getLine' => ['array'], 'VarnishLog::getTagName' => ['string', 'index' => 'int'], 'VarnishStat::__construct' => ['void', 'args=' => 'array'], 'VarnishStat::getSnapshot' => ['array'], 'version_compare' => ['int', 'version1' => 'string', 'version2' => 'string'], 'version_compare\'1' => ['bool', 'version1' => 'string', 'version2' => 'string', 'operator' => 'string'], 'vfprintf' => ['int', 'stream' => 'resource', 'format' => 'string', 'args' => 'array'], 'virtual' => ['bool', 'uri' => 'string'], 'vpopmail_add_alias_domain' => ['bool', 'domain' => 'string', 'aliasdomain' => 'string'], 'vpopmail_add_alias_domain_ex' => ['bool', 'olddomain' => 'string', 'newdomain' => 'string'], 'vpopmail_add_domain' => ['bool', 'domain' => 'string', 'dir' => 'string', 'uid' => 'int', 'gid' => 'int'], 'vpopmail_add_domain_ex' => ['bool', 'domain' => 'string', 'passwd' => 'string', 'quota=' => 'string', 'bounce=' => 'string', 'apop=' => 'bool'], 'vpopmail_add_user' => ['bool', 'user' => 'string', 'domain' => 'string', 'password' => 'string', 'gecos=' => 'string', 'apop=' => 'bool'], 'vpopmail_alias_add' => ['bool', 'user' => 'string', 'domain' => 'string', 'alias' => 'string'], 'vpopmail_alias_del' => ['bool', 'user' => 'string', 'domain' => 'string'], 'vpopmail_alias_del_domain' => ['bool', 'domain' => 'string'], 'vpopmail_alias_get' => ['array', 'alias' => 'string', 'domain' => 'string'], 'vpopmail_alias_get_all' => ['array', 'domain' => 'string'], 'vpopmail_auth_user' => ['bool', 'user' => 'string', 'domain' => 'string', 'password' => 'string', 'apop=' => 'string'], 'vpopmail_del_domain' => ['bool', 'domain' => 'string'], 'vpopmail_del_domain_ex' => ['bool', 'domain' => 'string'], 'vpopmail_del_user' => ['bool', 'user' => 'string', 'domain' => 'string'], 'vpopmail_error' => ['string'], 'vpopmail_passwd' => ['bool', 'user' => 'string', 'domain' => 'string', 'password' => 'string', 'apop=' => 'bool'], 'vpopmail_set_user_quota' => ['bool', 'user' => 'string', 'domain' => 'string', 'quota' => 'string'], 'vprintf' => ['int', 'format' => 'string', 'args' => 'array'], 'vsprintf' => ['string', 'format' => 'string', 'args' => 'array'], 'w32api_deftype' => ['bool', 'typename' => 'string', 'member1_type' => 'string', 'member1_name' => 'string', '...args=' => 'string'], 'w32api_init_dtype' => ['resource', 'typename' => 'string', 'value' => '', '...args=' => ''], 'w32api_invoke_function' => ['', 'funcname' => 'string', 'argument' => '', '...args=' => ''], 'w32api_register_function' => ['bool', 'library' => 'string', 'function_name' => 'string', 'return_type' => 'string'], 'w32api_set_call_method' => ['', 'method' => 'int'], 'wddx_add_vars' => ['bool', 'packet_id' => 'resource', 'var_names' => 'mixed', '...vars=' => 'mixed'], 'wddx_deserialize' => ['mixed', 'packet' => 'string'], 'wddx_packet_end' => ['string', 'packet_id' => 'resource'], 'wddx_packet_start' => ['resource', 'comment=' => 'string'], 'wddx_serialize_value' => ['string', 'var' => 'mixed', 'comment=' => 'string'], 'wddx_serialize_vars' => ['string', 'var_name' => 'mixed', '...vars=' => 'mixed'], 'WeakMap::__construct' => ['void'], 'WeakMap::count' => ['int'], 'WeakMap::current' => ['mixed'], 'WeakMap::key' => ['object'], 'WeakMap::next' => ['void'], 'WeakMap::offsetExists' => ['bool', 'object' => 'object'], 'WeakMap::offsetGet' => ['mixed', 'object' => 'object'], 'WeakMap::offsetSet' => ['void', 'object' => 'object', 'value' => 'mixed'], 'WeakMap::offsetUnset' => ['void', 'object' => 'object'], 'WeakMap::rewind' => ['void'], 'WeakMap::valid' => ['bool'], 'Weakref::acquire' => ['bool'], 'Weakref::get' => ['object'], 'Weakref::release' => ['bool'], 'Weakref::valid' => ['bool'], 'webObj::convertToString' => ['string'], 'webObj::free' => ['void'], 'webObj::set' => ['int', 'property_name' => 'string', 'new_value' => ''], 'webObj::updateFromString' => ['int', 'snippet' => 'string'], 'win32_continue_service' => ['int', 'servicename' => 'string', 'machine=' => 'string'], 'win32_create_service' => ['mixed', 'details' => 'array', 'machine=' => 'string'], 'win32_delete_service' => ['mixed', 'servicename' => 'string', 'machine=' => 'string'], 'win32_get_last_control_message' => ['int'], 'win32_pause_service' => ['int', 'servicename' => 'string', 'machine=' => 'string'], 'win32_ps_list_procs' => ['array'], 'win32_ps_stat_mem' => ['array'], 'win32_ps_stat_proc' => ['array', 'pid=' => 'int'], 'win32_query_service_status' => ['mixed', 'servicename' => 'string', 'machine=' => 'string'], 'win32_set_service_status' => ['bool', 'status' => 'int', 'checkpoint=' => 'int'], 'win32_start_service' => ['int', 'servicename' => 'string', 'machine=' => 'string'], 'win32_start_service_ctrl_dispatcher' => ['mixed', 'name' => 'string'], 'win32_stop_service' => ['int', 'servicename' => 'string', 'machine=' => 'string'], 'wincache_fcache_fileinfo' => ['array', 'summaryonly=' => 'bool'], 'wincache_fcache_meminfo' => ['array'], 'wincache_lock' => ['bool', 'key' => 'string', 'isglobal=' => 'bool'], 'wincache_ocache_fileinfo' => ['array', 'summaryonly=' => 'bool'], 'wincache_ocache_meminfo' => ['array'], 'wincache_refresh_if_changed' => ['bool', 'files=' => 'array'], 'wincache_rplist_fileinfo' => ['array', 'summaryonly=' => 'bool'], 'wincache_rplist_meminfo' => ['array'], 'wincache_scache_info' => ['array', 'summaryonly=' => 'bool'], 'wincache_scache_meminfo' => ['array'], 'wincache_ucache_add' => ['bool', 'key' => 'string', 'value' => '', 'ttl=' => 'int'], 'wincache_ucache_add\'1' => ['bool', 'values' => 'array', 'unused=' => '', 'ttl=' => 'int'], 'wincache_ucache_cas' => ['bool', 'key' => 'string', 'old_value' => 'int', 'new_value' => 'int'], 'wincache_ucache_clear' => ['bool'], 'wincache_ucache_dec' => ['mixed', 'key' => 'string', 'dec_by=' => 'int', 'success=' => 'bool'], 'wincache_ucache_delete' => ['bool', 'key' => 'mixed'], 'wincache_ucache_exists' => ['bool', 'key' => 'string'], 'wincache_ucache_get' => ['mixed', 'key' => 'mixed', '&w_success=' => 'bool'], 'wincache_ucache_inc' => ['mixed', 'key' => 'string', 'inc_by=' => 'int', 'success=' => 'bool'], 'wincache_ucache_info' => ['array', 'summaryonly=' => 'bool', 'key=' => 'string'], 'wincache_ucache_meminfo' => ['array'], 'wincache_ucache_set' => ['bool', 'key' => '', 'value' => '', 'ttl=' => 'int'], 'wincache_ucache_set\'1' => ['bool', 'values' => 'array', 'unused=' => '', 'ttl=' => 'int'], 'wincache_unlock' => ['bool', 'key' => 'string'], 'wordwrap' => ['string', 'str' => 'string', 'width=' => 'int', 'break=' => 'string', 'cut=' => 'bool'], 'Worker::__construct' => ['void'], 'Worker::chunk' => ['array', 'size' => 'int', 'preserve' => 'bool'], 'Worker::collect' => ['int', 'collector=' => 'Callable'], 'Worker::count' => ['int'], 'Worker::detach' => ['void'], 'Worker::getCreatorId' => ['int'], 'Worker::getCurrentThread' => ['Thread'], 'Worker::getCurrentThreadId' => ['int'], 'Worker::getStacked' => ['int'], 'Worker::getTerminationInfo' => ['array'], 'Worker::getThreadId' => ['int'], 'Worker::globally' => ['mixed'], 'Worker::isJoined' => ['bool'], 'Worker::isRunning' => ['bool'], 'Worker::isShutdown' => ['bool'], 'Worker::isStarted' => ['bool'], 'Worker::isTerminated' => ['bool'], 'Worker::isWaiting' => ['bool'], 'Worker::isWorking' => ['bool'], 'Worker::join' => ['bool'], 'Worker::kill' => ['bool'], 'Worker::lock' => ['bool'], 'Worker::merge' => ['bool', 'from' => '', 'overwrite=' => 'mixed'], 'Worker::notify' => ['bool'], 'Worker::offsetExists' => ['bool', 'offset' => 'mixed'], 'Worker::offsetGet' => ['mixed', 'offset' => 'mixed'], 'Worker::offsetSet' => ['void', 'offset' => 'mixed', 'value' => 'mixed'], 'Worker::offsetUnset' => ['void', 'offset' => 'mixed'], 'Worker::pop' => ['bool'], 'Worker::run' => ['void'], 'Worker::shift' => ['bool'], 'Worker::shutdown' => ['bool'], 'Worker::stack' => ['int', '&rw_work' => 'Threaded'], 'Worker::start' => ['bool', 'options=' => 'int'], 'Worker::synchronized' => ['mixed', 'block' => 'Closure', '_=' => 'mixed'], 'Worker::unlock' => ['bool'], 'Worker::unstack' => ['int', '&rw_work=' => 'Threaded'], 'Worker::wait' => ['bool', 'timeout=' => 'int'], 'xattr_get' => ['string', 'filename' => 'string', 'name' => 'string', 'flags=' => 'int'], 'xattr_list' => ['array', 'filename' => 'string', 'flags=' => 'int'], 'xattr_remove' => ['bool', 'filename' => 'string', 'name' => 'string', 'flags=' => 'int'], 'xattr_set' => ['bool', 'filename' => 'string', 'name' => 'string', 'value' => 'string', 'flags=' => 'int'], 'xattr_supported' => ['bool', 'filename' => 'string', 'flags=' => 'int'], 'xcache_asm' => ['string', 'filename' => 'string'], 'xcache_clear_cache' => ['void', 'type' => 'int', 'id=' => 'int'], 'xcache_coredump' => ['string', 'op_type' => 'int'], 'xcache_count' => ['int', 'type' => 'int'], 'xcache_coverager_decode' => ['array', 'data' => 'string'], 'xcache_coverager_get' => ['array', 'clean=' => 'bool|false'], 'xcache_coverager_start' => ['void', 'clean=' => 'bool|true'], 'xcache_coverager_stop' => ['void', 'clean=' => 'bool|false'], 'xcache_dasm_file' => ['string', 'filename' => 'string'], 'xcache_dasm_string' => ['string', 'code' => 'string'], 'xcache_dec' => ['int', 'name' => 'string', 'value=' => 'int|mixed', 'ttl=' => 'int'], 'xcache_decode' => ['bool', 'filename' => 'string'], 'xcache_encode' => ['string', 'filename' => 'string'], 'xcache_get' => ['mixed', 'name' => 'string'], 'xcache_get_data_type' => ['string', 'type' => 'int'], 'xcache_get_op_spec' => ['string', 'op_type' => 'int'], 'xcache_get_op_type' => ['string', 'op_type' => 'int'], 'xcache_get_opcode' => ['string', 'opcode' => 'int'], 'xcache_get_opcode_spec' => ['string', 'opcode' => 'int'], 'xcache_inc' => ['int', 'name' => 'string', 'value=' => 'int|mixed', 'ttl=' => 'int'], 'xcache_info' => ['array', 'type' => 'int', 'id' => 'int'], 'xcache_is_autoglobal' => ['string', 'name' => 'string'], 'xcache_isset' => ['bool', 'name' => 'string'], 'xcache_list' => ['array', 'type' => 'int', 'id' => 'int'], 'xcache_set' => ['bool', 'name' => 'string', 'value' => 'mixed', 'ttl=' => 'int'], 'xcache_unset' => ['bool', 'name' => 'string'], 'xcache_unset_by_prefix' => ['bool', 'prefix' => 'string'], 'Xcom::__construct' => ['void', 'fabric_url=' => 'string', 'fabric_token=' => 'string', 'capability_token=' => 'string'], 'Xcom::decode' => ['object', 'avro_msg' => 'string', 'json_schema' => 'string'], 'Xcom::encode' => ['string', 'data' => 'stdClass', 'avro_schema' => 'string'], 'Xcom::getDebugOutput' => ['string'], 'Xcom::getLastResponse' => ['string'], 'Xcom::getLastResponseInfo' => ['array'], 'Xcom::getOnboardingURL' => ['string', 'capability_name' => 'string', 'agreement_url' => 'string'], 'Xcom::send' => ['int', 'topic' => 'string', 'data' => 'mixed', 'json_schema=' => 'string', 'http_headers=' => 'array'], 'Xcom::sendAsync' => ['int', 'topic' => 'string', 'data' => 'mixed', 'json_schema=' => 'string', 'http_headers=' => 'array'], 'xdebug_break' => ['bool'], 'xdebug_call_class' => ['string', 'depth=' => 'int'], 'xdebug_call_file' => ['string', 'depth=' => 'int'], 'xdebug_call_function' => ['string', 'depth=' => 'int'], 'xdebug_call_line' => ['int', 'depth=' => 'int'], 'xdebug_clear_aggr_profiling_data' => ['bool'], 'xdebug_code_coverage_started' => ['bool'], 'xdebug_debug_zval' => ['void', '...varName' => 'string'], 'xdebug_debug_zval_stdout' => ['void', '...varName' => 'string'], 'xdebug_disable' => ['void'], 'xdebug_dump_aggr_profiling_data' => ['bool'], 'xdebug_dump_superglobals' => ['void'], 'xdebug_enable' => ['void'], 'xdebug_get_code_coverage' => ['array'], 'xdebug_get_collected_errors' => ['string', 'clean=' => 'bool|false'], 'xdebug_get_declared_vars' => ['array'], 'xdebug_get_formatted_function_stack' => [''], 'xdebug_get_function_count' => ['int'], 'xdebug_get_function_stack' => ['array', 'message=' => 'string', 'options=' => 'int'], 'xdebug_get_headers' => ['array'], 'xdebug_get_monitored_functions' => ['array'], 'xdebug_get_profiler_filename' => ['string'], 'xdebug_get_stack_depth' => ['int'], 'xdebug_get_tracefile_name' => ['string'], 'xdebug_is_debugger_active' => ['bool'], 'xdebug_is_enabled' => ['bool'], 'xdebug_memory_usage' => ['int'], 'xdebug_peak_memory_usage' => ['int'], 'xdebug_print_function_stack' => ['array', 'message=' => 'string', 'options=' => 'int'], 'xdebug_set_filter' => ['void', 'group' => 'int', 'list_type' => 'int', 'configuration' => 'array'], 'xdebug_start_code_coverage' => ['void', 'options=' => 'int'], 'xdebug_start_error_collection' => ['void'], 'xdebug_start_function_monitor' => ['void', 'list_of_functions_to_monitor' => 'string[]'], 'xdebug_start_trace' => ['void', 'trace_file' => '', 'options=' => 'int|mixed'], 'xdebug_stop_code_coverage' => ['void', 'cleanup=' => 'bool|true'], 'xdebug_stop_error_collection' => ['void'], 'xdebug_stop_function_monitor' => ['void'], 'xdebug_stop_trace' => ['void'], 'xdebug_time_index' => ['float'], 'xdebug_var_dump' => ['void', '...var' => ''], 'xdiff_file_bdiff' => ['bool', 'old_file' => 'string', 'new_file' => 'string', 'dest' => 'string'], 'xdiff_file_bdiff_size' => ['int', 'file' => 'string'], 'xdiff_file_bpatch' => ['bool', 'file' => 'string', 'patch' => 'string', 'dest' => 'string'], 'xdiff_file_diff' => ['bool', 'old_file' => 'string', 'new_file' => 'string', 'dest' => 'string', 'context=' => 'int', 'minimal=' => 'bool'], 'xdiff_file_diff_binary' => ['bool', 'old_file' => 'string', 'new_file' => 'string', 'dest' => 'string'], 'xdiff_file_merge3' => ['mixed', 'old_file' => 'string', 'new_file1' => 'string', 'new_file2' => 'string', 'dest' => 'string'], 'xdiff_file_patch' => ['mixed', 'file' => 'string', 'patch' => 'string', 'dest' => 'string', 'flags=' => 'int'], 'xdiff_file_patch_binary' => ['bool', 'file' => 'string', 'patch' => 'string', 'dest' => 'string'], 'xdiff_file_rabdiff' => ['bool', 'old_file' => 'string', 'new_file' => 'string', 'dest' => 'string'], 'xdiff_string_bdiff' => ['string', 'old_data' => 'string', 'new_data' => 'string'], 'xdiff_string_bdiff_size' => ['int', 'patch' => 'string'], 'xdiff_string_bpatch' => ['string', 'str' => 'string', 'patch' => 'string'], 'xdiff_string_diff' => ['string', 'old_data' => 'string', 'new_data' => 'string', 'context=' => 'int', 'minimal=' => 'bool'], 'xdiff_string_diff_binary' => ['string', 'old_data' => 'string', 'new_data' => 'string'], 'xdiff_string_merge3' => ['mixed', 'old_data' => 'string', 'new_data1' => 'string', 'new_data2' => 'string', 'error=' => 'string'], 'xdiff_string_patch' => ['string', 'str' => 'string', 'patch' => 'string', 'flags=' => 'int', '&w_error=' => 'string'], 'xdiff_string_patch_binary' => ['string', 'str' => 'string', 'patch' => 'string'], 'xdiff_string_rabdiff' => ['string', 'old_data' => 'string', 'new_data' => 'string'], 'xhprof_disable' => ['array'], 'xhprof_enable' => ['void', 'flags=' => 'int', 'options=' => 'array'], 'xhprof_sample_disable' => ['array'], 'xhprof_sample_enable' => ['void'], 'xml_error_string' => ['string', 'code' => 'int'], 'xml_get_current_byte_index' => ['int', 'parser' => 'resource'], 'xml_get_current_column_number' => ['int', 'parser' => 'resource'], 'xml_get_current_line_number' => ['int', 'parser' => 'resource'], 'xml_get_error_code' => ['int', 'parser' => 'resource'], 'xml_parse' => ['int', 'parser' => 'resource', 'data' => 'string', 'isfinal=' => 'bool'], 'xml_parse_into_struct' => ['int', 'parser' => 'resource', 'data' => 'string', '&w_values' => 'array', '&w_index=' => 'array'], 'xml_parser_create' => ['resource', 'encoding=' => 'string'], 'xml_parser_create_ns' => ['resource', 'encoding=' => 'string', 'sep=' => 'string'], 'xml_parser_free' => ['bool', 'parser' => 'resource'], 'xml_parser_get_option' => ['mixed', 'parser' => 'resource', 'option' => 'int'], 'xml_parser_set_option' => ['bool', 'parser' => 'resource', 'option' => 'int', 'value' => 'mixed'], 'xml_set_character_data_handler' => ['bool', 'parser' => 'resource', 'hdl' => 'string'], 'xml_set_default_handler' => ['bool', 'parser' => 'resource', 'hdl' => 'string'], 'xml_set_element_handler' => ['bool', 'parser' => 'resource', 'shdl' => 'string', 'ehdl' => 'string'], 'xml_set_end_namespace_decl_handler' => ['bool', 'parser' => 'resource', 'hdl' => 'string'], 'xml_set_external_entity_ref_handler' => ['bool', 'parser' => 'resource', 'hdl' => 'string'], 'xml_set_notation_decl_handler' => ['bool', 'parser' => 'resource', 'hdl' => 'string'], 'xml_set_object' => ['bool', 'parser' => 'resource', 'obj' => 'object'], 'xml_set_processing_instruction_handler' => ['bool', 'parser' => 'resource', 'hdl' => 'string'], 'xml_set_start_namespace_decl_handler' => ['bool', 'parser' => 'resource', 'hdl' => 'string'], 'xml_set_unparsed_entity_decl_handler' => ['bool', 'parser' => 'resource', 'hdl' => 'string'], 'XMLDiff\\Base::__construct' => ['void', 'nsname' => 'string'], 'XMLDiff\\Base::diff' => ['mixed', 'from' => 'mixed', 'to' => 'mixed'], 'XMLDiff\\Base::merge' => ['mixed', 'src' => 'mixed', 'diff' => 'mixed'], 'XMLDiff\\DOM::diff' => ['DOMDocument', 'from' => 'DOMDocument', 'to' => 'DOMDocument'], 'XMLDiff\\DOM::merge' => ['DOMDocument', 'src' => 'DOMDocument', 'diff' => 'DOMDocument'], 'XMLDiff\\File::diff' => ['string', 'from' => 'string', 'to' => 'string'], 'XMLDiff\\File::merge' => ['string', 'src' => 'string', 'diff' => 'string'], 'XMLDiff\\Memory::diff' => ['string', 'from' => 'string', 'to' => 'string'], 'XMLDiff\\Memory::merge' => ['string', 'src' => 'string', 'diff' => 'string'], 'XMLReader::close' => ['bool'], 'XMLReader::expand' => ['DOMNode', 'basenode=' => 'DOMNode'], 'XMLReader::getAttribute' => ['string|null', 'name' => 'string'], 'XMLReader::getAttributeNo' => ['string|null', 'index' => 'int'], 'XMLReader::getAttributeNs' => ['string|null', 'name' => 'string', 'namespaceuri' => 'string'], 'XMLReader::getParserProperty' => ['bool', 'property' => 'int'], 'XMLReader::isValid' => ['bool'], 'XMLReader::lookupNamespace' => ['?string', 'prefix' => 'string'], 'XMLReader::moveToAttribute' => ['bool', 'name' => 'string'], 'XMLReader::moveToAttributeNo' => ['bool', 'index' => 'int'], 'XMLReader::moveToAttributeNs' => ['bool', 'localname' => 'string', 'namespaceuri' => 'string'], 'XMLReader::moveToElement' => ['bool'], 'XMLReader::moveToFirstAttribute' => ['bool'], 'XMLReader::moveToNextAttribute' => ['bool'], 'XMLReader::next' => ['bool', 'localname=' => 'string'], 'XMLReader::open' => ['bool', 'uri' => 'string', 'encoding=' => '?string', 'options=' => 'int'], 'XMLReader::read' => ['bool'], 'XMLReader::readInnerXML' => ['string'], 'XMLReader::readOuterXML' => ['string'], 'XMLReader::readString' => ['string'], 'XMLReader::setParserProperty' => ['bool', 'property' => 'int', 'value' => 'bool'], 'XMLReader::setRelaxNGSchema' => ['bool', 'filename' => 'string'], 'XMLReader::setRelaxNGSchemaSource' => ['bool', 'source' => 'string'], 'XMLReader::setSchema' => ['bool', 'filename' => 'string'], 'XMLReader::XML' => ['bool', 'source' => 'string', 'encoding=' => '?string', 'options=' => 'int'], 'xmlrpc_decode' => ['?array', 'xml' => 'string', 'encoding=' => 'string'], 'xmlrpc_decode_request' => ['?array', 'xml' => 'string', '&w_method' => 'string', 'encoding=' => 'string'], 'xmlrpc_encode' => ['string', 'value' => 'mixed'], 'xmlrpc_encode_request' => ['string', 'method' => 'string', 'params' => 'mixed', 'output_options=' => 'array'], 'xmlrpc_get_type' => ['string', 'value' => 'mixed'], 'xmlrpc_is_fault' => ['bool', 'arg' => 'array'], 'xmlrpc_parse_method_descriptions' => ['array', 'xml' => 'string'], 'xmlrpc_server_add_introspection_data' => ['int', 'server' => 'resource', 'desc' => 'array'], 'xmlrpc_server_call_method' => ['string', 'server' => 'resource', 'xml' => 'string', 'user_data' => 'mixed', 'output_options=' => 'array'], 'xmlrpc_server_create' => ['resource'], 'xmlrpc_server_destroy' => ['int', 'server' => 'resource'], 'xmlrpc_server_register_introspection_callback' => ['bool', 'server' => 'resource', 'function' => 'string'], 'xmlrpc_server_register_method' => ['bool', 'server' => 'resource', 'method_name' => 'string', 'function' => 'string'], 'xmlrpc_set_type' => ['bool', '&rw_value' => 'string|DateTime', 'type' => 'string'], 'XMLWriter::endAttribute' => ['bool'], 'XMLWriter::endCData' => ['bool'], 'XMLWriter::endComment' => ['bool'], 'XMLWriter::endDocument' => ['bool'], 'XMLWriter::endDTD' => ['bool', 'xmlwriter=' => ''], 'XMLWriter::endDTDAttlist' => ['bool'], 'XMLWriter::endDTDElement' => ['bool'], 'XMLWriter::endDTDEntity' => ['bool'], 'XMLWriter::endElement' => ['bool'], 'XMLWriter::endPI' => ['bool'], 'XMLWriter::flush' => ['', 'empty=' => 'bool', 'xmlwriter=' => ''], 'XMLWriter::fullEndElement' => ['bool'], 'XMLWriter::openMemory' => ['bool'], 'XMLWriter::openURI' => ['resource', 'uri' => 'string'], 'XMLWriter::outputMemory' => ['string', 'flush=' => 'bool', 'xmlwriter=' => ''], 'XMLWriter::setIndent' => ['bool', 'indent' => 'bool'], 'XMLWriter::setIndentString' => ['bool', 'indentstring' => 'string'], 'XMLWriter::startAttribute' => ['bool', 'name' => 'string'], 'XMLWriter::startAttributeNS' => ['bool', 'prefix' => 'string', 'name' => 'string', 'uri' => 'string'], 'XMLWriter::startCData' => ['bool'], 'XMLWriter::startComment' => ['bool'], 'XMLWriter::startDocument' => ['bool', 'version=' => 'string', 'encoding=' => 'string', 'standalone=' => 'string'], 'XMLWriter::startDTD' => ['bool', 'qualifiedname' => 'string', 'publicid=' => 'string', 'systemid=' => 'string'], 'XMLWriter::startDTDAttlist' => ['bool', 'name' => 'string'], 'XMLWriter::startDTDElement' => ['bool', 'qualifiedname' => 'string'], 'XMLWriter::startDTDEntity' => ['bool', 'name' => 'string', 'isparam' => 'bool'], 'XMLWriter::startElement' => ['bool', 'name' => 'string'], 'XMLWriter::startElementNS' => ['bool', 'prefix' => 'string', 'name' => 'string', 'uri' => 'string'], 'XMLWriter::startPI' => ['bool', 'target' => 'string'], 'XMLWriter::text' => ['bool', 'content' => 'string'], 'XMLWriter::writeAttribute' => ['bool', 'name' => 'string', 'value' => 'string'], 'XMLWriter::writeAttributeNS' => ['bool', 'prefix' => 'string', 'name' => 'string', 'uri' => 'string', 'content' => 'string'], 'XMLWriter::writeCData' => ['bool', 'content' => 'string'], 'XMLWriter::writeComment' => ['bool', 'content' => 'string'], 'XMLWriter::writeDTD' => ['bool', 'name' => 'string', 'publicid=' => 'string', 'systemid=' => 'string', 'subset=' => 'string'], 'XMLWriter::writeDTDAttlist' => ['bool', 'name' => 'string', 'content' => 'string'], 'XMLWriter::writeDTDElement' => ['bool', 'name' => 'string', 'content' => 'string'], 'XMLWriter::writeDTDEntity' => ['bool', 'name' => 'string', 'content' => 'string', 'pe' => 'bool', 'pubid' => 'string', 'sysid' => 'string', 'ndataid' => 'string'], 'XMLWriter::writeElement' => ['bool', 'name' => 'string', 'content=' => 'string|null'], 'XMLWriter::writeElementNS' => ['bool', 'prefix' => 'string', 'name' => 'string', 'uri' => 'string', 'content=' => 'string|null'], 'XMLWriter::writePI' => ['bool', 'target' => 'string', 'content' => 'string'], 'XMLWriter::writeRaw' => ['bool', 'content' => 'string'], 'xmlwriter_end_attribute' => ['bool', 'xmlwriter' => 'resource'], 'xmlwriter_end_cdata' => ['bool', 'xmlwriter' => 'resource'], 'xmlwriter_end_comment' => ['bool', 'xmlwriter' => 'resource'], 'xmlwriter_end_document' => ['bool', 'xmlwriter' => 'resource'], 'xmlwriter_end_dtd' => ['bool', 'xmlwriter' => 'resource'], 'xmlwriter_end_dtd_attlist' => ['bool', 'xmlwriter' => 'resource'], 'xmlwriter_end_dtd_element' => ['bool', 'xmlwriter' => 'resource'], 'xmlwriter_end_dtd_entity' => ['bool', 'xmlwriter' => 'resource'], 'xmlwriter_end_element' => ['bool', 'xmlwriter' => 'resource'], 'xmlwriter_end_pi' => ['bool', 'xmlwriter' => 'resource'], 'xmlwriter_flush' => ['', 'xmlwriter' => 'resource', 'empty=' => 'bool'], 'xmlwriter_full_end_element' => ['bool', 'xmlwriter' => 'resource'], 'xmlwriter_open_memory' => ['resource'], 'xmlwriter_open_uri' => ['resource', 'source' => 'string'], 'xmlwriter_output_memory' => ['string', 'xmlwriter' => 'resource', 'flush=' => 'bool'], 'xmlwriter_set_indent' => ['bool', 'xmlwriter' => 'resource', 'indent' => 'bool'], 'xmlwriter_set_indent_string' => ['bool', 'xmlwriter' => 'resource', 'indentstring' => 'string'], 'xmlwriter_start_attribute' => ['bool', 'xmlwriter' => 'resource', 'name' => 'string'], 'xmlwriter_start_attribute_ns' => ['bool', 'xmlwriter' => 'resource', 'prefix' => 'string', 'name' => 'string', 'uri' => 'string'], 'xmlwriter_start_cdata' => ['bool', 'xmlwriter' => 'resource'], 'xmlwriter_start_comment' => ['bool', 'xmlwriter' => 'resource'], 'xmlwriter_start_document' => ['bool', 'xmlwriter' => 'resource', 'version' => 'string', 'encoding' => 'string', 'standalone' => 'string'], 'xmlwriter_start_dtd' => ['bool', 'xmlwriter' => 'resource', 'name' => 'string', 'pubid' => 'string', 'sysid' => 'string'], 'xmlwriter_start_dtd_attlist' => ['bool', 'xmlwriter' => 'resource', 'name' => 'string'], 'xmlwriter_start_dtd_element' => ['bool', 'xmlwriter' => 'resource', 'name' => 'string'], 'xmlwriter_start_dtd_entity' => ['bool', 'xmlwriter' => 'resource', 'name' => 'string', 'isparam' => 'bool'], 'xmlwriter_start_element' => ['bool', 'xmlwriter' => 'resource', 'name' => 'string'], 'xmlwriter_start_element_ns' => ['bool', 'xmlwriter' => 'resource', 'prefix' => 'string', 'name' => 'string', 'uri' => 'string'], 'xmlwriter_start_pi' => ['bool', 'xmlwriter' => 'resource', 'target' => 'string'], 'xmlwriter_text' => ['bool', 'xmlwriter' => 'resource', 'content' => 'string'], 'xmlwriter_write_attribute' => ['bool', 'xmlwriter' => 'resource', 'name' => 'string', 'content' => 'string'], 'xmlwriter_write_attribute_ns' => ['bool', 'xmlwriter' => 'resource', 'prefix' => 'string', 'name' => 'string', 'uri' => 'string', 'content' => 'string'], 'xmlwriter_write_cdata' => ['bool', 'xmlwriter' => 'resource', 'content' => 'string'], 'xmlwriter_write_comment' => ['bool', 'xmlwriter' => 'resource', 'content' => 'string'], 'xmlwriter_write_dtd' => ['bool', 'xmlwriter' => 'resource', 'name' => 'string', 'pubid' => 'string', 'sysid' => 'string', 'subset' => 'string'], 'xmlwriter_write_dtd_attlist' => ['bool', 'xmlwriter' => 'resource', 'name' => 'string', 'content' => 'string'], 'xmlwriter_write_dtd_element' => ['bool', 'xmlwriter' => 'resource', 'name' => 'string', 'content' => 'string'], 'xmlwriter_write_dtd_entity' => ['bool', 'xmlwriter' => 'resource', 'name' => 'string', 'content' => 'string', 'pe' => 'int', 'pubid' => 'string', 'sysid' => 'string', 'ndataid' => 'string'], 'xmlwriter_write_element' => ['bool', 'xmlwriter' => 'resource', 'name' => 'string', 'content' => 'string'], 'xmlwriter_write_element_ns' => ['bool', 'xmlwriter' => 'resource', 'prefix' => 'string', 'name' => 'string', 'uri' => 'string', 'content' => 'string'], 'xmlwriter_write_pi' => ['bool', 'xmlwriter' => 'resource', 'target' => 'string', 'content' => 'string'], 'xmlwriter_write_raw' => ['bool', 'xmlwriter' => 'resource', 'content' => 'string'], 'xpath_new_context' => ['XPathContext', 'dom_document' => 'DOMDocument'], 'xpath_register_ns' => ['bool', 'xpath_context' => 'xpathcontext', 'prefix' => 'string', 'uri' => 'string'], 'xpath_register_ns_auto' => ['bool', 'xpath_context' => 'xpathcontext', 'context_node=' => 'object'], 'xptr_new_context' => ['XPathContext'], 'xsl_xsltprocessor_get_parameter' => ['string', 'namespace' => 'string', 'name' => 'string'], 'xsl_xsltprocessor_get_security_prefs' => ['int'], 'xsl_xsltprocessor_has_exslt_support' => ['bool'], 'xsl_xsltprocessor_register_php_functions' => ['', 'restrict' => ''], 'xsl_xsltprocessor_remove_parameter' => ['bool', 'namespace' => 'string', 'name' => 'string'], 'xsl_xsltprocessor_set_parameter' => ['bool', 'namespace' => 'string', 'name' => '', 'value' => 'string'], 'xsl_xsltprocessor_set_profiling' => ['bool', 'filename' => 'string'], 'xsl_xsltprocessor_set_security_prefs' => ['int', 'securityprefs' => 'int'], 'xsl_xsltprocessor_transform_to_uri' => ['int', 'doc' => 'DOMDocument', 'uri' => 'string'], 'xsl_xsltprocessor_transform_to_xml' => ['string', 'doc' => 'DOMDocument'], 'xslt_backend_info' => ['string'], 'xslt_backend_name' => ['string'], 'xslt_backend_version' => ['string'], 'xslt_create' => ['resource'], 'xslt_errno' => ['int', 'xh' => ''], 'xslt_error' => ['string', 'xh' => ''], 'xslt_free' => ['', 'xh' => ''], 'xslt_getopt' => ['int', 'processor' => ''], 'xslt_process' => ['', 'xh' => '', 'xmlcontainer' => 'string', 'xslcontainer' => 'string', 'resultcontainer=' => 'string', 'arguments=' => 'array', 'parameters=' => 'array'], 'xslt_set_base' => ['', 'xh' => '', 'uri' => 'string'], 'xslt_set_encoding' => ['', 'xh' => '', 'encoding' => 'string'], 'xslt_set_error_handler' => ['', 'xh' => '', 'handler' => ''], 'xslt_set_log' => ['', 'xh' => '', 'log=' => ''], 'xslt_set_object' => ['bool', 'processor' => '', 'obj' => 'object'], 'xslt_set_sax_handler' => ['', 'xh' => '', 'handlers' => 'array'], 'xslt_set_sax_handlers' => ['', 'processor' => '', 'handlers' => 'array'], 'xslt_set_scheme_handler' => ['', 'xh' => '', 'handlers' => 'array'], 'xslt_set_scheme_handlers' => ['', 'xh' => '', 'handlers' => 'array'], 'xslt_setopt' => ['', 'processor' => '', 'newmask' => 'int'], 'XSLTProcessor::getParameter' => ['string', 'namespaceuri' => 'string', 'localname' => 'string'], 'XsltProcessor::getSecurityPrefs' => ['int'], 'XSLTProcessor::hasExsltSupport' => ['bool'], 'XSLTProcessor::importStylesheet' => ['bool', 'stylesheet' => 'object'], 'XSLTProcessor::registerPHPFunctions' => ['void', 'restrict=' => 'mixed'], 'XSLTProcessor::removeParameter' => ['bool', 'namespaceuri' => 'string', 'localname' => 'string'], 'XSLTProcessor::setParameter' => ['bool', 'namespace' => 'string', 'name' => 'string', 'value' => 'string'], 'XSLTProcessor::setParameter\'1' => ['bool', 'namespace' => 'string', 'options' => 'array'], 'XSLTProcessor::setProfiling' => ['bool', 'filename' => 'string'], 'XsltProcessor::setSecurityPrefs' => ['int', 'securityPrefs' => 'int'], 'XSLTProcessor::transformToDoc' => ['DOMDocument', 'doc' => 'DOMNode'], 'XSLTProcessor::transformToURI' => ['int', 'doc' => 'DOMDocument', 'uri' => 'string'], 'XSLTProcessor::transformToXML' => ['string', 'doc' => 'DOMDocument'], 'Yaconf::get' => ['mixed', 'name' => 'string', 'default_value=' => 'mixed'], 'Yaconf::has' => ['bool', 'name' => 'string'], 'Yaf_Action_Abstract::__construct' => ['void', 'request' => 'Yaf_Request_Abstract', 'response' => 'Yaf_Response_Abstract', 'view' => 'Yaf_View_Interface', 'invokeArgs=' => '?array'], 'Yaf_Action_Abstract::display' => ['bool', 'tpl' => 'string', 'parameters=' => '?array'], 'Yaf_Action_Abstract::execute' => ['mixed', 'arg=' => 'mixed', '...args=' => 'mixed'], 'Yaf_Action_Abstract::forward' => ['bool', 'module' => 'string', 'controller=' => 'string', 'action=' => 'string', 'parameters=' => '?array'], 'Yaf_Action_Abstract::getController' => ['Yaf_Controller_Abstract'], 'Yaf_Action_Abstract::getInvokeArg' => ['mixed|null', 'name' => 'string'], 'Yaf_Action_Abstract::getInvokeArgs' => ['array'], 'Yaf_Action_Abstract::getModuleName' => ['string'], 'Yaf_Action_Abstract::getRequest' => ['Yaf_Request_Abstract'], 'Yaf_Action_Abstract::getResponse' => ['Yaf_Response_Abstract'], 'Yaf_Action_Abstract::getView' => ['Yaf_View_Interface'], 'Yaf_Action_Abstract::getViewpath' => ['string'], 'Yaf_Action_Abstract::init' => [''], 'Yaf_Action_Abstract::initView' => ['Yaf_Response_Abstract', 'options=' => '?array'], 'Yaf_Action_Abstract::redirect' => ['bool', 'url' => 'string'], 'Yaf_Action_Abstract::render' => ['string', 'tpl' => 'string', 'parameters=' => '?array'], 'Yaf_Action_Abstract::setViewpath' => ['bool', 'view_directory' => 'string'], 'Yaf_Application::__clone' => ['void'], 'Yaf_Application::__construct' => ['void', 'config' => 'mixed', 'envrion=' => 'string'], 'Yaf_Application::__destruct' => ['void'], 'Yaf_Application::__sleep' => ['void'], 'Yaf_Application::__wakeup' => ['void'], 'Yaf_Application::app' => ['void'], 'Yaf_Application::bootstrap' => ['void', 'bootstrap=' => 'Yaf_Bootstrap_Abstract'], 'Yaf_Application::clearLastError' => ['Yaf_Application'], 'Yaf_Application::environ' => ['void'], 'Yaf_Application::execute' => ['void', 'entry' => 'callable', '...args' => 'string'], 'Yaf_Application::getAppDirectory' => ['Yaf_Application'], 'Yaf_Application::getConfig' => ['Yaf_Config_Abstract'], 'Yaf_Application::getDispatcher' => ['Yaf_Dispatcher'], 'Yaf_Application::getLastErrorMsg' => ['string'], 'Yaf_Application::getLastErrorNo' => ['int'], 'Yaf_Application::getModules' => ['array'], 'Yaf_Application::run' => ['void'], 'Yaf_Application::setAppDirectory' => ['Yaf_Application', 'directory' => 'string'], 'Yaf_Config_Abstract::get' => ['mixed', 'name' => 'string', 'value' => 'mixed'], 'Yaf_Config_Abstract::readonly' => ['bool'], 'Yaf_Config_Abstract::set' => ['Yaf_Config_Abstract'], 'Yaf_Config_Abstract::toArray' => ['array'], 'Yaf_Config_Ini::__construct' => ['void', 'config_file' => 'string', 'section=' => 'string'], 'Yaf_Config_Ini::__get' => ['void', 'name=' => 'string'], 'Yaf_Config_Ini::__isset' => ['void', 'name' => 'string'], 'Yaf_Config_Ini::__set' => ['void', 'name' => 'string', 'value' => 'mixed'], 'Yaf_Config_Ini::count' => ['void'], 'Yaf_Config_Ini::current' => ['void'], 'Yaf_Config_Ini::get' => ['mixed', 'name=' => 'mixed'], 'Yaf_Config_Ini::key' => ['void'], 'Yaf_Config_Ini::next' => ['void'], 'Yaf_Config_Ini::offsetExists' => ['void', 'name' => 'string'], 'Yaf_Config_Ini::offsetGet' => ['void', 'name' => 'string'], 'Yaf_Config_Ini::offsetSet' => ['void', 'name' => 'string', 'value' => 'string'], 'Yaf_Config_Ini::offsetUnset' => ['void', 'name' => 'string'], 'Yaf_Config_Ini::readonly' => ['void'], 'Yaf_Config_Ini::rewind' => ['void'], 'Yaf_Config_Ini::set' => ['Yaf_Config_Abstract', 'name' => 'string', 'value' => 'mixed'], 'Yaf_Config_Ini::toArray' => ['array'], 'Yaf_Config_Ini::valid' => ['void'], 'Yaf_Config_Simple::__construct' => ['void', 'config_file' => 'string', 'section=' => 'string'], 'Yaf_Config_Simple::__get' => ['void', 'name=' => 'string'], 'Yaf_Config_Simple::__isset' => ['void', 'name' => 'string'], 'Yaf_Config_Simple::__set' => ['void', 'name' => 'string', 'value' => 'string'], 'Yaf_Config_Simple::count' => ['void'], 'Yaf_Config_Simple::current' => ['void'], 'Yaf_Config_Simple::get' => ['mixed', 'name=' => 'mixed'], 'Yaf_Config_Simple::key' => ['void'], 'Yaf_Config_Simple::next' => ['void'], 'Yaf_Config_Simple::offsetExists' => ['void', 'name' => 'string'], 'Yaf_Config_Simple::offsetGet' => ['void', 'name' => 'string'], 'Yaf_Config_Simple::offsetSet' => ['void', 'name' => 'string', 'value' => 'string'], 'Yaf_Config_Simple::offsetUnset' => ['void', 'name' => 'string'], 'Yaf_Config_Simple::readonly' => ['void'], 'Yaf_Config_Simple::rewind' => ['void'], 'Yaf_Config_Simple::set' => ['Yaf_Config_Abstract', 'name' => 'string', 'value' => 'mixed'], 'Yaf_Config_Simple::toArray' => ['array'], 'Yaf_Config_Simple::valid' => ['void'], 'Yaf_Controller_Abstract::__clone' => ['void'], 'Yaf_Controller_Abstract::__construct' => ['void'], 'Yaf_Controller_Abstract::display' => ['bool', 'tpl' => 'string', 'parameters=' => 'array'], 'Yaf_Controller_Abstract::forward' => ['void', 'action' => 'string', 'parameters=' => 'array'], 'Yaf_Controller_Abstract::forward\'1' => ['void', 'controller' => 'string', 'action' => 'string', 'parameters=' => 'array'], 'Yaf_Controller_Abstract::forward\'2' => ['void', 'module' => 'string', 'controller' => 'string', 'action' => 'string', 'parameters=' => 'array'], 'Yaf_Controller_Abstract::getInvokeArg' => ['void', 'name' => 'string'], 'Yaf_Controller_Abstract::getInvokeArgs' => ['void'], 'Yaf_Controller_Abstract::getModuleName' => ['string'], 'Yaf_Controller_Abstract::getRequest' => ['Yaf_Request_Abstract'], 'Yaf_Controller_Abstract::getResponse' => ['Yaf_Response_Abstract'], 'Yaf_Controller_Abstract::getView' => ['Yaf_View_Interface'], 'Yaf_Controller_Abstract::getViewpath' => ['void'], 'Yaf_Controller_Abstract::init' => ['void'], 'Yaf_Controller_Abstract::initView' => ['void', 'options=' => 'array'], 'Yaf_Controller_Abstract::redirect' => ['bool', 'url' => 'string'], 'Yaf_Controller_Abstract::render' => ['string', 'tpl' => 'string', 'parameters=' => 'array'], 'Yaf_Controller_Abstract::setViewpath' => ['void', 'view_directory' => 'string'], 'Yaf_Dispatcher::__clone' => ['void'], 'Yaf_Dispatcher::__construct' => ['void'], 'Yaf_Dispatcher::__sleep' => ['void'], 'Yaf_Dispatcher::__wakeup' => ['void'], 'Yaf_Dispatcher::autoRender' => ['Yaf_Dispatcher', 'flag=' => 'bool'], 'Yaf_Dispatcher::catchException' => ['Yaf_Dispatcher', 'flag=' => 'bool'], 'Yaf_Dispatcher::disableView' => ['bool'], 'Yaf_Dispatcher::dispatch' => ['Yaf_Response_Abstract', 'request' => 'Yaf_Request_Abstract'], 'Yaf_Dispatcher::enableView' => ['Yaf_Dispatcher'], 'Yaf_Dispatcher::flushInstantly' => ['Yaf_Dispatcher', 'flag=' => 'bool'], 'Yaf_Dispatcher::getApplication' => ['Yaf_Application'], 'Yaf_Dispatcher::getInstance' => ['Yaf_Dispatcher'], 'Yaf_Dispatcher::getRequest' => ['Yaf_Request_Abstract'], 'Yaf_Dispatcher::getRouter' => ['Yaf_Router'], 'Yaf_Dispatcher::initView' => ['Yaf_View_Interface', 'templates_dir' => 'string', 'options=' => 'array'], 'Yaf_Dispatcher::registerPlugin' => ['Yaf_Dispatcher', 'plugin' => 'Yaf_Plugin_Abstract'], 'Yaf_Dispatcher::returnResponse' => ['Yaf_Dispatcher', 'flag' => 'bool'], 'Yaf_Dispatcher::setDefaultAction' => ['Yaf_Dispatcher', 'action' => 'string'], 'Yaf_Dispatcher::setDefaultController' => ['Yaf_Dispatcher', 'controller' => 'string'], 'Yaf_Dispatcher::setDefaultModule' => ['Yaf_Dispatcher', 'module' => 'string'], 'Yaf_Dispatcher::setErrorHandler' => ['Yaf_Dispatcher', 'callback' => 'call', 'error_types' => 'int'], 'Yaf_Dispatcher::setRequest' => ['Yaf_Dispatcher', 'request' => 'Yaf_Request_Abstract'], 'Yaf_Dispatcher::setView' => ['Yaf_Dispatcher', 'view' => 'Yaf_View_Interface'], 'Yaf_Dispatcher::throwException' => ['Yaf_Dispatcher', 'flag=' => 'bool'], 'Yaf_Exception::__construct' => ['void'], 'Yaf_Exception::getPrevious' => ['void'], 'Yaf_Loader::__clone' => ['void'], 'Yaf_Loader::__construct' => ['void'], 'Yaf_Loader::__sleep' => ['void'], 'Yaf_Loader::__wakeup' => ['void'], 'Yaf_Loader::autoload' => ['void'], 'Yaf_Loader::clearLocalNamespace' => ['void'], 'Yaf_Loader::getInstance' => ['void'], 'Yaf_Loader::getLibraryPath' => ['Yaf_Loader', 'is_global=' => 'bool'], 'Yaf_Loader::getLocalNamespace' => ['void'], 'Yaf_Loader::import' => ['void'], 'Yaf_Loader::isLocalName' => ['void'], 'Yaf_Loader::registerLocalNamespace' => ['void', 'prefix' => 'mixed'], 'Yaf_Loader::setLibraryPath' => ['Yaf_Loader', 'directory' => 'string', 'is_global=' => 'bool'], 'Yaf_Plugin_Abstract::dispatchLoopShutdown' => ['void', 'request' => 'Yaf_Request_Abstract', 'response' => 'Yaf_Response_Abstract'], 'Yaf_Plugin_Abstract::dispatchLoopStartup' => ['void', 'request' => 'Yaf_Request_Abstract', 'response' => 'Yaf_Response_Abstract'], 'Yaf_Plugin_Abstract::postDispatch' => ['void', 'request' => 'Yaf_Request_Abstract', 'response' => 'Yaf_Response_Abstract'], 'Yaf_Plugin_Abstract::preDispatch' => ['void', 'request' => 'Yaf_Request_Abstract', 'response' => 'Yaf_Response_Abstract'], 'Yaf_Plugin_Abstract::preResponse' => ['void', 'request' => 'Yaf_Request_Abstract', 'response' => 'Yaf_Response_Abstract'], 'Yaf_Plugin_Abstract::routerShutdown' => ['void', 'request' => 'Yaf_Request_Abstract', 'response' => 'Yaf_Response_Abstract'], 'Yaf_Plugin_Abstract::routerStartup' => ['void', 'request' => 'Yaf_Request_Abstract', 'response' => 'Yaf_Response_Abstract'], 'Yaf_Registry::__clone' => ['void'], 'Yaf_Registry::__construct' => ['void'], 'Yaf_Registry::del' => ['void', 'name' => 'string'], 'Yaf_Registry::get' => ['mixed', 'name' => 'string'], 'Yaf_Registry::has' => ['bool', 'name' => 'string'], 'Yaf_Registry::set' => ['bool', 'name' => 'string', 'value' => 'string'], 'Yaf_Request_Abstract::getActionName' => ['void'], 'Yaf_Request_Abstract::getBaseUri' => ['void'], 'Yaf_Request_Abstract::getControllerName' => ['void'], 'Yaf_Request_Abstract::getEnv' => ['void', 'name' => 'string', 'default=' => 'string'], 'Yaf_Request_Abstract::getException' => ['void'], 'Yaf_Request_Abstract::getLanguage' => ['void'], 'Yaf_Request_Abstract::getMethod' => ['void'], 'Yaf_Request_Abstract::getModuleName' => ['void'], 'Yaf_Request_Abstract::getParam' => ['void', 'name' => 'string', 'default=' => 'string'], 'Yaf_Request_Abstract::getParams' => ['void'], 'Yaf_Request_Abstract::getRequestUri' => ['void'], 'Yaf_Request_Abstract::getServer' => ['void', 'name' => 'string', 'default=' => 'string'], 'Yaf_Request_Abstract::isCli' => ['void'], 'Yaf_Request_Abstract::isDispatched' => ['void'], 'Yaf_Request_Abstract::isGet' => ['void'], 'Yaf_Request_Abstract::isHead' => ['void'], 'Yaf_Request_Abstract::isOptions' => ['void'], 'Yaf_Request_Abstract::isPost' => ['void'], 'Yaf_Request_Abstract::isPut' => ['void'], 'Yaf_Request_Abstract::isRouted' => ['void'], 'Yaf_Request_Abstract::isXmlHttpRequest' => ['void'], 'Yaf_Request_Abstract::setActionName' => ['void', 'action' => 'string'], 'Yaf_Request_Abstract::setBaseUri' => ['bool', 'uir' => 'string'], 'Yaf_Request_Abstract::setControllerName' => ['void', 'controller' => 'string'], 'Yaf_Request_Abstract::setDispatched' => ['void'], 'Yaf_Request_Abstract::setModuleName' => ['void', 'module' => 'string'], 'Yaf_Request_Abstract::setParam' => ['void', 'name' => 'string', 'value=' => 'string'], 'Yaf_Request_Abstract::setRequestUri' => ['void', 'uir' => 'string'], 'Yaf_Request_Abstract::setRouted' => ['void', 'flag=' => 'string'], 'Yaf_Request_Http::__clone' => ['void'], 'Yaf_Request_Http::__construct' => ['void'], 'Yaf_Request_Http::get' => ['mixed', 'name' => 'string', 'default=' => 'string'], 'Yaf_Request_Http::getActionName' => ['string'], 'Yaf_Request_Http::getBaseUri' => ['string'], 'Yaf_Request_Http::getControllerName' => ['string'], 'Yaf_Request_Http::getCookie' => ['mixed', 'name' => 'string', 'default=' => 'string'], 'Yaf_Request_Http::getEnv' => ['mixed', 'name=' => 'string', 'default=' => 'mixed'], 'Yaf_Request_Http::getException' => ['Yaf_Exception'], 'Yaf_Request_Http::getFiles' => ['void'], 'Yaf_Request_Http::getLanguage' => ['string'], 'Yaf_Request_Http::getMethod' => ['string'], 'Yaf_Request_Http::getModuleName' => ['string'], 'Yaf_Request_Http::getParam' => ['mixed', 'name' => 'string', 'default=' => 'mixed'], 'Yaf_Request_Http::getParams' => ['array'], 'Yaf_Request_Http::getPost' => ['mixed', 'name' => 'string', 'default=' => 'string'], 'Yaf_Request_Http::getQuery' => ['mixed', 'name' => 'string', 'default=' => 'string'], 'Yaf_Request_Http::getRaw' => ['mixed'], 'Yaf_Request_Http::getRequest' => ['void'], 'Yaf_Request_Http::getRequestUri' => ['string'], 'Yaf_Request_Http::getServer' => ['mixed', 'name=' => 'string', 'default=' => 'mixed'], 'Yaf_Request_Http::isCli' => ['bool'], 'Yaf_Request_Http::isDispatched' => ['bool'], 'Yaf_Request_Http::isGet' => ['bool'], 'Yaf_Request_Http::isHead' => ['bool'], 'Yaf_Request_Http::isOptions' => ['bool'], 'Yaf_Request_Http::isPost' => ['bool'], 'Yaf_Request_Http::isPut' => ['bool'], 'Yaf_Request_Http::isRouted' => ['bool'], 'Yaf_Request_Http::isXmlHttpRequest' => ['bool'], 'Yaf_Request_Http::setActionName' => ['Yaf_Request_Abstract|bool', 'action' => 'string'], 'Yaf_Request_Http::setBaseUri' => ['bool', 'uri' => 'string'], 'Yaf_Request_Http::setControllerName' => ['Yaf_Request_Abstract|bool', 'controller' => 'string'], 'Yaf_Request_Http::setDispatched' => ['bool'], 'Yaf_Request_Http::setModuleName' => ['Yaf_Request_Abstract|bool', 'module' => 'string'], 'Yaf_Request_Http::setParam' => ['Yaf_Request_Abstract|bool', 'name' => 'array|string', 'value=' => 'string'], 'Yaf_Request_Http::setRequestUri' => ['', 'uri' => 'string'], 'Yaf_Request_Http::setRouted' => ['Yaf_Request_Abstract|bool'], 'Yaf_Request_Simple::__clone' => ['void'], 'Yaf_Request_Simple::__construct' => ['void'], 'Yaf_Request_Simple::get' => ['void'], 'Yaf_Request_Simple::getActionName' => ['string'], 'Yaf_Request_Simple::getBaseUri' => ['string'], 'Yaf_Request_Simple::getControllerName' => ['string'], 'Yaf_Request_Simple::getCookie' => ['void'], 'Yaf_Request_Simple::getEnv' => ['mixed', 'name=' => 'string', 'default=' => 'mixed'], 'Yaf_Request_Simple::getException' => ['Yaf_Exception'], 'Yaf_Request_Simple::getFiles' => ['void'], 'Yaf_Request_Simple::getLanguage' => ['string'], 'Yaf_Request_Simple::getMethod' => ['string'], 'Yaf_Request_Simple::getModuleName' => ['string'], 'Yaf_Request_Simple::getParam' => ['mixed', 'name' => 'string', 'default=' => 'mixed'], 'Yaf_Request_Simple::getParams' => ['array'], 'Yaf_Request_Simple::getPost' => ['void'], 'Yaf_Request_Simple::getQuery' => ['void'], 'Yaf_Request_Simple::getRequest' => ['void'], 'Yaf_Request_Simple::getRequestUri' => ['string'], 'Yaf_Request_Simple::getServer' => ['mixed', 'name=' => 'string', 'default=' => 'mixed'], 'Yaf_Request_Simple::isCli' => ['bool'], 'Yaf_Request_Simple::isDispatched' => ['bool'], 'Yaf_Request_Simple::isGet' => ['bool'], 'Yaf_Request_Simple::isHead' => ['bool'], 'Yaf_Request_Simple::isOptions' => ['bool'], 'Yaf_Request_Simple::isPost' => ['bool'], 'Yaf_Request_Simple::isPut' => ['bool'], 'Yaf_Request_Simple::isRouted' => ['bool'], 'Yaf_Request_Simple::isXmlHttpRequest' => ['void'], 'Yaf_Request_Simple::setActionName' => ['Yaf_Request_Abstract|bool', 'action' => 'string'], 'Yaf_Request_Simple::setBaseUri' => ['bool', 'uri' => 'string'], 'Yaf_Request_Simple::setControllerName' => ['Yaf_Request_Abstract|bool', 'controller' => 'string'], 'Yaf_Request_Simple::setDispatched' => ['bool'], 'Yaf_Request_Simple::setModuleName' => ['Yaf_Request_Abstract|bool', 'module' => 'string'], 'Yaf_Request_Simple::setParam' => ['Yaf_Request_Abstract|bool', 'name' => 'array|string', 'value=' => 'string'], 'Yaf_Request_Simple::setRequestUri' => ['', 'uri' => 'string'], 'Yaf_Request_Simple::setRouted' => ['Yaf_Request_Abstract|bool'], 'Yaf_Response_Abstract::__clone' => ['void'], 'Yaf_Response_Abstract::__construct' => ['void'], 'Yaf_Response_Abstract::__destruct' => ['void'], 'Yaf_Response_Abstract::__toString' => ['string'], 'Yaf_Response_Abstract::appendBody' => ['bool', 'content' => 'string', 'key=' => 'string'], 'Yaf_Response_Abstract::clearBody' => ['bool', 'key=' => 'string'], 'Yaf_Response_Abstract::clearHeaders' => ['void'], 'Yaf_Response_Abstract::getBody' => ['mixed', 'key=' => 'string'], 'Yaf_Response_Abstract::getHeader' => ['void'], 'Yaf_Response_Abstract::prependBody' => ['bool', 'content' => 'string', 'key=' => 'string'], 'Yaf_Response_Abstract::response' => ['void'], 'Yaf_Response_Abstract::setAllHeaders' => ['void'], 'Yaf_Response_Abstract::setBody' => ['bool', 'content' => 'string', 'key=' => 'string'], 'Yaf_Response_Abstract::setHeader' => ['void'], 'Yaf_Response_Abstract::setRedirect' => ['void'], 'Yaf_Response_Cli::__clone' => [''], 'Yaf_Response_Cli::__construct' => ['void'], 'Yaf_Response_Cli::__destruct' => [''], 'Yaf_Response_Cli::__toString' => ['string'], 'Yaf_Response_Cli::appendBody' => ['bool', 'content' => 'string', 'key=' => 'string'], 'Yaf_Response_Cli::clearBody' => ['bool', 'key=' => 'string'], 'Yaf_Response_Cli::getBody' => ['mixed', 'key=' => 'null|string'], 'Yaf_Response_Cli::prependBody' => ['bool', 'content' => 'string', 'key=' => 'string'], 'Yaf_Response_Cli::setBody' => ['bool', 'content' => 'string', 'key=' => 'string'], 'Yaf_Response_Http::__clone' => [''], 'Yaf_Response_Http::__construct' => ['void'], 'Yaf_Response_Http::__destruct' => [''], 'Yaf_Response_Http::__toString' => ['string'], 'Yaf_Response_Http::appendBody' => ['bool', 'content' => 'string', 'key=' => 'string'], 'Yaf_Response_Http::clearBody' => ['bool', 'key=' => 'string'], 'Yaf_Response_Http::clearHeaders' => ['Yaf_Response_Abstract|false', 'name=' => 'string'], 'Yaf_Response_Http::getBody' => ['mixed', 'key=' => 'null|string'], 'Yaf_Response_Http::getHeader' => ['mixed', 'name=' => 'string'], 'Yaf_Response_Http::prependBody' => ['bool', 'content' => 'string', 'key=' => 'string'], 'Yaf_Response_Http::response' => ['bool'], 'Yaf_Response_Http::setAllHeaders' => ['bool', 'headers' => 'array'], 'Yaf_Response_Http::setBody' => ['bool', 'content' => 'string', 'key=' => 'string'], 'Yaf_Response_Http::setHeader' => ['bool', 'name' => 'string', 'value' => 'string', 'replace=' => 'bool|false', 'response_code=' => 'int'], 'Yaf_Response_Http::setRedirect' => ['bool', 'url' => 'string'], 'Yaf_Route_Interface::__construct' => ['void'], 'Yaf_Route_Interface::assemble' => ['string', 'info' => 'array', 'query=' => 'array'], 'Yaf_Route_Interface::route' => ['bool', 'request' => 'Yaf_Request_Abstract'], 'Yaf_Route_Map::__construct' => ['void', 'controller_prefer=' => 'string', 'delimiter=' => 'string'], 'Yaf_Route_Map::assemble' => ['string', 'info' => 'array', 'query=' => 'array'], 'Yaf_Route_Map::route' => ['bool', 'request' => 'Yaf_Request_Abstract'], 'Yaf_Route_Regex::__construct' => ['void', 'match' => 'string', 'route' => 'array', 'map=' => 'array', 'verify=' => 'array', 'reverse=' => 'string'], 'Yaf_Route_Regex::addConfig' => ['Yaf_Router|bool', 'config' => 'Yaf_Config_Abstract'], 'Yaf_Route_Regex::addRoute' => ['Yaf_Router|bool', 'name' => 'string', 'route' => 'Yaf_Route_Interface'], 'Yaf_Route_Regex::assemble' => ['string', 'info' => 'array', 'query=' => 'array'], 'Yaf_Route_Regex::getCurrentRoute' => ['string'], 'Yaf_Route_Regex::getRoute' => ['Yaf_Route_Interface', 'name' => 'string'], 'Yaf_Route_Regex::getRoutes' => ['Yaf_Route_Interface[]'], 'Yaf_Route_Regex::route' => ['bool', 'request' => 'Yaf_Request_Abstract'], 'Yaf_Route_Rewrite::__construct' => ['void', 'match' => 'string', 'route' => 'array', 'verify=' => 'array'], 'Yaf_Route_Rewrite::addConfig' => ['Yaf_Router|bool', 'config' => 'Yaf_Config_Abstract'], 'Yaf_Route_Rewrite::addRoute' => ['Yaf_Router|bool', 'name' => 'string', 'route' => 'Yaf_Route_Interface'], 'Yaf_Route_Rewrite::assemble' => ['string', 'info' => 'array', 'query=' => 'array'], 'Yaf_Route_Rewrite::getCurrentRoute' => ['string'], 'Yaf_Route_Rewrite::getRoute' => ['Yaf_Route_Interface', 'name' => 'string'], 'Yaf_Route_Rewrite::getRoutes' => ['Yaf_Route_Interface[]'], 'Yaf_Route_Rewrite::route' => ['bool', 'request' => 'Yaf_Request_Abstract'], 'Yaf_Route_Simple::__construct' => ['void', 'module_name' => 'string', 'controller_name' => 'string', 'action_name' => 'string'], 'Yaf_Route_Simple::assemble' => ['string', 'info' => 'array', 'query=' => 'array'], 'Yaf_Route_Simple::route' => ['bool', 'request' => 'Yaf_Request_Abstract'], 'Yaf_Route_Static::assemble' => ['string', 'info' => 'array', 'query=' => 'array'], 'Yaf_Route_Static::match' => ['void', 'uri' => 'string'], 'Yaf_Route_Static::route' => ['bool', 'request' => 'Yaf_Request_Abstract'], 'Yaf_Route_Supervar::__construct' => ['void', 'supervar_name' => 'string'], 'Yaf_Route_Supervar::assemble' => ['string', 'info' => 'array', 'query=' => 'array'], 'Yaf_Route_Supervar::route' => ['bool', 'request' => 'Yaf_Request_Abstract'], 'Yaf_Router::__construct' => ['void'], 'Yaf_Router::addConfig' => ['bool', 'config' => 'Yaf_Config_Abstract'], 'Yaf_Router::addRoute' => ['bool', 'name' => 'string', 'route' => 'Yaf_Route_Abstract'], 'Yaf_Router::getCurrentRoute' => ['string'], 'Yaf_Router::getRoute' => ['Yaf_Route_Interface', 'name' => 'string'], 'Yaf_Router::getRoutes' => ['mixed'], 'Yaf_Router::route' => ['bool', 'request' => 'Yaf_Request_Abstract'], 'Yaf_Session::__clone' => ['void'], 'Yaf_Session::__construct' => ['void'], 'Yaf_Session::__get' => ['void', 'name' => 'string'], 'Yaf_Session::__isset' => ['void', 'name' => 'string'], 'Yaf_Session::__set' => ['void', 'name' => 'string', 'value' => 'string'], 'Yaf_Session::__sleep' => ['void'], 'Yaf_Session::__unset' => ['void', 'name' => 'string'], 'Yaf_Session::__wakeup' => ['void'], 'Yaf_Session::count' => ['void'], 'Yaf_Session::current' => ['void'], 'Yaf_Session::del' => ['void', 'name' => 'string'], 'Yaf_Session::get' => ['mixed', 'name' => 'string'], 'Yaf_Session::getInstance' => ['void'], 'Yaf_Session::has' => ['void', 'name' => 'string'], 'Yaf_Session::key' => ['void'], 'Yaf_Session::next' => ['void'], 'Yaf_Session::offsetExists' => ['void', 'name' => 'string'], 'Yaf_Session::offsetGet' => ['void', 'name' => 'string'], 'Yaf_Session::offsetSet' => ['void', 'name' => 'string', 'value' => 'string'], 'Yaf_Session::offsetUnset' => ['void', 'name' => 'string'], 'Yaf_Session::rewind' => ['void'], 'Yaf_Session::set' => ['Yaf_Session|bool', 'name' => 'string', 'value' => 'mixed'], 'Yaf_Session::start' => ['void'], 'Yaf_Session::valid' => ['void'], 'Yaf_View_Interface::assign' => ['bool', 'name' => 'string', 'value=' => 'string'], 'Yaf_View_Interface::display' => ['bool', 'tpl' => 'string', 'tpl_vars=' => 'array'], 'Yaf_View_Interface::getScriptPath' => ['void'], 'Yaf_View_Interface::render' => ['string', 'tpl' => 'string', 'tpl_vars=' => 'array'], 'Yaf_View_Interface::setScriptPath' => ['void', 'template_dir' => 'string'], 'Yaf_View_Simple::__construct' => ['void', 'tempalte_dir' => 'string', 'options=' => 'array'], 'Yaf_View_Simple::__get' => ['void', 'name=' => 'string'], 'Yaf_View_Simple::__isset' => ['void', 'name' => 'string'], 'Yaf_View_Simple::__set' => ['void', 'name' => 'string', 'value' => 'mixed'], 'Yaf_View_Simple::assign' => ['bool', 'name' => 'string', 'value=' => 'mixed'], 'Yaf_View_Simple::assignRef' => ['bool', 'name' => 'string', '&rw_value' => 'mixed'], 'Yaf_View_Simple::clear' => ['bool', 'name=' => 'string'], 'Yaf_View_Simple::display' => ['bool', 'tpl' => 'string', 'tpl_vars=' => 'array'], 'Yaf_View_Simple::eval' => ['string', 'tpl_content' => 'string', 'tpl_vars=' => 'array'], 'Yaf_View_Simple::getScriptPath' => ['string'], 'Yaf_View_Simple::render' => ['string', 'tpl' => 'string', 'tpl_vars=' => 'array'], 'Yaf_View_Simple::setScriptPath' => ['bool', 'template_dir' => 'string'], 'yaml_emit' => ['string', 'data' => 'mixed', 'encoding=' => 'int', 'linebreak=' => 'int'], 'yaml_emit_file' => ['bool', 'filename' => 'string', 'data' => 'mixed', 'encoding=' => 'int', 'linebreak=' => 'int'], 'yaml_parse' => ['mixed', 'input' => 'string', 'pos=' => 'int', '&w_ndocs=' => 'int', 'callbacks=' => 'array'], 'yaml_parse_file' => ['mixed', 'filename' => 'string', 'pos=' => 'int', '&w_ndocs=' => 'int', 'callbacks=' => 'array'], 'yaml_parse_url' => ['mixed', 'url' => 'string', 'pos=' => 'int', '&w_ndocs=' => 'int', 'callbacks=' => 'array'], 'Yar_Client::__call' => ['void', 'method' => 'string', 'parameters' => 'array'], 'Yar_Client::__construct' => ['void', 'url' => 'string'], 'Yar_Client::setOpt' => ['bool', 'name' => 'int', 'value' => 'mixed'], 'Yar_Client_Exception::getType' => ['void'], 'Yar_Concurrent_Client::call' => ['int', 'uri' => 'string', 'method' => 'string', 'parameters' => 'array', 'callback=' => 'callable'], 'Yar_Concurrent_Client::loop' => ['bool', 'callback=' => 'callable', 'error_callback=' => 'callable'], 'Yar_Concurrent_Client::reset' => ['bool'], 'Yar_Server::__construct' => ['void', 'obj' => 'Object'], 'Yar_Server::handle' => ['bool'], 'Yar_Server_Exception::getType' => ['string'], 'yaz_addinfo' => ['string', 'id' => 'resource'], 'yaz_ccl_conf' => ['void', 'id' => 'resource', 'config' => 'array'], 'yaz_ccl_parse' => ['bool', 'id' => 'resource', 'query' => 'string', '&w_result' => 'array'], 'yaz_close' => ['bool', 'id' => 'resource'], 'yaz_connect' => ['mixed', 'zurl' => 'string', 'options=' => 'mixed'], 'yaz_database' => ['bool', 'id' => 'resource', 'databases' => 'string'], 'yaz_element' => ['bool', 'id' => 'resource', 'elementset' => 'string'], 'yaz_errno' => ['int', 'id' => 'resource'], 'yaz_error' => ['string', 'id' => 'resource'], 'yaz_es' => ['void', 'id' => 'resource', 'type' => 'string', 'args' => 'array'], 'yaz_es_result' => ['array', 'id' => 'resource'], 'yaz_get_option' => ['string', 'id' => 'resource', 'name' => 'string'], 'yaz_hits' => ['int', 'id' => 'resource', 'searchresult=' => 'array'], 'yaz_itemorder' => ['void', 'id' => 'resource', 'args' => 'array'], 'yaz_present' => ['bool', 'id' => 'resource'], 'yaz_range' => ['void', 'id' => 'resource', 'start' => 'int', 'number' => 'int'], 'yaz_record' => ['string', 'id' => 'resource', 'pos' => 'int', 'type' => 'string'], 'yaz_scan' => ['void', 'id' => 'resource', 'type' => 'string', 'startterm' => 'string', 'flags=' => 'array'], 'yaz_scan_result' => ['array', 'id' => 'resource', 'result=' => 'array'], 'yaz_schema' => ['void', 'id' => 'resource', 'schema' => 'string'], 'yaz_search' => ['bool', 'id' => 'resource', 'type' => 'string', 'query' => 'string'], 'yaz_set_option' => ['', 'id' => '', 'name' => 'string', 'value' => 'string', 'options' => 'array'], 'yaz_sort' => ['void', 'id' => 'resource', 'criteria' => 'string'], 'yaz_syntax' => ['void', 'id' => 'resource', 'syntax' => 'string'], 'yaz_wait' => ['mixed', '&rw_options=' => 'array'], 'yp_all' => ['void', 'domain' => 'string', 'map' => 'string', 'callback' => 'string'], 'yp_cat' => ['array', 'domain' => 'string', 'map' => 'string'], 'yp_err_string' => ['string', 'errorcode' => 'int'], 'yp_errno' => ['int'], 'yp_first' => ['array', 'domain' => 'string', 'map' => 'string'], 'yp_get_default_domain' => ['string'], 'yp_master' => ['string', 'domain' => 'string', 'map' => 'string'], 'yp_match' => ['string', 'domain' => 'string', 'map' => 'string', 'key' => 'string'], 'yp_next' => ['array', 'domain' => 'string', 'map' => 'string', 'key' => 'string'], 'yp_order' => ['int', 'domain' => 'string', 'map' => 'string'], 'zem_get_extension_info_by_id' => [''], 'zem_get_extension_info_by_name' => [''], 'zem_get_extensions_info' => [''], 'zem_get_license_info' => [''], 'zend_current_obfuscation_level' => ['int'], 'zend_disk_cache_clear' => ['bool', 'namespace=' => 'mixed|string'], 'zend_disk_cache_delete' => ['mixed|null', 'key' => ''], 'zend_disk_cache_fetch' => ['mixed|null', 'key' => ''], 'zend_disk_cache_store' => ['bool', 'key' => '', 'value' => '', 'ttl=' => 'int|mixed'], 'zend_get_id' => ['array', 'all_ids=' => 'all_ids|false'], 'zend_is_configuration_changed' => [''], 'zend_loader_current_file' => ['string'], 'zend_loader_enabled' => ['bool'], 'zend_loader_file_encoded' => ['bool'], 'zend_loader_file_licensed' => ['array'], 'zend_loader_install_license' => ['bool', 'license_file' => 'license_file', 'override' => 'override'], 'zend_logo_guid' => ['string'], 'zend_obfuscate_class_name' => ['string', 'class_name' => 'class_name'], 'zend_obfuscate_function_name' => ['string', 'function_name' => 'function_name'], 'zend_optimizer_version' => ['string'], 'zend_runtime_obfuscate' => ['void'], 'zend_send_buffer' => ['bool', 'buffer' => 'buffer', 'mime_type' => 'mime_type', 'custom_headers' => 'custom_headers'], 'zend_send_file' => ['bool', 'filename' => 'filename', 'mime_type' => 'mime_type', 'custom_headers' => 'custom_headers'], 'zend_set_configuration_changed' => [''], 'zend_shm_cache_clear' => ['bool', 'namespace=' => 'mixed|string'], 'zend_shm_cache_delete' => ['mixed|null', 'key' => ''], 'zend_shm_cache_fetch' => ['mixed|null', 'key' => ''], 'zend_shm_cache_store' => ['bool', 'key' => '', 'value' => '', 'ttl=' => 'int|mixed'], 'zend_thread_id' => ['int'], 'zend_version' => ['string'], 'ZendAPI_Job::addJobToQueue' => ['int', 'jobqueue_url' => 'string', 'password' => 'string'], 'ZendAPI_Job::getApplicationID' => [''], 'ZendAPI_Job::getEndTime' => [''], 'ZendAPI_Job::getGlobalVariables' => [''], 'ZendAPI_Job::getHost' => [''], 'ZendAPI_Job::getID' => [''], 'ZendAPI_Job::getInterval' => [''], 'ZendAPI_Job::getJobDependency' => [''], 'ZendAPI_Job::getJobName' => [''], 'ZendAPI_Job::getJobPriority' => [''], 'ZendAPI_Job::getJobStatus' => ['int'], 'ZendAPI_Job::getLastPerformedStatus' => ['int'], 'ZendAPI_Job::getOutput' => ['An'], 'ZendAPI_Job::getPreserved' => [''], 'ZendAPI_Job::getProperties' => ['array'], 'ZendAPI_Job::getScheduledTime' => [''], 'ZendAPI_Job::getScript' => [''], 'ZendAPI_Job::getTimeToNextRepeat' => ['int'], 'ZendAPI_Job::getUserVariables' => [''], 'ZendAPI_Job::setApplicationID' => ['', 'app_id' => ''], 'ZendAPI_Job::setGlobalVariables' => ['', 'vars' => ''], 'ZendAPI_Job::setJobDependency' => ['', 'job_id' => ''], 'ZendAPI_Job::setJobName' => ['', 'name' => ''], 'ZendAPI_Job::setJobPriority' => ['', 'priority' => 'int'], 'ZendAPI_Job::setPreserved' => ['', 'preserved' => ''], 'ZendAPI_Job::setRecurrenceData' => ['', 'interval' => '', 'end_time=' => 'mixed'], 'ZendAPI_Job::setScheduledTime' => ['', 'timestamp' => ''], 'ZendAPI_Job::setScript' => ['', 'script' => ''], 'ZendAPI_Job::setUserVariables' => ['', 'vars' => ''], 'ZendAPI_Job::ZendAPI_Job' => ['Job', 'script' => 'script'], 'ZendAPI_Queue::addJob' => ['int', '&job' => 'Job'], 'ZendAPI_Queue::getAllApplicationIDs' => ['array'], 'ZendAPI_Queue::getAllhosts' => ['array'], 'ZendAPI_Queue::getHistoricJobs' => ['array', 'status' => 'int', 'start_time' => '', 'end_time' => '', 'index' => 'int', 'count' => 'int', '&total' => 'int'], 'ZendAPI_Queue::getJob' => ['Job', 'job_id' => 'int'], 'ZendAPI_Queue::getJobsInQueue' => ['array', 'filter_options=' => 'array', 'max_jobs=' => 'int', 'with_globals_and_output=' => 'bool|false'], 'ZendAPI_Queue::getLastError' => ['string'], 'ZendAPI_Queue::getNumOfJobsInQueue' => ['int', 'filter_options=' => 'array'], 'ZendAPI_Queue::getStatistics' => ['array'], 'ZendAPI_Queue::isScriptExists' => ['bool', 'path' => 'string'], 'ZendAPI_Queue::isSuspend' => ['bool'], 'ZendAPI_Queue::login' => ['bool', 'password' => 'string', 'application_id=' => 'int'], 'ZendAPI_Queue::removeJob' => ['bool', 'job_id' => 'array|int'], 'ZendAPI_Queue::requeueJob' => ['bool', 'job' => 'Job'], 'ZendAPI_Queue::resumeJob' => ['bool', 'job_id' => 'array|int'], 'ZendAPI_Queue::resumeQueue' => ['bool'], 'ZendAPI_Queue::setMaxHistoryTime' => ['bool'], 'ZendAPI_Queue::suspendJob' => ['bool', 'job_id' => 'array|int'], 'ZendAPI_Queue::suspendQueue' => ['bool'], 'ZendAPI_Queue::updateJob' => ['int', '&job' => 'Job'], 'ZendAPI_Queue::zendapi_queue' => ['ZendAPI_Queue', 'queue_url' => 'string'], 'zip_close' => ['void', 'zip' => 'resource'], 'zip_entry_close' => ['bool', 'zip_ent' => 'resource'], 'zip_entry_compressedsize' => ['int', 'zip_entry' => 'resource'], 'zip_entry_compressionmethod' => ['string', 'zip_entry' => 'resource'], 'zip_entry_filesize' => ['int', 'zip_entry' => 'resource'], 'zip_entry_name' => ['string', 'zip_entry' => 'resource'], 'zip_entry_open' => ['bool', 'zip_dp' => 'resource', 'zip_entry' => 'resource', 'mode=' => 'string'], 'zip_entry_read' => ['string', 'zip_entry' => 'resource', 'len=' => 'int'], 'zip_open' => ['resource', 'filename' => 'string'], 'zip_read' => ['resource', 'zip' => 'resource'], 'ZipArchive::addEmptyDir' => ['bool', 'dirname' => 'string'], 'ZipArchive::addFile' => ['bool', 'filepath' => 'string', 'entryname=' => 'string', 'start=' => 'int', 'length=' => 'int'], 'ZipArchive::addFromString' => ['bool', 'entryname' => 'string', 'content' => 'string'], 'ZipArchive::addGlob' => ['bool', 'pattern' => 'string', 'flags=' => 'int', 'options=' => 'array'], 'ZipArchive::addPattern' => ['bool', 'pattern' => 'string', 'path=' => 'string', 'options=' => 'array'], 'ZipArchive::close' => ['bool'], 'ZipArchive::count' => ['int'], 'ZipArchive::createEmptyDir' => ['bool', 'dirname' => 'string'], 'ZipArchive::deleteIndex' => ['bool', 'index' => 'int'], 'ZipArchive::deleteName' => ['bool', 'name' => 'string'], 'ZipArchive::extractTo' => ['bool', 'pathto' => 'string', 'files=' => 'string[]|string'], 'ZipArchive::getArchiveComment' => ['string', 'flags=' => 'int'], 'ZipArchive::getCommentIndex' => ['string', 'index' => 'int', 'flags=' => 'int'], 'ZipArchive::getCommentName' => ['string', 'name' => 'string', 'flags=' => 'int'], 'ZipArchive::getExternalAttributesIndex' => ['bool', 'index' => 'int', '&w_opsys' => 'int', '&w_attr' => 'int', 'flags=' => 'int'], 'ZipArchive::getExternalAttributesName' => ['bool', 'name' => 'string', '&w_opsys' => 'int', '&w_attr' => 'int', 'flags=' => 'int'], 'ZipArchive::getFromIndex' => ['string|false', 'index' => 'int', 'len=' => 'int', 'flags=' => 'int'], 'ZipArchive::getFromName' => ['string|false', 'entryname' => 'string', 'len=' => 'int', 'flags=' => 'int'], 'ZipArchive::getNameIndex' => ['string|false', 'index' => 'int', 'flags=' => 'int'], 'ZipArchive::getStatusString' => ['string'], 'ZipArchive::getStream' => ['resource|false', 'entryname' => 'string'], 'ZipArchive::locateName' => ['int', 'filename' => 'string', 'flags=' => 'int'], 'ZipArchive::open' => ['mixed', 'source' => 'string', 'flags=' => 'int'], 'ZipArchive::renameIndex' => ['bool', 'index' => 'int', 'new_name' => 'string'], 'ZipArchive::renameName' => ['bool', 'name' => 'string', 'new_name' => 'string'], 'ZipArchive::setArchiveComment' => ['bool', 'comment' => 'string'], 'ZipArchive::setCommentIndex' => ['bool', 'index' => 'int', 'comment' => 'string'], 'ZipArchive::setCommentName' => ['bool', 'name' => 'string', 'comment' => 'string'], 'ZipArchive::setCompressionIndex' => ['bool', 'index' => 'int', 'comp_method' => 'int', 'comp_flags=' => 'int'], 'ZipArchive::setCompressionName' => ['bool', 'name' => 'string', 'comp_method' => 'int', 'comp_flags=' => 'int'], 'ZipArchive::setEncryptionIndex' => ['bool', 'index' => 'int', 'method' => 'string', 'password=' => 'string'], 'ZipArchive::setEncryptionName' => ['bool', 'name' => 'string', 'method' => 'int', 'password=' => 'string'], 'ZipArchive::setExternalAttributesIndex' => ['bool', 'index' => 'int', 'opsys' => 'int', 'attr' => 'int', 'flags=' => 'int'], 'ZipArchive::setExternalAttributesName' => ['bool', 'name' => 'string', 'opsys' => 'int', 'attr' => 'int', 'flags=' => 'int'], 'ZipArchive::setPassword' => ['bool', 'password' => 'string'], 'ZipArchive::statIndex' => ['array|false', 'index' => 'int', 'flags=' => 'int'], 'ZipArchive::statName' => ['array|false', 'filename' => 'string', 'flags=' => 'int'], 'ZipArchive::unchangeAll' => ['bool'], 'ZipArchive::unchangeArchive' => ['bool'], 'ZipArchive::unchangeIndex' => ['bool', 'index' => 'int'], 'ZipArchive::unchangeName' => ['bool', 'name' => 'string'], 'zlib_decode' => ['string', 'data' => 'string', 'max_decoded_len=' => 'int'], 'zlib_encode' => ['string', 'data' => 'string', 'encoding' => 'int', 'level=' => 'string|int'], 'zlib_get_coding_type' => ['string|false'], 'ZMQ::__construct' => ['void'], 'ZMQContext::__construct' => ['void', 'io_threads=' => 'int', 'is_persistent=' => 'bool'], 'ZMQContext::getOpt' => ['mixed', 'key' => 'string'], 'ZMQContext::getSocket' => ['ZMQSocket', 'type' => 'int', 'persistent_id=' => 'string', 'on_new_socket=' => 'callable'], 'ZMQContext::isPersistent' => ['bool'], 'ZMQContext::setOpt' => ['ZMQContext', 'key' => 'int', 'value' => 'mixed'], 'ZMQDevice::__construct' => ['void', 'frontend' => 'ZMQSocket', 'backend' => 'ZMQSocket', 'listener=' => 'ZMQSocket'], 'ZMQDevice::getIdleTimeout' => ['ZMQDevice'], 'ZMQDevice::getTimerTimeout' => ['ZMQDevice'], 'ZMQDevice::run' => ['void'], 'ZMQDevice::setIdleCallback' => ['ZMQDevice', 'cb_func' => 'callable', 'timeout' => 'int', 'user_data=' => 'mixed'], 'ZMQDevice::setIdleTimeout' => ['ZMQDevice', 'timeout' => 'int'], 'ZMQDevice::setTimerCallback' => ['ZMQDevice', 'cb_func' => 'callable', 'timeout' => 'int', 'user_data=' => 'mixed'], 'ZMQDevice::setTimerTimeout' => ['ZMQDevice', 'timeout' => 'int'], 'ZMQPoll::add' => ['string', 'entry' => 'mixed', 'type' => 'int'], 'ZMQPoll::clear' => ['ZMQPoll'], 'ZMQPoll::count' => ['int'], 'ZMQPoll::getLastErrors' => ['array'], 'ZMQPoll::poll' => ['int', '&w_readable' => 'array', '&w_writable' => 'array', 'timeout=' => 'int'], 'ZMQPoll::remove' => ['bool', 'item' => 'mixed'], 'ZMQSocket::__construct' => ['void', 'context' => 'ZMQContext', 'type' => 'int', 'persistent_id=' => 'string', 'on_new_socket=' => 'callable'], 'ZMQSocket::bind' => ['ZMQSocket', 'dsn' => 'string', 'force=' => 'bool'], 'ZMQSocket::connect' => ['ZMQSocket', 'dsn' => 'string', 'force=' => 'bool'], 'ZMQSocket::disconnect' => ['ZMQSocket', 'dsn' => 'string'], 'ZMQSocket::getEndpoints' => ['array'], 'ZMQSocket::getPersistentId' => ['string'], 'ZMQSocket::getSocketType' => ['int'], 'ZMQSocket::getSockOpt' => ['mixed', 'key' => 'string'], 'ZMQSocket::isPersistent' => ['bool'], 'ZMQSocket::recv' => ['string', 'mode=' => 'int'], 'ZMQSocket::recvMulti' => ['string', 'mode=' => 'int'], 'ZMQSocket::send' => ['ZMQSocket', 'message' => 'array', 'mode=' => 'int'], 'ZMQSocket::send\'1' => ['ZMQSocket', 'message' => 'string', 'mode=' => 'int'], 'ZMQSocket::sendmulti' => ['ZMQSocket', 'message' => 'array', 'mode=' => 'int'], 'ZMQSocket::setSockOpt' => ['ZMQSocket', 'key' => 'int', 'value' => 'mixed'], 'ZMQSocket::unbind' => ['ZMQSocket', 'dsn' => 'string'], 'Zookeeper::addAuth' => ['bool', 'scheme' => 'string', 'cert' => 'string', 'completion_cb=' => 'callable'], 'Zookeeper::connect' => ['void', 'host' => 'string', 'watcher_cb=' => 'callable', 'recv_timeout=' => 'int'], 'Zookeeper::create' => ['string', 'path' => 'string', 'value' => 'string', 'acls' => 'array', 'flags=' => 'int'], 'Zookeeper::delete' => ['bool', 'path' => 'string', 'version=' => 'int'], 'Zookeeper::exists' => ['bool', 'path' => 'string', 'watcher_cb=' => 'callable'], 'Zookeeper::get' => ['string', 'path' => 'string', 'watcher_cb=' => 'callable', 'stat=' => 'array', 'max_size=' => 'int'], 'Zookeeper::getAcl' => ['array', 'path' => 'string'], 'Zookeeper::getChildren' => ['array', 'path' => 'string', 'watcher_cb=' => 'callable'], 'Zookeeper::getClientId' => ['int'], 'Zookeeper::getRecvTimeout' => ['int'], 'Zookeeper::getState' => ['int'], 'Zookeeper::isRecoverable' => ['bool'], 'Zookeeper::set' => ['bool', 'path' => 'string', 'value' => 'string', 'version=' => 'int', 'stat=' => 'array'], 'Zookeeper::setAcl' => ['bool', 'path' => 'string', 'version' => 'int', 'acl' => 'array'], 'Zookeeper::setDebugLevel' => ['bool', 'logLevel' => 'int'], 'Zookeeper::setDeterministicConnOrder' => ['bool', 'yesOrNo' => 'bool'], 'Zookeeper::setLogStream' => ['bool', 'stream' => 'resource'], 'Zookeeper::setWatcher' => ['bool', 'watcher_cb' => 'callable'], 'zookeeper_dispatch' => ['void']];
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\SignatureMap;

use PHPStan\Reflection\PassedByReference;
use PHPStan\Type\Type;
class ParameterSignature
{
    /** @var string */
    private $name;
    /** @var bool */
    private $optional;
    /** @var \PHPStan\Type\Type */
    private $type;
    /** @var \PHPStan\Reflection\PassedByReference */
    private $passedByReference;
    /** @var bool */
    private $variadic;
    public function __construct(string $name, bool $optional, \PHPStan\Type\Type $type, \PHPStan\Reflection\PassedByReference $passedByReference, bool $variadic)
    {
        $this->name = $name;
        $this->optional = $optional;
        $this->type = $type;
        $this->passedByReference = $passedByReference;
        $this->variadic = $variadic;
    }
    public function getName() : string
    {
        return $this->name;
    }
    public function isOptional() : bool
    {
        return $this->optional;
    }
    public function getType() : \PHPStan\Type\Type
    {
        return $this->type;
    }
    public function passedByReference() : \PHPStan\Reflection\PassedByReference
    {
        return $this->passedByReference;
    }
    public function isVariadic() : bool
    {
        return $this->variadic;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\SignatureMap;

use PHPStan\Analyser\NameScope;
use PHPStan\PhpDoc\TypeStringResolver;
use PHPStan\Reflection\PassedByReference;
use PHPStan\Type\MixedType;
use PHPStan\Type\ObjectType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
class SignatureMapParser
{
    /** @var \PHPStan\PhpDoc\TypeStringResolver */
    private $typeStringResolver;
    public function __construct(\PHPStan\PhpDoc\TypeStringResolver $typeNodeResolver)
    {
        $this->typeStringResolver = $typeNodeResolver;
    }
    /**
     * @param mixed[] $map
     * @param string|null $className
     * @return \PHPStan\Reflection\SignatureMap\FunctionSignature
     */
    public function getFunctionSignature(array $map, ?string $className) : \PHPStan\Reflection\SignatureMap\FunctionSignature
    {
        $parameterSignatures = $this->getParameters(\array_slice($map, 1));
        $hasVariadic = \false;
        foreach ($parameterSignatures as $parameterSignature) {
            if ($parameterSignature->isVariadic()) {
                $hasVariadic = \true;
                break;
            }
        }
        return new \PHPStan\Reflection\SignatureMap\FunctionSignature($parameterSignatures, $this->getTypeFromString($map[0], $className), $hasVariadic);
    }
    private function getTypeFromString(string $typeString, ?string $className) : \PHPStan\Type\Type
    {
        if ($typeString === '') {
            return new \PHPStan\Type\MixedType(\true);
        }
        $parts = \explode('|', $typeString);
        $types = [];
        foreach ($parts as $part) {
            $isNullable = \false;
            if (\substr($part, 0, 1) === '?') {
                $isNullable = \true;
                $part = \substr($part, 1);
            }
            if ($part === 'OCI-Lob' || $part === 'OCI-Collection') {
                $type = new \PHPStan\Type\ObjectType($part);
            } else {
                $type = $this->typeStringResolver->resolve($part, new \PHPStan\Analyser\NameScope(null, [], $className));
            }
            if ($isNullable) {
                $type = \PHPStan\Type\TypeCombinator::addNull($type);
            }
            $types[] = $type;
        }
        return \PHPStan\Type\TypeCombinator::union(...$types);
    }
    /**
     * @param array<string, string> $parameterMap
     * @return array<int, \PHPStan\Reflection\SignatureMap\ParameterSignature>
     */
    private function getParameters(array $parameterMap) : array
    {
        $parameterSignatures = [];
        foreach ($parameterMap as $parameterName => $typeString) {
            [$name, $isOptional, $passedByReference, $isVariadic] = $this->getParameterInfoFromName($parameterName);
            $parameterSignatures[] = new \PHPStan\Reflection\SignatureMap\ParameterSignature($name, $isOptional, $this->getTypeFromString($typeString, null), $passedByReference, $isVariadic);
        }
        return $parameterSignatures;
    }
    /**
     * @param string $parameterNameString
     * @return mixed[]
     */
    private function getParameterInfoFromName(string $parameterNameString) : array
    {
        $matches = \_HumbugBoxb94336daae36\Nette\Utils\Strings::match($parameterNameString, '#^(?P<reference>&(?:\\.\\.\\.)?r?w?_?)?(?P<variadic>\\.\\.\\.)?(?P<name>[^=]+)?(?P<optional>=)?($)#');
        if ($matches === null || !isset($matches['optional'])) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        $isVariadic = $matches['variadic'] !== '';
        $reference = $matches['reference'];
        if (\strpos($reference, '&...') === 0) {
            $reference = '&' . \substr($reference, 4);
            $isVariadic = \true;
        }
        if (\strpos($reference, '&rw') === 0) {
            $passedByReference = \PHPStan\Reflection\PassedByReference::createReadsArgument();
        } elseif (\strpos($reference, '&w') === 0) {
            $passedByReference = \PHPStan\Reflection\PassedByReference::createCreatesNewVariable();
        } else {
            $passedByReference = \PHPStan\Reflection\PassedByReference::createNo();
        }
        $isOptional = $isVariadic || $matches['optional'] !== '';
        $name = $matches['name'] !== '' ? $matches['name'] : '...';
        return [$name, $isOptional, $passedByReference, $isVariadic];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

use PHPStan\Broker\Broker;
use PHPStan\PhpDoc\ResolvedPhpDocBlock;
use PHPStan\Reflection\Php\PhpClassReflectionExtension;
use PHPStan\Reflection\Php\PhpPropertyReflection;
use PHPStan\Type\FileTypeMapper;
class ClassReflection implements \PHPStan\Reflection\DeprecatableReflection, \PHPStan\Reflection\InternableReflection, \PHPStan\Reflection\FinalizableReflection, \PHPStan\Reflection\ReflectionWithFilename
{
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PHPStan\Type\FileTypeMapper */
    private $fileTypeMapper;
    /** @var \PHPStan\Reflection\PropertiesClassReflectionExtension[] */
    private $propertiesClassReflectionExtensions;
    /** @var \PHPStan\Reflection\MethodsClassReflectionExtension[] */
    private $methodsClassReflectionExtensions;
    /** @var string */
    private $displayName;
    /** @var \ReflectionClass */
    private $reflection;
    /** @var string|null */
    private $anonymousFilename;
    /** @var \PHPStan\Reflection\MethodReflection[] */
    private $methods = [];
    /** @var \PHPStan\Reflection\PropertyReflection[] */
    private $properties = [];
    /** @var \PHPStan\Reflection\ConstantReflection[] */
    private $constants;
    /** @var int[]|null */
    private $classHierarchyDistances;
    /** @var string|null */
    private $deprecatedDescription;
    /** @var bool|null */
    private $isDeprecated;
    /** @var bool|null */
    private $isInternal;
    /** @var bool|null */
    private $isFinal;
    /**
     * @param Broker $broker
     * @param \PHPStan\Type\FileTypeMapper $fileTypeMapper
     * @param \PHPStan\Reflection\PropertiesClassReflectionExtension[] $propertiesClassReflectionExtensions
     * @param \PHPStan\Reflection\MethodsClassReflectionExtension[] $methodsClassReflectionExtensions
     * @param string $displayName
     * @param \ReflectionClass $reflection
     * @param string|null $anonymousFilename
     */
    public function __construct(\PHPStan\Broker\Broker $broker, \PHPStan\Type\FileTypeMapper $fileTypeMapper, array $propertiesClassReflectionExtensions, array $methodsClassReflectionExtensions, string $displayName, \ReflectionClass $reflection, ?string $anonymousFilename)
    {
        $this->broker = $broker;
        $this->fileTypeMapper = $fileTypeMapper;
        $this->propertiesClassReflectionExtensions = $propertiesClassReflectionExtensions;
        $this->methodsClassReflectionExtensions = $methodsClassReflectionExtensions;
        $this->displayName = $displayName;
        $this->reflection = $reflection;
        $this->anonymousFilename = $anonymousFilename;
    }
    public function getNativeReflection() : \ReflectionClass
    {
        return $this->reflection;
    }
    /**
     * @return string|false
     */
    public function getFileName()
    {
        if ($this->anonymousFilename !== null) {
            return $this->anonymousFilename;
        }
        $fileName = $this->reflection->getFileName();
        if ($fileName === \false) {
            return \false;
        }
        if (!\file_exists($fileName)) {
            return \false;
        }
        return $fileName;
    }
    /**
     * @return false|\PHPStan\Reflection\ClassReflection
     */
    public function getParentClass()
    {
        if ($this->reflection->getParentClass() === \false) {
            return \false;
        }
        return $this->broker->getClass($this->reflection->getParentClass()->getName());
    }
    public function getName() : string
    {
        return $this->reflection->getName();
    }
    public function getDisplayName() : string
    {
        return $this->displayName;
    }
    /**
     * @return int[]
     */
    public function getClassHierarchyDistances() : array
    {
        if ($this->classHierarchyDistances === null) {
            $distance = 0;
            $distances = [$this->getName() => $distance];
            $currentClassReflection = $this->getNativeReflection();
            foreach ($this->getNativeReflection()->getTraits() as $trait) {
                $distance++;
                if (\array_key_exists($trait->getName(), $distances)) {
                    continue;
                }
                $distances[$trait->getName()] = $distance;
            }
            while ($currentClassReflection->getParentClass() !== \false) {
                $distance++;
                $parentClassName = $currentClassReflection->getParentClass()->getName();
                if (!\array_key_exists($parentClassName, $distances)) {
                    $distances[$parentClassName] = $distance;
                }
                $currentClassReflection = $currentClassReflection->getParentClass();
                foreach ($currentClassReflection->getTraits() as $trait) {
                    $distance++;
                    if (\array_key_exists($trait->getName(), $distances)) {
                        continue;
                    }
                    $distances[$trait->getName()] = $distance;
                }
            }
            foreach ($this->getNativeReflection()->getInterfaces() as $interface) {
                $distance++;
                if (\array_key_exists($interface->getName(), $distances)) {
                    continue;
                }
                $distances[$interface->getName()] = $distance;
            }
            $this->classHierarchyDistances = $distances;
        }
        return $this->classHierarchyDistances;
    }
    public function hasProperty(string $propertyName) : bool
    {
        foreach ($this->propertiesClassReflectionExtensions as $extension) {
            if ($extension->hasProperty($this, $propertyName)) {
                return \true;
            }
        }
        return \false;
    }
    public function hasMethod(string $methodName) : bool
    {
        foreach ($this->methodsClassReflectionExtensions as $extension) {
            if ($extension->hasMethod($this, $methodName)) {
                return \true;
            }
        }
        return \false;
    }
    public function getMethod(string $methodName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\MethodReflection
    {
        $key = $methodName;
        if ($scope->isInClass()) {
            $key = \sprintf('%s-%s', $key, $scope->getClassReflection()->getName());
        }
        if (!isset($this->methods[$key])) {
            foreach ($this->methodsClassReflectionExtensions as $extension) {
                if (!$extension->hasMethod($this, $methodName)) {
                    continue;
                }
                $method = $extension->getMethod($this, $methodName);
                if ($scope->canCallMethod($method)) {
                    return $this->methods[$key] = $method;
                }
                $this->methods[$key] = $method;
            }
        }
        if (!isset($this->methods[$key])) {
            $filename = $this->getFileName();
            throw new \PHPStan\Reflection\MissingMethodFromReflectionException($this->getName(), $methodName, $filename !== \false ? $filename : null);
        }
        return $this->methods[$key];
    }
    public function hasNativeMethod(string $methodName) : bool
    {
        return $this->getPhpExtension()->hasNativeMethod($this, $methodName);
    }
    public function getNativeMethod(string $methodName) : \PHPStan\Reflection\MethodReflection
    {
        if (!$this->hasNativeMethod($methodName)) {
            $filename = $this->getFileName();
            throw new \PHPStan\Reflection\MissingMethodFromReflectionException($this->getName(), $methodName, $filename !== \false ? $filename : null);
        }
        return $this->getPhpExtension()->getNativeMethod($this, $methodName);
    }
    public function hasConstructor() : bool
    {
        return $this->reflection->getConstructor() !== null;
    }
    public function getConstructor() : \PHPStan\Reflection\MethodReflection
    {
        $constructor = $this->reflection->getConstructor();
        if ($constructor === null) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $this->getNativeMethod($constructor->getName());
    }
    private function getPhpExtension() : \PHPStan\Reflection\Php\PhpClassReflectionExtension
    {
        $extension = $this->methodsClassReflectionExtensions[0];
        if (!$extension instanceof \PHPStan\Reflection\Php\PhpClassReflectionExtension) {
            throw new \PHPStan\ShouldNotHappenException();
        }
        return $extension;
    }
    public function getProperty(string $propertyName, \PHPStan\Reflection\ClassMemberAccessAnswerer $scope) : \PHPStan\Reflection\PropertyReflection
    {
        $key = $propertyName;
        if ($scope->isInClass()) {
            $key = \sprintf('%s-%s', $key, $scope->getClassReflection()->getName());
        }
        if (!isset($this->properties[$key])) {
            foreach ($this->propertiesClassReflectionExtensions as $extension) {
                if (!$extension->hasProperty($this, $propertyName)) {
                    continue;
                }
                $property = $extension->getProperty($this, $propertyName);
                if ($scope->canAccessProperty($property)) {
                    return $this->properties[$key] = $property;
                }
                $this->properties[$key] = $property;
            }
        }
        if (!isset($this->properties[$key])) {
            $filename = $this->getFileName();
            throw new \PHPStan\Reflection\MissingPropertyFromReflectionException($this->getName(), $propertyName, $filename !== \false ? $filename : null);
        }
        return $this->properties[$key];
    }
    public function hasNativeProperty(string $propertyName) : bool
    {
        return $this->getPhpExtension()->hasProperty($this, $propertyName);
    }
    public function getNativeProperty(string $propertyName) : \PHPStan\Reflection\Php\PhpPropertyReflection
    {
        if (!$this->hasNativeProperty($propertyName)) {
            $filename = $this->getFileName();
            throw new \PHPStan\Reflection\MissingPropertyFromReflectionException($this->getName(), $propertyName, $filename !== \false ? $filename : null);
        }
        return $this->getPhpExtension()->getNativeProperty($this, $propertyName);
    }
    public function isAbstract() : bool
    {
        return $this->reflection->isAbstract();
    }
    public function isInterface() : bool
    {
        return $this->reflection->isInterface();
    }
    public function isTrait() : bool
    {
        return $this->reflection->isTrait();
    }
    public function isAnonymous() : bool
    {
        return $this->anonymousFilename !== null;
    }
    public function isSubclassOf(string $className) : bool
    {
        return $this->reflection->isSubclassOf($className);
    }
    /**
     * @return \PHPStan\Reflection\ClassReflection[]
     */
    public function getParents() : array
    {
        $parents = [];
        $parent = $this->getParentClass();
        while ($parent !== \false) {
            $parents[] = $parent;
            $parent = $parent->getParentClass();
        }
        return $parents;
    }
    /**
     * @return \PHPStan\Reflection\ClassReflection[]
     */
    public function getInterfaces() : array
    {
        return \array_map(function (\ReflectionClass $interface) : ClassReflection {
            return $this->broker->getClass($interface->getName());
        }, $this->getNativeReflection()->getInterfaces());
    }
    /**
     * @return \PHPStan\Reflection\ClassReflection[]
     */
    public function getTraits() : array
    {
        return \array_map(function (\ReflectionClass $trait) : ClassReflection {
            return $this->broker->getClass($trait->getName());
        }, $this->getNativeReflection()->getTraits());
    }
    /**
     * @return string[]
     */
    public function getParentClassesNames() : array
    {
        $parentNames = [];
        $currentClassReflection = $this;
        while ($currentClassReflection->getParentClass() !== \false) {
            $parentNames[] = $currentClassReflection->getParentClass()->getName();
            $currentClassReflection = $currentClassReflection->getParentClass();
        }
        return $parentNames;
    }
    public function hasConstant(string $name) : bool
    {
        return $this->getNativeReflection()->hasConstant($name);
    }
    public function getConstant(string $name) : \PHPStan\Reflection\ConstantReflection
    {
        if (!isset($this->constants[$name])) {
            $reflectionConstant = $this->getNativeReflection()->getReflectionConstant($name);
            if ($reflectionConstant === \false) {
                $fileName = $this->getFileName();
                throw new \PHPStan\Reflection\MissingConstantFromReflectionException($this->getName(), $name, $fileName !== \false ? $fileName : null);
            }
            $deprecatedDescription = null;
            $isDeprecated = \false;
            $isInternal = \false;
            if ($reflectionConstant->getDocComment() !== \false && $this->getFileName() !== \false) {
                $docComment = $reflectionConstant->getDocComment();
                $fileName = $this->getFileName();
                $className = $reflectionConstant->getDeclaringClass()->getName();
                $resolvedPhpDoc = $this->fileTypeMapper->getResolvedPhpDoc($fileName, $className, null, $docComment);
                $deprecatedDescription = $resolvedPhpDoc->getDeprecatedTag() !== null ? $resolvedPhpDoc->getDeprecatedTag()->getMessage() : null;
                $isDeprecated = $resolvedPhpDoc->isDeprecated();
                $isInternal = $resolvedPhpDoc->isInternal();
            }
            $this->constants[$name] = new \PHPStan\Reflection\ClassConstantReflection($this->broker->getClass($reflectionConstant->getDeclaringClass()->getName()), $reflectionConstant, $deprecatedDescription, $isDeprecated, $isInternal);
        }
        return $this->constants[$name];
    }
    public function hasTraitUse(string $traitName) : bool
    {
        return \in_array($traitName, $this->getTraitNames(), \true);
    }
    /**
     * @return string[]
     */
    private function getTraitNames() : array
    {
        $class = $this->reflection;
        $traitNames = $class->getTraitNames();
        while ($class->getParentClass() !== \false) {
            $traitNames = \array_values(\array_unique(\array_merge($traitNames, $class->getParentClass()->getTraitNames())));
            $class = $class->getParentClass();
        }
        return $traitNames;
    }
    public function getDeprecatedDescription() : ?string
    {
        if ($this->deprecatedDescription === null && $this->isDeprecated()) {
            $resolvedPhpDoc = $this->getResolvedPhpDoc();
            if ($resolvedPhpDoc !== null && $resolvedPhpDoc->getDeprecatedTag() !== null) {
                $this->deprecatedDescription = $resolvedPhpDoc->getDeprecatedTag()->getMessage();
            }
        }
        return $this->deprecatedDescription;
    }
    public function isDeprecated() : bool
    {
        if ($this->isDeprecated === null) {
            $resolvedPhpDoc = $this->getResolvedPhpDoc();
            $this->isDeprecated = $resolvedPhpDoc !== null && $resolvedPhpDoc->isDeprecated();
        }
        return $this->isDeprecated;
    }
    public function isInternal() : bool
    {
        if ($this->isInternal === null) {
            $resolvedPhpDoc = $this->getResolvedPhpDoc();
            $this->isInternal = $resolvedPhpDoc !== null && $resolvedPhpDoc->isInternal();
        }
        return $this->isInternal;
    }
    public function isFinal() : bool
    {
        if ($this->isFinal === null) {
            $resolvedPhpDoc = $this->getResolvedPhpDoc();
            $this->isFinal = $this->reflection->isFinal() || $resolvedPhpDoc !== null && $resolvedPhpDoc->isFinal();
        }
        return $this->isFinal;
    }
    private function getResolvedPhpDoc() : ?\PHPStan\PhpDoc\ResolvedPhpDocBlock
    {
        $fileName = $this->reflection->getFileName();
        if ($fileName === \false) {
            return null;
        }
        $docComment = $this->reflection->getDocComment();
        if ($docComment === \false) {
            return null;
        }
        return $this->fileTypeMapper->getResolvedPhpDoc($fileName, $this->getName(), null, $docComment);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Native;

use PHPStan\Type\Type;
class NativeFunctionReflection implements \PHPStan\Reflection\FunctionReflection
{
    /** @var string */
    private $name;
    /** @var \PHPStan\Reflection\ParametersAcceptor[] */
    private $variants;
    /** @var \PHPStan\Type\Type|null */
    private $throwType;
    /**
     * @param string $name
     * @param \PHPStan\Reflection\ParametersAcceptor[] $variants
     * @param \PHPStan\Type\Type|null $throwType
     */
    public function __construct(string $name, array $variants, ?\PHPStan\Type\Type $throwType)
    {
        $this->name = $name;
        $this->variants = $variants;
        $this->throwType = $throwType;
    }
    public function getName() : string
    {
        return $this->name;
    }
    /**
     * @return \PHPStan\Reflection\ParametersAcceptor[]
     */
    public function getVariants() : array
    {
        return $this->variants;
    }
    public function getThrowType() : ?\PHPStan\Type\Type
    {
        return $this->throwType;
    }
    public function getDeprecatedDescription() : ?string
    {
        return null;
    }
    public function isDeprecated() : bool
    {
        return \false;
    }
    public function isInternal() : bool
    {
        return \false;
    }
    public function isFinal() : bool
    {
        return \false;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Native;

use PHPStan\Reflection\ParameterReflection;
use PHPStan\Reflection\PassedByReference;
use PHPStan\Type\ArrayType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\Type;
class NativeParameterReflection implements \PHPStan\Reflection\ParameterReflection
{
    /** @var string */
    private $name;
    /** @var bool */
    private $optional;
    /** @var \PHPStan\Type\Type */
    private $type;
    /** @var \PHPStan\Reflection\PassedByReference */
    private $passedByReference;
    /** @var bool */
    private $variadic;
    public function __construct(string $name, bool $optional, \PHPStan\Type\Type $type, \PHPStan\Reflection\PassedByReference $passedByReference, bool $variadic)
    {
        $this->name = $name;
        $this->optional = $optional;
        $this->type = $type;
        $this->passedByReference = $passedByReference;
        $this->variadic = $variadic;
    }
    public function getName() : string
    {
        return $this->name;
    }
    public function isOptional() : bool
    {
        return $this->optional;
    }
    public function getType() : \PHPStan\Type\Type
    {
        $type = $this->type;
        if ($this->variadic) {
            $type = new \PHPStan\Type\ArrayType(new \PHPStan\Type\IntegerType(), $type);
        }
        return $type;
    }
    public function passedByReference() : \PHPStan\Reflection\PassedByReference
    {
        return $this->passedByReference;
    }
    public function isVariadic() : bool
    {
        return $this->variadic;
    }
    /**
     * @param mixed[] $properties
     * @return self
     */
    public static function __set_state(array $properties) : self
    {
        return new self($properties['name'], $properties['optional'], $properties['type'], $properties['passedByReference'], $properties['variadic']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Native;

use PHPStan\Broker\Broker;
use PHPStan\Reflection\ClassMemberReflection;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\DeprecatableReflection;
use PHPStan\Reflection\FinalizableReflection;
use PHPStan\Reflection\InternableReflection;
use PHPStan\Reflection\MethodPrototypeReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\Php\BuiltinMethodReflection;
class NativeMethodReflection implements \PHPStan\Reflection\MethodReflection, \PHPStan\Reflection\DeprecatableReflection, \PHPStan\Reflection\InternableReflection, \PHPStan\Reflection\FinalizableReflection
{
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PHPStan\Reflection\ClassReflection */
    private $declaringClass;
    /** @var BuiltinMethodReflection */
    private $reflection;
    /** @var \PHPStan\Reflection\ParametersAcceptor[] */
    private $variants;
    /**
     * @param \PHPStan\Broker\Broker $broker
     * @param \PHPStan\Reflection\ClassReflection $declaringClass
     * @param BuiltinMethodReflection $reflection
     * @param \PHPStan\Reflection\ParametersAcceptor[] $variants
     */
    public function __construct(\PHPStan\Broker\Broker $broker, \PHPStan\Reflection\ClassReflection $declaringClass, \PHPStan\Reflection\Php\BuiltinMethodReflection $reflection, array $variants)
    {
        $this->broker = $broker;
        $this->declaringClass = $declaringClass;
        $this->reflection = $reflection;
        $this->variants = $variants;
    }
    public function getDeclaringClass() : \PHPStan\Reflection\ClassReflection
    {
        return $this->declaringClass;
    }
    public function isStatic() : bool
    {
        return $this->reflection->isStatic();
    }
    public function isPrivate() : bool
    {
        return $this->reflection->isPrivate();
    }
    public function isPublic() : bool
    {
        return $this->reflection->isPublic();
    }
    public function getPrototype() : \PHPStan\Reflection\ClassMemberReflection
    {
        try {
            $prototypeMethod = $this->reflection->getPrototype();
            $prototypeDeclaringClass = $this->broker->getClass($prototypeMethod->getDeclaringClass()->getName());
            return new \PHPStan\Reflection\MethodPrototypeReflection($prototypeDeclaringClass, $prototypeMethod->isStatic(), $prototypeMethod->isPrivate(), $prototypeMethod->isPublic());
        } catch (\ReflectionException $e) {
            return $this;
        }
    }
    public function getName() : string
    {
        return $this->reflection->getName();
    }
    /**
     * @return \PHPStan\Reflection\ParametersAcceptor[]
     */
    public function getVariants() : array
    {
        return $this->variants;
    }
    public function getDeprecatedDescription() : ?string
    {
        return null;
    }
    public function isDeprecated() : bool
    {
        return $this->reflection->isDeprecated();
    }
    public function isInternal() : bool
    {
        return \false;
    }
    public function isFinal() : bool
    {
        return \false;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

class MissingMethodFromReflectionException extends \PHPStan\AnalysedCodeException
{
    public function __construct(string $className, string $methodName, ?string $currentFilename)
    {
        parent::__construct(\sprintf('Method %s() was not found in reflection of class %s - probably the wrong version of class is autoloaded.%s', $methodName, $className, $currentFilename !== null ? \sprintf(' The currently loaded version is at: %s', $currentFilename) : ''));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\PhpDefect;

use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\PropertyReflection;
use PHPStan\Type\Type;
class PhpDefectPropertyReflection implements \PHPStan\Reflection\PropertyReflection
{
    /** @var \PHPStan\Reflection\ClassReflection */
    private $declaringClass;
    /** @var \PHPStan\Type\Type */
    private $type;
    public function __construct(\PHPStan\Reflection\ClassReflection $declaringClass, \PHPStan\Type\Type $type)
    {
        $this->declaringClass = $declaringClass;
        $this->type = $type;
    }
    public function getDeclaringClass() : \PHPStan\Reflection\ClassReflection
    {
        return $this->declaringClass;
    }
    public function isStatic() : bool
    {
        return \false;
    }
    public function isPrivate() : bool
    {
        return \false;
    }
    public function isPublic() : bool
    {
        return \true;
    }
    public function getType() : \PHPStan\Type\Type
    {
        return $this->type;
    }
    public function isReadable() : bool
    {
        return \true;
    }
    public function isWritable() : bool
    {
        return \true;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\PhpDefect;

use PHPStan\PhpDoc\TypeStringResolver;
use PHPStan\Reflection\Annotations\AnnotationsPropertiesClassReflectionExtension;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\PropertiesClassReflectionExtension;
use PHPStan\Reflection\PropertyReflection;
class PhpDefectClassReflectionExtension implements \PHPStan\Reflection\PropertiesClassReflectionExtension
{
    /** @var array<string, array<string, string>> */
    private static $defaultProperties = [\DateInterval::class => ['y' => 'int', 'm' => 'int', 'd' => 'int', 'h' => 'int', 'i' => 'int', 's' => 'int', 'invert' => 'int', 'days' => 'mixed', 'f' => 'float'], \DatePeriod::class => ['recurrences' => 'int', 'include_start_date' => 'bool', 'start' => \DateTimeInterface::class, 'current' => \DateTimeInterface::class, 'end' => \DateTimeInterface::class, 'interval' => \DateInterval::class], 'Directory' => ['handle' => 'resource', 'path' => 'string'], 'DOMAttr' => [
        // extends DOMNode
        'name' => 'string',
        'ownerDocument' => 'DOMDocument',
        'ownerElement' => 'DOMElement',
        'schemaTypeInfo' => 'bool',
        'specified' => 'bool',
        'value' => 'string',
    ], 'DOMCharacterData' => [
        // extends DOMNode
        'data' => 'string',
        'length' => 'int',
        'ownerDocument' => 'DOMDocument',
    ], 'DOMDocument' => ['actualEncoding' => 'string', 'config' => 'DOMConfiguration', 'doctype' => 'DOMDocumentType', 'documentElement' => 'DOMElement|null', 'documentURI' => 'string', 'encoding' => 'string', 'formatOutput' => 'bool', 'implementation' => 'DOMImplementation', 'ownerDocument' => 'null', 'preserveWhiteSpace' => 'bool', 'recover' => 'bool', 'resolveExternals' => 'bool', 'standalone' => 'bool', 'strictErrorChecking' => 'bool', 'substituteEntities' => 'bool', 'validateOnParse' => 'bool', 'version' => 'string', 'xmlEncoding' => 'string', 'xmlStandalone' => 'bool', 'xmlVersion' => 'string'], 'DOMDocumentType' => [
        // extends DOMNode
        'publicId' => 'string',
        'systemId' => 'string',
        'name' => 'string',
        'entities' => 'DOMNamedNodeMap',
        'notations' => 'DOMNamedNodeMap',
        'ownerDocument' => 'DOMDocument',
        'internalSubset' => 'string',
    ], 'DOMElement' => [
        // extends DOMNode
        'ownerDocument' => 'DOMDocument',
        'schemaTypeInfo' => 'bool',
        'tagName' => 'string',
    ], 'DOMEntity' => [
        // extends DOMNode
        'publicId' => 'string',
        'systemId' => 'string',
        'notationName' => 'string',
        'actualEncoding' => 'string',
        'encoding' => 'string',
        'ownerDocument' => 'DOMDocument',
        'version' => 'string',
    ], 'DOMNamedNodeMap' => ['length' => 'int'], 'DOMNode' => ['nodeName' => 'string', 'nodeValue' => 'string', 'nodeType' => 'int', 'parentNode' => 'DOMNode', 'childNodes' => 'DOMNodeList', 'firstChild' => 'DOMNode', 'lastChild' => 'DOMNode', 'previousSibling' => 'DOMNode', 'nextSibling' => 'DOMNode', 'attributes' => 'DOMNamedNodeMap', 'ownerDocument' => 'DOMDocument|null', 'namespaceURI' => 'string', 'prefix' => 'string', 'localName' => 'string', 'baseURI' => 'string', 'textContent' => 'string'], 'DOMNodeList' => ['length' => 'int'], 'DOMNotation' => [
        // extends DOMNode
        'ownerDocument' => 'DOMDocument',
        'publicId' => 'string',
        'systemId' => 'string',
    ], 'DOMProcessingInstruction' => [
        // extends DOMNode
        'ownerDocument' => 'DOMDocument',
        'target' => 'string',
        'data' => 'string',
    ], 'DOMText' => [
        // extends DOMCharacterData
        'wholeText' => 'string',
    ], 'DOMXPath' => [
        // extends DOMCharacterData
        'document' => 'DOMDocument',
    ], '_HumbugBoxb94336daae36\\Ds\\Pair' => ['key' => 'mixed', 'value' => 'mixed'], 'XMLReader' => ['attributeCount' => 'int', 'baseURI' => 'string', 'depth' => 'int', 'hasAttributes' => 'bool', 'hasValue' => 'bool', 'isDefault' => 'bool', 'isEmptyElement' => 'bool', 'localName' => 'string', 'name' => 'string', 'namespaceURI' => 'string', 'nodeType' => 'int', 'prefix' => 'string', 'value' => 'string', 'xmlLang' => 'string'], 'ZipArchive' => ['status' => 'int', 'statusSys' => 'int', 'numFiles' => 'int', 'filename' => 'string', 'comment' => 'string'], 'LibXMLError' => ['level' => 'int', 'code' => 'int', 'column' => 'int', 'message' => 'string', 'file' => 'string', 'line' => 'int']];
    /** @var \PHPStan\Reflection\Annotations\AnnotationsPropertiesClassReflectionExtension */
    private $annotationsPropertiesClassReflectionExtension;
    /** @var TypeStringResolver */
    private $typeStringResolver;
    /** @var string[][] */
    private $properties = [];
    public function __construct(\PHPStan\PhpDoc\TypeStringResolver $typeStringResolver, \PHPStan\Reflection\Annotations\AnnotationsPropertiesClassReflectionExtension $annotationsPropertiesClassReflectionExtension)
    {
        $this->typeStringResolver = $typeStringResolver;
        $this->properties = self::$defaultProperties;
        $this->annotationsPropertiesClassReflectionExtension = $annotationsPropertiesClassReflectionExtension;
    }
    public function hasProperty(\PHPStan\Reflection\ClassReflection $classReflection, string $propertyName) : bool
    {
        $classWithProperties = $this->getClassWithProperties($classReflection, $propertyName);
        return $classWithProperties !== null;
    }
    public function getProperty(\PHPStan\Reflection\ClassReflection $classReflection, string $propertyName) : \PHPStan\Reflection\PropertyReflection
    {
        /** @var \PHPStan\Reflection\ClassReflection $classWithProperties */
        $classWithProperties = $this->getClassWithProperties($classReflection, $propertyName);
        if ($this->annotationsPropertiesClassReflectionExtension->hasProperty($classReflection, $propertyName)) {
            $hierarchyDistances = $classReflection->getClassHierarchyDistances();
            $annotationProperty = $this->annotationsPropertiesClassReflectionExtension->getProperty($classReflection, $propertyName);
            if (!isset($hierarchyDistances[$annotationProperty->getDeclaringClass()->getName()])) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            if (!isset($hierarchyDistances[$classWithProperties->getName()])) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            if ($hierarchyDistances[$annotationProperty->getDeclaringClass()->getName()] < $hierarchyDistances[$classWithProperties->getName()]) {
                return $annotationProperty;
            }
        }
        $typeString = $this->properties[$classWithProperties->getName()][$propertyName];
        return new \PHPStan\Reflection\PhpDefect\PhpDefectPropertyReflection($classWithProperties, $this->typeStringResolver->resolve($typeString));
    }
    private function getClassWithProperties(\PHPStan\Reflection\ClassReflection $classReflection, string $propertyName) : ?\PHPStan\Reflection\ClassReflection
    {
        if (isset($this->properties[$classReflection->getName()][$propertyName])) {
            return $classReflection;
        }
        foreach ($classReflection->getParents() as $parentClass) {
            if (isset($this->properties[$parentClass->getName()][$propertyName])) {
                return $parentClass;
            }
        }
        return null;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

interface ConstantReflection extends \PHPStan\Reflection\ClassMemberReflection
{
    public function getName() : string;
    /**
     * @return mixed
     */
    public function getValue();
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

use PHPStan\Broker\Broker;
interface BrokerAwareExtension
{
    public function setBroker(\PHPStan\Broker\Broker $broker) : void;
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

interface ClassMemberAccessAnswerer
{
    public function isInClass() : bool;
    public function getClassReflection() : ?\PHPStan\Reflection\ClassReflection;
    public function canAccessProperty(\PHPStan\Reflection\PropertyReflection $propertyReflection) : bool;
    public function canCallMethod(\PHPStan\Reflection\MethodReflection $methodReflection) : bool;
    public function canAccessConstant(\PHPStan\Reflection\ConstantReflection $constantReflection) : bool;
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

interface FunctionReflection extends \PHPStan\Reflection\DeprecatableReflection, \PHPStan\Reflection\InternableReflection, \PHPStan\Reflection\FinalizableReflection, \PHPStan\Reflection\ThrowableReflection
{
    public function getName() : string;
    /**
     * @return \PHPStan\Reflection\ParametersAcceptor[]
     */
    public function getVariants() : array;
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

interface MethodReflection extends \PHPStan\Reflection\ClassMemberReflection
{
    public function getName() : string;
    public function getPrototype() : \PHPStan\Reflection\ClassMemberReflection;
    /**
     * @return \PHPStan\Reflection\ParametersAcceptor[]
     */
    public function getVariants() : array;
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

interface MethodsClassReflectionExtension
{
    public function hasMethod(\PHPStan\Reflection\ClassReflection $classReflection, string $methodName) : bool;
    public function getMethod(\PHPStan\Reflection\ClassReflection $classReflection, string $methodName) : \PHPStan\Reflection\MethodReflection;
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Php;

use PhpParser\Node\Stmt\Function_;
use PHPStan\Cache\Cache;
use PHPStan\Parser\FunctionCallStatementFinder;
use PHPStan\Parser\Parser;
use PHPStan\Reflection\FunctionReflection;
use PHPStan\Reflection\FunctionVariantWithPhpDocs;
use PHPStan\Reflection\ParametersAcceptor;
use PHPStan\Reflection\ParametersAcceptorWithPhpDocs;
use PHPStan\Reflection\ReflectionWithFilename;
use PHPStan\Type\IntegerType;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypehintHelper;
class PhpFunctionReflection implements \PHPStan\Reflection\FunctionReflection, \PHPStan\Reflection\ReflectionWithFilename
{
    /** @var \ReflectionFunction */
    private $reflection;
    /** @var \PHPStan\Parser\Parser */
    private $parser;
    /** @var \PHPStan\Parser\FunctionCallStatementFinder */
    private $functionCallStatementFinder;
    /** @var \PHPStan\Cache\Cache */
    private $cache;
    /** @var \PHPStan\Type\Type[] */
    private $phpDocParameterTypes;
    /** @var \PHPStan\Type\Type|null */
    private $phpDocReturnType;
    /** @var \PHPStan\Type\Type|null */
    private $phpDocThrowType;
    /** @var string|null  */
    private $deprecatedDescription;
    /** @var bool */
    private $isDeprecated;
    /** @var bool */
    private $isInternal;
    /** @var bool */
    private $isFinal;
    /** @var string|false */
    private $filename;
    /** @var FunctionVariantWithPhpDocs[]|null */
    private $variants;
    /**
     * @param \ReflectionFunction $reflection
     * @param Parser $parser
     * @param FunctionCallStatementFinder $functionCallStatementFinder
     * @param Cache $cache
     * @param \PHPStan\Type\Type[] $phpDocParameterTypes
     * @param Type|null $phpDocReturnType
     * @param Type|null $phpDocThrowType
     * @param string|null $deprecatedDescription
     * @param bool $isDeprecated
     * @param bool $isInternal
     * @param bool $isFinal
     * @param string|false $filename
     */
    public function __construct(\ReflectionFunction $reflection, \PHPStan\Parser\Parser $parser, \PHPStan\Parser\FunctionCallStatementFinder $functionCallStatementFinder, \PHPStan\Cache\Cache $cache, array $phpDocParameterTypes, ?\PHPStan\Type\Type $phpDocReturnType, ?\PHPStan\Type\Type $phpDocThrowType, ?string $deprecatedDescription, bool $isDeprecated, bool $isInternal, bool $isFinal, $filename)
    {
        $this->reflection = $reflection;
        $this->parser = $parser;
        $this->functionCallStatementFinder = $functionCallStatementFinder;
        $this->cache = $cache;
        $this->phpDocParameterTypes = $phpDocParameterTypes;
        $this->phpDocReturnType = $phpDocReturnType;
        $this->phpDocThrowType = $phpDocThrowType;
        $this->isDeprecated = $isDeprecated;
        $this->deprecatedDescription = $deprecatedDescription;
        $this->isInternal = $isInternal;
        $this->isFinal = $isFinal;
        $this->filename = $filename;
    }
    public function getName() : string
    {
        return $this->reflection->getName();
    }
    /**
     * @return string|false
     */
    public function getFileName()
    {
        return $this->filename;
    }
    /**
     * @return ParametersAcceptorWithPhpDocs[]
     */
    public function getVariants() : array
    {
        if ($this->variants === null) {
            $this->variants = [new \PHPStan\Reflection\FunctionVariantWithPhpDocs($this->getParameters(), $this->isVariadic(), $this->getReturnType(), $this->getPhpDocReturnType(), $this->getNativeReturnType())];
        }
        return $this->variants;
    }
    /**
     * @return \PHPStan\Reflection\ParameterReflectionWithPhpDocs[]
     */
    private function getParameters() : array
    {
        return \array_map(function (\ReflectionParameter $reflection) : PhpParameterReflection {
            return new \PHPStan\Reflection\Php\PhpParameterReflection($reflection, $this->phpDocParameterTypes[$reflection->getName()] ?? null);
        }, $this->reflection->getParameters());
    }
    private function isVariadic() : bool
    {
        $isNativelyVariadic = $this->reflection->isVariadic();
        if (!$isNativelyVariadic && $this->reflection->getFileName() !== \false) {
            $key = \sprintf('variadic-function-%s-v0', $this->reflection->getName());
            $cachedResult = $this->cache->load($key);
            if ($cachedResult === null) {
                $nodes = $this->parser->parseFile($this->reflection->getFileName());
                $result = $this->callsFuncGetArgs($nodes);
                $this->cache->save($key, $result);
                return $result;
            }
            return $cachedResult;
        }
        return $isNativelyVariadic;
    }
    /**
     * @param mixed $nodes
     * @return bool
     */
    private function callsFuncGetArgs($nodes) : bool
    {
        foreach ($nodes as $node) {
            if (\is_array($node)) {
                if ($this->callsFuncGetArgs($node)) {
                    return \true;
                }
            }
            if (!$node instanceof \PhpParser\Node) {
                continue;
            }
            if ($node instanceof \PhpParser\Node\Stmt\Function_) {
                $functionName = (string) $node->namespacedName;
                if ($functionName === $this->reflection->getName()) {
                    return $this->functionCallStatementFinder->findFunctionCallInStatements(\PHPStan\Reflection\ParametersAcceptor::VARIADIC_FUNCTIONS, $node->getStmts()) !== null;
                }
                continue;
            }
            if ($this->callsFuncGetArgs($node)) {
                return \true;
            }
        }
        return \false;
    }
    private function getReturnType() : \PHPStan\Type\Type
    {
        if ($this->reflection->getName() === 'count') {
            return new \PHPStan\Type\IntegerType();
        }
        $returnType = $this->reflection->getReturnType();
        $phpDocReturnType = $this->phpDocReturnType;
        if ($returnType !== null && $phpDocReturnType !== null && $returnType->allowsNull() !== \PHPStan\Type\TypeCombinator::containsNull($phpDocReturnType)) {
            $phpDocReturnType = null;
        }
        return \PHPStan\Type\TypehintHelper::decideTypeFromReflection($returnType, $phpDocReturnType);
    }
    private function getPhpDocReturnType() : \PHPStan\Type\Type
    {
        if ($this->phpDocReturnType !== null) {
            return $this->phpDocReturnType;
        }
        return new \PHPStan\Type\MixedType();
    }
    private function getNativeReturnType() : \PHPStan\Type\Type
    {
        return \PHPStan\Type\TypehintHelper::decideTypeFromReflection($this->reflection->getReturnType());
    }
    public function getDeprecatedDescription() : ?string
    {
        if ($this->isDeprecated) {
            return $this->deprecatedDescription;
        }
        return null;
    }
    public function isDeprecated() : bool
    {
        return $this->isDeprecated || $this->reflection->isDeprecated();
    }
    public function isInternal() : bool
    {
        return $this->isInternal;
    }
    public function isFinal() : bool
    {
        return $this->isFinal;
    }
    public function getThrowType() : ?\PHPStan\Type\Type
    {
        return $this->phpDocThrowType;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Php;

interface BuiltinMethodReflection
{
    public function getName() : string;
    /**
     * @return string|false
     */
    public function getFileName();
    public function getDeclaringClass() : \ReflectionClass;
    /**
     * @return int|false
     */
    public function getStartLine();
    /**
     * @return int|false
     */
    public function getEndLine();
    /**
     * @return string|false
     */
    public function getDocComment();
    public function isStatic() : bool;
    public function isPrivate() : bool;
    public function isPublic() : bool;
    public function getPrototype() : self;
    public function isDeprecated() : bool;
    public function isVariadic() : bool;
    public function getReturnType() : ?\ReflectionType;
    /**
     * @return \ReflectionParameter[]
     */
    public function getParameters() : array;
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Php;

use PHPStan\Reflection\ParameterReflection;
use PHPStan\Reflection\PassedByReference;
use PHPStan\Type\Type;
class DummyParameter implements \PHPStan\Reflection\ParameterReflection
{
    /** @var string */
    private $name;
    /** @var \PHPStan\Type\Type  */
    private $type;
    /** @var bool */
    private $optional;
    /** @var \PHPStan\Reflection\PassedByReference */
    private $passedByReference;
    /** @var bool */
    private $variadic;
    public function __construct(string $name, \PHPStan\Type\Type $type, bool $optional, ?\PHPStan\Reflection\PassedByReference $passedByReference = null, bool $variadic = \false)
    {
        $this->name = $name;
        $this->type = $type;
        $this->optional = $optional;
        $this->passedByReference = $passedByReference !== null ? \PHPStan\Reflection\PassedByReference::createCreatesNewVariable() : \PHPStan\Reflection\PassedByReference::createNo();
        $this->variadic = $variadic;
    }
    public function getName() : string
    {
        return $this->name;
    }
    public function isOptional() : bool
    {
        return $this->optional;
    }
    public function getType() : \PHPStan\Type\Type
    {
        return $this->type;
    }
    public function passedByReference() : \PHPStan\Reflection\PassedByReference
    {
        return $this->passedByReference;
    }
    public function isVariadic() : bool
    {
        return $this->variadic;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Php;

use PHPStan\Reflection\ParameterReflectionWithPhpDocs;
use PHPStan\Reflection\PassedByReference;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
use PHPStan\Type\TypehintHelper;
class PhpParameterReflection implements \PHPStan\Reflection\ParameterReflectionWithPhpDocs
{
    /** @var \ReflectionParameter */
    private $reflection;
    /** @var \PHPStan\Type\Type|null */
    private $phpDocType = null;
    /** @var \PHPStan\Type\Type|null */
    private $type;
    /** @var \PHPStan\Type\Type|null */
    private $nativeType;
    public function __construct(\ReflectionParameter $reflection, ?\PHPStan\Type\Type $phpDocType)
    {
        $this->reflection = $reflection;
        $this->phpDocType = $phpDocType;
    }
    public function isOptional() : bool
    {
        return $this->reflection->isOptional();
    }
    public function getName() : string
    {
        return $this->reflection->getName();
    }
    public function getType() : \PHPStan\Type\Type
    {
        if ($this->type === null) {
            $phpDocType = $this->phpDocType;
            if ($phpDocType !== null && $this->reflection->isDefaultValueAvailable() && $this->reflection->getDefaultValue() === null) {
                $phpDocType = \PHPStan\Type\TypeCombinator::addNull($phpDocType);
            }
            $this->type = \PHPStan\Type\TypehintHelper::decideTypeFromReflection($this->reflection->getType(), $phpDocType, $this->reflection->getDeclaringClass() !== null ? $this->reflection->getDeclaringClass()->getName() : null, $this->isVariadic());
        }
        return $this->type;
    }
    public function passedByReference() : \PHPStan\Reflection\PassedByReference
    {
        return $this->reflection->isPassedByReference() ? \PHPStan\Reflection\PassedByReference::createCreatesNewVariable() : \PHPStan\Reflection\PassedByReference::createNo();
    }
    public function isVariadic() : bool
    {
        return $this->reflection->isVariadic();
    }
    public function getPhpDocType() : \PHPStan\Type\Type
    {
        if ($this->phpDocType !== null) {
            return $this->phpDocType;
        }
        return new \PHPStan\Type\MixedType();
    }
    public function getNativeType() : \PHPStan\Type\Type
    {
        if ($this->nativeType === null) {
            $this->nativeType = \PHPStan\Type\TypehintHelper::decideTypeFromReflection($this->reflection->getType(), null, $this->reflection->getDeclaringClass() !== null ? $this->reflection->getDeclaringClass()->getName() : null, $this->isVariadic());
        }
        return $this->nativeType;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Php;

use PHPStan\Reflection\ClassReflection;
use PHPStan\Type\Type;
class UniversalObjectCrateProperty implements \PHPStan\Reflection\PropertyReflection
{
    /** @var \PHPStan\Reflection\ClassReflection */
    private $declaringClass;
    /** @var \PHPStan\Type\Type */
    private $type;
    public function __construct(\PHPStan\Reflection\ClassReflection $declaringClass, \PHPStan\Type\Type $type)
    {
        $this->declaringClass = $declaringClass;
        $this->type = $type;
    }
    public function getDeclaringClass() : \PHPStan\Reflection\ClassReflection
    {
        return $this->declaringClass;
    }
    public function isStatic() : bool
    {
        return \false;
    }
    public function isPrivate() : bool
    {
        return \false;
    }
    public function isPublic() : bool
    {
        return \true;
    }
    public function getType() : \PHPStan\Type\Type
    {
        return $this->type;
    }
    public function isReadable() : bool
    {
        return \true;
    }
    public function isWritable() : bool
    {
        return \true;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Php;

use PHPStan\Reflection\ClassReflection;
use PHPStan\Type\Type;
interface PhpMethodReflectionFactory
{
    /**
     * @param \PHPStan\Reflection\ClassReflection $declaringClass
     * @param \PHPStan\Reflection\ClassReflection|null $declaringTrait
     * @param BuiltinMethodReflection $reflection
     * @param \PHPStan\Type\Type[] $phpDocParameterTypes
     * @param \PHPStan\Type\Type|null $phpDocReturnType
     * @param \PHPStan\Type\Type|null $phpDocThrowType
     * @param string|null $deprecatedDescription
     * @param bool $isDeprecated
     * @param bool $isInternal
     * @param bool $isFinal
     *
     * @return \PHPStan\Reflection\Php\PhpMethodReflection
     */
    public function create(\PHPStan\Reflection\ClassReflection $declaringClass, ?\PHPStan\Reflection\ClassReflection $declaringTrait, \PHPStan\Reflection\Php\BuiltinMethodReflection $reflection, array $phpDocParameterTypes, ?\PHPStan\Type\Type $phpDocReturnType, ?\PHPStan\Type\Type $phpDocThrowType, ?string $deprecatedDescription, bool $isDeprecated, bool $isInternal, bool $isFinal) : \PHPStan\Reflection\Php\PhpMethodReflection;
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Php;

use PHPStan\Broker\Broker;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Reflection\PropertyReflection;
use PHPStan\Type\MixedType;
class UniversalObjectCratesClassReflectionExtension implements \PHPStan\Reflection\PropertiesClassReflectionExtension, \PHPStan\Reflection\BrokerAwareExtension
{
    /** @var string[] */
    private $classes;
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /**
     * @param string[] $classes
     */
    public function __construct(array $classes)
    {
        $this->classes = $classes;
    }
    public function setBroker(\PHPStan\Broker\Broker $broker) : void
    {
        $this->broker = $broker;
    }
    public function hasProperty(\PHPStan\Reflection\ClassReflection $classReflection, string $propertyName) : bool
    {
        return self::isUniversalObjectCrate($this->broker, $this->classes, $classReflection);
    }
    /**
     * @param \PHPStan\Broker\Broker $broker
     * @param string[] $classes
     * @param \PHPStan\Reflection\ClassReflection $classReflection
     * @return bool
     */
    public static function isUniversalObjectCrate(\PHPStan\Broker\Broker $broker, array $classes, \PHPStan\Reflection\ClassReflection $classReflection) : bool
    {
        foreach ($classes as $className) {
            if (!$broker->hasClass($className)) {
                continue;
            }
            if ($classReflection->getName() === $className || $classReflection->isSubclassOf($className)) {
                return \true;
            }
        }
        return \false;
    }
    public function getProperty(\PHPStan\Reflection\ClassReflection $classReflection, string $propertyName) : \PHPStan\Reflection\PropertyReflection
    {
        if ($classReflection->hasNativeMethod('__get')) {
            $type = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($classReflection->getNativeMethod('__get')->getVariants())->getReturnType();
        } else {
            $type = new \PHPStan\Type\MixedType();
        }
        return new \PHPStan\Reflection\Php\UniversalObjectCrateProperty($classReflection, $type);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Php;

use PHPStan\Broker\Broker;
use PHPStan\PhpDoc\PhpDocBlock;
use PHPStan\PhpDoc\Tag\ParamTag;
use PHPStan\Reflection\Annotations\AnnotationsMethodsClassReflectionExtension;
use PHPStan\Reflection\Annotations\AnnotationsPropertiesClassReflectionExtension;
use PHPStan\Reflection\BrokerAwareExtension;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\FunctionVariant;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\MethodsClassReflectionExtension;
use PHPStan\Reflection\Native\NativeMethodReflection;
use PHPStan\Reflection\Native\NativeParameterReflection;
use PHPStan\Reflection\PropertiesClassReflectionExtension;
use PHPStan\Reflection\PropertyReflection;
use PHPStan\Reflection\SignatureMap\ParameterSignature;
use PHPStan\Reflection\SignatureMap\SignatureMapProvider;
use PHPStan\Type\FileTypeMapper;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
use PHPStan\Type\TypehintHelper;
class PhpClassReflectionExtension implements \PHPStan\Reflection\PropertiesClassReflectionExtension, \PHPStan\Reflection\MethodsClassReflectionExtension, \PHPStan\Reflection\BrokerAwareExtension
{
    /** @var \PHPStan\Reflection\Php\PhpMethodReflectionFactory */
    private $methodReflectionFactory;
    /** @var \PHPStan\Type\FileTypeMapper */
    private $fileTypeMapper;
    /** @var \PHPStan\Reflection\Annotations\AnnotationsMethodsClassReflectionExtension */
    private $annotationsMethodsClassReflectionExtension;
    /** @var \PHPStan\Reflection\Annotations\AnnotationsPropertiesClassReflectionExtension */
    private $annotationsPropertiesClassReflectionExtension;
    /** @var \PHPStan\Reflection\SignatureMap\SignatureMapProvider */
    private $signatureMapProvider;
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PHPStan\Reflection\PropertyReflection[][] */
    private $propertiesIncludingAnnotations = [];
    /** @var \PHPStan\Reflection\Php\PhpPropertyReflection[][] */
    private $nativeProperties;
    /** @var \PHPStan\Reflection\MethodReflection[][] */
    private $methodsIncludingAnnotations = [];
    /** @var \PHPStan\Reflection\MethodReflection[][] */
    private $nativeMethods = [];
    public function __construct(\PHPStan\Reflection\Php\PhpMethodReflectionFactory $methodReflectionFactory, \PHPStan\Type\FileTypeMapper $fileTypeMapper, \PHPStan\Reflection\Annotations\AnnotationsMethodsClassReflectionExtension $annotationsMethodsClassReflectionExtension, \PHPStan\Reflection\Annotations\AnnotationsPropertiesClassReflectionExtension $annotationsPropertiesClassReflectionExtension, \PHPStan\Reflection\SignatureMap\SignatureMapProvider $signatureMapProvider)
    {
        $this->methodReflectionFactory = $methodReflectionFactory;
        $this->fileTypeMapper = $fileTypeMapper;
        $this->annotationsMethodsClassReflectionExtension = $annotationsMethodsClassReflectionExtension;
        $this->annotationsPropertiesClassReflectionExtension = $annotationsPropertiesClassReflectionExtension;
        $this->signatureMapProvider = $signatureMapProvider;
    }
    public function setBroker(\PHPStan\Broker\Broker $broker) : void
    {
        $this->broker = $broker;
    }
    public function hasProperty(\PHPStan\Reflection\ClassReflection $classReflection, string $propertyName) : bool
    {
        return $classReflection->getNativeReflection()->hasProperty($propertyName);
    }
    public function getProperty(\PHPStan\Reflection\ClassReflection $classReflection, string $propertyName) : \PHPStan\Reflection\PropertyReflection
    {
        if (!isset($this->propertiesIncludingAnnotations[$classReflection->getName()][$propertyName])) {
            $this->propertiesIncludingAnnotations[$classReflection->getName()][$propertyName] = $this->createProperty($classReflection, $propertyName, \true);
        }
        return $this->propertiesIncludingAnnotations[$classReflection->getName()][$propertyName];
    }
    public function getNativeProperty(\PHPStan\Reflection\ClassReflection $classReflection, string $propertyName) : \PHPStan\Reflection\Php\PhpPropertyReflection
    {
        if (!isset($this->nativeProperties[$classReflection->getName()][$propertyName])) {
            /** @var \PHPStan\Reflection\Php\PhpPropertyReflection $property */
            $property = $this->createProperty($classReflection, $propertyName, \false);
            $this->nativeProperties[$classReflection->getName()][$propertyName] = $property;
        }
        return $this->nativeProperties[$classReflection->getName()][$propertyName];
    }
    private function createProperty(\PHPStan\Reflection\ClassReflection $classReflection, string $propertyName, bool $includingAnnotations) : \PHPStan\Reflection\PropertyReflection
    {
        $propertyReflection = $classReflection->getNativeReflection()->getProperty($propertyName);
        $propertyName = $propertyReflection->getName();
        $declaringClassReflection = $this->broker->getClass($propertyReflection->getDeclaringClass()->getName());
        $deprecatedDescription = null;
        $isDeprecated = \false;
        $isInternal = \false;
        if ($includingAnnotations && $this->annotationsPropertiesClassReflectionExtension->hasProperty($classReflection, $propertyName)) {
            $hierarchyDistances = $classReflection->getClassHierarchyDistances();
            $annotationProperty = $this->annotationsPropertiesClassReflectionExtension->getProperty($classReflection, $propertyName);
            if (!isset($hierarchyDistances[$annotationProperty->getDeclaringClass()->getName()])) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            if (!isset($hierarchyDistances[$propertyReflection->getDeclaringClass()->getName()])) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            if ($hierarchyDistances[$annotationProperty->getDeclaringClass()->getName()] < $hierarchyDistances[$propertyReflection->getDeclaringClass()->getName()]) {
                return $annotationProperty;
            }
        }
        $docComment = $propertyReflection->getDocComment() !== \false ? $propertyReflection->getDocComment() : null;
        if ($declaringClassReflection->getFileName() !== \false) {
            $phpDocBlock = \PHPStan\PhpDoc\PhpDocBlock::resolvePhpDocBlockForProperty($this->broker, $docComment, $declaringClassReflection->getName(), null, $propertyName, $declaringClassReflection->getFileName());
            if ($phpDocBlock !== null) {
                $resolvedPhpDoc = $this->fileTypeMapper->getResolvedPhpDoc($phpDocBlock->getFile(), $phpDocBlock->getClass(), $this->findPropertyTrait($phpDocBlock, $propertyReflection), $phpDocBlock->getDocComment());
                $varTags = $resolvedPhpDoc->getVarTags();
                if (isset($varTags[0]) && \count($varTags) === 1) {
                    $type = $varTags[0]->getType();
                } elseif (isset($varTags[$propertyName])) {
                    $type = $varTags[$propertyName]->getType();
                } else {
                    $type = new \PHPStan\Type\MixedType();
                }
                $deprecatedDescription = $resolvedPhpDoc->getDeprecatedTag() !== null ? $resolvedPhpDoc->getDeprecatedTag()->getMessage() : null;
                $isDeprecated = $resolvedPhpDoc->isDeprecated();
                $isInternal = $resolvedPhpDoc->isInternal();
            } else {
                $type = new \PHPStan\Type\MixedType();
            }
        } else {
            $type = new \PHPStan\Type\MixedType();
        }
        return new \PHPStan\Reflection\Php\PhpPropertyReflection($declaringClassReflection, $type, $propertyReflection, $deprecatedDescription, $isDeprecated, $isInternal);
    }
    public function hasMethod(\PHPStan\Reflection\ClassReflection $classReflection, string $methodName) : bool
    {
        if ($classReflection->getName() === \ReflectionType::class) {
            $classReflection = $this->broker->getClass(\ReflectionNamedType::class);
        }
        return $classReflection->getNativeReflection()->hasMethod($methodName);
    }
    public function getMethod(\PHPStan\Reflection\ClassReflection $classReflection, string $methodName) : \PHPStan\Reflection\MethodReflection
    {
        if ($classReflection->getName() === \ReflectionType::class) {
            $classReflection = $this->broker->getClass(\ReflectionNamedType::class);
        }
        if (isset($this->methodsIncludingAnnotations[$classReflection->getName()][$methodName])) {
            return $this->methodsIncludingAnnotations[$classReflection->getName()][$methodName];
        }
        $nativeMethodReflection = new \PHPStan\Reflection\Php\NativeBuiltinMethodReflection($classReflection->getNativeReflection()->getMethod($methodName));
        if (!isset($this->methodsIncludingAnnotations[$classReflection->getName()][$nativeMethodReflection->getName()])) {
            $method = $this->createMethod($classReflection, $nativeMethodReflection, \true);
            $this->methodsIncludingAnnotations[$classReflection->getName()][$nativeMethodReflection->getName()] = $method;
            if ($nativeMethodReflection->getName() !== $methodName) {
                $this->methodsIncludingAnnotations[$classReflection->getName()][$methodName] = $method;
            }
        }
        return $this->methodsIncludingAnnotations[$classReflection->getName()][$nativeMethodReflection->getName()];
    }
    public function hasNativeMethod(\PHPStan\Reflection\ClassReflection $classReflection, string $methodName) : bool
    {
        $hasMethod = $this->hasMethod($classReflection, $methodName);
        if ($hasMethod) {
            return \true;
        }
        if ($methodName === '__get' && \PHPStan\Reflection\Php\UniversalObjectCratesClassReflectionExtension::isUniversalObjectCrate($this->broker, $this->broker->getUniversalObjectCratesClasses(), $classReflection)) {
            return \true;
        }
        return \false;
    }
    public function getNativeMethod(\PHPStan\Reflection\ClassReflection $classReflection, string $methodName) : \PHPStan\Reflection\MethodReflection
    {
        if (isset($this->nativeMethods[$classReflection->getName()][$methodName])) {
            return $this->nativeMethods[$classReflection->getName()][$methodName];
        }
        if ($classReflection->getNativeReflection()->hasMethod($methodName)) {
            $nativeMethodReflection = new \PHPStan\Reflection\Php\NativeBuiltinMethodReflection($classReflection->getNativeReflection()->getMethod($methodName));
        } else {
            if ($methodName !== '__get' || !\PHPStan\Reflection\Php\UniversalObjectCratesClassReflectionExtension::isUniversalObjectCrate($this->broker, $this->broker->getUniversalObjectCratesClasses(), $classReflection)) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            $nativeMethodReflection = new \PHPStan\Reflection\Php\FakeBuiltinMethodReflection($methodName, $classReflection->getNativeReflection());
        }
        if (!isset($this->nativeMethods[$classReflection->getName()][$nativeMethodReflection->getName()])) {
            $method = $this->createMethod($classReflection, $nativeMethodReflection, \false);
            $this->nativeMethods[$classReflection->getName()][$nativeMethodReflection->getName()] = $method;
        }
        return $this->nativeMethods[$classReflection->getName()][$nativeMethodReflection->getName()];
    }
    private function createMethod(\PHPStan\Reflection\ClassReflection $classReflection, \PHPStan\Reflection\Php\BuiltinMethodReflection $methodReflection, bool $includingAnnotations) : \PHPStan\Reflection\MethodReflection
    {
        if ($includingAnnotations && $this->annotationsMethodsClassReflectionExtension->hasMethod($classReflection, $methodReflection->getName())) {
            $hierarchyDistances = $classReflection->getClassHierarchyDistances();
            $annotationMethod = $this->annotationsMethodsClassReflectionExtension->getMethod($classReflection, $methodReflection->getName());
            if (!isset($hierarchyDistances[$annotationMethod->getDeclaringClass()->getName()])) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            if (!isset($hierarchyDistances[$methodReflection->getDeclaringClass()->getName()])) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            if ($hierarchyDistances[$annotationMethod->getDeclaringClass()->getName()] < $hierarchyDistances[$methodReflection->getDeclaringClass()->getName()]) {
                return $annotationMethod;
            }
        }
        $declaringClassName = $methodReflection->getDeclaringClass()->getName();
        $signatureMapMethodName = \sprintf('%s::%s', $declaringClassName, $methodReflection->getName());
        $declaringClass = $this->broker->getClass($declaringClassName);
        if ($this->signatureMapProvider->hasFunctionSignature($signatureMapMethodName)) {
            $variantName = $signatureMapMethodName;
            $variants = [];
            $i = 0;
            while ($this->signatureMapProvider->hasFunctionSignature($variantName)) {
                $methodSignature = $this->signatureMapProvider->getFunctionSignature($variantName, $declaringClassName);
                $variants[] = new \PHPStan\Reflection\FunctionVariant(\array_map(static function (\PHPStan\Reflection\SignatureMap\ParameterSignature $parameterSignature) : NativeParameterReflection {
                    return new \PHPStan\Reflection\Native\NativeParameterReflection($parameterSignature->getName(), $parameterSignature->isOptional(), $parameterSignature->getType(), $parameterSignature->passedByReference(), $parameterSignature->isVariadic());
                }, $methodSignature->getParameters()), $methodSignature->isVariadic(), $methodSignature->getReturnType());
                $i++;
                $variantName = \sprintf($signatureMapMethodName . '\'' . $i);
            }
            return new \PHPStan\Reflection\Native\NativeMethodReflection($this->broker, $declaringClass, $methodReflection, $variants);
        }
        $phpDocParameterTypes = [];
        $phpDocReturnType = null;
        $phpDocThrowType = null;
        $deprecatedDescription = null;
        $isDeprecated = \false;
        $isInternal = \false;
        $isFinal = \false;
        $declaringTraitName = $this->findMethodTrait($methodReflection);
        if ($declaringClass->getFileName() !== \false) {
            $docComment = $methodReflection->getDocComment() !== \false ? $methodReflection->getDocComment() : null;
            $phpDocBlock = \PHPStan\PhpDoc\PhpDocBlock::resolvePhpDocBlockForMethod($this->broker, $docComment, $declaringClass->getName(), $declaringTraitName, $methodReflection->getName(), $declaringClass->getFileName());
            if ($phpDocBlock !== null) {
                $resolvedPhpDoc = $this->fileTypeMapper->getResolvedPhpDoc($phpDocBlock->getFile(), $phpDocBlock->getClass(), $phpDocBlock->getTrait(), $phpDocBlock->getDocComment());
                $phpDocParameterTypes = \array_map(static function (\PHPStan\PhpDoc\Tag\ParamTag $tag) : Type {
                    return $tag->getType();
                }, $resolvedPhpDoc->getParamTags());
                $nativeReturnType = \PHPStan\Type\TypehintHelper::decideTypeFromReflection($methodReflection->getReturnType(), null, $declaringClass->getName());
                $phpDocReturnType = null;
                if ($resolvedPhpDoc->getReturnTag() !== null && ($phpDocBlock->isExplicit() || $nativeReturnType->isSuperTypeOf($resolvedPhpDoc->getReturnTag()->getType())->yes())) {
                    $phpDocReturnType = $resolvedPhpDoc->getReturnTag()->getType();
                }
                $phpDocThrowType = $resolvedPhpDoc->getThrowsTag() !== null ? $resolvedPhpDoc->getThrowsTag()->getType() : null;
                $deprecatedDescription = $resolvedPhpDoc->getDeprecatedTag() !== null ? $resolvedPhpDoc->getDeprecatedTag()->getMessage() : null;
                $isDeprecated = $resolvedPhpDoc->isDeprecated();
                $isInternal = $resolvedPhpDoc->isInternal();
                $isFinal = $resolvedPhpDoc->isFinal();
            }
        }
        $declaringTrait = null;
        if ($declaringTraitName !== null && $this->broker->hasClass($declaringTraitName)) {
            $declaringTrait = $this->broker->getClass($declaringTraitName);
        }
        return $this->methodReflectionFactory->create($declaringClass, $declaringTrait, $methodReflection, $phpDocParameterTypes, $phpDocReturnType, $phpDocThrowType, $deprecatedDescription, $isDeprecated, $isInternal, $isFinal);
    }
    private function findPropertyTrait(\PHPStan\PhpDoc\PhpDocBlock $phpDocBlock, \ReflectionProperty $propertyReflection) : ?string
    {
        $resolvedPhpDoc = $this->fileTypeMapper->getResolvedPhpDoc($phpDocBlock->getFile(), $phpDocBlock->getClass(), null, $phpDocBlock->getDocComment());
        if (\count($resolvedPhpDoc->getVarTags()) > 0) {
            return null;
        }
        $declaringClass = $propertyReflection->getDeclaringClass();
        $traits = $declaringClass->getTraits();
        while (\count($traits) > 0) {
            /** @var \ReflectionClass $traitReflection */
            $traitReflection = \array_pop($traits);
            $traits = \array_merge($traits, $traitReflection->getTraits());
            if (!$traitReflection->hasProperty($propertyReflection->getName())) {
                continue;
            }
            $traitResolvedPhpDoc = $this->fileTypeMapper->getResolvedPhpDoc($phpDocBlock->getFile(), $phpDocBlock->getClass(), $traitReflection->getName(), $phpDocBlock->getDocComment());
            if (\count($traitResolvedPhpDoc->getVarTags()) > 0) {
                return $traitReflection->getName();
            }
        }
        return null;
    }
    private function findMethodTrait(\PHPStan\Reflection\Php\BuiltinMethodReflection $methodReflection) : ?string
    {
        $declaringClass = $methodReflection->getDeclaringClass();
        if ($methodReflection->getFileName() === $declaringClass->getFileName() && $methodReflection->getStartLine() >= $declaringClass->getStartLine() && $methodReflection->getEndLine() <= $declaringClass->getEndLine()) {
            return null;
        }
        $declaringClass = $methodReflection->getDeclaringClass();
        $traitAliases = $declaringClass->getTraitAliases();
        if (\array_key_exists($methodReflection->getName(), $traitAliases)) {
            return \explode('::', $traitAliases[$methodReflection->getName()])[0];
        }
        foreach ($this->collectTraits($declaringClass) as $traitReflection) {
            if (!$traitReflection->hasMethod($methodReflection->getName())) {
                continue;
            }
            if ($methodReflection->getFileName() === $traitReflection->getFileName() && $methodReflection->getStartLine() >= $traitReflection->getStartLine() && $methodReflection->getEndLine() <= $traitReflection->getEndLine()) {
                return $traitReflection->getName();
            }
        }
        return null;
    }
    /**
     * @param \ReflectionClass $class
     * @return \ReflectionClass[]
     */
    private function collectTraits(\ReflectionClass $class) : array
    {
        $traits = [];
        $traitsLeftToAnalyze = $class->getTraits();
        while (\count($traitsLeftToAnalyze) !== 0) {
            $trait = \reset($traitsLeftToAnalyze);
            $traits[] = $trait;
            foreach ($trait->getTraits() as $subTrait) {
                if (\in_array($subTrait, $traits, \true)) {
                    continue;
                }
                $traitsLeftToAnalyze[] = $subTrait;
            }
            \array_shift($traitsLeftToAnalyze);
        }
        return $traits;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Php;

use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\DeprecatableReflection;
use PHPStan\Reflection\InternableReflection;
use PHPStan\Reflection\PropertyReflection;
use PHPStan\Type\Type;
class PhpPropertyReflection implements \PHPStan\Reflection\PropertyReflection, \PHPStan\Reflection\DeprecatableReflection, \PHPStan\Reflection\InternableReflection
{
    /** @var \PHPStan\Reflection\ClassReflection */
    private $declaringClass;
    /** @var \PHPStan\Type\Type */
    private $type;
    /** @var \ReflectionProperty */
    private $reflection;
    /** @var string|null */
    private $deprecatedDescription;
    /** @var bool */
    private $isDeprecated;
    /** @var bool */
    private $isInternal;
    public function __construct(\PHPStan\Reflection\ClassReflection $declaringClass, \PHPStan\Type\Type $type, \ReflectionProperty $reflection, ?string $deprecatedDescription, bool $isDeprecated, bool $isInternal)
    {
        $this->declaringClass = $declaringClass;
        $this->type = $type;
        $this->reflection = $reflection;
        $this->deprecatedDescription = $deprecatedDescription;
        $this->isDeprecated = $isDeprecated;
        $this->isInternal = $isInternal;
    }
    public function getDeclaringClass() : \PHPStan\Reflection\ClassReflection
    {
        return $this->declaringClass;
    }
    /**
     * @return string|false
     */
    public function getDocComment()
    {
        return $this->reflection->getDocComment();
    }
    public function isStatic() : bool
    {
        return $this->reflection->isStatic();
    }
    public function isPrivate() : bool
    {
        return $this->reflection->isPrivate();
    }
    public function isPublic() : bool
    {
        return $this->reflection->isPublic();
    }
    public function getType() : \PHPStan\Type\Type
    {
        return $this->type;
    }
    public function isReadable() : bool
    {
        return \true;
    }
    public function isWritable() : bool
    {
        return \true;
    }
    public function getDeprecatedDescription() : ?string
    {
        if ($this->isDeprecated) {
            return $this->deprecatedDescription;
        }
        return null;
    }
    public function isDeprecated() : bool
    {
        return $this->isDeprecated;
    }
    public function isInternal() : bool
    {
        return $this->isInternal;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Php;

class NativeBuiltinMethodReflection implements \PHPStan\Reflection\Php\BuiltinMethodReflection
{
    /** @var \ReflectionMethod */
    private $reflection;
    public function __construct(\ReflectionMethod $reflection)
    {
        $this->reflection = $reflection;
    }
    public function getName() : string
    {
        return $this->reflection->getName();
    }
    /**
     * @return string|false
     */
    public function getFileName()
    {
        return $this->reflection->getFileName();
    }
    public function getDeclaringClass() : \ReflectionClass
    {
        return $this->reflection->getDeclaringClass();
    }
    /**
     * @return int|false
     */
    public function getStartLine()
    {
        return $this->reflection->getStartLine();
    }
    /**
     * @return int|false
     */
    public function getEndLine()
    {
        return $this->reflection->getEndLine();
    }
    /**
     * @return string|false
     */
    public function getDocComment()
    {
        return $this->reflection->getDocComment();
    }
    public function isStatic() : bool
    {
        return $this->reflection->isStatic();
    }
    public function isPrivate() : bool
    {
        return $this->reflection->isPrivate();
    }
    public function isPublic() : bool
    {
        return $this->reflection->isPublic();
    }
    public function getPrototype() : \PHPStan\Reflection\Php\BuiltinMethodReflection
    {
        return new self($this->reflection->getPrototype());
    }
    public function isDeprecated() : bool
    {
        return $this->reflection->isDeprecated();
    }
    public function isVariadic() : bool
    {
        return $this->reflection->isVariadic();
    }
    public function getReturnType() : ?\ReflectionType
    {
        return $this->reflection->getReturnType();
    }
    /**
     * @return \ReflectionParameter[]
     */
    public function getParameters() : array
    {
        return $this->reflection->getParameters();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Php;

use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Reflection\ClassMemberReflection;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Type\ArrayType;
use PHPStan\Type\BooleanType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\ObjectWithoutClassType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
use PHPStan\Type\VoidType;
class PhpMethodFromParserNodeReflection extends \PHPStan\Reflection\Php\PhpFunctionFromParserNodeReflection implements \PHPStan\Reflection\MethodReflection
{
    /** @var \PHPStan\Reflection\ClassReflection */
    private $declaringClass;
    /**
     * @param ClassReflection $declaringClass
     * @param ClassMethod $classMethod
     * @param \PHPStan\Type\Type[] $realParameterTypes
     * @param \PHPStan\Type\Type[] $phpDocParameterTypes
     * @param bool $realReturnTypePresent
     * @param Type $realReturnType
     * @param Type|null $phpDocReturnType
     * @param Type|null $throwType
     * @param string|null $deprecatedDescription
     * @param bool $isDeprecated
     * @param bool $isInternal
     * @param bool $isFinal
     */
    public function __construct(\PHPStan\Reflection\ClassReflection $declaringClass, \PhpParser\Node\Stmt\ClassMethod $classMethod, array $realParameterTypes, array $phpDocParameterTypes, bool $realReturnTypePresent, \PHPStan\Type\Type $realReturnType, ?\PHPStan\Type\Type $phpDocReturnType, ?\PHPStan\Type\Type $throwType, ?string $deprecatedDescription, bool $isDeprecated, bool $isInternal, bool $isFinal)
    {
        parent::__construct($classMethod, $realParameterTypes, $phpDocParameterTypes, $realReturnTypePresent, $realReturnType, $phpDocReturnType, $throwType, $deprecatedDescription, $isDeprecated, $isInternal, $isFinal);
        $this->declaringClass = $declaringClass;
    }
    public function getDeclaringClass() : \PHPStan\Reflection\ClassReflection
    {
        return $this->declaringClass;
    }
    public function getPrototype() : \PHPStan\Reflection\ClassMemberReflection
    {
        return $this->declaringClass->getNativeMethod($this->getClassMethod()->name->name)->getPrototype();
    }
    private function getClassMethod() : \PhpParser\Node\Stmt\ClassMethod
    {
        /** @var \PhpParser\Node\Stmt\ClassMethod $functionLike */
        $functionLike = $this->getFunctionLike();
        return $functionLike;
    }
    public function isStatic() : bool
    {
        return $this->getClassMethod()->isStatic();
    }
    public function isPrivate() : bool
    {
        return $this->getClassMethod()->isPrivate();
    }
    public function isPublic() : bool
    {
        return $this->getClassMethod()->isPublic();
    }
    protected function getReturnType() : \PHPStan\Type\Type
    {
        $name = \strtolower($this->getName());
        if ($name === '__construct' || $name === '__destruct' || $name === '__unset' || $name === '__wakeup' || $name === '__clone') {
            return new \PHPStan\Type\VoidType();
        }
        if ($name === '__tostring') {
            return new \PHPStan\Type\StringType();
        }
        if ($name === '__isset') {
            return new \PHPStan\Type\BooleanType();
        }
        if ($name === '__sleep') {
            return new \PHPStan\Type\ArrayType(new \PHPStan\Type\IntegerType(), new \PHPStan\Type\StringType());
        }
        if ($name === '__set_state') {
            return new \PHPStan\Type\ObjectWithoutClassType();
        }
        return parent::getReturnType();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Php;

use PhpParser\Node\Expr;
use PhpParser\Node\Expr\ConstFetch;
use PHPStan\Reflection\PassedByReference;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
use PHPStan\Type\TypehintHelper;
class PhpParameterFromParserNodeReflection implements \PHPStan\Reflection\ParameterReflectionWithPhpDocs
{
    /** @var string */
    private $name;
    /** @var bool */
    private $optional;
    /** @var \PHPStan\Type\Type */
    private $realType;
    /** @var \PHPStan\Type\Type|null */
    private $phpDocType;
    /** @var \PHPStan\Reflection\PassedByReference */
    private $passedByReference;
    /** @var \PhpParser\Node\Expr|null */
    private $defaultValue;
    /** @var bool */
    private $variadic;
    /** @var \PHPStan\Type\Type|null */
    private $type;
    public function __construct(string $name, bool $optional, \PHPStan\Type\Type $realType, ?\PHPStan\Type\Type $phpDocType, \PHPStan\Reflection\PassedByReference $passedByReference, ?\PhpParser\Node\Expr $defaultValue, bool $variadic)
    {
        $this->name = $name;
        $this->optional = $optional;
        $this->realType = $realType;
        $this->phpDocType = $phpDocType;
        $this->passedByReference = $passedByReference;
        $this->defaultValue = $defaultValue;
        $this->variadic = $variadic;
    }
    public function getName() : string
    {
        return $this->name;
    }
    public function isOptional() : bool
    {
        return $this->optional;
    }
    public function getType() : \PHPStan\Type\Type
    {
        if ($this->type === null) {
            $phpDocType = $this->phpDocType;
            if ($phpDocType !== null && $this->defaultValue !== null) {
                if ($this->defaultValue instanceof \PhpParser\Node\Expr\ConstFetch && \strtolower((string) $this->defaultValue->name) === 'null') {
                    $phpDocType = \PHPStan\Type\TypeCombinator::addNull($phpDocType);
                }
            }
            $this->type = \PHPStan\Type\TypehintHelper::decideType($this->realType, $phpDocType);
        }
        return $this->type;
    }
    public function getPhpDocType() : \PHPStan\Type\Type
    {
        return $this->phpDocType ?? new \PHPStan\Type\MixedType();
    }
    public function getNativeType() : \PHPStan\Type\Type
    {
        return $this->realType ?? new \PHPStan\Type\MixedType();
    }
    public function passedByReference() : \PHPStan\Reflection\PassedByReference
    {
        return $this->passedByReference;
    }
    public function isVariadic() : bool
    {
        return $this->variadic;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Php;

use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Broker\Broker;
use PHPStan\Cache\Cache;
use PHPStan\Parser\FunctionCallStatementFinder;
use PHPStan\Parser\Parser;
use PHPStan\Reflection\ClassMemberReflection;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\DeprecatableReflection;
use PHPStan\Reflection\FinalizableReflection;
use PHPStan\Reflection\FunctionVariantWithPhpDocs;
use PHPStan\Reflection\InternableReflection;
use PHPStan\Reflection\MethodPrototypeReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\ParametersAcceptor;
use PHPStan\Reflection\ParametersAcceptorWithPhpDocs;
use PHPStan\Reflection\ThrowableReflection;
use PHPStan\Type\ArrayType;
use PHPStan\Type\BooleanType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\MixedType;
use PHPStan\Type\ObjectWithoutClassType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypehintHelper;
use PHPStan\Type\VoidType;
class PhpMethodReflection implements \PHPStan\Reflection\MethodReflection, \PHPStan\Reflection\DeprecatableReflection, \PHPStan\Reflection\InternableReflection, \PHPStan\Reflection\FinalizableReflection, \PHPStan\Reflection\ThrowableReflection
{
    /** @var \PHPStan\Reflection\ClassReflection */
    private $declaringClass;
    /** @var ClassReflection|null */
    private $declaringTrait;
    /** @var BuiltinMethodReflection */
    private $reflection;
    /** @var \PHPStan\Broker\Broker */
    private $broker;
    /** @var \PHPStan\Parser\Parser */
    private $parser;
    /** @var \PHPStan\Parser\FunctionCallStatementFinder */
    private $functionCallStatementFinder;
    /** @var \PHPStan\Cache\Cache */
    private $cache;
    /** @var \PHPStan\Type\Type[] */
    private $phpDocParameterTypes;
    /** @var \PHPStan\Type\Type|null */
    private $phpDocReturnType;
    /** @var \PHPStan\Type\Type|null */
    private $phpDocThrowType;
    /** @var \PHPStan\Reflection\Php\PhpParameterReflection[]|null */
    private $parameters;
    /** @var \PHPStan\Type\Type|null */
    private $returnType;
    /** @var \PHPStan\Type\Type|null */
    private $nativeReturnType;
    /** @var string|null  */
    private $deprecatedDescription;
    /** @var bool */
    private $isDeprecated;
    /** @var bool */
    private $isInternal;
    /** @var bool */
    private $isFinal;
    /** @var FunctionVariantWithPhpDocs[]|null */
    private $variants;
    /**
     * @param ClassReflection $declaringClass
     * @param ClassReflection|null $declaringTrait
     * @param BuiltinMethodReflection $reflection
     * @param Broker $broker
     * @param Parser $parser
     * @param FunctionCallStatementFinder $functionCallStatementFinder
     * @param Cache $cache
     * @param \PHPStan\Type\Type[] $phpDocParameterTypes
     * @param Type|null $phpDocReturnType
     * @param Type|null $phpDocThrowType
     * @param string|null $deprecatedDescription
     * @param bool $isDeprecated
     * @param bool $isInternal
     * @param bool $isFinal
     */
    public function __construct(\PHPStan\Reflection\ClassReflection $declaringClass, ?\PHPStan\Reflection\ClassReflection $declaringTrait, \PHPStan\Reflection\Php\BuiltinMethodReflection $reflection, \PHPStan\Broker\Broker $broker, \PHPStan\Parser\Parser $parser, \PHPStan\Parser\FunctionCallStatementFinder $functionCallStatementFinder, \PHPStan\Cache\Cache $cache, array $phpDocParameterTypes, ?\PHPStan\Type\Type $phpDocReturnType, ?\PHPStan\Type\Type $phpDocThrowType, ?string $deprecatedDescription, bool $isDeprecated = \false, bool $isInternal = \false, bool $isFinal = \false)
    {
        $this->declaringClass = $declaringClass;
        $this->declaringTrait = $declaringTrait;
        $this->reflection = $reflection;
        $this->broker = $broker;
        $this->parser = $parser;
        $this->functionCallStatementFinder = $functionCallStatementFinder;
        $this->cache = $cache;
        $this->phpDocParameterTypes = $phpDocParameterTypes;
        $this->phpDocReturnType = $phpDocReturnType;
        $this->phpDocThrowType = $phpDocThrowType;
        $this->deprecatedDescription = $deprecatedDescription;
        $this->isDeprecated = $isDeprecated;
        $this->isInternal = $isInternal;
        $this->isFinal = $isFinal;
    }
    public function getDeclaringClass() : \PHPStan\Reflection\ClassReflection
    {
        return $this->declaringClass;
    }
    public function getDeclaringTrait() : ?\PHPStan\Reflection\ClassReflection
    {
        return $this->declaringTrait;
    }
    /**
     * @return string|false
     */
    public function getDocComment()
    {
        return $this->reflection->getDocComment();
    }
    public function getPrototype() : \PHPStan\Reflection\ClassMemberReflection
    {
        try {
            $prototypeMethod = $this->reflection->getPrototype();
            $prototypeDeclaringClass = $this->broker->getClass($prototypeMethod->getDeclaringClass()->getName());
            return new \PHPStan\Reflection\MethodPrototypeReflection($prototypeDeclaringClass, $prototypeMethod->isStatic(), $prototypeMethod->isPrivate(), $prototypeMethod->isPublic());
        } catch (\ReflectionException $e) {
            return $this;
        }
    }
    public function isStatic() : bool
    {
        return $this->reflection->isStatic();
    }
    public function getName() : string
    {
        $name = $this->reflection->getName();
        $lowercaseName = \strtolower($name);
        if ($lowercaseName === $name) {
            // fix for https://bugs.php.net/bug.php?id=74939
            foreach ($this->getDeclaringClass()->getNativeReflection()->getTraitAliases() as $traitTarget) {
                $correctName = $this->getMethodNameWithCorrectCase($name, $traitTarget);
                if ($correctName !== null) {
                    $name = $correctName;
                    break;
                }
            }
        }
        return $name;
    }
    private function getMethodNameWithCorrectCase(string $lowercaseMethodName, string $traitTarget) : ?string
    {
        $trait = \explode('::', $traitTarget)[0];
        $traitReflection = $this->broker->getClass($trait)->getNativeReflection();
        foreach ($traitReflection->getTraitAliases() as $methodAlias => $aliasTraitTarget) {
            if ($lowercaseMethodName === \strtolower($methodAlias)) {
                return $methodAlias;
            }
            $correctName = $this->getMethodNameWithCorrectCase($lowercaseMethodName, $aliasTraitTarget);
            if ($correctName !== null) {
                return $correctName;
            }
        }
        return null;
    }
    /**
     * @return ParametersAcceptorWithPhpDocs[]
     */
    public function getVariants() : array
    {
        if ($this->variants === null) {
            $this->variants = [new \PHPStan\Reflection\FunctionVariantWithPhpDocs($this->getParameters(), $this->isVariadic(), $this->getReturnType(), $this->getPhpDocReturnType(), $this->getNativeReturnType())];
        }
        return $this->variants;
    }
    /**
     * @return \PHPStan\Reflection\ParameterReflectionWithPhpDocs[]
     */
    private function getParameters() : array
    {
        if ($this->parameters === null) {
            $this->parameters = \array_map(function (\ReflectionParameter $reflection) : PhpParameterReflection {
                return new \PHPStan\Reflection\Php\PhpParameterReflection($reflection, $this->phpDocParameterTypes[$reflection->getName()] ?? null);
            }, $this->reflection->getParameters());
        }
        return $this->parameters;
    }
    private function isVariadic() : bool
    {
        $isNativelyVariadic = $this->reflection->isVariadic();
        $declaringClass = $this->declaringClass;
        $filename = $this->declaringClass->getFileName();
        if ($this->declaringTrait !== null) {
            $declaringClass = $this->declaringTrait;
            $filename = $this->declaringTrait->getFileName();
        }
        if (!$isNativelyVariadic && $filename !== \false) {
            $key = \sprintf('variadic-method-%s-%s-v1', $declaringClass->getName(), $this->reflection->getName());
            $cachedResult = $this->cache->load($key);
            if ($cachedResult === null || !\is_bool($cachedResult)) {
                $nodes = $this->parser->parseFile($filename);
                $result = $this->callsFuncGetArgs($declaringClass, $nodes);
                $this->cache->save($key, $result);
                return $result;
            }
            return $cachedResult;
        }
        return $isNativelyVariadic;
    }
    /**
     * @param ClassReflection $declaringClass
     * @param mixed $nodes
     * @return bool
     */
    private function callsFuncGetArgs(\PHPStan\Reflection\ClassReflection $declaringClass, $nodes) : bool
    {
        foreach ($nodes as $node) {
            if (\is_array($node)) {
                if ($this->callsFuncGetArgs($declaringClass, $node)) {
                    return \true;
                }
            }
            if (!$node instanceof \PhpParser\Node) {
                continue;
            }
            if ($node instanceof \PhpParser\Node\Stmt\ClassLike && isset($node->namespacedName) && $declaringClass->getName() !== (string) $node->namespacedName) {
                continue;
            }
            if ($node instanceof \PhpParser\Node\Stmt\ClassMethod) {
                if ($node->getStmts() === null) {
                    continue;
                    // interface
                }
                $methodName = $node->name->name;
                if ($methodName === $this->reflection->getName()) {
                    return $this->functionCallStatementFinder->findFunctionCallInStatements(\PHPStan\Reflection\ParametersAcceptor::VARIADIC_FUNCTIONS, $node->getStmts()) !== null;
                }
                continue;
            }
            if ($this->callsFuncGetArgs($declaringClass, $node)) {
                return \true;
            }
        }
        return \false;
    }
    public function isPrivate() : bool
    {
        return $this->reflection->isPrivate();
    }
    public function isPublic() : bool
    {
        return $this->reflection->isPublic();
    }
    private function getReturnType() : \PHPStan\Type\Type
    {
        if ($this->returnType === null) {
            $name = \strtolower($this->getName());
            if ($name === '__construct' || $name === '__destruct' || $name === '__unset' || $name === '__wakeup' || $name === '__clone') {
                return $this->returnType = new \PHPStan\Type\VoidType();
            }
            if ($name === '__tostring') {
                return $this->returnType = new \PHPStan\Type\StringType();
            }
            if ($name === '__isset') {
                return $this->returnType = new \PHPStan\Type\BooleanType();
            }
            if ($name === '__sleep') {
                return $this->returnType = new \PHPStan\Type\ArrayType(new \PHPStan\Type\IntegerType(), new \PHPStan\Type\StringType());
            }
            if ($name === '__set_state') {
                return $this->returnType = new \PHPStan\Type\ObjectWithoutClassType();
            }
            $returnType = $this->reflection->getReturnType();
            $phpDocReturnType = $this->phpDocReturnType;
            if ($returnType !== null && $phpDocReturnType !== null && $returnType->allowsNull() !== \PHPStan\Type\TypeCombinator::containsNull($phpDocReturnType)) {
                $phpDocReturnType = null;
            }
            $this->returnType = \PHPStan\Type\TypehintHelper::decideTypeFromReflection($returnType, $phpDocReturnType, $this->declaringClass->getName());
        }
        return $this->returnType;
    }
    private function getPhpDocReturnType() : \PHPStan\Type\Type
    {
        if ($this->phpDocReturnType !== null) {
            return $this->phpDocReturnType;
        }
        return new \PHPStan\Type\MixedType();
    }
    private function getNativeReturnType() : \PHPStan\Type\Type
    {
        if ($this->nativeReturnType === null) {
            $this->nativeReturnType = \PHPStan\Type\TypehintHelper::decideTypeFromReflection($this->reflection->getReturnType(), null, $this->declaringClass->getName());
        }
        return $this->nativeReturnType;
    }
    public function getDeprecatedDescription() : ?string
    {
        if ($this->isDeprecated) {
            return $this->deprecatedDescription;
        }
        return null;
    }
    public function isDeprecated() : bool
    {
        return $this->isDeprecated;
    }
    public function isInternal() : bool
    {
        return $this->isInternal;
    }
    public function isFinal() : bool
    {
        return $this->isFinal;
    }
    public function getThrowType() : ?\PHPStan\Type\Type
    {
        return $this->phpDocThrowType;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Php;

use PhpParser\Node\Expr\Variable;
use PhpParser\Node\FunctionLike;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Reflection\FunctionVariantWithPhpDocs;
use PHPStan\Reflection\PassedByReference;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\TypehintHelper;
class PhpFunctionFromParserNodeReflection implements \PHPStan\Reflection\FunctionReflection
{
    /** @var \PhpParser\Node\FunctionLike */
    private $functionLike;
    /** @var \PHPStan\Type\Type[] */
    private $realParameterTypes;
    /** @var \PHPStan\Type\Type[] */
    private $phpDocParameterTypes;
    /** @var bool */
    private $realReturnTypePresent;
    /** @var \PHPStan\Type\Type */
    private $realReturnType;
    /** @var \PHPStan\Type\Type|null */
    private $phpDocReturnType;
    /** @var \PHPStan\Type\Type|null */
    private $throwType;
    /** @var string|null */
    private $deprecatedDescription;
    /** @var bool */
    private $isDeprecated;
    /** @var bool */
    private $isInternal;
    /** @var bool */
    private $isFinal;
    /** @var FunctionVariantWithPhpDocs[]|null */
    private $variants;
    /**
     * @param FunctionLike $functionLike
     * @param \PHPStan\Type\Type[] $realParameterTypes
     * @param \PHPStan\Type\Type[] $phpDocParameterTypes
     * @param bool $realReturnTypePresent
     * @param Type $realReturnType
     * @param Type|null $phpDocReturnType
     * @param Type|null $throwType
     * @param string|null $deprecatedDescription
     * @param bool $isDeprecated
     * @param bool $isInternal
     * @param bool $isFinal
     */
    public function __construct(\PhpParser\Node\FunctionLike $functionLike, array $realParameterTypes, array $phpDocParameterTypes, bool $realReturnTypePresent, \PHPStan\Type\Type $realReturnType, ?\PHPStan\Type\Type $phpDocReturnType = null, ?\PHPStan\Type\Type $throwType = null, ?string $deprecatedDescription = null, bool $isDeprecated = \false, bool $isInternal = \false, bool $isFinal = \false)
    {
        $this->functionLike = $functionLike;
        $this->realParameterTypes = $realParameterTypes;
        $this->phpDocParameterTypes = $phpDocParameterTypes;
        $this->realReturnTypePresent = $realReturnTypePresent;
        $this->realReturnType = $realReturnType;
        $this->phpDocReturnType = $phpDocReturnType;
        $this->throwType = $throwType;
        $this->deprecatedDescription = $deprecatedDescription;
        $this->isDeprecated = $isDeprecated;
        $this->isInternal = $isInternal;
        $this->isFinal = $isFinal;
    }
    protected function getFunctionLike() : \PhpParser\Node\FunctionLike
    {
        return $this->functionLike;
    }
    public function getName() : string
    {
        if ($this->functionLike instanceof \PhpParser\Node\Stmt\ClassMethod) {
            return $this->functionLike->name->name;
        }
        return (string) $this->functionLike->namespacedName;
    }
    /**
     * @return \PHPStan\Reflection\ParametersAcceptorWithPhpDocs[]
     */
    public function getVariants() : array
    {
        if ($this->variants === null) {
            $this->variants = [new \PHPStan\Reflection\FunctionVariantWithPhpDocs($this->getParameters(), $this->isVariadic(), $this->getReturnType(), $this->phpDocReturnType ?? new \PHPStan\Type\MixedType(), $this->realReturnType ?? new \PHPStan\Type\MixedType())];
        }
        return $this->variants;
    }
    /**
     * @return \PHPStan\Reflection\ParameterReflectionWithPhpDocs[]
     */
    private function getParameters() : array
    {
        $parameters = [];
        $isOptional = \true;
        /** @var \PhpParser\Node\Param $parameter */
        foreach (\array_reverse($this->functionLike->getParams()) as $parameter) {
            if (!$isOptional || $parameter->default === null) {
                $isOptional = \false;
            }
            if (!$parameter->var instanceof \PhpParser\Node\Expr\Variable || !\is_string($parameter->var->name)) {
                throw new \PHPStan\ShouldNotHappenException();
            }
            $parameters[] = new \PHPStan\Reflection\Php\PhpParameterFromParserNodeReflection($parameter->var->name, $isOptional, $this->realParameterTypes[$parameter->var->name], $this->phpDocParameterTypes[$parameter->var->name] ?? null, $parameter->byRef ? \PHPStan\Reflection\PassedByReference::createCreatesNewVariable() : \PHPStan\Reflection\PassedByReference::createNo(), $parameter->default, $parameter->variadic);
        }
        return \array_reverse($parameters);
    }
    private function isVariadic() : bool
    {
        foreach ($this->functionLike->getParams() as $parameter) {
            if ($parameter->variadic) {
                return \true;
            }
        }
        return \false;
    }
    protected function getReturnType() : \PHPStan\Type\Type
    {
        $phpDocReturnType = $this->phpDocReturnType;
        if ($this->realReturnTypePresent && $phpDocReturnType !== null && \PHPStan\Type\TypeCombinator::containsNull($this->realReturnType) !== \PHPStan\Type\TypeCombinator::containsNull($phpDocReturnType)) {
            $phpDocReturnType = null;
        }
        return \PHPStan\Type\TypehintHelper::decideType($this->realReturnType, $phpDocReturnType);
    }
    public function getDeprecatedDescription() : ?string
    {
        if ($this->isDeprecated) {
            return $this->deprecatedDescription;
        }
        return null;
    }
    public function isDeprecated() : bool
    {
        return $this->isDeprecated;
    }
    public function isInternal() : bool
    {
        return $this->isInternal;
    }
    public function isFinal() : bool
    {
        return $this->isFinal;
    }
    public function getThrowType() : ?\PHPStan\Type\Type
    {
        return $this->throwType;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Php;

class FakeBuiltinMethodReflection implements \PHPStan\Reflection\Php\BuiltinMethodReflection
{
    /** @var string */
    private $methodName;
    /** @var \ReflectionClass */
    private $declaringClass;
    public function __construct(string $methodName, \ReflectionClass $declaringClass)
    {
        $this->methodName = $methodName;
        $this->declaringClass = $declaringClass;
    }
    public function getName() : string
    {
        return $this->methodName;
    }
    /**
     * @return string|false
     */
    public function getFileName()
    {
        return \false;
    }
    public function getDeclaringClass() : \ReflectionClass
    {
        return $this->declaringClass;
    }
    /**
     * @return int|false
     */
    public function getStartLine()
    {
        return \false;
    }
    /**
     * @return int|false
     */
    public function getEndLine()
    {
        return \false;
    }
    /**
     * @return string|false
     */
    public function getDocComment()
    {
        return \false;
    }
    public function isStatic() : bool
    {
        return \false;
    }
    public function isPrivate() : bool
    {
        return \false;
    }
    public function isPublic() : bool
    {
        return \true;
    }
    public function getPrototype() : \PHPStan\Reflection\Php\BuiltinMethodReflection
    {
        throw new \ReflectionException();
    }
    public function isDeprecated() : bool
    {
        return \false;
    }
    public function isVariadic() : bool
    {
        return \false;
    }
    public function getReturnType() : ?\ReflectionType
    {
        return null;
    }
    /**
     * @return \ReflectionParameter[]
     */
    public function getParameters() : array
    {
        return [];
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

class MethodPrototypeReflection implements \PHPStan\Reflection\ClassMemberReflection
{
    /** @var \PHPStan\Reflection\ClassReflection */
    private $declaringClass;
    /** @var bool */
    private $isStatic;
    /** @var bool */
    private $isPrivate;
    /** @var bool */
    private $isPublic;
    public function __construct(\PHPStan\Reflection\ClassReflection $declaringClass, bool $isStatic, bool $isPrivate, bool $isPublic)
    {
        $this->declaringClass = $declaringClass;
        $this->isStatic = $isStatic;
        $this->isPrivate = $isPrivate;
        $this->isPublic = $isPublic;
    }
    public function getDeclaringClass() : \PHPStan\Reflection\ClassReflection
    {
        return $this->declaringClass;
    }
    public function isStatic() : bool
    {
        return $this->isStatic;
    }
    public function isPrivate() : bool
    {
        return $this->isPrivate;
    }
    public function isPublic() : bool
    {
        return $this->isPublic;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Annotations;

use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\MethodsClassReflectionExtension;
use PHPStan\Type\FileTypeMapper;
class AnnotationsMethodsClassReflectionExtension implements \PHPStan\Reflection\MethodsClassReflectionExtension
{
    /** @var FileTypeMapper */
    private $fileTypeMapper;
    /** @var MethodReflection[][] */
    private $methods = [];
    public function __construct(\PHPStan\Type\FileTypeMapper $fileTypeMapper)
    {
        $this->fileTypeMapper = $fileTypeMapper;
    }
    public function hasMethod(\PHPStan\Reflection\ClassReflection $classReflection, string $methodName) : bool
    {
        if (!isset($this->methods[$classReflection->getName()])) {
            $this->methods[$classReflection->getName()] = $this->createMethods($classReflection, $classReflection);
        }
        return isset($this->methods[$classReflection->getName()][$methodName]);
    }
    public function getMethod(\PHPStan\Reflection\ClassReflection $classReflection, string $methodName) : \PHPStan\Reflection\MethodReflection
    {
        return $this->methods[$classReflection->getName()][$methodName];
    }
    /**
     * @param ClassReflection $classReflection
     * @param ClassReflection $declaringClass
     * @return MethodReflection[]
     */
    private function createMethods(\PHPStan\Reflection\ClassReflection $classReflection, \PHPStan\Reflection\ClassReflection $declaringClass) : array
    {
        $methods = [];
        foreach ($classReflection->getTraits() as $traitClass) {
            $methods += $this->createMethods($traitClass, $classReflection);
        }
        foreach ($classReflection->getParents() as $parentClass) {
            $methods += $this->createMethods($parentClass, $parentClass);
            foreach ($parentClass->getTraits() as $traitClass) {
                $methods += $this->createMethods($traitClass, $parentClass);
            }
        }
        foreach ($classReflection->getInterfaces() as $interfaceClass) {
            $methods += $this->createMethods($interfaceClass, $interfaceClass);
        }
        $fileName = $classReflection->getFileName();
        if ($fileName === \false) {
            return $methods;
        }
        $docComment = $classReflection->getNativeReflection()->getDocComment();
        if ($docComment === \false) {
            return $methods;
        }
        $resolvedPhpDoc = $this->fileTypeMapper->getResolvedPhpDoc($fileName, $classReflection->getName(), null, $docComment);
        foreach ($resolvedPhpDoc->getMethodTags() as $methodName => $methodTag) {
            $parameters = [];
            foreach ($methodTag->getParameters() as $parameterName => $parameterTag) {
                $parameters[] = new \PHPStan\Reflection\Annotations\AnnotationsMethodParameterReflection($parameterName, $parameterTag->getType(), $parameterTag->passedByReference(), $parameterTag->isOptional(), $parameterTag->isVariadic());
            }
            $methods[$methodName] = new \PHPStan\Reflection\Annotations\AnnotationMethodReflection($methodName, $declaringClass, $methodTag->getReturnType(), $parameters, $methodTag->isStatic(), $this->detectMethodVariadic($parameters));
        }
        return $methods;
    }
    /**
     * @param AnnotationsMethodParameterReflection[] $parameters
     * @return bool
     */
    private function detectMethodVariadic(array $parameters) : bool
    {
        if ($parameters === []) {
            return \false;
        }
        $possibleVariadicParameterIndex = \count($parameters) - 1;
        $possibleVariadicParameter = $parameters[$possibleVariadicParameterIndex];
        return $possibleVariadicParameter->isVariadic();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Annotations;

use PHPStan\Reflection\ParameterReflection;
use PHPStan\Reflection\PassedByReference;
use PHPStan\Type\Type;
class AnnotationsMethodParameterReflection implements \PHPStan\Reflection\ParameterReflection
{
    /** @var string */
    private $name;
    /** @var Type */
    private $type;
    /** @var \PHPStan\Reflection\PassedByReference */
    private $passedByReference;
    /** @var bool */
    private $isOptional;
    /** @var bool */
    private $isVariadic;
    public function __construct(string $name, \PHPStan\Type\Type $type, \PHPStan\Reflection\PassedByReference $passedByReference, bool $isOptional, bool $isVariadic)
    {
        $this->name = $name;
        $this->type = $type;
        $this->passedByReference = $passedByReference;
        $this->isOptional = $isOptional;
        $this->isVariadic = $isVariadic;
    }
    public function getName() : string
    {
        return $this->name;
    }
    public function isOptional() : bool
    {
        return $this->isOptional;
    }
    public function getType() : \PHPStan\Type\Type
    {
        return $this->type;
    }
    public function passedByReference() : \PHPStan\Reflection\PassedByReference
    {
        return $this->passedByReference;
    }
    public function isVariadic() : bool
    {
        return $this->isVariadic;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Annotations;

use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\PropertyReflection;
use PHPStan\Type\Type;
class AnnotationPropertyReflection implements \PHPStan\Reflection\PropertyReflection
{
    /** @var \PHPStan\Reflection\ClassReflection */
    private $declaringClass;
    /** @var \PHPStan\Type\Type */
    private $type;
    /** @var bool */
    private $readable;
    /** @var bool */
    private $writable;
    public function __construct(\PHPStan\Reflection\ClassReflection $declaringClass, \PHPStan\Type\Type $type, bool $readable = \true, bool $writable = \true)
    {
        $this->declaringClass = $declaringClass;
        $this->type = $type;
        $this->readable = $readable;
        $this->writable = $writable;
    }
    public function getDeclaringClass() : \PHPStan\Reflection\ClassReflection
    {
        return $this->declaringClass;
    }
    public function isStatic() : bool
    {
        return \false;
    }
    public function isPrivate() : bool
    {
        return \false;
    }
    public function isPublic() : bool
    {
        return \true;
    }
    public function getType() : \PHPStan\Type\Type
    {
        return $this->type;
    }
    public function isReadable() : bool
    {
        return $this->readable;
    }
    public function isWritable() : bool
    {
        return $this->writable;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Annotations;

use PHPStan\Reflection\ClassMemberReflection;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\FunctionVariant;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Type\Type;
class AnnotationMethodReflection implements \PHPStan\Reflection\MethodReflection
{
    /** @var string */
    private $name;
    /** @var \PHPStan\Reflection\ClassReflection */
    private $declaringClass;
    /** @var  Type */
    private $returnType;
    /** @var bool */
    private $isStatic;
    /** @var \PHPStan\Reflection\Annotations\AnnotationsMethodParameterReflection[] */
    private $parameters;
    /** @var bool */
    private $isVariadic;
    /** @var FunctionVariant[]|null */
    private $variants;
    /**
     * @param string $name
     * @param ClassReflection $declaringClass
     * @param Type $returnType
     * @param \PHPStan\Reflection\Annotations\AnnotationsMethodParameterReflection[] $parameters
     * @param bool $isStatic
     * @param bool $isVariadic
     */
    public function __construct(string $name, \PHPStan\Reflection\ClassReflection $declaringClass, \PHPStan\Type\Type $returnType, array $parameters, bool $isStatic, bool $isVariadic)
    {
        $this->name = $name;
        $this->declaringClass = $declaringClass;
        $this->returnType = $returnType;
        $this->parameters = $parameters;
        $this->isStatic = $isStatic;
        $this->isVariadic = $isVariadic;
    }
    public function getDeclaringClass() : \PHPStan\Reflection\ClassReflection
    {
        return $this->declaringClass;
    }
    public function getPrototype() : \PHPStan\Reflection\ClassMemberReflection
    {
        return $this;
    }
    public function isStatic() : bool
    {
        return $this->isStatic;
    }
    public function isPrivate() : bool
    {
        return \false;
    }
    public function isPublic() : bool
    {
        return \true;
    }
    public function getName() : string
    {
        return $this->name;
    }
    /**
     * @return \PHPStan\Reflection\ParametersAcceptor[]
     */
    public function getVariants() : array
    {
        if ($this->variants === null) {
            $this->variants = [new \PHPStan\Reflection\FunctionVariant($this->parameters, $this->isVariadic, $this->returnType)];
        }
        return $this->variants;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection\Annotations;

use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\PropertiesClassReflectionExtension;
use PHPStan\Reflection\PropertyReflection;
use PHPStan\Type\FileTypeMapper;
class AnnotationsPropertiesClassReflectionExtension implements \PHPStan\Reflection\PropertiesClassReflectionExtension
{
    /** @var \PHPStan\Type\FileTypeMapper */
    private $fileTypeMapper;
    /** @var \PHPStan\Reflection\PropertyReflection[][] */
    private $properties = [];
    public function __construct(\PHPStan\Type\FileTypeMapper $fileTypeMapper)
    {
        $this->fileTypeMapper = $fileTypeMapper;
    }
    public function hasProperty(\PHPStan\Reflection\ClassReflection $classReflection, string $propertyName) : bool
    {
        if (!isset($this->properties[$classReflection->getName()])) {
            $this->properties[$classReflection->getName()] = $this->createProperties($classReflection, $classReflection);
        }
        return isset($this->properties[$classReflection->getName()][$propertyName]);
    }
    public function getProperty(\PHPStan\Reflection\ClassReflection $classReflection, string $propertyName) : \PHPStan\Reflection\PropertyReflection
    {
        return $this->properties[$classReflection->getName()][$propertyName];
    }
    /**
     * @param \PHPStan\Reflection\ClassReflection $classReflection
     * @param \PHPStan\Reflection\ClassReflection $declaringClass
     * @return \PHPStan\Reflection\PropertyReflection[]
     */
    private function createProperties(\PHPStan\Reflection\ClassReflection $classReflection, \PHPStan\Reflection\ClassReflection $declaringClass) : array
    {
        $properties = [];
        foreach ($classReflection->getTraits() as $traitClass) {
            $properties += $this->createProperties($traitClass, $classReflection);
        }
        foreach ($classReflection->getParents() as $parentClass) {
            $properties += $this->createProperties($parentClass, $parentClass);
            foreach ($parentClass->getTraits() as $traitClass) {
                $properties += $this->createProperties($traitClass, $parentClass);
            }
        }
        foreach ($classReflection->getInterfaces() as $interfaceClass) {
            $properties += $this->createProperties($interfaceClass, $interfaceClass);
        }
        $fileName = $classReflection->getFileName();
        if ($fileName === \false) {
            return $properties;
        }
        $docComment = $classReflection->getNativeReflection()->getDocComment();
        if ($docComment === \false) {
            return $properties;
        }
        $resolvedPhpDoc = $this->fileTypeMapper->getResolvedPhpDoc($fileName, $classReflection->getName(), null, $docComment);
        foreach ($resolvedPhpDoc->getPropertyTags() as $propertyName => $propertyTag) {
            $properties[$propertyName] = new \PHPStan\Reflection\Annotations\AnnotationPropertyReflection($declaringClass, $propertyTag->getType(), $propertyTag->isReadable(), $propertyTag->isWritable());
        }
        return $properties;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

class ClassConstantReflection implements \PHPStan\Reflection\ConstantReflection, \PHPStan\Reflection\DeprecatableReflection, \PHPStan\Reflection\InternableReflection
{
    /** @var \PHPStan\Reflection\ClassReflection */
    private $declaringClass;
    /** @var \ReflectionClassConstant */
    private $reflection;
    /** @var string|null */
    private $deprecatedDescription;
    /** @var bool */
    private $isDeprecated;
    /** @var bool */
    private $isInternal;
    public function __construct(\PHPStan\Reflection\ClassReflection $declaringClass, \ReflectionClassConstant $reflection, ?string $deprecatedDescription, bool $isDeprecated, bool $isInternal)
    {
        $this->declaringClass = $declaringClass;
        $this->reflection = $reflection;
        $this->deprecatedDescription = $deprecatedDescription;
        $this->isDeprecated = $isDeprecated;
        $this->isInternal = $isInternal;
    }
    public function getName() : string
    {
        return $this->reflection->getName();
    }
    /**
     * @return mixed
     */
    public function getValue()
    {
        return $this->reflection->getValue();
    }
    public function getDeclaringClass() : \PHPStan\Reflection\ClassReflection
    {
        return $this->declaringClass;
    }
    public function isStatic() : bool
    {
        return \true;
    }
    public function isPrivate() : bool
    {
        return $this->reflection->isPrivate();
    }
    public function isPublic() : bool
    {
        return $this->reflection->isPublic();
    }
    public function isDeprecated() : bool
    {
        return $this->isDeprecated;
    }
    public function getDeprecatedDescription() : ?string
    {
        if ($this->isDeprecated) {
            return $this->deprecatedDescription;
        }
        return null;
    }
    public function isInternal() : bool
    {
        return $this->isInternal;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

interface ReflectionWithFilename
{
    /**
     * @return string|false
     */
    public function getFileName();
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

use PHPStan\Type\Type;
interface ParametersAcceptorWithPhpDocs extends \PHPStan\Reflection\ParametersAcceptor
{
    /**
     * @return array<int, \PHPStan\Reflection\ParameterReflectionWithPhpDocs>
     */
    public function getParameters() : array;
    public function getPhpDocReturnType() : \PHPStan\Type\Type;
    public function getNativeReturnType() : \PHPStan\Type\Type;
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
class InaccessibleMethod implements \PHPStan\Reflection\ParametersAcceptor
{
    /** @var MethodReflection */
    private $methodReflection;
    public function __construct(\PHPStan\Reflection\MethodReflection $methodReflection)
    {
        $this->methodReflection = $methodReflection;
    }
    public function getMethod() : \PHPStan\Reflection\MethodReflection
    {
        return $this->methodReflection;
    }
    /**
     * @return array<int, \PHPStan\Reflection\ParameterReflection>
     */
    public function getParameters() : array
    {
        return [];
    }
    public function isVariadic() : bool
    {
        return \true;
    }
    public function getReturnType() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\MixedType();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
class TrivialParametersAcceptor implements \PHPStan\Reflection\ParametersAcceptor
{
    /**
     * @return array<int, \PHPStan\Reflection\ParameterReflection>
     */
    public function getParameters() : array
    {
        return [];
    }
    public function isVariadic() : bool
    {
        return \true;
    }
    public function getReturnType() : \PHPStan\Type\Type
    {
        return new \PHPStan\Type\MixedType();
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

interface InternableReflection
{
    public function isInternal() : bool;
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

interface ClassMemberReflection
{
    public function getDeclaringClass() : \PHPStan\Reflection\ClassReflection;
    public function isStatic() : bool;
    public function isPrivate() : bool;
    public function isPublic() : bool;
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

interface FinalizableReflection
{
    public function isFinal() : bool;
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

use PHPStan\Type\Type;
interface ThrowableReflection
{
    public function getThrowType() : ?\PHPStan\Type\Type;
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

class MissingConstantFromReflectionException extends \PHPStan\AnalysedCodeException
{
    public function __construct(string $className, string $constantName, ?string $currentFilename)
    {
        parent::__construct(\sprintf('Constant %s was not found in reflection of class %s - probably the wrong version of class is autoloaded.%s', $constantName, $className, $currentFilename !== null ? \sprintf(' The currently loaded version is at: %s', $currentFilename) : ''));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

class PassedByReference
{
    private const NO = 1;
    private const READS_ARGUMENT = 2;
    private const CREATES_NEW_VARIABLE = 3;
    /** @var self[] */
    private static $registry = [];
    /** @var int */
    private $value;
    private function __construct(int $value)
    {
        $this->value = $value;
    }
    private static function create(int $value) : self
    {
        if (!\array_key_exists($value, self::$registry)) {
            self::$registry[$value] = new self($value);
        }
        return self::$registry[$value];
    }
    public static function createNo() : self
    {
        return self::create(self::NO);
    }
    public static function createCreatesNewVariable() : self
    {
        return self::create(self::CREATES_NEW_VARIABLE);
    }
    public static function createReadsArgument() : self
    {
        return self::create(self::READS_ARGUMENT);
    }
    public function no() : bool
    {
        return $this->value === self::NO;
    }
    public function yes() : bool
    {
        return !$this->no();
    }
    public function equals(self $other) : bool
    {
        return $this->value === $other->value;
    }
    public function createsNewVariable() : bool
    {
        return $this->value === self::CREATES_NEW_VARIABLE;
    }
    public function combine(self $other) : self
    {
        if ($this->value > $other->value) {
            return $this;
        } elseif ($this->value < $other->value) {
            return $other;
        }
        return $this;
    }
    /**
     * @param mixed[] $properties
     * @return self
     */
    public static function __set_state(array $properties) : self
    {
        return new self($properties['value']);
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

use PHPStan\Reflection\Php\PhpFunctionReflection;
use PHPStan\Type\Type;
interface FunctionReflectionFactory
{
    /**
     * @param \ReflectionFunction $reflection
     * @param \PHPStan\Type\Type[] $phpDocParameterTypes
     * @param Type|null $phpDocReturnType
     * @param Type|null $phpDocThrowType
     * @param string|null $deprecatedDescription
     * @param bool $isDeprecated
     * @param bool $isInternal
     * @param bool $isFinal
     * @param string|false $filename
     * @return PhpFunctionReflection
     */
    public function create(\ReflectionFunction $reflection, array $phpDocParameterTypes, ?\PHPStan\Type\Type $phpDocReturnType, ?\PHPStan\Type\Type $phpDocThrowType, ?string $deprecatedDescription, bool $isDeprecated, bool $isInternal, bool $isFinal, $filename) : \PHPStan\Reflection\Php\PhpFunctionReflection;
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

interface DeprecatableReflection
{
    public function isDeprecated() : bool;
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

use PHPStan\Type\Type;
interface ParameterReflectionWithPhpDocs extends \PHPStan\Reflection\ParameterReflection
{
    public function getPhpDocType() : \PHPStan\Type\Type;
    public function getNativeType() : \PHPStan\Type\Type;
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

use PHPStan\Type\Type;
class FunctionVariant implements \PHPStan\Reflection\ParametersAcceptor
{
    /** @var array<int, ParameterReflection> */
    private $parameters;
    /** @var bool */
    private $isVariadic;
    /** @var Type */
    private $returnType;
    /**
     * @param array<int, ParameterReflection> $parameters
     * @param bool $isVariadic
     * @param Type $returnType
     */
    public function __construct(array $parameters, bool $isVariadic, \PHPStan\Type\Type $returnType)
    {
        $this->parameters = $parameters;
        $this->isVariadic = $isVariadic;
        $this->returnType = $returnType;
    }
    /**
     * @return array<int, ParameterReflection>
     */
    public function getParameters() : array
    {
        return $this->parameters;
    }
    public function isVariadic() : bool
    {
        return $this->isVariadic;
    }
    public function getReturnType() : \PHPStan\Type\Type
    {
        return $this->returnType;
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

interface PropertiesClassReflectionExtension
{
    public function hasProperty(\PHPStan\Reflection\ClassReflection $classReflection, string $propertyName) : bool;
    public function getProperty(\PHPStan\Reflection\ClassReflection $classReflection, string $propertyName) : \PHPStan\Reflection\PropertyReflection;
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

class MissingPropertyFromReflectionException extends \PHPStan\AnalysedCodeException
{
    public function __construct(string $className, string $propertyName, ?string $currentFilename)
    {
        parent::__construct(\sprintf('Property $%s was not found in reflection of class %s - probably the wrong version of class is autoloaded.%s', $propertyName, $className, $currentFilename !== null ? \sprintf(' The currently loaded version is at: %s', $currentFilename) : ''));
    }
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

use PHPStan\Type\Type;
interface PropertyReflection extends \PHPStan\Reflection\ClassMemberReflection
{
    public function getType() : \PHPStan\Type\Type;
    public function isReadable() : bool;
    public function isWritable() : bool;
}
<?php

declare (strict_types=1);
namespace PHPStan\Reflection;

/**
 * @deprecated
 */
interface BrokerAwareClassReflectionExtension extends \PHPStan\Reflection\BrokerAwareExtension
{
}
HuOfdrW   GBMB