<?php
namespace Claromentis\Core\Component;

$GLOBALS["__65da1b1ec2d66" . "53e8a0ab7848e53" . "6215"] = (@$GLOBALS["__65da1b1e" . "c2d6653e8a" . "0ab7848e53" . "6215"] ?: array()) + array("_989417b3b0bd1f9e7489ae" . "c1a9477a7c" => base64_decode("ZGVmY" . "XVsdF" . "9zdHJ" . "pbmc="), "defa" . "ult" => base64_decode("ZGVmYX" . "VsdA=="), "_49c6565477ee9f822b499a53e6d299" . "5f" => base64_decode("YXJyYXlfa2V5X2V4aXN" . "0cw=="), "_a31b91400b051f09bc1" . "54d683443056b" => base64_decode("SW52YWxpZCBvcHR" . "pb25zIGtleSAn"), "_eba32e53b2b46e6443f30" . "72f9bb42f07" => base64_decode("ZGF0Y" . "S0="), "_f61cbfe09f839854b95117fe" . "13b4a1ba" => base64_decode("c3" . "Ry" . "cG" . "9z"), "_e608e5b5c4c34a67ba97ef84c1e16" . "199" => base64_decode("J" . "w" . "=" . "="), "_d706c160e45bf7434fff82a5976f" . "0e19" => base64_decode("YXJyYXlfa" . "2V5cw=="), "_cfe3120f54395b67065" . "2b38c2d0a8e88" => base64_decode("c3" . "Vi" . "c3" . "Ry"), "ty" . "pe" => base64_decode("dHlwZQ" . "=="), "_70979d287fa2c98d21aa078" . "34c259a52" => base64_decode("c3RydG9sb" . "3dlcg=="));
use Claromentis\Core\Component\Exception\UnknownOptionException;
use Claromentis\Core\Component\ValueType\ValueType;
use Claromentis\Core\Component\ValueType\ValueTypeFactory;




class ValidatingOptions implements OptionsInterface
{
    protected $types = [];
    protected $values = [];
    
    
    
    
    
    
    
    
    
    
    public function __construct(array $_611d4f00b5d81631c8a2f6e92983631f = [], array $values = [])
    {
        foreach ($_611d4f00b5d81631c8a2f6e92983631f as $option_name => $_2eb87be11ba86628b66da5659d96a5e0) {
            
            
            $_2eb87be11ba86628b66da5659d96a5e0[$GLOBALS["__65da1b1ec2d6" . "653e8a0ab7848e" . "536215"]["ty" . "pe"]] = ValueTypeFactory::Create($_2eb87be11ba86628b66da5659d96a5e0);
            
            
            $this->types[$option_name] = $_2eb87be11ba86628b66da5659d96a5e0;
        }
        foreach ($values as $name => $value) {
            if (!isset($this->types[$name])) {
                continue;
            }
            
            
            
            $this->values[$name] = $this->GetType($name)->Normalize($value);
        }
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    public static function CreateFromSerialized($_611d4f00b5d81631c8a2f6e92983631f, $attributes)
    {
        $_6faea2dba9305d4c6c801d8bf61aa85f = new static($_611d4f00b5d81631c8a2f6e92983631f);
        foreach ($attributes as $key => $value) {
            
            
            if (isset($_6faea2dba9305d4c6c801d8bf61aa85f->types[$key])) {
                $_6faea2dba9305d4c6c801d8bf61aa85f->SetSerialized($key, $value);
                continue;
            }
            if ($GLOBALS["__65da1b1e" . "c2d6653e8a" . "0ab7848e53" . "6215"]["_f61cbfe09f839854b95117fe13b4a1" . "ba"]($key, $GLOBALS["__65da1b1ec2d6653e8a0ab7848e5362" . "15"]["_eba32e53b2b46e6443f3" . "072f9bb42f07"]) === false) {
                continue;
            }
            
            
            $_86469bf8bbc51b3172aec04497466913 = $GLOBALS["__65da1b1ec2d665" . "3e8a0ab7848e5362" . "15"]["_70979d287fa2c98d21aa07834" . "c259a52"]($GLOBALS["__65da1b1ec2d6653e8a0a" . "b7848e536215"]["_cfe3120f5" . "4395b67065" . "2b38c2d0a8" . "e88"]($key, 5));
            foreach ($_6faea2dba9305d4c6c801d8bf61aa85f->types as $type => $_6aead4bff5639b251aebcf8a630e43a7) {
                if ($GLOBALS["__65da1b1ec2d6653e" . "8a0ab7848e536215"]["_70979d28" . "7fa2c98d2" . "1aa07834c" . "259a52"]($type) === $_86469bf8bbc51b3172aec04497466913) {
                    $_6faea2dba9305d4c6c801d8bf61aa85f->SetSerialized($type, $value);
                }
            }
        }
        return $_6faea2dba9305d4c6c801d8bf61aa85f;
    }
    public function Get($name)
    {
        if (!isset($this->types[$name])) {
            return null;
        }
        
        
        if (isset($this->values[$name])) {
            return $this->values[$name];
        }
        return $this->GetDefault($name);
    }
    
    
    
    
    
    
    public function GetAll()
    {
        $_1f24efd4735b7a11b391147435e7d35d = [];
        foreach ($this->GetKeys() as $key) {
            $_1f24efd4735b7a11b391147435e7d35d[$key] = $this->Get($key);
        }
        return $_1f24efd4735b7a11b391147435e7d35d;
    }
    public function GetKeys()
    {
        return $GLOBALS["__65da1b1ec2d6653e8a0ab784" . "8e536215"]["_d706c160e4" . "5bf7434fff8" . "2a5976f0e19"]($this->types);
    }
    
    
    
    
    
    
    
    
    
    public function IsDefault($key)
    {
        if (!isset($this->values[$key])) {
            return true;
        }
        $value = $this->Get($key);
        $default = $this->GetDefault($key);
        return $default === $value;
    }
    
    
    
    
    
    
    
    
    
    public function GetType($key)
    {
        if (!$GLOBALS["__65da1b1ec" . "2d6653e8a0a" . "b7848e53621" . "5"]["_49c6565477ee9f" . "822b499a53e6d29" . "95f"]($key, $this->types)) {
            throw new UnknownOptionException($GLOBALS["__65da1b1ec2d6" . "653e8a0ab7848e" . "536215"]["_a31b91400b051f09bc154d6834" . "43056b"] . $key . $GLOBALS["__65da1b1" . "ec2d6653e" . "8a0ab7848" . "e536215"]["_e608e5b5c4c34a67ba97ef84c1" . "e16199"]);
        }
        return $this->types[$key][$GLOBALS["__65da1b1ec" . "2d6653e8a0a" . "b7848e53621" . "5"]["ty" . "pe"]];
    }
    
    
    
    
    
    
    
    
    
    public function GetSerialized($key)
    {
        $type = $this->GetType($key);
        return $type->Serialize($this->Get($key));
    }
    protected function SetSerialized($key, $_d957779c7daa148ba3e831d162d15722)
    {
        $type = $this->GetType($key);
        $this->values[$key] = $type->Unserialize($_d957779c7daa148ba3e831d162d15722);
    }
    
    
    
    
    
    
    
    public function GetDefault($key)
    {
        if (isset($this->types[$key][$GLOBALS["__65da1b1ec2d6653e8a0ab7848e5362" . "15"]["de" . "fa" . "ul" . "t"]])) {
            return $this->types[$key][$GLOBALS["__65da1b1ec2d6653e8a0ab" . "7848e536215"]["defaul" . "t"]];
        }
        if (!isset($this->types[$key][$GLOBALS["__65da1b1ec2d" . "6653e8a0ab784" . "8e536215"]["_989417b3" . "b0bd1f9e7" . "489aec1a9" . "477a7c"]])) {
            return null;
        }
        $type = $this->GetType($key);
        $_989417b3b0bd1f9e7489aec1a9477a7c = $this->types[$key][$GLOBALS["__65da1b1ec2" . "d6653e8a0ab7" . "848e536215"]["_989417b3b" . "0bd1f9e748" . "9aec1a9477" . "a7c"]];
        $default = $type->Unserialize($_989417b3b0bd1f9e7489aec1a9477a7c);
        $this->types[$GLOBALS["__65da1b1ec2d6653e8a0ab7848e5" . "36215"]["defau" . "lt"]] = $default;
        return $default;
    }
}