diff --git a/.gitignore b/.gitignore index b7923b22be..fe2e883a65 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ /built_x64 /built -/samples /thirdparty +/targetroot diff --git a/README.md b/README.md index a216893938..93a20db562 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ If you are on Ubuntu, this command should cover the most frequently used third-party packages: ```bash -sudo apt-get install python-dev libpng-dev zlib1g-dev libssl-dev libx11-dev libgl1-mesa-dev libxrandr-dev libxxf86dga-dev libxcursor-dev bison flex libfreetype6-dev libvorbis-dev libjpeg-dev libeigen3-dev libopenal-dev libode-dev libbullet-dev nvidia-cg-toolkit +sudo apt-get install build-essential pkg-config python-dev libpng-dev libjpeg-dev libtiff-dev zlib1g-dev libssl-dev libx11-dev libgl1-mesa-dev libxrandr-dev libxxf86dga-dev libxcursor-dev bison flex libfreetype6-dev libvorbis-dev libeigen3-dev libopenal-dev libode-dev libbullet-dev nvidia-cg-toolkit libgtk2.0-dev ``` Once Panda3D has built, you can either install the .deb or .rpm package that diff --git a/contrib/src/ai/aiBehaviors.cxx b/contrib/src/ai/aiBehaviors.cxx index b5a4e4b5a8..b88fc8679e 100644 --- a/contrib/src/ai/aiBehaviors.cxx +++ b/contrib/src/ai/aiBehaviors.cxx @@ -18,7 +18,7 @@ static const float _PI = 3.14; AIBehaviors::AIBehaviors() { - _steering_force = LVecBase3f(0.0, 0.0, 0.0); + _steering_force = LVecBase3(0.0, 0.0, 0.0); _behaviors_flags = _behaviors_flags & _none; _previous_conflict = false; _conflict = false; @@ -67,7 +67,7 @@ bool AIBehaviors::is_conflict() { } if(is_on(_flee)) { - LVecBase3f dirn = _flee_force; + LVecBase3 dirn = _flee_force; dirn.normalize(); _flee_force = _steering_force.length() * dirn * _flee_obj->_flee_weight; } @@ -77,7 +77,7 @@ bool AIBehaviors::is_conflict() { } if(is_on(_evade)) { - LVecBase3f dirn = _evade_force; + LVecBase3 dirn = _evade_force; dirn.normalize(); _evade_force = _steering_force.length() * dirn * _evade_obj->_evade_weight; } @@ -111,9 +111,9 @@ bool AIBehaviors::is_conflict() { ///////////////////////////////////////////////////////////////////////////////////////////////////// -void AIBehaviors::accumulate_force(string force_type, LVecBase3f force) { +void AIBehaviors::accumulate_force(string force_type, LVecBase3 force) { - LVecBase3f old_force; + LVecBase3 old_force; if(force_type == "seek") { old_force = _seek_force; @@ -169,8 +169,8 @@ void AIBehaviors::accumulate_force(string force_type, LVecBase3f force) { ////////////////////////////////////////////////////////////////////////////////////////////// -LVecBase3f AIBehaviors::calculate_prioritized() { - LVecBase3f force; +LVecBase3 AIBehaviors::calculate_prioritized() { + LVecBase3 force; if(is_on(_seek)) { if(_conflict) { @@ -299,13 +299,13 @@ LVecBase3f AIBehaviors::calculate_prioritized() { if(is_on(_arrival)) { if(_seek_obj != NULL) { - LVecBase3f dirn = _steering_force; + LVecBase3 dirn = _steering_force; dirn.normalize(); _steering_force = ((_steering_force.length() - _arrival_force.length()) * dirn); } if(_pursue_obj != NULL) { - LVecBase3f dirn = _steering_force; + LVecBase3 dirn = _steering_force; dirn.normalize(); _steering_force = ((_steering_force.length() - _arrival_force.length()) * _arrival_obj->_arrival_direction); } @@ -639,7 +639,7 @@ void AIBehaviors::resume_ai(string ai_type) { // Function : seek // Description : This function activates seek and makes an object of the Seek class. // This is the function we want the user to call for seek to be done. -// This function is overloaded to accept a NodePath or an LVecBase3f. +// This function is overloaded to accept a NodePath or an LVecBase3. ///////////////////////////////////////////////////////////////////////////////// @@ -648,7 +648,7 @@ void AIBehaviors::seek(NodePath target_object, float seek_wt) { turn_on("seek"); } -void AIBehaviors::seek(LVecBase3f pos, float seek_wt) { +void AIBehaviors::seek(LVecBase3 pos, float seek_wt) { _seek_obj = new Seek(_ai_char, pos, seek_wt); turn_on("seek"); } @@ -657,7 +657,7 @@ void AIBehaviors::seek(LVecBase3f pos, float seek_wt) { // // Function : flee // Description : This function activates flee_activate and creates an object of the Flee class. -// This function is overloaded to accept a NodePath or an LVecBase3f. +// This function is overloaded to accept a NodePath or an LVecBase3. ////////////////////////////////////////////////////////////////////////////////////////////////// @@ -668,7 +668,7 @@ void AIBehaviors::flee(NodePath target_object, double panic_distance, double rel turn_on("flee_activate"); } -void AIBehaviors::flee(LVecBase3f pos, double panic_distance, double relax_distance, float flee_wt) { +void AIBehaviors::flee(LVecBase3 pos, double panic_distance, double relax_distance, float flee_wt) { _flee_obj = new Flee(_ai_char, pos, panic_distance, relax_distance, flee_wt); _flee_list.insert(_flee_list.end(), *_flee_obj); @@ -769,38 +769,38 @@ void AIBehaviors::flock_activate() { ///////////////////////////////////////////////////////////////////////////////// -LVecBase3f AIBehaviors::do_flock() { +LVecBase3 AIBehaviors::do_flock() { //! Initialize variables required to compute the flocking force on the ai char. unsigned int neighbor_count = 0; - LVecBase3f separation_force = LVecBase3f(0.0, 0.0, 0.0); - LVecBase3f alignment_force = LVecBase3f(0.0, 0.0, 0.0); - LVecBase3f cohesion_force = LVecBase3f(0.0, 0.0, 0.0); - LVecBase3f avg_neighbor_heading = LVecBase3f(0.0, 0.0, 0.0); - LVecBase3f total_neighbor_heading = LVecBase3f(0.0, 0.0, 0.0); - LVecBase3f avg_center_of_mass = LVecBase3f(0.0, 0.0, 0.0); - LVecBase3f total_center_of_mass = LVecBase3f(0.0, 0.0, 0.0); + LVecBase3 separation_force = LVecBase3(0.0, 0.0, 0.0); + LVecBase3 alignment_force = LVecBase3(0.0, 0.0, 0.0); + LVecBase3 cohesion_force = LVecBase3(0.0, 0.0, 0.0); + LVecBase3 avg_neighbor_heading = LVecBase3(0.0, 0.0, 0.0); + LVecBase3 total_neighbor_heading = LVecBase3(0.0, 0.0, 0.0); + LVecBase3 avg_center_of_mass = LVecBase3(0.0, 0.0, 0.0); + LVecBase3 total_center_of_mass = LVecBase3(0.0, 0.0, 0.0); //! Loop through all the other AI units in the flock to check if they are neigbours. for(unsigned int i = 0; i < _flock_group->_ai_char_list.size(); i++) { if(_flock_group->_ai_char_list[i]->_name != _ai_char->_name) { //! Using visibilty cone to detect neighbors. - LVecBase3f dist_vect = _flock_group->_ai_char_list[i]->_ai_char_np.get_pos() - _ai_char->_ai_char_np.get_pos(); - LVecBase3f ai_char_heading = _ai_char->get_velocity(); + LVecBase3 dist_vect = _flock_group->_ai_char_list[i]->_ai_char_np.get_pos() - _ai_char->_ai_char_np.get_pos(); + LVecBase3 ai_char_heading = _ai_char->get_velocity(); ai_char_heading.normalize(); //! Check if the current unit is a neighbor. if(dist_vect.dot(ai_char_heading) > ((dist_vect.length()) * (ai_char_heading.length()) * cos(_flock_group->_flock_vcone_angle * (_PI / 180))) && (dist_vect.length() < _flock_group->_flock_vcone_radius)) { //! Separation force calculation. - LVecBase3f ai_char_to_units = _ai_char->_ai_char_np.get_pos() - _flock_group->_ai_char_list[i]->_ai_char_np.get_pos(); + LVecBase3 ai_char_to_units = _ai_char->_ai_char_np.get_pos() - _flock_group->_ai_char_list[i]->_ai_char_np.get_pos(); float to_units_dist = ai_char_to_units.length(); ai_char_to_units.normalize(); separation_force += (ai_char_to_units / to_units_dist); //! Calculating the total heading and center of mass of all the neighbors. - LVecBase3f neighbor_heading = _flock_group->_ai_char_list[i]->get_velocity(); + LVecBase3 neighbor_heading = _flock_group->_ai_char_list[i]->get_velocity(); neighbor_heading.normalize(); total_neighbor_heading += neighbor_heading; total_center_of_mass += _flock_group->_ai_char_list[i]->_ai_char_np.get_pos(); @@ -814,7 +814,7 @@ LVecBase3f AIBehaviors::do_flock() { if(neighbor_count > 0) { //! Alignment force calculation avg_neighbor_heading = total_neighbor_heading / neighbor_count; - LVector3f ai_char_heading = _ai_char->get_velocity(); + LVector3 ai_char_heading = _ai_char->get_velocity(); ai_char_heading.normalize(); avg_neighbor_heading -= ai_char_heading; avg_neighbor_heading.normalize(); @@ -822,7 +822,7 @@ LVecBase3f AIBehaviors::do_flock() { //! Cohesion force calculation avg_center_of_mass = total_center_of_mass / neighbor_count; - LVecBase3f cohesion_dir = avg_center_of_mass - _ai_char->_ai_char_np.get_pos(); + LVecBase3 cohesion_dir = avg_center_of_mass - _ai_char->_ai_char_np.get_pos(); cohesion_dir.normalize(); cohesion_force = cohesion_dir * _ai_char->_movt_force; } @@ -830,7 +830,7 @@ LVecBase3f AIBehaviors::do_flock() { _flock_done = true; turn_off("flock"); turn_on("flock_activate"); - return(LVecBase3f(0.0, 0.0, 0.0)); + return(LVecBase3(0.0, 0.0, 0.0)); } //! Calculate the resultant force on the ai character by taking into account the separation, alignment and cohesion @@ -885,7 +885,7 @@ void AIBehaviors::path_follow(float follow_wt) { ///////////////////////////////////////////////////////////////////////////////// -void AIBehaviors::add_to_path(LVecBase3f pos) { +void AIBehaviors::add_to_path(LVecBase3 pos) { _path_follow_obj->add_to_path(pos); } @@ -923,7 +923,7 @@ void AIBehaviors::init_path_find(const char* navmesh_filename) { /////////////////////////////////////////////////////////////////////////////////////// -void AIBehaviors::path_find_to(LVecBase3f pos, string type) { +void AIBehaviors::path_find_to(LVecBase3 pos, string type) { _path_find_obj->path_find(pos, type); } @@ -1330,56 +1330,56 @@ switch(char_to_int(ai_type)) { if (is_on(_seek)) { _behaviors_flags ^= _seek; } - _seek_force = LVecBase3f(0.0f, 0.0f, 0.0f); + _seek_force = LVecBase3(0.0f, 0.0f, 0.0f); break; } case 2: { if (is_on(_flee)) { _behaviors_flags ^= _flee; } - _flee_force = LVecBase3f(0.0f, 0.0f, 0.0f); + _flee_force = LVecBase3(0.0f, 0.0f, 0.0f); break; } case 3: { if(is_on(_pursue)) { _behaviors_flags ^= _pursue; } - _pursue_force = LVecBase3f(0.0f, 0.0f, 0.0f); + _pursue_force = LVecBase3(0.0f, 0.0f, 0.0f); break; } case 4: { if(is_on(_evade)) { _behaviors_flags ^= _evade; } - _evade_force = LVecBase3f(0.0f, 0.0f, 0.0f); + _evade_force = LVecBase3(0.0f, 0.0f, 0.0f); break; } case 5: { if (is_on(_arrival)) { _behaviors_flags ^= _arrival; } - _arrival_force = LVecBase3f(0.0f, 0.0f, 0.0f); + _arrival_force = LVecBase3(0.0f, 0.0f, 0.0f); break; } case 6: { if(is_on(_flock)) { _behaviors_flags ^= _flock; } - _flock_force = LVecBase3f(0.0f, 0.0f, 0.0f); + _flock_force = LVecBase3(0.0f, 0.0f, 0.0f); break; } case 7: { if(is_on(_wander)) { _behaviors_flags ^= _wander; } - _wander_force = LVecBase3f(0.0f, 0.0f, 0.0f); + _wander_force = LVecBase3(0.0f, 0.0f, 0.0f); break; } case 8: { if(is_on(_obstacle_avoidance)) { _behaviors_flags ^= _obstacle_avoidance; } - _obstacle_avoidance_force = LVecBase3f(0.0f, 0.0f, 0.0f); + _obstacle_avoidance_force = LVecBase3(0.0f, 0.0f, 0.0f); break; } case 9:{ diff --git a/contrib/src/ai/aiBehaviors.h b/contrib/src/ai/aiBehaviors.h index 45a2761023..edba504662 100644 --- a/contrib/src/ai/aiBehaviors.h +++ b/contrib/src/ai/aiBehaviors.h @@ -73,41 +73,41 @@ public: Flock *_flock_group; int _behaviors_flags; - LVecBase3f _steering_force; + LVecBase3 _steering_force; Seek *_seek_obj; - LVecBase3f _seek_force; + LVecBase3 _seek_force; Flee *_flee_obj; - LVecBase3f _flee_force; + LVecBase3 _flee_force; //! This list is used if the ai character needs to flee from multiple onjects. ListFlee _flee_list; ListFlee::iterator _flee_itr; Pursue *_pursue_obj; - LVecBase3f _pursue_force; + LVecBase3 _pursue_force; Evade *_evade_obj; - LVecBase3f _evade_force; + LVecBase3 _evade_force; //! This list is used if the ai character needs to evade from multiple onjects. ListEvade _evade_list; ListEvade::iterator _evade_itr; Arrival *_arrival_obj; - LVecBase3f _arrival_force; + LVecBase3 _arrival_force; //! Since Flock is a collective behavior the variables are declared within the AIBehaviors class. float _flock_weight; - LVecBase3f _flock_force; + LVecBase3 _flock_force; bool _flock_done; Wander * _wander_obj; - LVecBase3f _wander_force; + LVecBase3 _wander_force; ObstacleAvoidance *_obstacle_avoidance_obj; - LVecBase3f _obstacle_avoidance_force; + LVecBase3 _obstacle_avoidance_force; PathFollow *_path_follow_obj; @@ -127,20 +127,20 @@ public: bool is_conflict(); - void accumulate_force(string force_type, LVecBase3f force); - LVecBase3f calculate_prioritized(); + void accumulate_force(string force_type, LVecBase3 force); + LVecBase3 calculate_prioritized(); void flock_activate(); - LVecBase3f do_flock(); + LVecBase3 do_flock(); int char_to_int(string ai_type); PUBLISHED: void seek(NodePath target_object, float seek_wt = 1.0); - void seek(LVecBase3f pos, float seek_wt = 1.0); + void seek(LVecBase3 pos, float seek_wt = 1.0); void flee(NodePath target_object, double panic_distance = 10.0, double relax_distance = 10.0, float flee_wt = 1.0); - void flee(LVecBase3f pos, double panic_distance = 10.0, double relax_distance = 10.0, float flee_wt = 1.0); + void flee(LVecBase3 pos, double panic_distance = 10.0, double relax_distance = 10.0, float flee_wt = 1.0); void pursue(NodePath target_object, float pursue_wt = 1.0); @@ -155,12 +155,12 @@ PUBLISHED: void obstacle_avoidance(float feeler_length = 1.0); void path_follow(float follow_wt); - void add_to_path(LVecBase3f pos); + void add_to_path(LVecBase3 pos); void start_follow(string type = "normal"); // should have different function names. void init_path_find(const char* navmesh_filename); - void path_find_to(LVecBase3f pos, string type = "normal"); + void path_find_to(LVecBase3 pos, string type = "normal"); void path_find_to(NodePath target, string type = "normal"); void add_static_obstacle(NodePath obstacle); void add_dynamic_obstacle(NodePath obstacle); diff --git a/contrib/src/ai/aiCharacter.cxx b/contrib/src/ai/aiCharacter.cxx index e5a95005aa..fffa7ac2bb 100644 --- a/contrib/src/ai/aiCharacter.cxx +++ b/contrib/src/ai/aiCharacter.cxx @@ -23,8 +23,8 @@ AICharacter::AICharacter(string model_name, NodePath model_np, double mass, doub _max_force = max_force; _movt_force = movt_force; - _velocity = LVecBase3f(0.0, 0.0, 0.0); - _steering_force = LVecBase3f(0.0, 0.0, 0.0); + _velocity = LVecBase3(0.0, 0.0, 0.0); + _steering_force = LVecBase3(0.0, 0.0, 0.0); _steering = new AIBehaviors(); _steering->_ai_char = this; @@ -43,48 +43,43 @@ AICharacter::~AICharacter() { // This also makes the character look at the direction of the force. ///////////////////////////////////////////////////////////////////////////////////////// - -void AICharacter::update() { - - if(!_steering->is_off(_steering->_none)) { - - LVecBase3f old_pos = _ai_char_np.get_pos(); - - LVecBase3f steering_force = _steering->calculate_prioritized(); - - LVecBase3f acceleration = steering_force / _mass; +void AICharacter:: +update() { + if (!_steering->is_off(_steering->_none)) { + LVecBase3 old_pos = _ai_char_np.get_pos(); + LVecBase3 steering_force = _steering->calculate_prioritized(); + LVecBase3 acceleration = steering_force / _mass; _velocity = acceleration; - LVecBase3f direction = _steering->_steering_force; + LVecBase3 direction = _steering->_steering_force; direction.normalize(); _ai_char_np.set_pos(old_pos + _velocity) ; - if(steering_force.length() > 0) { + if (steering_force.length() > 0) { _ai_char_np.look_at(old_pos + (direction * 5)); _ai_char_np.set_h(_ai_char_np.get_h() + 180); _ai_char_np.set_p(-_ai_char_np.get_p()); _ai_char_np.set_r(-_ai_char_np.get_r()); } - } - else { - _steering->_steering_force = LVecBase3f(0.0, 0.0, 0.0); - _steering->_seek_force = LVecBase3f(0.0, 0.0, 0.0); - _steering->_flee_force = LVecBase3f(0.0, 0.0, 0.0); - _steering->_pursue_force = LVecBase3f(0.0, 0.0, 0.0); - _steering->_evade_force = LVecBase3f(0.0, 0.0, 0.0); - _steering->_arrival_force = LVecBase3f(0.0, 0.0, 0.0); - _steering->_flock_force = LVecBase3f(0.0, 0.0, 0.0); - _steering->_wander_force = LVecBase3f(0.0, 0.0, 0.0); + } else { + _steering->_steering_force = LVecBase3(0.0, 0.0, 0.0); + _steering->_seek_force = LVecBase3(0.0, 0.0, 0.0); + _steering->_flee_force = LVecBase3(0.0, 0.0, 0.0); + _steering->_pursue_force = LVecBase3(0.0, 0.0, 0.0); + _steering->_evade_force = LVecBase3(0.0, 0.0, 0.0); + _steering->_arrival_force = LVecBase3(0.0, 0.0, 0.0); + _steering->_flock_force = LVecBase3(0.0, 0.0, 0.0); + _steering->_wander_force = LVecBase3(0.0, 0.0, 0.0); } } -LVecBase3f AICharacter::get_velocity() { +LVecBase3 AICharacter::get_velocity() { return _velocity; } -void AICharacter::set_velocity(LVecBase3f velocity) { +void AICharacter::set_velocity(LVecBase3 velocity) { _velocity = velocity; } diff --git a/contrib/src/ai/aiCharacter.h b/contrib/src/ai/aiCharacter.h index 87a7925dda..f7af68a372 100644 --- a/contrib/src/ai/aiCharacter.h +++ b/contrib/src/ai/aiCharacter.h @@ -39,8 +39,8 @@ class EXPCL_PANDAAI AICharacter { public: double _mass; double _max_force; - LVecBase3f _velocity; - LVecBase3f _steering_force; + LVecBase3 _velocity; + LVecBase3 _steering_force; string _name; double _movt_force; unsigned int _ai_char_flock_id; @@ -51,7 +51,7 @@ class EXPCL_PANDAAI AICharacter { bool _pf_guide; void update(); - void set_velocity(LVecBase3f vel); + void set_velocity(LVecBase3 vel); void set_char_render(NodePath render); NodePath get_char_render(); @@ -59,7 +59,7 @@ PUBLISHED: double get_mass(); void set_mass(double m); - LVecBase3f get_velocity(); + LVecBase3 get_velocity(); double get_max_force(); void set_max_force(double max_force); diff --git a/contrib/src/ai/aiNode.cxx b/contrib/src/ai/aiNode.cxx index 00c1fa57a3..713d349f7e 100644 --- a/contrib/src/ai/aiNode.cxx +++ b/contrib/src/ai/aiNode.cxx @@ -14,7 +14,7 @@ #include "aiNode.h" -AINode::AINode(int grid_x, int grid_y, LVecBase3f pos, float w, float l, float h) { +AINode::AINode(int grid_x, int grid_y, LVecBase3 pos, float w, float l, float h) { for (int i = 0; i < 8; ++i) { _neighbours[i] = NULL; } diff --git a/contrib/src/ai/aiNode.h b/contrib/src/ai/aiNode.h index b84fe56c0f..d0af520b88 100644 --- a/contrib/src/ai/aiNode.h +++ b/contrib/src/ai/aiNode.h @@ -29,13 +29,7 @@ // on the mesh. //////////////////////////////////////////////////////////////////// class EXPCL_PANDAAI AINode { -PUBLISHED: - // This variable specifies whether the node is an obtacle or not. - // Used for dynamic obstacle addition to the environment. - // obstacle = false - // navigational = true - bool _type; - +public: // This variable specifies the node status whether open, close // or neutral. // open = belongs to _open_list. @@ -48,6 +42,12 @@ PUBLISHED: }; Status _status; + // This variable specifies whether the node is an obtacle or not. + // Used for dynamic obstacle addition to the environment. + // obstacle = false + // navigational = true + bool _type; + // The score is used to compute the traversal expense to nodes // when using A*. // _score = _cost + heuristic @@ -62,7 +62,7 @@ PUBLISHED: int _grid_x, _grid_y; // Position of the node in 3D space. - LVecBase3f _position; + LVecBase3 _position; // Dimensions of each face / cell on the mesh. // Height is given in case of expansion to a 3d mesh. Currently @@ -76,7 +76,8 @@ PUBLISHED: // is written into navmesh.csv file. AINode *_next; - AINode(int grid_x, int grid_y, LVecBase3f pos, float w, float l, float h); +PUBLISHED: + AINode(int grid_x, int grid_y, LVecBase3 pos, float w, float l, float h); ~AINode(); bool contains(float x, float y); diff --git a/contrib/src/ai/aiPathFinder.cxx b/contrib/src/ai/aiPathFinder.cxx index 2857b21062..789b587a7d 100644 --- a/contrib/src/ai/aiPathFinder.cxx +++ b/contrib/src/ai/aiPathFinder.cxx @@ -36,7 +36,7 @@ void PathFinder::find_path(Node *src_node, Node *dest_node) { // Add a dummy node as the first element of the open list with score = -1. // Inorder to implement a binary heap the index of the elements should never be 0. - Node *_dummy_node = new Node(-1, -1, LVecBase3f(0.0, 0.0, 0.0), 0, 0, 0); + Node *_dummy_node = new Node(-1, -1, LVecBase3(0.0, 0.0, 0.0), 0, 0, 0); _dummy_node->_status = _dummy_node->open; _dummy_node->_score = -1; _open_list.push_back(_dummy_node); @@ -379,7 +379,7 @@ void PathFinder::remove_from_clist(int r, int c) { ///////////////////////////////////////////////////////////////////////////////////////// -Node* find_in_mesh(NavMesh nav_mesh, LVecBase3f pos, int grid_size) { +Node* find_in_mesh(NavMesh nav_mesh, LVecBase3 pos, int grid_size) { int size = grid_size; float x = pos[0]; float y = pos[1]; diff --git a/contrib/src/ai/aiPathFinder.h b/contrib/src/ai/aiPathFinder.h index c1c167ad54..eb2f8de70b 100644 --- a/contrib/src/ai/aiPathFinder.h +++ b/contrib/src/ai/aiPathFinder.h @@ -23,7 +23,7 @@ typedef vector NodeArray; typedef vector NavMesh; -Node* find_in_mesh(NavMesh nav_mesh, LVecBase3f pos, int grid_size); +Node* find_in_mesh(NavMesh nav_mesh, LVecBase3 pos, int grid_size); //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // diff --git a/contrib/src/ai/arrival.cxx b/contrib/src/ai/arrival.cxx index 329955aba1..14b84030d4 100644 --- a/contrib/src/ai/arrival.cxx +++ b/contrib/src/ai/arrival.cxx @@ -36,8 +36,8 @@ Arrival::~Arrival() { ///////////////////////////////////////////////////////////////////////////////// -LVecBase3f Arrival::do_arrival() { - LVecBase3f direction_to_target; +LVecBase3 Arrival::do_arrival() { + LVecBase3 direction_to_target; double distance; if(_arrival_type) { @@ -52,22 +52,22 @@ LVecBase3f Arrival::do_arrival() { _arrival_direction.normalize(); if(int(distance) == 0) { - _ai_char->_steering->_steering_force = LVecBase3f(0.0, 0.0, 0.0); - _ai_char->_steering->_arrival_force = LVecBase3f(0.0, 0.0, 0.0); + _ai_char->_steering->_steering_force = LVecBase3(0.0, 0.0, 0.0); + _ai_char->_steering->_arrival_force = LVecBase3(0.0, 0.0, 0.0); if(_ai_char->_steering->_seek_obj != NULL) { _ai_char->_steering->turn_off("arrival"); _ai_char->_steering->turn_on("arrival_activate"); } _arrival_done = true; - return(LVecBase3f(0.0, 0.0, 0.0)); + return(LVecBase3(0.0, 0.0, 0.0)); } else { _arrival_done = false; } double u = _ai_char->get_velocity().length(); - LVecBase3f desired_force = ((u * u) / (2 * distance)) * _ai_char->get_mass(); + LVecBase3 desired_force = ((u * u) / (2 * distance)) * _ai_char->get_mass(); if(_ai_char->_steering->_seek_obj != NULL) { return(desired_force); @@ -85,7 +85,7 @@ LVecBase3f Arrival::do_arrival() { } cout<<"Arrival works only with seek and pursue"<_ai_char_np.get_pos(_ai_char->_window_render) - _ai_char->get_ai_behaviors()->_pursue_obj->_pursue_target.get_pos(_ai_char->_window_render)); } diff --git a/contrib/src/ai/arrival.h b/contrib/src/ai/arrival.h index 69c0709e7a..788db0c1dd 100644 --- a/contrib/src/ai/arrival.h +++ b/contrib/src/ai/arrival.h @@ -27,9 +27,9 @@ public: AICharacter *_ai_char; NodePath _arrival_target; - LVecBase3f _arrival_target_pos; + LVecBase3 _arrival_target_pos; double _arrival_distance; - LVecBase3f _arrival_direction; + LVecBase3 _arrival_direction; bool _arrival_done; // This flag specifies if the arrival behavior is being used with seek or pursue behavior. @@ -39,7 +39,7 @@ public: Arrival(AICharacter *ai_ch, double distance = 10.0); ~Arrival(); - LVecBase3f do_arrival(); + LVecBase3 do_arrival(); void arrival_activate(); }; diff --git a/contrib/src/ai/evade.cxx b/contrib/src/ai/evade.cxx index 149ab4fbf4..c40f920ca9 100644 --- a/contrib/src/ai/evade.cxx +++ b/contrib/src/ai/evade.cxx @@ -42,23 +42,23 @@ Evade::~Evade() { ///////////////////////////////////////////////////////////////////////////////// -LVecBase3f Evade::do_evade() { +LVecBase3 Evade::do_evade() { assert(_evade_target && "evade target not assigned"); _evade_direction = _ai_char->_ai_char_np.get_pos(_ai_char->_window_render) - _evade_target.get_pos(_ai_char->_window_render); double distance = _evade_direction.length(); _evade_direction.normalize(); - LVecBase3f desired_force = _evade_direction * _ai_char->_movt_force; + LVecBase3 desired_force = _evade_direction * _ai_char->_movt_force; if(distance > (_evade_distance + _evade_relax_distance)) { if((_ai_char->_steering->_behaviors_flags | _ai_char->_steering->_evade) == _ai_char->_steering->_evade) { - _ai_char->_steering->_steering_force = LVecBase3f(0.0, 0.0, 0.0); + _ai_char->_steering->_steering_force = LVecBase3(0.0, 0.0, 0.0); } _ai_char->_steering->turn_off("evade"); _ai_char->_steering->turn_on("evade_activate"); _evade_done = true; - return(LVecBase3f(0.0, 0.0, 0.0)); + return(LVecBase3(0.0, 0.0, 0.0)); } else { _evade_done = false; diff --git a/contrib/src/ai/evade.h b/contrib/src/ai/evade.h index 088548ea28..4de79149fa 100644 --- a/contrib/src/ai/evade.h +++ b/contrib/src/ai/evade.h @@ -28,7 +28,7 @@ public: NodePath _evade_target; float _evade_weight; - LVecBase3f _evade_direction; + LVecBase3 _evade_direction; double _evade_distance; double _evade_relax_distance; bool _evade_done; @@ -38,7 +38,7 @@ public: double relax_distance, float evade_wt); ~Evade(); - LVecBase3f do_evade(); + LVecBase3 do_evade(); void evade_activate(); }; diff --git a/contrib/src/ai/flee.cxx b/contrib/src/ai/flee.cxx index af0b2a0548..b1579aeedb 100644 --- a/contrib/src/ai/flee.cxx +++ b/contrib/src/ai/flee.cxx @@ -29,7 +29,7 @@ Flee::Flee(AICharacter *ai_ch, NodePath target_object, double panic_distance, _flee_activate_done = false; } -Flee::Flee(AICharacter *ai_ch, LVecBase3f pos, double panic_distance, +Flee::Flee(AICharacter *ai_ch, LVecBase3 pos, double panic_distance, double relax_distance, float flee_wt){ _ai_char = ai_ch; @@ -57,10 +57,10 @@ Flee::~Flee() { ///////////////////////////////////////////////////////////////////////////////// -LVecBase3f Flee::do_flee() { - LVecBase3f dirn; +LVecBase3 Flee::do_flee() { + LVecBase3 dirn; double distance; - LVecBase3f desired_force; + LVecBase3 desired_force; dirn = _ai_char->_ai_char_np.get_pos(_ai_char->_window_render) - _flee_present_pos; distance = dirn.length(); @@ -68,12 +68,12 @@ LVecBase3f Flee::do_flee() { if(distance > (_flee_distance + _flee_relax_distance)) { if((_ai_char->_steering->_behaviors_flags | _ai_char->_steering->_flee) == _ai_char->_steering->_flee) { - _ai_char->_steering->_steering_force = LVecBase3f(0.0, 0.0, 0.0); + _ai_char->_steering->_steering_force = LVecBase3(0.0, 0.0, 0.0); } _flee_done = true; _ai_char->_steering->turn_off("flee"); _ai_char->_steering->turn_on("flee_activate"); - return(LVecBase3f(0.0, 0.0, 0.0)); + return(LVecBase3(0.0, 0.0, 0.0)); } else { return(desired_force); @@ -90,7 +90,7 @@ LVecBase3f Flee::do_flee() { ///////////////////////////////////////////////////////////////////////////////// void Flee::flee_activate() { - LVecBase3f dirn; + LVecBase3 dirn; double distance; _flee_activate_done = false; diff --git a/contrib/src/ai/flee.h b/contrib/src/ai/flee.h index fc3e86c931..0d63b47baa 100644 --- a/contrib/src/ai/flee.h +++ b/contrib/src/ai/flee.h @@ -26,23 +26,23 @@ class EXPCL_PANDAAI Flee { public: AICharacter *_ai_char; - LVecBase3f _flee_position; + LVecBase3 _flee_position; float _flee_weight; - LVecBase3f _flee_direction; + LVecBase3 _flee_direction; double _flee_distance; double _flee_relax_distance; - LVecBase3f _flee_present_pos; + LVecBase3 _flee_present_pos; bool _flee_done; bool _flee_activate_done; Flee(AICharacter *ai_ch, NodePath target_object, double panic_distance = 10.0, double relax_distance = 10.0, float flee_wt = 1.0); - Flee(AICharacter *ai_ch, LVecBase3f pos, double panic_distance = 10.0, + Flee(AICharacter *ai_ch, LVecBase3 pos, double panic_distance = 10.0, double relax_distance = 10.0, float flee_wt = 1.0); ~Flee(); - LVecBase3f do_flee(); + LVecBase3 do_flee(); void flee_activate(); }; diff --git a/contrib/src/ai/meshNode.cxx b/contrib/src/ai/meshNode.cxx index 0dfdf49ac6..9d119bbb66 100644 --- a/contrib/src/ai/meshNode.cxx +++ b/contrib/src/ai/meshNode.cxx @@ -1,7 +1,7 @@ #include "meshNode.h" -Node::Node(int grid_x, int grid_y, LVecBase3f pos, float w, float l, float h) { +Node::Node(int grid_x, int grid_y, LVecBase3 pos, float w, float l, float h) { for(int i = 0; i < 8; ++i) { _neighbours[i] = NULL; } diff --git a/contrib/src/ai/meshNode.h b/contrib/src/ai/meshNode.h index bf2db9680f..b9e1421558 100644 --- a/contrib/src/ai/meshNode.h +++ b/contrib/src/ai/meshNode.h @@ -47,7 +47,7 @@ public: int _grid_x, _grid_y; // Position of the node in 3D space. - LVecBase3f _position; + LVecBase3 _position; // Dimensions of each face / cell on the mesh. // Height is given in case of expansion to a 3d mesh. Currently not used. @@ -58,7 +58,7 @@ public: // Note: The data in this member is discarded when mesh data is written into navmesh.csv file. Node *_next; - Node(int grid_x, int grid_y, LVecBase3f pos, float w, float l, float h); + Node(int grid_x, int grid_y, LVecBase3 pos, float w, float l, float h); ~Node(); bool contains(float x, float y); diff --git a/contrib/src/ai/obstacleAvoidance.cxx b/contrib/src/ai/obstacleAvoidance.cxx index 7354636194..9cb9deed9c 100644 --- a/contrib/src/ai/obstacleAvoidance.cxx +++ b/contrib/src/ai/obstacleAvoidance.cxx @@ -35,15 +35,15 @@ bool ObstacleAvoidance::obstacle_detection() { // Calculate the volume of the AICharacter with respect to render PT(BoundingVolume) np_bounds = _ai_char->get_node_path().get_bounds(); CPT(BoundingSphere) np_sphere = np_bounds->as_bounding_sphere(); - LVecBase3f avoidance(0.0, 0.0, 0.0); + LVecBase3 avoidance(0.0, 0.0, 0.0); double distance = 0x7fff ; double expanded_radius; - LVecBase3f to_obstacle; - LVecBase3f prev_avoidance; + LVecBase3 to_obstacle; + LVecBase3 prev_avoidance; for(unsigned int i = 0; i < _ai_char->_world->_obstacles.size(); ++i) { PT(BoundingVolume) bounds = _ai_char->_world->_obstacles[i].get_bounds(); CPT(BoundingSphere) bsphere = bounds->as_bounding_sphere(); - LVecBase3f near_obstacle = _ai_char->_world->_obstacles[i].get_pos() - _ai_char->get_node_path().get_pos(); + LVecBase3 near_obstacle = _ai_char->_world->_obstacles[i].get_pos() - _ai_char->get_node_path().get_pos(); // Check if it's the nearest obstacle, If so initialize as the nearest obstacle if((near_obstacle.length() < distance) && (_ai_char->_world->_obstacles[i].get_pos() != _ai_char->get_node_path().get_pos())) { _nearest_obstacle = _ai_char->_world->_obstacles[i]; @@ -51,13 +51,13 @@ bool ObstacleAvoidance::obstacle_detection() { expanded_radius = bsphere->get_radius() + np_sphere->get_radius(); } } - LVecBase3f feeler = _feeler * _ai_char->get_char_render().get_relative_vector(_ai_char->get_node_path(), LVector3f::forward()); + LVecBase3 feeler = _feeler * _ai_char->get_char_render().get_relative_vector(_ai_char->get_node_path(), LVector3::forward()); feeler.normalize(); feeler *= (expanded_radius + np_sphere->get_radius()) ; to_obstacle = _nearest_obstacle.get_pos() - _ai_char->get_node_path().get_pos(); - LVector3f line_vector = _ai_char->get_char_render().get_relative_vector(_ai_char->get_node_path(), LVector3f::forward()); - LVecBase3f project = (to_obstacle.dot(line_vector) * line_vector) / line_vector.length_squared(); - LVecBase3f perp = project - to_obstacle; + LVector3 line_vector = _ai_char->get_char_render().get_relative_vector(_ai_char->get_node_path(), LVector3::forward()); + LVecBase3 project = (to_obstacle.dot(line_vector) * line_vector) / line_vector.length_squared(); + LVecBase3 perp = project - to_obstacle; // If the nearest obstacle will collide with our AICharacter then send obstacle detection as true if((_nearest_obstacle) && (perp.length() < expanded_radius - np_sphere->get_radius()) && (project.length() < feeler.length())) { return true; @@ -90,27 +90,27 @@ void ObstacleAvoidance::obstacle_avoidance_activate() { ///////////////////////////////////////////////////////////////////////////////// -LVecBase3f ObstacleAvoidance::do_obstacle_avoidance() { - LVecBase3f offset = _ai_char->get_node_path().get_pos() - _nearest_obstacle.get_pos(); +LVecBase3 ObstacleAvoidance::do_obstacle_avoidance() { + LVecBase3 offset = _ai_char->get_node_path().get_pos() - _nearest_obstacle.get_pos(); PT(BoundingVolume) bounds =_nearest_obstacle.get_bounds(); CPT(BoundingSphere) bsphere = bounds->as_bounding_sphere(); PT(BoundingVolume) np_bounds = _ai_char->get_node_path().get_bounds(); CPT(BoundingSphere) np_sphere = np_bounds->as_bounding_sphere(); double distance_needed = offset.length() - bsphere->get_radius() - np_sphere->get_radius(); if((obstacle_detection())) { - LVecBase3f direction = _ai_char->get_char_render().get_relative_vector(_ai_char->get_node_path(), LVector3f::forward()); + LVecBase3 direction = _ai_char->get_char_render().get_relative_vector(_ai_char->get_node_path(), LVector3::forward()); direction.normalize(); float forward_component = offset.dot(direction); - LVecBase3f projection = forward_component * direction; - LVecBase3f perpendicular_component = offset - projection; + LVecBase3 projection = forward_component * direction; + LVecBase3 perpendicular_component = offset - projection; double p = perpendicular_component.length(); perpendicular_component.normalize(); - LVecBase3f avoidance = perpendicular_component; + LVecBase3 avoidance = perpendicular_component; // The more closer the obstacle, the more force it generates avoidance = (avoidance * _ai_char->get_max_force() * _ai_char->_movt_force) / (p + 0.01); return avoidance; } _ai_char->_steering->turn_on("obstacle_avoidance_activate"); _ai_char->_steering->turn_off("obstacle_avoidance"); - return LVecBase3f(0, 0, 0); + return LVecBase3(0, 0, 0); } diff --git a/contrib/src/ai/obstacleAvoidance.h b/contrib/src/ai/obstacleAvoidance.h index 9df1c2bde1..787a417592 100644 --- a/contrib/src/ai/obstacleAvoidance.h +++ b/contrib/src/ai/obstacleAvoidance.h @@ -30,7 +30,7 @@ class EXPCL_PANDAAI ObstacleAvoidance { float _feeler; ObstacleAvoidance(AICharacter *ai_char, float feeler_length); - LVecBase3f do_obstacle_avoidance(); + LVecBase3 do_obstacle_avoidance(); ~ObstacleAvoidance(); void obstacle_avoidance_activate(); bool obstacle_detection(); diff --git a/contrib/src/ai/pathFind.cxx b/contrib/src/ai/pathFind.cxx index 65fa6f57d6..f4c8fd7d9f 100644 --- a/contrib/src/ai/pathFind.cxx +++ b/contrib/src/ai/pathFind.cxx @@ -29,7 +29,7 @@ void PathFind::create_nav_mesh(const char* navmesh_filename) { // Stage variables. int grid_x, grid_y; float l, w, h; - LVecBase3f position; + LVecBase3 position; // Variable to hold line data read from file. string line; @@ -75,7 +75,7 @@ void PathFind::create_nav_mesh(const char* navmesh_filename) { l = atof(fields[4].c_str()); w = atof(fields[5].c_str()); h = atof(fields[6].c_str()); - position = LVecBase3f(atof(fields[7].c_str()), atof(fields[8].c_str()), atof(fields[9].c_str())); + position = LVecBase3(atof(fields[7].c_str()), atof(fields[8].c_str()), atof(fields[9].c_str())); Node *stage_node = new Node(grid_x, grid_y, position, w, l, h); @@ -197,7 +197,7 @@ void PathFind::set_path_find(const char* navmesh_filename) { /////////////////////////////////////////////////////////////////////////////////////// -void PathFind::path_find(LVecBase3f pos, string type) { +void PathFind::path_find(LVecBase3 pos, string type) { if(type == "addPath") { if(_ai_char->_steering->_path_follow_obj) { _ai_char->_steering->remove_ai("pathfollow"); diff --git a/contrib/src/ai/pathFind.h b/contrib/src/ai/pathFind.h index a82142947b..cb9030e000 100644 --- a/contrib/src/ai/pathFind.h +++ b/contrib/src/ai/pathFind.h @@ -43,7 +43,7 @@ public: int _grid_size; NodePath _path_find_target; - LVecBase3f _prev_position; + LVecBase3 _prev_position; PT(GeomNode) _parent; LineSegs *_pen; vector _previous_obstacles; @@ -62,7 +62,7 @@ public: void clear_previous_obstacles(); void set_path_find(const char* navmesh_filename); - void path_find(LVecBase3f pos, string type = "normal"); + void path_find(LVecBase3 pos, string type = "normal"); void path_find(NodePath target, string type = "normal"); void add_obstacle_to_mesh(NodePath obstacle); void dynamic_avoid(NodePath obstacle); diff --git a/contrib/src/ai/pathFollow.cxx b/contrib/src/ai/pathFollow.cxx index 0e276eb5c4..43e155028b 100644 --- a/contrib/src/ai/pathFollow.cxx +++ b/contrib/src/ai/pathFollow.cxx @@ -20,7 +20,7 @@ PathFollow::~PathFollow() { ///////////////////////////////////////////////////////////////////////////////////////// -void PathFollow::add_to_path(LVecBase3f pos) { +void PathFollow::add_to_path(LVecBase3 pos) { _path.push_back(pos); } @@ -119,7 +119,7 @@ void PathFollow::do_follow() { bool PathFollow::check_if_possible() { Node* src = find_in_mesh(_ai_char->_steering->_path_find_obj->_nav_mesh, _ai_char->_ai_char_np.get_pos(_ai_char->_window_render), _ai_char->_steering->_path_find_obj->_grid_size); - LVecBase3f _prev_position = _ai_char->_steering->_path_find_obj->_path_find_target.get_pos(_ai_char->_window_render); + LVecBase3 _prev_position = _ai_char->_steering->_path_find_obj->_path_find_target.get_pos(_ai_char->_window_render); Node* dst = find_in_mesh(_ai_char->_steering->_path_find_obj->_nav_mesh, _prev_position, _ai_char->_steering->_path_find_obj->_grid_size); if(src && dst) { diff --git a/contrib/src/ai/pathFollow.h b/contrib/src/ai/pathFollow.h index 125ef98784..e2d09a27bc 100644 --- a/contrib/src/ai/pathFollow.h +++ b/contrib/src/ai/pathFollow.h @@ -13,7 +13,7 @@ class EXPCL_PANDAAI PathFollow { public: AICharacter *_ai_char; float _follow_weight; - vector _path; + vector _path; int _curr_path_waypoint; bool _start; NodePath _dummy; @@ -23,7 +23,7 @@ public: PathFollow(AICharacter *ai_ch, float follow_wt); ~PathFollow(); - void add_to_path(LVecBase3f pos); + void add_to_path(LVecBase3 pos); void start(string type); void do_follow(); bool check_if_possible(); diff --git a/contrib/src/ai/pursue.cxx b/contrib/src/ai/pursue.cxx index 259f5b340e..d14bb60514 100644 --- a/contrib/src/ai/pursue.cxx +++ b/contrib/src/ai/pursue.cxx @@ -37,17 +37,17 @@ Pursue::~Pursue() { ///////////////////////////////////////////////////////////////////////////////// -LVecBase3f Pursue::do_pursue() { +LVecBase3 Pursue::do_pursue() { assert(_pursue_target && "pursue target not assigned"); - LVecBase3f present_pos = _ai_char->_ai_char_np.get_pos(_ai_char->_window_render); + LVecBase3 present_pos = _ai_char->_ai_char_np.get_pos(_ai_char->_window_render); double target_distance = (_pursue_target.get_pos(_ai_char->_window_render) - present_pos).length(); if(int(target_distance) == 0) { _pursue_done = true; - _ai_char->_steering->_steering_force = LVecBase3f(0.0, 0.0, 0.0); - _ai_char->_steering->_pursue_force = LVecBase3f(0.0, 0.0, 0.0); - return(LVecBase3f(0.0, 0.0, 0.0)); + _ai_char->_steering->_steering_force = LVecBase3(0.0, 0.0, 0.0); + _ai_char->_steering->_pursue_force = LVecBase3(0.0, 0.0, 0.0); + return(LVecBase3(0.0, 0.0, 0.0)); } else { _pursue_done = false; @@ -56,6 +56,6 @@ LVecBase3f Pursue::do_pursue() { _pursue_direction = _pursue_target.get_pos(_ai_char->_window_render) - present_pos; _pursue_direction.normalize(); - LVecBase3f desired_force = _pursue_direction * _ai_char->_movt_force; + LVecBase3 desired_force = _pursue_direction * _ai_char->_movt_force; return(desired_force); } diff --git a/contrib/src/ai/pursue.h b/contrib/src/ai/pursue.h index cf8893cef3..e26d107129 100644 --- a/contrib/src/ai/pursue.h +++ b/contrib/src/ai/pursue.h @@ -28,12 +28,12 @@ public: NodePath _pursue_target; float _pursue_weight; - LVecBase3f _pursue_direction; + LVecBase3 _pursue_direction; bool _pursue_done; Pursue(AICharacter *ai_ch, NodePath target_object, float pursue_wt); ~Pursue(); - LVecBase3f do_pursue(); + LVecBase3 do_pursue(); }; #endif diff --git a/contrib/src/ai/seek.cxx b/contrib/src/ai/seek.cxx index 6139c08398..f11b3cf21f 100644 --- a/contrib/src/ai/seek.cxx +++ b/contrib/src/ai/seek.cxx @@ -27,7 +27,7 @@ Seek::Seek(AICharacter *ai_ch, NodePath target_object, float seek_wt) { _seek_done = false; } -Seek::Seek(AICharacter *ai_ch, LVecBase3f pos, float seek_wt) { +Seek::Seek(AICharacter *ai_ch, LVecBase3 pos, float seek_wt) { _ai_char = ai_ch; _seek_position = pos; @@ -51,16 +51,16 @@ Seek::~Seek() { ///////////////////////////////////////////////////////////////////////////////// -LVecBase3f Seek::do_seek() { +LVecBase3 Seek::do_seek() { double target_distance = (_seek_position - _ai_char->_ai_char_np.get_pos(_ai_char->_window_render)).length(); if(int(target_distance) == 0) { _seek_done = true; - _ai_char->_steering->_steering_force = LVecBase3f(0.0, 0.0, 0.0); + _ai_char->_steering->_steering_force = LVecBase3(0.0, 0.0, 0.0); _ai_char->_steering->turn_off("seek"); - return(LVecBase3f(0.0, 0.0, 0.0)); + return(LVecBase3(0.0, 0.0, 0.0)); } - LVecBase3f desired_force = _seek_direction * _ai_char->_movt_force; + LVecBase3 desired_force = _seek_direction * _ai_char->_movt_force; return(desired_force); } diff --git a/contrib/src/ai/seek.h b/contrib/src/ai/seek.h index c3f3ddc4a4..2d2cd998f4 100644 --- a/contrib/src/ai/seek.h +++ b/contrib/src/ai/seek.h @@ -26,16 +26,16 @@ class EXPCL_PANDAAI Seek { public: AICharacter *_ai_char; - LVecBase3f _seek_position; + LVecBase3 _seek_position; float _seek_weight; - LVecBase3f _seek_direction; + LVecBase3 _seek_direction; bool _seek_done; - LVecBase3f _seek_accum_force; + LVecBase3 _seek_accum_force; Seek(AICharacter *ai_ch, NodePath target_object, float seek_wt = 1.0); - Seek(AICharacter *ai_ch, LVecBase3f pos, float seek_wt = 1.0); + Seek(AICharacter *ai_ch, LVecBase3 pos, float seek_wt = 1.0); ~Seek(); - LVecBase3f do_seek(); + LVecBase3 do_seek(); }; #endif diff --git a/contrib/src/ai/wander.cxx b/contrib/src/ai/wander.cxx index 804eb50105..48d72114f9 100644 --- a/contrib/src/ai/wander.cxx +++ b/contrib/src/ai/wander.cxx @@ -57,23 +57,23 @@ Wander::Wander(AICharacter *ai_ch, double wander_radius,int flag, double aoe, fl // default is XY axes switch(_flag) { case 0: { - _wander_target = LVecBase3f(_wander_radius * cos(theta), _wander_radius * sin(theta),0); + _wander_target = LVecBase3(_wander_radius * cos(theta), _wander_radius * sin(theta),0); break; } case 1: { - _wander_target = LVecBase3f(0, _wander_radius * cos(theta), _wander_radius * sin(theta)); + _wander_target = LVecBase3(0, _wander_radius * cos(theta), _wander_radius * sin(theta)); break; } case 2: { - _wander_target = LVecBase3f(_wander_radius * cos(theta), 0, _wander_radius * sin(theta)); + _wander_target = LVecBase3(_wander_radius * cos(theta), 0, _wander_radius * sin(theta)); break; } case 3: { - _wander_target = LVecBase3f(_wander_radius * sin(theta) * cos(si), _wander_radius * sin(theta) * sin(si), _wander_radius * cos(theta)); + _wander_target = LVecBase3(_wander_radius * sin(theta) * cos(si), _wander_radius * sin(theta) * sin(si), _wander_radius * cos(theta)); break; } default: { - _wander_target = LVecBase3f(_wander_radius * cos(theta), _wander_radius * sin(theta),0); + _wander_target = LVecBase3(_wander_radius * cos(theta), _wander_radius * sin(theta),0); break; } } @@ -91,52 +91,52 @@ Wander::~Wander() { ///////////////////////////////////////////////////////////////////////////////// -LVecBase3f Wander::do_wander() { - LVecBase3f present_pos = _ai_char->get_node_path().get_pos(_ai_char->get_char_render()); +LVecBase3 Wander::do_wander() { + LVecBase3 present_pos = _ai_char->get_node_path().get_pos(_ai_char->get_char_render()); // Create the random slices to enable random movement of wander for x,y,z respectively double time_slice_1 = random_clamped() * 1.5; double time_slice_2 = random_clamped() * 1.5; double time_slice_3 = random_clamped() * 1.5; switch(_flag) { case 0: { - _wander_target += LVecBase3f(time_slice_1, time_slice_2, 0); + _wander_target += LVecBase3(time_slice_1, time_slice_2, 0); break; } case 1: { - _wander_target += LVecBase3f(0, time_slice_1, time_slice_2); + _wander_target += LVecBase3(0, time_slice_1, time_slice_2); break; } case 2: { - _wander_target += LVecBase3f(time_slice_1, 0, time_slice_2); + _wander_target += LVecBase3(time_slice_1, 0, time_slice_2); break; } case 3: { - _wander_target += LVecBase3f(time_slice_1, time_slice_2, time_slice_3); + _wander_target += LVecBase3(time_slice_1, time_slice_2, time_slice_3); break; } default: { - _wander_target = LVecBase3f(time_slice_1, time_slice_2, 0); + _wander_target = LVecBase3(time_slice_1, time_slice_2, 0); } } _wander_target.normalize(); _wander_target *= _wander_radius; - LVecBase3f target = _ai_char->get_char_render().get_relative_vector(_ai_char->get_node_path(), LVector3f::forward()); + LVecBase3 target = _ai_char->get_char_render().get_relative_vector(_ai_char->get_node_path(), LVector3::forward()); target.normalize(); // Project wander target onto global space target = _wander_target + target; - LVecBase3f desired_target = present_pos + target; - LVecBase3f desired_force = desired_target - _ai_char->get_node_path().get_pos() ; + LVecBase3 desired_target = present_pos + target; + LVecBase3 desired_force = desired_target - _ai_char->get_node_path().get_pos() ; desired_force.normalize(); desired_force *= _ai_char->_movt_force; double distance = (present_pos - _init_pos).length(); if(_area_of_effect > 0 && distance > _area_of_effect) { - LVecBase3f direction = present_pos - _init_pos; + LVecBase3 direction = present_pos - _init_pos; direction.normalize(); desired_force = - direction * _ai_char->_movt_force; - LVecBase3f dirn = _ai_char->_steering->_steering_force; + LVecBase3 dirn = _ai_char->_steering->_steering_force; dirn.normalize(); - _ai_char->_steering->_steering_force = LVecBase3f(0.0, 0.0, 0.0); + _ai_char->_steering->_steering_force = LVecBase3(0.0, 0.0, 0.0); } return desired_force; } diff --git a/contrib/src/ai/wander.h b/contrib/src/ai/wander.h index 2ea89606eb..a760bbb15a 100644 --- a/contrib/src/ai/wander.h +++ b/contrib/src/ai/wander.h @@ -24,14 +24,14 @@ class EXPCL_PANDAAI Wander { public: AICharacter *_ai_char; double _wander_radius; - LVecBase3f _wander_target; + LVecBase3 _wander_target; float _wander_weight; int _flag; - LVecBase3f _init_pos; + LVecBase3 _init_pos; double _area_of_effect; Wander(AICharacter *ai_ch, double wander_radius, int flag, double aoe, float wander_weight); - LVecBase3f do_wander(); + LVecBase3 do_wander(); ~Wander(); }; diff --git a/direct/src/actor/Actor.py b/direct/src/actor/Actor.py index 60bd7df8dc..8fc6557cf4 100644 --- a/direct/src/actor/Actor.py +++ b/direct/src/actor/Actor.py @@ -1019,11 +1019,6 @@ class Actor(DirectObject, NodePath): if (partName in partDict): del(partDict[partName]) - # remove the bundle handle, in case this part is ever - # loaded again in the future - if partName in self.__commonBundleHandles: - del self.__commonBundleHandles[partName] - def hidePart(self, partName, lodName="lodRoot"): """ Make the given part of the optionally given lod not render, diff --git a/direct/src/directbase/DirectStart.py b/direct/src/directbase/DirectStart.py index 61b9c20651..d33c9c5fde 100644 --- a/direct/src/directbase/DirectStart.py +++ b/direct/src/directbase/DirectStart.py @@ -1,4 +1,5 @@ -print 'DirectStart: Starting the game.' +__all__ = [] +print('Using deprecated DirectStart interface.') from direct.showbase import ShowBase base = ShowBase.ShowBase() diff --git a/direct/src/directnotify/DirectNotifyGlobal.py b/direct/src/directnotify/DirectNotifyGlobal.py index 7159b066af..353b3d48f7 100644 --- a/direct/src/directnotify/DirectNotifyGlobal.py +++ b/direct/src/directnotify/DirectNotifyGlobal.py @@ -1,5 +1,7 @@ """instantiate global DirectNotify used in Direct""" +__all__ = ['directNotify', 'giveNotify'] + import DirectNotify directNotify = DirectNotify.DirectNotify() diff --git a/direct/src/directscripts/Doxyfile.python b/direct/src/directscripts/Doxyfile.python index 81b68dc6b2..4bcfb58727 100644 --- a/direct/src/directscripts/Doxyfile.python +++ b/direct/src/directscripts/Doxyfile.python @@ -760,13 +760,13 @@ STRIP_CODE_COMMENTS = YES # then for each documented function all documented # functions referencing it will be listed. -REFERENCED_BY_RELATION = YES +REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. -REFERENCES_RELATION = YES +REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from diff --git a/direct/src/directscripts/extract_docs.py b/direct/src/directscripts/extract_docs.py index 2f76ed4a53..b6bb06bfeb 100644 --- a/direct/src/directscripts/extract_docs.py +++ b/direct/src/directscripts/extract_docs.py @@ -30,6 +30,7 @@ def comment(code): if empty_line: # New paragraph. comment += '\n\n' + empty_line = False elif comment: comment += '\n' comment += '/// ' + line @@ -56,15 +57,29 @@ def block_comment(code): line = line.rstrip() strline = line.lstrip('/ \t') - if reading_desc: - newlines.append('/// ' + line[min(indent, len(line) - len(strline)):]) - else: - # A "Description:" text starts the description. - if strline.startswith("Description"): - strline = strline[11:].lstrip(': \t') - indent = len(line) - len(strline) - reading_desc = True - newlines.append('/// ' + strline) + + if ':' in strline: + pre, post = strline.split(':', 1) + pre = pre.rstrip() + if pre == "Description": + strline = post.lstrip() + elif pre in ("Class", "Access", "Function", "Created by", "Enum"): + continue + + if strline or len(newlines) > 0: + newlines.append('/// ' + strline) + + #if reading_desc: + # newlines.append('/// ' + line[min(indent, len(line) - len(strline)):]) + #else: + # # A "Description:" text starts the description. + # if strline.startswith("Description"): + # strline = strline[11:].lstrip(': \t') + # indent = len(line) - len(strline) + # reading_desc = True + # newlines.append('/// ' + strline) + # else: + # print line newcode = '\n'.join(newlines) if len(newcode) > 0: @@ -73,6 +88,9 @@ def block_comment(code): return "" def translateFunctionName(name): + if name.startswith("__"): + return name + new = "" for i in name.split("_"): if new == "": @@ -85,32 +103,58 @@ def translateFunctionName(name): new += i[0].upper() + i[1:] return new -def translated_type_name(type): +def translateTypeName(name, mangle=True): + # Equivalent to C++ classNameFromCppName + class_name = "" + bad_chars = "!@#$%^&*()<>,.-=+~{}? " + next_cap = False + first_char = mangle + + for chr in name: + if (chr == '_' or chr == ' ') and mangle: + next_cap = True + elif chr in bad_chars: + if not mangle: + class_name += '_' + elif next_cap or first_char: + class_name += chr.upper() + next_cap = False + first_char = False + else: + class_name += chr + + return class_name + +def translated_type_name(type, scoped=True): + while interrogate_type_is_wrapped(type): + if interrogate_type_is_const(type): + return 'const ' + translated_type_name(interrogate_type_wrapped_type(type)) + else: + type = interrogate_type_wrapped_type(type) + + typename = interrogate_type_name(type) + if typename in ("PyObject", "_object"): + return "object" + if interrogate_type_is_atomic(type): token = interrogate_type_atomic_token(type) if token == 7: return 'str' + else: + return typename - typename = interrogate_type_name(type) - typename = typename.replace("< ", "").replace(" >", "") - return typename + typename = translateTypeName(typename) -def translateTypeSpec(name): - name = name.strip("* ") - name = name.replace("BitMask< unsigned int, 32 >", "BitMask32") - name = name.replace("atomic ", "") - name = name.replace("< ", "").replace(" >", "") - if name == '_object': - name = 'object' - elif name == '_typeobject': - name = 'type' - return name + if scoped and interrogate_type_is_nested(type): + return translated_type_name(interrogate_type_outer_class(type)) + '::' + typename + else: + return typename def processElement(handle, element): if interrogate_element_has_comment(element): print >>handle, comment(interrogate_element_comment(element)) - print >>handle, translateTypeSpec(translated_type_name(interrogate_element_type(element))), + print >>handle, translated_type_name(interrogate_element_type(element)), print >>handle, interrogate_element_name(element) + ';' def processFunction(handle, function, isConstructor = False): @@ -120,11 +164,12 @@ def processFunction(handle, function, isConstructor = False): print >>handle, block_comment(interrogate_wrapper_comment(wrapper)) if not isConstructor: - if not interrogate_wrapper_number_of_parameters(wrapper) > 0 or not interrogate_wrapper_parameter_is_this(wrapper, 0): - print >>handle, "static", + if interrogate_function_is_method(function): + if not interrogate_wrapper_number_of_parameters(wrapper) > 0 or not interrogate_wrapper_parameter_is_this(wrapper, 0): + print >>handle, "static", if interrogate_wrapper_has_return_value(wrapper): - print >>handle, translateTypeSpec(translated_type_name(interrogate_wrapper_return_type(wrapper))), + print >>handle, translated_type_name(interrogate_wrapper_return_type(wrapper)), else: pass#print >>handle, "void", @@ -137,7 +182,7 @@ def processFunction(handle, function, isConstructor = False): if not interrogate_wrapper_parameter_is_this(wrapper, i_param): if not first: print >>handle, ",", - print >>handle, translateTypeSpec(translated_type_name(interrogate_wrapper_parameter_type(wrapper, i_param))), + print >>handle, translated_type_name(interrogate_wrapper_parameter_type(wrapper, i_param)), if interrogate_wrapper_parameter_has_name(wrapper, i_param): print >>handle, interrogate_wrapper_parameter_name(wrapper, i_param), first = False @@ -145,7 +190,7 @@ def processFunction(handle, function, isConstructor = False): print >>handle, ");" def processType(handle, type): - typename = translated_type_name(type) + typename = translated_type_name(type, scoped=False) derivations = [ translated_type_name(interrogate_type_get_derivation(type, n)) for n in range(interrogate_type_number_of_derivations(type)) ] if interrogate_type_has_comment(type): @@ -157,7 +202,7 @@ def processType(handle, type): docstring = comment(interrogate_type_enum_value_comment(type, i_value)) if docstring: print >>handle, docstring - print >>handle, translateFunctionName(interrogate_type_enum_value_name(type, i_value)), "=", interrogate_type_enum_value(type, i_value), "," + print >>handle, interrogate_type_enum_value_name(type, i_value), "=", interrogate_type_enum_value(type, i_value), "," else: if interrogate_type_is_struct(type): classtype = "struct" @@ -192,38 +237,54 @@ def processType(handle, type): print >>handle, "};" +def processModule(handle, package): + print >>handle, "namespace %s {" % package + + if package != "core": + print >>handle, "using namespace core;" + + for i_type in xrange(interrogate_number_of_global_types()): + type = interrogate_get_global_type(i_type) + + if interrogate_type_has_module_name(type): + module_name = interrogate_type_module_name(type) + if "panda3d." + package == module_name: + processType(handle, type) + else: + print "Type %s has no module name" % typename + + for i_func in xrange(interrogate_number_of_global_functions()): + func = interrogate_get_global_function(i_func) + + if interrogate_function_has_module_name(func): + module_name = interrogate_function_module_name(func) + if "panda3d." + package == module_name: + processFunction(handle, func) + else: + print "Type %s has no module name" % typename + + print >>handle, "}" + + if __name__ == "__main__": handle = open("pandadoc.hpp", "w") print >>handle, comment("Panda3D modules that are implemented in C++.") - print >>handle, "namespace panda3d {}" + print >>handle, "namespace panda3d {" # Determine the path to the interrogatedb files interrogate_add_search_directory(os.path.join(os.path.dirname(pandac.__file__), "..", "..", "etc")) interrogate_add_search_directory(os.path.join(os.path.dirname(pandac.__file__), "input")) import panda3d.core + processModule(handle, "core") for lib in os.listdir(os.path.dirname(panda3d.__file__)): if lib.endswith(('.pyd', '.so')) and not lib.startswith('core.'): - __import__('panda3d.' + os.path.splitext(lib)[0]) + module_name = os.path.splitext(lib)[0] + __import__("panda3d." + module_name) + processModule(handle, module_name) - lastpkg = None - for i_type in xrange(interrogate_number_of_global_types()): - type = interrogate_get_global_type(i_type) - if interrogate_type_has_module_name(type): - package = interrogate_type_module_name(type) - if lastpkg != package: - if lastpkg is not None: - print >>handle, "}" - print >>handle, "namespace %s {" % package - lastpkg = package - - processType(handle, type) - else: - print "Type %s has no module name" % typename - - if lastpkg is not None: - print >>handle, "}" + print >>handle, "}" handle.close() diff --git a/direct/src/distributed/ConnectionRepository.py b/direct/src/distributed/ConnectionRepository.py index 782b7dc50f..b8ab8ae3e0 100644 --- a/direct/src/distributed/ConnectionRepository.py +++ b/direct/src/distributed/ConnectionRepository.py @@ -494,7 +494,7 @@ class ConnectionRepository( elif self.connectMethod == self.CM_NET or (not hasattr(self,"connectNative")): # Try each of the servers in turn. for url in serverList: - self.notify.info("Connecting to %s via NET interface." % (url.cStr())) + self.notify.info("Connecting to %s via NET interface." % (url)) if self.tryConnectNet(url): self.startReaderPollTask() if successCallback: @@ -506,7 +506,7 @@ class ConnectionRepository( failureCallback(0, '', *failureArgs) elif self.connectMethod == self.CM_NATIVE: for url in serverList: - self.notify.info("Connecting to %s via Native interface." % (url.cStr())) + self.notify.info("Connecting to %s via Native interface." % (url)) if self.connectNative(url): self.startReaderPollTask() if successCallback: @@ -539,7 +539,7 @@ class ConnectionRepository( if ch.isConnectionReady(): self.setConnectionHttp(ch) self._serverAddress = serverList[serverIndex-1] - self.notify.info("Successfully connected to %s." % (self._serverAddress.cStr())) + self.notify.info("Successfully connected to %s." % (self._serverAddress)) ## if self.recorder: ## # If we have a recorder, we wrap the connect inside a @@ -565,7 +565,7 @@ class ConnectionRepository( # No connection yet, but keep trying. url = serverList[serverIndex] - self.notify.info("Connecting to %s via HTTP interface." % (url.cStr())) + self.notify.info("Connecting to %s via HTTP interface." % (url)) ch.preserveStatus() ch.beginConnectTo(DocumentSpec(url)) diff --git a/direct/src/distributed/DistributedCartesianGrid.py b/direct/src/distributed/DistributedCartesianGrid.py index e577ee2ba0..ea88ebaf56 100755 --- a/direct/src/distributed/DistributedCartesianGrid.py +++ b/direct/src/distributed/DistributedCartesianGrid.py @@ -250,7 +250,7 @@ class DistributedCartesianGrid(DistributedNode, CartesianGridBase): assert self.notify.debug("removeObjectFromGrid %s" % av) # TODO: WHAT LOCATION SHOULD WE SET THIS TO? #av.reparentTo(hidden) - if (av.getParent().compareTo(self) == 0): + if av.getParent() == self: # only detach if object is directly parented av.detachNode() #av.b_setLocation(0, 0) diff --git a/direct/src/extensions/ConfigVariableFilename-extensions.py b/direct/src/extensions/ConfigVariableFilename-extensions.py deleted file mode 100644 index 61cefc0d82..0000000000 --- a/direct/src/extensions/ConfigVariableFilename-extensions.py +++ /dev/null @@ -1,9 +0,0 @@ - - def __str__(self): - return self.cStr() - - def __len__(self): - return self.length() - - def __getitem__(self, n): - return self.cStr().__getitem__(n) diff --git a/direct/src/extensions/HTTPChannel-extensions.py b/direct/src/extensions/HTTPChannel-extensions.py index f909cceb4f..d3fc500cfb 100644 --- a/direct/src/extensions/HTTPChannel-extensions.py +++ b/direct/src/extensions/HTTPChannel-extensions.py @@ -14,7 +14,7 @@ Returns the newly-spawned task. """ if not name: - name = self.getUrl().cStr() + name = str(self.getUrl()) from direct.task import Task task = Task.Task(self.doTask) task.callback = callback diff --git a/direct/src/extensions_native/HTTPChannel_extensions.py b/direct/src/extensions_native/HTTPChannel_extensions.py index fbbb4421dc..3257c16278 100644 --- a/direct/src/extensions_native/HTTPChannel_extensions.py +++ b/direct/src/extensions_native/HTTPChannel_extensions.py @@ -18,7 +18,7 @@ def spawnTask(self, name = None, callback = None, extraArgs = []): Returns the newly-spawned task. """ if not name: - name = self.getUrl().cStr() + name = str(self.getUrl()) from direct.task import Task task = Task.Task(self.doTask) task.callback = callback diff --git a/direct/src/filter/CommonFilters.py b/direct/src/filter/CommonFilters.py index a561487e16..42b06d740b 100644 --- a/direct/src/filter/CommonFilters.py +++ b/direct/src/filter/CommonFilters.py @@ -16,11 +16,10 @@ clunky approach. - Josh """ from FilterManager import FilterManager -from pandac.PandaModules import Point3, Vec3, Vec4, Point2 -from pandac.PandaModules import NodePath, PandaNode -from pandac.PandaModules import Filename -from pandac.PandaModules import AuxBitplaneAttrib -from pandac.PandaModules import RenderState, Texture, Shader, ATSNone +from panda3d.core import LVecBase4, LPoint2 +from panda3d.core import Filename +from panda3d.core import AuxBitplaneAttrib +from panda3d.core import RenderState, Texture, Shader, ATSNone import sys,os CARTOON_BODY=""" @@ -348,13 +347,13 @@ class CommonFilters: if (changed == "CartoonInk") or fullrebuild: if ("CartoonInk" in configuration): c = configuration["CartoonInk"] - self.finalQuad.setShaderInput("cartoonseparation", Vec4(c.separation, 0, c.separation, 0)) + self.finalQuad.setShaderInput("cartoonseparation", LVecBase4(c.separation, 0, c.separation, 0)) self.finalQuad.setShaderInput("cartooncolor", c.color) if (changed == "BlurSharpen") or fullrebuild: if ("BlurSharpen" in configuration): blurval = configuration["BlurSharpen"] - self.finalQuad.setShaderInput("blurval", Vec4(blurval, blurval, blurval, blurval)) + self.finalQuad.setShaderInput("blurval", LVecBase4(blurval, blurval, blurval, blurval)) if (changed == "Bloom") or fullrebuild: if ("Bloom" in configuration): @@ -386,9 +385,9 @@ class CommonFilters: if "VolumetricLighting" in self.configuration: caster = self.configuration["VolumetricLighting"].caster - casterpos = Point2() + casterpos = LPoint2() self.manager.camera.node().getLens().project(caster.getPos(self.manager.camera), casterpos) - self.finalQuad.setShaderInput("casterpos", Vec4(casterpos.getX() * 0.5 + 0.5, (casterpos.getY() * 0.5 + 0.5), 0, 0)) + self.finalQuad.setShaderInput("casterpos", LVecBase4(casterpos.getX() * 0.5 + 0.5, (casterpos.getY() * 0.5 + 0.5), 0, 0)) if task != None: return task.cont diff --git a/direct/src/filter/FilterManager.py b/direct/src/filter/FilterManager.py index 1f7f10c009..c03afe4bc0 100644 --- a/direct/src/filter/FilterManager.py +++ b/direct/src/filter/FilterManager.py @@ -14,16 +14,15 @@ Still need to implement: """ -from pandac.PandaModules import Point3, Vec3, Vec4 -from pandac.PandaModules import NodePath, PandaNode -from pandac.PandaModules import RenderState, Texture, Shader -from pandac.PandaModules import CardMaker -from pandac.PandaModules import TextureStage -from pandac.PandaModules import GraphicsPipe, GraphicsOutput -from pandac.PandaModules import WindowProperties, FrameBufferProperties -from pandac.PandaModules import Camera, DisplayRegion -from pandac.PandaModules import OrthographicLens -from pandac.PandaModules import AuxBitplaneAttrib +from panda3d.core import NodePath, PandaNode +from panda3d.core import RenderState, Texture, Shader +from panda3d.core import CardMaker +from panda3d.core import TextureStage +from panda3d.core import GraphicsPipe, GraphicsOutput +from panda3d.core import WindowProperties, FrameBufferProperties +from panda3d.core import Camera, DisplayRegion +from panda3d.core import OrthographicLens +from panda3d.core import AuxBitplaneAttrib from direct.directnotify.DirectNotifyGlobal import * from direct.showbase.DirectObject import DirectObject @@ -111,16 +110,16 @@ class FilterManager(DirectObject): winx = self.forcex winy = self.forcey - if (winx == 0): winx = self.win.getXSize() - if (winy == 0): winy = self.win.getYSize() + if winx == 0: winx = self.win.getXSize() + if winy == 0: winy = self.win.getYSize() - if (div != 1): - winx = ((winx+align-1) / align) * align - winy = ((winy+align-1) / align) * align - winx = winx / div - winy = winy / div + if div != 1: + winx = ((winx+align-1) // align) * align + winy = ((winy+align-1) // align) * align + winx = winx // div + winy = winy // div - if (mul != 1): + if mul != 1: winx = winx * mul winy = winy * mul @@ -198,7 +197,7 @@ class FilterManager(DirectObject): quad.setDepthTest(0) quad.setDepthWrite(0) quad.setTexture(colortex) - quad.setColor(Vec4(1,0.5,0.5,1)) + quad.setColor(1, 0.5, 0.5, 1) cs = NodePath("dummy") cs.setState(self.camstate) @@ -221,7 +220,7 @@ class FilterManager(DirectObject): self.setStackedClears(buffer, self.rclears, self.wclears) if (auxtex0): buffer.setClearActive(GraphicsOutput.RTPAuxRgba0, 1) - buffer.setClearValue(GraphicsOutput.RTPAuxRgba0, Vec4(0.5, 0.5, 1.0, 0.0)) + buffer.setClearValue(GraphicsOutput.RTPAuxRgba0, (0.5, 0.5, 1.0, 0.0)) if (auxtex1): buffer.setClearActive(GraphicsOutput.RTPAuxRgba1, 1) self.region.disableClears() @@ -262,7 +261,7 @@ class FilterManager(DirectObject): quad = NodePath(cm.generate()) quad.setDepthTest(0) quad.setDepthWrite(0) - quad.setColor(Vec4(1,0.5,0.5,1)) + quad.setColor(1, 0.5, 0.5, 1) quadcamnode = Camera("filter-quad-cam") lens = OrthographicLens() @@ -294,7 +293,7 @@ class FilterManager(DirectObject): winprops = WindowProperties() winprops.setSize(xsize, ysize) - props = FrameBufferProperties(self.win.getFbProperties()) + props = FrameBufferProperties(FrameBufferProperties.getDefault()) props.setBackBuffers(0) props.setRgbColor(1) props.setDepthBits(depthbits) diff --git a/direct/src/leveleditor/LevelEditorBase.py b/direct/src/leveleditor/LevelEditorBase.py index 01c6ec23a9..c115468f6c 100755 --- a/direct/src/leveleditor/LevelEditorBase.py +++ b/direct/src/leveleditor/LevelEditorBase.py @@ -111,7 +111,7 @@ class LevelEditorBase(DirectObject): base.direct.deselect(nodePath) self.objectMgr.removeObjectByNodePath(nodePath) - if (base.direct.selected.last != None and nodePath.compareTo(base.direct.selected.last)==0): + if base.direct.selected.last is not None and nodePath == base.direct.selected.last: # if base.direct.selected.last is refering to this # removed obj, clear the reference if (hasattr(__builtins__,'last')): diff --git a/direct/src/p3d/AppRunner.py b/direct/src/p3d/AppRunner.py index b6b86a2c2e..b9a1f17572 100644 --- a/direct/src/p3d/AppRunner.py +++ b/direct/src/p3d/AppRunner.py @@ -175,7 +175,7 @@ class AppRunner(DirectObject): # the current working directory, for convenience; but when we # move to multiple-instance sessions, it may have to be # different for each instance. - self.multifileRoot = ExecutionEnvironment.getCwd().cStr() + self.multifileRoot = str(ExecutionEnvironment.getCwd()) # The "main" object will be exposed to the DOM as a property # of the plugin object; that is, document.pluginobject.main in @@ -554,7 +554,7 @@ class AppRunner(DirectObject): # Write the file to a temporary filename, then atomically move # it to its actual filename, to avoid race conditions when # updating this file. - tfile = Filename.temporary(self.rootDir.cStr(), '.xml') + tfile = Filename.temporary(str(self.rootDir), '.xml') if doc.SaveFile(tfile.toOsSpecific()): tfile.renameTo(filename) diff --git a/direct/src/p3d/FileSpec.py b/direct/src/p3d/FileSpec.py index 822bfccb5f..291149ad77 100644 --- a/direct/src/p3d/FileSpec.py +++ b/direct/src/p3d/FileSpec.py @@ -25,7 +25,7 @@ class FileSpec: if pathname is None: pathname = Filename(packageDir, filename) - self.filename = filename.cStr() + self.filename = str(filename) self.basename = filename.getBasename() if st is None: diff --git a/direct/src/p3d/HostInfo.py b/direct/src/p3d/HostInfo.py index ab033f3383..f22e47cf82 100644 --- a/direct/src/p3d/HostInfo.py +++ b/direct/src/p3d/HostInfo.py @@ -646,7 +646,7 @@ class HostInfo: if hostDirBasename: # If the contents.xml specified a host_dir parameter, use # it. - hostDir = self.rootDir.cStr() + '/hosts' + hostDir = str(self.rootDir) + '/hosts' for component in hostDirBasename.split('/'): if component: if component[0] == '.': diff --git a/direct/src/p3d/PackageInfo.py b/direct/src/p3d/PackageInfo.py index 7f2d382cd2..3e1767b91f 100644 --- a/direct/src/p3d/PackageInfo.py +++ b/direct/src/p3d/PackageInfo.py @@ -1066,7 +1066,7 @@ class PackageInfo: return False # We mount it under its actual location on disk. - root = self.getPackageDir().cStr() + root = self.getPackageDir() vfs = VirtualFileSystem.getGlobalPtr() vfs.mount(mf, root, vfs.MFReadOnly) @@ -1210,7 +1210,7 @@ class PackageInfo: # Write the file to a temporary filename, then atomically move # it to its actual filename, to avoid race conditions when # updating this file. - tfile = Filename.temporary(self.getPackageDir().cStr(), '.xml') + tfile = Filename.temporary(str(self.getPackageDir()), '.xml') if doc.SaveFile(tfile.toOsSpecific()): tfile.renameTo(filename) diff --git a/direct/src/p3d/Packager.py b/direct/src/p3d/Packager.py index 18cce7d7d9..23f10f0604 100644 --- a/direct/src/p3d/Packager.py +++ b/direct/src/p3d/Packager.py @@ -2263,7 +2263,7 @@ class Packager: self.executablePath.appendDirectory('/usr/lib') self.executablePath.appendDirectory('/usr/local/lib') - if os.uname()[1] == "pcbsd": + if self.platform.startswith('freebsd') and os.uname()[1] == "pcbsd": self.executablePath.appendDirectory('/usr/PCBSD/local/lib') # Set this flag true to automatically add allow_python_dev to diff --git a/direct/src/p3d/PatchMaker.py b/direct/src/p3d/PatchMaker.py index e11306b82f..e8fbf80274 100644 --- a/direct/src/p3d/PatchMaker.py +++ b/direct/src/p3d/PatchMaker.py @@ -526,7 +526,7 @@ class PatchMaker: # Also copy the seq to the import desc file, for # documentation purposes. - importDescFilename = self.packageDesc.cStr()[:-3] + 'import.xml' + importDescFilename = str(self.packageDesc)[:-3] + 'import.xml' importDescFullpath = Filename(self.patchMaker.installDir, importDescFilename) doc = TiXmlDocument(importDescFullpath.toOsSpecific()) if doc.LoadFile(): diff --git a/direct/src/p3d/ScanDirectoryNode.py b/direct/src/p3d/ScanDirectoryNode.py index 1569ed642f..94f323551e 100644 --- a/direct/src/p3d/ScanDirectoryNode.py +++ b/direct/src/p3d/ScanDirectoryNode.py @@ -58,7 +58,7 @@ class ScanDirectoryNode: # Now update the usage.xml file with the newly-determined # disk space. xusage.SetAttribute('disk_space', str(self.getTotalSize())) - tfile = Filename.temporary(pathname.cStr(), '.xml') + tfile = Filename.temporary(str(pathname), '.xml') if doc.SaveFile(tfile.toOsSpecific()): tfile.renameTo(usageFilename) diff --git a/direct/src/plugin/Sources.pp b/direct/src/plugin/Sources.pp index 6f75f0bb03..6b26a02ca3 100644 --- a/direct/src/plugin/Sources.pp +++ b/direct/src/plugin/Sources.pp @@ -18,8 +18,7 @@ // /MD. This links the plugin with the static C runtime library, // instead of the dynamic runtime library, which is much better for // distributing the plugin with the XPI and CAB interfaces. This -// requires that special /MT versions of OpenSSL, libjpeg, libpng, -// and zlib are available. +// requires that special /MT versions of OpenSSL and zlib are available. #define _MT $[if $[P3D_PLUGIN_MT],_mt] @@ -114,8 +113,8 @@ // p3d_plugin.dll, the main entry point to the Core API. // - #define BUILD_TARGET $[and $[HAVE_P3D_PLUGIN],$[HAVE_OPENSSL],$[HAVE_ZLIB],$[HAVE_JPEG],$[HAVE_PNG]] - #define USE_PACKAGES openssl$[_MT] zlib$[_MT] jpeg$[_MT] png$[_MT] x11 + #define BUILD_TARGET $[and $[HAVE_P3D_PLUGIN],$[HAVE_OPENSSL],$[HAVE_ZLIB]] + #define USE_PACKAGES openssl$[_MT] zlib$[_MT] x11 #define TARGET p3d_plugin #define LIB_PREFIX #define BUILDING_DLL BUILDING_P3D_PLUGIN @@ -141,8 +140,8 @@ // libp3d_plugin_static.lib, the Core API as a static library (for p3dembed). // - #define BUILD_TARGET $[and $[HAVE_P3D_PLUGIN],$[HAVE_OPENSSL],$[HAVE_ZLIB],$[HAVE_JPEG],$[HAVE_PNG]] - #define USE_PACKAGES openssl zlib jpeg png x11 + #define BUILD_TARGET $[and $[HAVE_P3D_PLUGIN],$[HAVE_OPENSSL],$[HAVE_ZLIB]] + #define USE_PACKAGES openssl zlib x11 #define TARGET p3d_plugin_static #define BUILDING_DLL BUILDING_P3D_PLUGIN diff --git a/direct/src/plugin/p3dCert.cxx b/direct/src/plugin/p3dCert.cxx index 733a10b628..528bde0d49 100644 --- a/direct/src/plugin/p3dCert.cxx +++ b/direct/src/plugin/p3dCert.cxx @@ -16,10 +16,10 @@ #include "wstring_encode.h" #include "mkdir_complete.h" -#include -#include -#include -#include +#include +#include +#include +#include #include #include @@ -557,7 +557,7 @@ get_text(char *header, size_t hlen, char *text, size_t tlen) { case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY: strncpy(header, "Unverified signature!", hlen); - snprintf(text, tlen, unknown_auth_cert_text, _friendly_name.c_str()); + snprintf(text, tlen, unknown_auth_cert_text); break; case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: diff --git a/direct/src/plugin/p3dCert.h b/direct/src/plugin/p3dCert.h index 641a362147..dd434409b6 100644 --- a/direct/src/plugin/p3dCert.h +++ b/direct/src/plugin/p3dCert.h @@ -15,8 +15,8 @@ #ifndef P3DCERT_H #define P3DCERT_H -#include -#include +#include +#include #define OPENSSL_NO_KRB5 #include "openssl/x509.h" diff --git a/direct/src/plugin/p3dInstance.cxx b/direct/src/plugin/p3dInstance.cxx index 6a9c2190b5..d81a271d1e 100644 --- a/direct/src/plugin/p3dInstance.cxx +++ b/direct/src/plugin/p3dInstance.cxx @@ -52,7 +52,7 @@ enum { #ifdef _WIN32 typedef P3DWinSplashWindow SplashWindowType; -#elif defined(__APPLE__) +#elif defined(__APPLE__) && !__LP64__ typedef P3DOsxSplashWindow SplashWindowType; #elif defined(HAVE_X11) typedef P3DX11SplashWindow SplashWindowType; @@ -740,7 +740,7 @@ get_request() { // to shutdown. _main_object->set_pyobj(NULL); _main_object->set_string_property("status", "stopped"); - + string message = "onpythonstop"; string expression = _fparams.lookup_token(message); nout << "notify: " << message << " " << expression << "\n"; @@ -782,9 +782,12 @@ get_request() { } } break; + + default: + break; } } - + return request; } @@ -935,6 +938,9 @@ finish_request(P3D_request *request, bool handled) { request->_request._forget_package._package_version = NULL; } break; + + default: + break; } p3d_unref_delete(((P3DInstance *)request->_instance)); @@ -3449,7 +3455,9 @@ paint_window() { #ifdef __APPLE__ const P3D_window_handle &handle = _wparams.get_parent_window(); if (handle._window_handle_type == P3D_WHT_osx_port) { +#if !__LP64__ paint_window_osx_port(); +#endif } else if (handle._window_handle_type == P3D_WHT_osx_cgcontext) { const P3D_window_handle &handle = _wparams.get_parent_window(); @@ -3461,7 +3469,7 @@ paint_window() { #endif // __APPLE__ } -#ifdef __APPLE__ +#if defined(__APPLE__) && !__LP64__ //////////////////////////////////////////////////////////////////// // Function: P3DInstance::get_framebuffer_osx_port // Access: Private @@ -3584,7 +3592,7 @@ get_framebuffer_osx_cgcontext() { } #endif // __APPLE__ -#ifdef __APPLE__ +#if defined(__APPLE__) && !__LP64__ //////////////////////////////////////////////////////////////////// // Function: P3DInstance::paint_window_osx_port // Access: Private @@ -3674,7 +3682,7 @@ bool P3DInstance:: handle_event_osx_event_record(const P3D_event_data &event) { bool retval = false; -#ifdef __APPLE__ +#if defined(__APPLE__) && !__LP64__ assert(event._event_type == P3D_ET_osx_event_record); EventRecord *er = event._event._osx_event_record._event; @@ -3889,7 +3897,7 @@ handle_event_osx_cocoa(const P3D_event_data &event) { //////////////////////////////////////////////////////////////////// void P3DInstance:: add_carbon_modifier_flags(unsigned int &swb_flags, int modifiers) { -#ifdef __APPLE__ +#if defined(__APPLE__) && !__LP64__ if (modifiers & cmdKey) { swb_flags |= SubprocessWindowBuffer::EF_meta_held; } diff --git a/direct/src/plugin/p3dMainObject.cxx b/direct/src/plugin/p3dMainObject.cxx index 2bfbda2cf8..5b49cbcf43 100644 --- a/direct/src/plugin/p3dMainObject.cxx +++ b/direct/src/plugin/p3dMainObject.cxx @@ -575,14 +575,14 @@ read_log(const string &log_pathname, P3D_object *params[], int num_params) { // Read matching files vector all_logs; - int log_matches_found = 0; + int log_matches_found = 0; string log_matching_pathname; inst_mgr->scan_directory(log_directory, all_logs); - for (int i=(int)all_logs.size()-1; i>=0; --i) { - if ((all_logs[i] == log_leafname_primary) || - (all_logs[i].find(log_basename) == 0) && - (all_logs[i].size() > 4) && - (all_logs[i].substr(all_logs[i].size() - 4) == string(".log"))) { + for (int i = (int)all_logs.size() - 1; i >= 0; --i) { + if (all_logs[i] == log_leafname_primary || + (all_logs[i].find(log_basename) == 0 && + all_logs[i].size() > 4 && + all_logs[i].substr(all_logs[i].size() - 4) == string(".log"))) { log_matches_found++; log_matching_pathname = (log_directory + all_logs[i]); read_log_file(log_matching_pathname, tail_bytes, head_bytes, log_data); @@ -606,10 +606,10 @@ read_log(const string &log_pathname, P3D_object *params[], int num_params) { // Description: The generic log-reader function. //////////////////////////////////////////////////////////////////// void P3DMainObject:: -read_log_file(const string &log_pathname, - size_t tail_bytes, size_t head_bytes, +read_log_file(const string &log_pathname, + size_t tail_bytes, size_t head_bytes, ostringstream &log_data) { - + // Get leaf name string log_leafname = log_pathname; size_t slash = log_leafname.rfind('/'); diff --git a/direct/src/plugin/p3dOsxSplashWindow.cxx b/direct/src/plugin/p3dOsxSplashWindow.cxx index d02a689919..979b35160d 100644 --- a/direct/src/plugin/p3dOsxSplashWindow.cxx +++ b/direct/src/plugin/p3dOsxSplashWindow.cxx @@ -14,7 +14,7 @@ #include "p3dOsxSplashWindow.h" -#ifdef __APPLE__ +#if defined(__APPLE__) && !__LP64__ #include #include diff --git a/direct/src/plugin/p3dOsxSplashWindow.h b/direct/src/plugin/p3dOsxSplashWindow.h index 95cec44587..03149bfc98 100644 --- a/direct/src/plugin/p3dOsxSplashWindow.h +++ b/direct/src/plugin/p3dOsxSplashWindow.h @@ -17,7 +17,7 @@ #include "p3d_plugin_common.h" -#ifdef __APPLE__ +#if defined(__APPLE__) && !__LP64__ #include "p3dSplashWindow.h" diff --git a/direct/src/plugin/p3dPackage.cxx b/direct/src/plugin/p3dPackage.cxx index bc25791575..85ab9a3b21 100755 --- a/direct/src/plugin/p3dPackage.cxx +++ b/direct/src/plugin/p3dPackage.cxx @@ -1539,6 +1539,10 @@ download_progress() { assert(_package->_active_download == this); switch (_dtype) { + case DT_contents_file: + case DT_redownload_contents_file: + break; + case DT_desc_file: break; @@ -1581,7 +1585,7 @@ download_finished(bool success) { _file_spec.get_actual_file()->output_hash(nout); nout << "\n"; } - + success = false; } } diff --git a/direct/src/plugin/p3dPythonRun.cxx b/direct/src/plugin/p3dPythonRun.cxx index 92002298b3..667f34e7dc 100755 --- a/direct/src/plugin/p3dPythonRun.cxx +++ b/direct/src/plugin/p3dPythonRun.cxx @@ -19,10 +19,7 @@ #include "virtualFileSystem.h" #include "nativeWindowHandle.h" -#ifndef CPPPARSER #include "py_panda.h" -IMPORT_THIS struct Dtool_PyTypedObject Dtool_WindowHandle; -#endif // There is only one P3DPythonRun object in any given process space. // Makes the statics easier to deal with, and we don't need multiple @@ -298,14 +295,12 @@ run_python() { // Now pass that func pointer back to our AppRunner instance, so it // can call up to us. - result = PyObject_CallMethod(_runner, (char *)"setRequestFunc", (char *)"O", request_func); + result = PyObject_CallMethod(_runner, (char *)"setRequestFunc", (char *)"N", request_func); if (result == NULL) { PyErr_Print(); return false; } Py_DECREF(result); - Py_DECREF(request_func); - // Now add check_comm() as a task. It can be a threaded task, but // this does mean that application programmers will have to be alert @@ -326,14 +321,14 @@ run_python() { return false; } - // We have to make it a PythonTask, not just a GenericAsyncTask, - // because we need the code in PythonTask that supports calling into - // Python from a separate thread. - _check_comm_task = new PythonTask(check_comm, "check_comm"); - _check_comm_task->set_task_chain("JavaScript"); - task_mgr->add(_check_comm_task); - - Py_DECREF(check_comm); + // Add it to the task manager. We do this instead of constructing a + // PythonTask because linking p3dpython with core.pyd is problematic. + result = PyObject_CallMethod(_taskMgr, (char *)"add", (char *)"Ns", check_comm, "check_comm"); + if (result == NULL) { + PyErr_Print(); + return false; + } + Py_DECREF(result); // Finally, get lost in AppRunner.run() (which is really a call to // taskMgr.run()). @@ -603,10 +598,8 @@ handle_pyobj_command(TiXmlElement *xcommand, bool needs_response, Py_INCREF(obj); } - PyObject *result = PyObject_CallMethod - (_runner, (char *)"setBrowserScriptObject", (char *)"O", obj); - Py_DECREF(obj); - Py_XDECREF(result); + Py_XDECREF(PyObject_CallMethod + (_runner, (char *)"setBrowserScriptObject", (char *)"N", obj)); } else if (strcmp(op, "call") == 0) { // Call the named method on the indicated object, or the object @@ -1215,9 +1208,8 @@ set_instance_info(P3DCInstance *inst, TiXmlElement *xinstance) { xinstance->Attribute("respect_per_platform", &respect_per_platform); PyObject *result = PyObject_CallMethod - (_runner, (char *)"setInstanceInfo", (char *)"sssiOi", root_dir, + (_runner, (char *)"setInstanceInfo", (char *)"sssiNi", root_dir, log_directory, super_mirror, verify_contents, main, respect_per_platform); - Py_DECREF(main); if (result == NULL) { PyErr_Print(); @@ -1331,11 +1323,9 @@ set_p3d_filename(P3DCInstance *inst, TiXmlElement *xfparams) { } PyObject *result = PyObject_CallMethod - (_runner, (char *)"setP3DFilename", (char *)"sOOiiis", p3d_filename.c_str(), + (_runner, (char *)"setP3DFilename", (char *)"sNNiiis", p3d_filename.c_str(), token_list, arg_list, inst->get_instance_id(), _interactive_console, p3d_offset, p3d_url.c_str()); - Py_DECREF(token_list); - Py_DECREF(arg_list); if (result == NULL) { PyErr_Print(); @@ -1425,18 +1415,16 @@ setup_window(P3DCInstance *inst, TiXmlElement *xwparams) { // setupWindow() call. For this, we need to create a Python // wrapper objcet. parent_window_handle->ref(); - py_handle = DTool_CreatePyInstanceTyped(parent_window_handle, Dtool_WindowHandle, true, false, parent_window_handle->get_type_index()); + py_handle = DTool_CreatePyInstanceTyped(parent_window_handle.p(), true); } Py_INCREF(py_handle); // TODO: direct this into the particular instance. This will // require a specialized ShowBase replacement. PyObject *result = PyObject_CallMethod - (_runner, (char *)"setupWindow", (char *)"siiiiO", window_type.c_str(), + (_runner, (char *)"setupWindow", (char *)"siiiiN", window_type.c_str(), win_x, win_y, win_width, win_height, py_handle); - Py_DECREF(py_handle); - if (result == NULL) { PyErr_Print(); if (_interactive_console) { diff --git a/direct/src/plugin/p3dPythonRun.h b/direct/src/plugin/p3dPythonRun.h index da0a942267..1f52c5eeb1 100755 --- a/direct/src/plugin/p3dPythonRun.h +++ b/direct/src/plugin/p3dPythonRun.h @@ -27,7 +27,6 @@ #include "handleStream.h" #include "p3dCInstance.h" #include "pandaFileStreamBuf.h" -#include "pythonTask.h" #include "pmap.h" #include "pdeque.h" #include "pmutex.h" @@ -173,8 +172,6 @@ private: PyObject *_browser_object_class; PyObject *_taskMgr; - PT(PythonTask) _check_comm_task; - // This map keeps track of the PyObject pointers we have delivered // to the parent process. We have to hold the reference count on // each of these until the parent process tells us it's safe to diff --git a/direct/src/plugin/p3dSplashWindow.cxx b/direct/src/plugin/p3dSplashWindow.cxx index 6c565db435..cbe58a50e2 100755 --- a/direct/src/plugin/p3dSplashWindow.cxx +++ b/direct/src/plugin/p3dSplashWindow.cxx @@ -15,30 +15,11 @@ #include "p3dSplashWindow.h" #include "wstring_encode.h" -// Stuff to use libpng. -#include - -// Stuff to use libjpeg. -extern "C" { -#include -#include -} - -#include - -struct my_error_mgr { - struct jpeg_error_mgr pub; - jmp_buf setjmp_buffer; -}; - -typedef struct my_error_mgr *my_error_ptr; - -METHODDEF(void) my_error_exit (j_common_ptr cinfo) { - // cinfo->err really points to a my_error_mgr struct, so coerce pointer - my_error_ptr myerr = (my_error_ptr) cinfo->err; - // Return control to the setjmp point - longjmp(myerr->setjmp_buffer, 1); -} +// We use the public domain stb_image library for loading images. +// Define the stb_image implementation. We only use it in this unit. +#define STB_IMAGE_STATIC +#define STB_IMAGE_IMPLEMENTATION +#include "stb_image.h" // The number of pixels to move the block per byte downloaded, when we // don't know the actual file size we're downloading. @@ -52,7 +33,7 @@ const double P3DSplashWindow::_unknown_progress_rate = 1.0 / 4096; // them both into this class for reference. //////////////////////////////////////////////////////////////////// P3DSplashWindow:: -P3DSplashWindow(P3DInstance *inst, bool make_visible) : +P3DSplashWindow(P3DInstance *inst, bool make_visible) : _inst(inst), _fparams(inst->get_fparams()), _wparams(inst->get_wparams()) @@ -82,7 +63,7 @@ P3DSplashWindow(P3DInstance *inst, bool make_visible) : //////////////////////////////////////////////////////////////////// // Function: P3DSplashWindow::Destructor // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// P3DSplashWindow:: ~P3DSplashWindow() { @@ -259,191 +240,25 @@ read_image_data(ImageData &image, string &data, return false; } - // We only support JPEG or PNG images. - FILE *fp = NULL; -#ifdef _WIN32 - wstring image_filename_w; - if (string_to_wstring(image_filename_w, image_filename)) { - fp = _wfopen(image_filename_w.c_str(), L"rb"); - } -#else // _WIN32 - fp = fopen(image_filename.c_str(), "rb"); -#endif // _WIN32 + nout << "Reading splash file image: " << image_filename << "\n"; - if (fp == NULL) { - nout << "Couldn't open splash file image: " << image_filename << "\n"; - return false; - } + unsigned char *imgdata = stbi_load(image_filename.c_str(), &image._width, + &image._height, &image._num_channels, 0); - // Check the magic number to determine which image type we have. - static const size_t magic_number_len = 2; - char magic_number[magic_number_len]; - if (fread(magic_number, 1, magic_number_len, fp) != magic_number_len) { - nout << "Empty file: " << image_filename << "\n"; - return false; - } - // Rewind to re-read the magic number below. - fseek(fp, 0, SEEK_SET); - - bool result = false; - if ((char)magic_number[0] == (char)0xff && - (char)magic_number[1] == (char)0xd8) { - // It's a jpeg image. - result = read_image_data_jpeg(image, data, fp, image_filename); - - } else if (png_sig_cmp((png_bytep)magic_number, 0, magic_number_len) == 0) { - // It's a PNG image. - result = read_image_data_png(image, data, fp, image_filename); - - } else { - nout << "Neither a JPEG nor a PNG image: " << image_filename << "\n"; - result = false; - } - - fclose(fp); - return result; -} - -//////////////////////////////////////////////////////////////////// -// Function: P3DSplashWindow::read_image_data_jpeg -// Access: Protected -// Description: Reads the image filename and sets image parameters -// width, height, num_channels, and data. Returns true -// on success, false on failure. -//////////////////////////////////////////////////////////////////// -bool P3DSplashWindow:: -read_image_data_jpeg(ImageData &image, string &data, - FILE *fp, const string &image_filename) { - // We set up the normal JPEG error routines, then override error_exit. - struct jpeg_decompress_struct cinfo; - - struct my_error_mgr jerr; - cinfo.err = jpeg_std_error(&jerr.pub); - jerr.pub.error_exit = my_error_exit; - - JSAMPLE *buffer = NULL; - - // Establish the setjmp return context for my_error_exit to use - if (setjmp(jerr.setjmp_buffer)) { - // If we get here, the JPEG code has signaled an error. - nout << "JPEG error decoding " << image_filename << "\n"; - - // We need to clean up the JPEG object, close the input file, and return. - jpeg_destroy_decompress(&cinfo); - - if (buffer != NULL) { - delete[] buffer; + if (imgdata == NULL) { + nout << "Couldn't read splash file image: " << image_filename << "\n"; + const char *reason = stbi_failure_reason(); + if (reason != NULL) { + nout << "stbi_failure_reason: " << reason << "\n"; } return false; } - /* Now we can initialize the JPEG decompression object. */ - jpeg_create_decompress(&cinfo); - jpeg_stdio_src(&cinfo, fp); + size_t data_size = image._width * image._height * image._num_channels; + data.resize(data_size); + memcpy(&data[0], imgdata, data_size); - jpeg_read_header(&cinfo, true); - - cinfo.scale_num = 1; - cinfo.scale_denom = 1; - - jpeg_start_decompress(&cinfo); - - image._width = cinfo.output_width; - image._height = cinfo.output_height; - image._num_channels = cinfo.output_components; - - int row_stride = image._width * image._num_channels; - - size_t buffer_size = image._height * row_stride; - buffer = new JSAMPLE[buffer_size]; - JSAMPLE *buffer_end = buffer + buffer_size; - - JSAMPLE *rowptr = buffer; - while (cinfo.output_scanline < cinfo.output_height) { - assert(rowptr + row_stride <= buffer_end); - jpeg_read_scanlines(&cinfo, &rowptr, 1); - rowptr += row_stride; - } - - jpeg_finish_decompress(&cinfo); - - data.append((const char *)buffer, buffer_size); - delete[] buffer; - - return true; -} - - -//////////////////////////////////////////////////////////////////// -// Function: P3DSplashWindow::read_image_data_png -// Access: Protected -// Description: Reads the image filename and sets image parameters -// width, height, num_channels, and data. Returns true -// on success, false on failure. -//////////////////////////////////////////////////////////////////// -bool P3DSplashWindow:: -read_image_data_png(ImageData &image, string &data, - FILE *fp, const string &image_filename) { - png_structp png; - png = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (png == NULL) { - return false; - } - - png_infop info; - info = png_create_info_struct(png); - if (info == NULL) { - png_destroy_read_struct(&png, NULL, NULL); - return false; - } - - jmp_buf jmpbuf; - if (setjmp(jmpbuf)) { - // This is the ANSI C way to handle exceptions. If setjmp(), - // above, returns true, it means that libpng detected an exception - // while executing the code that reads the header info, below. - png_destroy_read_struct(&png, &info, NULL); - return false; - } - - png_init_io(png, fp); - int transforms = PNG_TRANSFORM_STRIP_16 | PNG_TRANSFORM_PACKING | PNG_TRANSFORM_EXPAND | PNG_TRANSFORM_SHIFT; - // transforms |= PNG_TRANSFORM_STRIP_ALPHA; - png_read_png(png, info, transforms, NULL); - - png_uint_32 width; - png_uint_32 height; - int bit_depth; - int color_type; - - png_get_IHDR(png, info, &width, &height, - &bit_depth, &color_type, NULL, NULL, NULL); - - image._width = width; - image._height = height; - - switch (color_type) { - case PNG_COLOR_TYPE_RGB: - image._num_channels = 3; - break; - - case PNG_COLOR_TYPE_RGB_ALPHA: - image._num_channels = 4; - break; - - default: - nout << "Unsupported color type: " << color_type << "\n"; - png_destroy_read_struct(&png, &info, NULL); - return false; - } - - int row_stride = image._width * image._num_channels; - png_bytep *row_pointers = png_get_rows(png, info); - for (int yi = 0; yi < image._height; ++yi) { - data.append((const char *)row_pointers[yi], row_stride); - } - - png_destroy_read_struct(&png, &info, NULL); + stbi_image_free(imgdata); return true; } @@ -479,7 +294,7 @@ set_button_range(const ImageData &image) { // But it can't be larger than the window itself. _button_width = min(_button_width, _win_width); _button_height = min(_button_height, _win_height); - + // Compute the top-left corner of the button image in window // coordinates. _button_x = (_win_width - _button_width) / 2; diff --git a/direct/src/plugin/p3dSplashWindow.h b/direct/src/plugin/p3dSplashWindow.h index 9b41386b85..33feccead5 100755 --- a/direct/src/plugin/p3dSplashWindow.h +++ b/direct/src/plugin/p3dSplashWindow.h @@ -78,10 +78,6 @@ protected: bool read_image_data(ImageData &image, string &data, const string &image_filename); - bool read_image_data_jpeg(ImageData &image, string &data, - FILE *fp, const string &image_filename); - bool read_image_data_png(ImageData &image, string &data, - FILE *fp, const string &image_filename); void get_bar_placement(int &bar_x, int &bar_y, int &bar_width, int &bar_height); void set_button_range(const ImageData &image); diff --git a/direct/src/plugin/p3dX11SplashWindow.cxx b/direct/src/plugin/p3dX11SplashWindow.cxx index aaaa4c8e0a..f1afc5a15b 100755 --- a/direct/src/plugin/p3dX11SplashWindow.cxx +++ b/direct/src/plugin/p3dX11SplashWindow.cxx @@ -1060,7 +1060,6 @@ update_image(X11ImageData &image) { _needs_new_composite = true; // Go read the image. - string data; if (!read_image_data(image, image._data, image._filename)) { return; } diff --git a/direct/src/plugin/stb_image.h b/direct/src/plugin/stb_image.h new file mode 100644 index 0000000000..c3945c2e25 --- /dev/null +++ b/direct/src/plugin/stb_image.h @@ -0,0 +1,6326 @@ +/* stb_image - v2.02 - public domain image loader - http://nothings.org/stb_image.h + no warranty implied; use at your own risk + + Do this: + #define STB_IMAGE_IMPLEMENTATION + before you include this file in *one* C or C++ file to create the implementation. + + // i.e. it should look like this: + #include ... + #include ... + #include ... + #define STB_IMAGE_IMPLEMENTATION + #include "stb_image.h" + + You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. + And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free + + + QUICK NOTES: + Primarily of interest to game developers and other people who can + avoid problematic images and only need the trivial interface + + JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) + PNG 1/2/4/8-bit-per-channel (16 bpc not supported) + + TGA (not sure what subset, if a subset) + BMP non-1bpp, non-RLE + PSD (composited view only, no extra channels) + + GIF (*comp always reports as 4-channel) + HDR (radiance rgbE format) + PIC (Softimage PIC) + PNM (PPM and PGM binary only) + + - decode from memory or through FILE (define STBI_NO_STDIO to remove code) + - decode from arbitrary I/O callbacks + - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) + + Full documentation under "DOCUMENTATION" below. + + + Revision 2.00 release notes: + + - Progressive JPEG is now supported. + + - PPM and PGM binary formats are now supported, thanks to Ken Miller. + + - x86 platforms now make use of SSE2 SIMD instructions for + JPEG decoding, and ARM platforms can use NEON SIMD if requested. + This work was done by Fabian "ryg" Giesen. SSE2 is used by + default, but NEON must be enabled explicitly; see docs. + + With other JPEG optimizations included in this version, we see + 2x speedup on a JPEG on an x86 machine, and a 1.5x speedup + on a JPEG on an ARM machine, relative to previous versions of this + library. The same results will not obtain for all JPGs and for all + x86/ARM machines. (Note that progressive JPEGs are significantly + slower to decode than regular JPEGs.) This doesn't mean that this + is the fastest JPEG decoder in the land; rather, it brings it + closer to parity with standard libraries. If you want the fastest + decode, look elsewhere. (See "Philosophy" section of docs below.) + + See final bullet items below for more info on SIMD. + + - Added STBI_MALLOC, STBI_REALLOC, and STBI_FREE macros for replacing + the memory allocator. Unlike other STBI libraries, these macros don't + support a context parameter, so if you need to pass a context in to + the allocator, you'll have to store it in a global or a thread-local + variable. + + - Split existing STBI_NO_HDR flag into two flags, STBI_NO_HDR and + STBI_NO_LINEAR. + STBI_NO_HDR: suppress implementation of .hdr reader format + STBI_NO_LINEAR: suppress high-dynamic-range light-linear float API + + - You can suppress implementation of any of the decoders to reduce + your code footprint by #defining one or more of the following + symbols before creating the implementation. + + STBI_NO_JPEG + STBI_NO_PNG + STBI_NO_BMP + STBI_NO_PSD + STBI_NO_TGA + STBI_NO_GIF + STBI_NO_HDR + STBI_NO_PIC + STBI_NO_PNM (.ppm and .pgm) + + - You can request *only* certain decoders and suppress all other ones + (this will be more forward-compatible, as addition of new decoders + doesn't require you to disable them explicitly): + + STBI_ONLY_JPEG + STBI_ONLY_PNG + STBI_ONLY_BMP + STBI_ONLY_PSD + STBI_ONLY_TGA + STBI_ONLY_GIF + STBI_ONLY_HDR + STBI_ONLY_PIC + STBI_ONLY_PNM (.ppm and .pgm) + + Note that you can define multiples of these, and you will get all + of them ("only x" and "only y" is interpreted to mean "only x&y"). + + - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still + want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB + + - Compilation of all SIMD code can be suppressed with + #define STBI_NO_SIMD + It should not be necessary to disable SIMD unless you have issues + compiling (e.g. using an x86 compiler which doesn't support SSE + intrinsics or that doesn't support the method used to detect + SSE2 support at run-time), and even those can be reported as + bugs so I can refine the built-in compile-time checking to be + smarter. + + - The old STBI_SIMD system which allowed installing a user-defined + IDCT etc. has been removed. If you need this, don't upgrade. My + assumption is that almost nobody was doing this, and those who + were will find the built-in SIMD more satisfactory anyway. + + - RGB values computed for JPEG images are slightly different from + previous versions of stb_image. (This is due to using less + integer precision in SIMD.) The C code has been adjusted so + that the same RGB values will be computed regardless of whether + SIMD support is available, so your app should always produce + consistent results. But these results are slightly different from + previous versions. (Specifically, about 3% of available YCbCr values + will compute different RGB results from pre-1.49 versions by +-1; + most of the deviating values are one smaller in the G channel.) + + - If you must produce consistent results with previous versions of + stb_image, #define STBI_JPEG_OLD and you will get the same results + you used to; however, you will not get the SIMD speedups for + the YCbCr-to-RGB conversion step (although you should still see + significant JPEG speedup from the other changes). + + Please note that STBI_JPEG_OLD is a temporary feature; it will be + removed in future versions of the library. It is only intended for + near-term back-compatibility use. + + + Latest revision history: + 2.02 (2015-01-19) fix incorrect assert, fix warning + 2.01 (2015-01-17) fix various warnings + 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG + 2.00 (2014-12-25) optimize JPEG, including x86 SSE2 & ARM NEON SIMD + progressive JPEG + PGM/PPM support + STBI_MALLOC,STBI_REALLOC,STBI_FREE + STBI_NO_*, STBI_ONLY_* + GIF bugfix + 1.48 (2014-12-14) fix incorrectly-named assert() + 1.47 (2014-12-14) 1/2/4-bit PNG support (both grayscale and paletted) + optimize PNG + fix bug in interlaced PNG with user-specified channel count + 1.46 (2014-08-26) fix broken tRNS chunk in non-paletted PNG + 1.45 (2014-08-16) workaround MSVC-ARM internal compiler error by wrapping malloc + + See end of file for full revision history. + + + ============================ Contributors ========================= + + Image formats Bug fixes & warning fixes + Sean Barrett (jpeg, png, bmp) Marc LeBlanc + Nicolas Schulz (hdr, psd) Christpher Lloyd + Jonathan Dummer (tga) Dave Moore + Jean-Marc Lienher (gif) Won Chun + Tom Seddon (pic) the Horde3D community + Thatcher Ulrich (psd) Janez Zemva + Ken Miller (pgm, ppm) Jonathan Blow + Laurent Gomila + Aruelien Pocheville + Extensions, features Ryamond Barbiero + Jetro Lauha (stbi_info) David Woo + Martin "SpartanJ" Golini (stbi_info) Martin Golini + James "moose2000" Brown (iPhone PNG) Roy Eltham + Ben "Disch" Wenger (io callbacks) Luke Graham + Omar Cornut (1/2/4-bit PNG) Thomas Ruf + John Bartholomew + Ken Hamada + Optimizations & bugfixes Cort Stratton + Fabian "ryg" Giesen Blazej Dariusz Roszkowski + Arseny Kapoulkine Thibault Reuille + Paul Du Bois + Guillaume George + If your name should be here but Jerry Jansson + isn't, let Sean know. Hayaki Saito + Johan Duparc + Ronny Chevalier + Michal Cichon + Tero Hanninen + Sergio Gonzalez + Cass Everitt + Engin Manap + +License: + This software is in the public domain. Where that dedication is not + recognized, you are granted a perpetual, irrevocable license to copy + and modify this file however you want. + +*/ + +#ifndef STBI_INCLUDE_STB_IMAGE_H +#define STBI_INCLUDE_STB_IMAGE_H + +// DOCUMENTATION +// +// Limitations: +// - no 16-bit-per-channel PNG +// - no 12-bit-per-channel JPEG +// - no JPEGs with arithmetic coding +// - no 1-bit BMP +// - GIF always returns *comp=4 +// +// Basic usage (see HDR discussion below for HDR usage): +// int x,y,n; +// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); +// // ... process data if not NULL ... +// // ... x = width, y = height, n = # 8-bit components per pixel ... +// // ... replace '0' with '1'..'4' to force that many components per pixel +// // ... but 'n' will always be the number that it would have been if you said 0 +// stbi_image_free(data) +// +// Standard parameters: +// int *x -- outputs image width in pixels +// int *y -- outputs image height in pixels +// int *comp -- outputs # of image components in image file +// int req_comp -- if non-zero, # of image components requested in result +// +// The return value from an image loader is an 'unsigned char *' which points +// to the pixel data, or NULL on an allocation failure or if the image is +// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels, +// with each pixel consisting of N interleaved 8-bit components; the first +// pixel pointed to is top-left-most in the image. There is no padding between +// image scanlines or between pixels, regardless of format. The number of +// components N is 'req_comp' if req_comp is non-zero, or *comp otherwise. +// If req_comp is non-zero, *comp has the number of components that _would_ +// have been output otherwise. E.g. if you set req_comp to 4, you will always +// get RGBA output, but you can check *comp to see if it's trivially opaque +// because e.g. there were only 3 channels in the source image. +// +// An output image with N components has the following components interleaved +// in this order in each pixel: +// +// N=#comp components +// 1 grey +// 2 grey, alpha +// 3 red, green, blue +// 4 red, green, blue, alpha +// +// If image loading fails for any reason, the return value will be NULL, +// and *x, *y, *comp will be unchanged. The function stbi_failure_reason() +// can be queried for an extremely brief, end-user unfriendly explanation +// of why the load failed. Define STBI_NO_FAILURE_STRINGS to avoid +// compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly +// more user-friendly ones. +// +// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. +// +// =========================================================================== +// +// Philosophy +// +// stb libraries are designed with the following priorities: +// +// 1. easy to use +// 2. easy to maintain +// 3. good performance +// +// Sometimes I let "good performance" creep up in priority over "easy to maintain", +// and for best performance I may provide less-easy-to-use APIs that give higher +// performance, in addition to the easy to use ones. Nevertheless, it's important +// to keep in mind that from the standpoint of you, a client of this library, +// all you care about is #1 and #3, and stb libraries do not emphasize #3 above all. +// +// Some secondary priorities arise directly from the first two, some of which +// make more explicit reasons why performance can't be emphasized. +// +// - Portable ("ease of use") +// - Small footprint ("easy to maintain") +// - No dependencies ("ease of use") +// +// =========================================================================== +// +// I/O callbacks +// +// I/O callbacks allow you to read from arbitrary sources, like packaged +// files or some other source. Data read from callbacks are processed +// through a small internal buffer (currently 128 bytes) to try to reduce +// overhead. +// +// The three functions you must define are "read" (reads some bytes of data), +// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). +// +// =========================================================================== +// +// SIMD support +// +// The JPEG decoder will try to automatically use SIMD kernels on x86 when +// supported by the compiler. For ARM Neon support, you must explicitly +// request it. +// +// (The old do-it-yourself SIMD API is no longer supported in the current +// code.) +// +// On x86, SSE2 will automatically be used when available based on a run-time +// test; if not, the generic C versions are used as a fall-back. On ARM targets, +// the typical path is to have separate builds for NEON and non-NEON devices +// (at least this is true for iOS and Android). Therefore, the NEON support is +// toggled by a build flag: define STBI_NEON to get NEON loops. +// +// The output of the JPEG decoder is slightly different from versions where +// SIMD support was introduced (that is, for versions before 1.49). The +// difference is only +-1 in the 8-bit RGB channels, and only on a small +// fraction of pixels. You can force the pre-1.49 behavior by defining +// STBI_JPEG_OLD, but this will disable some of the SIMD decoding path +// and hence cost some performance. +// +// If for some reason you do not want to use any of SIMD code, or if +// you have issues compiling it, you can disable it entirely by +// defining STBI_NO_SIMD. +// +// =========================================================================== +// +// HDR image support (disable by defining STBI_NO_HDR) +// +// stb_image now supports loading HDR images in general, and currently +// the Radiance .HDR file format, although the support is provided +// generically. You can still load any file through the existing interface; +// if you attempt to load an HDR file, it will be automatically remapped to +// LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; +// both of these constants can be reconfigured through this interface: +// +// stbi_hdr_to_ldr_gamma(2.2f); +// stbi_hdr_to_ldr_scale(1.0f); +// +// (note, do not use _inverse_ constants; stbi_image will invert them +// appropriately). +// +// Additionally, there is a new, parallel interface for loading files as +// (linear) floats to preserve the full dynamic range: +// +// float *data = stbi_loadf(filename, &x, &y, &n, 0); +// +// If you load LDR images through this interface, those images will +// be promoted to floating point values, run through the inverse of +// constants corresponding to the above: +// +// stbi_ldr_to_hdr_scale(1.0f); +// stbi_ldr_to_hdr_gamma(2.2f); +// +// Finally, given a filename (or an open file or memory block--see header +// file for details) containing image data, you can query for the "most +// appropriate" interface to use (that is, whether the image is HDR or +// not), using: +// +// stbi_is_hdr(char *filename); +// +// =========================================================================== +// +// iPhone PNG support: +// +// By default we convert iphone-formatted PNGs back to RGB, even though +// they are internally encoded differently. You can disable this conversion +// by by calling stbi_convert_iphone_png_to_rgb(0), in which case +// you will always just get the native iphone "format" through (which +// is BGR stored in RGB). +// +// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per +// pixel to remove any premultiplied alpha *only* if the image file explicitly +// says there's premultiplied data (currently only happens in iPhone images, +// and only if iPhone convert-to-rgb processing is on). +// + + +#ifndef STBI_NO_STDIO +#include +#endif // STBI_NO_STDIO + +#define STBI_VERSION 1 + +enum +{ + STBI_default = 0, // only used for req_comp + + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4 +}; + +typedef unsigned char stbi_uc; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef STB_IMAGE_STATIC +#define STBIDEF static +#else +#define STBIDEF extern +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// PRIMARY API - works on images of any type +// + +// +// load image by filename, open file, or memory buffer +// + +typedef struct +{ + int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read + void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative + int (*eof) (void *user); // returns nonzero if we are at end of file/data +} stbi_io_callbacks; + +STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *comp, int req_comp); +STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *comp, int req_comp); +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *comp, int req_comp); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); +// for stbi_load_from_file, file pointer is left pointing immediately after image +#endif + +#ifndef STBI_NO_LINEAR + STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp); + STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); + STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp); + + #ifndef STBI_NO_STDIO + STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); + #endif +#endif + +#ifndef STBI_NO_HDR + STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); + STBIDEF void stbi_hdr_to_ldr_scale(float scale); +#endif + +#ifndef STBI_NO_LINEAR + STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); + STBIDEF void stbi_ldr_to_hdr_scale(float scale); +#endif // STBI_NO_HDR + +// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename); +STBIDEF int stbi_is_hdr_from_file(FILE *f); +#endif // STBI_NO_STDIO + + +// get a VERY brief reason for failure +// NOT THREADSAFE +STBIDEF const char *stbi_failure_reason (void); + +// free the loaded image -- this is just free() +STBIDEF void stbi_image_free (void *retval_from_stbi_load); + +// get image dimensions & components without fully decoding +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); + +#endif + + + +// for image formats that explicitly notate that they have premultiplied alpha, +// we just return the colors as stored in the file. set this flag to force +// unpremultiplication. results are undefined if the unpremultiply overflow. +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); + +// indicate whether we should process iphone images back to canonical format, +// or just pass them through "as-is" +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); + + +// ZLIB client - used by PNG, available for other purposes + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); +STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + +STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + + +#ifdef __cplusplus +} +#endif + +// +// +//// end header file ///////////////////////////////////////////////////// +#endif // STBI_INCLUDE_STB_IMAGE_H + +#ifdef STB_IMAGE_IMPLEMENTATION + +#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ + || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ + || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ + || defined(STBI_ONLY_ZLIB) + #ifndef STBI_ONLY_JPEG + #define STBI_NO_JPEG + #endif + #ifndef STBI_ONLY_PNG + #define STBI_NO_PNG + #endif + #ifndef STBI_ONLY_BMP + #define STBI_NO_BMP + #endif + #ifndef STBI_ONLY_PSD + #define STBI_NO_PSD + #endif + #ifndef STBI_ONLY_TGA + #define STBI_NO_TGA + #endif + #ifndef STBI_ONLY_GIF + #define STBI_NO_GIF + #endif + #ifndef STBI_ONLY_HDR + #define STBI_NO_HDR + #endif + #ifndef STBI_ONLY_PIC + #define STBI_NO_PIC + #endif + #ifndef STBI_ONLY_PNM + #define STBI_NO_PNM + #endif +#endif + +#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) +#define STBI_NO_ZLIB +#endif + + +#include +#include // ptrdiff_t on osx +#include +#include + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +#include // ldexp +#endif + +#ifndef STBI_NO_STDIO +#include +#endif + +#ifndef STBI_ASSERT +#include +#define STBI_ASSERT(x) assert(x) +#endif + + +#ifndef _MSC_VER + #ifdef __cplusplus + #define stbi_inline inline + #else + #define stbi_inline + #endif +#else + #define stbi_inline __forceinline +#endif + + +#ifdef _MSC_VER +typedef unsigned short stbi__uint16; +typedef signed short stbi__int16; +typedef unsigned int stbi__uint32; +typedef signed int stbi__int32; +#else +#include +typedef uint16_t stbi__uint16; +typedef int16_t stbi__int16; +typedef uint32_t stbi__uint32; +typedef int32_t stbi__int32; +#endif + +// should produce compiler error if size is wrong +typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; + +#ifdef _MSC_VER +#define STBI_NOTUSED(v) (void)(v) +#else +#define STBI_NOTUSED(v) (void)sizeof(v) +#endif + +#ifdef _MSC_VER +#define STBI_HAS_LROTL +#endif + +#ifdef STBI_HAS_LROTL + #define stbi_lrot(x,y) _lrotl(x,y) +#else + #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) +#endif + +#if defined(STBI_MALLOC) && defined(STBI_FREE) && defined(STBI_REALLOC) +// ok +#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) +// ok +#else +#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC." +#endif + +#ifndef STBI_MALLOC +#define STBI_MALLOC(sz) malloc(sz) +#define STBI_REALLOC(p,sz) realloc(p,sz) +#define STBI_FREE(p) free(p) +#endif + +#if defined(__GNUC__) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) +// gcc doesn't support sse2 intrinsics unless you compile with -msse2, +// (but compiling with -msse2 allows the compiler to use SSE2 everywhere; +// this is just broken and gcc are jerks for not fixing it properly +// http://www.virtualdub.org/blog/pivot/entry.php?id=363 ) +#define STBI_NO_SIMD +#endif + +#if !defined(STBI_NO_SIMD) && (defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86)) +#define STBI_SSE2 +#include + +#ifdef _MSC_VER + +#if _MSC_VER >= 1400 // not VC6 +#include // __cpuid +static int stbi__cpuid3(void) +{ + int info[4]; + __cpuid(info,1); + return info[3]; +} +#else +static int stbi__cpuid3(void) +{ + int res; + __asm { + mov eax,1 + cpuid + mov res,edx + } + return res; +} +#endif + +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name + +static int stbi__sse2_available() +{ + int info3 = stbi__cpuid3(); + return ((info3 >> 26) & 1) != 0; +} +#else // assume GCC-style if not VC++ +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) + +static int stbi__sse2_available() +{ +#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 // GCC 4.8 or later + // GCC 4.8+ has a nice way to do this + return __builtin_cpu_supports("sse2"); +#else + // portable way to do this, preferably without using GCC inline ASM? + // just bail for now. + return 0; +#endif +} +#endif +#endif + +// ARM NEON +#if defined(STBI_NO_SIMD) && defined(STBI_NEON) +#undef STBI_NEON +#endif + +#ifdef STBI_NEON +#include +// assume GCC or Clang on ARM targets +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) +#endif + +#ifndef STBI_SIMD_ALIGN +#define STBI_SIMD_ALIGN(type, name) type name +#endif + +/////////////////////////////////////////////// +// +// stbi__context struct and start_xxx functions + +// stbi__context structure is our basic context used by all images, so it +// contains all the IO context, plus some basic image information +typedef struct +{ + stbi__uint32 img_x, img_y; + int img_n, img_out_n; + + stbi_io_callbacks io; + void *io_user_data; + + int read_from_callbacks; + int buflen; + stbi_uc buffer_start[128]; + + stbi_uc *img_buffer, *img_buffer_end; + stbi_uc *img_buffer_original; +} stbi__context; + + +static void stbi__refill_buffer(stbi__context *s); + +// initialize a memory-decode context +static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) +{ + s->io.read = NULL; + s->read_from_callbacks = 0; + s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; + s->img_buffer_end = (stbi_uc *) buffer+len; +} + +// initialize a callback-based context +static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user) +{ + s->io = *c; + s->io_user_data = user; + s->buflen = sizeof(s->buffer_start); + s->read_from_callbacks = 1; + s->img_buffer_original = s->buffer_start; + stbi__refill_buffer(s); +} + +#ifndef STBI_NO_STDIO + +static int stbi__stdio_read(void *user, char *data, int size) +{ + return (int) fread(data,1,size,(FILE*) user); +} + +static void stbi__stdio_skip(void *user, int n) +{ + fseek((FILE*) user, n, SEEK_CUR); +} + +static int stbi__stdio_eof(void *user) +{ + return feof((FILE*) user); +} + +static stbi_io_callbacks stbi__stdio_callbacks = +{ + stbi__stdio_read, + stbi__stdio_skip, + stbi__stdio_eof, +}; + +static void stbi__start_file(stbi__context *s, FILE *f) +{ + stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f); +} + +//static void stop_file(stbi__context *s) { } + +#endif // !STBI_NO_STDIO + +static void stbi__rewind(stbi__context *s) +{ + // conceptually rewind SHOULD rewind to the beginning of the stream, + // but we just rewind to the beginning of the initial buffer, because + // we only use it after doing 'test', which only ever looks at at most 92 bytes + s->img_buffer = s->img_buffer_original; +} + +#ifndef STBI_NO_JPEG +static int stbi__jpeg_test(stbi__context *s); +static stbi_uc *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNG +static int stbi__png_test(stbi__context *s); +static stbi_uc *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_BMP +static int stbi__bmp_test(stbi__context *s); +static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_TGA +static int stbi__tga_test(stbi__context *s); +static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s); +static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_HDR +static int stbi__hdr_test(stbi__context *s); +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_test(stbi__context *s); +static stbi_uc *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_GIF +static int stbi__gif_test(stbi__context *s); +static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNM +static int stbi__pnm_test(stbi__context *s); +static stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +// this is not threadsafe +static const char *stbi__g_failure_reason; + +STBIDEF const char *stbi_failure_reason(void) +{ + return stbi__g_failure_reason; +} + +static int stbi__err(const char *str) +{ + stbi__g_failure_reason = str; + return 0; +} + +static void *stbi__malloc(size_t size) +{ + return STBI_MALLOC(size); +} + +// stbi__err - error +// stbi__errpf - error returning pointer to float +// stbi__errpuc - error returning pointer to unsigned char + +#ifdef STBI_NO_FAILURE_STRINGS + #define stbi__err(x,y) 0 +#elif defined(STBI_FAILURE_USERMSG) + #define stbi__err(x,y) stbi__err(y) +#else + #define stbi__err(x,y) stbi__err(x) +#endif + +#define stbi__errpf(x,y) ((float *) (stbi__err(x,y)?NULL:NULL)) +#define stbi__errpuc(x,y) ((unsigned char *) (stbi__err(x,y)?NULL:NULL)) + +STBIDEF void stbi_image_free(void *retval_from_stbi_load) +{ + STBI_FREE(retval_from_stbi_load); +} + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); +#endif + +#ifndef STBI_NO_HDR +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); +#endif + +static unsigned char *stbi_load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + #ifndef STBI_NO_JPEG + if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp); + #endif + #ifndef STBI_NO_PNG + if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp); + #endif + #ifndef STBI_NO_BMP + if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp); + #endif + #ifndef STBI_NO_GIF + if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp); + #endif + #ifndef STBI_NO_PSD + if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp); + #endif + #ifndef STBI_NO_PIC + if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp); + #endif + #ifndef STBI_NO_PNM + if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp); + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + float *hdr = stbi__hdr_load(s, x,y,comp,req_comp); + return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); + } + #endif + + #ifndef STBI_NO_TGA + // test tga last because it's a crappy test! + if (stbi__tga_test(s)) + return stbi__tga_load(s,x,y,comp,req_comp); + #endif + + return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); +} + +#ifndef STBI_NO_STDIO + +static FILE *stbi__fopen(char const *filename, char const *mode) +{ + FILE *f; +#if defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != fopen_s(&f, filename, mode)) + f=0; +#else + f = fopen(filename, mode); +#endif + return f; +} + + +STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + unsigned char *result; + if (!f) return stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi_load_main(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} +#endif //!STBI_NO_STDIO + +STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi_load_main(&s,x,y,comp,req_comp); +} + +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi_load_main(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_LINEAR +static float *stbi_loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *data; + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) + return stbi__hdr_load(s,x,y,comp,req_comp); + #endif + data = stbi_load_main(s, x, y, comp, req_comp); + if (data) + return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); + return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); +} + +STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi_loadf_main(&s,x,y,comp,req_comp); +} + +STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi_loadf_main(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_STDIO +STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + float *result; + FILE *f = stbi__fopen(filename, "rb"); + if (!f) return stbi__errpf("can't fopen", "Unable to open file"); + result = stbi_loadf_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_file(&s,f); + return stbi_loadf_main(&s,x,y,comp,req_comp); +} +#endif // !STBI_NO_STDIO + +#endif // !STBI_NO_LINEAR + +// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is +// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always +// reports false! + +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(buffer); + STBI_NOTUSED(len); + return 0; + #endif +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result=0; + if (f) { + result = stbi_is_hdr_from_file(f); + fclose(f); + } + return result; +} + +STBIDEF int stbi_is_hdr_from_file(FILE *f) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_file(&s,f); + return stbi__hdr_test(&s); + #else + return 0; + #endif +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__hdr_test(&s); + #else + return 0; + #endif +} + +static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; +static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; + +#ifndef STBI_NO_LINEAR +STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } +STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } +#endif + +STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } +STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } + + +////////////////////////////////////////////////////////////////////////////// +// +// Common code used by all image loaders +// + +enum +{ + STBI__SCAN_load=0, + STBI__SCAN_type, + STBI__SCAN_header +}; + +static void stbi__refill_buffer(stbi__context *s) +{ + int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); + if (n == 0) { + // at end of file, treat same as if from memory, but need to handle case + // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file + s->read_from_callbacks = 0; + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start+1; + *s->img_buffer = 0; + } else { + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start + n; + } +} + +stbi_inline static stbi_uc stbi__get8(stbi__context *s) +{ + if (s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + if (s->read_from_callbacks) { + stbi__refill_buffer(s); + return *s->img_buffer++; + } + return 0; +} + +stbi_inline static int stbi__at_eof(stbi__context *s) +{ + if (s->io.read) { + if (!(s->io.eof)(s->io_user_data)) return 0; + // if feof() is true, check if buffer = end + // special case: we've only got the special 0 character at the end + if (s->read_from_callbacks == 0) return 1; + } + + return s->img_buffer >= s->img_buffer_end; +} + +static void stbi__skip(stbi__context *s, int n) +{ + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + s->img_buffer = s->img_buffer_end; + (s->io.skip)(s->io_user_data, n - blen); + return; + } + } + s->img_buffer += n; +} + +static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) +{ + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + int res, count; + + memcpy(buffer, s->img_buffer, blen); + + count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); + res = (count == (n-blen)); + s->img_buffer = s->img_buffer_end; + return res; + } + } + + if (s->img_buffer+n <= s->img_buffer_end) { + memcpy(buffer, s->img_buffer, n); + s->img_buffer += n; + return 1; + } else + return 0; +} + +static int stbi__get16be(stbi__context *s) +{ + int z = stbi__get8(s); + return (z << 8) + stbi__get8(s); +} + +static stbi__uint32 stbi__get32be(stbi__context *s) +{ + stbi__uint32 z = stbi__get16be(s); + return (z << 16) + stbi__get16be(s); +} + +static int stbi__get16le(stbi__context *s) +{ + int z = stbi__get8(s); + return z + (stbi__get8(s) << 8); +} + +static stbi__uint32 stbi__get32le(stbi__context *s) +{ + stbi__uint32 z = stbi__get16le(s); + return z + (stbi__get16le(s) << 16); +} + +#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings + + +////////////////////////////////////////////////////////////////////////////// +// +// generic converter from built-in img_n to req_comp +// individual types do this automatically as much as possible (e.g. jpeg +// does all cases internally since it needs to colorspace convert anyway, +// and it never has alpha, so very few cases ). png can automatically +// interleave an alpha=255 channel, but falls back to this for other cases +// +// assume data buffer is malloced, so malloc a new one and free that one +// only failure mode is malloc failing + +static stbi_uc stbi__compute_y(int r, int g, int b) +{ + return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8); +} + +static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + unsigned char *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (unsigned char *) stbi__malloc(req_comp * x * y); + if (good == NULL) { + STBI_FREE(data); + return stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + unsigned char *src = data + j * x * img_n ; + unsigned char *dest = good + j * x * req_comp; + + #define COMBO(a,b) ((a)*8+(b)) + #define CASE(a,b) case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (COMBO(img_n, req_comp)) { + CASE(1,2) dest[0]=src[0], dest[1]=255; break; + CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break; + CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break; + CASE(2,1) dest[0]=src[0]; break; + CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break; + CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break; + CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break; + CASE(3,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break; + CASE(3,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; break; + CASE(4,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break; + CASE(4,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break; + CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break; + default: STBI_ASSERT(0); + } + #undef CASE + } + + STBI_FREE(data); + return good; +} + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) +{ + int i,k,n; + float *output = (float *) stbi__malloc(x * y * comp * sizeof(float)); + if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale); + } + if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f; + } + STBI_FREE(data); + return output; +} +#endif + +#ifndef STBI_NO_HDR +#define stbi__float2int(x) ((int) (x)) +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) +{ + int i,k,n; + stbi_uc *output = (stbi_uc *) stbi__malloc(x * y * comp); + if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + if (k < comp) { + float z = data[i*comp+k] * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + } + STBI_FREE(data); + return output; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// "baseline" JPEG/JFIF decoder +// +// simple implementation +// - doesn't support delayed output of y-dimension +// - simple interface (only one output format: 8-bit interleaved RGB) +// - doesn't try to recover corrupt jpegs +// - doesn't allow partial loading, loading multiple at once +// - still fast on x86 (copying globals into locals doesn't help x86) +// - allocates lots of intermediate memory (full size of all components) +// - non-interleaved case requires this anyway +// - allows good upsampling (see next) +// high-quality +// - upsampled channels are bilinearly interpolated, even across blocks +// - quality integer IDCT derived from IJG's 'slow' +// performance +// - fast huffman; reasonable integer IDCT +// - some SIMD kernels for common paths on targets with SSE2/NEON +// - uses a lot of intermediate memory, could cache poorly + +#ifndef STBI_NO_JPEG + +// huffman decoding acceleration +#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache + +typedef struct +{ + stbi_uc fast[1 << FAST_BITS]; + // weirdly, repacking this into AoS is a 10% speed loss, instead of a win + stbi__uint16 code[256]; + stbi_uc values[256]; + stbi_uc size[257]; + unsigned int maxcode[18]; + int delta[17]; // old 'firstsymbol' - old 'firstcode' +} stbi__huffman; + +typedef struct +{ + stbi__context *s; + stbi__huffman huff_dc[4]; + stbi__huffman huff_ac[4]; + stbi_uc dequant[4][64]; + stbi__int16 fast_ac[4][1 << FAST_BITS]; + +// sizes for components, interleaved MCUs + int img_h_max, img_v_max; + int img_mcu_x, img_mcu_y; + int img_mcu_w, img_mcu_h; + +// definition of jpeg image component + struct + { + int id; + int h,v; + int tq; + int hd,ha; + int dc_pred; + + int x,y,w2,h2; + stbi_uc *data; + void *raw_data, *raw_coeff; + stbi_uc *linebuf; + short *coeff; // progressive only + int coeff_w, coeff_h; // number of 8x8 coefficient blocks + } img_comp[4]; + + stbi__uint32 code_buffer; // jpeg entropy-coded buffer + int code_bits; // number of valid bits + unsigned char marker; // marker seen while filling entropy buffer + int nomore; // flag if we saw a marker so must stop + + int progressive; + int spec_start; + int spec_end; + int succ_high; + int succ_low; + int eob_run; + + int scan_n, order[4]; + int restart_interval, todo; + +// kernels + void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]); + void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step); + stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs); +} stbi__jpeg; + +static int stbi__build_huffman(stbi__huffman *h, int *count) +{ + int i,j,k=0,code; + // build size list for each symbol (from JPEG spec) + for (i=0; i < 16; ++i) + for (j=0; j < count[i]; ++j) + h->size[k++] = (stbi_uc) (i+1); + h->size[k] = 0; + + // compute actual symbols (from jpeg spec) + code = 0; + k = 0; + for(j=1; j <= 16; ++j) { + // compute delta to add to code to compute symbol id + h->delta[j] = k - code; + if (h->size[k] == j) { + while (h->size[k] == j) + h->code[k++] = (stbi__uint16) (code++); + if (code-1 >= (1 << j)) return stbi__err("bad code lengths","Corrupt JPEG"); + } + // compute largest code + 1 for this size, preshifted as needed later + h->maxcode[j] = code << (16-j); + code <<= 1; + } + h->maxcode[j] = 0xffffffff; + + // build non-spec acceleration table; 255 is flag for not-accelerated + memset(h->fast, 255, 1 << FAST_BITS); + for (i=0; i < k; ++i) { + int s = h->size[i]; + if (s <= FAST_BITS) { + int c = h->code[i] << (FAST_BITS-s); + int m = 1 << (FAST_BITS-s); + for (j=0; j < m; ++j) { + h->fast[c+j] = (stbi_uc) i; + } + } + } + return 1; +} + +// build a table that decodes both magnitude and value of small ACs in +// one go. +static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) +{ + int i; + for (i=0; i < (1 << FAST_BITS); ++i) { + stbi_uc fast = h->fast[i]; + fast_ac[i] = 0; + if (fast < 255) { + int rs = h->values[fast]; + int run = (rs >> 4) & 15; + int magbits = rs & 15; + int len = h->size[fast]; + + if (magbits && len + magbits <= FAST_BITS) { + // magnitude code followed by receive_extend code + int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); + int m = 1 << (magbits - 1); + if (k < m) k += (-1 << magbits) + 1; + // if the result is small enough, we can fit it in fast_ac table + if (k >= -128 && k <= 127) + fast_ac[i] = (stbi__int16) ((k << 8) + (run << 4) + (len + magbits)); + } + } + } +} + +static void stbi__grow_buffer_unsafe(stbi__jpeg *j) +{ + do { + int b = j->nomore ? 0 : stbi__get8(j->s); + if (b == 0xff) { + int c = stbi__get8(j->s); + if (c != 0) { + j->marker = (unsigned char) c; + j->nomore = 1; + return; + } + } + j->code_buffer |= b << (24 - j->code_bits); + j->code_bits += 8; + } while (j->code_bits <= 24); +} + +// (1 << n) - 1 +static stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; + +// decode a jpeg huffman value from the bitstream +stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) +{ + unsigned int temp; + int c,k; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + // look at the top FAST_BITS and determine what symbol ID it is, + // if the code is <= FAST_BITS + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + k = h->fast[c]; + if (k < 255) { + int s = h->size[k]; + if (s > j->code_bits) + return -1; + j->code_buffer <<= s; + j->code_bits -= s; + return h->values[k]; + } + + // naive test is to shift the code_buffer down so k bits are + // valid, then test against maxcode. To speed this up, we've + // preshifted maxcode left so that it has (16-k) 0s at the + // end; in other words, regardless of the number of bits, it + // wants to be compared against something shifted to have 16; + // that way we don't need to shift inside the loop. + temp = j->code_buffer >> 16; + for (k=FAST_BITS+1 ; ; ++k) + if (temp < h->maxcode[k]) + break; + if (k == 17) { + // error! code not found + j->code_bits -= 16; + return -1; + } + + if (k > j->code_bits) + return -1; + + // convert the huffman code to the symbol id + c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; + STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); + + // convert the id to a symbol + j->code_bits -= k; + j->code_buffer <<= k; + return h->values[c]; +} + +// bias[n] = (-1<code_bits < n) stbi__grow_buffer_unsafe(j); + + sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k + (stbi__jbias[n] & ~sgn); +} + +// get some unsigned bits +stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n) +{ + unsigned int k; + if (j->code_bits < n) stbi__grow_buffer_unsafe(j); + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k; +} + +stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j) +{ + unsigned int k; + if (j->code_bits < 1) stbi__grow_buffer_unsafe(j); + k = j->code_buffer; + j->code_buffer <<= 1; + --j->code_bits; + return k & 0x80000000; +} + +// given a value that's at position X in the zigzag stream, +// where does it appear in the 8x8 matrix coded as row-major? +static stbi_uc stbi__jpeg_dezigzag[64+15] = +{ + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + // let corrupt input sample past end + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63 +}; + +// decode one 64-entry block-- +static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi_uc *dequant) +{ + int diff,dc,k; + int t; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + + // 0 all the ac values now so we can do it 32-bits at a time + memset(data,0,64*sizeof(data[0])); + + diff = t ? stbi__extend_receive(j, t) : 0; + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short) (dc * dequant[0]); + + // decode AC components, see JPEG spec + k = 1; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + j->code_buffer <<= s; + j->code_bits -= s; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * dequant[zig]); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (rs != 0xf0) break; // end block + k += 16; + } else { + k += r; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]); + } + } + } while (k < 64); + return 1; +} + +static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b) +{ + int diff,dc; + int t; + if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + if (j->succ_high == 0) { + // first scan for DC coefficient, must be first + memset(data,0,64*sizeof(data[0])); // 0 all the ac values now + t = stbi__jpeg_huff_decode(j, hdc); + diff = t ? stbi__extend_receive(j, t) : 0; + + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short) (dc << j->succ_low); + } else { + // refinement scan for DC coefficient + if (stbi__jpeg_get_bit(j)) + data[0] += (short) (1 << j->succ_low); + } + return 1; +} + +// @OPTIMIZE: store non-zigzagged during the decode passes, +// and only de-zigzag when dequantizing +static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac) +{ + int k; + if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->succ_high == 0) { + int shift = j->succ_low; + + if (j->eob_run) { + --j->eob_run; + return 1; + } + + k = j->spec_start; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + j->code_buffer <<= s; + j->code_bits -= s; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) << shift); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r); + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + --j->eob_run; + break; + } + k += 16; + } else { + k += r; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) << shift); + } + } + } while (k <= j->spec_end); + } else { + // refinement scan for these AC coefficients + + short bit = (short) (1 << j->succ_low); + + if (j->eob_run) { + --j->eob_run; + for (k = j->spec_start; k <= j->spec_end; ++k) { + short *p = &data[stbi__jpeg_dezigzag[k]]; + if (*p != 0) + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } + } else { + k = j->spec_start; + do { + int r,s; + int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r) - 1; + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + r = 64; // force end of block + } else + r = 16; // r=15 is the code for 16 0s + } else { + if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); + // sign bit + if (stbi__jpeg_get_bit(j)) + s = bit; + else + s = -bit; + } + + // advance by r + while (k <= j->spec_end) { + short *p = &data[stbi__jpeg_dezigzag[k]]; + if (*p != 0) { + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + ++k; + } else { + if (r == 0) { + if (s) + data[stbi__jpeg_dezigzag[k++]] = (short) s; + break; + } + --r; + ++k; + } + } + } while (k <= j->spec_end); + } + } + return 1; +} + +// take a -128..127 value and stbi__clamp it and convert to 0..255 +stbi_inline static stbi_uc stbi__clamp(int x) +{ + // trick to use a single test to catch both cases + if ((unsigned int) x > 255) { + if (x < 0) return 0; + if (x > 255) return 255; + } + return (stbi_uc) x; +} + +#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) +#define stbi__fsh(x) ((x) << 12) + +// derived from jidctint -- DCT_ISLOW +#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ + int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ + p2 = s2; \ + p3 = s6; \ + p1 = (p2+p3) * stbi__f2f(0.5411961f); \ + t2 = p1 + p3*stbi__f2f(-1.847759065f); \ + t3 = p1 + p2*stbi__f2f( 0.765366865f); \ + p2 = s0; \ + p3 = s4; \ + t0 = stbi__fsh(p2+p3); \ + t1 = stbi__fsh(p2-p3); \ + x0 = t0+t3; \ + x3 = t0-t3; \ + x1 = t1+t2; \ + x2 = t1-t2; \ + t0 = s7; \ + t1 = s5; \ + t2 = s3; \ + t3 = s1; \ + p3 = t0+t2; \ + p4 = t1+t3; \ + p1 = t0+t3; \ + p2 = t1+t2; \ + p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ + t0 = t0*stbi__f2f( 0.298631336f); \ + t1 = t1*stbi__f2f( 2.053119869f); \ + t2 = t2*stbi__f2f( 3.072711026f); \ + t3 = t3*stbi__f2f( 1.501321110f); \ + p1 = p5 + p1*stbi__f2f(-0.899976223f); \ + p2 = p5 + p2*stbi__f2f(-2.562915447f); \ + p3 = p3*stbi__f2f(-1.961570560f); \ + p4 = p4*stbi__f2f(-0.390180644f); \ + t3 += p1+p4; \ + t2 += p2+p3; \ + t1 += p2+p4; \ + t0 += p1+p3; + +static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64]) +{ + int i,val[64],*v=val; + stbi_uc *o; + short *d = data; + + // columns + for (i=0; i < 8; ++i,++d, ++v) { + // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing + if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 + && d[40]==0 && d[48]==0 && d[56]==0) { + // no shortcut 0 seconds + // (1|2|3|4|5|6|7)==0 0 seconds + // all separate -0.047 seconds + // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds + int dcterm = d[0] << 2; + v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; + } else { + STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56]) + // constants scaled things up by 1<<12; let's bring them back + // down, but keep 2 extra bits of precision + x0 += 512; x1 += 512; x2 += 512; x3 += 512; + v[ 0] = (x0+t3) >> 10; + v[56] = (x0-t3) >> 10; + v[ 8] = (x1+t2) >> 10; + v[48] = (x1-t2) >> 10; + v[16] = (x2+t1) >> 10; + v[40] = (x2-t1) >> 10; + v[24] = (x3+t0) >> 10; + v[32] = (x3-t0) >> 10; + } + } + + for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { + // no fast case since the first 1D IDCT spread components out + STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) + // constants scaled things up by 1<<12, plus we had 1<<2 from first + // loop, plus horizontal and vertical each scale by sqrt(8) so together + // we've got an extra 1<<3, so 1<<17 total we need to remove. + // so we want to round that, which means adding 0.5 * 1<<17, + // aka 65536. Also, we'll end up with -128 to 127 that we want + // to encode as 0..255 by adding 128, so we'll add that before the shift + x0 += 65536 + (128<<17); + x1 += 65536 + (128<<17); + x2 += 65536 + (128<<17); + x3 += 65536 + (128<<17); + // tried computing the shifts into temps, or'ing the temps to see + // if any were out of range, but that was slower + o[0] = stbi__clamp((x0+t3) >> 17); + o[7] = stbi__clamp((x0-t3) >> 17); + o[1] = stbi__clamp((x1+t2) >> 17); + o[6] = stbi__clamp((x1-t2) >> 17); + o[2] = stbi__clamp((x2+t1) >> 17); + o[5] = stbi__clamp((x2-t1) >> 17); + o[3] = stbi__clamp((x3+t0) >> 17); + o[4] = stbi__clamp((x3-t0) >> 17); + } +} + +#ifdef STBI_SSE2 +// sse2 integer IDCT. not the fastest possible implementation but it +// produces bit-identical results to the generic C version so it's +// fully "transparent". +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + // This is constructed to match our regular (generic) integer IDCT exactly. + __m128i row0, row1, row2, row3, row4, row5, row6, row7; + __m128i tmp; + + // dot product constant: even elems=x, odd elems=y + #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) + + // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) + // out(1) = c1[even]*x + c1[odd]*y + #define dct_rot(out0,out1, x,y,c0,c1) \ + __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ + __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ + __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ + __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ + __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ + __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) + + // out = in << 12 (in 16-bit, out 32-bit) + #define dct_widen(out, in) \ + __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ + __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) + + // wide add + #define dct_wadd(out, a, b) \ + __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_add_epi32(a##_h, b##_h) + + // wide sub + #define dct_wsub(out, a, b) \ + __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) + + // butterfly a/b, add bias, then shift by "s" and pack + #define dct_bfly32o(out0, out1, a,b,bias,s) \ + { \ + __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ + __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ + dct_wadd(sum, abiased, b); \ + dct_wsub(dif, abiased, b); \ + out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ + out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ + } + + // 8-bit interleave step (for transposes) + #define dct_interleave8(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi8(a, b); \ + b = _mm_unpackhi_epi8(tmp, b) + + // 16-bit interleave step (for transposes) + #define dct_interleave16(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi16(a, b); \ + b = _mm_unpackhi_epi16(tmp, b) + + #define dct_pass(bias,shift) \ + { \ + /* even part */ \ + dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ + __m128i sum04 = _mm_add_epi16(row0, row4); \ + __m128i dif04 = _mm_sub_epi16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ + dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ + __m128i sum17 = _mm_add_epi16(row1, row7); \ + __m128i sum35 = _mm_add_epi16(row3, row5); \ + dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ + dct_wadd(x4, y0o, y4o); \ + dct_wadd(x5, y1o, y5o); \ + dct_wadd(x6, y2o, y5o); \ + dct_wadd(x7, y3o, y4o); \ + dct_bfly32o(row0,row7, x0,x7,bias,shift); \ + dct_bfly32o(row1,row6, x1,x6,bias,shift); \ + dct_bfly32o(row2,row5, x2,x5,bias,shift); \ + dct_bfly32o(row3,row4, x3,x4,bias,shift); \ + } + + __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); + __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f)); + __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); + __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); + __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f)); + __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f)); + __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f)); + __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f)); + + // rounding biases in column/row passes, see stbi__idct_block for explanation. + __m128i bias_0 = _mm_set1_epi32(512); + __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17)); + + // load + row0 = _mm_load_si128((const __m128i *) (data + 0*8)); + row1 = _mm_load_si128((const __m128i *) (data + 1*8)); + row2 = _mm_load_si128((const __m128i *) (data + 2*8)); + row3 = _mm_load_si128((const __m128i *) (data + 3*8)); + row4 = _mm_load_si128((const __m128i *) (data + 4*8)); + row5 = _mm_load_si128((const __m128i *) (data + 5*8)); + row6 = _mm_load_si128((const __m128i *) (data + 6*8)); + row7 = _mm_load_si128((const __m128i *) (data + 7*8)); + + // column pass + dct_pass(bias_0, 10); + + { + // 16bit 8x8 transpose pass 1 + dct_interleave16(row0, row4); + dct_interleave16(row1, row5); + dct_interleave16(row2, row6); + dct_interleave16(row3, row7); + + // transpose pass 2 + dct_interleave16(row0, row2); + dct_interleave16(row1, row3); + dct_interleave16(row4, row6); + dct_interleave16(row5, row7); + + // transpose pass 3 + dct_interleave16(row0, row1); + dct_interleave16(row2, row3); + dct_interleave16(row4, row5); + dct_interleave16(row6, row7); + } + + // row pass + dct_pass(bias_1, 17); + + { + // pack + __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 + __m128i p1 = _mm_packus_epi16(row2, row3); + __m128i p2 = _mm_packus_epi16(row4, row5); + __m128i p3 = _mm_packus_epi16(row6, row7); + + // 8bit 8x8 transpose pass 1 + dct_interleave8(p0, p2); // a0e0a1e1... + dct_interleave8(p1, p3); // c0g0c1g1... + + // transpose pass 2 + dct_interleave8(p0, p1); // a0c0e0g0... + dct_interleave8(p2, p3); // b0d0f0h0... + + // transpose pass 3 + dct_interleave8(p0, p2); // a0b0c0d0... + dct_interleave8(p1, p3); // a4b4c4d4... + + // store + _mm_storel_epi64((__m128i *) out, p0); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p2); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p1); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p3); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); + } + +#undef dct_const +#undef dct_rot +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_interleave8 +#undef dct_interleave16 +#undef dct_pass +} + +#endif // STBI_SSE2 + +#ifdef STBI_NEON + +// NEON integer IDCT. should produce bit-identical +// results to the generic C version. +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; + + int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); + int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); + int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f)); + int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f)); + int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); + int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); + int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); + int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); + int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f)); + int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f)); + int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f)); + int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f)); + +#define dct_long_mul(out, inq, coeff) \ + int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) + +#define dct_long_mac(out, acc, inq, coeff) \ + int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) + +#define dct_widen(out, inq) \ + int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ + int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) + +// wide add +#define dct_wadd(out, a, b) \ + int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vaddq_s32(a##_h, b##_h) + +// wide sub +#define dct_wsub(out, a, b) \ + int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vsubq_s32(a##_h, b##_h) + +// butterfly a/b, then shift using "shiftop" by "s" and pack +#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ + { \ + dct_wadd(sum, a, b); \ + dct_wsub(dif, a, b); \ + out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ + out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ + } + +#define dct_pass(shiftop, shift) \ + { \ + /* even part */ \ + int16x8_t sum26 = vaddq_s16(row2, row6); \ + dct_long_mul(p1e, sum26, rot0_0); \ + dct_long_mac(t2e, p1e, row6, rot0_1); \ + dct_long_mac(t3e, p1e, row2, rot0_2); \ + int16x8_t sum04 = vaddq_s16(row0, row4); \ + int16x8_t dif04 = vsubq_s16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + int16x8_t sum15 = vaddq_s16(row1, row5); \ + int16x8_t sum17 = vaddq_s16(row1, row7); \ + int16x8_t sum35 = vaddq_s16(row3, row5); \ + int16x8_t sum37 = vaddq_s16(row3, row7); \ + int16x8_t sumodd = vaddq_s16(sum17, sum35); \ + dct_long_mul(p5o, sumodd, rot1_0); \ + dct_long_mac(p1o, p5o, sum17, rot1_1); \ + dct_long_mac(p2o, p5o, sum35, rot1_2); \ + dct_long_mul(p3o, sum37, rot2_0); \ + dct_long_mul(p4o, sum15, rot2_1); \ + dct_wadd(sump13o, p1o, p3o); \ + dct_wadd(sump24o, p2o, p4o); \ + dct_wadd(sump23o, p2o, p3o); \ + dct_wadd(sump14o, p1o, p4o); \ + dct_long_mac(x4, sump13o, row7, rot3_0); \ + dct_long_mac(x5, sump24o, row5, rot3_1); \ + dct_long_mac(x6, sump23o, row3, rot3_2); \ + dct_long_mac(x7, sump14o, row1, rot3_3); \ + dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ + dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ + dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ + dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ + } + + // load + row0 = vld1q_s16(data + 0*8); + row1 = vld1q_s16(data + 1*8); + row2 = vld1q_s16(data + 2*8); + row3 = vld1q_s16(data + 3*8); + row4 = vld1q_s16(data + 4*8); + row5 = vld1q_s16(data + 5*8); + row6 = vld1q_s16(data + 6*8); + row7 = vld1q_s16(data + 7*8); + + // add DC bias + row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); + + // column pass + dct_pass(vrshrn_n_s32, 10); + + // 16bit 8x8 transpose + { +// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. +// whether compilers actually get this is another story, sadly. +#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } +#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } + + // pass 1 + dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 + dct_trn16(row2, row3); + dct_trn16(row4, row5); + dct_trn16(row6, row7); + + // pass 2 + dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 + dct_trn32(row1, row3); + dct_trn32(row4, row6); + dct_trn32(row5, row7); + + // pass 3 + dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 + dct_trn64(row1, row5); + dct_trn64(row2, row6); + dct_trn64(row3, row7); + +#undef dct_trn16 +#undef dct_trn32 +#undef dct_trn64 + } + + // row pass + // vrshrn_n_s32 only supports shifts up to 16, we need + // 17. so do a non-rounding shift of 16 first then follow + // up with a rounding shift by 1. + dct_pass(vshrn_n_s32, 16); + + { + // pack and round + uint8x8_t p0 = vqrshrun_n_s16(row0, 1); + uint8x8_t p1 = vqrshrun_n_s16(row1, 1); + uint8x8_t p2 = vqrshrun_n_s16(row2, 1); + uint8x8_t p3 = vqrshrun_n_s16(row3, 1); + uint8x8_t p4 = vqrshrun_n_s16(row4, 1); + uint8x8_t p5 = vqrshrun_n_s16(row5, 1); + uint8x8_t p6 = vqrshrun_n_s16(row6, 1); + uint8x8_t p7 = vqrshrun_n_s16(row7, 1); + + // again, these can translate into one instruction, but often don't. +#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } +#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } + + // sadly can't use interleaved stores here since we only write + // 8 bytes to each scan line! + + // 8x8 8-bit transpose pass 1 + dct_trn8_8(p0, p1); + dct_trn8_8(p2, p3); + dct_trn8_8(p4, p5); + dct_trn8_8(p6, p7); + + // pass 2 + dct_trn8_16(p0, p2); + dct_trn8_16(p1, p3); + dct_trn8_16(p4, p6); + dct_trn8_16(p5, p7); + + // pass 3 + dct_trn8_32(p0, p4); + dct_trn8_32(p1, p5); + dct_trn8_32(p2, p6); + dct_trn8_32(p3, p7); + + // store + vst1_u8(out, p0); out += out_stride; + vst1_u8(out, p1); out += out_stride; + vst1_u8(out, p2); out += out_stride; + vst1_u8(out, p3); out += out_stride; + vst1_u8(out, p4); out += out_stride; + vst1_u8(out, p5); out += out_stride; + vst1_u8(out, p6); out += out_stride; + vst1_u8(out, p7); + +#undef dct_trn8_8 +#undef dct_trn8_16 +#undef dct_trn8_32 + } + +#undef dct_long_mul +#undef dct_long_mac +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_pass +} + +#endif // STBI_NEON + +#define STBI__MARKER_none 0xff +// if there's a pending marker from the entropy stream, return that +// otherwise, fetch from the stream and get a marker. if there's no +// marker, return 0xff, which is never a valid marker value +static stbi_uc stbi__get_marker(stbi__jpeg *j) +{ + stbi_uc x; + if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; } + x = stbi__get8(j->s); + if (x != 0xff) return STBI__MARKER_none; + while (x == 0xff) + x = stbi__get8(j->s); + return x; +} + +// in each scan, we'll have scan_n components, and the order +// of the components is specified by order[] +#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) + +// after a restart interval, stbi__jpeg_reset the entropy decoder and +// the dc prediction +static void stbi__jpeg_reset(stbi__jpeg *j) +{ + j->code_bits = 0; + j->code_buffer = 0; + j->nomore = 0; + j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0; + j->marker = STBI__MARKER_none; + j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; + j->eob_run = 0; + // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, + // since we don't even allow 1<<30 pixels +} + +static int stbi__parse_entropy_coded_data(stbi__jpeg *z) +{ + stbi__jpeg_reset(z); + if (!z->progressive) { + if (z->scan_n == 1) { + int i,j; + STBI_SIMD_ALIGN(short, data[64]); + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + STBI_SIMD_ALIGN(short, data[64]); + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x)*8; + int y2 = (j*z->img_comp[n].v + y)*8; + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data); + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } else { + if (z->scan_n == 1) { + int i,j; + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + if (z->spec_start == 0) { + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } else { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) + return 0; + } + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x); + int y2 = (j*z->img_comp[n].v + y); + short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } +} + +static void stbi__jpeg_dequantize(short *data, stbi_uc *dequant) +{ + int i; + for (i=0; i < 64; ++i) + data[i] *= dequant[i]; +} + +static void stbi__jpeg_finish(stbi__jpeg *z) +{ + if (z->progressive) { + // dequantize and idct the data + int i,j,n; + for (n=0; n < z->s->img_n; ++n) { + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + } + } + } + } +} + +static int stbi__process_marker(stbi__jpeg *z, int m) +{ + int L; + switch (m) { + case STBI__MARKER_none: // no marker found + return stbi__err("expected marker","Corrupt JPEG"); + + case 0xDD: // DRI - specify restart interval + if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG"); + z->restart_interval = stbi__get16be(z->s); + return 1; + + case 0xDB: // DQT - define quantization table + L = stbi__get16be(z->s)-2; + while (L > 0) { + int q = stbi__get8(z->s); + int p = q >> 4; + int t = q & 15,i; + if (p != 0) return stbi__err("bad DQT type","Corrupt JPEG"); + if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); + for (i=0; i < 64; ++i) + z->dequant[t][stbi__jpeg_dezigzag[i]] = stbi__get8(z->s); + L -= 65; + } + return L==0; + + case 0xC4: // DHT - define huffman table + L = stbi__get16be(z->s)-2; + while (L > 0) { + stbi_uc *v; + int sizes[16],i,n=0; + int q = stbi__get8(z->s); + int tc = q >> 4; + int th = q & 15; + if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG"); + for (i=0; i < 16; ++i) { + sizes[i] = stbi__get8(z->s); + n += sizes[i]; + } + L -= 17; + if (tc == 0) { + if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0; + v = z->huff_dc[th].values; + } else { + if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0; + v = z->huff_ac[th].values; + } + for (i=0; i < n; ++i) + v[i] = stbi__get8(z->s); + if (tc != 0) + stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); + L -= n; + } + return L==0; + } + // check for comment block or APP blocks + if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { + stbi__skip(z->s, stbi__get16be(z->s)-2); + return 1; + } + return 0; +} + +// after we see SOS +static int stbi__process_scan_header(stbi__jpeg *z) +{ + int i; + int Ls = stbi__get16be(z->s); + z->scan_n = stbi__get8(z->s); + if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG"); + if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG"); + for (i=0; i < z->scan_n; ++i) { + int id = stbi__get8(z->s), which; + int q = stbi__get8(z->s); + for (which = 0; which < z->s->img_n; ++which) + if (z->img_comp[which].id == id) + break; + if (which == z->s->img_n) return 0; // no match + z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG"); + z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG"); + z->order[i] = which; + } + + { + int aa; + z->spec_start = stbi__get8(z->s); + z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 + aa = stbi__get8(z->s); + z->succ_high = (aa >> 4); + z->succ_low = (aa & 15); + if (z->progressive) { + if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) + return stbi__err("bad SOS", "Corrupt JPEG"); + } else { + if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG"); + if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG"); + z->spec_end = 63; + } + } + + return 1; +} + +static int stbi__process_frame_header(stbi__jpeg *z, int scan) +{ + stbi__context *s = z->s; + int Lf,p,i,q, h_max=1,v_max=1,c; + Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG + p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline + s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG + s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires + c = stbi__get8(s); + if (c != 3 && c != 1) return stbi__err("bad component count","Corrupt JPEG"); // JFIF requires + s->img_n = c; + for (i=0; i < c; ++i) { + z->img_comp[i].data = NULL; + z->img_comp[i].linebuf = NULL; + } + + if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); + + for (i=0; i < s->img_n; ++i) { + z->img_comp[i].id = stbi__get8(s); + if (z->img_comp[i].id != i+1) // JFIF requires + if (z->img_comp[i].id != i) // some version of jpegtran outputs non-JFIF-compliant files! + return stbi__err("bad component ID","Corrupt JPEG"); + q = stbi__get8(s); + z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG"); + z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG"); + z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG"); + } + + if (scan != STBI__SCAN_load) return 1; + + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); + + for (i=0; i < s->img_n; ++i) { + if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; + if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; + } + + // compute interleaved mcu info + z->img_h_max = h_max; + z->img_v_max = v_max; + z->img_mcu_w = h_max * 8; + z->img_mcu_h = v_max * 8; + z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; + z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; + + for (i=0; i < s->img_n; ++i) { + // number of effective pixels (e.g. for non-interleaved MCU) + z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; + z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; + // to simplify generation, we'll allocate enough memory to decode + // the bogus oversized data from using interleaved MCUs and their + // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't + // discard the extra data until colorspace conversion + z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; + z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; + z->img_comp[i].raw_data = stbi__malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15); + + if (z->img_comp[i].raw_data == NULL) { + for(--i; i >= 0; --i) { + STBI_FREE(z->img_comp[i].raw_data); + z->img_comp[i].data = NULL; + } + return stbi__err("outofmem", "Out of memory"); + } + // align blocks for idct using mmx/sse + z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); + z->img_comp[i].linebuf = NULL; + if (z->progressive) { + z->img_comp[i].coeff_w = (z->img_comp[i].w2 + 7) >> 3; + z->img_comp[i].coeff_h = (z->img_comp[i].h2 + 7) >> 3; + z->img_comp[i].raw_coeff = STBI_MALLOC(z->img_comp[i].coeff_w * z->img_comp[i].coeff_h * 64 * sizeof(short) + 15); + z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); + } else { + z->img_comp[i].coeff = 0; + z->img_comp[i].raw_coeff = 0; + } + } + + return 1; +} + +// use comparisons since in some cases we handle more than one case (e.g. SOF) +#define stbi__DNL(x) ((x) == 0xdc) +#define stbi__SOI(x) ((x) == 0xd8) +#define stbi__EOI(x) ((x) == 0xd9) +#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) +#define stbi__SOS(x) ((x) == 0xda) + +#define stbi__SOF_progressive(x) ((x) == 0xc2) + +static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) +{ + int m; + z->marker = STBI__MARKER_none; // initialize cached marker to empty + m = stbi__get_marker(z); + if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); + if (scan == STBI__SCAN_type) return 1; + m = stbi__get_marker(z); + while (!stbi__SOF(m)) { + if (!stbi__process_marker(z,m)) return 0; + m = stbi__get_marker(z); + while (m == STBI__MARKER_none) { + // some files have extra padding after their blocks, so ok, we'll scan + if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG"); + m = stbi__get_marker(z); + } + } + z->progressive = stbi__SOF_progressive(m); + if (!stbi__process_frame_header(z, scan)) return 0; + return 1; +} + +// decode image to YCbCr format +static int stbi__decode_jpeg_image(stbi__jpeg *j) +{ + int m; + j->restart_interval = 0; + if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; + m = stbi__get_marker(j); + while (!stbi__EOI(m)) { + if (stbi__SOS(m)) { + if (!stbi__process_scan_header(j)) return 0; + if (!stbi__parse_entropy_coded_data(j)) return 0; + if (j->marker == STBI__MARKER_none ) { + // handle 0s at the end of image data from IP Kamera 9060 + while (!stbi__at_eof(j->s)) { + int x = stbi__get8(j->s); + if (x == 255) { + j->marker = stbi__get8(j->s); + break; + } else if (x != 0) { + return stbi__err("junk before marker", "Corrupt JPEG"); + } + } + // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 + } + } else { + if (!stbi__process_marker(j, m)) return 0; + } + m = stbi__get_marker(j); + } + if (j->progressive) + stbi__jpeg_finish(j); + return 1; +} + +// static jfif-centered resampling (across block boundaries) + +typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1, + int w, int hs); + +#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) + +static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + STBI_NOTUSED(out); + STBI_NOTUSED(in_far); + STBI_NOTUSED(w); + STBI_NOTUSED(hs); + return in_near; +} + +static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples vertically for every one in input + int i; + STBI_NOTUSED(hs); + for (i=0; i < w; ++i) + out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2); + return out; +} + +static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples horizontally for every one in input + int i; + stbi_uc *input = in_near; + + if (w == 1) { + // if only one sample, can't do any interpolation + out[0] = out[1] = input[0]; + return out; + } + + out[0] = input[0]; + out[1] = stbi__div4(input[0]*3 + input[1] + 2); + for (i=1; i < w-1; ++i) { + int n = 3*input[i]+2; + out[i*2+0] = stbi__div4(n+input[i-1]); + out[i*2+1] = stbi__div4(n+input[i+1]); + } + out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2); + out[i*2+1] = input[w-1]; + + STBI_NOTUSED(in_far); + STBI_NOTUSED(hs); + + return out; +} + +#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) + +static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i,t0,t1; + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + out[0] = stbi__div4(t1+2); + for (i=1; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i=0,t0,t1; + + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + // process groups of 8 pixels for as long as we can. + // note we can't handle the last pixel in a row in this loop + // because we need to handle the filter boundary conditions. + for (; i < ((w-1) & ~7); i += 8) { +#if defined(STBI_SSE2) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + __m128i zero = _mm_setzero_si128(); + __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i)); + __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i)); + __m128i farw = _mm_unpacklo_epi8(farb, zero); + __m128i nearw = _mm_unpacklo_epi8(nearb, zero); + __m128i diff = _mm_sub_epi16(farw, nearw); + __m128i nears = _mm_slli_epi16(nearw, 2); + __m128i curr = _mm_add_epi16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + __m128i prv0 = _mm_slli_si128(curr, 2); + __m128i nxt0 = _mm_srli_si128(curr, 2); + __m128i prev = _mm_insert_epi16(prv0, t1, 0); + __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + __m128i bias = _mm_set1_epi16(8); + __m128i curs = _mm_slli_epi16(curr, 2); + __m128i prvd = _mm_sub_epi16(prev, curr); + __m128i nxtd = _mm_sub_epi16(next, curr); + __m128i curb = _mm_add_epi16(curs, bias); + __m128i even = _mm_add_epi16(prvd, curb); + __m128i odd = _mm_add_epi16(nxtd, curb); + + // interleave even and odd pixels, then undo scaling. + __m128i int0 = _mm_unpacklo_epi16(even, odd); + __m128i int1 = _mm_unpackhi_epi16(even, odd); + __m128i de0 = _mm_srli_epi16(int0, 4); + __m128i de1 = _mm_srli_epi16(int1, 4); + + // pack and write output + __m128i outv = _mm_packus_epi16(de0, de1); + _mm_storeu_si128((__m128i *) (out + i*2), outv); +#elif defined(STBI_NEON) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + uint8x8_t farb = vld1_u8(in_far + i); + uint8x8_t nearb = vld1_u8(in_near + i); + int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); + int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); + int16x8_t curr = vaddq_s16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + int16x8_t prv0 = vextq_s16(curr, curr, 7); + int16x8_t nxt0 = vextq_s16(curr, curr, 1); + int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); + int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + int16x8_t curs = vshlq_n_s16(curr, 2); + int16x8_t prvd = vsubq_s16(prev, curr); + int16x8_t nxtd = vsubq_s16(next, curr); + int16x8_t even = vaddq_s16(curs, prvd); + int16x8_t odd = vaddq_s16(curs, nxtd); + + // undo scaling and round, then store with even/odd phases interleaved + uint8x8x2_t o; + o.val[0] = vqrshrun_n_s16(even, 4); + o.val[1] = vqrshrun_n_s16(odd, 4); + vst2_u8(out + i*2, o); +#endif + + // "previous" value for next iter + t1 = 3*in_near[i+7] + in_far[i+7]; + } + + t0 = t1; + t1 = 3*in_near[i] + in_far[i]; + out[i*2] = stbi__div16(3*t1 + t0 + 8); + + for (++i; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} +#endif + +static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // resample with nearest-neighbor + int i,j; + STBI_NOTUSED(in_far); + for (i=0; i < w; ++i) + for (j=0; j < hs; ++j) + out[i*hs+j] = in_near[i]; + return out; +} + +#ifdef STBI_JPEG_OLD +// this is the same YCbCr-to-RGB calculation that stb_image has used +// historically before the algorithm changes in 1.49 +#define float2fixed(x) ((int) ((x) * 65536 + 0.5)) +static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) +{ + int i; + for (i=0; i < count; ++i) { + int y_fixed = (y[i] << 16) + 32768; // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr*float2fixed(1.40200f); + g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f); + b = y_fixed + cb*float2fixed(1.77200f); + r >>= 16; + g >>= 16; + b >>= 16; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} +#else +// this is a reduced-precision calculation of YCbCr-to-RGB introduced +// to make sure the code produces the same results in both SIMD and scalar +#define float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) +static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) +{ + int i; + for (i=0; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* float2fixed(1.40200f); + g = y_fixed + (cr*-float2fixed(0.71414f)) + ((cb*-float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} +#endif + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) +{ + int i = 0; + +#ifdef STBI_SSE2 + // step == 3 is pretty ugly on the final interleave, and i'm not convinced + // it's useful in practice (you wouldn't use it for textures, for example). + // so just accelerate step == 4 case. + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + __m128i signflip = _mm_set1_epi8(-0x80); + __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f)); + __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f)); + __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f)); + __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f)); + __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128); + __m128i xw = _mm_set1_epi16(255); // alpha channel + + for (; i+7 < count; i += 8) { + // load + __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i)); + __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i)); + __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i)); + __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 + __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 + + // unpack to short (and left-shift cr, cb by 8) + __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); + __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); + __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); + + // color transform + __m128i yws = _mm_srli_epi16(yw, 4); + __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); + __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); + __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); + __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); + __m128i rws = _mm_add_epi16(cr0, yws); + __m128i gwt = _mm_add_epi16(cb0, yws); + __m128i bws = _mm_add_epi16(yws, cb1); + __m128i gws = _mm_add_epi16(gwt, cr1); + + // descale + __m128i rw = _mm_srai_epi16(rws, 4); + __m128i bw = _mm_srai_epi16(bws, 4); + __m128i gw = _mm_srai_epi16(gws, 4); + + // back to byte, set up for transpose + __m128i brb = _mm_packus_epi16(rw, bw); + __m128i gxb = _mm_packus_epi16(gw, xw); + + // transpose to interleave channels + __m128i t0 = _mm_unpacklo_epi8(brb, gxb); + __m128i t1 = _mm_unpackhi_epi8(brb, gxb); + __m128i o0 = _mm_unpacklo_epi16(t0, t1); + __m128i o1 = _mm_unpackhi_epi16(t0, t1); + + // store + _mm_storeu_si128((__m128i *) (out + 0), o0); + _mm_storeu_si128((__m128i *) (out + 16), o1); + out += 32; + } + } +#endif + +#ifdef STBI_NEON + // in this version, step=3 support would be easy to add. but is there demand? + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + uint8x8_t signflip = vdup_n_u8(0x80); + int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f)); + int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f)); + int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f)); + int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f)); + + for (; i+7 < count; i += 8) { + // load + uint8x8_t y_bytes = vld1_u8(y + i); + uint8x8_t cr_bytes = vld1_u8(pcr + i); + uint8x8_t cb_bytes = vld1_u8(pcb + i); + int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); + int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); + + // expand to s16 + int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); + int16x8_t crw = vshll_n_s8(cr_biased, 7); + int16x8_t cbw = vshll_n_s8(cb_biased, 7); + + // color transform + int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); + int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); + int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); + int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); + int16x8_t rws = vaddq_s16(yws, cr0); + int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); + int16x8_t bws = vaddq_s16(yws, cb1); + + // undo scaling, round, convert to byte + uint8x8x4_t o; + o.val[0] = vqrshrun_n_s16(rws, 4); + o.val[1] = vqrshrun_n_s16(gws, 4); + o.val[2] = vqrshrun_n_s16(bws, 4); + o.val[3] = vdup_n_u8(255); + + // store, interleaving r/g/b/a + vst4_u8(out, o); + out += 8*4; + } + } +#endif + + for (; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* float2fixed(1.40200f); + g = y_fixed + cr*-float2fixed(0.71414f) + ((cb*-float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} +#endif + +// set up the kernels +static void stbi__setup_jpeg(stbi__jpeg *j) +{ + j->idct_block_kernel = stbi__idct_block; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; + +#ifdef STBI_SSE2 + if (stbi__sse2_available()) { + j->idct_block_kernel = stbi__idct_simd; + #ifndef STBI_JPEG_OLD + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + #endif + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; + } +#endif + +#ifdef STBI_NEON + j->idct_block_kernel = stbi__idct_simd; + #ifndef STBI_JPEG_OLD + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + #endif + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; +#endif +} + +// clean up the temporary component buffers +static void stbi__cleanup_jpeg(stbi__jpeg *j) +{ + int i; + for (i=0; i < j->s->img_n; ++i) { + if (j->img_comp[i].raw_data) { + STBI_FREE(j->img_comp[i].raw_data); + j->img_comp[i].raw_data = NULL; + j->img_comp[i].data = NULL; + } + if (j->img_comp[i].raw_coeff) { + STBI_FREE(j->img_comp[i].raw_coeff); + j->img_comp[i].raw_coeff = 0; + j->img_comp[i].coeff = 0; + } + if (j->img_comp[i].linebuf) { + STBI_FREE(j->img_comp[i].linebuf); + j->img_comp[i].linebuf = NULL; + } + } +} + +typedef struct +{ + resample_row_func resample; + stbi_uc *line0,*line1; + int hs,vs; // expansion factor in each axis + int w_lores; // horizontal pixels pre-expansion + int ystep; // how far through vertical expansion we are + int ypos; // which pre-expansion row we're on +} stbi__resample; + +static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) +{ + int n, decode_n; + z->s->img_n = 0; // make stbi__cleanup_jpeg safe + + // validate req_comp + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + + // load a jpeg image from whichever source, but leave in YCbCr format + if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } + + // determine actual number of components to generate + n = req_comp ? req_comp : z->s->img_n; + + if (z->s->img_n == 3 && n < 3) + decode_n = 1; + else + decode_n = z->s->img_n; + + // resample and color-convert + { + int k; + unsigned int i,j; + stbi_uc *output; + stbi_uc *coutput[4]; + + stbi__resample res_comp[4]; + + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + + // allocate line buffer big enough for upsampling off the edges + // with upsample factor of 4 + z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3); + if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + r->hs = z->img_h_max / z->img_comp[k].h; + r->vs = z->img_v_max / z->img_comp[k].v; + r->ystep = r->vs >> 1; + r->w_lores = (z->s->img_x + r->hs-1) / r->hs; + r->ypos = 0; + r->line0 = r->line1 = z->img_comp[k].data; + + if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; + else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; + else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; + else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel; + else r->resample = stbi__resample_row_generic; + } + + // can't error after this so, this is safe + output = (stbi_uc *) stbi__malloc(n * z->s->img_x * z->s->img_y + 1); + if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + // now go ahead and resample + for (j=0; j < z->s->img_y; ++j) { + stbi_uc *out = output + n * z->s->img_x * j; + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + int y_bot = r->ystep >= (r->vs >> 1); + coutput[k] = r->resample(z->img_comp[k].linebuf, + y_bot ? r->line1 : r->line0, + y_bot ? r->line0 : r->line1, + r->w_lores, r->hs); + if (++r->ystep >= r->vs) { + r->ystep = 0; + r->line0 = r->line1; + if (++r->ypos < z->img_comp[k].y) + r->line1 += z->img_comp[k].w2; + } + } + if (n >= 3) { + stbi_uc *y = coutput[0]; + if (z->s->img_n == 3) { + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } else + for (i=0; i < z->s->img_x; ++i) { + out[0] = out[1] = out[2] = y[i]; + out[3] = 255; // not used if n==3 + out += n; + } + } else { + stbi_uc *y = coutput[0]; + if (n == 1) + for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; + else + for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255; + } + } + stbi__cleanup_jpeg(z); + *out_x = z->s->img_x; + *out_y = z->s->img_y; + if (comp) *comp = z->s->img_n; // report original components, not output + return output; + } +} + +static unsigned char *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__jpeg j; + j.s = s; + stbi__setup_jpeg(&j); + return load_jpeg_image(&j, x,y,comp,req_comp); +} + +static int stbi__jpeg_test(stbi__context *s) +{ + int r; + stbi__jpeg j; + j.s = s; + stbi__setup_jpeg(&j); + r = stbi__decode_jpeg_header(&j, STBI__SCAN_type); + stbi__rewind(s); + return r; +} + +static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) +{ + if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { + stbi__rewind( j->s ); + return 0; + } + if (x) *x = j->s->img_x; + if (y) *y = j->s->img_y; + if (comp) *comp = j->s->img_n; + return 1; +} + +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__jpeg j; + j.s = s; + return stbi__jpeg_info_raw(&j, x, y, comp); +} +#endif + +// public domain zlib decode v0.2 Sean Barrett 2006-11-18 +// simple implementation +// - all input must be provided in an upfront buffer +// - all output is written to a single output buffer (can malloc/realloc) +// performance +// - fast huffman + +#ifndef STBI_NO_ZLIB + +// fast-way is faster to check than jpeg huffman, but slow way is slower +#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables +#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) + +// zlib-style huffman encoding +// (jpegs packs from left, zlib from right, so can't share code) +typedef struct +{ + stbi__uint16 fast[1 << STBI__ZFAST_BITS]; + stbi__uint16 firstcode[16]; + int maxcode[17]; + stbi__uint16 firstsymbol[16]; + stbi_uc size[288]; + stbi__uint16 value[288]; +} stbi__zhuffman; + +stbi_inline static int stbi__bitreverse16(int n) +{ + n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); + n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); + n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); + n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); + return n; +} + +stbi_inline static int stbi__bit_reverse(int v, int bits) +{ + STBI_ASSERT(bits <= 16); + // to bit reverse n bits, reverse 16 and shift + // e.g. 11 bits, bit reverse and shift away 5 + return stbi__bitreverse16(v) >> (16-bits); +} + +static int stbi__zbuild_huffman(stbi__zhuffman *z, stbi_uc *sizelist, int num) +{ + int i,k=0; + int code, next_code[16], sizes[17]; + + // DEFLATE spec for generating codes + memset(sizes, 0, sizeof(sizes)); + memset(z->fast, 0, sizeof(z->fast)); + for (i=0; i < num; ++i) + ++sizes[sizelist[i]]; + sizes[0] = 0; + for (i=1; i < 16; ++i) + STBI_ASSERT(sizes[i] <= (1 << i)); + code = 0; + for (i=1; i < 16; ++i) { + next_code[i] = code; + z->firstcode[i] = (stbi__uint16) code; + z->firstsymbol[i] = (stbi__uint16) k; + code = (code + sizes[i]); + if (sizes[i]) + if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt JPEG"); + z->maxcode[i] = code << (16-i); // preshift for inner loop + code <<= 1; + k += sizes[i]; + } + z->maxcode[16] = 0x10000; // sentinel + for (i=0; i < num; ++i) { + int s = sizelist[i]; + if (s) { + int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i); + z->size [c] = (stbi_uc ) s; + z->value[c] = (stbi__uint16) i; + if (s <= STBI__ZFAST_BITS) { + int k = stbi__bit_reverse(next_code[s],s); + while (k < (1 << STBI__ZFAST_BITS)) { + z->fast[k] = fastv; + k += (1 << s); + } + } + ++next_code[s]; + } + } + return 1; +} + +// zlib-from-memory implementation for PNG reading +// because PNG allows splitting the zlib stream arbitrarily, +// and it's annoying structurally to have PNG call ZLIB call PNG, +// we require PNG read all the IDATs and combine them into a single +// memory buffer + +typedef struct +{ + stbi_uc *zbuffer, *zbuffer_end; + int num_bits; + stbi__uint32 code_buffer; + + char *zout; + char *zout_start; + char *zout_end; + int z_expandable; + + stbi__zhuffman z_length, z_distance; +} stbi__zbuf; + +stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) +{ + if (z->zbuffer >= z->zbuffer_end) return 0; + return *z->zbuffer++; +} + +static void stbi__fill_bits(stbi__zbuf *z) +{ + do { + STBI_ASSERT(z->code_buffer < (1U << z->num_bits)); + z->code_buffer |= stbi__zget8(z) << z->num_bits; + z->num_bits += 8; + } while (z->num_bits <= 24); +} + +stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) +{ + unsigned int k; + if (z->num_bits < n) stbi__fill_bits(z); + k = z->code_buffer & ((1 << n) - 1); + z->code_buffer >>= n; + z->num_bits -= n; + return k; +} + +static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s,k; + // not resolved by fast table, so compute it the slow way + // use jpeg approach, which requires MSbits at top + k = stbi__bit_reverse(a->code_buffer, 16); + for (s=STBI__ZFAST_BITS+1; ; ++s) + if (k < z->maxcode[s]) + break; + if (s == 16) return -1; // invalid code! + // code size is s, so: + b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; + STBI_ASSERT(z->size[b] == s); + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; +} + +stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s; + if (a->num_bits < 16) stbi__fill_bits(a); + b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; + if (b) { + s = b >> 9; + a->code_buffer >>= s; + a->num_bits -= s; + return b & 511; + } + return stbi__zhuffman_decode_slowpath(a, z); +} + +static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes +{ + char *q; + int cur, limit; + z->zout = zout; + if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); + cur = (int) (z->zout - z->zout_start); + limit = (int) (z->zout_end - z->zout_start); + while (cur + n > limit) + limit *= 2; + q = (char *) STBI_REALLOC(z->zout_start, limit); + if (q == NULL) return stbi__err("outofmem", "Out of memory"); + z->zout_start = q; + z->zout = q + cur; + z->zout_end = q + limit; + return 1; +} + +static int stbi__zlength_base[31] = { + 3,4,5,6,7,8,9,10,11,13, + 15,17,19,23,27,31,35,43,51,59, + 67,83,99,115,131,163,195,227,258,0,0 }; + +static int stbi__zlength_extra[31]= +{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + +static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, +257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + +static int stbi__zdist_extra[32] = +{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +static int stbi__parse_huffman_block(stbi__zbuf *a) +{ + char *zout = a->zout; + for(;;) { + int z = stbi__zhuffman_decode(a, &a->z_length); + if (z < 256) { + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes + if (zout >= a->zout_end) { + if (!stbi__zexpand(a, zout, 1)) return 0; + zout = a->zout; + } + *zout++ = (char) z; + } else { + stbi_uc *p; + int len,dist; + if (z == 256) { + a->zout = zout; + return 1; + } + z -= 257; + len = stbi__zlength_base[z]; + if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); + z = stbi__zhuffman_decode(a, &a->z_distance); + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); + dist = stbi__zdist_base[z]; + if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); + if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); + if (zout + len > a->zout_end) { + if (!stbi__zexpand(a, zout, len)) return 0; + zout = a->zout; + } + p = (stbi_uc *) (zout - dist); + if (dist == 1) { // run of one byte; common in images. + stbi_uc v = *p; + do *zout++ = v; while (--len); + } else { + do *zout++ = *p++; while (--len); + } + } + } +} + +static int stbi__compute_huffman_codes(stbi__zbuf *a) +{ + static stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + stbi__zhuffman z_codelength; + stbi_uc lencodes[286+32+137];//padding for maximum single op + stbi_uc codelength_sizes[19]; + int i,n; + + int hlit = stbi__zreceive(a,5) + 257; + int hdist = stbi__zreceive(a,5) + 1; + int hclen = stbi__zreceive(a,4) + 4; + + memset(codelength_sizes, 0, sizeof(codelength_sizes)); + for (i=0; i < hclen; ++i) { + int s = stbi__zreceive(a,3); + codelength_sizes[length_dezigzag[i]] = (stbi_uc) s; + } + if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; + + n = 0; + while (n < hlit + hdist) { + int c = stbi__zhuffman_decode(a, &z_codelength); + STBI_ASSERT(c >= 0 && c < 19); + if (c < 16) + lencodes[n++] = (stbi_uc) c; + else if (c == 16) { + c = stbi__zreceive(a,2)+3; + memset(lencodes+n, lencodes[n-1], c); + n += c; + } else if (c == 17) { + c = stbi__zreceive(a,3)+3; + memset(lencodes+n, 0, c); + n += c; + } else { + STBI_ASSERT(c == 18); + c = stbi__zreceive(a,7)+11; + memset(lencodes+n, 0, c); + n += c; + } + } + if (n != hlit+hdist) return stbi__err("bad codelengths","Corrupt PNG"); + if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; + return 1; +} + +static int stbi__parse_uncomperssed_block(stbi__zbuf *a) +{ + stbi_uc header[4]; + int len,nlen,k; + if (a->num_bits & 7) + stbi__zreceive(a, a->num_bits & 7); // discard + // drain the bit-packed data into header + k = 0; + while (a->num_bits > 0) { + header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check + a->code_buffer >>= 8; + a->num_bits -= 8; + } + STBI_ASSERT(a->num_bits == 0); + // now fill header the normal way + while (k < 4) + header[k++] = stbi__zget8(a); + len = header[1] * 256 + header[0]; + nlen = header[3] * 256 + header[2]; + if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); + if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); + if (a->zout + len > a->zout_end) + if (!stbi__zexpand(a, a->zout, len)) return 0; + memcpy(a->zout, a->zbuffer, len); + a->zbuffer += len; + a->zout += len; + return 1; +} + +static int stbi__parse_zlib_header(stbi__zbuf *a) +{ + int cmf = stbi__zget8(a); + int cm = cmf & 15; + /* int cinfo = cmf >> 4; */ + int flg = stbi__zget8(a); + if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png + if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png + // window = 1 << (8 + cinfo)... but who cares, we fully buffer output + return 1; +} + +// @TODO: should statically initialize these for optimal thread safety +static stbi_uc stbi__zdefault_length[288], stbi__zdefault_distance[32]; +static void stbi__init_zdefaults(void) +{ + int i; // use <= to match clearly with spec + for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; + for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; + for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; + for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; + + for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; +} + +static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) +{ + int final, type; + if (parse_header) + if (!stbi__parse_zlib_header(a)) return 0; + a->num_bits = 0; + a->code_buffer = 0; + do { + final = stbi__zreceive(a,1); + type = stbi__zreceive(a,2); + if (type == 0) { + if (!stbi__parse_uncomperssed_block(a)) return 0; + } else if (type == 3) { + return 0; + } else { + if (type == 1) { + // use fixed code lengths + if (!stbi__zdefault_distance[31]) stbi__init_zdefaults(); + if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; + } else { + if (!stbi__compute_huffman_codes(a)) return 0; + } + if (!stbi__parse_huffman_block(a)) return 0; + } + } while (!final); + return 1; +} + +static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header) +{ + a->zout_start = obuf; + a->zout = obuf; + a->zout_end = obuf + olen; + a->z_expandable = exp; + + return stbi__parse_zlib(a, parse_header); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, 1)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) +{ + return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 1)) + return (int) (a.zout - a.zout_start); + else + return -1; +} + +STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(16384); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer+len; + if (stbi__do_zlib(&a, p, 16384, 1, 0)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 0)) + return (int) (a.zout - a.zout_start); + else + return -1; +} +#endif + +// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 +// simple implementation +// - only 8-bit samples +// - no CRC checking +// - allocates lots of intermediate memory +// - avoids problem of streaming data between subsystems +// - avoids explicit window management +// performance +// - uses stb_zlib, a PD zlib implementation with fast huffman decoding + +#ifndef STBI_NO_PNG +typedef struct +{ + stbi__uint32 length; + stbi__uint32 type; +} stbi__pngchunk; + +static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) +{ + stbi__pngchunk c; + c.length = stbi__get32be(s); + c.type = stbi__get32be(s); + return c; +} + +static int stbi__check_png_header(stbi__context *s) +{ + static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; + int i; + for (i=0; i < 8; ++i) + if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); + return 1; +} + +typedef struct +{ + stbi__context *s; + stbi_uc *idata, *expanded, *out; +} stbi__png; + + +enum { + STBI__F_none=0, + STBI__F_sub=1, + STBI__F_up=2, + STBI__F_avg=3, + STBI__F_paeth=4, + // synthetic filters used for first scanline to avoid needing a dummy row of 0s + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static stbi_uc first_row_filter[5] = +{ + STBI__F_none, + STBI__F_sub, + STBI__F_none, + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static int stbi__paeth(int a, int b, int c) +{ + int p = a + b - c; + int pa = abs(p-a); + int pb = abs(p-b); + int pc = abs(p-c); + if (pa <= pb && pa <= pc) return a; + if (pb <= pc) return b; + return c; +} + +static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; + +// create the png data from post-deflated data +static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) +{ + stbi__context *s = a->s; + stbi__uint32 i,j,stride = x*out_n; + stbi__uint32 img_len, img_width_bytes; + int k; + int img_n = s->img_n; // copy it into a local for later + + STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); + a->out = (stbi_uc *) stbi__malloc(x * y * out_n); // extra bytes to write off the end into + if (!a->out) return stbi__err("outofmem", "Out of memory"); + + img_width_bytes = (((img_n * x * depth) + 7) >> 3); + img_len = (img_width_bytes + 1) * y; + if (s->img_x == x && s->img_y == y) { + if (raw_len != img_len) return stbi__err("not enough pixels","Corrupt PNG"); + } else { // interlaced: + if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); + } + + for (j=0; j < y; ++j) { + stbi_uc *cur = a->out + stride*j; + stbi_uc *prior = cur - stride; + int filter = *raw++; + int filter_bytes = img_n; + int width = x; + if (filter > 4) + return stbi__err("invalid filter","Corrupt PNG"); + + if (depth < 8) { + STBI_ASSERT(img_width_bytes <= x); + cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place + filter_bytes = 1; + width = img_width_bytes; + } + + // if first row, use special filter that doesn't sample previous row + if (j == 0) filter = first_row_filter[filter]; + + // handle first byte explicitly + for (k=0; k < filter_bytes; ++k) { + switch (filter) { + case STBI__F_none : cur[k] = raw[k]; break; + case STBI__F_sub : cur[k] = raw[k]; break; + case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; + case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break; + case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break; + case STBI__F_avg_first : cur[k] = raw[k]; break; + case STBI__F_paeth_first: cur[k] = raw[k]; break; + } + } + + if (depth == 8) { + if (img_n != out_n) + cur[img_n] = 255; // first pixel + raw += img_n; + cur += out_n; + prior += out_n; + } else { + raw += 1; + cur += 1; + prior += 1; + } + + // this is a little gross, so that we don't switch per-pixel or per-component + if (depth < 8 || img_n == out_n) { + int nk = (width - 1)*img_n; + #define CASE(f) \ + case f: \ + for (k=0; k < nk; ++k) + switch (filter) { + // "none" filter turns into a memcpy here; make that explicit. + case STBI__F_none: memcpy(cur, raw, nk); break; + CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); break; + CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; + CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); break; + CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); break; + CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); break; + CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); break; + } + #undef CASE + raw += nk; + } else { + STBI_ASSERT(img_n+1 == out_n); + #define CASE(f) \ + case f: \ + for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \ + for (k=0; k < img_n; ++k) + switch (filter) { + CASE(STBI__F_none) cur[k] = raw[k]; break; + CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-out_n]); break; + CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; + CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-out_n])>>1)); break; + CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],prior[k],prior[k-out_n])); break; + CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-out_n] >> 1)); break; + CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],0,0)); break; + } + #undef CASE + } + } + + // we make a separate pass to expand bits to pixels; for performance, + // this could run two scanlines behind the above code, so it won't + // intefere with filtering but will still be in the cache. + if (depth < 8) { + for (j=0; j < y; ++j) { + stbi_uc *cur = a->out + stride*j; + stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes; + // unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit + // png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop + stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range + + // note that the final byte might overshoot and write more data than desired. + // we can allocate enough data that this never writes out of memory, but it + // could also overwrite the next scanline. can it overwrite non-empty data + // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel. + // so we need to explicitly clamp the final ones + + if (depth == 4) { + for (k=x*img_n; k >= 2; k-=2, ++in) { + *cur++ = scale * ((*in >> 4) ); + *cur++ = scale * ((*in ) & 0x0f); + } + if (k > 0) *cur++ = scale * ((*in >> 4) ); + } else if (depth == 2) { + for (k=x*img_n; k >= 4; k-=4, ++in) { + *cur++ = scale * ((*in >> 6) ); + *cur++ = scale * ((*in >> 4) & 0x03); + *cur++ = scale * ((*in >> 2) & 0x03); + *cur++ = scale * ((*in ) & 0x03); + } + if (k > 0) *cur++ = scale * ((*in >> 6) ); + if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03); + if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03); + } else if (depth == 1) { + for (k=x*img_n; k >= 8; k-=8, ++in) { + *cur++ = scale * ((*in >> 7) ); + *cur++ = scale * ((*in >> 6) & 0x01); + *cur++ = scale * ((*in >> 5) & 0x01); + *cur++ = scale * ((*in >> 4) & 0x01); + *cur++ = scale * ((*in >> 3) & 0x01); + *cur++ = scale * ((*in >> 2) & 0x01); + *cur++ = scale * ((*in >> 1) & 0x01); + *cur++ = scale * ((*in ) & 0x01); + } + if (k > 0) *cur++ = scale * ((*in >> 7) ); + if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01); + if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01); + if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01); + if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01); + if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01); + if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01); + } + if (img_n != out_n) { + // insert alpha = 255 + stbi_uc *cur = a->out + stride*j; + int i; + if (img_n == 1) { + for (i=x-1; i >= 0; --i) { + cur[i*2+1] = 255; + cur[i*2+0] = cur[i]; + } + } else { + STBI_ASSERT(img_n == 3); + for (i=x-1; i >= 0; --i) { + cur[i*4+3] = 255; + cur[i*4+2] = cur[i*3+2]; + cur[i*4+1] = cur[i*3+1]; + cur[i*4+0] = cur[i*3+0]; + } + } + } + } + } + + return 1; +} + +static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) +{ + stbi_uc *final; + int p; + if (!interlaced) + return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); + + // de-interlacing + final = (stbi_uc *) stbi__malloc(a->s->img_x * a->s->img_y * out_n); + for (p=0; p < 7; ++p) { + int xorig[] = { 0,4,0,2,0,1,0 }; + int yorig[] = { 0,0,4,0,2,0,1 }; + int xspc[] = { 8,8,4,4,2,2,1 }; + int yspc[] = { 8,8,8,4,4,2,2 }; + int i,j,x,y; + // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 + x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; + y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; + if (x && y) { + stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; + if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { + STBI_FREE(final); + return 0; + } + for (j=0; j < y; ++j) { + for (i=0; i < x; ++i) { + int out_y = j*yspc[p]+yorig[p]; + int out_x = i*xspc[p]+xorig[p]; + memcpy(final + out_y*a->s->img_x*out_n + out_x*out_n, + a->out + (j*x+i)*out_n, out_n); + } + } + STBI_FREE(a->out); + image_data += img_len; + image_data_len -= img_len; + } + } + a->out = final; + + return 1; +} + +static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + // compute color-based transparency, assuming we've + // already got 255 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i=0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 255); + p += 2; + } + } else { + for (i=0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n) +{ + stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; + stbi_uc *p, *temp_out, *orig = a->out; + + p = (stbi_uc *) stbi__malloc(pixel_count * pal_img_n); + if (p == NULL) return stbi__err("outofmem", "Out of memory"); + + // between here and free(out) below, exitting would leak + temp_out = p; + + if (pal_img_n == 3) { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p += 3; + } + } else { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p[3] = palette[n+3]; + p += 4; + } + } + STBI_FREE(a->out); + a->out = temp_out; + + STBI_NOTUSED(len); + + return 1; +} + +static int stbi__unpremultiply_on_load = 0; +static int stbi__de_iphone_flag = 0; + +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag = flag_true_if_should_convert; +} + +static void stbi__de_iphone(stbi__png *z) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + if (s->img_out_n == 3) { // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 3; + } + } else { + STBI_ASSERT(s->img_out_n == 4); + if (stbi__unpremultiply_on_load) { + // convert bgr to rgb and unpremultiply + for (i=0; i < pixel_count; ++i) { + stbi_uc a = p[3]; + stbi_uc t = p[0]; + if (a) { + p[0] = p[2] * 255 / a; + p[1] = p[1] * 255 / a; + p[2] = t * 255 / a; + } else { + p[0] = p[2]; + p[2] = t; + } + p += 4; + } + } else { + // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 4; + } + } + } +} + +#define STBI__PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) + +static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) +{ + stbi_uc palette[1024], pal_img_n=0; + stbi_uc has_trans=0, tc[3]; + stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; + int first=1,k,interlace=0, color=0, depth=0, is_iphone=0; + stbi__context *s = z->s; + + z->expanded = NULL; + z->idata = NULL; + z->out = NULL; + + if (!stbi__check_png_header(s)) return 0; + + if (scan == STBI__SCAN_type) return 1; + + for (;;) { + stbi__pngchunk c = stbi__get_chunk_header(s); + switch (c.type) { + case STBI__PNG_TYPE('C','g','B','I'): + is_iphone = 1; + stbi__skip(s, c.length); + break; + case STBI__PNG_TYPE('I','H','D','R'): { + int comp,filter; + if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); + first = 0; + if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); + s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); + s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); + depth = stbi__get8(s); if (depth != 1 && depth != 2 && depth != 4 && depth != 8) return stbi__err("1/2/4/8-bit only","PNG not supported: 1/2/4/8-bit only"); + color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); + comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); + filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); + interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG"); + if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG"); + if (!pal_img_n) { + s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); + if (scan == STBI__SCAN_header) return 1; + } else { + // if paletted, then pal_n is our final components, and + // img_n is # components to decompress/filter. + s->img_n = 1; + if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG"); + // if SCAN_header, have to scan to see if we have a tRNS + } + break; + } + + case STBI__PNG_TYPE('P','L','T','E'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); + pal_len = c.length / 3; + if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG"); + for (i=0; i < pal_len; ++i) { + palette[i*4+0] = stbi__get8(s); + palette[i*4+1] = stbi__get8(s); + palette[i*4+2] = stbi__get8(s); + palette[i*4+3] = 255; + } + break; + } + + case STBI__PNG_TYPE('t','R','N','S'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); + if (pal_img_n) { + if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } + if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); + if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); + pal_img_n = 4; + for (i=0; i < c.length; ++i) + palette[i*4+3] = stbi__get8(s); + } else { + if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); + if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); + has_trans = 1; + for (k=0; k < s->img_n; ++k) + tc[k] = (stbi_uc) (stbi__get16be(s) & 255) * stbi__depth_scale_table[depth]; // non 8-bit images will be larger + } + break; + } + + case STBI__PNG_TYPE('I','D','A','T'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); + if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; } + if (ioff + c.length > idata_limit) { + stbi_uc *p; + if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; + while (ioff + c.length > idata_limit) + idata_limit *= 2; + p = (stbi_uc *) STBI_REALLOC(z->idata, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); + z->idata = p; + } + if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); + ioff += c.length; + break; + } + + case STBI__PNG_TYPE('I','E','N','D'): { + stbi__uint32 raw_len, bpl; + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (scan != STBI__SCAN_load) return 1; + if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); + // initial guess for decoded data size to avoid unnecessary reallocs + bpl = (s->img_x * depth + 7) / 8; // bytes per line, per component + raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; + z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); + if (z->expanded == NULL) return 0; // zlib should set error + STBI_FREE(z->idata); z->idata = NULL; + if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) + s->img_out_n = s->img_n+1; + else + s->img_out_n = s->img_n; + if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, depth, color, interlace)) return 0; + if (has_trans) + if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; + if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) + stbi__de_iphone(z); + if (pal_img_n) { + // pal_img_n == 3 or 4 + s->img_n = pal_img_n; // record the actual colors we had + s->img_out_n = pal_img_n; + if (req_comp >= 3) s->img_out_n = req_comp; + if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) + return 0; + } + STBI_FREE(z->expanded); z->expanded = NULL; + return 1; + } + + default: + // if critical, fail + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if ((c.type & (1 << 29)) == 0) { + #ifndef STBI_NO_FAILURE_STRINGS + // not threadsafe + static char invalid_chunk[] = "XXXX PNG chunk not known"; + invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); + invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); + invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); + invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); + #endif + return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); + } + stbi__skip(s, c.length); + break; + } + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + } +} + +static unsigned char *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp) +{ + unsigned char *result=NULL; + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { + result = p->out; + p->out = NULL; + if (req_comp && req_comp != p->s->img_out_n) { + result = stbi__convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + p->s->img_out_n = req_comp; + if (result == NULL) return result; + } + *x = p->s->img_x; + *y = p->s->img_y; + if (n) *n = p->s->img_out_n; + } + STBI_FREE(p->out); p->out = NULL; + STBI_FREE(p->expanded); p->expanded = NULL; + STBI_FREE(p->idata); p->idata = NULL; + + return result; +} + +static unsigned char *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__png p; + p.s = s; + return stbi__do_png(&p, x,y,comp,req_comp); +} + +static int stbi__png_test(stbi__context *s) +{ + int r; + r = stbi__check_png_header(s); + stbi__rewind(s); + return r; +} + +static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) +{ + if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { + stbi__rewind( p->s ); + return 0; + } + if (x) *x = p->s->img_x; + if (y) *y = p->s->img_y; + if (comp) *comp = p->s->img_n; + return 1; +} + +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__png p; + p.s = s; + return stbi__png_info_raw(&p, x, y, comp); +} +#endif + +// Microsoft/Windows BMP image + +#ifndef STBI_NO_BMP +static int stbi__bmp_test_raw(stbi__context *s) +{ + int r; + int sz; + if (stbi__get8(s) != 'B') return 0; + if (stbi__get8(s) != 'M') return 0; + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + stbi__get32le(s); // discard data offset + sz = stbi__get32le(s); + r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); + return r; +} + +static int stbi__bmp_test(stbi__context *s) +{ + int r = stbi__bmp_test_raw(s); + stbi__rewind(s); + return r; +} + + +// returns 0..31 for the highest set bit +static int stbi__high_bit(unsigned int z) +{ + int n=0; + if (z == 0) return -1; + if (z >= 0x10000) n += 16, z >>= 16; + if (z >= 0x00100) n += 8, z >>= 8; + if (z >= 0x00010) n += 4, z >>= 4; + if (z >= 0x00004) n += 2, z >>= 2; + if (z >= 0x00002) n += 1, z >>= 1; + return n; +} + +static int stbi__bitcount(unsigned int a) +{ + a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 + a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits + a = (a + (a >> 8)); // max 16 per 8 bits + a = (a + (a >> 16)); // max 32 per 8 bits + return a & 0xff; +} + +static int stbi__shiftsigned(int v, int shift, int bits) +{ + int result; + int z=0; + + if (shift < 0) v <<= -shift; + else v >>= shift; + result = v; + + z = bits; + while (z < 8) { + result += v >> z; + z += bits; + } + return result; +} + +static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi_uc *out; + unsigned int mr=0,mg=0,mb=0,ma=0, fake_a=0; + stbi_uc pal[256][4]; + int psize=0,i,j,compress=0,width; + int bpp, flip_vertically, pad, target, offset, hsz; + if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + offset = stbi__get32le(s); + hsz = stbi__get32le(s); + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); + if (hsz == 12) { + s->img_x = stbi__get16le(s); + s->img_y = stbi__get16le(s); + } else { + s->img_x = stbi__get32le(s); + s->img_y = stbi__get32le(s); + } + if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); + bpp = stbi__get16le(s); + if (bpp == 1) return stbi__errpuc("monochrome", "BMP type not supported: 1-bit"); + flip_vertically = ((int) s->img_y) > 0; + s->img_y = abs((int) s->img_y); + if (hsz == 12) { + if (bpp < 24) + psize = (offset - 14 - 24) / 3; + } else { + compress = stbi__get32le(s); + if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); + stbi__get32le(s); // discard sizeof + stbi__get32le(s); // discard hres + stbi__get32le(s); // discard vres + stbi__get32le(s); // discard colorsused + stbi__get32le(s); // discard max important + if (hsz == 40 || hsz == 56) { + if (hsz == 56) { + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + } + if (bpp == 16 || bpp == 32) { + mr = mg = mb = 0; + if (compress == 0) { + if (bpp == 32) { + mr = 0xffu << 16; + mg = 0xffu << 8; + mb = 0xffu << 0; + ma = 0xffu << 24; + fake_a = 1; // @TODO: check for cases like alpha value is all 0 and switch it to 255 + STBI_NOTUSED(fake_a); + } else { + mr = 31u << 10; + mg = 31u << 5; + mb = 31u << 0; + } + } else if (compress == 3) { + mr = stbi__get32le(s); + mg = stbi__get32le(s); + mb = stbi__get32le(s); + // not documented, but generated by photoshop and handled by mspaint + if (mr == mg && mg == mb) { + // ?!?!? + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else { + STBI_ASSERT(hsz == 108 || hsz == 124); + mr = stbi__get32le(s); + mg = stbi__get32le(s); + mb = stbi__get32le(s); + ma = stbi__get32le(s); + stbi__get32le(s); // discard color space + for (i=0; i < 12; ++i) + stbi__get32le(s); // discard color space parameters + if (hsz == 124) { + stbi__get32le(s); // discard rendering intent + stbi__get32le(s); // discard offset of profile data + stbi__get32le(s); // discard size of profile data + stbi__get32le(s); // discard reserved + } + } + if (bpp < 16) + psize = (offset - 14 - hsz) >> 2; + } + s->img_n = ma ? 4 : 3; + if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 + target = req_comp; + else + target = s->img_n; // if they want monochrome, we'll post-convert + out = (stbi_uc *) stbi__malloc(target * s->img_x * s->img_y); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + if (bpp < 16) { + int z=0; + if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } + for (i=0; i < psize; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + if (hsz != 12) stbi__get8(s); + pal[i][3] = 255; + } + stbi__skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4)); + if (bpp == 4) width = (s->img_x + 1) >> 1; + else if (bpp == 8) width = s->img_x; + else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } + pad = (-width)&3; + for (j=0; j < (int) s->img_y; ++j) { + for (i=0; i < (int) s->img_x; i += 2) { + int v=stbi__get8(s),v2=0; + if (bpp == 4) { + v2 = v & 15; + v >>= 4; + } + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + v = (bpp == 8) ? stbi__get8(s) : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + } + stbi__skip(s, pad); + } + } else { + int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; + int z = 0; + int easy=0; + stbi__skip(s, offset - 14 - hsz); + if (bpp == 24) width = 3 * s->img_x; + else if (bpp == 16) width = 2*s->img_x; + else /* bpp = 32 and pad = 0 */ width=0; + pad = (-width) & 3; + if (bpp == 24) { + easy = 1; + } else if (bpp == 32) { + if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) + easy = 2; + } + if (!easy) { + if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + // right shift amt to put high bit in position #7 + rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr); + gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); + bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb); + ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma); + } + for (j=0; j < (int) s->img_y; ++j) { + if (easy) { + for (i=0; i < (int) s->img_x; ++i) { + unsigned char a; + out[z+2] = stbi__get8(s); + out[z+1] = stbi__get8(s); + out[z+0] = stbi__get8(s); + z += 3; + a = (easy == 2 ? stbi__get8(s) : 255); + if (target == 4) out[z++] = a; + } + } else { + for (i=0; i < (int) s->img_x; ++i) { + stbi__uint32 v = (stbi__uint32) (bpp == 16 ? stbi__get16le(s) : stbi__get32le(s)); + int a; + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); + a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); + if (target == 4) out[z++] = STBI__BYTECAST(a); + } + } + stbi__skip(s, pad); + } + } + if (flip_vertically) { + stbi_uc t; + for (j=0; j < (int) s->img_y>>1; ++j) { + stbi_uc *p1 = out + j *s->img_x*target; + stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; + for (i=0; i < (int) s->img_x*target; ++i) { + t = p1[i], p1[i] = p2[i], p2[i] = t; + } + } + } + + if (req_comp && req_comp != target) { + out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + return out; +} +#endif + +// Targa Truevision - TGA +// by Jonathan Dummer +#ifndef STBI_NO_TGA +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) +{ + int tga_w, tga_h, tga_comp; + int sz; + stbi__get8(s); // discard Offset + sz = stbi__get8(s); // color type + if( sz > 1 ) { + stbi__rewind(s); + return 0; // only RGB or indexed allowed + } + sz = stbi__get8(s); // image type + // only RGB or grey allowed, +/- RLE + if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11)) return 0; + stbi__skip(s,9); + tga_w = stbi__get16le(s); + if( tga_w < 1 ) { + stbi__rewind(s); + return 0; // test width + } + tga_h = stbi__get16le(s); + if( tga_h < 1 ) { + stbi__rewind(s); + return 0; // test height + } + sz = stbi__get8(s); // bits per pixel + // only RGB or RGBA or grey allowed + if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) { + stbi__rewind(s); + return 0; + } + tga_comp = sz; + if (x) *x = tga_w; + if (y) *y = tga_h; + if (comp) *comp = tga_comp / 8; + return 1; // seems to have passed everything +} + +static int stbi__tga_test(stbi__context *s) +{ + int res; + int sz; + stbi__get8(s); // discard Offset + sz = stbi__get8(s); // color type + if ( sz > 1 ) return 0; // only RGB or indexed allowed + sz = stbi__get8(s); // image type + if ( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) ) return 0; // only RGB or grey allowed, +/- RLE + stbi__get16be(s); // discard palette start + stbi__get16be(s); // discard palette length + stbi__get8(s); // discard bits per palette color entry + stbi__get16be(s); // discard x origin + stbi__get16be(s); // discard y origin + if ( stbi__get16be(s) < 1 ) return 0; // test width + if ( stbi__get16be(s) < 1 ) return 0; // test height + sz = stbi__get8(s); // bits per pixel + if ( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) ) + res = 0; + else + res = 1; + stbi__rewind(s); + return res; +} + +static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + // read in the TGA header stuff + int tga_offset = stbi__get8(s); + int tga_indexed = stbi__get8(s); + int tga_image_type = stbi__get8(s); + int tga_is_RLE = 0; + int tga_palette_start = stbi__get16le(s); + int tga_palette_len = stbi__get16le(s); + int tga_palette_bits = stbi__get8(s); + int tga_x_origin = stbi__get16le(s); + int tga_y_origin = stbi__get16le(s); + int tga_width = stbi__get16le(s); + int tga_height = stbi__get16le(s); + int tga_bits_per_pixel = stbi__get8(s); + int tga_comp = tga_bits_per_pixel / 8; + int tga_inverted = stbi__get8(s); + // image data + unsigned char *tga_data; + unsigned char *tga_palette = NULL; + int i, j; + unsigned char raw_data[4]; + int RLE_count = 0; + int RLE_repeating = 0; + int read_next_pixel = 1; + + // do a tiny bit of precessing + if ( tga_image_type >= 8 ) + { + tga_image_type -= 8; + tga_is_RLE = 1; + } + /* int tga_alpha_bits = tga_inverted & 15; */ + tga_inverted = 1 - ((tga_inverted >> 5) & 1); + + // error check + if ( //(tga_indexed) || + (tga_width < 1) || (tga_height < 1) || + (tga_image_type < 1) || (tga_image_type > 3) || + ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) && + (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32)) + ) + { + return NULL; // we don't report this as a bad TGA because we don't even know if it's TGA + } + + // If I'm paletted, then I'll use the number of bits from the palette + if ( tga_indexed ) + { + tga_comp = tga_palette_bits / 8; + } + + // tga info + *x = tga_width; + *y = tga_height; + if (comp) *comp = tga_comp; + + tga_data = (unsigned char*)stbi__malloc( tga_width * tga_height * tga_comp ); + if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); + + // skip to the data's starting position (offset usually = 0) + stbi__skip(s, tga_offset ); + + if ( !tga_indexed && !tga_is_RLE) { + for (i=0; i < tga_height; ++i) { + int y = tga_inverted ? tga_height -i - 1 : i; + stbi_uc *tga_row = tga_data + y*tga_width*tga_comp; + stbi__getn(s, tga_row, tga_width * tga_comp); + } + } else { + // do I need to load a palette? + if ( tga_indexed) + { + // any data to skip? (offset usually = 0) + stbi__skip(s, tga_palette_start ); + // load the palette + tga_palette = (unsigned char*)stbi__malloc( tga_palette_len * tga_palette_bits / 8 ); + if (!tga_palette) { + STBI_FREE(tga_data); + return stbi__errpuc("outofmem", "Out of memory"); + } + if (!stbi__getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 )) { + STBI_FREE(tga_data); + STBI_FREE(tga_palette); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + } + // load the data + for (i=0; i < tga_width * tga_height; ++i) + { + // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? + if ( tga_is_RLE ) + { + if ( RLE_count == 0 ) + { + // yep, get the next byte as a RLE command + int RLE_cmd = stbi__get8(s); + RLE_count = 1 + (RLE_cmd & 127); + RLE_repeating = RLE_cmd >> 7; + read_next_pixel = 1; + } else if ( !RLE_repeating ) + { + read_next_pixel = 1; + } + } else + { + read_next_pixel = 1; + } + // OK, if I need to read a pixel, do it now + if ( read_next_pixel ) + { + // load however much data we did have + if ( tga_indexed ) + { + // read in 1 byte, then perform the lookup + int pal_idx = stbi__get8(s); + if ( pal_idx >= tga_palette_len ) + { + // invalid index + pal_idx = 0; + } + pal_idx *= tga_bits_per_pixel / 8; + for (j = 0; j*8 < tga_bits_per_pixel; ++j) + { + raw_data[j] = tga_palette[pal_idx+j]; + } + } else + { + // read in the data raw + for (j = 0; j*8 < tga_bits_per_pixel; ++j) + { + raw_data[j] = stbi__get8(s); + } + } + // clear the reading flag for the next pixel + read_next_pixel = 0; + } // end of reading a pixel + + // copy data + for (j = 0; j < tga_comp; ++j) + tga_data[i*tga_comp+j] = raw_data[j]; + + // in case we're in RLE mode, keep counting down + --RLE_count; + } + // do I need to invert the image? + if ( tga_inverted ) + { + for (j = 0; j*2 < tga_height; ++j) + { + int index1 = j * tga_width * tga_comp; + int index2 = (tga_height - 1 - j) * tga_width * tga_comp; + for (i = tga_width * tga_comp; i > 0; --i) + { + unsigned char temp = tga_data[index1]; + tga_data[index1] = tga_data[index2]; + tga_data[index2] = temp; + ++index1; + ++index2; + } + } + } + // clear my palette, if I had one + if ( tga_palette != NULL ) + { + STBI_FREE( tga_palette ); + } + } + + // swap RGB + if (tga_comp >= 3) + { + unsigned char* tga_pixel = tga_data; + for (i=0; i < tga_width * tga_height; ++i) + { + unsigned char temp = tga_pixel[0]; + tga_pixel[0] = tga_pixel[2]; + tga_pixel[2] = temp; + tga_pixel += tga_comp; + } + } + + // convert to target component count + if (req_comp && req_comp != tga_comp) + tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); + + // the things I do to get rid of an error message, and yet keep + // Microsoft's C compilers happy... [8^( + tga_palette_start = tga_palette_len = tga_palette_bits = + tga_x_origin = tga_y_origin = 0; + // OK, done + return tga_data; +} +#endif + +// ************************************************************************************************* +// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s) +{ + int r = (stbi__get32be(s) == 0x38425053); + stbi__rewind(s); + return r; +} + +static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + int pixelCount; + int channelCount, compression; + int channel, i, count, len; + int w,h; + stbi_uc *out; + + // Check identifier + if (stbi__get32be(s) != 0x38425053) // "8BPS" + return stbi__errpuc("not PSD", "Corrupt PSD image"); + + // Check file type version. + if (stbi__get16be(s) != 1) + return stbi__errpuc("wrong version", "Unsupported version of PSD image"); + + // Skip 6 reserved bytes. + stbi__skip(s, 6 ); + + // Read the number of channels (R, G, B, A, etc). + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) + return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); + + // Read the rows and columns of the image. + h = stbi__get32be(s); + w = stbi__get32be(s); + + // Make sure the depth is 8 bits. + if (stbi__get16be(s) != 8) + return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 bit"); + + // Make sure the color mode is RGB. + // Valid options are: + // 0: Bitmap + // 1: Grayscale + // 2: Indexed color + // 3: RGB color + // 4: CMYK color + // 7: Multichannel + // 8: Duotone + // 9: Lab color + if (stbi__get16be(s) != 3) + return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); + + // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) + stbi__skip(s,stbi__get32be(s) ); + + // Skip the image resources. (resolution, pen tool paths, etc) + stbi__skip(s, stbi__get32be(s) ); + + // Skip the reserved data. + stbi__skip(s, stbi__get32be(s) ); + + // Find out if the data is compressed. + // Known values: + // 0: no compression + // 1: RLE compressed + compression = stbi__get16be(s); + if (compression > 1) + return stbi__errpuc("bad compression", "PSD has an unknown compression format"); + + // Create the destination image. + out = (stbi_uc *) stbi__malloc(4 * w*h); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + pixelCount = w*h; + + // Initialize the data to zero. + //memset( out, 0, pixelCount * 4 ); + + // Finally, the image data. + if (compression) { + // RLE as used by .PSD and .TIFF + // Loop until you get the number of unpacked bytes you are expecting: + // Read the next source byte into n. + // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. + // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. + // Else if n is 128, noop. + // Endloop + + // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data, + // which we're going to just skip. + stbi__skip(s, h * channelCount * 2 ); + + // Read the RLE data by channel. + for (channel = 0; channel < 4; channel++) { + stbi_uc *p; + + p = out+channel; + if (channel >= channelCount) { + // Fill this channel with default data. + for (i = 0; i < pixelCount; i++) *p = (channel == 3 ? 255 : 0), p += 4; + } else { + // Read the RLE data. + count = 0; + while (count < pixelCount) { + len = stbi__get8(s); + if (len == 128) { + // No-op. + } else if (len < 128) { + // Copy next len+1 bytes literally. + len++; + count += len; + while (len) { + *p = stbi__get8(s); + p += 4; + len--; + } + } else if (len > 128) { + stbi_uc val; + // Next -len+1 bytes in the dest are replicated from next source byte. + // (Interpret len as a negative 8-bit int.) + len ^= 0x0FF; + len += 2; + val = stbi__get8(s); + count += len; + while (len) { + *p = val; + p += 4; + len--; + } + } + } + } + } + + } else { + // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) + // where each channel consists of an 8-bit value for each pixel in the image. + + // Read the data by channel. + for (channel = 0; channel < 4; channel++) { + stbi_uc *p; + + p = out + channel; + if (channel > channelCount) { + // Fill this channel with default data. + for (i = 0; i < pixelCount; i++) *p = channel == 3 ? 255 : 0, p += 4; + } else { + // Read the data. + for (i = 0; i < pixelCount; i++) + *p = stbi__get8(s), p += 4; + } + } + } + + if (req_comp && req_comp != 4) { + out = stbi__convert_format(out, 4, req_comp, w, h); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + if (comp) *comp = channelCount; + *y = h; + *x = w; + + return out; +} +#endif + +// ************************************************************************************************* +// Softimage PIC loader +// by Tom Seddon +// +// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format +// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ + +#ifndef STBI_NO_PIC +static int stbi__pic_is4(stbi__context *s,const char *str) +{ + int i; + for (i=0; i<4; ++i) + if (stbi__get8(s) != (stbi_uc)str[i]) + return 0; + + return 1; +} + +static int stbi__pic_test_core(stbi__context *s) +{ + int i; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) + return 0; + + for(i=0;i<84;++i) + stbi__get8(s); + + if (!stbi__pic_is4(s,"PICT")) + return 0; + + return 1; +} + +typedef struct +{ + stbi_uc size,type,channel; +} stbi__pic_packet; + +static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest) +{ + int mask=0x80, i; + + for (i=0; i<4; ++i, mask>>=1) { + if (channel & mask) { + if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short"); + dest[i]=stbi__get8(s); + } + } + + return dest; +} + +static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src) +{ + int mask=0x80,i; + + for (i=0;i<4; ++i, mask>>=1) + if (channel&mask) + dest[i]=src[i]; +} + +static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result) +{ + int act_comp=0,num_packets=0,y,chained; + stbi__pic_packet packets[10]; + + // this will (should...) cater for even some bizarre stuff like having data + // for the same channel in multiple packets. + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return stbi__errpuc("bad format","too many packets"); + + packet = &packets[num_packets++]; + + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + + act_comp |= packet->channel; + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)"); + if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp"); + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? + + for(y=0; ytype) { + default: + return stbi__errpuc("bad format","packet has bad compression type"); + + case 0: {//uncompressed + int x; + + for(x=0;xchannel,dest)) + return 0; + break; + } + + case 1://Pure RLE + { + int left=width, i; + + while (left>0) { + stbi_uc count,value[4]; + + count=stbi__get8(s); + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)"); + + if (count > left) + count = (stbi_uc) left; + + if (!stbi__readval(s,packet->channel,value)) return 0; + + for(i=0; ichannel,dest,value); + left -= count; + } + } + break; + + case 2: {//Mixed RLE + int left=width; + while (left>0) { + int count = stbi__get8(s), i; + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)"); + + if (count >= 128) { // Repeated + stbi_uc value[4]; + int i; + + if (count==128) + count = stbi__get16be(s); + else + count -= 127; + if (count > left) + return stbi__errpuc("bad file","scanline overrun"); + + if (!stbi__readval(s,packet->channel,value)) + return 0; + + for(i=0;ichannel,dest,value); + } else { // Raw + ++count; + if (count>left) return stbi__errpuc("bad file","scanline overrun"); + + for(i=0;ichannel,dest)) + return 0; + } + left-=count; + } + break; + } + } + } + } + + return result; +} + +static stbi_uc *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp) +{ + stbi_uc *result; + int i, x,y; + + for (i=0; i<92; ++i) + stbi__get8(s); + + x = stbi__get16be(s); + y = stbi__get16be(s); + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); + if ((1 << 28) / x < y) return stbi__errpuc("too large", "Image too large to decode"); + + stbi__get32be(s); //skip `ratio' + stbi__get16be(s); //skip `fields' + stbi__get16be(s); //skip `pad' + + // intermediate buffer is RGBA + result = (stbi_uc *) stbi__malloc(x*y*4); + memset(result, 0xff, x*y*4); + + if (!stbi__pic_load_core(s,x,y,comp, result)) { + STBI_FREE(result); + result=0; + } + *px = x; + *py = y; + if (req_comp == 0) req_comp = *comp; + result=stbi__convert_format(result,4,req_comp,x,y); + + return result; +} + +static int stbi__pic_test(stbi__context *s) +{ + int r = stbi__pic_test_core(s); + stbi__rewind(s); + return r; +} +#endif + +// ************************************************************************************************* +// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb + +#ifndef STBI_NO_GIF +typedef struct +{ + stbi__int16 prefix; + stbi_uc first; + stbi_uc suffix; +} stbi__gif_lzw; + +typedef struct +{ + int w,h; + stbi_uc *out; // output buffer (always 4 components) + int flags, bgindex, ratio, transparent, eflags; + stbi_uc pal[256][4]; + stbi_uc lpal[256][4]; + stbi__gif_lzw codes[4096]; + stbi_uc *color_table; + int parse, step; + int lflags; + int start_x, start_y; + int max_x, max_y; + int cur_x, cur_y; + int line_size; +} stbi__gif; + +static int stbi__gif_test_raw(stbi__context *s) +{ + int sz; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0; + sz = stbi__get8(s); + if (sz != '9' && sz != '7') return 0; + if (stbi__get8(s) != 'a') return 0; + return 1; +} + +static int stbi__gif_test(stbi__context *s) +{ + int r = stbi__gif_test_raw(s); + stbi__rewind(s); + return r; +} + +static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp) +{ + int i; + for (i=0; i < num_entries; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + pal[i][3] = transp == i ? 0 : 255; + } +} + +static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info) +{ + stbi_uc version; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') + return stbi__err("not GIF", "Corrupt GIF"); + + version = stbi__get8(s); + if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); + if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); + + stbi__g_failure_reason = ""; + g->w = stbi__get16le(s); + g->h = stbi__get16le(s); + g->flags = stbi__get8(s); + g->bgindex = stbi__get8(s); + g->ratio = stbi__get8(s); + g->transparent = -1; + + if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments + + if (is_info) return 1; + + if (g->flags & 0x80) + stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); + + return 1; +} + +static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__gif g; + if (!stbi__gif_header(s, &g, comp, 1)) { + stbi__rewind( s ); + return 0; + } + if (x) *x = g.w; + if (y) *y = g.h; + return 1; +} + +static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) +{ + stbi_uc *p, *c; + + // recurse to decode the prefixes, since the linked-list is backwards, + // and working backwards through an interleaved image would be nasty + if (g->codes[code].prefix >= 0) + stbi__out_gif_code(g, g->codes[code].prefix); + + if (g->cur_y >= g->max_y) return; + + p = &g->out[g->cur_x + g->cur_y]; + c = &g->color_table[g->codes[code].suffix * 4]; + + if (c[3] >= 128) { + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } + g->cur_x += 4; + + if (g->cur_x >= g->max_x) { + g->cur_x = g->start_x; + g->cur_y += g->step; + + while (g->cur_y >= g->max_y && g->parse > 0) { + g->step = (1 << g->parse) * g->line_size; + g->cur_y = g->start_y + (g->step >> 1); + --g->parse; + } + } +} + +static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) +{ + stbi_uc lzw_cs; + stbi__int32 len, code; + stbi__uint32 first; + stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; + stbi__gif_lzw *p; + + lzw_cs = stbi__get8(s); + clear = 1 << lzw_cs; + first = 1; + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + bits = 0; + valid_bits = 0; + for (code = 0; code < clear; code++) { + g->codes[code].prefix = -1; + g->codes[code].first = (stbi_uc) code; + g->codes[code].suffix = (stbi_uc) code; + } + + // support no starting clear code + avail = clear+2; + oldcode = -1; + + len = 0; + for(;;) { + if (valid_bits < codesize) { + if (len == 0) { + len = stbi__get8(s); // start new block + if (len == 0) + return g->out; + } + --len; + bits |= (stbi__int32) stbi__get8(s) << valid_bits; + valid_bits += 8; + } else { + stbi__int32 code = bits & codemask; + bits >>= codesize; + valid_bits -= codesize; + // @OPTIMIZE: is there some way we can accelerate the non-clear path? + if (code == clear) { // clear code + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + avail = clear + 2; + oldcode = -1; + first = 0; + } else if (code == clear + 1) { // end of stream code + stbi__skip(s, len); + while ((len = stbi__get8(s)) > 0) + stbi__skip(s,len); + return g->out; + } else if (code <= avail) { + if (first) return stbi__errpuc("no clear code", "Corrupt GIF"); + + if (oldcode >= 0) { + p = &g->codes[avail++]; + if (avail > 4096) return stbi__errpuc("too many codes", "Corrupt GIF"); + p->prefix = (stbi__int16) oldcode; + p->first = g->codes[oldcode].first; + p->suffix = (code == avail) ? p->first : g->codes[code].first; + } else if (code == avail) + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + + stbi__out_gif_code(g, (stbi__uint16) code); + + if ((avail & codemask) == 0 && avail <= 0x0FFF) { + codesize++; + codemask = (1 << codesize) - 1; + } + + oldcode = code; + } else { + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + } + } + } +} + +static void stbi__fill_gif_background(stbi__gif *g) +{ + int i; + stbi_uc *c = g->pal[g->bgindex]; + // @OPTIMIZE: write a dword at a time + for (i = 0; i < g->w * g->h * 4; i += 4) { + stbi_uc *p = &g->out[i]; + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } +} + +// this function is designed to support animated gifs, although stb_image doesn't support it +static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp) +{ + int i; + stbi_uc *old_out = 0; + + if (g->out == 0) { + if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header + g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h); + if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory"); + stbi__fill_gif_background(g); + } else { + // animated-gif-only path + if (((g->eflags & 0x1C) >> 2) == 3) { + old_out = g->out; + g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h); + if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory"); + memcpy(g->out, old_out, g->w*g->h*4); + } + } + + for (;;) { + switch (stbi__get8(s)) { + case 0x2C: /* Image Descriptor */ + { + stbi__int32 x, y, w, h; + stbi_uc *o; + + x = stbi__get16le(s); + y = stbi__get16le(s); + w = stbi__get16le(s); + h = stbi__get16le(s); + if (((x + w) > (g->w)) || ((y + h) > (g->h))) + return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); + + g->line_size = g->w * 4; + g->start_x = x * 4; + g->start_y = y * g->line_size; + g->max_x = g->start_x + w * 4; + g->max_y = g->start_y + h * g->line_size; + g->cur_x = g->start_x; + g->cur_y = g->start_y; + + g->lflags = stbi__get8(s); + + if (g->lflags & 0x40) { + g->step = 8 * g->line_size; // first interlaced spacing + g->parse = 3; + } else { + g->step = g->line_size; + g->parse = 0; + } + + if (g->lflags & 0x80) { + stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); + g->color_table = (stbi_uc *) g->lpal; + } else if (g->flags & 0x80) { + for (i=0; i < 256; ++i) // @OPTIMIZE: stbi__jpeg_reset only the previous transparent + g->pal[i][3] = 255; + if (g->transparent >= 0 && (g->eflags & 0x01)) + g->pal[g->transparent][3] = 0; + g->color_table = (stbi_uc *) g->pal; + } else + return stbi__errpuc("missing color table", "Corrupt GIF"); + + o = stbi__process_gif_raster(s, g); + if (o == NULL) return NULL; + + if (req_comp && req_comp != 4) + o = stbi__convert_format(o, 4, req_comp, g->w, g->h); + return o; + } + + case 0x21: // Comment Extension. + { + int len; + if (stbi__get8(s) == 0xF9) { // Graphic Control Extension. + len = stbi__get8(s); + if (len == 4) { + g->eflags = stbi__get8(s); + stbi__get16le(s); // delay + g->transparent = stbi__get8(s); + } else { + stbi__skip(s, len); + break; + } + } + while ((len = stbi__get8(s)) != 0) + stbi__skip(s, len); + break; + } + + case 0x3B: // gif stream termination code + return (stbi_uc *) s; // using '1' causes warning on some compilers + + default: + return stbi__errpuc("unknown code", "Corrupt GIF"); + } + } +} + +static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi_uc *u = 0; + stbi__gif g; + memset(&g, 0, sizeof(g)); + + u = stbi__gif_load_next(s, &g, comp, req_comp); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + if (u) { + *x = g.w; + *y = g.h; + } + + return u; +} + +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) +{ + return stbi__gif_info_raw(s,x,y,comp); +} +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR loader +// originally by Nicolas Schulz +#ifndef STBI_NO_HDR +static int stbi__hdr_test_core(stbi__context *s) +{ + const char *signature = "#?RADIANCE\n"; + int i; + for (i=0; signature[i]; ++i) + if (stbi__get8(s) != signature[i]) + return 0; + return 1; +} + +static int stbi__hdr_test(stbi__context* s) +{ + int r = stbi__hdr_test_core(s); + stbi__rewind(s); + return r; +} + +#define STBI__HDR_BUFLEN 1024 +static char *stbi__hdr_gettoken(stbi__context *z, char *buffer) +{ + int len=0; + char c = '\0'; + + c = (char) stbi__get8(z); + + while (!stbi__at_eof(z) && c != '\n') { + buffer[len++] = c; + if (len == STBI__HDR_BUFLEN-1) { + // flush to end of line + while (!stbi__at_eof(z) && stbi__get8(z) != '\n') + ; + break; + } + c = (char) stbi__get8(z); + } + + buffer[len] = 0; + return buffer; +} + +static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) +{ + if ( input[3] != 0 ) { + float f1; + // Exponent + f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); + if (req_comp <= 2) + output[0] = (input[0] + input[1] + input[2]) * f1 / 3; + else { + output[0] = input[0] * f1; + output[1] = input[1] * f1; + output[2] = input[2] * f1; + } + if (req_comp == 2) output[1] = 1; + if (req_comp == 4) output[3] = 1; + } else { + switch (req_comp) { + case 4: output[3] = 1; /* fallthrough */ + case 3: output[0] = output[1] = output[2] = 0; + break; + case 2: output[1] = 1; /* fallthrough */ + case 1: output[0] = 0; + break; + } + } +} + +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int width, height; + stbi_uc *scanline; + float *hdr_data; + int len; + unsigned char count, value; + int i, j, k, c1,c2, z; + + + // Check identifier + if (strcmp(stbi__hdr_gettoken(s,buffer), "#?RADIANCE") != 0) + return stbi__errpf("not HDR", "Corrupt HDR image"); + + // Parse header + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format"); + + // Parse width and height + // can't use sscanf() if we're not using stdio! + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + height = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + width = (int) strtol(token, NULL, 10); + + *x = width; + *y = height; + + if (comp) *comp = 3; + if (req_comp == 0) req_comp = 3; + + // Read data + hdr_data = (float *) stbi__malloc(height * width * req_comp * sizeof(float)); + + // Load image data + // image data is stored as some number of sca + if ( width < 8 || width >= 32768) { + // Read flat data + for (j=0; j < height; ++j) { + for (i=0; i < width; ++i) { + stbi_uc rgbe[4]; + main_decode_loop: + stbi__getn(s, rgbe, 4); + stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); + } + } + } else { + // Read RLE-encoded data + scanline = NULL; + + for (j = 0; j < height; ++j) { + c1 = stbi__get8(s); + c2 = stbi__get8(s); + len = stbi__get8(s); + if (c1 != 2 || c2 != 2 || (len & 0x80)) { + // not run-length encoded, so we have to actually use THIS data as a decoded + // pixel (note this can't be a valid pixel--one of RGB must be >= 128) + stbi_uc rgbe[4]; + rgbe[0] = (stbi_uc) c1; + rgbe[1] = (stbi_uc) c2; + rgbe[2] = (stbi_uc) len; + rgbe[3] = (stbi_uc) stbi__get8(s); + stbi__hdr_convert(hdr_data, rgbe, req_comp); + i = 1; + j = 0; + STBI_FREE(scanline); + goto main_decode_loop; // yes, this makes no sense + } + len <<= 8; + len |= stbi__get8(s); + if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } + if (scanline == NULL) scanline = (stbi_uc *) stbi__malloc(width * 4); + + for (k = 0; k < 4; ++k) { + i = 0; + while (i < width) { + count = stbi__get8(s); + if (count > 128) { + // Run + value = stbi__get8(s); + count -= 128; + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = value; + } else { + // Dump + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = stbi__get8(s); + } + } + } + for (i=0; i < width; ++i) + stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); + } + STBI_FREE(scanline); + } + + return hdr_data; +} + +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + + if (strcmp(stbi__hdr_gettoken(s,buffer), "#?RADIANCE") != 0) { + stbi__rewind( s ); + return 0; + } + + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) { + stbi__rewind( s ); + return 0; + } + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *y = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *x = (int) strtol(token, NULL, 10); + *comp = 3; + return 1; +} +#endif // STBI_NO_HDR + +#ifndef STBI_NO_BMP +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) +{ + int hsz; + if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') { + stbi__rewind( s ); + return 0; + } + stbi__skip(s,12); + hsz = stbi__get32le(s); + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) { + stbi__rewind( s ); + return 0; + } + if (hsz == 12) { + *x = stbi__get16le(s); + *y = stbi__get16le(s); + } else { + *x = stbi__get32le(s); + *y = stbi__get32le(s); + } + if (stbi__get16le(s) != 1) { + stbi__rewind( s ); + return 0; + } + *comp = stbi__get16le(s) / 8; + return 1; +} +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) +{ + int channelCount; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + *y = stbi__get32be(s); + *x = stbi__get32be(s); + if (stbi__get16be(s) != 8) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 3) { + stbi__rewind( s ); + return 0; + } + *comp = 4; + return 1; +} +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) +{ + int act_comp=0,num_packets=0,chained; + stbi__pic_packet packets[10]; + + stbi__skip(s, 92); + + *x = stbi__get16be(s); + *y = stbi__get16be(s); + if (stbi__at_eof(s)) return 0; + if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { + stbi__rewind( s ); + return 0; + } + + stbi__skip(s, 8); + + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return 0; + + packet = &packets[num_packets++]; + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + act_comp |= packet->channel; + + if (stbi__at_eof(s)) { + stbi__rewind( s ); + return 0; + } + if (packet->size != 8) { + stbi__rewind( s ); + return 0; + } + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); + + return 1; +} +#endif + +// ************************************************************************************************* +// Portable Gray Map and Portable Pixel Map loader +// by Ken Miller +// +// PGM: http://netpbm.sourceforge.net/doc/pgm.html +// PPM: http://netpbm.sourceforge.net/doc/ppm.html +// +// Known limitations: +// Does not support comments in the header section +// Does not support ASCII image data (formats P2 and P3) +// Does not support 16-bit-per-channel + +#ifndef STBI_NO_PNM + +static int stbi__pnm_test(stbi__context *s) +{ + char p, t; + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind( s ); + return 0; + } + return 1; +} + +static stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi_uc *out; + if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n)) + return 0; + *x = s->img_x; + *y = s->img_y; + *comp = s->img_n; + + out = (stbi_uc *) stbi__malloc(s->img_n * s->img_x * s->img_y); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + stbi__getn(s, out, s->img_n * s->img_x * s->img_y); + + if (req_comp && req_comp != s->img_n) { + out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + return out; +} + +static int stbi__pnm_isspace(char c) +{ + return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; +} + +static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) +{ + while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) + *c = (char) stbi__get8(s); +} + +static int stbi__pnm_isdigit(char c) +{ + return c >= '0' && c <= '9'; +} + +static int stbi__pnm_getinteger(stbi__context *s, char *c) +{ + int value = 0; + + while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { + value = value*10 + (*c - '0'); + *c = (char) stbi__get8(s); + } + + return value; +} + +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) +{ + int maxv; + char c, p, t; + + stbi__rewind( s ); + + // Get identifier + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind( s ); + return 0; + } + + *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm + + c = (char) stbi__get8(s); + stbi__pnm_skip_whitespace(s, &c); + + *x = stbi__pnm_getinteger(s, &c); // read width + stbi__pnm_skip_whitespace(s, &c); + + *y = stbi__pnm_getinteger(s, &c); // read height + stbi__pnm_skip_whitespace(s, &c); + + maxv = stbi__pnm_getinteger(s, &c); // read max value + + if (maxv > 255) + return stbi__err("max value > 255", "PPM image not 8-bit"); + else + return 1; +} +#endif + +static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) +{ + #ifndef STBI_NO_JPEG + if (stbi__jpeg_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNG + if (stbi__png_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_GIF + if (stbi__gif_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_BMP + if (stbi__bmp_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PIC + if (stbi__pic_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNM + if (stbi__pnm_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_info(s, x, y, comp)) return 1; + #endif + + // test tga last because it's a crappy test! + #ifndef STBI_NO_TGA + if (stbi__tga_info(s, x, y, comp)) + return 1; + #endif + return stbi__err("unknown image type", "Image not of any known type, or corrupt"); +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_info_from_file(f, x, y, comp); + fclose(f); + return result; +} + +STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__info_main(&s,x,y,comp); + fseek(f,pos,SEEK_SET); + return r; +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__info_main(&s,x,y,comp); +} + +#endif // STB_IMAGE_IMPLEMENTATION + +/* + revision history: + 2.02 (2015-01-19) fix incorrect assert, fix warning + 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 + 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG + 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) + progressive JPEG (stb) + PGM/PPM support (Ken Miller) + STBI_MALLOC,STBI_REALLOC,STBI_FREE + GIF bugfix -- seemingly never worked + STBI_NO_*, STBI_ONLY_* + 1.48 (2014-12-14) fix incorrectly-named assert() + 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) + optimize PNG (ryg) + fix bug in interlaced PNG with user-specified channel count (stb) + 1.46 (2014-08-26) + fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG + 1.45 (2014-08-16) + fix MSVC-ARM internal compiler error by wrapping malloc + 1.44 (2014-08-07) + various warning fixes from Ronny Chevalier + 1.43 (2014-07-15) + fix MSVC-only compiler problem in code changed in 1.42 + 1.42 (2014-07-09) + don't define _CRT_SECURE_NO_WARNINGS (affects user code) + fixes to stbi__cleanup_jpeg path + added STBI_ASSERT to avoid requiring assert.h + 1.41 (2014-06-25) + fix search&replace from 1.36 that messed up comments/error messages + 1.40 (2014-06-22) + fix gcc struct-initialization warning + 1.39 (2014-06-15) + fix to TGA optimization when req_comp != number of components in TGA; + fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) + add support for BMP version 5 (more ignored fields) + 1.38 (2014-06-06) + suppress MSVC warnings on integer casts truncating values + fix accidental rename of 'skip' field of I/O + 1.37 (2014-06-04) + remove duplicate typedef + 1.36 (2014-06-03) + convert to header file single-file library + if de-iphone isn't set, load iphone images color-swapped instead of returning NULL + 1.35 (2014-05-27) + various warnings + fix broken STBI_SIMD path + fix bug where stbi_load_from_file no longer left file pointer in correct place + fix broken non-easy path for 32-bit BMP (possibly never used) + TGA optimization by Arseny Kapoulkine + 1.34 (unknown) + use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case + 1.33 (2011-07-14) + make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements + 1.32 (2011-07-13) + support for "info" function for all supported filetypes (SpartanJ) + 1.31 (2011-06-20) + a few more leak fixes, bug in PNG handling (SpartanJ) + 1.30 (2011-06-11) + added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) + removed deprecated format-specific test/load functions + removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway + error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) + fix inefficiency in decoding 32-bit BMP (David Woo) + 1.29 (2010-08-16) + various warning fixes from Aurelien Pocheville + 1.28 (2010-08-01) + fix bug in GIF palette transparency (SpartanJ) + 1.27 (2010-08-01) + cast-to-stbi_uc to fix warnings + 1.26 (2010-07-24) + fix bug in file buffering for PNG reported by SpartanJ + 1.25 (2010-07-17) + refix trans_data warning (Won Chun) + 1.24 (2010-07-12) + perf improvements reading from files on platforms with lock-heavy fgetc() + minor perf improvements for jpeg + deprecated type-specific functions so we'll get feedback if they're needed + attempt to fix trans_data warning (Won Chun) + 1.23 fixed bug in iPhone support + 1.22 (2010-07-10) + removed image *writing* support + stbi_info support from Jetro Lauha + GIF support from Jean-Marc Lienher + iPhone PNG-extensions from James Brown + warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) + 1.21 fix use of 'stbi_uc' in header (reported by jon blow) + 1.20 added support for Softimage PIC, by Tom Seddon + 1.19 bug in interlaced PNG corruption check (found by ryg) + 1.18 2008-08-02 + fix a threading bug (local mutable static) + 1.17 support interlaced PNG + 1.16 major bugfix - stbi__convert_format converted one too many pixels + 1.15 initialize some fields for thread safety + 1.14 fix threadsafe conversion bug + header-file-only version (#define STBI_HEADER_FILE_ONLY before including) + 1.13 threadsafe + 1.12 const qualifiers in the API + 1.11 Support installable IDCT, colorspace conversion routines + 1.10 Fixes for 64-bit (don't use "unsigned long") + optimized upsampling by Fabian "ryg" Giesen + 1.09 Fix format-conversion for PSD code (bad global variables!) + 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz + 1.07 attempt to fix C++ warning/errors again + 1.06 attempt to fix C++ warning/errors again + 1.05 fix TGA loading to return correct *comp and use good luminance calc + 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free + 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR + 1.02 support for (subset of) HDR files, float interface for preferred access to them + 1.01 fix bug: possible bug in handling right-side up bmps... not sure + fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all + 1.00 interface to zlib that skips zlib header + 0.99 correct handling of alpha in palette + 0.98 TGA loader by lonesock; dynamically add loaders (untested) + 0.97 jpeg errors on too large a file; also catch another malloc failure + 0.96 fix detection of invalid v value - particleman@mollyrocket forum + 0.95 during header scan, seek to markers in case of padding + 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same + 0.93 handle jpegtran output; verbose errors + 0.92 read 4,8,16,24,32-bit BMP files of several formats + 0.91 output 24-bit Windows 3.0 BMP files + 0.90 fix a few more warnings; bump version number to approach 1.0 + 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd + 0.60 fix compiling as c++ + 0.59 fix warnings: merge Dave Moore's -Wall fixes + 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian + 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available + 0.56 fix bug: zlib uncompressed mode len vs. nlen + 0.55 fix bug: restart_interval not initialized to 0 + 0.54 allow NULL for 'int *comp' + 0.53 fix bug in png 3->4; speedup png decoding + 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments + 0.51 obey req_comp requests, 1-component jpegs return as 1-component, + on 'test' only check type, not whether we support this variant + 0.50 first released version +*/ diff --git a/direct/src/plugin_npapi/npapi.h b/direct/src/plugin_npapi/npapi.h new file mode 100644 index 0000000000..f34603182d --- /dev/null +++ b/direct/src/plugin_npapi/npapi.h @@ -0,0 +1,928 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef npapi_h_ +#define npapi_h_ + +#if defined(__OS2__) +#pragma pack(1) +#endif + +#include "nptypes.h" + +#if defined(__OS2__) || defined(OS2) +#ifndef XP_OS2 +#define XP_OS2 1 +#endif +#endif + +#if defined(_WIN32) && !defined(__SYMBIAN32__) +#include +#ifndef XP_WIN +#define XP_WIN 1 +#endif +#endif + +#if defined(__SYMBIAN32__) +#ifndef XP_SYMBIAN +#define XP_SYMBIAN 1 +#undef XP_WIN +#endif +#endif + +#if defined(__APPLE_CC__) && !defined(XP_UNIX) +#ifndef XP_MACOSX +#define XP_MACOSX 1 +#endif +#endif + +#if defined(XP_MACOSX) +#if !defined(NP_NO_OPENGL) +#define NP_NO_OPENGL 1 +#endif /* !defined(NP_NO_OPENGL) */ +#if defined(__LP64__) +#define NP_NO_QUICKDRAW +#define NP_NO_CARBON +#endif /* defined(__LP64__) */ +#endif + +#if defined(XP_MACOSX) +#include +#if !NP_NO_OPENGL +#include +#endif /* !NP_NO_OPENGL */ +#ifndef NP_NO_CARBON +#include +#endif +#endif + +#if defined(XP_UNIX) +#include +#if defined(MOZ_X11) +#include +#include +#endif +#endif + +#if defined(XP_SYMBIAN) +#include +#include +#endif + +/*----------------------------------------------------------------------*/ +/* Plugin Version Constants */ +/*----------------------------------------------------------------------*/ + +#define NP_VERSION_MAJOR 0 +#define NP_VERSION_MINOR 28 + + +/* The OS/2 version of Netscape uses RC_DATA to define the + mime types, file extensions, etc that are required. + Use a vertical bar to separate types, end types with \0. + FileVersion and ProductVersion are 32bit ints, all other + entries are strings that MUST be terminated with a \0. + +AN EXAMPLE: + +RCDATA NP_INFO_ProductVersion { 1,0,0,1,} + +RCDATA NP_INFO_MIMEType { "video/x-video|", + "video/x-flick\0" } +RCDATA NP_INFO_FileExtents { "avi|", + "flc\0" } +RCDATA NP_INFO_FileOpenName{ "MMOS2 video player(*.avi)|", + "MMOS2 Flc/Fli player(*.flc)\0" } + +RCDATA NP_INFO_FileVersion { 1,0,0,1 } +RCDATA NP_INFO_CompanyName { "Netscape Communications\0" } +RCDATA NP_INFO_FileDescription { "NPAVI32 Extension DLL\0" +RCDATA NP_INFO_InternalName { "NPAVI32\0" ) +RCDATA NP_INFO_LegalCopyright { "Copyright Netscape Communications \251 1996\0" +RCDATA NP_INFO_OriginalFilename { "NVAPI32.DLL" } +RCDATA NP_INFO_ProductName { "NPAVI32 Dynamic Link Library\0" } +*/ +/* RC_DATA types for version info - required */ +#define NP_INFO_ProductVersion 1 +#define NP_INFO_MIMEType 2 +#define NP_INFO_FileOpenName 3 +#define NP_INFO_FileExtents 4 +/* RC_DATA types for version info - used if found */ +#define NP_INFO_FileDescription 5 +#define NP_INFO_ProductName 6 +/* RC_DATA types for version info - optional */ +#define NP_INFO_CompanyName 7 +#define NP_INFO_FileVersion 8 +#define NP_INFO_InternalName 9 +#define NP_INFO_LegalCopyright 10 +#define NP_INFO_OriginalFilename 11 + +#ifndef RC_INVOKED + +/*----------------------------------------------------------------------*/ +/* Definition of Basic Types */ +/*----------------------------------------------------------------------*/ + +typedef unsigned char NPBool; +typedef int16_t NPError; +typedef int16_t NPReason; +typedef char* NPMIMEType; + +/*----------------------------------------------------------------------*/ +/* Structures and definitions */ +/*----------------------------------------------------------------------*/ + +#if !defined(__LP64__) +#if defined(XP_MACOSX) +#pragma options align=mac68k +#endif +#endif /* __LP64__ */ + +/* + * NPP is a plug-in's opaque instance handle + */ +typedef struct _NPP +{ + void* pdata; /* plug-in private data */ + void* ndata; /* netscape private data */ +} NPP_t; + +typedef NPP_t* NPP; + +typedef struct _NPStream +{ + void* pdata; /* plug-in private data */ + void* ndata; /* netscape private data */ + const char* url; + uint32_t end; + uint32_t lastmodified; + void* notifyData; + const char* headers; /* Response headers from host. + * Exists only for >= NPVERS_HAS_RESPONSE_HEADERS. + * Used for HTTP only; NULL for non-HTTP. + * Available from NPP_NewStream onwards. + * Plugin should copy this data before storing it. + * Includes HTTP status line and all headers, + * preferably verbatim as received from server, + * headers formatted as in HTTP ("Header: Value"), + * and newlines (\n, NOT \r\n) separating lines. + * Terminated by \n\0 (NOT \n\n\0). */ +} NPStream; + +typedef struct _NPByteRange +{ + int32_t offset; /* negative offset means from the end */ + uint32_t length; + struct _NPByteRange* next; +} NPByteRange; + +typedef struct _NPSavedData +{ + int32_t len; + void* buf; +} NPSavedData; + +typedef struct _NPRect +{ + uint16_t top; + uint16_t left; + uint16_t bottom; + uint16_t right; +} NPRect; + +typedef struct _NPSize +{ + int32_t width; + int32_t height; +} NPSize; + +typedef enum { + NPFocusNext = 0, + NPFocusPrevious = 1 +} NPFocusDirection; + +/* Return values for NPP_HandleEvent */ +#define kNPEventNotHandled 0 +#define kNPEventHandled 1 +/* Exact meaning must be spec'd in event model. */ +#define kNPEventStartIME 2 + +#if defined(XP_UNIX) +/* + * Unix specific structures and definitions + */ + +/* + * Callback Structures. + * + * These are used to pass additional platform specific information. + */ +enum { + NP_SETWINDOW = 1, + NP_PRINT +}; + +typedef struct +{ + int32_t type; +} NPAnyCallbackStruct; + +typedef struct +{ + int32_t type; +#if defined(MOZ_X11) + Display* display; + Visual* visual; + Colormap colormap; + unsigned int depth; +#endif +} NPSetWindowCallbackStruct; + +typedef struct +{ + int32_t type; + FILE* fp; +} NPPrintCallbackStruct; + +#endif /* XP_UNIX */ + +typedef enum { + NPDrawingModelDUMMY +#if defined(XP_MACOSX) +#ifndef NP_NO_QUICKDRAW + , NPDrawingModelQuickDraw = 0 +#endif + , NPDrawingModelCoreGraphics = 1 + , NPDrawingModelOpenGL = 2 + , NPDrawingModelCoreAnimation = 3 + , NPDrawingModelInvalidatingCoreAnimation = 4 +#endif +#if defined(XP_WIN) + , NPDrawingModelSyncWin = 5 +#endif +#if defined(MOZ_X11) + , NPDrawingModelSyncX = 6 +#endif +#if 0 /* OBSOLETE */ + , NPDrawingModelAsyncBitmapSurfaceOBSOLETE = 7 +#if defined(XP_WIN) + , NPDrawingModelAsyncWindowsDXGISurfaceOBSOLETE = 8 +#endif +#endif +} NPDrawingModel; + +#ifdef XP_MACOSX +typedef enum { +#ifndef NP_NO_CARBON + NPEventModelCarbon = 0, +#endif + NPEventModelCocoa = 1 +} NPEventModel; +#endif + +/* + * The following masks are applied on certain platforms to NPNV and + * NPPV selectors that pass around pointers to COM interfaces. Newer + * compilers on some platforms may generate vtables that are not + * compatible with older compilers. To prevent older plugins from + * not understanding a new browser's ABI, these masks change the + * values of those selectors on those platforms. To remain backwards + * compatible with different versions of the browser, plugins can + * use these masks to dynamically determine and use the correct C++ + * ABI that the browser is expecting. This does not apply to Windows + * as Microsoft's COM ABI will likely not change. + */ + +#define NP_ABI_GCC3_MASK 0x10000000 +/* + * gcc 3.x generated vtables on UNIX and OSX are incompatible with + * previous compilers. + */ +#if (defined(XP_UNIX) && defined(__GNUC__) && (__GNUC__ >= 3)) +#define _NP_ABI_MIXIN_FOR_GCC3 NP_ABI_GCC3_MASK +#else +#define _NP_ABI_MIXIN_FOR_GCC3 0 +#endif + +#if defined(XP_MACOSX) +#define NP_ABI_MACHO_MASK 0x01000000 +#define _NP_ABI_MIXIN_FOR_MACHO NP_ABI_MACHO_MASK +#else +#define _NP_ABI_MIXIN_FOR_MACHO 0 +#endif + +#define NP_ABI_MASK (_NP_ABI_MIXIN_FOR_GCC3 | _NP_ABI_MIXIN_FOR_MACHO) + +/* + * List of variable names for which NPP_GetValue shall be implemented + */ +typedef enum { + NPPVpluginNameString = 1, + NPPVpluginDescriptionString, + NPPVpluginWindowBool, + NPPVpluginTransparentBool, + NPPVjavaClass, + NPPVpluginWindowSize, + NPPVpluginTimerInterval, + NPPVpluginScriptableInstance = (10 | NP_ABI_MASK), + NPPVpluginScriptableIID = 11, + NPPVjavascriptPushCallerBool = 12, + NPPVpluginKeepLibraryInMemory = 13, + NPPVpluginNeedsXEmbed = 14, + + /* Get the NPObject for scripting the plugin. Introduced in NPAPI minor version 14. + */ + NPPVpluginScriptableNPObject = 15, + + /* Get the plugin value (as \0-terminated UTF-8 string data) for + * form submission if the plugin is part of a form. Use + * NPN_MemAlloc() to allocate memory for the string data. Introduced + * in NPAPI minor version 15. + */ + NPPVformValue = 16, + + NPPVpluginUrlRequestsDisplayedBool = 17, + + /* Checks if the plugin is interested in receiving the http body of + * all http requests (including failed ones, http status != 200). + */ + NPPVpluginWantsAllNetworkStreams = 18, + + /* Browsers can retrieve a native ATK accessibility plug ID via this variable. */ + NPPVpluginNativeAccessibleAtkPlugId = 19, + + /* Checks to see if the plug-in would like the browser to load the "src" attribute. */ + NPPVpluginCancelSrcStream = 20, + + NPPVsupportsAdvancedKeyHandling = 21, + + NPPVpluginUsesDOMForCursorBool = 22, + + /* Used for negotiating drawing models */ + NPPVpluginDrawingModel = 1000 +#if defined(XP_MACOSX) + /* Used for negotiating event models */ + , NPPVpluginEventModel = 1001 + /* In the NPDrawingModelCoreAnimation drawing model, the browser asks the plug-in for a Core Animation layer. */ + , NPPVpluginCoreAnimationLayer = 1003 +#endif + +#if defined(MOZ_PLATFORM_MAEMO) && ((MOZ_PLATFORM_MAEMO == 5) || (MOZ_PLATFORM_MAEMO == 6)) + , NPPVpluginWindowlessLocalBool = 2002 +#endif +} NPPVariable; + +/* + * List of variable names for which NPN_GetValue should be implemented. + */ +typedef enum { + NPNVxDisplay = 1, + NPNVxtAppContext, + NPNVnetscapeWindow, + NPNVjavascriptEnabledBool, + NPNVasdEnabledBool, + NPNVisOfflineBool, + + NPNVserviceManager = (10 | NP_ABI_MASK), + NPNVDOMElement = (11 | NP_ABI_MASK), + NPNVDOMWindow = (12 | NP_ABI_MASK), + NPNVToolkit = (13 | NP_ABI_MASK), + NPNVSupportsXEmbedBool = 14, + + /* Get the NPObject wrapper for the browser window. */ + NPNVWindowNPObject = 15, + + /* Get the NPObject wrapper for the plugins DOM element. */ + NPNVPluginElementNPObject = 16, + + NPNVSupportsWindowless = 17, + + NPNVprivateModeBool = 18, + + NPNVsupportsAdvancedKeyHandling = 21, + + NPNVdocumentOrigin = 22, + + NPNVpluginDrawingModel = 1000 /* Get the current drawing model (NPDrawingModel) */ +#if defined(XP_MACOSX) + , NPNVcontentsScaleFactor = 1001 +#ifndef NP_NO_QUICKDRAW + , NPNVsupportsQuickDrawBool = 2000 +#endif + , NPNVsupportsCoreGraphicsBool = 2001 + , NPNVsupportsOpenGLBool = 2002 + , NPNVsupportsCoreAnimationBool = 2003 + , NPNVsupportsInvalidatingCoreAnimationBool = 2004 +#endif +#if 0 /* OBSOLETE */ + , NPNVsupportsAsyncBitmapSurfaceBoolOBSOLETE = 2007 +#if defined(XP_WIN) + , NPNVsupportsAsyncWindowsDXGISurfaceBoolOBSOLETE = 2008 +#endif +#endif +#if defined(XP_MACOSX) +#ifndef NP_NO_CARBON + , NPNVsupportsCarbonBool = 3000 /* TRUE if the browser supports the Carbon event model */ +#endif + , NPNVsupportsCocoaBool = 3001 /* TRUE if the browser supports the Cocoa event model */ + , NPNVsupportsUpdatedCocoaTextInputBool = 3002 /* TRUE if the browser supports the updated + Cocoa text input specification. */ + , NPNVsupportsCompositingCoreAnimationPluginsBool = 74656 /* TRUE if the browser supports + CA model compositing */ +#endif +#if defined(MOZ_PLATFORM_MAEMO) && ((MOZ_PLATFORM_MAEMO == 5) || (MOZ_PLATFORM_MAEMO == 6)) + , NPNVSupportsWindowlessLocal = 2002 +#endif +} NPNVariable; + +typedef enum { + NPNURLVCookie = 501, + NPNURLVProxy +} NPNURLVariable; + +/* + * The type of Toolkit the widgets use + */ +typedef enum { + NPNVGtk12 = 1, + NPNVGtk2 +} NPNToolkitType; + +/* + * The type of a NPWindow - it specifies the type of the data structure + * returned in the window field. + */ +typedef enum { + NPWindowTypeWindow = 1, + NPWindowTypeDrawable +} NPWindowType; + +typedef struct _NPWindow +{ + void* window; /* Platform specific window handle */ + /* OS/2: x - Position of bottom left corner */ + /* OS/2: y - relative to visible netscape window */ + int32_t x; /* Position of top left corner relative */ + int32_t y; /* to a netscape page. */ + uint32_t width; /* Maximum window size */ + uint32_t height; + NPRect clipRect; /* Clipping rectangle in port coordinates */ +#if (defined(XP_UNIX) || defined(XP_SYMBIAN)) && !defined(XP_MACOSX) + void * ws_info; /* Platform-dependent additional data */ +#endif /* XP_UNIX */ + NPWindowType type; /* Is this a window or a drawable? */ +} NPWindow; + +typedef struct _NPImageExpose +{ + char* data; /* image pointer */ + int32_t stride; /* Stride of data image pointer */ + int32_t depth; /* Depth of image pointer */ + int32_t x; /* Expose x */ + int32_t y; /* Expose y */ + uint32_t width; /* Expose width */ + uint32_t height; /* Expose height */ + NPSize dataSize; /* Data buffer size */ + float translateX; /* translate X matrix value */ + float translateY; /* translate Y matrix value */ + float scaleX; /* scale X matrix value */ + float scaleY; /* scale Y matrix value */ +} NPImageExpose; + +typedef struct _NPFullPrint +{ + NPBool pluginPrinted;/* Set TRUE if plugin handled fullscreen printing */ + NPBool printOne; /* TRUE if plugin should print one copy to default + printer */ + void* platformPrint; /* Platform-specific printing info */ +} NPFullPrint; + +typedef struct _NPEmbedPrint +{ + NPWindow window; + void* platformPrint; /* Platform-specific printing info */ +} NPEmbedPrint; + +typedef struct _NPPrint +{ + uint16_t mode; /* NP_FULL or NP_EMBED */ + union + { + NPFullPrint fullPrint; /* if mode is NP_FULL */ + NPEmbedPrint embedPrint; /* if mode is NP_EMBED */ + } print; +} NPPrint; + +#if defined(XP_MACOSX) +#ifndef NP_NO_CARBON +typedef EventRecord NPEvent; +#endif +#elif defined(XP_SYMBIAN) +typedef QEvent NPEvent; +#elif defined(XP_WIN) +typedef struct _NPEvent +{ + uint16_t event; + uintptr_t wParam; + uintptr_t lParam; +} NPEvent; +#elif defined(XP_OS2) +typedef struct _NPEvent +{ + uint32_t event; + uint32_t wParam; + uint32_t lParam; +} NPEvent; +#elif defined(XP_UNIX) && defined(MOZ_X11) +typedef XEvent NPEvent; +#else +typedef void* NPEvent; +#endif + +#if defined(XP_MACOSX) +typedef void* NPRegion; +#ifndef NP_NO_QUICKDRAW +typedef RgnHandle NPQDRegion; +#endif +typedef CGPathRef NPCGRegion; +#elif defined(XP_WIN) +typedef HRGN NPRegion; +#elif defined(XP_UNIX) && defined(MOZ_X11) +typedef Region NPRegion; +#elif defined(XP_SYMBIAN) +typedef QRegion* NPRegion; +#else +typedef void *NPRegion; +#endif + +typedef struct _NPNSString NPNSString; +typedef struct _NPNSWindow NPNSWindow; +typedef struct _NPNSMenu NPNSMenu; + +#if defined(XP_MACOSX) +typedef NPNSMenu NPMenu; +#else +typedef void *NPMenu; +#endif + +typedef enum { + NPCoordinateSpacePlugin = 1, + NPCoordinateSpaceWindow, + NPCoordinateSpaceFlippedWindow, + NPCoordinateSpaceScreen, + NPCoordinateSpaceFlippedScreen +} NPCoordinateSpace; + +#if defined(XP_MACOSX) + +#ifndef NP_NO_QUICKDRAW +typedef struct NP_Port +{ + CGrafPtr port; + int32_t portx; /* position inside the topmost window */ + int32_t porty; +} NP_Port; +#endif /* NP_NO_QUICKDRAW */ + +/* + * NP_CGContext is the type of the NPWindow's 'window' when the plugin specifies NPDrawingModelCoreGraphics + * as its drawing model. + */ + +typedef struct NP_CGContext +{ + CGContextRef context; + void *window; /* A WindowRef under the Carbon event model. */ +} NP_CGContext; + +/* + * NP_GLContext is the type of the NPWindow's 'window' when the plugin specifies NPDrawingModelOpenGL as its + * drawing model. + */ + +#if !NP_NO_OPENGL +typedef struct NP_GLContext +{ + CGLContextObj context; +#ifdef NP_NO_CARBON + NPNSWindow *window; +#else + void *window; /* Can be either an NSWindow or a WindowRef depending on the event model */ +#endif +} NP_GLContext; +#endif /* !NP_NO_OPENGL */ + +typedef enum { + NPCocoaEventDrawRect = 1, + NPCocoaEventMouseDown, + NPCocoaEventMouseUp, + NPCocoaEventMouseMoved, + NPCocoaEventMouseEntered, + NPCocoaEventMouseExited, + NPCocoaEventMouseDragged, + NPCocoaEventKeyDown, + NPCocoaEventKeyUp, + NPCocoaEventFlagsChanged, + NPCocoaEventFocusChanged, + NPCocoaEventWindowFocusChanged, + NPCocoaEventScrollWheel, + NPCocoaEventTextInput +} NPCocoaEventType; + +typedef struct _NPCocoaEvent { + NPCocoaEventType type; + uint32_t version; + union { + struct { + uint32_t modifierFlags; + double pluginX; + double pluginY; + int32_t buttonNumber; + int32_t clickCount; + double deltaX; + double deltaY; + double deltaZ; + } mouse; + struct { + uint32_t modifierFlags; + NPNSString *characters; + NPNSString *charactersIgnoringModifiers; + NPBool isARepeat; + uint16_t keyCode; + } key; + struct { + CGContextRef context; + double x; + double y; + double width; + double height; + } draw; + struct { + NPBool hasFocus; + } focus; + struct { + NPNSString *text; + } text; + } data; +} NPCocoaEvent; + +#ifndef NP_NO_CARBON +/* Non-standard event types that can be passed to HandleEvent */ +enum NPEventType { + NPEventType_GetFocusEvent = (osEvt + 16), + NPEventType_LoseFocusEvent, + NPEventType_AdjustCursorEvent, + NPEventType_MenuCommandEvent, + NPEventType_ClippingChangedEvent, + NPEventType_ScrollingBeginsEvent = 1000, + NPEventType_ScrollingEndsEvent +}; +#endif /* NP_NO_CARBON */ + +#endif /* XP_MACOSX */ + +/* + * Values for mode passed to NPP_New: + */ +#define NP_EMBED 1 +#define NP_FULL 2 + +/* + * Values for stream type passed to NPP_NewStream: + */ +#define NP_NORMAL 1 +#define NP_SEEK 2 +#define NP_ASFILE 3 +#define NP_ASFILEONLY 4 + +#define NP_MAXREADY (((unsigned)(~0)<<1)>>1) + +/* + * Flags for NPP_ClearSiteData. + */ +#define NP_CLEAR_ALL 0 +#define NP_CLEAR_CACHE (1 << 0) + +#if !defined(__LP64__) +#if defined(XP_MACOSX) +#pragma options align=reset +#endif +#endif /* __LP64__ */ + +/*----------------------------------------------------------------------*/ +/* Error and Reason Code definitions */ +/*----------------------------------------------------------------------*/ + +/* + * Values of type NPError: + */ +#define NPERR_BASE 0 +#define NPERR_NO_ERROR (NPERR_BASE + 0) +#define NPERR_GENERIC_ERROR (NPERR_BASE + 1) +#define NPERR_INVALID_INSTANCE_ERROR (NPERR_BASE + 2) +#define NPERR_INVALID_FUNCTABLE_ERROR (NPERR_BASE + 3) +#define NPERR_MODULE_LOAD_FAILED_ERROR (NPERR_BASE + 4) +#define NPERR_OUT_OF_MEMORY_ERROR (NPERR_BASE + 5) +#define NPERR_INVALID_PLUGIN_ERROR (NPERR_BASE + 6) +#define NPERR_INVALID_PLUGIN_DIR_ERROR (NPERR_BASE + 7) +#define NPERR_INCOMPATIBLE_VERSION_ERROR (NPERR_BASE + 8) +#define NPERR_INVALID_PARAM (NPERR_BASE + 9) +#define NPERR_INVALID_URL (NPERR_BASE + 10) +#define NPERR_FILE_NOT_FOUND (NPERR_BASE + 11) +#define NPERR_NO_DATA (NPERR_BASE + 12) +#define NPERR_STREAM_NOT_SEEKABLE (NPERR_BASE + 13) +#define NPERR_TIME_RANGE_NOT_SUPPORTED (NPERR_BASE + 14) +#define NPERR_MALFORMED_SITE (NPERR_BASE + 15) + +/* + * Values of type NPReason: + */ +#define NPRES_BASE 0 +#define NPRES_DONE (NPRES_BASE + 0) +#define NPRES_NETWORK_ERR (NPRES_BASE + 1) +#define NPRES_USER_BREAK (NPRES_BASE + 2) + +/* + * Don't use these obsolete error codes any more. + */ +#define NP_NOERR NP_NOERR_is_obsolete_use_NPERR_NO_ERROR +#define NP_EINVAL NP_EINVAL_is_obsolete_use_NPERR_GENERIC_ERROR +#define NP_EABORT NP_EABORT_is_obsolete_use_NPRES_USER_BREAK + +/* + * Version feature information + */ +#define NPVERS_HAS_STREAMOUTPUT 8 +#define NPVERS_HAS_NOTIFICATION 9 +#define NPVERS_HAS_LIVECONNECT 9 +#define NPVERS_68K_HAS_LIVECONNECT 11 +#define NPVERS_HAS_WINDOWLESS 11 +#define NPVERS_HAS_XPCONNECT_SCRIPTING 13 +#define NPVERS_HAS_NPRUNTIME_SCRIPTING 14 +#define NPVERS_HAS_FORM_VALUES 15 +#define NPVERS_HAS_POPUPS_ENABLED_STATE 16 +#define NPVERS_HAS_RESPONSE_HEADERS 17 +#define NPVERS_HAS_NPOBJECT_ENUM 18 +#define NPVERS_HAS_PLUGIN_THREAD_ASYNC_CALL 19 +#define NPVERS_HAS_ALL_NETWORK_STREAMS 20 +#define NPVERS_HAS_URL_AND_AUTH_INFO 21 +#define NPVERS_HAS_PRIVATE_MODE 22 +#define NPVERS_MACOSX_HAS_COCOA_EVENTS 23 +#define NPVERS_HAS_ADVANCED_KEY_HANDLING 25 +#define NPVERS_HAS_URL_REDIRECT_HANDLING 26 +#define NPVERS_HAS_CLEAR_SITE_DATA 27 + +/*----------------------------------------------------------------------*/ +/* Function Prototypes */ +/*----------------------------------------------------------------------*/ + +#if defined(__OS2__) +#define NP_LOADDS _System +#else +#define NP_LOADDS +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* NPP_* functions are provided by the plugin and called by the navigator. */ + +#if defined(XP_UNIX) +const char* NPP_GetMIMEDescription(void); +#endif + +NPError NP_LOADDS NPP_New(NPMIMEType pluginType, NPP instance, + uint16_t mode, int16_t argc, char* argn[], + char* argv[], NPSavedData* saved); +NPError NP_LOADDS NPP_Destroy(NPP instance, NPSavedData** save); +NPError NP_LOADDS NPP_SetWindow(NPP instance, NPWindow* window); +NPError NP_LOADDS NPP_NewStream(NPP instance, NPMIMEType type, + NPStream* stream, NPBool seekable, + uint16_t* stype); +NPError NP_LOADDS NPP_DestroyStream(NPP instance, NPStream* stream, + NPReason reason); +int32_t NP_LOADDS NPP_WriteReady(NPP instance, NPStream* stream); +int32_t NP_LOADDS NPP_Write(NPP instance, NPStream* stream, int32_t offset, + int32_t len, void* buffer); +void NP_LOADDS NPP_StreamAsFile(NPP instance, NPStream* stream, + const char* fname); +void NP_LOADDS NPP_Print(NPP instance, NPPrint* platformPrint); +int16_t NP_LOADDS NPP_HandleEvent(NPP instance, void* event); +void NP_LOADDS NPP_URLNotify(NPP instance, const char* url, + NPReason reason, void* notifyData); +NPError NP_LOADDS NPP_GetValue(NPP instance, NPPVariable variable, void *value); +NPError NP_LOADDS NPP_SetValue(NPP instance, NPNVariable variable, void *value); +NPBool NP_LOADDS NPP_GotFocus(NPP instance, NPFocusDirection direction); +void NP_LOADDS NPP_LostFocus(NPP instance); +void NP_LOADDS NPP_URLRedirectNotify(NPP instance, const char* url, int32_t status, void* notifyData); +NPError NP_LOADDS NPP_ClearSiteData(const char* site, uint64_t flags, uint64_t maxAge); +char** NP_LOADDS NPP_GetSitesWithData(void); +void NP_LOADDS NPP_DidComposite(NPP instance); + +/* NPN_* functions are provided by the navigator and called by the plugin. */ +void NP_LOADDS NPN_Version(int* plugin_major, int* plugin_minor, + int* netscape_major, int* netscape_minor); +NPError NP_LOADDS NPN_GetURLNotify(NPP instance, const char* url, + const char* target, void* notifyData); +NPError NP_LOADDS NPN_GetURL(NPP instance, const char* url, + const char* target); +NPError NP_LOADDS NPN_PostURLNotify(NPP instance, const char* url, + const char* target, uint32_t len, + const char* buf, NPBool file, + void* notifyData); +NPError NP_LOADDS NPN_PostURL(NPP instance, const char* url, + const char* target, uint32_t len, + const char* buf, NPBool file); +NPError NP_LOADDS NPN_RequestRead(NPStream* stream, NPByteRange* rangeList); +NPError NP_LOADDS NPN_NewStream(NPP instance, NPMIMEType type, + const char* target, NPStream** stream); +int32_t NP_LOADDS NPN_Write(NPP instance, NPStream* stream, int32_t len, + void* buffer); +NPError NP_LOADDS NPN_DestroyStream(NPP instance, NPStream* stream, + NPReason reason); +void NP_LOADDS NPN_Status(NPP instance, const char* message); +const char* NP_LOADDS NPN_UserAgent(NPP instance); +void* NP_LOADDS NPN_MemAlloc(uint32_t size); +void NP_LOADDS NPN_MemFree(void* ptr); +uint32_t NP_LOADDS NPN_MemFlush(uint32_t size); +void NP_LOADDS NPN_ReloadPlugins(NPBool reloadPages); +NPError NP_LOADDS NPN_GetValue(NPP instance, NPNVariable variable, + void *value); +NPError NP_LOADDS NPN_SetValue(NPP instance, NPPVariable variable, + void *value); +void NP_LOADDS NPN_InvalidateRect(NPP instance, NPRect *invalidRect); +void NP_LOADDS NPN_InvalidateRegion(NPP instance, + NPRegion invalidRegion); +void NP_LOADDS NPN_ForceRedraw(NPP instance); +void NP_LOADDS NPN_PushPopupsEnabledState(NPP instance, NPBool enabled); +void NP_LOADDS NPN_PopPopupsEnabledState(NPP instance); +void NP_LOADDS NPN_PluginThreadAsyncCall(NPP instance, + void (*func) (void *), + void *userData); +NPError NP_LOADDS NPN_GetValueForURL(NPP instance, NPNURLVariable variable, + const char *url, char **value, + uint32_t *len); +NPError NP_LOADDS NPN_SetValueForURL(NPP instance, NPNURLVariable variable, + const char *url, const char *value, + uint32_t len); +NPError NP_LOADDS NPN_GetAuthenticationInfo(NPP instance, + const char *protocol, + const char *host, int32_t port, + const char *scheme, + const char *realm, + char **username, uint32_t *ulen, + char **password, + uint32_t *plen); +uint32_t NP_LOADDS NPN_ScheduleTimer(NPP instance, uint32_t interval, NPBool repeat, void (*timerFunc)(NPP npp, uint32_t timerID)); +void NP_LOADDS NPN_UnscheduleTimer(NPP instance, uint32_t timerID); +NPError NP_LOADDS NPN_PopUpContextMenu(NPP instance, NPMenu* menu); +NPBool NP_LOADDS NPN_ConvertPoint(NPP instance, double sourceX, double sourceY, NPCoordinateSpace sourceSpace, double *destX, double *destY, NPCoordinateSpace destSpace); +NPBool NP_LOADDS NPN_HandleEvent(NPP instance, void *event, NPBool handled); +NPBool NP_LOADDS NPN_UnfocusInstance(NPP instance, NPFocusDirection direction); +void NP_LOADDS NPN_URLRedirectResponse(NPP instance, void* notifyData, NPBool allow); + +#ifdef __cplusplus +} /* end extern "C" */ +#endif + +#endif /* RC_INVOKED */ +#if defined(__OS2__) +#pragma pack() +#endif + +#endif /* npapi_h_ */ diff --git a/direct/src/plugin_npapi/npfunctions.h b/direct/src/plugin_npapi/npfunctions.h new file mode 100644 index 0000000000..a40e402dca --- /dev/null +++ b/direct/src/plugin_npapi/npfunctions.h @@ -0,0 +1,329 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef npfunctions_h_ +#define npfunctions_h_ + +#ifdef __OS2__ +#pragma pack(1) +#define NP_LOADDS _System +#else +#define NP_LOADDS +#endif + +#include "npapi.h" +#include "npruntime.h" + +typedef NPError (* NP_LOADDS NPP_NewProcPtr)(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* saved); +typedef NPError (* NP_LOADDS NPP_DestroyProcPtr)(NPP instance, NPSavedData** save); +typedef NPError (* NP_LOADDS NPP_SetWindowProcPtr)(NPP instance, NPWindow* window); +typedef NPError (* NP_LOADDS NPP_NewStreamProcPtr)(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16_t* stype); +typedef NPError (* NP_LOADDS NPP_DestroyStreamProcPtr)(NPP instance, NPStream* stream, NPReason reason); +typedef int32_t (* NP_LOADDS NPP_WriteReadyProcPtr)(NPP instance, NPStream* stream); +typedef int32_t (* NP_LOADDS NPP_WriteProcPtr)(NPP instance, NPStream* stream, int32_t offset, int32_t len, void* buffer); +typedef void (* NP_LOADDS NPP_StreamAsFileProcPtr)(NPP instance, NPStream* stream, const char* fname); +typedef void (* NP_LOADDS NPP_PrintProcPtr)(NPP instance, NPPrint* platformPrint); +typedef int16_t (* NP_LOADDS NPP_HandleEventProcPtr)(NPP instance, void* event); +typedef void (* NP_LOADDS NPP_URLNotifyProcPtr)(NPP instance, const char* url, NPReason reason, void* notifyData); +/* Any NPObjects returned to the browser via NPP_GetValue should be retained + by the plugin on the way out. The browser is responsible for releasing. */ +typedef NPError (* NP_LOADDS NPP_GetValueProcPtr)(NPP instance, NPPVariable variable, void *ret_value); +typedef NPError (* NP_LOADDS NPP_SetValueProcPtr)(NPP instance, NPNVariable variable, void *value); +typedef NPBool (* NP_LOADDS NPP_GotFocusPtr)(NPP instance, NPFocusDirection direction); +typedef void (* NP_LOADDS NPP_LostFocusPtr)(NPP instance); +typedef void (* NP_LOADDS NPP_URLRedirectNotifyPtr)(NPP instance, const char* url, int32_t status, void* notifyData); +typedef NPError (* NP_LOADDS NPP_ClearSiteDataPtr)(const char* site, uint64_t flags, uint64_t maxAge); +typedef char** (* NP_LOADDS NPP_GetSitesWithDataPtr)(void); +typedef void (* NP_LOADDS NPP_DidCompositePtr)(NPP instance); + +typedef NPError (* NP_LOADDS NPN_GetValueProcPtr)(NPP instance, NPNVariable variable, void *ret_value); +typedef NPError (* NP_LOADDS NPN_SetValueProcPtr)(NPP instance, NPPVariable variable, void *value); +typedef NPError (* NP_LOADDS NPN_GetURLNotifyProcPtr)(NPP instance, const char* url, const char* window, void* notifyData); +typedef NPError (* NP_LOADDS NPN_PostURLNotifyProcPtr)(NPP instance, const char* url, const char* window, uint32_t len, const char* buf, NPBool file, void* notifyData); +typedef NPError (* NP_LOADDS NPN_GetURLProcPtr)(NPP instance, const char* url, const char* window); +typedef NPError (* NP_LOADDS NPN_PostURLProcPtr)(NPP instance, const char* url, const char* window, uint32_t len, const char* buf, NPBool file); +typedef NPError (* NP_LOADDS NPN_RequestReadProcPtr)(NPStream* stream, NPByteRange* rangeList); +typedef NPError (* NP_LOADDS NPN_NewStreamProcPtr)(NPP instance, NPMIMEType type, const char* window, NPStream** stream); +typedef int32_t (* NP_LOADDS NPN_WriteProcPtr)(NPP instance, NPStream* stream, int32_t len, void* buffer); +typedef NPError (* NP_LOADDS NPN_DestroyStreamProcPtr)(NPP instance, NPStream* stream, NPReason reason); +typedef void (* NP_LOADDS NPN_StatusProcPtr)(NPP instance, const char* message); +/* Browser manages the lifetime of the buffer returned by NPN_UserAgent, don't + depend on it sticking around and don't free it. */ +typedef const char* (* NP_LOADDS NPN_UserAgentProcPtr)(NPP instance); +typedef void* (* NP_LOADDS NPN_MemAllocProcPtr)(uint32_t size); +typedef void (* NP_LOADDS NPN_MemFreeProcPtr)(void* ptr); +typedef uint32_t (* NP_LOADDS NPN_MemFlushProcPtr)(uint32_t size); +typedef void (* NP_LOADDS NPN_ReloadPluginsProcPtr)(NPBool reloadPages); +typedef void* (* NP_LOADDS NPN_GetJavaEnvProcPtr)(void); +typedef void* (* NP_LOADDS NPN_GetJavaPeerProcPtr)(NPP instance); +typedef void (* NP_LOADDS NPN_InvalidateRectProcPtr)(NPP instance, NPRect *rect); +typedef void (* NP_LOADDS NPN_InvalidateRegionProcPtr)(NPP instance, NPRegion region); +typedef void (* NP_LOADDS NPN_ForceRedrawProcPtr)(NPP instance); +typedef NPIdentifier (* NP_LOADDS NPN_GetStringIdentifierProcPtr)(const NPUTF8* name); +typedef void (* NP_LOADDS NPN_GetStringIdentifiersProcPtr)(const NPUTF8** names, int32_t nameCount, NPIdentifier* identifiers); +typedef NPIdentifier (* NP_LOADDS NPN_GetIntIdentifierProcPtr)(int32_t intid); +typedef bool (* NP_LOADDS NPN_IdentifierIsStringProcPtr)(NPIdentifier identifier); +typedef NPUTF8* (* NP_LOADDS NPN_UTF8FromIdentifierProcPtr)(NPIdentifier identifier); +typedef int32_t (* NP_LOADDS NPN_IntFromIdentifierProcPtr)(NPIdentifier identifier); +typedef NPObject* (* NP_LOADDS NPN_CreateObjectProcPtr)(NPP npp, NPClass *aClass); +typedef NPObject* (* NP_LOADDS NPN_RetainObjectProcPtr)(NPObject *obj); +typedef void (* NP_LOADDS NPN_ReleaseObjectProcPtr)(NPObject *obj); +typedef bool (* NP_LOADDS NPN_InvokeProcPtr)(NPP npp, NPObject* obj, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result); +typedef bool (* NP_LOADDS NPN_InvokeDefaultProcPtr)(NPP npp, NPObject* obj, const NPVariant *args, uint32_t argCount, NPVariant *result); +typedef bool (* NP_LOADDS NPN_EvaluateProcPtr)(NPP npp, NPObject *obj, NPString *script, NPVariant *result); +typedef bool (* NP_LOADDS NPN_GetPropertyProcPtr)(NPP npp, NPObject *obj, NPIdentifier propertyName, NPVariant *result); +typedef bool (* NP_LOADDS NPN_SetPropertyProcPtr)(NPP npp, NPObject *obj, NPIdentifier propertyName, const NPVariant *value); +typedef bool (* NP_LOADDS NPN_RemovePropertyProcPtr)(NPP npp, NPObject *obj, NPIdentifier propertyName); +typedef bool (* NP_LOADDS NPN_HasPropertyProcPtr)(NPP npp, NPObject *obj, NPIdentifier propertyName); +typedef bool (* NP_LOADDS NPN_HasMethodProcPtr)(NPP npp, NPObject *obj, NPIdentifier propertyName); +typedef void (* NP_LOADDS NPN_ReleaseVariantValueProcPtr)(NPVariant *variant); +typedef void (* NP_LOADDS NPN_SetExceptionProcPtr)(NPObject *obj, const NPUTF8 *message); +typedef void (* NP_LOADDS NPN_PushPopupsEnabledStateProcPtr)(NPP npp, NPBool enabled); +typedef void (* NP_LOADDS NPN_PopPopupsEnabledStateProcPtr)(NPP npp); +typedef bool (* NP_LOADDS NPN_EnumerateProcPtr)(NPP npp, NPObject *obj, NPIdentifier **identifier, uint32_t *count); +typedef void (* NP_LOADDS NPN_PluginThreadAsyncCallProcPtr)(NPP instance, void (*func)(void *), void *userData); +typedef bool (* NP_LOADDS NPN_ConstructProcPtr)(NPP npp, NPObject* obj, const NPVariant *args, uint32_t argCount, NPVariant *result); +typedef NPError (* NP_LOADDS NPN_GetValueForURLPtr)(NPP npp, NPNURLVariable variable, const char *url, char **value, uint32_t *len); +typedef NPError (* NP_LOADDS NPN_SetValueForURLPtr)(NPP npp, NPNURLVariable variable, const char *url, const char *value, uint32_t len); +typedef NPError (* NP_LOADDS NPN_GetAuthenticationInfoPtr)(NPP npp, const char *protocol, const char *host, int32_t port, const char *scheme, const char *realm, char **username, uint32_t *ulen, char **password, uint32_t *plen); +typedef uint32_t (* NP_LOADDS NPN_ScheduleTimerPtr)(NPP instance, uint32_t interval, NPBool repeat, void (*timerFunc)(NPP npp, uint32_t timerID)); +typedef void (* NP_LOADDS NPN_UnscheduleTimerPtr)(NPP instance, uint32_t timerID); +typedef NPError (* NP_LOADDS NPN_PopUpContextMenuPtr)(NPP instance, NPMenu* menu); +typedef NPBool (* NP_LOADDS NPN_ConvertPointPtr)(NPP instance, double sourceX, double sourceY, NPCoordinateSpace sourceSpace, double *destX, double *destY, NPCoordinateSpace destSpace); +typedef NPBool (* NP_LOADDS NPN_HandleEventPtr)(NPP instance, void *event, NPBool handled); +typedef NPBool (* NP_LOADDS NPN_UnfocusInstancePtr)(NPP instance, NPFocusDirection direction); +typedef void (* NP_LOADDS NPN_URLRedirectResponsePtr)(NPP instance, void* notifyData, NPBool allow); + +typedef void (* NP_LOADDS NPN_DummyPtr)(void); + +typedef struct _NPPluginFuncs { + uint16_t size; + uint16_t version; + NPP_NewProcPtr newp; + NPP_DestroyProcPtr destroy; + NPP_SetWindowProcPtr setwindow; + NPP_NewStreamProcPtr newstream; + NPP_DestroyStreamProcPtr destroystream; + NPP_StreamAsFileProcPtr asfile; + NPP_WriteReadyProcPtr writeready; + NPP_WriteProcPtr write; + NPP_PrintProcPtr print; + NPP_HandleEventProcPtr event; + NPP_URLNotifyProcPtr urlnotify; + void* javaClass; + NPP_GetValueProcPtr getvalue; + NPP_SetValueProcPtr setvalue; + NPP_GotFocusPtr gotfocus; + NPP_LostFocusPtr lostfocus; + NPP_URLRedirectNotifyPtr urlredirectnotify; + NPP_ClearSiteDataPtr clearsitedata; + NPP_GetSitesWithDataPtr getsiteswithdata; + NPP_DidCompositePtr didComposite; +} NPPluginFuncs; + +typedef struct _NPNetscapeFuncs { + uint16_t size; + uint16_t version; + NPN_GetURLProcPtr geturl; + NPN_PostURLProcPtr posturl; + NPN_RequestReadProcPtr requestread; + NPN_NewStreamProcPtr newstream; + NPN_WriteProcPtr write; + NPN_DestroyStreamProcPtr destroystream; + NPN_StatusProcPtr status; + NPN_UserAgentProcPtr uagent; + NPN_MemAllocProcPtr memalloc; + NPN_MemFreeProcPtr memfree; + NPN_MemFlushProcPtr memflush; + NPN_ReloadPluginsProcPtr reloadplugins; + NPN_GetJavaEnvProcPtr getJavaEnv; + NPN_GetJavaPeerProcPtr getJavaPeer; + NPN_GetURLNotifyProcPtr geturlnotify; + NPN_PostURLNotifyProcPtr posturlnotify; + NPN_GetValueProcPtr getvalue; + NPN_SetValueProcPtr setvalue; + NPN_InvalidateRectProcPtr invalidaterect; + NPN_InvalidateRegionProcPtr invalidateregion; + NPN_ForceRedrawProcPtr forceredraw; + NPN_GetStringIdentifierProcPtr getstringidentifier; + NPN_GetStringIdentifiersProcPtr getstringidentifiers; + NPN_GetIntIdentifierProcPtr getintidentifier; + NPN_IdentifierIsStringProcPtr identifierisstring; + NPN_UTF8FromIdentifierProcPtr utf8fromidentifier; + NPN_IntFromIdentifierProcPtr intfromidentifier; + NPN_CreateObjectProcPtr createobject; + NPN_RetainObjectProcPtr retainobject; + NPN_ReleaseObjectProcPtr releaseobject; + NPN_InvokeProcPtr invoke; + NPN_InvokeDefaultProcPtr invokeDefault; + NPN_EvaluateProcPtr evaluate; + NPN_GetPropertyProcPtr getproperty; + NPN_SetPropertyProcPtr setproperty; + NPN_RemovePropertyProcPtr removeproperty; + NPN_HasPropertyProcPtr hasproperty; + NPN_HasMethodProcPtr hasmethod; + NPN_ReleaseVariantValueProcPtr releasevariantvalue; + NPN_SetExceptionProcPtr setexception; + NPN_PushPopupsEnabledStateProcPtr pushpopupsenabledstate; + NPN_PopPopupsEnabledStateProcPtr poppopupsenabledstate; + NPN_EnumerateProcPtr enumerate; + NPN_PluginThreadAsyncCallProcPtr pluginthreadasynccall; + NPN_ConstructProcPtr construct; + NPN_GetValueForURLPtr getvalueforurl; + NPN_SetValueForURLPtr setvalueforurl; + NPN_GetAuthenticationInfoPtr getauthenticationinfo; + NPN_ScheduleTimerPtr scheduletimer; + NPN_UnscheduleTimerPtr unscheduletimer; + NPN_PopUpContextMenuPtr popupcontextmenu; + NPN_ConvertPointPtr convertpoint; + NPN_HandleEventPtr handleevent; + NPN_UnfocusInstancePtr unfocusinstance; + NPN_URLRedirectResponsePtr urlredirectresponse; + NPN_DummyPtr initasyncsurfaceOBSOLETE; + NPN_DummyPtr finalizeasyncsurfaceOBSOLETE; + NPN_DummyPtr setcurrentasyncsurfaceOBSOLETE; +} NPNetscapeFuncs; + +#ifdef XP_MACOSX +/* + * Mac OS X version(s) of NP_GetMIMEDescription(const char *) + * These can be called to retreive MIME information from the plugin dynamically + * + * Note: For compatibility with Quicktime, BPSupportedMIMEtypes is another way + * to get mime info from the plugin only on OSX and may not be supported + * in furture version -- use NP_GetMIMEDescription instead + */ +enum +{ + kBPSupportedMIMETypesStructVers_1 = 1 +}; +typedef struct _BPSupportedMIMETypes +{ + SInt32 structVersion; /* struct version */ + Handle typeStrings; /* STR# formated handle, allocated by plug-in */ + Handle infoStrings; /* STR# formated handle, allocated by plug-in */ +} BPSupportedMIMETypes; +OSErr BP_GetSupportedMIMETypes(BPSupportedMIMETypes *mimeInfo, UInt32 flags); +#define NP_GETMIMEDESCRIPTION_NAME "NP_GetMIMEDescription" +typedef const char* (*NP_GetMIMEDescriptionProcPtr)(void); +typedef OSErr (*BP_GetSupportedMIMETypesProcPtr)(BPSupportedMIMETypes*, UInt32); +#endif + +#if defined(_WIN32) +#define OSCALL WINAPI +#else +#if defined(__OS2__) +#define OSCALL _System +#else +#define OSCALL +#endif +#endif + +#if defined(XP_UNIX) +/* GCC 3.3 and later support the visibility attribute. */ +#if defined(__GNUC__) && ((__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) +#define NP_VISIBILITY_DEFAULT __attribute__((visibility("default"))) +#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) +#define NP_VISIBILITY_DEFAULT __global +#else +#define NP_VISIBILITY_DEFAULT +#endif +#define NP_EXPORT(__type) NP_VISIBILITY_DEFAULT __type +#endif + +#if defined(_WIN32) || defined (__OS2__) +#ifdef __cplusplus +extern "C" { +#endif +/* plugin meta member functions */ +#if defined(__OS2__) +typedef struct _NPPluginData { /* Alternate OS2 Plugin interface */ + char *pMimeTypes; + char *pFileExtents; + char *pFileOpenTemplate; + char *pProductName; + char *pProductDescription; + unsigned long dwProductVersionMS; + unsigned long dwProductVersionLS; +} NPPluginData; +typedef NPError (OSCALL *NP_GetPluginDataFunc)(NPPluginData*); +NPError OSCALL NP_GetPluginData(NPPluginData * pPluginData); +#endif +typedef NPError (OSCALL *NP_GetEntryPointsFunc)(NPPluginFuncs*); +NPError OSCALL NP_GetEntryPoints(NPPluginFuncs* pFuncs); +typedef NPError (OSCALL *NP_InitializeFunc)(NPNetscapeFuncs*); +NPError OSCALL NP_Initialize(NPNetscapeFuncs* bFuncs); +typedef NPError (OSCALL *NP_ShutdownFunc)(void); +NPError OSCALL NP_Shutdown(void); +typedef const char* (*NP_GetMIMEDescriptionFunc)(void); +const char* NP_GetMIMEDescription(void); +#ifdef __cplusplus +} +#endif +#endif + +#if defined(__OS2__) +#pragma pack() +#endif + +#ifdef XP_UNIX +#ifdef __cplusplus +extern "C" { +#endif +typedef char* (*NP_GetPluginVersionFunc)(void); +NP_EXPORT(char*) NP_GetPluginVersion(void); +typedef const char* (*NP_GetMIMEDescriptionFunc)(void); +NP_EXPORT(const char*) NP_GetMIMEDescription(void); +#ifdef XP_MACOSX +typedef NPError (*NP_InitializeFunc)(NPNetscapeFuncs*); +NP_EXPORT(NPError) NP_Initialize(NPNetscapeFuncs* bFuncs); +typedef NPError (*NP_GetEntryPointsFunc)(NPPluginFuncs*); +NP_EXPORT(NPError) NP_GetEntryPoints(NPPluginFuncs* pFuncs); +#else +typedef NPError (*NP_InitializeFunc)(NPNetscapeFuncs*, NPPluginFuncs*); +NP_EXPORT(NPError) NP_Initialize(NPNetscapeFuncs* bFuncs, NPPluginFuncs* pFuncs); +#endif +typedef NPError (*NP_ShutdownFunc)(void); +NP_EXPORT(NPError) NP_Shutdown(void); +typedef NPError (*NP_GetValueFunc)(void *, NPPVariable, void *); +NP_EXPORT(NPError) NP_GetValue(void *future, NPPVariable aVariable, void *aValue); +#ifdef __cplusplus +} +#endif +#endif + +#endif /* npfunctions_h_ */ diff --git a/direct/src/plugin_npapi/npruntime.h b/direct/src/plugin_npapi/npruntime.h new file mode 100644 index 0000000000..6e89165045 --- /dev/null +++ b/direct/src/plugin_npapi/npruntime.h @@ -0,0 +1,393 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * Copyright (c) 2004, Apple Computer, Inc. and The Mozilla Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the names of Apple Computer, Inc. ("Apple") or The Mozilla + * Foundation ("Mozilla") nor the names of their contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE, MOZILLA AND THEIR 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 APPLE, MOZILLA OR + * THEIR 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. + * + */ +#ifndef _NP_RUNTIME_H_ +#define _NP_RUNTIME_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "nptypes.h" + +/* + This API is used to facilitate binding code written in C to script + objects. The API in this header does not assume the presence of a + user agent. That is, it can be used to bind C code to scripting + environments outside of the context of a user agent. + + However, the normal use of the this API is in the context of a + scripting environment running in a browser or other user agent. + In particular it is used to support the extended Netscape + script-ability API for plugins (NP-SAP). NP-SAP is an extension + of the Netscape plugin API. As such we have adopted the use of + the "NP" prefix for this API. + + The following NP{N|P}Variables were added to the Netscape plugin + API (in npapi.h): + + NPNVWindowNPObject + NPNVPluginElementNPObject + NPPVpluginScriptableNPObject + + These variables are exposed through NPN_GetValue() and + NPP_GetValue() (respectively) and are used to establish the + initial binding between the user agent and native code. The DOM + objects in the user agent can be examined and manipulated using + the NPN_ functions that operate on NPObjects described in this + header. + + To the extent possible the assumptions about the scripting + language used by the scripting environment have been minimized. +*/ + +#define NP_BEGIN_MACRO do { +#define NP_END_MACRO } while (0) + +/* + Objects (non-primitive data) passed between 'C' and script is + always wrapped in an NPObject. The 'interface' of an NPObject is + described by an NPClass. +*/ +typedef struct NPObject NPObject; +typedef struct NPClass NPClass; + +typedef char NPUTF8; +typedef struct _NPString { + const NPUTF8 *UTF8Characters; + uint32_t UTF8Length; +} NPString; + +typedef enum { + NPVariantType_Void, + NPVariantType_Null, + NPVariantType_Bool, + NPVariantType_Int32, + NPVariantType_Double, + NPVariantType_String, + NPVariantType_Object +} NPVariantType; + +typedef struct _NPVariant { + NPVariantType type; + union { + bool boolValue; + int32_t intValue; + double doubleValue; + NPString stringValue; + NPObject *objectValue; + } value; +} NPVariant; + +/* + NPN_ReleaseVariantValue is called on all 'out' parameters + references. Specifically it is to be called on variants that own + their value, as is the case with all non-const NPVariant* + arguments after a successful call to any methods (except this one) + in this API. + + After calling NPN_ReleaseVariantValue, the type of the variant + will be NPVariantType_Void. +*/ +void NPN_ReleaseVariantValue(NPVariant *variant); + +#define NPVARIANT_IS_VOID(_v) ((_v).type == NPVariantType_Void) +#define NPVARIANT_IS_NULL(_v) ((_v).type == NPVariantType_Null) +#define NPVARIANT_IS_BOOLEAN(_v) ((_v).type == NPVariantType_Bool) +#define NPVARIANT_IS_INT32(_v) ((_v).type == NPVariantType_Int32) +#define NPVARIANT_IS_DOUBLE(_v) ((_v).type == NPVariantType_Double) +#define NPVARIANT_IS_STRING(_v) ((_v).type == NPVariantType_String) +#define NPVARIANT_IS_OBJECT(_v) ((_v).type == NPVariantType_Object) + +#define NPVARIANT_TO_BOOLEAN(_v) ((_v).value.boolValue) +#define NPVARIANT_TO_INT32(_v) ((_v).value.intValue) +#define NPVARIANT_TO_DOUBLE(_v) ((_v).value.doubleValue) +#define NPVARIANT_TO_STRING(_v) ((_v).value.stringValue) +#define NPVARIANT_TO_OBJECT(_v) ((_v).value.objectValue) + +#define VOID_TO_NPVARIANT(_v) \ +NP_BEGIN_MACRO \ + (_v).type = NPVariantType_Void; \ + (_v).value.objectValue = NULL; \ +NP_END_MACRO + +#define NULL_TO_NPVARIANT(_v) \ +NP_BEGIN_MACRO \ + (_v).type = NPVariantType_Null; \ + (_v).value.objectValue = NULL; \ +NP_END_MACRO + +#define BOOLEAN_TO_NPVARIANT(_val, _v) \ +NP_BEGIN_MACRO \ + (_v).type = NPVariantType_Bool; \ + (_v).value.boolValue = !!(_val); \ +NP_END_MACRO + +#define INT32_TO_NPVARIANT(_val, _v) \ +NP_BEGIN_MACRO \ + (_v).type = NPVariantType_Int32; \ + (_v).value.intValue = _val; \ +NP_END_MACRO + +#define DOUBLE_TO_NPVARIANT(_val, _v) \ +NP_BEGIN_MACRO \ + (_v).type = NPVariantType_Double; \ + (_v).value.doubleValue = _val; \ +NP_END_MACRO + +#define STRINGZ_TO_NPVARIANT(_val, _v) \ +NP_BEGIN_MACRO \ + (_v).type = NPVariantType_String; \ + NPString str = { _val, (uint32_t)(strlen(_val)) }; \ + (_v).value.stringValue = str; \ +NP_END_MACRO + +#define STRINGN_TO_NPVARIANT(_val, _len, _v) \ +NP_BEGIN_MACRO \ + (_v).type = NPVariantType_String; \ + NPString str = { _val, (uint32_t)(_len) }; \ + (_v).value.stringValue = str; \ +NP_END_MACRO + +#define OBJECT_TO_NPVARIANT(_val, _v) \ +NP_BEGIN_MACRO \ + (_v).type = NPVariantType_Object; \ + (_v).value.objectValue = _val; \ +NP_END_MACRO + + +/* + Type mappings (JavaScript types have been used for illustration + purposes): + + JavaScript to C (NPVariant with type:) + undefined NPVariantType_Void + null NPVariantType_Null + Boolean NPVariantType_Bool + Number NPVariantType_Double or NPVariantType_Int32 + String NPVariantType_String + Object NPVariantType_Object + + C (NPVariant with type:) to JavaScript + NPVariantType_Void undefined + NPVariantType_Null null + NPVariantType_Bool Boolean + NPVariantType_Int32 Number + NPVariantType_Double Number + NPVariantType_String String + NPVariantType_Object Object +*/ + +typedef void *NPIdentifier; + +/* + NPObjects have methods and properties. Methods and properties are + identified with NPIdentifiers. These identifiers may be reflected + in script. NPIdentifiers can be either strings or integers, IOW, + methods and properties can be identified by either strings or + integers (i.e. foo["bar"] vs foo[1]). NPIdentifiers can be + compared using ==. In case of any errors, the requested + NPIdentifier(s) will be NULL. NPIdentifier lifetime is controlled + by the browser. Plugins do not need to worry about memory management + with regards to NPIdentifiers. +*/ +NPIdentifier NPN_GetStringIdentifier(const NPUTF8 *name); +void NPN_GetStringIdentifiers(const NPUTF8 **names, int32_t nameCount, + NPIdentifier *identifiers); +NPIdentifier NPN_GetIntIdentifier(int32_t intid); +bool NPN_IdentifierIsString(NPIdentifier identifier); + +/* + The NPUTF8 returned from NPN_UTF8FromIdentifier SHOULD be freed. +*/ +NPUTF8 *NPN_UTF8FromIdentifier(NPIdentifier identifier); + +/* + Get the integer represented by identifier. If identifier is not an + integer identifier, the behaviour is undefined. +*/ +int32_t NPN_IntFromIdentifier(NPIdentifier identifier); + +/* + NPObject behavior is implemented using the following set of + callback functions. + + The NPVariant *result argument of these functions (where + applicable) should be released using NPN_ReleaseVariantValue(). +*/ +typedef NPObject *(*NPAllocateFunctionPtr)(NPP npp, NPClass *aClass); +typedef void (*NPDeallocateFunctionPtr)(NPObject *npobj); +typedef void (*NPInvalidateFunctionPtr)(NPObject *npobj); +typedef bool (*NPHasMethodFunctionPtr)(NPObject *npobj, NPIdentifier name); +typedef bool (*NPInvokeFunctionPtr)(NPObject *npobj, NPIdentifier name, + const NPVariant *args, uint32_t argCount, + NPVariant *result); +typedef bool (*NPInvokeDefaultFunctionPtr)(NPObject *npobj, + const NPVariant *args, + uint32_t argCount, + NPVariant *result); +typedef bool (*NPHasPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name); +typedef bool (*NPGetPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name, + NPVariant *result); +typedef bool (*NPSetPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name, + const NPVariant *value); +typedef bool (*NPRemovePropertyFunctionPtr)(NPObject *npobj, + NPIdentifier name); +typedef bool (*NPEnumerationFunctionPtr)(NPObject *npobj, NPIdentifier **value, + uint32_t *count); +typedef bool (*NPConstructFunctionPtr)(NPObject *npobj, + const NPVariant *args, + uint32_t argCount, + NPVariant *result); + +/* + NPObjects returned by create, retain, invoke, and getProperty pass + a reference count to the caller. That is, the callee adds a + reference count which passes to the caller. It is the caller's + responsibility to release the returned object. + + NPInvokeFunctionPtr function may return 0 to indicate a void + result. + + NPInvalidateFunctionPtr is called by the scripting environment + when the native code is shutdown. Any attempt to message a + NPObject instance after the invalidate callback has been + called will result in undefined behavior, even if the native code + is still retaining those NPObject instances. (The runtime + will typically return immediately, with 0 or NULL, from an attempt + to dispatch to a NPObject, but this behavior should not be + depended upon.) + + The NPEnumerationFunctionPtr function may pass an array of + NPIdentifiers back to the caller. The callee allocs the memory of + the array using NPN_MemAlloc(), and it's the caller's responsibility + to release it using NPN_MemFree(). +*/ +struct NPClass +{ + uint32_t structVersion; + NPAllocateFunctionPtr allocate; + NPDeallocateFunctionPtr deallocate; + NPInvalidateFunctionPtr invalidate; + NPHasMethodFunctionPtr hasMethod; + NPInvokeFunctionPtr invoke; + NPInvokeDefaultFunctionPtr invokeDefault; + NPHasPropertyFunctionPtr hasProperty; + NPGetPropertyFunctionPtr getProperty; + NPSetPropertyFunctionPtr setProperty; + NPRemovePropertyFunctionPtr removeProperty; + NPEnumerationFunctionPtr enumerate; + NPConstructFunctionPtr construct; +}; + +#define NP_CLASS_STRUCT_VERSION 3 + +#define NP_CLASS_STRUCT_VERSION_ENUM 2 +#define NP_CLASS_STRUCT_VERSION_CTOR 3 + +#define NP_CLASS_STRUCT_VERSION_HAS_ENUM(npclass) \ + ((npclass)->structVersion >= NP_CLASS_STRUCT_VERSION_ENUM) + +#define NP_CLASS_STRUCT_VERSION_HAS_CTOR(npclass) \ + ((npclass)->structVersion >= NP_CLASS_STRUCT_VERSION_CTOR) + +struct NPObject { + NPClass *_class; + uint32_t referenceCount; + /* + * Additional space may be allocated here by types of NPObjects + */ +}; + +/* + If the class has an allocate function, NPN_CreateObject invokes + that function, otherwise a NPObject is allocated and + returned. This method will initialize the referenceCount member of + the NPObject to 1. +*/ +NPObject *NPN_CreateObject(NPP npp, NPClass *aClass); + +/* + Increment the NPObject's reference count. +*/ +NPObject *NPN_RetainObject(NPObject *npobj); + +/* + Decremented the NPObject's reference count. If the reference + count goes to zero, the class's destroy function is invoke if + specified, otherwise the object is freed directly. +*/ +void NPN_ReleaseObject(NPObject *npobj); + +/* + Functions to access script objects represented by NPObject. + + Calls to script objects are synchronous. If a function returns a + value, it will be supplied via the result NPVariant + argument. Successful calls will return true, false will be + returned in case of an error. + + Calls made from plugin code to script must be made from the thread + on which the plugin was initialized. +*/ + +bool NPN_Invoke(NPP npp, NPObject *npobj, NPIdentifier methodName, + const NPVariant *args, uint32_t argCount, NPVariant *result); +bool NPN_InvokeDefault(NPP npp, NPObject *npobj, const NPVariant *args, + uint32_t argCount, NPVariant *result); +bool NPN_Evaluate(NPP npp, NPObject *npobj, NPString *script, + NPVariant *result); +bool NPN_GetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName, + NPVariant *result); +bool NPN_SetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName, + const NPVariant *value); +bool NPN_RemoveProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName); +bool NPN_HasProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName); +bool NPN_HasMethod(NPP npp, NPObject *npobj, NPIdentifier methodName); +bool NPN_Enumerate(NPP npp, NPObject *npobj, NPIdentifier **identifier, + uint32_t *count); +bool NPN_Construct(NPP npp, NPObject *npobj, const NPVariant *args, + uint32_t argCount, NPVariant *result); + +/* + NPN_SetException may be called to trigger a script exception upon + return from entry points into NPObjects. Typical usage: + + NPN_SetException (npobj, message); +*/ +void NPN_SetException(NPObject *npobj, const NPUTF8 *message); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/direct/src/plugin_npapi/nptypes.h b/direct/src/plugin_npapi/nptypes.h new file mode 100644 index 0000000000..4d87fb844d --- /dev/null +++ b/direct/src/plugin_npapi/nptypes.h @@ -0,0 +1,121 @@ +/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * mozilla.org. + * Portions created by the Initial Developer are Copyright (C) 2004 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Johnny Stenback (Original author) + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef nptypes_h_ +#define nptypes_h_ + +/* + * Header file for ensuring that C99 types ([u]int32_t, [u]int64_t and bool) and + * true/false macros are available. + */ + +#if (defined(WIN32) && !defined(__GNUC__)) || defined(OS2) + /* + * Win32 and OS/2 don't know C99, so define [u]int_16/32/64 here. The bool + * is predefined tho, both in C and C++. + */ + typedef short int16_t; + typedef unsigned short uint16_t; + typedef int int32_t; + typedef unsigned int uint32_t; + typedef long long int64_t; + typedef unsigned long long uint64_t; +#elif defined(_AIX) || defined(__sun) || defined(__osf__) || defined(IRIX) || defined(HPUX) + /* + * AIX and SunOS ship a inttypes.h header that defines [u]int32_t, + * but not bool for C. + */ + #include + + #ifndef __cplusplus + typedef int bool; + #define true 1 + #define false 0 + #endif +#elif defined(bsdi) || defined(FREEBSD) || defined(OPENBSD) + /* + * BSD/OS, FreeBSD, and OpenBSD ship sys/types.h that define int32_t and + * u_int32_t. + */ + #include + + /* + * BSD/OS ships no header that defines uint32_t, nor bool (for C) + */ + #if defined(bsdi) + typedef u_int32_t uint32_t; + typedef u_int64_t uint64_t; + + #if !defined(__cplusplus) + typedef int bool; + #define true 1 + #define false 0 + #endif + #else + /* + * FreeBSD and OpenBSD define uint32_t and bool. + */ + #include + #include + #endif +#elif defined(BEOS) + #include +#else + /* + * For those that ship a standard C99 stdint.h header file, include + * it. Can't do the same for stdbool.h tho, since some systems ship + * with a stdbool.h file that doesn't compile! + */ + #include + + #ifndef __cplusplus + #if !defined(__GNUC__) || (__GNUC__ > 2 || __GNUC_MINOR__ > 95) + #include + #else + /* + * GCC 2.91 can't deal with a typedef for bool, but a #define + * works. + */ + #define bool int + #define true 1 + #define false 0 + #endif + #endif +#endif + +#endif /* nptypes_h_ */ diff --git a/direct/src/plugin_npapi/ppBrowserObject.cxx b/direct/src/plugin_npapi/ppBrowserObject.cxx index 467a7b50eb..850d2020c1 100644 --- a/direct/src/plugin_npapi/ppBrowserObject.cxx +++ b/direct/src/plugin_npapi/ppBrowserObject.cxx @@ -230,10 +230,10 @@ call(const string &method_name, P3D_object *params[], int num_params) const { //////////////////////////////////////////////////////////////////// P3D_object *PPBrowserObject:: eval(const string &expression) const { - NPString npexpr = { expression.c_str(), expression.length() }; + NPString npexpr = { expression.c_str(), (uint32_t)expression.length() }; NPVariant result; - if (!browser->evaluate(_instance->get_npp_instance(), _npobj, + if (!browser->evaluate(_instance->get_npp_instance(), _npobj, &npexpr, &result)) { // Failed to eval. return NULL; diff --git a/direct/src/plugin_npapi/ppInstance.cxx b/direct/src/plugin_npapi/ppInstance.cxx index aa247a644c..55b9757a04 100644 --- a/direct/src/plugin_npapi/ppInstance.cxx +++ b/direct/src/plugin_npapi/ppInstance.cxx @@ -1882,8 +1882,10 @@ send_window() { assert(!_use_xembed); parent_window._window_handle_type = _window_handle_type; if (_window_handle_type == P3D_WHT_osx_port) { +#if !__LP64__ NP_Port *port = (NP_Port *)_window.window; parent_window._handle._osx_port._port = port->port; +#endif } else if (_window_handle_type == P3D_WHT_osx_cgcontext) { NP_CGContext *context = (NP_CGContext *)_window.window; if (context != NULL) { @@ -1929,8 +1931,10 @@ send_window() { #elif defined(__APPLE__) parent_window._window_handle_type = _window_handle_type; if (_window_handle_type == P3D_WHT_osx_port) { +#if !__LP64__ NP_Port *port = (NP_Port *)_window.window; parent_window._handle._osx_port._port = port->port; +#endif } else if (_window_handle_type == P3D_WHT_osx_cgcontext) { NP_CGContext *context = (NP_CGContext *)_window.window; if (context != NULL) { @@ -2173,16 +2177,16 @@ set_failed() { NPObject *window_object = NULL; if (browser->getvalue(_npp_instance, NPNVWindowNPObject, &window_object) == NPERR_NO_ERROR) { - NPString npexpr = { expression.c_str(), expression.length() }; + NPString npexpr = { expression.c_str(), (uint32_t)expression.length() }; NPVariant result; - if (browser->evaluate(_npp_instance, window_object, + if (browser->evaluate(_npp_instance, window_object, &npexpr, &result)) { nout << "Eval " << expression << "\n"; browser->releasevariantvalue(&result); } else { nout << "Unable to eval " << expression << "\n"; } - + browser->releaseobject(window_object); } } diff --git a/direct/src/plugin_npapi/startup.cxx b/direct/src/plugin_npapi/startup.cxx index cf8fb6db9f..1d2a33b82b 100644 --- a/direct/src/plugin_npapi/startup.cxx +++ b/direct/src/plugin_npapi/startup.cxx @@ -187,7 +187,7 @@ NP_Initialize(NPNetscapeFuncs *browserFuncs, } #endif - int browser_major = (browser->version >> 8) && 0xff; + int browser_major = (browser->version >> 8) & 0xff; int browser_minor = browser->version & 0xff; nout << "Browser NPAPI version " << browser_major << "." << browser_minor << "\n"; diff --git a/direct/src/plugin_standalone/Sources.pp b/direct/src/plugin_standalone/Sources.pp index b96c49d5ab..9f14945e10 100644 --- a/direct/src/plugin_standalone/Sources.pp +++ b/direct/src/plugin_standalone/Sources.pp @@ -83,7 +83,6 @@ #end bin_target #begin bin_target - #define BUILD_TARGET $[and $[HAVE_JPEG],$[HAVE_PNG]] #define USE_PACKAGES openssl zlib #define TARGET p3dembed #define LOCAL_LIBS plugin_common p3d_plugin_static @@ -115,7 +114,7 @@ // On Windows, we also need to build p3dembedw.exe, the non-console // version of p3dembed.exe. - #define BUILD_TARGET $[and $[HAVE_JPEG],$[HAVE_PNG],$[WINDOWS_PLATFORM]] + #define BUILD_TARGET $[WINDOWS_PLATFORM] #define USE_PACKAGES openssl zlib #define TARGET p3dembedw #define LOCAL_LIBS plugin_common p3d_plugin_static diff --git a/direct/src/plugin_standalone/panda3dBase.cxx b/direct/src/plugin_standalone/panda3dBase.cxx index cb4d7e41a1..be2d278889 100644 --- a/direct/src/plugin_standalone/panda3dBase.cxx +++ b/direct/src/plugin_standalone/panda3dBase.cxx @@ -147,7 +147,7 @@ run_main_loop() { } } -#elif defined(__APPLE__) +#elif defined(__APPLE__) && !__LP64__ // OSX really prefers to own the main loop, so we install a timer to // call out to our instances and getters, rather than polling within // the event loop as we do in the Windows case, above. @@ -699,7 +699,7 @@ report_download_complete(P3D_instance *instance) { } } -#ifdef __APPLE__ +#if defined(__APPLE__) && !__LP64__ //////////////////////////////////////////////////////////////////// // Function: Panda3DBase::st_timer_callback // Access: Protected, Static @@ -712,7 +712,7 @@ st_timer_callback(EventLoopTimerRef timer, void *user_data) { } #endif // __APPLE__ -#ifdef __APPLE__ +#if defined(__APPLE__) && !__LP64__ //////////////////////////////////////////////////////////////////// // Function: Panda3DBase::timer_callback // Access: Protected diff --git a/direct/src/plugin_standalone/panda3dMac.cxx b/direct/src/plugin_standalone/panda3dMac.cxx index f07a477830..6090dc9850 100644 --- a/direct/src/plugin_standalone/panda3dMac.cxx +++ b/direct/src/plugin_standalone/panda3dMac.cxx @@ -63,7 +63,7 @@ open_p3d_file(FSRef *ref) { static pascal OSErr open_documents_handler(const AppleEvent *theAppleEvent, AppleEvent *reply, - long handlerRefcon) { + SRefCon handlerRefcon) { AEDescList docList; FSRef theFSRef; long index; diff --git a/direct/src/showbase/EventManager.py b/direct/src/showbase/EventManager.py index c29cb0b05b..367d24c051 100644 --- a/direct/src/showbase/EventManager.py +++ b/direct/src/showbase/EventManager.py @@ -187,3 +187,8 @@ class EventManager: def shutdown(self): taskMgr.remove('eventManager') + + # Flush the event queue. We do this after removing the task + # since the task removal itself might also fire off an event. + if self.eventQueue is not None: + self.eventQueue.clear() diff --git a/direct/src/showbase/ShowBase.py b/direct/src/showbase/ShowBase.py index bb6ad5a2ce..35b60ce271 100644 --- a/direct/src/showbase/ShowBase.py +++ b/direct/src/showbase/ShowBase.py @@ -11,15 +11,15 @@ from panda3d.core import * from panda3d.direct import get_config_showbase, throw_new_frame, init_app_for_gui # This needs to be available early for DirectGUI imports -import __builtin__ -__builtin__.config = get_config_showbase() +import __builtin__ as builtins +builtins.config = get_config_showbase() -from direct.directnotify.DirectNotifyGlobal import * -from MessengerGlobal import * -from BulletinBoardGlobal import * -from direct.task.TaskManagerGlobal import * -from JobManagerGlobal import * -from EventManagerGlobal import * +from direct.directnotify.DirectNotifyGlobal import directNotify, giveNotify +from MessengerGlobal import messenger +from BulletinBoardGlobal import bulletinBoard +from direct.task.TaskManagerGlobal import taskMgr +from JobManagerGlobal import jobMgr +from EventManagerGlobal import eventMgr from PythonUtil import * from direct.showbase import PythonUtil #from direct.interval.IntervalManager import ivalMgr @@ -29,11 +29,11 @@ from direct.showbase.BufferViewer import BufferViewer from direct.task import Task from direct.directutil import Verify from direct.showbase import GarbageReport -import EventManager import math,sys,os import Loader import time import gc +import atexit from direct.fsm import ClassicFSM from direct.fsm import State from direct.showbase import ExceptionVarDump @@ -44,9 +44,17 @@ if __debug__: import OnScreenDebug import AppRunnerGlobal -__builtin__.FADE_SORT_INDEX = 1000 -__builtin__.NO_FADE_SORT_INDEX = 2000 +builtins.FADE_SORT_INDEX = 1000 +builtins.NO_FADE_SORT_INDEX = 2000 +def legacyRun(): + builtins.base.notify.warning("run() is deprecated, use base.run() instead") + builtins.base.run() + +@atexit.register +def exitfunc(): + if getattr(builtins, 'base', None) is not None: + builtins.base.destroy() # Now ShowBase is a DirectObject. We need this so ShowBase can hang # hooks on messages, particularly on window-event. This doesn't @@ -57,7 +65,7 @@ class ShowBase(DirectObject.DirectObject): def __init__(self, fStartDirect = True, windowType = None): self.__dev__ = config.GetBool('want-dev', __debug__) - __builtin__.__dev__ = self.__dev__ + builtins.__dev__ = self.__dev__ logStackDump = (config.GetBool('log-stack-dump', False) or config.GetBool('client-log-stack-dump', False)) @@ -65,11 +73,12 @@ class ShowBase(DirectObject.DirectObject): if logStackDump or uploadStackDump: ExceptionVarDump.install(logStackDump, uploadStackDump) - # Locate the directory containing the main program + ## The directory containing the main Python file of this application. self.mainDir = ExecutionEnvironment.getEnvironmentVariable("MAIN_DIR") - # The appRunner should have been created by the time ShowBase - # has been. + ## This contains the global appRunner instance, as imported from + ## AppRunnerGlobal. This will be None if we are not running in the + ## runtime environment (ie. from a .p3d file). self.appRunner = AppRunnerGlobal.appRunner #debug running multiplier @@ -108,13 +117,13 @@ class ShowBase(DirectObject.DirectObject): self.wantTk = False self.wantWx = False - # Fill this in with a function to invoke when the user "exits" - # the program by closing the main window. + ## Fill this in with a function to invoke when the user "exits" + ## the program by closing the main window. self.exitFunc = None - # Add final-exit callbacks to this list. These will be called - # when sys.exit() is called, after Panda has unloaded, and - # just before Python is about to shut down. + ## Add final-exit callbacks to this list. These will be called + ## when sys.exit() is called, after Panda has unloaded, and + ## just before Python is about to shut down. self.finalExitCallbacks = [] Task.TaskManager.taskTimerVerbose = self.config.GetBool('task-timer-verbose', 0) @@ -139,13 +148,15 @@ class ShowBase(DirectObject.DirectObject): # we get a window-event. self.__oldAspectRatio = None + ## This is set to the value of the window-type config variable, but may + ## optionally be overridden in the Showbase constructor. Should either be + ## 'onscreen' (the default), 'offscreen' or 'none'. self.windowType = windowType if self.windowType is None: self.windowType = self.config.GetString('window-type', 'onscreen') self.requireWindow = self.config.GetBool('require-window', 1) - # base.win is the main, or only window; base.winList is a list of - # *all* windows. Similarly with base.camList. + ## This is the main, or only window; see winList for a list of *all* windows. self.win = None self.frameRateMeter = None self.sceneGraphAnalyzerMeter = None @@ -165,17 +176,29 @@ class ShowBase(DirectObject.DirectObject): self.trackball = None self.texmem = None self.showVertices = None + + ## This is a NodePath pointing to the Camera object set up for the 3D scene. + ## This is usually a child of self.camera. self.cam = None self.cam2d = None self.cam2dp = None + + ## This is the NodePath that should be used to manipulate the camera. This + ## is the node to which the default camera is attached. self.camera = None self.camera2d = None self.camera2dp = None + + ## This is a list of all cameras created with makeCamera, including base.cam. self.camList = [] + ## Convenience accessor for base.cam.node() self.camNode = None + ## Convenience accessor for base.camNode.get_lens() self.camLens = None self.camFrustumVis = None self.direct = None + ## This is used to store the wx.Application object used when want-wx is + ## set or base.startWx() is called. self.wxApp = None self.tkRoot = None @@ -189,6 +212,7 @@ class ShowBase(DirectObject.DirectObject): self.hidden = NodePath('hidden') + ## The global graphics engine, ie. GraphicsEngine.getGlobalPtr() self.graphicsEngine = GraphicsEngine.getGlobalPtr() self.setupRender() self.setupRender2d() @@ -198,11 +222,11 @@ class ShowBase(DirectObject.DirectObject): self.setupRender2dp() - # This is a placeholder for a CollisionTraverser. If someone - # stores a CollisionTraverser pointer here, we'll traverse it - # in the collisionLoop task. - self.shadowTrav = 0 + ## This is a placeholder for a CollisionTraverser. If someone + ## stores a CollisionTraverser pointer here, we'll traverse it + ## in the collisionLoop task. self.cTrav = 0 + self.shadowTrav = 0 self.cTravStack = Stack() # Ditto for an AppTraverser. self.appTrav = 0 @@ -233,10 +257,6 @@ class ShowBase(DirectObject.DirectObject): random.seed(seed) #whrandom.seed(seed & 0xff, (seed >> 8) & 0xff, (seed >> 16) & 0xff) - # Now that we've set up the window structures, assign an exitfunc. - self.oldexitfunc = getattr(sys, 'exitfunc', None) - sys.exitfunc = self.exitfunc - # Open the default rendering window. if self.windowType != 'none': props = WindowProperties.getDefault() @@ -254,17 +274,22 @@ class ShowBase(DirectObject.DirectObject): self.loader = Loader.Loader(self) self.graphicsEngine.setDefaultLoader(self.loader.loader) + ## The global event manager, as imported from EventManagerGlobal. self.eventMgr = eventMgr + ## The global messenger, as imported from MessengerGlobal. self.messenger = messenger + ## The global bulletin board, as imported from BulletinBoardGlobal. self.bboard = bulletinBoard + ## The global task manager, as imported from TaskManagerGlobal. self.taskMgr = taskMgr + ## The global job manager, as imported from JobManagerGlobal. self.jobMgr = jobMgr - # Particle manager + ## Particle manager self.particleMgr = None self.particleMgrEnabled = 0 - # Physics manager + ## Physics manager self.physicsMgr = None self.physicsMgrEnabled = 0 self.physicsMgrAngular = 0 @@ -302,8 +327,8 @@ class ShowBase(DirectObject.DirectObject): # assigned to a single CPU autoAffinity = self.config.GetBool('auto-single-cpu-affinity', 0) affinity = None - if autoAffinity and ('clientIndex' in __builtin__.__dict__): - affinity = abs(int(__builtin__.clientIndex)) + if autoAffinity and ('clientIndex' in builtins.__dict__): + affinity = abs(int(builtins.clientIndex)) else: affinity = self.config.GetInt('client-cpu-affinity', -1) if (affinity in (None, -1)) and autoAffinity: @@ -313,42 +338,44 @@ class ShowBase(DirectObject.DirectObject): TrueClock.getGlobalPtr().setCpuAffinity(1 << (affinity % 32)) # Make sure we're not making more than one ShowBase. - if 'base' in __builtin__.__dict__: + if 'base' in builtins.__dict__: raise StandardError, "Attempt to spawn multiple ShowBase instances!" - __builtin__.base = self - __builtin__.render2d = self.render2d - __builtin__.aspect2d = self.aspect2d - __builtin__.pixel2d = self.pixel2d - __builtin__.render = self.render - __builtin__.hidden = self.hidden - __builtin__.camera = self.camera - __builtin__.loader = self.loader - __builtin__.taskMgr = self.taskMgr - __builtin__.jobMgr = self.jobMgr - __builtin__.eventMgr = self.eventMgr - __builtin__.messenger = self.messenger - __builtin__.bboard = self.bboard + # DO NOT ADD TO THIS LIST. We're trying to phase out the use of + # built-in variables by ShowBase. Use a Global module if necessary. + builtins.base = self + builtins.render2d = self.render2d + builtins.aspect2d = self.aspect2d + builtins.pixel2d = self.pixel2d + builtins.render = self.render + builtins.hidden = self.hidden + builtins.camera = self.camera + builtins.loader = self.loader + builtins.taskMgr = self.taskMgr + builtins.jobMgr = self.jobMgr + builtins.eventMgr = self.eventMgr + builtins.messenger = self.messenger + builtins.bboard = self.bboard # Config needs to be defined before ShowBase is constructed - #__builtin__.config = self.config - __builtin__.run = self.run - __builtin__.ostream = Notify.out() - __builtin__.directNotify = directNotify - __builtin__.giveNotify = giveNotify - __builtin__.globalClock = globalClock - __builtin__.vfs = vfs - __builtin__.cpMgr = ConfigPageManager.getGlobalPtr() - __builtin__.cvMgr = ConfigVariableManager.getGlobalPtr() - __builtin__.pandaSystem = PandaSystem.getGlobalPtr() - __builtin__.wantUberdog = base.config.GetBool('want-uberdog', 1) + #builtins.config = self.config + builtins.run = legacyRun + builtins.ostream = Notify.out() + builtins.directNotify = directNotify + builtins.giveNotify = giveNotify + builtins.globalClock = globalClock + builtins.vfs = vfs + builtins.cpMgr = ConfigPageManager.getGlobalPtr() + builtins.cvMgr = ConfigVariableManager.getGlobalPtr() + builtins.pandaSystem = PandaSystem.getGlobalPtr() + builtins.wantUberdog = base.config.GetBool('want-uberdog', 1) if __debug__: - __builtin__.deltaProfiler = DeltaProfiler.DeltaProfiler("ShowBase") - __builtin__.onScreenDebug = OnScreenDebug.OnScreenDebug() + builtins.deltaProfiler = DeltaProfiler.DeltaProfiler("ShowBase") + builtins.onScreenDebug = OnScreenDebug.OnScreenDebug() if self.wantRender2dp: - __builtin__.render2dp = self.render2dp - __builtin__.aspect2dp = self.aspect2dp - __builtin__.pixel2dp = self.pixel2dp + builtins.render2dp = self.render2dp + builtins.aspect2dp = self.aspect2dp + builtins.pixel2dp = self.pixel2dp if __dev__: ShowBase.notify.debug('__dev__ == %s' % __dev__) @@ -426,7 +453,7 @@ class ShowBase(DirectObject.DirectObject): self.cTrav = self.cTravStack.pop() def __setupProfile(self): - """ Sets up the Python profiler, if avaialable, according to + """ Sets up the Python profiler, if available, according to some Panda config settings. """ try: @@ -445,8 +472,7 @@ class ShowBase(DirectObject.DirectObject): return 0 def printEnvDebugInfo(self): - """ - Print some information about the environment that we are running + """Print some information about the environment that we are running in. Stuff like the model paths and other paths. Feel free to add stuff to this. """ @@ -470,11 +496,18 @@ class ShowBase(DirectObject.DirectObject): for cb in self.finalExitCallbacks[:]: cb() + # Remove the built-in base reference + if getattr(builtins, 'base', None) is self: + del builtins.base + del builtins.loader + del builtins.taskMgr + # [gjeon] restore sticky key settings if self.config.GetBool('disable-sticky-keys', 0): allowAccessibilityShortcutKeys(True) - taskMgr.destroy() + self.ignoreAll() + self.shutdown() if getattr(self, 'musicManager', None): self.musicManager.shutdown() @@ -501,19 +534,6 @@ class ShowBase(DirectObject.DirectObject): vfs = VirtualFileSystem.getGlobalPtr() vfs.unmountAll() - - def exitfunc(self): - """ - This should be assigned to sys.exitfunc to be called just - before Python shutdown. It guarantees that the Panda window - is closed cleanly, so that we free system resources, restore - the desktop and keyboard functionality, etc. - """ - self.destroy() - - if self.oldexitfunc: - self.oldexitfunc() - def makeDefaultPipe(self, printPipeTypes = True): """ Creates the default GraphicsPipe, which will be used to make @@ -1022,6 +1042,7 @@ class ShowBase(DirectObject.DirectObject): Creates the render scene graph, the primary scene graph for rendering 3-d geometry. """ + ## This is the root of the 3-D scene graph. self.render = NodePath('render') self.render.setAttrib(RescaleNormalAttrib.makeDefault()) @@ -1037,6 +1058,7 @@ class ShowBase(DirectObject.DirectObject): 2-d objects and gui elements that are superimposed over the 3-d geometry in the window. """ + ## This is the root of the 2-D scene graph. self.render2d = NodePath('render2d') # Set up some overrides to turn off certain properties which @@ -1057,22 +1079,26 @@ class ShowBase(DirectObject.DirectObject): self.render2d.setMaterialOff(1) self.render2d.setTwoSided(1) - # The normal 2-d DisplayRegion has an aspect ratio that - # matches the window, but its coordinate system is square. - # This means anything we parent to render2d gets stretched. - # For things where that makes a difference, we set up - # aspect2d, which scales things back to the right aspect - # ratio. - aspectRatio = self.getAspectRatio() + ## The normal 2-d DisplayRegion has an aspect ratio that + ## matches the window, but its coordinate system is square. + ## This means anything we parent to render2d gets stretched. + ## For things where that makes a difference, we set up + ## aspect2d, which scales things back to the right aspect + ## ratio along the X axis (Z is still from -1 to 1) self.aspect2d = self.render2d.attachNewNode(PGTop("aspect2d")) + + aspectRatio = self.getAspectRatio() self.aspect2d.setScale(1.0 / aspectRatio, 1.0, 1.0) self.a2dBackground = self.aspect2d.attachNewNode("a2dBackground") - # It's important to know the bounds of the aspect2d screen. + ## The Z position of the top border of the aspect2d screen. self.a2dTop = 1.0 + ## The Z position of the bottom border of the aspect2d screen. self.a2dBottom = -1.0 + ## The X position of the left border of the aspect2d screen. self.a2dLeft = -aspectRatio + ## The X position of the right border of the aspect2d screen. self.a2dRight = aspectRatio self.a2dTopCenter = self.aspect2d.attachNewNode("a2dTopCenter") @@ -1112,12 +1138,12 @@ class ShowBase(DirectObject.DirectObject): self.a2dBottomRight.setPos(self.a2dRight, 0, self.a2dBottom) self.a2dBottomRightNs.setPos(self.a2dRight, 0, self.a2dBottom) - # This special root, pixel2d, uses units in pixels that are relative - # to the window. The upperleft corner of the window is (0, 0), - # the lowerleft corner is (xsize, -ysize), in this coordinate system. - xsize, ysize = self.getSize() + ## This special root, pixel2d, uses units in pixels that are relative + ## to the window. The upperleft corner of the window is (0, 0), + ## the lowerleft corner is (xsize, -ysize), in this coordinate system. self.pixel2d = self.render2d.attachNewNode(PGTop("pixel2d")) self.pixel2d.setPos(-1, 0, 1) + xsize, ysize = self.getSize() if xsize > 0 and ysize > 0: self.pixel2d.setScale(2.0 / xsize, 1.0, 2.0 / ysize) @@ -1144,25 +1170,27 @@ class ShowBase(DirectObject.DirectObject): self.render2dp.setMaterialOff(1) self.render2dp.setTwoSided(1) - # The normal 2-d DisplayRegion has an aspect ratio that - # matches the window, but its coordinate system is square. - # This means anything we parent to render2d gets stretched. - # For things where that makes a difference, we set up - # aspect2d, which scales things back to the right aspect - # ratio. - - aspectRatio = self.getAspectRatio() + ## The normal 2-d DisplayRegion has an aspect ratio that + ## matches the window, but its coordinate system is square. + ## This means anything we parent to render2dp gets stretched. + ## For things where that makes a difference, we set up + ## aspect2dp, which scales things back to the right aspect + ## ratio along the X axis (Z is still from -1 to 1) self.aspect2dp = self.render2dp.attachNewNode(PGTop("aspect2dp")) self.aspect2dp.node().setStartSort(16384) + + aspectRatio = self.getAspectRatio() self.aspect2dp.setScale(1.0 / aspectRatio, 1.0, 1.0) - # It's important to know the bounds of the aspect2d screen. + ## The Z position of the top border of the aspect2dp screen. self.a2dpTop = 1.0 + ## The Z position of the bottom border of the aspect2dp screen. self.a2dpBottom = -1.0 + ## The X position of the left border of the aspect2dp screen. self.a2dpLeft = -aspectRatio + ## The X position of the right border of the aspect2dp screen. self.a2dpRight = aspectRatio - self.a2dpTopCenter = self.aspect2dp.attachNewNode("a2dpTopCenter") self.a2dpBottomCenter = self.aspect2dp.attachNewNode("a2dpBottomCenter") self.a2dpLeftCenter = self.aspect2dp.attachNewNode("a2dpLeftCenter") @@ -1184,13 +1212,13 @@ class ShowBase(DirectObject.DirectObject): self.a2dpBottomLeft.setPos(self.a2dpLeft, 0, self.a2dpBottom) self.a2dpBottomRight.setPos(self.a2dpRight, 0, self.a2dpBottom) - # This special root, pixel2d, uses units in pixels that are relative - # to the window. The upperleft corner of the window is (0, 0), - # the lowerleft corner is (xsize, -ysize), in this coordinate system. - xsize, ysize = self.getSize() + ## This special root, pixel2d, uses units in pixels that are relative + ## to the window. The upperleft corner of the window is (0, 0), + ## the lowerleft corner is (xsize, -ysize), in this coordinate system. self.pixel2dp = self.render2dp.attachNewNode(PGTop("pixel2dp")) self.pixel2dp.node().setStartSort(16384) self.pixel2dp.setPos(-1, 0, 1) + xsize, ysize = self.getSize() if xsize > 0 and ysize > 0: self.pixel2dp.setScale(2.0 / xsize, 1.0, 2.0 / ysize) @@ -1280,7 +1308,7 @@ class ShowBase(DirectObject.DirectObject): # camera. self.camera = self.render.attachNewNode(ModelNode('camera')) self.camera.node().setPreserveTransform(ModelNode.PTLocal) - __builtin__.camera = self.camera + builtins.camera = self.camera self.mouse2cam.node().setNode(self.camera.node()) @@ -1502,12 +1530,14 @@ class ShowBase(DirectObject.DirectObject): np = mw.getParent().attachNewNode(mouseRecorder) mw.reparentTo(np) - # A special ButtonThrower to generate keyboard events and - # include the time from the OS. This is separate only to - # support legacy code that did not expect a time parameter; it - # will eventually be folded into the normal ButtonThrower, - # above. + mw = self.buttonThrowers[0].getParent() + + ## A special ButtonThrower to generate keyboard events and + ## include the time from the OS. This is separate only to + ## support legacy code that did not expect a time parameter; it + ## will eventually be folded into the normal ButtonThrower, + ## above. self.timeButtonThrower = mw.attachNewNode(ButtonThrower('timeButtons')) self.timeButtonThrower.node().setPrefix('time-') self.timeButtonThrower.node().setTimeFlag(1) @@ -1931,7 +1961,7 @@ class ShowBase(DirectObject.DirectObject): throw_new_frame() return Task.cont - def restart(self,clusterSync=False,cluster=None): + def restart(self, clusterSync=False, cluster=None): self.shutdown() # __resetPrevTransform goes at the very beginning of the frame. self.taskMgr.add( @@ -1970,7 +2000,7 @@ class ShowBase(DirectObject.DirectObject): self.taskMgr.remove('dataLoop') self.taskMgr.remove('resetPrevTransform') self.taskMgr.remove('ivalLoop') - self.taskMgr.remove('garbage_collect') + self.taskMgr.remove('garbageCollectStates') self.eventMgr.shutdown() def getBackgroundColor(self, win = None): @@ -2784,7 +2814,7 @@ class ShowBase(DirectObject.DirectObject): # wx is now the main loop, not us any more. self.run = self.wxRun self.taskMgr.run = self.wxRun - __builtin__.run = self.wxRun + builtins.run = self.wxRun if self.appRunner: self.appRunner.run = self.wxRun @@ -2846,7 +2876,7 @@ class ShowBase(DirectObject.DirectObject): # Create a new Tk root. self.tkRoot = Pmw.initialise() - __builtin__.tkroot = self.tkRoot + builtins.tkroot = self.tkRoot init_app_for_gui() @@ -2863,7 +2893,7 @@ class ShowBase(DirectObject.DirectObject): # wx is now the main loop, not us any more. self.run = self.tkRun self.taskMgr.run = self.tkRun - __builtin__.run = self.tkRun + builtins.run = self.tkRun if self.appRunner: self.appRunner.run = self.tkRun @@ -2908,7 +2938,7 @@ class ShowBase(DirectObject.DirectObject): from direct.directtools import DirectSession base.direct.enable() else: - __builtin__.direct = self.direct = None + builtins.direct = self.direct = None def getRepository(self): return None @@ -2931,11 +2961,12 @@ class ShowBase(DirectObject.DirectObject): self.startDirect(fWantDirect = fDirect, fWantTk = fTk, fWantWx = fWx) def run(self): - # This method runs the TaskManager when self.appRunner is - # None, which is to say, when we are not running from within a - # p3d file. When we *are* within a p3d file, the Panda - # runtime has to be responsible for running the main loop, so - # we can't allow the application to do it. + """ This method runs the TaskManager when self.appRunner is + None, which is to say, when we are not running from within a + p3d file. When we *are* within a p3d file, the Panda + runtime has to be responsible for running the main loop, so + we can't allow the application to do it. """ + if self.appRunner is None or self.appRunner.dummy or \ (self.appRunner.interactiveConsole and not self.appRunner.initialAppImport): self.taskMgr.run() diff --git a/direct/src/showbase/VFSImporter.py b/direct/src/showbase/VFSImporter.py index e33f4b551b..6f8c76266f 100644 --- a/direct/src/showbase/VFSImporter.py +++ b/direct/src/showbase/VFSImporter.py @@ -408,7 +408,7 @@ class VFSSharedImporter: path = sys.path for dir in path: - pdir = Filename.fromOsSpecific(dir).cStr() + pdir = str(Filename.fromOsSpecific(dir)) if pdir + '/' + basename == dirname: # We found it! return dir diff --git a/direct/src/showutil/FreezeTool.py b/direct/src/showutil/FreezeTool.py index 1e8d35e57f..216192939f 100644 --- a/direct/src/showutil/FreezeTool.py +++ b/direct/src/showutil/FreezeTool.py @@ -1174,7 +1174,7 @@ class Freezer: source = open(sourceFilename.toOsSpecific(), 'r').read() if source and source[-1] != '\n': source = source + '\n' - code = compile(source, sourceFilename.cStr(), 'exec') + code = compile(source, str(sourceFilename), 'exec') self.__addPyc(multifile, filename, code, compressionLevel) diff --git a/doc/INSTALL-MK b/doc/INSTALL-MK index dd1536e60b..6fc7dbdbd1 100644 --- a/doc/INSTALL-MK +++ b/doc/INSTALL-MK @@ -20,33 +20,35 @@ the next section. Alternately, it is possible to download the source in pieces. There are three pieces: - 1. Source code from Sourceforge. + 1. Source code from Github. 2. Third-party tools (not strictly necessary for Unix) - 3. Sample programs. -You will need all three to use makepanda. You can download all three -pieces from the panda website. Look for the files labeled "Panda3D -source, piecewise, X of 3". You can also obtain the first piece -directly from the sourceforge CVS server: +You will need both to use makepanda. You can find the +pieces on the panda website. Look for the files labeled "Panda3D +source". You can also obtain the first piece +directly from the github: - CVSROOT=:pserver:anonymous@panda3d.cvs.sourceforge.net:/cvsroot/panda3d - -Make sure you have all three pieces. If you do, then your panda +Over https: + https://github.com/panda3d/panda3d.git +Over SSH: + git@github.com:panda3d/panda3d.git + +Make sure you have both pieces. If you do, then your panda directory will contain the following subdirectories: - direct - piece 1, source code from sourceforge - dmodels - piece 1, source code from sourceforge - doc - piece 1, source code from sourceforge - dtool - piece 1, source code from sourceforge - Makefile - piece 1, source code from sourceforge - makepanda - piece 1, source code from sourceforge - models - piece 1, source code from sourceforge - panda - piece 1, source code from sourceforge - pandatool - piece 1, source code from sourceforge - ppremake - piece 1, source code from sourceforge - contrib - piece 1, source code from sourceforge + direct - piece 1, source code from github + dmodels - piece 1, source code from github + doc - piece 1, source code from github + dtool - piece 1, source code from github + makepanda - piece 1, source code from github + models - piece 1, source code from github + panda - piece 1, source code from github + pandatool - piece 1, source code from github + ppremake - piece 1, source code from github + contrib - piece 1, source code from github + samples - piece 1, sample programs thirdparty - piece 2, third party tools - samples - piece 3, sample programs + If you have all of these, you're ready to go. If not, then you must have missed a piece. @@ -119,14 +121,49 @@ it will show you the available command-line options: --help (print the help message you're reading now) --verbose (print out more information) + --runtime (build a runtime build instead of an SDK build) --installer (build an installer) --optimize X (optimization level can be 1,2,3,4) - --version (set the panda version number) - --lzma (use lzma compression when building installer) + --version X (set the panda version number) + --lzma (use lzma compression when building Windows installer) + --distributor X (short string identifying the distributor of the build) + --outputdir X (use the specified directory instead of 'built') + --host URL (set the host url (runtime build only)) --threads N (use the multithreaded build system. see manual) --osxtarget N (the OSX version number to build for (OSX only)) + --universal (build universal binaries (OSX only)) --override "O=V" (override dtool_config/prc option value) + --static (builds libraries for static linking) + --target X (experimental cross-compilation (android only)) + --arch X (target architecture for cross-compilation) + --use-python --no-python (enable/disable use of PYTHON) + --use-direct --no-direct (enable/disable use of DIRECT) + --use-gl --no-gl (enable/disable use of GL) + --use-gles --no-gles (enable/disable use of GLES) + --use-gles2 --no-gles2 (enable/disable use of GLES2) + --use-dx9 --no-dx9 (enable/disable use of DX9) + --use-tinydisplay --no-tinydisplay (enable/disable use of TINYDISPLAY) + --use-nvidiacg --no-nvidiacg (enable/disable use of NVIDIACG) + --use-egl --no-egl (enable/disable use of EGL) + --use-eigen --no-eigen (enable/disable use of EIGEN) + --use-openal --no-openal (enable/disable use of OPENAL) + --use-fmodex --no-fmodex (enable/disable use of FMODEX) + --use-vorbis --no-vorbis (enable/disable use of VORBIS) + --use-ffmpeg --no-ffmpeg (enable/disable use of FFMPEG) + --use-swscale --no-swscale (enable/disable use of SWSCALE) + --use-swresample --no-swresample (enable/disable use of SWRESAMPLE) + --use-ode --no-ode (enable/disable use of ODE) + --use-physx --no-physx (enable/disable use of PHYSX) + --use-bullet --no-bullet (enable/disable use of BULLET) + --use-pandaphysics --no-pandaphysics (enable/disable use of PANDAPHYSICS) + --use-speedtree --no-speedtree (enable/disable use of SPEEDTREE) + --use-zlib --no-zlib (enable/disable use of ZLIB) + --use-png --no-png (enable/disable use of PNG) + --use-jpeg --no-jpeg (enable/disable use of JPEG) + --use-tiff --no-tiff (enable/disable use of TIFF) + --use-squish --no-squish (enable/disable use of SQUISH) + --use-freetype --no-freetype (enable/disable use of FREETYPE) --use-maya6 --no-maya6 (enable/disable use of MAYA6) --use-maya65 --no-maya65 (enable/disable use of MAYA65) --use-maya7 --no-maya7 (enable/disable use of MAYA7) @@ -135,41 +172,63 @@ it will show you the available command-line options: --use-maya2008 --no-maya2008 (enable/disable use of MAYA2008) --use-maya2009 --no-maya2009 (enable/disable use of MAYA2009) --use-maya2010 --no-maya2010 (enable/disable use of MAYA2010) + --use-maya2011 --no-maya2011 (enable/disable use of MAYA2011) + --use-maya2012 --no-maya2012 (enable/disable use of MAYA2012) + --use-maya2013 --no-maya2013 (enable/disable use of MAYA2013) + --use-maya20135 --no-maya20135 (enable/disable use of MAYA20135) + --use-maya2014 --no-maya2014 (enable/disable use of MAYA2014) + --use-maya2015 --no-maya2015 (enable/disable use of MAYA2015) --use-max6 --no-max6 (enable/disable use of MAX6) --use-max7 --no-max7 (enable/disable use of MAX7) --use-max8 --no-max8 (enable/disable use of MAX8) --use-max9 --no-max9 (enable/disable use of MAX9) --use-max2009 --no-max2009 (enable/disable use of MAX2009) --use-max2010 --no-max2010 (enable/disable use of MAX2010) - --use-dx9 --no-dx9 (enable/disable use of DX9) - --use-python --no-python (enable/disable use of PYTHON) - --use-zlib --no-zlib (enable/disable use of ZLIB) - --use-png --no-png (enable/disable use of PNG) - --use-jpeg --no-jpeg (enable/disable use of JPEG) - --use-tiff --no-tiff (enable/disable use of TIFF) + --use-max2011 --no-max2011 (enable/disable use of MAX2011) + --use-max2012 --no-max2012 (enable/disable use of MAX2012) + --use-max2013 --no-max2013 (enable/disable use of MAX2013) + --use-max2014 --no-max2014 (enable/disable use of MAX2014) + --use-fcollada --no-fcollada (enable/disable use of FCOLLADA) --use-vrpn --no-vrpn (enable/disable use of VRPN) - --use-tinyxml --no-tinyxml (enable/disable use of TINYXML) - --use-fmodex --no-fmodex (enable/disable use of FMODEX) - --use-openal --no-openal (enable/disable use of OPENAL) - --use-nvidiacg --no-nvidiacg (enable/disable use of NVIDIACG) --use-openssl --no-openssl (enable/disable use of OPENSSL) - --use-freetype --no-freetype (enable/disable use of FREETYPE) - --use-wx --no-wx (enable/disable use of WX) --use-fftw --no-fftw (enable/disable use of FFTW) --use-artoolkit --no-artoolkit (enable/disable use of ARTOOLKIT) - --use-squish --no-squish (enable/disable use of SQUISH) - --use-ode --no-ode (enable/disable use of ODE) - --use-directcam --no-directcam (enable/disable use of DIRECTCAM) - --use-npapi --no-npapi (enable/disable use of NPAPI) --use-opencv --no-opencv (enable/disable use of OPENCV) - --use-ffmpeg --no-ffmpeg (enable/disable use of FFMPEG) - --use-swscale --no-swscale (enable/disable use of SWSCALE) - --use-fcollada --no-fcollada (enable/disable use of FCOLLADA) + --use-directcam --no-directcam (enable/disable use of DIRECTCAM) + --use-vision --no-vision (enable/disable use of VISION) --use-gtk2 --no-gtk2 (enable/disable use of GTK2) + --use-npapi --no-npapi (enable/disable use of NPAPI) + --use-mfc --no-mfc (enable/disable use of MFC) + --use-wx --no-wx (enable/disable use of WX) + --use-fltk --no-fltk (enable/disable use of FLTK) + --use-rocket --no-rocket (enable/disable use of ROCKET) + --use-awesomium --no-awesomium (enable/disable use of AWESOMIUM) + --use-carbon --no-carbon (enable/disable use of CARBON) + --use-cocoa --no-cocoa (enable/disable use of COCOA) + --use-x11 --no-x11 (enable/disable use of X11) + --use-xf86dga --no-xf86dga (enable/disable use of XF86DGA) + --use-xrandr --no-xrandr (enable/disable use of XRANDR) + --use-xcursor --no-xcursor (enable/disable use of XCURSOR) --use-pandatool --no-pandatool (enable/disable use of PANDATOOL) + --use-pview --no-pview (enable/disable use of PVIEW) + --use-deploytools --no-deploytools (enable/disable use of DEPLOYTOOLS) + --use-skel --no-skel (enable/disable use of SKEL) + --use-pandafx --no-pandafx (enable/disable use of PANDAFX) + --use-pandaparticlesystem --no-pandaparticlesystem (enable/disable use of PA +NDAPARTICLESYSTEM) + --use-contrib --no-contrib (enable/disable use of CONTRIB) + --use-sse2 --no-sse2 (enable/disable use of SSE2) + --use-neon --no-neon (enable/disable use of NEON) + --use-touchinput --no-touchinput (enable/disable use of TOUCHINPUT) --nothing (disable every third-party lib) --everything (enable every third-party lib) + --directx-sdk=X (specify version of DX9 SDK to use: jun2010, aug2009, mar200 +9, aug2006) + --platform-sdk=X (specify MSPlatSdk to use: win71, win61, win60A, winserver20 +03r2) + --use-icl (experimental setting to use an intel compiler instead of MS +VC on Windows) Makepanda shows you all the available options, not all of which may be relevant to your operating system. For example, makepanda can build a @@ -247,11 +306,11 @@ It is all too easy to accidentally invoke 'makepanda' with the wrong options, thereby triggering an hour-long recompilation. To avoid this situation, we recommend that you write a short script containing the options you intend to use regularly. For example, I regularly compile -panda without helix. I have a very short Windows BAT file called +panda without eigen. I have a very short Windows BAT file called "mkp.bat" that looks like this: @echo off - makepanda --everything --no-helix + makepanda --everything --no-eigen This helps me avoid accidentally typing makepanda with the wrong options. diff --git a/dtool/src/cppparser/cppBison.yxx b/dtool/src/cppparser/cppBison.yxx index 80d78fe184..87c4f5cd17 100644 --- a/dtool/src/cppparser/cppBison.yxx +++ b/dtool/src/cppparser/cppBison.yxx @@ -21,7 +21,7 @@ #include "cppClassTemplateParameter.h" #include "cppTemplateParameterList.h" #include "cppInstanceIdentifier.h" -#include "cppTypedef.h" +#include "cppTypedefType.h" #include "cppTypeDeclaration.h" #include "cppVisibility.h" #include "cppIdentifier.h" @@ -241,7 +241,8 @@ pop_struct() { %token KW_BOOL %token KW_CATCH %token KW_CHAR -%token KW_WCHAR_T +%token KW_CHAR16_T +%token KW_CHAR32_T %token KW_CLASS %token KW_CONST %token KW_DELETE @@ -294,6 +295,7 @@ pop_struct() { %token KW_VIRTUAL %token KW_VOID %token KW_VOLATILE +%token KW_WCHAR_T %token KW_WHILE /* These special tokens are used to set the starting state of the @@ -325,8 +327,7 @@ pop_struct() { %type full_type %type anonymous_struct %type named_struct -%type anonymous_enum -%type named_enum +%type enum %type enum_keyword %type struct_keyword %type simple_type @@ -334,6 +335,7 @@ pop_struct() { %type simple_float_type %type simple_void_type %type class_derivation_name +%type enum_element_type /*%type typedefname*/ %type name %type string @@ -353,7 +355,7 @@ pop_struct() { /* Precedence rules. */ -%left IDENTIFIER TYPENAME_IDENTIFIER TYPEDEFNAME KW_ENUM ELLIPSIS KW_OPERATOR KW_TYPENAME KW_INT KW_SHORT KW_UNSIGNED KW_SIGNED KW_LONG KW_FLOAT KW_DOUBLE KW_CHAR KW_WCHAR_T KW_BOOL +%left IDENTIFIER TYPENAME_IDENTIFIER TYPEDEFNAME KW_ENUM ELLIPSIS KW_OPERATOR KW_TYPENAME KW_INT KW_SHORT KW_UNSIGNED KW_SIGNED KW_LONG KW_FLOAT KW_DOUBLE KW_CHAR KW_WCHAR_T KW_CHAR16_T KW_CHAR32_T KW_BOOL %left '{' ',' ';' @@ -493,17 +495,21 @@ declaration: CPPDeclaration *getter = $5->find_symbol(current_scope, global_scope, current_lexer); if (getter == (CPPDeclaration *)NULL || getter->get_subtype() != CPPDeclaration::ST_function_group) { yyerror("Reference to non-existent or invalid getter: " + $5->get_fully_scoped_name(), @1); - } - CPPDeclaration *setter = $7->find_symbol(current_scope, global_scope, current_lexer); - if (setter == (CPPDeclaration *)NULL || setter->get_subtype() != CPPDeclaration::ST_function_group) { - yyerror("Reference to non-existent or invalid setter: " + $7->get_fully_scoped_name(), @1); - } + } else { + CPPDeclaration *setter = $7->find_symbol(current_scope, global_scope, current_lexer); + CPPFunctionGroup *setter_func = NULL; - CPPMakeProperty *make_property = new CPPMakeProperty($3, getter->as_function_group(), - setter->as_function_group(), - current_scope, @1.file); - current_scope->add_declaration(make_property, global_scope, current_lexer, @1); + if (setter == (CPPDeclaration *)NULL || setter->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("Reference to non-existent or invalid setter: " + $7->get_fully_scoped_name(), @1); + } else { + setter_func = setter->as_function_group(); + } + + CPPMakeProperty *make_property = new CPPMakeProperty($3, getter->as_function_group(), + setter_func, current_scope, @1.file); + current_scope->add_declaration(make_property, global_scope, current_lexer, @1); + } } | KW_MAKE_SEQ '(' name ',' name ',' name ')' ';' { @@ -717,7 +723,8 @@ typedef_declaration: if (inst != (CPPInstance *)NULL) { inst->_storage_class |= (current_storage_class | $1); current_scope->add_declaration(inst, global_scope, current_lexer, @2); - current_scope->add_declaration(new CPPTypedef(inst, current_scope == global_scope), global_scope, current_lexer, @2); + CPPTypedefType *typedef_type = new CPPTypedefType(inst->_type, inst->_ident, current_scope); + current_scope->add_declaration(typedef_type, global_scope, current_lexer, @2); } } } @@ -726,19 +733,15 @@ typedef_declaration: typedef_instance_identifiers: instance_identifier maybe_initialize_or_function_body { - CPPInstance *inst = new CPPInstance(current_type, $1, - current_storage_class, - @1.file); - inst->set_initializer($2); - current_scope->add_declaration(new CPPTypedef(inst, current_scope == global_scope), global_scope, current_lexer, @1); + CPPType *target_type = current_type; + CPPTypedefType *typedef_type = new CPPTypedefType(target_type, $1, current_scope, @1.file); + current_scope->add_declaration(typedef_type, global_scope, current_lexer, @1); } | instance_identifier maybe_initialize ',' typedef_instance_identifiers { - CPPInstance *inst = new CPPInstance(current_type, $1, - current_storage_class, - @1.file); - inst->set_initializer($2); - current_scope->add_declaration(new CPPTypedef(inst, current_scope == global_scope), global_scope, current_lexer, @1); + CPPType *target_type = current_type; + CPPTypedefType *typedef_type = new CPPTypedefType(target_type, $1, current_scope, @1.file); + current_scope->add_declaration(typedef_type, global_scope, current_lexer, @1); } ; @@ -746,20 +749,16 @@ typedef_const_instance_identifiers: instance_identifier maybe_initialize_or_function_body { $1->add_modifier(IIT_const); - CPPInstance *inst = new CPPInstance(current_type, $1, - current_storage_class, - @1.file); - inst->set_initializer($2); - current_scope->add_declaration(new CPPTypedef(inst, current_scope == global_scope), global_scope, current_lexer, @1); + CPPType *target_type = current_type; + CPPTypedefType *typedef_type = new CPPTypedefType(target_type, $1, current_scope, @1.file); + current_scope->add_declaration(typedef_type, global_scope, current_lexer, @1); } | instance_identifier maybe_initialize ',' typedef_const_instance_identifiers { $1->add_modifier(IIT_const); - CPPInstance *inst = new CPPInstance(current_type, $1, - current_storage_class, - @1.file); - inst->set_initializer($2); - current_scope->add_declaration(new CPPTypedef(inst, current_scope == global_scope), global_scope, current_lexer, @1); + CPPType *target_type = current_type; + CPPTypedefType *typedef_type = new CPPTypedefType(target_type, $1, current_scope, @1.file); + current_scope->add_declaration(typedef_type, global_scope, current_lexer, @1); } ; @@ -1585,11 +1584,7 @@ type: { $$ = CPPType::new_type($1); } - | anonymous_enum -{ - $$ = CPPType::new_type($1); -} - | named_enum + | enum { $$ = CPPType::new_type($1); } @@ -1609,7 +1604,7 @@ type: $$ = et; } } - | enum_keyword name + | enum_keyword name ':' enum_element_type { CPPType *type = $2->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { @@ -1649,11 +1644,7 @@ type_decl: { $$ = new CPPTypeDeclaration(CPPType::new_type($1)); } - | anonymous_enum -{ - $$ = CPPType::new_type($1); -} - | named_enum + | enum { $$ = new CPPTypeDeclaration(CPPType::new_type($1)); } @@ -1672,9 +1663,27 @@ type_decl: } $$ = et; } +} + | enum_keyword name ':' enum_element_type +{ + CPPType *type = $2->find_type(current_scope, global_scope, false, current_lexer); + if (type != NULL) { + $$ = type; + } else { + CPPExtensionType *et = + CPPType::new_type(new CPPExtensionType($1, $2, current_scope, @1.file)) + ->as_extension_type(); + CPPScope *scope = $2->get_scope(current_scope, global_scope); + if (scope != NULL) { + scope->define_extension_type(et); + } + $$ = et; + } } | enum_keyword name { + yywarning(string("C++ does not permit forward declaration of untyped enum ") + $2->get_fully_scoped_name(), @1); + CPPType *type = $2->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { $$ = type; @@ -1858,27 +1867,41 @@ base_specification: } ; -anonymous_enum: - enum_keyword '{' -{ - current_enum = new CPPEnumType(NULL, current_scope, @1.file); -} - enum_body '}' +enum: + enum_decl '{' enum_body '}' { $$ = current_enum; current_enum = NULL; } ; -named_enum: - enum_keyword name '{' +enum_decl: + enum_keyword name ':' enum_element_type +{ + current_enum = new CPPEnumType($2, $4, current_scope, @1.file); +} + | enum_keyword name { current_enum = new CPPEnumType($2, current_scope, @1.file); } - enum_body '}' + | enum_keyword ':' enum_element_type { - $$ = current_enum; - current_enum = NULL; + current_enum = new CPPEnumType(NULL, $3, current_scope, @1.file); +} + | enum_keyword +{ + current_enum = new CPPEnumType(NULL, current_scope, @1.file); +} + ; + +enum_element_type: + simple_int_type +{ + $$ = CPPType::new_type($1); +} + | TYPENAME_IDENTIFIER +{ + $$ = $1->find_type(current_scope, global_scope, false, current_lexer); } ; @@ -1994,6 +2017,14 @@ simple_int_type: | KW_WCHAR_T { $$ = new CPPSimpleType(CPPSimpleType::T_wchar_t); +} + | KW_CHAR16_T +{ + $$ = new CPPSimpleType(CPPSimpleType::T_char16_t); +} + | KW_CHAR32_T +{ + $$ = new CPPSimpleType(CPPSimpleType::T_char32_t); } | KW_SHORT { @@ -2132,7 +2163,8 @@ element: | SCOPE | PLUSPLUS | MINUSMINUS | TIMESEQUAL | DIVIDEEQUAL | MODEQUAL | PLUSEQUAL | MINUSEQUAL | OREQUAL | ANDEQUAL | XOREQUAL | LSHIFTEQUAL | RSHIFTEQUAL - | KW_BOOL | KW_CATCH | KW_CHAR | KW_WCHAR_T | KW_CLASS | KW_CONST + | KW_BOOL | KW_CATCH | KW_CHAR | KW_CHAR16_T | KW_CHAR32_T + | KW_WCHAR_T | KW_CLASS | KW_CONST | KW_DELETE | KW_DOUBLE | KW_DYNAMIC_CAST | KW_ELSE | KW_ENUM | KW_EXTERN | KW_EXPLICIT | KW_FALSE | KW_FLOAT | KW_FRIEND | KW_FOR | KW_GOTO @@ -2369,6 +2401,18 @@ const_expr: CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_wchar_t)); $$ = new CPPExpression(CPPExpression::construct_op(type, $3)); +} + | KW_CHAR16_T '(' optional_const_expr_comma ')' +{ + CPPType *type = + CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_char16_t)); + $$ = new CPPExpression(CPPExpression::construct_op(type, $3)); +} + | KW_CHAR32_T '(' optional_const_expr_comma ')' +{ + CPPType *type = + CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_char32_t)); + $$ = new CPPExpression(CPPExpression::construct_op(type, $3)); } | KW_BOOL '(' optional_const_expr_comma ')' { diff --git a/dtool/src/cppparser/cppDeclaration.cxx b/dtool/src/cppparser/cppDeclaration.cxx index c124e797c0..13c81e734d 100644 --- a/dtool/src/cppparser/cppDeclaration.cxx +++ b/dtool/src/cppparser/cppDeclaration.cxx @@ -177,13 +177,13 @@ as_class_template_parameter() { } //////////////////////////////////////////////////////////////////// -// Function: CPPDeclaration::as_typedef +// Function: CPPDeclaration::as_typedef_type // Access: Public, Virtual // Description: //////////////////////////////////////////////////////////////////// -CPPTypedef *CPPDeclaration:: -as_typedef() { - return (CPPTypedef *)NULL; +CPPTypedefType *CPPDeclaration:: +as_typedef_type() { + return (CPPTypedefType *)NULL; } //////////////////////////////////////////////////////////////////// @@ -399,3 +399,24 @@ is_less(const CPPDeclaration *other) const { return this < other; } + +ostream & +operator << (ostream &out, const CPPDeclaration::SubstDecl &subst) { + CPPDeclaration::SubstDecl::const_iterator it; + for (it = subst.begin(); it != subst.end(); ++it) { + out << " "; + if (it->first == NULL) { + out << "(null)"; + } else { + out << *(it->first); + } + out << " -> "; + if (it->second == NULL) { + out << "(null)"; + } else { + out << *(it->second); + } + out << "\n"; + } + return out; +} diff --git a/dtool/src/cppparser/cppDeclaration.h b/dtool/src/cppparser/cppDeclaration.h index ba4c515142..db15f1ee2a 100644 --- a/dtool/src/cppparser/cppDeclaration.h +++ b/dtool/src/cppparser/cppDeclaration.h @@ -30,7 +30,7 @@ using namespace std; class CPPInstance; class CPPTemplateParameterList; -class CPPTypedef; +class CPPTypedefType; class CPPTypeDeclaration; class CPPExpression; class CPPType; @@ -64,7 +64,6 @@ public: enum SubType { // Subtypes of CPPDeclaration ST_instance, - ST_typedef, ST_type_declaration, ST_expression, ST_type, @@ -87,6 +86,7 @@ public: ST_class_template_parameter, ST_tbd, ST_type_proxy, + ST_typedef, }; CPPDeclaration(const CPPFile &file); @@ -120,7 +120,7 @@ public: virtual CPPInstance *as_instance(); virtual CPPClassTemplateParameter *as_class_template_parameter(); - virtual CPPTypedef *as_typedef(); + virtual CPPTypedefType *as_typedef_type(); virtual CPPTypeDeclaration *as_type_declaration(); virtual CPPExpression *as_expression(); virtual CPPType *as_type(); @@ -157,4 +157,7 @@ operator << (ostream &out, const CPPDeclaration &decl) { return out; } +ostream & +operator << (ostream &out, const CPPDeclaration::SubstDecl &decl); + #endif diff --git a/dtool/src/cppparser/cppEnumType.cxx b/dtool/src/cppparser/cppEnumType.cxx index 48e1bda523..5a79d8aabb 100644 --- a/dtool/src/cppparser/cppEnumType.cxx +++ b/dtool/src/cppparser/cppEnumType.cxx @@ -13,7 +13,7 @@ //////////////////////////////////////////////////////////////////// #include "cppEnumType.h" -#include "cppTypedef.h" +#include "cppTypedefType.h" #include "cppExpression.h" #include "cppSimpleType.h" #include "cppConstType.h" @@ -24,14 +24,37 @@ //////////////////////////////////////////////////////////////////// // Function: CPPEnumType::Constructor // Access: Public -// Description: +// Description: Creates an untyped, unscoped enum. //////////////////////////////////////////////////////////////////// CPPEnumType:: CPPEnumType(CPPIdentifier *ident, CPPScope *current_scope, const CPPFile &file) : CPPExtensionType(T_enum, ident, current_scope, file), + _parent_scope(current_scope), + _element_type(NULL), _last_value(NULL) { + if (ident != NULL) { + ident->_native_scope = current_scope; + } +} + +//////////////////////////////////////////////////////////////////// +// Function: CPPEnumType::Constructor +// Access: Public +// Description: Creates a typed but unscoped enum. +//////////////////////////////////////////////////////////////////// +CPPEnumType:: +CPPEnumType(CPPIdentifier *ident, CPPType *element_type, + CPPScope *current_scope, const CPPFile &file) : + CPPExtensionType(T_enum, ident, current_scope, file), + _parent_scope(current_scope), + _element_type(element_type), + _last_value(NULL) +{ + if (ident != NULL) { + ident->_native_scope = current_scope; + } } //////////////////////////////////////////////////////////////////// @@ -41,12 +64,24 @@ CPPEnumType(CPPIdentifier *ident, CPPScope *current_scope, //////////////////////////////////////////////////////////////////// CPPInstance *CPPEnumType:: add_element(const string &name, CPPExpression *value) { - CPPType *type = - CPPType::new_type(new CPPConstType(new CPPSimpleType( - CPPSimpleType::T_int, CPPSimpleType::F_unsigned))); - CPPIdentifier *ident = new CPPIdentifier(name); - CPPInstance *inst = new CPPInstance(type, ident); + ident->_native_scope = _parent_scope; + CPPInstance *inst; + + static CPPType *default_element_type = NULL; + if (_element_type == NULL) { + // This enum is untyped. Use a suitable default, ie. 'int'. + if (default_element_type == NULL) { + default_element_type = + CPPType::new_type(new CPPConstType(new CPPSimpleType(CPPSimpleType::T_int, 0))); + } + + inst = new CPPInstance(default_element_type, ident); + } else { + // This enum has an explicit type, so use that. + inst = new CPPInstance(CPPType::new_type(new CPPConstType(_element_type)), ident); + } + _elements.push_back(inst); if (value == (CPPExpression *)NULL) { @@ -81,6 +116,38 @@ is_incomplete() const { return false; } +//////////////////////////////////////////////////////////////////// +// Function: CPPEnumType::is_fully_specified +// Access: Public, Virtual +// Description: Returns true if this declaration is an actual, +// factual declaration, or false if some part of the +// declaration depends on a template parameter which has +// not yet been instantiated. +//////////////////////////////////////////////////////////////////// +bool CPPEnumType:: +is_fully_specified() const { + if (!CPPDeclaration::is_fully_specified()) { + return false; + } + + if (_ident != NULL && !_ident->is_fully_specified()) { + return false; + } + + if (_element_type != NULL && !_element_type->is_fully_specified()) { + return false; + } + + Elements::const_iterator ei; + for (ei = _elements.begin(); ei != _elements.end(); ++ei) { + if (!(*ei)->is_fully_specified()) { + return false; + } + } + + return true; +} + //////////////////////////////////////////////////////////////////// // Function: CPPEnumType::substitute_decl // Access: Public, Virtual @@ -95,12 +162,34 @@ substitute_decl(CPPDeclaration::SubstDecl &subst, } CPPEnumType *rep = new CPPEnumType(*this); + if (_ident != NULL) { rep->_ident = _ident->substitute_decl(subst, current_scope, global_scope); } - if (rep->_ident == _ident) { + if (_element_type != NULL) { + rep->_element_type = + _element_type->substitute_decl(subst, current_scope, global_scope) + ->as_type(); + } + + bool any_changed = false; + + for (int i = 0; i < _elements.size(); ++i) { + CPPInstance *elem_rep = + _elements[i]->substitute_decl(subst, current_scope, global_scope) + ->as_instance(); + + if (elem_rep != _elements[i]) { + rep->_elements[i] = elem_rep; + any_changed = true; + } + } + + if (rep->_ident == _ident && + rep->_element_type == _element_type && + !any_changed) { delete rep; rep = this; } @@ -124,15 +213,14 @@ output(ostream &out, int indent_level, CPPScope *scope, bool complete) const { } out << _ident->get_local_name(scope); - } else if (!complete && !_typedefs.empty()) { - // If we have a typedef name, use it. - out << _typedefs.front()->get_local_name(scope); - } else { out << _type; if (_ident != NULL) { out << " " << _ident->get_local_name(scope); } + if (_element_type != NULL) { + out << " : " << _element_type->get_local_name(scope); + } out << " {\n"; Elements::const_iterator ei; diff --git a/dtool/src/cppparser/cppEnumType.h b/dtool/src/cppparser/cppEnumType.h index 35d36b28f4..6fd9b395af 100644 --- a/dtool/src/cppparser/cppEnumType.h +++ b/dtool/src/cppparser/cppEnumType.h @@ -34,12 +34,15 @@ class CPPEnumType : public CPPExtensionType { public: CPPEnumType(CPPIdentifier *ident, CPPScope *current_scope, const CPPFile &file); + CPPEnumType(CPPIdentifier *ident, CPPType *element_type, + CPPScope *current_scope, const CPPFile &file); CPPInstance *add_element(const string &name, CPPExpression *value = (CPPExpression *)NULL); virtual bool is_incomplete() const; + virtual bool is_fully_specified() const; virtual CPPDeclaration *substitute_decl(SubstDecl &subst, CPPScope *current_scope, CPPScope *global_scope); @@ -50,6 +53,9 @@ public: virtual CPPEnumType *as_enum_type(); + CPPScope *_parent_scope; + CPPType *_element_type; + typedef vector Elements; Elements _elements; CPPExpression *_last_value; diff --git a/dtool/src/cppparser/cppExpression.cxx b/dtool/src/cppparser/cppExpression.cxx index 2bd295193d..2b344c36ef 100644 --- a/dtool/src/cppparser/cppExpression.cxx +++ b/dtool/src/cppparser/cppExpression.cxx @@ -147,6 +147,30 @@ as_pointer() const { } } +//////////////////////////////////////////////////////////////////// +// Function: CPPExpression::Result::as_boolean +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +bool CPPExpression::Result:: +as_boolean() const { + switch (_type) { + case RT_integer: + return (_u._integer != 0); + + case RT_real: + return (_u._real != 0.0); + + case RT_pointer: + return (_u._pointer != NULL); + + default: + cerr << "Invalid type\n"; + assert(false); + return false; + } +} + //////////////////////////////////////////////////////////////////// // Function: CPPExpression::Result::output // Access: Public @@ -226,7 +250,7 @@ CPPExpression(CPPIdentifier *ident, CPPScope *current_scope, CPPDeclaration(CPPFile()) { CPPDeclaration *decl = - ident->find_symbol(current_scope, global_scope, error_sink); + ident->find_symbol(current_scope, global_scope); if (decl != NULL) { CPPInstance *inst = decl->as_instance(); @@ -245,6 +269,7 @@ CPPExpression(CPPIdentifier *ident, CPPScope *current_scope, _type = T_unknown_ident; _u._ident = ident; + _u._ident->_native_scope = current_scope; } //////////////////////////////////////////////////////////////////// @@ -801,6 +826,66 @@ determine_type() const { return NULL; // Compiler kludge; can't get here. } +//////////////////////////////////////////////////////////////////// +// Function: CPPExpression::is_fully_specified +// Access: Public, Virtual +// Description: Returns true if this declaration is an actual, +// factual declaration, or false if some part of the +// declaration depends on a template parameter which has +// not yet been instantiated. +//////////////////////////////////////////////////////////////////// +bool CPPExpression:: +is_fully_specified() const { + if (!CPPDeclaration::is_fully_specified()) { + return false; + } + + switch (_type) { + case T_integer: + case T_real: + case T_string: + return false; + + case T_variable: + return _u._variable->is_fully_specified(); + + case T_function: + return _u._fgroup->is_fully_specified(); + + case T_unknown_ident: + return _u._ident->is_fully_specified(); + + case T_typecast: + case T_construct: + case T_new: + return (_u._typecast._to->is_fully_specified() && + _u._typecast._op1->is_fully_specified()); + + case T_default_construct: + case T_default_new: + case T_sizeof: + return _u._typecast._to->is_fully_specified(); + + case T_trinary_operation: + if (!_u._op._op3->is_fully_specified()) { + return false; + } + // Fall through + + case T_binary_operation: + if (!_u._op._op2->is_fully_specified()) { + return false; + } + // Fall through + + case T_unary_operation: + return _u._op._op1->is_fully_specified(); + + default: + return true; + } +} + //////////////////////////////////////////////////////////////////// // Function: CPPExpression::substitute_decl // Access: Public, Virtual @@ -827,6 +912,7 @@ substitute_decl(CPPDeclaration::SubstDecl &subst, // Replacing the variable reference with another variable reference. rep->_u._variable = decl->as_instance(); any_changed = true; + } else if (decl->as_expression()) { // Replacing the variable reference with an expression. delete rep; @@ -836,6 +922,43 @@ substitute_decl(CPPDeclaration::SubstDecl &subst, } break; + case T_unknown_ident: + rep->_u._ident = _u._ident->substitute_decl(subst, current_scope, global_scope); + any_changed = any_changed || (rep->_u._ident != _u._ident); + + // See if we can define it now. + decl = rep->_u._ident->find_symbol(current_scope, global_scope, subst); + if (decl != NULL) { + CPPInstance *inst = decl->as_instance(); + if (inst != NULL) { + rep->_type = T_variable; + rep->_u._variable = inst; + any_changed = true; + + decl = inst->substitute_decl(subst, current_scope, global_scope); + if (decl != inst) { + if (decl->as_instance()) { + // Replacing the variable reference with another variable reference. + rep->_u._variable = decl->as_instance(); + + } else if (decl->as_expression()) { + // Replacing the variable reference with an expression. + delete rep; + rep = decl->as_expression(); + } + } + break; + } + CPPFunctionGroup *fgroup = decl->as_function_group(); + if (fgroup != NULL) { + rep->_type = T_function; + rep->_u._fgroup = fgroup; + any_changed = true; + } + } + + break; + case T_typecast: case T_construct: case T_new: @@ -909,6 +1032,9 @@ is_tbd() const { return true; + case T_unknown_ident: + return true; + case T_typecast: case T_construct: case T_new: @@ -996,8 +1122,12 @@ output(ostream &out, int indent_level, CPPScope *scope, bool) const { break; case T_variable: + // We can just refer to the variable by name, except if it's a + // private constant, in which case we have to compute the value, + // since we may have to use it in generated code. if (_u._variable->_type != NULL && - _u._variable->_initializer != NULL) { + _u._variable->_initializer != NULL && + _u._variable->_vis > V_public) { // A const variable. Fetch its assigned value. CPPConstType *const_type = _u._variable->_type->as_const_type(); if (const_type != NULL) { @@ -1434,4 +1564,3 @@ is_less(const CPPDeclaration *other) const { return false; } - diff --git a/dtool/src/cppparser/cppExpression.h b/dtool/src/cppparser/cppExpression.h index 9ad8f35cf1..cd535b7320 100644 --- a/dtool/src/cppparser/cppExpression.h +++ b/dtool/src/cppparser/cppExpression.h @@ -63,6 +63,7 @@ public: int as_integer() const; double as_real() const; void *as_pointer() const; + bool as_boolean() const; void output(ostream &out) const; ResultType _type; @@ -78,6 +79,7 @@ public: CPPType *determine_type() const; bool is_tbd() const; + virtual bool is_fully_specified() const; virtual CPPDeclaration *substitute_decl(SubstDecl &subst, CPPScope *current_scope, CPPScope *global_scope); diff --git a/dtool/src/cppparser/cppExtensionType.cxx b/dtool/src/cppparser/cppExtensionType.cxx index fc2a1d8845..26022cf8bf 100644 --- a/dtool/src/cppparser/cppExtensionType.cxx +++ b/dtool/src/cppparser/cppExtensionType.cxx @@ -14,7 +14,7 @@ #include "cppExtensionType.h" -#include "cppTypedef.h" +#include "cppTypedefType.h" #include "cppIdentifier.h" #include "cppParser.h" #include "indent.h" @@ -130,6 +130,29 @@ substitute_decl(CPPDeclaration::SubstDecl &subst, return rep; } +//////////////////////////////////////////////////////////////////// +// Function: CPPExtensionType::resolve_type +// Access: Public, Virtual +// Description: If this CPPType object is a forward reference or +// other nonspecified reference to a type that might now +// be known a real type, returns the real type. +// Otherwise returns the type itself. +//////////////////////////////////////////////////////////////////// +CPPType *CPPExtensionType:: +resolve_type(CPPScope *current_scope, CPPScope *global_scope) { + if (_ident == NULL) { + // We can't resolve anonymous types. But that's OK, since they + // can't be forward declared anyway. + return this; + } + + // Maybe it has been defined by now. + CPPType *type = _ident->find_type(current_scope, global_scope); + if (type != NULL) { + return type; + } + return this; +} //////////////////////////////////////////////////////////////////// // Function: CPPExtensionType::is_equivalent_type diff --git a/dtool/src/cppparser/cppExtensionType.h b/dtool/src/cppparser/cppExtensionType.h index f8771f70ea..d1d810209c 100644 --- a/dtool/src/cppparser/cppExtensionType.h +++ b/dtool/src/cppparser/cppExtensionType.h @@ -25,7 +25,9 @@ class CPPIdentifier; /////////////////////////////////////////////////////////////////// // Class : CPPExtensionType -// Description : +// Description : Base class of enum, class, struct, and union types. +// An instance of the base class (instead of one of +// the specializations) is used for forward references. //////////////////////////////////////////////////////////////////// class CPPExtensionType : public CPPType { public: @@ -50,6 +52,9 @@ public: CPPScope *current_scope, CPPScope *global_scope); + virtual CPPType *resolve_type(CPPScope *current_scope, + CPPScope *global_scope); + virtual bool is_equivalent(const CPPType &other) const; diff --git a/dtool/src/cppparser/cppIdentifier.cxx b/dtool/src/cppparser/cppIdentifier.cxx index 14cd926e50..5c44b45a5a 100644 --- a/dtool/src/cppparser/cppIdentifier.cxx +++ b/dtool/src/cppparser/cppIdentifier.cxx @@ -39,7 +39,7 @@ CPPIdentifier(const string &name, const CPPFile &file) : _file(file) { // Description: //////////////////////////////////////////////////////////////////// CPPIdentifier:: -CPPIdentifier(const CPPNameComponent &name) { +CPPIdentifier(const CPPNameComponent &name, const CPPFile &file) : _file(file) { _names.push_back(name); _native_scope = (CPPScope *)NULL; } @@ -146,8 +146,10 @@ get_local_name(CPPScope *scope) const { if (scope == NULL || (_native_scope == NULL && _names.size() == 1)) { result = _names.back().get_name_with_templ(scope); + } else if (_names.front().empty()) { result = get_fully_scoped_name(); + } else { // Determine the scope of everything up until but not including the // last name. @@ -382,6 +384,7 @@ find_type(CPPScope *current_scope, CPPScope *global_scope, if (scope == NULL) { return NULL; } + CPPType *type = scope->find_type(get_simple_name(), subst, global_scope); if (type != NULL && _names.back().has_templ()) { // This is a template type. @@ -398,7 +401,6 @@ find_type(CPPScope *current_scope, CPPScope *global_scope, assert(new_type != NULL); if (new_type == type) { type = CPPType::new_type(new CPPTBDType((CPPIdentifier *)this)); - // type = new_type; } else { type = new_type; } @@ -424,6 +426,7 @@ find_symbol(CPPScope *current_scope, CPPScope *global_scope, if (scope == NULL) { return NULL; } + CPPDeclaration *sym; if (!_names.back().has_templ()) { sym = scope->find_symbol(get_simple_name()); @@ -446,6 +449,43 @@ find_symbol(CPPScope *current_scope, CPPScope *global_scope, return sym; } +//////////////////////////////////////////////////////////////////// +// Function: CPPIdentifier::find_symbol +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +CPPDeclaration *CPPIdentifier:: +find_symbol(CPPScope *current_scope, CPPScope *global_scope, + CPPDeclaration::SubstDecl &subst, + CPPPreprocessor *error_sink) const { + CPPScope *scope = get_scope(current_scope, global_scope, subst, error_sink); + if (scope == NULL) { + return NULL; + } + + CPPDeclaration *sym; + if (!_names.back().has_templ()) { + sym = scope->find_symbol(get_simple_name()); + + } else { + sym = scope->find_template(get_simple_name()); + + if (sym != NULL) { + CPPType *type = sym->as_type(); + if (type != NULL && type->is_incomplete()) { + // We can't instantiate an incomplete type. + sym = CPPType::new_type(new CPPTBDType((CPPIdentifier *)this)); + } else { + // Instantiate the symbol. + sym = sym->instantiate(_names.back().get_templ(), current_scope, + global_scope, error_sink); + } + } + } + + return sym; +} + //////////////////////////////////////////////////////////////////// // Function: CPPIdentifier::find_template // Access: Public diff --git a/dtool/src/cppparser/cppIdentifier.h b/dtool/src/cppparser/cppIdentifier.h index 14a57d926b..6c3e95b030 100644 --- a/dtool/src/cppparser/cppIdentifier.h +++ b/dtool/src/cppparser/cppIdentifier.h @@ -36,7 +36,7 @@ class CPPTemplateParameterList; class CPPIdentifier { public: CPPIdentifier(const string &name, const CPPFile &file = CPPFile()); - CPPIdentifier(const CPPNameComponent &name); + CPPIdentifier(const CPPNameComponent &name, const CPPFile &file = CPPFile()); void add_name(const string &name); void add_name(const CPPNameComponent &name); @@ -69,6 +69,10 @@ public: CPPDeclaration *find_symbol(CPPScope *current_scope, CPPScope *global_scope, CPPPreprocessor *error_sink = NULL) const; + CPPDeclaration *find_symbol(CPPScope *current_scope, + CPPScope *global_scope, + CPPDeclaration::SubstDecl &subst, + CPPPreprocessor *error_sink = NULL) const; CPPDeclaration *find_template(CPPScope *current_scope, CPPScope *global_scope, CPPPreprocessor *error_sink = NULL) const; diff --git a/dtool/src/cppparser/cppInstance.cxx b/dtool/src/cppparser/cppInstance.cxx index 6eeed02226..aaaff2eb24 100644 --- a/dtool/src/cppparser/cppInstance.cxx +++ b/dtool/src/cppparser/cppInstance.cxx @@ -372,6 +372,7 @@ CPPDeclaration *CPPInstance:: instantiate(const CPPTemplateParameterList *actual_params, CPPScope *current_scope, CPPScope *global_scope, CPPPreprocessor *error_sink) const { + if (!is_template()) { if (error_sink != NULL) { error_sink->warning("Ignoring template parameters for instance " + @@ -457,7 +458,6 @@ substitute_decl(CPPDeclaration::SubstDecl &subst, rep->_type = new_type->as_type(); if (rep->_type == NULL) { - cerr << "Type " << *_type << " became " << *new_type << " which isn't a type\n"; rep->_type = _type; } diff --git a/dtool/src/cppparser/cppManifest.cxx b/dtool/src/cppparser/cppManifest.cxx index e8843147ac..ff0d50e8e4 100644 --- a/dtool/src/cppparser/cppManifest.cxx +++ b/dtool/src/cppparser/cppManifest.cxx @@ -47,8 +47,8 @@ ExpansionNode(const string &str, bool paste) : //////////////////////////////////////////////////////////////////// CPPManifest:: CPPManifest(const string &args, const CPPFile &file) : - _file(file), _variadic_param(-1), + _file(file), _expr((CPPExpression *)NULL) { assert(!args.empty()); @@ -184,7 +184,7 @@ expand(const vector_string &args) const { // to a comma and no arguments are passed, the comma // is removed. MSVC does this automatically. Not sure // if we should allow MSVC behavior as well. - if (*result.rbegin() == ',') { + if (!result.empty() && *result.rbegin() == ',') { result.resize(result.size() - 1); } } diff --git a/dtool/src/cppparser/cppPreprocessor.cxx b/dtool/src/cppparser/cppPreprocessor.cxx index 591f856da6..482a8cbabe 100644 --- a/dtool/src/cppparser/cppPreprocessor.cxx +++ b/dtool/src/cppparser/cppPreprocessor.cxx @@ -200,6 +200,7 @@ CPPPreprocessor() { _warning_count = 0; _error_count = 0; + _error_abort = false; #ifdef CPP_VERBOSE_LEX _token_index = 0; #endif @@ -404,8 +405,7 @@ get_next_token0() { int token_type = IDENTIFIER; CPPDeclaration *decl = ident->find_symbol(current_scope, global_scope); - if (decl != NULL && - (decl->as_typedef() != NULL || decl->as_type() != NULL)) { + if (decl != NULL && decl->as_type() != NULL) { token_type = TYPENAME_IDENTIFIER; } @@ -432,10 +432,14 @@ warning(const string &message, int line, int col, CPPFile file) { if (file.empty()) { file = get_file(); } - indent(cerr, _files.size() * 2) + int indent_level = 0; + if (_verbose >= 3) { + indent_level = _files.size() * 2; + } + indent(cerr, indent_level) << "*** Warning in " << file << " near line " << line << ", column " << col << ":\n"; - indent(cerr, _files.size() * 2) + indent(cerr, indent_level) << message << "\n"; } _warning_count++; @@ -452,7 +456,7 @@ error(const string &message, int line, int col, CPPFile file) { // Don't report or log errors in the nested state. These will be // reported when the nesting level collapses. return; - }; + } if (_verbose >= 1) { if (line == 0) { @@ -462,11 +466,20 @@ error(const string &message, int line, int col, CPPFile file) { if (file.empty()) { file = get_file(); } - indent(cerr, _files.size() * 2) + int indent_level = 0; + if (_verbose >= 3) { + indent_level = _files.size() * 2; + } + indent(cerr, indent_level) << "*** Error in " << file << " near line " << line << ", column " << col << ":\n"; - indent(cerr, _files.size() * 2) + indent(cerr, indent_level) << message << "\n"; + + if (_error_abort) { + cerr << "Aborting.\n"; + abort(); + } } _error_count++; } @@ -603,7 +616,7 @@ init_type(const string &type) { //////////////////////////////////////////////////////////////////// bool CPPPreprocessor:: push_file(const CPPFile &file) { - if (_verbose >= 2) { + if (_verbose >= 3) { indent(cerr, _files.size() * 2) << "Reading " << file << "\n"; } @@ -2009,7 +2022,8 @@ check_keyword(const string &name) { if (name == "bool") return KW_BOOL; if (name == "catch") return KW_CATCH; if (name == "char") return KW_CHAR; - if (name == "wchar_t") return KW_WCHAR_T; + if (name == "char16_t") return KW_CHAR16_T; + if (name == "char32_t") return KW_CHAR32_T; if (name == "class") return KW_CLASS; if (name == "const") return KW_CONST; if (name == "delete") return KW_DELETE; @@ -2061,6 +2075,7 @@ check_keyword(const string &name) { if (name == "virtual") return KW_VIRTUAL; if (name == "void") return KW_VOID; if (name == "volatile") return KW_VOLATILE; + if (name == "wchar_t") return KW_WCHAR_T; if (name == "while") return KW_WHILE; // These are alternative ways to refer to built-in operators. @@ -2287,7 +2302,6 @@ unget(int c) { _unget = c; } - //////////////////////////////////////////////////////////////////// // Function: CPPPreprocessor::nested_parse_template_instantiation // Access: Private diff --git a/dtool/src/cppparser/cppPreprocessor.h b/dtool/src/cppparser/cppPreprocessor.h index 34647193c8..6d86a06846 100644 --- a/dtool/src/cppparser/cppPreprocessor.h +++ b/dtool/src/cppparser/cppPreprocessor.h @@ -209,6 +209,7 @@ private: int _warning_count; int _error_count; + bool _error_abort; }; #endif diff --git a/dtool/src/cppparser/cppScope.cxx b/dtool/src/cppparser/cppScope.cxx index 8ca9babad4..565a9ef4e5 100644 --- a/dtool/src/cppparser/cppScope.cxx +++ b/dtool/src/cppparser/cppScope.cxx @@ -16,7 +16,7 @@ #include "cppScope.h" #include "cppDeclaration.h" #include "cppNamespace.h" -#include "cppTypedef.h" +#include "cppTypedefType.h" #include "cppTypeDeclaration.h" #include "cppExtensionType.h" #include "cppInstance.h" @@ -136,7 +136,7 @@ add_declaration(CPPDeclaration *decl, CPPScope *global_scope, _declarations.push_back(decl); - handle_declaration(decl, global_scope); + handle_declaration(decl, global_scope, preprocessor); } //////////////////////////////////////////////////////////////////// @@ -185,9 +185,12 @@ add_enum_value(CPPInstance *inst, CPPPreprocessor *preprocessor, // Description: //////////////////////////////////////////////////////////////////// void CPPScope:: -define_extension_type(CPPExtensionType *type) { +define_extension_type(CPPExtensionType *type, CPPPreprocessor *error_sink) { assert(type != NULL); - string name = type->get_simple_name(); + string name = type->get_local_name(this); + if (name.empty()) { + return; + } switch (type->_type) { case CPPExtensionType::T_class: @@ -200,34 +203,59 @@ define_extension_type(CPPExtensionType *type) { case CPPExtensionType::T_union: _unions[name] = type; + break; case CPPExtensionType::T_enum: _enums[name] = type; + break; } // Create an implicit typedef for the extension. - CPPIdentifier *ident = new CPPIdentifier(name); - CPPTypedef *td = new CPPTypedef(new CPPInstance(type, ident), false); - pair result = - _typedefs.insert(Typedefs::value_type(name, td)); + //CPPTypedefType *td = new CPPTypedefType(type, name); + pair result = + _types.insert(Types::value_type(name, type)); if (!result.second) { // There's already a typedef for this extension. This one - // overrides if it has template parameters and the other one - // doesn't. - CPPType *other_type = (*result.first).second->_type; - if (type->is_template() && !other_type->is_template()) { - (*result.first).second = td; + // overrides it only if the other is a forward declaration. + CPPType *other_type = (*result.first).second; - // Or if the other one is a forward reference. - } else if (other_type->get_subtype() == CPPDeclaration::ST_extension) { - (*result.first).second = td; + if (other_type->get_subtype() == CPPDeclaration::ST_extension) { + CPPExtensionType *other_ext = other_type->as_extension_type(); + + if (other_ext->_type != type->_type) { + if (error_sink != NULL) { + ostringstream errstr; + errstr << other_ext->_type << " " << type->get_fully_scoped_name() + << " was previously declared as " << other_ext->_type << "\n"; + error_sink->error(errstr.str()); + } + } + (*result.first).second = type; + + } else { + CPPTypedefType *other_td = other_type->as_typedef_type(); + + // Error out if the declaration is different than the previous one. + if (other_type != type && + (other_td == NULL || other_td->_type != type)) { + + if (error_sink != NULL) { + ostringstream errstr; + type->output(errstr, 0, NULL, false); + errstr << " has conflicting declaration as "; + other_type->output(errstr, 0, NULL, true); + error_sink->error(errstr.str()); + } + } } } if (type->is_template()) { + string simple_name = type->get_simple_name(); + pair result = - _templates.insert(Templates::value_type(name, type)); + _templates.insert(Templates::value_type(simple_name, type)); if (!result.second) { // The template was not inserted because we already had a @@ -277,7 +305,7 @@ add_using(CPPUsing *using_decl, CPPScope *global_scope, } else { CPPDeclaration *decl = using_decl->_ident->find_symbol(this, global_scope); if (decl != NULL) { - handle_declaration(decl, global_scope); + handle_declaration(decl, global_scope, error_sink); } else { if (error_sink != NULL) { error_sink->warning("Attempt to use unknown symbol: " + using_decl->_ident->get_fully_scoped_name()); @@ -391,11 +419,13 @@ instantiate(const CPPTemplateParameterList *actual_params, CPPDeclaration *decl = (*pi); CPPClassTemplateParameter *ctp = decl->as_class_template_parameter(); if (ctp != NULL) { - CPPInstance *inst = new CPPInstance(ctp, ctp->_ident); - CPPTypedef *td = new CPPTypedef(inst, true); - scope->_typedefs.insert(Typedefs::value_type - (ctp->_ident->get_local_name(), - td)); + //CPPTypedefType *td = new CPPTypedefType(ctp, ctp->_ident); + //scope->_typedefs.insert(Typedefs::value_type + // (ctp->_ident->get_local_name(), + // td)); + scope->_types.insert(Types::value_type + (ctp->_ident->get_local_name(), + ctp)); } } } @@ -465,10 +495,10 @@ substitute_decl(CPPDeclaration::SubstDecl &subst, //////////////////////////////////////////////////////////////////// CPPType *CPPScope:: find_type(const string &name, bool recurse) const { - Typedefs::const_iterator ti; - ti = _typedefs.find(name); - if (ti != _typedefs.end()) { - return (*ti).second->_type; + Types::const_iterator ti; + ti = _types.find(name); + if (ti != _types.end()) { + return ti->second; } Using::const_iterator ui; @@ -509,11 +539,11 @@ find_type(const string &name, bool recurse) const { CPPType *CPPScope:: find_type(const string &name, CPPDeclaration::SubstDecl &subst, CPPScope *global_scope, bool recurse) const { - Typedefs::const_iterator ti; - ti = _typedefs.find(name); - if (ti != _typedefs.end()) { + Types::const_iterator ti; + ti = _types.find(name); + if (ti != _types.end()) { CPPScope *current_scope = (CPPScope *)this; - return (*ti).second->_type->substitute_decl + return (*ti).second->substitute_decl (subst, current_scope, global_scope)->as_type(); } @@ -562,10 +592,14 @@ find_scope(const string &name, bool recurse) const { CPPType *type = (CPPType *)NULL; - Typedefs::const_iterator ti; - ti = _typedefs.find(name); - if (ti != _typedefs.end()) { - type = (*ti).second->_type; + Types::const_iterator ti; + ti = _types.find(name); + if (ti != _types.end()) { + type = (*ti).second; + // Resolve if this is a typedef. + while (type->as_typedef_type() != (CPPTypedefType *)NULL) { + type = type->as_typedef_type()->_type; + } } else if (_struct_type != NULL) { CPPStructType::Derivation::const_iterator di; @@ -613,10 +647,17 @@ find_scope(const string &name, CPPDeclaration::SubstDecl &subst, if (type == NULL) { return NULL; } + + // Resolve this if it is a typedef. + while (type->get_subtype() == CPPDeclaration::ST_typedef) { + type = type->as_typedef_type()->_type; + } + CPPStructType *st = type->as_struct_type(); if (st == NULL) { return NULL; } + return st->_scope; } @@ -631,10 +672,10 @@ find_symbol(const string &name, bool recurse) const { return _struct_type; } - Typedefs::const_iterator ti; - ti = _typedefs.find(name); - if (ti != _typedefs.end()) { - return (*ti).second->_type; + Types::const_iterator ti; + ti = _types.find(name); + if (ti != _types.end()) { + return (*ti).second; } Variables::const_iterator vi; @@ -755,9 +796,14 @@ get_local_name(CPPScope *scope) const { } */ - if (scope != NULL && _parent_scope != NULL && _parent_scope != scope) { - return _parent_scope->get_local_name(scope) + "::" + - _name.get_name_with_templ(); + if (scope != NULL && _parent_scope != NULL/* && _parent_scope != scope*/) { + string parent_scope_name = _parent_scope->get_local_name(scope); + if (parent_scope_name.empty()) { + return _name.get_name_with_templ(); + } else { + return parent_scope_name + "::" + + _name.get_name_with_templ(); + } } else { return _name.get_name_with_templ(); } @@ -816,8 +862,7 @@ write(ostream &out, int indent_level, CPPScope *scope) const { } bool complete = false; - if (cd->as_typedef() != NULL || cd->as_type() != NULL || - cd->as_namespace() != NULL) { + if (cd->as_type() != NULL || cd->as_namespace() != NULL) { complete = true; } @@ -880,7 +925,7 @@ copy_substitute_decl(CPPScope *to_scope, CPPDeclaration::SubstDecl &subst, } to_scope->_struct_type = new CPPStructType(_struct_type->_type, - new CPPIdentifier(to_scope->_name), + new CPPIdentifier(to_scope->_name, _struct_type->_file), native_scope, to_scope, _struct_type->_file); to_scope->_struct_type->_incomplete = false; @@ -985,11 +1030,11 @@ copy_substitute_decl(CPPScope *to_scope, CPPDeclaration::SubstDecl &subst, } } - Typedefs::const_iterator ti; - for (ti = _typedefs.begin(); ti != _typedefs.end(); ++ti) { - CPPTypedef *td = - (*ti).second->substitute_decl(subst, to_scope, global_scope)->as_typedef(); - to_scope->_typedefs.insert(Typedefs::value_type((*ti).first, td)); + Types::const_iterator ti; + for (ti = _types.begin(); ti != _types.end(); ++ti) { + CPPType *td = + (*ti).second->substitute_decl(subst, to_scope, global_scope)->as_type(); + to_scope->_types.insert(Types::value_type((*ti).first, td)); if (td != (*ti).second) { anything_changed = true; } @@ -999,6 +1044,19 @@ copy_substitute_decl(CPPScope *to_scope, CPPDeclaration::SubstDecl &subst, CPPInstance *inst = (*vi).second->substitute_decl(subst, to_scope, global_scope)->as_instance(); to_scope->_variables.insert(Variables::value_type((*vi).first, inst)); + if (inst != (*vi).second) { + // I don't know if this _native_scope assignment is right, but it + // fixes some issues with variables in instantiated template scopes + // being printed out with an uninstantiated template scope prefix. ~rdb + inst->_ident->_native_scope = to_scope; + anything_changed = true; + } + } + + for (vi = _enum_values.begin(); vi != _enum_values.end(); ++vi) { + CPPInstance *inst = + (*vi).second->substitute_decl(subst, to_scope, global_scope)->as_instance(); + to_scope->_enum_values.insert(Variables::value_type((*vi).first, inst)); if (inst != (*vi).second) { anything_changed = true; } @@ -1026,25 +1084,41 @@ copy_substitute_decl(CPPScope *to_scope, CPPDeclaration::SubstDecl &subst, // functions, or whatever. //////////////////////////////////////////////////////////////////// void CPPScope:: -handle_declaration(CPPDeclaration *decl, CPPScope *global_scope) { - CPPTypedef *def = decl->as_typedef(); +handle_declaration(CPPDeclaration *decl, CPPScope *global_scope, + CPPPreprocessor *error_sink) { + CPPTypedefType *def = decl->as_typedef_type(); if (def != NULL) { string name = def->get_simple_name(); - _typedefs[name] = def; + + pair result = + _types.insert(Types::value_type(name, def)); + + if (!result.second) { + CPPType *other_type = result.first->second; + CPPTypedefType *other_td = other_type->as_typedef_type(); + + // We don't do redefinitions of typedefs. But we don't complain + // as long as this is actually a typedef to the previous definition. + if (other_type != def->_type && + (other_td == NULL || other_td->_type != def->_type)) { + + if (error_sink != NULL) { + ostringstream errstr; + def->output(errstr, 0, NULL, false); + errstr << " has conflicting declaration as "; + other_type->output(errstr, 0, NULL, true); + error_sink->error(errstr.str()); + } + } + } else { + _types[name] = def; + } CPPExtensionType *et = def->_type->as_extension_type(); if (et != NULL) { - define_extension_type(et); + define_extension_type(et, error_sink); } - if (!name.empty() && def->get_scope(this, global_scope) == this) { - // Don't add a new template definition if we already had one - // by the same name in another scope. - - if (find_template(name) == NULL) { - _templates.insert(Templates::value_type(name, def)); - } - } return; } @@ -1052,7 +1126,7 @@ handle_declaration(CPPDeclaration *decl, CPPScope *global_scope) { if (typedecl != (CPPTypeDeclaration *)NULL) { CPPExtensionType *et = typedecl->_type->as_extension_type(); if (et != NULL) { - define_extension_type(et); + define_extension_type(et, error_sink); } return; } @@ -1061,6 +1135,13 @@ handle_declaration(CPPDeclaration *decl, CPPScope *global_scope) { if (inst != NULL) { inst->check_for_constructor(this, global_scope); + if (inst->_ident != NULL) { + // Not sure if this is the best place to assign this. However, + // this fixes a bug with variables in expressions not having + // the proper scoping prefix. ~rdb + inst->_ident->_native_scope = this; + } + string name = inst->get_simple_name(); if (!name.empty() && inst->get_scope(this, global_scope) == this) { if (inst->_type->as_function_type()) { @@ -1107,6 +1188,6 @@ handle_declaration(CPPDeclaration *decl, CPPScope *global_scope) { CPPExtensionType *et = decl->as_extension_type(); if (et != NULL) { - define_extension_type(et); + define_extension_type(et, error_sink); } } diff --git a/dtool/src/cppparser/cppScope.h b/dtool/src/cppparser/cppScope.h index 324eb91766..e7bccbd7fe 100644 --- a/dtool/src/cppparser/cppScope.h +++ b/dtool/src/cppparser/cppScope.h @@ -34,7 +34,7 @@ class CPPExtensionType; class CPPStructType; class CPPNamespace; class CPPUsing; -class CPPTypedef; +class CPPTypedefType; class CPPInstance; class CPPFunctionGroup; class CPPTemplateScope; @@ -66,7 +66,8 @@ public: virtual void add_enum_value(CPPInstance *inst, CPPPreprocessor *preprocessor, const cppyyltype &pos); - virtual void define_extension_type(CPPExtensionType *type); + virtual void define_extension_type(CPPExtensionType *type, + CPPPreprocessor *error_sink = NULL); virtual void define_namespace(CPPNamespace *scope); virtual void add_using(CPPUsing *using_decl, CPPScope *global_scope, CPPPreprocessor *error_sink = NULL); @@ -113,7 +114,8 @@ private: copy_substitute_decl(CPPScope *to_scope, CPPDeclaration::SubstDecl &subst, CPPScope *global_scope) const; - void handle_declaration(CPPDeclaration *decl, CPPScope *global_scope); + void handle_declaration(CPPDeclaration *decl, CPPScope *global_scope, + CPPPreprocessor *error_sink = NULL); public: typedef vector Declarations; @@ -128,8 +130,8 @@ public: typedef map Namespaces; Namespaces _namespaces; - typedef map Typedefs; - Typedefs _typedefs; + typedef map Types; + Types _types; typedef map Variables; Variables _variables; Variables _enum_values; diff --git a/dtool/src/cppparser/cppSimpleType.cxx b/dtool/src/cppparser/cppSimpleType.cxx index b7ee4b4da7..7ce7048848 100644 --- a/dtool/src/cppparser/cppSimpleType.cxx +++ b/dtool/src/cppparser/cppSimpleType.cxx @@ -99,6 +99,10 @@ output(ostream &out, int, CPPScope *, bool) const { } switch (_type) { + case T_unknown: + out << "unknown"; + break; + case T_bool: out << "bool"; break; @@ -111,6 +115,14 @@ output(ostream &out, int, CPPScope *, bool) const { out << "wchar_t"; break; + case T_char16_t: + out << "char16_t"; + break; + + case T_char32_t: + out << "char32_t"; + break; + case T_int: out << "int"; break; @@ -127,10 +139,6 @@ output(ostream &out, int, CPPScope *, bool) const { out << "void"; break; - case T_unknown: - out << "unknown"; - break; - case T_parameter: out << "parameter"; break; diff --git a/dtool/src/cppparser/cppSimpleType.h b/dtool/src/cppparser/cppSimpleType.h index e8b9a4c6dc..6ac032456b 100644 --- a/dtool/src/cppparser/cppSimpleType.h +++ b/dtool/src/cppparser/cppSimpleType.h @@ -26,14 +26,16 @@ class CPPSimpleType : public CPPType { public: enum Type { + T_unknown, T_bool, T_char, - T_wchar_t, // Not strictly a builtin type, but we pretend. + T_wchar_t, + T_char16_t, + T_char32_t, T_int, T_float, T_double, T_void, - T_unknown, // T_parameter is a special type which is assigned to expressions // that are discovered where a formal parameter was expected. diff --git a/dtool/src/cppparser/cppStructType.cxx b/dtool/src/cppparser/cppStructType.cxx index 48460ea87f..0c138f586d 100644 --- a/dtool/src/cppparser/cppStructType.cxx +++ b/dtool/src/cppparser/cppStructType.cxx @@ -14,7 +14,7 @@ #include "cppStructType.h" -#include "cppTypedef.h" +#include "cppTypedefType.h" #include "cppScope.h" #include "cppTypeProxy.h" #include "cppTemplateScope.h" @@ -91,6 +91,13 @@ operator = (const CPPStructType ©) { void CPPStructType:: append_derivation(CPPType *base, CPPVisibility vis, bool is_virtual) { if (base != NULL) { + // Unwrap any typedefs, since we can't inherit from a typedef. + CPPTypedefType *def = base->as_typedef_type(); + while (def != NULL) { + base = def->_type; + def = base->as_typedef_type(); + } + Base b; b._base = base; b._vis = vis; @@ -110,7 +117,6 @@ get_scope() const { return _scope; } - //////////////////////////////////////////////////////////////////// // Function: CPPStructType::is_abstract // Access: Public @@ -246,7 +252,7 @@ instantiate(const CPPTemplateParameterList *actual_params, // don't yet know what its associated struct type will be. // Postpone the evaluation of this type. - CPPIdentifier *ident = new CPPIdentifier(get_fully_scoped_name()); + CPPIdentifier *ident = new CPPIdentifier(get_fully_scoped_name(), _file); return CPPType::new_type(new CPPTBDType(ident)); } @@ -318,7 +324,7 @@ substitute_decl(CPPDeclaration::SubstDecl &subst, rep->_template_scope = (CPPTemplateScope *)NULL; CPPNameComponent nc(get_simple_name()); nc.set_templ(pscope->_name.get_templ()); - rep->_ident = new CPPIdentifier(nc); + rep->_ident = new CPPIdentifier(nc, _file); } } } @@ -356,7 +362,6 @@ substitute_decl(CPPDeclaration::SubstDecl &subst, assert(rep != NULL); if (rep != this) { _instantiations.insert(rep); - // cerr << "Subst for " << *this << " is " << *rep << "\n"; } return rep; } @@ -377,15 +382,9 @@ output(ostream &out, int indent_level, CPPScope *scope, bool complete) const { if (is_template()) { CPPTemplateScope *tscope = get_template_scope(); - out << "< "; tscope->_parameters.output(out, scope); - out << " >"; } - } else if (!complete && !_typedefs.empty()) { - // If we have a typedef name, use it. - out << _typedefs.front()->get_local_name(scope); - } else { if (is_template()) { get_template_scope()->_parameters.write_formal(out, scope); diff --git a/dtool/src/cppparser/cppTemplateParameterList.cxx b/dtool/src/cppparser/cppTemplateParameterList.cxx index 2a2dcad7db..ebb40308b2 100644 --- a/dtool/src/cppparser/cppTemplateParameterList.cxx +++ b/dtool/src/cppparser/cppTemplateParameterList.cxx @@ -52,6 +52,7 @@ void CPPTemplateParameterList:: build_subst_decl(const CPPTemplateParameterList &formal_params, CPPDeclaration::SubstDecl &subst, CPPScope *current_scope, CPPScope *global_scope) const { + Parameters::const_iterator pfi, pai; for (pfi = formal_params._parameters.begin(), pai = _parameters.begin(); pfi != formal_params._parameters.end() && pai != _parameters.end(); diff --git a/dtool/src/cppparser/cppTemplateScope.cxx b/dtool/src/cppparser/cppTemplateScope.cxx index e4b6f5a922..7f5fdbb089 100644 --- a/dtool/src/cppparser/cppTemplateScope.cxx +++ b/dtool/src/cppparser/cppTemplateScope.cxx @@ -17,7 +17,7 @@ #include "cppExtensionType.h" #include "cppClassTemplateParameter.h" #include "cppIdentifier.h" -#include "cppTypedef.h" +#include "cppTypedefType.h" //////////////////////////////////////////////////////////////////// // Function: CPPTemplateScope::Constructor @@ -64,10 +64,10 @@ add_enum_value(CPPInstance *inst, CPPPreprocessor *preprocessor, // Description: //////////////////////////////////////////////////////////////////// void CPPTemplateScope:: -define_extension_type(CPPExtensionType *type) { +define_extension_type(CPPExtensionType *type, CPPPreprocessor *error_sink) { type->_template_scope = this; assert(_parent_scope != NULL); - _parent_scope->define_extension_type(type); + _parent_scope->define_extension_type(type, error_sink); } //////////////////////////////////////////////////////////////////// @@ -105,8 +105,9 @@ add_template_parameter(CPPDeclaration *param) { if (cl != NULL) { // Create an implicit typedef for this class parameter. string name = cl->_ident->get_local_name(); - _typedefs[name] = new CPPTypedef(new CPPInstance(cl, cl->_ident), false); + _types[name] = cl; } + CPPInstance *inst = param->as_instance(); if (inst != NULL) { // Register the variable for this value parameter. diff --git a/dtool/src/cppparser/cppTemplateScope.h b/dtool/src/cppparser/cppTemplateScope.h index 40a7feb74c..b8fa313e23 100644 --- a/dtool/src/cppparser/cppTemplateScope.h +++ b/dtool/src/cppparser/cppTemplateScope.h @@ -39,7 +39,8 @@ public: virtual void add_enum_value(CPPInstance *inst, CPPPreprocessor *preprocessor, const cppyyltype &pos); - virtual void define_extension_type(CPPExtensionType *type); + virtual void define_extension_type(CPPExtensionType *type, + CPPPreprocessor *error_sink = NULL); virtual void define_namespace(CPPNamespace *scope); virtual void add_using(CPPUsing *using_decl, CPPScope *global_scope, CPPPreprocessor *error_sink = NULL); diff --git a/dtool/src/cppparser/cppType.cxx b/dtool/src/cppparser/cppType.cxx index 45f37f2dc7..bad935dba6 100644 --- a/dtool/src/cppparser/cppType.cxx +++ b/dtool/src/cppparser/cppType.cxx @@ -14,7 +14,7 @@ #include "cppType.h" -#include "cppTypedef.h" +#include "cppTypedefType.h" #include CPPType::Types CPPType::_types; diff --git a/dtool/src/cppparser/cppType.h b/dtool/src/cppparser/cppType.h index dfc2364e76..1d962e8d69 100644 --- a/dtool/src/cppparser/cppType.h +++ b/dtool/src/cppparser/cppType.h @@ -22,7 +22,7 @@ #include class CPPType; -class CPPTypedef; +class CPPTypedefType; class CPPTypeDeclaration; @@ -39,7 +39,7 @@ public: //////////////////////////////////////////////////////////////////// class CPPType : public CPPDeclaration { public: - typedef vector Typedefs; + typedef vector Typedefs; Typedefs _typedefs; CPPType(const CPPFile &file); diff --git a/dtool/src/cppparser/cppTypeProxy.cxx b/dtool/src/cppparser/cppTypeProxy.cxx index 88e22dd494..89fde2473a 100644 --- a/dtool/src/cppparser/cppTypeProxy.cxx +++ b/dtool/src/cppparser/cppTypeProxy.cxx @@ -357,6 +357,19 @@ as_tbd_type() { return _actual_type->as_tbd_type(); } +//////////////////////////////////////////////////////////////////// +// Function: CPPTypeProxy::as_typedef_type +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +CPPTypedefType *CPPTypeProxy:: +as_typedef_type() { + if (_actual_type == (CPPType *)NULL) { + return (CPPTypedefType *)NULL; + } + return _actual_type->as_typedef_type(); +} + //////////////////////////////////////////////////////////////////// // Function: CPPTypeProxy::as_type_proxy // Access: Public, Virtual @@ -366,4 +379,3 @@ CPPTypeProxy *CPPTypeProxy:: as_type_proxy() { return this; } - diff --git a/dtool/src/cppparser/cppTypeProxy.h b/dtool/src/cppparser/cppTypeProxy.h index f7f38558e4..c49ad008a0 100644 --- a/dtool/src/cppparser/cppTypeProxy.h +++ b/dtool/src/cppparser/cppTypeProxy.h @@ -19,7 +19,6 @@ #include "cppType.h" - /////////////////////////////////////////////////////////////////// // Class : CPPTypeProxy // Description : This is a special kind of type that is a placeholder @@ -66,6 +65,7 @@ public: virtual CPPStructType *as_struct_type(); virtual CPPEnumType *as_enum_type(); virtual CPPTBDType *as_tbd_type(); + virtual CPPTypedefType *as_typedef_type(); virtual CPPTypeProxy *as_type_proxy(); CPPType *_actual_type; diff --git a/dtool/src/cppparser/cppTypedef.cxx b/dtool/src/cppparser/cppTypedef.cxx deleted file mode 100644 index 7bb8002f61..0000000000 --- a/dtool/src/cppparser/cppTypedef.cxx +++ /dev/null @@ -1,91 +0,0 @@ -// Filename: cppTypedef.cxx -// Created by: drose (19Oct99) -// -//////////////////////////////////////////////////////////////////// -// -// PANDA 3D SOFTWARE -// Copyright (c) Carnegie Mellon University. All rights reserved. -// -// All use of this software is subject to the terms of the revised BSD -// license. You should have received a copy of this license along -// with this source code in a file named "LICENSE." -// -//////////////////////////////////////////////////////////////////// - - -#include "cppTypedef.h" - -//////////////////////////////////////////////////////////////////// -// Function: CPPTypedef::Constructor -// Access: Public -// Description: Constructs a new CPPTypedef object based on the -// indicated CPPInstance object. The CPPInstance is -// deallocated. -// -// If global is true, the typedef is defined at the -// global scope, and hence it's worth telling the type -// itself about. Otherwise, it's just a locally-scoped -// typedef. -//////////////////////////////////////////////////////////////////// -CPPTypedef:: -CPPTypedef(CPPInstance *inst, bool global) : CPPInstance(*inst) -{ - // Actually, we'll avoid deleting this for now. It causes problems - // for some reason to be determined later. - // delete inst; - - assert(_type != NULL); - if (global) { - _type->_typedefs.push_back(this); - CPPType::record_alt_name_for(_type, inst->get_local_name()); - } -} - -//////////////////////////////////////////////////////////////////// -// Function: CPPTypedef::substitute_decl -// Access: Public, Virtual -// Description: -//////////////////////////////////////////////////////////////////// -CPPDeclaration *CPPTypedef:: -substitute_decl(CPPDeclaration::SubstDecl &subst, - CPPScope *current_scope, CPPScope *global_scope) { - CPPDeclaration *decl = - CPPInstance::substitute_decl(subst, current_scope, global_scope); - assert(decl != NULL); - if (decl->as_typedef()) { - return decl; - } - assert(decl->as_instance() != NULL); - return new CPPTypedef(new CPPInstance(*decl->as_instance()), false); -} - -//////////////////////////////////////////////////////////////////// -// Function: CPPTypedef::output -// Access: Public, Virtual -// Description: -//////////////////////////////////////////////////////////////////// -void CPPTypedef:: -output(ostream &out, int indent_level, CPPScope *scope, bool) const { - out << "typedef "; - CPPInstance::output(out, indent_level, scope, false); -} - -//////////////////////////////////////////////////////////////////// -// Function: CPPTypedef::get_subtype -// Access: Public, Virtual -// Description: -//////////////////////////////////////////////////////////////////// -CPPDeclaration::SubType CPPTypedef:: -get_subtype() const { - return ST_typedef; -} - -//////////////////////////////////////////////////////////////////// -// Function: CPPTypedef::as_typedef -// Access: Public, Virtual -// Description: -//////////////////////////////////////////////////////////////////// -CPPTypedef *CPPTypedef:: -as_typedef() { - return this; -} diff --git a/dtool/src/cppparser/cppTypedef.h b/dtool/src/cppparser/cppTypedef.h deleted file mode 100644 index 6e8bfa5d53..0000000000 --- a/dtool/src/cppparser/cppTypedef.h +++ /dev/null @@ -1,42 +0,0 @@ -// Filename: cppTypedef.h -// Created by: drose (19Oct99) -// -//////////////////////////////////////////////////////////////////// -// -// PANDA 3D SOFTWARE -// Copyright (c) Carnegie Mellon University. All rights reserved. -// -// All use of this software is subject to the terms of the revised BSD -// license. You should have received a copy of this license along -// with this source code in a file named "LICENSE." -// -//////////////////////////////////////////////////////////////////// - -#ifndef CPPTYPEDEF_H -#define CPPTYPEDEF_H - -#include "dtoolbase.h" - -#include "cppInstance.h" - -/////////////////////////////////////////////////////////////////// -// Class : CPPTypedef -// Description : -//////////////////////////////////////////////////////////////////// -class CPPTypedef : public CPPInstance { -public: - CPPTypedef(CPPInstance *instance, bool global); - - virtual CPPDeclaration *substitute_decl(SubstDecl &subst, - CPPScope *current_scope, - CPPScope *global_scope); - - virtual void output(ostream &out, int indent_level, CPPScope *scope, - bool complete) const; - virtual SubType get_subtype() const; - - virtual CPPTypedef *as_typedef(); -}; - -#endif - diff --git a/dtool/src/cppparser/cppTypedefType.cxx b/dtool/src/cppparser/cppTypedefType.cxx new file mode 100644 index 0000000000..b1c86d9da2 --- /dev/null +++ b/dtool/src/cppparser/cppTypedefType.cxx @@ -0,0 +1,388 @@ +// Filename: cppTypedefType.cxx +// Created by: rdb (01Aug14) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + +#include "cppTypedefType.h" +#include "cppIdentifier.h" +#include "cppInstanceIdentifier.h" + +//////////////////////////////////////////////////////////////////// +// Function: CPPTypedefType::Constructor +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +CPPTypedefType:: +CPPTypedefType(CPPType *type, const string &name, CPPScope *current_scope) : + CPPType(CPPFile()), + _type(type), + _ident(new CPPIdentifier(name)) +{ + if (_ident != NULL) { + _ident->_native_scope = current_scope; + } + + _subst_decl_recursive_protect = false; + + //assert(_type != NULL); + //if (global) { + // _type->_typedefs.push_back(this); + // CPPType::record_alt_name_for(_type, inst->get_local_name()); + //} +} + +//////////////////////////////////////////////////////////////////// +// Function: CPPTypedefType::Constructor +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +CPPTypedefType:: +CPPTypedefType(CPPType *type, CPPIdentifier *ident, CPPScope *current_scope) : + CPPType(CPPFile()), + _type(type), + _ident(ident) +{ + if (_ident != NULL) { + _ident->_native_scope = current_scope; + } + _subst_decl_recursive_protect = false; +} + +//////////////////////////////////////////////////////////////////// +// Function: CPPTypedefType::Constructor +// Access: Public +// Description: Constructs a new CPPTypedefType object that defines a +// typedef to the indicated type according to the type +// and the InstanceIdentifier. The InstanceIdentifier +// pointer is deallocated. +//////////////////////////////////////////////////////////////////// +CPPTypedefType:: +CPPTypedefType(CPPType *type, CPPInstanceIdentifier *ii, + CPPScope *current_scope, const CPPFile &file) : + CPPType(file) +{ + _type = ii->unroll_type(type); + _ident = ii->_ident; + ii->_ident = NULL; + delete ii; + + if (_ident != NULL) { + _ident->_native_scope = current_scope; + } + + _subst_decl_recursive_protect = false; +} + +//////////////////////////////////////////////////////////////////// +// Function: CPPTypedefType::is_scoped +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +bool CPPTypedefType:: +is_scoped() const { + if (_ident == NULL) { + return false; + } else { + return _ident->is_scoped(); + } +} + +//////////////////////////////////////////////////////////////////// +// Function: CPPTypedefType::get_scope +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +CPPScope *CPPTypedefType:: +get_scope(CPPScope *current_scope, CPPScope *global_scope, + CPPPreprocessor *error_sink) const { + if (_ident == NULL) { + return current_scope; + } else { + return _ident->get_scope(current_scope, global_scope, error_sink); + } +} + +//////////////////////////////////////////////////////////////////// +// Function: CPPTypedefType::get_simple_name +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +string CPPTypedefType:: +get_simple_name() const { + if (_ident == NULL) { + return ""; + } + return _ident->get_simple_name(); +} + +//////////////////////////////////////////////////////////////////// +// Function: CPPTypedefType::get_local_name +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +string CPPTypedefType:: +get_local_name(CPPScope *scope) const { + if (_ident == NULL) { + return ""; + } + return _ident->get_local_name(scope); +} + +//////////////////////////////////////////////////////////////////// +// Function: CPPTypedefType::get_fully_scoped_name +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +string CPPTypedefType:: +get_fully_scoped_name() const { + if (_ident == NULL) { + return ""; + } + return _ident->get_fully_scoped_name(); +} + +//////////////////////////////////////////////////////////////////// +// Function: CPPTypedefType::is_incomplete +// Access: Public, Virtual +// Description: Returns true if the type has not yet been fully +// specified, false if it has. +//////////////////////////////////////////////////////////////////// +bool CPPTypedefType:: +is_incomplete() const { + return false; + //return _type->is_incomplete(); +} + +//////////////////////////////////////////////////////////////////// +// Function: CPPTypedefType::is_tbd +// Access: Public, Virtual +// Description: Returns true if the type, or any nested type within +// the type, is a CPPTBDType and thus isn't fully +// determined right now. In this case, calling +// resolve_type() may or may not resolve the type. +//////////////////////////////////////////////////////////////////// +bool CPPTypedefType:: +is_tbd() const { + if (_ident != NULL && _ident->is_tbd()) { + return true; + } + return _type->is_tbd(); +} + +//////////////////////////////////////////////////////////////////// +// Function: CPPTypedefType::is_fully_specified +// Access: Public, Virtual +// Description: Returns true if this declaration is an actual, +// factual declaration, or false if some part of the +// declaration depends on a template parameter which has +// not yet been instantiated. +//////////////////////////////////////////////////////////////////// +bool CPPTypedefType:: +is_fully_specified() const { + if (_ident != NULL && !_ident->is_fully_specified()) { + return false; + } + return CPPDeclaration::is_fully_specified() && + _type->is_fully_specified(); +} + +//////////////////////////////////////////////////////////////////// +// Function: CPPTypedefType::substitute_decl +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +CPPDeclaration *CPPTypedefType:: +substitute_decl(CPPDeclaration::SubstDecl &subst, + CPPScope *current_scope, CPPScope *global_scope) { + + return _type->substitute_decl(subst, current_scope, global_scope); + + // Bah, this doesn't seem to work, and I can't figure out why. + // Well, for now, let's just substitute it with the type we're + // pointing to. This is not a huge deal for now, until we find + // that we need to preserve these typedefs. + + /* + CPPDeclaration *top = + CPPType::substitute_decl(subst, current_scope, global_scope); + if (top != this) { + return top; + } + + if (_subst_decl_recursive_protect) { + // We're already executing this block; we'll have to return a + // proxy to the type which we'll define later. + CPPTypeProxy *proxy = new CPPTypeProxy; + _proxies.push_back(proxy); + assert(proxy != NULL); + return proxy; + } + _subst_decl_recursive_protect = true; + + CPPTypedefType *rep = new CPPTypedefType(*this); + CPPDeclaration *new_type = + _type->substitute_decl(subst, current_scope, global_scope); + rep->_type = new_type->as_type(); + + if (rep->_type == NULL) { + rep->_type = _type; + } + + if (_ident != NULL) { + rep->_ident = + _ident->substitute_decl(subst, current_scope, global_scope); + } + + if (rep->_type == _type && rep->_ident == _ident) { + delete rep; + rep = this; + } + + rep = CPPType::new_type(rep)->as_typedef_type(); + subst.insert(SubstDecl::value_type(this, rep)); + + _subst_decl_recursive_protect = false; + // Now fill in all the proxies we created for our recursive + // references. + Proxies::iterator pi; + for (pi = _proxies.begin(); pi != _proxies.end(); ++pi) { + (*pi)->_actual_type = rep; + } + + return rep; */ +} + +//////////////////////////////////////////////////////////////////// +// Function: CPPFunctionType::resolve_type +// Access: Public, Virtual +// Description: If this CPPType object is a forward reference or +// other nonspecified reference to a type that might now +// be known a real type, returns the real type. +// Otherwise returns the type itself. +//////////////////////////////////////////////////////////////////// +CPPType *CPPTypedefType:: +resolve_type(CPPScope *current_scope, CPPScope *global_scope) { + CPPType *ptype = _type->resolve_type(current_scope, global_scope); + + if (ptype != _type) { + CPPTypedefType *rep = new CPPTypedefType(*this); + rep->_type = ptype; + return CPPType::new_type(rep); + } + + return this; +} + +//////////////////////////////////////////////////////////////////// +// Function: CPPTypedefType::is_equivalent_type +// Access: Public, Virtual +// Description: This is a little more forgiving than is_equal(): it +// returns true if the types appear to be referring to +// the same thing, even if they may have different +// pointers or somewhat different definitions. It's +// useful for parameter matching, etc. +//////////////////////////////////////////////////////////////////// +bool CPPTypedefType:: +is_equivalent(const CPPType &other) const { + CPPType *ot = (CPPType *)&other; + + // Unwrap all the typedefs to get to where it is pointing. + while (ot->get_subtype() == ST_typedef) { + ot = ot->as_typedef_type()->_type; + } + + // Compare the unwrapped type to what we are pointing to. + // If we are pointing to a typedef ourselves, then this will + // automatically recurse. + return _type->is_equivalent(*ot); +} + +//////////////////////////////////////////////////////////////////// +// Function: CPPTypedefType::output +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +void CPPTypedefType:: +output(ostream &out, int indent_level, CPPScope *scope, bool complete) const { + string name; + if (_ident != NULL) { + name = _ident->get_local_name(scope); + } + + if (complete) { + out << "typedef "; + _type->output_instance(out, indent_level, scope, false, "", name); + } else { + out << name; + } +} + +//////////////////////////////////////////////////////////////////// +// Function: CPPTypedefType::get_subtype +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +CPPDeclaration::SubType CPPTypedefType:: +get_subtype() const { + return ST_typedef; +} + +//////////////////////////////////////////////////////////////////// +// Function: CPPTypedefType::as_typedef_type +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +CPPTypedefType *CPPTypedefType:: +as_typedef_type() { + return this; +} + +//////////////////////////////////////////////////////////////////// +// Function: CPPTypedefType::is_equal +// Access: Protected, Virtual +// Description: Called by CPPDeclaration() to determine whether this type is +// equivalent to another type of the same type. +//////////////////////////////////////////////////////////////////// +bool CPPTypedefType:: +is_equal(const CPPDeclaration *other) const { + const CPPTypedefType *ot = ((CPPDeclaration *)other)->as_typedef_type(); + assert(ot != NULL); + + return (_type == ot->_type) && (*_ident == *ot->_ident); +} + +//////////////////////////////////////////////////////////////////// +// Function: CPPTypedefType::is_less +// Access: Protected, Virtual +// Description: Called by CPPDeclaration() to determine whether this type +// should be ordered before another type of the same +// type, in an arbitrary but fixed ordering. +//////////////////////////////////////////////////////////////////// +bool CPPTypedefType:: +is_less(const CPPDeclaration *other) const { + return CPPDeclaration::is_less(other); + + // The below code causes a crash for unknown reasons. + /* + const CPPTypedefType *ot = ((CPPDeclaration *)other)->as_typedef_type(); + assert(ot != NULL); + + if (_type != ot->_type) { + return _type < ot->_type; + } + + if (*_ident != *ot->_ident) { + return *_ident < *ot->_ident; + } + + return false; */ +} diff --git a/dtool/src/cppparser/cppTypedefType.h b/dtool/src/cppparser/cppTypedefType.h new file mode 100644 index 0000000000..eb6ab016cf --- /dev/null +++ b/dtool/src/cppparser/cppTypedefType.h @@ -0,0 +1,74 @@ +// Filename: cppTypedefType.h +// Created by: rdb (01Aug14) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + +#ifndef CPPTYPEDEFTYPE_H +#define CPPTYPEDEFTYPE_H + +#include "dtoolbase.h" +#include "cppType.h" + +class CPPIdentifier; + +/////////////////////////////////////////////////////////////////// +// Class : CPPTypedefType +// Description : +//////////////////////////////////////////////////////////////////// +class CPPTypedefType : public CPPType { +public: + CPPTypedefType(CPPType *type, const string &name, CPPScope *current_scope); + CPPTypedefType(CPPType *type, CPPIdentifier *ident, CPPScope *current_scope); + CPPTypedefType(CPPType *type, CPPInstanceIdentifier *ii, + CPPScope *current_scope, const CPPFile &file); + + bool is_scoped() const; + CPPScope *get_scope(CPPScope *current_scope, CPPScope *global_scope, + CPPPreprocessor *error_sink = NULL) const; + + virtual string get_simple_name() const; + virtual string get_local_name(CPPScope *scope = NULL) const; + virtual string get_fully_scoped_name() const; + + virtual bool is_incomplete() const; + virtual bool is_tbd() const; + + virtual bool is_fully_specified() const; + + virtual CPPDeclaration *substitute_decl(SubstDecl &subst, + CPPScope *current_scope, + CPPScope *global_scope); + + virtual CPPType *resolve_type(CPPScope *current_scope, + CPPScope *global_scope); + + virtual bool is_equivalent(const CPPType &other) const; + + virtual void output(ostream &out, int indent_level, CPPScope *scope, + bool complete) const; + virtual SubType get_subtype() const; + + virtual CPPTypedefType *as_typedef_type(); + + CPPType *_type; + CPPIdentifier *_ident; + +protected: + virtual bool is_equal(const CPPDeclaration *other) const; + virtual bool is_less(const CPPDeclaration *other) const; + + bool _subst_decl_recursive_protect; + typedef vector Proxies; + Proxies _proxies; +}; + +#endif diff --git a/dtool/src/cppparser/p3cppParser_composite1.cxx b/dtool/src/cppparser/p3cppParser_composite1.cxx index b8a7452e98..8b60e60a17 100644 --- a/dtool/src/cppparser/p3cppParser_composite1.cxx +++ b/dtool/src/cppparser/p3cppParser_composite1.cxx @@ -18,13 +18,8 @@ #include "cppTypeDeclaration.cxx" #include "cppTypeParser.cxx" #include "cppTypeProxy.cxx" +#include "cppTypedefType.cxx" #include "cppSimpleType.cxx" #include "cppTBDType.cxx" -#include "cppTypedef.cxx" #include "cppUsing.cxx" #include "cppVisibility.cxx" - - - - - diff --git a/dtool/src/dtoolbase/atomicAdjust.h b/dtool/src/dtoolbase/atomicAdjust.h index 9dc7832e46..bd709fce20 100644 --- a/dtool/src/dtoolbase/atomicAdjust.h +++ b/dtool/src/dtoolbase/atomicAdjust.h @@ -18,7 +18,15 @@ #include "dtoolbase.h" #include "selectThreadImpl.h" -#if defined(THREAD_DUMMY_IMPL)||defined(THREAD_SIMPLE_IMPL) +#if defined(CPPPARSER) + +struct AtomicAdjust { + typedef long Integer; + typedef void *UnalignedPointer; + typedef UnalignedPointer Pointer; +}; + +#elif defined(THREAD_DUMMY_IMPL) || defined(THREAD_SIMPLE_IMPL) #include "atomicAdjustDummyImpl.h" typedef AtomicAdjustDummyImpl AtomicAdjust; diff --git a/dtool/src/dtoolbase/typeHandle.cxx b/dtool/src/dtoolbase/typeHandle.cxx index 773cca79ec..b1d50fffaa 100644 --- a/dtool/src/dtoolbase/typeHandle.cxx +++ b/dtool/src/dtoolbase/typeHandle.cxx @@ -16,33 +16,9 @@ #include "typeRegistryNode.h" #include "atomicAdjust.h" -#ifdef HAVE_PYTHON -#include "Python.h" -#endif - // This is initialized to zero by static initialization. TypeHandle TypeHandle::_none; -#ifdef HAVE_PYTHON -//////////////////////////////////////////////////////////////////// -// Function: TypeHandle::make -// Access: Published -// Description: This special method allows coercion to a TypeHandle -// from a Python class object or instance. It simply -// attempts to call classobj.get_class_type(), and -// returns that value (or raises an exception if that -// method doesn't work). -// -// This method allows a Python class object to be used -// anywhere a TypeHandle is expected by the C++ -// interface. -//////////////////////////////////////////////////////////////////// -PyObject *TypeHandle:: -make(PyObject *classobj) { - return PyObject_CallMethod(classobj, (char *)"get_class_type", (char *)""); -} -#endif // HAVE_PYTHON - #ifdef DO_MEMORY_USAGE //////////////////////////////////////////////////////////////////// // Function: TypeHandle::get_memory_usage @@ -80,7 +56,10 @@ inc_memory_usage(MemoryClass memory_class, int size) { assert(rnode != (TypeRegistryNode *)NULL); AtomicAdjust::add(rnode->_memory_usage[memory_class], (AtomicAdjust::Integer)size); //cerr << *this << ".inc(" << memory_class << ", " << size << ") -> " << rnode->_memory_usage[memory_class] << "\n"; - assert(rnode->_memory_usage[memory_class] >= 0); + if (rnode->_memory_usage[memory_class] < 0) { + cerr << "Memory usage overflow for type " << *this << ".\n"; + abort(); + } } } #endif // DO_MEMORY_USAGE diff --git a/dtool/src/dtoolbase/typeHandle.h b/dtool/src/dtoolbase/typeHandle.h index 464fab66d6..b060689c01 100644 --- a/dtool/src/dtoolbase/typeHandle.h +++ b/dtool/src/dtoolbase/typeHandle.h @@ -64,13 +64,6 @@ class TypedObject; -#ifdef HAVE_PYTHON -#ifndef PyObject_HEAD -struct _object; -typedef _object PyObject; -#endif -#endif - //////////////////////////////////////////////////////////////////// // Class : TypeHandle // Description : TypeHandle is the identifier used to differentiate @@ -104,9 +97,7 @@ PUBLISHED: INLINE TypeHandle(); INLINE TypeHandle(const TypeHandle ©); -#ifdef HAVE_PYTHON - static PyObject *make(PyObject *classobj); -#endif // HAVE_PYTHON + EXTENSION(static TypeHandle make(PyTypeObject *classobj)); INLINE bool operator == (const TypeHandle &other) const; INLINE bool operator != (const TypeHandle &other) const; diff --git a/dtool/src/dtoolutil/Sources.pp b/dtool/src/dtoolutil/Sources.pp index 7c2638caa6..a75ae352ae 100644 --- a/dtool/src/dtoolutil/Sources.pp +++ b/dtool/src/dtoolutil/Sources.pp @@ -17,6 +17,8 @@ filename.h \ $[if $[IS_OSX],filename_assist.mm filename_assist.h,] \ globPattern.I globPattern.h \ + lineStream.I lineStream.h \ + lineStreamBuf.I lineStreamBuf.h \ load_dso.h \ pandaFileStream.h pandaFileStream.I \ pandaFileStreamBuf.h \ @@ -38,6 +40,7 @@ dSearchPath.cxx \ executionEnvironment.cxx filename.cxx \ globPattern.cxx \ + lineStream.cxx lineStreamBuf.cxx \ load_dso.cxx \ pandaFileStream.cxx pandaFileStreamBuf.cxx \ pandaSystem.cxx \ @@ -58,6 +61,8 @@ executionEnvironment.I executionEnvironment.h filename.I \ filename.h \ globPattern.I globPattern.h \ + lineStream.I lineStream.h \ + lineStreamBuf.I lineStreamBuf.h \ load_dso.h \ pandaFileStream.h pandaFileStream.I \ pandaFileStreamBuf.h \ diff --git a/dtool/src/dtoolutil/executionEnvironment.cxx b/dtool/src/dtoolutil/executionEnvironment.cxx index 3f06a3427f..3e1543ba4d 100644 --- a/dtool/src/dtoolutil/executionEnvironment.cxx +++ b/dtool/src/dtoolutil/executionEnvironment.cxx @@ -60,7 +60,7 @@ extern char **environ; #include #endif -#if defined(IS_LINUX) || defined(IS_OSX) || defined(IS_FREEBSD) +#if defined(IS_LINUX) || defined(IS_FREEBSD) // For link_map and dlinfo. #include #include diff --git a/dtool/src/dtoolutil/filename.I b/dtool/src/dtoolutil/filename.I index 22c49f39bf..3d91bb987a 100644 --- a/dtool/src/dtoolutil/filename.I +++ b/dtool/src/dtoolutil/filename.I @@ -375,6 +375,17 @@ operator + (const string &other) const { return a; } +//////////////////////////////////////////////////////////////////// +// Function: Filename::operator / +// Access: Published +// Description: Returns a new Filename that is composed of the +// other filename added to the end of this filename, +// with an intervening slash added if necessary. +//////////////////////////////////////////////////////////////////// +INLINE Filename Filename:: +operator / (const Filename &other) const { + return Filename(*this, other); +} //////////////////////////////////////////////////////////////////// // Function: Filename::get_fullpath diff --git a/dtool/src/dtoolutil/filename.cxx b/dtool/src/dtoolutil/filename.cxx index d15dc738c3..a4152d5db1 100644 --- a/dtool/src/dtoolutil/filename.cxx +++ b/dtool/src/dtoolutil/filename.cxx @@ -308,30 +308,6 @@ Filename(const Filename &dirname, const Filename &basename) { } } -#ifdef HAVE_PYTHON -//////////////////////////////////////////////////////////////////// -// Function: Filename::__reduce__ -// Access: Published -// Description: This special Python method is implement to provide -// support for the pickle module. -//////////////////////////////////////////////////////////////////// -PyObject *Filename:: -__reduce__(PyObject *self) const { - // We should return at least a 2-tuple, (Class, (args)): the - // necessary class object whose constructor we should call - // (e.g. this), and the arguments necessary to reconstruct this - // object. - PyObject *this_class = PyObject_Type(self); - if (this_class == NULL) { - return NULL; - } - - PyObject *result = Py_BuildValue("(O(s))", this_class, c_str()); - Py_DECREF(this_class); - return result; -} -#endif // HAVE_PYTHON - //////////////////////////////////////////////////////////////////// // Function: Filename::from_os_specific // Access: Published, Static @@ -2005,49 +1981,13 @@ scan_directory(vector_string &contents) const { globfree(&globbuf); return true; - + #else // Don't know how to scan directories! return false; #endif } -#ifdef HAVE_PYTHON -//////////////////////////////////////////////////////////////////// -// Function: Filename::scan_directory -// Access: Published -// Description: This variant on scan_directory returns a Python list -// of strings on success, or None on failure. -//////////////////////////////////////////////////////////////////// -PyObject *Filename:: -scan_directory() const { - vector_string contents; - if (!scan_directory(contents)) { - PyObject *result = Py_None; - Py_INCREF(result); - return result; - } - - PyObject *result = PyList_New(contents.size()); - for (size_t i = 0; i < contents.size(); ++i) { - const string &filename = contents[i]; -#if PY_MAJOR_VERSION >= 3 - // This function expects UTF-8. - PyObject *str = PyUnicode_FromStringAndSize(filename.data(), filename.size()); -#else - PyObject *str = PyString_FromStringAndSize(filename.data(), filename.size()); -#endif -#ifdef Py_LIMITED_API - PyList_SetItem(result, i, str); -#else - PyList_SET_ITEM(result, i, str); -#endif - } - - return result; -} -#endif // HAVE_PYTHON - //////////////////////////////////////////////////////////////////// // Function: Filename::open_read // Access: Published diff --git a/dtool/src/dtoolutil/filename.h b/dtool/src/dtoolutil/filename.h index 45d975eac6..650f7d84a6 100644 --- a/dtool/src/dtoolutil/filename.h +++ b/dtool/src/dtoolutil/filename.h @@ -74,7 +74,7 @@ PUBLISHED: #endif #ifdef HAVE_PYTHON - PyObject *__reduce__(PyObject *self) const; + EXTENSION(PyObject *__reduce__(PyObject *self) const); #endif // Static constructors to explicitly create a filename that refers @@ -122,10 +122,14 @@ PUBLISHED: INLINE size_t length() const; INLINE char operator [] (int n) const; + EXTENSION(PyObject *__repr__() const); + INLINE string substr(size_t begin, size_t end = string::npos) const; INLINE void operator += (const string &other); INLINE Filename operator + (const string &other) const; + INLINE Filename operator / (const Filename &other) const; + // Or, you can use any of these. INLINE string get_fullpath() const; INLINE wstring get_fullpath_w() const; @@ -200,11 +204,11 @@ PUBLISHED: const string &default_extension = string()); bool make_relative_to(Filename directory, bool allow_backups = true); int find_on_searchpath(const DSearchPath &searchpath); - + bool scan_directory(vector_string &contents) const; #ifdef HAVE_PYTHON - PyObject *scan_directory() const; -#endif + EXTENSION(PyObject *scan_directory() const); +#endif bool open_read(ifstream &stream) const; bool open_write(ofstream &stream, bool truncate = true) const; diff --git a/dtool/src/dtoolutil/globPattern.cxx b/dtool/src/dtoolutil/globPattern.cxx index a8cbf7552f..7f7d23a53b 100644 --- a/dtool/src/dtoolutil/globPattern.cxx +++ b/dtool/src/dtoolutil/globPattern.cxx @@ -113,44 +113,12 @@ match_files(vector_string &results, const Filename &cwd) const { pattern = source.substr(0, slash); suffix = source.substr(slash + 1); } - + GlobPattern glob(pattern); glob.set_case_sensitive(_case_sensitive); return glob.r_match_files(prefix, suffix, results, cwd); } -#ifdef HAVE_PYTHON -//////////////////////////////////////////////////////////////////// -// Function: GlobPattern::match_files -// Access: Published -// Description: This variant on match_files returns a Python list -// of strings. -//////////////////////////////////////////////////////////////////// -PyObject *GlobPattern:: -match_files(const Filename &cwd) const { - vector_string contents; - match_files(contents, cwd); - - PyObject *result = PyList_New(contents.size()); - for (size_t i = 0; i < contents.size(); ++i) { - const string &filename = contents[i]; -#if PY_MAJOR_VERSION >= 3 - // This function expects UTF-8. - PyObject *str = PyUnicode_FromStringAndSize(filename.data(), filename.size()); -#else - PyObject *str = PyString_FromStringAndSize(filename.data(), filename.size()); -#endif -#ifdef Py_LIMITED_API - PyList_SetItem(result, i, str); -#else - PyList_SET_ITEM(result, i, str); -#endif - } - - return result; -} -#endif // HAVE_PYTHON - //////////////////////////////////////////////////////////////////// // Function: GlobPattern::r_match_files // Access: Private @@ -195,21 +163,21 @@ r_match_files(const Filename &prefix, const string &suffix, return next_glob.r_match_files(Filename(prefix, _pattern), next_suffix, results, cwd); - } + } // If there *are* special glob characters, we must attempt to // match the pattern against the files in this directory. - + vector_string dir_files; if (!parent_dir.scan_directory(dir_files)) { // Not a directory, or unable to read directory; stop here. return 0; } - + // Now go through each file in the directory looking for one that // matches the pattern. int num_matched = 0; - + vector_string::const_iterator fi; for (fi = dir_files.begin(); fi != dir_files.end(); ++fi) { const string &local_file = (*fi); @@ -218,7 +186,7 @@ r_match_files(const Filename &prefix, const string &suffix, // We have a match; continue. if (suffix.empty()) { results.push_back(Filename(prefix, local_file)); - num_matched++; + num_matched++; } else { num_matched += next_glob.r_match_files(Filename(prefix, local_file), next_suffix, results, cwd); @@ -226,7 +194,7 @@ r_match_files(const Filename &prefix, const string &suffix, } } } - + return num_matched; } diff --git a/dtool/src/dtoolutil/globPattern.h b/dtool/src/dtoolutil/globPattern.h index f79a3f0cb1..f7983021b7 100644 --- a/dtool/src/dtoolutil/globPattern.h +++ b/dtool/src/dtoolutil/globPattern.h @@ -61,8 +61,8 @@ PUBLISHED: string get_const_prefix() const; int match_files(vector_string &results, const Filename &cwd = Filename()) const; #ifdef HAVE_PYTHON - PyObject *match_files(const Filename &cwd = Filename()) const; -#endif + EXTENSION(PyObject *match_files(const Filename &cwd = Filename()) const); +#endif private: bool matches_substr(string::const_iterator pi, diff --git a/panda/src/putil/lineStream.I b/dtool/src/dtoolutil/lineStream.I similarity index 100% rename from panda/src/putil/lineStream.I rename to dtool/src/dtoolutil/lineStream.I diff --git a/panda/src/putil/lineStream.cxx b/dtool/src/dtoolutil/lineStream.cxx similarity index 100% rename from panda/src/putil/lineStream.cxx rename to dtool/src/dtoolutil/lineStream.cxx diff --git a/panda/src/putil/lineStream.h b/dtool/src/dtoolutil/lineStream.h similarity index 95% rename from panda/src/putil/lineStream.h rename to dtool/src/dtoolutil/lineStream.h index 4b81ab1569..63358a18ac 100644 --- a/panda/src/putil/lineStream.h +++ b/dtool/src/dtoolutil/lineStream.h @@ -15,7 +15,7 @@ #ifndef LINESTREAM_H #define LINESTREAM_H -#include "pandabase.h" +#include "dtoolbase.h" #include "lineStreamBuf.h" @@ -33,7 +33,7 @@ // More text can still be written to it and continuously // extracted. //////////////////////////////////////////////////////////////////// -class EXPCL_PANDA_PUTIL LineStream : public ostream { +class EXPCL_DTOOL LineStream : public ostream { PUBLISHED: INLINE LineStream(); diff --git a/panda/src/putil/lineStreamBuf.I b/dtool/src/dtoolutil/lineStreamBuf.I similarity index 100% rename from panda/src/putil/lineStreamBuf.I rename to dtool/src/dtoolutil/lineStreamBuf.I diff --git a/panda/src/putil/lineStreamBuf.cxx b/dtool/src/dtoolutil/lineStreamBuf.cxx similarity index 100% rename from panda/src/putil/lineStreamBuf.cxx rename to dtool/src/dtoolutil/lineStreamBuf.cxx diff --git a/panda/src/putil/lineStreamBuf.h b/dtool/src/dtoolutil/lineStreamBuf.h similarity index 94% rename from panda/src/putil/lineStreamBuf.h rename to dtool/src/dtoolutil/lineStreamBuf.h index d7c7847292..78106ce525 100644 --- a/panda/src/putil/lineStreamBuf.h +++ b/dtool/src/dtoolutil/lineStreamBuf.h @@ -15,7 +15,7 @@ #ifndef LINESTREAMBUF_H #define LINESTREAMBUF_H -#include "pandabase.h" +#include "dtoolbase.h" #include @@ -26,7 +26,7 @@ // continuously extracted as a sequence of lines of // text. //////////////////////////////////////////////////////////////////// -class EXPCL_PANDA_PUTIL LineStreamBuf : public streambuf { +class EXPCL_DTOOL LineStreamBuf : public streambuf { public: LineStreamBuf(); virtual ~LineStreamBuf(); diff --git a/dtool/src/dtoolutil/p3dtoolutil_composite1.cxx b/dtool/src/dtoolutil/p3dtoolutil_composite1.cxx index 0cd4ec6cd8..cd2db6edc0 100644 --- a/dtool/src/dtoolutil/p3dtoolutil_composite1.cxx +++ b/dtool/src/dtoolutil/p3dtoolutil_composite1.cxx @@ -4,6 +4,8 @@ #include "executionEnvironment.cxx" #include "filename.cxx" #include "globPattern.cxx" +#include "lineStream.cxx" +#include "lineStreamBuf.cxx" #include "load_dso.cxx" #include "pandaSystem.cxx" diff --git a/dtool/src/interrogate/functionRemap.cxx b/dtool/src/interrogate/functionRemap.cxx index f30edfd2e5..e1abae2c06 100644 --- a/dtool/src/interrogate/functionRemap.cxx +++ b/dtool/src/interrogate/functionRemap.cxx @@ -17,6 +17,7 @@ #include "interrogate.h" #include "parameterRemap.h" #include "parameterRemapThis.h" +#include "parameterRemapUnchanged.h" #include "interfaceMaker.h" #include "interrogateBuilder.h" @@ -200,7 +201,7 @@ call_function(ostream &out, int indent_level, bool convert_result, // Now a simple special-case test. Often, we will have converted // the reference-returning assignment operator to a pointer. In - // this case, we might inadventent generate code like "return + // this case, we might inadvertently generate code like "return // &(*this)", when "return this" would do. We check for this here // and undo it as a special case. @@ -226,7 +227,8 @@ call_function(ostream &out, int indent_level, bool convert_result, return_expr = get_call_str(container, pexprs); } else { - if (_return_type->return_value_should_be_simple()) { + //if (_return_type->return_value_should_be_simple()) { + if (false) { // We have to assign the result to a temporary first; this makes // it a bit easier on poor old VC++. InterfaceMaker::indent(out, indent_level); @@ -234,8 +236,14 @@ call_function(ostream &out, int indent_level, bool convert_result, &parser); out << " = " << call << ";\n"; + // MOVE() expands to std::move() when we are compiling with a + // compiler that supports rvalue references. It basically turns + // an lvalue into an rvalue, allowing a move constructor to be + // called instead of a copy constructor (since we won't be using + // the return value any more), which is usually more efficient if + // it exists. If it doesn't, it shouldn't do any harm. string new_str = - _return_type->prepare_return_expr(out, indent_level, "result"); + _return_type->prepare_return_expr(out, indent_level, "MOVE(result)"); return_expr = _return_type->get_return_expr(new_str); } else { @@ -258,11 +266,11 @@ call_function(ostream &out, int indent_level, bool convert_result, // comment. //////////////////////////////////////////////////////////////////// void FunctionRemap:: -write_orig_prototype(ostream &out, int indent_level, bool local) const { +write_orig_prototype(ostream &out, int indent_level, bool local, int num_default_args) const { if (local) { - _cppfunc->output(out, indent_level, NULL, false, _num_default_parameters); + _cppfunc->output(out, indent_level, NULL, false, num_default_args); } else { - _cppfunc->output(out, indent_level, &parser, false, _num_default_parameters); + _cppfunc->output(out, indent_level, &parser, false, num_default_args); } } @@ -287,7 +295,6 @@ make_wrapper_entry(FunctionIndex function_index) { iwrapper._comment = InterrogateBuilder::trim_blanks(_cppfunc->_leading_comment->_comment); } - if (output_function_names) { // If we're keeping the function names, record that the wrapper is // callable. @@ -356,7 +363,7 @@ make_wrapper_entry(FunctionIndex function_index) { //////////////////////////////////////////////////////////////////// // Function: FunctionRemap::get_call_str -// Access: Private +// Access: Public // Description: Returns a string suitable for calling the wrapped // function. If pexprs is nonempty, it represents // the list of expressions that will evaluate to each @@ -412,7 +419,12 @@ get_call_str(const string &container, const vector_string &pexprs) const { } else if (_has_this && !container.empty()) { // If we have a "this" parameter, the calling convention is also // a bit different. - call << "(" << container << ")->" << _cppfunc->get_local_name(); + if (container == "local_this") { + // This isn't important, it just looks a bit prettier. + call << container << "->" << _cppfunc->get_local_name(); + } else { + call << "(" << container << ")->" << _cppfunc->get_local_name(); + } } else { call << _cppfunc->get_local_name(&parser); @@ -426,14 +438,27 @@ get_call_str(const string &container, const vector_string &pexprs) const { separator = ", "; } - for (int pn = _first_true_parameter; - pn < (int)_parameters.size(); - ++pn) { + int pn = _first_true_parameter; + int num_parameters = pexprs.size(); + + if (_type == T_item_assignment_operator) { + // The last parameter is the value to set. + --num_parameters; + } + + for (pn = _first_true_parameter; + pn < num_parameters; ++pn) { + nassertd(pn < _parameters.size()) break; call << separator; _parameters[pn]._remap->pass_parameter(call, get_parameter_expr(pn, pexprs)); separator = ", "; } call << ")"; + + if (_type == T_item_assignment_operator) { + call << " = "; + _parameters[pn]._remap->pass_parameter(call, get_parameter_expr(pn, pexprs)); + } } return call.str(); @@ -497,6 +522,7 @@ setup_properties(const InterrogateFunction &ifunc, InterfaceMaker *interface_mak } string fname = _cppfunc->get_simple_name(); + CPPType *rtype = _ftype->_return_type->resolve_type(&parser, _cppscope); if (_cpptype != (CPPType *)NULL && ((_cppfunc->_storage_class & CPPInstance::SC_static) == 0) && @@ -533,13 +559,22 @@ setup_properties(const InterrogateFunction &ifunc, InterfaceMaker *interface_mak fname == "operator <<=" || fname == "operator >>=") { _type = T_assignment_method; + + } else if (fname == "operator []" && !_const_method && rtype != NULL) { + // Check if this is an item-assignment operator. + CPPReferenceType *reftype = rtype->as_reference_type(); + if (reftype != NULL && reftype->_pointing_at->as_const_type() == NULL) { + // It returns a mutable reference. + _type = T_item_assignment_operator; + } } } const CPPParameterList::Parameters ¶ms = _ftype->_parameters->_parameters; for (int i = 0; i < (int)params.size() - _num_default_parameters; i++) { - CPPType *type = params[i]->_type->resolve_type(&parser, _cppscope); + //CPPType *type = params[i]->_type->resolve_type(&parser, _cppscope); + CPPType *type = params[i]->_type; Parameter param; param._has_name = true; param._name = params[i]->get_simple_name(); @@ -557,10 +592,16 @@ setup_properties(const InterrogateFunction &ifunc, InterfaceMaker *interface_mak if (param._remap == (ParameterRemap *)NULL) { // If we can't handle one of the parameter types, we can't call // the function. - //nout << "Can't handle parameter " << i << " of method " << *_cppfunc << "\n"; - return false; + if (fname == "__traverse__") { + // Hack to record this even though we can't wrap visitproc. + param._remap = new ParameterRemapUnchanged(type); + } else { + //nout << "Can't handle parameter " << i << " of method " << *_cppfunc << "\n"; + return false; + } + } else { + param._remap->set_default_value(params[i]->_initializer); } - param._remap->set_default_value(params[i]->_initializer); if (!param._remap->is_valid()) { nout << "Invalid remap for parameter " << i << " of method " << *_cppfunc << "\n"; @@ -601,9 +642,39 @@ setup_properties(const InterrogateFunction &ifunc, InterfaceMaker *interface_mak } } + } else if (_type == T_item_assignment_operator) { + // An item-assignment method isn't really a thing in C++, but it is + // in scripting languages, so we use this to denote item-access operators + // that return a non-const reference. + + if (_cpptype == (CPPType *)NULL) { + nout << "Method " << *_cppfunc << " has no struct type\n"; + return false; + } else { + // Synthesize a const reference parameter for the assignment. + CPPType *bare_type = TypeManager::unwrap_reference(rtype); + CPPType *const_type = CPPType::new_type(new CPPConstType(bare_type)); + CPPType *ref_type = CPPType::new_type(new CPPReferenceType(const_type)); + + Parameter param; + param._has_name = true; + param._name = "assign_val"; + param._remap = interface_maker->remap_parameter(_cpptype, ref_type); + + if (param._remap == NULL || !param._remap->is_valid()) { + nout << "Invalid remap for assignment type of method " << *_cppfunc << "\n"; + return false; + } + _parameters.push_back(param); + + // Pretend we don't return anything at all. + CPPType *void_type = TypeManager::get_void_type(); + _return_type = interface_maker->remap_parameter(_cpptype, void_type); + _void_return = true; + } + } else { // The normal case. - CPPType *rtype = _ftype->_return_type->resolve_type(&parser, _cppscope); _return_type = interface_maker->remap_parameter(_cpptype, rtype); if (_return_type != (ParameterRemap *)NULL) { _void_return = TypeManager::is_void(rtype); @@ -663,15 +734,17 @@ setup_properties(const InterrogateFunction &ifunc, InterfaceMaker *interface_mak } } - if (_parameters.size() == first_param) { + if ((int)_parameters.size() == first_param) { _args_type = InterfaceMaker::AT_no_args; - } else if (_parameters.size() == first_param + 1) { + } else if ((int)_parameters.size() == first_param + 1 && + _parameters[first_param]._remap->get_default_value() == NULL) { _args_type = InterfaceMaker::AT_single_arg; } else { _args_type = InterfaceMaker::AT_varargs; } - if (_type == T_normal) { + switch (_type) { + case T_normal: if (fname == "operator []" || fname == "__getitem__") { _flags |= F_getitem; if (_has_this && _parameters.size() == 2) { @@ -682,8 +755,8 @@ setup_properties(const InterrogateFunction &ifunc, InterfaceMaker *interface_mak } } else if (fname == "__setitem__") { - _flags |= F_setitem; if (_has_this && _parameters.size() > 2) { + _flags |= F_setitem; if (TypeManager::is_integer(_parameters[1]._remap->get_new_type())) { // Its first parameter is an int parameter, presumably an index. _flags |= F_setitem_int; @@ -691,6 +764,16 @@ setup_properties(const InterrogateFunction &ifunc, InterfaceMaker *interface_mak } } + } else if (fname == "__delitem__") { + if (_has_this && _parameters.size() == 2) { + _flags |= F_delitem; + if (TypeManager::is_integer(_parameters[1]._remap->get_new_type())) { + // Its first parameter is an int parameter, presumably an index. + _flags |= F_delitem_int; + _args_type = InterfaceMaker::AT_single_arg; + } + } + } else if (fname == "size" || fname == "__len__") { if ((int)_parameters.size() == first_param && TypeManager::is_integer(_return_type->get_new_type())) { @@ -735,11 +818,27 @@ setup_properties(const InterrogateFunction &ifunc, InterfaceMaker *interface_mak _flags |= F_compare_to; } + } else if (fname == "make") { + if (!_has_this && _parameters.size() >= 1 && + TypeManager::is_pointer(_return_type->get_new_type())) { + // We can use this for coercion. + _flags |= F_coerce_constructor; + } + + } else if (fname == "operator /") { + if (_has_this && _parameters.size() == 2 && + TypeManager::is_float(_parameters[1]._remap->get_new_type())) { + // This division operator takes a single float argument. + _flags |= F_divide_float; + } + } else if (fname == "operator ()" || fname == "__call__") { // Call operators always take keyword arguments. _args_type = InterfaceMaker::AT_keyword_args; - } else if (fname == "__setattr__" || fname == "__getattr__") { + } else if (fname == "__setattr__" + || fname == "__getattr__" + || fname == "__delattr__") { // Just to prevent these from getting keyword arguments. } else { @@ -749,8 +848,33 @@ setup_properties(const InterrogateFunction &ifunc, InterfaceMaker *interface_mak _args_type = InterfaceMaker::AT_keyword_args; } } + break; - } else if (_type == T_constructor) { + case T_assignment_method: + if (fname == "operator /=") { + if (_has_this && _parameters.size() == 2 && + TypeManager::is_float(_parameters[1]._remap->get_new_type())) { + // This division operator takes a single float argument. + _flags |= F_divide_float; + } + } + break; + + case T_item_assignment_operator: + // The concept of "item assignment operator" doesn't really exist in C++, + // but it does in scripting languages, and this allows us to wrap cases + // where the C++ getitem returns an assignable reference. + _flags |= F_setitem; + if (_has_this && _parameters.size() > 2) { + if (TypeManager::is_integer(_parameters[1]._remap->get_new_type())) { + // Its first parameter is an int parameter, presumably an index. + _flags |= F_setitem_int; + } + } + _args_type = InterfaceMaker::AT_varargs; + break; + + case T_constructor: if (!_has_this && _parameters.size() == 1 && TypeManager::unwrap(_parameters[0]._remap->get_orig_type()) == TypeManager::unwrap(_return_type->get_orig_type())) { @@ -758,9 +882,18 @@ setup_properties(const InterrogateFunction &ifunc, InterfaceMaker *interface_mak // "this" type, this is a copy constructor. _flags |= F_copy_constructor; + } else if (!_has_this && _parameters.size() > 0 && + (_cppfunc->_storage_class & CPPInstance::SC_explicit) == 0) { + // A non-explicit non-copy constructor might be eligible for coercion. + _flags |= F_coerce_constructor; } + // Constructors always take varargs and keyword args. _args_type = InterfaceMaker::AT_keyword_args; + break; + + default: + break; } return true; diff --git a/dtool/src/interrogate/functionRemap.h b/dtool/src/interrogate/functionRemap.h index ed0ef49507..7d2f88fd6b 100644 --- a/dtool/src/interrogate/functionRemap.h +++ b/dtool/src/interrogate/functionRemap.h @@ -52,14 +52,17 @@ public: ~FunctionRemap(); string get_parameter_name(int n) const; - string call_function(ostream &out, int indent_level, + string call_function(ostream &out, int indent_level, bool convert_result, const string &container, const vector_string &pexprs = vector_string()) const; - void write_orig_prototype(ostream &out, int indent_level, bool local=false) const; + void write_orig_prototype(ostream &out, int indent_level, bool local=false, + int num_default_args=0) const; FunctionWrapperIndex make_wrapper_entry(FunctionIndex function_index); + string get_call_str(const string &container, const vector_string &pexprs) const; + class Parameter { public: bool _has_name; @@ -76,21 +79,26 @@ public: T_typecast, T_getter, T_setter, + T_item_assignment_operator, }; enum Flags { - F_getitem = 0x0001, - F_getitem_int = 0x0002, - F_size = 0x0004, - F_setitem = 0x0008, - F_setitem_int = 0x0010, - F_make_copy = 0x0020, - F_copy_constructor = 0x0040, - F_explicit_self = 0x0080, - F_iter = 0x0100, - F_getbuffer = 0x0200, - F_releasebuffer = 0x0400, - F_compare_to = 0x0800, + F_getitem = 0x0001, + F_getitem_int = 0x0002, + F_size = 0x0004, + F_setitem = 0x0008, + F_setitem_int = 0x0010, + F_delitem = 0x0020, + F_delitem_int = 0x0040, + F_make_copy = 0x0080, + F_copy_constructor = 0x0100, + F_explicit_self = 0x0200, + F_iter = 0x0400, + F_getbuffer = 0x0800, + F_releasebuffer = 0x1000, + F_compare_to = 0x2000, + F_coerce_constructor = 0x4000, + F_divide_float = 0x8000, }; typedef vector Parameters; @@ -126,8 +134,8 @@ public: CPPFunctionType *_ftype; bool _is_valid; + private: - string get_call_str(const string &container, const vector_string &pexprs) const; string get_parameter_expr(int n, const vector_string &pexprs) const; bool setup_properties(const InterrogateFunction &ifunc, InterfaceMaker *interface_maker); }; diff --git a/dtool/src/interrogate/interfaceMaker.cxx b/dtool/src/interrogate/interfaceMaker.cxx index a5b62ac27b..03398895b8 100644 --- a/dtool/src/interrogate/interfaceMaker.cxx +++ b/dtool/src/interrogate/interfaceMaker.cxx @@ -41,7 +41,7 @@ #include "pnotify.h" InterrogateType dummy_type; - + //////////////////////////////////////////////////////////////////// // Function: InterfaceMaker::Function::Constructor // Access: Public @@ -59,7 +59,7 @@ Function(const string &name, _flags = 0; _args_type = AT_unknown; } - + //////////////////////////////////////////////////////////////////// // Function: InterfaceMaker::Function::Destructor // Access: Public @@ -72,7 +72,7 @@ InterfaceMaker::Function:: delete (*ri); } } - + //////////////////////////////////////////////////////////////////// // Function: InterfaceMaker::MakeSeq::Constructor // Access: Public @@ -141,9 +141,15 @@ check_protocols() { for (fi = _methods.begin(); fi != _methods.end(); ++fi) { Function *func = (*fi); flags |= func->_flags; + + if (func->_ifunc.get_name() == "__traverse__") { + // If we have a method named __traverse__, we implement Python's + // cyclic garbage collection protocol. + _protocol_types |= PT_python_gc; + } } - if ((flags & (FunctionRemap::F_getitem_int | FunctionRemap::F_size)) == + if ((flags & (FunctionRemap::F_getitem_int | FunctionRemap::F_size)) == (FunctionRemap::F_getitem_int | FunctionRemap::F_size)) { // If we have both a getitem that receives an int, and a size, // then we implement the sequence protocol: you can iterate @@ -169,8 +175,6 @@ check_protocols() { _protocol_types |= PT_iter; } - InterrogateDatabase *idb = InterrogateDatabase::get_ptr(); - // Now are there any make_seq requests within this class? if (_itype._cpptype != NULL) { CPPStructType *stype = _itype._cpptype->as_struct_type(); @@ -269,18 +273,8 @@ generate_wrappers() { // traversal. int ti = 0; while (ti < idb->get_num_all_types()) { - TypeIndex type_index = idb->get_all_type(ti); + TypeIndex type_index = idb->get_all_type(ti++); record_object(type_index); - - if (interrogate_type_is_enum(ti)) { - int enum_count = interrogate_type_number_of_enum_values(ti); - for (int xx = 0; xx < enum_count; ++xx) { -// printf(" PyModule_AddIntConstant(module,\"%s\",%d)\n",interrogate_type_enum_value_name(ti,xx),interrogate_type_enum_value(ti,xx)); - } - } - - ++ti; -// printf(" New Type %d\n",ti); } int num_global_elements = idb->get_num_global_elements(); @@ -321,7 +315,7 @@ generate_wrappers() { FunctionIndex func_index = ielement.get_setter(); record_function(dummy_type, func_index); } - } + } } //////////////////////////////////////////////////////////////////// @@ -396,7 +390,7 @@ remap_parameter(CPPType *struct_type, CPPType *param_type) { // convert basic_string's to atomic strings. if (struct_type == (CPPType *)NULL || - !(TypeManager::is_basic_string_char(struct_type) || + !(TypeManager::is_basic_string_char(struct_type) || TypeManager::is_basic_string_wchar(struct_type))) { if (TypeManager::is_basic_string_char(param_type)) { return new ParameterRemapBasicStringToString(param_type); @@ -454,7 +448,10 @@ remap_parameter(CPPType *struct_type, CPPType *param_type) { } else if (TypeManager::is_const_ref_to_simple(param_type)) { return new ParameterRemapReferenceToConcrete(param_type); - } else if (TypeManager::is_pointer(param_type) || TypeManager::is_simple(param_type)) { + } else if (TypeManager::is_pointer(param_type) || + TypeManager::is_void(param_type) || + TypeManager::is_simple(param_type) || + TypeManager::is_simple_array(param_type)) { return new ParameterRemapUnchanged(param_type); } else { @@ -550,21 +547,19 @@ FunctionRemap *InterfaceMaker:: make_function_remap(const InterrogateType &itype, const InterrogateFunction &ifunc, CPPInstance *cppfunc, int num_default_parameters) { - FunctionRemap *remap = + FunctionRemap *remap = new FunctionRemap(itype, ifunc, cppfunc, num_default_parameters, this); - if (remap->_is_valid) - { - if (separate_overloading()) - { + if (remap->_is_valid) { + if (separate_overloading()) { hash_function_signature(remap); remap->_unique_name = get_unique_prefix() + _def->library_hash_name + remap->_hash; - remap->_wrapper_name = + remap->_wrapper_name = get_wrapper_prefix() + _def->library_hash_name + remap->_hash; remap->_reported_name = remap->_wrapper_name; - if (true_wrapper_names) - { - remap->_reported_name = + + if (true_wrapper_names) { + remap->_reported_name = InterrogateBuilder::clean_identifier(remap->_cppfunc->get_local_name(&parser)); } } @@ -589,7 +584,7 @@ make_function_remap(const InterrogateType &itype, // an overloaded function) need not define a name here. //////////////////////////////////////////////////////////////////// string InterfaceMaker:: -get_wrapper_name(const InterrogateType &itype, +get_wrapper_name(const InterrogateType &itype, const InterrogateFunction &ifunc, FunctionIndex func_index) { string func_name = ifunc.get_scoped_name(); @@ -677,12 +672,13 @@ record_function(const InterrogateType &itype, FunctionIndex func_index) { // parameters. This will happen only if separate_overloading(), // tested above, returned true; otherwise, max_default_parameters // will be 0 and the loop will only be traversed once. - for (int num_default_parameters = 0; + for (int num_default_parameters = 0; num_default_parameters <= max_default_parameters; num_default_parameters++) { - FunctionRemap *remap = + FunctionRemap *remap = make_function_remap(itype, ifunc, cppfunc, num_default_parameters); if (remap != (FunctionRemap *)NULL) { + func->_remaps.push_back(remap); // If *any* of the variants of this function has a "this" @@ -741,7 +737,8 @@ record_object(TypeIndex type_index) { } InterrogateDatabase *idb = InterrogateDatabase::get_ptr(); - const InterrogateType &itype = idb->get_type(type_index); + const InterrogateType &itype = idb->get_type(type_index); + assert(&itype != NULL); Object *object = new Object(itype); bool inserted = _objects.insert(Objects::value_type(type_index, object)).second; @@ -754,29 +751,26 @@ record_object(TypeIndex type_index) { function = record_function(itype, itype.get_constructor(ci)); object->_constructors.push_back(function); } - + int num_methods = itype.number_of_methods(); int mi; for (mi = 0; mi < num_methods; mi++) { function = record_function(itype, itype.get_method(mi)); object->_methods.push_back(function); } - + int num_casts = itype.number_of_casts(); for (mi = 0; mi < num_casts; mi++) { function = record_function(itype, itype.get_cast(mi)); object->_methods.push_back(function); } - + int num_derivations = itype.number_of_derivations(); - for (int di = 0; di < num_derivations; di++) - { - if (itype.derivation_has_upcast(di)) - { + for (int di = 0; di < num_derivations; di++) { + if (itype.derivation_has_upcast(di)) { record_function(itype, itype.derivation_get_upcast(di)); } - if (itype.derivation_has_downcast(di)) - { + if (itype.derivation_has_downcast(di)) { // Downcasts are methods of the base class, not the child class. TypeIndex base_type_index = itype.get_derivation(di); const InterrogateType &base_type = idb->get_type(base_type_index); @@ -785,27 +779,23 @@ record_object(TypeIndex type_index) { } int num_elements = itype.number_of_elements(); - for (int ei = 0; ei < num_elements; ei++) - { + for (int ei = 0; ei < num_elements; ei++) { ElementIndex element_index = itype.get_element(ei); const InterrogateElement &ielement = idb->get_element(element_index); - if (ielement.has_getter()) - { + if (ielement.has_getter()) { FunctionIndex func_index = ielement.get_getter(); record_function(itype, func_index); } - if (ielement.has_setter()) - { + if (ielement.has_setter()) { FunctionIndex func_index = ielement.get_setter(); record_function(itype, func_index); } - } + } object->check_protocols(); int num_nested = itype.number_of_nested_types(); - for (int ni = 0; ni < num_nested; ni++) - { + for (int ni = 0; ni < num_nested; ni++) { TypeIndex nested_index = itype.get_nested_type(ni); record_object(nested_index); } @@ -885,8 +875,14 @@ delete_return_value(ostream &out, int indent_level, // the indicated variable name. //////////////////////////////////////////////////////////////////// void InterfaceMaker:: -output_ref(ostream &out, int indent_level, FunctionRemap *remap, +output_ref(ostream &out, int indent_level, FunctionRemap *remap, const string &varname) const { + + if (TypeManager::is_pointer_to_base(remap->_return_type->get_temporary_type())) { + // Actually, we have it stored in a PointerTo. No need to do anything. + return; + } + if (remap->_type == FunctionRemap::T_constructor || remap->_type == FunctionRemap::T_typecast) { // In either of these cases, we can safely assume the pointer will @@ -915,8 +911,14 @@ output_ref(ostream &out, int indent_level, FunctionRemap *remap, // the indicated variable name. //////////////////////////////////////////////////////////////////// void InterfaceMaker:: -output_unref(ostream &out, int indent_level, FunctionRemap *remap, +output_unref(ostream &out, int indent_level, FunctionRemap *remap, const string &varname) const { + + if (TypeManager::is_pointer_to_base(remap->_return_type->get_temporary_type())) { + // Actually, we have it stored in a PointerTo. No need to do anything. + return; + } + if (remap->_type == FunctionRemap::T_constructor || remap->_type == FunctionRemap::T_typecast) { // In either of these cases, we can safely assume the pointer will @@ -931,8 +933,17 @@ output_unref(ostream &out, int indent_level, FunctionRemap *remap, indent(out, indent_level) << "if (" << varname << " != (" << remap->_return_type->get_new_type()->get_local_name(&parser) << ")NULL) {\n"; - indent(out, indent_level + 2) - << "unref_delete(" << varname << ");\n"; + + if (TypeManager::is_pointer_to_base(remap->_return_type->get_temporary_type())) { + // We're sure the reference count won't reach zero since we have it + // stored in a PointerTo, so call the unref() method directly. + indent(out, indent_level + 2) + << varname << "->unref();\n"; + } else { + indent(out, indent_level + 2) + << "unref_delete(" << varname << ");\n"; + } + indent(out, indent_level) << "}\n"; } @@ -967,7 +978,7 @@ hash_function_signature(FunctionRemap *remap) { nout << "Internal error! Function signature " << remap->_function_signature << " repeated!\n"; remap->_hash = hash; - abort(); + abort(); return; } diff --git a/dtool/src/interrogate/interfaceMaker.h b/dtool/src/interrogate/interfaceMaker.h index 021cb608bf..71a1f0eb6d 100644 --- a/dtool/src/interrogate/interfaceMaker.h +++ b/dtool/src/interrogate/interfaceMaker.h @@ -155,6 +155,7 @@ public: PT_make_copy = 0x0004, PT_copy_constructor = 0x0008, PT_iter = 0x0010, + PT_python_gc = 0x0020, }; int _protocol_types; }; diff --git a/dtool/src/interrogate/interfaceMakerPythonNative.cxx b/dtool/src/interrogate/interfaceMakerPythonNative.cxx index db63d2bc9d..7770cd748a 100644 --- a/dtool/src/interrogate/interfaceMakerPythonNative.cxx +++ b/dtool/src/interrogate/interfaceMakerPythonNative.cxx @@ -28,6 +28,7 @@ #include "vector" #include "cppParameterList.h" #include "algorithm" +#include "lineStream.h" #include #include @@ -37,8 +38,6 @@ extern InterrogateType dummy_type; extern std::string EXPORT_IMPORT_PREFIX; #define CLASS_PREFIX "Dtool_" -#define INSTANCE_PREFIX "Dtool_" -#define BASE_INSTANCE_NAME "Dtool_PyInstDef" ///////////////////////////////////////////////////////// // Name Remapper... @@ -49,10 +48,6 @@ struct RenameSet { const char *_to; int function_type; }; -struct FlagSet { - const char *_to; - int function_type; -}; /////////////////////////////////////////////////////////////////////////////////////// RenameSet methodRenameDictionary[] = { @@ -104,31 +99,9 @@ RenameSet methodRenameDictionary[] = { { "__deepcopy__" , "__deepcopy__", 0 }, { "print" , "Cprint", 0 }, { "CInterval.set_t", "_priv__cSetT", 0 }, - { "__bool__" , "__bool__", 0 }, - { "__bytes__" , "__bytes__", 0 }, - { "__iter__" , "__iter__", 0 }, - { "__getbuffer__" , "__getbuffer__", 0 }, - { "__releasebuffer__", "__releasebuffer__", 0 }, { NULL, NULL, -1 } }; -const char *InPlaceSet[] = { - "__iadd__", - "__isub__", - "__imul__", - "__idiv__", - "__ior__", - "__iand__", - "__ixor__", - "__ilshift__", - "__irshift__", - "__itruediv__", - "__ifloordiv__", - "__imod__", - "__ipow__", - NULL, -}; - /////////////////////////////////////////////////////////////////////////////////////// RenameSet classRenameDictionary[] = { // No longer used, now empty. @@ -188,6 +161,10 @@ checkKeyword(std::string &cppName) { /////////////////////////////////////////////////////////////////////////////////////// std::string classNameFromCppName(const std::string &cppName, bool mangle) { + if (!mangle_names) { + mangle = false; + } + //# initialize to empty string std::string className = ""; @@ -195,26 +172,29 @@ classNameFromCppName(const std::string &cppName, bool mangle) { const std::string badChars("!@#$%^&*()<>,.-=+~{}? "); bool nextCap = false; + bool nextUscore = false; bool firstChar = true && mangle; for (std::string::const_iterator chr = cppName.begin(); - chr != cppName.end(); - chr++) { + chr != cppName.end(); ++chr) { if ((*chr == '_' || *chr == ' ') && mangle) { nextCap = true; } else if (badChars.find(*chr) != std::string::npos) { - if (!mangle) { - className += '_'; - } + nextUscore = !mangle; } else if (nextCap || firstChar) { className += toupper(*chr); nextCap = false; firstChar = false; + } else if (nextUscore) { + className += '_'; + nextUscore = false; + className += *chr; + } else { - className += * chr; + className += *chr; } } @@ -238,6 +218,10 @@ classNameFromCppName(const std::string &cppName, bool mangle) { /////////////////////////////////////////////////////////////////////////////////////// std::string methodNameFromCppName(const std::string &cppName, const std::string &className, bool mangle) { + if (!mangle_names) { + mangle = false; + } + std::string origName = cppName; if (origName.substr(0, 6) == "__py__") { @@ -297,19 +281,12 @@ std::string methodNameFromCppName(InterfaceMaker::Function *func, const std::str return methodNameFromCppName(cppName, className, mangle); } -/////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////// - -bool isInplaceFunction(InterfaceMaker::Function *func) { - std::string wname = methodNameFromCppName(func, "", false); - - for (int x = 0; InPlaceSet[x] != NULL; x++) { - if (InPlaceSet[x] == wname) { - return true; - } +std::string methodNameFromCppName(FunctionRemap *remap, const std::string &className, bool mangle) { + std::string cppName = remap->_cppfunc->get_local_name(); + if (remap->_ftype->_flags & CPPFunctionType::F_unary_op) { + cppName += "unary"; } - - return false; + return methodNameFromCppName(cppName, className, mangle); } //////////////////////////////////////////////////////////////////// @@ -327,7 +304,13 @@ bool isInplaceFunction(InterfaceMaker::Function *func) { // important details. //////////////////////////////////////////////////////////////////// bool InterfaceMakerPythonNative:: -get_slotted_function_def(Object *obj, Function *func, SlottedFunctionDef &def) { +get_slotted_function_def(Object *obj, Function *func, FunctionRemap *remap, + SlottedFunctionDef &def) { + if (obj == NULL) { + // Only methods may be slotted. + return false; + } + def._answer_location = string(); def._wrapper_type = WT_none; def._min_version = 0; @@ -336,179 +319,171 @@ get_slotted_function_def(Object *obj, Function *func, SlottedFunctionDef &def) { bool is_unary_op = func->_ifunc.is_unary_op(); if (method_name == "operator +") { - def._answer_location = "tp_as_number->nb_add"; - def._wrapper_type = WT_numeric_operator; + def._answer_location = "nb_add"; + def._wrapper_type = WT_binary_operator; return true; } if (method_name == "operator -" && is_unary_op) { - def._answer_location = "tp_as_number->nb_negative"; + def._answer_location = "nb_negative"; def._wrapper_type = WT_no_params; return true; } if (method_name == "operator -") { - def._answer_location = "tp_as_number->nb_subtract"; - def._wrapper_type = WT_numeric_operator; + def._answer_location = "nb_subtract"; + def._wrapper_type = WT_binary_operator; return true; } if (method_name == "operator *") { - def._answer_location = "tp_as_number->nb_multiply"; - def._wrapper_type = WT_numeric_operator; + def._answer_location = "nb_multiply"; + def._wrapper_type = WT_binary_operator; return true; } if (method_name == "operator /") { - def._answer_location = "tp_as_number->nb_divide"; - def._wrapper_type = WT_numeric_operator; + def._answer_location = "nb_divide"; + def._wrapper_type = WT_binary_operator; return true; } if (method_name == "operator %") { - def._answer_location = "tp_as_number->nb_remainder"; - def._wrapper_type = WT_numeric_operator; + def._answer_location = "nb_remainder"; + def._wrapper_type = WT_binary_operator; return true; } if (method_name == "operator <<") { - def._answer_location = "tp_as_number->nb_lshift"; - def._wrapper_type = WT_numeric_operator; + def._answer_location = "nb_lshift"; + def._wrapper_type = WT_binary_operator; return true; } if (method_name == "operator >>") { - def._answer_location = "tp_as_number->nb_rshift"; - def._wrapper_type = WT_numeric_operator; + def._answer_location = "nb_rshift"; + def._wrapper_type = WT_binary_operator; return true; } if (method_name == "operator ^") { - def._answer_location = "tp_as_number->nb_xor"; - def._wrapper_type = WT_numeric_operator; + def._answer_location = "nb_xor"; + def._wrapper_type = WT_binary_operator; return true; } if (method_name == "operator ~" && is_unary_op) { - def._answer_location = "tp_as_number->nb_invert"; + def._answer_location = "nb_invert"; def._wrapper_type = WT_no_params; return true; } if (method_name == "operator &") { - def._answer_location = "tp_as_number->nb_and"; - def._wrapper_type = WT_numeric_operator; + def._answer_location = "nb_and"; + def._wrapper_type = WT_binary_operator; return true; } if (method_name == "operator |") { - def._answer_location = "tp_as_number->nb_or"; - def._wrapper_type = WT_numeric_operator; + def._answer_location = "nb_or"; + def._wrapper_type = WT_binary_operator; return true; } if (method_name == "__pow__") { - def._answer_location = "tp_as_number->nb_power"; + def._answer_location = "nb_power"; def._wrapper_type = WT_ternary_operator; return true; } if (method_name == "operator +=") { - def._answer_location = "tp_as_number->nb_inplace_add"; - def._wrapper_type = WT_one_param; - def._min_version = 0x02000000; + def._answer_location = "nb_inplace_add"; + def._wrapper_type = WT_inplace_binary_operator; return true; } if (method_name == "operator -=") { - def._answer_location = "tp_as_number->nb_inplace_subtract"; - def._wrapper_type = WT_one_param; - def._min_version = 0x02000000; + def._answer_location = "nb_inplace_subtract"; + def._wrapper_type = WT_inplace_binary_operator; return true; } if (method_name == "operator *=") { - def._answer_location = "tp_as_number->nb_inplace_multiply"; - def._wrapper_type = WT_one_param; - def._min_version = 0x02000000; + def._answer_location = "nb_inplace_multiply"; + def._wrapper_type = WT_inplace_binary_operator; return true; } if (method_name == "operator /=") { - def._answer_location = "tp_as_number->nb_inplace_divide"; - def._wrapper_type = WT_one_param; - def._min_version = 0x02000000; + def._answer_location = "nb_inplace_divide"; + def._wrapper_type = WT_inplace_binary_operator; return true; } if (method_name == "operator %=") { - def._answer_location = ".tp_as_number->nb_inplace_remainder"; - def._wrapper_type = WT_one_param; - def._min_version = 0x02000000; + def._answer_location = "nb_inplace_remainder"; + def._wrapper_type = WT_inplace_binary_operator; return true; } if (method_name == "operator <<=") { - def._answer_location = "tp_as_number->nb_inplace_lshift"; - def._wrapper_type = WT_one_param; - def._min_version = 0x02000000; + def._answer_location = "nb_inplace_lshift"; + def._wrapper_type = WT_inplace_binary_operator; return true; } if (method_name == "operator >>=") { - def._answer_location = "tp_as_number->nb_inplace_rshift"; - def._wrapper_type = WT_one_param; - def._min_version = 0x02000000; + def._answer_location = "nb_inplace_rshift"; + def._wrapper_type = WT_inplace_binary_operator; return true; } if (method_name == "operator &=") { - def._answer_location = "tp_as_number->nb_inplace_and"; - def._wrapper_type = WT_one_param; - def._min_version = 0x02000000; + def._answer_location = "nb_inplace_and"; + def._wrapper_type = WT_inplace_binary_operator; return true; } if (method_name == "operator ^=") { - def._answer_location = "tp_as_number->nb_inplace_xor"; - def._wrapper_type = WT_one_param; - def._min_version = 0x02000000; + def._answer_location = "nb_inplace_xor"; + def._wrapper_type = WT_inplace_binary_operator; return true; } if (method_name == "__ipow__") { - def._answer_location = "tp_as_number->nb_inplace_power"; - def._wrapper_type = WT_one_or_two_params; - def._min_version = 0x02000000; + def._answer_location = "nb_inplace_power"; + def._wrapper_type = WT_inplace_ternary_operator; return true; } if (obj->_protocol_types & Object::PT_sequence) { - if (func->_flags & FunctionRemap::F_getitem_int) { - def._answer_location = "tp_as_sequence->sq_item"; + if (remap->_flags & FunctionRemap::F_getitem_int) { + def._answer_location = "sq_item"; def._wrapper_type = WT_sequence_getitem; return true; } - if (func->_flags & FunctionRemap::F_setitem_int) { - def._answer_location = "tp_as_sequence->sq_ass_item"; + if (remap->_flags & FunctionRemap::F_setitem_int || + remap->_flags & FunctionRemap::F_delitem_int) { + def._answer_location = "sq_ass_item"; def._wrapper_type = WT_sequence_setitem; return true; } - if (func->_flags & FunctionRemap::F_size) { - def._answer_location = "tp_as_sequence->sq_length"; + if (remap->_flags & FunctionRemap::F_size) { + def._answer_location = "sq_length"; def._wrapper_type = WT_sequence_size; return true; } } if (obj->_protocol_types & Object::PT_mapping) { - if (func->_flags & FunctionRemap::F_getitem) { - def._answer_location = "tp_as_mapping->mp_subscript"; + if (remap->_flags & FunctionRemap::F_getitem) { + def._answer_location = "mp_subscript"; def._wrapper_type = WT_one_param; return true; } - if (func->_flags & FunctionRemap::F_setitem) { - def._answer_location = "tp_as_mapping->mp_ass_subscript"; + if (remap->_flags & FunctionRemap::F_setitem || + remap->_flags & FunctionRemap::F_delitem) { + def._answer_location = "mp_ass_subscript"; def._wrapper_type = WT_mapping_setitem; return true; } @@ -534,6 +509,14 @@ get_slotted_function_def(Object *obj, Function *func, SlottedFunctionDef &def) { return true; } + if (method_name == "__getattribute__") { + // Like __getattr__, but is called unconditionally, ie. + // does not try PyObject_GenericGetAttr first. + def._answer_location = "tp_getattro"; + def._wrapper_type = WT_one_param; + return true; + } + if (method_name == "__getattr__") { def._answer_location = "tp_getattro"; def._wrapper_type = WT_getattr; @@ -546,62 +529,133 @@ get_slotted_function_def(Object *obj, Function *func, SlottedFunctionDef &def) { return true; } - if (method_name == "__nonzero__") { - // Python 2 style. - def._answer_location = "tp_as_number->nb_nonzero"; - def._wrapper_type = WT_inquiry; + if (method_name == "__delattr__") { + // __delattr__ shares the slot with __setattr__, except + // that it takes only one argument. + def._answer_location = "tp_setattro"; + def._wrapper_type = WT_setattr; return true; } - if (method_name == "__bool__") { - // Python 3 style. - def._answer_location = "tp_as_number->nb_nonzero"; + if (method_name == "__nonzero__" || method_name == "__bool__") { + // Python 2 named it nb_nonzero, Python 3 nb_bool. We refer to it just + // as nb_bool. + def._answer_location = "nb_bool"; def._wrapper_type = WT_inquiry; return true; } if (method_name == "__getbuffer__") { - def._answer_location = "tp_as_buffer->bf_getbuffer"; + def._answer_location = "bf_getbuffer"; def._wrapper_type = WT_getbuffer; - def._min_version = 0x02060000; return true; } if (method_name == "__releasebuffer__") { - def._answer_location = "tp_as_buffer->bf_releasebuffer"; + def._answer_location = "bf_releasebuffer"; def._wrapper_type = WT_releasebuffer; - def._min_version = 0x02060000; return true; } - if (func->_ifunc.is_operator_typecast()) { + if (method_name == "__traverse__") { + def._answer_location = "tp_traverse"; + def._wrapper_type = WT_traverse; + return true; + } + + if (method_name == "__clear__") { + def._answer_location = "tp_clear"; + def._wrapper_type = WT_inquiry; + return true; + } + + if (method_name == "__repr__") { + def._answer_location = "tp_repr"; + def._wrapper_type = WT_no_params; + return true; + } + + if (method_name == "__str__") { + def._answer_location = "tp_str"; + def._wrapper_type = WT_no_params; + return true; + } + + if (method_name == "__cmp__" || (remap->_flags & FunctionRemap::F_compare_to) != 0) { + def._answer_location = "tp_compare"; + def._wrapper_type = WT_compare; + return true; + } + + if (remap->_type == FunctionRemap::T_typecast_method) { // A typecast operator. Check for a supported low-level typecast type. - if (!func->_remaps.empty()) { - if (TypeManager::is_bool(func->_remaps[0]->_return_type->get_orig_type())) { - // If it's a bool type, then we wrap it with the __nonzero__ - // slot method. - def._answer_location = "tp_as_number->nb_nonzero"; - def._wrapper_type = WT_inquiry; - return true; + if (TypeManager::is_bool(remap->_return_type->get_orig_type())) { + // If it's a bool type, then we wrap it with the __nonzero__ + // slot method. + def._answer_location = "nb_bool"; + def._wrapper_type = WT_inquiry; + return true; - } else if (TypeManager::is_integer(func->_remaps[0]->_return_type->get_orig_type())) { - // An integer type. - def._answer_location = "tp_as_number->nb_int"; - def._wrapper_type = WT_no_params; - return true; + } else if (TypeManager::is_integer(remap->_return_type->get_orig_type())) { + // An integer type. + def._answer_location = "nb_int"; + def._wrapper_type = WT_no_params; + return true; - } else if (TypeManager::is_float(func->_remaps[0]->_return_type->get_orig_type())) { - // A floating-point (or double) type. - def._answer_location = "tp_as_number->nb_float"; - def._wrapper_type = WT_no_params; - return true; - } + } else if (TypeManager::is_float(remap->_return_type->get_orig_type())) { + // A floating-point (or double) type. + def._answer_location = "nb_float"; + def._wrapper_type = WT_no_params; + return true; + + } else if (remap->_return_type->new_type_is_atomic_string()) { + // A string type. + def._answer_location = "tp_str"; + def._wrapper_type = WT_no_params; + return true; } } return false; } +//////////////////////////////////////////////////////////////////// +// Function: InterfaceMakerPythonNative::write_function_slot +// Access: Private, Static +// Description: Determines whether the slot occurs in the map of +// slotted functions, and if so, writes out a pointer +// to its wrapper. If not, writes out def (usually 0). +//////////////////////////////////////////////////////////////////// +void InterfaceMakerPythonNative:: +write_function_slot(ostream &out, int indent_level, const SlottedFunctions &slots, + const string &slot, const string &default_) { + + SlottedFunctions::const_iterator rfi = slots.find(slot); + if (rfi == slots.end()) { + indent(out, indent_level) << default_ << ","; + if (default_ == "0") { + out << " // " << slot; + } + out << "\n"; + return; + } + + const SlottedFunctionDef &def = rfi->second; + + // Add an #ifdef if there is a specific version requirement on this function. + if (def._min_version > 0) { + out << "#if PY_VERSION_HEX >= 0x" << hex << def._min_version << dec << "\n"; + } + + indent(out, indent_level) << "&" << def._wrapper_name << ",\n"; + + if (def._min_version > 0) { + out << "#else\n"; + indent(out, indent_level) << default_ << ",\n"; + out << "#endif\n"; + } +} + /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// void InterfaceMakerPythonNative:: @@ -649,33 +703,40 @@ get_valid_child_classes(std::map &answer, CPPStructTyp // /////////////////////////////////////////////////////////////////////////////// void InterfaceMakerPythonNative:: -write_python_instance(ostream &out, int indent_level, const std::string &return_expr, const std::string &assign_to, std::string &owns_memory_flag, const std::string &class_name, CPPType *ctype, bool inplace, const std::string &const_flag) { - string assign_stmt("return "); - if (!assign_to.empty()) { - assign_stmt = assign_to + " = "; - } +write_python_instance(ostream &out, int indent_level, const string &return_expr, + bool owns_memory, const string &class_name, + CPPType *ctype, bool is_const) { + out << boolalpha; - if (inplace) { - indent(out, indent_level) << "Py_INCREF(self);\n"; - indent(out, indent_level) << assign_stmt << "self;\n"; + if (IsPandaTypedObject(ctype->as_struct_type())) { + // We can't let DTool_CreatePyInstanceTyped do the NULL check since we + // will be grabbing the type index (which would obviously crash when called + // on a NULL pointer), so we do it here. + indent(out, indent_level) + << "if (" << return_expr << " == NULL) {\n"; + indent(out, indent_level) + << " Py_INCREF(Py_None);\n"; + indent(out, indent_level) + << " return Py_None;\n"; + indent(out, indent_level) + << "} else {\n"; + indent(out, indent_level) + << " return DTool_CreatePyInstanceTyped((void *)" << return_expr + << ", " << CLASS_PREFIX << make_safe_name(class_name) << ", " + << owns_memory << ", " << is_const << ", " + << return_expr << "->as_typed_object()->get_type_index());\n"; + indent(out, indent_level) + << "}\n"; } else { - indent(out, indent_level) << "if (" << return_expr << " == NULL) {\n"; - indent(out, indent_level) << " Py_INCREF(Py_None);\n"; - indent(out, indent_level+2) << assign_stmt << "Py_None;\n"; - indent(out, indent_level) << "} else {\n"; - - if (IsPandaTypedObject(ctype->as_struct_type())) { - std::string typestr = "(" + return_expr + ")->as_typed_object()->get_type_index()"; - indent(out, indent_level+2) << assign_stmt - << "DTool_CreatePyInstanceTyped((void *)" << return_expr << ", " << CLASS_PREFIX << make_safe_name(class_name) << ", " << owns_memory_flag << ", " << const_flag << ", " << typestr << ");\n"; - } else { - // indent(out, indent_level) << "if (" << return_expr << "!= NULL)\n"; - indent(out, indent_level+2) << assign_stmt - << "DTool_CreatePyInstance((void *)" << return_expr << ", " << CLASS_PREFIX << make_safe_name(class_name) << ", " << owns_memory_flag << ", " << const_flag << ");\n"; - } - indent(out, indent_level) << "}\n"; + // DTool_CreatePyInstance will do the NULL check. + indent(out, indent_level) + << "return " + << "DTool_CreatePyInstance((void *)" << return_expr << ", " + << CLASS_PREFIX << make_safe_name(class_name) << ", " + << owns_memory << ", " << is_const << ");\n"; } } + //////////////////////////////////////////////////////////////////// // Function: InterfaceMakerPythonNative::Constructor // Access: Public @@ -683,7 +744,7 @@ write_python_instance(ostream &out, int indent_level, const std::string &return_ //////////////////////////////////////////////////////////////////// InterfaceMakerPythonNative:: InterfaceMakerPythonNative(InterrogateModuleDef *def) : - InterfaceMakerPython(def) + InterfaceMakerPython(def) { } @@ -718,7 +779,7 @@ write_prototypes(ostream &out_code, ostream *out_h) { out_code << "//********************************************************************\n"; /* - for (fi = _functions.begin(); fi != _functions.end(); ++fi) + for (fi = _functions.begin(); fi != _functions.end(); ++fi) { Function *func = (*fi); if (!func->_itype.is_global() && is_function_legal(func)) @@ -735,7 +796,7 @@ write_prototypes(ostream &out_code, ostream *out_h) { write_prototypes_class(out_code, out_h, object); } else { //write_prototypes_class_external(out_code, object); - _external_imports.insert(make_safe_name(object->_itype.get_scoped_name())); + _external_imports.insert(object->_itype._cpptype); } } } @@ -745,8 +806,30 @@ write_prototypes(ostream &out_code, ostream *out_h) { out_code << "//*** prototypes for .. External Objects\n"; out_code << "//********************************************************************\n"; - for (std::set::iterator ii = _external_imports.begin(); ii != _external_imports.end(); ii++) { - out_code << "IMPORT_THIS struct Dtool_PyTypedObject Dtool_" << *ii << ";\n"; + for (std::set::iterator ii = _external_imports.begin(); ii != _external_imports.end(); ii++) { + CPPType *type = (*ii); + string class_name = type->get_local_name(&parser); + string safe_name = make_safe_name(class_name); + + out_code << "IMPORT_THIS struct Dtool_PyTypedObject Dtool_" << safe_name << ";\n"; + out_code << "IMPORT_THIS void Dtool_PyModuleClassInit_" << safe_name << "(PyObject *module);\n"; + + int has_coerce = has_coerce_constructor(type->as_struct_type()); + if (TypeManager::is_reference_count(type)) { + if (has_coerce > 0) { + out_code << "IMPORT_THIS bool Dtool_Coerce_" << safe_name << "(PyObject *args, CPT(" << class_name << ") &coerced);\n"; + if (has_coerce > 1) { + out_code << "IMPORT_THIS bool Dtool_Coerce_" << safe_name << "(PyObject *args, PT(" << class_name << ") &coerced);\n"; + } + } + } else { + if (has_coerce > 0) { + out_code << "IMPORT_THIS bool Dtool_Coerce_" << safe_name << "(PyObject *args, " << class_name << " const *&coerced, bool &manage);\n"; + if (has_coerce > 1) { + out_code << "IMPORT_THIS bool Dtool_Coerce_" << safe_name << "(PyObject *args, " << class_name << " *&coerced, bool &manage);\n"; + } + } + } } inside_python_native = false; @@ -754,8 +837,8 @@ write_prototypes(ostream &out_code, ostream *out_h) { ///////////////////////////////////////////////////////////////////////////////////////////// // Function : write_prototypes_class_external -// -// Description : Output enough enformation to a declartion of a externally +// +// Description : Output enough enformation to a declartion of a externally // generated dtool type object ///////////////////////////////////////////////////////////////////////////////////////////// void InterfaceMakerPythonNative:: @@ -769,6 +852,8 @@ write_prototypes_class_external(ostream &out, Object *obj) { out << "//*** prototypes for external.. " << class_name << "\n"; out << "//********************************************************************\n"; + // This typedef is necessary for class templates since we can't pass + // a comma to a macro function. out << "typedef " << c_class_name << " " << class_name << "_localtype;\n"; out << "Define_Module_Class_Forward(" << _def->module_name << ", " << class_name << ", " << class_name << "_localtype, " << classNameFromCppName(preferred_name, false) << ");\n"; } @@ -781,7 +866,7 @@ void InterfaceMakerPythonNative:: write_prototypes_class(ostream &out_code, ostream *out_h, Object *obj) { std::string ClassName = make_safe_name(obj->_itype.get_scoped_name()); Functions::iterator fi; - + out_code << "//********************************************************************\n"; out_code << "//*** prototypes for .. " << ClassName << "\n"; out_code << "//********************************************************************\n"; @@ -814,7 +899,7 @@ write_prototypes_class(ostream &out_code, ostream *out_h, Object *obj) { void InterfaceMakerPythonNative:: write_functions(ostream &out) { inside_python_native = true; - + out << "//********************************************************************\n"; out << "//*** Functions for .. Global\n" ; out << "//********************************************************************\n"; @@ -837,7 +922,7 @@ write_functions(ostream &out) { } } } - + //Objects::iterator oi; for (oi = _objects.begin(); oi != _objects.end(); ++oi) { Object *object = (*oi).second; @@ -855,111 +940,119 @@ write_functions(ostream &out) { inside_python_native = true; } -//////////////////////////////////////////////////////////// -// Function : write_class_details -//////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////// +// Function: InterfaceMakerPythonNative::write_class_details +// Access: Private +// Description: Writes out all of the wrapper methods necessary to +// export the given object. This is called by +// write_functions. +//////////////////////////////////////////////////////////////////// void InterfaceMakerPythonNative:: write_class_details(ostream &out, Object *obj) { Functions::iterator fi; - + Function::Remaps::const_iterator ri; + //std::string cClassName = obj->_itype.get_scoped_name(); std::string ClassName = make_safe_name(obj->_itype.get_scoped_name()); std::string cClassName = obj->_itype.get_true_name(); - + out << "//********************************************************************\n"; out << "//*** Functions for .. " << cClassName << "\n" ; out << "//********************************************************************\n"; + // First write out all the wrapper functions for the methods. for (fi = obj->_methods.begin(); fi != obj->_methods.end(); ++fi) { Function *func = (*fi); if (func) { + // Write the definition of the generic wrapper function for this function. write_function_for_top(out, obj, func); } } + // Now write out generated getters and setters for the properties. Properties::const_iterator pit; for (pit = obj->_properties.begin(); pit != obj->_properties.end(); ++pit) { Property *property = (*pit); const InterrogateElement &ielem = property->_ielement; - bool coercion_attempted = false; + string expected_params; if (property->_getter != NULL) { std::string fname = "PyObject *Dtool_" + ClassName + "_" + ielem.get_name() + "_Getter(PyObject *self, void *)"; - write_function_for_name(out, obj, property->_getter, fname, true, coercion_attempted, AT_no_args, false, false); + write_function_for_name(out, obj, property->_getter->_remaps, + fname, expected_params, true, + AT_no_args, RF_pyobject | RF_err_null); } if (property->_setter != NULL) { std::string fname = "int Dtool_" + ClassName + "_" + ielem.get_name() + "_Setter(PyObject *self, PyObject *arg, void *)"; - write_function_for_name(out, obj, property->_setter, fname, true, coercion_attempted, AT_single_arg, true, false); + write_function_for_name(out, obj, property->_setter->_remaps, + fname, expected_params, true, + AT_single_arg, RF_int); } } + // Write the constructors. if (obj->_constructors.size() == 0) { - out << "int Dtool_Init_" + ClassName + "(PyObject *self, PyObject *args, PyObject *kwds) {\n" - << " PyErr_SetString(PyExc_TypeError, \"cannot init constant class (" << cClassName << ")\");\n" - << " return -1;\n" - << "}\n\n"; - - out << "int Dtool_InitNoCoerce_" << ClassName << "(PyObject *self, PyObject *args) {\n" - << " PyErr_SetString(PyExc_TypeError, \"cannot init constant class (" << cClassName << ")\");\n" + // There is no constructor - write one that simply outputs an error. + out << "int Dtool_Init_" + ClassName + "(PyObject *, PyObject *, PyObject *) {\n" + << "#ifdef NDEBUG\n" + << " Dtool_Raise_TypeError(\"cannot init constant class\");\n" + << "#else\n" + << " Dtool_Raise_TypeError(\"cannot init constant class " << cClassName << "\");\n" + << "#endif\n" << " return -1;\n" << "}\n\n"; } else { - bool coercion_attempted = false; for (fi = obj->_constructors.begin(); fi != obj->_constructors.end(); ++fi) { Function *func = (*fi); std::string fname = "int Dtool_Init_" + ClassName + "(PyObject *self, PyObject *args, PyObject *kwds)"; - write_function_for_name(out, obj, func, fname, true, coercion_attempted, AT_keyword_args, true, false); + string expected_params; + write_function_for_name(out, obj, func->_remaps, fname, expected_params, true, AT_keyword_args, RF_int); } - if (coercion_attempted) { - // If a coercion attempt was written into the above constructor, - // then write a secondary constructor, that won't attempt any - // coercion. We'll need this for nested coercion calls. - for (fi = obj->_constructors.begin(); fi != obj->_constructors.end(); ++fi) { - Function *func = (*fi); - std::string fname = "int Dtool_InitNoCoerce_" + ClassName + "(PyObject *self, PyObject *args)"; - - write_function_for_name(out, obj, func, fname, false, coercion_attempted, AT_varargs, true, false); - } - } else { - // Otherwise, since the above constructor didn't involve any - // coercion anyway, we can use the same function for both - // purposes. Construct a trivial wrapper. - out << "int Dtool_InitNoCoerce_" << ClassName << "(PyObject *self, PyObject *args) {\n" - << " return Dtool_Init_" << ClassName << "(self, args, NULL);\n" - << "}\n\n"; - } - } - - MakeSeqs::iterator msi; - for (msi = obj->_make_seqs.begin(); msi != obj->_make_seqs.end(); ++msi) { - write_make_seq(out, obj, ClassName, *msi); } CPPType *cpptype = TypeManager::resolve_type(obj->_itype._cpptype); + + // If we have "coercion constructors", write a single wrapper to consolidate those. + int has_coerce = has_coerce_constructor(cpptype->as_struct_type()); + if (has_coerce > 0) { + write_coerce_constructor(out, obj, true); + if (has_coerce > 1) { + write_coerce_constructor(out, obj, false); + } + } + + // Write make seqs: generated methods that return a sequence of items. + MakeSeqs::iterator msi; + for (msi = obj->_make_seqs.begin(); msi != obj->_make_seqs.end(); ++msi) { + write_make_seq(out, obj, ClassName, cClassName, *msi); + } + + // Determine which external imports we will need. std::map details; std::map::iterator di; builder.get_type(TypeManager::unwrap(cpptype), false); get_valid_child_classes(details, cpptype->as_struct_type()); for (di = details.begin(); di != details.end(); di++) { //InterrogateType ptype =idb->get_type(di->first); - if (di->second._is_legal_py_class && !isExportThisRun(di->second._structType)) - _external_imports.insert(make_safe_name(di->second._to_class_name)); + if (di->second._is_legal_py_class && !isExportThisRun(di->second._structType)) { + _external_imports.insert(di->second._structType); + } //out << "IMPORT_THIS struct Dtool_PyTypedObject Dtool_" << make_safe_name(di->second._to_class_name) << ";\n"; } - { // the Cast Converter - + // Write support methods to cast from and to pointers of this type. + { out << "inline void *Dtool_UpcastInterface_" << ClassName << "(PyObject *self, Dtool_PyTypedObject *requested_type) {\n"; out << " Dtool_PyTypedObject *SelfType = ((Dtool_PyInstDef *)self)->_My_Type;\n"; out << " if (SelfType != &Dtool_" << ClassName << ") {\n"; - out << " printf(\"" << ClassName << " ** Bad Source Type-- Requesting Conversion from %s to %s\\n\", ((Dtool_PyInstDef *)self)->_My_Type->_name, requested_type->_name); fflush(NULL);\n";; + out << " printf(\"" << ClassName << " ** Bad Source Type-- Requesting Conversion from %s to %s\\n\", Py_TYPE(self)->tp_name, requested_type->_PyType.tp_name); fflush(NULL);\n";; out << " return NULL;\n"; out << " }\n"; out << "\n"; - out << " " << cClassName << " *local_this = (" << cClassName << " *)((Dtool_PyInstDef *)self)->_ptr_to_object;\n"; + out << " " << cClassName << " *local_this = (" << cClassName << " *)((Dtool_PyInstDef *)self)->_ptr_to_object;\n"; out << " if (requested_type == &Dtool_" << ClassName << ") {\n"; out << " return local_this;\n"; out << " }\n"; @@ -1008,22 +1101,47 @@ write_class_declarations(ostream &out, ostream *out_h, Object *obj) { std::string preferred_name = itype.get_name(); std::string class_struct_name = std::string(CLASS_PREFIX) + class_name; + CPPType *type = obj->_itype._cpptype; + + // This typedef is necessary for class templates since we can't pass + // a comma to a macro function. out << "typedef " << c_class_name << " " << class_name << "_localtype;\n"; if (obj->_itype.has_destructor() || obj->_itype.destructor_is_inherited()) { - if (TypeManager::is_reference_count(obj->_itype._cpptype)) { - out << "Define_Module_ClassRef(" << _def->module_name << ", " << class_name << ", " << class_name << "_localtype, " << classNameFromCppName(preferred_name, false) << ");\n"; + if (TypeManager::is_reference_count(type)) { + out << "Define_Module_ClassRef"; } else { - out << "Define_Module_Class(" << _def->module_name << ", " << class_name << ", " << class_name << "_localtype, " << classNameFromCppName(preferred_name, false) << ");\n"; + out << "Define_Module_Class"; } } else { - if (TypeManager::is_reference_count(obj->_itype._cpptype)) { - out << "Define_Module_ClassRef_Private(" << _def->module_name << ", " << class_name << ", " << class_name << "_localtype, " << classNameFromCppName(preferred_name, false) << ");\n"; + if (TypeManager::is_reference_count(type)) { + out << "Define_Module_ClassRef_Private"; } else { - out << "Define_Module_Class_Private(" << _def->module_name << ", " << class_name << ", " << class_name << "_localtype, " << classNameFromCppName(preferred_name, false) << ");\n"; + out << "Define_Module_Class_Private"; } } + out << "(" << _def->module_name << ", " << class_name << ", " << class_name << "_localtype, " << classNameFromCppName(preferred_name, false) << ");\n"; + + out << "EXPORT_THIS void Dtool_PyModuleClassInit_" << class_name << "(PyObject *module);\n"; + + int has_coerce = has_coerce_constructor(type->as_struct_type()); + if (TypeManager::is_reference_count(type)) { + if (has_coerce > 0) { + out << "EXPORT_THIS bool Dtool_Coerce_" << class_name << "(PyObject *args, CPT(" << c_class_name << ") &coerced);\n"; + if (has_coerce > 1) { + out << "EXPORT_THIS bool Dtool_Coerce_" << class_name << "(PyObject *args, PT(" << c_class_name << ") &coerced);\n"; + } + } + } else { + if (has_coerce > 0) { + out << "EXPORT_THIS bool Dtool_Coerce_" << class_name << "(PyObject *args, " << c_class_name << " const *&coerced, bool &manage);\n"; + if (has_coerce > 1) { + out << "EXPORT_THIS bool Dtool_Coerce_" << class_name << "(PyObject *args, " << c_class_name << " *&coerced, bool &manage);\n"; + } + } + } + out << "\n"; if (out_h != NULL) { @@ -1040,9 +1158,41 @@ write_class_declarations(ostream &out, ostream *out_h, Object *obj) { void InterfaceMakerPythonNative:: write_sub_module(ostream &out, Object *obj) { //Object * obj = _objects[_embeded_index] ; - std::string class_name = make_safe_name(obj->_itype.get_scoped_name()); + string class_name = make_safe_name(obj->_itype.get_scoped_name()); out << " // Module init upcall for " << obj->_itype.get_scoped_name() << "\n"; - out << " Dtool_PyModuleClassInit_" << class_name << "(module);\n"; + + if (!obj->_itype.is_typedef()) { + out << " // " << *(obj->_itype._cpptype) << "\n"; + out << " Dtool_PyModuleClassInit_" << class_name << "(module);\n"; + + } else { + // Unwrap typedefs. + TypeIndex wrapped = obj->_itype._wrapped_type; + while (interrogate_type_is_typedef(wrapped)) { + wrapped = interrogate_type_wrapped_type(wrapped); + } + + InterrogateDatabase *idb = InterrogateDatabase::get_ptr(); + const InterrogateType &wrapped_itype = idb->get_type(wrapped); + + class_name = make_safe_name(wrapped_itype.get_scoped_name()); + + out << " // typedef " << wrapped_itype.get_scoped_name() + << " " << *(obj->_itype._cpptype) << "\n"; + + if (!isExportThisRun(wrapped_itype._cpptype)) { + _external_imports.insert(wrapped_itype._cpptype); + } + } + + std::string export_class_name = classNameFromCppName(obj->_itype.get_name(), false); + std::string export_class_name2 = classNameFromCppName(obj->_itype.get_name(), true); + +// out << " Py_INCREF(&Dtool_" << class_name << ".As_PyTypeObject());\n"; + out << " PyModule_AddObject(module, \"" << export_class_name << "\", (PyObject *)&Dtool_" << class_name << ".As_PyTypeObject());\n"; + if (export_class_name != export_class_name2) { + out << " PyModule_AddObject(module, \"" << export_class_name2 << "\", (PyObject *)&Dtool_" << class_name << ".As_PyTypeObject());\n"; + } } ///////////////////////////////////////////////////////////////////////////// @@ -1054,27 +1204,27 @@ write_module_support(ostream &out, ostream *out_h, InterrogateModuleDef *def) { out << "//*** Module Object Linker ..\n"; out << "//********************************************************************\n"; - out << "static void BuildInstants(PyObject * module) {\n"; + out << "static void BuildInstants(PyObject *module) {\n"; + out << " (void) module; // Unused\n"; + Objects::iterator oi; for (oi = _objects.begin(); oi != _objects.end(); ++oi) { Object *object = (*oi).second; - if (!object->_itype.get_outer_class()) { - if (object->_itype.is_enum()) { - int enum_count = object->_itype.number_of_enum_values(); - if (enum_count > 0) { - out << "//********************************************************************\n"; - out << "//*** Module Enums .." << object->_itype.get_scoped_name() << "\n"; - out << "//********************************************************************\n"; - } - for (int xx = 0; xx< enum_count; xx++) { - string name1 = classNameFromCppName(object->_itype.get_enum_value_name(xx), false); - string name2 = classNameFromCppName(object->_itype.get_enum_value_name(xx), true); - int enum_value = object->_itype.get_enum_value(xx); - out << " PyModule_AddIntConstant(module, \"" << name1 << "\", " << enum_value << ");\n"; - if (name1 != name2) { - // Also write the mangled name, for historical purposes. - out << " PyModule_AddIntConstant(module, \"" << name2 << "\", " << enum_value << ");\n"; - } + if (object->_itype.is_enum() && !object->_itype.is_nested()) { + int enum_count = object->_itype.number_of_enum_values(); + if (enum_count > 0) { + out << "//********************************************************************\n"; + out << "//*** Module Enums .." << object->_itype.get_scoped_name() << "\n"; + out << "//********************************************************************\n"; + } + for (int xx = 0; xx < enum_count; xx++) { + string name1 = classNameFromCppName(object->_itype.get_enum_value_name(xx), false); + string name2 = classNameFromCppName(object->_itype.get_enum_value_name(xx), true); + string enum_value = "::" + object->_itype.get_enum_value_name(xx); + out << " PyModule_AddIntConstant(module, \"" << name1 << "\", " << enum_value << ");\n"; + if (name1 != name2) { + // Also write the mangled name, for historical purposes. + out << " PyModule_AddIntConstant(module, \"" << name2 << "\", " << enum_value << ");\n"; } } } @@ -1094,16 +1244,16 @@ write_module_support(ostream &out, ostream *out_h, InterrogateModuleDef *def) { string name2 = classNameFromCppName(iman.get_name(), true); if (iman.has_int_value()) { int value = iman.get_int_value(); - out << " PyModule_AddIntConstant(module, \"" << name1 << "\", " << value << ");\n"; + out << " PyModule_AddIntConstant(module, \"" << name1 << "\", " << value << ");\n"; if (name1 != name2) { // Also write the mangled name, for historical purposes. - out << " PyModule_AddIntConstant(module, \"" << name2 << "\", " << value << ");\n"; + out << " PyModule_AddIntConstant(module, \"" << name2 << "\", " << value << ");\n"; } } else { string value = iman.get_definition(); - out << " PyModule_AddStringConstant(module, \"" << name1 << "\", \"" << value << "\");\n"; + out << " PyModule_AddStringConstant(module, \"" << name1 << "\", \"" << value << "\");\n"; if (name1 != name2) { - out << " PyModule_AddStringConstant(module, \"" << name2 << "\", \"" << value << "\");\n"; + out << " PyModule_AddStringConstant(module, \"" << name2 << "\", \"" << value << "\");\n"; } } } @@ -1111,7 +1261,9 @@ write_module_support(ostream &out, ostream *out_h, InterrogateModuleDef *def) { for (oi = _objects.begin(); oi != _objects.end(); ++oi) { Object *object = (*oi).second; if (!object->_itype.get_outer_class()) { - if (object->_itype.is_class() ||object->_itype.is_struct()) { + if (object->_itype.is_class() || + object->_itype.is_struct() || + object->_itype.is_typedef()) { if (is_cpp_type_legal(object->_itype._cpptype)) { if (isExportThisRun(object->_itype._cpptype)) { write_sub_module(out, object); @@ -1172,8 +1324,8 @@ write_module_support(ostream &out, ostream *out_h, InterrogateModuleDef *def) { if (force_base_functions) { out << " // Support Function For Dtool_types ... for now in each module ??\n"; - out << " {\"Dtool_BorrowThisReference\", &Dtool_BorrowThisReference, METH_VARARGS, \"Used to borrow 'this' pointer (to, from)\\nAssumes no ownership.\"},\n"; - out << " {\"Dtool_AddToDictionary\", &Dtool_AddToDictionary, METH_VARARGS, \"Used to add items into a tp_dict\"},\n"; + out << " {\"Dtool_BorrowThisReference\", &Dtool_BorrowThisReference, METH_VARARGS, \"Used to borrow 'this' pointer (to, from)\\nAssumes no ownership.\"},\n"; + out << " {\"Dtool_AddToDictionary\", &Dtool_AddToDictionary, METH_VARARGS, \"Used to add items into a tp_dict\"},\n"; } out << " {NULL, NULL, 0, NULL}\n" << "};\n\n"; @@ -1248,7 +1400,14 @@ write_module_class(ostream &out, Object *obj) { int num_nested = obj->_itype.number_of_nested_types(); for (int ni = 0; ni < num_nested; ni++) { TypeIndex nested_index = obj->_itype.get_nested_type(ni); - Object * nested_obj = _objects[nested_index]; + if (_objects.count(nested_index) == 0) { + // Illegal type. + continue; + } + + Object *nested_obj = _objects[nested_index]; + assert(nested_obj != (Object *)NULL); + if (nested_obj->_itype.is_class() || nested_obj->_itype.is_struct()) { write_module_class(out, nested_obj); } @@ -1260,15 +1419,14 @@ write_module_class(ostream &out, Object *obj) { std::string ClassName = make_safe_name(obj->_itype.get_scoped_name()); std::string cClassName = obj->_itype.get_true_name(); std::string export_class_name = classNameFromCppName(obj->_itype.get_name(), false); - std::string export_class_name2 = classNameFromCppName(obj->_itype.get_name(), true); Functions::iterator fi; out << "//********************************************************************\n"; out << "//*** Py Init Code For .. " << ClassName << " | " << export_class_name << "\n" ; out << "//********************************************************************\n"; - out << "PyMethodDef Dtool_Methods_" << ClassName << "[] = {\n"; + out << "static PyMethodDef Dtool_Methods_" << ClassName << "[] = {\n"; - std::map slotted_functions; + SlottedFunctions slots; // function Table bool got_copy = false; bool got_deepcopy = false; @@ -1307,16 +1465,79 @@ write_module_class(ostream &out, Object *obj) { flags += " | METH_STATIC"; } - out << " { \"" << name1 << "\", (PyCFunction) &" - << func->_name << ", " << flags << ", (char *) " << func->_name << "_comment},\n"; - if (name1 != name2) { - out << " { \"" << name2 << "\", (PyCFunction) &" - << func->_name << ", " << flags << ", (char *) " << func->_name << "_comment},\n"; + bool has_nonslotted = false; + + Function::Remaps::const_iterator ri; + for (ri = func->_remaps.begin(); ri != func->_remaps.end(); ++ri) { + FunctionRemap *remap = (*ri); + if (!is_remap_legal(remap)) { + continue; + } + + SlottedFunctionDef slotted_def; + + if (get_slotted_function_def(obj, func, remap, slotted_def)) { + const string &key = slotted_def._answer_location; + if (slotted_def._wrapper_type == WT_none) { + slotted_def._wrapper_name = func->_name; + } else { + slotted_def._wrapper_name = func->_name + "_" + key; + } + if (slots.count(key)) { + slots[key]._remaps.insert(remap); + } else { + slots[key] = slotted_def; + slots[key]._remaps.insert(remap); + } + + // Python 3 doesn't support nb_divide. It has nb_true_divide and also + // nb_floor_divide, but they have different semantics than in C++. Ugh. + // Make special slots to store the nb_divide members that take a float. + // We'll use this to build up nb_true_divide, so that we can still properly + // divide float vector types. + if (remap->_flags & FunctionRemap::F_divide_float) { + string true_key; + if (key == "nb_inplace_divide") { + true_key = "nb_inplace_true_divide"; + } else { + true_key = "nb_true_divide"; + } + if (slots.count(true_key) == 0) { + SlottedFunctionDef def; + def._answer_location = true_key; + def._wrapper_type = slotted_def._wrapper_type; + def._min_version = 0x03000000; + def._wrapper_name = func->_name + "_" + true_key; + slots[true_key] = def; + } + slots[true_key]._remaps.insert(remap); + } + } else { + has_nonslotted = true; + } } - SlottedFunctionDef slotted_def; - if (get_slotted_function_def(obj, func, slotted_def)) { - slotted_functions[func] = slotted_def; + if (has_nonslotted) { + // This is a bit of a hack, as these methods should probably be + // going through the slotted function system. But it's kind of + // pointless to write these out, and a waste of space. + string fname = func->_ifunc.get_name(); + if (fname == "operator <" || + fname == "operator <=" || + fname == "operator ==" || + fname == "operator !=" || + fname == "operator >" || + fname == "operator >=") { + continue; + } + + // This method has non-slotted remaps, so write it out into the function table. + out << " { \"" << name1 << "\", (PyCFunction) &" + << func->_name << ", " << flags << ", (char *) " << func->_name << "_comment},\n"; + if (name1 != name2) { + out << " { \"" << name2 << "\", (PyCFunction) &" + << func->_name << ", " << flags << ", (char *) " << func->_name << "_comment},\n"; + } } } @@ -1352,7 +1573,7 @@ write_module_class(ostream &out, Object *obj) { } } - out << " { NULL, NULL }\n" + out << " { NULL, NULL, 0, NULL }\n" << "};\n\n"; int num_derivations = obj->_itype.number_of_derivations(); @@ -1363,7 +1584,7 @@ write_module_class(ostream &out, Object *obj) { const InterrogateType &d_itype = idb->get_type(d_type_Index); if (is_cpp_type_legal(d_itype._cpptype)) { if (!isExportThisRun(d_itype._cpptype)) { - _external_imports.insert(make_safe_name(d_itype.get_scoped_name().c_str())); + _external_imports.insert(d_itype._cpptype); //out << "IMPORT_THIS struct Dtool_PyTypedObject Dtool_" << make_safe_name(d_itype.get_scoped_name().c_str()) << ";\n"; } @@ -1387,68 +1608,97 @@ write_module_class(ostream &out, Object *obj) { } { - std::map::iterator rfi; // slotted_functions; - for (rfi = slotted_functions.begin(); rfi != slotted_functions.end(); rfi++) { - Function *func = rfi->first; - bool func_varargs = true; - string call_func; + SlottedFunctions::iterator rfi; + for (rfi = slots.begin(); rfi != slots.end(); rfi++) { + const SlottedFunctionDef &def = rfi->second; - switch (func->_args_type) { - case AT_keyword_args: - call_func = func->_name + "(self, args, NULL)"; - break; + // This is just for reporting. There might be remaps from multiple + // functions with different names mapped to the same slot. + string fname; + if (def._remaps.size() > 0) { + const FunctionRemap *first_remap = *def._remaps.begin(); + fname = first_remap->_cppfunc->get_simple_name(); + } - case AT_varargs: - call_func = func->_name + "(self, args)"; - break; - - case AT_single_arg: - func_varargs = false; - call_func = func->_name + "(self, arg)"; - break; - - default: - func_varargs = false; - call_func = func->_name + "(self)"; + if (def._min_version > 0) { + out << "#if PY_VERSION_HEX >= 0x" << hex << def._min_version << dec << "\n"; } switch (rfi->second._wrapper_type) { case WT_no_params: + case WT_iter_next: // TODO: fix iter_next to return NULL instead of None // PyObject *func(PyObject *self) { out << "//////////////////\n"; - out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; - out << "// " << ClassName << " ..." << rfi->second._answer_location << " = " << methodNameFromCppName(func, export_class_name, false) << "\n"; + out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; + out << "// " << ClassName << " slot " << rfi->second._answer_location << " -> " << fname << "\n"; out << "//////////////////\n"; - out << "static PyObject *" << func->_name << methodNameFromCppName(func, export_class_name, false) << "(PyObject *self) {\n"; - if (func_varargs) { - out << " PyObject *args = PyTuple_New(0);\n"; - out << " PyObject *result = " << call_func << ";\n"; - out << " Py_DECREF(args);\n"; - out << " return result;\n"; - } else { - out << " return " << call_func << ";\n"; - } + out << "static PyObject *" << def._wrapper_name << "(PyObject *self) {\n"; + out << " " << cClassName << " *local_this = NULL;\n"; + out << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"; + out << " return NULL;\n"; + out << " }\n\n"; + + string expected_params; + write_function_forset(out, def._remaps, 0, 0, expected_params, 2, true, true, + AT_no_args, RF_pyobject | RF_err_null, false); + + out << " if (!_PyErr_OCCURRED()) {\n"; + out << " return Dtool_Raise_BadArgumentsError(\n"; + output_quoted(out, 6, expected_params); + out << ");\n"; + out << " }\n"; + out << " return NULL;\n"; out << "}\n\n"; } break; case WT_one_param: - case WT_numeric_operator: + case WT_binary_operator: + case WT_inplace_binary_operator: // PyObject *func(PyObject *self, PyObject *one) { - out << "//////////////////\n"; - out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; - out << "// " << ClassName << " ..." << rfi->second._answer_location << " = " << methodNameFromCppName(func, export_class_name, false) << "\n"; - out << "//////////////////\n"; - out << "static PyObject *" << func->_name << methodNameFromCppName(func, export_class_name, false) << "(PyObject *self, PyObject *arg) {\n"; - if (func_varargs) { - out << " PyObject *args = PyTuple_Pack(1, arg);\n"; - out << " PyObject *result = " << call_func << ";\n"; - out << " Py_DECREF(args);\n"; - out << " return result;\n"; + int return_flags = RF_err_null; + if (rfi->second._wrapper_type == WT_inplace_binary_operator) { + return_flags |= RF_self; } else { - out << " return " << call_func << ";\n"; + return_flags |= RF_pyobject; + } + out << "//////////////////\n"; + out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; + out << "// " << ClassName << " slot " << rfi->second._answer_location << " -> " << fname << "\n"; + out << "//////////////////\n"; + out << "static PyObject *" << def._wrapper_name << "(PyObject *self, PyObject *arg) {\n"; + out << " " << cClassName << " *local_this = NULL;\n"; + if (rfi->second._wrapper_type != WT_one_param) { + // WT_binary_operator means we must return NotImplemented, instead + // of raising an exception, if the this pointer doesn't + // match. This is for things like __sub__, which Python + // likes to call on the wrong-type objects. + out << " DTOOL_Call_ExtractThisPointerForType(self, &Dtool_" << ClassName << ", (void **)&local_this);\n"; + out << " if (local_this == NULL) {\n"; + out << " Py_INCREF(Py_NotImplemented);\n"; + out << " return Py_NotImplemented;\n"; + } else { + out << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"; + out << " return NULL;\n"; + } + out << " }\n"; + + string expected_params; + write_function_forset(out, def._remaps, 1, 1, expected_params, 2, true, true, + AT_single_arg, return_flags, false); + + if (rfi->second._wrapper_type != WT_one_param) { + out << " Py_INCREF(Py_NotImplemented);\n"; + out << " return Py_NotImplemented;\n"; + } else { + out << " if (!_PyErr_OCCURRED()) {\n"; + out << " return Dtool_Raise_BadArgumentsError(\n"; + output_quoted(out, 6, expected_params); + out << ");\n"; + out << " }\n"; + out << " return NULL;\n"; } out << "}\n\n"; } @@ -1458,30 +1708,74 @@ write_module_class(ostream &out, Object *obj) { // int func(PyObject *self, PyObject *one, PyObject *two = NULL) { out << "//////////////////\n"; - out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; - out << "// " << ClassName << " ..." << rfi->second._answer_location << " = " << methodNameFromCppName(func, export_class_name, false) << "\n"; + out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; + out << "// " << ClassName << " slot " << rfi->second._answer_location << " -> " << fname << "\n"; out << "//////////////////\n"; - out << "static int " << func->_name << methodNameFromCppName(func, export_class_name, false) << "(PyObject *self, PyObject *arg, PyObject *arg2) {\n"; - if (func_varargs) { - out << " PyObject *args;\n"; - out << " if (arg2 == NULL) {\n"; - out << " args = PyTuple_Pack(1, arg);\n"; - out << " } else {\n"; - out << " args = PyTuple_Pack(2, arg, arg2);\n"; - out << " }\n"; - out << " PyObject *py_result = " << call_func << ";\n"; - out << " Py_DECREF(args);\n"; - } else { - out << " PyObject *py_result = " << call_func << ";\n"; + out << "static int " << def._wrapper_name << "(PyObject *self, PyObject *arg, PyObject *arg2) {\n"; + out << " " << cClassName << " *local_this = NULL;\n"; + out << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"; + out << " return -1;\n"; + out << " }\n\n"; + + set setattr_remaps; + set delattr_remaps; + + // This function handles both delattr and setattr. Fish out + // the remaps for both types. + set::const_iterator ri; + for (ri = def._remaps.begin(); ri != def._remaps.end(); ++ri) { + FunctionRemap *remap = (*ri); + + if (remap->_cppfunc->get_simple_name() == "__delattr__" && remap->_parameters.size() == 2) { + delattr_remaps.insert(remap); + + } else if (remap->_cppfunc->get_simple_name() == "__setattr__" && remap->_parameters.size() == 3) { + setattr_remaps.insert(remap); + } } - out << " if (py_result == NULL) return -1;\n"; - out << "#if PY_MAJOR_VERSION >= 3\n"; - out << " int result = PyLong_AsLong(py_result);\n"; - out << "#else\n"; - out << " int result = PyInt_AsLong(py_result);\n"; - out << "#endif\n"; - out << " Py_DECREF(py_result);\n"; - out << " return result;\n"; + + out << " // Determine whether to call __setattr__ or __delattr__.\n"; + out << " if (arg2 != (PyObject *)NULL) { // __setattr__\n"; + + if (!setattr_remaps.empty()) { + out << " PyObject *args = PyTuple_Pack(2, arg, arg2);\n"; + string expected_params; + write_function_forset(out, setattr_remaps, 2, 2, expected_params, 4, + true, true, AT_varargs, RF_int | RF_decref_args, true); + + out << " Py_DECREF(args);\n"; + out << " if (!_PyErr_OCCURRED()) {\n"; + out << " Dtool_Raise_BadArgumentsError(\n"; + output_quoted(out, 8, expected_params); + out << ");\n"; + out << " }\n"; + } else { + out << " PyErr_Format(PyExc_TypeError,\n"; + out << " \"can't set attributes of built-in/extension type '%s'\",\n"; + out << " Py_TYPE(self)->tp_name);\n"; + } + out << " return -1;\n\n"; + + out << " } else { // __delattr__\n"; + + if (!delattr_remaps.empty()) { + string expected_params; + write_function_forset(out, delattr_remaps, 1, 1, expected_params, 4, + true, true, AT_single_arg, RF_int, true); + + out << " if (!_PyErr_OCCURRED()) {\n"; + out << " Dtool_Raise_BadArgumentsError(\n"; + output_quoted(out, 8, expected_params); + out << ");\n"; + out << " }\n"; + } else { + out << " PyErr_Format(PyExc_TypeError,\n"; + out << " \"can't delete attributes of built-in/extension type '%s'\",\n"; + out << " Py_TYPE(self)->tp_name);\n"; + } + out << " return -1;\n"; + out << " }\n"; + out << "}\n\n"; } break; @@ -1489,26 +1783,35 @@ write_module_class(ostream &out, Object *obj) { case WT_getattr: // PyObject *func(PyObject *self, PyObject *one) // Specifically to implement __getattr__. - // With special handling to pass up to - // PyObject_GenericGetAttr() if it returns NULL. + // First calls PyObject_GenericGetAttr(), and only calls the wrapper if it returns NULL. + // If one wants to override this completely, one should define __getattribute__ instead. { out << "//////////////////\n"; - out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; - out << "// " << ClassName << " ..." << rfi->second._answer_location << " = " << methodNameFromCppName(func, export_class_name, false) << "\n"; + out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; + out << "// " << ClassName << " slot " << rfi->second._answer_location << " -> " << fname << "\n"; out << "//////////////////\n"; - out << "static PyObject *" << func->_name << methodNameFromCppName(func, export_class_name, false) << "(PyObject *self, PyObject *arg) {\n"; - if (func_varargs) { - out << " PyObject *args = PyTuple_Pack(1, arg);\n"; - out << " PyObject *result = " << call_func << ";\n"; - out << " Py_DECREF(args);\n"; - } else { - out << " PyObject *result = " << call_func << ";\n"; - } - out << " if (result == NULL) {\n"; - out << " PyErr_Clear();\n"; - out << " return PyObject_GenericGetAttr(self, arg);\n"; + out << "static PyObject *" << def._wrapper_name << "(PyObject *self, PyObject *arg) {\n"; + out << " PyObject *res = PyObject_GenericGetAttr(self, arg);\n"; + out << " if (res != NULL) {\n"; + out << " return res;\n"; out << " }\n"; - out << " return result;\n"; + out << " if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {\n"; + out << " return NULL;\n"; + out << " }\n"; + out << " PyErr_Clear();\n\n"; + + out << " " << cClassName << " *local_this = NULL;\n"; + out << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"; + out << " return NULL;\n"; + out << " }\n\n"; + + string expected_params; + write_function_forset(out, def._remaps, 1, 1, expected_params, 2, + true, true, AT_single_arg, + RF_pyobject | RF_err_null, true); + + //out << " PyErr_Clear();\n"; + out << " return NULL;\n"; out << "}\n\n"; } break; @@ -1517,14 +1820,12 @@ write_module_class(ostream &out, Object *obj) { // PyObject *func(PyObject *self, Py_ssize_t index) { out << "//////////////////\n"; - out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; - out << "// " << ClassName << " ..." << rfi->second._answer_location << " = " << methodNameFromCppName(func, export_class_name, false) << "\n"; + out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; + out << "// " << ClassName << " slot " << rfi->second._answer_location << " -> " << fname << "\n"; out << "//////////////////\n"; - out << "static PyObject *" << func->_name << methodNameFromCppName(func, export_class_name, false) << "(PyObject *self, Py_ssize_t index) {\n"; + out << "static PyObject *" << def._wrapper_name << "(PyObject *self, Py_ssize_t index) {\n"; out << " " << cClassName << " *local_this = NULL;\n"; - out << " DTOOL_Call_ExtractThisPointerForType(self, &Dtool_" << ClassName << ", (void **)&local_this);\n"; - out << " if (local_this == NULL) {\n"; - out << " PyErr_SetString(PyExc_AttributeError, \"C++ object is not yet constructed, or already destructed.\");\n"; + out << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"; out << " return NULL;\n"; out << " }\n\n"; @@ -1537,21 +1838,15 @@ write_module_class(ostream &out, Object *obj) { out << " return NULL;\n"; out << " }\n"; - // Gather the remaps with the F_getitem_int flag. - std::set remaps; - Function::Remaps::const_iterator ri; - for (ri = func->_remaps.begin(); ri != func->_remaps.end(); ++ri) { - FunctionRemap *remap = (*ri); - if (is_remap_legal(remap) && (remap->_flags & FunctionRemap::F_getitem_int)) { - remaps.insert(remap); - } - } - string expected_params; - bool coercion_attempted = false; - write_function_forset(out, obj, func, remaps, expected_params, 2, false, false, - coercion_attempted, AT_no_args, false, "index"); + write_function_forset(out, def._remaps, 1, 1, expected_params, 2, true, true, + AT_no_args, RF_pyobject | RF_err_null, false, true, "index"); + out << " if (!_PyErr_OCCURRED()) {\n"; + out << " return Dtool_Raise_BadArgumentsError(\n"; + output_quoted(out, 6, expected_params); + out << ");\n"; + out << " }\n"; out << " return NULL;\n"; out << "}\n\n"; } @@ -1561,14 +1856,12 @@ write_module_class(ostream &out, Object *obj) { // int_t func(PyObject *self, Py_ssize_t index, PyObject *value) { out << "//////////////////\n"; - out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; - out << "// " << ClassName << " ..." << rfi->second._answer_location << " = " << methodNameFromCppName(func, export_class_name, false) << "\n"; + out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; + out << "// " << ClassName << " slot " << rfi->second._answer_location << " -> " << fname << "\n"; out << "//////////////////\n"; - out << "static int " << func->_name << methodNameFromCppName(func, export_class_name, false) << "(PyObject *self, Py_ssize_t index, PyObject *arg) {\n"; + out << "static int " << def._wrapper_name << "(PyObject *self, Py_ssize_t index, PyObject *arg) {\n"; out << " " << cClassName << " *local_this = NULL;\n"; - out << " DTOOL_Call_ExtractThisPointerForType(self, &Dtool_" << ClassName << ", (void **)&local_this);\n"; - out << " if (local_this == NULL) {\n"; - out << " PyErr_SetString(PyExc_AttributeError, \"C++ object is not yet constructed, or already destructed.\");\n"; + out << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"; out << " return -1;\n"; out << " }\n\n"; @@ -1577,27 +1870,34 @@ write_module_class(ostream &out, Object *obj) { out << " return -1;\n"; out << " }\n"; - // Gather the remaps with the F_getitem_int flag. - std::set remaps; - Function::Remaps::const_iterator ri; - for (ri = func->_remaps.begin(); ri != func->_remaps.end(); ++ri) { + set setitem_remaps; + set delitem_remaps; + + // This function handles both delitem and setitem. Fish out + // the remaps for either one. + set::const_iterator ri; + for (ri = def._remaps.begin(); ri != def._remaps.end(); ++ri) { FunctionRemap *remap = (*ri); - if (is_remap_legal(remap) && (remap->_flags & FunctionRemap::F_setitem_int)) { - remaps.insert(remap); + + if (remap->_flags & FunctionRemap::F_setitem_int) { + setitem_remaps.insert(remap); + + } else if (remap->_flags & FunctionRemap::F_delitem_int) { + delitem_remaps.insert(remap); } } - // Note: we disallow parameter coercion for setitem. It's not clear if anybody - // uses it in this case, and since some people may need to call this function - // very often, it's probably best to disable it for performance. string expected_params; - bool coercion_attempted = false; - write_function_forset(out, obj, func, remaps, expected_params, 2, false, false, - coercion_attempted, AT_single_arg, true, "index"); + out << " if (arg != (PyObject *)NULL) { // __setitem__\n"; + write_function_forset(out, setitem_remaps, 2, 2, expected_params, 4, + true, true, AT_single_arg, RF_int, false, true, "index"); + out << " } else { // __delitem__\n"; + write_function_forset(out, delitem_remaps, 1, 1, expected_params, 4, + true, true, AT_single_arg, RF_int, false, true, "index"); + out << " }\n\n"; - out << " if (!PyErr_Occurred()) {\n"; - out << " PyErr_SetString(PyExc_TypeError,\n"; - out << " \"Arguments must match:\\n\"\n"; + out << " if (!_PyErr_OCCURRED()) {\n"; + out << " Dtool_Raise_BadArgumentsError(\n"; output_quoted(out, 6, expected_params); out << ");\n"; out << " }\n"; @@ -1610,19 +1910,17 @@ write_module_class(ostream &out, Object *obj) { // Py_ssize_t func(PyObject *self) { out << "//////////////////\n"; - out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; - out << "// " << ClassName << " ..." << rfi->second._answer_location << " = " << methodNameFromCppName(func, export_class_name, false) << "\n"; + out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; + out << "// " << ClassName << " slot " << rfi->second._answer_location << " -> " << fname << "\n"; out << "//////////////////\n"; - out << "static Py_ssize_t " << func->_name << methodNameFromCppName(func, export_class_name, false) << "(PyObject *self) {\n"; + out << "static Py_ssize_t " << def._wrapper_name << "(PyObject *self) {\n"; out << " " << cClassName << " *local_this = NULL;\n"; - out << " DTOOL_Call_ExtractThisPointerForType(self, &Dtool_" << ClassName << ", (void **)&local_this);\n"; - out << " if (local_this == NULL) {\n"; - out << " PyErr_SetString(PyExc_AttributeError, \"C++ object is not yet constructed, or already destructed.\");\n"; + out << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"; out << " return -1;\n"; out << " }\n\n"; // This is a cheap cheat around all of the overhead of calling the wrapper function. - out << " return (Py_ssize_t) local_this->" << func->_ifunc.get_name() << "();\n"; + out << " return (Py_ssize_t) local_this->" << fname << "();\n"; out << "}\n\n"; } break; @@ -1631,22 +1929,49 @@ write_module_class(ostream &out, Object *obj) { // int func(PyObject *self, PyObject *one, PyObject *two) { out << "//////////////////\n"; - out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; - out << "// " << ClassName << " ..." << rfi->second._answer_location << " = " << methodNameFromCppName(func, export_class_name, false) << "\n"; + out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; + out << "// " << ClassName << " slot " << rfi->second._answer_location << " -> " << fname << "\n"; out << "//////////////////\n"; - out << "static int " << func->_name << methodNameFromCppName(func, export_class_name, false) << "(PyObject *self, PyObject *arg, PyObject *arg2) {\n"; - if (func_varargs) { - out << " PyObject *args = PyTuple_Pack(2, arg, arg2);\n"; - out << " PyObject *result = " << call_func << ";\n"; - out << " Py_DECREF(args);\n"; - } else { - out << " PyObject *result = " << call_func << ";\n"; - } - out << " if (result == NULL) {\n"; + out << "static int " << def._wrapper_name << "(PyObject *self, PyObject *arg, PyObject *arg2) {\n"; + out << " " << cClassName << " *local_this = NULL;\n"; + out << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"; out << " return -1;\n"; + out << " }\n\n"; + + set setitem_remaps; + set delitem_remaps; + + // This function handles both delitem and setitem. Fish out + // the remaps for either one. + set::const_iterator ri; + for (ri = def._remaps.begin(); ri != def._remaps.end(); ++ri) { + FunctionRemap *remap = (*ri); + + if (remap->_flags & FunctionRemap::F_setitem_int) { + setitem_remaps.insert(remap); + + } else if (remap->_flags & FunctionRemap::F_delitem_int) { + delitem_remaps.insert(remap); + } + } + + string expected_params; + out << " if (arg2 != (PyObject *)NULL) { // __setitem__\n"; + out << " PyObject *args = PyTuple_Pack(2, arg, arg2);\n"; + write_function_forset(out, setitem_remaps, 2, 2, expected_params, 4, + true, true, AT_varargs, RF_int | RF_decref_args, false); + out << " Py_DECREF(args);\n"; + out << " } else { // __delitem__\n"; + write_function_forset(out, delitem_remaps, 1, 1, expected_params, 4, + true, true, AT_single_arg, RF_int, false); + out << " }\n\n"; + + out << " if (!_PyErr_OCCURRED()) {\n"; + out << " Dtool_Raise_BadArgumentsError(\n"; + output_quoted(out, 6, expected_params); + out << ");\n"; out << " }\n"; - out << " Py_DECREF(result);\n"; - out << " return 0;\n"; + out << " return -1;\n"; out << "}\n\n"; } break; @@ -1655,27 +1980,18 @@ write_module_class(ostream &out, Object *obj) { // int func(PyObject *self) { out << "//////////////////\n"; - out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; - out << "// " << ClassName << " ..." << rfi->second._answer_location << " = " << methodNameFromCppName(func, export_class_name, false) << "\n"; + out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; + out << "// " << ClassName << " slot " << rfi->second._answer_location << " -> " << fname << "\n"; out << "//////////////////\n"; - out << "static int " << func->_name << methodNameFromCppName(func, export_class_name, false) << "(PyObject *self) {\n"; - if (func_varargs) { - out << " PyObject *args = PyTuple_New(0);\n"; - out << " PyObject *result = " << call_func << ";\n"; - out << " Py_DECREF(args);\n"; - } else { - out << " PyObject *result = " << call_func << ";\n"; - } - out << " if (result == NULL) {\n"; + out << "static int " << def._wrapper_name << "(PyObject *self) {\n"; + out << " " << cClassName << " *local_this = NULL;\n"; + out << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"; out << " return -1;\n"; - out << " }\n"; - out << "#if PY_MAJOR_VERSION >= 3\n"; - out << " int iresult = PyLong_AsLong(result);\n"; - out << "#else\n"; - out << " int iresult = PyInt_AsLong(result);\n"; - out << "#endif\n"; - out << " Py_DECREF(result);\n"; - out << " return iresult;\n"; + out << " }\n\n"; + + FunctionRemap *remap = *def._remaps.begin(); + vector_string params; + out << " return (int) " << remap->call_function(out, 4, false, "local_this", params) << ";\n"; out << "}\n\n"; } break; @@ -1690,14 +2006,12 @@ write_module_class(ostream &out, Object *obj) { has_local_getbuffer = true; out << "//////////////////\n"; - out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; - out << "// " << ClassName << " ..." << rfi->second._answer_location << " = " << methodNameFromCppName(func, export_class_name, false) << "\n"; + out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; + out << "// " << ClassName << " slot " << rfi->second._answer_location << " -> " << fname << "\n"; out << "//////////////////\n"; - out << "static int " << func->_name << methodNameFromCppName(func, export_class_name, false) << "(PyObject *self, Py_buffer *buffer, int flags) {\n"; + out << "static int " << def._wrapper_name << "(PyObject *self, Py_buffer *buffer, int flags) {\n"; out << " " << cClassName << " *local_this = NULL;\n"; - out << " DTOOL_Call_ExtractThisPointerForType(self, &Dtool_" << ClassName << ", (void **) &local_this);\n"; - out << " if (local_this == NULL) {\n"; - out << " PyErr_SetString(PyExc_AttributeError, \"C++ object is not yet constructed, or already destructed.\");\n"; + out << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"; out << " return -1;\n"; out << " }\n\n"; @@ -1707,21 +2021,19 @@ write_module_class(ostream &out, Object *obj) { FunctionRemap *remap_nonconst = NULL; // Iterate through the remaps to find the one that matches our parameters. - Function::Remaps::const_iterator ri; - for (ri = func->_remaps.begin(); ri != func->_remaps.end(); ++ri) { + set::const_iterator ri; + for (ri = def._remaps.begin(); ri != def._remaps.end(); ++ri) { FunctionRemap *remap = (*ri); - if (remap->_flags & FunctionRemap::F_getbuffer) { - if (remap->_const_method) { - if ((remap->_flags & FunctionRemap::F_explicit_self) == 0) { - params_const.push_back("self"); - } - remap_const = remap; - } else { - if ((remap->_flags & FunctionRemap::F_explicit_self) == 0) { - params_nonconst.push_back("self"); - } - remap_nonconst = remap; + if (remap->_const_method) { + if ((remap->_flags & FunctionRemap::F_explicit_self) == 0) { + params_const.push_back("self"); } + remap_const = remap; + } else { + if ((remap->_flags & FunctionRemap::F_explicit_self) == 0) { + params_nonconst.push_back("self"); + } + remap_nonconst = remap; } } params_const.push_back("buffer"); @@ -1742,8 +2054,7 @@ write_module_class(ostream &out, Object *obj) { out << " if (!((Dtool_PyInstDef *)self)->_is_const) {\n"; out << " return " << remap_nonconst->call_function(out, 4, false, "local_this", params_nonconst) << ";\n"; out << " } else {\n"; - out << " PyErr_SetString(PyExc_TypeError,\n"; - out << " \"Cannot call " << ClassName << ".__getbuffer__() on a const object.\");\n"; + out << " Dtool_Raise_TypeError(\"Cannot call " << ClassName << ".__getbuffer__() on a const object.\");\n"; out << " return -1;\n"; out << " }\n"; } else if (remap_const != NULL) { @@ -1762,14 +2073,12 @@ write_module_class(ostream &out, Object *obj) { // Same story as __getbuffer__ above. { out << "//////////////////\n"; - out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; - out << "// " << ClassName << " ..." << rfi->second._answer_location << " = " << methodNameFromCppName(func, export_class_name, false) << "\n"; + out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; + out << "// " << ClassName << " slot " << rfi->second._answer_location << " -> " << fname << "\n"; out << "//////////////////\n"; - out << "static void " << func->_name << methodNameFromCppName(func, export_class_name, false) << "(PyObject *self, Py_buffer *buffer) {\n"; + out << "static void " << def._wrapper_name << "(PyObject *self, Py_buffer *buffer) {\n"; out << " " << cClassName << " *local_this = NULL;\n"; - out << " DTOOL_Call_ExtractThisPointerForType(self, &Dtool_" << ClassName << ", (void **) &local_this);\n"; - out << " if (local_this == NULL) {\n"; - out << " PyErr_SetString(PyExc_AttributeError, \"C++ object is not yet constructed, or already destructed.\");\n"; + out << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"; out << " return;\n"; out << " }\n\n"; @@ -1779,21 +2088,19 @@ write_module_class(ostream &out, Object *obj) { FunctionRemap *remap_nonconst = NULL; // Iterate through the remaps to find the one that matches our parameters. - Function::Remaps::const_iterator ri; - for (ri = func->_remaps.begin(); ri != func->_remaps.end(); ++ri) { + set::const_iterator ri; + for (ri = def._remaps.begin(); ri != def._remaps.end(); ++ri) { FunctionRemap *remap = (*ri); - if (remap->_flags & FunctionRemap::F_releasebuffer) { - if (remap->_const_method) { - if ((remap->_flags & FunctionRemap::F_explicit_self) == 0) { - params_const.push_back("self"); - } - remap_const = remap; - } else { - if ((remap->_flags & FunctionRemap::F_explicit_self) == 0) { - params_nonconst.push_back("self"); - } - remap_nonconst = remap; + if (remap->_const_method) { + if ((remap->_flags & FunctionRemap::F_explicit_self) == 0) { + params_const.push_back("self"); } + remap_const = remap; + } else { + if ((remap->_flags & FunctionRemap::F_explicit_self) == 0) { + params_nonconst.push_back("self"); + } + remap_nonconst = remap; } } params_const.push_back("buffer"); @@ -1809,21 +2116,25 @@ write_module_class(ostream &out, Object *obj) { } out << " } else {\n"; return_expr = remap_const->call_function(out, 4, false, const_this, params_const); + if (!return_expr.empty()) { out << " " << return_expr << ";\n"; } out << " }\n"; + } else if (remap_nonconst != NULL) { // Doesn't matter if there's no const version. We *have* to call it or else we could leak memory. return_expr = remap_nonconst->call_function(out, 2, false, "local_this", params_nonconst); if (!return_expr.empty()) { out << " " << return_expr << ";\n"; } + } else if (remap_const != NULL) { return_expr = remap_const->call_function(out, 2, false, const_this, params_const); if (!return_expr.empty()) { out << " " << return_expr << ";\n"; } + } else { nout << ClassName << "::__releasebuffer__ does not match the required signature.\n"; out << " return;\n"; @@ -1833,61 +2144,141 @@ write_module_class(ostream &out, Object *obj) { } break; - case WT_iter_next: - // PyObject *func(PyObject *self) - // However, returns NULL instead of None + case WT_ternary_operator: + case WT_inplace_ternary_operator: + // PyObject *func(PyObject *self, PyObject *one, PyObject *two) { - out << "//////////////////\n"; - out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; - out << "// " << ClassName << " ..." << rfi->second._answer_location << " = " << methodNameFromCppName(func, export_class_name, false) << "\n"; - out << "//////////////////\n"; - out << "static PyObject *" << func->_name << methodNameFromCppName(func, export_class_name, false) << "(PyObject *self) {\n"; - if (func_varargs) { - out << " PyObject *args = PyTuple_New(0);\n"; - out << " PyObject *result = " << call_func << ";\n"; - out << " Py_DECREF(args);\n"; + int return_flags = RF_err_null; + if (rfi->second._wrapper_type == WT_inplace_ternary_operator) { + return_flags |= RF_self; } else { - out << " PyObject *result = " << call_func << ";\n"; + return_flags |= RF_pyobject; } - out << " if (result == Py_None) {\n"; - out << " Py_DECREF(Py_None);\n"; - out << " return NULL;\n"; - out << " } else {\n"; - out << " return result;\n"; + out << "//////////////////\n"; + out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; + out << "// " << ClassName << " slot " << rfi->second._answer_location << " -> " << fname << "\n"; + out << "//////////////////\n"; + out << "static PyObject *" << def._wrapper_name << "(PyObject *self, PyObject *arg, PyObject *arg2) {\n"; + out << " " << cClassName << " *local_this = NULL;\n"; + out << " DTOOL_Call_ExtractThisPointerForType(self, &Dtool_" << ClassName << ", (void **)&local_this);\n"; + out << " if (local_this == NULL) {\n"; + // WT_ternary_operator means we must return NotImplemented, instead + // of raising an exception, if the this pointer doesn't + // match. This is for things like __pow__, which Python + // likes to call on the wrong-type objects. + out << " Py_INCREF(Py_NotImplemented);\n"; + out << " return Py_NotImplemented;\n"; out << " }\n"; + + set one_param_remaps; + set two_param_remaps; + + set::const_iterator ri; + for (ri = def._remaps.begin(); ri != def._remaps.end(); ++ri) { + FunctionRemap *remap = (*ri); + + if (remap->_parameters.size() == 2) { + one_param_remaps.insert(remap); + + } else if (remap->_parameters.size() == 3) { + two_param_remaps.insert(remap); + } + } + + string expected_params; + + out << " if (arg2 != (PyObject *)NULL) {\n"; + out << " PyObject *args = PyTuple_Pack(2, arg, arg2);\n"; + write_function_forset(out, two_param_remaps, 2, 2, expected_params, 4, + true, true, AT_varargs, RF_pyobject | RF_err_null | RF_decref_args, true); + out << " Py_DECREF(args);\n"; + out << " } else {\n"; + write_function_forset(out, one_param_remaps, 1, 1, expected_params, 4, + true, true, AT_single_arg, RF_pyobject | RF_err_null, true); + out << " }\n\n"; + + out << " if (!_PyErr_OCCURRED()) {\n"; + out << " return Dtool_Raise_BadArgumentsError(\n"; + output_quoted(out, 6, expected_params); + out << ");\n"; + out << " }\n"; + out << " return NULL;\n"; out << "}\n\n"; } break; - case WT_one_or_two_params: - case WT_ternary_operator: - // PyObject *func(PyObject *self, PyObject *one, PyObject *two) + case WT_traverse: + // int __traverse__(PyObject *self, visitproc visit, void *arg) + // This is a low-level function. Overloads are not supported. { out << "//////////////////\n"; - out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; - out << "// " << ClassName << " ..." << rfi->second._answer_location << " = " << methodNameFromCppName(func, export_class_name, false) << "\n"; + out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; + out << "// " << ClassName << " slot " << rfi->second._answer_location << " -> " << fname << "\n"; out << "//////////////////\n"; - out << "static PyObject *" << func->_name << methodNameFromCppName(func, export_class_name, false) << "(PyObject *self, PyObject *arg, PyObject *arg2) {\n"; - if (func_varargs) { - out << " PyObject *args;\n"; - out << " if (arg2 != Py_None) {\n"; - out << " args = PyTuple_Pack(2, arg, arg2);\n"; - out << " } else {\n"; - out << " args = PyTuple_Pack(1, arg);\n"; - out << " }\n\n"; - out << " PyObject *result = " << call_func << ";\n"; - out << " Py_DECREF(args);\n"; - out << " return result;\n"; - } else { - out << " return " << call_func << ";\n"; + out << "static int " << def._wrapper_name << "(PyObject *self, visitproc visit, void *arg) {\n"; + out << " " << cClassName << " *local_this = NULL;\n"; + out << " DTOOL_Call_ExtractThisPointerForType(self, &Dtool_" << ClassName << ", (void **) &local_this);\n"; + out << " if (local_this == NULL) {\n"; + out << " PyErr_SetString(PyExc_AttributeError, \"C++ object is not yet constructed, or already destructed.\");\n"; + out << " return -1;\n"; + out << " }\n\n"; + + // Find the remap. There should be only one. + FunctionRemap *remap = *def._remaps.begin(); + + vector_string params(1); + if (remap->_flags & FunctionRemap::F_explicit_self) { + params.push_back("self"); } + params.push_back("visit"); + params.push_back("arg"); + + out << " return " << remap->call_function(out, 2, false, "local_this", params) << ";\n"; + out << "}\n\n"; + } + break; + + case WT_compare: + // int func(PyObject *self, Py_ssize_t index) + { + out << "//////////////////\n"; + out << "// A wrapper function to satisfy Python's internal calling conventions.\n"; + out << "// " << ClassName << " slot " << rfi->second._answer_location << " -> " << fname << "\n"; + out << "//////////////////\n"; + out << "static int " << def._wrapper_name << "(PyObject *self, PyObject *arg) {\n"; + out << " " << cClassName << " *local_this = NULL;\n"; + out << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"; + out << " return -1;\n"; + out << " }\n\n"; + + string expected_params; + write_function_forset(out, def._remaps, 1, 1, expected_params, 2, true, true, + AT_single_arg, RF_compare, false, true); + + out << " if (!_PyErr_OCCURRED()) {\n"; + out << " Dtool_Raise_BadArgumentsError(\n"; + output_quoted(out, 6, expected_params); + out << ");\n"; + out << " }\n"; + out << " return -1;\n"; out << "}\n\n"; } break; case WT_none: + // Nothing special about the wrapper function: just write it normally. + string fname = "static PyObject *" + def._wrapper_name + "(PyObject *self, PyObject *args, PyObject *kwds)\n"; + + vector remaps; + remaps.insert(remaps.end(), def._remaps.begin(), def._remaps.end()); + string expected_params; + write_function_for_name(out, obj, remaps, fname, expected_params, true, AT_keyword_args, RF_pyobject | RF_err_null); break; } + + if (def._min_version > 0) { + out << "#endif // PY_VERSION_HEX >= 0x" << hex << def._min_version << dec << "\n"; + } } string get_key = HasAGetKeyFunction(obj->_itype); @@ -1898,11 +2289,9 @@ write_module_class(ostream &out, Object *obj) { out << "//////////////////\n"; out << "static Py_hash_t Dtool_HashKey_" << ClassName << "(PyObject *self) {\n"; out << " " << cClassName << " *local_this = NULL;\n"; - out << " DTOOL_Call_ExtractThisPointerForType(self, &Dtool_" << ClassName << ", (void **) &local_this);\n"; - out << " if (local_this == NULL) {\n"; - out << " PyErr_SetString(PyExc_AttributeError, \"C++ object is not yet constructed, or already destructed.\");\n"; + out << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"; out << " return -1;\n"; - out << " }\n"; + out << " }\n\n"; out << " return local_this->" << get_key << "();\n"; out << "}\n\n"; has_local_hash = true; @@ -1914,18 +2303,19 @@ write_module_class(ostream &out, Object *obj) { out << "//////////////////\n"; out << "static Py_hash_t Dtool_HashKey_" << ClassName << "(PyObject *self) {\n"; out << " " << cClassName << " *local_this = NULL;\n"; - out << " DTOOL_Call_ExtractThisPointerForType(self, &Dtool_" << ClassName << ", (void **) &local_this);\n"; - out << " if (local_this == NULL) {\n"; - out << " PyErr_SetString(PyExc_AttributeError, \"C++ object is not yet constructed, or already destructed.\");\n"; + out << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"; out << " return -1;\n"; - out << " }\n"; + out << " }\n\n"; out << " return (Py_hash_t) local_this;\n"; out << "}\n\n"; has_local_hash = true; } } - int need_repr = NeedsAReprFunction(obj->_itype); + int need_repr = 0; + if (slots.count("tp_repr") == 0) { + need_repr = NeedsAReprFunction(obj->_itype); + } if (need_repr > 0) { out << "//////////////////\n"; out << "// A __repr__ function\n"; @@ -1933,11 +2323,9 @@ write_module_class(ostream &out, Object *obj) { out << "//////////////////\n"; out << "static PyObject *Dtool_Repr_" << ClassName << "(PyObject *self) {\n"; out << " " << cClassName << " *local_this = NULL;\n"; - out << " DTOOL_Call_ExtractThisPointerForType(self, &Dtool_" << ClassName << ", (void **) &local_this);\n"; - out << " if (local_this == NULL) {\n"; - out << " PyErr_SetString(PyExc_AttributeError, \"C++ object is not yet constructed, or already destructed.\");\n"; + out << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"; out << " return NULL;\n"; - out << " }\n"; + out << " }\n\n"; out << " ostringstream os;\n"; if (need_repr == 3) { out << " invoke_extension(local_this).python_repr(os, \"" @@ -1958,7 +2346,10 @@ write_module_class(ostream &out, Object *obj) { has_local_repr = true; } - int need_str = NeedsAStrFunction(obj->_itype); + int need_str = 0; + if (slots.count("tp_str") == 0) { + need_str = NeedsAStrFunction(obj->_itype); + } if (need_str > 0) { out << "//////////////////\n"; out << "// A __str__ function\n"; @@ -1966,11 +2357,9 @@ write_module_class(ostream &out, Object *obj) { out << "//////////////////\n"; out << "static PyObject *Dtool_Str_" << ClassName << "(PyObject *self) {\n"; out << " " << cClassName << " *local_this = NULL;\n"; - out << " DTOOL_Call_ExtractThisPointerForType(self, &Dtool_" << ClassName << ", (void **)&local_this);\n"; - out << " if (local_this == NULL) {\n"; - out << " PyErr_SetString(PyExc_AttributeError, \"C++ object is not yet constructed, or already destructed.\");\n"; + out << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"; out << " return NULL;\n"; - out << " }\n"; + out << " }\n\n"; out << " ostringstream os;\n"; if (need_str == 2) { out << " local_this->write(os, 0);\n"; @@ -1995,14 +2384,11 @@ write_module_class(ostream &out, Object *obj) { out << "//////////////////\n"; out << "static PyObject *Dtool_RichCompare_" << ClassName << "(PyObject *self, PyObject *arg, int op) {\n"; out << " " << cClassName << " *local_this = NULL;\n"; - out << " DTOOL_Call_ExtractThisPointerForType(self, &Dtool_" << ClassName << ", (void **)&local_this);\n"; - out << " if (local_this == NULL) {\n"; - out << " PyErr_SetString(PyExc_AttributeError, \"C++ object is not yet constructed, or already destructed.\");\n"; + out << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"; out << " return NULL;\n"; out << " }\n\n"; out << " switch (op) {\n"; - Function *compare_to_func = NULL; for (fi = obj->_methods.begin(); fi != obj->_methods.end(); ++fi) { std::set remaps; Function *func = (*fi); @@ -2019,75 +2405,66 @@ write_module_class(ostream &out, Object *obj) { } const string &fname = func->_ifunc.get_name(); if (fname == "operator <") { - out << " case Py_LT: {\n"; + out << " case Py_LT:\n"; } else if (fname == "operator <=") { - out << " case Py_LE: {\n"; + out << " case Py_LE:\n"; } else if (fname == "operator ==") { - out << " case Py_EQ: {\n"; + out << " case Py_EQ:\n"; } else if (fname == "operator !=") { - out << " case Py_NE: {\n"; + out << " case Py_NE:\n"; } else if (fname == "operator >") { - out << " case Py_GT: {\n"; + out << " case Py_GT:\n"; } else if (fname == "operator >=") { - out << " case Py_GE: {\n"; - } else if (fname == "compare_to") { - compare_to_func = func; - continue; + out << " case Py_GE:\n"; } else { continue; } + out << " {\n"; string expected_params; - bool coercion_attempted = false; - write_function_forset(out, obj, func, remaps, expected_params, 4, false, true, - coercion_attempted, AT_single_arg, false); + write_function_forset(out, remaps, 1, 1, expected_params, 6, true, false, + AT_single_arg, RF_pyobject | RF_err_null, false); - out << " if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_TypeError)) {\n"; - out << " PyErr_Clear();\n"; + out << " break;\n"; out << " }\n"; - out << " break;\n"; - out << " }\n"; has_local_richcompare = true; } out << " }\n\n"; - out << " if (PyErr_Occurred()) {\n"; - out << " return (PyObject *)NULL;\n"; + out << " if (_PyErr_OCCURRED()) {\n"; + out << " PyErr_Clear();\n"; out << " }\n\n"; - if (compare_to_func != NULL) { + if (slots.count("tp_compare")) { + // A lot of Panda code depends on comparisons being done via the + // compare_to function, which is mapped to the tp_compare slot, which + // Python 3 no longer has. So, we'll write code to fall back to that if + // no matching comparison operator was found. out << "#if PY_MAJOR_VERSION >= 3\n"; out << " // All is not lost; we still have the compare_to function to fall back onto.\n"; - out << " PyObject *result = " << compare_to_func->_name << "(self, arg);\n"; - out << " if (result != NULL) {\n"; - out << " if (PyLong_Check(result)) {;\n"; - out << " long cmpval = PyLong_AsLong(result);\n"; - out << " switch (op) {\n"; - out << " case Py_LT:\n"; - out << " return PyBool_FromLong(cmpval < 0);\n"; - out << " case Py_LE:\n"; - out << " return PyBool_FromLong(cmpval <= 0);\n"; - out << " case Py_EQ:\n"; - out << " return PyBool_FromLong(cmpval == 0);\n"; - out << " case Py_NE:\n"; - out << " return PyBool_FromLong(cmpval != 0);\n"; - out << " case Py_GT:\n"; - out << " return PyBool_FromLong(cmpval > 0);\n"; - out << " case Py_GE:\n"; - out << " return PyBool_FromLong(cmpval >= 0);\n"; - out << " }\n"; - out << " }\n"; - out << " Py_DECREF(result);\n"; - out << " }\n\n"; - - out << " if (PyErr_Occurred()) {\n"; + out << " int cmpval = " << slots["tp_compare"]._wrapper_name << "(self, arg);\n"; + out << " if (cmpval == -1 && _PyErr_OCCURRED()) {\n"; out << " if (PyErr_ExceptionMatches(PyExc_TypeError)) {\n"; out << " PyErr_Clear();\n"; out << " } else {\n"; out << " return (PyObject *)NULL;\n"; out << " }\n"; out << " }\n"; + out << " switch (op) {\n"; + out << " case Py_LT:\n"; + out << " return PyBool_FromLong(cmpval < 0);\n"; + out << " case Py_LE:\n"; + out << " return PyBool_FromLong(cmpval <= 0);\n"; + out << " case Py_EQ:\n"; + out << " return PyBool_FromLong(cmpval == 0);\n"; + out << " case Py_NE:\n"; + out << " return PyBool_FromLong(cmpval != 0);\n"; + out << " case Py_GT:\n"; + out << " return PyBool_FromLong(cmpval > 0);\n"; + out << " case Py_GE:\n"; + out << " return PyBool_FromLong(cmpval >= 0);\n"; + out << " }\n"; out << "#endif\n\n"; } @@ -2096,10 +2473,12 @@ write_module_class(ostream &out, Object *obj) { out << "}\n\n"; } + int num_getset = 0; + if (obj->_properties.size() > 0) { // Write out the array of properties, telling Python which getter and setter // to call when they are assigned or queried in Python code. - out << "PyGetSetDef Dtool_Properties_" << ClassName << "[] = {\n"; + out << "static PyGetSetDef Dtool_Properties_" << ClassName << "[] = {\n"; Properties::const_iterator pit; for (pit = obj->_properties.begin(); pit != obj->_properties.end(); ++pit) { @@ -2109,197 +2488,471 @@ write_module_class(ostream &out, Object *obj) { continue; } - out << " {(char *)\"" << ielem.get_name() << "\"," - << " &Dtool_" << ClassName << "_" << ielem.get_name() << "_Getter,"; + ++num_getset; - if (property->_setter == NULL || !is_function_legal(property->_setter)) { - out << " NULL,"; - } else { - out << " &Dtool_" << ClassName << "_" << ielem.get_name() << "_Setter,"; + string name1 = methodNameFromCppName(ielem.get_name(), "", false); + string name2 = methodNameFromCppName(ielem.get_name(), "", true); + + string getter = "&Dtool_" + ClassName + "_" + ielem.get_name() + "_Getter"; + string setter = "NULL"; + if (property->_setter != NULL && is_function_legal(property->_setter)) { + setter = "&Dtool_" + ClassName + "_" + ielem.get_name() + "_Setter"; } + out << " {(char *)\"" << name1 << "\", " << getter << ", " << setter; + if (ielem.has_comment()) { - out << "(char *)\n"; + out << ", (char *)\n"; output_quoted(out, 4, ielem.get_comment()); out << ",\n "; } else { - out << " NULL, "; + out << ", NULL, "; } // Extra void* argument; we don't make use of it. out << "NULL},\n"; + + if (name1 != name2 && name1 != "__dict__") { + // Add alternative spelling. + out << " {(char *)\"" << name2 << "\", " << getter << ", " << setter + << ", (char *)\n" + << " \"Alias of " << name1 << ", for consistency with old naming conventions.\",\n" + << " NULL},\n"; + } } out << " {NULL},\n"; out << "};\n\n"; } + bool has_parent_class = (obj->_itype.number_of_derivations() != 0); + + // Output the type slot tables. + out << "static PyNumberMethods Dtool_NumberMethods_" << ClassName << " = {\n"; + write_function_slot(out, 2, slots, "nb_add"); + write_function_slot(out, 2, slots, "nb_subtract"); + write_function_slot(out, 2, slots, "nb_multiply"); + out << "#if PY_MAJOR_VERSION < 3\n"; + // Note: nb_divide does not exist in Python 3. We will probably need some + // smart mechanism for dispatching to either floor_divide or true_divide. + write_function_slot(out, 2, slots, "nb_divide"); + out << "#endif\n"; + write_function_slot(out, 2, slots, "nb_remainder"); + write_function_slot(out, 2, slots, "nb_divmod"); + write_function_slot(out, 2, slots, "nb_power"); + write_function_slot(out, 2, slots, "nb_negative"); + write_function_slot(out, 2, slots, "nb_positive"); + write_function_slot(out, 2, slots, "nb_absolute"); + write_function_slot(out, 2, slots, "nb_bool"); + write_function_slot(out, 2, slots, "nb_invert"); + write_function_slot(out, 2, slots, "nb_lshift"); + write_function_slot(out, 2, slots, "nb_rshift"); + write_function_slot(out, 2, slots, "nb_and"); + write_function_slot(out, 2, slots, "nb_xor"); + write_function_slot(out, 2, slots, "nb_or"); + out << "#if PY_MAJOR_VERSION < 3\n"; + write_function_slot(out, 2, slots, "nb_coerce"); + out << "#endif\n"; + write_function_slot(out, 2, slots, "nb_int"); + out << " 0, // nb_long\n"; // removed in Python 3 + write_function_slot(out, 2, slots, "nb_float"); + out << "#if PY_MAJOR_VERSION < 3\n"; + write_function_slot(out, 2, slots, "nb_oct"); + write_function_slot(out, 2, slots, "nb_hex"); + out << "#endif\n"; + + write_function_slot(out, 2, slots, "nb_inplace_add"); + write_function_slot(out, 2, slots, "nb_inplace_subtract"); + write_function_slot(out, 2, slots, "nb_inplace_multiply"); + out << "#if PY_MAJOR_VERSION < 3\n"; + write_function_slot(out, 2, slots, "nb_inplace_divide"); + out << "#endif\n"; + write_function_slot(out, 2, slots, "nb_inplace_remainder"); + write_function_slot(out, 2, slots, "nb_inplace_power"); + write_function_slot(out, 2, slots, "nb_inplace_lshift"); + write_function_slot(out, 2, slots, "nb_inplace_rshift"); + write_function_slot(out, 2, slots, "nb_inplace_and"); + write_function_slot(out, 2, slots, "nb_inplace_xor"); + write_function_slot(out, 2, slots, "nb_inplace_or"); + + write_function_slot(out, 2, slots, "nb_floor_divide"); + write_function_slot(out, 2, slots, "nb_true_divide"); + write_function_slot(out, 2, slots, "nb_inplace_floor_divide"); + write_function_slot(out, 2, slots, "nb_inplace_true_divide"); + + out << "#if PY_VERSION_HEX >= 0x02050000\n"; + write_function_slot(out, 2, slots, "nb_index"); + out << "#endif\n"; + out << "};\n\n"; + + // NB: it's tempting not to write this table when a class doesn't have them. + // But then Python won't inherit them from base classes either! So we always + // write this table for now even if it will be full of 0's, unless this type + // has no base classes at all. + if (has_parent_class || (obj->_protocol_types & Object::PT_sequence) != 0) { + out << "static PySequenceMethods Dtool_SequenceMethods_" << ClassName << " = {\n"; + write_function_slot(out, 2, slots, "sq_length"); + write_function_slot(out, 2, slots, "sq_concat"); + write_function_slot(out, 2, slots, "sq_repeat"); + write_function_slot(out, 2, slots, "sq_item"); + out << " 0, // sq_slice\n"; // removed in Python 3 + write_function_slot(out, 2, slots, "sq_ass_item"); + out << " 0, // sq_ass_slice\n"; // removed in Python 3 + write_function_slot(out, 2, slots, "sq_contains"); + + write_function_slot(out, 2, slots, "sq_inplace_concat"); + write_function_slot(out, 2, slots, "sq_inplace_repeat"); + out << "};\n\n"; + } + + // Same note applies as for the SequenceMethods. + if (has_parent_class || (obj->_protocol_types & Object::PT_mapping) != 0) { + out << "static PyMappingMethods Dtool_MappingMethods_" << ClassName << " = {\n"; + write_function_slot(out, 2, slots, "mp_length"); + write_function_slot(out, 2, slots, "mp_subscript"); + write_function_slot(out, 2, slots, "mp_ass_subscript"); + out << "};\n\n"; + } + + // Same note applies as above. + if (has_parent_class || has_local_getbuffer) { + out << "static PyBufferProcs Dtool_BufferProcs_" << ClassName << " = {\n"; + out << "#if PY_MAJOR_VERSION < 3\n"; + write_function_slot(out, 2, slots, "bf_getreadbuffer"); + write_function_slot(out, 2, slots, "bf_getwritebuffer"); + write_function_slot(out, 2, slots, "bf_getsegcount"); + write_function_slot(out, 2, slots, "bf_getcharbuffer"); + out << "#endif\n"; + out << "#if PY_MAJOR_VERSION >= 0x02060000\n"; + write_function_slot(out, 2, slots, "bf_getbuffer"); + write_function_slot(out, 2, slots, "bf_releasebuffer"); + out << "#endif\n"; + out << "};\n\n"; + } + + // Output the actual PyTypeObject definition. + out << "EXPORT_THIS Dtool_PyTypedObject Dtool_" << ClassName << " = {\n"; + out << " {\n"; + out << " PyVarObject_HEAD_INIT(NULL, 0)\n"; + // const char *tp_name; + out << " \"" << _def->module_name << "." << export_class_name << "\",\n"; + // Py_ssize_t tp_basicsize; + out << " sizeof(Dtool_PyInstDef),\n"; + // Py_ssize_t tp_itemsize; + out << " 0, // tp_itemsize\n"; + + // destructor tp_dealloc; + out << " &Dtool_FreeInstance_" << ClassName << ",\n"; + // printfunc tp_print; + write_function_slot(out, 4, slots, "tp_print"); + // getattrfunc tp_getattr; + write_function_slot(out, 4, slots, "tp_getattr"); + // setattrfunc tp_setattr; + write_function_slot(out, 4, slots, "tp_setattr"); + + // cmpfunc tp_compare; (reserved in Python 3) + out << "#if PY_MAJOR_VERSION >= 3\n"; + out << " 0, // tp_reserved\n"; + out << "#else\n"; + if (slots.count("tp_compare") != 0) { + write_function_slot(out, 4, slots, "tp_compare"); + } else { + // We can/should still define a comparison in Python 2 that is more + // meaningful that comparing id(x) with id(y). + out << " &DTOOL_PyObject_ComparePointers,\n"; + } + out << "#endif\n"; + + // reprfunc tp_repr; + if (has_local_repr) { + out << " &Dtool_Repr_" << ClassName << ",\n"; + } else { + write_function_slot(out, 4, slots, "tp_repr"); + } + + // PyNumberMethods *tp_as_number; + out << " &Dtool_NumberMethods_" << ClassName << ",\n"; + // PySequenceMethods *tp_as_sequence; + if (has_parent_class || (obj->_protocol_types & Object::PT_sequence) != 0) { + out << " &Dtool_SequenceMethods_" << ClassName << ",\n"; + } else { + out << " 0, // tp_as_sequence\n"; + } + // PyMappingMethods *tp_as_mapping; + if (has_parent_class || (obj->_protocol_types & Object::PT_mapping) != 0) { + out << " &Dtool_MappingMethods_" << ClassName << ",\n"; + } else { + out << " 0, // tp_as_mapping\n"; + } + + // hashfunc tp_hash; + if (has_local_hash) { + out << " &Dtool_HashKey_" << ClassName << ",\n"; + } else { + write_function_slot(out, 4, slots, "tp_hash"); + } + + // ternaryfunc tp_call; + write_function_slot(out, 4, slots, "tp_call"); + + // reprfunc tp_str; + if (has_local_str) { + out << " &Dtool_Str_" << ClassName << ",\n"; + } else if (has_local_repr) { + out << " &Dtool_Repr_" << ClassName << ",\n"; + } else { + write_function_slot(out, 4, slots, "tp_str"); + } + + // getattrofunc tp_getattro; + write_function_slot(out, 4, slots, "tp_getattro", + "PyObject_GenericGetAttr"); + // setattrofunc tp_setattro; + write_function_slot(out, 4, slots, "tp_setattro", + "PyObject_GenericSetAttr"); + + // PyBufferProcs *tp_as_buffer; + if (has_parent_class || has_local_getbuffer) { + out << " &Dtool_BufferProcs_" << ClassName << ",\n"; + } else { + out << " 0, // tp_as_buffer\n"; + } + + string gcflag; + if (obj->_protocol_types & Object::PT_python_gc) { + gcflag = " | Py_TPFLAGS_HAVE_GC"; + } + + // long tp_flags; + if (has_local_getbuffer) { + out << "#if PY_VERSION_HEX >= 0x02060000 && PY_VERSION_HEX < 0x03000000\n"; + out << " Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES | Py_TPFLAGS_HAVE_NEWBUFFER" << gcflag << ",\n"; + out << "#else\n"; + out << " Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES" << gcflag << ",\n"; + out << "#endif\n"; + } else { + out << " Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES" << gcflag << ",\n"; + } + + // const char *tp_doc; + if (obj->_itype.has_comment()) { + out << "#ifdef NDEBUG\n"; + out << " 0,\n"; + out << "#else\n"; + output_quoted(out, 4, obj->_itype.get_comment()); + out << ",\n"; + out << "#endif\n"; + } else { + out << " 0, // tp_doc\n"; + } + + // traverseproc tp_traverse; + write_function_slot(out, 4, slots, "tp_traverse"); + + // inquiry tp_clear; + write_function_slot(out, 4, slots, "tp_clear"); + + // richcmpfunc tp_richcompare; + if (has_local_richcompare) { + out << " &Dtool_RichCompare_" << ClassName << ",\n"; + } else if (has_local_hash) { + out << "#if PY_MAJOR_VERSION >= 3\n"; + out << " &DTOOL_PyObject_RichCompare,\n"; + out << "#else\n"; + out << " 0,\n"; + out << "#endif\n"; + } else { + write_function_slot(out, 4, slots, "tp_richcompare"); + } + + // Py_ssize_t tp_weaklistoffset; + out << " 0, // tp_weaklistoffset\n"; + + // getiterfunc tp_iter; + write_function_slot(out, 4, slots, "tp_iter"); + // iternextfunc tp_iternext; + write_function_slot(out, 4, slots, "tp_iternext"); + + // struct PyMethodDef *tp_methods; + out << " Dtool_Methods_" << ClassName << ",\n"; + // struct PyMemberDef *tp_members; + out << " standard_type_members,\n"; + + // struct PyGetSetDef *tp_getset; + if (num_getset > 0) { + out << " Dtool_Properties_" << ClassName << ",\n"; + } else { + out << " 0, // tp_getset\n"; + } + + // struct _typeobject *tp_base; + out << " 0, // tp_base\n"; + // PyObject *tp_dict; + out << " 0, // tp_dict\n"; + // descrgetfunc tp_descr_get; + write_function_slot(out, 4, slots, "tp_descr_get"); + // descrsetfunc tp_descr_set; + write_function_slot(out, 4, slots, "tp_descr_set"); + // Py_ssize_t tp_dictoffset; + out << " 0, // tp_dictoffset\n"; + // initproc tp_init; + if (obj->_constructors.size() > 0) { + out << " Dtool_Init_" << ClassName << ",\n"; + } else { + out << " 0,\n"; + } + // allocfunc tp_alloc; + out << " PyType_GenericAlloc,\n"; + // newfunc tp_new; + out << " Dtool_new_" << ClassName << ",\n"; + // freefunc tp_free; + if (obj->_protocol_types & Object::PT_python_gc) { + out << " PyObject_GC_Del,\n"; + } else { + out << " PyObject_Del,\n"; + } + // inquiry tp_is_gc; + out << " 0, // tp_is_gc\n"; + // PyObject *tp_bases; + out << " 0, // tp_bases\n"; + // PyObject *tp_mro; + out << " 0, // tp_mro\n"; + // PyObject *tp_cache; + out << " 0, // tp_cache\n"; + // PyObject *tp_subclasses; + out << " 0, // tp_subclasses\n"; + // PyObject *tp_weaklist; + out << " 0, // tp_weaklist\n"; + // destructor tp_del; + out << " 0, // tp_del\n"; + // unsigned int tp_version_tag + out << "#if PY_VERSION_HEX >= 0x02060000\n"; + out << " 0, // tp_version_tag\n"; + out << "#endif\n"; + out << " },\n"; + out << " Dtool_UpcastInterface_" << ClassName << ",\n"; + out << " Dtool_DowncastInterface_" << ClassName << ",\n"; + out << " TypeHandle::none(),\n"; + out << "};\n\n"; + out << "void Dtool_PyModuleClassInit_" << ClassName << "(PyObject *module) {\n"; + out << " (void) module; // Unused\n"; out << " static bool initdone = false;\n"; out << " if (!initdone) {\n"; out << " initdone = true;\n"; - // out << " memset(Dtool_" << ClassName << ".As_PyTypeObject().tp_as_number,0,sizeof(PyNumberMethods));\n"; - // out << " memset(Dtool_" << ClassName << ".As_PyTypeObject().tp_as_mapping,0,sizeof(PyMappingMethods));\n"; - // out << " static Dtool_PyTypedObject *InheritsFrom[] = {"; - // add doc string - if (obj->_itype.has_comment()) { - out << "#ifndef NDEBUG\n"; - out << " // Class documentation string\n"; - out << " Dtool_" << ClassName - << ".As_PyTypeObject().tp_doc =\n"; - output_quoted(out, 6, obj->_itype.get_comment()); - out << ";\n" - << "#endif\n"; - } - - // Add flags. - if (obj->_protocol_types & Object::PT_iter) { - out << "#if PY_VERSION_HEX < 0x03000000\n"; - out << " Dtool_" << ClassName << ".As_PyTypeObject().tp_flags |= Py_TPFLAGS_HAVE_ITER;\n"; - out << "#endif"; - } - if (has_local_getbuffer) { - out << "#if PY_VERSION_HEX >= 0x02060000 && PY_VERSION_HEX < 0x03000000\n"; - out << " Dtool_" << ClassName << ".As_PyTypeObject().tp_flags |= Py_TPFLAGS_HAVE_NEWBUFFER;\n"; - out << "#endif"; - } - - // add bases/// + // Add bases. if (bases.size() > 0) { out << " // Dependent objects\n"; string baseargs; for (vector::iterator bi = bases.begin(); bi != bases.end(); ++bi) { baseargs += ", &Dtool_" + *bi + ".As_PyTypeObject()"; - out << " Dtool_" << make_safe_name(*bi) << "._Dtool_ClassInit(NULL);\n"; + out << " Dtool_PyModuleClassInit_" << make_safe_name(*bi) << "(NULL);\n"; } out << " Dtool_" << ClassName << ".As_PyTypeObject().tp_bases = PyTuple_Pack(" << bases.size() << baseargs << ");\n"; } - // get dictionary - out << " Dtool_" << ClassName << ".As_PyTypeObject().tp_dict = PyDict_New();\n"; - out << " PyDict_SetItemString(Dtool_" << ClassName << ".As_PyTypeObject().tp_dict, \"DtoolClassDict\", Dtool_" << ClassName << ".As_PyTypeObject().tp_dict);\n"; - - // Now assign the slotted function definitions. - map::const_iterator rfi; - int prev_min_version = 0; - - for (rfi = slotted_functions.begin(); rfi != slotted_functions.end(); rfi++) { - Function *func = rfi->first; - const SlottedFunctionDef &def = rfi->second; - - // Add an #ifdef if there is a specific version requirement on this function. - if (def._min_version != prev_min_version) { - if (prev_min_version > 0) { - out << "#endif\n"; - } - prev_min_version = def._min_version; - if (def._min_version > 0) { - out << "#if PY_VERSION_HEX >= 0x" << hex << def._min_version << dec << "\n"; - } - } - - out << " // " << rfi->second._answer_location << " = " << methodNameFromCppName(func, export_class_name, false) << "\n"; - - if (def._wrapper_type == WT_none) { - // Bound directly, without wrapper. - out << " Dtool_" << ClassName << ".As_PyTypeObject()." << def._answer_location << " = &" << func->_name << ";\n"; - } else { - // Assign to the wrapper method that was generated earlier. - out << " Dtool_" << ClassName << ".As_PyTypeObject()." << def._answer_location << " = &" << func->_name << methodNameFromCppName(func, export_class_name, false) << ";\n"; - } - } - if (prev_min_version > 0) { - out << "#endif\n"; - } - - // compare and hash work together in PY inherit behavior hmm grrr - // __hash__ - if (has_local_hash) { - out << " // __hash__\n"; - out << " Dtool_" << ClassName << ".As_PyTypeObject().tp_hash = &Dtool_HashKey_" << ClassName << ";\n"; - out << "#if PY_MAJOR_VERSION >= 3\n"; - if (!has_local_richcompare) { - out << " Dtool_" << ClassName << ".As_PyTypeObject().tp_richcompare = &DTOOL_PyObject_RichCompare;\n"; - } - out << "#else\n"; - out << " Dtool_" << ClassName << ".As_PyTypeObject().tp_compare = &DTOOL_PyObject_Compare;\n"; - out << "#endif\n"; - } - - if (has_local_richcompare) { - out << " Dtool_" << ClassName << ".As_PyTypeObject().tp_richcompare = &Dtool_RichCompare_" << ClassName << ";\n"; - } - - if (has_local_repr) { - out << " // __repr__\n"; - out << " Dtool_" << ClassName << ".As_PyTypeObject().tp_repr = &Dtool_Repr_" << ClassName << ";\n"; - } - - if (has_local_str) { - out << " // __str__\n"; - out << " Dtool_" << ClassName << ".As_PyTypeObject().tp_str = &Dtool_Str_" << ClassName << ";\n"; - - } else if (has_local_repr) { - out << " // __str__ Repr Proxy\n"; - out << " Dtool_" << ClassName << ".As_PyTypeObject().tp_str = &Dtool_Repr_" << ClassName << ";\n"; - } - - if (obj->_properties.size() > 0) { - // GetSet descriptor slots. - out << " Dtool_" << ClassName << ".As_PyTypeObject().tp_getset = Dtool_Properties_" << ClassName << ";\n"; - } - int num_nested = obj->_itype.number_of_nested_types(); + int num_dict_items = 1; + + // Go through once to estimate the number of elements the dict will hold. for (int ni = 0; ni < num_nested; ni++) { TypeIndex nested_index = obj->_itype.get_nested_type(ni); - Object * nested_obj = _objects[nested_index]; + if (_objects.count(nested_index) == 0) { + continue; + } + Object *nested_obj = _objects[nested_index]; + assert(nested_obj != (Object *)NULL); + + if (nested_obj->_itype.is_class() || nested_obj->_itype.is_struct()) { + num_dict_items += 2; + + } else if (nested_obj->_itype.is_typedef()) { + ++num_dict_items; + + } else if (nested_obj->_itype.is_enum()) { + CPPEnumType *enum_type = nested_obj->_itype._cpptype->as_enum_type(); + num_dict_items += 2 * enum_type->_elements.size(); + } + } + + // Build type dictionary. The size is just an estimation. + if (num_dict_items > 5) { + out << " PyObject *dict = _PyDict_NewPresized(" << num_dict_items << ");\n"; + } else { + out << " PyObject *dict = PyDict_New();\n"; + } + out << " Dtool_" << ClassName << ".As_PyTypeObject().tp_dict = dict;\n"; + out << " PyDict_SetItemString(dict, \"DtoolClassDict\", dict);\n"; + + // Now go through the nested types again to actually add the dict items. + for (int ni = 0; ni < num_nested; ni++) { + TypeIndex nested_index = obj->_itype.get_nested_type(ni); + if (_objects.count(nested_index) == 0) { + // Illegal type. + continue; + } + + Object *nested_obj = _objects[nested_index]; + assert(nested_obj != (Object *)NULL); + if (nested_obj->_itype.is_class() || nested_obj->_itype.is_struct()) { std::string ClassName1 = make_safe_name(nested_obj->_itype.get_scoped_name()); std::string ClassName2 = make_safe_name(nested_obj->_itype.get_name()); out << " // Nested Object " << ClassName1 << ";\n"; - out << " Dtool_" << ClassName1 << "._Dtool_ClassInit(NULL);\n"; + out << " Dtool_PyModuleClassInit_" << ClassName1 << "(NULL);\n"; string name1 = classNameFromCppName(ClassName2, false); string name2 = classNameFromCppName(ClassName2, true); - out << " PyDict_SetItemString(Dtool_" << ClassName << ".As_PyTypeObject().tp_dict, \"" << name1 << "\", (PyObject *)&Dtool_" << ClassName1 << ".As_PyTypeObject());\n"; + out << " PyDict_SetItemString(dict, \"" << name1 << "\", (PyObject *)&Dtool_" << ClassName1 << ".As_PyTypeObject());\n"; if (name1 != name2) { - out << " PyDict_SetItemString(Dtool_" << ClassName << ".As_PyTypeObject().tp_dict, \"" << name2 << "\", (PyObject *)&Dtool_" << ClassName1 << ".As_PyTypeObject());\n"; + out << " PyDict_SetItemString(dict, \"" << name2 << "\", (PyObject *)&Dtool_" << ClassName1 << ".As_PyTypeObject());\n"; } - } else { - if (nested_obj->_itype.is_enum()) { - out << " // Enum " << nested_obj->_itype.get_scoped_name() << ";\n"; - int enum_count = nested_obj->_itype.number_of_enum_values(); - for (int xx = 0; xx < enum_count; xx++) { - string name1 = classNameFromCppName(nested_obj->_itype.get_enum_value_name(xx), false); - string name2; - if (nested_obj->_itype.has_true_name()) { - name2 = classNameFromCppName(nested_obj->_itype.get_enum_value_name(xx), true); - } else { - // Don't generate the alternative syntax for anonymous enums, since we added support - // for those after we started deprecating the alternative syntax. - name2 = name1; - } - int enum_value = nested_obj->_itype.get_enum_value(xx); - out << "#if PY_MAJOR_VERSION >= 3\n"; - out << " PyDict_SetItemString(Dtool_" << ClassName << ".As_PyTypeObject().tp_dict, \"" << name1 << "\", PyLong_FromLong(" << enum_value << "));\n"; - if (name1 != name2) { - out << " PyDict_SetItemString(Dtool_" << ClassName << ".As_PyTypeObject().tp_dict, \"" << name2 << "\", PyLong_FromLong(" << enum_value << "));\n"; - } - out << "#else\n"; - out << " PyDict_SetItemString(Dtool_" << ClassName << ".As_PyTypeObject().tp_dict, \"" << name1 << "\", PyInt_FromLong(" << enum_value << "));\n"; - if (name1 != name2) { - out << " PyDict_SetItemString(Dtool_" << ClassName << ".As_PyTypeObject().tp_dict, \"" << name2 << "\", PyInt_FromLong(" << enum_value << "));\n"; - } - out << "#endif\n"; + + } else if (nested_obj->_itype.is_typedef()) { + // Unwrap typedefs. + TypeIndex wrapped = nested_obj->_itype._wrapped_type; + while (interrogate_type_is_typedef(wrapped)) { + wrapped = interrogate_type_wrapped_type(wrapped); + } + + // Er, we can only export typedefs to structs. + if (!interrogate_type_is_struct(wrapped)) { + continue; + } + + string ClassName1 = make_safe_name(interrogate_type_scoped_name(wrapped)); + string ClassName2 = make_safe_name(interrogate_type_name(wrapped)); + + string name1 = classNameFromCppName(ClassName2, false); + out << " PyDict_SetItemString(dict, \"" << name1 << "\", (PyObject *)&Dtool_" << ClassName1 << ".As_PyTypeObject());\n"; + // No need to support mangled names for nested typedefs; we only added support recently. + + } else if (nested_obj->_itype.is_enum()) { + out << " // Enum " << nested_obj->_itype.get_scoped_name() << ";\n"; + CPPEnumType *enum_type = nested_obj->_itype._cpptype->as_enum_type(); + CPPEnumType::Elements::const_iterator ei; + for (ei = enum_type->_elements.begin(); ei != enum_type->_elements.end(); ++ei) { + string name1 = classNameFromCppName((*ei)->get_simple_name(), false); + string name2; + if (nested_obj->_itype.has_true_name()) { + name2 = classNameFromCppName((*ei)->get_simple_name(), true); + } else { + // Don't generate the alternative syntax for anonymous enums, since we added support + // for those after we started deprecating the alternative syntax. + name2 = name1; + } + string enum_value = obj->_itype.get_scoped_name() + "::" + (*ei)->get_simple_name(); + out << " PyDict_SetItemString(dict, \"" << name1 << "\", PyLongOrInt_FromLong(" << enum_value << "));\n"; + if (name1 != name2) { + out << " PyDict_SetItemString(dict, \"" << name2 << "\", PyLongOrInt_FromLong(" << enum_value << "));\n"; } } } } out << " if (PyType_Ready(&Dtool_" << ClassName << ".As_PyTypeObject()) < 0) {\n"; - out << " PyErr_SetString(PyExc_TypeError, \"PyType_Ready(" << ClassName << ")\");\n"; - out << " printf(\"Error in PyType_Ready(" << ClassName << ")\");\n"; + out << " Dtool_Raise_TypeError(\"PyType_Ready(" << ClassName << ")\");\n"; out << " return;\n"; out << " }\n"; @@ -2321,23 +2974,16 @@ write_module_class(ostream &out, Object *obj) { out << " }\n"; - out << " if (module != NULL) {\n"; - out << " Py_INCREF(&Dtool_" << ClassName << ".As_PyTypeObject());\n"; - out << " PyModule_AddObject(module, \"" << export_class_name << "\", (PyObject *)&Dtool_" << ClassName << ".As_PyTypeObject());\n"; - if (export_class_name != export_class_name2) { - out << " PyModule_AddObject(module, \"" << export_class_name2 << "\", (PyObject *)&Dtool_" << ClassName << ".As_PyTypeObject());\n"; - } - // Also write out the explicit alternate names. - int num_alt_names = obj->_itype.get_num_alt_names(); - for (int i = 0; i < num_alt_names; ++i) { - string alt_name = make_safe_name(obj->_itype.get_alt_name(i)); - if (export_class_name != alt_name) { - out << " PyModule_AddObject(module, \"" << alt_name << "\", (PyObject *)&Dtool_" << ClassName << ".As_PyTypeObject());\n"; - } - } + //int num_alt_names = obj->_itype.get_num_alt_names(); + //for (int i = 0; i < num_alt_names; ++i) { + // string alt_name = make_safe_name(obj->_itype.get_alt_name(i)); + // if (export_class_name != alt_name) { + // out << " PyModule_AddObject(module, \"" << alt_name << "\", (PyObject *)&Dtool_" << ClassName << ".As_PyTypeObject());\n"; + // } + //} - out << " }\n"; + //out << " }\n"; out << "}\n\n"; } @@ -2354,6 +3000,27 @@ synthesize_this_parameter() { return true; } +//////////////////////////////////////////////////////////////////// +// Function: InterfaceMakerPythonNative::separate_overloading +// Access: Public, Virtual +// Description: This method should be overridden and redefined to +// return true for interfaces that require overloaded +// instances of a function to be defined as separate +// functions (each with its own hashed name), or false +// for interfaces that can support overloading natively, +// and thus only require one wrapper function per each +// overloaded input function. +//////////////////////////////////////////////////////////////////// +bool InterfaceMakerPythonNative:: +separate_overloading() { + // We used to return true here. Nowadays, some of the default + // arguments are handled in the PyArg_ParseTuple code, and some + // are still being considered as separate overloads (this depends + // on a bunch of factors, see collapse_default_remaps). + // This is all handled elsewhere. + return false; +} + //////////////////////////////////////////////////////////////////// // Function: InterfaceMakerPythonNative::get_wrapper_prefix // Access: Protected, Virtual @@ -2420,136 +3087,213 @@ write_prototype_for_name(ostream &out, InterfaceMaker::Function *func, const std } //////////////////////////////////////////////////////////////////// -// Function: InterfaceMakerPythonNative::write_function_for +// Function: InterfaceMakerPythonNative::write_function_for_top // Access: Private // Description: Writes the definition for a function that will call // the indicated C++ function or method. //////////////////////////////////////////////////////////////////// void InterfaceMakerPythonNative:: write_function_for_top(ostream &out, InterfaceMaker::Object *obj, InterfaceMaker::Function *func) { - std::string fname; + + // First check if this function has non-slotted and legal remaps, + // ie. if we should even write it. + bool has_remaps = false; + + Function::Remaps::const_iterator ri; + for (ri = func->_remaps.begin(); ri != func->_remaps.end(); ++ri) { + FunctionRemap *remap = (*ri); + if (!is_remap_legal(remap)) { + continue; + } + + SlottedFunctionDef slotted_def; + if (!get_slotted_function_def(obj, func, remap, slotted_def)) { + // It has a non-slotted remap, so we should write it. + has_remaps = true; + break; + } + } + + if (!has_remaps) { + // Nope. + return; + } + + // This is a bit of a hack, as these methods should probably be + // going through the slotted function system. But it's kind of + // pointless to write these out, and a waste of space. + string fname = func->_ifunc.get_name(); + if (fname == "operator <" || + fname == "operator <=" || + fname == "operator ==" || + fname == "operator !=" || + fname == "operator >" || + fname == "operator >=") { + return; + } if (func->_ifunc.is_unary_op()) { assert(func->_args_type == AT_no_args); } - fname = "static PyObject *" + func->_name + "(PyObject *"; + string prototype = "static PyObject *" + func->_name + "(PyObject *"; // This will be NULL for static funcs, so prevent code from using it. if (func->_has_this) { - fname += "self"; + prototype += "self"; } switch (func->_args_type) { case AT_keyword_args: - fname += ", PyObject *args, PyObject *kwds"; + prototype += ", PyObject *args, PyObject *kwds"; break; case AT_varargs: - fname += ", PyObject *args"; + prototype += ", PyObject *args"; break; case AT_single_arg: - fname += ", PyObject *arg"; + prototype += ", PyObject *arg"; break; default: break; } - fname += ")"; + prototype += ")"; - bool coercion_attempted = false; - write_function_for_name(out, obj, func, fname, true, coercion_attempted, func->_args_type, false, true); + string expected_params; + write_function_for_name(out, obj, func->_remaps, prototype, expected_params, true, func->_args_type, RF_pyobject | RF_err_null); + + // Now synthesize a variable for the docstring. + ostringstream comment; + if (!expected_params.empty()) { + comment << "C++ Interface:\n" + << expected_params; + } + + if (func->_ifunc._comment.size() > 2) { + if (!expected_params.empty()) { + comment << "\n"; + } + comment << func->_ifunc._comment; + } + + out << "#ifndef NDEBUG\n"; + out << "static const char *" << func->_name << "_comment =\n"; + output_quoted(out, 2, comment.str()); + out << ";\n"; + out << "#else\n"; + out << "static const char *" << func->_name << "_comment = NULL;\n"; + out << "#endif\n\n"; } //////////////////////////////////////////////////////////////////// -/// Function : write_function_for_name -// -// Wrap a complete name override function for Py..... +// Function: InterfaceMakerPythonNative::write_function_for_name +// Access: Private +// Description: Writes the definition for a function that will call +// the indicated C++ function or method. //////////////////////////////////////////////////////////////////// void InterfaceMakerPythonNative:: -write_function_for_name(ostream &out1, InterfaceMaker::Object *obj, InterfaceMaker::Function *func, - const std::string &function_name, - bool coercion_allowed, bool &coercion_attempted, - ArgsType args_type, bool return_int, bool write_comment) { - ostringstream out; - - std::map > MapSets; +write_function_for_name(ostream &out, Object *obj, + const Function::Remaps &remaps, + const string &function_name, + string &expected_params, + bool coercion_allowed, + ArgsType args_type, int return_flags) { + std::map > map_sets; std::map >::iterator mii; std::set::iterator sii; + bool has_this = false; Function::Remaps::const_iterator ri; - out1 << "/******************************************************************\n" << " * Python type method wrapper for\n"; - for (ri = func->_remaps.begin(); ri != func->_remaps.end(); ++ri) { - FunctionRemap *remap = (*ri); + FunctionRemap *remap = NULL; + int max_required_args = 0; + bool all_nonconst = true; + + out << "/******************************************************************\n" << " * Python type method wrapper for\n"; + for (ri = remaps.begin(); ri != remaps.end(); ++ri) { + remap = (*ri); if (is_remap_legal(remap)) { - int parameter_size = remap->_parameters.size(); - if (remap->_has_this && remap->_type != FunctionRemap::T_constructor) { - parameter_size --; + int max_num_args = remap->_parameters.size(); + if (remap->_has_this) { + has_this = true; + + if (remap->_type != FunctionRemap::T_constructor) { + max_num_args--; + } } - MapSets[parameter_size].insert(remap); - out1 << " * "; - remap->write_orig_prototype(out1, 0); - out1 << "\n"; + if (!remap->_has_this || remap->_const_method) { + all_nonconst = false; + } + + int min_num_args = 0; + FunctionRemap::Parameters::const_iterator pi; + pi = remap->_parameters.begin(); + if (remap->_has_this && pi != remap->_parameters.end()) { + ++pi; + } + for (; pi != remap->_parameters.end(); ++pi) { + ParameterRemap *param = (*pi)._remap; + if (param->get_default_value() != (CPPExpression *)NULL) { + // We've reached the first parameter that takes a default value. + break; + } else { + ++min_num_args; + } + } + + max_required_args = max(max_num_args, max_required_args); + + for (int i = min_num_args; i <= max_num_args; ++i) { + map_sets[i].insert(remap); + } + out << " * "; + remap->write_orig_prototype(out, 0, false, (max_num_args - min_num_args)); + out << "\n"; } else { - out1 << " * Rejected Remap ["; - remap->write_orig_prototype(out1, 0); - out1 << "]\n"; + out << " * Rejected Remap ["; + remap->write_orig_prototype(out, 0); + out << "]\n"; } } - out1 << " *******************************************************************/\n"; + out << " *******************************************************************/\n"; out << function_name << " {\n"; - if (func->_has_this) { - // Extract pointer from 'self' parameter. + if (has_this) { std::string ClassName = make_safe_name(obj->_itype.get_scoped_name()); std::string cClassName = obj->_itype.get_true_name(); + //string class_name = remap->_cpptype->get_simple_name(); - SlottedFunctionDef def; - get_slotted_function_def(obj, func, def); - + // Extract pointer from 'self' parameter. out << " " << cClassName << " *local_this = NULL;\n"; - out << " DTOOL_Call_ExtractThisPointerForType(self, &Dtool_" << ClassName << ", (void **)&local_this);\n"; - out << " if (local_this == NULL) {\n"; - if (def._wrapper_type == WT_numeric_operator || def._wrapper_type == WT_ternary_operator) { - // WT_numeric_operator means we must return NotImplemented, instead - // of raising an exception, if the this pointer doesn't - // match. This is for things like __sub__, which Python - // likes to call on the wrong-type objects. - out << " Py_INCREF(Py_NotImplemented);\n"; - out << " return Py_NotImplemented;\n"; + if (all_nonconst) { + // All remaps are non-const. Also check that this object isn't const. + out << " if (!Dtool_Call_ExtractThisPointer_NonConst(self, Dtool_" << ClassName << ", " + << "(void **)&local_this, \"" << classNameFromCppName(cClassName, false) + << "." << methodNameFromCppName(remap, cClassName, false) << "\")) {\n"; } else { - // Other functions should raise an exception if the this - // pointer isn't set or is the wrong type. - out << " PyErr_SetString(PyExc_AttributeError, \"C++ object is not yet constructed, or already destructed.\");\n"; - if (return_int) { - out << " return -1;\n"; - } else { - out << " return NULL;\n"; - } + out << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"; } + + error_return(out, 4, return_flags); out << " }\n"; } - bool is_inplace = isInplaceFunction(func); - - if (MapSets.empty()) { + if (map_sets.empty()) { + error_return(out, 2, return_flags); + out << "}\n\n"; return; } - std::string FunctionComment = func->_ifunc._comment; - std::string FunctionComment1; - if (FunctionComment.size() > 2) { - FunctionComment += "\n"; + if (args_type == AT_keyword_args || args_type == AT_varargs) { + max_required_args = collapse_default_remaps(map_sets, max_required_args); } - if (MapSets.size() > 1) { - string expected_params; - + if (map_sets.size() > 1) { switch (args_type) { case AT_keyword_args: indent(out, 2) << "int parameter_count = PyTuple_Size(args);\n"; @@ -2572,75 +3316,90 @@ write_function_for_name(ostream &out1, InterfaceMaker::Object *obj, InterfaceMak break; } + // Keep track of how many args this function actually takes for + // the error message. We add one to the parameter count for "self", + // following the Python convention. + int add_self = has_this ? 1 : 0; + set num_args; + indent(out, 2) << "switch (parameter_count) {\n"; - for (mii = MapSets.begin(); mii != MapSets.end(); mii ++) { - indent(out, 2) << "case " << mii->first << ": {\n"; + for (mii = map_sets.begin(); mii != map_sets.end(); ++mii) { + int max_args = mii->first; + int min_args = min(max_required_args, max_args); - write_function_forset(out, obj, func, mii->second, expected_params, 4, is_inplace, - coercion_allowed, coercion_attempted, args_type, return_int); + for (int i = min_args; i <= max_args; ++i) { + indent(out, 2) << "case " << i << ":\n"; + num_args.insert(i + add_self); + } + indent(out, 4) << "{\n"; + num_args.insert(max_args + add_self); - indent(out, 4) << "break;\n"; - indent(out, 2) << "}\n"; - } + if (min_args == 1 && max_args == 1 && args_type == AT_varargs) { + // Might as well, since we already checked the number of args. + indent(out, 6) << " PyObject *arg = PyTuple_GET_ITEM(args, 0);\n"; - indent(out, 2) << "default:\n"; - indent(out, 4) - << "PyErr_Format(PyExc_TypeError, \"" - << methodNameFromCppName(func, "", false) - << "() takes "; - - // We add one to the parameter count for "self", following the - // Python convention. - int add_self = func->_has_this ? 1 : 0; - size_t mic; - for (mic = 0, mii = MapSets.begin(); - mii != MapSets.end(); - ++mii, ++mic) { - if (mic == MapSets.size() - 1) { - if (mic == 1) { - out << " or "; - } else { - out << ", or "; - } - } else if (mic != 0) { - out << ", "; + write_function_forset(out, mii->second, min_args, max_args, expected_params, 6, + coercion_allowed, true, AT_single_arg, return_flags, true, !all_nonconst); + } else { + write_function_forset(out, mii->second, min_args, max_args, expected_params, 6, + coercion_allowed, true, args_type, return_flags, true, !all_nonconst); } - out << mii->first + add_self; + indent(out, 4) << "}\n"; + indent(out, 4) << "break;\n"; } - out << " arguments (%d given)\", parameter_count + " << add_self << ");\n"; + // In NDEBUG case, fall through to the error at end of function. + out << "#ifndef NDEBUG\n"; - if (return_int) { - indent(out, 4) << "return -1;\n"; - } else { - indent(out, 4) << "return (PyObject *) NULL;\n"; + indent(out, 2) << "default:\n"; + + // Format an error saying how many arguments we actually take. So much + // logic for such a silly matter. Sheesh. + ostringstream msg; + msg << methodNameFromCppName(remap, "", false) << "() takes "; + + set::iterator si = num_args.begin(); + msg << *si; + if (num_args.size() == 2) { + msg << " or " << *(++si); + } else if (num_args.size() > 2) { + ++si; + while (si != num_args.end()) { + int num = *si; + if ((++si) == num_args.end()) { + msg << " or " << num; + } else { + msg << ", " << num; + } + } + } + msg << " arguments (%d given)"; + + string count_var = "parameter_count"; + if (add_self) { + count_var += " + 1"; } + error_raise_return(out, 4, return_flags, "TypeError", + msg.str(), count_var); + out << "#endif\n"; indent(out, 2) << "}\n"; - out << " if (!PyErr_Occurred()) { // Let error pass on\n"; - out << " PyErr_SetString(PyExc_TypeError,\n"; - out << " \"Arguments must match one of:\\n\"\n"; + out << " if (!_PyErr_OCCURRED()) {\n" + << " "; + if ((return_flags & ~RF_pyobject) == RF_err_null) { + out << "return "; + } + out << "Dtool_Raise_BadArgumentsError(\n"; output_quoted(out, 6, expected_params); - out << ");\n"; - out << " }\n"; + out << ");\n" + << " }\n"; - if (return_int) { - indent(out, 2) << "return -1;\n"; - } else { - indent(out, 2) << "return (PyObject *) NULL;\n"; - } - - if (!expected_params.empty() && FunctionComment1.empty()) { - FunctionComment1 += "C++ Interface:\n"; - } - - FunctionComment1 += expected_params; + error_return(out, 2, return_flags); } else { - string expected_params = ""; - mii = MapSets.begin(); + mii = map_sets.begin(); // If no parameters are accepted, we do need to check that the argument // count is indeed 0, since we won't check that in write_function_instance. @@ -2658,72 +3417,494 @@ write_function_for_name(ostream &out1, InterfaceMaker::Object *obj, InterfaceMak out << " const int parameter_count = PyTuple_GET_SIZE(args);\n"; break; case AT_single_arg: - default: // Shouldn't happen, but let's handle this case nonetheless. out << " {\n"; out << " const int parameter_count = 1;\n"; break; + case AT_no_args: + break; + case AT_unknown: + break; } - out << " PyErr_Format(PyExc_TypeError,\n" - << " \"" << methodNameFromCppName(func, "", false) - << "() takes no arguments (%d given)\",\n" - << " parameter_count);\n"; + out << "#ifdef NDEBUG\n"; + error_raise_return(out, 4, return_flags, "TypeError", "function takes no arguments"); + out << "#else\n"; + error_raise_return(out, 4, return_flags, "TypeError", + methodNameFromCppName(remap, "", false) + "() takes no arguments (%d given)", + "parameter_count"); + out << "#endif\n"; + out << " }\n"; - if (return_int) { - out << " return -1;\n"; - } else { - out << " return (PyObject *) NULL;\n"; - } + } else if (args_type == AT_keyword_args && max_required_args == 1 && mii->first == 1) { + // Check this to be sure, as we handle the case of only 1 keyword arg + // in write_function_forset (not using ParseTupleAndKeywords). + out << " int parameter_count = PyTuple_Size(args);\n" + " if (kwds != NULL) {\n" + " parameter_count += PyDict_Size(kwds);\n" + " }\n" + " if (parameter_count != 1) {\n" + "#ifdef NDEBUG\n"; + error_raise_return(out, 4, return_flags, "TypeError", + "function takes exactly 1 argument"); + out << "#else\n"; + error_raise_return(out, 4, return_flags, "TypeError", + methodNameFromCppName(remap, "", false) + "() takes exactly 1 argument (%d given)", + "parameter_count"); + out << "#endif\n"; out << " }\n"; } - write_function_forset(out, obj, func, mii->second, expected_params, 2, is_inplace, - coercion_allowed, coercion_attempted, args_type, return_int); + int min_args = min(max_required_args, mii->first); + write_function_forset(out, mii->second, min_args, mii->first, expected_params, 2, + coercion_allowed, true, args_type, return_flags, true, !all_nonconst); - out << " if (!PyErr_Occurred()) {\n"; - out << " PyErr_SetString(PyExc_TypeError,\n"; - out << " \"Arguments must match:\\n\"\n"; - output_quoted(out, 6, expected_params); - out << ");\n"; - out << " }\n"; + // This block is often unreachable for many functions... maybe we can + // figure out a way in the future to better determine when it will be + // and won't be necessary to write this out. + if (args_type != AT_no_args) { + out << " if (!_PyErr_OCCURRED()) {\n" + << " "; + if ((return_flags & ~RF_pyobject) == RF_err_null) { + out << "return "; + } + out << "Dtool_Raise_BadArgumentsError(\n"; + output_quoted(out, 6, expected_params); + out << ");\n" + << " }\n"; - if (return_int) { - indent(out, 2) << "return -1;\n"; - } else { - indent(out, 2) << "return (PyObject *) NULL;\n"; + error_return(out, 2, return_flags); } - - if (!expected_params.empty() && FunctionComment1.empty()) { - FunctionComment1 += "C++ Interface:\n"; - } - - FunctionComment1 += expected_params; } out << "}\n\n"; +} - if (!FunctionComment1.empty()) { - FunctionComment = FunctionComment1 + "\n" + FunctionComment; +//////////////////////////////////////////////////////////////////// +// Function: InterfaceMakerPythonNative::write_coerce_constructor +// Access: Private +// Description: Writes the definition for a coerce constructor: a +// special constructor that is called to implicitly +// cast a tuple or other type to a desired type. This +// is done by calling the appropriate constructor or +// static make() function. Constructors marked with +// the "explicit" keyword aren't considered, just like +// in C++. +// +// There are usually two coerce constructors: one for +// const pointers, one for non-const pointers. This +// is due to the possibility that a static make() +// function may return a const pointer. +// +// There are two variants of this: if the class in +// question is a ReferenceCount, the coerce constructor +// takes a reference to a PointerTo or ConstPointerTo +// to store the converted pointer in. Otherwise, it +// is a regular pointer, and an additional boolean +// indicates whether the caller is supposed to call +// "delete" on the coerced pointer or not. +// +// In all cases, the coerce constructor returns a bool +// indicating whether the conversion was possible. +// It does not raise exceptions when none of the +// constructors matched, but just returns false. +//////////////////////////////////////////////////////////////////// +void InterfaceMakerPythonNative:: +write_coerce_constructor(ostream &out, Object *obj, bool is_const) { + std::map > map_sets; + std::map >::iterator mii; + std::set::iterator sii; + + int max_required_args = 0; + + Functions::iterator fi; + Function::Remaps::const_iterator ri; + + // Go through the methods and find appropriate static make() functions. + for (fi = obj->_methods.begin(); fi != obj->_methods.end(); ++fi) { + Function *func = (*fi); + for (ri = func->_remaps.begin(); ri != func->_remaps.end(); ++ri) { + FunctionRemap *remap = (*ri); + if (is_remap_legal(remap) && remap->_flags & FunctionRemap::F_coerce_constructor) { + nassertd(!remap->_has_this) continue; + + // It's a static make() function. + CPPType *return_type = remap->_return_type->get_new_type(); + + if (!is_const && TypeManager::is_const_pointer_or_ref(return_type)) { + // If we're making the non-const coerce constructor, reject + // this remap if it returns a const pointer. + continue; + } + + int max_num_args = remap->_parameters.size(); + int min_num_args = 0; + FunctionRemap::Parameters::const_iterator pi; + for (pi = remap->_parameters.begin(); pi != remap->_parameters.end(); ++pi) { + ParameterRemap *param = (*pi)._remap; + if (param->get_default_value() != (CPPExpression *)NULL) { + // We've reached the first parameter that takes a default value. + break; + } else { + ++min_num_args; + } + } + + // Coerce constructor should take at least one argument. + nassertd(max_num_args > 0) continue; + min_num_args = max(min_num_args, 1); + + max_required_args = max(max_num_args, max_required_args); + + for (int i = min_num_args; i <= max_num_args; ++i) { + map_sets[i].insert(remap); + } + + int parameter_size = remap->_parameters.size(); + map_sets[parameter_size].insert(remap); + } + } } - if (write_comment) { - // Write out the function doc string. We only do this if it is - // not a constructor, since we don't have a place to put the - // constructor doc string. - out << "#ifndef NDEBUG\n"; - out << "static const char *" << func->_name << "_comment =\n"; - output_quoted(out, 2, FunctionComment); - out << ";\n"; - out << "#else\n"; - out << "static const char *" << func->_name << "_comment = NULL;\n"; - out << "#endif\n"; + // Now go through the constructors that are suitable for coercion. + // This excludes copy constructors and ones marked "explicit". + for (fi = obj->_constructors.begin(); fi != obj->_constructors.end(); ++fi) { + Function *func = (*fi); + for (ri = func->_remaps.begin(); ri != func->_remaps.end(); ++ri) { + FunctionRemap *remap = (*ri); + if (is_remap_legal(remap) && remap->_flags & FunctionRemap::F_coerce_constructor) { + nassertd(!remap->_has_this) continue; + + int max_num_args = remap->_parameters.size(); + int min_num_args = 0; + FunctionRemap::Parameters::const_iterator pi; + for (pi = remap->_parameters.begin(); pi != remap->_parameters.end(); ++pi) { + ParameterRemap *param = (*pi)._remap; + if (param->get_default_value() != (CPPExpression *)NULL) { + // We've reached the first parameter that takes a default value. + break; + } else { + ++min_num_args; + } + } + + // Coerce constructor should take at least one argument. + nassertd(max_num_args > 0) continue; + min_num_args = max(min_num_args, 1); + + max_required_args = max(max_num_args, max_required_args); + + for (int i = min_num_args; i <= max_num_args; ++i) { + map_sets[i].insert(remap); + } + + int parameter_size = remap->_parameters.size(); + map_sets[parameter_size].insert(remap); + } + } } - out << "\n"; + std::string ClassName = make_safe_name(obj->_itype.get_scoped_name()); + std::string cClassName = obj->_itype.get_true_name(); + if (TypeManager::is_reference_count(obj->_itype._cpptype)) { + // The coercion works slightly different for reference counted types, since + // we can handle those a bit more nicely by taking advantage of the refcount + // instead of having to use a boolean to indicate that it should be managed. + if (is_const) { + out << "bool Dtool_Coerce_" << ClassName << "(PyObject *args, CPT(" << cClassName << ") &coerced) {\n"; + } else { + out << "bool Dtool_Coerce_" << ClassName << "(PyObject *args, PT(" << cClassName << ") &coerced) {\n"; + } - out1 << out.str(); + // Note: this relies on the PT() being initialized to NULL. This is currently + // the case in all invocations, but this may not be true in the future. + out << " DTOOL_Call_ExtractThisPointerForType(args, &Dtool_" << ClassName << ", (void**)&coerced.cheat());\n"; + out << " if (coerced != NULL) {\n"; + out << " // The argument is already of matching type, no need to coerce.\n"; + if (!is_const) { + out << " if (!((Dtool_PyInstDef *)args)->_is_const) {\n"; + out << " // A non-const instance is required, which this is.\n"; + out << " coerced->ref();\n"; + out << " return true;\n"; + out << " }\n"; + } else { + out << " coerced->ref();\n"; + out << " return true;\n"; + } + } else { + if (is_const) { + out << "bool Dtool_Coerce_" << ClassName << "(PyObject *args, " << cClassName << " const *&coerced, bool &manage) {\n"; + } else { + out << "bool Dtool_Coerce_" << ClassName << "(PyObject *args, " << cClassName << " *&coerced, bool &manage) {\n"; + } + + out << " DTOOL_Call_ExtractThisPointerForType(args, &Dtool_" << ClassName << ", (void**)&coerced);\n"; + out << " if (coerced != NULL) {\n"; + if (!is_const) { + out << " if (!((Dtool_PyInstDef *)args)->_is_const) {\n"; + out << " // A non-const instance is required, which this is.\n"; + out << " return true;\n"; + out << " }\n"; + } else { + out << " return true;\n"; + } + } + + out << " }\n\n"; + + if (map_sets.empty()) { + error_return(out, 2, RF_coerced | RF_err_false); + out << "}\n\n"; + return; + } + + // Coercion constructors are special cases in that they can take either + // a single value or a tuple. (They never, however, take a tuple + // containing a single value.) + string expected_params; + mii = map_sets.find(1); + if (mii != map_sets.end()) { + out << " if (!PyTuple_Check(args)) {\n"; + out << " PyObject *arg = args;\n"; + + write_function_forset(out, mii->second, mii->first, mii->first, expected_params, 4, false, false, + AT_single_arg, RF_coerced | RF_err_false, true, false); + + if (map_sets.size() == 1) { + out << " }\n"; + //out << " PyErr_Clear();\n"; + error_return(out, 2, RF_coerced | RF_err_false); + out << "}\n\n"; + return; + } + + // We take this one out of the map sets. There's not much value in + // coercing tuples containing just one value. + map_sets.erase(mii); + + out << " } else {\n"; + } else { + out << " if (PyTuple_Check(args)) {\n"; + } + + max_required_args = collapse_default_remaps(map_sets, max_required_args); + + if (map_sets.size() > 1) { + indent(out, 4) << "switch (PyTuple_GET_SIZE(args)) {\n"; + + for (mii = map_sets.begin(); mii != map_sets.end(); ++mii) { + int max_args = mii->first; + int min_args = min(max_required_args, max_args); + + // This is not called for tuples containing just one value or no + // values at all, so we should never have to consider that case. + if (min_args < 2) { + min_args = 2; + } + nassertd(max_args >= min_args) continue; + + for (int i = min_args; i < max_args; ++i) { + if (i != 1) { + indent(out, 6) << "case " << i << ":\n"; + } + } + indent(out, 6) << "case " << max_args << ": {\n"; + + write_function_forset(out, mii->second, min_args, max_args, expected_params, 8, false, false, + AT_varargs, RF_coerced | RF_err_false, true, false); + + indent(out, 8) << "break;\n"; + indent(out, 6) << "}\n"; + } + indent(out, 4) << "}\n"; + + } else { + mii = map_sets.begin(); + + int max_args = mii->first; + int min_args = min(max_required_args, max_args); + + // This is not called for tuples containing just one value or no + // values at all, so we should never have to consider that case. + if (min_args < 2) { + min_args = 2; + } + nassertv(max_args >= min_args); + + if (min_args == max_args) { + indent(out, 4) << "if (PyTuple_GET_SIZE(args) == " << mii->first << ") {\n"; + } else { + indent(out, 4) << "Py_ssize_t size = PyTuple_GET_SIZE(args);\n"; + // Not sure if this check really does any good. I guess it's a + // useful early-fail test. + indent(out, 4) << "if (size >= " << min_args << " && size <= " << max_args << ") {\n"; + } + + write_function_forset(out, mii->second, min_args, max_args, expected_params, 6, false, false, + AT_varargs, RF_coerced | RF_err_false, true, false); + indent(out, 4) << "}\n"; + } + + out << " }\n\n"; + //out << " PyErr_Clear();\n"; + error_return(out, 2, RF_coerced | RF_err_false); + out << "}\n\n"; +} + +//////////////////////////////////////////////////////////////////// +// Function: InterfaceMakerPythonNative::collapse_default_remaps +// Access: Private +// Description: Special case optimization: if the last map is a subset +// of the map before it, and the last parameter is only a +// simple parameter type (that we have special default +// argument handling for), we can merge the cases. +// When this happens, we can make use of a special +// feature of PyArg_ParseTuple for handling of these +// last few default arguments. This doesn't work well +// for all types of default expressions, though, hence the +// need for this elaborate checking mechanism down here, +// which goes in parallel with the actual optional arg +// handling logic in write_function_instance. +// +// This isn't just to help reduce the amount of generated +// code; it also enables arbitrary selection of keyword +// arguments for many functions, ie. for this function: +// +// int func(int a=0, int b=0, bool c=false, string d=""); +// +// Thanks to this mechanism, we can call it like so: +// +// func(c=True, d=".") +// +// The return value is the minimum of the number +// of maximum arguments. +// +// Sorry, let me try that again: it returns the +// largest number of arguments for which the overloads +// will be separated out rather than handled via the +// special default handling mechanism. Or something. +// +// Please don't hate me. +///////////////////////////////////////////////////////////////// +int InterfaceMakerPythonNative:: +collapse_default_remaps(std::map > &map_sets, + int max_required_args) { + if (map_sets.size() < 1) { + return max_required_args; + } + + std::map >::reverse_iterator rmi, rmi_next; + rmi = map_sets.rbegin(); + rmi_next = rmi; + for (++rmi_next; rmi_next != map_sets.rend();) { + if (std::includes(rmi_next->second.begin(), rmi_next->second.end(), + rmi->second.begin(), rmi->second.end())) { + + // Check if the nth argument is something we can easily create a default for. + std::set::iterator sii; + for (sii = rmi->second.begin(); sii != rmi->second.end(); ++sii) { + FunctionRemap *remap = (*sii); + int pn = rmi->first - 1; + if (remap->_has_this && remap->_type != FunctionRemap::T_constructor) { + ++pn; + } + nassertd(pn < remap->_parameters.size()) goto abort_iteration; + + ParameterRemap *param = remap->_parameters[pn]._remap; + CPPType *type = param->get_new_type(); + + if (param->new_type_is_atomic_string()) { + CPPType *orig_type = param->get_orig_type(); + if (TypeManager::is_char_pointer(orig_type)) { + } else if (TypeManager::is_wchar_pointer(orig_type)) { + goto abort_iteration; + } else if (TypeManager::is_wstring(orig_type)) { + goto abort_iteration; + } else if (TypeManager::is_const_ptr_to_basic_string_wchar(orig_type)) { + goto abort_iteration; + } else { + // Regular strings are OK if the default argument is a string literal + // or the default string constructor, since those are trivial to handle. + // This actually covers almost all of the cases of default string args. + CPPExpression::Type expr_type = param->get_default_value()->_type; + if (expr_type != CPPExpression::T_default_construct && + expr_type != CPPExpression::T_string) { + goto abort_iteration; + } + } + } else if (TypeManager::is_bool(type)) { + } else if (TypeManager::is_char(type)) { + } else if (TypeManager::is_wchar(type)) { + goto abort_iteration; + } else if (TypeManager::is_longlong(type)) { + } else if (TypeManager::is_integer(type)) { + } else if (TypeManager::is_double(type)) { + } else if (TypeManager::is_float(type)) { + } else if (TypeManager::is_const_char_pointer(type)) { + } else if (TypeManager::is_pointer_to_PyTypeObject(type)) { + } else if (TypeManager::is_pointer_to_PyStringObject(type)) { + } else if (TypeManager::is_pointer_to_PyUnicodeObject(type)) { + } else if (TypeManager::is_pointer_to_PyObject(type)) { + } else if (TypeManager::is_pointer_to_Py_buffer(type)) { + goto abort_iteration; + } else if (TypeManager::is_pointer_to_simple(type)) { + goto abort_iteration; + } else if (TypeManager::is_pointer(type)) { + // I'm allowing other pointer types, but only if the expression happens + // to evaluate to a numeric constant (which will likely only be NULL). + // There are too many issues to resolve right now with allowing more + // complex default expressions, including issues in the C++ parser + // (but the reader is welcome to give it a try!) + CPPExpression::Result res = param->get_default_value()->evaluate(); + if (res._type != CPPExpression::RT_integer && + res._type != CPPExpression::RT_pointer) { + goto abort_iteration; + } + } else { + goto abort_iteration; + } + } + + // rmi_next has a superset of the remaps in rmi, and we are going to + // erase rmi_next, so put all the remaps in rmi. + //rmi->second = rmi_next->second; + + max_required_args = rmi_next->first; + rmi = rmi_next; + ++rmi_next; + } else { + break; + } + } + +abort_iteration: + // Now erase the other remap sets. Reverse iterators are weird, we + // first need to get forward iterators and decrement them by one. + std::map >::iterator erase_begin, erase_end; + erase_begin = rmi.base(); + erase_end = map_sets.rbegin().base(); + --erase_begin; + --erase_end; + + if (erase_begin == erase_end) { + return max_required_args; + } + + // We're never erasing the map set with the highest number of args. + nassertr(erase_end != map_sets.end(), max_required_args); + + // We know erase_begin is a superset of erase_end, but we want all + // the remaps in erase_end (which we aren't erasing). + //if (rmi == map_sets.rbegin()) { + erase_end->second = erase_begin->second; + //} + + map_sets.erase(erase_begin, erase_end); + + assert(map_sets.size() >= 1); + + return max_required_args; } //////////////////////////////////////////////////////// @@ -2731,25 +3912,43 @@ write_function_for_name(ostream &out1, InterfaceMaker::Object *obj, InterfaceMak // // Support Function used to Sort the name based overrides.. For know must be complex to simple //////////////////////////////////////////////////////// -int GetParnetDepth(CPPType *type) { +int get_type_sort(CPPType *type) { int answer = 0; // printf(" %s\n",type->get_local_name().c_str()); - if (TypeManager::is_basic_string_char(type)) { - } else if (TypeManager::is_basic_string_wchar(type)) { - } else if (TypeManager::is_bool(type)) { - } else if (TypeManager::is_unsigned_longlong(type)) { - } else if (TypeManager::is_longlong(type)) { - } else if (TypeManager::is_integer(type)) { - } else if (TypeManager::is_float(type)) { - } else if (TypeManager::is_char_pointer(type)) { - } else if (TypeManager::is_wchar_pointer(type)) { + // The highest numbered one will be checked first. + if (TypeManager::is_pointer_to_Py_buffer(type)) { + return 14; + } else if (TypeManager::is_pointer_to_PyTypeObject(type)) { + return 13; } else if (TypeManager::is_pointer_to_PyObject(type)) { - } else if (TypeManager::is_pointer_to_Py_buffer(type)) { + return 12; + } else if (TypeManager::is_wstring(type)) { + return 11; + } else if (TypeManager::is_wchar_pointer(type)) { + return 10; + } else if (TypeManager::is_string(type)) { + return 9; + } else if (TypeManager::is_char_pointer(type)) { + return 8; + } else if (TypeManager::is_unsigned_longlong(type)) { + return 7; + } else if (TypeManager::is_longlong(type)) { + return 6; + } else if (TypeManager::is_integer(type)) { + return 5; + } else if (TypeManager::is_double(type)) { + return 4; + } else if (TypeManager::is_float(type)) { + return 3; + } else if (TypeManager::is_pointer_to_simple(type)) { + return 2; + } else if (TypeManager::is_bool(type)) { + return 1; } else if (TypeManager::is_pointer(type) || TypeManager::is_reference(type) || TypeManager::is_struct(type)) { - ++answer; + answer = 20; int deepest = 0; TypeIndex type_index = builder.get_type(TypeManager::unwrap(TypeManager::resolve_type(type)), false); InterrogateDatabase *idb = InterrogateDatabase::get_ptr(); @@ -2760,7 +3959,7 @@ int GetParnetDepth(CPPType *type) { for (int di = 0; di < num_derivations; di++) { TypeIndex d_type_Index = itype.get_derivation(di); const InterrogateType &d_itype = idb->get_type(d_type_Index); - int this_one = GetParnetDepth(d_itype._cpptype); + int this_one = get_type_sort(d_itype._cpptype); if (this_one > deepest) { deepest = this_one; } @@ -2790,26 +3989,8 @@ bool RemapCompareLess(FunctionRemap *in1, FunctionRemap *in2) { CPPType *orig_type1 = in1->_parameters[x]._remap->get_orig_type(); CPPType *orig_type2 = in2->_parameters[x]._remap->get_orig_type(); - // Hack to make int sort before float and double. We do - // this by letting everything compare less than float types. - // But if there's a double variant, prefer it over the float variant. - if (TypeManager::is_float(orig_type1) && - !TypeManager::is_double(orig_type1)) { - return false; - } - if (TypeManager::is_float(orig_type2) && - !TypeManager::is_double(orig_type2)) { - return true; - } - if (TypeManager::is_float(orig_type1)) { - return false; - } - if (TypeManager::is_float(orig_type2)) { - return true; - } - - int pd1 = GetParnetDepth(orig_type1); - int pd2 = GetParnetDepth(orig_type2); + int pd1 = get_type_sort(orig_type1); + int pd2 = get_type_sort(orig_type2); if (pd1 != pd2) { return (pd1 > pd2); } @@ -2820,67 +4001,143 @@ bool RemapCompareLess(FunctionRemap *in1, FunctionRemap *in2) { return false; } -/////////////////////////////////////////////////////////// -// Function : write_function_forset +//////////////////////////////////////////////////////////////////// +// Function: InterfaceMakerPythonNative::write_function_forset +// Access: Private +// Description: Writes out a set of function wrappers that handle +// all instances of a particular function with the +// same number of parameters. +// (Actually, in some cases relating to default +// argument handling, this may be called with remaps +// taking a range of parameters.) // -// A set is defined as all remaps that have the same number of paramaters.. -/////////////////////////////////////////////////////////// +// min_num_args and max_num_args are the range of +// parameter counts to respect for these functions. +// This is important for default argument handling. +// +// expected_params is a reference to a string that +// will be filled in with a list of overloads that +// this function takes, for displaying in the doc +// string and error messages. +// +// If coercion_allowed is true, it will attempt +// to convert arguments to the appropriate parameter +// type using the appropriate Dtool_Coerce function. +// This means it may write some remaps twice: once +// without coercion, and then it may go back and +// write it a second time to try parameter coercion. +// +// If report_errors is true, it will print an error +// and exit when one has occurred, instead of falling +// back to the next overload. This is automatically +// disabled when more than one function is passed. +// +// args_type indicates whether this function takes +// no args, a single PyObject* arg, an args tuple, +// or an args tuple and kwargs dictionary. +// +// return_flags indicates which value should be +// returned from the wrapper function and what should +// be returned on error. +// +// If check_exceptions is false, it will not check +// if the function raised an exception, except if +// it took PyObject* arguments. This should NEVER +// be false for C++ functions that call Python code, +// since that would block a meaningful exception +// like SystemExit or KeyboardInterrupt. +// +// If verify_const is set, it will write out a check +// to make sure that non-const functions aren't called +// for a const "this". This is usually only false when +// write_function_for_name has already done this check +// (which it does when *all* remaps are non-const). +// +// If first_pexpr is not empty, it represents the +// preconverted value of the first parameter. This +// is a special-case hack for one of the slot functions. +//////////////////////////////////////////////////////////////////// void InterfaceMakerPythonNative:: -write_function_forset(ostream &out, InterfaceMaker::Object *obj, - InterfaceMaker::Function *func, - std::set &remapsin, +write_function_forset(ostream &out, + const std::set &remapsin, + int min_num_args, int max_num_args, string &expected_params, int indent_level, - bool is_inplace, bool coercion_allowed, - bool &coercion_attempted, - ArgsType args_type, - bool return_int, const string &first_pexpr) { - // Do we accept any parameters that are class objects? If so, we - // might need to check for parameter coercion. - bool coercion_possible = false; - if (coercion_allowed) { - std::set::const_iterator sii; - for (sii = remapsin.begin(); sii != remapsin.end() && !coercion_possible; ++sii) { - FunctionRemap *remap = (*sii); - int pn = 0; - if (remap->_has_this) { - // Skip the "this" parameter. It's never coercible. - ++pn; - } - while (pn < (int)remap->_parameters.size()) { - CPPType *type = remap->_parameters[pn]._remap->get_new_type(); + bool coercion_allowed, bool report_errors, + ArgsType args_type, int return_flags, + bool check_exceptions, bool verify_const, + const string &first_pexpr) { - if (TypeManager::is_char_pointer(type)) { - } else if (TypeManager::is_wchar_pointer(type)) { - } else if (TypeManager::is_pointer_to_PyObject(type)) { - } else if (TypeManager::is_pointer_to_Py_buffer(type)) { - } else if (TypeManager::is_pointer(type)) { - // This is a pointer to an object, so we - // might be able to coerce a parameter to it. - coercion_possible = true; - break; - } - ++pn; + if (remapsin.empty()) { + return; + } + + FunctionRemap *remap; + std::set::iterator sii; + + bool all_nonconst = false; + + if (verify_const) { + // Check if all of the remaps are non-const. If so, we only have to + // check the constness of the self pointer once, rather than per remap. + all_nonconst = true; + + for (sii = remapsin.begin(); sii != remapsin.end(); ++sii) { + remap = (*sii); + if (!remap->_has_this || remap->_const_method) { + all_nonconst = false; + break; + } + } + + if (all_nonconst) { + // Yes, they do. Check that the parameter has the required constness. + indent(out, indent_level) + << "if (!((Dtool_PyInstDef *)self)->_is_const) {\n"; + indent_level += 2; + verify_const = false; + } + } + + string first_param_name; + bool same_first_param = false; + + // If there's only one arg and all remaps have the same parameter name, we + // extract it from the dictionary, so we don't have to call ParseTupleAndKeywords. + if (first_pexpr.empty() && min_num_args == 1 && max_num_args == 1 && + args_type == AT_keyword_args) { + sii = remapsin.begin(); + remap = (*sii); + first_param_name = remap->_parameters[(int)remap->_has_this]._name; + same_first_param = true; + + for (++sii; sii != remapsin.end(); ++sii) { + remap = (*sii); + if (remap->_parameters[(int)remap->_has_this]._name != first_param_name) { + same_first_param = false; + break; } } } - if (coercion_possible) { - // These objects keep track of whether we have attempted automatic - // parameter coercion. - indent(out, indent_level) - << "{\n"; - indent_level += 2; - indent(out, indent_level) - << "PyObject *coerced = NULL;\n"; - indent(out, indent_level) - << "PyObject **coerced_ptr = NULL;\n"; - indent(out, indent_level) - << "bool report_errors = false;\n"; - indent(out, indent_level) - << "while (true) {\n"; - indent_level += 2; - } else { - out << "\n"; + if (same_first_param) { + // Yes, they all have the same argument name (or there is only one remap). + // Extract it from the dict so we don't have to call ParseTupleAndKeywords. + indent(out, indent_level) << "PyObject *arg = NULL;\n"; + indent(out, indent_level) << "if (PyTuple_GET_SIZE(args) == 1) {\n"; + indent(out, indent_level) << " arg = PyTuple_GET_ITEM(args, 0);\n"; + indent(out, indent_level) << "} else if (kwds != NULL) {\n"; + indent(out, indent_level) << " arg = PyDict_GetItemString(kwds, \"" << first_param_name << "\");\n"; + indent(out, indent_level) << "}\n"; + if (report_errors) { + indent(out, indent_level) << "if (arg == (PyObject *)NULL) {\n"; + error_raise_return(out, indent_level + 2, return_flags, "TypeError", + "Required argument '" + first_param_name + "' (pos 1) not found"); + indent(out, indent_level) << "}\n"; + } else { + indent(out, indent_level) << "if (arg != (PyObject *)NULL) {\n"; + indent_level += 2; + } + args_type = AT_single_arg; } if (remapsin.size() > 1) { @@ -2889,11 +4146,75 @@ write_function_forset(ostream &out, InterfaceMaker::Object *obj, // least-specific, then try them one at a time. std::vector remaps (remapsin.begin(), remapsin.end()); std::sort(remaps.begin(), remaps.end(), RemapCompareLess); + std::vector::const_iterator sii; - std::vector::iterator sii; - for (sii = remaps.begin(); sii != remaps.end(); sii ++) { - FunctionRemap *remap = (*sii); - if (remap->_has_this && !remap->_const_method) { + // Check if all of them have an InternalName pointer as first + // parameter. This is a dirty hack, of course, to work around an + // awkward overload resolution problem in NodePath::set_shader_input() + // (while perhaps also improving its performance). If I had more time + // I'd create a better solution. + bool first_internalname = false; + string first_pexpr2(first_pexpr); + if (first_pexpr.empty() && args_type != AT_no_args) { + first_internalname = true; + + for (sii = remaps.begin(); sii != remaps.end(); ++sii) { + remap = (*sii); + if (remap->_parameters.size() > (int)remap->_has_this) { + ParameterRemap *param = remap->_parameters[(int)remap->_has_this]._remap; + string param_name = param->get_orig_type()->get_local_name(&parser); + + if (param_name != "CPT_InternalName" && + param_name != "InternalName const *" && + param_name != "InternalName *") { + // Aw. + first_internalname = false; + break; + } + } else { + first_internalname = false; + break; + } + } + if (first_internalname) { + // Yeah, all remaps have a first InternalName parameter, so process + // that and remove it from the args tuple. + if (args_type == AT_single_arg) { + // Bit of a weird case, but whatever. + indent(out, indent_level) << "PyObject *name_obj = arg;\n"; + args_type = AT_no_args; + } else if (min_num_args == 2 && max_num_args == 2) { + indent(out, indent_level) << "PyObject *name_obj = PyTuple_GET_ITEM(args, 0);\n"; + indent(out, indent_level) << "PyObject *arg = PyTuple_GET_ITEM(args, 1);\n"; + args_type = AT_single_arg; + } else { + indent(out, indent_level) << "PyObject *name_obj = PyTuple_GET_ITEM(args, 0);\n"; + indent(out, indent_level) << "args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args));\n"; + return_flags |= RF_decref_args; + } + indent(out, indent_level) << "PT(InternalName) name;\n"; + indent(out, indent_level) << "if (Dtool_Coerce_InternalName(name_obj, name)) {\n"; + indent_level += 2; + first_pexpr2 = "name"; + } + } + + int num_coercion_possible = 0; + sii = remaps.begin(); + while (sii != remaps.end()) { + remap = *(sii++); + + if (coercion_allowed && is_remap_coercion_possible(remap)) { + if (++num_coercion_possible == 1 && sii == remaps.end()) { + // This is the last remap, and it happens to be the only one + // with coercion possible. So we might as well just break off + // now, and let this case be handled by the coercion loop, below. + // BUG: this remap doesn't get listed in expected_params. + break; + } + } + + if (verify_const && (remap->_has_this && !remap->_const_method)) { // If it's a non-const method, we only allow a // non-const this. indent(out, indent_level) @@ -2903,265 +4224,419 @@ write_function_forset(ostream &out, InterfaceMaker::Object *obj, << "{\n"; } - indent(out, indent_level) << "// -2 "; - remap->write_orig_prototype(out, 0); out << "\n"; + indent(out, indent_level) << " // -2 "; + remap->write_orig_prototype(out, 0, false, (max_num_args - min_num_args)); + out << "\n"; - write_function_instance(out, obj, func, remap, expected_params, indent_level + 2, is_inplace, - coercion_possible, coercion_attempted, args_type, return_int, first_pexpr); + // NB. We don't pass on report_errors here because we want + // it to silently drop down to the next overload. + + write_function_instance(out, remap, min_num_args, max_num_args, + expected_params, indent_level + 2, + false, false, args_type, return_flags, + check_exceptions, first_pexpr2); - indent(out, indent_level + 2) << "PyErr_Clear();\n"; indent(out, indent_level) << "}\n\n"; } + + // Go through one more time, but allow coercion this time. + if (coercion_allowed) { + for (sii = remaps.begin(); sii != remaps.end(); sii ++) { + remap = (*sii); + if (!is_remap_coercion_possible(remap)) { + indent(out, indent_level) + << "// No coercion possible: "; + remap->write_orig_prototype(out, 0, false, (max_num_args - min_num_args)); + out << "\n"; + continue; + } + + if (verify_const && (remap->_has_this && !remap->_const_method)) { + indent(out, indent_level) + << "if (!((Dtool_PyInstDef *)self)->_is_const) {\n"; + } else { + indent(out, indent_level) + << "{\n"; + } + + indent(out, indent_level) << " // -2 "; + remap->write_orig_prototype(out, 0, false, (max_num_args - min_num_args)); + out << "\n"; + + string ignore_expected_params; + write_function_instance(out, remap, min_num_args, max_num_args, + ignore_expected_params, indent_level + 2, + true, false, args_type, return_flags, + check_exceptions, first_pexpr2); + + indent(out, indent_level) << "}\n\n"; + } + } + + if (first_internalname) { + indent_level -= 2; + if (report_errors) { + indent(out, indent_level) << "} else {\n"; + + string class_name = remap->_cpptype->get_simple_name(); + ostringstream msg; + msg << classNameFromCppName(class_name, false) << "." + << methodNameFromCppName(remap, class_name, false) + << "() first argument must be str or InternalName"; + + error_raise_return(out, indent_level + 2, return_flags, + "TypeError", msg.str()); + } + indent(out, indent_level) << "}\n"; + } } else { // There is only one possible overload with this number of // parameters. Just call it. - std::set::iterator sii; - for (sii = remapsin.begin(); sii != remapsin.end(); sii ++) { - FunctionRemap *remap = (*sii); - if (remap->_has_this && !remap->_const_method) { - // If it's a non-const method, we only allow a - // non-const this. - indent(out, indent_level) - << "if (!((Dtool_PyInstDef *)self)->_is_const) {\n"; - indent_level += 2; - } + sii = remapsin.begin(); - indent(out, indent_level) - << "// 1-" ; - remap->write_orig_prototype(out, 0); - out << "\n" ; - write_function_instance(out, obj, func, remap, expected_params, indent_level, is_inplace, - coercion_possible, coercion_attempted, args_type, return_int, first_pexpr); + remap = (*sii); + indent(out, indent_level) + << "// 1-" ; + remap->write_orig_prototype(out, 0, false, (max_num_args - min_num_args)); + out << "\n"; - if (remap->_has_this && !remap->_const_method) { - indent(out, indent_level - 2) - << "} else {\n"; - indent(out, indent_level) - << "PyErr_SetString(PyExc_TypeError,\n"; - string class_name = remap->_cpptype->get_simple_name(); - indent(out, indent_level) - << " \"Cannot call " - << classNameFromCppName(class_name, false) - << "." << methodNameFromCppName(func, class_name, false) - << "() on a const object.\");\n"; - - if (return_int) { - indent(out, indent_level) - << "return -1;\n"; - } else { - indent(out, indent_level) - << "return (PyObject *) NULL;\n"; - } - - indent_level -= 2; - indent(out, indent_level) - << "}\n\n"; - } else { - out << "\n"; - } - } + write_function_instance(out, remap, min_num_args, max_num_args, + expected_params, indent_level, + coercion_allowed, report_errors, + args_type, return_flags, + check_exceptions, first_pexpr); } - // Now we've tried all of the possible overloads, and had no luck. - - if (coercion_possible) { - // Try again, this time with coercion enabled. - indent(out, indent_level) - << "if (coerced_ptr == NULL && !report_errors) {\n"; - indent(out, indent_level + 2) - << "coerced_ptr = &coerced;\n"; - indent(out, indent_level + 2) - << "continue;\n"; - indent(out, indent_level) - << "}\n"; - - // No dice. Go back one more time, and this time get the error - // message. - indent(out, indent_level) - << "if (!report_errors) {\n"; - indent(out, indent_level + 2) - << "report_errors = true;\n"; - indent(out, indent_level + 2) - << "continue;\n"; - indent(out, indent_level) - << "}\n"; - - // We've been through three times. We're done. - indent(out, indent_level) - << "break;\n"; - + // Close the brace we opened earlier. + if (same_first_param && !report_errors) { indent_level -= 2; - indent(out, indent_level) - << "}\n"; + indent(out, indent_level) << "}\n"; + } - indent(out, indent_level) - << "Py_XDECREF(coerced);\n"; + // If we did a const check earlier, and we were asked to report errors, + // write out an else case raising an exception. + if (all_nonconst) { + if (report_errors) { + indent(out, indent_level - 2) + << "} else {\n"; + + string class_name = remap->_cpptype->get_simple_name(); + ostringstream msg; + msg << "Cannot call " + << classNameFromCppName(class_name, false) + << "." << methodNameFromCppName(remap, class_name, false) + << "() on a const object."; + + out << "#ifdef NDEBUG\n"; + error_raise_return(out, indent_level, return_flags, "TypeError", + "non-const method called on const object"); + out << "#else\n"; + error_raise_return(out, indent_level, return_flags, "TypeError", msg.str()); + out << "#endif\n"; + } indent_level -= 2; - indent(out, indent_level) - << "}\n"; + indent(out, indent_level) << "}\n"; } } //////////////////////////////////////////////////////////////////// // Function: InterfaceMakerPythonNative::write_function_instance // Access: Private -// Description: Writes out the particular function that handles a -// single instance of an overloaded function. +// Description: Writes out the code to handle a a single instance +// of an overloaded function. This will convert all +// of the arguments from PyObject* to the appropriate +// C++ type, call the C++ function, possibly check +// for errors, and construct a Python wrapper for the +// return value. +// +// return_flags indicates which value should be +// returned from the wrapper function and what should +// be returned on error. +// +// If coercion_possible is true, it will attempt +// to convert arguments to the appropriate parameter +// type using the appropriate Dtool_Coerce function. +// +// If report_errors is true, it will print an error +// and exit when one has occurred, instead of falling +// back to the next overload. This should be done +// if it is the only overload. +// +// If check_exceptions is false, it will not check +// if the function raised an exception, except if +// it took PyObject* arguments. This should NEVER +// be false for C++ functions that call Python code, +// since that would block a meaningful exception +// like SystemExit or KeyboardInterrupt. +// +// If first_pexpr is not empty, it represents the +// preconverted value of the first parameter. This +// is a special-case hack for one of the slot functions. //////////////////////////////////////////////////////////////////// void InterfaceMakerPythonNative:: -write_function_instance(ostream &out, InterfaceMaker::Object *obj, - InterfaceMaker::Function *func, - FunctionRemap *remap, string &expected_params, - int indent_level, bool is_inplace, - bool coercion_possible, bool &coercion_attempted, - ArgsType args_type, bool return_int, +write_function_instance(ostream &out, FunctionRemap *remap, + int min_num_args, int max_num_args, + string &expected_params, int indent_level, + bool coercion_possible, bool report_errors, + ArgsType args_type, int return_flags, + bool check_exceptions, const string &first_pexpr) { string format_specifiers; - std::string keyword_list; + string keyword_list; string parameter_list; string container; + string type_check; vector_string pexprs; - string extra_convert; - string extra_param_check; - string extra_cleanup; + LineStream extra_convert; + ostringstream extra_param_check; + LineStream extra_cleanup; + int min_version = 0; + + // This will be set if the function itself is suspected of possibly + // raising a TypeError. + bool may_raise_typeerror = false; + + // This will be set to true if one of the things we're about to do + // *might* raise a TypeError that we may have to clear. + bool clear_error = false; bool is_constructor = (remap->_type == FunctionRemap::T_constructor); - if (is_constructor && (remap->_flags & FunctionRemap::F_explicit_self) != 0) { - // If we'll be passing "self" to the constructor, we need to - // pre-initialize it here. Unfortunately, we can't pre-load the - // "this" pointer, but the constructor itself can do this. - - indent(out, indent_level) - << "// Pre-initialize self for the constructor\n"; - - CPPType *orig_type = remap->_return_type->get_orig_type(); - TypeIndex type_index = builder.get_type(TypeManager::unwrap(TypeManager::resolve_type(orig_type)), false); - InterrogateDatabase *idb = InterrogateDatabase::get_ptr(); - const InterrogateType &itype = idb->get_type(type_index); - indent(out, indent_level) - << "DTool_PyInit_Finalize(self, NULL, &" - << CLASS_PREFIX << make_safe_name(itype.get_scoped_name()) - << ", false, false);\n"; - } + InterrogateDatabase *idb = InterrogateDatabase::get_ptr(); // Make one pass through the parameter list. We will output a // one-line temporary variable definition for each parameter, while // simultaneously building the ParseTuple() function call and also // the parameter expression list for call_function(). - expected_params += methodNameFromCppName(func, "", false); + expected_params += methodNameFromCppName(remap, "", false); expected_params += "("; - int num_params = 0; - bool only_pyobjects = true; - //bool check_exceptions = false; + int num_params = max_num_args; + if (remap->_has_this) { + num_params += 1; + } + if (num_params > remap->_parameters.size()) { + // Limit to how many parameters this remap actually has. + num_params = remap->_parameters.size(); + max_num_args = num_params; + if (remap->_has_this) { + --max_num_args; + } + } + nassertv(num_params <= remap->_parameters.size()); - int pn; - for (pn = 0; pn < (int)remap->_parameters.size(); ++pn) { + bool only_pyobjects = true; + + int pn = 0; + + if (remap->_has_this) { + // The first parameter is the 'this' parameter. + string expected_class_name = classNameFromCppName(remap->_cpptype->get_simple_name(), false); + if (remap->_const_method) { + expected_params += expected_class_name + " self"; + string class_name = remap->_cpptype->get_local_name(&parser); + container = "(const " + class_name + "*)local_this"; + } else { + expected_params += "const " + expected_class_name + " self"; + container = "local_this"; + } + pexprs.push_back(container); + ++pn; + } + + if (!first_pexpr.empty()) { + if (pn >= num_params) { + // first_pexpr was passed even though the function takes no arguments. + nassert_raise("pn < num_params"); + } else { + // The first actual argument was already converted. + if (pn > 0) { + expected_params += ", "; + } + expected_params += first_pexpr; + pexprs.push_back(first_pexpr); + ++pn; + } + } + + // Now convert (the rest of the) actual arguments, one by one. + for (; pn < num_params; ++pn) { if (pn > 0) { expected_params += ", "; } - if (((remap->_has_this && pn == 1) || - (!remap->_has_this && pn == 0)) && !first_pexpr.empty()) { - // The first param was already converted. - pexprs.push_back(first_pexpr); - continue; + bool is_optional = false; + // Has this remap been selected to consider optional arguments for + // this parameter? We can do that by adding a vertical bar to the + // PyArg_ParseTuple format string, coupled with some extra logic + // in the argument handling, below. + if (remap->_has_this && !is_constructor) { + if (pn > min_num_args) { + is_optional = true; + if ((pn - 1) == min_num_args) { + format_specifiers += "|"; + } + } + } else { + if (pn >= min_num_args) { + is_optional = true; + if (pn == min_num_args) { + format_specifiers += "|"; + } + } } - CPPType *orig_type = remap->_parameters[pn]._remap->get_orig_type(); - CPPType *type = remap->_parameters[pn]._remap->get_new_type(); + ParameterRemap *param = remap->_parameters[pn]._remap; + CPPType *orig_type = param->get_orig_type(); + CPPType *type = param->get_new_type(); + CPPExpression *default_value = param->get_default_value(); string param_name = remap->get_parameter_name(pn); // This is the string to convert our local variable to the // appropriate C++ type. Normally this is just a cast. string pexpr_string = - "(" + type->get_local_name(&parser) + ")" + param_name; + "(" + orig_type->get_local_name(&parser) + ")" + param_name; - if (!remap->_has_this || pn != 0) { - keyword_list += "(char *)\"" + remap->_parameters[pn]._name + "\", "; + string default_expr; + + if (is_optional) { + // If this is an optional argument, PyArg_ParseTuple will leave + // the variable unchanged if it has been omitted, so we have to + // initialize it to the desired default expression. Format it. + ostringstream default_expr_str; + default_expr_str << " = "; + default_value->output(default_expr_str, 0, &parser, false); + default_expr = default_expr_str.str(); + + // We should only ever have to consider optional arguments for + // functions taking a variable number of arguments. + nassertv(args_type == AT_varargs || args_type == AT_keyword_args); } - if (remap->_parameters[pn]._remap->new_type_is_atomic_string()) { + string reported_name = remap->_parameters[pn]._name; + keyword_list += "\"" + reported_name + "\", "; + + if (param->new_type_is_atomic_string()) { + if (TypeManager::is_char_pointer(orig_type)) { - indent(out, indent_level) << "char *" << param_name << ";\n"; - format_specifiers += "s"; + indent(out, indent_level) << "char "; + if (TypeManager::is_const_char_pointer(orig_type)) { + out << "const "; + } + out << "*" << param_name << default_expr << ";\n"; + format_specifiers += "z"; parameter_list += ", &" + param_name; expected_params += "str"; } else if (TypeManager::is_wchar_pointer(orig_type)) { - out << "#if PY_MAJOR_VERSION >= 3\n"; - indent(out, indent_level) << "PyObject *" << param_name << ";\n"; - out << "#else\n"; indent(out, indent_level) << "PyUnicodeObject *" << param_name << ";\n"; - out << "#endif\n"; - format_specifiers += "U"; parameter_list += ", &" + param_name; - extra_convert += " Py_ssize_t " + param_name + "_len = PyUnicode_GetSize((PyObject *)" + param_name + ");" - " wchar_t *" + param_name + "_str = (wchar_t *)alloca(sizeof(wchar_t) * (" + param_name + "_len + 1));" - " PyUnicode_AsWideChar(" + param_name + ", " + param_name + "_str, " + param_name + "_len);" - " " + param_name + "_str[" + param_name + "_len] = 0;"; + extra_convert + << "#if PY_VERSION_HEX >= 0x03030000\n" + << "wchar_t *" << param_name << "_str = PyUnicode_AsWideCharString((PyObject *)" << param_name << ", NULL);\n" + << "#else" + << "Py_ssize_t " << param_name << "_len = PyUnicode_GET_SIZE(" << param_name << ");\n" + << "wchar_t *" << param_name << "_str = (wchar_t *)alloca(sizeof(wchar_t) * (" + param_name + "_len + 1));\n" + << "PyUnicode_AsWideChar(" << param_name << ", " << param_name << "_str, " << param_name << "_len);\n" + << param_name << "_str[" << param_name << "_len] = 0;\n" + << "#endif\n"; pexpr_string = param_name + "_str"; + + extra_cleanup + << "#if PY_VERSION_HEX >= 0x03030000\n" + << "PyMem_Free(" << param_name << "_str);\n" + << "#endif\n"; + expected_params += "unicode"; } else if (TypeManager::is_wstring(orig_type)) { - out << "#if PY_MAJOR_VERSION >= 3\n"; - indent(out, indent_level) << "PyObject *" << param_name << ";\n"; - out << "#else\n"; indent(out, indent_level) << "PyUnicodeObject *" << param_name << ";\n"; - out << "#endif\n"; format_specifiers += "U"; parameter_list += ", &" + param_name; - extra_convert += " Py_ssize_t " + param_name + "_len = PyUnicode_GetSize((PyObject *)" + param_name + ");" - " wchar_t *" + param_name + "_str = (wchar_t *)alloca(sizeof(wchar_t) * " + param_name + "_len);" - " PyUnicode_AsWideChar(" + param_name + ", " + param_name + "_str, " + param_name + "_len);"; + extra_convert + << "#if PY_VERSION_HEX >= 0x03030000\n" + << "Py_ssize_t " << param_name << "_len;\n" + << "wchar_t *" << param_name << "_str = PyUnicode_AsWideCharString((PyObject *)" + << param_name << ", &" << param_name << "_len);\n" + << "#else\n" + << "Py_ssize_t " << param_name << "_len = PyUnicode_GET_SIZE(" << param_name << ");\n" + << "wchar_t *" << param_name << "_str = (wchar_t *)alloca(sizeof(wchar_t) * (" + param_name + "_len + 1));\n" + << "PyUnicode_AsWideChar(" << param_name << ", " << param_name << "_str, " << param_name << "_len);\n" + << "#endif\n"; pexpr_string = "std::wstring(" + - param_name + "_str, " + - param_name + "_len)"; + param_name + "_str, " + param_name + "_len)"; + + extra_cleanup + << "#if PY_VERSION_HEX >= 0x03030000\n" + << "PyMem_Free(" << param_name << "_str);\n" + << "#endif\n"; expected_params += "unicode"; } else if (TypeManager::is_const_ptr_to_basic_string_wchar(orig_type)) { - out << "#if PY_MAJOR_VERSION >= 3\n"; - indent(out, indent_level) << "PyObject *" << param_name << ";\n"; - out << "#else\n"; indent(out, indent_level) << "PyUnicodeObject *" << param_name << ";\n"; - out << "#endif\n"; format_specifiers += "U"; parameter_list += ", &" + param_name; - extra_convert += " Py_ssize_t " + param_name + "_len = PyUnicode_GetSize((PyObject *)" + param_name + ");" - " wchar_t *" + param_name + "_str = (wchar_t *)alloca(sizeof(wchar_t) * " + param_name + "_len);" - " PyUnicode_AsWideChar(" + param_name + ", " + param_name + "_str, " + param_name + "_len);"; + extra_convert + << "#if PY_VERSION_HEX >= 0x03030000\n" + << "Py_ssize_t " << param_name << "_len;\n" + << "wchar_t *" << param_name << "_str = PyUnicode_AsWideCharString((PyObject *)" + << param_name << ", &" << param_name << "_len);\n" + << "#else\n" + << "Py_ssize_t " << param_name << "_len = PyUnicode_GET_SIZE(" << param_name << ");\n" + << "wchar_t *" << param_name << "_str = (wchar_t *)alloca(sizeof(wchar_t) * (" + param_name + "_len + 1));\n" + << "PyUnicode_AsWideChar(" << param_name << ", " << param_name << "_str, " << param_name << "_len);\n" + << "#endif\n"; pexpr_string = "&std::wstring(" + - param_name + "_str, " + - param_name + "_len)"; + param_name + "_str, " + param_name + "_len)"; + + extra_cleanup + << "#if PY_VERSION_HEX >= 0x03030000\n" + << "PyMem_Free(" << param_name << "_str);\n" + << "#endif\n"; expected_params += "unicode"; - } else { - indent(out, indent_level) << "char *" << param_name << "_str;\n"; - indent(out, indent_level) << "Py_ssize_t " << param_name << "_len;\n"; + } else { // A regular string. + if (is_optional) { + CPPExpression::Type expr_type = default_value->_type; + if (expr_type == CPPExpression::T_default_construct) { + // The default string constructor yields an empty string. + indent(out, indent_level) << "const char *" << param_name << "_str = \"\";\n"; + indent(out, indent_level) << "Py_ssize_t " << param_name << "_len = 0;\n"; + } else { + // We only get here for string literals, so this should be fine + indent(out, indent_level) << "const char *" << param_name << "_str" + << default_expr << ";\n"; + indent(out, indent_level) << "Py_ssize_t " << param_name << "_len = " + << default_value->_str.size() << ";\n"; + } + } else { + indent(out, indent_level) << "char *" << param_name << "_str = NULL;\n"; + indent(out, indent_level) << "Py_ssize_t " << param_name << "_len;\n"; + } + if (args_type == AT_single_arg) { out << "#if PY_MAJOR_VERSION >= 3\n"; indent(out, indent_level) << param_name << "_str = PyUnicode_AsUTF8AndSize(arg, &" << param_name << "_len);\n"; - out << "#else\n"; + out << "#else\n"; // NB. PyString_AsStringAndSize also accepts a PyUnicode. indent(out, indent_level) << "if (PyString_AsStringAndSize(arg, &" << param_name << "_str, &" << param_name << "_len) == -1) {\n"; indent(out, indent_level + 2) << param_name << "_str = NULL;\n"; indent(out, indent_level) << "}\n"; out << "#endif\n"; - extra_param_check = " && " + param_name + "_str != NULL"; + extra_param_check << " && " << param_name << "_str != NULL"; } else { format_specifiers += "s#"; parameter_list += ", &" + param_name @@ -3170,149 +4645,312 @@ write_function_instance(ostream &out, InterfaceMaker::Object *obj, if (TypeManager::is_const_ptr_to_basic_string_char(orig_type)) { pexpr_string = "&std::string(" + - param_name + "_str, " + - param_name + "_len)"; + param_name + "_str, " + param_name + "_len)"; } else { pexpr_string = "std::string(" + - param_name + "_str, " + - param_name + "_len)"; + param_name + "_str, " + param_name + "_len)"; } expected_params += "str"; } - ++num_params; only_pyobjects = false; } else if (TypeManager::is_bool(type)) { if (args_type == AT_single_arg) { param_name = "arg"; } else { - indent(out, indent_level) << "PyObject *" << param_name << ";\n"; + indent(out, indent_level) << "PyObject *" << param_name; + if (is_optional) { + CPPExpression::Result res = default_value->evaluate(); + if (res._type != CPPExpression::RT_error) { + // It's a compile-time constant. Write Py_True or Py_False. + out << " = " << (res.as_boolean() ? "Py_True" : "Py_False"); + } else { + // Select Py_True or Py_False at runtime. + out << " = ("; + default_value->output(out, 0, &parser, false); + out << ") ? Py_True : Py_False"; + } + } + out << ";\n"; format_specifiers += "O"; parameter_list += ", &" + param_name; } pexpr_string = "(PyObject_IsTrue(" + param_name + ") != 0)"; expected_params += "bool"; - ++num_params; - } else if (TypeManager::is_unsigned_longlong(type)) { - if (args_type == AT_single_arg) { - param_name = "arg"; - } else { - indent(out, indent_level) << "PyObject *" << param_name << ";\n"; - format_specifiers += "O"; - parameter_list += ", &" + param_name; - } - extra_convert += "PyObject *" + param_name + "_long = PyNumber_Long(" + param_name + ");"; - extra_param_check += " && " + param_name + "_long != NULL"; - pexpr_string = "(" + type->get_local_name(&parser) + ")" + - "PyLong_AsUnsignedLongLong(" + param_name + "_long)"; - extra_cleanup += "Py_XDECREF(" + param_name + "_long);"; - expected_params += "unsigned long long"; - ++num_params; + } else if (TypeManager::is_char(type)) { + indent(out, indent_level) << "char " << param_name << default_expr << ";\n"; - } else if (TypeManager::is_longlong(type)) { - if (args_type == AT_single_arg) { - param_name = "arg"; - } else { - indent(out, indent_level) << "PyObject *" << param_name << ";\n"; - format_specifiers += "O"; - parameter_list += ", &" + param_name; - } - extra_convert += "PyObject *" + param_name + "_long = PyNumber_Long(" + param_name + ");"; - extra_param_check += " && " + param_name + "_long != NULL"; - pexpr_string = "(" + type->get_local_name(&parser) + ")" + - "PyLong_AsLongLong(" + param_name + "_long)"; - extra_cleanup += "Py_XDECREF(" + param_name + "_long);"; - expected_params += "long long"; - ++num_params; + format_specifiers += "c"; + parameter_list += ", &" + param_name; - } else if (TypeManager::is_unsigned_integer(type)) { - if (args_type == AT_single_arg) { - param_name = "arg"; - } else { - indent(out, indent_level) << "PyObject *" << param_name << ";\n"; - format_specifiers += "O"; - parameter_list += ", &" + param_name; - } - extra_convert += "PyObject *" + param_name + "_long = PyNumber_Long(" + param_name + ");"; - extra_param_check += " && " + param_name + "_long != NULL"; - pexpr_string = "(" + type->get_local_name(&parser) + ")" + - "PyLong_AsUnsignedLong(" + param_name + "_long)"; - extra_cleanup += "Py_XDECREF(" + param_name + "_long);"; - expected_params += "unsigned int"; - ++num_params; + //extra_param_check << " && isascii(" << param_name << ")"; + pexpr_string = "(char) " + param_name; + expected_params += "char"; + only_pyobjects = false; - } else if (TypeManager::is_integer(type)) { - indent(out, indent_level) << "int " << param_name << ";\n"; - format_specifiers += "i"; + } else if (TypeManager::is_wchar(type)) { + indent(out, indent_level) << "#if PY_VERSION_HEX >= 0x03020000\n"; + indent(out, indent_level) << "PyObject *" << param_name << ";\n"; + indent(out, indent_level) << "#else\n"; + indent(out, indent_level) << "PyUnicodeObject *" << param_name << ";\n"; + indent(out, indent_level) << "#endif\n"; + format_specifiers += "U"; + parameter_list += ", &" + param_name; + + // We tell it to copy 2 characters, but make sure it only + // copied one, as a trick to check for the proper length in one go. + extra_convert << "wchar_t " << param_name << "_chars[2];\n"; + extra_param_check << " && PyUnicode_AsWideChar(" << param_name << ", " << param_name << "_chars, 2) == 1"; + + pexpr_string = param_name + "_chars[0]"; + expected_params += "unicode char"; + only_pyobjects = false; + clear_error = true; + + } else if (TypeManager::is_ssize(type)) { + indent(out, indent_level) << "Py_ssize_t " << param_name << default_expr << ";\n"; + format_specifiers += "n"; parameter_list += ", &" + param_name; expected_params += "int"; only_pyobjects = false; - ++num_params; + + } else if (TypeManager::is_size(type)) { + // It certainly isn't the exact same thing as size_t, but Py_ssize_t + // should at least be the same size. The problem with mapping this + // to unsigned int is that that doesn't work well on 64-bit systems, + // on which size_t is a 64-bit integer. + indent(out, indent_level) << "Py_ssize_t " << param_name << default_expr << ";\n"; + format_specifiers += "n"; + parameter_list += ", &" + param_name; + expected_params += "int"; + only_pyobjects = false; + + extra_convert + << "#ifndef NDEBUG\n" + << "if (" << param_name << " < 0) {\n"; + + error_raise_return(extra_convert, 2, return_flags, "OverflowError", + "can't convert negative value %zd to size_t", + param_name); + extra_convert + << "}\n" + << "#endif\n"; + + } else if (TypeManager::is_longlong(type)) { + // It's not trivial to do overflow checking for a long long, so we + // simply don't do it. + if (TypeManager::is_unsigned_longlong(type)) { + indent(out, indent_level) << "unsigned PY_LONG_LONG " << param_name << default_expr << ";\n"; + format_specifiers += "K"; + } else { + indent(out, indent_level) << "PY_LONG_LONG " << param_name << default_expr << ";\n"; + format_specifiers += "L"; + } + parameter_list += ", &" + param_name; + expected_params += "long"; + only_pyobjects = false; + + } else if (TypeManager::is_unsigned_short(type)) { + if (args_type == AT_single_arg) { + // This is defined to PyLong_Check for Python 3 by py_panda.h. + type_check = "PyInt_Check(arg)"; + extra_convert + << "long " << param_name << " = PyInt_AS_LONG(arg);\n"; + + pexpr_string = "(" + type->get_local_name(&parser) + ")" + param_name; + } else { + indent(out, indent_level) << "long " << param_name << default_expr << ";\n"; + format_specifiers += "l"; + parameter_list += ", &" + param_name; + } + + // The "H" format code, unlike "h", does not do overflow checking, so + // we have to do it ourselves (except in release builds). + extra_convert + << "#ifndef NDEBUG\n" + << "if (" << param_name << " < 0 || " << param_name << " > USHRT_MAX) {\n"; + + error_raise_return(extra_convert, 2, return_flags, "OverflowError", + "value %ld out of range for unsigned short integer", + param_name); + extra_convert + << "}\n" + << "#endif\n"; + + expected_params += "int"; + only_pyobjects = false; + + } else if (TypeManager::is_short(type)) { + if (args_type == AT_single_arg) { + // This is defined to PyLong_Check for Python 3 by py_panda.h. + type_check = "PyInt_Check(arg)"; + + // Perform overflow checking in debug builds. + extra_convert + << "long arg_val = PyInt_AS_LONG(arg);\n" + << "#ifndef NDEBUG\n" + << "if (arg_val < SHRT_MIN || arg_val > SHRT_MAX) {\n"; + + error_raise_return(extra_convert, 2, return_flags, "OverflowError", + "value %ld out of range for signed short integer", + "arg_val"); + extra_convert + << "}\n" + << "#endif\n"; + + pexpr_string = "(" + type->get_local_name(&parser) + ")arg_val"; + + } else { + indent(out, indent_level) << "short " << param_name << default_expr << ";\n"; + format_specifiers += "h"; + parameter_list += ", &" + param_name; + } + expected_params += "int"; + only_pyobjects = false; + + } else if (TypeManager::is_unsigned_integer(type)) { + if (args_type == AT_single_arg) { + // Windows has 32-bit longs, and Python 2 stores a C long for PyInt + // internally, so a PyInt wouldn't cover the whole range; that's why + // we have to accept PyLong as well here. + type_check = "PyLongOrInt_Check(arg)"; + extra_convert + << "unsigned long " << param_name << " = PyLong_AsUnsignedLong(arg);\n"; + pexpr_string = "(" + type->get_local_name(&parser) + ")" + param_name; + } else { + indent(out, indent_level) << "unsigned long " << param_name << default_expr << ";\n"; + format_specifiers += "k"; + parameter_list += ", &" + param_name; + } + + // The "I" format code, unlike "i", does not do overflow checking, so + // we have to do it ourselves (in debug builds). Note that Python 2 + // stores longs internally, for ints, so we don't do it for Python 2 on + // Windows, where longs are the same size as ints. + // BUG: does not catch negative values on Windows when going through + // the PyArg_ParseTuple case. + extra_convert + << "#if (SIZEOF_LONG > SIZEOF_INT) && !defined(NDEBUG)\n" + << "if (" << param_name << " > UINT_MAX) {\n"; + + error_raise_return(extra_convert, 2, return_flags, "OverflowError", + "value %lu out of range for unsigned integer", + param_name); + extra_convert + << "}\n" + << "#endif\n"; + + expected_params += "int"; + only_pyobjects = false; + + } else if (TypeManager::is_integer(type)) { + if (args_type == AT_single_arg) { + // This is defined to PyLong_Check for Python 3 by py_panda.h. + type_check = "PyInt_Check(arg)"; + + // Perform overflow checking in debug builds. Note that Python 2 + // stores longs internally, for ints, so we don't do it on Windows, + // where longs are the same size as ints. + extra_convert + << "long arg_val = PyInt_AS_LONG(arg);\n" + << "#if (SIZEOF_LONG > SIZEOF_INT) && !defined(NDEBUG)\n" + << "if (arg_val < INT_MIN || arg_val > INT_MAX) {\n"; + + error_raise_return(extra_convert, 2, return_flags, "OverflowError", + "value %ld out of range for signed integer", + "arg_val"); + extra_convert + << "}\n" + << "#endif\n"; + + pexpr_string = "(" + type->get_local_name(&parser) + ")arg_val"; + + } else { + indent(out, indent_level) << "int " << param_name << default_expr << ";\n"; + format_specifiers += "i"; + parameter_list += ", &" + param_name; + } + expected_params += "int"; + only_pyobjects = false; } else if (TypeManager::is_double(type)) { if (args_type == AT_single_arg) { pexpr_string = "PyFloat_AsDouble(arg)"; - extra_param_check += " && PyNumber_Check(arg)"; + type_check = "PyNumber_Check(arg)"; } else { - indent(out, indent_level) << "double " << param_name << ";\n"; + indent(out, indent_level) << "double " << param_name << default_expr << ";\n"; format_specifiers += "d"; parameter_list += ", &" + param_name; } expected_params += "double"; only_pyobjects = false; - ++num_params; } else if (TypeManager::is_float(type)) { if (args_type == AT_single_arg) { - pexpr_string = "(float) PyFloat_AsDouble(arg)"; - extra_param_check += " && PyNumber_Check(arg)"; + pexpr_string = "(" + type->get_local_name(&parser) + ")PyFloat_AsDouble(arg)"; + type_check = "PyNumber_Check(arg)"; } else { - indent(out, indent_level) << "float " << param_name << ";\n"; + indent(out, indent_level) << "float " << param_name << default_expr << ";\n"; format_specifiers += "f"; parameter_list += ", &" + param_name; } expected_params += "float"; only_pyobjects = false; - ++num_params; - } else if (TypeManager::is_char_pointer(type)) { - indent(out, indent_level) << "char *" << param_name << ";\n"; - format_specifiers += "s"; + } else if (TypeManager::is_const_char_pointer(type)) { + indent(out, indent_level) << "const char *" << param_name << default_expr << ";\n"; + format_specifiers += "z"; parameter_list += ", &" + param_name; - expected_params += "string"; + expected_params += "buffer"; only_pyobjects = false; - ++num_params; + + } else if (TypeManager::is_pointer_to_PyTypeObject(type)) { + if (args_type == AT_single_arg) { + param_name = "arg"; + } else { + indent(out, indent_level) << "PyObject *" << param_name << default_expr << ";\n"; + format_specifiers += "O"; + parameter_list += ", &" + param_name; + pexpr_string = param_name; + } + extra_param_check << " && PyType_Check(" << param_name << ")"; + pexpr_string = "(PyTypeObject *)" + param_name; + expected_params += "type"; + + // It's reasonable to assume that a function taking a PyTypeObject + // might also throw a TypeError if the type is incorrect. + may_raise_typeerror = true; } else if (TypeManager::is_pointer_to_PyStringObject(type)) { if (args_type == AT_single_arg) { // This is a single-arg function, so there's no need // to convert anything. param_name = "arg"; - extra_param_check += " && PyString_Check(arg)"; + type_check = "PyString_Check(arg)"; + pexpr_string = "(PyStringObject *)" + param_name; } else { - indent(out, indent_level) << "PyStringObject *" << param_name << ";\n"; + indent(out, indent_level) << "PyStringObject *" << param_name << default_expr << ";\n"; format_specifiers += "S"; parameter_list += ", &" + param_name; + pexpr_string = param_name; } - pexpr_string = param_name; expected_params += "string"; - ++num_params; } else if (TypeManager::is_pointer_to_PyUnicodeObject(type)) { if (args_type == AT_single_arg) { // This is a single-arg function, so there's no need // to convert anything. param_name = "arg"; - extra_param_check += " && PyUnicode_Check(arg)"; + type_check = "PyUnicode_Check(arg)"; + pexpr_string = "(PyUnicodeObject *)" + param_name; } else { - indent(out, indent_level) << "PyUnicodeObject *" << param_name << ";\n"; + indent(out, indent_level) << "PyUnicodeObject *" << param_name << default_expr << ";\n"; format_specifiers += "U"; parameter_list += ", &" + param_name; + pexpr_string = param_name; } - pexpr_string = param_name; expected_params += "unicode"; - ++num_params; } else if (TypeManager::is_pointer_to_PyObject(type)) { if (args_type == AT_single_arg) { @@ -3320,19 +4958,20 @@ write_function_instance(ostream &out, InterfaceMaker::Object *obj, // to convert anything. param_name = "arg"; } else { - indent(out, indent_level) << "PyObject *" << param_name << ";\n"; + indent(out, indent_level) << "PyObject *" << param_name << default_expr << ";\n"; format_specifiers += "O"; parameter_list += ", &" + param_name; } pexpr_string = param_name; - expected_params += "any"; - ++num_params; + expected_params += "object"; // It's reasonable to assume that a function taking a PyObject // might also throw a TypeError if the type is incorrect. - //check_exceptions = true; + may_raise_typeerror = true; } else if (TypeManager::is_pointer_to_Py_buffer(type)) { + min_version = 0x02060000; // Only support this remap in version 2.6+. + if (args_type == AT_single_arg) { param_name = "arg"; } else { @@ -3340,82 +4979,287 @@ write_function_instance(ostream &out, InterfaceMaker::Object *obj, format_specifiers += "O"; parameter_list += ", &" + param_name; } - extra_convert += "PyObject *" + param_name + "_buffer = PyMemoryView_FromObject(" + param_name + ");"; - extra_param_check += " && " + param_name + "_buffer != NULL"; - pexpr_string = "PyMemoryView_GET_BUFFER(" + param_name + "_buffer)"; - extra_cleanup += "Py_XDECREF(" + param_name + "_buffer);"; - expected_params += "memoryview"; - ++num_params; - //check_exceptions = true; + indent(out, indent_level) << "Py_buffer " << param_name << "_view;\n"; + + extra_param_check << " && PyObject_GetBuffer(" + << param_name << ", &" + << param_name << "_view, PyBUF_FULL) == 0"; + pexpr_string = "&" + param_name + "_view"; + extra_cleanup << "PyBuffer_Release(&" << param_name << "_view);\n"; + expected_params += "buffer"; + may_raise_typeerror = true; + clear_error = true; + + } else if (TypeManager::is_pointer_to_simple(type)) { + if (args_type == AT_single_arg) { + param_name = "arg"; + } else { + indent(out, indent_level) << "PyObject *" << param_name << ";\n"; + format_specifiers += "O"; + parameter_list += ", &" + param_name; + } + indent(out, indent_level) << "Py_buffer " << param_name << "_view;\n"; + + // Unravel the type to determine its properties. + int array_len = -1; + bool is_const = true; + CPPSimpleType *simple = NULL; + CPPType *unwrap = TypeManager::unwrap_const_reference(type); + if (unwrap != NULL) { + CPPArrayType *array_type = unwrap->as_array_type(); + CPPPointerType *pointer_type = unwrap->as_pointer_type(); + + if (array_type != NULL) { + if (array_type->_bounds != NULL) { + array_len = array_type->_bounds->evaluate().as_integer(); + } + unwrap = array_type->_element_type; + } else if (pointer_type != NULL) { + unwrap = pointer_type->_pointing_at; + } + + CPPConstType *const_type = unwrap->as_const_type(); + if (const_type != NULL) { + unwrap = const_type->_wrapped_around; + } else { + is_const = false; + } + + while (unwrap->get_subtype() == CPPDeclaration::ST_typedef) { + unwrap = unwrap->as_typedef_type()->_type; + } + simple = unwrap->as_simple_type(); + } + + // Determine the format, so we can check the type of the buffer we get. + char format_chr = 'B'; + + switch (simple->_type) { + case CPPSimpleType::T_char: + if (simple->_flags & CPPSimpleType::F_unsigned) { + format_chr = 'B'; + } else if (simple->_flags & CPPSimpleType::F_signed) { + format_chr = 'b'; + } else { + format_chr = 'c'; + } + break; + + case CPPSimpleType::T_int: + if (simple->_flags & CPPSimpleType::F_longlong) { + format_chr = 'q'; + } else if (simple->_flags & CPPSimpleType::F_long) { + format_chr = 'l'; + } else if (simple->_flags & CPPSimpleType::F_short) { + format_chr = 'h'; + } else { + format_chr = 'i'; + } + + if (simple->_flags & CPPSimpleType::F_unsigned) { + format_chr &= 0x5f; // Uppercase + } + break; + + case CPPSimpleType::T_float: + format_chr = 'f'; + break; + + case CPPSimpleType::T_double: + format_chr = 'd'; + break; + + default: + nout << "Warning: cannot determine buffer format string for type " + << type->get_local_name(&parser) + << " (simple type " << *simple << ")\n"; + extra_param_check << " && false"; + } + + const char *flags; + if (format_chr == 'B') { + if (is_const) { + flags = "PyBUF_SIMPLE"; + } else { + flags = "PyBUF_WRITABLE"; + } + } else if (is_const) { + flags = "PyBUF_FORMAT"; + } else { + flags = "PyBUF_FORMAT | PyBUF_WRITABLE"; + } + + extra_param_check << " && PyObject_GetBuffer(" << param_name << ", &" + << param_name << "_view, " << flags << ") == 0"; + + if (format_chr != 'B') { + extra_param_check + << " && " << param_name << "_view.format[0] == '" << format_chr << "'" + << " && " << param_name << "_view.format[1] == 0"; + } + if (array_len != -1) { + extra_param_check + << " && " << param_name << "_view.len == " << array_len; + } + + pexpr_string = "(" + simple->get_local_name(&parser) + " *)" + + param_name + "_view.buf"; + + extra_cleanup << "PyBuffer_Release(&" << param_name << "_view);\n"; + expected_params += "buffer"; + clear_error = true; } else if (TypeManager::is_pointer(type)) { CPPType *obj_type = TypeManager::unwrap(TypeManager::resolve_type(type)); bool const_ok = !TypeManager::is_non_const_pointer_or_ref(orig_type); - if (const_ok) { + if (TypeManager::is_const_pointer_or_ref(orig_type)) { expected_params += "const "; //} else { // expected_params += "non-const "; } - expected_params += classNameFromCppName(obj_type->get_simple_name(), false); + string expected_class_name = classNameFromCppName(obj_type->get_simple_name(), false); + expected_params += expected_class_name; - if (!remap->_has_this || pn != 0) { - if (args_type == AT_single_arg) { - param_name = "arg"; - } else { - indent(out, indent_level) << "PyObject *" << param_name << ";\n"; - format_specifiers += "O"; - parameter_list += ", &" + param_name; + if (args_type == AT_single_arg) { + param_name = "arg"; + } else { + indent(out, indent_level) << "PyObject *" << param_name; + if (is_optional) { + out << " = NULL"; } + out << ";\n"; + format_specifiers += "O"; + parameter_list += ", &" + param_name; + } - ++num_params; + string class_name = obj_type->get_local_name(&parser); - TypeIndex p_type_index = builder.get_type(obj_type, false); - InterrogateDatabase *idb = InterrogateDatabase::get_ptr(); - const InterrogateType &p_itype = idb->get_type(p_type_index); + // need to a forward scope for this class.. + if (!isExportThisRun(obj_type)) { + _external_imports.insert(obj_type); + } - bool is_copy_constructor = false; - if (is_constructor && remap->_parameters.size() == 1 && pn == 0) { - if (&p_itype == &obj->_itype) { - // If this is the only one parameter, and it's the same as - // the "this" type, this is a copy constructor. - is_copy_constructor = true; + string this_class_name; + string method_prefix; + if (remap->_cpptype) { + this_class_name = remap->_cpptype->get_simple_name(); + method_prefix = classNameFromCppName(this_class_name, false) + string("."); + } + + if (coercion_possible && + has_coerce_constructor(obj_type->as_struct_type())) { + // Call the coercion function directly, which will try to + // extract the pointer directly before trying coercion. + string coerce_call; + + if (TypeManager::is_reference_count(obj_type)) { + // We use a PointerTo to handle the management here. It's cleaner + // that way. + if (TypeManager::is_const_pointer_to_anything(type)) { + extra_convert << 'C'; } + extra_convert + << "PT(" << class_name << ") " << param_name << "_this" + << default_expr << ";\n"; + + coerce_call = "Dtool_Coerce_" + make_safe_name(class_name) + + "(" + param_name + ", " + param_name + "_this)"; + + // Use move constructor when available for functions that take + // an actual PointerTo. This eliminates an unref()/ref() pair. + pexpr_string = "MOVE(" + param_name + "_this)"; + + } else { + // This is a bit less elegant: we use a bool to store whether + // we're supposed to clean up the reference afterward. + type->output_instance(extra_convert, param_name + "_this", &parser); + extra_convert + << default_expr << ";\n" + << "bool " << param_name << "_manage = false;\n"; + + coerce_call = "Dtool_Coerce_" + make_safe_name(class_name) + + "(" + param_name + ", " + param_name + "_this, " + param_name + "_manage)"; + + extra_cleanup + << "if (" << param_name << "_manage) {\n" + << " delete " << param_name << "_this;\n" + << "}\n"; + + pexpr_string = param_name + "_this"; } - //make_safe_name(itype.get_scoped_name()) - extra_convert += p_itype.get_scoped_name() + " *" + param_name + "_this = (" + p_itype.get_scoped_name()+" *)"; - // need to a forward scope for this class.. - if (!isExportThisRun(p_itype._cpptype)) { - _external_imports.insert(make_safe_name(p_itype.get_scoped_name())); - } + if (report_errors) { + // We were asked to report any errors. Let's do it. + if (is_optional) { + extra_convert << "if (" << param_name << " != NULL && !" << coerce_call << ") {\n"; + } else { + extra_convert << "if (!" << coerce_call << ") {\n"; + } - string class_name; - string method_prefix; - if (remap->_cpptype) { - class_name = remap->_cpptype->get_simple_name(); - method_prefix = classNameFromCppName(class_name, false) + string("."); - } + // Display error like: Class.func() argument 0 must be A, not B + if ((return_flags & ~RF_pyobject) == RF_err_null) { + // Dtool_Raise_ArgTypeError returns NULL already + extra_convert << " return "; + } else { + extra_convert << " "; + } + extra_convert + << "Dtool_Raise_ArgTypeError(" << param_name << ", " + << pn << ", \"" << method_prefix + << methodNameFromCppName(remap, this_class_name, false) + << "\", \"" << expected_class_name << "\");\n"; + + if ((return_flags & ~RF_pyobject) != RF_err_null) { + error_return(extra_convert, 2, return_flags); + } + extra_convert << "}\n"; + + } else if (is_optional) { + extra_param_check << " && (" << param_name << " == NULL || " << coerce_call << ")"; - ostringstream str; - str << "DTOOL_Call_GetPointerThisClass(" << param_name - << ", &Dtool_" << make_safe_name(p_itype.get_scoped_name()) - << ", " << pn << ", \"" - << method_prefix << methodNameFromCppName(func, class_name, false) - << "\", " << const_ok; - if (coercion_possible && !is_copy_constructor) { - // We never attempt to coerce a copy constructor parameter. - // That would lead to infinite recursion. - str << ", coerced_ptr, report_errors"; - coercion_attempted = true; } else { - str << ", NULL, true"; + extra_param_check << " && " << coerce_call; } - str << ");\n"; - extra_convert += str.str(); - extra_param_check += " && " + param_name + "_this != NULL"; - pexpr_string = param_name + "_this"; + } else { + type->output_instance(extra_convert, param_name + "_this", &parser); + if (is_optional) { + extra_convert + << default_expr << ";\n" + << "if (" << param_name << " != (PyObject *)NULL) {\n" + << " " << param_name << "_this"; + } + if (const_ok && !report_errors) { + // This function does the same thing in this case and is slightly + // simpler. But maybe we should just reorganize these functions + // entirely? + extra_convert << ";\n"; + if (is_optional) { + extra_convert << " "; + } + extra_convert + << "DTOOL_Call_ExtractThisPointerForType(" << param_name + << ", &Dtool_" << make_safe_name(class_name) + << ", (void **)&" << param_name << "_this);\n"; + } else { + extra_convert << boolalpha + << " = (" << class_name << " *)" + << "DTOOL_Call_GetPointerThisClass(" << param_name + << ", &Dtool_" << make_safe_name(class_name) + << ", " << pn << ", \"" + << method_prefix << methodNameFromCppName(remap, this_class_name, false) + << "\", " << const_ok << ", " << report_errors << ");\n"; + } + + if (is_optional) { + extra_convert << "}\n"; + extra_param_check << " && (" << param_name << " == NULL || " << param_name << "_this != NULL)"; + } else { + extra_param_check << " && " << param_name << "_this != NULL"; + } + + pexpr_string = param_name + "_this"; } } else { @@ -3428,49 +5272,44 @@ write_function_instance(ostream &out, InterfaceMaker::Object *obj, parameter_list += ", &" + param_name; } expected_params += "any"; - ++num_params; } - if (remap->_parameters[pn]._has_name) { - expected_params += " " + remap->_parameters[pn]._name; + if (!reported_name.empty()) { + expected_params += " " + reported_name; } - - if (remap->_has_this && pn == 0) { - container = "local_this"; - if (remap->_const_method) { - string class_name = remap->_cpptype->get_local_name(&parser); - container = "(const " + class_name + "*)local_this"; - } - } - pexprs.push_back(pexpr_string); } expected_params += ")\n"; - // If this is the only overload, don't bother checking for type errors. - // Any type error that is raised will simply pass through to below. - //if (func->_remaps.size() == 1) { - // check_exceptions = false; - //} + if (min_version > 0) { + out << "#if PY_VERSION_HEX >= 0x" << hex << min_version << dec << "\n"; + } // Track how many curly braces we've opened. short open_scopes = 0; - if (!format_specifiers.empty()) { - std::string format_specifiers1 = format_specifiers + ":" + - methodNameFromCppName(func, "", false); + if (!type_check.empty() && args_type == AT_single_arg) { + indent(out, indent_level) + << "if (" << type_check << ") {\n"; + + ++open_scopes; + indent_level += 2; + + } else if (!format_specifiers.empty()) { + string method_name = methodNameFromCppName(remap, "", false); switch (args_type) { case AT_keyword_args: // Wrapper takes a varargs tuple and a keyword args dict. indent(out, indent_level) - << "static char *keyword_list[] = {" << keyword_list << "NULL};\n"; + << "static const char *keyword_list[] = {" << keyword_list << "NULL};\n"; indent(out, indent_level) << "if (PyArg_ParseTupleAndKeywords(args, kwds, \"" - << format_specifiers1 << "\", keyword_list" << parameter_list - << ")) {\n"; + << format_specifiers << ":" << method_name + << "\", (char **)keyword_list" << parameter_list << ")) {\n"; ++open_scopes; + clear_error = true; indent_level += 2; break; @@ -3481,28 +5320,30 @@ write_function_instance(ostream &out, InterfaceMaker::Object *obj, // more efficient PyArg_UnpackTuple function instead. indent(out, indent_level) << "if (PyArg_UnpackTuple(args, \"" - << methodNameFromCppName(func, "", false) - << "\", " << num_params - << ", " << num_params + << methodNameFromCppName(remap, "", false) + << "\", " << min_num_args << ", " << max_num_args << parameter_list << ")) {\n"; + } else { indent(out, indent_level) << "if (PyArg_ParseTuple(args, \"" - << format_specifiers1 << "\"" - << parameter_list << ")) {\n"; + << format_specifiers << ":" << method_name + << "\"" << parameter_list << ")) {\n"; } ++open_scopes; + clear_error = true; indent_level += 2; break; case AT_single_arg: - // Wrapper takes a single PyObject* argument. + // Single argument. If not a PyObject*, use PyArg_Parse. if (!only_pyobjects && format_specifiers != "O") { indent(out, indent_level) - << "if (PyArg_Parse(arg, \"" << format_specifiers << "\"" - << parameter_list << ")) {\n"; + << "if (PyArg_Parse(arg, \"" << format_specifiers << ":" + << method_name << "\"" << parameter_list << ")) {\n"; ++open_scopes; + clear_error = true; indent_level += 2; } @@ -3511,197 +5352,366 @@ write_function_instance(ostream &out, InterfaceMaker::Object *obj, } } - if (!extra_convert.empty()) { - indent(out, indent_level) - << extra_convert << "\n"; + while (extra_convert.is_text_available()) { + string line = extra_convert.get_line(); + if (line.size() == 0 || line[0] == '#') { + out << line << "\n"; + } else { + indent(out, indent_level) << line << "\n"; + } } - if (!extra_param_check.empty()) { + string extra_param_check_str = extra_param_check.str(); + if (!extra_param_check_str.empty()) { indent(out, indent_level) - << "if (" << extra_param_check.substr(4) << ") {\n"; + << "if (" << extra_param_check_str.substr(4) << ") {\n"; ++open_scopes; indent_level += 2; } + if (!remap->_has_this && (remap->_flags & FunctionRemap::F_explicit_self) != 0) { + // If we'll be passing "self" to the constructor, we need to + // pre-initialize it here. Unfortunately, we can't pre-load the + // "this" pointer, but the constructor itself can do this. + + CPPType *orig_type = remap->_return_type->get_orig_type(); + TypeIndex type_index = builder.get_type(TypeManager::unwrap(TypeManager::resolve_type(orig_type)), false); + const InterrogateType &itype = idb->get_type(type_index); + + indent(out, indent_level) + << "// Pre-initialize self for the constructor\n"; + + if (!is_constructor || (return_flags & RF_int) == 0) { + // This is not a constructor, but somehow we landed up here at a + // static method requiring a 'self' pointer. This happens in + // coercion constructors in particular. We'll have to create + // a temporary PyObject instance to pass to it. + + indent(out, indent_level) + << "PyObject *self = Dtool_new_" + << make_safe_name(itype.get_scoped_name()) << "(&" + << CLASS_PREFIX << make_safe_name(itype.get_scoped_name()) + << "._PyType, NULL, NULL);\n"; + + extra_cleanup << "PyObject_Del(self);\n"; + } else { + //XXX rdb: this isn't needed, is it, because tp_new already + // initializes the instance? + indent(out, indent_level) + << "DTool_PyInit_Finalize(self, NULL, &" + << CLASS_PREFIX << make_safe_name(itype.get_scoped_name()) + << ", false, false);\n"; + } + } + string return_expr; - if (!remap->_void_return && - remap->_return_type->new_type_is_atomic_string()) { + if (remap->_blocking) { + // With SIMPLE_THREADS, it's important that we never release the + // interpreter lock. + out << "#if defined(HAVE_THREADS) && !defined(SIMPLE_THREADS)\n"; + indent(out, indent_level) + << "PyThreadState *_save;\n"; + indent(out, indent_level) + << "Py_UNBLOCK_THREADS\n"; + out << "#endif // HAVE_THREADS && !SIMPLE_THREADS\n"; + } + if (track_interpreter) { + indent(out, indent_level) << "in_interpreter = 0;\n"; + } + + // If the function returns a pointer that we may need to manage, we store + // it in a temporary return_value variable and set this to true. + bool manage_return = false; + + if (remap->_return_type->new_type_is_atomic_string()) { // Treat strings as a special case. We don't want to format the // return expression. - if (remap->_blocking) { - // With SIMPLE_THREADS, it's important that we never release the - // interpreter lock. - out << "#if defined(HAVE_THREADS) && !defined(SIMPLE_THREADS)\n"; - indent(out, indent_level) - << "PyThreadState *_save;\n"; - indent(out, indent_level) - << "Py_UNBLOCK_THREADS\n"; - out << "#endif // HAVE_THREADS && !SIMPLE_THREADS\n"; - } - if (track_interpreter) { - indent(out, indent_level) << "in_interpreter = 0;\n"; - } - string tt; return_expr = remap->call_function(out, indent_level, false, container, pexprs); CPPType *type = remap->_return_type->get_orig_type(); indent(out, indent_level); type->output_instance(out, "return_value", &parser); - // type->output_instance(tt, "return_value", &parser); out << " = " << return_expr << ";\n"; - - if (track_interpreter) { - indent(out, indent_level) << "in_interpreter = 1;\n"; - } - if (remap->_blocking) { - out << "#if defined(HAVE_THREADS) && !defined(SIMPLE_THREADS)\n"; - indent(out, indent_level) - << "Py_BLOCK_THREADS\n"; - out << "#endif // HAVE_THREADS && !SIMPLE_THREADS\n"; - } - if (!extra_cleanup.empty()) { - indent(out, indent_level) << extra_cleanup << "\n"; - } - - return_expr = manage_return_value(out, 4, remap, "return_value"); + manage_return = remap->_return_value_needs_management; + return_expr = "return_value"; } else { - if (remap->_blocking) { - out << "#if defined(HAVE_THREADS) && !defined(SIMPLE_THREADS)\n"; - indent(out, indent_level) - << "PyThreadState *_save;\n"; - indent(out, indent_level) - << "Py_UNBLOCK_THREADS\n"; - out << "#endif // HAVE_THREADS && !SIMPLE_THREADS\n"; - } - if (track_interpreter) { - indent(out, indent_level) << "in_interpreter = 0;\n"; - } - + // The general case; an ordinary constructor or function. return_expr = remap->call_function(out, indent_level, true, container, pexprs); - if (return_expr.empty()) { - if (track_interpreter) { - indent(out, indent_level) << "in_interpreter = 1;\n"; - } - if (remap->_blocking) { - out << "#if defined(HAVE_THREADS) && !defined(SIMPLE_THREADS)\n"; - indent(out, indent_level) - << "Py_BLOCK_THREADS\n"; - out << "#endif // HAVE_THREADS && !SIMPLE_THREADS\n"; - } - if (!extra_cleanup.empty()) { - indent(out, indent_level) << extra_cleanup << "\n"; - } - if (coercion_possible) { - indent(out, indent_level) - << "Py_XDECREF(coerced);\n"; - } - } else { + if (return_flags & RF_self) { + // We won't be using the return value, anyway. + return_expr.clear(); + } + + if (!return_expr.empty()) { + manage_return = remap->_return_value_needs_management; CPPType *type = remap->_return_type->get_temporary_type(); - if (!is_inplace) { - indent(out, indent_level); - type->output_instance(out, "return_value", &parser); - out << " = " << return_expr << ";\n"; - } - - if (track_interpreter) { - indent(out, indent_level) << "in_interpreter = 1;\n"; - } - if (remap->_blocking) { - out << "#if defined(HAVE_THREADS) && !defined(SIMPLE_THREADS)\n"; - indent(out, indent_level) - << "Py_BLOCK_THREADS\n"; - out << "#endif // HAVE_THREADS && !SIMPLE_THREADS\n"; - } - if (!extra_cleanup.empty()) { - indent(out, indent_level) << extra_cleanup << "\n"; - } - if (coercion_possible) { - indent(out, indent_level) - << "Py_XDECREF(coerced);\n"; - } - if (!is_inplace) { - if (remap->_return_type->return_value_needs_management()) { - // If a constructor returns NULL, that means allocation failed. - indent(out, indent_level) << "if (return_value == NULL) {\n"; - if (return_int) { - indent(out, indent_level) << " PyErr_NoMemory();\n"; - indent(out, indent_level) << " return -1;\n"; - } else { - indent(out, indent_level) << " return PyErr_NoMemory();\n"; - } - indent(out, indent_level) << "}\n"; - } - - return_expr = manage_return_value(out, indent_level, remap, "return_value"); - } - return_expr = remap->_return_type->temporary_to_return(return_expr); + indent(out, indent_level); + type->output_instance(out, "return_value", &parser); + out << " = " << return_expr << ";\n"; + return_expr = "return_value"; } } - // If a method raises TypeError, continue. - //if (check_exceptions) { - if (true) { - indent(out, indent_level) - << "if (PyErr_Occurred()) {\n"; - delete_return_value(out, indent_level + 2, remap, return_expr); - indent(out, indent_level) - << " if (PyErr_ExceptionMatches(PyExc_TypeError)) {\n"; - indent(out, indent_level) - << " // TypeError raised; continue to next overload type.\n"; - indent(out, indent_level) - << " } else {\n"; - if (return_int) { - indent(out, indent_level + 2) - << " return -1;\n"; + // Clean up any memory we might have allocate for parsing the parameters. + while (extra_cleanup.is_text_available()) { + string line = extra_cleanup.get_line(); + if (line.size() == 0 || line[0] == '#') { + out << line << "\n"; } else { - indent(out, indent_level + 2) - << " return (PyObject *)NULL;\n"; + indent(out, indent_level) << line << "\n"; } - indent(out, indent_level) - << " }\n"; - indent(out, indent_level) - << "} else {\n"; - - ++open_scopes; - indent_level += 2; } - // Outputs code to check to see if an assertion has failed while - // the C++ code was executing, and report this failure back to Python. - if (watch_asserts) { - out << "#ifndef NDEBUG\n"; + if (track_interpreter) { + indent(out, indent_level) << "in_interpreter = 1;\n"; + } + if (remap->_blocking) { + out << "#if defined(HAVE_THREADS) && !defined(SIMPLE_THREADS)\n"; indent(out, indent_level) - << "Notify *notify = Notify::ptr();\n"; - indent(out, indent_level) - << "if (notify->has_assert_failed()) {\n"; - indent(out, indent_level + 2) - << "PyErr_SetString(PyExc_AssertionError, notify->get_assert_error_message().c_str());\n"; - indent(out, indent_level + 2) - << "notify->clear_assert_failed();\n"; - delete_return_value(out, indent_level + 2, remap, return_expr); - if (return_int) { - indent(out, indent_level + 2) << "return -1;\n"; + << "Py_BLOCK_THREADS\n"; + out << "#endif // HAVE_THREADS && !SIMPLE_THREADS\n"; + } + + if (manage_return) { + // If a constructor returns NULL, that means allocation failed. + if (remap->_return_type->return_value_needs_management()) { + indent(out, indent_level) << "if (return_value == NULL) {\n"; + if ((return_flags & ~RF_pyobject) == RF_err_null) { + // PyErr_NoMemory returns NULL, so allow tail call elimination. + indent(out, indent_level) << " return PyErr_NoMemory();\n"; + } else { + indent(out, indent_level) << " PyErr_NoMemory();\n"; + error_return(out, indent_level + 2, return_flags); + } + indent(out, indent_level) << "}\n"; + } + + return_expr = manage_return_value(out, indent_level, remap, "return_value"); + return_expr = remap->_return_type->temporary_to_return(return_expr); + } + + // How could we raise a TypeError if we don't take any args? + if (args_type == AT_no_args || max_num_args == 0) { + may_raise_typeerror = false; + } + + // If a function takes a PyObject* argument, it would be a good idea to + // always check for exceptions. + if (may_raise_typeerror) { + check_exceptions = true; + } + + // Generated getters and setters don't raise exceptions or asserts + // since they don't contain any code. + if (remap->_type == FunctionRemap::T_getter || + remap->_type == FunctionRemap::T_setter) { + check_exceptions = false; + } + + // The most common case of the below logic is consolidated in a single + // function, as another way to reduce code bloat. Sigh. + if (check_exceptions && (!may_raise_typeerror || report_errors) && + watch_asserts && (return_flags & RF_coerced) == 0) { + + if (return_flags & RF_decref_args) { + indent(out, indent_level) << "Py_DECREF(args);\n"; + return_flags &= ~RF_decref_args; + } + + // An even specialer special case for functions with void return or + // bool return. We have our own functions that do all this in a + // single function call, so it should reduce the amount of code output + // while not being any slower. + bool return_null = (return_flags & RF_pyobject) != 0 && + (return_flags & RF_err_null) != 0; + if (return_null && return_expr.empty()) { + indent(out, indent_level) + << "return Dtool_Return_None();\n"; + + // Reset the return value bit so that the code below doesn't generate + // the return statement a second time. + return_flags &= ~RF_pyobject; + + } else if (return_null && TypeManager::is_bool(remap->_return_type->get_new_type())) { + indent(out, indent_level) + << "return Dtool_Return_Bool(" << return_expr << ");\n"; + return_flags &= ~RF_pyobject; + } else { - indent(out, indent_level + 2) << "return (PyObject *)NULL;\n"; + indent(out, indent_level) + << "if (Dtool_CheckErrorOccurred()) {\n"; + + if (manage_return) { + delete_return_value(out, indent_level + 2, remap, return_expr); + } + error_return(out, indent_level + 2, return_flags); + + indent(out, indent_level) << "}\n"; } - indent(out, indent_level) - << "}\n"; - out << "#endif\n"; + } else { + if (check_exceptions) { + // Check if a Python exception has occurred. We only do this when + // check_exception is set. If report_errors is set, this method + // must terminate on error. + if (!may_raise_typeerror || report_errors) { + indent(out, indent_level) + << "if (_PyErr_OCCURRED()) {\n"; + } else { + // If a method is some extension method that takes a PyObject*, + // and it raised a TypeError, continue. + // The documentation tells us not to compare the result of + // PyErr_Occurred against a specific exception type. However, in our + // case, this seems okay because we know that the TypeError we want + // to catch here is going to be generated by a PyErr_SetString call, + // not by user code. + indent(out, indent_level) + << "PyObject *exception = _PyErr_OCCURRED();\n"; + indent(out, indent_level) + << "if (exception == PyExc_TypeError) {\n"; + indent(out, indent_level) + << " // TypeError raised; continue to next overload type.\n"; + indent(out, indent_level) + << "} else if (exception != (PyObject *)NULL) {\n"; + } + + if (manage_return) { + delete_return_value(out, indent_level + 2, remap, return_expr); + } + + error_return(out, indent_level + 2, return_flags); + + indent(out, indent_level) + << "} else {\n"; + + ++open_scopes; + indent_level += 2; + } + + if (return_flags & RF_decref_args) { + indent(out, indent_level) << "Py_DECREF(args);\n"; + return_flags &= ~RF_decref_args; + } + + // Outputs code to check to see if an assertion has failed while + // the C++ code was executing, and report this failure back to Python. + // Don't do this for coercion constructors since they are called by + // other wrapper functions which already check this on their own. + if (watch_asserts && (return_flags & RF_coerced) == 0) { + out << "#ifndef NDEBUG\n"; + indent(out, indent_level) + << "Notify *notify = Notify::ptr();\n"; + indent(out, indent_level) + << "if (notify->has_assert_failed()) {\n"; + + if (manage_return) { + // Output code to delete any temporary object we may have allocated. + delete_return_value(out, indent_level + 2, remap, return_expr); + } + + if (return_flags & RF_err_null) { + // This function returns NULL, so we can pass it on. + indent(out, indent_level + 2) + << "return Dtool_Raise_AssertionError();\n"; + } else { + indent(out, indent_level + 2) + << "Dtool_Raise_AssertionError();\n"; + error_return(out, indent_level + 2, return_flags); + } + + indent(out, indent_level) + << "}\n"; + out << "#endif\n"; + } } - if (return_expr.empty()) { - if (return_int) { + // Okay, we're past all the error conditions and special cases. Now + // return the return type in the way that was requested. + if (return_flags & RF_int) { + CPPType *orig_type = remap->_return_type->get_orig_type(); + if (is_constructor) { + // Special case for constructor. + TypeIndex type_index = builder.get_type(TypeManager::unwrap(TypeManager::resolve_type(orig_type)), false); + const InterrogateType &itype = idb->get_type(type_index); + indent(out, indent_level) + << "return DTool_PyInit_Finalize(self, " << return_expr << ", &" << CLASS_PREFIX << make_safe_name(itype.get_scoped_name()) << ", true, false);\n"; + + } else if (TypeManager::is_integer(orig_type)) { + if (return_flags & RF_compare) { + // Make sure it returns -1, 0, or 1, or Python complains with: + // RuntimeWarning: tp_compare didn't return -1, 0 or 1 + indent(out, indent_level) << "return (int)(" << return_expr << " > 0) - (int)(" << return_expr << " < 0);\n"; + } else { + indent(out, indent_level) << "return " << return_expr << ";\n"; + } + + } else if (TypeManager::is_void(orig_type)) { indent(out, indent_level) << "return 0;\n"; + } else { + cerr << "Warning: function has return type " << *orig_type + << ", expected int or void:\n" << expected_params << "\n"; + indent(out, indent_level) << "// Don't know what to do with return type " + << *orig_type << ".\n"; + indent(out, indent_level) << "return 0;\n"; + } + + } else if (return_flags & RF_self) { + indent(out, indent_level) << "Py_INCREF(self);\n"; + indent(out, indent_level) << "return self;\n"; + + } else if (return_flags & RF_pyobject) { + if (return_expr.empty()) { indent(out, indent_level) << "Py_INCREF(Py_None);\n"; indent(out, indent_level) << "return Py_None;\n"; + + } else { + pack_return_value(out, indent_level, remap, return_expr); } - } else { - pack_return_value(out, indent_level, remap, return_expr, is_inplace); + + } else if (return_flags & RF_coerced) { + // We were asked to assign the result to a "coerced" reference. + CPPType *return_type = remap->_cpptype; + CPPType *orig_type = remap->_return_type->get_orig_type(); + + // Special case for static make function that returns a pointer: + // cast the pointer to the right pointer type. + if (!is_constructor && (remap->_flags & FunctionRemap::F_coerce_constructor) != 0 && + (TypeManager::is_pointer(orig_type) || TypeManager::is_pointer_to_base(orig_type))) { + + CPPType *new_type = remap->_return_type->get_new_type(); + + if (TypeManager::is_const_pointer_to_anything(new_type)) { + return_type = CPPType::new_type(new CPPConstType(return_type)); + } + + if (IsPandaTypedObject(return_type->as_struct_type())) { + return_expr = "DCAST(" + + return_type->get_local_name(&parser) + + ", " + return_expr + ")"; + + } else { + return_type = CPPType::new_type(new CPPPointerType(return_type)); + return_expr = "(" + return_type->get_local_name(&parser) + + ") " + return_expr; + } + } + + if (return_expr == "coerced") { + // We already did this earlier... + + } else if (TypeManager::is_reference_count(remap->_cpptype)) { + indent(out, indent_level) << "coerced = MOVE(" << return_expr << ");\n"; + + } else { + indent(out, indent_level) << "coerced = " << return_expr << ";\n"; + indent(out, indent_level) << "manage = true;\n"; + } + + indent(out, indent_level) << "return true;\n"; } // Close the extra braces opened earlier. @@ -3711,6 +5721,103 @@ write_function_instance(ostream &out, InterfaceMaker::Object *obj, --open_scopes; } + + if (clear_error && !report_errors) { + // We were asked not to report errors, so clear the active exception + // if this overload might have raised a TypeError. + indent(out, indent_level) << "PyErr_Clear();\n"; + } + + if (min_version > 0) { + // Close the #if PY_VERSION_HEX check. + out << "#endif\n"; + } +} + +//////////////////////////////////////////////////////////////////// +// Function: InterfaceMakerPythonNative::error_return +// Access: Private +// Description: Outputs the correct return statement that should be +// used in case of error based on the ReturnFlags. +//////////////////////////////////////////////////////////////////// +void InterfaceMakerPythonNative:: +error_return(ostream &out, int indent_level, int return_flags) { + //if (return_flags & RF_coerced) { + // indent(out, indent_level) << "coerced = NULL;\n"; + //} + + if (return_flags & RF_decref_args) { + indent(out, indent_level) << "Py_DECREF(args);\n"; + } + + if (return_flags & RF_int) { + indent(out, indent_level) << "return -1;\n"; + + } else if (return_flags & RF_err_notimplemented) { + indent(out, indent_level) << "Py_INCREF(Py_NotImplemented);\n"; + indent(out, indent_level) << "return Py_NotImplemented;\n"; + + } else if (return_flags & RF_err_null) { + indent(out, indent_level) << "return NULL;\n"; + + } else if (return_flags & RF_err_false) { + indent(out, indent_level) << "return false;\n"; + } +} + +//////////////////////////////////////////////////////////////////// +// Function: InterfaceMakerPythonNative::error_raise_return +// Access: Private +// Description: Similar to error_return, except raises an exception +// before returning. If format_args are not the empty +// string, uses PyErr_Format instead of PyErr_SetString. +//////////////////////////////////////////////////////////////////// +void InterfaceMakerPythonNative:: +error_raise_return(ostream &out, int indent_level, int return_flags, + const string &exc_type, const string &message, + const string &format_args) { + + if (return_flags & RF_decref_args) { + indent(out, indent_level) << "Py_DECREF(args);\n"; + return_flags &= ~RF_decref_args; + } + + if (format_args.empty()) { + if (exc_type == "TypeError") { + if ((return_flags & RF_err_null) != 0) { + // This is probably an over-optimization, but why the heck not. + indent(out, indent_level) << "return Dtool_Raise_TypeError("; + output_quoted(out, indent_level + 29, message, false); + out << ");\n"; + return; + } else { + indent(out, indent_level) << "Dtool_Raise_TypeError("; + output_quoted(out, indent_level + 22, message, false); + out << ");\n"; + } + } else { + indent(out, indent_level) << "PyErr_SetString(PyExc_" << exc_type << ",\n"; + output_quoted(out, indent_level + 16, message); + out << ");\n"; + } + + } else if ((return_flags & RF_err_null) != 0) { + // PyErr_Format always returns NULL. Passing it on directly allows + // the compiler to make a tiny optimization, so why not. + indent(out, indent_level) << "return PyErr_Format(PyExc_" << exc_type << ",\n"; + output_quoted(out, indent_level + 20, message); + out << ",\n"; + indent(out, indent_level + 20) << format_args << ");\n"; + return; + + } else { + indent(out, indent_level) << "PyErr_Format(PyExc_" << exc_type << ",\n"; + output_quoted(out, indent_level + 13, message); + out << ",\n"; + indent(out, indent_level + 13) << format_args << ");\n"; + } + + error_return(out, indent_level, return_flags); } //////////////////////////////////////////////////////////////////// @@ -3721,58 +5828,24 @@ write_function_instance(ostream &out, InterfaceMaker::Object *obj, //////////////////////////////////////////////////////////////////// void InterfaceMakerPythonNative:: pack_return_value(ostream &out, int indent_level, FunctionRemap *remap, - const string &return_expr, bool is_inplace) { + string return_expr) { - if (remap->_type == FunctionRemap::T_constructor) { - // should only reach this in the INIT function a a Class .. IE the PY exists before the CPP object - // this is were we type to returned a class/struct.. ie CPP Type - CPPType *orig_type = remap->_return_type->get_orig_type(); - - TypeIndex type_index = builder.get_type(TypeManager::unwrap(TypeManager::resolve_type(orig_type)), false); - InterrogateDatabase *idb = InterrogateDatabase::get_ptr(); - const InterrogateType &itype = idb->get_type(type_index); - indent(out, indent_level) - << "return DTool_PyInit_Finalize(self, " << return_expr << ", &" << CLASS_PREFIX << make_safe_name(itype.get_scoped_name()) << ", true, false);\n"; - - } else { - ParameterRemap *return_type = remap->_return_type; - pack_python_value(out, indent_level, remap, return_type, return_expr, "", is_inplace); - } -} - -//////////////////////////////////////////////////////////////////// -// Function: InterfaceMakerPythonNative::pack_python_value -// Access: Private -// Description: Outputs a command to pack the indicated expression, -// of the return_type type, as a Python value. -// If assign_to is empty, the Python object is -// returned. Otherwise, it is assigned to a variable -// of that name (expected to already be declared). -//////////////////////////////////////////////////////////////////// -void InterfaceMakerPythonNative:: -pack_python_value(ostream &out, int indent_level, FunctionRemap *remap, - ParameterRemap *return_type, const string &return_expr, - const string &assign_to, bool is_inplace) { + ParameterRemap *return_type = remap->_return_type; CPPType *orig_type = return_type->get_orig_type(); CPPType *type = return_type->get_new_type(); - string assign_stmt("return "); - if (!assign_to.empty()) { - assign_stmt = assign_to + " = "; - } - if (return_type->new_type_is_atomic_string()) { if (TypeManager::is_char_pointer(orig_type)) { indent(out, indent_level) << "if (" << return_expr << " == NULL) {\n"; indent(out, indent_level) << " Py_INCREF(Py_None);\n"; - indent(out, indent_level+2) << assign_stmt << "Py_None;\n"; + indent(out, indent_level) << " return Py_None;\n"; indent(out, indent_level) << "} else {\n"; out << "#if PY_MAJOR_VERSION >= 3\n"; - indent(out, indent_level+2) << assign_stmt + indent(out, indent_level) << " return " << "PyUnicode_FromString(" << return_expr << ");\n"; out << "#else\n"; - indent(out, indent_level+2) << assign_stmt + indent(out, indent_level) << " return " << "PyString_FromString(" << return_expr << ");\n"; out << "#endif\n"; @@ -3781,25 +5854,25 @@ pack_python_value(ostream &out, int indent_level, FunctionRemap *remap, } else if (TypeManager::is_wchar_pointer(orig_type)) { indent(out, indent_level) << "if (" << return_expr << " == NULL) {\n"; indent(out, indent_level) << " Py_INCREF(Py_None);\n"; - indent(out, indent_level+2) << assign_stmt << "Py_None;\n"; + indent(out, indent_level) << " return Py_None;\n"; indent(out, indent_level) << "} else {\n"; indent(out, indent_level+2) - << assign_stmt << "PyUnicode_FromWideChar(" + << "return PyUnicode_FromWideChar(" << return_expr << ", wcslen(" << return_expr << "));\n"; indent(out, indent_level) << "}\n"; } else if (TypeManager::is_wstring(orig_type)) { - indent(out, indent_level) << assign_stmt - << "PyUnicode_FromWideChar(" + indent(out, indent_level) + << "return PyUnicode_FromWideChar(" << return_expr << ".data(), (int) " << return_expr << ".length());\n"; } else if (TypeManager::is_const_ptr_to_basic_string_wchar(orig_type)) { indent(out, indent_level) << "if (" << return_expr << " == NULL) {\n"; indent(out, indent_level) << " Py_INCREF(Py_None);\n"; - indent(out, indent_level+2) << assign_stmt << "Py_None;\n"; + indent(out, indent_level) << " return Py_None;\n"; indent(out, indent_level) << "} else {\n"; - indent(out, indent_level+2) << assign_stmt + indent(out, indent_level) << " return " << "PyUnicode_FromWideChar(" << return_expr << "->data(), (int) " << return_expr << "->length());\n"; @@ -3808,15 +5881,15 @@ pack_python_value(ostream &out, int indent_level, FunctionRemap *remap, } else if (TypeManager::is_const_ptr_to_basic_string_char(orig_type)) { indent(out, indent_level) << "if (" << return_expr<< " == NULL) {\n"; indent(out, indent_level) << " Py_INCREF(Py_None);\n"; - indent(out, indent_level+2) << assign_stmt << "Py_None;\n"; + indent(out, indent_level) << " return Py_None;\n"; indent(out, indent_level) << "} else {\n"; out << "#if PY_MAJOR_VERSION >= 3\n"; - indent(out, indent_level+2) << assign_stmt + indent(out, indent_level) << " return " << "PyUnicode_FromStringAndSize(" << return_expr << "->data(), (Py_ssize_t)" << return_expr << "->length());\n"; out << "#else\n"; - indent(out, indent_level+2) << assign_stmt + indent(out, indent_level) << " return " << "PyString_FromStringAndSize(" << return_expr << "->data(), (Py_ssize_t)" << return_expr << "->length());\n"; out << "#endif\n"; @@ -3825,61 +5898,78 @@ pack_python_value(ostream &out, int indent_level, FunctionRemap *remap, } else { out << "#if PY_MAJOR_VERSION >= 3\n"; - indent(out, indent_level) << assign_stmt - << "PyUnicode_FromStringAndSize(" + indent(out, indent_level) + << "return PyUnicode_FromStringAndSize(" << return_expr << ".data(), (Py_ssize_t)" << return_expr << ".length());\n"; out << "#else\n"; - indent(out, indent_level) << assign_stmt - << "PyString_FromStringAndSize(" + indent(out, indent_level) + << "return PyString_FromStringAndSize(" << return_expr << ".data(), (Py_ssize_t)" << return_expr << ".length());\n"; out << "#endif\n"; } } else if (TypeManager::is_bool(type)) { - indent(out, indent_level) << assign_stmt - << "PyBool_FromLong(" << return_expr << ");\n"; + indent(out, indent_level) + << "return PyBool_FromLong(" << return_expr << ");\n"; + + } else if (TypeManager::is_size(type)) { + indent(out, indent_level) + << "return PyLongOrInt_FromSize_t(" << return_expr << ");\n"; + + } else if (TypeManager::is_char(type)) { + out << "#if PY_MAJOR_VERSION >= 3\n"; + indent(out, indent_level) + << "return PyUnicode_FromStringAndSize(&" << return_expr << ", 1);\n"; + out << "#else\n"; + indent(out, indent_level) + << "return PyString_FromStringAndSize(&" << return_expr << ", 1);\n"; + out << "#endif\n"; + + } else if (TypeManager::is_wchar(type)) { + indent(out, indent_level) + << "return PyUnicode_FromWideChar(&" << return_expr << ", 1);\n"; } else if (TypeManager::is_unsigned_longlong(type)) { - indent(out, indent_level) << assign_stmt - << "PyLong_FromUnsignedLongLong(" << return_expr << ");\n"; + indent(out, indent_level) + << "return PyLong_FromUnsignedLongLong(" << return_expr << ");\n"; } else if (TypeManager::is_longlong(type)) { - indent(out, indent_level) << assign_stmt - << "PyLong_FromLongLong(" << return_expr << ");\n"; + indent(out, indent_level) + << "return PyLong_FromLongLong(" << return_expr << ");\n"; } else if (TypeManager::is_unsigned_integer(type)){ out << "#if PY_MAJOR_VERSION >= 3\n"; - indent(out, indent_level) << assign_stmt - << "PyLong_FromUnsignedLong(" << return_expr << ");\n"; + indent(out, indent_level) + << "return PyLong_FromUnsignedLong(" << return_expr << ");\n"; out << "#else\n"; - indent(out, indent_level) << assign_stmt - << "PyLongOrInt_FromUnsignedLong(" << return_expr << ");\n"; + indent(out, indent_level) + << "return PyLongOrInt_FromUnsignedLong(" << return_expr << ");\n"; out << "#endif\n"; } else if (TypeManager::is_integer(type)) { out << "#if PY_MAJOR_VERSION >= 3\n"; - indent(out, indent_level) << assign_stmt - << "PyLong_FromLong(" << return_expr << ");\n"; + indent(out, indent_level) + << "return PyLong_FromLong(" << return_expr << ");\n"; out << "#else\n"; - indent(out, indent_level) << assign_stmt - << "PyInt_FromLong(" << return_expr << ");\n"; + indent(out, indent_level) + << "return PyInt_FromLong(" << return_expr << ");\n"; out << "#endif\n"; } else if (TypeManager::is_float(type)) { - indent(out, indent_level) << assign_stmt - << "PyFloat_FromDouble(" << return_expr << ");\n"; + indent(out, indent_level) + << "return PyFloat_FromDouble(" << return_expr << ");\n"; } else if (TypeManager::is_char_pointer(type)) { indent(out, indent_level) << "if (" << return_expr << " == NULL) {\n"; indent(out, indent_level) << " Py_INCREF(Py_None);\n"; - indent(out, indent_level+2) << assign_stmt << "Py_None;\n"; + indent(out, indent_level) << " return Py_None;\n"; indent(out, indent_level) << "} else {\n"; out << "#if PY_MAJOR_VERSION >= 3\n"; - indent(out, indent_level+2) << assign_stmt + indent(out, indent_level) << " return " << "PyUnicode_FromString(" << return_expr << ");\n"; out << "#else\n"; - indent(out, indent_level+2) << assign_stmt + indent(out, indent_level) << " return " << "PyString_FromString(" << return_expr << ");\n"; out << "#endif\n"; @@ -3888,9 +5978,9 @@ pack_python_value(ostream &out, int indent_level, FunctionRemap *remap, } else if (TypeManager::is_wchar_pointer(type)) { indent(out, indent_level) << "if (" << return_expr << " == NULL) {\n"; indent(out, indent_level) << " Py_INCREF(Py_None);\n"; - indent(out, indent_level+2) << assign_stmt << "Py_None;\n"; + indent(out, indent_level) << " return Py_None;\n"; indent(out, indent_level) << "} else {\n"; - indent(out, indent_level+2) << assign_stmt + indent(out, indent_level) << " return " << "PyUnicode_FromWideChar(" << return_expr << ", wcslen(" << return_expr << "));\n"; @@ -3898,100 +5988,78 @@ pack_python_value(ostream &out, int indent_level, FunctionRemap *remap, } else if (TypeManager::is_pointer_to_PyObject(type)) { indent(out, indent_level) - << assign_stmt << return_expr << ";\n"; + << "return " << return_expr << ";\n"; } else if (TypeManager::is_pointer_to_Py_buffer(type)) { indent(out, indent_level) << "if (" << return_expr << " == NULL) {\n"; indent(out, indent_level) << " Py_INCREF(Py_None);\n"; - indent(out, indent_level+2) << assign_stmt << "Py_None;\n"; + indent(out, indent_level) << " return Py_None;\n"; indent(out, indent_level) << "} else {\n"; - indent(out, indent_level+2) << assign_stmt + indent(out, indent_level) << " return " << "PyMemoryView_FromBuffer(" << return_expr << ");\n"; indent(out, indent_level) << "}\n"; } else if (TypeManager::is_pointer(type)) { - string const_flag; - if (TypeManager::is_const_pointer_to_anything(type)) { - const_flag = "true"; - } else { - const_flag = "false"; + bool is_const = TypeManager::is_const_pointer_to_anything(type); + bool owns_memory = remap->_return_value_needs_management; + + // Note, we don't check for NULL here any more. This is now done by the + // appropriate CreateInstance(Typed) function. + + if (manage_reference_counts && TypeManager::is_pointer_to_base(orig_type)) { + // Use a trick to transfer the reference count to avoid a pair of + // unnecessary ref() and unref() calls. Ideally we'd use move + // semantics, but py_panda.cxx cannot make use of PointerTo. + indent(out, indent_level) << "// Transfer ownership of return_value.\n"; + indent(out, indent_level); + type->output_instance(out, "return_ptr", &parser); + out << " = " << return_expr << ";\n"; + indent(out, indent_level) << "return_value.cheat() = NULL;\n"; + return_expr = "return_ptr"; } - if (TypeManager::is_struct(orig_type) || TypeManager::is_ref_to_anything(orig_type)) { - if (TypeManager::is_ref_to_anything(orig_type)) { - TypeIndex type_index = builder.get_type(TypeManager::unwrap(TypeManager::resolve_type(type)),false); - InterrogateDatabase *idb = InterrogateDatabase::get_ptr(); - const InterrogateType &itype = idb->get_type(type_index); - std::string owns_memory_flag("true"); + InterrogateDatabase *idb = InterrogateDatabase::get_ptr(); - if (remap->_return_value_needs_management) { - owns_memory_flag = "true"; - } else { - owns_memory_flag = "false"; - } + if (TypeManager::is_struct(orig_type) || TypeManager::is_ref_to_anything(orig_type)) { + if (TypeManager::is_ref_to_anything(orig_type) || remap->_manage_reference_count) { + TypeIndex type_index = builder.get_type(TypeManager::unwrap(TypeManager::resolve_type(type)),false); + const InterrogateType &itype = idb->get_type(type_index); if (!isExportThisRun(itype._cpptype)) { - _external_imports.insert(make_safe_name(itype.get_scoped_name())); + _external_imports.insert(itype._cpptype); } - write_python_instance(out, indent_level, return_expr, assign_to, owns_memory_flag, itype.get_scoped_name(), itype._cpptype, is_inplace, const_flag); + write_python_instance(out, indent_level, return_expr, owns_memory, itype.get_scoped_name(), itype._cpptype, is_const); } else { - std::string owns_memory_flag("true"); - if (remap->_return_value_needs_management) { - owns_memory_flag = "true"; - } else { - owns_memory_flag = "false"; + TypeIndex type_index = builder.get_type(TypeManager::unwrap(TypeManager::resolve_type(orig_type)),false); + const InterrogateType &itype = idb->get_type(type_index); + + if (!isExportThisRun(itype._cpptype)) { + _external_imports.insert(itype._cpptype); } - if (remap->_manage_reference_count) { - TypeIndex type_index = builder.get_type(TypeManager::unwrap(TypeManager::resolve_type(type)),false); - InterrogateDatabase *idb = InterrogateDatabase::get_ptr(); - const InterrogateType &itype = idb->get_type(type_index); - - if (!isExportThisRun(itype._cpptype)) { - _external_imports.insert(make_safe_name(itype.get_scoped_name())); - } - - write_python_instance(out, indent_level, return_expr, assign_to, owns_memory_flag, itype.get_scoped_name(), itype._cpptype, is_inplace, const_flag); - } else { - TypeIndex type_index = builder.get_type(TypeManager::unwrap(TypeManager::resolve_type(orig_type)),false); - InterrogateDatabase *idb = InterrogateDatabase::get_ptr(); - const InterrogateType &itype = idb->get_type(type_index); - - if (!isExportThisRun(itype._cpptype)) { - _external_imports.insert(make_safe_name(itype.get_scoped_name())); - } - - write_python_instance(out, indent_level, return_expr, assign_to, owns_memory_flag, itype.get_scoped_name(), itype._cpptype, is_inplace, const_flag); - } + write_python_instance(out, indent_level, return_expr, owns_memory, itype.get_scoped_name(), itype._cpptype, is_const); } } else if (TypeManager::is_struct(orig_type->as_pointer_type()->_pointing_at)) { TypeIndex type_index = builder.get_type(TypeManager::unwrap(TypeManager::resolve_type(orig_type)),false); - InterrogateDatabase *idb = InterrogateDatabase::get_ptr(); const InterrogateType &itype = idb->get_type(type_index); - std::string owns_memory_flag("true"); - if (remap->_return_value_needs_management) { - owns_memory_flag = "true"; - } else { - owns_memory_flag = "false"; - } - if (!isExportThisRun(itype._cpptype)) { - _external_imports.insert(make_safe_name(itype.get_scoped_name())); + _external_imports.insert(itype._cpptype); } - write_python_instance(out, indent_level, return_expr, assign_to, owns_memory_flag, itype.get_scoped_name(), itype._cpptype, is_inplace, const_flag); + write_python_instance(out, indent_level, return_expr, owns_memory, itype.get_scoped_name(), itype._cpptype, is_const); } else { - indent(out, indent_level) << " Should Never Reach This InterfaceMakerPythonNative::pack_python_value"; - //<< "return PyInt_FromLong((int) " << return_expr << ");\n"; + indent(out, indent_level) << "Should Never Reach This InterfaceMakerPythonNative::pack_python_value"; + //<< "return PyLongOrInt_FromLong((int) " << return_expr << ");\n"; } + } else { // Return None. indent(out, indent_level) - << assign_stmt << "Py_BuildValue(\"\");\n"; + << "return Py_BuildValue(\"\");\n"; } } @@ -4003,17 +6071,48 @@ pack_python_value(ostream &out, int indent_level, FunctionRemap *remap, //////////////////////////////////////////////////////////////////// void InterfaceMakerPythonNative:: write_make_seq(ostream &out, Object *obj, const std::string &ClassName, - MakeSeq *make_seq) { + const std::string &cClassName, MakeSeq *make_seq) { out << "/******************************************************************\n" << " * Python make_seq wrapper\n"; out << " *******************************************************************/\n"; out << "static PyObject *" << make_seq->_name + "(PyObject *self, PyObject *) {\n"; - string num_name = methodNameFromCppName(make_seq->_num_name, ClassName, false); string element_name = methodNameFromCppName(make_seq->_element_name, ClassName, false); - out << " return make_list_for_item(self, \"" << num_name - << "\", \"" << element_name << "\");\n"; - out << "}\n"; + // This used to be a list. But it should really be a tuple, I think, + // because it probably makes more sense for it to be immutable (as + // changes to it won't be visible on the C++ side anyway). + + out << " " << cClassName << " *local_this = NULL;\n" + << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n" + << " return NULL;\n" + << " }\n" + << "\n" + << " PyObject *getter = PyObject_GetAttrString(self, \"" << element_name << "\");\n" + << " if (getter == (PyObject *)NULL) {\n" + << " return NULL;\n" + << " }\n" + << "\n" + << " Py_ssize_t count = (Py_ssize_t)local_this->" << make_seq->_num_name << "();\n" + << " PyObject *tuple = PyTuple_New(count);\n" + << "\n" + << " for (Py_ssize_t i = 0; i < count; ++i) {\n" + << "#if PY_MAJOR_VERSION >= 3\n" + << " PyObject *index = PyLong_FromSsize_t(i);\n" + << "#else\n" + << " PyObject *index = PyInt_FromSsize_t(i);\n" + << "#endif\n" + << " PyObject *value = PyObject_CallFunctionObjArgs(getter, index, NULL);\n" + << " PyTuple_SET_ITEM(tuple, i, value);\n" + << " Py_DECREF(index);\n" + << " }\n" + << "\n" + << " if (Dtool_CheckErrorOccurred()) {\n" + << " Py_DECREF(tuple);\n" + << " return NULL;\n" + << " }\n" + << " return tuple;\n" + << "}\n" + << "\n"; } //////////////////////////////////////////////////////////////////// @@ -4092,7 +6191,7 @@ record_object(TypeIndex type_index) { function = record_function(base_type, itype.derivation_get_downcast(di)); if (is_function_legal(function)) { - Object * pobject = record_object(base_type_index); + Object *pobject = record_object(base_type_index); if (pobject != NULL) { pobject->_methods.push_back(function); } @@ -4215,25 +6314,32 @@ is_cpp_type_legal(CPPType *in_ctype) { return false; } - if (builder.in_ignoretype(in_ctype->get_local_name(&parser))) { + string name = in_ctype->get_local_name(&parser); + + if (builder.in_ignoretype(name)) { return false; } - //bool answer = false; - CPPType *type = TypeManager::unwrap(TypeManager::resolve_type(in_ctype)); - type = TypeManager::unwrap(type); - //CPPType *type = ctype; + if (builder.in_forcetype(name)) { + return true; + } - if (TypeManager::is_basic_string_char(type)) { + //bool answer = false; + CPPType *type = TypeManager::resolve_type(in_ctype); + type = TypeManager::unwrap(type); + + if (TypeManager::is_void(type)) { + return true; + } else if (TypeManager::is_basic_string_char(type)) { return true; } else if (TypeManager::is_basic_string_wchar(type)) { return true; } else if (TypeManager::is_simple(type)) { return true; - } else if (builder.in_forcetype(type->get_local_name(&parser))) { + } else if (TypeManager::is_pointer_to_simple(type)) { + return true; + } else if (TypeManager::is_exported(type)) { return true; - } else if (TypeManager::IsExported(type)) { - return true; } else if (TypeManager::is_pointer_to_PyObject(in_ctype)) { return true; } else if (TypeManager::is_pointer_to_Py_buffer(in_ctype)) { @@ -4245,25 +6351,28 @@ is_cpp_type_legal(CPPType *in_ctype) { return false; } -////////////////////////////////////////////// +////////////////////////////////////////////// // Function :isExportThisRun // -////////////////////////////////////////////// +////////////////////////////////////////////// bool InterfaceMakerPythonNative:: isExportThisRun(CPPType *ctype) { - CPPType *type = TypeManager::unwrap(ctype); - if (TypeManager::IsLocal(type)) { + if (builder.in_forcetype(ctype->get_local_name(&parser))) { return true; } - if (builder.in_forcetype(type->get_local_name(&parser))) { + if (!TypeManager::is_exported(ctype)) { + return false; + } + + if (TypeManager::is_local(ctype)) { return true; } return false; } -////////////////////////////////////////////// +////////////////////////////////////////////// // Function : isExportThisRun ///////////////////////////////////////////// bool InterfaceMakerPythonNative:: @@ -4273,7 +6382,7 @@ isExportThisRun(Function *func) { } Function::Remaps::const_iterator ri; - for (ri = func->_remaps.begin(); ri != func->_remaps.end(); ++ri) { + for (ri = func->_remaps.begin(); ri != func->_remaps.end();) { FunctionRemap *remap = (*ri); return isExportThisRun(remap->_cpptype); } @@ -4281,7 +6390,7 @@ isExportThisRun(Function *func) { return false; } -////////////////////////////////////////////// +////////////////////////////////////////////// // Function : is_remap_legal ////////////////////////////////////////////// bool InterfaceMakerPythonNative:: @@ -4296,6 +6405,12 @@ is_remap_legal(FunctionRemap *remap) { return false; } + // We don't currently support returning pointers, but we accept + // them as function parameters. + if (TypeManager::is_pointer_to_simple(remap->_return_type->get_orig_type())) { + return false; + } + // ouch .. bad things will happen here .. do not even try.. if (remap->_ForcedVoidReturn) { return false; @@ -4313,6 +6428,110 @@ is_remap_legal(FunctionRemap *remap) { return true; } +////////////////////////////////////////////// +// Function : has_coerce_constructor +// Returns 1 if coerce constructor +// returns const, 2 if non-const. +////////////////////////////////////////////// +int InterfaceMakerPythonNative:: +has_coerce_constructor(CPPStructType *type) { + if (type == NULL) { + return 0; + } + + CPPScope *scope = type->get_scope(); + if (scope == NULL) { + return 0; + } + + int result = 0; + + CPPScope::Functions::iterator fgi; + for (fgi = scope->_functions.begin(); fgi != scope->_functions.end(); ++fgi) { + CPPFunctionGroup *fgroup = fgi->second; + + CPPFunctionGroup::Instances::iterator ii; + for (ii = fgroup->_instances.begin(); ii != fgroup->_instances.end(); ++ii) { + CPPInstance *inst = (*ii); + CPPFunctionType *ftype = inst->_type->as_function_type(); + if (ftype == NULL) { + continue; + } + if (inst->_storage_class & CPPInstance::SC_explicit) { + // Skip it if it is marked not to allow coercion. + continue; + } + + if (inst->_vis > min_vis) { + // Not published. + continue; + } + + CPPParameterList::Parameters ¶ms = ftype->_parameters->_parameters; + if (params.size() == 0) { + // It's useless if it doesn't take any parameters. + continue; + } + + if (ftype->_flags & CPPFunctionType::F_constructor) { + if (params.size() == 1 && + TypeManager::unwrap(params[0]->_type) == type) { + // Skip a copy constructor. + continue; + } else { + return 2; + } + + } else if (fgroup->_name == "make" && (inst->_storage_class & CPPInstance::SC_static) != 0) { + if (TypeManager::is_const_pointer_or_ref(ftype->_return_type)) { + result = 1; + } else { + return 2; + } + } + } + } + + return result; +} + +////////////////////////////////////////////// +// Function : is_remap_coercion_possible +////////////////////////////////////////////// +bool InterfaceMakerPythonNative:: +is_remap_coercion_possible(FunctionRemap *remap) { + if (remap == NULL) { + return false; + } + + int pn = 0; + if (remap->_has_this) { + // Skip the "this" parameter. It's never coercible. + ++pn; + } + while (pn < (int)remap->_parameters.size()) { + CPPType *type = remap->_parameters[pn]._remap->get_new_type(); + + if (TypeManager::is_char_pointer(type)) { + } else if (TypeManager::is_wchar_pointer(type)) { + } else if (TypeManager::is_pointer_to_PyObject(type)) { + } else if (TypeManager::is_pointer_to_Py_buffer(type)) { + } else if (TypeManager::is_pointer_to_simple(type)) { + } else if (TypeManager::is_pointer(type)) { + // This is a pointer to an object, so we + // might be able to coerce a parameter to it. + CPPType *obj_type = TypeManager::unwrap(TypeManager::resolve_type(type)); + if (has_coerce_constructor(obj_type->as_struct_type()) > 0) { + // It has a coercion constructor, so go for it. + return true; + } + } + ++pn; + } + + return false; +} + //////////////////////////////////////////////////////////////////////// // Function : is_function_legal //////////////////////////////////////////////////////////////////////// @@ -4450,7 +6669,7 @@ HasAGetClassTypeFunction(const InterrogateType &itype_class) { if (cppfunc != NULL && cppfunc->_return_type != NULL && cppfunc->_parameters != NULL) { CPPType *ret_type = TypeManager::unwrap(cppfunc->_return_type); - if (TypeManager::is_struct(ret_type) && + if (TypeManager::is_struct(ret_type) && ret_type->get_simple_name() == "TypeHandle") { if (cppfunc->_parameters->_parameters.size() == 0) { return true; @@ -4473,6 +6692,10 @@ HasAGetClassTypeFunction(const InterrogateType &itype_class) { // Returns 1 if the class defines write(ostream). // // Returns 2 if the class defines write(ostream, int). +// +// Note that if you want specific behavior for Python +// str(), you should just define a __str__ function, +// which maps directly to the appropriate type slot. //////////////////////////////////////////////////////////////////// int InterfaceMakerPythonNative:: NeedsAStrFunction(const InterrogateType &itype_class) { @@ -4542,6 +6765,10 @@ NeedsAStrFunction(const InterrogateType &itype_class) { // // Returns 3 if the class defines an extension // function for python_repr(ostream, string). +// +// Note that defining python_repr is deprecated in +// favor of defining a __repr__ that returns a string, +// which maps directly to the appropriate type slot. //////////////////////////////////////////////////////////////////// int InterfaceMakerPythonNative:: NeedsAReprFunction(const InterrogateType &itype_class) { @@ -4678,11 +6905,12 @@ NeedsARichCompareFunction(const InterrogateType &itype_class) { // string, following the trailing quotation mark. //////////////////////////////////////////////////////////////////// void InterfaceMakerPythonNative:: -output_quoted(ostream &out, int indent_level, const std::string &str) { - indent(out, indent_level) +output_quoted(ostream &out, int indent_level, const std::string &str, + bool first_line) { + indent(out, (first_line ? indent_level : 0)) << '"'; std::string::const_iterator si; - for (si = str.begin(); si != str.end(); ++si) { + for (si = str.begin(); si != str.end();) { switch (*si) { case '"': case '\\': @@ -4690,10 +6918,14 @@ output_quoted(ostream &out, int indent_level, const std::string &str) { break; case '\n': - out << "\\n\"\n"; + out << "\\n\""; + if (++si == str.end()) { + return; + } + out << "\n"; indent(out, indent_level) << '"'; - break; + continue; default: if (!isprint(*si)) { @@ -4703,6 +6935,7 @@ output_quoted(ostream &out, int indent_level, const std::string &str) { out << *si; } } + ++si; } out << '"'; } diff --git a/dtool/src/interrogate/interfaceMakerPythonNative.h b/dtool/src/interrogate/interfaceMakerPythonNative.h index 7c7c35b317..972a589233 100644 --- a/dtool/src/interrogate/interfaceMakerPythonNative.h +++ b/dtool/src/interrogate/interfaceMakerPythonNative.h @@ -31,32 +31,33 @@ class InterfaceMakerPythonNative : public InterfaceMakerPython { public: InterfaceMakerPythonNative(InterrogateModuleDef *def); virtual ~InterfaceMakerPythonNative(); - - + + virtual void write_prototypes(ostream &out, ostream *out_h); void write_prototypes_class(ostream &out, ostream *out_h, Object *obj) ; void write_prototypes_class_external(ostream &out, Object *obj); - + virtual void write_functions(ostream &out); - + virtual void write_module(ostream &out, ostream *out_h, InterrogateModuleDef *def); virtual void write_module_support(ostream &out, ostream *out_h, InterrogateModuleDef *def); - - void write_module_class(ostream &out, Object *cls); - virtual void write_sub_module(ostream &out, Object *obj); - + + void write_module_class(ostream &out, Object *cls); + virtual void write_sub_module(ostream &out, Object *obj); + virtual bool synthesize_this_parameter(); - + virtual bool separate_overloading(); + virtual Object *record_object(TypeIndex type_index); - + protected: virtual string get_wrapper_prefix(); virtual string get_unique_prefix(); - virtual void record_function_wrapper(InterrogateFunction &ifunc, + virtual void record_function_wrapper(InterrogateFunction &ifunc, FunctionWrapperIndex wrapper_index); - + virtual void generate_wrappers(); - + private: // This enum defines the various prototypes that must be generated // for the specialty functions that Python requires, especially for @@ -65,7 +66,7 @@ private: WT_none, WT_no_params, WT_one_param, - WT_numeric_operator, + WT_binary_operator, WT_setattr, WT_getattr, WT_sequence_getitem, @@ -76,8 +77,38 @@ private: WT_getbuffer, WT_releasebuffer, WT_iter_next, - WT_one_or_two_params, WT_ternary_operator, + WT_inplace_binary_operator, + WT_inplace_ternary_operator, + WT_traverse, + WT_compare, + }; + + // This enum is passed to the wrapper generation functions to indicate + // what sort of values the wrapper function is expected to return. + enum ReturnFlags { + // -1 on failure, 0 on success. + RF_int = 0x100, + + // Like RF_int, but special case that it returns -1, 0, or 1. + RF_compare = RF_int | 0x200, + + // Returns the actual return value as PyObject*. + RF_pyobject = 0x010, + + // Returns a reference to self. + RF_self = 0x020, + + // Assign to the coerced argument, in the case of a coercion constructor. + RF_coerced = 0x040, + + // These indicate what should be returned on error. + RF_err_notimplemented = 0x002, + RF_err_null = 0x004, + RF_err_false = 0x008, + + // Decref temporary args object before returning. + RF_decref_args = 0x1000, }; class SlottedFunctionDef { @@ -85,40 +116,58 @@ private: string _answer_location; WrapperType _wrapper_type; int _min_version; + string _wrapper_name; + set _remaps; }; - static bool get_slotted_function_def(Object *obj, Function *func, SlottedFunctionDef &def); + typedef std::map SlottedFunctions; + + static bool get_slotted_function_def(Object *obj, Function *func, FunctionRemap *remap, SlottedFunctionDef &def); + static void write_function_slot(ostream &out, int indent_level, + const SlottedFunctions &slots, + const string &slot, const string &def = "0"); void write_prototype_for_name(ostream &out, Function *func, const std::string &name); void write_prototype_for(ostream &out, Function *func); void write_function_for_top(ostream &out, Object *obj, Function *func); - void write_function_for_name(ostream &out, Object *obj, Function *func, - const std::string &name, - bool coercion_allowed, bool &coercion_attempted, - ArgsType args_type, bool return_int, bool write_comment); - void write_function_forset(ostream &out, Object *obj, Function *func, - std::set &remaps, string &expected_params, - int indent_level, bool inplace, - bool coercion_allowed, bool &coercion_attempted, - ArgsType args_type, bool return_int, + void write_function_for_name(ostream &out, Object *obj, + const Function::Remaps &remaps, + const std::string &name, string &expected_params, + bool coercion_allowed, + ArgsType args_type, int return_flags); + void write_coerce_constructor(ostream &out, Object *obj, bool is_const); + + int collapse_default_remaps(std::map > &map_sets, + int max_required_args); + + void write_function_forset(ostream &out, + const std::set &remaps, + int min_num_args, int max_num_args, + string &expected_params, int indent_level, + bool coercion_allowed, bool report_errors, + ArgsType args_type, int return_flags, + bool check_exceptions = true, + bool verify_const = true, const string &first_expr = string()); - void write_function_instance(ostream &out, Object *obj, Function *func, - FunctionRemap *remap, string &expected_params, - int indent_level, bool is_inplace, - bool coercion_allowed, bool &coercion_attempted, - ArgsType args_type, bool return_int, + void write_function_instance(ostream &out, FunctionRemap *remap, + int min_num_args, int max_num_args, + string &expected_params, int indent_level, + bool coercion_allowed, bool report_errors, + ArgsType args_type, int return_flags, + bool check_exceptions = true, const string &first_pexpr = string()); + void error_return(ostream &out, int indent_level, int return_flags); + void error_raise_return(ostream &out, int indent_level, int return_flags, + const string &exc_type, const string &message, + const string &format_args = ""); void pack_return_value(ostream &out, int indent_level, FunctionRemap *remap, - const std::string &return_expr, bool in_place); - void pack_python_value(ostream &out, int indent_level, FunctionRemap *remap, - ParameterRemap *return_type, const std::string &return_expr, - const std::string &assign_expr, bool in_place); + std::string return_expr); void write_make_seq(ostream &out, Object *obj, const std::string &ClassName, - MakeSeq *make_seq); + const std::string &cClassName, MakeSeq *make_seq); void write_class_prototypes(ostream &out) ; void write_class_declarations(ostream &out, ostream *out_h, Object *obj); @@ -126,7 +175,9 @@ private: public: bool is_remap_legal(FunctionRemap *remap); - bool is_function_legal( Function *func); + int has_coerce_constructor(CPPStructType *type); + bool is_remap_coercion_possible(FunctionRemap *remap); + bool is_function_legal(Function *func); bool is_cpp_type_legal(CPPType *ctype); bool isExportThisRun(CPPType *ctype); bool isExportThisRun(Function *func); @@ -145,17 +196,18 @@ public: void get_valid_child_classes(std::map &answer, CPPStructType *inclass, const std::string &upcast_seed = "", bool can_downcast = true); bool DoesInheritFromIsClass(const CPPStructType * inclass, const std::string &name); bool IsPandaTypedObject(CPPStructType * inclass) { return DoesInheritFromIsClass(inclass,"TypedObject"); }; - void write_python_instance(ostream &out, int indent_level, const std::string &return_expr, const std::string &assign_expr, std::string &owns_memory_flag, const std::string &class_name, CPPType *ctype, bool inplace, const std::string &const_flag); + void write_python_instance(ostream &out, int indent_level, const std::string &return_expr, bool owns_memory, const std::string &class_name, CPPType *ctype, bool is_const); string HasAGetKeyFunction(const InterrogateType &itype_class); bool HasAGetClassTypeFunction(const InterrogateType &itype_class); int NeedsAStrFunction(const InterrogateType &itype_class); int NeedsAReprFunction(const InterrogateType &itype_class); bool NeedsARichCompareFunction(const InterrogateType &itype_class); - void output_quoted(ostream &out, int indent_level, const std::string &str); - + void output_quoted(ostream &out, int indent_level, const std::string &str, + bool first_line=true); + // stash the forward declarations for this compile pass.. - std::set _external_imports; + std::set _external_imports; }; #endif diff --git a/dtool/src/interrogate/interrogate.cxx b/dtool/src/interrogate/interrogate.cxx index 4649cafa9f..15abba6ac2 100644 --- a/dtool/src/interrogate/interrogate.cxx +++ b/dtool/src/interrogate/interrogate.cxx @@ -46,6 +46,7 @@ bool save_unique_names = false; bool no_database = false; bool generate_spam = false; bool left_inheritance_requires_upcast = true; +bool mangle_names = true; CPPVisibility min_vis = V_published; string library_name; string module_name; diff --git a/dtool/src/interrogate/interrogate.h b/dtool/src/interrogate/interrogate.h index ec05f5f3eb..a7d6ed275d 100644 --- a/dtool/src/interrogate/interrogate.h +++ b/dtool/src/interrogate/interrogate.h @@ -43,9 +43,9 @@ extern bool save_unique_names; extern bool no_database; extern bool generate_spam; extern bool left_inheritance_requires_upcast; +extern bool mangle_names; extern CPPVisibility min_vis; extern string library_name; extern string module_name; #endif - diff --git a/dtool/src/interrogate/interrogateBuilder.cxx b/dtool/src/interrogate/interrogateBuilder.cxx index c46b9f9c1c..6e874462f8 100644 --- a/dtool/src/interrogate/interrogateBuilder.cxx +++ b/dtool/src/interrogate/interrogateBuilder.cxx @@ -40,7 +40,7 @@ #include "cppExtensionType.h" #include "cppStructType.h" #include "cppExpression.h" -#include "cppTypedef.h" +#include "cppTypedefType.h" #include "cppTypeDeclaration.h" #include "cppEnumType.h" #include "cppCommentBlock.h" @@ -286,7 +286,8 @@ build() { } } else if ((*di)->get_subtype() == CPPDeclaration::ST_typedef) { - CPPTypedef *tdef = (*di)->as_typedef(); + CPPTypedefType *tdef = (*di)->as_typedef_type(); + if (tdef->_type->get_subtype() == CPPDeclaration::ST_struct) { // A typedef counts as a declaration. This lets us pick up // most template instantiations. @@ -295,13 +296,16 @@ build() { scan_struct_type(struct_type); } + scan_typedef_type(tdef); + } else if ((*di)->get_subtype() == CPPDeclaration::ST_type_declaration) { CPPType *type = (*di)->as_type_declaration()->_type; + type->_vis = (*di)->_vis; - if (type->get_subtype() == CPPDeclaration::ST_struct) - { - CPPStructType *struct_type =type->as_type()->resolve_type(&parser, &parser)->as_struct_type(); + if (type->get_subtype() == CPPDeclaration::ST_struct) { + CPPStructType *struct_type = + type->as_type()->resolve_type(&parser, &parser)->as_struct_type(); scan_struct_type(struct_type); } else if (type->get_subtype() == CPPDeclaration::ST_enum) { @@ -329,7 +333,8 @@ build() { // Description: Generates all the code necessary to the indicated // output stream. //////////////////////////////////////////////////////////////////// -void InterrogateBuilder::write_code(ostream &out_code,ostream * out_include, InterrogateModuleDef *def) { +void InterrogateBuilder:: +write_code(ostream &out_code,ostream * out_include, InterrogateModuleDef *def) { typedef vector InterfaceMakers; InterfaceMakers makers; @@ -394,9 +399,10 @@ void InterrogateBuilder::write_code(ostream &out_code,ostream * out_include, Int } declaration_bodies << "#include \"py_panda.h\"\n"; declaration_bodies << "#include \"extension.h\"\n"; + declaration_bodies << "#include \"dcast.h\"\n"; } declaration_bodies << "\n"; - + IncludeFiles::const_iterator ifi; for (ifi = _include_files.begin(); ifi != _include_files.end(); @@ -413,7 +419,6 @@ void InterrogateBuilder::write_code(ostream &out_code,ostream * out_include, Int } declaration_bodies << "\n"; - for (mi = makers.begin(); mi != makers.end(); ++mi) { (*mi)->write_includes(declaration_bodies); } @@ -427,8 +432,6 @@ void InterrogateBuilder::write_code(ostream &out_code,ostream * out_include, Int declaration_bodies << "\n"; - - // And now the prototypes. for (mi = makers.begin(); mi != makers.end(); ++mi) { (*mi)->write_prototypes(declaration_bodies,out_include); @@ -438,21 +441,19 @@ void InterrogateBuilder::write_code(ostream &out_code,ostream * out_include, Int // if(out_include != NULL) // (*out_include) << declaration_bodies.str(); // else - out_code << declaration_bodies.str(); + out_code << declaration_bodies.str(); - // Followed by the function bodies. out_code << function_bodies.str() << "\n"; - for (mi = makers.begin(); mi != makers.end(); ++mi) { - (*mi)->write_module_support(out_code,out_include,def); - } - + for (mi = makers.begin(); mi != makers.end(); ++mi) { + (*mi)->write_module_support(out_code, out_include, def); + } if (output_module_specific) { // Output whatever stuff we should output if this were a module. for (mi = makers.begin(); mi != makers.end(); ++mi) { - (*mi)->write_module(out_code,out_include, def); + (*mi)->write_module(out_code, out_include, def); } } @@ -461,7 +462,7 @@ void InterrogateBuilder::write_code(ostream &out_code,ostream * out_include, Int for (mi = makers.begin(); mi != makers.end(); ++mi) { (*mi)->get_function_remaps(remaps); } - + // Make sure all of the function wrappers appear first in the set of // indices, and that they occupy consecutive index numbers, so we // can build a simple array of function pointers by index. @@ -504,7 +505,6 @@ void InterrogateBuilder::write_code(ostream &out_code,ostream * out_include, Int out_code << "};\n\n"; } - if (save_unique_names) { // Write out the table of unique names, in no particular order. out_code << "static InterrogateUniqueNameDef _in_unique_names[" @@ -518,9 +518,6 @@ void InterrogateBuilder::write_code(ostream &out_code,ostream * out_include, Int out_code << "};\n\n"; } -//if(1==2) -{ - if (!no_database) { // Now build the module definition structure to add ourselves to // the global interrogate database. @@ -544,7 +541,7 @@ void InterrogateBuilder::write_code(ostream &out_code,ostream * out_include, Int << " 0, /* num_unique_names */\n"; } - if (output_function_pointers) { + if (output_function_pointers) { out_code << " _in_fptrs,\n" << " " << num_wrappers << ", /* num_fptrs */\n"; } else { @@ -565,7 +562,6 @@ void InterrogateBuilder::write_code(ostream &out_code,ostream * out_include, Int << "}\n\n"; } } -} //////////////////////////////////////////////////////////////////// // Function: InterrogateBuilder::make_module_def @@ -887,6 +883,15 @@ in_ignoreinvolved(CPPType *type) const { return false; } + case CPPDeclaration::ST_typedef: + { + if (in_ignoreinvolved(type->get_simple_name())) { + return true; + } + CPPTypedefType *tdef = type->as_typedef_type(); + return in_ignoreinvolved(tdef->_type); + } + default: return in_ignoreinvolved(type->get_simple_name()); } @@ -1145,7 +1150,7 @@ scan_function(CPPInstance *function) { } get_function(function, "", - (CPPStructType *)NULL, scope, + (CPPStructType *)NULL, scope, InterrogateFunction::F_global); } @@ -1181,8 +1186,7 @@ scan_struct_type(CPPStructType *type) { // Check if any of the members are exported. If none of them are, // and the type itself is not marked for export, then never mind. - if (type->_vis > min_vis) - { + if (type->_vis > min_vis) { CPPScope *scope = type->_scope; bool any_exported = false; @@ -1192,6 +1196,7 @@ scan_struct_type(CPPStructType *type) { ++di) { if ((*di)->_vis <= min_vis) { any_exported = true; + break; } } @@ -1241,6 +1246,93 @@ scan_enum_type(CPPEnumType *type) { get_type(type, true); } +//////////////////////////////////////////////////////////////////// +// Function: InterrogateBuilder::scan_typedef_type +// Access: Private +// Description: Adds the indicated typedef type to the database, if +// warranted. +//////////////////////////////////////////////////////////////////// +void InterrogateBuilder:: +scan_typedef_type(CPPTypedefType *type) { + if (type == (CPPTypedefType *)NULL) { + return; + } + + // A typedef cannot be a template declaration. + assert(!type->is_template()); + + if (type->_file.is_c_file()) { + // This type declaration appears in a .C file. We can only export + // types defined in a .h file. + return; + } + + if (type->_file._source != CPPFile::S_local || + in_ignorefile(type->_file._filename_as_referenced)) { + // The type is defined in some other package or in an + // ignorable file. + return; + } + + // Do we require explicitly placing BEGIN_PUBLISH/END_PUBLISH + // blocks around typedefs for them to be exported? My thinking is + // that we shoudn't, for now, since we don't require it for structs + // either (we only require it to have published methods). + //if (type->_vis > min_vis) { + // // The wrapped type is not marked to be exported. + // return; + //} + + // Find out what this typedef points to. + CPPType *wrapped_type = type->_type; + bool forced = in_forcetype(wrapped_type->get_local_name(&parser)); + + while (wrapped_type->get_subtype() == CPPDeclaration::ST_typedef) { + wrapped_type = wrapped_type->as_typedef_type()->_type; + forced = forced || in_forcetype(wrapped_type->get_local_name(&parser)); + } + + CPPStructType *struct_type = wrapped_type->as_struct_type(); + if (struct_type == (CPPStructType *)NULL) { + // We only export typedefs to structs, for now. + return; + } + + // Always export typedefs pointing to forced types. + if (!forced) { + if (wrapped_type->_file._source != CPPFile::S_local || + in_ignorefile(wrapped_type->_file._filename_as_referenced)) { + // The wrapped type is defined in some other package or + // in an ignorable file. + return; + } + + // Check if any of the wrapped type's members are published. + // If none of them are, and the wrapped type itself is not + // marked for export, then never mind. + if (struct_type->_vis > min_vis) { + CPPScope *scope = struct_type->_scope; + + bool any_exported = false; + CPPScope::Declarations::const_iterator di; + for (di = scope->_declarations.begin(); + di != scope->_declarations.end() && !any_exported; + ++di) { + if ((*di)->_vis <= min_vis) { + any_exported = true; + break; + } + } + + if (!any_exported) { + return; + } + } + } + + get_type(type, true); +} + //////////////////////////////////////////////////////////////////// // Function: InterrogateBuilder::scan_manifest // Access: Private @@ -1683,6 +1775,11 @@ get_function(CPPInstance *function, string description, return 0; } + TypeIndex class_index = 0; + if (struct_type != (CPPStructType *)NULL) { + class_index = get_type(struct_type, false); + } + string function_name = TypeManager::get_function_name(function); string function_signature = TypeManager::get_function_signature(function); @@ -1698,18 +1795,17 @@ get_function(CPPInstance *function, string description, _functions_by_name.find(function_name); if (tni != _functions_by_name.end()) { FunctionIndex index = (*tni).second; + // It's already here, so update the flags. InterrogateFunction &ifunction = InterrogateDatabase::get_ptr()->update_function(index); - // Not 100% sure why, but there's a case where this happens, - // in a case where a typedef shadowed an actual type. ~rdb nassertr(&ifunction != NULL, 0); ifunction._flags |= flags; // Also, make sure this particular signature is defined. - pair result = + pair result = ifunction._instances->insert(InterrogateFunction::Instances::value_type(function_signature, function)); InterrogateFunction::Instances::iterator ii = result.first; @@ -1764,7 +1860,7 @@ get_function(CPPInstance *function, string description, if (struct_type != (CPPStructType *)NULL) { // The function is a method. ifunction->_flags |= InterrogateFunction::F_method; - ifunction->_class = get_type(struct_type, false); + ifunction->_class = class_index; } if (ftype->_flags & CPPFunctionType::F_unary_op) { @@ -1974,7 +2070,7 @@ get_type(CPPType *type, bool global) { if (true_name.empty()) { // Whoops, it's an anonymous type. That's okay, because we'll // usually only encounter them once anyway, so let's go ahead and - // define it without checking in _types_by_name. + // define it without checking _types_by_name first. } else { TypesByName::const_iterator tni = _types_by_name.find(true_name); @@ -2044,29 +2140,39 @@ get_type(CPPType *type, bool global) { } } - CPPExtensionType *ext_type = type->as_extension_type(); - if (ext_type != (CPPExtensionType *)NULL) { - // If it's an extension type of some kind, it might be scoped. + CPPScope *scope = NULL; + // If it's an extension type or typedef, it might be scoped. + if (CPPTypedefType *td_type = type->as_typedef_type()) { + scope = td_type->_ident->get_scope(&parser, &parser); + + } else if (CPPExtensionType *ext_type = type->as_extension_type()) { if (ext_type->_ident != (CPPIdentifier *)NULL) { - CPPScope *scope = ext_type->_ident->get_scope(&parser, &parser); - while (scope->as_template_scope() != (CPPTemplateScope *)NULL) - { - assert(scope->get_parent_scope() != scope); - scope = scope->get_parent_scope(); - assert(scope != (CPPScope *)NULL); - } - itype._cppscope = scope; + scope = ext_type->_ident->get_scope(&parser, &parser); - if (scope != &parser) { - // We're scoped! - itype._scoped_name = - descope(scope->get_local_name(&parser) + "::" + itype._name); - CPPStructType *struct_type = scope->get_struct_type(); + } else if (CPPEnumType *enum_type = ext_type->as_enum_type()) { + // Special case for anonymous enums. + scope = enum_type->_parent_scope; + } - if (struct_type != (CPPStructType *)NULL) { - itype._flags |= InterrogateType::F_nested; - itype._outer_class = get_type(struct_type, false); - } + } + + if (scope != (CPPScope *)NULL) { + while (scope->as_template_scope() != (CPPTemplateScope *)NULL) { + assert(scope->get_parent_scope() != scope); + scope = scope->get_parent_scope(); + assert(scope != (CPPScope *)NULL); + } + itype._cppscope = scope; + + if (scope != &parser) { + // We're scoped! + itype._scoped_name = + descope(scope->get_local_name(&parser) + "::" + itype._name); + CPPStructType *struct_type = scope->get_struct_type(); + + if (struct_type != (CPPStructType *)NULL) { + itype._flags |= InterrogateType::F_nested; + itype._outer_class = get_type(struct_type, false); } } } @@ -2092,8 +2198,15 @@ get_type(CPPType *type, bool global) { } else if (type->as_extension_type() != (CPPExtensionType *)NULL) { define_extension_type(itype, type->as_extension_type()); + } else if (type->as_typedef_type() != (CPPTypedefType *)NULL) { + define_typedef_type(itype, type->as_typedef_type()); + + } else if (type->as_array_type() != (CPPArrayType *)NULL) { + define_array_type(itype, type->as_array_type()); + } else { - // nout << "Attempt to define invalid type " << true_name << "\n"; + nout << "Attempt to define invalid type " << *type + << " (subtype " << type->get_subtype() << ")\n"; // Remove the type from the database. InterrogateDatabase::get_ptr()->remove_type(index); @@ -2129,6 +2242,16 @@ define_atomic_type(InterrogateType &itype, CPPSimpleType *cpptype) { itype._atomic_token = AT_int; break; + case CPPSimpleType::T_char16_t: + itype._flags |= InterrogateType::F_unsigned; + itype._atomic_token = AT_int; + break; + + case CPPSimpleType::T_char32_t: + itype._flags |= InterrogateType::F_unsigned; + itype._atomic_token = AT_int; + break; + case CPPSimpleType::T_int: if ((cpptype->_flags & CPPSimpleType::F_longlong) != 0) { itype._atomic_token = AT_longlong; @@ -2150,7 +2273,8 @@ define_atomic_type(InterrogateType &itype, CPPSimpleType *cpptype) { break; default: - nout << "Invalid CPPSimpleType: " << (int)cpptype->_type << "\n"; + nout << "Type \"" << *cpptype << "\" has invalid CPPSimpleType: " + << (int)cpptype->_type << "\n"; itype._atomic_token = AT_not_atomic; } @@ -2204,7 +2328,7 @@ define_struct_type(InterrogateType &itype, CPPStructType *cpptype, TypeIndex type_index, bool forced) { if (cpptype->get_simple_name().empty()) { // If the type has no name, forget it. We don't export anonymous - // types. + // structs. return; } @@ -2265,23 +2389,25 @@ define_struct_type(InterrogateType &itype, CPPStructType *cpptype, // A struct type should always be global. itype._flags |= InterrogateType::F_global; - + CPPScope *scope = cpptype->_scope; - + CPPStructType::Derivation::const_iterator bi; for (bi = cpptype->_derivation.begin(); bi != cpptype->_derivation.end(); ++bi) { - const CPPStructType::Base &base = (*bi); - if (base._vis <= V_public) - { + const CPPStructType::Base &base = (*bi); + if (base._vis <= V_public) { CPPType *base_type = TypeManager::resolve_type(base._base, scope); TypeIndex base_index = get_type(base_type, true); - if (base_index == 0) { - nout << *cpptype << " reports a derivation from an invalid type.\n"; + if (base_type != NULL) { + nout << *cpptype << " reports a derivation from invalid type " << *base_type << ".\n"; + } else { + nout << *cpptype << " reports a derivation from an invalid type.\n"; + } } else { InterrogateType::Derivation d; @@ -2289,7 +2415,7 @@ define_struct_type(InterrogateType &itype, CPPStructType *cpptype, d._base = base_index; d._upcast = 0; d._downcast = 0; - + // Do we need to synthesize upcast and downcast functions? bool generate_casts = false; @@ -2297,12 +2423,12 @@ define_struct_type(InterrogateType &itype, CPPStructType *cpptype, if (base._is_virtual) { // We do in the presence of virtual inheritance. generate_casts = true; - + } else if (bi != cpptype->_derivation.begin()) { // Or if we're not talking about the leftmost fork of multiple // inheritance. generate_casts = true; - + } else if (cpptype->_derivation.size() != 1 && left_inheritance_requires_upcast) { // Or even if we are the leftmost fork of multiple @@ -2318,13 +2444,11 @@ define_struct_type(InterrogateType &itype, CPPStructType *cpptype, // pointer, while the parent class won't). generate_casts = true; } - - if (generate_casts) { - + if (generate_casts) { d._upcast = get_cast_function(base_type, cpptype, "upcast"); d._flags |= InterrogateType::DF_upcast; - + if (base._is_virtual) { // If this is a virtual inheritance, we can't write a // downcast. @@ -2371,8 +2495,9 @@ define_struct_type(InterrogateType &itype, CPPStructType *cpptype, CPPExtensionType *nested_type = type->as_extension_type(); assert(nested_type != (CPPExtensionType *)NULL); - // Only try to export named types. - if (nested_type->_ident != (CPPIdentifier *)NULL) { + // For now, we don't allow anonymous structs. + if (nested_type->_ident != (CPPIdentifier *)NULL || + nested_type->as_enum_type() != (CPPEnumType *)NULL) { TypeIndex nested_index = get_type(nested_type, false); itype._nested_types.push_back(nested_index); } @@ -2382,11 +2507,31 @@ define_struct_type(InterrogateType &itype, CPPStructType *cpptype, CPPType *type = (*di)->as_enum_type(); // An anonymous enum type. - if ((*di)->_vis <= min_vis) { + if (type->_vis <= min_vis) { TypeIndex nested_index = get_type(type, false); itype._nested_types.push_back(nested_index); } + } else if ((*di)->get_subtype() == CPPDeclaration::ST_typedef) { + CPPTypedefType *type = (*di)->as_typedef_type(); + + // A nested typedef. Unwrap it to find out what it's pointing to. + CPPType *wrapped_type = type->_type; + + while (wrapped_type->get_subtype() == CPPDeclaration::ST_typedef) { + wrapped_type = wrapped_type->as_typedef_type()->_type; + } + + CPPStructType *struct_type = wrapped_type->as_struct_type(); + if (struct_type != (CPPStructType *)NULL) { + // We only export typedefs to structs, for now. + + if (type->_vis <= min_vis) { + TypeIndex nested_index = get_type(type, false); + itype._nested_types.push_back(nested_index); + } + } + } else if ((*di)->get_subtype() == CPPDeclaration::ST_make_property) { ElementIndex element_index = get_make_property((*di)->as_make_property(), cpptype); itype._elements.push_back(element_index); @@ -2483,7 +2628,7 @@ update_function_comment(CPPInstance *function, CPPScope *scope) { ifunction._comment += comment; // Also update the particular wrapper comment. - InterrogateFunction::Instances::iterator ii = + InterrogateFunction::Instances::iterator ii = ifunction._instances->find(function_signature); if (ii != ifunction._instances->end()) { if ((*ii).second->_leading_comment == NULL || @@ -2505,8 +2650,7 @@ void InterrogateBuilder:: define_method(CPPFunctionGroup *fgroup, InterrogateType &itype, CPPStructType *struct_type, CPPScope *scope) { CPPFunctionGroup::Instances::const_iterator fi; - for (fi = fgroup->_instances.begin(); fi != fgroup->_instances.end(); ++fi) - { + for (fi = fgroup->_instances.begin(); fi != fgroup->_instances.end(); ++fi) { CPPInstance *function = (*fi); define_method(function, itype, struct_type, scope); } @@ -2642,7 +2786,7 @@ void InterrogateBuilder:: define_enum_type(InterrogateType &itype, CPPEnumType *cpptype) { itype._flags |= InterrogateType::F_enum; - CPPScope *scope = &parser; + CPPScope *scope = cpptype->_parent_scope; if (cpptype->_ident != (CPPIdentifier *)NULL) { scope = cpptype->_ident->get_scope(&parser, &parser); } @@ -2683,7 +2827,15 @@ define_enum_type(InterrogateType &itype, CPPEnumType *cpptype) { if (element->_initializer != (CPPExpression *)NULL) { CPPExpression::Result result = element->_initializer->evaluate(); - next_value = result.as_integer(); + + if (result._type == CPPExpression::RT_error) { + nout << "enum value "; + element->output(nout, 0, &parser, true); + nout << " has invalid definition!\n"; + return; + } else { + next_value = result.as_integer(); + } } evalue._value = next_value; itype._enum_values.push_back(evalue); @@ -2692,6 +2844,35 @@ define_enum_type(InterrogateType &itype, CPPEnumType *cpptype) { } } +//////////////////////////////////////////////////////////////////// +// Function: InterrogateBuilder::define_typedef_type +// Access: Private +// Description: Builds up a definition for the indicated typedef. +//////////////////////////////////////////////////////////////////// +void InterrogateBuilder:: +define_typedef_type(InterrogateType &itype, CPPTypedefType *cpptype) { + itype._flags |= InterrogateType::F_typedef; + itype._wrapped_type = get_type(cpptype->_type, false); +} + +//////////////////////////////////////////////////////////////////// +// Function: InterrogateBuilder::define_array_type +// Access: Private +// Description: Builds up a definition for the indicated wrapped type. +//////////////////////////////////////////////////////////////////// +void InterrogateBuilder:: +define_array_type(InterrogateType &itype, CPPArrayType *cpptype) { + itype._flags |= InterrogateType::F_array; + itype._wrapped_type = get_type(cpptype->_element_type, false); + + if (cpptype->_bounds == NULL) { + // This indicates an unsized array. + itype._array_size = -1; + } else { + itype._array_size = cpptype->_bounds->evaluate().as_integer(); + } +} + //////////////////////////////////////////////////////////////////// // Function: InterrogateBuilder::define_extension_type // Access: Private diff --git a/dtool/src/interrogate/interrogateBuilder.h b/dtool/src/interrogate/interrogateBuilder.h index 63a0814abb..a11b5cfaa5 100644 --- a/dtool/src/interrogate/interrogateBuilder.h +++ b/dtool/src/interrogate/interrogateBuilder.h @@ -33,6 +33,8 @@ class CPPConstType; class CPPExtensionType; class CPPStructType; class CPPEnumType; +class CPPTypedefType; +class CPPArrayType; class CPPFunctionType; class CPPScope; class CPPIdentifier; @@ -92,6 +94,7 @@ public: void scan_function(CPPInstance *function); void scan_struct_type(CPPStructType *type); void scan_enum_type(CPPEnumType *type); + void scan_typedef_type(CPPTypedefType *type); void scan_manifest(CPPManifest *manifest); ElementIndex scan_element(CPPInstance *element, CPPStructType *struct_type, CPPScope *scope); @@ -128,6 +131,8 @@ public: void define_method(CPPInstance *function, InterrogateType &itype, CPPStructType *struct_type, CPPScope *scope); void define_enum_type(InterrogateType &itype, CPPEnumType *cpptype); + void define_typedef_type(InterrogateType &itype, CPPTypedefType *cpptype); + void define_array_type(InterrogateType &itype, CPPArrayType *cpptype); void define_extension_type(InterrogateType &itype, CPPExtensionType *cpptype); diff --git a/dtool/src/interrogate/parameterRemapConcreteToPointer.cxx b/dtool/src/interrogate/parameterRemapConcreteToPointer.cxx index d1dd7485fd..92739e96eb 100644 --- a/dtool/src/interrogate/parameterRemapConcreteToPointer.cxx +++ b/dtool/src/interrogate/parameterRemapConcreteToPointer.cxx @@ -43,7 +43,14 @@ ParameterRemapConcreteToPointer(CPPType *orig_type) : //////////////////////////////////////////////////////////////////// void ParameterRemapConcreteToPointer:: pass_parameter(ostream &out, const string &variable_name) { - out << "*" << variable_name; + if (variable_name.size() > 1 && variable_name[0] == '&') { + // Prevent generating something like *¶m + // Also, if this is really some local type, we can presumably + // just move it? + out << "MOVE(" << variable_name.substr(1) << ")"; + } else { + out << "*" << variable_name; + } } //////////////////////////////////////////////////////////////////// diff --git a/dtool/src/interrogate/parameterRemapReferenceToPointer.cxx b/dtool/src/interrogate/parameterRemapReferenceToPointer.cxx index 74e8f80822..ab7137e6bb 100644 --- a/dtool/src/interrogate/parameterRemapReferenceToPointer.cxx +++ b/dtool/src/interrogate/parameterRemapReferenceToPointer.cxx @@ -42,7 +42,16 @@ ParameterRemapReferenceToPointer(CPPType *orig_type) : //////////////////////////////////////////////////////////////////// void ParameterRemapReferenceToPointer:: pass_parameter(ostream &out, const string &variable_name) { - out << "*" << variable_name; + if (variable_name.size() > 1 && variable_name[0] == '&') { + // Prevent generating something like *¶m + // Also, if this is really some local type, we can presumably just + // move it? This is only relevant if this parameter is an rvalue + // reference, but CPPParser can't know that, and it might have an overload + // that takes an rvalue reference. It shouldn't hurt either way. + out << "MOVE(" << variable_name.substr(1) << ")"; + } else { + out << "*" << variable_name; + } } //////////////////////////////////////////////////////////////////// diff --git a/dtool/src/interrogate/parse_file.cxx b/dtool/src/interrogate/parse_file.cxx index 524461b9df..33d99917c6 100644 --- a/dtool/src/interrogate/parse_file.cxx +++ b/dtool/src/interrogate/parse_file.cxx @@ -16,7 +16,7 @@ #include "cppManifest.h" #include "cppStructType.h" #include "cppFunctionGroup.h" -#include "cppTypedef.h" +#include "cppTypedefType.h" #include "cppExpressionParser.h" #include "cppExpression.h" #include "cppType.h" @@ -166,7 +166,7 @@ show_data_members(const string &str) { } void -show_typedefs(const string &str) { +show_nested_types(const string &str) { CPPType *type = parser.parse_type(str); if (type == NULL) { cerr << "Invalid type: " << str << "\n"; @@ -182,12 +182,12 @@ show_typedefs(const string &str) { CPPScope *scope = stype->get_scope(); assert(scope != (CPPScope *)NULL); - cerr << "Typedefs in " << *stype << ":\n"; + cerr << "Nested types in " << *stype << ":\n"; - CPPScope::Typedefs::const_iterator ti; - for (ti = scope->_typedefs.begin(); ti != scope->_typedefs.end(); ++ti) { - CPPTypedef *td = (*ti).second; - cerr << " " << *td << "\n"; + CPPScope::Types::const_iterator ti; + for (ti = scope->_types.begin(); ti != scope->_types.end(); ++ti) { + CPPType *tp = (*ti).second; + cerr << " " << *tp << "\n"; } } @@ -286,8 +286,8 @@ main(int argc, char **argv) { show_methods(remainder); } else if (first_word == "members") { show_data_members(remainder); - } else if (first_word == "typedefs") { - show_typedefs(remainder); + } else if (first_word == "types") { + show_nested_types(remainder); } else { show_type_or_expression(str); } diff --git a/dtool/src/interrogate/typeManager.cxx b/dtool/src/interrogate/typeManager.cxx index c13fca7496..fa78d89664 100644 --- a/dtool/src/interrogate/typeManager.cxx +++ b/dtool/src/interrogate/typeManager.cxx @@ -15,20 +15,20 @@ #include "typeManager.h" #include "interrogate.h" -#include "cppFunctionType.h" -#include "cppFunctionGroup.h" -#include "cppParameterList.h" +#include "cppArrayType.h" #include "cppConstType.h" -#include "cppReferenceType.h" +#include "cppEnumType.h" +#include "cppFunctionGroup.h" +#include "cppFunctionType.h" +#include "cppParameterList.h" #include "cppPointerType.h" +#include "cppReferenceType.h" #include "cppSimpleType.h" #include "cppStructType.h" #include "cppTemplateScope.h" #include "cppTypeDeclaration.h" +#include "cppTypedefType.h" #include "pnotify.h" -#include "cppTypedef.h" -#include "cppEnumType.h" - //////////////////////////////////////////////////////////////////// // Function: TypeManager::resolve_type @@ -45,6 +45,7 @@ resolve_type(CPPType *type, CPPScope *scope) { scope = &parser; } + CPPType *orig_type = type; type = type->resolve_type(scope, &parser); string name = type->get_local_name(&parser); if (name.empty()) { @@ -52,14 +53,19 @@ resolve_type(CPPType *type, CPPScope *scope) { return type; } + // I think I fixed the bug; no need for the below hack any more. + return type; + +/* CPPType *new_type = parser.parse_type(name); if (new_type == (CPPType *)NULL) { - nout << "Type " << name << " is unknown to parser.\n"; + nout << "Type \"" << name << "\" (from " << *orig_type << ") is unknown to parser.\n"; } else { type = new_type->resolve_type(&parser, &parser); } return type; +*/ } //////////////////////////////////////////////////////////////////// @@ -96,6 +102,9 @@ is_assignable(CPPType *type) { return false; + case CPPDeclaration::ST_typedef: + return is_assignable(type->as_typedef_type()->_type); + default: return true; } @@ -117,6 +126,9 @@ is_reference(CPPType *type) { case CPPDeclaration::ST_reference: return is_pointable(type->as_reference_type()->_pointing_at); + case CPPDeclaration::ST_typedef: + return is_reference(type->as_typedef_type()->_type); + default: return false; } @@ -138,6 +150,9 @@ is_ref_to_anything(CPPType *type) { case CPPDeclaration::ST_reference: return true; + case CPPDeclaration::ST_typedef: + return is_ref_to_anything(type->as_typedef_type()->_type); + default: return false; } @@ -158,6 +173,9 @@ is_const_ref_to_anything(CPPType *type) { case CPPDeclaration::ST_reference: return is_const(type->as_reference_type()->_pointing_at); + case CPPDeclaration::ST_typedef: + return is_const_ref_to_anything(type->as_typedef_type()->_type); + default: return false; } @@ -178,6 +196,42 @@ is_const_pointer_to_anything(CPPType *type) { case CPPDeclaration::ST_pointer: return is_const(type->as_pointer_type()->_pointing_at); + case CPPDeclaration::ST_typedef: + return is_const_pointer_to_anything(type->as_typedef_type()->_type); + + default: + return false; + } +} + +//////////////////////////////////////////////////////////////////// +// Function: TypeManager::is_const_pointer_or_ref +// Access: Public, Static +// Description: Returns true if the indicated type is a non-const +// pointer or reference to something, false otherwise. +//////////////////////////////////////////////////////////////////// +bool TypeManager:: +is_const_pointer_or_ref(CPPType *type) { + switch (type->get_subtype()) { + case CPPDeclaration::ST_const: + return is_const_pointer_or_ref(type->as_const_type()->_wrapped_around); + + case CPPDeclaration::ST_pointer: + return is_const(type->as_pointer_type()->_pointing_at); + + case CPPDeclaration::ST_reference: + return is_const(type->as_reference_type()->_pointing_at); + + case CPPDeclaration::ST_typedef: + return is_const_pointer_or_ref(type->as_typedef_type()->_type); + + case CPPDeclaration::ST_struct: + if (type->get_simple_name() == "PointerTo") { + return false; + } else if (type->get_simple_name() == "ConstPointerTo") { + return true; + } + default: return false; } @@ -201,6 +255,16 @@ is_non_const_pointer_or_ref(CPPType *type) { case CPPDeclaration::ST_reference: return !is_const(type->as_reference_type()->_pointing_at); + case CPPDeclaration::ST_typedef: + return is_non_const_pointer_or_ref(type->as_typedef_type()->_type); + + case CPPDeclaration::ST_struct: + if (type->get_simple_name() == "PointerTo") { + return true; + } else if (type->get_simple_name() == "ConstPointerTo") { + return false; + } + default: return false; } @@ -221,6 +285,9 @@ is_pointer(CPPType *type) { case CPPDeclaration::ST_pointer: return is_pointable(type->as_pointer_type()->_pointing_at); + case CPPDeclaration::ST_typedef: + return is_pointer(type->as_typedef_type()->_type); + default: return false; } @@ -238,6 +305,9 @@ is_const(CPPType *type) { case CPPDeclaration::ST_const: return true; + case CPPDeclaration::ST_typedef: + return is_const(type->as_typedef_type()->_type); + default: return false; } @@ -259,6 +329,9 @@ is_struct(CPPType *type) { case CPPDeclaration::ST_extension: return true; + case CPPDeclaration::ST_typedef: + return is_struct(type->as_typedef_type()->_type); + default: return false; } @@ -279,6 +352,9 @@ is_enum(CPPType *type) { case CPPDeclaration::ST_const: return is_enum(type->as_const_type()->_wrapped_around); + case CPPDeclaration::ST_typedef: + return is_enum(type->as_typedef_type()->_type); + default: return false; } @@ -296,6 +372,9 @@ is_const_enum(CPPType *type) { case CPPDeclaration::ST_const: return is_enum(type->as_const_type()->_wrapped_around); + case CPPDeclaration::ST_typedef: + return is_enum(type->as_typedef_type()->_type); + default: return false; } @@ -313,6 +392,9 @@ is_const_ref_to_enum(CPPType *type) { case CPPDeclaration::ST_reference: return is_const_enum(type->as_reference_type()->_pointing_at); + case CPPDeclaration::ST_typedef: + return is_const_ref_to_enum(type->as_typedef_type()->_type); + default: return false; } @@ -331,11 +413,14 @@ is_simple(CPPType *type) { switch (type->get_subtype()) { case CPPDeclaration::ST_simple: case CPPDeclaration::ST_enum: - return true; + return !is_void(type); case CPPDeclaration::ST_const: return is_simple(type->as_const_type()->_wrapped_around); + case CPPDeclaration::ST_typedef: + return is_simple(type->as_typedef_type()->_type); + default: return false; } @@ -353,6 +438,9 @@ is_const_simple(CPPType *type) { case CPPDeclaration::ST_const: return is_simple(type->as_const_type()->_wrapped_around); + case CPPDeclaration::ST_typedef: + return is_const_simple(type->as_typedef_type()->_type); + default: return false; } @@ -371,6 +459,9 @@ is_const_ref_to_simple(CPPType *type) { case CPPDeclaration::ST_reference: return is_const_simple(type->as_reference_type()->_pointing_at); + case CPPDeclaration::ST_typedef: + return is_const_ref_to_simple(type->as_typedef_type()->_type); + default: return false; } @@ -389,6 +480,62 @@ is_ref_to_simple(CPPType *type) { case CPPDeclaration::ST_reference: return is_simple(type->as_reference_type()->_pointing_at); + case CPPDeclaration::ST_typedef: + return is_ref_to_simple(type->as_typedef_type()->_type); + + default: + return false; + } +} + +//////////////////////////////////////////////////////////////////// +// Function: TypeManager::is_simple_array +// Access: Public, Static +// Description: Returns true if the indicated type is an array of +// a simple type. +//////////////////////////////////////////////////////////////////// +bool TypeManager:: +is_simple_array(CPPType *type) { + switch (type->get_subtype()) { + case CPPDeclaration::ST_const: + return is_simple_array(type->as_const_type()->_wrapped_around); + + case CPPDeclaration::ST_array: + return is_simple(type->as_array_type()->_element_type); + + case CPPDeclaration::ST_typedef: + return is_simple_array(type->as_typedef_type()->_type); + + default: + return false; + } +} + +//////////////////////////////////////////////////////////////////// +// Function: TypeManager::is_pointer_to_simple +// Access: Public, Static +// Description: Returns true if the indicated type is a const or +// a non-constant pointer to a simple type. This could +// also be a reference to an array of the simple type. +//////////////////////////////////////////////////////////////////// +bool TypeManager:: +is_pointer_to_simple(CPPType *type) { + switch (type->get_subtype()) { + case CPPDeclaration::ST_const: + return is_pointer_to_simple(type->as_const_type()->_wrapped_around); + + case CPPDeclaration::ST_pointer: + return is_simple(type->as_pointer_type()->_pointing_at); + + case CPPDeclaration::ST_array: + return is_simple(type->as_array_type()->_element_type); + + case CPPDeclaration::ST_reference: + return is_pointer_to_simple(type->as_reference_type()->_pointing_at); + + case CPPDeclaration::ST_typedef: + return is_pointer_to_simple(type->as_typedef_type()->_type); + default: return false; } @@ -414,8 +561,11 @@ is_pointable(CPPType *type) { case CPPDeclaration::ST_struct: return true; - case CPPDeclaration::ST_simple: - return is_char(type); + //case CPPDeclaration::ST_simple: + // return is_char(type); + + case CPPDeclaration::ST_typedef: + return is_pointable(type->as_typedef_type()->_type); default: return false; @@ -444,6 +594,43 @@ is_char(CPPType *type) { } } + case CPPDeclaration::ST_typedef: + return is_char(type->as_typedef_type()->_type); + + default: + break; + } + + return false; +} + +//////////////////////////////////////////////////////////////////// +// Function: TypeManager::is_unsigned_char +// Access: Public, Static +// Description: Returns true if the indicated type is unsigned char, +// but not signed or 'plain' char. +//////////////////////////////////////////////////////////////////// +bool TypeManager:: +is_unsigned_char(CPPType *type) { + switch (type->get_subtype()) { + case CPPDeclaration::ST_const: + return is_unsigned_char(type->as_const_type()->_wrapped_around); + + case CPPDeclaration::ST_simple: + { + CPPSimpleType *simple_type = type->as_simple_type(); + + if (simple_type != (CPPSimpleType *)NULL) { + return + (simple_type->_type == CPPSimpleType::T_char) && + (simple_type->_flags & CPPSimpleType::F_unsigned) != 0; + } + } + break; + + case CPPDeclaration::ST_typedef: + return is_unsigned_char(type->as_typedef_type()->_type); + default: break; } @@ -466,6 +653,75 @@ is_char_pointer(CPPType *type) { case CPPDeclaration::ST_pointer: return is_char(type->as_pointer_type()->_pointing_at); + case CPPDeclaration::ST_typedef: + return is_char_pointer(type->as_typedef_type()->_type); + + default: + return false; + } +} + +//////////////////////////////////////////////////////////////////// +// Function: TypeManager::is_const_char_pointer +// Access: Public, Static +// Description: Returns true if the indicated type is const char*. +//////////////////////////////////////////////////////////////////// +bool TypeManager:: +is_const_char_pointer(CPPType *type) { + switch (type->get_subtype()) { + case CPPDeclaration::ST_const: + return is_const_char_pointer(type->as_const_type()->_wrapped_around); + + case CPPDeclaration::ST_pointer: + return (is_const(type->as_pointer_type()->_pointing_at) && + is_char(type->as_pointer_type()->_pointing_at)); + + case CPPDeclaration::ST_typedef: + return is_const_char_pointer(type->as_typedef_type()->_type); + + default: + return false; + } +} + +//////////////////////////////////////////////////////////////////// +// Function: TypeManager::is_unsigned_char_pointer +// Access: Public, Static +// Description: Returns true if the indicated type is unsigned char* +// or const unsigned char*. +//////////////////////////////////////////////////////////////////// +bool TypeManager:: +is_unsigned_char_pointer(CPPType *type) { + switch (type->get_subtype()) { + case CPPDeclaration::ST_const: + return is_unsigned_char_pointer(type->as_const_type()->_wrapped_around); + + case CPPDeclaration::ST_pointer: + return is_unsigned_char(type->as_pointer_type()->_pointing_at); + + case CPPDeclaration::ST_typedef: + return is_unsigned_char_pointer(type->as_typedef_type()->_type); + + default: + return false; + } +} + +//////////////////////////////////////////////////////////////////// +// Function: TypeManager::is_const_unsigned_char_pointer +// Access: Public, Static +// Description: Returns true if the indicated type is +// const unsigned char*. +//////////////////////////////////////////////////////////////////// +bool TypeManager:: +is_const_unsigned_char_pointer(CPPType *type) { + switch (type->get_subtype()) { + case CPPDeclaration::ST_const: + return is_unsigned_char_pointer(type->as_const_type()->_wrapped_around); + + case CPPDeclaration::ST_typedef: + return is_const_unsigned_char_pointer(type->as_typedef_type()->_type); + default: return false; } @@ -489,6 +745,9 @@ is_basic_string_char(CPPType *type) { case CPPDeclaration::ST_const: return is_basic_string_char(type->as_const_type()->_wrapped_around); + case CPPDeclaration::ST_typedef: + return is_basic_string_char(type->as_typedef_type()->_type); + default: break; } @@ -508,6 +767,9 @@ is_const_basic_string_char(CPPType *type) { case CPPDeclaration::ST_const: return is_basic_string_char(type->as_const_type()->_wrapped_around); + case CPPDeclaration::ST_typedef: + return is_const_basic_string_char(type->as_typedef_type()->_type); + default: return false; } @@ -525,6 +787,9 @@ is_const_ref_to_basic_string_char(CPPType *type) { case CPPDeclaration::ST_reference: return is_const_basic_string_char(type->as_reference_type()->_pointing_at); + case CPPDeclaration::ST_typedef: + return is_const_ref_to_basic_string_char(type->as_typedef_type()->_type); + default: return false; } @@ -542,6 +807,9 @@ is_const_ptr_to_basic_string_char(CPPType *type) { case CPPDeclaration::ST_pointer: return is_const_basic_string_char(type->as_pointer_type()->_pointing_at); + case CPPDeclaration::ST_typedef: + return is_const_ptr_to_basic_string_char(type->as_typedef_type()->_type); + default: return false; } @@ -559,11 +827,14 @@ is_string(CPPType *type) { case CPPDeclaration::ST_reference: return is_const_basic_string_char(type->as_reference_type()->_pointing_at); + case CPPDeclaration::ST_typedef: + return is_string(type->as_typedef_type()->_type); + default: break; } - return is_basic_string_wchar(type); + return is_basic_string_char(type); } //////////////////////////////////////////////////////////////////// @@ -586,6 +857,9 @@ is_wchar(CPPType *type) { } } + case CPPDeclaration::ST_typedef: + return is_wchar(type->as_typedef_type()->_type); + default: break; } @@ -608,6 +882,9 @@ is_wchar_pointer(CPPType *type) { case CPPDeclaration::ST_pointer: return is_wchar(type->as_pointer_type()->_pointing_at); + case CPPDeclaration::ST_typedef: + return is_wchar_pointer(type->as_typedef_type()->_type); + default: return false; } @@ -631,6 +908,9 @@ is_basic_string_wchar(CPPType *type) { case CPPDeclaration::ST_const: return is_basic_string_wchar(type->as_const_type()->_wrapped_around); + case CPPDeclaration::ST_typedef: + return is_basic_string_wchar(type->as_typedef_type()->_type); + default: break; } @@ -650,6 +930,9 @@ is_const_basic_string_wchar(CPPType *type) { case CPPDeclaration::ST_const: return is_basic_string_wchar(type->as_const_type()->_wrapped_around); + case CPPDeclaration::ST_typedef: + return is_const_basic_string_wchar(type->as_typedef_type()->_type); + default: return false; } @@ -667,6 +950,9 @@ is_const_ref_to_basic_string_wchar(CPPType *type) { case CPPDeclaration::ST_reference: return is_const_basic_string_wchar(type->as_reference_type()->_pointing_at); + case CPPDeclaration::ST_typedef: + return is_const_ref_to_basic_string_wchar(type->as_typedef_type()->_type); + default: return false; } @@ -684,6 +970,9 @@ is_const_ptr_to_basic_string_wchar(CPPType *type) { case CPPDeclaration::ST_pointer: return is_const_basic_string_wchar(type->as_pointer_type()->_pointing_at); + case CPPDeclaration::ST_typedef: + return is_const_ptr_to_basic_string_wchar(type->as_typedef_type()->_type); + default: return false; } @@ -701,6 +990,9 @@ is_wstring(CPPType *type) { case CPPDeclaration::ST_reference: return is_const_basic_string_wchar(type->as_reference_type()->_pointing_at); + case CPPDeclaration::ST_typedef: + return is_wstring(type->as_typedef_type()->_type); + default: break; } @@ -730,6 +1022,9 @@ is_bool(CPPType *type) { } break; + case CPPDeclaration::ST_typedef: + return is_bool(type->as_typedef_type()->_type); + default: break; } @@ -761,11 +1056,16 @@ is_integer(CPPType *type) { (simple_type->_type == CPPSimpleType::T_bool || simple_type->_type == CPPSimpleType::T_char || simple_type->_type == CPPSimpleType::T_wchar_t || + simple_type->_type == CPPSimpleType::T_char16_t || + simple_type->_type == CPPSimpleType::T_char32_t || simple_type->_type == CPPSimpleType::T_int); } } break; + case CPPDeclaration::ST_typedef: + return is_integer(type->as_typedef_type()->_type); + default: break; } @@ -794,11 +1094,69 @@ is_unsigned_integer(CPPType *type) { simple_type->_type == CPPSimpleType::T_char || simple_type->_type == CPPSimpleType::T_wchar_t || simple_type->_type == CPPSimpleType::T_int) && - (simple_type->_flags & CPPSimpleType::F_unsigned) != 0); + (simple_type->_flags & CPPSimpleType::F_unsigned) != 0) || + (simple_type->_type == CPPSimpleType::T_char16_t || + simple_type->_type == CPPSimpleType::T_char32_t); } } break; + case CPPDeclaration::ST_typedef: + return is_unsigned_integer(type->as_typedef_type()->_type); + + default: + break; + } + + return false; +} + +//////////////////////////////////////////////////////////////////// +// Function: TypeManager::is_size +// Access: Public, Static +// Description: Returns true if the indicated type is the "size_t" +// type, or a const size_t, or a typedef to either. +//////////////////////////////////////////////////////////////////// +bool TypeManager:: +is_size(CPPType *type) { + switch (type->get_subtype()) { + case CPPDeclaration::ST_const: + return is_size(type->as_const_type()->_wrapped_around); + + case CPPDeclaration::ST_typedef: + if (type->get_simple_name() == "size_t") { + return is_integer(type->as_typedef_type()->_type); + } else { + return is_size(type->as_typedef_type()->_type); + } + + default: + break; + } + + return false; +} + +//////////////////////////////////////////////////////////////////// +// Function: TypeManager::is_ssize +// Access: Public, Static +// Description: Returns true if the indicated type is the "ssize_t" +// type, or a const ssize_t, or a typedef to either. +//////////////////////////////////////////////////////////////////// +bool TypeManager:: +is_ssize(CPPType *type) { + switch (type->get_subtype()) { + case CPPDeclaration::ST_const: + return is_ssize(type->as_const_type()->_wrapped_around); + + case CPPDeclaration::ST_typedef: + if (type->get_simple_name() == "Py_ssize_t" || + type->get_simple_name() == "ssize_t") { + return is_integer(type->as_typedef_type()->_type); + } else { + return is_ssize(type->as_typedef_type()->_type); + } + default: break; } @@ -822,12 +1180,15 @@ is_short(CPPType *type) { { CPPSimpleType *simple_type = type->as_simple_type(); if (simple_type != (CPPSimpleType *)NULL) { - return (simple_type->_type == CPPSimpleType::T_int && + return (simple_type->_type == CPPSimpleType::T_int && (simple_type->_flags & CPPSimpleType::F_short) != 0); } } break; + case CPPDeclaration::ST_typedef: + return is_short(type->as_typedef_type()->_type); + default: break; } @@ -851,12 +1212,15 @@ is_unsigned_short(CPPType *type) { { CPPSimpleType *simple_type = type->as_simple_type(); if (simple_type != (CPPSimpleType *)NULL) { - return (simple_type->_type == CPPSimpleType::T_int && + return (simple_type->_type == CPPSimpleType::T_int && (simple_type->_flags & (CPPSimpleType::F_short | CPPSimpleType::F_unsigned)) == (CPPSimpleType::F_short | CPPSimpleType::F_unsigned)); } } break; + case CPPDeclaration::ST_typedef: + return is_unsigned_short(type->as_typedef_type()->_type); + default: break; } @@ -881,12 +1245,15 @@ is_longlong(CPPType *type) { { CPPSimpleType *simple_type = type->as_simple_type(); if (simple_type != (CPPSimpleType *)NULL) { - return (simple_type->_type == CPPSimpleType::T_int && + return (simple_type->_type == CPPSimpleType::T_int && (simple_type->_flags & CPPSimpleType::F_longlong) != 0); } } break; + case CPPDeclaration::ST_typedef: + return is_longlong(type->as_typedef_type()->_type); + default: break; } @@ -911,12 +1278,15 @@ is_unsigned_longlong(CPPType *type) { { CPPSimpleType *simple_type = type->as_simple_type(); if (simple_type != (CPPSimpleType *)NULL) { - return (simple_type->_type == CPPSimpleType::T_int && + return (simple_type->_type == CPPSimpleType::T_int && (simple_type->_flags & (CPPSimpleType::F_longlong | CPPSimpleType::F_unsigned)) == (CPPSimpleType::F_longlong | CPPSimpleType::F_unsigned)); } } break; + case CPPDeclaration::ST_typedef: + return is_unsigned_longlong(type->as_typedef_type()->_type); + default: break; } @@ -945,6 +1315,9 @@ is_double(CPPType *type) { } break; + case CPPDeclaration::ST_typedef: + return is_double(type->as_typedef_type()->_type); + default: break; } @@ -976,6 +1349,9 @@ is_float(CPPType *type) { } break; + case CPPDeclaration::ST_typedef: + return is_float(type->as_typedef_type()->_type); + default: break; } @@ -1033,6 +1409,9 @@ is_reference_count(CPPType *type) { } break; + case CPPDeclaration::ST_typedef: + return is_reference_count(type->as_typedef_type()->_type); + default: break; } @@ -1055,6 +1434,9 @@ is_reference_count_pointer(CPPType *type) { case CPPDeclaration::ST_pointer: return is_reference_count(type->as_pointer_type()->_pointing_at); + case CPPDeclaration::ST_typedef: + return is_reference_count_pointer(type->as_typedef_type()->_type); + default: return false; } @@ -1096,6 +1478,10 @@ is_pointer_to_base(CPPType *type) { } } } + return false; + + case CPPDeclaration::ST_typedef: + return is_pointer_to_base(type->as_typedef_type()->_type); default: return false; @@ -1114,6 +1500,9 @@ is_const_pointer_to_base(CPPType *type) { case CPPDeclaration::ST_const: return is_pointer_to_base(type->as_const_type()->_wrapped_around); + case CPPDeclaration::ST_typedef: + return is_const_pointer_to_base(type->as_typedef_type()->_type); + default: return false; } @@ -1134,6 +1523,9 @@ is_const_ref_to_pointer_to_base(CPPType *type) { case CPPDeclaration::ST_reference: return is_const_pointer_to_base(type->as_reference_type()->_pointing_at); + case CPPDeclaration::ST_typedef: + return is_const_ref_to_pointer_to_base(type->as_typedef_type()->_type); + default: return false; } @@ -1161,6 +1553,9 @@ is_pair(CPPType *type) { case CPPDeclaration::ST_reference: return is_pair(type->as_reference_type()->_pointing_at); + case CPPDeclaration::ST_typedef: + return is_pair(type->as_typedef_type()->_type); + default: break; } @@ -1182,6 +1577,9 @@ is_pointer_to_PyObject(CPPType *type) { case CPPDeclaration::ST_pointer: return is_PyObject(type->as_pointer_type()->_pointing_at); + case CPPDeclaration::ST_typedef: + return is_pointer_to_PyObject(type->as_typedef_type()->_type); + default: return false; } @@ -1200,13 +1598,64 @@ is_PyObject(CPPType *type) { case CPPDeclaration::ST_extension: case CPPDeclaration::ST_struct: - return (type->get_local_name(&parser) == "PyObject" || - type->get_local_name(&parser) == "PyTypeObject" || - type->get_local_name(&parser) == "PyStringObject" || - type->get_local_name(&parser) == "PyUnicodeObject" || - type->get_local_name(&parser) == "_object" || + return (type->get_local_name(&parser) == "_object" || type->get_local_name(&parser) == "_typeobject"); + case CPPDeclaration::ST_typedef: + return (is_struct(type->as_typedef_type()->_type) && + (type->get_local_name(&parser) == "PyObject" || + type->get_local_name(&parser) == "PyTypeObject" || + type->get_local_name(&parser) == "PyStringObject" || + type->get_local_name(&parser) == "PyUnicodeObject")) || + is_PyObject(type->as_typedef_type()->_type); + + default: + return false; + } +} + +//////////////////////////////////////////////////////////////////// +// Function: TypeManager::is_pointer_to_PyTypeObject +// Access: Public, Static +// Description: Returns true if the indicated type is PyTypeObject *. +//////////////////////////////////////////////////////////////////// +bool TypeManager:: +is_pointer_to_PyTypeObject(CPPType *type) { + switch (type->get_subtype()) { + case CPPDeclaration::ST_const: + return is_pointer_to_PyTypeObject(type->as_const_type()->_wrapped_around); + + case CPPDeclaration::ST_pointer: + return is_PyTypeObject(type->as_pointer_type()->_pointing_at); + + case CPPDeclaration::ST_typedef: + return is_pointer_to_PyTypeObject(type->as_typedef_type()->_type); + + default: + return false; + } +} + +//////////////////////////////////////////////////////////////////// +// Function: TypeManager::is_PyTypeObject +// Access: Public, Static +// Description: Returns true if the indicated type is PyTypeObject. +//////////////////////////////////////////////////////////////////// +bool TypeManager:: +is_PyTypeObject(CPPType *type) { + switch (type->get_subtype()) { + case CPPDeclaration::ST_const: + return is_PyTypeObject(type->as_const_type()->_wrapped_around); + + case CPPDeclaration::ST_extension: + case CPPDeclaration::ST_struct: + return (type->get_local_name(&parser) == "_typeobject"); + + case CPPDeclaration::ST_typedef: + return (type->get_local_name(&parser) == "PyTypeObject" && + is_struct(type->as_typedef_type()->_type)) || + is_PyTypeObject(type->as_typedef_type()->_type); + default: return false; } @@ -1242,9 +1691,10 @@ is_PyStringObject(CPPType *type) { case CPPDeclaration::ST_const: return is_PyStringObject(type->as_const_type()->_wrapped_around); - case CPPDeclaration::ST_extension: - case CPPDeclaration::ST_struct: - return (type->get_local_name(&parser) == "PyStringObject"); + case CPPDeclaration::ST_typedef: + return (type->get_local_name(&parser) == "PyStringObject" && + is_struct(type->as_typedef_type()->_type)) || + is_PyStringObject(type->as_typedef_type()->_type); default: return false; @@ -1281,9 +1731,10 @@ is_PyUnicodeObject(CPPType *type) { case CPPDeclaration::ST_const: return is_PyUnicodeObject(type->as_const_type()->_wrapped_around); - case CPPDeclaration::ST_extension: - case CPPDeclaration::ST_struct: - return (type->get_local_name(&parser) == "PyUnicodeObject"); + case CPPDeclaration::ST_typedef: + return (type->get_local_name(&parser) == "PyUnicodeObject" && + is_struct(type->as_typedef_type()->_type)) || + is_PyUnicodeObject(type->as_typedef_type()->_type); default: return false; @@ -1304,6 +1755,9 @@ is_pointer_to_Py_buffer(CPPType *type) { case CPPDeclaration::ST_pointer: return is_Py_buffer(type->as_pointer_type()->_pointing_at); + case CPPDeclaration::ST_typedef: + return is_pointer_to_Py_buffer(type->as_typedef_type()->_type); + default: return false; } @@ -1324,6 +1778,9 @@ is_Py_buffer(CPPType *type) { case CPPDeclaration::ST_struct: return (type->get_local_name(&parser) == "Py_buffer"); + case CPPDeclaration::ST_typedef: + return is_Py_buffer(type->as_typedef_type()->_type); + default: return false; } @@ -1342,6 +1799,9 @@ bool TypeManager::is_ostream(CPPType *type) { case CPPDeclaration::ST_struct: return (type->get_local_name(&parser) == "ostream"); + case CPPDeclaration::ST_typedef: + return is_ostream(type->as_typedef_type()->_type); + default: return false; } @@ -1364,6 +1824,9 @@ is_pointer_to_ostream(CPPType *type) { case CPPDeclaration::ST_pointer: return is_ostream(type->as_pointer_type()->_pointing_at); + case CPPDeclaration::ST_typedef: + return is_pointer_to_ostream(type->as_typedef_type()->_type); + default: return false; } @@ -1440,6 +1903,9 @@ involves_unpublished(CPPType *type) { } */ + case CPPDeclaration::ST_typedef: + return involves_unpublished(type->as_typedef_type()->_type); + default: if (type->_declaration != (CPPTypeDeclaration *)NULL) { return (type->_declaration->_vis > min_vis); @@ -1486,6 +1952,9 @@ involves_protected(CPPType *type) { return false; } + case CPPDeclaration::ST_typedef: + return involves_protected(type->as_typedef_type()->_type); + default: if (type->_declaration != (CPPTypeDeclaration *)NULL) { return (type->_declaration->_vis > V_public); @@ -1572,8 +2041,8 @@ unwrap_const_reference(CPPType *source_type) { //////////////////////////////////////////////////////////////////// // Function: TypeManager::unwrap // Access: Public, Static -// Description: Removes all const, pointer, and reference wrappers, -// to get to the thing we're talking about. +// Description: Removes all const, pointer, reference wrappers, and +// typedefs, to get to the thing we're talking about. //////////////////////////////////////////////////////////////////// CPPType *TypeManager:: unwrap(CPPType *source_type) { @@ -1587,6 +2056,9 @@ unwrap(CPPType *source_type) { case CPPDeclaration::ST_pointer: return unwrap(source_type->as_pointer_type()->_pointing_at); + case CPPDeclaration::ST_typedef: + return unwrap(source_type->as_typedef_type()->_type); + default: return source_type; } @@ -1645,6 +2117,9 @@ get_template_parameter_type(CPPType *source_type, int i) { case CPPDeclaration::ST_reference: return get_template_parameter_type(source_type->as_reference_type()->_pointing_at, i); + case CPPDeclaration::ST_typedef: + return get_template_parameter_type(source_type->as_typedef_type()->_type); + default: break; } @@ -1657,7 +2132,7 @@ get_template_parameter_type(CPPType *source_type, int i) { // I'm not sure how reliable this is, but I don't know if there // is a more proper way to access this. CPPTemplateParameterList *templ = type->_ident->_names.back().get_templ(); - if (templ == NULL || i >= templ->_parameters.size()) { + if (templ == NULL || i >= (int)templ->_parameters.size()) { return NULL; } @@ -1919,152 +2394,152 @@ has_protected_destructor(CPPType *type) { return false; } //////////////////////////////////////////////////////////////////// -// Function: TypeManager::has_protected_destructor +// Function: TypeManager::is_exported // Access: Public, Static -// Description: Returns true if the destructor for the given class or -// struct is protected or private, or false if the -// destructor is public or absent. +// Description: //////////////////////////////////////////////////////////////////// -bool TypeManager::IsExported(CPPType *in_type) -{ - +bool TypeManager:: +is_exported(CPPType *in_type) { string name = in_type->get_local_name(&parser); if (name.empty()) { - return false; + return false; } - //return true; + // this question is about the base type + CPPType *base_type = resolve_type(unwrap(in_type)); + //CPPType *base_type = in_type; + // Ok export Rules.. + // Classes and Structs and Unions are exported only if they have a + // function that is exported.. + // function is the easiest case. - // this question is about the base type - CPPType *base_type = resolve_type(unwrap(in_type)); - //CPPType *base_type = in_type; - // Ok export Rules.. - // Classes and Structs and Unions are exported only if they have a - // function that is exported.. - // function is the easiest case. + if (base_type->_vis <= min_vis) { + return true; + } - if (base_type->_vis <= min_vis) + if (in_type->_vis <= min_vis) { + return true; + } + + if (base_type->get_subtype() == CPPDeclaration::ST_struct) { + CPPStructType *struct_type = base_type->resolve_type(&parser, &parser)->as_struct_type(); + CPPScope *scope = struct_type->_scope; + + CPPScope::Declarations::const_iterator di; + for (di = scope->_declarations.begin(); + di != scope->_declarations.end(); ++di) { + if ((*di)->_vis <= min_vis) { return true; + } + } - if (in_type->_vis <= min_vis) + } else if (base_type->get_subtype() == CPPDeclaration::ST_instance) { + CPPInstance *inst = base_type->as_instance(); + if (inst->_type->get_subtype() == CPPDeclaration::ST_function) { + CPPInstance *function = inst; + CPPFunctionType *ftype = function->_type->resolve_type(&parser, &parser)->as_function_type(); + if (ftype->_vis <= min_vis) { return true; - - - if (base_type->get_subtype() == CPPDeclaration::ST_struct) - { - CPPStructType *sstruct_type = base_type->as_struct_type(); - CPPStructType *struct_type =sstruct_type->resolve_type(&parser, &parser)->as_struct_type(); - CPPScope *scope = struct_type->_scope; - - CPPScope::Declarations::const_iterator di; - for (di = scope->_declarations.begin();di != scope->_declarations.end(); di++) - { - if ((*di)->_vis <= min_vis) - return true; - } - - - + } + } else { + if (inst->_vis <= min_vis) { + return true; + } } - else if (base_type->get_subtype() == CPPDeclaration::ST_instance) - { - CPPInstance *inst = base_type->as_instance(); - if (inst->_type->get_subtype() == CPPDeclaration::ST_function) - { - CPPInstance *function = inst; - CPPFunctionType *ftype = function->_type->resolve_type(&parser, &parser)->as_function_type(); - if (ftype->_vis <= min_vis) - return true; - } - else - { - if (inst->_vis <= min_vis) - return true; - } + } else if (base_type->get_subtype() == CPPDeclaration::ST_typedef) { + CPPTypedefType *tdef = base_type->as_typedef_type(); + if (tdef->_type->get_subtype() == CPPDeclaration::ST_struct) { + CPPStructType *struct_type =tdef->_type->resolve_type(&parser, &parser)->as_struct_type(); + return is_exported(struct_type); } - else if (base_type->get_subtype() == CPPDeclaration::ST_typedef) - { - CPPTypedef *tdef = base_type->as_typedef(); - if (tdef->_type->get_subtype() == CPPDeclaration::ST_struct) - { - CPPStructType *struct_type =tdef->_type->resolve_type(&parser, &parser)->as_struct_type(); - return IsExported(struct_type); - } - } - else if (base_type->get_subtype() == CPPDeclaration::ST_type_declaration) - { - CPPType *type = base_type->as_type_declaration()->_type; - if (type->get_subtype() == CPPDeclaration::ST_struct) - { - CPPStructType *struct_type =type->as_type()->resolve_type(&parser, &parser)->as_struct_type(); - //CPPScope *scope = struct_type->_scope; - return IsExported(struct_type); + } else if (base_type->get_subtype() == CPPDeclaration::ST_type_declaration) { + CPPType *type = base_type->as_type_declaration()->_type; + if (type->get_subtype() == CPPDeclaration::ST_struct) { + CPPStructType *struct_type =type->as_type()->resolve_type(&parser, &parser)->as_struct_type(); + //CPPScope *scope = struct_type->_scope; + return is_exported(struct_type); - } - else if (type->get_subtype() == CPPDeclaration::ST_enum) - { - //CPPEnumType *enum_type = type->as_type()->resolve_type(&parser, &parser)->as_enum_type(); - if (type->_vis <= min_vis) - return true; - } + } else if (type->get_subtype() == CPPDeclaration::ST_enum) { + //CPPEnumType *enum_type = type->as_type()->resolve_type(&parser, &parser)->as_enum_type(); + if (type->_vis <= min_vis) { + return true; + } } + } /* - printf("---------------------> Visibility Failed %s %d Vis=%d, Minvis=%d\n", - base_type->get_fully_scoped_name().c_str(), - base_type->get_subtype(), - base_type->_vis, - min_vis); + printf("---------------------> Visibility Failed %s %d Vis=%d, Minvis=%d\n", + base_type->get_fully_scoped_name().c_str(), + base_type->get_subtype(), + base_type->_vis, + min_vis); */ - return false; -}; + return false; +} -bool TypeManager::IsLocal(CPPType *in_type) -{ - // A local means it was compiled in this scope of work.. - // IE a should actualy generate code for this objects.... - CPPType *base_type = resolve_type(unwrap(in_type)); - if (base_type->_forcetype) { - return true; - } +//////////////////////////////////////////////////////////////////// +// Function: TypeManager::is_local +// Access: Public, Static +// Description: Returns true if the type is defined in a local +// file rather than one that is included. +//////////////////////////////////////////////////////////////////// +bool TypeManager:: +is_local(CPPType *source_type) { + switch (source_type->get_subtype()) { + case CPPDeclaration::ST_const: + return is_local(source_type->as_const_type()->_wrapped_around); - if (base_type->_file._source == CPPFile::S_local && !base_type->is_incomplete()) { - return true; - } + case CPPDeclaration::ST_reference: + return is_local(source_type->as_reference_type()->_pointing_at); - return false; + case CPPDeclaration::ST_pointer: + return is_local(source_type->as_pointer_type()->_pointing_at); + + case CPPDeclaration::ST_simple: + return false; + + default: + { + CPPType *resolved_type = resolve_type(source_type); + if (resolved_type->_file._source == CPPFile::S_local && !resolved_type->is_incomplete()) { + return true; + } + } + } + + return false; /* - if (base_type->get_subtype() == CPPDeclaration::ST_struct) + if (base_type->get_subtype() == CPPDeclaration::ST_struct) { CPPStructType *struct_type = base_type->as_struct_type(); if (struct_type->_file._source == CPPFile::S_local) return true; } - else if (base_type->get_subtype() == CPPDeclaration::ST_instance) + else if (base_type->get_subtype() == CPPDeclaration::ST_instance) { CPPInstance *inst = base_type->as_instance(); - if (inst->_type->get_subtype() == CPPDeclaration::ST_function) + if (inst->_type->get_subtype() == CPPDeclaration::ST_function) { CPPInstance *function = inst; CPPFunctionType *ftype = function->_type->resolve_type(&parser, &parser)->as_function_type(); if (ftype->_file._source == CPPFile::S_local) return true; } - else + else { if (inst->_file._source == CPPFile::S_local) return true; } } - else if (base_type->get_subtype() == CPPDeclaration::ST_typedef) + else if (base_type->get_subtype() == CPPDeclaration::ST_typedef) { CPPTypedef *tdef = base_type->as_typedef(); - if (tdef->_type->get_subtype() == CPPDeclaration::ST_struct) + if (tdef->_type->get_subtype() == CPPDeclaration::ST_struct) { CPPStructType *struct_type =tdef->_type->resolve_type(&parser, &parser)->as_struct_type(); return IsLocal(struct_type); @@ -2072,7 +2547,7 @@ bool TypeManager::IsLocal(CPPType *in_type) } } - else if (base_type->get_subtype() == CPPDeclaration::ST_type_declaration) + else if (base_type->get_subtype() == CPPDeclaration::ST_type_declaration) { CPPType *type = base_type->as_type_declaration()->_type; if (type->get_subtype() == CPPDeclaration::ST_struct) @@ -2082,7 +2557,7 @@ bool TypeManager::IsLocal(CPPType *in_type) return true; } - else if (type->get_subtype() == CPPDeclaration::ST_enum) + else if (type->get_subtype() == CPPDeclaration::ST_enum) { CPPEnumType *enum_type = type->as_type()->resolve_type(&parser, &parser)->as_enum_type(); if (enum_type->_file._source != CPPFile::S_local) @@ -2091,7 +2566,7 @@ bool TypeManager::IsLocal(CPPType *in_type) } if (base_type->_file._source == CPPFile::S_local) - return true; + return true; return false; */ diff --git a/dtool/src/interrogate/typeManager.h b/dtool/src/interrogate/typeManager.h index 974a5b3e19..16b9dfda22 100644 --- a/dtool/src/interrogate/typeManager.h +++ b/dtool/src/interrogate/typeManager.h @@ -50,6 +50,7 @@ public: static bool is_ref_to_anything(CPPType *type); static bool is_const_ref_to_anything(CPPType *type); static bool is_const_pointer_to_anything(CPPType *type); + static bool is_const_pointer_or_ref(CPPType *type); static bool is_non_const_pointer_or_ref(CPPType *type); static bool is_pointer(CPPType *type); static bool is_const(CPPType *type); @@ -61,9 +62,15 @@ public: static bool is_const_simple(CPPType *type); static bool is_const_ref_to_simple(CPPType *type); static bool is_ref_to_simple(CPPType *type); + static bool is_simple_array(CPPType *type); + static bool is_pointer_to_simple(CPPType *type); static bool is_pointable(CPPType *type); static bool is_char(CPPType *type); + static bool is_unsigned_char(CPPType *type); static bool is_char_pointer(CPPType *type); + static bool is_const_char_pointer(CPPType *type); + static bool is_unsigned_char_pointer(CPPType *type); + static bool is_const_unsigned_char_pointer(CPPType *type); static bool is_basic_string_char(CPPType *type); static bool is_const_basic_string_char(CPPType *type); static bool is_const_ref_to_basic_string_char(CPPType *type); @@ -80,6 +87,8 @@ public: static bool is_bool(CPPType *type); static bool is_integer(CPPType *type); static bool is_unsigned_integer(CPPType *type); + static bool is_size(CPPType *type); + static bool is_ssize(CPPType *type); static bool is_short(CPPType *type); static bool is_unsigned_short(CPPType *type); static bool is_longlong(CPPType *type); @@ -94,6 +103,8 @@ public: static bool is_const_ref_to_pointer_to_base(CPPType *type); static bool is_pointer_to_PyObject(CPPType *type); static bool is_PyObject(CPPType *type); + static bool is_pointer_to_PyTypeObject(CPPType *type); + static bool is_PyTypeObject(CPPType *type); static bool is_pointer_to_PyStringObject(CPPType *type); static bool is_PyStringObject(CPPType *type); static bool is_pointer_to_PyUnicodeObject(CPPType *type); @@ -133,8 +144,8 @@ public: static bool has_protected_destructor(CPPType *type); - static bool IsExported(CPPType *type); - static bool IsLocal(CPPType *type); + static bool is_exported(CPPType *type); + static bool is_local(CPPType *type); }; diff --git a/dtool/src/interrogatedb/dtool_super_base.cxx b/dtool/src/interrogatedb/dtool_super_base.cxx index b92ce15f94..24911751a8 100644 --- a/dtool/src/interrogatedb/dtool_super_base.cxx +++ b/dtool/src/interrogatedb/dtool_super_base.cxx @@ -15,7 +15,7 @@ #include "py_panda.h" #ifdef HAVE_PYTHON - + class EmptyClass { }; Define_Module_Class_Private(dtoolconfig, DTOOL_SUPER_BASE, EmptyClass, DTOOL_SUPER_BASE111); @@ -30,7 +30,7 @@ PyMethodDef Dtool_Methods_DTOOL_SUPER_BASE[] = { { NULL, NULL } }; -static Py_hash_t DTool_HashKey_Methods_DTOOL_SUPER_BASE(PyObject *self) { +static Py_hash_t Dtool_HashKey_DTOOL_SUPER_BASE(PyObject *self) { void *local_this = DTOOL_Call_GetPointerThis(self); if (local_this == NULL) { return -1; @@ -38,7 +38,7 @@ static Py_hash_t DTool_HashKey_Methods_DTOOL_SUPER_BASE(PyObject *self) { return (Py_hash_t) local_this; }; -inline void Dtool_PyModuleClassInit_DTOOL_SUPER_BASE(PyObject *module) { +EXPCL_DTOOLCONFIG void Dtool_PyModuleClassInit_DTOOL_SUPER_BASE(PyObject *module) { static bool initdone = false; if (!initdone) { @@ -46,15 +46,6 @@ inline void Dtool_PyModuleClassInit_DTOOL_SUPER_BASE(PyObject *module) { Dtool_DTOOL_SUPER_BASE.As_PyTypeObject().tp_dict = PyDict_New(); PyDict_SetItemString(Dtool_DTOOL_SUPER_BASE.As_PyTypeObject().tp_dict, "DtoolClassDict", Dtool_DTOOL_SUPER_BASE.As_PyTypeObject().tp_dict); - // __hash__ - Dtool_DTOOL_SUPER_BASE.As_PyTypeObject().tp_hash = &DTool_HashKey_Methods_DTOOL_SUPER_BASE; -#if PY_MAJOR_VERSION >= 3 - // Python 3 removed the regular tp_compare function - there is only tp_richcompare. - Dtool_DTOOL_SUPER_BASE.As_PyTypeObject().tp_richcompare = &DTOOL_PyObject_RichCompare; -#else - Dtool_DTOOL_SUPER_BASE.As_PyTypeObject().tp_compare = &DTOOL_PyObject_Compare; -#endif - if (PyType_Ready(&Dtool_DTOOL_SUPER_BASE.As_PyTypeObject()) < 0) { PyErr_SetString(PyExc_TypeError, "PyType_Ready(Dtool_DTOOL_SUPER_BASE)"); return; @@ -83,9 +74,66 @@ int Dtool_Init_DTOOL_SUPER_BASE(PyObject *self, PyObject *args, PyObject *kwds) return -1; } -int Dtool_InitNoCoerce_DTOOL_SUPER_BASE(PyObject *self, PyObject *args) { - PyErr_SetString(PyExc_TypeError, "cannot init super base"); - return -1; -} +EXPORT_THIS Dtool_PyTypedObject Dtool_DTOOL_SUPER_BASE = { + { + PyVarObject_HEAD_INIT(NULL, 0) + "dtoolconfig.DTOOL_SUPER_BASE", + sizeof(Dtool_PyInstDef), + 0, + &Dtool_FreeInstance_DTOOL_SUPER_BASE, + 0, + 0, + 0, +#if PY_MAJOR_VERSION >= 3 + 0, +#else + &DTOOL_PyObject_Compare, +#endif + 0, + 0, + 0, + 0, + &Dtool_HashKey_DTOOL_SUPER_BASE, + 0, + 0, + PyObject_GenericGetAttr, + PyObject_GenericSetAttr, + 0, + (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES), + 0, + 0, + 0, +#if PY_MAJOR_VERSION >= 3 + &DTOOL_PyObject_RichCompare, +#else + 0, +#endif + 0, + 0, + 0, + Dtool_Methods_DTOOL_SUPER_BASE, + standard_type_members, + 0, + 0, + 0, + 0, + 0, + 0, + Dtool_Init_DTOOL_SUPER_BASE, + PyType_GenericAlloc, + Dtool_new_DTOOL_SUPER_BASE, + PyObject_Del, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + }, + Dtool_UpcastInterface_DTOOL_SUPER_BASE, + Dtool_DowncastInterface_DTOOL_SUPER_BASE, + TypeHandle::none(), +}; #endif // HAVE_PYTHON diff --git a/dtool/src/interrogatedb/interrogateType.I b/dtool/src/interrogatedb/interrogateType.I index 681efc39e9..7dc101d6db 100644 --- a/dtool/src/interrogatedb/interrogateType.I +++ b/dtool/src/interrogatedb/interrogateType.I @@ -207,6 +207,16 @@ is_const() const { return (_flags & F_const) != 0; } +//////////////////////////////////////////////////////////////////// +// Function: InterrogateType::is_typedef +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +INLINE bool InterrogateType:: +is_typedef() const { + return (_flags & F_typedef) != 0; +} + //////////////////////////////////////////////////////////////////// // Function: InterrogateType::get_wrapped_type // Access: Public @@ -217,6 +227,26 @@ get_wrapped_type() const { return _wrapped_type; } +//////////////////////////////////////////////////////////////////// +// Function: InterrogateType::is_array +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +INLINE bool InterrogateType:: +is_array() const { + return (_flags & F_array) != 0; +} + +//////////////////////////////////////////////////////////////////// +// Function: InterrogateType::get_array_size +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +INLINE int InterrogateType:: +get_array_size() const { + return _array_size; +} + //////////////////////////////////////////////////////////////////// // Function: InterrogateType::is_enum // Access: Public diff --git a/dtool/src/interrogatedb/interrogateType.cxx b/dtool/src/interrogatedb/interrogateType.cxx index 2f79dddce2..3c69995c99 100644 --- a/dtool/src/interrogatedb/interrogateType.cxx +++ b/dtool/src/interrogatedb/interrogateType.cxx @@ -32,6 +32,7 @@ InterrogateType(InterrogateModuleDef *def) : _outer_class = 0; _atomic_token = AT_not_atomic; _wrapped_type = 0; + _array_size = 1; _destructor = 0; _cpptype = (CPPType *)NULL; @@ -111,6 +112,7 @@ operator = (const InterrogateType ©) { _outer_class = copy._outer_class; _atomic_token = copy._atomic_token; _wrapped_type = copy._wrapped_type; + _array_size = copy._array_size; _constructors = copy._constructors; _destructor = copy._destructor; _elements = copy._elements; @@ -165,6 +167,11 @@ output(ostream &out) const { out << _outer_class << " " << (int)_atomic_token << " " << _wrapped_type << " "; + + if (is_array()) { + out << _array_size << " "; + } + idf_output_vector(out, _constructors); out << _destructor << " "; idf_output_vector(out, _elements); @@ -197,6 +204,10 @@ input(istream &in) { _atomic_token = (AtomicToken)token; in >> _wrapped_type; + if (is_array()) { + in >> _array_size; + } + idf_input_vector(in, _constructors); in >> _destructor; diff --git a/dtool/src/interrogatedb/interrogateType.h b/dtool/src/interrogatedb/interrogateType.h index bcdd6ce2bb..8abf807f02 100644 --- a/dtool/src/interrogatedb/interrogateType.h +++ b/dtool/src/interrogatedb/interrogateType.h @@ -60,8 +60,12 @@ public: INLINE bool is_wrapped() const; INLINE bool is_pointer() const; INLINE bool is_const() const; + INLINE bool is_typedef() const; INLINE TypeIndex get_wrapped_type() const; + INLINE bool is_array() const; + INLINE int get_array_size() const; + INLINE bool is_enum() const; INLINE int number_of_enum_values() const; INLINE const string &get_enum_value_name(int n) const; @@ -132,6 +136,8 @@ private: F_nested = 0x040000, F_enum = 0x080000, F_unpublished = 0x100000, + F_typedef = 0x200000, + F_array = 0x400000, }; public: @@ -143,6 +149,7 @@ public: TypeIndex _outer_class; AtomicToken _atomic_token; TypeIndex _wrapped_type; + int _array_size; typedef vector Functions; Functions _constructors; diff --git a/dtool/src/interrogatedb/interrogate_interface.cxx b/dtool/src/interrogatedb/interrogate_interface.cxx index 2595a2a751..8254918a64 100644 --- a/dtool/src/interrogatedb/interrogate_interface.cxx +++ b/dtool/src/interrogatedb/interrogate_interface.cxx @@ -613,6 +613,12 @@ interrogate_type_is_const(TypeIndex type) { return InterrogateDatabase::get_ptr()->get_type(type).is_const(); } +bool +interrogate_type_is_typedef(TypeIndex type) { + //cerr << "interrogate_type_is_typedef(" << type << ")\n"; + return InterrogateDatabase::get_ptr()->get_type(type).is_typedef(); +} + TypeIndex interrogate_type_wrapped_type(TypeIndex type) { //cerr << "interrogate_type_wrapped_type(" << type << ")\n"; diff --git a/dtool/src/interrogatedb/interrogate_interface.h b/dtool/src/interrogatedb/interrogate_interface.h index 5d5352721a..c1e615556f 100644 --- a/dtool/src/interrogatedb/interrogate_interface.h +++ b/dtool/src/interrogatedb/interrogate_interface.h @@ -447,6 +447,7 @@ EXPCL_DTOOLCONFIG bool interrogate_type_is_short(TypeIndex type); EXPCL_DTOOLCONFIG bool interrogate_type_is_wrapped(TypeIndex type); EXPCL_DTOOLCONFIG bool interrogate_type_is_pointer(TypeIndex type); EXPCL_DTOOLCONFIG bool interrogate_type_is_const(TypeIndex type); +EXPCL_DTOOLCONFIG bool interrogate_type_is_typedef(TypeIndex type); EXPCL_DTOOLCONFIG TypeIndex interrogate_type_wrapped_type(TypeIndex type); // If interrogate_type_is_enum() returns true, this is an enumerated diff --git a/dtool/src/interrogatedb/py_panda.cxx b/dtool/src/interrogatedb/py_panda.cxx index f7606ec407..3edfffe89c 100644 --- a/dtool/src/interrogatedb/py_panda.cxx +++ b/dtool/src/interrogatedb/py_panda.cxx @@ -18,19 +18,26 @@ #ifdef HAVE_PYTHON PyMemberDef standard_type_members[] = { - {(char *)"this", T_ULONG, offsetof(Dtool_PyInstDef,_ptr_to_object),READONLY, (char *)"C++ 'this' pointer, if any"}, -// {(char *)"this_ownership", T_INT, offsetof(Dtool_PyInstDef, _memory_rules), READONLY, (char *)"C++ 'this' ownership rules"}, -// {(char *)"this_const", T_INT, offsetof(Dtool_PyInstDef, _is_const), READONLY, (char *)"C++ 'this' const flag"}, + {(char *)"this", (sizeof(void*) == sizeof(int)) ? T_UINT : T_ULONGLONG, offsetof(Dtool_PyInstDef, _ptr_to_object), READONLY, (char *)"C++ 'this' pointer, if any"}, + {(char *)"this_ownership", T_BOOL, offsetof(Dtool_PyInstDef, _memory_rules), READONLY, (char *)"C++ 'this' ownership rules"}, + {(char *)"this_const", T_BOOL, offsetof(Dtool_PyInstDef, _is_const), READONLY, (char *)"C++ 'this' const flag"}, // {(char *)"this_signature", T_INT, offsetof(Dtool_PyInstDef, _signature), READONLY, (char *)"A type check signature"}, {(char *)"this_metatype", T_OBJECT, offsetof(Dtool_PyInstDef, _My_Type), READONLY, (char *)"The dtool meta object"}, {NULL} /* Sentinel */ }; -//////////////////////////////////////////////////////////////////////// -/// Simple Recognition Functions.. -//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////// +// Function: DtoolCanThisBeAPandaInstance +// Description: Given a valid (non-NULL) PyObject, does a simple +// check to see if it might be an instance of a Panda +// type. It does this using a signature that is +// encoded on each instance. +//////////////////////////////////////////////////////////////////// bool DtoolCanThisBeAPandaInstance(PyObject *self) { // simple sanity check for the class type..size.. will stop basic foobars.. + // It is arguably better to use something like this: + // PyType_IsSubtype(Py_TYPE(self), &Dtool_DTOOL_SUPER_BASE._PyType) + // ...but probably not as fast. if (Py_TYPE(self)->tp_basicsize >= (int)sizeof(Dtool_PyInstDef)) { Dtool_PyInstDef *pyself = (Dtool_PyInstDef *) self; if (pyself->_signature == PY_PANDA_SIGNATURE) { @@ -56,101 +63,51 @@ void DTOOL_Call_ExtractThisPointerForType(PyObject *self, Dtool_PyTypedObject *c } //////////////////////////////////////////////////////////////////// -// Function: attempt_coercion -// Description: A helper function for DTOOL_Call_GetPointerThisClass, -// below. This attempts to coerce the given object to -// the indicated Panda object, by creating a temporary -// instance of the required Panda object. If -// successful, returns the "this" pointer of the -// temporary object; otherwise, returns NULL. +// Function: Dtool_Call_ExtractThisPointer +// Description: This is a support function for the Python bindings: +// it extracts the underlying C++ pointer of the given +// type for a given Python object. If it was of the +// wrong type, raises an AttributeError. //////////////////////////////////////////////////////////////////// -static void * -attempt_coercion(PyObject *self, Dtool_PyTypedObject *classdef, - PyObject **coerced) { - // The supplied parameter is not the required type. - if (coerced != NULL) { - // Attempt coercion: try to create a temporary instance of the - // required class using the supplied parameter. - // Because we want to use the special InitNoCoerce constructor - // here instead of the regular constructor (we don't want to risk - // recursive coercion on the nested type we're creating), we have - // to call the constructor with a few more steps. - PyObject *obj = NULL; - if (classdef->_PyType.tp_new != NULL) { - obj = classdef->_PyType.tp_new(&classdef->_PyType, self, NULL); - assert(obj != NULL); - - if (PyTuple_Check(self)) { - // A tuple was passed, which we assume are the constructor arguments. - if (classdef->_Dtool_InitNoCoerce(obj, self) != 0) { - Py_DECREF(obj); - obj = NULL; - } - } else { - // We need to pack the value into an args tuple. - PyObject *args = PyTuple_Pack(1, self); - if (classdef->_Dtool_InitNoCoerce(obj, args) != 0) { - Py_DECREF(obj); - obj = NULL; - } - Py_DECREF(args); - } - } - if (obj == NULL) { - // That didn't work; try to call a static "make" method instead. - // Presently, we don't bother filtering this for coercion, - // because none of our classes suffer from a recursion danger - // here. Maybe one day we will need to also construct a - // makeNoCoerce wrapper? - PyObject *make = PyObject_GetAttrString((PyObject *)classdef, "make"); - if (make != NULL) { - PyErr_Clear(); - if (PyTuple_Check(self)) { - obj = PyObject_CallObject(make, self); - } else { - obj = PyObject_CallFunctionObjArgs(make, self, NULL); - } - Py_DECREF(make); - } - } - if (obj != NULL) { - // Well, whaddaya know? The supplied parameter(s) suited - // the object's constructor. Now we have a temporary object - // that we can pass to the function. - Dtool_PyTypedObject *my_type = ((Dtool_PyInstDef *)obj)->_My_Type; - void *result = my_type->_Dtool_UpcastInterface(obj, classdef); - if (result != NULL) { - // Successfully coerced. Store the newly-allocated - // pointer, so the caller can release the coerced object - // at his leisure. We store it in a list, so that other - // parameters can accumulate there too. - if ((*coerced) == NULL) { - (*coerced) = PyList_New(0); - } - PyList_Append(*coerced, obj); - Py_DECREF(obj); - return result; - } - // Some problem getting the C++ pointer from our created - // temporary object. Weird. - Py_DECREF(obj); - } - - // Clear the error returned by the coercion constructor. It's not - // the error message we want to report. - PyErr_Clear(); +bool Dtool_Call_ExtractThisPointer(PyObject *self, Dtool_PyTypedObject &classdef, void **answer) { + if (self == NULL || !DtoolCanThisBeAPandaInstance(self)) { + Dtool_Raise_TypeError("C++ object is not yet constructed, or already destructed."); + return false; } - return NULL; + + *answer = ((Dtool_PyInstDef *)self)->_My_Type->_Dtool_UpcastInterface(self, &classdef); + return true; } -// Temporary function to preserve backward compatibility. -void * -DTOOL_Call_GetPointerThisClass(PyObject *self, Dtool_PyTypedObject *classdef, - int param, const string &function_name, bool const_ok, - PyObject **coerced) { - return DTOOL_Call_GetPointerThisClass(self, classdef, - param, function_name, const_ok, - coerced, true); +//////////////////////////////////////////////////////////////////// +// Function: Dtool_Call_ExtractThisPointer_NonConst +// Description: The same thing as Dtool_Call_ExtractThisPointer, +// except that it performs the additional check that +// the pointer is a non-const pointer. This is called +// by function wrappers for functions of which all +// overloads are non-const, and saves a bit of code. +// +// The extra method_name argument is used in formatting +// the error message. +//////////////////////////////////////////////////////////////////// +bool Dtool_Call_ExtractThisPointer_NonConst(PyObject *self, Dtool_PyTypedObject &classdef, + void **answer, const char *method_name) { + + if (self == NULL || !DtoolCanThisBeAPandaInstance(self)) { + Dtool_Raise_TypeError("C++ object is not yet constructed, or already destructed."); + return false; + } + + if (((Dtool_PyInstDef *)self)->_is_const) { + // All overloads of this function are non-const. + PyErr_Format(PyExc_TypeError, + "Cannot call %s() on a const object.", + method_name); + return false; + } + + *answer = ((Dtool_PyInstDef *)self)->_My_Type->_Dtool_UpcastInterface(self, &classdef); + return true; } //////////////////////////////////////////////////////////////////// @@ -176,18 +133,6 @@ DTOOL_Call_GetPointerThisClass(PyObject *self, Dtool_PyTypedObject *classdef, // declared non-const, and can therefore be called with // only a non-const "this" pointer. // -// If coerced is non-NULL, parameter coercion will be -// attempted. This means the supplied parameter may not -// exactly match the required type, but will satisfy the -// require type's constructor; and we will create -// temporary object(s) of the required type instead. In -// this case, coerced is a pointer to a PyList that will -// be filled with these temporary objects. If coerced -// is a pointer to a NULL PyObject, a new PyList will be -// created on the first successful coercion. If coerced -// itself is NULL, parameter coercion will not be -// attempted. -// // The return value is the C++ pointer that was // extracted, or NULL if there was a problem (in which // case the Python exception state will have been set). @@ -195,103 +140,36 @@ DTOOL_Call_GetPointerThisClass(PyObject *self, Dtool_PyTypedObject *classdef, void * DTOOL_Call_GetPointerThisClass(PyObject *self, Dtool_PyTypedObject *classdef, int param, const string &function_name, bool const_ok, - PyObject **coerced, bool report_errors) { - if (PyErr_Occurred()) { + bool report_errors) { + //if (PyErr_Occurred()) { + // return NULL; + //} + if (self == NULL) { + if (report_errors) { + return Dtool_Raise_TypeError("self is NULL"); + } return NULL; } - if (self != NULL) { - if (DtoolCanThisBeAPandaInstance(self)) { - Dtool_PyTypedObject *my_type = ((Dtool_PyInstDef *)self)->_My_Type; - void *result = my_type->_Dtool_UpcastInterface(self, classdef); - if (result != NULL) { - if (const_ok || !((Dtool_PyInstDef *)self)->_is_const) { - return result; - } - if (report_errors) { - ostringstream str; - str << function_name << "() argument " << param << " may not be const"; - string msg = str.str(); - PyErr_SetString(PyExc_TypeError, msg.c_str()); - } + if (DtoolCanThisBeAPandaInstance(self)) { + void *result = ((Dtool_PyInstDef *)self)->_My_Type->_Dtool_UpcastInterface(self, classdef); - } else { - if (report_errors) { - ostringstream str; - str << function_name << "() argument " << param << " must be "; - - PyObject *fname = PyObject_GetAttrString((PyObject *)classdef, "__name__"); - if (fname != (PyObject *)NULL) { -#if PY_MAJOR_VERSION >= 3 - str << PyUnicode_AsUTF8(fname); -#else - str << PyString_AsString(fname); -#endif - Py_DECREF(fname); - } else { - str << classdef->_name; - } - - PyObject *tname = PyObject_GetAttrString((PyObject *)Py_TYPE(self), "__name__"); - if (tname != (PyObject *)NULL) { -#if PY_MAJOR_VERSION >= 3 - str << ", not " << PyUnicode_AsUTF8(tname); -#else - str << ", not " << PyString_AsString(tname); -#endif - Py_DECREF(tname); - } else { - str << ", not " << my_type->_name; - } - - string msg = str.str(); - PyErr_SetString(PyExc_TypeError, msg.c_str()); - } - } - - } else { - // The parameter was not a Panda type. Can we coerce it to the - // appropriate type, by creating a temporary object? - void *result = attempt_coercion(self, classdef, coerced); - if (result != NULL) { + if (result != NULL) { + if (const_ok || !((Dtool_PyInstDef *)self)->_is_const) { return result; } - // Coercion failed. if (report_errors) { - ostringstream str; - str << function_name << "() argument " << param << " must be "; - - PyObject *fname = PyObject_GetAttrString((PyObject *)classdef, "__name__"); - if (fname != (PyObject *)NULL) { -#if PY_MAJOR_VERSION >= 3 - str << PyUnicode_AsUTF8(fname); -#else - str << PyString_AsString(fname); -#endif - Py_DECREF(fname); - } else { - str << classdef->_name; - } - - PyObject *tname = PyObject_GetAttrString((PyObject *)Py_TYPE(self), "__name__"); - if (tname != (PyObject *)NULL) { -#if PY_MAJOR_VERSION >= 3 - str << ", not " << PyUnicode_AsUTF8(tname); -#else - str << ", not " << PyString_AsString(tname); -#endif - Py_DECREF(tname); - } - - string msg = str.str(); - PyErr_SetString(PyExc_TypeError, msg.c_str()); + return PyErr_Format(PyExc_TypeError, + "%s() argument %d may not be const", + function_name.c_str(), param); } + return NULL; } - } else { - if (report_errors) { - PyErr_SetString(PyExc_TypeError, "self is NULL"); - } + } + + if (report_errors) { + return Dtool_Raise_ArgTypeError(self, param, function_name.c_str(), classdef->_PyType.tp_name); } return NULL; @@ -304,31 +182,175 @@ void *DTOOL_Call_GetPointerThis(PyObject *self) { return pyself->_ptr_to_object; } } - return NULL; } +#ifndef NDEBUG +//////////////////////////////////////////////////////////////////// +// Function: Dtool_CheckErrorOccurred +// Description: This is similar to a PyErr_Occurred() check, except +// that it also checks Notify to see if an assertion +// has occurred. If that is the case, then it raises +// an AssertionError. +// +// Returns true if there is an active exception, false +// otherwise. +// +// In the NDEBUG case, this is simply a #define to +// _PyErr_OCCURRED() (which is an undocumented inline +// version of PyErr_Occurred()). +//////////////////////////////////////////////////////////////////// +bool Dtool_CheckErrorOccurred() { + if (_PyErr_OCCURRED()) { + return true; + } + if (Notify::ptr()->has_assert_failed()) { + Dtool_Raise_AssertionError(); + return true; + } + return false; +} +#endif // NDEBUG + +//////////////////////////////////////////////////////////////////// +// Function: Dtool_Raise_AssertionError +// Description: Raises an AssertionError containing the last thrown +// assert message, and clears the assertion flag. +// Returns NULL. +//////////////////////////////////////////////////////////////////// +PyObject *Dtool_Raise_AssertionError() { + Notify *notify = Notify::ptr(); +#if PY_MAJOR_VERSION >= 3 + PyObject *message = PyUnicode_FromString(notify->get_assert_error_message().c_str()); +#else + PyObject *message = PyString_FromString(notify->get_assert_error_message().c_str()); +#endif + Py_INCREF(PyExc_AssertionError); + PyErr_Restore(PyExc_AssertionError, message, (PyObject *)NULL); + notify->clear_assert_failed(); + return NULL; +} + +//////////////////////////////////////////////////////////////////// +// Function: Dtool_Raise_TypeError +// Description: Raises a TypeError with the given message, and +// returns NULL. +//////////////////////////////////////////////////////////////////// +PyObject *Dtool_Raise_TypeError(const char *message) { + // PyErr_Restore is what PyErr_SetString would have ended up calling + // eventually anyway, so we might as well just get to the point. + Py_INCREF(PyExc_TypeError); +#if PY_MAJOR_VERSION >= 3 + PyErr_Restore(PyExc_TypeError, PyUnicode_FromString(message), (PyObject *)NULL); +#else + PyErr_Restore(PyExc_TypeError, PyString_FromString(message), (PyObject *)NULL); +#endif + return NULL; +} + +//////////////////////////////////////////////////////////////////// +// Function: Dtool_Raise_ArgTypeError +// Description: Raises a TypeError of the form: +// function_name() argument n must be type, not type +// for a given object passed to a function. +// +// Always returns NULL so that it can be conveniently +// used as a return expression for wrapper functions +// that return a PyObject pointer. +//////////////////////////////////////////////////////////////////// +PyObject *Dtool_Raise_ArgTypeError(PyObject *obj, int param, const char *function_name, const char *type_name) { +#if PY_MAJOR_VERSION >= 3 + PyObject *message = PyUnicode_FromFormat( +#else + PyObject *message = PyString_FromFormat( +#endif + "%s() argument %d must be %s, not %s", + function_name, param, type_name, + Py_TYPE(obj)->tp_name); + + Py_INCREF(PyExc_TypeError); + PyErr_Restore(PyExc_TypeError, message, (PyObject *)NULL); + return NULL; +} + +//////////////////////////////////////////////////////////////////// +// Function: Dtool_Raise_BadArgumentsError +// Description: Raises a TypeError of the form: +// Arguments must match: +// +// +// However, in release builds, this instead is defined +// to a function that just prints out a generic +// message, to help reduce the amount of strings in +// the compiled library. +// +// Always returns NULL so that it can be conveniently +// used as a return expression for wrapper functions +// that return a PyObject pointer. +//////////////////////////////////////////////////////////////////// +PyObject *_Dtool_Raise_BadArgumentsError() { + return Dtool_Raise_TypeError("arguments do not match any function overload"); +} + +//////////////////////////////////////////////////////////////////// +// Function: Dtool_Return_None +// Description: Convenience method that checks for exceptions, and +// if one occurred, returns NULL, otherwise Py_None. +//////////////////////////////////////////////////////////////////// +PyObject *_Dtool_Return_None() { + if (_PyErr_OCCURRED()) { + return NULL; + } +#ifndef NDEBUG + if (Notify::ptr()->has_assert_failed()) { + return Dtool_Raise_AssertionError(); + } +#endif + Py_INCREF(Py_None); + return Py_None; +} + +//////////////////////////////////////////////////////////////////// +// Function: Dtool_Return_Bool +// Description: Convenience method that checks for exceptions, and +// if one occurred, returns NULL, otherwise the given +// boolean value as a PyObject *. +//////////////////////////////////////////////////////////////////// +PyObject *Dtool_Return_Bool(bool value) { + if (_PyErr_OCCURRED()) { + return NULL; + } +#ifndef NDEBUG + if (Notify::ptr()->has_assert_failed()) { + return Dtool_Raise_AssertionError(); + } +#endif + PyObject *result = (value ? Py_True : Py_False); + Py_INCREF(result); + return result; +} + //////////////////////////////////////////////////////////////////////// // Function : DTool_CreatePyInstanceTyped // // this function relies on the behavior of typed objects in the panda system. // //////////////////////////////////////////////////////////////////////// -PyObject *DTool_CreatePyInstanceTyped(void *local_this_in, Dtool_PyTypedObject & known_class_type, bool memory_rules, bool is_const, int RunTimeType) { - if (local_this_in == NULL) { - // Let's not be stupid.. - PyErr_SetString(PyExc_TypeError, "C Function Return Null 'this'"); - return NULL; - } +PyObject *DTool_CreatePyInstanceTyped(void *local_this_in, Dtool_PyTypedObject &known_class_type, bool memory_rules, bool is_const, int type_index) { + // We can't do the NULL check here like in DTool_CreatePyInstance, since + // the caller will have to get the type index to pass to this function + // to begin with. That code probably would have crashed by now if it was + // really NULL for whatever reason. + nassertr(local_this_in != NULL, NULL); ///////////////////////////////////////////////////// // IF the class is possibly a run time typed object ///////////////////////////////////////////////////// - if (RunTimeType > 0) { + if (type_index > 0) { ///////////////////////////////////////////////////// // get best fit class... ///////////////////////////////////////////////////// - Dtool_PyTypedObject *target_class = Dtool_RuntimeTypeDtoolType(RunTimeType); + Dtool_PyTypedObject *target_class = Dtool_RuntimeTypeDtoolType(type_index); if (target_class != NULL) { ///////////////////////////////////////////////////// // cast to the type... @@ -343,7 +365,7 @@ PyObject *DTool_CreatePyInstanceTyped(void *local_this_in, Dtool_PyTypedObject & self->_ptr_to_object = new_local_this; self->_memory_rules = memory_rules; self->_is_const = is_const; - self->_signature = PY_PANDA_SIGNATURE; + //self->_signature = PY_PANDA_SIGNATURE; self->_My_Type = target_class; return (PyObject *)self; } @@ -360,7 +382,7 @@ PyObject *DTool_CreatePyInstanceTyped(void *local_this_in, Dtool_PyTypedObject & self->_ptr_to_object = local_this_in; self->_memory_rules = memory_rules; self->_is_const = is_const; - self->_signature = PY_PANDA_SIGNATURE; + //self->_signature = PY_PANDA_SIGNATURE; self->_My_Type = &known_class_type; } return (PyObject *)self; @@ -372,8 +394,10 @@ PyObject *DTool_CreatePyInstanceTyped(void *local_this_in, Dtool_PyTypedObject & //////////////////////////////////////////////////////////////////////// PyObject *DTool_CreatePyInstance(void *local_this, Dtool_PyTypedObject &in_classdef, bool memory_rules, bool is_const) { if (local_this == NULL) { - PyErr_SetString(PyExc_TypeError, "C Function Return Null 'this'"); - return NULL; + // This is actually a very common case, so let's allow this, but return + // Py_None consistently. This eliminates code in the wrappers. + Py_INCREF(Py_None); + return Py_None; } Dtool_PyTypedObject *classdef = &in_classdef; @@ -425,7 +449,7 @@ void RegisterRuntimeClass(Dtool_PyTypedObject *otype, int class_id) { if (class_id == 0) { interrogatedb_cat.warning() - << "Class " << otype->_name + << "Class " << otype->_PyType.tp_name << " has a zero TypeHandle value; check that init_type() is called.\n"; } else if (class_id > 0) { @@ -436,13 +460,14 @@ RegisterRuntimeClass(Dtool_PyTypedObject *otype, int class_id) { // There was already an entry in the dictionary for class_id. Dtool_PyTypedObject *other_type = (*result.first).second; interrogatedb_cat.warning() - << "Classes " << otype->_name << " and " << other_type->_name + << "Classes " << otype->_PyType.tp_name + << " and " << other_type->_PyType.tp_name << " share the same TypeHandle value (" << class_id << "); check class definitions.\n"; } else { GetRunTimeTypeList().insert(class_id); - otype->_Dtool_IsRunTimeCapable = true; + otype->_type = TypeRegistry::ptr()->find_type_by_id(class_id); } } } @@ -495,11 +520,10 @@ PyObject *Dtool_PyModuleInitHelper(LibraryDef *defs[], const char *modulename) { if (module == NULL) { #if PY_MAJOR_VERSION >= 3 - PyErr_SetString(PyExc_TypeError, "PyModule_Create returned NULL"); + return Dtool_Raise_TypeError("PyModule_Create returned NULL"); #else - PyErr_SetString(PyExc_TypeError, "Py_InitModule returned NULL"); + return Dtool_Raise_TypeError("Py_InitModule returned NULL"); #endif - return NULL; } // the constant inits... enums, classes ... @@ -508,7 +532,6 @@ PyObject *Dtool_PyModuleInitHelper(LibraryDef *defs[], const char *modulename) { } PyModule_AddIntConstant(module, "Dtool_PyNativeInterface", 1); - return module; } @@ -523,20 +546,26 @@ PyObject *Dtool_PyModuleInitHelper(LibraryDef *defs[], const char *modulename) { PyObject *Dtool_BorrowThisReference(PyObject *self, PyObject *args) { PyObject *from_in = NULL; PyObject *to_in = NULL; - if (PyArg_ParseTuple(args, "OO", &to_in, &from_in)) { + if (PyArg_UnpackTuple(args, "Dtool_BorrowThisReference", 2, 2, &to_in, &from_in)) { if (DtoolCanThisBeAPandaInstance(from_in) && DtoolCanThisBeAPandaInstance(to_in)) { - Dtool_PyInstDef * from = (Dtool_PyInstDef *) from_in; - Dtool_PyInstDef * to = (Dtool_PyInstDef *) to_in; + Dtool_PyInstDef *from = (Dtool_PyInstDef *) from_in; + Dtool_PyInstDef *to = (Dtool_PyInstDef *) to_in; + + //if (PyObject_TypeCheck(to_in, Py_TYPE(from_in))) { if (from->_My_Type == to->_My_Type) { to->_memory_rules = false; to->_is_const = from->_is_const; to->_ptr_to_object = from->_ptr_to_object; - return Py_BuildValue(""); + + Py_INCREF(Py_None); + return Py_None; } - PyErr_SetString(PyExc_TypeError, "Must Be Same Type??"); + + return PyErr_Format(PyExc_TypeError, "types %s and %s do not match", + Py_TYPE(from)->tp_name, Py_TYPE(to)->tp_name); } else { - PyErr_SetString(PyExc_TypeError, "One of these does not appear to be DTOOL Instance ??"); + return Dtool_Raise_TypeError("One of these does not appear to be DTOOL Instance ??"); } } return (PyObject *) NULL; @@ -551,16 +580,17 @@ PyObject *Dtool_AddToDictionary(PyObject *self1, PyObject *args) { PyObject *key; if (PyArg_ParseTuple(args, "OSO", &self, &key, &subject)) { PyObject *dict = ((PyTypeObject *)self)->tp_dict; - if (dict == NULL && !PyDict_Check(dict)) { - PyErr_SetString(PyExc_TypeError, "No dictionary On Object"); + if (dict == NULL || !PyDict_Check(dict)) { + return Dtool_Raise_TypeError("No dictionary On Object"); } else { - PyDict_SetItem(dict,key,subject); + PyDict_SetItem(dict, key, subject); } } if (PyErr_Occurred()) { return (PyObject *)NULL; } - return Py_BuildValue(""); + Py_INCREF(Py_None); + return Py_None; } /////////////////////////////////////////////////////////////////////////////////// @@ -607,6 +637,30 @@ inline long DTool_HashKey(PyObject * inst) XXX of error. */ +int DTOOL_PyObject_ComparePointers(PyObject *v1, PyObject *v2) { + // try this compare + void *v1_this = DTOOL_Call_GetPointerThis(v1); + void *v2_this = DTOOL_Call_GetPointerThis(v2); + if (v1_this != NULL && v2_this != NULL) { // both are our types... + if (v1_this < v2_this) { + return -1; + } + if (v1_this > v2_this) { + return 1; + } + return 0; + } + + // ok self compare... + if (v1 < v2) { + return -1; + } + if (v1 > v2) { + return 1; + } + return 0; +} + int DTOOL_PyObject_Compare(PyObject *v1, PyObject *v2) { // First try compareTo function.. PyObject * func = PyObject_GetAttrString(v1, "compare_to"); @@ -655,27 +709,7 @@ int DTOOL_PyObject_Compare(PyObject *v1, PyObject *v2) { } } - // try this compare - void *v1_this = DTOOL_Call_GetPointerThis(v1); - void *v2_this = DTOOL_Call_GetPointerThis(v2); - if (v1_this != NULL && v2_this != NULL) { // both are our types... - if (v1_this < v2_this) { - return -1; - } - if (v1_this > v2_this) { - return 1; - } - return 0; - } - - // ok self compare... - if (v1 < v2) { - return -1; - } - if (v1 > v2) { - return 1; - } - return 0; + return DTOOL_PyObject_ComparePointers(v1, v2); } PyObject *DTOOL_PyObject_RichCompare(PyObject *v1, PyObject *v2, int op) { @@ -725,7 +759,7 @@ PyObject *make_list_for_item(PyObject *self, const char *num_name, Py_DECREF(list); return NULL; } - PyList_SetItem(list, i, element); + PyList_SET_ITEM(list, i, element); } return list; } @@ -772,18 +806,15 @@ PyObject *map_deepcopy_to_copy(PyObject *self, PyObject *args) { // either a regular integer or a long integer, according // to whether the indicated value will fit. //////////////////////////////////////////////////////////////////// +#if PY_MAJOR_VERSION < 3 EXPCL_DTOOLCONFIG PyObject * PyLongOrInt_FromUnsignedLong(unsigned long value) { -#if PY_MAJOR_VERSION >= 3 - // Python 3 only has longs. - return PyLong_FromUnsignedLong(value); -#else if ((long)value < 0) { return PyLong_FromUnsignedLong(value); } else { return PyInt_FromLong((long)value); } -#endif } +#endif #endif // HAVE_PYTHON diff --git a/dtool/src/interrogatedb/py_panda.h b/dtool/src/interrogatedb/py_panda.h index 0811c6c795..e05f90794e 100755 --- a/dtool/src/interrogatedb/py_panda.h +++ b/dtool/src/interrogatedb/py_panda.h @@ -13,12 +13,12 @@ //////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////// // Too do list .. -// We need a better dispatcher for the functions.. The behavior today is -// try one till it works or you run out of possibilities.. This is anything but optimal -// for performance and is treading on thin ice for function python or c++ will +// We need a better dispatcher for the functions.. The behavior today is +// try one till it works or you run out of possibilities.. This is anything but optimal +// for performance and is treading on thin ice for function python or c++ will // course there types to other types. // -// The linking step will produce allot of warnings +// The linking step will produce allot of warnings // warning LNK4049: locally defined symbol.. // // Get a second coder to review this file and the generated code .. @@ -40,6 +40,8 @@ #endif +#include "pnotify.h" + #if defined(HAVE_PYTHON) && !defined(CPPPARSER) #ifdef _POSIX_C_SOURCE @@ -102,21 +104,31 @@ inline PyObject* doPy_RETURN_FALSE() #define Py_TPFLAGS_CHECKTYPES 0 #endif -#if PY_MAJOR_VERSION < 3 +#if PY_MAJOR_VERSION >= 3 +// For writing code that will compile in both versions. +#define nb_nonzero nb_bool +#define nb_divide nb_true_divide +#define nb_inplace_divide nb_inplace_true_divide + +#define PyLongOrInt_Check(x) PyLong_Check(x) +#define PyLongOrInt_FromSize_t PyLong_FromSize_t +#define PyLongOrInt_FromLong PyLong_FromLong +#define PyLongOrInt_FromUnsignedLong PyLong_FromUnsignedLong +#define PyInt_Check PyLong_Check +#define PyInt_AsLong PyLong_AsLong +#define PyInt_AS_LONG PyLong_AS_LONG +#else +#define PyLongOrInt_Check(x) (PyInt_Check(x) || PyLong_Check(x)) +// PyInt_FromSize_t automatically picks the right type. +#define PyLongOrInt_FromSize_t PyInt_FromSize_t +#define PyLongOrInt_FromLong PyInt_FromLong + // For more portably defining hash functions. typedef long Py_hash_t; #endif -#if PY_MAJOR_VERSION >= 3 -#define nb_nonzero nb_bool -#define nb_divide nb_true_divide -#define nb_inplace_divide nb_inplace_true_divide -#endif - using namespace std; -#define PY_PANDA_SMALLER_FOOTPRINT 1 - /////////////////////////////////////////////////////////////////////////////////// // this is tempory .. untill this is glued better into the panda build system /////////////////////////////////////////////////////////////////////////////////// @@ -138,42 +150,39 @@ EXPCL_DTOOLCONFIG RunTimeTypeDictionary &GetRunTimeDictionary(); EXPCL_DTOOLCONFIG RunTimeTypeList &GetRunTimeTypeList(); ////////////////////////////////////////////////////////// -// used to stamp dtool instance.. +// used to stamp dtool instance.. #define PY_PANDA_SIGNATURE 0xbeaf -typedef void * ( * ConvertFunctionType )(PyObject *,Dtool_PyTypedObject * ); -typedef void * ( * ConvertFunctionType1 )(void *, Dtool_PyTypedObject *); -typedef void ( *FreeFunction )(PyObject *); -typedef void ( *PyModuleClassInit)(PyObject *module); -typedef int ( *InitNoCoerce)(PyObject *self, PyObject *args); +typedef void *(*UpcastFunction)(PyObject *,Dtool_PyTypedObject *); +typedef void *(*DowncastFunction)(void *, Dtool_PyTypedObject *); //inline Dtool_PyTypedObject * Dtool_RuntimeTypeDtoolType(int type); -inline void Dtool_Deallocate_General(PyObject * self); +//inline void Dtool_Deallocate_General(PyObject * self); //inline int DTOOL_PyObject_Compare(PyObject *v1, PyObject *v2); // //////////////////////////////////////////////////////////////////////// // THIS IS THE INSTANCE CONTAINER FOR ALL panda py objects.... //////////////////////////////////////////////////////////////////////// -#ifdef PY_PANDA_SMALLER_FOOTPRINT -// this should save 8 bytes per object .... struct Dtool_PyInstDef { PyObject_HEAD - void *_ptr_to_object; - struct Dtool_PyTypedObject *_My_Type; - unsigned short _signature ; - int _memory_rules : 1; // true if we own the pointer and should delete it or unref it - int _is_const : 1; // true if this is a "const" pointer. -}; -#else -struct Dtool_PyInstDef { - PyObject_HEAD - void *_ptr_to_object; - int _memory_rules; // true if we own the pointer and should delete it or unref it - int _is_const; // true if this is a "const" pointer. - unsigned long _signature; + // This is a pointer to the Dtool_PyTypedObject type. It's tempting + // not to store this and to instead use PY_TYPE(self) and upcast that, + // but that breaks when someone inherits from our class in Python. struct Dtool_PyTypedObject *_My_Type; + + // Pointer to the underlying C++ object. + void *_ptr_to_object; + + // This is always set to PY_PANDA_SIGNATURE, so that we can quickly + // detect whether an object is a Panda object. + unsigned short _signature; + + // True if we own the pointer and should delete it or unref it. + bool _memory_rules; + + // True if this is a "const" pointer. + bool _is_const; }; -#endif //////////////////////////////////////////////////////////////////////// // A Offset Dictionary Defining How to read the Above Object.. @@ -188,144 +197,85 @@ struct Dtool_PyTypedObject { PyTypeObject _PyType; // My Class Level Features.. - const char *_name; // cpp name for the object - bool _Dtool_IsRunTimeCapable; // derived from TypedObject - ConvertFunctionType _Dtool_UpcastInterface; // The Upcast Function By Slot - ConvertFunctionType1 _Dtool_DowncastInterface; // The Downcast Function By Slot - FreeFunction _Dtool_FreeInstance; - PyModuleClassInit _Dtool_ClassInit; // The module init function pointer - InitNoCoerce _Dtool_InitNoCoerce; // A variant of the constructor that does not attempt to perform coercion of its arguments. + UpcastFunction _Dtool_UpcastInterface; // The Upcast Function By Slot + DowncastFunction _Dtool_DowncastInterface; // The Downcast Function By Slot + + // May be TypeHandle::none() to indicate a non-TypedObject class. + TypeHandle _type; // some convenience functions.. inline PyTypeObject &As_PyTypeObject() { return _PyType; }; inline PyObject &As_PyObject() { return (PyObject &)_PyType; }; }; -//////////////////////////////////////////////////////////////////////// -// Macros from Hell.. May want to just add this to the code generator.. -//////////////////////////////////////////////////////////////////////// -#define Define_Dtool_PyTypedObject(MODULE_NAME, CLASS_NAME, PUBLIC_NAME) \ - EXPORT_THIS Dtool_PyTypedObject Dtool_##CLASS_NAME = \ - { \ - { \ - PyVarObject_HEAD_INIT(NULL, 0) \ - #MODULE_NAME "." #PUBLIC_NAME, /*type name with module */ \ - sizeof(Dtool_PyInstDef), /* tp_basicsize */ \ - 0, /* tp_itemsize */ \ - &Dtool_Deallocate_General, /* tp_dealloc */ \ - 0, /* tp_print */ \ - 0, /* tp_getattr */ \ - 0, /* tp_setattr */ \ - 0, /* tp_compare */ \ - 0, /* tp_repr */ \ - &Dtool_PyNumberMethods_##CLASS_NAME, /* tp_as_number */ \ - &Dtool_PySequenceMethods_##CLASS_NAME, /* tp_as_sequence */ \ - &Dtool_PyMappingMethods_##CLASS_NAME, /* tp_as_mapping */ \ - 0, /* tp_hash */ \ - 0, /* tp_call */ \ - 0, /* tp_str */ \ - PyObject_GenericGetAttr, /* tp_getattro */ \ - PyObject_GenericSetAttr, /* tp_setattro */ \ - &Dtool_PyBufferProcs_##CLASS_NAME, /* tp_as_buffer */ \ - (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES), /* tp_flags */ \ - 0, /* tp_doc */ \ - 0, /* tp_traverse */ \ - 0, /* tp_clear */ \ - 0, /* tp_richcompare */ \ - 0, /* tp_weaklistoffset */ \ - 0, /* tp_iter */ \ - 0, /* tp_iternext */ \ - Dtool_Methods_##CLASS_NAME, /* tp_methods */ \ - standard_type_members, /* tp_members */ \ - 0, /* tp_getset */ \ - 0, /* tp_base */ \ - 0, /* tp_dict */ \ - 0, /* tp_descr_get */ \ - 0, /* tp_descr_set */ \ - 0, /* tp_dictoffset */ \ - Dtool_Init_##CLASS_NAME, /* tp_init */ \ - PyType_GenericAlloc, /* tp_alloc */ \ - Dtool_new_##CLASS_NAME, /* tp_new */ \ - PyObject_Del, /* tp_free */ \ - }, \ - #CLASS_NAME, \ - false, \ - Dtool_UpcastInterface_##CLASS_NAME, \ - Dtool_DowncastInterface_##CLASS_NAME, \ - Dtool_FreeInstance_##CLASS_NAME, \ - Dtool_PyModuleClassInit_##CLASS_NAME, \ - Dtool_InitNoCoerce_##CLASS_NAME \ - }; - -#define Define_Dtool_Class(MODULE_NAME, CLASS_NAME, PUBLIC_NAME) \ - static PyNumberMethods Dtool_PyNumberMethods_##CLASS_NAME = {0}; \ - static PySequenceMethods Dtool_PySequenceMethods_##CLASS_NAME = {0}; \ - static PyMappingMethods Dtool_PyMappingMethods_##CLASS_NAME = {0}; \ - static PyBufferProcs Dtool_PyBufferProcs_##CLASS_NAME = {0}; \ - Define_Dtool_PyTypedObject(MODULE_NAME, CLASS_NAME, PUBLIC_NAME) +// This is now simply a forward declaration. The actual definition is created +// by the code generator. +#define Define_Dtool_Class(MODULE_NAME, CLASS_NAME, PUBLIC_NAME) \ + extern Dtool_PyTypedObject Dtool_##CLASS_NAME; //////////////////////////////////////////////////////////////////////// -// The Fast Deallocator.. for Our instances.. -//////////////////////////////////////////////////////////////////////// -inline void Dtool_Deallocate_General(PyObject * self) { - ((Dtool_PyInstDef *)self)->_My_Type->_Dtool_FreeInstance(self); - Py_TYPE(self)->tp_free(self); -} - -//////////////////////////////////////////////////////////////////////// -// More Macro(s) to Implement class functions.. Usually used if C++ needs type information +// More Macro(s) to Implement class functions.. Usually used if C++ needs type information //////////////////////////////////////////////////////////////////////// #define Define_Dtool_new(CLASS_NAME,CNAME)\ -PyObject *Dtool_new_##CLASS_NAME(PyTypeObject *type, PyObject *args, PyObject *kwds)\ -{\ - PyObject *self = type->tp_alloc(type, 0);\ - ((Dtool_PyInstDef *)self)->_signature = PY_PANDA_SIGNATURE;\ - ((Dtool_PyInstDef *)self)->_ptr_to_object = NULL;\ - ((Dtool_PyInstDef *)self)->_memory_rules = false;\ - ((Dtool_PyInstDef *)self)->_is_const = false;\ - ((Dtool_PyInstDef *)self)->_My_Type = &Dtool_##CLASS_NAME;\ - return self;\ +PyObject *Dtool_new_##CLASS_NAME(PyTypeObject *type, PyObject *args, PyObject *kwds) {\ + (void) args; (void) kwds;\ + PyObject *self = type->tp_alloc(type, 0);\ + ((Dtool_PyInstDef *)self)->_signature = PY_PANDA_SIGNATURE;\ + ((Dtool_PyInstDef *)self)->_My_Type = &Dtool_##CLASS_NAME;\ + return self;\ } +// The following used to be in the above macro, but it doesn't seem to +// be necessary as tp_alloc memsets the object to 0. + //((Dtool_PyInstDef *)self)->_ptr_to_object = NULL;\ + //((Dtool_PyInstDef *)self)->_memory_rules = false;\ + //((Dtool_PyInstDef *)self)->_is_const = false;\ + //////////////////////////////////////////////////////////////////////// /// Delete functions.. //////////////////////////////////////////////////////////////////////// #ifdef NDEBUG #define Define_Dtool_FreeInstance_Private(CLASS_NAME,CNAME)\ -static void Dtool_FreeInstance_##CLASS_NAME(PyObject *self)\ -{\ +static void Dtool_FreeInstance_##CLASS_NAME(PyObject *self) {\ + Py_TYPE(self)->tp_free(self);\ } #else // NDEBUG #define Define_Dtool_FreeInstance_Private(CLASS_NAME,CNAME)\ -static void Dtool_FreeInstance_##CLASS_NAME(PyObject *self)\ -{\ - if(((Dtool_PyInstDef *)self)->_ptr_to_object != NULL)\ - if(((Dtool_PyInstDef *)self)->_memory_rules)\ - {\ - cerr << "Detected leak for " << #CLASS_NAME \ - << " which interrogate cannot delete.\n"; \ - }\ +static void Dtool_FreeInstance_##CLASS_NAME(PyObject *self) {\ + if (((Dtool_PyInstDef *)self)->_ptr_to_object != NULL) {\ + if (((Dtool_PyInstDef *)self)->_memory_rules) {\ + cerr << "Detected leak for " << #CLASS_NAME \ + << " which interrogate cannot delete.\n"; \ + }\ + }\ + Py_TYPE(self)->tp_free(self);\ } #endif // NDEBUG #define Define_Dtool_FreeInstance(CLASS_NAME,CNAME)\ -static void Dtool_FreeInstance_##CLASS_NAME(PyObject *self)\ -{\ - if(((Dtool_PyInstDef *)self)->_ptr_to_object != NULL)\ - if(((Dtool_PyInstDef *)self)->_memory_rules)\ - {\ - delete ((CNAME *)((Dtool_PyInstDef *)self)->_ptr_to_object);\ - }\ +static void Dtool_FreeInstance_##CLASS_NAME(PyObject *self) {\ + if (((Dtool_PyInstDef *)self)->_ptr_to_object != NULL) {\ + if (((Dtool_PyInstDef *)self)->_memory_rules) {\ + delete ((CNAME *)((Dtool_PyInstDef *)self)->_ptr_to_object);\ + }\ + }\ + Py_TYPE(self)->tp_free(self);\ } #define Define_Dtool_FreeInstanceRef(CLASS_NAME,CNAME)\ -static void Dtool_FreeInstance_##CLASS_NAME(PyObject *self)\ -{\ - if(((Dtool_PyInstDef *)self)->_ptr_to_object != NULL)\ - if(((Dtool_PyInstDef *)self)->_memory_rules)\ - {\ - unref_delete((CNAME *)((Dtool_PyInstDef *)self)->_ptr_to_object);\ - }\ +static void Dtool_FreeInstance_##CLASS_NAME(PyObject *self) {\ + if (((Dtool_PyInstDef *)self)->_ptr_to_object != NULL) {\ + if (((Dtool_PyInstDef *)self)->_memory_rules) {\ + unref_delete((CNAME *)((Dtool_PyInstDef *)self)->_ptr_to_object);\ + }\ + }\ + Py_TYPE(self)->tp_free(self);\ +} + +#define Define_Dtool_Simple_FreeInstance(CLASS_NAME, CNAME)\ +static void Dtool_FreeInstance_##CLASS_NAME(PyObject *self) {\ + ((Dtool_InstDef_##CLASS_NAME *)self)->_value.~##CLASS_NAME();\ + Py_TYPE(self)->tp_free(self);\ } //////////////////////////////////////////////////////////////////////// @@ -333,38 +283,124 @@ static void Dtool_FreeInstance_##CLASS_NAME(PyObject *self)\ //////////////////////////////////////////////////////////////////////// EXPCL_DTOOLCONFIG bool DtoolCanThisBeAPandaInstance(PyObject *self); +/////////////////////////////////////////////////////////////////////////////// +// ** HACK ** allert.. +// +// Need to keep a runtime type dictionary ... that is forward declared of typed object. +// We rely on the fact that typed objects are uniquly defined by an integer. +// +/////////////////////////////////////////////////////////////////////////////// + +EXPCL_DTOOLCONFIG void RegisterRuntimeClass(Dtool_PyTypedObject *otype, int class_id); + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +EXPCL_DTOOLCONFIG Dtool_PyTypedObject *Dtool_RuntimeTypeDtoolType(int type); + //////////////////////////////////////////////////////////////////////// // Function : DTOOL_Call_ExtractThisPointerForType // -// These are the wrappers that allow for down and upcast from type .. +// These are the wrappers that allow for down and upcast from type .. // needed by the Dtool py interface.. Be very careful if you muck // with these as the generated code depends on how this is set // up.. //////////////////////////////////////////////////////////////////////// EXPCL_DTOOLCONFIG void DTOOL_Call_ExtractThisPointerForType(PyObject *self, Dtool_PyTypedObject * classdef, void ** answer); -EXPCL_DTOOLCONFIG void *DTOOL_Call_GetPointerThisClass(PyObject *self, Dtool_PyTypedObject *classdef, int param, const string &function_name, bool const_ok, PyObject **coerced, bool report_errors); - -EXPCL_DTOOLCONFIG void *DTOOL_Call_GetPointerThisClass(PyObject *self, Dtool_PyTypedObject *classdef, int param, const string &function_name, bool const_ok, PyObject **coerced); +EXPCL_DTOOLCONFIG void *DTOOL_Call_GetPointerThisClass(PyObject *self, Dtool_PyTypedObject *classdef, int param, const string &function_name, bool const_ok, bool report_errors); EXPCL_DTOOLCONFIG void *DTOOL_Call_GetPointerThis(PyObject *self); +EXPCL_DTOOLCONFIG bool Dtool_Call_ExtractThisPointer(PyObject *self, Dtool_PyTypedObject &classdef, void **answer); + +EXPCL_DTOOLCONFIG bool Dtool_Call_ExtractThisPointer_NonConst(PyObject *self, Dtool_PyTypedObject &classdef, + void **answer, const char *method_name); + +template INLINE bool DTOOL_Call_ExtractThisPointer(PyObject *self, T *&into) { + if (DtoolCanThisBeAPandaInstance(self)) { + Dtool_PyTypedObject *target_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index()); + if (target_class != NULL) { + into = (T*) ((Dtool_PyInstDef *)self)->_My_Type->_Dtool_UpcastInterface(self, target_class); + return (into != NULL); + } + } + into = NULL; + return false; +} + +// Functions related to error reporting. + +#ifdef NDEBUG +// _PyErr_OCCURRED is an undocumented inline version of PyErr_Occurred. +#define Dtool_CheckErrorOccurred() (_PyErr_OCCURRED() != NULL) +#else +EXPCL_DTOOLCONFIG bool Dtool_CheckErrorOccurred(); +#endif + +EXPCL_DTOOLCONFIG PyObject *Dtool_Raise_AssertionError(); +EXPCL_DTOOLCONFIG PyObject *Dtool_Raise_TypeError(const char *message); +EXPCL_DTOOLCONFIG PyObject *Dtool_Raise_ArgTypeError(PyObject *obj, int param, const char *function_name, const char *type_name); + +EXPCL_DTOOLCONFIG PyObject *_Dtool_Raise_BadArgumentsError(); +#ifdef NDEBUG +// Define it to a function that just prints a generic message. +#define Dtool_Raise_BadArgumentsError(x) _Dtool_Raise_BadArgumentsError() +#else +// Expand this to a TypeError listing all of the overloads. +#define Dtool_Raise_BadArgumentsError(x) Dtool_Raise_TypeError("Arguments must match:\n" x) +#endif + +EXPCL_DTOOLCONFIG PyObject *_Dtool_Return_None(); +EXPCL_DTOOLCONFIG PyObject *Dtool_Return_Bool(bool value); + +#ifdef NDEBUG +#define Dtool_Return_None() (_PyErr_OCCURRED() != NULL ? NULL : (Py_INCREF(Py_None), Py_None)) +#else +#define Dtool_Return_None() _Dtool_Return_None() +#endif + //////////////////////////////////////////////////////////////////////// // Function : DTool_CreatePyInstanceTyped // -// this function relies on the behavior of typed objects in the panda system. +// this function relies on the behavior of typed objects in the panda system. // //////////////////////////////////////////////////////////////////////// EXPCL_DTOOLCONFIG PyObject *DTool_CreatePyInstanceTyped(void *local_this_in, Dtool_PyTypedObject &known_class_type, bool memory_rules, bool is_const, int RunTimeType); //////////////////////////////////////////////////////////////////////// -// DTool_CreatePyInstance .. wrapper function to finalize the existance of a general +// DTool_CreatePyInstance .. wrapper function to finalize the existance of a general // dtool py instance.. //////////////////////////////////////////////////////////////////////// EXPCL_DTOOLCONFIG PyObject *DTool_CreatePyInstance(void *local_this, Dtool_PyTypedObject &in_classdef, bool memory_rules, bool is_const); +// These template methods allow use when the Dtool_PyTypedObject is not known. +// They require a get_class_type() to be defined for the class. +template INLINE PyObject *DTool_CreatePyInstance(const T *obj, bool memory_rules) { + Dtool_PyTypedObject *known_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index()); + nassertr(known_class != NULL, NULL); + return DTool_CreatePyInstance((void*) obj, *known_class, memory_rules, true); +} + +template INLINE PyObject *DTool_CreatePyInstance(T *obj, bool memory_rules) { + Dtool_PyTypedObject *known_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index()); + nassertr(known_class != NULL, NULL); + return DTool_CreatePyInstance((void*) obj, *known_class, memory_rules, false); +} + +template INLINE PyObject *DTool_CreatePyInstanceTyped(const T *obj, bool memory_rules) { + Dtool_PyTypedObject *known_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index()); + nassertr(known_class != NULL, NULL); + return DTool_CreatePyInstanceTyped((void*) obj, *known_class, memory_rules, true, obj->get_type().get_index()); +} + +template INLINE PyObject *DTool_CreatePyInstanceTyped(T *obj, bool memory_rules) { + Dtool_PyTypedObject *known_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index()); + nassertr(known_class != NULL, NULL); + return DTool_CreatePyInstanceTyped((void*) obj, *known_class, memory_rules, false, obj->get_type().get_index()); +} + /////////////////////////////////////////////////////////////////////////////// -// Macro(s) class definition .. Used to allocate storage and +// Macro(s) class definition .. Used to allocate storage and // init some values for a Dtool Py Type object. ///////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// @@ -372,13 +408,10 @@ EXPCL_DTOOLCONFIG PyObject *DTool_CreatePyInstance(void *local_this, Dtool_PyTyp #define Define_Module_Class_Internal(MODULE_NAME,CLASS_NAME,CNAME)\ extern EXPORT_THIS Dtool_PyTypedObject Dtool_##CLASS_NAME;\ -extern struct PyMethodDef Dtool_Methods_##CLASS_NAME[];\ int Dtool_Init_##CLASS_NAME(PyObject *self, PyObject *args, PyObject *kwds);\ -int Dtool_InitNoCoerce_##CLASS_NAME(PyObject *self, PyObject *args);\ PyObject * Dtool_new_##CLASS_NAME(PyTypeObject *type, PyObject *args, PyObject *kwds);\ void * Dtool_UpcastInterface_##CLASS_NAME(PyObject *self, Dtool_PyTypedObject *requested_type);\ -void * Dtool_DowncastInterface_##CLASS_NAME(void *self, Dtool_PyTypedObject *requested_type);\ -void Dtool_PyModuleClassInit_##CLASS_NAME(PyObject *module); +void * Dtool_DowncastInterface_##CLASS_NAME(void *self, Dtool_PyTypedObject *requested_type); /////////////////////////////////////////////////////////////////////////////// #define Define_Module_Class(MODULE_NAME,CLASS_NAME,CNAME,PUBLIC_NAME)\ @@ -408,14 +441,13 @@ Define_Dtool_new(CLASS_NAME,CNAME)\ Define_Dtool_FreeInstanceRef(CLASS_NAME,CNAME)\ Define_Dtool_Class(MODULE_NAME,CLASS_NAME,PUBLIC_NAME) - /////////////////////////////////////////////////////////////////////////////// /// Th Finalizer for simple instances.. /////////////////////////////////////////////////////////////////////////////// EXPCL_DTOOLCONFIG int DTool_PyInit_Finalize(PyObject *self, void *This, Dtool_PyTypedObject *type, bool memory_rules, bool is_const); /////////////////////////////////////////////////////////////////////////////// -/// A heler function to glu methed definition together .. that can not be done at +/// A heler function to glu methed definition together .. that can not be done at // code generation time becouse of multiple generation passes in interigate.. // /////////////////////////////////////////////////////////////////////////////// @@ -424,22 +456,8 @@ typedef std::map MethodDefmap; EXPCL_DTOOLCONFIG void Dtool_Accum_MethDefs(PyMethodDef in[], MethodDefmap &themap); /////////////////////////////////////////////////////////////////////////////// -// ** HACK ** allert.. -// -// Need to keep a runtime type dictionary ... that is forward declared of typed object. -// We rely on the fact that typed objects are uniquly defined by an integer. -// -/////////////////////////////////////////////////////////////////////////////// - -EXPCL_DTOOLCONFIG void RegisterRuntimeClass(Dtool_PyTypedObject * otype, int class_id); - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -EXPCL_DTOOLCONFIG Dtool_PyTypedObject *Dtool_RuntimeTypeDtoolType(int type); - -/////////////////////////////////////////////////////////////////////////////// -//// We need a way to runtime merge compile units into a python "Module" .. this is done with the -/// fallowing structors and code.. along with the support of interigate_module +//// We need a way to runtime merge compile units into a python "Module" .. this is done with the +/// fallowing structors and code.. along with the support of interigate_module /////////////////////////////////////////////////////////////////////////////// struct LibraryDef { typedef void (*ConstantFunction)(PyObject *); @@ -456,7 +474,7 @@ EXPCL_DTOOLCONFIG PyObject *Dtool_PyModuleInitHelper(LibraryDef *defs[], const c #endif /////////////////////////////////////////////////////////////////////////////// -/// HACK.... Be carefull +/// HACK.... Be carefull // // Dtool_BorrowThisReference // This function can be used to grab the "THIS" pointer from an object and use it @@ -476,7 +494,7 @@ EXPCL_DTOOLCONFIG long DTool_HashKey(PyObject * inst) { long outcome = (long)inst; PyObject * func = PyObject_GetAttrString(inst, "__hash__"); - if (func == NULL) + if (func == NULL) { if(DtoolCanThisBeAPandaInstance(inst)) if(((Dtool_PyInstDef *)inst)->_ptr_to_object != NULL) @@ -488,13 +506,13 @@ EXPCL_DTOOLCONFIG long DTool_HashKey(PyObject * inst) Py_DECREF(func); if (res == NULL) return -1; - if (PyInt_Check(res)) + if (PyInt_Check(res)) { outcome = PyInt_AsLong(res); if (outcome == -1) outcome = -2; } - else + else { PyErr_SetString(PyExc_TypeError, "__hash__() should return an int"); @@ -514,6 +532,7 @@ EXPCL_DTOOLCONFIG long DTool_HashKey(PyObject * inst) XXX of error. */ +EXPCL_DTOOLCONFIG int DTOOL_PyObject_ComparePointers(PyObject *v1, PyObject *v2); EXPCL_DTOOLCONFIG int DTOOL_PyObject_Compare(PyObject *v1, PyObject *v2); EXPCL_DTOOLCONFIG PyObject *DTOOL_PyObject_RichCompare(PyObject *v1, PyObject *v2, int op); @@ -531,11 +550,15 @@ copy_from_copy_constructor(PyObject *self); EXPCL_DTOOLCONFIG PyObject * map_deepcopy_to_copy(PyObject *self, PyObject *args); +#if PY_MAJOR_VERSION < 3 +// In the Python 3 case, it is defined as a macro, at the beginning of this file. EXPCL_DTOOLCONFIG PyObject * PyLongOrInt_FromUnsignedLong(unsigned long value); +#endif EXPCL_DTOOLCONFIG extern struct Dtool_PyTypedObject Dtool_DTOOL_SUPER_BASE; +EXPCL_DTOOLCONFIG extern void Dtool_PyModuleClassInit_DTOOL_SUPER_BASE(PyObject *module); #endif // HAVE_PYTHON && !CPPPARSER -#endif // PY_PANDA_H_ +#endif // PY_PANDA_H_ diff --git a/dtool/src/parser-inc/Python.h b/dtool/src/parser-inc/Python.h index 329c8ed5bd..de17409f53 100755 --- a/dtool/src/parser-inc/Python.h +++ b/dtool/src/parser-inc/Python.h @@ -26,14 +26,31 @@ typedef _object PyObject; struct _typeobject; typedef _typeobject PyTypeObject; -struct PyStringObject; -struct PyUnicodeObject; +typedef struct {} PyStringObject; +typedef struct {} PyUnicodeObject; class PyThreadState; typedef int Py_ssize_t; struct Py_buffer; +// We need to define these accurately since interrogate may want to +// write these out to default value assignments. +PyObject _Py_NoneStruct; +PyObject _Py_TrueStruct; +#define Py_None (&_Py_NoneStruct) +#define Py_True ((PyObject *) &_Py_TrueStruct) + +#if PY_MAJOR_VERSION >= 3 +PyObject _Py_ZeroStruct; +#define Py_False ((PyObject *) &_Py_ZeroStruct) +#else +PyObject _Py_FalseStruct; +#define Py_False ((PyObject *) &_Py_FalseStruct) +#endif + // This file defines PY_VERSION_HEX, which is used in some places. #include "patchlevel.h" +typedef void *visitproc; + #endif // PYTHON_H diff --git a/dtool/src/parser-inc/cg.h b/dtool/src/parser-inc/cg.h index 5af0889578..a0adab732b 100755 --- a/dtool/src/parser-inc/cg.h +++ b/dtool/src/parser-inc/cg.h @@ -20,11 +20,12 @@ #ifndef CG_H #define CG_H -typedef int CGcontext; -typedef int CGprogram; -typedef int CGparameter; -typedef int CGprofile; -typedef int CGerror; +typedef struct _CGcontext *CGcontext; +typedef struct _CGcontext *CGcontext; +typedef struct _CGprogram *CGprogram; +typedef struct _CGparameter *CGparameter; + +typedef enum {} CGprofile; +typedef enum {} CGerror; #endif - diff --git a/dtool/src/parser-inc/iostream b/dtool/src/parser-inc/iostream index 4afc03ddef..87fd92ebcd 100644 --- a/dtool/src/parser-inc/iostream +++ b/dtool/src/parser-inc/iostream @@ -36,6 +36,13 @@ __published: }; enum openmode { }; + // Don't define these lest interrogate get tempted to actually + // substitute in the values, which are implementation-defined. + static const openmode app; + static const openmode binary; + static const openmode in; + static const openmode out; + static const openmode trunc; }; class ios : public ios_base { __published: diff --git a/dtool/src/parser-inc/ssl.h b/dtool/src/parser-inc/ssl.h index 24e968ed5f..d43aca6090 100644 --- a/dtool/src/parser-inc/ssl.h +++ b/dtool/src/parser-inc/ssl.h @@ -10,6 +10,6 @@ struct X509; struct X509_STORE; struct X509_NAME; struct SSL; -#define STACK_OF(num) STACK +#define STACK_OF(type) struct stack_st_##type #endif diff --git a/dtool/src/parser-inc/stdtypedefs.h b/dtool/src/parser-inc/stdtypedefs.h index 14db248dd5..34b9b0b4c6 100644 --- a/dtool/src/parser-inc/stdtypedefs.h +++ b/dtool/src/parser-inc/stdtypedefs.h @@ -38,7 +38,11 @@ typedef unsigned long ulong; typedef unsigned short ushort; typedef unsigned char uchar; +#ifdef __cplusplus +#define NULL 0 +#else #define NULL ((void *)0) +#endif typedef int fd_set; diff --git a/dtool/src/parser-inc/string b/dtool/src/parser-inc/string index f2a3c33e9e..0ec8e184ba 100644 --- a/dtool/src/parser-inc/string +++ b/dtool/src/parser-inc/string @@ -25,6 +25,9 @@ template class basic_string { public: + typedef typename size_t size_type; + static const size_t npos; + basic_string(); basic_string(const basic_string ©); void operator = (const basic_string ©); diff --git a/dtool/src/parser-inc/windows.h b/dtool/src/parser-inc/windows.h index 334b62c5fb..22f9f2ffb7 100644 --- a/dtool/src/parser-inc/windows.h +++ b/dtool/src/parser-inc/windows.h @@ -26,7 +26,7 @@ typedef long DWORD; typedef long LONG; typedef long UINT; typedef unsigned long ULONG; -typedef signed __int64 LONGLONG; +typedef signed long long LONGLONG; typedef long HRESULT; typedef int CRITICAL_SECTION; typedef int HANDLE; @@ -45,12 +45,12 @@ typedef struct _STICKYKEYS STICKYKEYS; typedef struct _TOGGLEKEYS TOGGLEKEYS; typedef struct _FILTERKEYS FILTERKEYS; -#define CALLBACK +#define CALLBACK #define WINAPI union LARGE_INTEGER { - __int64 QuadPart; + long long QuadPart; }; class IGraphBuilder; diff --git a/dtool/src/parser-inc/winsock2.h b/dtool/src/parser-inc/winsock2.h index 474a821987..3033be48f2 100644 --- a/dtool/src/parser-inc/winsock2.h +++ b/dtool/src/parser-inc/winsock2.h @@ -2,16 +2,8 @@ #define _WINSOCK2API_ #define _WINSOCKAPI_ /* Prevent inclusion of winsock.h in windows.h */ -typedef int SOCKET ; +typedef int SOCKET; -struct sockaddr_in -{ -}; - - -typedef struct fd_set { - unsigned int fd_count; /* how many are SET? */ - SOCKET fd_array[10]; /* an array of SOCKETs */ -} fd_set; +struct sockaddr_in; #endif diff --git a/dtool/src/prc/config_prc.cxx b/dtool/src/prc/config_prc.cxx index 06079f8281..6db118e093 100644 --- a/dtool/src/prc/config_prc.cxx +++ b/dtool/src/prc/config_prc.cxx @@ -19,6 +19,6 @@ NotifyCategoryDef(prc, ""); -ConfigVariableBool assert_abort +ALIGN_16BYTE ConfigVariableBool assert_abort ("assert-abort", false, PRC_DESC("Set this true to trigger a core dump and/or stack trace when the first assertion fails")); diff --git a/dtool/src/prc/config_prc.h b/dtool/src/prc/config_prc.h index 321a6db00d..6084b035b0 100644 --- a/dtool/src/prc/config_prc.h +++ b/dtool/src/prc/config_prc.h @@ -22,7 +22,8 @@ class ConfigVariableBool; NotifyCategoryDecl(prc, EXPCL_DTOOLCONFIG, EXPTP_DTOOLCONFIG); -extern ConfigVariableBool assert_abort; +// This is aligned to match the shadowed definition in notify.cxx. +extern ALIGN_16BYTE ConfigVariableBool assert_abort; #endif diff --git a/dtool/src/prc/notify.cxx b/dtool/src/prc/notify.cxx index b8fe219e9b..ebfd19ac42 100644 --- a/dtool/src/prc/notify.cxx +++ b/dtool/src/prc/notify.cxx @@ -182,54 +182,6 @@ get_assert_handler() const { return _assert_handler; } -//////////////////////////////////////////////////////////////////// -// Function: Notify::has_assert_failed -// Access: Public -// Description: Returns true if an assertion test has failed (and not -// been ignored) since the last call to -// clear_assert_failed(). -// -// When an assertion test fails, the assert handler -// may decide either to abort, return, or ignore the -// assertion. Naturally, if it decides to abort, this -// flag is irrelevant. If it chooses to ignore the -// assertion, the flag is not set. However, if the -// assert handler chooses to return out of the -// function (the normal case), it will also set this -// flag to indicate that an assertion failure has -// occurred. -// -// This will also be the behavior in the absence of a -// user-defined assert handler. -//////////////////////////////////////////////////////////////////// -bool Notify:: -has_assert_failed() const { - return _assert_failed; -} - -//////////////////////////////////////////////////////////////////// -// Function: Notify::get_assert_error_message -// Access: Public -// Description: Returns the error message that corresponds to the -// assertion that most recently failed. -//////////////////////////////////////////////////////////////////// -const string &Notify:: -get_assert_error_message() const { - return _assert_error_message; -} - -//////////////////////////////////////////////////////////////////// -// Function: Notify::clear_assert_failed -// Access: Public -// Description: Resets the assert_failed flag that is set whenever an -// assertion test fails. See has_assert_failed(). -//////////////////////////////////////////////////////////////////// -void Notify:: -clear_assert_failed() { - _assert_failed = false; -} - - //////////////////////////////////////////////////////////////////// // Function: Notify::get_top_category // Access: Public @@ -269,7 +221,7 @@ get_category(const string &basename, NotifyCategory *parent_category) { } } - pair result = + pair result = _categories.insert(Categories::value_type(fullname, (NotifyCategory *)NULL)); bool inserted = result.second; @@ -451,14 +403,14 @@ assert_failure(const char *expression, int line, // This is redefined here, shadowing the defining in config_prc.h, // so we can guarantee it has already been constructed. - ConfigVariableBool assert_abort("assert-abort", false); + ALIGN_16BYTE ConfigVariableBool assert_abort("assert-abort", false); if (assert_abort) { #ifdef WIN32 // How to trigger an exception in VC++ that offers to take us into // the debugger? abort() doesn't do it. We used to be able to // assert(false), but in VC++ 7 that just throws an exception, and // an uncaught exception just exits, without offering to open the - // debugger. + // debugger. // DebugBreak() seems to be provided for this purpose, but it // doesn't seem to work properly either, since we don't seem to @@ -567,7 +519,7 @@ config_initialized() { dup2(logfile_fd, STDOUT_FILENO); dup2(logfile_fd, STDERR_FILENO); close(logfile_fd); - + set_ostream_ptr(&cerr, false); } #else diff --git a/dtool/src/prc/pnotify.I b/dtool/src/prc/pnotify.I index 4960718d48..06919b8ae8 100644 --- a/dtool/src/prc/pnotify.I +++ b/dtool/src/prc/pnotify.I @@ -12,3 +12,50 @@ // //////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////// +// Function: Notify::has_assert_failed +// Access: Public +// Description: Returns true if an assertion test has failed (and not +// been ignored) since the last call to +// clear_assert_failed(). +// +// When an assertion test fails, the assert handler +// may decide either to abort, return, or ignore the +// assertion. Naturally, if it decides to abort, this +// flag is irrelevant. If it chooses to ignore the +// assertion, the flag is not set. However, if the +// assert handler chooses to return out of the +// function (the normal case), it will also set this +// flag to indicate that an assertion failure has +// occurred. +// +// This will also be the behavior in the absence of a +// user-defined assert handler. +//////////////////////////////////////////////////////////////////// +INLINE bool Notify:: +has_assert_failed() const { + return _assert_failed; +} + +//////////////////////////////////////////////////////////////////// +// Function: Notify::get_assert_error_message +// Access: Public +// Description: Returns the error message that corresponds to the +// assertion that most recently failed. +//////////////////////////////////////////////////////////////////// +INLINE const string &Notify:: +get_assert_error_message() const { + return _assert_error_message; +} + +//////////////////////////////////////////////////////////////////// +// Function: Notify::clear_assert_failed +// Access: Public +// Description: Resets the assert_failed flag that is set whenever an +// assertion test fails. See has_assert_failed(). +//////////////////////////////////////////////////////////////////// +INLINE void Notify:: +clear_assert_failed() { + _assert_failed = false; +} diff --git a/dtool/src/prc/pnotify.h b/dtool/src/prc/pnotify.h index b45747860b..53dd7d11f7 100644 --- a/dtool/src/prc/pnotify.h +++ b/dtool/src/prc/pnotify.h @@ -51,9 +51,9 @@ PUBLISHED: bool has_assert_handler() const; AssertHandler *get_assert_handler() const; - bool has_assert_failed() const; - const string &get_assert_error_message() const; - void clear_assert_failed(); + INLINE bool has_assert_failed() const; + INLINE const string &get_assert_error_message() const; + INLINE void clear_assert_failed(); NotifyCategory *get_top_category(); NotifyCategory *get_category(const string &basename, diff --git a/dtool/src/pystub/pystub.cxx b/dtool/src/pystub/pystub.cxx index 305eabd596..2c0dd9303b 100644 --- a/dtool/src/pystub/pystub.cxx +++ b/dtool/src/pystub/pystub.cxx @@ -79,6 +79,7 @@ extern "C" { EXPCL_PYSTUB int PyLong_AsUnsignedLongLong(...); EXPCL_PYSTUB int PyLong_FromLong(...); EXPCL_PYSTUB int PyLong_FromLongLong(...); + EXPCL_PYSTUB int PyLong_FromSize_t(...); EXPCL_PYSTUB int PyLong_FromUnsignedLong(...); EXPCL_PYSTUB int PyLong_FromUnsignedLongLong(...); EXPCL_PYSTUB int PyLong_Type(...); @@ -122,6 +123,7 @@ extern "C" { EXPCL_PYSTUB int PySequence_Tuple(...); EXPCL_PYSTUB int PyString_AsString(...); EXPCL_PYSTUB int PyString_AsStringAndSize(...); + EXPCL_PYSTUB int PyString_FromFormat(...); EXPCL_PYSTUB int PyString_FromString(...); EXPCL_PYSTUB int PyString_FromStringAndSize(...); EXPCL_PYSTUB int PyString_InternFromString(...); @@ -153,6 +155,8 @@ extern "C" { EXPCL_PYSTUB int PyUnicode_AsUTF8(...); EXPCL_PYSTUB int PyUnicode_AsUTF8AndSize(...); EXPCL_PYSTUB int PyUnicode_AsWideChar(...); + EXPCL_PYSTUB int PyUnicode_AsWideCharString(...); + EXPCL_PYSTUB int PyUnicode_FromFormat(...); EXPCL_PYSTUB int PyUnicode_FromString(...); EXPCL_PYSTUB int PyUnicode_FromStringAndSize(...); EXPCL_PYSTUB int PyUnicode_FromWideChar(...); @@ -192,6 +196,7 @@ extern "C" { EXPCL_PYSTUB extern void *PyExc_SystemExit; EXPCL_PYSTUB extern void *PyExc_TypeError; EXPCL_PYSTUB extern void *PyExc_ValueError; + EXPCL_PYSTUB extern void *_PyThreadState_Current; EXPCL_PYSTUB extern void *_Py_FalseStruct; EXPCL_PYSTUB extern void *_Py_NoneStruct; EXPCL_PYSTUB extern void *_Py_NotImplementedStruct; @@ -264,6 +269,7 @@ int PyLong_AsUnsignedLong(...) { return 0; } int PyLong_AsUnsignedLongLong(...) { return 0; } int PyLong_FromLong(...) { return 0; } int PyLong_FromLongLong(...) { return 0; } +int PyLong_FromSize_t(...) { return 0; } int PyLong_FromUnsignedLong(...) { return 0; } int PyLong_FromUnsignedLongLong(...) { return 0; } int PyLong_Type(...) { return 0; } @@ -307,6 +313,7 @@ int PySequence_Size(...) { return 0; } int PySequence_Tuple(...) { return 0; } int PyString_AsString(...) { return 0; } int PyString_AsStringAndSize(...) { return 0; } +int PyString_FromFormat(...) { return 0; } int PyString_FromString(...) { return 0; } int PyString_FromStringAndSize(...) { return 0; } int PyString_InternFromString(...) { return 0; } @@ -338,6 +345,8 @@ int PyUnicodeUCS4_GetSize(...) { return 0; } int PyUnicode_AsUTF8(...) { return 0; } int PyUnicode_AsUTF8AndSize(...) { return 0; } int PyUnicode_AsWideChar(...) { return 0; } +int PyUnicode_AsWideCharString(...) { return 0; } +int PyUnicode_FromFormat(...) { return 0; } int PyUnicode_FromString(...) { return 0; } int PyUnicode_FromStringAndSize(...) { return 0; } int PyUnicode_FromWideChar(...) { return 0; } @@ -382,6 +391,7 @@ void *PyExc_StopIteration = (void *)NULL; void *PyExc_SystemExit = (void *)NULL; void *PyExc_TypeError = (void *)NULL; void *PyExc_ValueError = (void *)NULL; +void *_PyThreadState_Current = (void *)NULL; void *_Py_FalseStruct = (void *)NULL; void *_Py_NoneStruct = (void *)NULL; void *_Py_NotImplementedStruct = (void *)NULL; diff --git a/makepanda/installer.nsi b/makepanda/installer.nsi index e0b838c48f..c5e0df0e5f 100755 --- a/makepanda/installer.nsi +++ b/makepanda/installer.nsi @@ -136,7 +136,7 @@ SectionGroup "Panda3D Libraries" File "${BUILT}\LICENSE" File /r /x CVS "${BUILT}\ReleaseNotes" SetOutPath $INSTDIR\bin - File /r /x libpandagl.dll /x libpandadx9.dll /x cgD3D*.dll /x python*.dll /x libpandaode.dll /x libp3fmod_audio.dll /x fmodex*.dll /x libp3ffmpeg.dll /x av*.dll /x postproc*.dll /x swscale*.dll /x swresample*.dll /x libp3rocket.dll /x boost_python*.dll /x Rocket*.dll /x _rocket*.pyd /x libpandabullet.dll /x OpenAL32.dll /x *_oal.dll /x libp3openal_audio.dll "${BUILT}\bin\*.dll" + File /r /x libpandagl.dll /x libpandadx9.dll /x cgD3D*.dll /x python*.dll /x libpandaode.dll /x libp3fmod_audio.dll /x fmodex*.dll /x libp3ffmpeg.dll /x av*.dll /x postproc*.dll /x swscale*.dll /x swresample*.dll /x NxCharacter*.dll /x cudart*.dll /x PhysX*.dll /x libpandaphysx.dll /x libp3rocket.dll /x boost_python*.dll /x Rocket*.dll /x _rocket*.pyd /x libpandabullet.dll /x OpenAL32.dll /x *_oal.dll /x libp3openal_audio.dll "${BUILT}\bin\*.dll" File /nonfatal /r "${BUILT}\bin\Microsoft.*.manifest" SetOutPath $INSTDIR\etc File /r "${BUILT}\etc\*" @@ -223,6 +223,18 @@ SectionGroup "Panda3D Libraries" SectionEnd !endif + !ifdef HAVE_PHYSX + Section "NVIDIA PhysX" SecPhysX + SectionIn 1 + + SetOutPath "$INSTDIR\bin" + File "${BUILT}\bin\libpandaphysx.dll" + File /nonfatal /r "${BUILT}\bin\PhysX*.dll" + File /nonfatal /r "${BUILT}\bin\NxCharacter*.dll" + File /nonfatal /r "${BUILT}\bin\cudart*.dll" + SectionEnd + !endif + !ifdef HAVE_ROCKET Section "libRocket GUI" SecRocket SectionIn 1 @@ -315,26 +327,26 @@ SectionGroup "Python support" SetOutPath $INSTDIR\Pmw File /r /x CVS "${BUILT}\Pmw\*" - ; Check for a user installation of Python. - ReadRegStr $0 HKCU "Software\Python\PythonCore\${PYVER}\InstallPath" "" - StrCmp $0 "$INSTDIR\python" CheckSystemWidePython 0 - StrCmp $0 "" CheckSystemWidePython 0 - IfFileExists "$0\ppython.exe" CheckSystemWidePython 0 - IfFileExists "$0\python.exe" AskExternalPth 0 + !ifdef REGVIEW + SetRegView ${REGVIEW} + !endif ; Check for a system-wide Python installation. - CheckSystemWidePython: + ; We could check for a user installation of Python as well, but there + ; is no distinction between 64-bit and 32-bit regviews in HKCU, so we + ; can't guess whether it might be a compatible version. ReadRegStr $0 HKLM "Software\Python\PythonCore\${PYVER}\InstallPath" "" StrCmp $0 "$INSTDIR\python" SkipExternalPth 0 StrCmp $0 "" SkipExternalPth 0 IfFileExists "$0\ppython.exe" SkipExternalPth 0 - IfFileExists "$0\python.exe" AskExternalPth SkipExternalPth + IfFileExists "$0\python.exe" 0 SkipExternalPth - AskExternalPth: + ; We're pretty sure this Python build is of the right architecture. MessageBox MB_YESNO|MB_ICONQUESTION \ - "Your system already has a ${REGVIEW}-bit copy of Python ${PYVER} installed in:$\r$\n$0$\r$\nWould you like to configure it to be able to use the Panda3D libraries?$\r$\nIf you choose no, you will only be able to use Panda3D's own copy of Python." \ - IDNO SkipExternalPth + "Your system already has a copy of Python ${PYVER} installed in:$\r$\n$0$\r$\nWould you like to configure it to be able to use the Panda3D libraries?$\r$\nIf you choose no, you will only be able to use Panda3D's own copy of Python." \ + IDYES WriteExternalPth IDNO SkipExternalPth + WriteExternalPth: FileOpen $1 "$0\Lib\site-packages\panda.pth" w FileWrite $1 "$INSTDIR$\r$\n" FileWrite $1 "$INSTDIR\bin$\r$\n" @@ -384,7 +396,7 @@ SectionGroup "Python support" AskRegPath: MessageBox MB_YESNO|MB_ICONQUESTION \ - "Your system already has a ${REGVIEW}-bit copy of Python ${PYVER} installed in:$\r$\n$0$\r$\n$\r$\nPanda3D installs its own copy of Python ${PYVER}, which will install alongside your existing copy. Would you like to make Panda's copy the default Python for your user account?" \ + "You already have a copy of Python ${PYVER} installed in:$\r$\n$0$\r$\n$\r$\nPanda3D installs its own copy of Python ${PYVER}, which will install alongside your existing copy. Would you like to make Panda's copy the default Python for your user account?" \ IDNO SkipRegPath RegPath: @@ -408,6 +420,10 @@ Function ConfirmPythonSelection IntOp $R1 $R1 & ${SF_SELECTED} StrCmp $R1 ${SF_SELECTED} 0 SkipCheck + !ifdef REGVIEW + SetRegView ${REGVIEW} + !endif + ; Check for a user installation of Python. ReadRegStr $0 HKCU "Software\Python\PythonCore\${PYVER}\InstallPath" "" StrCmp $0 "$INSTDIR\python" CheckSystemWidePython 0 @@ -427,7 +443,7 @@ Function ConfirmPythonSelection ; of a different Panda3D build.) Ask the user if he's sure about this. AskConfirmation: MessageBox MB_YESNO|MB_ICONQUESTION \ - "You do not appear to have a ${REGVIEW}-bit version of Python ${PYVER} installed that is compatible with Panda3D. Are you sure you don't want Panda to install a compatible copy of Python?$\r$\n$\r$\nIf you choose Yes, you will not be able to do Python development with Panda3D until you install a ${REGVIEW}-bit version of Python ${PYVER} and manually configure it to be able to use Panda3D." \ + "You do not appear to have a ${REGVIEW}-bit version of Python ${PYVER} installed. Are you sure you don't want Panda to install a compatible copy of Python?$\r$\n$\r$\nIf you choose Yes, you will not be able to do Python development with Panda3D until you install a ${REGVIEW}-bit version of Python ${PYVER} and manually configure it to be able to use Panda3D." \ IDYES SkipCheck ; User clicked no, so re-enable the select box and abort. diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index 0be433b6d7..30b5b48c17 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -73,6 +73,7 @@ global STRDXSDKVERSION, STRMSPLATFORMVERSION, BOOUSEINTELCOMPILER STRDXSDKVERSION = 'default' STRMSPLATFORMVERSION = 'default' BOOUSEINTELCOMPILER = False +OPENCV_VER_23 = False if "MACOSX_DEPLOYMENT_TARGET" in os.environ: OSXTARGET=os.environ["MACOSX_DEPLOYMENT_TARGET"] @@ -91,7 +92,7 @@ PkgListSet(["PYTHON", "DIRECT", # Python support "FFTW", # Algorithm helpers "ARTOOLKIT", "OPENCV", "DIRECTCAM", "VISION", # Augmented Reality "GTK2", # GTK2 is used for PStats on Unix - "NPAPI", "MFC", "WX", "FLTK", # Used for web plug-in only + "MFC", "WX", "FLTK", # Used for web plug-in only "ROCKET", "AWESOMIUM", # GUI libraries "CARBON", "COCOA", # Mac OS X toolkits "X11", "XF86DGA", "XRANDR", "XCURSOR", # Unix platform support @@ -139,8 +140,8 @@ def usage(problem): print(" --outputdir X (use the specified directory instead of 'built')") print(" --host URL (set the host url (runtime build only))") print(" --threads N (use the multithreaded build system. see manual)") - print(" --osxtarget N (the OSX version number to build for (OSX only))") - print(" --universal (build universal binaries (OSX only))") + print(" --osxtarget N (the OS X version number to build for (OS X only))") + print(" --universal (build universal binaries (OS X only))") print(" --override \"O=V\" (override dtool_config/prc option value)") print(" --static (builds libraries for static linking)") print(" --target X (experimental cross-compilation (android only))") @@ -152,7 +153,7 @@ def usage(problem): print("") print(" --nothing (disable every third-party lib)") print(" --everything (enable every third-party lib)") - print(" --directx-sdk=X (specify version of DX9 SDK to use: jun2010, aug2009, mar2009, aug2006)") + print(" --directx-sdk=X (specify version of DirectX SDK to use: jun2010, aug2009, mar2009, aug2006)") print(" --platform-sdk=X (specify MSPlatSdk to use: win71, win61, win60A, winserver2003r2)") print(" --use-icl (experimental setting to use an intel compiler instead of MSVC on Windows)") print("") @@ -261,6 +262,13 @@ def parseopts(args): OSXTARGET = "10.%d" % (int(OSXTARGET[-1])) except: usage("Invalid setting for OSXTARGET") + + if UNIVERSAL: + if not OSXTARGET: + exit("--universal requires --osxtarget") + if target_arch: + exit("--universal is incompatible with --arch") + try: SetOptimize(int(optimize)) assert GetOptimize() in [1, 2, 3, 4] @@ -283,7 +291,7 @@ def parseopts(args): winver = sys.getwindowsversion() if platsdk and os.path.isdir(platsdk) and winver[0] >= 6 and winver[1] >= 1: is_win7 = True - if not is_win7: + if RUNTIME or not is_win7: PkgDisable("TOUCHINPUT") parseopts(sys.argv[1:]) @@ -317,24 +325,25 @@ if (GetHost() == "darwin" and OSXTARGET != None): ## ######################################################################## -if (VERSION is None): - if (RUNTIME): - VERSION = ParsePluginVersion("dtool/PandaVersion.pp") - COREAPI_VERSION = VERSION + "." + ParseCoreapiVersion("dtool/PandaVersion.pp") - PLUGIN_VERSION = VERSION +PLUGIN_VERSION = ParsePluginVersion("dtool/PandaVersion.pp") +COREAPI_VERSION = PLUGIN_VERSION + "." + ParseCoreapiVersion("dtool/PandaVersion.pp") + +if VERSION is None: + if RUNTIME: + VERSION = PLUGIN_VERSION else: VERSION = ParsePandaVersion("dtool/PandaVersion.pp") - PLUGIN_VERSION = ParsePluginVersion("dtool/PandaVersion.pp") -if (COREAPI_VERSION is None): - COREAPI_VERSION = VERSION +print("Version: %s" % VERSION) +if RUNTIME or RTDIST: + print("Core API Version: %s" % COREAPI_VERSION) -if (DEBVERSION is None): +if DEBVERSION is None: DEBVERSION = VERSION MAJOR_VERSION = VERSION[:3] -if (P3DSUFFIX is None): +if P3DSUFFIX is None: P3DSUFFIX = MAJOR_VERSION outputdir_suffix = "" @@ -363,13 +372,13 @@ if not IsCustomOutputDir(): if (RUNTIME): for pkg in PkgListGet(): - if pkg in ["GTK2"]: + if pkg in ["GTK2", "MFC"]: # Optional package(s) for runtime. pass - elif pkg in ["OPENSSL", "ZLIB", "NPAPI", "JPEG", "PNG"]: + elif pkg in ["OPENSSL", "ZLIB"]: # Required packages for runtime. if (PkgSkip(pkg)==1): - exit("Runtime must be compiled with OpenSSL, ZLib, NPAPI, JPEG and PNG support!") + exit("Runtime must be compiled with OpenSSL and ZLib support!") else: # Unused packages for runtime. PkgDisable(pkg) @@ -383,9 +392,6 @@ if (INSTALLER and RTDIST): if (INSTALLER) and (PkgSkip("PYTHON")) and (not RUNTIME) and GetTarget() == 'windows': exit("Cannot build installer on Windows without python") -if (RTDIST) and (PkgSkip("JPEG")): - exit("Cannot build rtdist without jpeg") - if (RTDIST) and (PkgSkip("WX") and PkgSkip("FLTK")): exit("Cannot build rtdist without wx or fltk") @@ -435,10 +441,16 @@ if (RTDIST and DISTRIBUTOR == "cmu"): exit("The CMU 1.7 runtime distribution must be built against Python 2.6!") elif (RTDIST_VERSION == "cmu_1.8" and SDK["PYTHONVERSION"] != "python2.7"): exit("The CMU 1.8 runtime distribution must be built against Python 2.7!") + elif (RTDIST_VERSION == "cmu_1.9" and SDK["PYTHONVERSION"] != "python2.7"): + exit("The CMU 1.9 runtime distribution must be built against Python 2.7!") elif RTDIST and not HOST_URL: exit("You must specify a host URL when building the rtdist!") +if RUNTIME and not HOST_URL: + # Set this to a nice default. + HOST_URL = "https://runtime.panda3d.org/" + ######################################################################## ## ## Choose a Compiler. @@ -509,7 +521,7 @@ if (COMPILER == "MSVC"): LibName(pkg, 'd3dVNUM.lib'.replace("VNUM", vnum)) LibName(pkg, 'd3dxVNUM.lib'.replace("VNUM", vnum)) - if (vnum=="9" and "GENERIC_DXERR_LIBRARY" in SDK): + if int(vnum) >= 9 and "GENERIC_DXERR_LIBRARY" in SDK: LibName(pkg, 'dxerr.lib') else: LibName(pkg, 'dxerrVNUM.lib'.replace("VNUM", vnum)) @@ -589,14 +601,17 @@ if (COMPILER == "MSVC"): LibName("FMODEX", GetThirdpartyDir() + "fmodex/lib/fmodex64_vc.lib") else: LibName("FMODEX", GetThirdpartyDir() + "fmodex/lib/fmodex_vc.lib") + if (PkgSkip("FLTK")==0 and RTDIST): + LibName("FLTK", GetThirdpartyDir() + "fltk/lib/fltk.lib") + if not PkgSkip("FLTK"): + # If we have fltk, we don't need wx + PkgDisable("WX") if (PkgSkip("WX")==0 and RTDIST): LibName("WX", GetThirdpartyDir() + "wx/lib/wxbase28u.lib") LibName("WX", GetThirdpartyDir() + "wx/lib/wxmsw28u_core.lib") DefSymbol("WX", "__WXMSW__", "") DefSymbol("WX", "_UNICODE", "") DefSymbol("WX", "UNICODE", "") - if (PkgSkip("FLTK")==0 and RTDIST): - LibName("FLTK", GetThirdpartyDir() + "fltk/lib/fltk.lib") if (PkgSkip("VORBIS")==0): LibName("VORBIS", GetThirdpartyDir() + "vorbis/lib/libogg_static.lib") LibName("VORBIS", GetThirdpartyDir() + "vorbis/lib/libvorbis_static.lib") @@ -662,13 +677,13 @@ if (COMPILER == "MSVC"): if (COMPILER=="GCC"): PkgDisable("AWESOMIUM") - if (GetTarget() != "darwin"): + if GetTarget() != "darwin": PkgDisable("CARBON") PkgDisable("COCOA") - elif (RTDIST or RUNTIME): + elif RUNTIME: # We don't support Cocoa in the runtime yet. PkgDisable("COCOA") - elif (not UNIVERSAL and GetTargetArch() == 'x86_64'): + if UNIVERSAL or GetTargetArch() == 'x86_64': # 64-bits OS X doesn't have Carbon. PkgDisable("CARBON") @@ -680,13 +695,12 @@ if (COMPILER=="GCC"): IncDirectory("FREETYPE", "/usr/X11/include/freetype2") LibDirectory("FREETYPE", "/usr/X11/lib") - if (os.path.isdir("/usr/PCBSD")): - IncDirectory("ALWAYS", "/usr/PCBSD/local/include") - LibDirectory("ALWAYS", "/usr/PCBSD/local/lib") - if (GetHost() == "freebsd"): IncDirectory("ALWAYS", "/usr/local/include") LibDirectory("ALWAYS", "/usr/local/lib") + if (os.path.isdir("/usr/PCBSD")): + IncDirectory("ALWAYS", "/usr/PCBSD/local/include") + LibDirectory("ALWAYS", "/usr/PCBSD/local/lib") fcollada_libs = ("FColladaD", "FColladaSD", "FColladaS") # WARNING! The order of the ffmpeg libraries matters! @@ -710,12 +724,24 @@ if (COMPILER=="GCC"): SmartPkgEnable("NVIDIACG", "", ("Cg"), "Cg/cg.h", framework = "Cg") SmartPkgEnable("ODE", "", ("ode"), "ode/ode.h", tool = "ode-config") SmartPkgEnable("OPENAL", "openal", ("openal"), "AL/al.h", framework = "OpenAL") - SmartPkgEnable("OPENCV", "opencv", ("cv", "highgui", "cvaux", "ml", "cxcore"), ("opencv", "opencv/cv.h")) SmartPkgEnable("SQUISH", "", ("squish"), "squish.h") - SmartPkgEnable("TIFF", "", ("tiff"), "tiff.h") + SmartPkgEnable("TIFF", "libtiff-4", ("tiff"), "tiff.h") SmartPkgEnable("VRPN", "", ("vrpn", "quat"), ("vrpn", "quat.h", "vrpn/vrpn_Types.h")) SmartPkgEnable("BULLET", "bullet", ("BulletSoftBody", "BulletDynamics", "BulletCollision", "LinearMath"), ("bullet", "bullet/btBulletDynamicsCommon.h")) SmartPkgEnable("VORBIS", "vorbisfile",("vorbisfile", "vorbis", "ogg"), ("ogg/ogg.h", "vorbis/vorbisfile.h")) + SmartPkgEnable("JPEG", "", ("jpeg"), "jpeglib.h") + SmartPkgEnable("PNG", "libpng", ("png"), "png.h", tool = "libpng-config") + + if GetTarget() == "darwin" and not PkgSkip("FFMPEG"): + LibName("FFMPEG", "-Wl,-read_only_relocs,suppress") + + cv_lib = ChooseLib(("opencv_core", "cv"), "OPENCV") + if cv_lib == "opencv_core": + OPENCV_VER_23 = True + SmartPkgEnable("OPENCV", "opencv", ("opencv_core"), ("opencv2/core/core.hpp")) + else: + SmartPkgEnable("OPENCV", "opencv", ("cv", "highgui", "cvaux", "ml", "cxcore"), + ("opencv", "opencv/cv.h", "opencv/cxcore.h", "opencv/highgui.h")) rocket_libs = ("RocketCore", "RocketControls") if (GetOptimize() <= 3): @@ -725,39 +751,27 @@ if (COMPILER=="GCC"): rocket_libs += ("boost_python",) SmartPkgEnable("ROCKET", "", rocket_libs, "Rocket/Core.h") - SmartPkgEnable("JPEG", "", ("jpeg"), "jpeglib.h") + if not PkgSkip("PYTHON"): + if GetHost() == "darwin" and GetTarget() == "darwin" and not RTDIST: + # Use the system Python framework in the standard Mac SDK. + LibName("PYTHON", "-framework Python") + else: + SmartPkgEnable("PYTHON", "", SDK["PYTHONVERSION"], (SDK["PYTHONVERSION"], SDK["PYTHONVERSION"] + "/Python.h"), tool = SDK["PYTHONVERSION"] + "-config") + SmartPkgEnable("OPENSSL", "openssl", ("ssl", "crypto"), ("openssl/ssl.h", "openssl/crypto.h")) - SmartPkgEnable("PNG", "libpng", ("png"), "png.h", tool = "libpng-config") SmartPkgEnable("ZLIB", "zlib", ("z"), "zlib.h") SmartPkgEnable("GTK2", "gtk+-2.0") - if (RTDIST and GetHost() == "darwin" and "PYTHONVERSION" in SDK): - # Don't use the framework for the OSX rtdist build. I'm afraid it gives problems somewhere. - SmartPkgEnable("PYTHON", "", SDK["PYTHONVERSION"], (SDK["PYTHONVERSION"], SDK["PYTHONVERSION"] + "/Python.h"), tool = SDK["PYTHONVERSION"] + "-config") - elif("PYTHONVERSION" in SDK and not RUNTIME): - SmartPkgEnable("PYTHON", "", SDK["PYTHONVERSION"], (SDK["PYTHONVERSION"], SDK["PYTHONVERSION"] + "/Python.h"), tool = SDK["PYTHONVERSION"] + "-config", framework = "Python") - if (RTDIST): - SmartPkgEnable("WX", tool = "wx-config") - SmartPkgEnable("FLTK", "", ("fltk"), ("Fl/Fl.H"), tool = "fltk-config") - - if (RUNTIME): - if (GetHost() == 'darwin'): - SmartPkgEnable("NPAPI", "", (), ("npapi.h")) - if not os.path.isdir(GetThirdpartyDir() + "npapi"): - IncDirectory("NPAPI", "/System/Library/Frameworks/WebKit.framework/Headers") - - elif (GetHost() == "freebsd"): - SmartPkgEnable("NPAPI", "mozilla-plugin", (), ("libxul/stable", "libxul/stable/npapi.h", "nspr/prtypes.h", "nspr")) - else: - SmartPkgEnable("NPAPI", "mozilla-plugin", (), ("xulrunner-*/stable", "xulrunner-*/stable/npapi.h", "nspr*/prtypes.h", "nspr*")) + SmartPkgEnable("WX", tool = "wx-config") + SmartPkgEnable("FLTK", "", ("fltk"), ("FL/Fl.H"), tool = "fltk-config") if GetTarget() != 'darwin': # CgGL is covered by the Cg framework, and we don't need X11 components on OSX - if (PkgSkip("NVIDIACG")==0 and not RUNTIME): - SmartPkgEnable("CGGL", "", ("CgGL"), "Cg/cgGL.h") - if (not RUNTIME): - SmartPkgEnable("X11", "x11", "X11", ("X11", "X11/Xlib.h")) + if not PkgSkip("NVIDIACG") and not RUNTIME: + SmartPkgEnable("CGGL", "", ("CgGL"), "Cg/cgGL.h") + if not RUNTIME: + SmartPkgEnable("X11", "x11", "X11", ("X11", "X11/Xlib.h")) SmartPkgEnable("XRANDR", "xrandr", "Xrandr", "X11/extensions/Xrandr.h") SmartPkgEnable("XF86DGA", "xxf86dga", "Xxf86dga", "X11/extensions/xf86dga.h") SmartPkgEnable("XCURSOR", "xcursor", "Xcursor", "X11/Xcursor/Xcursor.h") @@ -778,14 +792,14 @@ if (COMPILER=="GCC"): elif not PkgSkip("X11"): LibDirectory("ALWAYS", "/usr/X11R6/lib") - if (RUNTIME): - # For the runtime, all packages are required - for pkg in ["OPENSSL", "ZLIB", "NPAPI", "JPEG", "PNG"]: + if RUNTIME: + # For the runtime, these packages are required + for pkg in ["OPENSSL", "ZLIB"]: skips = [] if (pkg in PkgListGet() and PkgSkip(pkg)==1): skips.append(pkg) if skips: - exit("Runtime must be compiled with OpenSSL, ZLib, NPAPI, JPEG and PNG support (missing %s)" % (', '.join(skips))) + exit("Runtime must be compiled with OpenSSL and ZLib support (missing %s)" % (', '.join(skips))) for pkg in MAYAVERSIONS: if (PkgSkip(pkg)==0 and (pkg in SDK)): @@ -891,22 +905,37 @@ def printStatus(header,warnings): tkeep = "" tomit = "" for x in PkgListGet(): - if (PkgSkip(x)==0): tkeep = tkeep + x + " " - else: tomit = tomit + x + " " - if RTDIST: print("Makepanda: Runtime distribution build") - elif RUNTIME: print("Makepanda: Runtime build") - else: print("Makepanda: Regular build") - print("Makepanda: Compiler:",COMPILER) - print("Makepanda: Optimize:",GetOptimize()) - print("Makepanda: Keep Pkg:",tkeep) - print("Makepanda: Omit Pkg:",tomit) - if (GENMAN): print("Makepanda: Generate API reference manual") - else : print("Makepanda: Don't generate API reference manual") - if (GetHost() == "windows" and not RTDIST): - if INSTALLER: print("Makepanda: Build installer, using",COMPRESSOR) - else : print("Makepanda: Don't build installer") - print("Makepanda: Version ID: "+VERSION) - for x in warnings: print("Makepanda: "+x) + if PkgSkip(x): + tomit = tomit + x + " " + else: + tkeep = tkeep + x + " " + + if RTDIST: + print("Makepanda: Runtime distribution build") + elif RUNTIME: + print("Makepanda: Runtime build") + else: + print("Makepanda: Regular build") + + print("Makepanda: Compiler: %s" % (COMPILER)) + print("Makepanda: Optimize: %d" % (GetOptimize())) + print("Makepanda: Keep Pkg: %s" % (tkeep)) + print("Makepanda: Omit Pkg: %s" % (tomit)) + + if GENMAN: + print("Makepanda: Generate API reference manual") + else: + print("Makepanda: Don't generate API reference manual") + + if GetHost() == "windows" and not RTDIST: + if INSTALLER: + print("Makepanda: Build installer, using %s" % (COMPRESSOR)) + else: + print("Makepanda: Don't build installer") + + print("Makepanda: Version ID: %s" % (VERSION)) + for x in warnings: + print("Makepanda: %s" % (x)) print("-------------------------------------------------------------------") print("") sys.stdout.flush() @@ -948,6 +977,8 @@ def CompileCxx(obj,src,opts): # Enable Windows 7 interfaces if we need Touchinput. if PkgSkip("TOUCHINPUT") == 0: cmd += "/DWINVER=0x601 " + else: + cmd += "/DWINVER=0x501 " cmd += "/Fo" + obj + " /nologo /c" if GetTargetArch() != 'x64' and (not PkgSkip("SSE2") or 'SSE2' in opts): cmd += " /arch:SSE2" @@ -998,6 +1029,8 @@ def CompileCxx(obj,src,opts): # Enable Windows 7 interfaces if we need Touchinput. if PkgSkip("TOUCHINPUT") == 0: cmd += "/DWINVER=0x601 " + else: + cmd += "/DWINVER=0x501 " cmd += "/Fo" + obj + " /c" for x in ipath: cmd += " /I" + x for (opt,dir) in INCDIRECTORIES: @@ -1080,9 +1113,11 @@ def CompileCxx(obj,src,opts): if (COMPILER=="GCC"): if (src.endswith(".c")): cmd = GetCC() +' -fPIC -c -o ' + obj - else: cmd = GetCXX()+' -ftemplate-depth-50 -fPIC -c -o ' + obj + else: cmd = GetCXX()+' -ftemplate-depth-70 -fPIC -c -o ' + obj for (opt, dir) in INCDIRECTORIES: if (opt=="ALWAYS") or (opt in opts): cmd += ' -I' + BracketNameWithQuotes(dir) + for (opt, dir) in FRAMEWORKDIRECTORIES: + if (opt=="ALWAYS") or (opt in opts): cmd += ' -F' + BracketNameWithQuotes(dir) for (opt,var,val) in DEFSYMBOLS: if (opt=="ALWAYS") or (opt in opts): cmd += ' -D' + var + '=' + val for x in ipath: cmd += ' -I' + x @@ -1093,10 +1128,15 @@ def CompileCxx(obj,src,opts): if (OSXTARGET != None): cmd += " -isysroot " + SDK["MACOSX"] cmd += " -mmacosx-version-min=" + OSXTARGET + if UNIVERSAL: cmd += " -arch i386" - if ("NOPPC" not in opts): - cmd += " -arch ppc" + if OSXTARGET: + osxver = int(OSXTARGET[-1]) + if "NOPPC" not in opts and int(OSXTARGET[-1]) < 6: + cmd += " -arch ppc" + if int(OSXTARGET[-1]) >= 5: + cmd += " -arch x86_64" elif HasTargetArch(): cmd += " -arch %s" % (GetTargetArch()) @@ -1272,7 +1312,7 @@ def CompileIgate(woutd,wsrc,opts): cmd += ' -srcdir %s -I%s -Dvolatile -Dmutable' % (srcdir, srcdir) if (COMPILER=="MSVC"): - cmd += ' -DCPPPARSER -D__STDC__=1 -D__cplusplus -D__inline -longlong __int64 -D_X86_ -DWIN32_VC -DWIN32 -D_WIN32' + cmd += ' -DCPPPARSER -D__STDC__=1 -D__cplusplus -D__inline -D_X86_ -DWIN32_VC -DWIN32 -D_WIN32' if GetTargetArch() == 'x64': cmd += ' -DWIN64_VC -DWIN64 -D_WIN64' # NOTE: this 1600 value is the version number for VC2010. @@ -1357,6 +1397,8 @@ def CompileLib(lib, obj, opts): if not BOOUSEINTELCOMPILER: #Use MSVC Linker cmd = 'link /lib /nologo' + if GetOptimizeOption(opts) == 4: + cmd += " /LTCG" if HasTargetArch(): cmd += " /MACHINE:" + GetTargetArch().upper() cmd += ' /OUT:' + BracketNameWithQuotes(lib) @@ -1548,10 +1590,15 @@ def CompileLink(dll, obj, opts): if OSXTARGET != None: cmd += " -isysroot " + SDK["MACOSX"] + " -Wl,-syslibroot," + SDK["MACOSX"] cmd += " -mmacosx-version-min=" + OSXTARGET + if UNIVERSAL: cmd += " -arch i386" - if ("NOPPC" not in opts): - cmd += " -arch ppc" + if OSXTARGET: + osxver = int(OSXTARGET[-1]) + if "NOPPC" not in opts and int(OSXTARGET[-1]) < 6: + cmd += " -arch ppc" + if int(OSXTARGET[-1]) >= 5: + cmd += " -arch x86_64" elif HasTargetArch(): cmd += " -arch %s" % (GetTargetArch()) @@ -1573,6 +1620,9 @@ def CompileLink(dll, obj, opts): for (opt, dir) in LIBDIRECTORIES: if (opt=="ALWAYS") or (opt in opts): cmd += ' -L' + BracketNameWithQuotes(dir) + for (opt, dir) in FRAMEWORKDIRECTORIES: + if (opt=="ALWAYS") or (opt in opts): + cmd += ' -F' + BracketNameWithQuotes(dir) for (opt, name) in LIBNAMES: if (opt=="ALWAYS") or (opt in opts): cmd += ' ' + BracketNameWithQuotes(name) @@ -1678,7 +1728,10 @@ def CompileRes(target, src, opts): def CompileRsrc(target, src, opts): """Compiles a Mac OS .r file into an .rsrc file.""" ipath = GetListOption(opts, "DIR:") - cmd = "/Developer/Tools/Rez -useDF" + if os.path.isfile("/usr/bin/Rez"): + cmd = "Rez -useDF" + else: + cmd = "/Developer/Tools/Rez -useDF" cmd += " -o " + BracketNameWithQuotes(target) for x in ipath: cmd += " -i " + x @@ -2129,6 +2182,9 @@ def WriteConfigSettings(): else: dtool_config["HAVE_"+x] = 'UNDEF' + if not PkgSkip("OPENCV"): + dtool_config["OPENCV_VER_23"] = '1' if OPENCV_VER_23 else 'UNDEF' + dtool_config["HAVE_NET"] = '1' if (PkgSkip("NVIDIACG")==0): @@ -2602,6 +2658,9 @@ MakeDirectory(GetOutputDir()+'/include/parser-inc/glew') MakeDirectory(GetOutputDir()+'/include/parser-inc/Eigen') MakeDirectory(GetOutputDir()+'/include/parser-inc/Rocket') MakeDirectory(GetOutputDir()+'/include/parser-inc/Rocket/Core') +MakeDirectory(GetOutputDir()+'/include/parser-inc/opencv2') +MakeDirectory(GetOutputDir()+'/include/parser-inc/opencv2/core') +MakeDirectory(GetOutputDir()+'/include/parser-inc/opencv2/highgui') CopyAllFiles(GetOutputDir()+'/include/parser-inc/openssl/','dtool/src/parser-inc/') CopyAllFiles(GetOutputDir()+'/include/parser-inc/netinet/','dtool/src/parser-inc/') CopyFile(GetOutputDir()+'/include/parser-inc/Cg/','dtool/src/parser-inc/cg.h') @@ -2614,6 +2673,8 @@ CopyFile(GetOutputDir()+'/include/parser-inc/glew/','dtool/src/parser-inc/glew.h CopyFile(GetOutputDir()+'/include/parser-inc/Eigen/','dtool/src/parser-inc/Dense') CopyFile(GetOutputDir()+'/include/parser-inc/Eigen/','dtool/src/parser-inc/StdVector') CopyFile(GetOutputDir()+'/include/parser-inc/Rocket/Core/','dtool/src/parser-inc/RenderInterface.h') +CopyFile(GetOutputDir()+'/include/parser-inc/opencv2/core/','dtool/src/parser-inc/core.hpp') +CopyFile(GetOutputDir()+'/include/parser-inc/opencv2/highgui/','dtool/src/parser-inc/highgui.hpp') DeleteVCS(GetOutputDir()+'/include/parser-inc') ######################################################################## @@ -3548,10 +3609,9 @@ if (not RUNTIME): DefSymbol("TINYXML", "TIXML_USE_STL", "") -if (RUNTIME or RTDIST): - OPTS=['DIR:panda/src/dxml', 'TINYXML'] - TargetAdd('tinyxml_composite1.obj', opts=OPTS, input='tinyxml_composite1.cxx') - TargetAdd('libp3tinyxml.ilb', input='tinyxml_composite1.obj') +OPTS=['DIR:panda/src/dxml', 'TINYXML'] +TargetAdd('tinyxml_composite1.obj', opts=OPTS, input='tinyxml_composite1.cxx') +TargetAdd('libp3tinyxml.ilb', input='tinyxml_composite1.obj') if (not RUNTIME): OPTS=['DIR:panda/src/dxml', 'BUILDING:PANDA', 'TINYXML'] @@ -3733,6 +3793,7 @@ if (not RUNTIME): TargetAdd('core.pyd', input='p3display_pythonGraphicsWindowProc.obj') TargetAdd('core.pyd', input='core_module.obj') + TargetAdd('core.pyd', input='libp3tinyxml.ilb') TargetAdd('core.pyd', input=COMMON_PANDA_LIBS) TargetAdd('core.pyd', opts=OPTS) @@ -4754,7 +4815,7 @@ if (RTDIST or RUNTIME): OPTS=['DIR:direct/src/plugin', 'BUILDING:P3D_PLUGIN', 'RUNTIME', 'OPENSSL'] TargetAdd('plugin_common.obj', opts=OPTS, input='plugin_common_composite1.cxx') - OPTS += ['ZLIB', 'JPEG', 'PNG', 'MSIMG'] + OPTS += ['ZLIB', 'MSIMG'] TargetAdd('plugin_plugin.obj', opts=OPTS, input='p3d_plugin_composite1.cxx') TargetAdd('plugin_mkdir_complete.obj', opts=OPTS, input='mkdir_complete.cxx') TargetAdd('plugin_wstring_encode.obj', opts=OPTS, input='wstring_encode.cxx') @@ -4783,7 +4844,7 @@ if (RTDIST or RUNTIME): TargetAdd(fname, input='libp3tinyxml.ilb') if GetTarget() == 'darwin': TargetAdd(fname, input='libp3subprocbuffer.ilb') - TargetAdd(fname, opts=['OPENSSL', 'ZLIB', 'JPEG', 'PNG', 'X11', 'ADVAPI', 'WINUSER', 'WINGDI', 'WINSHELL', 'WINCOMCTL', 'WINOLE', 'MSIMG']) + TargetAdd(fname, opts=['OPENSSL', 'ZLIB', 'X11', 'ADVAPI', 'WINUSER', 'WINGDI', 'WINSHELL', 'WINCOMCTL', 'WINOLE', 'MSIMG']) TargetAdd("libp3d_plugin_static.ilb", input='plugin_get_twirl_data.obj') if (PkgSkip("PYTHON")==0 and RTDIST): @@ -4840,7 +4901,7 @@ if (RTDIST or RUNTIME): # DIRECTORY: direct/src/plugin_npapi/ # -if (RUNTIME and PkgSkip("NPAPI")==0): +if RUNTIME: OPTS=['DIR:direct/src/plugin_npapi', 'RUNTIME', 'GTK2'] if GetTarget() == 'windows': nppanda3d_rc = {"name" : "Panda3D Game Engine Plug-in", @@ -4854,7 +4915,7 @@ if (RUNTIME and PkgSkip("NPAPI")==0): elif GetTarget() == 'darwin': TargetAdd('nppanda3d.rsrc', opts=OPTS, input='nppanda3d.r') - OPTS += ['NPAPI', 'GTK2'] + OPTS += ['GTK2'] TargetAdd('plugin_npapi_nppanda3d_composite1.obj', opts=OPTS, input='nppanda3d_composite1.cxx') TargetAdd('nppanda3d.plugin', input='plugin_common.obj') @@ -4870,7 +4931,7 @@ if (RUNTIME and PkgSkip("NPAPI")==0): TargetAdd('nppanda3d.plugin', input='nppanda3d.plist', ipath=OPTS) TargetAdd('nppanda3d.plugin', input='plugin_find_root_dir_assist.obj') TargetAdd('nppanda3d.plugin', input='libp3tinyxml.ilb') - TargetAdd('nppanda3d.plugin', opts=['NPAPI', 'OPENSSL', 'WINGDI', 'WINUSER', 'WINSHELL', 'WINOLE', 'CARBON']) + TargetAdd('nppanda3d.plugin', opts=['OPENSSL', 'WINGDI', 'WINUSER', 'WINSHELL', 'WINOLE', 'CARBON']) # # DIRECTORY: direct/src/plugin_activex/ @@ -4964,7 +5025,7 @@ if (RUNTIME): TargetAdd('panda3dw.exe', opts=['OPENSSL', 'ZLIB', 'WINGDI', 'WINUSER', 'WINSHELL', 'ADVAPI', 'WINSOCK2', 'WINOLE', 'CARBON']) if (RTDIST): - OPTS=['BUILDING:P3D_PLUGIN', 'DIR:direct/src/plugin_standalone', 'DIR:direct/src/plugin', 'DIR:dtool/src/dtoolbase', 'DIR:dtool/src/dtoolutil', 'DIR:dtool/src/pystub', 'DIR:dtool/src/prc', 'DIR:dtool/src/dconfig', 'DIR:panda/src/express', 'DIR:panda/src/downloader', 'RUNTIME', 'P3DEMBED', 'OPENSSL', 'JPEG', 'PNG', 'ZLIB'] + OPTS=['BUILDING:P3D_PLUGIN', 'DIR:direct/src/plugin_standalone', 'DIR:direct/src/plugin', 'DIR:dtool/src/dtoolbase', 'DIR:dtool/src/dtoolutil', 'DIR:dtool/src/pystub', 'DIR:dtool/src/prc', 'DIR:dtool/src/dconfig', 'DIR:panda/src/express', 'DIR:panda/src/downloader', 'RUNTIME', 'P3DEMBED', 'OPENSSL', 'ZLIB'] # This is arguably a big fat ugly hack, but doing it otherwise would complicate the build process considerably. DefSymbol("P3DEMBED", "LINK_ALL_STATIC", "") TargetAdd('plugin_standalone_panda3dBase.obj', opts=OPTS, input='panda3dBase.cxx') @@ -5011,7 +5072,7 @@ if (RTDIST): TargetAdd('p3dembed.exe', input='libp3subprocbuffer.ilb') TargetAdd('p3dembed.exe', input='libp3tinyxml.ilb') TargetAdd('p3dembed.exe', input='libp3d_plugin_static.ilb') - TargetAdd('p3dembed.exe', opts=['NOICON', 'WINGDI', 'WINSOCK2', 'ZLIB', 'WINUSER', 'OPENSSL', 'JPEG', 'WINOLE', 'CARBON', 'MSIMG', 'WINCOMCTL', 'ADVAPI', 'WINSHELL', 'X11', 'PNG']) + TargetAdd('p3dembed.exe', opts=['NOICON', 'WINGDI', 'WINSOCK2', 'ZLIB', 'WINUSER', 'OPENSSL', 'WINOLE', 'CARBON', 'MSIMG', 'WINCOMCTL', 'ADVAPI', 'WINSHELL', 'X11']) if GetTarget() == 'windows': OPTS.append("P3DEMBEDW") @@ -5037,7 +5098,7 @@ if (RTDIST): TargetAdd('p3dembedw.exe', input='plugin_common.obj') TargetAdd('p3dembedw.exe', input='libp3tinyxml.ilb') TargetAdd('p3dembedw.exe', input='libp3d_plugin_static.ilb') - TargetAdd('p3dembedw.exe', opts=['NOICON', 'WINGDI', 'WINSOCK2', 'ZLIB', 'WINUSER', 'OPENSSL', 'JPEG', 'WINOLE', 'MSIMG', 'WINCOMCTL', 'ADVAPI', 'WINSHELL', 'PNG']) + TargetAdd('p3dembedw.exe', opts=['NOICON', 'WINGDI', 'WINSOCK2', 'ZLIB', 'WINUSER', 'OPENSSL', 'WINOLE', 'MSIMG', 'WINCOMCTL', 'ADVAPI', 'WINSHELL']) # # DIRECTORY: pandatool/src/pandatoolbase/ @@ -5538,7 +5599,7 @@ for VER in MAYAVERSIONS: for VER in MAXVERSIONS: VNUM=VER[3:] if (PkgSkip(VER)==0) and (PkgSkip("PANDATOOL")==0): - OPTS=['DIR:pandatool/src/maxegg', VER, "WINCOMCTL", "WINCOMDLG", "WINUSER", "MSFORSCOPE"] + OPTS=['DIR:pandatool/src/maxegg', VER, "WINCOMCTL", "WINCOMDLG", "WINUSER", "MSFORSCOPE", "RTTI"] TargetAdd('maxEgg'+VNUM+'.res', opts=OPTS, input='maxEgg.rc') TargetAdd('maxegg'+VNUM+'_loader.obj', opts=OPTS, input='maxEggLoader.cxx') TargetAdd('maxegg'+VNUM+'_composite1.obj', opts=OPTS, input='p3maxegg_composite1.cxx') @@ -5555,7 +5616,7 @@ for VER in MAXVERSIONS: for VER in MAXVERSIONS: VNUM=VER[3:] if (PkgSkip(VER)==0) and (PkgSkip("PANDATOOL")==0): - OPTS=['DIR:pandatool/src/maxprogs', VER, "WINCOMCTL", "WINCOMDLG", "WINUSER", "MSFORSCOPE"] + OPTS=['DIR:pandatool/src/maxprogs', VER, "WINCOMCTL", "WINCOMDLG", "WINUSER", "MSFORSCOPE", "RTTI"] TargetAdd('maxImportRes.res', opts=OPTS, input='maxImportRes.rc') TargetAdd('maxprogs'+VNUM+'_maxeggimport.obj', opts=OPTS, input='maxEggImport.cxx') TargetAdd('maxeggimport'+VNUM+'.dle', input='maxegg'+VNUM+'_loader.obj') @@ -6630,10 +6691,15 @@ def MakeInstallerOSX(): if not os.path.isdir("dstroot/" + pkg): os.makedirs("dstroot/" + pkg) + if OSXTARGET: + target = '--target %s' % (OSXTARGET) + else: + target = '' + if os.path.exists("/Developer/usr/bin/packagemaker"): - cmd = '/Developer/usr/bin/packagemaker --info /tmp/Info_plist --version ' + VERSION + ' --out dstroot/Panda3D/Panda3D.mpkg/Contents/Packages/' + pkg + '.pkg --target 10.4 --domain system --root dstroot/' + pkg + '/ --no-relocate' + cmd = '/Developer/usr/bin/packagemaker --info /tmp/Info_plist --version ' + VERSION + ' --out dstroot/Panda3D/Panda3D.mpkg/Contents/Packages/' + pkg + '.pkg ' + target + ' --domain system --root dstroot/' + pkg + '/ --no-relocate' elif os.path.exists("/Applications/Xcode.app/Contents/Applications/PackageMaker.app/Contents/MacOS/PackageMaker"): - cmd = '/Applications/Xcode.app/Contents/Applications/PackageMaker.app/Contents/MacOS/PackageMaker --info /tmp/Info_plist --version ' + VERSION + ' --out dstroot/Panda3D/Panda3D.mpkg/Contents/Packages/' + pkg + '.pkg --target 10.4 --domain system --root dstroot/' + pkg + '/ --no-relocate' + cmd = '/Applications/Xcode.app/Contents/Applications/PackageMaker.app/Contents/MacOS/PackageMaker --info /tmp/Info_plist --version ' + VERSION + ' --out dstroot/Panda3D/Panda3D.mpkg/Contents/Packages/' + pkg + '.pkg --target ' + target + ' --domain system --root dstroot/' + pkg + '/ --no-relocate' elif os.path.exists("/Developer/Tools/packagemaker"): cmd = '/Developer/Tools/packagemaker -build -f dstroot/' + pkg + '/ -p dstroot/Panda3D/Panda3D.mpkg/Contents/Packages/' + pkg + '.pkg -i /tmp/Info_plist' else: diff --git a/makepanda/makepandacore.py b/makepanda/makepandacore.py index 9097948e98..94d26306fe 100644 --- a/makepanda/makepandacore.py +++ b/makepanda/makepandacore.py @@ -10,6 +10,7 @@ ######################################################################## import sys,os,time,stat,string,re,getopt,fnmatch,threading,signal,shutil,platform,glob,getpass,signal +import subprocess from distutils import sysconfig if sys.version_info >= (3, 0): @@ -39,6 +40,7 @@ HAS_TARGET_ARCH = False TOOLCHAIN_PREFIX = "" ANDROID_ABI = None SYS_LIB_DIRS = [] +SYS_INC_DIRS = [] DEBUG_DEPENDENCIES = False # Is the current Python a 32-bit or 64-bit build? There doesn't @@ -1471,8 +1473,14 @@ def SmartPkgEnable(pkg, pkgconfig = None, libs = None, incs = None, defs = None, pkg_dir = os.path.join(GetThirdpartyDir(), pkg.lower()) if (os.path.isdir(pkg_dir)): + if framework and os.path.isdir(os.path.join(pkg_dir, framework + ".framework")): + FrameworkDirectory(target_pkg, pkg_dir) + LibName(target_pkg, "-framework " + framework) + return + if os.path.isdir(os.path.join(pkg_dir, "include")): IncDirectory(target_pkg, os.path.join(pkg_dir, "include")) + if os.path.isdir(os.path.join(pkg_dir, "lib")): LibDirectory(target_pkg, os.path.join(pkg_dir, "lib")) @@ -1532,8 +1540,9 @@ def SmartPkgEnable(pkg, pkgconfig = None, libs = None, incs = None, defs = None, if (have_all_pkgs): return - if (pkgconfig != None and (libs == None or len(libs) == 0)): - if (pkg in PkgListGet()): + if pkgconfig is not None and not libs: + # pkg-config is all we can do, abort if it wasn't found. + if pkg in PkgListGet(): print("%sWARNING:%s Could not locate pkg-config package %s, excluding from build" % (GetColor("red"), GetColor(), pkgconfig)) PkgDisable(pkg) else: @@ -1551,7 +1560,7 @@ def SmartPkgEnable(pkg, pkgconfig = None, libs = None, incs = None, defs = None, LibName(target_pkg, "-l" + libname) else: # Try searching in the package's LibDirectories. - lpath = [dir for ppkg, dir in LIBDIRECTORIES if pkg == ppkg] + lpath = [dir for ppkg, dir in LIBDIRECTORIES if pkg == ppkg or ppkg == "ALWAYS"] if LibraryExists(libname, lpath): LibName(target_pkg, "-l" + libname) else: @@ -1559,27 +1568,26 @@ def SmartPkgEnable(pkg, pkgconfig = None, libs = None, incs = None, defs = None, if VERBOSE: print(GetColor("cyan") + "Couldn't find library lib" + libname + GetColor()) + # Determine which include directories to look in. + incdirs = list(SYS_INC_DIRS) + for ppkg, pdir in INCDIRECTORIES: + if pkg == ppkg or ppkg == "ALWAYS": + incdirs.append(pdir) + + # The incs list contains both subdirectories to explicitly add to + # the include path and header files to check the existence of. for i in incs: incdir = None - sysroot_usr = SDK.get("SYSROOT", "") + "/usr" - if (len(glob.glob(sysroot_usr + "/include/" + i)) > 0): - incdir = sorted(glob.glob(sysroot_usr + "/include/" + i))[-1] - elif (len(glob.glob(sysroot_usr + "/local/include/" + i)) > 0): - incdir = sorted(glob.glob(sysroot_usr + "/local/include/" + i))[-1] - elif (os.path.isdir(sysroot_usr + "/PCBSD") and len(glob.glob(sysroot_usr + "/PCBSD/local/include/" + i)) > 0): - incdir = sorted(glob.glob(sysroot_usr + "/PCBSD/local/include/" + i))[-1] - else: - # Try searching in the package's IncDirectories. - for ppkg, pdir in INCDIRECTORIES: - if pkg == ppkg and len(glob.glob(os.path.join(pdir, i))) > 0: - incdir = sorted(glob.glob(os.path.join(pdir, i)))[-1] - - if incdir is None and i.endswith(".h"): - have_pkg = False - if VERBOSE: - print(GetColor("cyan") + "Couldn't find header file " + i + GetColor()) + for dir in incdirs: + if len(glob.glob(os.path.join(dir, i))) > 0: + incdir = sorted(glob.glob(os.path.join(dir, i)))[-1] # Note: It's possible to specify a file instead of a dir, for the sake of checking if it exists. + if incdir is None and i.endswith(".h"): + have_pkg = False + if VERBOSE: + print(GetColor("cyan") + "Couldn't find header file " + i + GetColor()) + if incdir is not None and os.path.isdir(incdir): IncDirectory(target_pkg, incdir) @@ -1798,15 +1806,14 @@ def SdkLocateMax(): if (os.path.isdir(top + "\\" + subdir)!=0): SDK[version+"CS"] = top + subdir -def SdkLocatePython(force_use_sys_executable = False): +def SdkLocatePython(prefer_thirdparty_python=False): if PkgSkip("PYTHON"): + # We're not compiling with Python support. We still need to set this + # in case we want to run any scripts that use Python, though. SDK["PYTHONEXEC"] = os.path.realpath(sys.executable) return - if CrossCompiling(): - force_use_sys_executable = False - - if (GetTarget() == 'windows' and not force_use_sys_executable): + if GetTarget() == 'windows': SDK["PYTHON"] = GetThirdpartyBase() + "/win-python" if (GetOptimize() <= 2): SDK["PYTHON"] += "-dbg" @@ -1838,7 +1845,7 @@ def SdkLocatePython(force_use_sys_executable = False): os.environ["PYTHONHOME"] = SDK["PYTHON"] - elif CrossCompiling(): + elif CrossCompiling() or (prefer_thirdparty_python and os.path.isdir(os.path.join(GetThirdpartyDir(), "python"))): tp_python = os.path.join(GetThirdpartyDir(), "python") SDK["PYTHON"] = tp_python + "/include" @@ -1857,11 +1864,12 @@ def SdkLocatePython(force_use_sys_executable = False): py_lib = os.path.basename(py_libs[0]) SDK["PYTHONVERSION"] = "python" + py_lib[9] + "." + py_lib[11] + SDK["PYTHONEXEC"] = tp_python + "/bin/" + SDK["PYTHONVERSION"] - elif (GetTarget() == 'windows'): - SDK["PYTHON"] = os.path.dirname(sysconfig.get_python_inc()) - SDK["PYTHONVERSION"] = "python" + sysconfig.get_python_version() - SDK["PYTHONEXEC"] = sys.executable + #elif GetTarget() == 'windows': + # SDK["PYTHON"] = os.path.dirname(sysconfig.get_python_inc()) + # SDK["PYTHONVERSION"] = "python" + sysconfig.get_python_version() + # SDK["PYTHONEXEC"] = sys.executable else: SDK["PYTHON"] = sysconfig.get_python_inc() @@ -1869,6 +1877,7 @@ def SdkLocatePython(force_use_sys_executable = False): SDK["PYTHONEXEC"] = os.path.realpath(sys.executable) if CrossCompiling(): + # We need a version of Python we can run. SDK["PYTHONEXEC"] = sys.executable host_version = "python" + sysconfig.get_python_version() if SDK["PYTHONVERSION"] != host_version: @@ -2065,7 +2074,7 @@ def SdkLocateAndroid(): ######################################################################## def SdkAutoDisableDirectX(): - for ver in ["DX9", "DIRECTCAM"]: + for ver in DXVERSIONS + ["DIRECTCAM"]: if (PkgSkip(ver)==0): if (ver not in SDK): if (GetHost() == "windows"): @@ -2184,6 +2193,7 @@ def SetupVisualStudioEnviron(): INCDIRECTORIES = [] LIBDIRECTORIES = [] +FRAMEWORKDIRECTORIES = [] LIBNAMES = [] DEFSYMBOLS = [] @@ -2193,6 +2203,9 @@ def IncDirectory(opt, dir): def LibDirectory(opt, dir): LIBDIRECTORIES.append((opt, dir)) +def FrameworkDirectory(opt, dir): + FRAMEWORKDIRECTORIES.append((opt, dir)) + def LibName(opt, name): # Check to see if the lib file actually exists for the thirdparty library given # Are we a thirdparty library? @@ -2201,8 +2214,9 @@ def LibName(opt, name): if not os.path.exists(name): WARNINGS.append(name + " not found. Skipping Package " + opt) if (opt in PkgListGet()): - print("%sWARNING:%s Could not locate thirdparty package %s, excluding from build" % (GetColor("red"), GetColor(), opt.lower())) - PkgDisable(opt) + if not PkgSkip(opt): + print("%sWARNING:%s Could not locate thirdparty package %s, excluding from build" % (GetColor("red"), GetColor(), opt.lower())) + PkgDisable(opt) return else: print("%sERROR:%s Could not locate thirdparty package %s, aborting build" % (GetColor("red"), GetColor(), opt.lower())) @@ -2232,10 +2246,10 @@ def SetupBuildEnvironment(compiler): if compiler == "GCC": # Invoke gcc to determine the system library directories. - global SYS_LIB_DIRS + global SYS_LIB_DIRS, SYS_INC_DIRS if sys.platform == "darwin": - # We need to add this one explicitly. + # We need to add this one explicitly for some reason. SYS_LIB_DIRS.append(SDK["MACOSX"] + "/usr/lib") if not SDK.get("MACOSX"): @@ -2244,30 +2258,81 @@ def SetupBuildEnvironment(compiler): if os.path.isdir(local_lib): SYS_LIB_DIRS.append(local_lib) - cmd = GetCXX() + " -print-search-dirs" + sysroot_flag = "" if SDK.get("MACOSX"): # The default compiler in Leopard does not respect --sysroot correctly. - cmd += " -isysroot " + SDK["MACOSX"] + sysroot_flag = " -isysroot " + SDK["MACOSX"] if SDK.get("SYSROOT"): - cmd += ' --sysroot=%s -no-canonical-prefixes' % (SDK["SYSROOT"]) + sysroot_flag = ' --sysroot=%s -no-canonical-prefixes' % (SDK["SYSROOT"]) # Extract the dirs from the line that starts with 'libraries: ='. + cmd = GetCXX() + " -print-search-dirs" + sysroot_flag handle = os.popen(cmd) for line in handle: if not line.startswith('libraries: ='): continue line = line[12:].strip() - SYS_LIB_DIRS += line.split(':') + for libdir in line.split(':'): + libdir = os.path.normpath(libdir) + if os.path.isdir(libdir): + if libdir not in SYS_LIB_DIRS: + SYS_LIB_DIRS.append(libdir) + elif GetVerbose(): + print("Ignoring non-existent library directory %s" % (libdir)) returnval = handle.close() if returnval != None and returnval != 0: print("%sWARNING:%s %s failed" % (GetColor("red"), GetColor(), cmd)) SYS_LIB_DIRS += [SDK.get("SYSROOT", "") + "/usr/lib"] - elif GetVerbose(): - print("System library search path: %s" % ':'.join(SYS_LIB_DIRS)) + # Now extract the preprocessor's include directories. + cmd = GetCXX() + sysroot_flag + " -x c++ -v -E /dev/null" + null = open(os.devnull, 'w') + handle = subprocess.Popen(cmd, stdout=null, stderr=subprocess.PIPE, shell=True) + scanning = False + for line in handle.communicate()[1].splitlines(): + line = line.decode('utf-8', 'replace') + + # Start looking at a line that says: #include "..." search starts here + if not scanning: + if line.startswith('#include'): + scanning = True + continue + + if not line.startswith(' /'): + continue + + line = line.strip() + if line.endswith(" (framework directory)"): + pass + elif os.path.isdir(line): + SYS_INC_DIRS.append(os.path.normpath(line)) + elif GetVerbose(): + print("Ignoring non-existent include directory %s" % (line)) + + if handle.returncode != 0 or not SYS_INC_DIRS: + print("%sWARNING:%s %s failed or did not produce the expected result" % (GetColor("red"), GetColor(), cmd)) + sysroot = SDK.get("SYSROOT", "") + # Add some sensible directories as a fallback. + SYS_INC_DIRS = [ + sysroot + "/usr/include", + sysroot + "/usr/local/include" + ] + pcbsd_inc = sysroot + "/usr/PCBSD/local/include" + if os.path.isdir(pcbsd_inc): + SYS_INC_DIRS.append(pcbsd_inc) + + # Print out the search paths + if GetVerbose(): + print("System library search path:") + for dir in SYS_LIB_DIRS: + print(" " + dir) + + print("System include search path:") + for dir in SYS_INC_DIRS: + print(" " + dir) # In the case of Android, we have to put the toolchain on the PATH in order to use it. if GetTarget() == 'android': @@ -2420,13 +2485,16 @@ def CopyPythonTree(dstdir, srcdir, lib2to3_fixers=[]): for fixer in lib2to3_fixers: lib2to3_args += ['-f', fixer] + exclude_files = set(VCS_FILES) + exclude_files.add('panda3d.py') + refactor = [] for entry in os.listdir(srcdir): srcpth = os.path.join(srcdir, entry) dstpth = os.path.join(dstdir, entry) - if (os.path.isfile(srcpth)): + if os.path.isfile(srcpth): base, ext = os.path.splitext(entry) - if entry not in VCS_FILES and ext not in SUFFIX_INC + ['.pyc', '.pyo']: + if entry not in exclude_files and ext not in SUFFIX_INC + ['.pyc', '.pyo']: if (NeedsBuild([dstpth], [srcpth])): WriteBinaryFile(dstpth, ReadBinaryFile(srcpth)) diff --git a/panda/src/bullet/bulletSoftBodyNode.cxx b/panda/src/bullet/bulletSoftBodyNode.cxx index 7fd660b8a6..9dc1ca470b 100644 --- a/panda/src/bullet/bulletSoftBodyNode.cxx +++ b/panda/src/bullet/bulletSoftBodyNode.cxx @@ -1018,7 +1018,7 @@ make_tet_mesh(BulletSoftBodyWorldInfo &info, const char *ele, const char *face, for (int i=0; i 0)|| - (fb_prop.get_back_buffers() > 0)|| - (fb_prop.get_accum_bits() > 0)|| - (fb_prop.get_multisamples() > 0)) { + if ((flags & BF_fb_props_optional) == 0) { + if (fb_prop.get_indexed_color() || + fb_prop.get_back_buffers() > 0 || + fb_prop.get_accum_bits() > 0) { return NULL; } } - // Early success - if we are sure that this buffer WILL - // meet specs, we can precertify it. - if ((cocoagsg != 0) && - (cocoagsg->is_valid()) && - (!cocoagsg->needs_reset()) && - (cocoagsg->_supports_framebuffer_object) && - (cocoagsg->_glDrawBuffers != 0) && - (fb_prop.is_basic())) { - precertify = true; + if (cocoagsg != NULL && cocoagsg->is_valid() && !cocoagsg->needs_reset()) { + if (!cocoagsg->_supports_framebuffer_object || + cocoagsg->_glDrawBuffers == NULL) { + return NULL; + } else if (fb_prop.is_basic()) { + // Early success - if we are sure that this buffer WILL + // meet specs, we can precertify it. + precertify = true; + } } - return new GLGraphicsBuffer(engine, this, name, fb_prop, win_prop, flags, gsg, host); } diff --git a/panda/src/cocoadisplay/cocoaGraphicsWindow.mm b/panda/src/cocoadisplay/cocoaGraphicsWindow.mm index eff69cd16d..84a5d9149a 100644 --- a/panda/src/cocoadisplay/cocoaGraphicsWindow.mm +++ b/panda/src/cocoadisplay/cocoaGraphicsWindow.mm @@ -1592,7 +1592,8 @@ handle_key_event(NSEvent *event) { if ([str canBeConvertedToEncoding: NSASCIIStringEncoding]) { // Nhm, ascii character perhaps? str = [str lowercaseString]; - button = KeyboardButton::ascii_key([str cStringUsingEncoding: NSASCIIStringEncoding]); + const char *c_str = [str cStringUsingEncoding: NSASCIIStringEncoding]; + button = KeyboardButton::ascii_key(c_str[0]); } } diff --git a/panda/src/cocoadisplay/config_cocoadisplay.h b/panda/src/cocoadisplay/config_cocoadisplay.h index 04754bf635..16059434ca 100644 --- a/panda/src/cocoadisplay/config_cocoadisplay.h +++ b/panda/src/cocoadisplay/config_cocoadisplay.h @@ -17,9 +17,10 @@ #include "pandabase.h" #include "notifyCategoryProxy.h" +#include "configVariableBool.h" NotifyCategoryDecl(cocoadisplay, EXPCL_PANDAGL, EXPTP_PANDAGL); - + extern EXPCL_PANDAGL void init_libcocoadisplay(); #endif diff --git a/panda/src/display/config_display.cxx b/panda/src/display/config_display.cxx index 0143917956..978d88f256 100644 --- a/panda/src/display/config_display.cxx +++ b/panda/src/display/config_display.cxx @@ -418,19 +418,13 @@ ConfigVariableInt depth_bits ("depth-bits", 0, PRC_DESC("The minimum number of depth buffer bits requested.")); ConfigVariableInt color_bits -("color-bits", 0, - PRC_DESC("The minimum number of total color buffer bits requested. This " - "value is like red-bits + blue-bits + green-bits except Panda " - "won't care how the bits are divided up.")); -ConfigVariableInt red_bits -("red-bits", 0, - PRC_DESC("The minimum number of red color buffer bits requested.")); -ConfigVariableInt green_bits -("green-bits", 0, - PRC_DESC("The minimum number of green color buffer bits requested.")); -ConfigVariableInt blue_bits -("blue-bits", 0, - PRC_DESC("The minimum number of blue color buffer bits requested.")); +("color-bits", "", + PRC_DESC("The minimum number of total color buffer bits requested. If you " + "specify only one value, it will represent the total value for the " + "red, green and blue channels, and indicates you don't care how the " + "bits are divided up among the red, green and blue channels. If " + "you specify three values, it represents three separate red, green " + "and blue bit requirements.")); ConfigVariableInt alpha_bits ("alpha-bits", 0, PRC_DESC("The minimum number of alpha buffer bits requested.")); diff --git a/panda/src/display/config_display.h b/panda/src/display/config_display.h index 4da350f4e6..be71d0b63d 100644 --- a/panda/src/display/config_display.h +++ b/panda/src/display/config_display.h @@ -97,9 +97,6 @@ extern EXPCL_PANDA_DISPLAY ConfigVariableBool framebuffer_srgb; extern EXPCL_PANDA_DISPLAY ConfigVariableBool framebuffer_float; extern EXPCL_PANDA_DISPLAY ConfigVariableInt depth_bits; extern EXPCL_PANDA_DISPLAY ConfigVariableInt color_bits; -extern EXPCL_PANDA_DISPLAY ConfigVariableInt red_bits; -extern EXPCL_PANDA_DISPLAY ConfigVariableInt green_bits; -extern EXPCL_PANDA_DISPLAY ConfigVariableInt blue_bits; extern EXPCL_PANDA_DISPLAY ConfigVariableInt alpha_bits; extern EXPCL_PANDA_DISPLAY ConfigVariableInt stencil_bits; extern EXPCL_PANDA_DISPLAY ConfigVariableInt accum_bits; diff --git a/panda/src/display/frameBufferProperties.I b/panda/src/display/frameBufferProperties.I index d596427195..a6fc122af4 100644 --- a/panda/src/display/frameBufferProperties.I +++ b/panda/src/display/frameBufferProperties.I @@ -305,37 +305,42 @@ get_float_depth() const { INLINE void FrameBufferProperties:: set_depth_bits(int n) { _property[FBP_depth_bits] = n; - _specified[FBP_depth_bits] = true; + _specified |= (1 << FBP_depth_bits); } //////////////////////////////////////////////////////////////////// // Function: FrameBufferProperties::set_color_bits // Access: Published -// Description: +// Description: Sets the number of requested color bits as a single +// number that represents the sum of the individual +// numbers of red, green and blue bits. Panda won't +// care how the individual bits are divided up. +// +// See also set_rgba_bits, which allows you to specify +// requirements for the individual components. //////////////////////////////////////////////////////////////////// INLINE void FrameBufferProperties:: set_color_bits(int n) { _property[FBP_color_bits] = n; - _specified[FBP_color_bits] = true; + _specified |= (1 << FBP_color_bits); } //////////////////////////////////////////////////////////////////// // Function: FrameBufferProperties::set_rgba_bits // Access: Published -// Description: Sets all color bit requirements separately. +// Description: Convenience method for setting the red, green, blue +// and alpha bits in one go. //////////////////////////////////////////////////////////////////// INLINE void FrameBufferProperties:: set_rgba_bits(int r, int g, int b, int a) { _property[FBP_red_bits] = r; - _specified[FBP_red_bits] = true; _property[FBP_green_bits] = g; - _specified[FBP_green_bits] = true; _property[FBP_blue_bits] = b; - _specified[FBP_blue_bits] = true; _property[FBP_alpha_bits] = a; - _specified[FBP_alpha_bits] = true; _property[FBP_color_bits] = r + g + b; - _specified[FBP_color_bits] = true; + _specified |= (1 << FBP_color_bits) | (1 << FBP_red_bits) | + (1 << FBP_green_bits) | (1 << FBP_blue_bits) | + (1 << FBP_alpha_bits); } //////////////////////////////////////////////////////////////////// @@ -346,7 +351,7 @@ set_rgba_bits(int r, int g, int b, int a) { INLINE void FrameBufferProperties:: set_red_bits(int n) { _property[FBP_red_bits] = n; - _specified[FBP_red_bits] = true; + _specified |= (1 << FBP_red_bits); } //////////////////////////////////////////////////////////////////// @@ -357,7 +362,7 @@ set_red_bits(int n) { INLINE void FrameBufferProperties:: set_green_bits(int n) { _property[FBP_green_bits] = n; - _specified[FBP_green_bits] = true; + _specified |= (1 << FBP_green_bits); } //////////////////////////////////////////////////////////////////// @@ -368,7 +373,7 @@ set_green_bits(int n) { INLINE void FrameBufferProperties:: set_blue_bits(int n) { _property[FBP_blue_bits] = n; - _specified[FBP_blue_bits] = true; + _specified |= (1 << FBP_blue_bits); } //////////////////////////////////////////////////////////////////// @@ -379,7 +384,7 @@ set_blue_bits(int n) { INLINE void FrameBufferProperties:: set_alpha_bits(int n) { _property[FBP_alpha_bits] = n; - _specified[FBP_alpha_bits] = true; + _specified |= (1 << FBP_alpha_bits); } //////////////////////////////////////////////////////////////////// @@ -390,7 +395,7 @@ set_alpha_bits(int n) { INLINE void FrameBufferProperties:: set_stencil_bits(int n) { _property[FBP_stencil_bits] = n; - _specified[FBP_stencil_bits] = true; + _specified |= (1 << FBP_stencil_bits); } //////////////////////////////////////////////////////////////////// @@ -401,7 +406,7 @@ set_stencil_bits(int n) { INLINE void FrameBufferProperties:: set_accum_bits(int n) { _property[FBP_accum_bits] = n; - _specified[FBP_accum_bits] = true; + _specified |= (1 << FBP_accum_bits); } //////////////////////////////////////////////////////////////////// @@ -413,7 +418,7 @@ INLINE void FrameBufferProperties:: set_aux_rgba(int n) { nassertv(n < 4); _property[FBP_aux_rgba] = n; - _specified[FBP_aux_rgba] = true; + _specified |= (1 << FBP_aux_rgba); } //////////////////////////////////////////////////////////////////// @@ -425,7 +430,7 @@ INLINE void FrameBufferProperties:: set_aux_hrgba(int n) { nassertv(n < 4); _property[FBP_aux_hrgba] = n; - _specified[FBP_aux_hrgba] = true; + _specified |= (1 << FBP_aux_hrgba); } //////////////////////////////////////////////////////////////////// @@ -437,7 +442,7 @@ INLINE void FrameBufferProperties:: set_aux_float(int n) { nassertv(n < 4); _property[FBP_aux_float] = n; - _specified[FBP_aux_float] = true; + _specified |= (1 << FBP_aux_float); } //////////////////////////////////////////////////////////////////// @@ -448,7 +453,7 @@ set_aux_float(int n) { INLINE void FrameBufferProperties:: set_multisamples(int n) { _property[FBP_multisamples] = n; - _specified[FBP_multisamples] = true; + _specified |= (1 << FBP_multisamples); } //////////////////////////////////////////////////////////////////// @@ -460,7 +465,7 @@ set_multisamples(int n) { INLINE void FrameBufferProperties:: set_coverage_samples(int n) { _property[FBP_coverage_samples] = n; - _specified[FBP_coverage_samples] = true; + _specified |= (1 << FBP_coverage_samples); } //////////////////////////////////////////////////////////////////// @@ -471,7 +476,7 @@ set_coverage_samples(int n) { INLINE void FrameBufferProperties:: set_back_buffers(int n) { _property[FBP_back_buffers] = n; - _specified[FBP_back_buffers] = true; + _specified |= (1 << FBP_back_buffers); } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/display/frameBufferProperties.cxx b/panda/src/display/frameBufferProperties.cxx index 8b38b4b3e1..d5cc37a97a 100644 --- a/panda/src/display/frameBufferProperties.cxx +++ b/panda/src/display/frameBufferProperties.cxx @@ -37,9 +37,9 @@ void FrameBufferProperties:: operator = (const FrameBufferProperties ©) { _flags_specified = copy._flags_specified; _flags = copy._flags; + _specified = copy._specified; for (int i = 0; i < FBP_COUNT; ++i) { - _specified[i] = copy._specified[i]; _property[i] = copy._property[i]; } } @@ -144,17 +144,24 @@ get_default() { if (depth_bits > 0) { default_props.set_depth_bits(depth_bits); } - if (color_bits > 0) { - default_props.set_color_bits(color_bits); - } - if (red_bits > 0) { - default_props.set_red_bits(red_bits); - } - if (green_bits > 0) { - default_props.set_green_bits(green_bits); - } - if (blue_bits > 0) { - default_props.set_blue_bits(blue_bits); + switch (color_bits.size()) { + case 0: + break; + case 1: + default_props.set_color_bits(color_bits[0]); + break; + case 3: + default_props.set_color_bits(color_bits[0] + color_bits[1] + color_bits[2]); + default_props.set_red_bits(color_bits[0]); + default_props.set_green_bits(color_bits[1]); + default_props.set_blue_bits(color_bits[2]); + break; + default: + default_props.set_color_bits(color_bits[0]); + display_cat.error() + << "Configuration variable color-bits takes either 1 or 3 values, not " + << color_bits.size() << "\n"; + break; } if (alpha_bits > 0) { default_props.set_alpha_bits(alpha_bits); @@ -189,10 +196,11 @@ operator == (const FrameBufferProperties &other) const { return false; } + if (_specified != other._specified) { + return false; + } + for (int i = 0; i < FBP_COUNT; ++i) { - if (_specified[i] != other._specified[i]) { - return false; - } if (_property[i] != other._property[i]) { return false; } @@ -214,9 +222,9 @@ clear() { _flags_specified = 0; for (int i = 0; i < FBP_COUNT; ++i) { - _specified[i] = 0; _property[i] = 0; } + _specified = 0; } //////////////////////////////////////////////////////////////////// @@ -232,9 +240,9 @@ add_properties(const FrameBufferProperties &other) { _flags |= other._flags & other._flags_specified; for (int i = 0; i < FBP_COUNT; ++i) { - if (other._specified[i]) { + if (other._specified & (1 << i)) { _property[i] = other._property[i]; - _specified[i] = true; + _specified |= (1 << i); } } } @@ -364,30 +372,18 @@ get_buffer_mask() const { //////////////////////////////////////////////////////////////////// bool FrameBufferProperties:: is_any_specified() const { - if (_flags_specified != 0) { - return true; - } - - for (int i = 0; i < FBP_COUNT; ++i) { - if (_specified[i]) { - return true; - } - } - return false; + return (_flags_specified | _specified) != 0; } //////////////////////////////////////////////////////////////////// // Function: FrameBufferProperties::set_all_specified // Access: Published -// Description: sets all the specified bits. +// Description: Marks all bits as having been specified. //////////////////////////////////////////////////////////////////// void FrameBufferProperties:: set_all_specified() { _flags_specified = FBF_all; - - for (int i = 0; i < FBP_COUNT; ++i) { - _specified[i] = true; - } + _specified = (1 << FBP_COUNT) - 1; } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/display/frameBufferProperties.h b/panda/src/display/frameBufferProperties.h index 57ba098600..7e3861b847 100644 --- a/panda/src/display/frameBufferProperties.h +++ b/panda/src/display/frameBufferProperties.h @@ -67,7 +67,7 @@ private: }; int _property[FBP_COUNT]; - bool _specified[FBP_COUNT]; + int _specified; int _flags; int _flags_specified; diff --git a/panda/src/display/graphicsWindowInputDevice.I b/panda/src/display/graphicsWindowInputDevice.I index fe04d98b42..3763d7baa4 100644 --- a/panda/src/display/graphicsWindowInputDevice.I +++ b/panda/src/display/graphicsWindowInputDevice.I @@ -84,7 +84,7 @@ get_raw_pointer() const { //////////////////////////////////////////////////////////////////// // Function: GraphicsWindowInputDevice::set_device_index // Access: Public -// Description: Set the device index. This is reported in pointer +// Description: Set the device index. This is reported in pointer // events. The device index will be equal to the position // of the GraphicsWindowInputDevice in the window's list. //////////////////////////////////////////////////////////////////// @@ -117,9 +117,116 @@ disable_pointer_events() { _pointer_events.clear(); } +//////////////////////////////////////////////////////////////////// +// Function: GraphicsWindowInputDevice::button_down +// Access: Published +// Description: Records that the indicated button has been depressed. +//////////////////////////////////////////////////////////////////// +INLINE void GraphicsWindowInputDevice:: +button_down(ButtonHandle button) { + button_down(button, ClockObject::get_global_clock()->get_frame_time()); +} + +//////////////////////////////////////////////////////////////////// +// Function: GraphicsWindowInputDevice::button_resume_down +// Access: Published +// Description: Records that the indicated button was depressed +// earlier, and we only just detected the event after +// the fact. This is mainly useful for tracking the +// state of modifier keys. +//////////////////////////////////////////////////////////////////// +INLINE void GraphicsWindowInputDevice:: +button_resume_down(ButtonHandle button) { + button_resume_down(button, ClockObject::get_global_clock()->get_frame_time()); +} + +//////////////////////////////////////////////////////////////////// +// Function: GraphicsWindowInputDevice::button_up +// Access: Published +// Description: Records that the indicated button has been released. +//////////////////////////////////////////////////////////////////// +INLINE void GraphicsWindowInputDevice:: +button_up(ButtonHandle button) { + button_up(button, ClockObject::get_global_clock()->get_frame_time()); +} + +//////////////////////////////////////////////////////////////////// +// Function: GraphicsWindowInputDevice::keystroke +// Access: Published +// Description: Records that the indicated keystroke has been +// generated. +//////////////////////////////////////////////////////////////////// +INLINE void GraphicsWindowInputDevice:: +keystroke(int keycode) { + keystroke(keycode, ClockObject::get_global_clock()->get_frame_time()); +} + +//////////////////////////////////////////////////////////////////// +// Function: GraphicsWindowInputDevice::focus_lost +// Access: Published +// Description: This should be called when the window focus is lost, +// so that we may miss upcoming button events +// (especially "up" events) for the next period of time. +// It generates keyboard and mouse "up" events for those +// buttons that we previously sent unpaired "down" +// events, so that the Panda application will believe +// all buttons are now released. +//////////////////////////////////////////////////////////////////// +INLINE void GraphicsWindowInputDevice:: +focus_lost() { + focus_lost(ClockObject::get_global_clock()->get_frame_time()); +} + +//////////////////////////////////////////////////////////////////// +// Function: GraphicsWindowInputDevice::raw_button_down +// Access: Published +// Description: Records that the indicated button has been depressed. +//////////////////////////////////////////////////////////////////// +INLINE void GraphicsWindowInputDevice:: +raw_button_down(ButtonHandle button) { + raw_button_down(button, ClockObject::get_global_clock()->get_frame_time()); +} + +//////////////////////////////////////////////////////////////////// +// Function: GraphicsWindowInputDevice::raw_button_up +// Access: Published +// Description: Records that the indicated button has been released. +//////////////////////////////////////////////////////////////////// +INLINE void GraphicsWindowInputDevice:: +raw_button_up(ButtonHandle button) { + raw_button_up(button, ClockObject::get_global_clock()->get_frame_time()); +} + //////////////////////////////////////////////////////////////////// // Function: GraphicsWindowInputDevice::set_pointer_in_window -// Access: Public +// Access: Published +// Description: To be called by a particular kind of GraphicsWindow +// to indicate that the pointer is within the window, at +// the given pixel coordinates. +//////////////////////////////////////////////////////////////////// +INLINE void GraphicsWindowInputDevice:: +set_pointer_in_window(double x, double y) { + // mutex is handled in set pointer .. convience function + set_pointer(true, x, y, ClockObject::get_global_clock()->get_frame_time()); +} + +//////////////////////////////////////////////////////////////////// +// Function: GraphicsWindowInputDevice::set_pointer_out_of_window +// Access: Published +// Description: To be called by a particular kind of GraphicsWindow +// to indicate that the pointer is no longer within the +// window. +//////////////////////////////////////////////////////////////////// +INLINE void GraphicsWindowInputDevice:: +set_pointer_out_of_window() { + // mutex is handled in set pointer .. convience function + set_pointer(false, _mouse_data._xpos, _mouse_data._ypos, + ClockObject::get_global_clock()->get_frame_time()); +} + +//////////////////////////////////////////////////////////////////// +// Function: GraphicsWindowInputDevice::set_pointer_in_window +// Access: Published // Description: To be called by a particular kind of GraphicsWindow // to indicate that the pointer is within the window, at // the given pixel coordinates. @@ -132,7 +239,7 @@ set_pointer_in_window(double x, double y, double time) { //////////////////////////////////////////////////////////////////// // Function: GraphicsWindowInputDevice::set_pointer_out_of_window -// Access: Public +// Access: Published // Description: To be called by a particular kind of GraphicsWindow // to indicate that the pointer is no longer within the // window. diff --git a/panda/src/display/graphicsWindowInputDevice.cxx b/panda/src/display/graphicsWindowInputDevice.cxx index bbf49c10ee..a1d4950205 100644 --- a/panda/src/display/graphicsWindowInputDevice.cxx +++ b/panda/src/display/graphicsWindowInputDevice.cxx @@ -94,7 +94,7 @@ pointer_and_keyboard(GraphicsWindow *host, const string &name) { // Description: //////////////////////////////////////////////////////////////////// GraphicsWindowInputDevice:: -GraphicsWindowInputDevice(const GraphicsWindowInputDevice ©) +GraphicsWindowInputDevice(const GraphicsWindowInputDevice ©) { *this = copy; } @@ -105,7 +105,7 @@ GraphicsWindowInputDevice(const GraphicsWindowInputDevice ©) // Description: //////////////////////////////////////////////////////////////////// void GraphicsWindowInputDevice:: -operator = (const GraphicsWindowInputDevice ©) +operator = (const GraphicsWindowInputDevice ©) { LightMutexHolder holder(_lock); LightMutexHolder holder1(copy._lock); @@ -165,7 +165,7 @@ get_button_event() { // Function: GraphicsWindowInputDevice::has_pointer_event // Access: Public // Description: Returns true if this device has a pending pointer -// event (a mouse movement), or false otherwise. If +// event (a mouse movement), or false otherwise. If // this returns true, the particular event may be // extracted via get_pointer_event(). //////////////////////////////////////////////////////////////////// @@ -234,7 +234,7 @@ disable_pointer_mode() { //////////////////////////////////////////////////////////////////// // Function: GraphicsWindowInputDevice::set_pointer -// Access: Public +// Access: Published // Description: Records that a mouse movement has taken place. //////////////////////////////////////////////////////////////////// void GraphicsWindowInputDevice:: @@ -264,7 +264,7 @@ set_pointer(bool inwin, double x, double y, double time) { } else { _mouse_data = _true_mouse_data; } - + if (_enable_pointer_events) { int seq = _event_sequence++; if (_pointer_events == 0) { @@ -279,7 +279,7 @@ set_pointer(bool inwin, double x, double y, double time) { //////////////////////////////////////////////////////////////////// // Function: GraphicsWindowInputDevice::button_down -// Access: Public +// Access: Published // Description: Records that the indicated button has been depressed. //////////////////////////////////////////////////////////////////// void GraphicsWindowInputDevice:: @@ -291,7 +291,7 @@ button_down(ButtonHandle button, double time) { //////////////////////////////////////////////////////////////////// // Function: GraphicsWindowInputDevice::button_resume_down -// Access: Public +// Access: Published // Description: Records that the indicated button was depressed // earlier, and we only just detected the event after // the fact. This is mainly useful for tracking the @@ -300,14 +300,13 @@ button_down(ButtonHandle button, double time) { void GraphicsWindowInputDevice:: button_resume_down(ButtonHandle button, double time) { LightMutexHolder holder(_lock); - _button_events.push_back(ButtonEvent(button, ButtonEvent::T_resume_down, time) -); + _button_events.push_back(ButtonEvent(button, ButtonEvent::T_resume_down, time)); _buttons_held.insert(button); } //////////////////////////////////////////////////////////////////// // Function: GraphicsWindowInputDevice::button_up -// Access: Public +// Access: Published // Description: Records that the indicated button has been released. //////////////////////////////////////////////////////////////////// void GraphicsWindowInputDevice:: @@ -319,7 +318,7 @@ button_up(ButtonHandle button, double time) { //////////////////////////////////////////////////////////////////// // Function: GraphicsWindowInputDevice::keystroke -// Access: Public +// Access: Published // Description: Records that the indicated keystroke has been // generated. //////////////////////////////////////////////////////////////////// @@ -331,24 +330,24 @@ keystroke(int keycode, double time) { //////////////////////////////////////////////////////////////////// // Function: GraphicsWindowInputDevice::candidate -// Access: Public +// Access: Published // Description: Records that the indicated candidate string has been // highlighted. This is used to implement IME support // for typing in international languages, especially // Chinese/Japanese/Korean. //////////////////////////////////////////////////////////////////// void GraphicsWindowInputDevice:: -candidate(const wstring &candidate_string, size_t highlight_start, +candidate(const wstring &candidate_string, size_t highlight_start, size_t highlight_end, size_t cursor_pos) { LightMutexHolder holder(_lock); - _button_events.push_back(ButtonEvent(candidate_string, + _button_events.push_back(ButtonEvent(candidate_string, highlight_start, highlight_end, cursor_pos)); } //////////////////////////////////////////////////////////////////// // Function: GraphicsWindowInputDevice::focus_lost -// Access: Public +// Access: Published // Description: This should be called when the window focus is lost, // so that we may miss upcoming button events // (especially "up" events) for the next period of time. @@ -369,7 +368,7 @@ focus_lost(double time) { //////////////////////////////////////////////////////////////////// // Function: GraphicsWindowInputDevice::raw_button_down -// Access: Public +// Access: Published // Description: Records that the indicated button has been depressed. //////////////////////////////////////////////////////////////////// void GraphicsWindowInputDevice:: @@ -380,7 +379,7 @@ raw_button_down(ButtonHandle button, double time) { //////////////////////////////////////////////////////////////////// // Function: GraphicsWindowInputDevice::raw_button_up -// Access: Public +// Access: Published // Description: Records that the indicated button has been released. //////////////////////////////////////////////////////////////////// void GraphicsWindowInputDevice:: diff --git a/panda/src/display/graphicsWindowInputDevice.h b/panda/src/display/graphicsWindowInputDevice.h index af66662e64..e76d48c5bc 100644 --- a/panda/src/display/graphicsWindowInputDevice.h +++ b/panda/src/display/graphicsWindowInputDevice.h @@ -76,18 +76,28 @@ public: PUBLISHED: // The following interface is for the various kinds of // GraphicsWindows to record the data incoming on the device. - void button_down(ButtonHandle button, double time = ClockObject::get_global_clock()->get_frame_time()); - void button_resume_down(ButtonHandle button, double time = ClockObject::get_global_clock()->get_frame_time()); - void button_up(ButtonHandle button, double time = ClockObject::get_global_clock()->get_frame_time()); - void keystroke(int keycode, double time = ClockObject::get_global_clock()->get_frame_time()); - void candidate(const wstring &candidate_string, size_t highlight_start, - size_t highlight_end, size_t cursor_pos); - void focus_lost(double time = ClockObject::get_global_clock()->get_frame_time()); - void raw_button_down(ButtonHandle button, double time = ClockObject::get_global_clock()->get_frame_time()); - void raw_button_up(ButtonHandle button, double time = ClockObject::get_global_clock()->get_frame_time()); + INLINE void button_down(ButtonHandle button); + INLINE void button_resume_down(ButtonHandle button); + INLINE void button_up(ButtonHandle button); + INLINE void keystroke(int keycode); + INLINE void focus_lost(); + INLINE void raw_button_down(ButtonHandle button); + INLINE void raw_button_up(ButtonHandle button); + INLINE void set_pointer_in_window(double x, double y); + INLINE void set_pointer_out_of_window(); - INLINE void set_pointer_in_window(double x, double y, double time = ClockObject::get_global_clock()->get_frame_time()); - INLINE void set_pointer_out_of_window(double time = ClockObject::get_global_clock()->get_frame_time()); + void button_down(ButtonHandle button, double time); + void button_resume_down(ButtonHandle button, double time); + void button_up(ButtonHandle button, double time); + void keystroke(int keycode, double time); + void candidate(const wstring &candidate_string, size_t highlight_start, + size_t highlight_end, size_t cursor_pos); + void focus_lost(double time); + void raw_button_down(ButtonHandle button, double time); + void raw_button_up(ButtonHandle button, double time); + + INLINE void set_pointer_in_window(double x, double y, double time); + INLINE void set_pointer_out_of_window(double time); void set_pointer(bool inwin, double x, double y, double time); public: diff --git a/panda/src/distort/nonlinearImager.cxx b/panda/src/distort/nonlinearImager.cxx index 8a397c5183..7a17a61b8f 100644 --- a/panda/src/distort/nonlinearImager.cxx +++ b/panda/src/distort/nonlinearImager.cxx @@ -27,7 +27,7 @@ //////////////////////////////////////////////////////////////////// // Function: NonlinearImager::Constructor // Access: Published -// Description: +// Description: //////////////////////////////////////////////////////////////////// NonlinearImager:: NonlinearImager() { @@ -38,7 +38,7 @@ NonlinearImager() { //////////////////////////////////////////////////////////////////// // Function: NonlinearImager::Destructor // Access: Published -// Description: +// Description: //////////////////////////////////////////////////////////////////// NonlinearImager:: ~NonlinearImager() { @@ -54,7 +54,7 @@ NonlinearImager:: //////////////////////////////////////////////////////////////////// // Function: NonlinearImager::add_screen // Access: Published -// This version of this method is deprecated and will +// Description: This version of this method is deprecated and will // soon be removed. Use the version that takes two // parameters instead. //////////////////////////////////////////////////////////////////// @@ -183,7 +183,7 @@ get_num_screens() const { //////////////////////////////////////////////////////////////////// NodePath NonlinearImager:: get_screen(int index) const { - nassertr(index >= 0 && index < (int)_screens.size(), (ProjectionScreen *)NULL); + nassertr(index >= 0 && index < (int)_screens.size(), NodePath()); return _screens[index]._screen; } @@ -215,7 +215,7 @@ get_buffer(int index) const { void NonlinearImager:: set_texture_size(int index, int width, int height) { nassertv(index >= 0 && index < (int)_screens.size()); - + Screen &screen = _screens[index]; screen._tex_width = width; diff --git a/panda/src/dxml/tinyxml.h b/panda/src/dxml/tinyxml.h index 562a4efc84..4239d02ee0 100644 --- a/panda/src/dxml/tinyxml.h +++ b/panda/src/dxml/tinyxml.h @@ -78,7 +78,7 @@ distribution. #define TIXML_SNPRINTF snprintf #define TIXML_SSCANF sscanf #endif -#endif +#endif class TiXmlDocument; class TiXmlElement; @@ -93,10 +93,10 @@ const int TIXML_MAJOR_VERSION = 2; const int TIXML_MINOR_VERSION = 6; const int TIXML_PATCH_VERSION = 1; -/* Internal structure for tracking location of items +/* Internal structure for tracking location of items in the XML file. */ -struct EXPCL_PANDA TiXmlCursor +struct TiXmlCursor { TiXmlCursor() { Clear(); } void Clear() { row = col = -1; } @@ -116,7 +116,7 @@ struct EXPCL_PANDA TiXmlCursor If you return 'true' from a Visit method, recursive parsing will continue. If you return false, no children of this node or its sibilings will be Visited. - All flavors of Visit methods have a default implementation that returns 'true' (continue + All flavors of Visit methods have a default implementation that returns 'true' (continue visiting). You need to only override methods that are interesting to you. Generally Accept() is called on the TiXmlDocument, although all nodes suppert Visiting. @@ -125,7 +125,7 @@ struct EXPCL_PANDA TiXmlCursor @sa TiXmlNode::Accept() */ -class EXPCL_PANDA TiXmlVisitor +class TiXmlVisitor { public: virtual ~TiXmlVisitor() {} @@ -151,8 +151,8 @@ public: }; // Only used by Attribute::Query functions -enum -{ +enum +{ TIXML_SUCCESS, TIXML_NO_ATTRIBUTE, TIXML_WRONG_TYPE @@ -191,7 +191,7 @@ const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN; A Decleration contains: Attributes (not on tree) @endverbatim */ -class EXPCL_PANDA TiXmlBase +class TiXmlBase { friend class TiXmlNode; friend class TiXmlElement; @@ -204,10 +204,10 @@ public: /** All TinyXml classes can print themselves to a filestream or the string class (TiXmlString in non-STL mode, std::string in STL mode.) Either or both cfile and str can be null. - - This is a formatted print, and will insert + + This is a formatted print, and will insert tabs and newlines. - + (For an unformatted stream, use the << operator.) */ virtual void Print( FILE* cfile, int depth ) const = 0; @@ -252,11 +252,11 @@ public: // in the UTF-8 sequence. static const int utf8ByteTable[256]; - virtual const char* Parse( const char* p, - TiXmlParsingData* data, + virtual const char* Parse( const char* p, + TiXmlParsingData* data, TiXmlEncoding encoding /*= TIXML_ENCODING_UNKNOWN */ ) = 0; - /** Expands entities in a string. Note this should not contian the tag's '<', '>', etc, + /** Expands entities in a string. Note this should not contian the tag's '<', '>', etc, or they will be transformed into entities! */ static void EncodeString( const TIXML_STRING& str, TIXML_STRING* out ); @@ -287,9 +287,9 @@ protected: static const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding ); - inline static bool IsWhiteSpace( char c ) - { - return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' ); + inline static bool IsWhiteSpace( char c ) + { + return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' ); } inline static bool IsWhiteSpace( int c ) { @@ -374,7 +374,7 @@ protected: /// Field containing a generic user pointer void* userData; - + // None of these methods are reliable for any language except English. // Good for approximation, not great for accuracy. static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding ); @@ -420,13 +420,13 @@ private: in a document, or stand on its own. The type of a TiXmlNode can be queried, and it can be cast to its more defined type. */ -class EXPCL_PANDA TiXmlNode : public TiXmlBase +class TiXmlNode : public TiXmlBase { friend class TiXmlDocument; friend class TiXmlElement; public: - #ifdef TIXML_USE_STL + #ifdef TIXML_USE_STL /** An input stream operator, for every class. Tolerant of newlines and formatting, but doesn't expect them. @@ -440,7 +440,7 @@ public: The operator<< and operator>> are not completely symmetric. Writing a node to a stream is very well defined. You'll get a nice stream of output, without any extra whitespace or newlines. - + But reading is not as well defined. (As it always is.) If you create a TiXmlElement (for example) and read that from an input stream, the text needs to define an element or junk will result. This is @@ -448,7 +448,7 @@ public: A TiXmlDocument will read nodes until it reads a root element, and all the children of that root element. - */ + */ friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base); /// Appends the XML node or attribute to a std::string. @@ -530,7 +530,7 @@ public: } const TiXmlNode* LastChild() const { return lastChild; } /// The last child of this node. Will be null if there are no children. TiXmlNode* LastChild() { return lastChild; } - + const TiXmlNode* LastChild( const char * value ) const; /// The last child of this node matching 'value'. Will be null if there are no children. TiXmlNode* LastChild( const char * _value ) { return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->LastChild( _value )); @@ -709,11 +709,11 @@ public: virtual TiXmlDeclaration* ToDeclaration() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. /** Create an exact duplicate of this node and return it. The memory must be deleted - by the caller. + by the caller. */ virtual TiXmlNode* Clone() const = 0; - /** Accept a hierchical visit the nodes in the TinyXML DOM. Every node in the + /** Accept a hierchical visit the nodes in the TinyXML DOM. Every node in the XML tree will be conditionally visited and the host will be called back via the TiXmlVisitor interface. @@ -724,7 +724,7 @@ public: The interface has been based on ideas from: - http://www.saxproject.org/ - - http://c2.com/cgi/wiki?HierarchicalVisitorPattern + - http://c2.com/cgi/wiki?HierarchicalVisitorPattern Which are both good references for "visiting". @@ -776,7 +776,7 @@ private: part of the tinyXML document object model. There are other suggested ways to look at this problem. */ -class EXPCL_PANDA TiXmlAttribute : public TiXmlBase +class TiXmlAttribute : public TiXmlBase { friend class TiXmlAttributeSet; @@ -821,7 +821,7 @@ public: /** QueryIntValue examines the value string. It is an alternative to the IntValue() method with richer error checking. - If the value is an integer, it is stored in 'value' and + If the value is an integer, it is stored in 'value' and the call returns TIXML_SUCCESS. If it is not an integer, it returns TIXML_WRONG_TYPE. @@ -840,21 +840,21 @@ public: #ifdef TIXML_USE_STL /// STL std::string form. - void SetName( const std::string& _name ) { name = _name; } - /// STL std::string form. + void SetName( const std::string& _name ) { name = _name; } + /// STL std::string form. void SetValue( const std::string& _value ) { value = _value; } #endif /// Get the next sibling attribute in the DOM. Returns null at end. const TiXmlAttribute* Next() const; TiXmlAttribute* Next() { - return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Next() ); + return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Next() ); } /// Get the previous sibling attribute in the DOM. Returns null at beginning. const TiXmlAttribute* Previous() const; TiXmlAttribute* Previous() { - return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Previous() ); + return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Previous() ); } bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; } @@ -890,7 +890,7 @@ private: /* A class used to manage a group of attributes. It is only used internally, both by the ELEMENT and the DECLARATION. - + The set can be changed transparent to the Element and Declaration classes that use it, but NOT transparent to the Attribute which has to implement a next() and previous() method. Which makes @@ -900,7 +900,7 @@ private: - I like circular lists - it demonstrates some independence from the (typical) doubly linked list. */ -class EXPCL_PANDA TiXmlAttributeSet +class TiXmlAttributeSet { public: TiXmlAttributeSet(); @@ -937,7 +937,7 @@ private: and can contain other elements, text, comments, and unknowns. Elements also contain an arbitrary number of attributes. */ -class EXPCL_PANDA TiXmlElement : public TiXmlNode +class TiXmlElement : public TiXmlNode { public: /// Construct an element. @@ -977,11 +977,11 @@ public: /** QueryIntAttribute examines the attribute - it is an alternative to the Attribute() method with richer error checking. - If the attribute is an integer, it is stored in 'value' and + If the attribute is an integer, it is stored in 'value' and the call returns TIXML_SUCCESS. If it is not an integer, it returns TIXML_WRONG_TYPE. If the attribute does not exist, then TIXML_NO_ATTRIBUTE is returned. - */ + */ int QueryIntAttribute( const char* name, int* _value ) const; /// QueryDoubleAttribute examines the attribute - see QueryIntAttribute(). int QueryDoubleAttribute( const char* name, double* _value ) const; @@ -1009,7 +1009,7 @@ public: /** Template form of the attribute query which will try to read the attribute into the specified type. Very easy, very powerful, but be careful to make sure to call this with the correct type. - + NOTE: This method doesn't work correctly for 'string' types that contain spaces. @return TIXML_SUCCESS, TIXML_WRONG_TYPE, or TIXML_NO_ATTRIBUTE @@ -1082,7 +1082,7 @@ public: /** Convenience function for easy access to the text inside an element. Although easy and concise, GetText() is limited compared to getting the TiXmlText child and accessing it directly. - + If the first child of 'this' is a TiXmlText, the GetText() returns the character string of the Text node, else null is returned. @@ -1092,23 +1092,23 @@ public: const char* str = fooElement->GetText(); @endverbatim - 'str' will be a pointer to "This is text". - + 'str' will be a pointer to "This is text". + Note that this function can be misleading. If the element foo was created from this XML: @verbatim - This is text + This is text @endverbatim then the value of str would be null. The first child node isn't a text node, it is another element. From this XML: @verbatim - This is text + This is text @endverbatim GetText() will return "This is ". - WARNING: GetText() accesses a child node - don't become confused with the - similarly named TiXmlHandle::Text() and TiXmlNode::ToText() which are + WARNING: GetText() accesses a child node - don't become confused with the + similarly named TiXmlHandle::Text() and TiXmlNode::ToText() which are safe type casts on the referenced node. */ const char* GetText() const; @@ -1126,7 +1126,7 @@ public: virtual const TiXmlElement* ToElement() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlElement* ToElement() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - /** Walk the XML tree visiting this node and all of its children. + /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* visitor ) const; @@ -1152,7 +1152,7 @@ private: /** An XML comment. */ -class EXPCL_PANDA TiXmlComment : public TiXmlNode +class TiXmlComment : public TiXmlNode { public: /// Constructs an empty comment. @@ -1179,7 +1179,7 @@ public: virtual const TiXmlComment* ToComment() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlComment* ToComment() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - /** Walk the XML tree visiting this node and all of its children. + /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* visitor ) const; @@ -1197,16 +1197,16 @@ private: }; -/** XML text. A text node can have 2 ways to output the next. "normal" output +/** XML text. A text node can have 2 ways to output the next. "normal" output and CDATA. It will default to the mode it was parsed from the XML file and - you generally want to leave it alone, but you can change the output mode with + you generally want to leave it alone, but you can change the output mode with SetCDATA() and query it with CDATA(). */ -class EXPCL_PANDA TiXmlText : public TiXmlNode +class TiXmlText : public TiXmlNode { friend class TiXmlElement; public: - /** Constructor for text element. By default, it is treated as + /** Constructor for text element. By default, it is treated as normal, encoded text. If you want it be output as a CDATA text element, set the parameter _cdata to 'true' */ @@ -1242,7 +1242,7 @@ public: virtual const TiXmlText* ToText() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlText* ToText() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - /** Walk the XML tree visiting this node and all of its children. + /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* content ) const; @@ -1275,7 +1275,7 @@ private: handled as special cases, not generic attributes, simply because there can only be at most 3 and they are always the same. */ -class EXPCL_PANDA TiXmlDeclaration : public TiXmlNode +class TiXmlDeclaration : public TiXmlNode { public: /// Construct an empty declaration. @@ -1318,7 +1318,7 @@ public: virtual const TiXmlDeclaration* ToDeclaration() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlDeclaration* ToDeclaration() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - /** Walk the XML tree visiting this node and all of its children. + /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* visitor ) const; @@ -1344,7 +1344,7 @@ private: DTD tags get thrown into TiXmlUnknowns. */ -class EXPCL_PANDA TiXmlUnknown : public TiXmlNode +class TiXmlUnknown : public TiXmlNode { public: TiXmlUnknown() : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN ) {} @@ -1363,7 +1363,7 @@ public: virtual const TiXmlUnknown* ToUnknown() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlUnknown* ToUnknown() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - /** Walk the XML tree visiting this node and all of its children. + /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* content ) const; @@ -1383,7 +1383,7 @@ private: XML pieces. It can be saved, loaded, and printed to the screen. The 'value' of a document node is the xml file name. */ -class EXPCL_PANDA TiXmlDocument : public TiXmlNode +class TiXmlDocument : public TiXmlNode { public: /// Create an empty document, that has no name. @@ -1449,7 +1449,7 @@ public: - The ErrorId() will contain the integer identifier of the error (not generally useful) - The ErrorDesc() method will return the name of the error. (very useful) - The ErrorRow() and ErrorCol() will return the location of the error (if known) - */ + */ bool Error() const { return error; } /// Contains a textual (english) description of the error if one occurs. @@ -1460,7 +1460,7 @@ public: */ int ErrorId() const { return errorId; } - /** Returns the location (if known) of the error. The first column is column 1, + /** Returns the location (if known) of the error. The first column is column 1, and the first row is row 1. A value of 0 means the row and column wasn't applicable (memory errors, for example, have no row/column) or the parser lost the error. (An error in the error reporting, in that case.) @@ -1473,7 +1473,7 @@ public: /** SetTabSize() allows the error reporting functions (ErrorRow() and ErrorCol()) to report the correct values for row and column. It does not change the output or input in any way. - + By calling this method, with a tab size greater than 0, the row and column of each node and attribute is stored when the file is loaded. Very useful for tracking the DOM back in to @@ -1501,11 +1501,11 @@ public: /** If you have handled the error, it can be reset with this call. The error state is automatically cleared if you Parse a new XML block. */ - void ClearError() { error = false; - errorId = 0; - errorDesc = ""; - errorLocation.row = errorLocation.col = 0; - //errorLocation.last = 0; + void ClearError() { error = false; + errorId = 0; + errorDesc = ""; + errorLocation.row = errorLocation.col = 0; + //errorLocation.last = 0; } /** Write the document to standard out using formatted printing ("pretty print"). */ @@ -1515,7 +1515,7 @@ public: will allocate a character array (new char[]) and return it as a pointer. The calling code pust call delete[] on the return char* to avoid a memory leak. */ - //char* PrintToMemory() const; + //char* PrintToMemory() const; /// Print this Document to a FILE stream. virtual void Print( FILE* cfile, int depth = 0 ) const; @@ -1525,7 +1525,7 @@ public: virtual const TiXmlDocument* ToDocument() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlDocument* ToDocument() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - /** Walk the XML tree visiting this node and all of its children. + /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* content ) const; @@ -1563,7 +1563,7 @@ private: @endverbatim - Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very + Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very easy to write a *lot* of code that looks like: @verbatim @@ -1583,7 +1583,7 @@ private: @endverbatim And that doesn't even cover "else" cases. TiXmlHandle addresses the verbosity - of such code. A TiXmlHandle checks for null pointers so it is perfectly safe + of such code. A TiXmlHandle checks for null pointers so it is perfectly safe and correct to use: @verbatim @@ -1604,7 +1604,7 @@ private: What they should not be used for is iteration: @verbatim - int i=0; + int i=0; while ( true ) { TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).ToElement(); @@ -1615,8 +1615,8 @@ private: } @endverbatim - It seems reasonable, but it is in fact two embedded while loops. The Child method is - a linear walk to find the element, so this code would iterate much more than it needs + It seems reasonable, but it is in fact two embedded while loops. The Child method is + a linear walk to find the element, so this code would iterate much more than it needs to. Instead, prefer: @verbatim @@ -1628,7 +1628,7 @@ private: } @endverbatim */ -class EXPCL_PANDA TiXmlHandle +class TiXmlHandle { public: /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. @@ -1646,20 +1646,20 @@ public: /// Return a handle to the first child element with the given name. TiXmlHandle FirstChildElement( const char * value ) const; - /** Return a handle to the "index" child with the given name. + /** Return a handle to the "index" child with the given name. The first child is 0, the second 1, etc. */ TiXmlHandle Child( const char* value, int index ) const; - /** Return a handle to the "index" child. + /** Return a handle to the "index" child. The first child is 0, the second 1, etc. */ TiXmlHandle Child( int index ) const; - /** Return a handle to the "index" child element with the given name. + /** Return a handle to the "index" child element with the given name. The first child element is 0, the second 1, etc. Note that only TiXmlElements are indexed: other types are not counted. */ TiXmlHandle ChildElement( const char* value, int index ) const; - /** Return a handle to the "index" child element. + /** Return a handle to the "index" child element. The first child element is 0, the second 1, etc. Note that only TiXmlElements are indexed: other types are not counted. */ @@ -1675,7 +1675,7 @@ public: /** Return the handle as a TiXmlNode. This may return null. */ - TiXmlNode* ToNode() const { return node; } + TiXmlNode* ToNode() const { return node; } /** Return the handle as a TiXmlElement. This may return null. */ TiXmlElement* ToElement() const { return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); } @@ -1686,11 +1686,11 @@ public: */ TiXmlUnknown* ToUnknown() const { return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); } - /** @deprecated use ToNode. + /** @deprecated use ToNode. Return the handle as a TiXmlNode. This may return null. */ - TiXmlNode* Node() const { return ToNode(); } - /** @deprecated use ToElement. + TiXmlNode* Node() const { return ToNode(); } + /** @deprecated use ToElement. Return the handle as a TiXmlElement. This may return null. */ TiXmlElement* Element() const { return ToElement(); } @@ -1727,7 +1727,7 @@ private: fprintf( stdout, "%s", printer.CStr() ); @endverbatim */ -class EXPCL_PANDA TiXmlPrinter : public TiXmlVisitor +class TiXmlPrinter : public TiXmlVisitor { public: TiXmlPrinter() : depth( 0 ), simpleTextPrint( false ), @@ -1750,7 +1750,7 @@ public: void SetIndent( const char* _indent ) { indent = _indent ? _indent : "" ; } /// Query the indention string. const char* Indent() { return indent.c_str(); } - /** Set the line breaking string. By default set to newline (\n). + /** Set the line breaking string. By default set to newline (\n). Some operating systems prefer other characters, or can be set to the null/empty string for no indenation. */ @@ -1758,12 +1758,12 @@ public: /// Query the current line breaking string. const char* LineBreak() { return lineBreak.c_str(); } - /** Switch over to "stream printing" which is the most dense formatting without + /** Switch over to "stream printing" which is the most dense formatting without linebreaks. Common when the XML is needed for network transmission. */ void SetStreamPrinting() { indent = ""; lineBreak = ""; - } + } /// Return the result. const char* CStr() { return buffer.c_str(); } /// Return the length of the result string. diff --git a/panda/src/egg/eggNurbsSurface.h b/panda/src/egg/eggNurbsSurface.h index cc55d70730..e658943435 100644 --- a/panda/src/egg/eggNurbsSurface.h +++ b/panda/src/egg/eggNurbsSurface.h @@ -77,6 +77,7 @@ PUBLISHED: virtual void write(ostream &out, int indent_level) const; +public: Curves _curves_on_surface; Trims _trims; diff --git a/panda/src/event/pythonTask.I b/panda/src/event/pythonTask.I index d17a60ad58..3d45c2762e 100644 --- a/panda/src/event/pythonTask.I +++ b/panda/src/event/pythonTask.I @@ -12,3 +12,42 @@ // //////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////// +// Function: PythonTask::set_delay +// Access: Public +// Description: If None is passed, calls clear_delay, otherwise +// sets the delay time. See AsyncTask::set_delay() +// and AsyncTask::clear_delay(). +//////////////////////////////////////////////////////////////////// +INLINE void PythonTask:: +set_delay(PyObject *delay) { + if (delay == Py_None) { + AsyncTask::clear_delay(); + return; + } + + PyObject *value = PyNumber_Float(delay); + if (value == NULL) { + return; + } + + AsyncTask::set_delay(PyFloat_AS_DOUBLE(value)); + Py_DECREF(value); +} + +//////////////////////////////////////////////////////////////////// +// Function: PythonTask::get_delay +// Access: Public +// Description: Returns the delay time if set, None otherwise. +// See AsyncTask::has_delay() and AsyncTask::get_delay(). +//////////////////////////////////////////////////////////////////// +INLINE PyObject *PythonTask:: +get_delay() const { + if (AsyncTask::has_delay()) { + return PyFloat_FromDouble(AsyncTask::get_delay()); + } else { + Py_INCREF(Py_None); + return Py_None; + } +} diff --git a/panda/src/event/pythonTask.cxx b/panda/src/event/pythonTask.cxx index 53be111dfa..a5ea42c1a7 100644 --- a/panda/src/event/pythonTask.cxx +++ b/panda/src/event/pythonTask.cxx @@ -51,17 +51,11 @@ PythonTask(PyObject *function, const string &name) : set_upon_death(Py_None); set_owner(Py_None); - _dict = PyDict_New(); + __dict__ = PyDict_New(); #ifndef SIMPLE_THREADS - // Ensure that the Python threading system is initialized and ready - // to go. + // Ensure that the Python threading system is initialized and ready to go. #ifdef WITH_THREAD // This symbol defined within Python.h - -#if PY_VERSION_HEX >= 0x03020000 - Py_Initialize(); -#endif - PyEval_InitThreads(); #endif #endif @@ -76,7 +70,7 @@ PythonTask:: ~PythonTask() { Py_DECREF(_function); Py_DECREF(_args); - Py_DECREF(_dict); + Py_DECREF(__dict__); Py_XDECREF(_generator); Py_XDECREF(_owner); Py_XDECREF(_upon_death); @@ -123,7 +117,7 @@ void PythonTask:: set_args(PyObject *args, bool append_task) { Py_XDECREF(_args); _args = NULL; - + if (args == Py_None) { // None means no arguments; create an empty tuple. _args = PyTuple_New(0); @@ -254,53 +248,36 @@ get_owner() { // arbitrary data to the Task object. //////////////////////////////////////////////////////////////////// int PythonTask:: -__setattr__(const string &attr_name, PyObject *v) { +__setattr__(PyObject *self, PyObject *attr, PyObject *v) { + if (PyObject_GenericSetAttr(self, attr, v) == 0) { + return 0; + } + + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) { + return -1; + } + + PyErr_Clear(); + if (task_cat.is_debug()) { PyObject *str = PyObject_Repr(v); - task_cat.debug() - << *this << ": task." << attr_name << " = " + task_cat.debug() + << *this << ": task." #if PY_MAJOR_VERSION >= 3 + << PyUnicode_AsUTF8(attr) << " = " << PyUnicode_AsUTF8(str) << "\n"; #else - << PyString_AsString(str) << "\n"; + << PyString_AsString(attr) << " = " + << PyString_AsString(str) << "\n"; #endif Py_DECREF(str); } - if (attr_name == "delayTime") { - if (v == Py_None) { - clear_delay(); - } else { - double delay = PyFloat_AsDouble(v); - if (!PyErr_Occurred()) { - set_delay(delay); - } - } - - } else if (attr_name == "name") { -#if PY_MAJOR_VERSION >= 3 - char *name = PyUnicode_AsUTF8(v); -#else - char *name = PyString_AsString(v); -#endif - if (name != (char *)NULL) { - set_name(name); - } - - } else if (attr_name == "id" || attr_name == "time" || - attr_name == "frame" || attr_name == "wakeTime") { - nassert_raise("Cannot set constant value"); - return true; - - } else { - return PyDict_SetItemString(_dict, attr_name.c_str(), v); - } - - return 0; + return PyDict_SetItem(__dict__, attr, v); } //////////////////////////////////////////////////////////////////// -// Function: PythonTask::__setattr__ +// Function: PythonTask::__delattr__ // Access: Published // Description: Maps from an expression like "del task.attr_name". // This is customized here so we can support some @@ -309,8 +286,32 @@ __setattr__(const string &attr_name, PyObject *v) { // arbitrary data to the Task object. //////////////////////////////////////////////////////////////////// int PythonTask:: -__setattr__(const string &attr_name) { - return PyDict_DelItemString(_dict, attr_name.c_str()); +__delattr__(PyObject *self, PyObject *attr) { + if (PyObject_GenericSetAttr(self, attr, NULL) == 0) { + return 0; + } + + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) { + return -1; + } + + PyErr_Clear(); + + if (PyDict_DelItem(__dict__, attr) == -1) { + // PyDict_DelItem does not raise an exception. +#if PY_MAJOR_VERSION < 3 + PyErr_Format(PyExc_AttributeError, + "'PythonTask' object has no attribute '%.400s'", + PyString_AS_STRING(attr)); +#else + PyErr_Format(PyExc_AttributeError, + "'PythonTask' object has no attribute '%U'", + attr); +#endif + return -1; + } + + return 0; } //////////////////////////////////////////////////////////////////// @@ -323,43 +324,64 @@ __setattr__(const string &attr_name) { // arbitrary data to the Task object. //////////////////////////////////////////////////////////////////// PyObject *PythonTask:: -__getattr__(const string &attr_name) const { - if (attr_name == "time") { - return PyFloat_FromDouble(get_elapsed_time()); +__getattr__(PyObject *attr) const { + // Note that with the new Interrogate behavior, this method + // behaves more like the Python __getattr__ rather than being + // directly assigned to the tp_getattro slot (a la __getattribute__). + // So, we won't get here when the attribute has already been found + // via other methods. - } else if (attr_name == "name") { -#if PY_MAJOR_VERSION >= 3 - return PyUnicode_FromString(get_name().c_str()); + PyObject *item = PyDict_GetItem(__dict__, attr); + + if (item == NULL) { + // PyDict_GetItem does not raise an exception. +#if PY_MAJOR_VERSION < 3 + PyErr_Format(PyExc_AttributeError, + "'PythonTask' object has no attribute '%.400s'", + PyString_AS_STRING(attr)); #else - return PyString_FromString(get_name().c_str()); + PyErr_Format(PyExc_AttributeError, + "'PythonTask' object has no attribute '%U'", + attr); #endif - - } else if (attr_name == "wakeTime") { - return PyFloat_FromDouble(get_wake_time()); - - } else if (attr_name == "delayTime") { - if (!has_delay()) { - Py_RETURN_NONE; - } - return PyFloat_FromDouble(get_delay()); - - } else if (attr_name == "frame") { -#if PY_MAJOR_VERSION >= 3 - return PyLong_FromLong(get_elapsed_frames()); -#else - return PyInt_FromLong(get_elapsed_frames()); -#endif - - } else if (attr_name == "id") { -#if PY_MAJOR_VERSION >= 3 - return PyLong_FromLong(_task_id); -#else - return PyInt_FromLong(_task_id); -#endif - - } else { - return PyMapping_GetItemString(_dict, (char *)attr_name.c_str()); + return NULL; } + + // PyDict_GetItem returns a borrowed reference. + Py_INCREF(item); + return item; +} + +//////////////////////////////////////////////////////////////////// +// Function: PythonTask::__traverse__ +// Access: Published +// Description: Called by Python to implement cycle detection. +//////////////////////////////////////////////////////////////////// +int PythonTask:: +__traverse__(visitproc visit, void *arg) { + Py_VISIT(_function); + Py_VISIT(_args); + Py_VISIT(_upon_death); + Py_VISIT(_owner); + Py_VISIT(__dict__); + Py_VISIT(_generator); + return 0; +} + +//////////////////////////////////////////////////////////////////// +// Function: PythonTask::__clear__ +// Access: Published +// Description: Called by Python to implement cycle breaking. +//////////////////////////////////////////////////////////////////// +int PythonTask:: +__clear__() { + Py_CLEAR(_function); + Py_CLEAR(_args); + Py_CLEAR(_upon_death); + Py_CLEAR(_owner); + Py_CLEAR(__dict__); + Py_CLEAR(_generator); + return 0; } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/event/pythonTask.h b/panda/src/event/pythonTask.h index 294af18387..999b5e6454 100644 --- a/panda/src/event/pythonTask.h +++ b/panda/src/event/pythonTask.h @@ -20,6 +20,8 @@ #include "asyncTask.h" #ifdef HAVE_PYTHON +#include "py_panda.h" + //////////////////////////////////////////////////////////////////// // Class : PythonTask // Description : This class exists to allow association of a Python @@ -43,9 +45,47 @@ PUBLISHED: void set_owner(PyObject *owner); PyObject *get_owner(); - int __setattr__(const string &attr_name, PyObject *v); - int __setattr__(const string &attr_name); - PyObject *__getattr__(const string &attr_name) const; + int __setattr__(PyObject *self, PyObject *attr, PyObject *v); + int __delattr__(PyObject *self, PyObject *attr); + PyObject *__getattr__(PyObject *attr) const; + + int __traverse__(visitproc visit, void *arg); + int __clear__(); + + INLINE void set_delay(PyObject *delay); + INLINE PyObject *get_delay() const; + +PUBLISHED: + // The name of this task. + MAKE_PROPERTY(name, get_name, set_name); + + // The amount of seconds that have elapsed since the task was + // started, according to the task manager's clock. + MAKE_PROPERTY(time, get_elapsed_time); + + // If this task has been added to an AsyncTaskManager with a delay + // in effect, this contains the time at which the task is expected + // to awaken. It has no meaning of the task has not yet been added + // to a queue, or if there was no delay in effect at the time the + // task was added. + // + // If the task's status is not S_sleeping, this contains 0.0. + MAKE_PROPERTY(wake_time, get_wake_time); + + // The delay value that has been set on this task, if any, or None. + MAKE_PROPERTY(delay_time, get_delay, set_delay); + + // The number of frames that have elapsed since the task was + // started, according to the task manager's clock. + MAKE_PROPERTY(frame, get_elapsed_frames); + + // This is a number guaranteed to be unique for each different + // AsyncTask object in the universe. + MAKE_PROPERTY(id, get_task_id); + + // This is a special variable to hold the instance dictionary in + // which custom variables may be stored. + PyObject *__dict__; protected: virtual bool is_runnable(); @@ -67,7 +107,6 @@ private: PyObject *_upon_death; PyObject *_owner; bool _registered_to_owner; - PyObject *_dict; PyObject *_generator; diff --git a/panda/src/express/ca-bundle.crt b/panda/src/express/ca-bundle.crt index 14a99c5ed0..d27397ed88 100644 --- a/panda/src/express/ca-bundle.crt +++ b/panda/src/express/ca-bundle.crt @@ -1,12 +1,12 @@ ## ## ca-bundle.crt -- Bundle of CA Root Certificates ## -## Certificate data from Mozilla as of: Wed Jan 18 00:04:16 2012 +## Certificate data from Mozilla as of: Wed Feb 25 16:40:11 2015 ## ## This is a bundle of X.509 certificates of public Certificate Authorities ## (CA). These were automatically extracted from Mozilla's root certificates ## file (certdata.txt). This file can be found in the mozilla source tree: -## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 +## http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt ## ## It contains the certificates in PEM format and therefore ## can be directly used with curl / libcurl / php_curl, or with @@ -14,97 +14,6 @@ ## Just configure this file as the SSLCACertificateFile. ## -# ***** BEGIN LICENSE BLOCK ***** -# Version: MPL 1.1/GPL 2.0/LGPL 2.1 -# -# The contents of this file are subject to the Mozilla Public License Version -# 1.1 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# The Original Code is the Netscape security libraries. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1994-2000 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# -# Alternatively, the contents of this file may be used under the terms of -# either the GNU General Public License Version 2 or later (the "GPL"), or -# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -# in which case the provisions of the GPL or the LGPL are applicable instead -# of those above. If you wish to allow use of your version of this file only -# under the terms of either the GPL or the LGPL, and not to allow others to -# use your version of this file under the terms of the MPL, indicate your -# decision by deleting the provisions above and replace them with the notice -# and other provisions required by the GPL or the LGPL. If you do not delete -# the provisions above, a recipient may use your version of this file under -# the terms of any one of the MPL, the GPL or the LGPL. -# -# ***** END LICENSE BLOCK ***** -# @(#) $RCSfile$ $Revision$ $Date$ - -GTE CyberTrust Global Root -========================== ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg -Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG -A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz -MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL -Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 -IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u -sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql -HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID -AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW -M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF -NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -Thawte Server CA -================ ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE -AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j -b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV -BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u -c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG -A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 -ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl -/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 -1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR -MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J -GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ -GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -Thawte Premium Server CA -======================== ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE -AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl -ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT -AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU -VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 -aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ -cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 -aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh -Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ -qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm -SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf -8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t -UCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- Equifax Secure CA ================= @@ -126,81 +35,6 @@ BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 70+sB3c4 -----END CERTIFICATE----- -Digital Signature Trust Co. Global CA 1 -======================================= ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE -ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy -MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs -IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE -NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i -o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo -BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 -dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw -IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY -MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM -BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB -ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq -kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4 -RbyhkwS7hp86W0N6w4pl ------END CERTIFICATE----- - -Digital Signature Trust Co. Global CA 3 -======================================= ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE -ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy -MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs -IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD -VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS -xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo -BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 -dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw -IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY -MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM -BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB -AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi -up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1 -mPnHfxsb1gYgAlihw6ID ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA -TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah -WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf -Tqj/ZA1k ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G2 -============================================================ ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO -FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 -lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB -MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT -1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD -Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 ------END CERTIFICATE----- - GlobalSign Root CA ================== -----BEGIN CERTIFICATE----- @@ -244,63 +78,6 @@ BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- -ValiCert Class 1 VA -=================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy -MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi -GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm -DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG -lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX -icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP -Orf1LXLI ------END CERTIFICATE----- - -ValiCert Class 2 VA -=================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw -MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC -CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf -ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ -SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV -UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 -W9ViH0Pd ------END CERTIFICATE----- - -RSA Root Certificate 1 -====================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw -MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td -3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H -BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs -3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF -V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r -on+jjBXu ------END CERTIFICATE----- - Verisign Class 3 Public Primary Certification Authority - G3 ============================================================ -----BEGIN CERTIFICATE----- @@ -349,41 +126,14 @@ RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== -----END CERTIFICATE----- -Entrust.net Secure Server CA -============================ ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV -BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg -cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl -ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG -A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi -eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p -dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ -aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 -gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw -ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw -CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l -dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw -NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow -HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA -BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN -Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 -n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - Entrust.net Premium 2048 Secure Server CA ========================================= -----BEGIN CERTIFICATE----- -MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx -NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A @@ -391,14 +141,13 @@ MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi -VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC -AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER -gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B -AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo -oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS -o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z -2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX -OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ +KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy +T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT +J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e +nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= -----END CERTIFICATE----- Baltimore CyberTrust Root @@ -439,43 +188,6 @@ I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV -----END CERTIFICATE----- -Equifax Secure eBusiness CA 1 -============================= ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB -LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE -ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz -IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ -1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a -IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk -MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW -Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF -AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 -lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ -KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - -Equifax Secure eBusiness CA 2 -============================= ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE -ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y -MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT -DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn -2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5 -BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG -A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx -JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG -A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e -uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB -Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1 -jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia -78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm -V+GRMOrN ------END CERTIFICATE----- - AddTrust Low-Value Services Root ================================ -----BEGIN CERTIFICATE----- @@ -721,59 +433,6 @@ gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- -America Online Root Certification Authority 1 -============================================= ------BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG -v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z -DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh -sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP -8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T -AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z -o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf -GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF -VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft -3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g -Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds -sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 ------END CERTIFICATE----- - -America Online Root Certification Authority 2 -============================================= ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en -fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 -f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO -qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN -RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 -gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn -6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid -FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 -Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj -B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op -aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY -T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p -+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg -JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy -zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO -ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh -1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf -GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff -Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP -cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= ------END CERTIFICATE----- - Visa eCommerce Root =================== -----BEGIN CERTIFICATE----- @@ -1050,58 +709,6 @@ nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== -----END CERTIFICATE----- -TDC Internet Root CA -==================== ------BEGIN CERTIFICATE----- -MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE -ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx -NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu -ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j -xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL -znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc -5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6 -otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI -AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM -VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM -MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC -AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe -UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G -CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m -gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ -2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb -O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU -Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l ------END CERTIFICATE----- - -TDC OCES Root CA -================ ------BEGIN CERTIFICATE----- -MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE -ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5 -MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH -nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0 -zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV -iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde -dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO -3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB -5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k -ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm -cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp -Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x -LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM -MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm -aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy -MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647 -+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6 -NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4 -A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc -A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9 -AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1 -AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw== ------END CERTIFICATE----- - UTN DATACorp SGC Root CA ======================== -----BEGIN CERTIFICATE----- @@ -1242,64 +849,6 @@ KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM 8CgHrTwXZoi1/baI -----END CERTIFICATE----- -NetLock Business (Class B) Root -=============================== ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg -VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD -VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv -bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg -VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB -iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S -o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr -1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV -HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ -RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh -dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 -ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv -c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg -YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz -Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA -bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl -IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 -YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj -cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM -43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR -stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- - -NetLock Express (Class C) Root -============================== ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD -KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ -BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 -dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j -ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB -jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z -W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 -euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw -DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN -RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn -YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB -IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i -aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 -ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y -emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k -IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ -UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg -YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 -xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW -gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- - XRamp Global CA Root ==================== -----BEGIN CERTIFICATE----- @@ -1443,54 +992,6 @@ CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy +fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS -----END CERTIFICATE----- -Firmaprofesional Root CA -======================== ------BEGIN CERTIFICATE----- -MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT -GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp -Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA -ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL -MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT -OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2 -ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V -j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH -lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf -3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8 -NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww -KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG -AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD -ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq -u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf -wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm -7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG -VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA= ------END CERTIFICATE----- - -Wells Fargo Root CA -=================== ------BEGIN CERTIFICATE----- -MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV -BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN -MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl -bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv -MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX -x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3 -E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5 -OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j -sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj -YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF -BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD -ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv -m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R -OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx -x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023 -tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= ------END CERTIFICATE----- - Swisscom Root CA 1 ================== -----BEGIN CERTIFICATE----- @@ -2102,40 +1603,6 @@ PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- -AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. -====================================== ------BEGIN CERTIFICATE----- -MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT -AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg -LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w -HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ -U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh -IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN -yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU -2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 -4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP -2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm -8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf -HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa -Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK -5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b -czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g -ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF -BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug -cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf -AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX -EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v -/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 -MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 -3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk -eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f -/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h -RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU -Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== ------END CERTIFICATE----- - TC TrustCenter Class 2 CA II ============================ -----BEGIN CERTIFICATE----- @@ -2783,22 +2250,6 @@ MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA== -----END CERTIFICATE----- -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky -CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX -bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ -D/xwzoiQ ------END CERTIFICATE----- - Microsec e-Szigno Root CA 2009 ============================== -----BEGIN CERTIFICATE----- @@ -2866,29 +2317,6 @@ YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r kpeDMdmztcpHWD9f -----END CERTIFICATE----- -TC TrustCenter Universal CA III -=============================== ------BEGIN CERTIFICATE----- -MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy -IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe -Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU -QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex -KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt -QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO -juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut -CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1 -M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G -A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA -g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+ -KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK -BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV -CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq -woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== ------END CERTIFICATE----- - Autoridad de Certificacion Firmaprofesional CIF A62634068 ========================================================= -----BEGIN CERTIFICATE----- @@ -3388,3 +2816,1074 @@ TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD /md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N 7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 -----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM +BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE +AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky +MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz +IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ +wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa +by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 +zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f +YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 +oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l +EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 +hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 +EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 +jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY +iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI +WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 +JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx +K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ +Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC +4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo +2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz +lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem +OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 +vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +Trustis FPS Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG +EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 +IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV +BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ +RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk +H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa +cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt +o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA +AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd +BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c +GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC +yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P +8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV +l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl +iB6XzCGcKQENZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ +Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 +dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu +c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv +bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 +aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t +L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG +cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 +fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm +N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN +Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T +tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX +e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA +2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs +HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib +D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= +-----END CERTIFICATE----- + +StartCom Certification Authority G2 +=================================== +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE +ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O +o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG +4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi +Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul +Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs +O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H +vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L +nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS +FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa +z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ +KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk +J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ +JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG +/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc +nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld +blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc +l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm +7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm +obp573PYtlNXLfbQ4ddI +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 3 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE----- + +EE Certification Centre Root CA +=============================== +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy +dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw +MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB +UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy +ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM +TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 +rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw +93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN +P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ +MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF +BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj +xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM +lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU +3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM +dcGWxZ0= +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 2007 +================================================= +-----BEGIN CERTIFICATE----- +MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP +MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg +QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X +DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl +a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN +BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp +bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N +YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv +KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya +KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT +rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC +AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s +Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I +aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO +Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb +BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK +poRq0Tl9 +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe +Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE +LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD +ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA +BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv +KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z +p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC +AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ +4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y +eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw +MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G +PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw +OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm +2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV +dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph +X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 EV 2009 +================================= +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS +egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh +zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T +7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 +sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 +11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv +cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v +ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El +MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp +b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh +c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ +PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX +ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA +NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv +w9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +PSCProcert +========== +-----BEGIN CERTIFICATE----- +MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk +ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ +MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz +dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl +cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw +IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw +MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w +DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD +ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp +Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC +wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA +3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh +RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO +EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2 +0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH +0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU +td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw +Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp +r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/ +AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz +Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId +xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp +ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH +EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h +Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k +ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG +9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG +MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG +LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52 +ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy +YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v +Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o +dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq +T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN +g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q +uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1 +n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn +FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo +5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq +3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5 +poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y +eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km +-----END CERTIFICATE----- + +China Internet Network Information Center EV Certificates Root +============================================================== +-----BEGIN CERTIFICATE----- +MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D +aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg +Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG +A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM +PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl +cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y +jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV +98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H +klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23 +KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC +7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD +glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5 +0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM +7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws +ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0 +5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8= +-----END CERTIFICATE----- + +Swisscom Root CA 2 +================== +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQG +EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy +dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2 +MjUwNzM4MTRaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln +aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIIC +IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvErjw0DzpPM +LgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r0rk0X2s682Q2zsKwzxNo +ysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJ +wDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVPACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpH +Wrumnf2U5NGKpV+GY3aFy6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1a +SgJA/MTAtukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL6yxS +NLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0uPoTXGiTOmekl9Ab +mbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrALacywlKinh/LTSlDcX3KwFnUey7QY +Ypqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velhk6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3 +qPyZ7iVNTA6z00yPhOgpD/0QVAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw +HQYDVR0hBBYwFDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O +BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqhb97iEoHF8Twu +MA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4RfbgZPnm3qKhyN2abGu2sEzsO +v2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ +82YqZh6NM4OKb3xuqFp1mrjX2lhIREeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLz +o9v/tdhZsnPdTSpxsrpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcs +a0vvaGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciATwoCqISxx +OQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99nBjx8Oto0QuFmtEYE3saW +mA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5Wt6NlUe07qxS/TFED6F+KBZvuim6c779o ++sjaC+NCydAXFJy3SuCvkychVSa1ZC+N8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TC +rvJcwhbtkj6EPnNgiLx29CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX +5OfNeOI5wSsSnqaeG8XmDtkx2Q== +-----END CERTIFICATE----- + +Swisscom Root EV CA 2 +===================== +-----BEGIN CERTIFICATE----- +MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAwZzELMAkGA1UE +BhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdpdGFsIENlcnRpZmljYXRlIFNl +cnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcN +MzEwNjI1MDg0NTA4WjBnMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT +HERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYg +Q0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7BxUglgRCgz +o3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD1ycfMQ4jFrclyxy0uYAy +Xhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPHoCE2G3pXKSinLr9xJZDzRINpUKTk4Rti +GZQJo/PDvO/0vezbE53PnUgJUmfANykRHvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8Li +qG12W0OfvrSdsyaGOx9/5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaH +Za0zKcQvidm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHLOdAG +alNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaCNYGu+HuB5ur+rPQa +m3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f46Fq9mDU5zXNysRojddxyNMkM3Ox +bPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCBUWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDi +xzgHcgplwLa7JSnaFp6LNYth7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED +MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWBbj2ITY1x0kbB +bkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6xXCX5145v9Ydkn+0UjrgEjihL +j6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98TPLr+flaYC/NUn81ETm484T4VvwYmneTwkLbU +wp4wLh/vx3rEUMfqe9pQy3omywC0Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7 +XwgiG/W9mR4U9s70WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH +59yLGn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm7JFe3VE/ +23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4Snr8PyQUQ3nqjsTzyP6Wq +J3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VNvBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyA +HmBR3NdUIR7KYndP+tiPsys6DXhyyWhBWkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/gi +uMod89a2GQ+fYWVq6nTIfI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuW +l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc= +-----END CERTIFICATE----- + +CA Disig Root R1 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy +3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8 +u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2 +m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk +CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa +YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6 +vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL +LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX +ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is +XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ +04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR +xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B +LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM +CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb +VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85 +YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS +ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix +lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N +UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ +a7+h89n07eLw4+1knj0vllJPgFOL +-----END CERTIFICATE----- + +CA Disig Root R2 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC +w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia +xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 +A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S +GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV +g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa +5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE +koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A +Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i +Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u +Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV +sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je +dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 +1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx +mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 +utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 +sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg +UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV +7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +ACCVRAIZ1 +========= +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB +SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 +MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH +UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM +jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 +RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD +aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ +0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG +WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 +8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR +5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J +9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK +Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw +Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu +Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM +Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA +QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh +AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA +YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj +AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA +IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk +aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 +dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 +MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI +hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E +R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN +YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 +nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ +TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 +sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg +Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd +3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p +EfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +TWCA Global Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT +CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD +QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK +EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C +nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV +r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR +Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV +tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W +KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 +sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p +yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn +kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI +zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g +cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M +8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg +/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg +lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP +A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m +i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 +EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 +zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= +-----END CERTIFICATE----- + +TeliaSonera Root CA v1 +====================== +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE +CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 +MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW +VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ +6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA +3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k +B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn +Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH +oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 +F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ +oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 +gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc +TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB +AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW +DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm +zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW +pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV +G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc +c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT +JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 +qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 +Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems +WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +E-Tugra Certification Authority +=============================== +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w +DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls +ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw +NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx +QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl +cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD +DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd +hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K +CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g +ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ +BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 +E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz +rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq +jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 +dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB +/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG +MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK +kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO +XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 +VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo +a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc +dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV +KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT +Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 +8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G +C7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 2 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx +MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ +SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F +vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 +2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV +WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy +YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 +r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf +vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR +3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== +-----END CERTIFICATE----- + +Atos TrustedRoot 2011 +===================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU +cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 +MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG +A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV +hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr +54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ +DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 +HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR +z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R +l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ +bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h +k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh +TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 +61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G +3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +QuoVadis Root CA 1 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE +PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm +PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 +Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN +ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l +g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV +7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX +9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f +iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg +t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI +hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 +GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct +Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP ++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh +3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa +wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 +O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 +FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV +hMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +QuoVadis Root CA 2 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh +ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY +NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t +oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o +MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l +V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo +L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ +sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD +6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh +lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI +hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K +pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 +x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz +dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X +U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw +mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD +zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN +JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr +O3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +QuoVadis Root CA 3 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 +IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL +Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe +6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 +I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U +VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 +5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi +Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM +dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt +rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI +hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS +t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ +TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du +DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib +Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD +hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX +0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW +dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 +PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +DigiCert Assured ID Root G2 +=========================== +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw +MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH +35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq +bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw +VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP +YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn +lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO +w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv +0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz +d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW +hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M +jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +DigiCert Assured ID Root G3 +=========================== +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD +VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb +RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs +KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF +UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy +YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy +1vUhZscv6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +DigiCert Global Root G2 +======================= +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx +MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ +kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO +3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV +BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM +UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB +o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu +5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr +F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U +WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH +QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ +iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +DigiCert Global Root G3 +======================= +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD +VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw +MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k +aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C +AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O +YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp +Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y +3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 +VOKa5Vt8sycX +-----END CERTIFICATE----- + +DigiCert Trusted Root G4 +======================== +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw +HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp +pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o +k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa +vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY +QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 +MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm +mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 +f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH +dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 +oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY +ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr +yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy +7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah +ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN +5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb +/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa +5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK +G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP +82Z+ +-----END CERTIFICATE----- + +WoSign +====== +-----BEGIN CERTIFICATE----- +MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG +EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNVBAMTIUNlcnRpZmljYXRpb24g +QXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJ +BgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA +vcqNrLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1UfcIiePyO +CbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcSccf+Hb0v1naMQFXQoOXXDX +2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2ZjC1vt7tj/id07sBMOby8w7gLJKA84X5 +KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4Mx1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR ++ScPewavVIMYe+HdVHpRaG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ez +EC8wQjchzDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDaruHqk +lWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221KmYo0SLwX3OSACCK2 +8jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvASh0JWzko/amrzgD5LkhLJuYwTKVY +yrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWvHYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0C +AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R +8bNLtwYgFP6HEtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1 +LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq +T2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2eJXLOC62qx1ViC777Y7NhRCOj +y+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VNg64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC +2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes +5cVAWubXbHssw1abR80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/ +EaEQPkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGcexGATVdVh +mVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+J7x6v+Db9NpSvd4MVHAx +kUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMlOtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGi +kpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWTee5Ehr7XHuQe+w== +-----END CERTIFICATE----- + +WoSign China +============ +-----BEGIN CERTIFICATE----- +MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQG +EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMMEkNBIOayg+mAmuagueiv +geS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYD +VQQKExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k +8H/rD195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld19AXbbQs5 +uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExfv5RxadmWPgxDT74wwJ85 +dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5 +Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+LNVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFy +b7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc +76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m ++Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0GAbQOXDBGVWCvOGU6 +yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaKJ/kR8slC/k7e3x9cxKSGhxYzoacX +GKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUA +A4ICAQBqinA4WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6 +yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj/feTZU7n85iY +r83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6jBAyvd0zaziGfjk9DgNyp115 +j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0A +kLppRQjbbpCBhqcqBT/mhDn4t/lXX0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97 +qA4bLJyuQHCH2u2nFoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Y +jj4Du9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10lO1Hm13ZB +ONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv +T8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO +kI26oQ== +-----END CERTIFICATE----- + +COMODO RSA Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn +dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ +FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ +5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG +x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX +2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL +OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 +sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C +GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 +WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt +rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ +nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg +tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW +sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp +pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA +zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq +ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 +7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I +LaZRfyHBNVOFBkpdn627G190 +-----END CERTIFICATE----- + +USERTrust RSA Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK +ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK +ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz +0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j +Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn +RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O ++T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq +/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE +Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM +lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 +yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ +eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW +FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ +7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ +Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM +8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi +FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi +yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c +J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw +sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx +Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +USERTrust ECC Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 +0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez +nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV +HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB +HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu +9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R4 +=========================== +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl +OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P +AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV +MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF +JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R5 +=========================== +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 +SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS +h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx +uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 +yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +COMODO High-Assurance Secure Server CA +====================================== +-----BEGIN CERTIFICATE----- +MIIE/DCCA+SgAwIBAgIQFpDDKbZ4BgdRHwWwNEhGyzANBgkqhkiG9w0BAQUFADBv +MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk +ZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBF +eHRlcm5hbCBDQSBSb290MB4XDTEwMDQxNjAwMDAwMFoXDTIwMDUzMDEwNDgzOFow +gYkxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO +BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMS8wLQYD +VQQDEyZDT01PRE8gSGlnaC1Bc3N1cmFuY2UgU2VjdXJlIFNlcnZlciBDQTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOeH2sB35Ls6+mokyIBBrNIWExU9 ++vf4KnbcqC05CM5ISr4PffDeurtH1b0t1xurDyCBIwhyscARlQ3m6qmH/8duHk9m +MrpTvAWqHCwM7003R2sQDNvFoJh+WNs31q7pBr3XqGXzN7nHbc53xybg13QfppgW +uwxryL530O9YpymgubhpBTbLstpYowt1rT2LIoIgPnCGmRy5T893pAcaI2PROFaE +7L+PxU70GJabGuiT7I2vFZwk8Fo76A+5qFoB07IcYMmcUgTdkqf+DKziRY0DYbx5 +4Hcuh0E8WF/L9cV38ljITSjQmvrzcwkkaHS8IEzYLLCq6NlObfKMJNOTXZECAwEA +AaOCAXcwggFzMB8GA1UdIwQYMBaAFK29mHo0tCb3+sQmVO8DveAky1QaMB0GA1Ud +DgQWBBQ/1bXQ1kR5UEoXo5uMSty4sCJkazAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0T +AQH/BAgwBgEB/wIBADARBgNVHSAECjAIMAYGBFUdIAAwRAYDVR0fBD0wOzA5oDeg +NYYzaHR0cDovL2NybC51c2VydHJ1c3QuY29tL0FkZFRydXN0RXh0ZXJuYWxDQVJv +b3QuY3JsMIGzBggrBgEFBQcBAQSBpjCBozA/BggrBgEFBQcwAoYzaHR0cDovL2Ny +dC51c2VydHJ1c3QuY29tL0FkZFRydXN0RXh0ZXJuYWxDQVJvb3QucDdjMDkGCCsG +AQUFBzAChi1odHRwOi8vY3J0LnVzZXJ0cnVzdC5jb20vQWRkVHJ1c3RVVE5TR0ND +QS5jcnQwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJ +KoZIhvcNAQEFBQADggEBABOFH1KAGMlT9/4uGq/M2Qs8wtOFgRDwKI25QH4sno/W +NoYKTBQt1pdDkkEZN0uWnuupMHkSlbMCNlftK7kdmBqjGAo/mzmLzaFJKUwv+dCV +jMhNlbqoQ88zqiUqWg6qJ8lOa7Hmcx+zdATD80ziqOtnt124CAUaVppUKYX1KU6A +O5XQe1OWEVbBAtPqsn/Kj5xwShSNWrkWYHXWzSceFs1bM455QM8oSOfccRZOdJF1 +uSqM8XCsJt0EuUDChd4ck0DQzG7Dm6rvYGXfYCLwWqV6oi/kcHPuPNQmK2gHwSB6 +6JhaPnufAotiwIWBgGA1fqUdDNKc32JFDdv8N/v1JSI= +-----END CERTIFICATE----- diff --git a/panda/src/express/ca_bundle_data_src.c b/panda/src/express/ca_bundle_data_src.c index bec7ee7745..5ee6939d35 100644 --- a/panda/src/express/ca_bundle_data_src.c +++ b/panda/src/express/ca_bundle_data_src.c @@ -11,925 +11,248 @@ * in DER form, for compiling into OpenSSLWrapper. */ -#include - static const unsigned char ca_bundle_data[] = { - 0x30, 0x82, 0x02, 0x5a, 0x30, 0x82, 0x01, 0xc3, 0x02, 0x02, 0x01, - 0xa5, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x04, 0x05, 0x00, 0x30, 0x75, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x18, - 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0f, 0x47, 0x54, - 0x45, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, - 0x13, 0x1e, 0x47, 0x54, 0x45, 0x20, 0x43, 0x79, 0x62, 0x65, 0x72, - 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x53, 0x6f, 0x6c, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, - 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1a, 0x47, - 0x54, 0x45, 0x20, 0x43, 0x79, 0x62, 0x65, 0x72, 0x54, 0x72, 0x75, - 0x73, 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, - 0x6f, 0x6f, 0x74, 0x30, 0x1e, 0x17, 0x0d, 0x39, 0x38, 0x30, 0x38, - 0x31, 0x33, 0x30, 0x30, 0x32, 0x39, 0x30, 0x30, 0x5a, 0x17, 0x0d, - 0x31, 0x38, 0x30, 0x38, 0x31, 0x33, 0x32, 0x33, 0x35, 0x39, 0x30, - 0x30, 0x5a, 0x30, 0x75, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x18, 0x30, 0x16, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0f, 0x47, 0x54, 0x45, 0x20, 0x43, - 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, - 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1e, 0x47, - 0x54, 0x45, 0x20, 0x43, 0x79, 0x62, 0x65, 0x72, 0x54, 0x72, 0x75, - 0x73, 0x74, 0x20, 0x53, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x23, 0x30, 0x21, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1a, 0x47, 0x54, 0x45, 0x20, - 0x43, 0x79, 0x62, 0x65, 0x72, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, - 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, - 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, - 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0x95, 0x0f, 0xa0, 0xb6, - 0xf0, 0x50, 0x9c, 0xe8, 0x7a, 0xc7, 0x88, 0xcd, 0xdd, 0x17, 0x0e, - 0x2e, 0xb0, 0x94, 0xd0, 0x1b, 0x3d, 0x0e, 0xf6, 0x94, 0xc0, 0x8a, - 0x94, 0xc7, 0x06, 0xc8, 0x90, 0x97, 0xc8, 0xb8, 0x64, 0x1a, 0x7a, - 0x7e, 0x6c, 0x3c, 0x53, 0xe1, 0x37, 0x28, 0x73, 0x60, 0x7f, 0xb2, - 0x97, 0x53, 0x07, 0x9f, 0x53, 0xf9, 0x6d, 0x58, 0x94, 0xd2, 0xaf, - 0x8d, 0x6d, 0x88, 0x67, 0x80, 0xe6, 0xed, 0xb2, 0x95, 0xcf, 0x72, - 0x31, 0xca, 0xa5, 0x1c, 0x72, 0xba, 0x5c, 0x02, 0xe7, 0x64, 0x42, - 0xe7, 0xf9, 0xa9, 0x2c, 0xd6, 0x3a, 0x0d, 0xac, 0x8d, 0x42, 0xaa, - 0x24, 0x01, 0x39, 0xe6, 0x9c, 0x3f, 0x01, 0x85, 0x57, 0x0d, 0x58, - 0x87, 0x45, 0xf8, 0xd3, 0x85, 0xaa, 0x93, 0x69, 0x26, 0x85, 0x70, - 0x48, 0x80, 0x3f, 0x12, 0x15, 0xc7, 0x79, 0xb4, 0x1f, 0x05, 0x2f, - 0x3b, 0x62, 0x99, 0x02, 0x03, 0x01, 0x00, 0x01, 0x30, 0x0d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x04, 0x05, - 0x00, 0x03, 0x81, 0x81, 0x00, 0x6d, 0xeb, 0x1b, 0x09, 0xe9, 0x5e, - 0xd9, 0x51, 0xdb, 0x67, 0x22, 0x61, 0xa4, 0x2a, 0x3c, 0x48, 0x77, - 0xe3, 0xa0, 0x7c, 0xa6, 0xde, 0x73, 0xa2, 0x14, 0x03, 0x85, 0x3d, - 0xfb, 0xab, 0x0e, 0x30, 0xc5, 0x83, 0x16, 0x33, 0x81, 0x13, 0x08, - 0x9e, 0x7b, 0x34, 0x4e, 0xdf, 0x40, 0xc8, 0x74, 0xd7, 0xb9, 0x7d, - 0xdc, 0xf4, 0x76, 0x55, 0x7d, 0x9b, 0x63, 0x54, 0x18, 0xe9, 0xf0, - 0xea, 0xf3, 0x5c, 0xb1, 0xd9, 0x8b, 0x42, 0x1e, 0xb9, 0xc0, 0x95, - 0x4e, 0xba, 0xfa, 0xd5, 0xe2, 0x7c, 0xf5, 0x68, 0x61, 0xbf, 0x8e, - 0xec, 0x05, 0x97, 0x5f, 0x5b, 0xb0, 0xd7, 0xa3, 0x85, 0x34, 0xc4, - 0x24, 0xa7, 0x0d, 0x0f, 0x95, 0x93, 0xef, 0xcb, 0x94, 0xd8, 0x9e, - 0x1f, 0x9d, 0x5c, 0x85, 0x6d, 0xc7, 0xaa, 0xae, 0x4f, 0x1f, 0x22, - 0xb5, 0xcd, 0x95, 0xad, 0xba, 0xa7, 0xcc, 0xf9, 0xab, 0x0b, 0x7a, - 0x7f, 0x30, 0x82, 0x03, 0x13, 0x30, 0x82, 0x02, 0x7c, 0xa0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x04, 0x05, 0x00, 0x30, - 0x81, 0xc4, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x5a, 0x41, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, - 0x04, 0x08, 0x13, 0x0c, 0x57, 0x65, 0x73, 0x74, 0x65, 0x72, 0x6e, - 0x20, 0x43, 0x61, 0x70, 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, - 0x55, 0x04, 0x07, 0x13, 0x09, 0x43, 0x61, 0x70, 0x65, 0x20, 0x54, - 0x6f, 0x77, 0x6e, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x14, 0x54, 0x68, 0x61, 0x77, 0x74, 0x65, 0x20, 0x43, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x63, - 0x63, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, - 0x1f, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x20, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x31, - 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x54, - 0x68, 0x61, 0x77, 0x74, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x20, 0x43, 0x41, 0x31, 0x26, 0x30, 0x24, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x17, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2d, 0x63, 0x65, 0x72, 0x74, 0x73, - 0x40, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x30, 0x1e, 0x17, 0x0d, 0x39, 0x36, 0x30, 0x38, 0x30, 0x31, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x30, 0x31, - 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, - 0x81, 0xc4, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x5a, 0x41, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, - 0x04, 0x08, 0x13, 0x0c, 0x57, 0x65, 0x73, 0x74, 0x65, 0x72, 0x6e, - 0x20, 0x43, 0x61, 0x70, 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, - 0x55, 0x04, 0x07, 0x13, 0x09, 0x43, 0x61, 0x70, 0x65, 0x20, 0x54, - 0x6f, 0x77, 0x6e, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x14, 0x54, 0x68, 0x61, 0x77, 0x74, 0x65, 0x20, 0x43, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x63, - 0x63, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, - 0x1f, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x20, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x31, - 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x54, - 0x68, 0x61, 0x77, 0x74, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x20, 0x43, 0x41, 0x31, 0x26, 0x30, 0x24, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x17, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2d, 0x63, 0x65, 0x72, 0x74, 0x73, - 0x40, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, - 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xd3, 0xa4, 0x50, 0x6e, - 0xc8, 0xff, 0x56, 0x6b, 0xe6, 0xcf, 0x5d, 0xb6, 0xea, 0x0c, 0x68, - 0x75, 0x47, 0xa2, 0xaa, 0xc2, 0xda, 0x84, 0x25, 0xfc, 0xa8, 0xf4, - 0x47, 0x51, 0xda, 0x85, 0xb5, 0x20, 0x74, 0x94, 0x86, 0x1e, 0x0f, - 0x75, 0xc9, 0xe9, 0x08, 0x61, 0xf5, 0x06, 0x6d, 0x30, 0x6e, 0x15, - 0x19, 0x02, 0xe9, 0x52, 0xc0, 0x62, 0xdb, 0x4d, 0x99, 0x9e, 0xe2, - 0x6a, 0x0c, 0x44, 0x38, 0xcd, 0xfe, 0xbe, 0xe3, 0x64, 0x09, 0x70, - 0xc5, 0xfe, 0xb1, 0x6b, 0x29, 0xb6, 0x2f, 0x49, 0xc8, 0x3b, 0xd4, - 0x27, 0x04, 0x25, 0x10, 0x97, 0x2f, 0xe7, 0x90, 0x6d, 0xc0, 0x28, - 0x42, 0x99, 0xd7, 0x4c, 0x43, 0xde, 0xc3, 0xf5, 0x21, 0x6d, 0x54, - 0x9f, 0x5d, 0xc3, 0x58, 0xe1, 0xc0, 0xe4, 0xd9, 0x5b, 0xb0, 0xb8, - 0xdc, 0xb4, 0x7b, 0xdf, 0x36, 0x3a, 0xc2, 0xb5, 0x66, 0x22, 0x12, - 0xd6, 0x87, 0x0d, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x13, 0x30, - 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, - 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x04, 0x05, 0x00, - 0x03, 0x81, 0x81, 0x00, 0x07, 0xfa, 0x4c, 0x69, 0x5c, 0xfb, 0x95, - 0xcc, 0x46, 0xee, 0x85, 0x83, 0x4d, 0x21, 0x30, 0x8e, 0xca, 0xd9, - 0xa8, 0x6f, 0x49, 0x1a, 0xe6, 0xda, 0x51, 0xe3, 0x60, 0x70, 0x6c, - 0x84, 0x61, 0x11, 0xa1, 0x1a, 0xc8, 0x48, 0x3e, 0x59, 0x43, 0x7d, - 0x4f, 0x95, 0x3d, 0xa1, 0x8b, 0xb7, 0x0b, 0x62, 0x98, 0x7a, 0x75, - 0x8a, 0xdd, 0x88, 0x4e, 0x4e, 0x9e, 0x40, 0xdb, 0xa8, 0xcc, 0x32, - 0x74, 0xb9, 0x6f, 0x0d, 0xc6, 0xe3, 0xb3, 0x44, 0x0b, 0xd9, 0x8a, - 0x6f, 0x9a, 0x29, 0x9b, 0x99, 0x18, 0x28, 0x3b, 0xd1, 0xe3, 0x40, - 0x28, 0x9a, 0x5a, 0x3c, 0xd5, 0xb5, 0xe7, 0x20, 0x1b, 0x8b, 0xca, - 0xa4, 0xab, 0x8d, 0xe9, 0x51, 0xd9, 0xe2, 0x4c, 0x2c, 0x59, 0xa9, - 0xda, 0xb9, 0xb2, 0x75, 0x1b, 0xf6, 0x42, 0xf2, 0xef, 0xc7, 0xf2, - 0x18, 0xf9, 0x89, 0xbc, 0xa3, 0xff, 0x8a, 0x23, 0x2e, 0x70, 0x47, - 0x30, 0x82, 0x03, 0x27, 0x30, 0x82, 0x02, 0x90, 0xa0, 0x03, 0x02, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x04, 0x05, 0x00, 0x30, 0x81, - 0xce, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, - 0x02, 0x5a, 0x41, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, - 0x08, 0x13, 0x0c, 0x57, 0x65, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, - 0x43, 0x61, 0x70, 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, - 0x04, 0x07, 0x13, 0x09, 0x43, 0x61, 0x70, 0x65, 0x20, 0x54, 0x6f, - 0x77, 0x6e, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x13, 0x14, 0x54, 0x68, 0x61, 0x77, 0x74, 0x65, 0x20, 0x43, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x63, - 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1f, - 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x20, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x31, 0x21, - 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x54, 0x68, - 0x61, 0x77, 0x74, 0x65, 0x20, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x75, - 0x6d, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x43, 0x41, - 0x31, 0x28, 0x30, 0x26, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x09, 0x01, 0x16, 0x19, 0x70, 0x72, 0x65, 0x6d, 0x69, - 0x75, 0x6d, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x40, 0x74, - 0x68, 0x61, 0x77, 0x74, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x1e, - 0x17, 0x0d, 0x39, 0x36, 0x30, 0x38, 0x30, 0x31, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x30, 0x31, 0x32, 0x33, - 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0xce, - 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x5a, 0x41, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x08, - 0x13, 0x0c, 0x57, 0x65, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x43, - 0x61, 0x70, 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, - 0x07, 0x13, 0x09, 0x43, 0x61, 0x70, 0x65, 0x20, 0x54, 0x6f, 0x77, - 0x6e, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, - 0x14, 0x54, 0x68, 0x61, 0x77, 0x74, 0x65, 0x20, 0x43, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x63, 0x31, - 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1f, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, - 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x31, 0x21, 0x30, - 0x1f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x54, 0x68, 0x61, - 0x77, 0x74, 0x65, 0x20, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x75, 0x6d, - 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x43, 0x41, 0x31, - 0x28, 0x30, 0x26, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x09, 0x01, 0x16, 0x19, 0x70, 0x72, 0x65, 0x6d, 0x69, 0x75, - 0x6d, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x40, 0x74, 0x68, - 0x61, 0x77, 0x74, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x81, 0x9f, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, - 0x02, 0x81, 0x81, 0x00, 0xd2, 0x36, 0x36, 0x6a, 0x8b, 0xd7, 0xc2, - 0x5b, 0x9e, 0xda, 0x81, 0x41, 0x62, 0x8f, 0x38, 0xee, 0x49, 0x04, - 0x55, 0xd6, 0xd0, 0xef, 0x1c, 0x1b, 0x95, 0x16, 0x47, 0xef, 0x18, - 0x48, 0x35, 0x3a, 0x52, 0xf4, 0x2b, 0x6a, 0x06, 0x8f, 0x3b, 0x2f, - 0xea, 0x56, 0xe3, 0xaf, 0x86, 0x8d, 0x9e, 0x17, 0xf7, 0x9e, 0xb4, - 0x65, 0x75, 0x02, 0x4d, 0xef, 0xcb, 0x09, 0xa2, 0x21, 0x51, 0xd8, - 0x9b, 0xd0, 0x67, 0xd0, 0xba, 0x0d, 0x92, 0x06, 0x14, 0x73, 0xd4, - 0x93, 0xcb, 0x97, 0x2a, 0x00, 0x9c, 0x5c, 0x4e, 0x0c, 0xbc, 0xfa, - 0x15, 0x52, 0xfc, 0xf2, 0x44, 0x6e, 0xda, 0x11, 0x4a, 0x6e, 0x08, - 0x9f, 0x2f, 0x2d, 0xe3, 0xf9, 0xaa, 0x3a, 0x86, 0x73, 0xb6, 0x46, - 0x53, 0x58, 0xc8, 0x89, 0x05, 0xbd, 0x83, 0x11, 0xb8, 0x73, 0x3f, - 0xaa, 0x07, 0x8d, 0xf4, 0x42, 0x4d, 0xe7, 0x40, 0x9d, 0x1c, 0x37, - 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x13, 0x30, 0x11, 0x30, 0x0f, - 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, - 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x04, 0x05, 0x00, 0x03, 0x81, 0x81, - 0x00, 0x26, 0x48, 0x2c, 0x16, 0xc2, 0x58, 0xfa, 0xe8, 0x16, 0x74, - 0x0c, 0xaa, 0xaa, 0x5f, 0x54, 0x3f, 0xf2, 0xd7, 0xc9, 0x78, 0x60, - 0x5e, 0x5e, 0x6e, 0x37, 0x63, 0x22, 0x77, 0x36, 0x7e, 0xb2, 0x17, - 0xc4, 0x34, 0xb9, 0xf5, 0x08, 0x85, 0xfc, 0xc9, 0x01, 0x38, 0xff, - 0x4d, 0xbe, 0xf2, 0x16, 0x42, 0x43, 0xe7, 0xbb, 0x5a, 0x46, 0xfb, - 0xc1, 0xc6, 0x11, 0x1f, 0xf1, 0x4a, 0xb0, 0x28, 0x46, 0xc9, 0xc3, - 0xc4, 0x42, 0x7d, 0xbc, 0xfa, 0xab, 0x59, 0x6e, 0xd5, 0xb7, 0x51, - 0x88, 0x11, 0xe3, 0xa4, 0x85, 0x19, 0x6b, 0x82, 0x4c, 0xa4, 0x0c, - 0x12, 0xad, 0xe9, 0xa4, 0xae, 0x3f, 0xf1, 0xc3, 0x49, 0x65, 0x9a, - 0x8c, 0xc5, 0xc8, 0x3e, 0x25, 0xb7, 0x94, 0x99, 0xbb, 0x92, 0x32, - 0x71, 0x07, 0xf0, 0x86, 0x5e, 0xed, 0x50, 0x27, 0xa6, 0x0d, 0xa6, - 0x23, 0xf9, 0xbb, 0xcb, 0xa6, 0x07, 0x14, 0x42, 0x30, 0x82, 0x03, - 0x20, 0x30, 0x82, 0x02, 0x89, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, - 0x04, 0x35, 0xde, 0xf4, 0xcf, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x4e, - 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x13, 0x07, 0x45, 0x71, 0x75, 0x69, 0x66, 0x61, 0x78, 0x31, 0x2d, - 0x30, 0x2b, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x24, 0x45, 0x71, - 0x75, 0x69, 0x66, 0x61, 0x78, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, - 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x39, 0x38, 0x30, 0x38, 0x32, 0x32, - 0x31, 0x36, 0x34, 0x31, 0x35, 0x31, 0x5a, 0x17, 0x0d, 0x31, 0x38, - 0x30, 0x38, 0x32, 0x32, 0x31, 0x36, 0x34, 0x31, 0x35, 0x31, 0x5a, - 0x30, 0x4e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x13, 0x07, 0x45, 0x71, 0x75, 0x69, 0x66, 0x61, 0x78, - 0x31, 0x2d, 0x30, 0x2b, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x24, - 0x45, 0x71, 0x75, 0x69, 0x66, 0x61, 0x78, 0x20, 0x53, 0x65, 0x63, - 0x75, 0x72, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x74, 0x79, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, - 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xc1, - 0x5d, 0xb1, 0x58, 0x67, 0x08, 0x62, 0xee, 0xa0, 0x9a, 0x2d, 0x1f, - 0x08, 0x6d, 0x91, 0x14, 0x68, 0x98, 0x0a, 0x1e, 0xfe, 0xda, 0x04, - 0x6f, 0x13, 0x84, 0x62, 0x21, 0xc3, 0xd1, 0x7c, 0xce, 0x9f, 0x05, - 0xe0, 0xb8, 0x01, 0xf0, 0x4e, 0x34, 0xec, 0xe2, 0x8a, 0x95, 0x04, - 0x64, 0xac, 0xf1, 0x6b, 0x53, 0x5f, 0x05, 0xb3, 0xcb, 0x67, 0x80, - 0xbf, 0x42, 0x02, 0x8e, 0xfe, 0xdd, 0x01, 0x09, 0xec, 0xe1, 0x00, - 0x14, 0x4f, 0xfc, 0xfb, 0xf0, 0x0c, 0xdd, 0x43, 0xba, 0x5b, 0x2b, - 0xe1, 0x1f, 0x80, 0x70, 0x99, 0x15, 0x57, 0x93, 0x16, 0xf1, 0x0f, - 0x97, 0x6a, 0xb7, 0xc2, 0x68, 0x23, 0x1c, 0xcc, 0x4d, 0x59, 0x30, - 0xac, 0x51, 0x1e, 0x3b, 0xaf, 0x2b, 0xd6, 0xee, 0x63, 0x45, 0x7b, - 0xc5, 0xd9, 0x5f, 0x50, 0xd2, 0xe3, 0x50, 0x0f, 0x3a, 0x88, 0xe7, - 0xbf, 0x14, 0xfd, 0xe0, 0xc7, 0xb9, 0x02, 0x03, 0x01, 0x00, 0x01, - 0xa3, 0x82, 0x01, 0x09, 0x30, 0x82, 0x01, 0x05, 0x30, 0x70, 0x06, - 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x69, 0x30, 0x67, 0x30, 0x65, 0xa0, - 0x63, 0xa0, 0x61, 0xa4, 0x5f, 0x30, 0x5d, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, - 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x07, 0x45, 0x71, - 0x75, 0x69, 0x66, 0x61, 0x78, 0x31, 0x2d, 0x30, 0x2b, 0x06, 0x03, - 0x55, 0x04, 0x0b, 0x13, 0x24, 0x45, 0x71, 0x75, 0x69, 0x66, 0x61, - 0x78, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x0d, 0x30, - 0x0b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x04, 0x43, 0x52, 0x4c, - 0x31, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x1d, 0x10, 0x04, 0x13, 0x30, - 0x11, 0x81, 0x0f, 0x32, 0x30, 0x31, 0x38, 0x30, 0x38, 0x32, 0x32, - 0x31, 0x36, 0x34, 0x31, 0x35, 0x31, 0x5a, 0x30, 0x0b, 0x06, 0x03, - 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1f, - 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, - 0x48, 0xe6, 0x68, 0xf9, 0x2b, 0xd2, 0xb2, 0x95, 0xd7, 0x47, 0xd8, - 0x23, 0x20, 0x10, 0x4f, 0x33, 0x98, 0x90, 0x9f, 0xd4, 0x30, 0x1d, - 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x48, 0xe6, - 0x68, 0xf9, 0x2b, 0xd2, 0xb2, 0x95, 0xd7, 0x47, 0xd8, 0x23, 0x20, - 0x10, 0x4f, 0x33, 0x98, 0x90, 0x9f, 0xd4, 0x30, 0x0c, 0x06, 0x03, - 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, - 0x1a, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf6, 0x7d, 0x07, 0x41, - 0x00, 0x04, 0x0d, 0x30, 0x0b, 0x1b, 0x05, 0x56, 0x33, 0x2e, 0x30, - 0x63, 0x03, 0x02, 0x06, 0xc0, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x81, - 0x81, 0x00, 0x58, 0xce, 0x29, 0xea, 0xfc, 0xf7, 0xde, 0xb5, 0xce, - 0x02, 0xb9, 0x17, 0xb5, 0x85, 0xd1, 0xb9, 0xe3, 0xe0, 0x95, 0xcc, - 0x25, 0x31, 0x0d, 0x00, 0xa6, 0x92, 0x6e, 0x7f, 0xb6, 0x92, 0x63, - 0x9e, 0x50, 0x95, 0xd1, 0x9a, 0x6f, 0xe4, 0x11, 0xde, 0x63, 0x85, - 0x6e, 0x98, 0xee, 0xa8, 0xff, 0x5a, 0xc8, 0xd3, 0x55, 0xb2, 0x66, - 0x71, 0x57, 0xde, 0xc0, 0x21, 0xeb, 0x3d, 0x2a, 0xa7, 0x23, 0x49, - 0x01, 0x04, 0x86, 0x42, 0x7b, 0xfc, 0xee, 0x7f, 0xa2, 0x16, 0x52, - 0xb5, 0x67, 0x67, 0xd3, 0x40, 0xdb, 0x3b, 0x26, 0x58, 0xb2, 0x28, - 0x77, 0x3d, 0xae, 0x14, 0x77, 0x61, 0xd6, 0xfa, 0x2a, 0x66, 0x27, - 0xa0, 0x0d, 0xfa, 0xa7, 0x73, 0x5c, 0xea, 0x70, 0xf1, 0x94, 0x21, - 0x65, 0x44, 0x5f, 0xfa, 0xfc, 0xef, 0x29, 0x68, 0xa9, 0xa2, 0x87, - 0x79, 0xef, 0x79, 0xef, 0x4f, 0xac, 0x07, 0x77, 0x38, 0x30, 0x82, - 0x03, 0x29, 0x30, 0x82, 0x02, 0x92, 0xa0, 0x03, 0x02, 0x01, 0x02, - 0x02, 0x04, 0x36, 0x70, 0x15, 0x96, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, - 0x46, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, - 0x02, 0x55, 0x53, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, - 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x54, - 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f, 0x2e, 0x31, 0x11, 0x30, - 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x08, 0x44, 0x53, 0x54, - 0x43, 0x41, 0x20, 0x45, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x39, 0x38, - 0x31, 0x32, 0x31, 0x30, 0x31, 0x38, 0x31, 0x30, 0x32, 0x33, 0x5a, - 0x17, 0x0d, 0x31, 0x38, 0x31, 0x32, 0x31, 0x30, 0x31, 0x38, 0x34, - 0x30, 0x32, 0x33, 0x5a, 0x30, 0x46, 0x31, 0x0b, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x24, 0x30, - 0x22, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1b, 0x44, 0x69, 0x67, - 0x69, 0x74, 0x61, 0x6c, 0x20, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, - 0x6f, 0x2e, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, - 0x13, 0x08, 0x44, 0x53, 0x54, 0x43, 0x41, 0x20, 0x45, 0x31, 0x30, - 0x81, 0x9d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8b, 0x00, 0x30, - 0x81, 0x87, 0x02, 0x81, 0x81, 0x00, 0xa0, 0x6c, 0x81, 0xa9, 0xcf, - 0x34, 0x1e, 0x24, 0xdd, 0xfe, 0x86, 0x28, 0xcc, 0xde, 0x83, 0x2f, - 0xf9, 0x5e, 0xd4, 0x42, 0xd2, 0xe8, 0x74, 0x60, 0x66, 0x13, 0x98, - 0x06, 0x1c, 0xa9, 0x51, 0x12, 0x69, 0x6f, 0x31, 0x55, 0xb9, 0x49, - 0x72, 0x00, 0x08, 0x7e, 0xd3, 0xa5, 0x62, 0x44, 0x37, 0x24, 0x99, - 0x8f, 0xd9, 0x83, 0x48, 0x8f, 0x99, 0x6d, 0x95, 0x13, 0xbb, 0x43, - 0x3b, 0x2e, 0x49, 0x4e, 0x88, 0x37, 0xc1, 0xbb, 0x58, 0x7f, 0xfe, - 0xe1, 0xbd, 0xf8, 0xbb, 0x61, 0xcd, 0xf3, 0x47, 0xc0, 0x99, 0xa6, - 0xf1, 0xf3, 0x91, 0xe8, 0x78, 0x7c, 0x00, 0xcb, 0x61, 0xc9, 0x44, - 0x27, 0x71, 0x69, 0x55, 0x4a, 0x7e, 0x49, 0x4d, 0xed, 0xa2, 0xa3, - 0xbe, 0x02, 0x4c, 0x00, 0xca, 0x02, 0xa8, 0xee, 0x01, 0x02, 0x31, - 0x64, 0x0f, 0x52, 0x2d, 0x13, 0x74, 0x76, 0x36, 0xb5, 0x7a, 0xb4, - 0x2d, 0x71, 0x02, 0x01, 0x03, 0xa3, 0x82, 0x01, 0x24, 0x30, 0x82, - 0x01, 0x20, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, - 0xf8, 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, 0x00, 0x07, 0x30, - 0x68, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x61, 0x30, 0x5f, 0x30, - 0x5d, 0xa0, 0x5b, 0xa0, 0x59, 0xa4, 0x57, 0x30, 0x55, 0x31, 0x0b, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, - 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1b, - 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x20, 0x43, 0x6f, 0x2e, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, - 0x55, 0x04, 0x0b, 0x13, 0x08, 0x44, 0x53, 0x54, 0x43, 0x41, 0x20, - 0x45, 0x31, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x03, - 0x13, 0x04, 0x43, 0x52, 0x4c, 0x31, 0x30, 0x2b, 0x06, 0x03, 0x55, - 0x1d, 0x10, 0x04, 0x24, 0x30, 0x22, 0x80, 0x0f, 0x31, 0x39, 0x39, - 0x38, 0x31, 0x32, 0x31, 0x30, 0x31, 0x38, 0x31, 0x30, 0x32, 0x33, - 0x5a, 0x81, 0x0f, 0x32, 0x30, 0x31, 0x38, 0x31, 0x32, 0x31, 0x30, - 0x31, 0x38, 0x31, 0x30, 0x32, 0x33, 0x5a, 0x30, 0x0b, 0x06, 0x03, - 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1f, - 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, - 0x6a, 0x79, 0x7e, 0x91, 0x69, 0x46, 0x18, 0x13, 0x0a, 0x02, 0x77, - 0xa5, 0x59, 0x5b, 0x60, 0x98, 0x25, 0x0e, 0xa2, 0xf8, 0x30, 0x1d, - 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x6a, 0x79, - 0x7e, 0x91, 0x69, 0x46, 0x18, 0x13, 0x0a, 0x02, 0x77, 0xa5, 0x59, - 0x5b, 0x60, 0x98, 0x25, 0x0e, 0xa2, 0xf8, 0x30, 0x0c, 0x06, 0x03, - 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, - 0x19, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf6, 0x7d, 0x07, 0x41, - 0x00, 0x04, 0x0c, 0x30, 0x0a, 0x1b, 0x04, 0x56, 0x34, 0x2e, 0x30, - 0x03, 0x02, 0x04, 0x90, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x81, 0x81, - 0x00, 0x22, 0x12, 0xd8, 0x7a, 0x1d, 0xdc, 0x81, 0x06, 0xb6, 0x09, - 0x65, 0xb2, 0x87, 0xc8, 0x1f, 0x5e, 0xb4, 0x2f, 0xe9, 0xc4, 0x1e, - 0xf2, 0x3c, 0xc1, 0xbb, 0x04, 0x90, 0x11, 0x4a, 0x83, 0x4e, 0x7e, - 0x93, 0xb9, 0x4d, 0x42, 0xc7, 0x92, 0x26, 0xa0, 0x5c, 0x34, 0x9a, - 0x38, 0x72, 0xf8, 0xfd, 0x6b, 0x16, 0x3e, 0x20, 0xee, 0x82, 0x8b, - 0x31, 0x2a, 0x93, 0x36, 0x85, 0x23, 0x88, 0x8a, 0x3c, 0x03, 0x68, - 0xd3, 0xc9, 0x09, 0x0f, 0x4d, 0xfc, 0x6c, 0xa4, 0xda, 0x28, 0x72, - 0x93, 0x0e, 0x89, 0x80, 0xb0, 0x7d, 0xfe, 0x80, 0x6f, 0x65, 0x6d, - 0x18, 0x33, 0x97, 0x8b, 0xc2, 0x6b, 0x89, 0xee, 0x60, 0x3d, 0xc8, - 0x9b, 0xef, 0x7f, 0x2b, 0x32, 0x62, 0x73, 0x93, 0xcb, 0x3c, 0xe3, - 0x7b, 0xe2, 0x76, 0x78, 0x45, 0xbc, 0xa1, 0x93, 0x04, 0xbb, 0x86, - 0x9f, 0x3a, 0x5b, 0x43, 0x7a, 0xc3, 0x8a, 0x65, 0x30, 0x82, 0x03, - 0x29, 0x30, 0x82, 0x02, 0x92, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, - 0x04, 0x36, 0x6e, 0xd3, 0xce, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x46, - 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x55, 0x53, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x53, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x54, 0x72, - 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f, 0x2e, 0x31, 0x11, 0x30, 0x0f, - 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x08, 0x44, 0x53, 0x54, 0x43, - 0x41, 0x20, 0x45, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x39, 0x38, 0x31, - 0x32, 0x30, 0x39, 0x31, 0x39, 0x31, 0x37, 0x32, 0x36, 0x5a, 0x17, - 0x0d, 0x31, 0x38, 0x31, 0x32, 0x30, 0x39, 0x31, 0x39, 0x34, 0x37, - 0x32, 0x36, 0x5a, 0x30, 0x46, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, - 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x24, 0x30, 0x22, - 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69, - 0x74, 0x61, 0x6c, 0x20, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f, - 0x2e, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, - 0x08, 0x44, 0x53, 0x54, 0x43, 0x41, 0x20, 0x45, 0x32, 0x30, 0x81, - 0x9d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8b, 0x00, 0x30, 0x81, - 0x87, 0x02, 0x81, 0x81, 0x00, 0xbf, 0x93, 0x8f, 0x17, 0x92, 0xef, - 0x33, 0x13, 0x18, 0xeb, 0x10, 0x7f, 0x4e, 0x16, 0xbf, 0xff, 0x06, - 0x8f, 0x2a, 0x85, 0xbc, 0x5e, 0xf9, 0x24, 0xa6, 0x24, 0x88, 0xb6, - 0x03, 0xb7, 0xc1, 0xc3, 0x5f, 0x03, 0x5b, 0xd1, 0x6f, 0xae, 0x7e, - 0x42, 0xea, 0x66, 0x23, 0xb8, 0x63, 0x83, 0x56, 0xfb, 0x28, 0x2d, - 0xe1, 0x38, 0x8b, 0xb4, 0xee, 0xa8, 0x01, 0xe1, 0xce, 0x1c, 0xb6, - 0x88, 0x2a, 0x22, 0x46, 0x85, 0xfb, 0x9f, 0xa7, 0x70, 0xa9, 0x47, - 0x14, 0x3f, 0xce, 0xde, 0x65, 0xf0, 0xa8, 0x71, 0xf7, 0x4f, 0x26, - 0x6c, 0x8c, 0xbc, 0xc6, 0xb5, 0xef, 0xde, 0x49, 0x27, 0xff, 0x48, - 0x2a, 0x7d, 0xe8, 0x4d, 0x03, 0xcc, 0xc7, 0xb2, 0x52, 0xc6, 0x17, - 0x31, 0x13, 0x3b, 0xb5, 0x4d, 0xdb, 0xc8, 0xc4, 0xf6, 0xc3, 0x0f, - 0x24, 0x2a, 0xda, 0x0c, 0x9d, 0xe7, 0x91, 0x5b, 0x80, 0xcd, 0x94, - 0x9d, 0x02, 0x01, 0x03, 0xa3, 0x82, 0x01, 0x24, 0x30, 0x82, 0x01, - 0x20, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, - 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, 0x00, 0x07, 0x30, 0x68, - 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x61, 0x30, 0x5f, 0x30, 0x5d, - 0xa0, 0x5b, 0xa0, 0x59, 0xa4, 0x57, 0x30, 0x55, 0x31, 0x0b, 0x30, - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, - 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1b, 0x44, - 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x53, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, - 0x20, 0x43, 0x6f, 0x2e, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, - 0x04, 0x0b, 0x13, 0x08, 0x44, 0x53, 0x54, 0x43, 0x41, 0x20, 0x45, - 0x32, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, - 0x04, 0x43, 0x52, 0x4c, 0x31, 0x30, 0x2b, 0x06, 0x03, 0x55, 0x1d, - 0x10, 0x04, 0x24, 0x30, 0x22, 0x80, 0x0f, 0x31, 0x39, 0x39, 0x38, - 0x31, 0x32, 0x30, 0x39, 0x31, 0x39, 0x31, 0x37, 0x32, 0x36, 0x5a, - 0x81, 0x0f, 0x32, 0x30, 0x31, 0x38, 0x31, 0x32, 0x30, 0x39, 0x31, - 0x39, 0x31, 0x37, 0x32, 0x36, 0x5a, 0x30, 0x0b, 0x06, 0x03, 0x55, - 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1f, 0x06, - 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x1e, - 0x82, 0x4d, 0x28, 0x65, 0x80, 0x3c, 0xc9, 0x41, 0x6e, 0xac, 0x35, - 0x2e, 0x5a, 0xcb, 0xde, 0xee, 0xf8, 0x39, 0x5b, 0x30, 0x1d, 0x06, - 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x1e, 0x82, 0x4d, - 0x28, 0x65, 0x80, 0x3c, 0xc9, 0x41, 0x6e, 0xac, 0x35, 0x2e, 0x5a, - 0xcb, 0xde, 0xee, 0xf8, 0x39, 0x5b, 0x30, 0x0c, 0x06, 0x03, 0x55, - 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x19, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf6, 0x7d, 0x07, 0x41, 0x00, - 0x04, 0x0c, 0x30, 0x0a, 0x1b, 0x04, 0x56, 0x34, 0x2e, 0x30, 0x03, - 0x02, 0x04, 0x90, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, - 0x47, 0x8d, 0x83, 0xad, 0x62, 0xf2, 0xdb, 0xb0, 0x9e, 0x45, 0x22, - 0x05, 0xb9, 0xa2, 0xd6, 0x03, 0x0e, 0x38, 0x72, 0xe7, 0x9e, 0xfc, - 0x7b, 0xe6, 0x93, 0xb6, 0x9a, 0xa5, 0xa2, 0x94, 0xc8, 0x34, 0x1d, - 0x91, 0xd1, 0xc5, 0xd7, 0xf4, 0x0a, 0x25, 0x0f, 0x3d, 0x78, 0x81, - 0x9e, 0x0f, 0xb1, 0x67, 0xc4, 0x90, 0x4c, 0x63, 0xdd, 0x5e, 0xa7, - 0xe2, 0xba, 0x9f, 0xf5, 0xf7, 0x4d, 0xa5, 0x31, 0x7b, 0x9c, 0x29, - 0x2d, 0x4c, 0xfe, 0x64, 0x3e, 0xec, 0xb6, 0x53, 0xfe, 0xea, 0x9b, - 0xed, 0x82, 0xdb, 0x74, 0x75, 0x4b, 0x07, 0x79, 0x6e, 0x1e, 0xd8, - 0x19, 0x83, 0x73, 0xde, 0xf5, 0x3e, 0xd0, 0xb5, 0xde, 0xe7, 0x4b, - 0x68, 0x7d, 0x43, 0x2e, 0x2a, 0x20, 0xe1, 0x7e, 0xa0, 0x78, 0x44, - 0x9e, 0x08, 0xf5, 0x98, 0xf9, 0xc7, 0x7f, 0x1b, 0x1b, 0xd6, 0x06, - 0x20, 0x02, 0x58, 0xa1, 0xc3, 0xa2, 0x03, 0x30, 0x82, 0x02, 0x3c, - 0x30, 0x82, 0x01, 0xa5, 0x02, 0x10, 0x70, 0xba, 0xe4, 0x1d, 0x10, - 0xd9, 0x29, 0x34, 0xb6, 0x38, 0xca, 0x7b, 0x03, 0xcc, 0xba, 0xbf, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x02, 0x05, 0x00, 0x30, 0x5f, 0x31, 0x0b, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, - 0x15, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0e, 0x56, 0x65, 0x72, - 0x69, 0x53, 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, - 0x31, 0x37, 0x30, 0x35, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2e, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x30, 0x82, 0x03, 0x20, 0x30, 0x82, 0x02, 0x89, 0xa0, 0x03, 0x02, + 0x01, 0x02, 0x02, 0x04, 0x35, 0xde, 0xf4, 0xcf, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x30, 0x4e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, + 0x55, 0x04, 0x0a, 0x13, 0x07, 0x45, 0x71, 0x75, 0x69, 0x66, 0x61, + 0x78, 0x31, 0x2d, 0x30, 0x2b, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, + 0x24, 0x45, 0x71, 0x75, 0x69, 0x66, 0x61, 0x78, 0x20, 0x53, 0x65, + 0x63, 0x75, 0x72, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x39, 0x38, 0x30, + 0x38, 0x32, 0x32, 0x31, 0x36, 0x34, 0x31, 0x35, 0x31, 0x5a, 0x17, + 0x0d, 0x31, 0x38, 0x30, 0x38, 0x32, 0x32, 0x31, 0x36, 0x34, 0x31, + 0x35, 0x31, 0x5a, 0x30, 0x4e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x07, 0x45, 0x71, 0x75, 0x69, + 0x66, 0x61, 0x78, 0x31, 0x2d, 0x30, 0x2b, 0x06, 0x03, 0x55, 0x04, + 0x0b, 0x13, 0x24, 0x45, 0x71, 0x75, 0x69, 0x66, 0x61, 0x78, 0x20, + 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x81, 0x9f, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, + 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, + 0x81, 0x00, 0xc1, 0x5d, 0xb1, 0x58, 0x67, 0x08, 0x62, 0xee, 0xa0, + 0x9a, 0x2d, 0x1f, 0x08, 0x6d, 0x91, 0x14, 0x68, 0x98, 0x0a, 0x1e, + 0xfe, 0xda, 0x04, 0x6f, 0x13, 0x84, 0x62, 0x21, 0xc3, 0xd1, 0x7c, + 0xce, 0x9f, 0x05, 0xe0, 0xb8, 0x01, 0xf0, 0x4e, 0x34, 0xec, 0xe2, + 0x8a, 0x95, 0x04, 0x64, 0xac, 0xf1, 0x6b, 0x53, 0x5f, 0x05, 0xb3, + 0xcb, 0x67, 0x80, 0xbf, 0x42, 0x02, 0x8e, 0xfe, 0xdd, 0x01, 0x09, + 0xec, 0xe1, 0x00, 0x14, 0x4f, 0xfc, 0xfb, 0xf0, 0x0c, 0xdd, 0x43, + 0xba, 0x5b, 0x2b, 0xe1, 0x1f, 0x80, 0x70, 0x99, 0x15, 0x57, 0x93, + 0x16, 0xf1, 0x0f, 0x97, 0x6a, 0xb7, 0xc2, 0x68, 0x23, 0x1c, 0xcc, + 0x4d, 0x59, 0x30, 0xac, 0x51, 0x1e, 0x3b, 0xaf, 0x2b, 0xd6, 0xee, + 0x63, 0x45, 0x7b, 0xc5, 0xd9, 0x5f, 0x50, 0xd2, 0xe3, 0x50, 0x0f, + 0x3a, 0x88, 0xe7, 0xbf, 0x14, 0xfd, 0xe0, 0xc7, 0xb9, 0x02, 0x03, + 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x09, 0x30, 0x82, 0x01, 0x05, + 0x30, 0x70, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x69, 0x30, 0x67, + 0x30, 0x65, 0xa0, 0x63, 0xa0, 0x61, 0xa4, 0x5f, 0x30, 0x5d, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, + 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x07, 0x45, 0x71, 0x75, 0x69, 0x66, 0x61, 0x78, 0x31, 0x2d, 0x30, + 0x2b, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x24, 0x45, 0x71, 0x75, + 0x69, 0x66, 0x61, 0x78, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x39, 0x36, 0x30, 0x31, 0x32, - 0x39, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, - 0x38, 0x30, 0x38, 0x30, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, - 0x5a, 0x30, 0x5f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, - 0x67, 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x37, 0x30, - 0x35, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2e, 0x43, 0x6c, 0x61, - 0x73, 0x73, 0x20, 0x33, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, - 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, - 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xc9, 0x5c, 0x59, 0x9e, 0xf2, - 0x1b, 0x8a, 0x01, 0x14, 0xb4, 0x10, 0xdf, 0x04, 0x40, 0xdb, 0xe3, - 0x57, 0xaf, 0x6a, 0x45, 0x40, 0x8f, 0x84, 0x0c, 0x0b, 0xd1, 0x33, - 0xd9, 0xd9, 0x11, 0xcf, 0xee, 0x02, 0x58, 0x1f, 0x25, 0xf7, 0x2a, - 0xa8, 0x44, 0x05, 0xaa, 0xec, 0x03, 0x1f, 0x78, 0x7f, 0x9e, 0x93, - 0xb9, 0x9a, 0x00, 0xaa, 0x23, 0x7d, 0xd6, 0xac, 0x85, 0xa2, 0x63, - 0x45, 0xc7, 0x72, 0x27, 0xcc, 0xf4, 0x4c, 0xc6, 0x75, 0x71, 0xd2, - 0x39, 0xef, 0x4f, 0x42, 0xf0, 0x75, 0xdf, 0x0a, 0x90, 0xc6, 0x8e, - 0x20, 0x6f, 0x98, 0x0f, 0xf8, 0xac, 0x23, 0x5f, 0x70, 0x29, 0x36, - 0xa4, 0xc9, 0x86, 0xe7, 0xb1, 0x9a, 0x20, 0xcb, 0x53, 0xa5, 0x85, - 0xe7, 0x3d, 0xbe, 0x7d, 0x9a, 0xfe, 0x24, 0x45, 0x33, 0xdc, 0x76, - 0x15, 0xed, 0x0f, 0xa2, 0x71, 0x64, 0x4c, 0x65, 0x2e, 0x81, 0x68, - 0x45, 0xa7, 0x02, 0x03, 0x01, 0x00, 0x01, 0x30, 0x0d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x02, 0x05, 0x00, - 0x03, 0x81, 0x81, 0x00, 0xbb, 0x4c, 0x12, 0x2b, 0xcf, 0x2c, 0x26, - 0x00, 0x4f, 0x14, 0x13, 0xdd, 0xa6, 0xfb, 0xfc, 0x0a, 0x11, 0x84, - 0x8c, 0xf3, 0x28, 0x1c, 0x67, 0x92, 0x2f, 0x7c, 0xb6, 0xc5, 0xfa, - 0xdf, 0xf0, 0xe8, 0x95, 0xbc, 0x1d, 0x8f, 0x6c, 0x2c, 0xa8, 0x51, - 0xcc, 0x73, 0xd8, 0xa4, 0xc0, 0x53, 0xf0, 0x4e, 0xd6, 0x26, 0xc0, - 0x76, 0x01, 0x57, 0x81, 0x92, 0x5e, 0x21, 0xf1, 0xd1, 0xb1, 0xff, - 0xe7, 0xd0, 0x21, 0x58, 0xcd, 0x69, 0x17, 0xe3, 0x44, 0x1c, 0x9c, - 0x19, 0x44, 0x39, 0x89, 0x5c, 0xdc, 0x9c, 0x00, 0x0f, 0x56, 0x8d, - 0x02, 0x99, 0xed, 0xa2, 0x90, 0x45, 0x4c, 0xe4, 0xbb, 0x10, 0xa4, - 0x3d, 0xf0, 0x32, 0x03, 0x0e, 0xf1, 0xce, 0xf8, 0xe8, 0xc9, 0x51, - 0x8c, 0xe6, 0x62, 0x9f, 0xe6, 0x9f, 0xc0, 0x7d, 0xb7, 0x72, 0x9c, - 0xc9, 0x36, 0x3a, 0x6b, 0x9f, 0x4e, 0xa8, 0xff, 0x64, 0x0d, 0x64, - 0x30, 0x82, 0x03, 0x02, 0x30, 0x82, 0x02, 0x6b, 0x02, 0x10, 0x7d, - 0xd9, 0xfe, 0x07, 0xcf, 0xa8, 0x1e, 0xb7, 0x10, 0x79, 0x67, 0xfb, - 0xa7, 0x89, 0x34, 0xc6, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0xc1, + 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x04, + 0x43, 0x52, 0x4c, 0x31, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x1d, 0x10, + 0x04, 0x13, 0x30, 0x11, 0x81, 0x0f, 0x32, 0x30, 0x31, 0x38, 0x30, + 0x38, 0x32, 0x32, 0x31, 0x36, 0x34, 0x31, 0x35, 0x31, 0x5a, 0x30, + 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, + 0x06, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, + 0x16, 0x80, 0x14, 0x48, 0xe6, 0x68, 0xf9, 0x2b, 0xd2, 0xb2, 0x95, + 0xd7, 0x47, 0xd8, 0x23, 0x20, 0x10, 0x4f, 0x33, 0x98, 0x90, 0x9f, + 0xd4, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, + 0x14, 0x48, 0xe6, 0x68, 0xf9, 0x2b, 0xd2, 0xb2, 0x95, 0xd7, 0x47, + 0xd8, 0x23, 0x20, 0x10, 0x4f, 0x33, 0x98, 0x90, 0x9f, 0xd4, 0x30, + 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, + 0x01, 0xff, 0x30, 0x1a, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf6, + 0x7d, 0x07, 0x41, 0x00, 0x04, 0x0d, 0x30, 0x0b, 0x1b, 0x05, 0x56, + 0x33, 0x2e, 0x30, 0x63, 0x03, 0x02, 0x06, 0xc0, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x03, 0x81, 0x81, 0x00, 0x58, 0xce, 0x29, 0xea, 0xfc, 0xf7, + 0xde, 0xb5, 0xce, 0x02, 0xb9, 0x17, 0xb5, 0x85, 0xd1, 0xb9, 0xe3, + 0xe0, 0x95, 0xcc, 0x25, 0x31, 0x0d, 0x00, 0xa6, 0x92, 0x6e, 0x7f, + 0xb6, 0x92, 0x63, 0x9e, 0x50, 0x95, 0xd1, 0x9a, 0x6f, 0xe4, 0x11, + 0xde, 0x63, 0x85, 0x6e, 0x98, 0xee, 0xa8, 0xff, 0x5a, 0xc8, 0xd3, + 0x55, 0xb2, 0x66, 0x71, 0x57, 0xde, 0xc0, 0x21, 0xeb, 0x3d, 0x2a, + 0xa7, 0x23, 0x49, 0x01, 0x04, 0x86, 0x42, 0x7b, 0xfc, 0xee, 0x7f, + 0xa2, 0x16, 0x52, 0xb5, 0x67, 0x67, 0xd3, 0x40, 0xdb, 0x3b, 0x26, + 0x58, 0xb2, 0x28, 0x77, 0x3d, 0xae, 0x14, 0x77, 0x61, 0xd6, 0xfa, + 0x2a, 0x66, 0x27, 0xa0, 0x0d, 0xfa, 0xa7, 0x73, 0x5c, 0xea, 0x70, + 0xf1, 0x94, 0x21, 0x65, 0x44, 0x5f, 0xfa, 0xfc, 0xef, 0x29, 0x68, + 0xa9, 0xa2, 0x87, 0x79, 0xef, 0x79, 0xef, 0x4f, 0xac, 0x07, 0x77, + 0x38, 0x30, 0x82, 0x03, 0x75, 0x30, 0x82, 0x02, 0x5d, 0xa0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x0b, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x15, 0x4b, 0x5a, 0xc3, 0x94, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x57, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x13, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x2c, - 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x3c, 0x30, 0x3a, 0x06, 0x03, - 0x55, 0x04, 0x0b, 0x13, 0x33, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, - 0x33, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x50, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, - 0x32, 0x31, 0x3a, 0x30, 0x38, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, - 0x31, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39, 0x39, 0x38, 0x20, 0x56, - 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x49, 0x6e, - 0x63, 0x2e, 0x20, 0x2d, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, 0x73, - 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x31, 0x1f, 0x30, 0x1d, 0x06, - 0x03, 0x55, 0x04, 0x0b, 0x13, 0x16, 0x56, 0x65, 0x72, 0x69, 0x53, - 0x69, 0x67, 0x6e, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x30, 0x1e, 0x17, 0x0d, 0x39, - 0x38, 0x30, 0x35, 0x31, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x5a, 0x17, 0x0d, 0x32, 0x38, 0x30, 0x38, 0x30, 0x31, 0x32, 0x33, - 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0xc1, 0x31, 0x0b, 0x30, - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, - 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0e, 0x56, - 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x49, 0x6e, - 0x63, 0x2e, 0x31, 0x3c, 0x30, 0x3a, 0x06, 0x03, 0x55, 0x04, 0x0b, - 0x13, 0x33, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x31, 0x3a, - 0x30, 0x38, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x31, 0x28, 0x63, - 0x29, 0x20, 0x31, 0x39, 0x39, 0x38, 0x20, 0x56, 0x65, 0x72, 0x69, - 0x53, 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, - 0x2d, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, - 0x6e, 0x6c, 0x79, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, - 0x0b, 0x13, 0x16, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, - 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, - 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xcc, - 0x5e, 0xd1, 0x11, 0x5d, 0x5c, 0x69, 0xd0, 0xab, 0xd3, 0xb9, 0x6a, - 0x4c, 0x99, 0x1f, 0x59, 0x98, 0x30, 0x8e, 0x16, 0x85, 0x20, 0x46, - 0x6d, 0x47, 0x3f, 0xd4, 0x85, 0x20, 0x84, 0xe1, 0x6d, 0xb3, 0xf8, - 0xa4, 0xed, 0x0c, 0xf1, 0x17, 0x0f, 0x3b, 0xf9, 0xa7, 0xf9, 0x25, - 0xd7, 0xc1, 0xcf, 0x84, 0x63, 0xf2, 0x7c, 0x63, 0xcf, 0xa2, 0x47, - 0xf2, 0xc6, 0x5b, 0x33, 0x8e, 0x64, 0x40, 0x04, 0x68, 0xc1, 0x80, - 0xb9, 0x64, 0x1c, 0x45, 0x77, 0xc7, 0xd8, 0x6e, 0xf5, 0x95, 0x29, - 0x3c, 0x50, 0xe8, 0x34, 0xd7, 0x78, 0x1f, 0xa8, 0xba, 0x6d, 0x43, - 0x91, 0x95, 0x8f, 0x45, 0x57, 0x5e, 0x7e, 0xc5, 0xfb, 0xca, 0xa4, - 0x04, 0xeb, 0xea, 0x97, 0x37, 0x54, 0x30, 0x6f, 0xbb, 0x01, 0x47, - 0x32, 0x33, 0xcd, 0xdc, 0x57, 0x9b, 0x64, 0x69, 0x61, 0xf8, 0x9b, - 0x1d, 0x1c, 0x89, 0x4f, 0x5c, 0x67, 0x02, 0x03, 0x01, 0x00, 0x01, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x05, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x51, 0x4d, 0xcd, - 0xbe, 0x5c, 0xcb, 0x98, 0x19, 0x9c, 0x15, 0xb2, 0x01, 0x39, 0x78, - 0x2e, 0x4d, 0x0f, 0x67, 0x70, 0x70, 0x99, 0xc6, 0x10, 0x5a, 0x94, - 0xa4, 0x53, 0x4d, 0x54, 0x6d, 0x2b, 0xaf, 0x0d, 0x5d, 0x40, 0x8b, - 0x64, 0xd3, 0xd7, 0xee, 0xde, 0x56, 0x61, 0x92, 0x5f, 0xa6, 0xc4, - 0x1d, 0x10, 0x61, 0x36, 0xd3, 0x2c, 0x27, 0x3c, 0xe8, 0x29, 0x09, - 0xb9, 0x11, 0x64, 0x74, 0xcc, 0xb5, 0x73, 0x9f, 0x1c, 0x48, 0xa9, - 0xbc, 0x61, 0x01, 0xee, 0xe2, 0x17, 0xa6, 0x0c, 0xe3, 0x40, 0x08, - 0x3b, 0x0e, 0xe7, 0xeb, 0x44, 0x73, 0x2a, 0x9a, 0xf1, 0x69, 0x92, - 0xef, 0x71, 0x14, 0xc3, 0x39, 0xac, 0x71, 0xa7, 0x91, 0x09, 0x6f, - 0xe4, 0x71, 0x06, 0xb3, 0xba, 0x59, 0x57, 0x26, 0x79, 0x00, 0xf6, - 0xf8, 0x0d, 0xa2, 0x33, 0x30, 0x28, 0xd4, 0xaa, 0x58, 0xa0, 0x9d, - 0x9d, 0x69, 0x91, 0xfd, 0x30, 0x82, 0x03, 0x75, 0x30, 0x82, 0x02, - 0x5d, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0b, 0x04, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x15, 0x4b, 0x5a, 0xc3, 0x94, 0x30, 0x0d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, - 0x00, 0x30, 0x57, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x42, 0x45, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x10, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x53, 0x69, 0x67, 0x6e, 0x20, 0x6e, 0x76, 0x2d, 0x73, 0x61, 0x31, - 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x07, 0x52, - 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x31, 0x1b, 0x30, 0x19, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x47, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, - 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x39, 0x38, 0x30, 0x39, 0x30, - 0x31, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, - 0x38, 0x30, 0x31, 0x32, 0x38, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, - 0x5a, 0x30, 0x57, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x42, 0x45, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x10, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x53, 0x69, 0x67, 0x6e, 0x20, 0x6e, 0x76, 0x2d, 0x73, 0x61, 0x31, - 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x07, 0x52, - 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x31, 0x1b, 0x30, 0x19, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x47, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, - 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, - 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, - 0x01, 0x00, 0xda, 0x0e, 0xe6, 0x99, 0x8d, 0xce, 0xa3, 0xe3, 0x4f, - 0x8a, 0x7e, 0xfb, 0xf1, 0x8b, 0x83, 0x25, 0x6b, 0xea, 0x48, 0x1f, - 0xf1, 0x2a, 0xb0, 0xb9, 0x95, 0x11, 0x04, 0xbd, 0xf0, 0x63, 0xd1, - 0xe2, 0x67, 0x66, 0xcf, 0x1c, 0xdd, 0xcf, 0x1b, 0x48, 0x2b, 0xee, - 0x8d, 0x89, 0x8e, 0x9a, 0xaf, 0x29, 0x80, 0x65, 0xab, 0xe9, 0xc7, - 0x2d, 0x12, 0xcb, 0xab, 0x1c, 0x4c, 0x70, 0x07, 0xa1, 0x3d, 0x0a, - 0x30, 0xcd, 0x15, 0x8d, 0x4f, 0xf8, 0xdd, 0xd4, 0x8c, 0x50, 0x15, - 0x1c, 0xef, 0x50, 0xee, 0xc4, 0x2e, 0xf7, 0xfc, 0xe9, 0x52, 0xf2, - 0x91, 0x7d, 0xe0, 0x6d, 0xd5, 0x35, 0x30, 0x8e, 0x5e, 0x43, 0x73, - 0xf2, 0x41, 0xe9, 0xd5, 0x6a, 0xe3, 0xb2, 0x89, 0x3a, 0x56, 0x39, - 0x38, 0x6f, 0x06, 0x3c, 0x88, 0x69, 0x5b, 0x2a, 0x4d, 0xc5, 0xa7, - 0x54, 0xb8, 0x6c, 0x89, 0xcc, 0x9b, 0xf9, 0x3c, 0xca, 0xe5, 0xfd, - 0x89, 0xf5, 0x12, 0x3c, 0x92, 0x78, 0x96, 0xd6, 0xdc, 0x74, 0x6e, - 0x93, 0x44, 0x61, 0xd1, 0x8d, 0xc7, 0x46, 0xb2, 0x75, 0x0e, 0x86, - 0xe8, 0x19, 0x8a, 0xd5, 0x6d, 0x6c, 0xd5, 0x78, 0x16, 0x95, 0xa2, - 0xe9, 0xc8, 0x0a, 0x38, 0xeb, 0xf2, 0x24, 0x13, 0x4f, 0x73, 0x54, - 0x93, 0x13, 0x85, 0x3a, 0x1b, 0xbc, 0x1e, 0x34, 0xb5, 0x8b, 0x05, - 0x8c, 0xb9, 0x77, 0x8b, 0xb1, 0xdb, 0x1f, 0x20, 0x91, 0xab, 0x09, - 0x53, 0x6e, 0x90, 0xce, 0x7b, 0x37, 0x74, 0xb9, 0x70, 0x47, 0x91, - 0x22, 0x51, 0x63, 0x16, 0x79, 0xae, 0xb1, 0xae, 0x41, 0x26, 0x08, - 0xc8, 0x19, 0x2b, 0xd1, 0x46, 0xaa, 0x48, 0xd6, 0x64, 0x2a, 0xd7, - 0x83, 0x34, 0xff, 0x2c, 0x2a, 0xc1, 0x6c, 0x19, 0x43, 0x4a, 0x07, - 0x85, 0xe7, 0xd3, 0x7c, 0xf6, 0x21, 0x68, 0xef, 0xea, 0xf2, 0x52, - 0x9f, 0x7f, 0x93, 0x90, 0xcf, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, - 0x42, 0x30, 0x40, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, - 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, - 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, - 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, - 0x16, 0x04, 0x14, 0x60, 0x7b, 0x66, 0x1a, 0x45, 0x0d, 0x97, 0xca, - 0x89, 0x50, 0x2f, 0x7d, 0x04, 0xcd, 0x34, 0xa8, 0xff, 0xfc, 0xfd, - 0x4b, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xd6, - 0x73, 0xe7, 0x7c, 0x4f, 0x76, 0xd0, 0x8d, 0xbf, 0xec, 0xba, 0xa2, - 0xbe, 0x34, 0xc5, 0x28, 0x32, 0xb5, 0x7c, 0xfc, 0x6c, 0x9c, 0x2c, - 0x2b, 0xbd, 0x09, 0x9e, 0x53, 0xbf, 0x6b, 0x5e, 0xaa, 0x11, 0x48, - 0xb6, 0xe5, 0x08, 0xa3, 0xb3, 0xca, 0x3d, 0x61, 0x4d, 0xd3, 0x46, - 0x09, 0xb3, 0x3e, 0xc3, 0xa0, 0xe3, 0x63, 0x55, 0x1b, 0xf2, 0xba, - 0xef, 0xad, 0x39, 0xe1, 0x43, 0xb9, 0x38, 0xa3, 0xe6, 0x2f, 0x8a, - 0x26, 0x3b, 0xef, 0xa0, 0x50, 0x56, 0xf9, 0xc6, 0x0a, 0xfd, 0x38, - 0xcd, 0xc4, 0x0b, 0x70, 0x51, 0x94, 0x97, 0x98, 0x04, 0xdf, 0xc3, - 0x5f, 0x94, 0xd5, 0x15, 0xc9, 0x14, 0x41, 0x9c, 0xc4, 0x5d, 0x75, - 0x64, 0x15, 0x0d, 0xff, 0x55, 0x30, 0xec, 0x86, 0x8f, 0xff, 0x0d, - 0xef, 0x2c, 0xb9, 0x63, 0x46, 0xf6, 0xaa, 0xfc, 0xdf, 0xbc, 0x69, - 0xfd, 0x2e, 0x12, 0x48, 0x64, 0x9a, 0xe0, 0x95, 0xf0, 0xa6, 0xef, - 0x29, 0x8f, 0x01, 0xb1, 0x15, 0xb5, 0x0c, 0x1d, 0xa5, 0xfe, 0x69, - 0x2c, 0x69, 0x24, 0x78, 0x1e, 0xb3, 0xa7, 0x1c, 0x71, 0x62, 0xee, - 0xca, 0xc8, 0x97, 0xac, 0x17, 0x5d, 0x8a, 0xc2, 0xf8, 0x47, 0x86, - 0x6e, 0x2a, 0xc4, 0x56, 0x31, 0x95, 0xd0, 0x67, 0x89, 0x85, 0x2b, - 0xf9, 0x6c, 0xa6, 0x5d, 0x46, 0x9d, 0x0c, 0xaa, 0x82, 0xe4, 0x99, - 0x51, 0xdd, 0x70, 0xb7, 0xdb, 0x56, 0x3d, 0x61, 0xe4, 0x6a, 0xe1, - 0x5c, 0xd6, 0xf6, 0xfe, 0x3d, 0xde, 0x41, 0xcc, 0x07, 0xae, 0x63, - 0x52, 0xbf, 0x53, 0x53, 0xf4, 0x2b, 0xe9, 0xc7, 0xfd, 0xb6, 0xf7, - 0x82, 0x5f, 0x85, 0xd2, 0x41, 0x18, 0xdb, 0x81, 0xb3, 0x04, 0x1c, - 0xc5, 0x1f, 0xa4, 0x80, 0x6f, 0x15, 0x20, 0xc9, 0xde, 0x0c, 0x88, - 0x0a, 0x1d, 0xd6, 0x66, 0x55, 0xe2, 0xfc, 0x48, 0xc9, 0x29, 0x26, - 0x69, 0xe0, 0x30, 0x82, 0x03, 0xba, 0x30, 0x82, 0x02, 0xa2, 0xa0, - 0x03, 0x02, 0x01, 0x02, 0x02, 0x0b, 0x04, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x0f, 0x86, 0x26, 0xe6, 0x0d, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, - 0x4c, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, - 0x17, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, - 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, - 0x52, 0x32, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, - 0x6e, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, - 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, - 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x32, 0x31, 0x35, 0x30, - 0x38, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x31, 0x31, - 0x32, 0x31, 0x35, 0x30, 0x38, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, - 0x4c, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, - 0x17, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, - 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, - 0x52, 0x32, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, - 0x6e, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, - 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, - 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, - 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, - 0xa6, 0xcf, 0x24, 0x0e, 0xbe, 0x2e, 0x6f, 0x28, 0x99, 0x45, 0x42, - 0xc4, 0xab, 0x3e, 0x21, 0x54, 0x9b, 0x0b, 0xd3, 0x7f, 0x84, 0x70, - 0xfa, 0x12, 0xb3, 0xcb, 0xbf, 0x87, 0x5f, 0xc6, 0x7f, 0x86, 0xd3, - 0xb2, 0x30, 0x5c, 0xd6, 0xfd, 0xad, 0xf1, 0x7b, 0xdc, 0xe5, 0xf8, - 0x60, 0x96, 0x09, 0x92, 0x10, 0xf5, 0xd0, 0x53, 0xde, 0xfb, 0x7b, - 0x7e, 0x73, 0x88, 0xac, 0x52, 0x88, 0x7b, 0x4a, 0xa6, 0xca, 0x49, - 0xa6, 0x5e, 0xa8, 0xa7, 0x8c, 0x5a, 0x11, 0xbc, 0x7a, 0x82, 0xeb, - 0xbe, 0x8c, 0xe9, 0xb3, 0xac, 0x96, 0x25, 0x07, 0x97, 0x4a, 0x99, - 0x2a, 0x07, 0x2f, 0xb4, 0x1e, 0x77, 0xbf, 0x8a, 0x0f, 0xb5, 0x02, - 0x7c, 0x1b, 0x96, 0xb8, 0xc5, 0xb9, 0x3a, 0x2c, 0xbc, 0xd6, 0x12, - 0xb9, 0xeb, 0x59, 0x7d, 0xe2, 0xd0, 0x06, 0x86, 0x5f, 0x5e, 0x49, - 0x6a, 0xb5, 0x39, 0x5e, 0x88, 0x34, 0xec, 0xbc, 0x78, 0x0c, 0x08, - 0x98, 0x84, 0x6c, 0xa8, 0xcd, 0x4b, 0xb4, 0xa0, 0x7d, 0x0c, 0x79, - 0x4d, 0xf0, 0xb8, 0x2d, 0xcb, 0x21, 0xca, 0xd5, 0x6c, 0x5b, 0x7d, - 0xe1, 0xa0, 0x29, 0x84, 0xa1, 0xf9, 0xd3, 0x94, 0x49, 0xcb, 0x24, - 0x62, 0x91, 0x20, 0xbc, 0xdd, 0x0b, 0xd5, 0xd9, 0xcc, 0xf9, 0xea, - 0x27, 0x0a, 0x2b, 0x73, 0x91, 0xc6, 0x9d, 0x1b, 0xac, 0xc8, 0xcb, - 0xe8, 0xe0, 0xa0, 0xf4, 0x2f, 0x90, 0x8b, 0x4d, 0xfb, 0xb0, 0x36, - 0x1b, 0xf6, 0x19, 0x7a, 0x85, 0xe0, 0x6d, 0xf2, 0x61, 0x13, 0x88, - 0x5c, 0x9f, 0xe0, 0x93, 0x0a, 0x51, 0x97, 0x8a, 0x5a, 0xce, 0xaf, - 0xab, 0xd5, 0xf7, 0xaa, 0x09, 0xaa, 0x60, 0xbd, 0xdc, 0xd9, 0x5f, - 0xdf, 0x72, 0xa9, 0x60, 0x13, 0x5e, 0x00, 0x01, 0xc9, 0x4a, 0xfa, - 0x3f, 0xa4, 0xea, 0x07, 0x03, 0x21, 0x02, 0x8e, 0x82, 0xca, 0x03, - 0xc2, 0x9b, 0x8f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x9c, - 0x30, 0x81, 0x99, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, - 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, - 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, - 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, - 0x16, 0x04, 0x14, 0x9b, 0xe2, 0x07, 0x57, 0x67, 0x1c, 0x1e, 0xc0, - 0x6a, 0x06, 0xde, 0x59, 0xb4, 0x9a, 0x2d, 0xdf, 0xdc, 0x19, 0x86, - 0x2e, 0x30, 0x36, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x2f, 0x30, - 0x2d, 0x30, 0x2b, 0xa0, 0x29, 0xa0, 0x27, 0x86, 0x25, 0x68, 0x74, - 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x67, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x6e, 0x65, - 0x74, 0x2f, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x72, 0x32, 0x2e, 0x63, - 0x72, 0x6c, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, - 0x30, 0x16, 0x80, 0x14, 0x9b, 0xe2, 0x07, 0x57, 0x67, 0x1c, 0x1e, - 0xc0, 0x6a, 0x06, 0xde, 0x59, 0xb4, 0x9a, 0x2d, 0xdf, 0xdc, 0x19, - 0x86, 0x2e, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, - 0x99, 0x81, 0x53, 0x87, 0x1c, 0x68, 0x97, 0x86, 0x91, 0xec, 0xe0, - 0x4a, 0xb8, 0x44, 0x0b, 0xab, 0x81, 0xac, 0x27, 0x4f, 0xd6, 0xc1, - 0xb8, 0x1c, 0x43, 0x78, 0xb3, 0x0c, 0x9a, 0xfc, 0xea, 0x2c, 0x3c, - 0x6e, 0x61, 0x1b, 0x4d, 0x4b, 0x29, 0xf5, 0x9f, 0x05, 0x1d, 0x26, - 0xc1, 0xb8, 0xe9, 0x83, 0x00, 0x62, 0x45, 0xb6, 0xa9, 0x08, 0x93, - 0xb9, 0xa9, 0x33, 0x4b, 0x18, 0x9a, 0xc2, 0xf8, 0x87, 0x88, 0x4e, - 0xdb, 0xdd, 0x71, 0x34, 0x1a, 0xc1, 0x54, 0xda, 0x46, 0x3f, 0xe0, - 0xd3, 0x2a, 0xab, 0x6d, 0x54, 0x22, 0xf5, 0x3a, 0x62, 0xcd, 0x20, - 0x6f, 0xba, 0x29, 0x89, 0xd7, 0xdd, 0x91, 0xee, 0xd3, 0x5c, 0xa2, - 0x3e, 0xa1, 0x5b, 0x41, 0xf5, 0xdf, 0xe5, 0x64, 0x43, 0x2d, 0xe9, - 0xd5, 0x39, 0xab, 0xd2, 0xa2, 0xdf, 0xb7, 0x8b, 0xd0, 0xc0, 0x80, - 0x19, 0x1c, 0x45, 0xc0, 0x2d, 0x8c, 0xe8, 0xf8, 0x2d, 0xa4, 0x74, - 0x56, 0x49, 0xc5, 0x05, 0xb5, 0x4f, 0x15, 0xde, 0x6e, 0x44, 0x78, - 0x39, 0x87, 0xa8, 0x7e, 0xbb, 0xf3, 0x79, 0x18, 0x91, 0xbb, 0xf4, - 0x6f, 0x9d, 0xc1, 0xf0, 0x8c, 0x35, 0x8c, 0x5d, 0x01, 0xfb, 0xc3, - 0x6d, 0xb9, 0xef, 0x44, 0x6d, 0x79, 0x46, 0x31, 0x7e, 0x0a, 0xfe, - 0xa9, 0x82, 0xc1, 0xff, 0xef, 0xab, 0x6e, 0x20, 0xc4, 0x50, 0xc9, - 0x5f, 0x9d, 0x4d, 0x9b, 0x17, 0x8c, 0x0c, 0xe5, 0x01, 0xc9, 0xa0, - 0x41, 0x6a, 0x73, 0x53, 0xfa, 0xa5, 0x50, 0xb4, 0x6e, 0x25, 0x0f, - 0xfb, 0x4c, 0x18, 0xf4, 0xfd, 0x52, 0xd9, 0x8e, 0x69, 0xb1, 0xe8, - 0x11, 0x0f, 0xde, 0x88, 0xd8, 0xfb, 0x1d, 0x49, 0xf7, 0xaa, 0xde, - 0x95, 0xcf, 0x20, 0x78, 0xc2, 0x60, 0x12, 0xdb, 0x25, 0x40, 0x8c, - 0x6a, 0xfc, 0x7e, 0x42, 0x38, 0x40, 0x64, 0x12, 0xf7, 0x9e, 0x81, - 0xe1, 0x93, 0x2e, 0x30, 0x82, 0x02, 0xe7, 0x30, 0x82, 0x02, 0x50, - 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0xbb, 0x31, - 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x1b, 0x56, - 0x61, 0x6c, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x13, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x43, 0x65, 0x72, - 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x35, 0x30, 0x33, - 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2c, 0x56, 0x61, 0x6c, 0x69, - 0x43, 0x65, 0x72, 0x74, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, - 0x31, 0x20, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x21, 0x30, 0x1f, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x68, 0x74, 0x74, 0x70, - 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x76, 0x61, 0x6c, 0x69, - 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x31, 0x20, - 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x09, 0x01, 0x16, 0x11, 0x69, 0x6e, 0x66, 0x6f, 0x40, 0x76, 0x61, - 0x6c, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x30, - 0x1e, 0x17, 0x0d, 0x39, 0x39, 0x30, 0x36, 0x32, 0x35, 0x32, 0x32, - 0x32, 0x33, 0x34, 0x38, 0x5a, 0x17, 0x0d, 0x31, 0x39, 0x30, 0x36, - 0x32, 0x35, 0x32, 0x32, 0x32, 0x33, 0x34, 0x38, 0x5a, 0x30, 0x81, - 0xbb, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, - 0x1b, 0x56, 0x61, 0x6c, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x17, 0x30, 0x15, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x43, - 0x65, 0x72, 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x35, - 0x30, 0x33, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2c, 0x56, 0x61, - 0x6c, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x20, 0x31, 0x20, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x21, - 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x68, 0x74, - 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x76, 0x61, - 0x6c, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x31, 0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x09, 0x01, 0x16, 0x11, 0x69, 0x6e, 0x66, 0x6f, 0x40, - 0x76, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, - 0x6d, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, - 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xd8, 0x59, 0x82, - 0x7a, 0x89, 0xb8, 0x96, 0xba, 0xa6, 0x2f, 0x68, 0x6f, 0x58, 0x2e, - 0xa7, 0x54, 0x1c, 0x06, 0x6e, 0xf4, 0xea, 0x8d, 0x48, 0xbc, 0x31, - 0x94, 0x17, 0xf0, 0xf3, 0x4e, 0xbc, 0xb2, 0xb8, 0x35, 0x92, 0x76, - 0xb0, 0xd0, 0xa5, 0xa5, 0x01, 0xd7, 0x00, 0x03, 0x12, 0x22, 0x19, - 0x08, 0xf8, 0xff, 0x11, 0x23, 0x9b, 0xce, 0x07, 0xf5, 0xbf, 0x69, - 0x1a, 0x26, 0xfe, 0x4e, 0xe9, 0xd1, 0x7f, 0x9d, 0x2c, 0x40, 0x1d, - 0x59, 0x68, 0x6e, 0xa6, 0xf8, 0x58, 0xb0, 0x9d, 0x1a, 0x8f, 0xd3, - 0x3f, 0xf1, 0xdc, 0x19, 0x06, 0x81, 0xa8, 0x0e, 0xe0, 0x3a, 0xdd, - 0xc8, 0x53, 0x45, 0x09, 0x06, 0xe6, 0x0f, 0x70, 0xc3, 0xfa, 0x40, - 0xa6, 0x0e, 0xe2, 0x56, 0x05, 0x0f, 0x18, 0x4d, 0xfc, 0x20, 0x82, - 0xd1, 0x73, 0x55, 0x74, 0x8d, 0x76, 0x72, 0xa0, 0x1d, 0x9d, 0x1d, - 0xc0, 0xdd, 0x3f, 0x71, 0x02, 0x03, 0x01, 0x00, 0x01, 0x30, 0x0d, + 0x42, 0x45, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x13, 0x10, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, + 0x6e, 0x20, 0x6e, 0x76, 0x2d, 0x73, 0x61, 0x31, 0x10, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x07, 0x52, 0x6f, 0x6f, 0x74, + 0x20, 0x43, 0x41, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x12, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, + 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, + 0x1e, 0x17, 0x0d, 0x39, 0x38, 0x30, 0x39, 0x30, 0x31, 0x31, 0x32, + 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x38, 0x30, 0x31, + 0x32, 0x38, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x57, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x42, 0x45, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x13, 0x10, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, + 0x6e, 0x20, 0x6e, 0x76, 0x2d, 0x73, 0x61, 0x31, 0x10, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x07, 0x52, 0x6f, 0x6f, 0x74, + 0x20, 0x43, 0x41, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x12, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, + 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, + 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, + 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xda, + 0x0e, 0xe6, 0x99, 0x8d, 0xce, 0xa3, 0xe3, 0x4f, 0x8a, 0x7e, 0xfb, + 0xf1, 0x8b, 0x83, 0x25, 0x6b, 0xea, 0x48, 0x1f, 0xf1, 0x2a, 0xb0, + 0xb9, 0x95, 0x11, 0x04, 0xbd, 0xf0, 0x63, 0xd1, 0xe2, 0x67, 0x66, + 0xcf, 0x1c, 0xdd, 0xcf, 0x1b, 0x48, 0x2b, 0xee, 0x8d, 0x89, 0x8e, + 0x9a, 0xaf, 0x29, 0x80, 0x65, 0xab, 0xe9, 0xc7, 0x2d, 0x12, 0xcb, + 0xab, 0x1c, 0x4c, 0x70, 0x07, 0xa1, 0x3d, 0x0a, 0x30, 0xcd, 0x15, + 0x8d, 0x4f, 0xf8, 0xdd, 0xd4, 0x8c, 0x50, 0x15, 0x1c, 0xef, 0x50, + 0xee, 0xc4, 0x2e, 0xf7, 0xfc, 0xe9, 0x52, 0xf2, 0x91, 0x7d, 0xe0, + 0x6d, 0xd5, 0x35, 0x30, 0x8e, 0x5e, 0x43, 0x73, 0xf2, 0x41, 0xe9, + 0xd5, 0x6a, 0xe3, 0xb2, 0x89, 0x3a, 0x56, 0x39, 0x38, 0x6f, 0x06, + 0x3c, 0x88, 0x69, 0x5b, 0x2a, 0x4d, 0xc5, 0xa7, 0x54, 0xb8, 0x6c, + 0x89, 0xcc, 0x9b, 0xf9, 0x3c, 0xca, 0xe5, 0xfd, 0x89, 0xf5, 0x12, + 0x3c, 0x92, 0x78, 0x96, 0xd6, 0xdc, 0x74, 0x6e, 0x93, 0x44, 0x61, + 0xd1, 0x8d, 0xc7, 0x46, 0xb2, 0x75, 0x0e, 0x86, 0xe8, 0x19, 0x8a, + 0xd5, 0x6d, 0x6c, 0xd5, 0x78, 0x16, 0x95, 0xa2, 0xe9, 0xc8, 0x0a, + 0x38, 0xeb, 0xf2, 0x24, 0x13, 0x4f, 0x73, 0x54, 0x93, 0x13, 0x85, + 0x3a, 0x1b, 0xbc, 0x1e, 0x34, 0xb5, 0x8b, 0x05, 0x8c, 0xb9, 0x77, + 0x8b, 0xb1, 0xdb, 0x1f, 0x20, 0x91, 0xab, 0x09, 0x53, 0x6e, 0x90, + 0xce, 0x7b, 0x37, 0x74, 0xb9, 0x70, 0x47, 0x91, 0x22, 0x51, 0x63, + 0x16, 0x79, 0xae, 0xb1, 0xae, 0x41, 0x26, 0x08, 0xc8, 0x19, 0x2b, + 0xd1, 0x46, 0xaa, 0x48, 0xd6, 0x64, 0x2a, 0xd7, 0x83, 0x34, 0xff, + 0x2c, 0x2a, 0xc1, 0x6c, 0x19, 0x43, 0x4a, 0x07, 0x85, 0xe7, 0xd3, + 0x7c, 0xf6, 0x21, 0x68, 0xef, 0xea, 0xf2, 0x52, 0x9f, 0x7f, 0x93, + 0x90, 0xcf, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, + 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, + 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, + 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0x60, 0x7b, 0x66, 0x1a, 0x45, 0x0d, 0x97, 0xca, 0x89, 0x50, 0x2f, + 0x7d, 0x04, 0xcd, 0x34, 0xa8, 0xff, 0xfc, 0xfd, 0x4b, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, - 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x50, 0x68, 0x3d, 0x49, 0xf4, - 0x2c, 0x1c, 0x06, 0x94, 0xdf, 0x95, 0x60, 0x7f, 0x96, 0x7b, 0x17, - 0xfe, 0x4f, 0x71, 0xad, 0x64, 0xc8, 0xdd, 0x77, 0xd2, 0xef, 0x59, - 0x55, 0xe8, 0x3f, 0xe8, 0x8e, 0x05, 0x2a, 0x21, 0xf2, 0x07, 0xd2, - 0xb5, 0xa7, 0x52, 0xfe, 0x9c, 0xb1, 0xb6, 0xe2, 0x5b, 0x77, 0x17, - 0x40, 0xea, 0x72, 0xd6, 0x23, 0xcb, 0x28, 0x81, 0x32, 0xc3, 0x00, - 0x79, 0x18, 0xec, 0x59, 0x17, 0x89, 0xc9, 0xc6, 0x6a, 0x1e, 0x71, - 0xc9, 0xfd, 0xb7, 0x74, 0xa5, 0x25, 0x45, 0x69, 0xc5, 0x48, 0xab, - 0x19, 0xe1, 0x45, 0x8a, 0x25, 0x6b, 0x19, 0xee, 0xe5, 0xbb, 0x12, - 0xf5, 0x7f, 0xf7, 0xa6, 0x8d, 0x51, 0xc3, 0xf0, 0x9d, 0x74, 0xb7, - 0xa9, 0x3e, 0xa0, 0xa5, 0xff, 0xb6, 0x49, 0x03, 0x13, 0xda, 0x22, - 0xcc, 0xed, 0x71, 0x82, 0x2b, 0x99, 0xcf, 0x3a, 0xb7, 0xf5, 0x2d, - 0x72, 0xc8, 0x30, 0x82, 0x02, 0xe7, 0x30, 0x82, 0x02, 0x50, 0x02, - 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0xbb, 0x31, 0x24, - 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x1b, 0x56, 0x61, - 0x6c, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x43, 0x65, 0x72, 0x74, - 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x35, 0x30, 0x33, 0x06, - 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2c, 0x56, 0x61, 0x6c, 0x69, 0x43, - 0x65, 0x72, 0x74, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, - 0x20, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x21, 0x30, 0x1f, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x68, 0x74, 0x74, 0x70, 0x3a, - 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x63, - 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x31, 0x20, 0x30, - 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, - 0x01, 0x16, 0x11, 0x69, 0x6e, 0x66, 0x6f, 0x40, 0x76, 0x61, 0x6c, - 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x1e, - 0x17, 0x0d, 0x39, 0x39, 0x30, 0x36, 0x32, 0x36, 0x30, 0x30, 0x31, - 0x39, 0x35, 0x34, 0x5a, 0x17, 0x0d, 0x31, 0x39, 0x30, 0x36, 0x32, - 0x36, 0x30, 0x30, 0x31, 0x39, 0x35, 0x34, 0x5a, 0x30, 0x81, 0xbb, - 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x1b, - 0x56, 0x61, 0x6c, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x43, 0x65, - 0x72, 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x35, 0x30, - 0x33, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2c, 0x56, 0x61, 0x6c, - 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, - 0x20, 0x32, 0x20, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x21, 0x30, - 0x1f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x68, 0x74, 0x74, - 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x76, 0x61, 0x6c, - 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x31, - 0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x09, 0x01, 0x16, 0x11, 0x69, 0x6e, 0x66, 0x6f, 0x40, 0x76, - 0x61, 0x6c, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, - 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, - 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xce, 0x3a, 0x71, 0xca, - 0xe5, 0xab, 0xc8, 0x59, 0x92, 0x55, 0xd7, 0xab, 0xd8, 0x74, 0x0e, - 0xf9, 0xee, 0xd9, 0xf6, 0x55, 0x47, 0x59, 0x65, 0x47, 0x0e, 0x05, - 0x55, 0xdc, 0xeb, 0x98, 0x36, 0x3c, 0x5c, 0x53, 0x5d, 0xd3, 0x30, - 0xcf, 0x38, 0xec, 0xbd, 0x41, 0x89, 0xed, 0x25, 0x42, 0x09, 0x24, - 0x6b, 0x0a, 0x5e, 0xb3, 0x7c, 0xdd, 0x52, 0x2d, 0x4c, 0xe6, 0xd4, - 0xd6, 0x7d, 0x5a, 0x59, 0xa9, 0x65, 0xd4, 0x49, 0x13, 0x2d, 0x24, - 0x4d, 0x1c, 0x50, 0x6f, 0xb5, 0xc1, 0x85, 0x54, 0x3b, 0xfe, 0x71, - 0xe4, 0xd3, 0x5c, 0x42, 0xf9, 0x80, 0xe0, 0x91, 0x1a, 0x0a, 0x5b, - 0x39, 0x36, 0x67, 0xf3, 0x3f, 0x55, 0x7c, 0x1b, 0x3f, 0xb4, 0x5f, - 0x64, 0x73, 0x34, 0xe3, 0xb4, 0x12, 0xbf, 0x87, 0x64, 0xf8, 0xda, - 0x12, 0xff, 0x37, 0x27, 0xc1, 0xb3, 0x43, 0xbb, 0xef, 0x7b, 0x6e, - 0x2e, 0x69, 0xf7, 0x02, 0x03, 0x01, 0x00, 0x01, 0x30, 0x0d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, - 0x00, 0x03, 0x81, 0x81, 0x00, 0x3b, 0x7f, 0x50, 0x6f, 0x6f, 0x50, - 0x94, 0x99, 0x49, 0x62, 0x38, 0x38, 0x1f, 0x4b, 0xf8, 0xa5, 0xc8, - 0x3e, 0xa7, 0x82, 0x81, 0xf6, 0x2b, 0xc7, 0xe8, 0xc5, 0xce, 0xe8, - 0x3a, 0x10, 0x82, 0xcb, 0x18, 0x00, 0x8e, 0x4d, 0xbd, 0xa8, 0x58, - 0x7f, 0xa1, 0x79, 0x00, 0xb5, 0xbb, 0xe9, 0x8d, 0xaf, 0x41, 0xd9, - 0x0f, 0x34, 0xee, 0x21, 0x81, 0x19, 0xa0, 0x32, 0x49, 0x28, 0xf4, - 0xc4, 0x8e, 0x56, 0xd5, 0x52, 0x33, 0xfd, 0x50, 0xd5, 0x7e, 0x99, - 0x6c, 0x03, 0xe4, 0xc9, 0x4c, 0xfc, 0xcb, 0x6c, 0xab, 0x66, 0xb3, - 0x4a, 0x21, 0x8c, 0xe5, 0xb5, 0x0c, 0x32, 0x3e, 0x10, 0xb2, 0xcc, - 0x6c, 0xa1, 0xdc, 0x9a, 0x98, 0x4c, 0x02, 0x5b, 0xf3, 0xce, 0xb9, - 0x9e, 0xa5, 0x72, 0x0e, 0x4a, 0xb7, 0x3f, 0x3c, 0xe6, 0x16, 0x68, - 0xf8, 0xbe, 0xed, 0x74, 0x4c, 0xbc, 0x5b, 0xd5, 0x62, 0x1f, 0x43, - 0xdd, 0x30, 0x82, 0x02, 0xe7, 0x30, 0x82, 0x02, 0x50, 0x02, 0x01, - 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0xbb, 0x31, 0x24, 0x30, - 0x22, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x1b, 0x56, 0x61, 0x6c, - 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x13, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x43, 0x65, 0x72, 0x74, 0x2c, - 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x35, 0x30, 0x33, 0x06, 0x03, - 0x55, 0x04, 0x0b, 0x13, 0x2c, 0x56, 0x61, 0x6c, 0x69, 0x43, 0x65, - 0x72, 0x74, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x13, 0x18, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, - 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x63, 0x65, - 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x31, 0x20, 0x30, 0x1e, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, - 0x16, 0x11, 0x69, 0x6e, 0x66, 0x6f, 0x40, 0x76, 0x61, 0x6c, 0x69, - 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x1e, 0x17, - 0x0d, 0x39, 0x39, 0x30, 0x36, 0x32, 0x36, 0x30, 0x30, 0x32, 0x32, - 0x33, 0x33, 0x5a, 0x17, 0x0d, 0x31, 0x39, 0x30, 0x36, 0x32, 0x36, - 0x30, 0x30, 0x32, 0x32, 0x33, 0x33, 0x5a, 0x30, 0x81, 0xbb, 0x31, - 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x1b, 0x56, - 0x61, 0x6c, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x13, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x43, 0x65, 0x72, - 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x35, 0x30, 0x33, - 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2c, 0x56, 0x61, 0x6c, 0x69, - 0x43, 0x65, 0x72, 0x74, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, - 0x33, 0x20, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x21, 0x30, 0x1f, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x68, 0x74, 0x74, 0x70, - 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x76, 0x61, 0x6c, 0x69, - 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x31, 0x20, - 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x09, 0x01, 0x16, 0x11, 0x69, 0x6e, 0x66, 0x6f, 0x40, 0x76, 0x61, - 0x6c, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x30, - 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, - 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xe3, 0x98, 0x51, 0x96, 0x1c, - 0xe8, 0xd5, 0xb1, 0x06, 0x81, 0x6a, 0x57, 0xc3, 0x72, 0x75, 0x93, - 0xab, 0xcf, 0x9e, 0xa6, 0xfc, 0xf3, 0x16, 0x52, 0xd6, 0x2d, 0x4d, - 0x9f, 0x35, 0x44, 0xa8, 0x2e, 0x04, 0x4d, 0x07, 0x49, 0x8a, 0x38, - 0x29, 0xf5, 0x77, 0x37, 0xe7, 0xb7, 0xab, 0x5d, 0xdf, 0x36, 0x71, - 0x14, 0x99, 0x8f, 0xdc, 0xc2, 0x92, 0xf1, 0xe7, 0x60, 0x92, 0x97, - 0xec, 0xd8, 0x48, 0xdc, 0xbf, 0xc1, 0x02, 0x20, 0xc6, 0x24, 0xa4, - 0x28, 0x4c, 0x30, 0x5a, 0x76, 0x6d, 0xb1, 0x5c, 0xf3, 0xdd, 0xde, - 0x9e, 0x10, 0x71, 0xa1, 0x88, 0xc7, 0x5b, 0x9b, 0x41, 0x6d, 0xca, - 0xb0, 0xb8, 0x8e, 0x15, 0xee, 0xad, 0x33, 0x2b, 0xcf, 0x47, 0x04, - 0x5c, 0x75, 0x71, 0x0a, 0x98, 0x24, 0x98, 0x29, 0xa7, 0x49, 0x59, - 0xa5, 0xdd, 0xf8, 0xb7, 0x43, 0x62, 0x61, 0xf3, 0xd3, 0xe2, 0xd0, - 0x55, 0x3f, 0x02, 0x03, 0x01, 0x00, 0x01, 0x30, 0x0d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, - 0x03, 0x81, 0x81, 0x00, 0x56, 0xbb, 0x02, 0x58, 0x84, 0x67, 0x08, - 0x2c, 0xdf, 0x1f, 0xdb, 0x7b, 0x49, 0x33, 0xf5, 0xd3, 0x67, 0x9d, - 0xf4, 0xb4, 0x0a, 0x10, 0xb3, 0xc9, 0xc5, 0x2c, 0xe2, 0x92, 0x6a, - 0x71, 0x78, 0x27, 0xf2, 0x70, 0x83, 0x42, 0xd3, 0x3e, 0xcf, 0xa9, - 0x54, 0xf4, 0xf1, 0xd8, 0x92, 0x16, 0x8c, 0xd1, 0x04, 0xcb, 0x4b, - 0xab, 0xc9, 0x9f, 0x45, 0xae, 0x3c, 0x8a, 0xa9, 0xb0, 0x71, 0x33, - 0x5d, 0xc8, 0xc5, 0x57, 0xdf, 0xaf, 0xa8, 0x35, 0xb3, 0x7f, 0x89, - 0x87, 0xe9, 0xe8, 0x25, 0x92, 0xb8, 0x7f, 0x85, 0x7a, 0xae, 0xd6, - 0xbc, 0x1e, 0x37, 0x58, 0x2a, 0x67, 0xc9, 0x91, 0xcf, 0x2a, 0x81, - 0x3e, 0xed, 0xc6, 0x39, 0xdf, 0xc0, 0x3e, 0x19, 0x9c, 0x19, 0xcc, - 0x13, 0x4d, 0x82, 0x41, 0xb5, 0x8c, 0xde, 0xe0, 0x3d, 0x60, 0x08, - 0x20, 0x0f, 0x45, 0x7e, 0x6b, 0xa2, 0x7f, 0xa3, 0x8c, 0x15, 0xee, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xd6, 0x73, 0xe7, 0x7c, + 0x4f, 0x76, 0xd0, 0x8d, 0xbf, 0xec, 0xba, 0xa2, 0xbe, 0x34, 0xc5, + 0x28, 0x32, 0xb5, 0x7c, 0xfc, 0x6c, 0x9c, 0x2c, 0x2b, 0xbd, 0x09, + 0x9e, 0x53, 0xbf, 0x6b, 0x5e, 0xaa, 0x11, 0x48, 0xb6, 0xe5, 0x08, + 0xa3, 0xb3, 0xca, 0x3d, 0x61, 0x4d, 0xd3, 0x46, 0x09, 0xb3, 0x3e, + 0xc3, 0xa0, 0xe3, 0x63, 0x55, 0x1b, 0xf2, 0xba, 0xef, 0xad, 0x39, + 0xe1, 0x43, 0xb9, 0x38, 0xa3, 0xe6, 0x2f, 0x8a, 0x26, 0x3b, 0xef, + 0xa0, 0x50, 0x56, 0xf9, 0xc6, 0x0a, 0xfd, 0x38, 0xcd, 0xc4, 0x0b, + 0x70, 0x51, 0x94, 0x97, 0x98, 0x04, 0xdf, 0xc3, 0x5f, 0x94, 0xd5, + 0x15, 0xc9, 0x14, 0x41, 0x9c, 0xc4, 0x5d, 0x75, 0x64, 0x15, 0x0d, + 0xff, 0x55, 0x30, 0xec, 0x86, 0x8f, 0xff, 0x0d, 0xef, 0x2c, 0xb9, + 0x63, 0x46, 0xf6, 0xaa, 0xfc, 0xdf, 0xbc, 0x69, 0xfd, 0x2e, 0x12, + 0x48, 0x64, 0x9a, 0xe0, 0x95, 0xf0, 0xa6, 0xef, 0x29, 0x8f, 0x01, + 0xb1, 0x15, 0xb5, 0x0c, 0x1d, 0xa5, 0xfe, 0x69, 0x2c, 0x69, 0x24, + 0x78, 0x1e, 0xb3, 0xa7, 0x1c, 0x71, 0x62, 0xee, 0xca, 0xc8, 0x97, + 0xac, 0x17, 0x5d, 0x8a, 0xc2, 0xf8, 0x47, 0x86, 0x6e, 0x2a, 0xc4, + 0x56, 0x31, 0x95, 0xd0, 0x67, 0x89, 0x85, 0x2b, 0xf9, 0x6c, 0xa6, + 0x5d, 0x46, 0x9d, 0x0c, 0xaa, 0x82, 0xe4, 0x99, 0x51, 0xdd, 0x70, + 0xb7, 0xdb, 0x56, 0x3d, 0x61, 0xe4, 0x6a, 0xe1, 0x5c, 0xd6, 0xf6, + 0xfe, 0x3d, 0xde, 0x41, 0xcc, 0x07, 0xae, 0x63, 0x52, 0xbf, 0x53, + 0x53, 0xf4, 0x2b, 0xe9, 0xc7, 0xfd, 0xb6, 0xf7, 0x82, 0x5f, 0x85, + 0xd2, 0x41, 0x18, 0xdb, 0x81, 0xb3, 0x04, 0x1c, 0xc5, 0x1f, 0xa4, + 0x80, 0x6f, 0x15, 0x20, 0xc9, 0xde, 0x0c, 0x88, 0x0a, 0x1d, 0xd6, + 0x66, 0x55, 0xe2, 0xfc, 0x48, 0xc9, 0x29, 0x26, 0x69, 0xe0, 0x30, + 0x82, 0x03, 0xba, 0x30, 0x82, 0x02, 0xa2, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x0b, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x86, + 0x26, 0xe6, 0x0d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x4c, 0x31, 0x20, + 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x17, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, + 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x52, 0x32, 0x31, + 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x31, 0x13, + 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0a, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x30, 0x1e, 0x17, + 0x0d, 0x30, 0x36, 0x31, 0x32, 0x31, 0x35, 0x30, 0x38, 0x30, 0x30, + 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x31, 0x31, 0x32, 0x31, 0x35, + 0x30, 0x38, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x4c, 0x31, 0x20, + 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x17, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, + 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x52, 0x32, 0x31, + 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x31, 0x13, + 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0a, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x30, 0x82, 0x01, + 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, + 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa6, 0xcf, 0x24, + 0x0e, 0xbe, 0x2e, 0x6f, 0x28, 0x99, 0x45, 0x42, 0xc4, 0xab, 0x3e, + 0x21, 0x54, 0x9b, 0x0b, 0xd3, 0x7f, 0x84, 0x70, 0xfa, 0x12, 0xb3, + 0xcb, 0xbf, 0x87, 0x5f, 0xc6, 0x7f, 0x86, 0xd3, 0xb2, 0x30, 0x5c, + 0xd6, 0xfd, 0xad, 0xf1, 0x7b, 0xdc, 0xe5, 0xf8, 0x60, 0x96, 0x09, + 0x92, 0x10, 0xf5, 0xd0, 0x53, 0xde, 0xfb, 0x7b, 0x7e, 0x73, 0x88, + 0xac, 0x52, 0x88, 0x7b, 0x4a, 0xa6, 0xca, 0x49, 0xa6, 0x5e, 0xa8, + 0xa7, 0x8c, 0x5a, 0x11, 0xbc, 0x7a, 0x82, 0xeb, 0xbe, 0x8c, 0xe9, + 0xb3, 0xac, 0x96, 0x25, 0x07, 0x97, 0x4a, 0x99, 0x2a, 0x07, 0x2f, + 0xb4, 0x1e, 0x77, 0xbf, 0x8a, 0x0f, 0xb5, 0x02, 0x7c, 0x1b, 0x96, + 0xb8, 0xc5, 0xb9, 0x3a, 0x2c, 0xbc, 0xd6, 0x12, 0xb9, 0xeb, 0x59, + 0x7d, 0xe2, 0xd0, 0x06, 0x86, 0x5f, 0x5e, 0x49, 0x6a, 0xb5, 0x39, + 0x5e, 0x88, 0x34, 0xec, 0xbc, 0x78, 0x0c, 0x08, 0x98, 0x84, 0x6c, + 0xa8, 0xcd, 0x4b, 0xb4, 0xa0, 0x7d, 0x0c, 0x79, 0x4d, 0xf0, 0xb8, + 0x2d, 0xcb, 0x21, 0xca, 0xd5, 0x6c, 0x5b, 0x7d, 0xe1, 0xa0, 0x29, + 0x84, 0xa1, 0xf9, 0xd3, 0x94, 0x49, 0xcb, 0x24, 0x62, 0x91, 0x20, + 0xbc, 0xdd, 0x0b, 0xd5, 0xd9, 0xcc, 0xf9, 0xea, 0x27, 0x0a, 0x2b, + 0x73, 0x91, 0xc6, 0x9d, 0x1b, 0xac, 0xc8, 0xcb, 0xe8, 0xe0, 0xa0, + 0xf4, 0x2f, 0x90, 0x8b, 0x4d, 0xfb, 0xb0, 0x36, 0x1b, 0xf6, 0x19, + 0x7a, 0x85, 0xe0, 0x6d, 0xf2, 0x61, 0x13, 0x88, 0x5c, 0x9f, 0xe0, + 0x93, 0x0a, 0x51, 0x97, 0x8a, 0x5a, 0xce, 0xaf, 0xab, 0xd5, 0xf7, + 0xaa, 0x09, 0xaa, 0x60, 0xbd, 0xdc, 0xd9, 0x5f, 0xdf, 0x72, 0xa9, + 0x60, 0x13, 0x5e, 0x00, 0x01, 0xc9, 0x4a, 0xfa, 0x3f, 0xa4, 0xea, + 0x07, 0x03, 0x21, 0x02, 0x8e, 0x82, 0xca, 0x03, 0xc2, 0x9b, 0x8f, + 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x9c, 0x30, 0x81, 0x99, + 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, + 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, + 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0x9b, 0xe2, 0x07, 0x57, 0x67, 0x1c, 0x1e, 0xc0, 0x6a, 0x06, 0xde, + 0x59, 0xb4, 0x9a, 0x2d, 0xdf, 0xdc, 0x19, 0x86, 0x2e, 0x30, 0x36, + 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x2f, 0x30, 0x2d, 0x30, 0x2b, + 0xa0, 0x29, 0xa0, 0x27, 0x86, 0x25, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x72, + 0x6f, 0x6f, 0x74, 0x2d, 0x72, 0x32, 0x2e, 0x63, 0x72, 0x6c, 0x30, + 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, + 0x14, 0x9b, 0xe2, 0x07, 0x57, 0x67, 0x1c, 0x1e, 0xc0, 0x6a, 0x06, + 0xde, 0x59, 0xb4, 0x9a, 0x2d, 0xdf, 0xdc, 0x19, 0x86, 0x2e, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x99, 0x81, 0x53, + 0x87, 0x1c, 0x68, 0x97, 0x86, 0x91, 0xec, 0xe0, 0x4a, 0xb8, 0x44, + 0x0b, 0xab, 0x81, 0xac, 0x27, 0x4f, 0xd6, 0xc1, 0xb8, 0x1c, 0x43, + 0x78, 0xb3, 0x0c, 0x9a, 0xfc, 0xea, 0x2c, 0x3c, 0x6e, 0x61, 0x1b, + 0x4d, 0x4b, 0x29, 0xf5, 0x9f, 0x05, 0x1d, 0x26, 0xc1, 0xb8, 0xe9, + 0x83, 0x00, 0x62, 0x45, 0xb6, 0xa9, 0x08, 0x93, 0xb9, 0xa9, 0x33, + 0x4b, 0x18, 0x9a, 0xc2, 0xf8, 0x87, 0x88, 0x4e, 0xdb, 0xdd, 0x71, + 0x34, 0x1a, 0xc1, 0x54, 0xda, 0x46, 0x3f, 0xe0, 0xd3, 0x2a, 0xab, + 0x6d, 0x54, 0x22, 0xf5, 0x3a, 0x62, 0xcd, 0x20, 0x6f, 0xba, 0x29, + 0x89, 0xd7, 0xdd, 0x91, 0xee, 0xd3, 0x5c, 0xa2, 0x3e, 0xa1, 0x5b, + 0x41, 0xf5, 0xdf, 0xe5, 0x64, 0x43, 0x2d, 0xe9, 0xd5, 0x39, 0xab, + 0xd2, 0xa2, 0xdf, 0xb7, 0x8b, 0xd0, 0xc0, 0x80, 0x19, 0x1c, 0x45, + 0xc0, 0x2d, 0x8c, 0xe8, 0xf8, 0x2d, 0xa4, 0x74, 0x56, 0x49, 0xc5, + 0x05, 0xb5, 0x4f, 0x15, 0xde, 0x6e, 0x44, 0x78, 0x39, 0x87, 0xa8, + 0x7e, 0xbb, 0xf3, 0x79, 0x18, 0x91, 0xbb, 0xf4, 0x6f, 0x9d, 0xc1, + 0xf0, 0x8c, 0x35, 0x8c, 0x5d, 0x01, 0xfb, 0xc3, 0x6d, 0xb9, 0xef, + 0x44, 0x6d, 0x79, 0x46, 0x31, 0x7e, 0x0a, 0xfe, 0xa9, 0x82, 0xc1, + 0xff, 0xef, 0xab, 0x6e, 0x20, 0xc4, 0x50, 0xc9, 0x5f, 0x9d, 0x4d, + 0x9b, 0x17, 0x8c, 0x0c, 0xe5, 0x01, 0xc9, 0xa0, 0x41, 0x6a, 0x73, + 0x53, 0xfa, 0xa5, 0x50, 0xb4, 0x6e, 0x25, 0x0f, 0xfb, 0x4c, 0x18, + 0xf4, 0xfd, 0x52, 0xd9, 0x8e, 0x69, 0xb1, 0xe8, 0x11, 0x0f, 0xde, + 0x88, 0xd8, 0xfb, 0x1d, 0x49, 0xf7, 0xaa, 0xde, 0x95, 0xcf, 0x20, + 0x78, 0xc2, 0x60, 0x12, 0xdb, 0x25, 0x40, 0x8c, 0x6a, 0xfc, 0x7e, + 0x42, 0x38, 0x40, 0x64, 0x12, 0xf7, 0x9e, 0x81, 0xe1, 0x93, 0x2e, 0x30, 0x82, 0x04, 0x1a, 0x30, 0x82, 0x03, 0x02, 0x02, 0x11, 0x00, 0x9b, 0x7e, 0x06, 0x49, 0xa3, 0x3e, 0x62, 0xb9, 0xd5, 0xee, 0x90, 0x48, 0x71, 0x29, 0xef, 0x57, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, @@ -1121,787 +444,550 @@ static const unsigned char ca_bundle_data[] = { 0x21, 0xed, 0xf8, 0x41, 0x62, 0x82, 0xb9, 0xd8, 0xb2, 0xc4, 0xbb, 0x46, 0x50, 0xf3, 0x31, 0xc5, 0x8f, 0x01, 0xa8, 0x74, 0xeb, 0xf5, 0x78, 0x27, 0xda, 0xe7, 0xf7, 0x66, 0x43, 0xf3, 0x9e, 0x83, 0x3e, - 0x20, 0xaa, 0xc3, 0x35, 0x60, 0x91, 0xce, 0x30, 0x82, 0x04, 0xd8, - 0x30, 0x82, 0x04, 0x41, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04, - 0x37, 0x4a, 0xd2, 0x43, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0xc3, - 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x55, 0x53, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x13, 0x0b, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, - 0x65, 0x74, 0x31, 0x3b, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x0b, - 0x13, 0x32, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x75, - 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x43, 0x50, 0x53, 0x20, - 0x69, 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x20, 0x62, 0x79, 0x20, - 0x72, 0x65, 0x66, 0x2e, 0x20, 0x28, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x73, 0x20, 0x6c, 0x69, 0x61, 0x62, 0x2e, 0x29, 0x31, 0x25, 0x30, - 0x23, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1c, 0x28, 0x63, 0x29, - 0x20, 0x31, 0x39, 0x39, 0x39, 0x20, 0x45, 0x6e, 0x74, 0x72, 0x75, - 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x20, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x65, 0x64, 0x31, 0x3a, 0x30, 0x38, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x13, 0x31, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, - 0x6e, 0x65, 0x74, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x43, 0x65, 0x72, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, - 0x0d, 0x39, 0x39, 0x30, 0x35, 0x32, 0x35, 0x31, 0x36, 0x30, 0x39, - 0x34, 0x30, 0x5a, 0x17, 0x0d, 0x31, 0x39, 0x30, 0x35, 0x32, 0x35, - 0x31, 0x36, 0x33, 0x39, 0x34, 0x30, 0x5a, 0x30, 0x81, 0xc3, 0x31, - 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, - 0x53, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, - 0x0b, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, - 0x74, 0x31, 0x3b, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, - 0x32, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x75, 0x73, - 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x43, 0x50, 0x53, 0x20, 0x69, - 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x20, 0x62, 0x79, 0x20, 0x72, - 0x65, 0x66, 0x2e, 0x20, 0x28, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, - 0x20, 0x6c, 0x69, 0x61, 0x62, 0x2e, 0x29, 0x31, 0x25, 0x30, 0x23, - 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1c, 0x28, 0x63, 0x29, 0x20, - 0x31, 0x39, 0x39, 0x39, 0x20, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, - 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x65, 0x64, 0x31, 0x3a, 0x30, 0x38, 0x06, 0x03, 0x55, 0x04, 0x03, - 0x13, 0x31, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, - 0x65, 0x74, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x81, 0x9d, 0x30, - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x01, 0x05, 0x00, 0x03, 0x81, 0x8b, 0x00, 0x30, 0x81, 0x87, 0x02, - 0x81, 0x81, 0x00, 0xcd, 0x28, 0x83, 0x34, 0x54, 0x1b, 0x89, 0xf3, - 0x0f, 0xaf, 0x37, 0x91, 0x31, 0xff, 0xaf, 0x31, 0x60, 0xc9, 0xa8, - 0xe8, 0xb2, 0x10, 0x68, 0xed, 0x9f, 0xe7, 0x93, 0x36, 0xf1, 0x0a, - 0x64, 0xbb, 0x47, 0xf5, 0x04, 0x17, 0x3f, 0x23, 0x47, 0x4d, 0xc5, - 0x27, 0x19, 0x81, 0x26, 0x0c, 0x54, 0x72, 0x0d, 0x88, 0x2d, 0xd9, - 0x1f, 0x9a, 0x12, 0x9f, 0xbc, 0xb3, 0x71, 0xd3, 0x80, 0x19, 0x3f, - 0x47, 0x66, 0x7b, 0x8c, 0x35, 0x28, 0xd2, 0xb9, 0x0a, 0xdf, 0x24, - 0xda, 0x9c, 0xd6, 0x50, 0x79, 0x81, 0x7a, 0x5a, 0xd3, 0x37, 0xf7, - 0xc2, 0x4a, 0xd8, 0x29, 0x92, 0x26, 0x64, 0xd1, 0xe4, 0x98, 0x6c, - 0x3a, 0x00, 0x8a, 0xf5, 0x34, 0x9b, 0x65, 0xf8, 0xed, 0xe3, 0x10, - 0xff, 0xfd, 0xb8, 0x49, 0x58, 0xdc, 0xa0, 0xde, 0x82, 0x39, 0x6b, - 0x81, 0xb1, 0x16, 0x19, 0x61, 0xb9, 0x54, 0xb6, 0xe6, 0x43, 0x02, - 0x01, 0x03, 0xa3, 0x82, 0x01, 0xd7, 0x30, 0x82, 0x01, 0xd3, 0x30, - 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, - 0x01, 0x04, 0x04, 0x03, 0x02, 0x00, 0x07, 0x30, 0x82, 0x01, 0x19, - 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x82, 0x01, 0x10, 0x30, 0x82, - 0x01, 0x0c, 0x30, 0x81, 0xde, 0xa0, 0x81, 0xdb, 0xa0, 0x81, 0xd8, - 0xa4, 0x81, 0xd5, 0x30, 0x81, 0xd2, 0x31, 0x0b, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x14, 0x30, - 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x45, 0x6e, 0x74, - 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x31, 0x3b, 0x30, - 0x39, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x32, 0x77, 0x77, 0x77, - 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, - 0x74, 0x2f, 0x43, 0x50, 0x53, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x66, 0x2e, 0x20, - 0x28, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x20, 0x6c, 0x69, 0x61, - 0x62, 0x2e, 0x29, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, - 0x0b, 0x13, 0x1c, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39, 0x39, 0x39, - 0x20, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, - 0x74, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x3a, - 0x30, 0x38, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x31, 0x45, 0x6e, - 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x20, 0x53, - 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x74, 0x79, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x13, 0x04, 0x43, 0x52, 0x4c, 0x31, 0x30, 0x29, 0xa0, 0x27, - 0xa0, 0x25, 0x86, 0x23, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x20, 0xaa, 0xc3, 0x35, 0x60, 0x91, 0xce, 0x30, 0x82, 0x04, 0x2a, + 0x30, 0x82, 0x03, 0x12, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04, + 0x38, 0x63, 0xde, 0xf8, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0xb4, + 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, + 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, + 0x31, 0x40, 0x30, 0x3e, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x14, 0x37, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, - 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x43, 0x52, 0x4c, 0x2f, 0x6e, 0x65, - 0x74, 0x31, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x2b, 0x06, 0x03, 0x55, - 0x1d, 0x10, 0x04, 0x24, 0x30, 0x22, 0x80, 0x0f, 0x31, 0x39, 0x39, - 0x39, 0x30, 0x35, 0x32, 0x35, 0x31, 0x36, 0x30, 0x39, 0x34, 0x30, - 0x5a, 0x81, 0x0f, 0x32, 0x30, 0x31, 0x39, 0x30, 0x35, 0x32, 0x35, - 0x31, 0x36, 0x30, 0x39, 0x34, 0x30, 0x5a, 0x30, 0x0b, 0x06, 0x03, - 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1f, - 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, - 0xf0, 0x17, 0x62, 0x13, 0x55, 0x3d, 0xb3, 0xff, 0x0a, 0x00, 0x6b, - 0xfb, 0x50, 0x84, 0x97, 0xf3, 0xed, 0x62, 0xd0, 0x1a, 0x30, 0x1d, - 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xf0, 0x17, - 0x62, 0x13, 0x55, 0x3d, 0xb3, 0xff, 0x0a, 0x00, 0x6b, 0xfb, 0x50, - 0x84, 0x97, 0xf3, 0xed, 0x62, 0xd0, 0x1a, 0x30, 0x0c, 0x06, 0x03, - 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, - 0x19, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf6, 0x7d, 0x07, 0x41, - 0x00, 0x04, 0x0c, 0x30, 0x0a, 0x1b, 0x04, 0x56, 0x34, 0x2e, 0x30, - 0x03, 0x02, 0x04, 0x90, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x81, 0x81, - 0x00, 0x90, 0xdc, 0x30, 0x02, 0xfa, 0x64, 0x74, 0xc2, 0xa7, 0x0a, - 0xa5, 0x7c, 0x21, 0x8d, 0x34, 0x17, 0xa8, 0xfb, 0x47, 0x0e, 0xff, - 0x25, 0x7c, 0x8d, 0x13, 0x0a, 0xfb, 0xe4, 0x98, 0xb5, 0xef, 0x8c, - 0xf8, 0xc5, 0x10, 0x0d, 0xf7, 0x92, 0xbe, 0xf1, 0xc3, 0xd5, 0xd5, - 0x95, 0x6a, 0x04, 0xbb, 0x2c, 0xce, 0x26, 0x36, 0x65, 0xc8, 0x31, - 0xc6, 0xe7, 0xee, 0x3f, 0xe3, 0x57, 0x75, 0x84, 0x7a, 0x11, 0xef, - 0x46, 0x4f, 0x18, 0xf4, 0xd3, 0x98, 0xbb, 0xa8, 0x87, 0x32, 0xba, - 0x72, 0xf6, 0x3c, 0xe2, 0x3d, 0x9f, 0xd7, 0x1d, 0xd9, 0xc3, 0x60, - 0x43, 0x8c, 0x58, 0x0e, 0x22, 0x96, 0x2f, 0x62, 0xa3, 0x2c, 0x1f, - 0xba, 0xad, 0x05, 0xef, 0xab, 0x32, 0x78, 0x87, 0xa0, 0x54, 0x73, - 0x19, 0xb5, 0x5c, 0x05, 0xf9, 0x52, 0x3e, 0x6d, 0x2d, 0x45, 0x0b, - 0xf7, 0x0a, 0x93, 0xea, 0xed, 0x06, 0xf9, 0xb2, 0x30, 0x82, 0x04, - 0x5c, 0x30, 0x82, 0x03, 0x44, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, - 0x04, 0x38, 0x63, 0xb9, 0x66, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, - 0xb4, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, - 0x0b, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, - 0x74, 0x31, 0x40, 0x30, 0x3e, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x14, - 0x37, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x75, 0x73, - 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x43, 0x50, 0x53, 0x5f, 0x32, - 0x30, 0x34, 0x38, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x66, 0x2e, 0x20, 0x28, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x73, 0x20, 0x6c, 0x69, 0x61, 0x62, 0x2e, - 0x29, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, - 0x1c, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39, 0x39, 0x39, 0x20, 0x45, - 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x20, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x33, 0x30, 0x31, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2a, 0x45, 0x6e, 0x74, 0x72, - 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x20, 0x43, 0x65, 0x72, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x28, - 0x32, 0x30, 0x34, 0x38, 0x29, 0x30, 0x1e, 0x17, 0x0d, 0x39, 0x39, - 0x31, 0x32, 0x32, 0x34, 0x31, 0x37, 0x35, 0x30, 0x35, 0x31, 0x5a, - 0x17, 0x0d, 0x31, 0x39, 0x31, 0x32, 0x32, 0x34, 0x31, 0x38, 0x32, - 0x30, 0x35, 0x31, 0x5a, 0x30, 0x81, 0xb4, 0x31, 0x14, 0x30, 0x12, - 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x45, 0x6e, 0x74, 0x72, - 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x31, 0x40, 0x30, 0x3e, - 0x06, 0x03, 0x55, 0x04, 0x0b, 0x14, 0x37, 0x77, 0x77, 0x77, 0x2e, - 0x65, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, - 0x2f, 0x43, 0x50, 0x53, 0x5f, 0x32, 0x30, 0x34, 0x38, 0x20, 0x69, - 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x20, 0x62, 0x79, 0x20, 0x72, - 0x65, 0x66, 0x2e, 0x20, 0x28, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, - 0x20, 0x6c, 0x69, 0x61, 0x62, 0x2e, 0x29, 0x31, 0x25, 0x30, 0x23, - 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1c, 0x28, 0x63, 0x29, 0x20, - 0x31, 0x39, 0x39, 0x39, 0x20, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, - 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x65, 0x64, 0x31, 0x33, 0x30, 0x31, 0x06, 0x03, 0x55, 0x04, 0x03, - 0x13, 0x2a, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, - 0x65, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x74, 0x79, 0x20, 0x28, 0x32, 0x30, 0x34, 0x38, 0x29, - 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, - 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, - 0xad, 0x4d, 0x4b, 0xa9, 0x12, 0x86, 0xb2, 0xea, 0xa3, 0x20, 0x07, - 0x15, 0x16, 0x64, 0x2a, 0x2b, 0x4b, 0xd1, 0xbf, 0x0b, 0x4a, 0x4d, - 0x8e, 0xed, 0x80, 0x76, 0xa5, 0x67, 0xb7, 0x78, 0x40, 0xc0, 0x73, - 0x42, 0xc8, 0x68, 0xc0, 0xdb, 0x53, 0x2b, 0xdd, 0x5e, 0xb8, 0x76, - 0x98, 0x35, 0x93, 0x8b, 0x1a, 0x9d, 0x7c, 0x13, 0x3a, 0x0e, 0x1f, - 0x5b, 0xb7, 0x1e, 0xcf, 0xe5, 0x24, 0x14, 0x1e, 0xb1, 0x81, 0xa9, - 0x8d, 0x7d, 0xb8, 0xcc, 0x6b, 0x4b, 0x03, 0xf1, 0x02, 0x0c, 0xdc, - 0xab, 0xa5, 0x40, 0x24, 0x00, 0x7f, 0x74, 0x94, 0xa1, 0x9d, 0x08, - 0x29, 0xb3, 0x88, 0x0b, 0xf5, 0x87, 0x77, 0x9d, 0x55, 0xcd, 0xe4, - 0xc3, 0x7e, 0xd7, 0x6a, 0x64, 0xab, 0x85, 0x14, 0x86, 0x95, 0x5b, - 0x97, 0x32, 0x50, 0x6f, 0x3d, 0xc8, 0xba, 0x66, 0x0c, 0xe3, 0xfc, - 0xbd, 0xb8, 0x49, 0xc1, 0x76, 0x89, 0x49, 0x19, 0xfd, 0xc0, 0xa8, - 0xbd, 0x89, 0xa3, 0x67, 0x2f, 0xc6, 0x9f, 0xbc, 0x71, 0x19, 0x60, - 0xb8, 0x2d, 0xe9, 0x2c, 0xc9, 0x90, 0x76, 0x66, 0x7b, 0x94, 0xe2, - 0xaf, 0x78, 0xd6, 0x65, 0x53, 0x5d, 0x3c, 0xd6, 0x9c, 0xb2, 0xcf, - 0x29, 0x03, 0xf9, 0x2f, 0xa4, 0x50, 0xb2, 0xd4, 0x48, 0xce, 0x05, - 0x32, 0x55, 0x8a, 0xfd, 0xb2, 0x64, 0x4c, 0x0e, 0xe4, 0x98, 0x07, - 0x75, 0xdb, 0x7f, 0xdf, 0xb9, 0x08, 0x55, 0x60, 0x85, 0x30, 0x29, - 0xf9, 0x7b, 0x48, 0xa4, 0x69, 0x86, 0xe3, 0x35, 0x3f, 0x1e, 0x86, - 0x5d, 0x7a, 0x7a, 0x15, 0xbd, 0xef, 0x00, 0x8e, 0x15, 0x22, 0x54, - 0x17, 0x00, 0x90, 0x26, 0x93, 0xbc, 0x0e, 0x49, 0x68, 0x91, 0xbf, - 0xf8, 0x47, 0xd3, 0x9d, 0x95, 0x42, 0xc1, 0x0e, 0x4d, 0xdf, 0x6f, - 0x26, 0xcf, 0xc3, 0x18, 0x21, 0x62, 0x66, 0x43, 0x70, 0xd6, 0xd5, - 0xc0, 0x07, 0xe1, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x74, 0x30, - 0x72, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, - 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, 0x00, 0x07, 0x30, 0x1f, - 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, - 0x55, 0xe4, 0x81, 0xd1, 0x11, 0x80, 0xbe, 0xd8, 0x89, 0xb9, 0x08, - 0xa3, 0x31, 0xf9, 0xa1, 0x24, 0x09, 0x16, 0xb9, 0x70, 0x30, 0x1d, - 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x55, 0xe4, - 0x81, 0xd1, 0x11, 0x80, 0xbe, 0xd8, 0x89, 0xb9, 0x08, 0xa3, 0x31, - 0xf9, 0xa1, 0x24, 0x09, 0x16, 0xb9, 0x70, 0x30, 0x1d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf6, 0x7d, 0x07, 0x41, 0x00, 0x04, 0x10, - 0x30, 0x0e, 0x1b, 0x08, 0x56, 0x35, 0x2e, 0x30, 0x3a, 0x34, 0x2e, - 0x30, 0x03, 0x02, 0x04, 0x90, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, - 0x01, 0x01, 0x00, 0x59, 0x47, 0xac, 0x21, 0x84, 0x8a, 0x17, 0xc9, - 0x9c, 0x89, 0x53, 0x1e, 0xba, 0x80, 0x85, 0x1a, 0xc6, 0x3c, 0x4e, - 0x3e, 0xb1, 0x9c, 0xb6, 0x7c, 0xc6, 0x92, 0x5d, 0x18, 0x64, 0x02, - 0xe3, 0xd3, 0x06, 0x08, 0x11, 0x61, 0x7c, 0x63, 0xe3, 0x2b, 0x9d, - 0x31, 0x03, 0x70, 0x76, 0xd2, 0xa3, 0x28, 0xa0, 0xf4, 0xbb, 0x9a, - 0x63, 0x73, 0xed, 0x6d, 0xe5, 0x2a, 0xdb, 0xed, 0x14, 0xa9, 0x2b, - 0xc6, 0x36, 0x11, 0xd0, 0x2b, 0xeb, 0x07, 0x8b, 0xa5, 0xda, 0x9e, - 0x5c, 0x19, 0x9d, 0x56, 0x12, 0xf5, 0x54, 0x29, 0xc8, 0x05, 0xed, - 0xb2, 0x12, 0x2a, 0x8d, 0xf4, 0x03, 0x1b, 0xff, 0xe7, 0x92, 0x10, - 0x87, 0xb0, 0x3a, 0xb5, 0xc3, 0x9d, 0x05, 0x37, 0x12, 0xa3, 0xc7, - 0xf4, 0x15, 0xb9, 0xd5, 0xa4, 0x39, 0x16, 0x9b, 0x53, 0x3a, 0x23, - 0x91, 0xf1, 0xa8, 0x82, 0xa2, 0x6a, 0x88, 0x68, 0xc1, 0x79, 0x02, - 0x22, 0xbc, 0xaa, 0xa6, 0xd6, 0xae, 0xdf, 0xb0, 0x14, 0x5f, 0xb8, - 0x87, 0xd0, 0xdd, 0x7c, 0x7f, 0x7b, 0xff, 0xaf, 0x1c, 0xcf, 0xe6, - 0xdb, 0x07, 0xad, 0x5e, 0xdb, 0x85, 0x9d, 0xd0, 0x2b, 0x0d, 0x33, - 0xdb, 0x04, 0xd1, 0xe6, 0x49, 0x40, 0x13, 0x2b, 0x76, 0xfb, 0x3e, - 0xe9, 0x9c, 0x89, 0x0f, 0x15, 0xce, 0x18, 0xb0, 0x85, 0x78, 0x21, - 0x4f, 0x6b, 0x4f, 0x0e, 0xfa, 0x36, 0x67, 0xcd, 0x07, 0xf2, 0xff, - 0x08, 0xd0, 0xe2, 0xde, 0xd9, 0xbf, 0x2a, 0xaf, 0xb8, 0x87, 0x86, - 0x21, 0x3c, 0x04, 0xca, 0xb7, 0x94, 0x68, 0x7f, 0xcf, 0x3c, 0xe9, - 0x98, 0xd7, 0x38, 0xff, 0xec, 0xc0, 0xd9, 0x50, 0xf0, 0x2e, 0x4b, - 0x58, 0xae, 0x46, 0x6f, 0xd0, 0x2e, 0xc3, 0x60, 0xda, 0x72, 0x55, - 0x72, 0xbd, 0x4c, 0x45, 0x9e, 0x61, 0xba, 0xbf, 0x84, 0x81, 0x92, - 0x03, 0xd1, 0xd2, 0x69, 0x7c, 0xc5, 0x30, 0x82, 0x03, 0x77, 0x30, - 0x82, 0x02, 0x5f, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04, 0x02, - 0x00, 0x00, 0xb9, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x5a, 0x31, 0x0b, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49, 0x45, - 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x09, - 0x42, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x6f, 0x72, 0x65, 0x31, 0x13, - 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0a, 0x43, 0x79, - 0x62, 0x65, 0x72, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x22, 0x30, - 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x19, 0x42, 0x61, 0x6c, - 0x74, 0x69, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x79, 0x62, 0x65, - 0x72, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, - 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x30, 0x30, 0x35, 0x31, 0x32, 0x31, - 0x38, 0x34, 0x36, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x35, 0x30, - 0x35, 0x31, 0x32, 0x32, 0x33, 0x35, 0x39, 0x30, 0x30, 0x5a, 0x30, - 0x5a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, - 0x02, 0x49, 0x45, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x09, 0x42, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x6f, 0x72, - 0x65, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, - 0x0a, 0x43, 0x79, 0x62, 0x65, 0x72, 0x54, 0x72, 0x75, 0x73, 0x74, - 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x19, - 0x42, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x43, - 0x79, 0x62, 0x65, 0x72, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, - 0x6f, 0x6f, 0x74, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, - 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, - 0x01, 0x01, 0x00, 0xa3, 0x04, 0xbb, 0x22, 0xab, 0x98, 0x3d, 0x57, - 0xe8, 0x26, 0x72, 0x9a, 0xb5, 0x79, 0xd4, 0x29, 0xe2, 0xe1, 0xe8, - 0x95, 0x80, 0xb1, 0xb0, 0xe3, 0x5b, 0x8e, 0x2b, 0x29, 0x9a, 0x64, - 0xdf, 0xa1, 0x5d, 0xed, 0xb0, 0x09, 0x05, 0x6d, 0xdb, 0x28, 0x2e, - 0xce, 0x62, 0xa2, 0x62, 0xfe, 0xb4, 0x88, 0xda, 0x12, 0xeb, 0x38, - 0xeb, 0x21, 0x9d, 0xc0, 0x41, 0x2b, 0x01, 0x52, 0x7b, 0x88, 0x77, - 0xd3, 0x1c, 0x8f, 0xc7, 0xba, 0xb9, 0x88, 0xb5, 0x6a, 0x09, 0xe7, - 0x73, 0xe8, 0x11, 0x40, 0xa7, 0xd1, 0xcc, 0xca, 0x62, 0x8d, 0x2d, - 0xe5, 0x8f, 0x0b, 0xa6, 0x50, 0xd2, 0xa8, 0x50, 0xc3, 0x28, 0xea, - 0xf5, 0xab, 0x25, 0x87, 0x8a, 0x9a, 0x96, 0x1c, 0xa9, 0x67, 0xb8, - 0x3f, 0x0c, 0xd5, 0xf7, 0xf9, 0x52, 0x13, 0x2f, 0xc2, 0x1b, 0xd5, - 0x70, 0x70, 0xf0, 0x8f, 0xc0, 0x12, 0xca, 0x06, 0xcb, 0x9a, 0xe1, - 0xd9, 0xca, 0x33, 0x7a, 0x77, 0xd6, 0xf8, 0xec, 0xb9, 0xf1, 0x68, - 0x44, 0x42, 0x48, 0x13, 0xd2, 0xc0, 0xc2, 0xa4, 0xae, 0x5e, 0x60, - 0xfe, 0xb6, 0xa6, 0x05, 0xfc, 0xb4, 0xdd, 0x07, 0x59, 0x02, 0xd4, - 0x59, 0x18, 0x98, 0x63, 0xf5, 0xa5, 0x63, 0xe0, 0x90, 0x0c, 0x7d, - 0x5d, 0xb2, 0x06, 0x7a, 0xf3, 0x85, 0xea, 0xeb, 0xd4, 0x03, 0xae, - 0x5e, 0x84, 0x3e, 0x5f, 0xff, 0x15, 0xed, 0x69, 0xbc, 0xf9, 0x39, - 0x36, 0x72, 0x75, 0xcf, 0x77, 0x52, 0x4d, 0xf3, 0xc9, 0x90, 0x2c, - 0xb9, 0x3d, 0xe5, 0xc9, 0x23, 0x53, 0x3f, 0x1f, 0x24, 0x98, 0x21, - 0x5c, 0x07, 0x99, 0x29, 0xbd, 0xc6, 0x3a, 0xec, 0xe7, 0x6e, 0x86, - 0x3a, 0x6b, 0x97, 0x74, 0x63, 0x33, 0xbd, 0x68, 0x18, 0x31, 0xf0, - 0x78, 0x8d, 0x76, 0xbf, 0xfc, 0x9e, 0x8e, 0x5d, 0x2a, 0x86, 0xa7, - 0x4d, 0x90, 0xdc, 0x27, 0x1a, 0x39, 0x02, 0x03, 0x01, 0x00, 0x01, - 0xa3, 0x45, 0x30, 0x43, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, - 0x04, 0x16, 0x04, 0x14, 0xe5, 0x9d, 0x59, 0x30, 0x82, 0x47, 0x58, - 0xcc, 0xac, 0xfa, 0x08, 0x54, 0x36, 0x86, 0x7b, 0x3a, 0xb5, 0x04, - 0x4d, 0xf0, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, - 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x03, + 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x43, 0x50, 0x53, 0x5f, 0x32, 0x30, + 0x34, 0x38, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x20, + 0x62, 0x79, 0x20, 0x72, 0x65, 0x66, 0x2e, 0x20, 0x28, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x73, 0x20, 0x6c, 0x69, 0x61, 0x62, 0x2e, 0x29, + 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1c, + 0x28, 0x63, 0x29, 0x20, 0x31, 0x39, 0x39, 0x39, 0x20, 0x45, 0x6e, + 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x20, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x33, 0x30, 0x31, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x13, 0x2a, 0x45, 0x6e, 0x74, 0x72, 0x75, + 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x28, 0x32, + 0x30, 0x34, 0x38, 0x29, 0x30, 0x1e, 0x17, 0x0d, 0x39, 0x39, 0x31, + 0x32, 0x32, 0x34, 0x31, 0x37, 0x35, 0x30, 0x35, 0x31, 0x5a, 0x17, + 0x0d, 0x32, 0x39, 0x30, 0x37, 0x32, 0x34, 0x31, 0x34, 0x31, 0x35, + 0x31, 0x32, 0x5a, 0x30, 0x81, 0xb4, 0x31, 0x14, 0x30, 0x12, 0x06, + 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x45, 0x6e, 0x74, 0x72, 0x75, + 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x31, 0x40, 0x30, 0x3e, 0x06, + 0x03, 0x55, 0x04, 0x0b, 0x14, 0x37, 0x77, 0x77, 0x77, 0x2e, 0x65, + 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, + 0x43, 0x50, 0x53, 0x5f, 0x32, 0x30, 0x34, 0x38, 0x20, 0x69, 0x6e, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, + 0x66, 0x2e, 0x20, 0x28, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x20, + 0x6c, 0x69, 0x61, 0x62, 0x2e, 0x29, 0x31, 0x25, 0x30, 0x23, 0x06, + 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1c, 0x28, 0x63, 0x29, 0x20, 0x31, + 0x39, 0x39, 0x39, 0x20, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, + 0x2e, 0x6e, 0x65, 0x74, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, + 0x64, 0x31, 0x33, 0x30, 0x31, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, + 0x2a, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, + 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x20, 0x28, 0x32, 0x30, 0x34, 0x38, 0x29, 0x30, + 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, + 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xad, + 0x4d, 0x4b, 0xa9, 0x12, 0x86, 0xb2, 0xea, 0xa3, 0x20, 0x07, 0x15, + 0x16, 0x64, 0x2a, 0x2b, 0x4b, 0xd1, 0xbf, 0x0b, 0x4a, 0x4d, 0x8e, + 0xed, 0x80, 0x76, 0xa5, 0x67, 0xb7, 0x78, 0x40, 0xc0, 0x73, 0x42, + 0xc8, 0x68, 0xc0, 0xdb, 0x53, 0x2b, 0xdd, 0x5e, 0xb8, 0x76, 0x98, + 0x35, 0x93, 0x8b, 0x1a, 0x9d, 0x7c, 0x13, 0x3a, 0x0e, 0x1f, 0x5b, + 0xb7, 0x1e, 0xcf, 0xe5, 0x24, 0x14, 0x1e, 0xb1, 0x81, 0xa9, 0x8d, + 0x7d, 0xb8, 0xcc, 0x6b, 0x4b, 0x03, 0xf1, 0x02, 0x0c, 0xdc, 0xab, + 0xa5, 0x40, 0x24, 0x00, 0x7f, 0x74, 0x94, 0xa1, 0x9d, 0x08, 0x29, + 0xb3, 0x88, 0x0b, 0xf5, 0x87, 0x77, 0x9d, 0x55, 0xcd, 0xe4, 0xc3, + 0x7e, 0xd7, 0x6a, 0x64, 0xab, 0x85, 0x14, 0x86, 0x95, 0x5b, 0x97, + 0x32, 0x50, 0x6f, 0x3d, 0xc8, 0xba, 0x66, 0x0c, 0xe3, 0xfc, 0xbd, + 0xb8, 0x49, 0xc1, 0x76, 0x89, 0x49, 0x19, 0xfd, 0xc0, 0xa8, 0xbd, + 0x89, 0xa3, 0x67, 0x2f, 0xc6, 0x9f, 0xbc, 0x71, 0x19, 0x60, 0xb8, + 0x2d, 0xe9, 0x2c, 0xc9, 0x90, 0x76, 0x66, 0x7b, 0x94, 0xe2, 0xaf, + 0x78, 0xd6, 0x65, 0x53, 0x5d, 0x3c, 0xd6, 0x9c, 0xb2, 0xcf, 0x29, + 0x03, 0xf9, 0x2f, 0xa4, 0x50, 0xb2, 0xd4, 0x48, 0xce, 0x05, 0x32, + 0x55, 0x8a, 0xfd, 0xb2, 0x64, 0x4c, 0x0e, 0xe4, 0x98, 0x07, 0x75, + 0xdb, 0x7f, 0xdf, 0xb9, 0x08, 0x55, 0x60, 0x85, 0x30, 0x29, 0xf9, + 0x7b, 0x48, 0xa4, 0x69, 0x86, 0xe3, 0x35, 0x3f, 0x1e, 0x86, 0x5d, + 0x7a, 0x7a, 0x15, 0xbd, 0xef, 0x00, 0x8e, 0x15, 0x22, 0x54, 0x17, + 0x00, 0x90, 0x26, 0x93, 0xbc, 0x0e, 0x49, 0x68, 0x91, 0xbf, 0xf8, + 0x47, 0xd3, 0x9d, 0x95, 0x42, 0xc1, 0x0e, 0x4d, 0xdf, 0x6f, 0x26, + 0xcf, 0xc3, 0x18, 0x21, 0x62, 0x66, 0x43, 0x70, 0xd6, 0xd5, 0xc0, + 0x07, 0xe1, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, - 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, - 0x01, 0x01, 0x00, 0x85, 0x0c, 0x5d, 0x8e, 0xe4, 0x6f, 0x51, 0x68, - 0x42, 0x05, 0xa0, 0xdd, 0xbb, 0x4f, 0x27, 0x25, 0x84, 0x03, 0xbd, - 0xf7, 0x64, 0xfd, 0x2d, 0xd7, 0x30, 0xe3, 0xa4, 0x10, 0x17, 0xeb, - 0xda, 0x29, 0x29, 0xb6, 0x79, 0x3f, 0x76, 0xf6, 0x19, 0x13, 0x23, - 0xb8, 0x10, 0x0a, 0xf9, 0x58, 0xa4, 0xd4, 0x61, 0x70, 0xbd, 0x04, - 0x61, 0x6a, 0x12, 0x8a, 0x17, 0xd5, 0x0a, 0xbd, 0xc5, 0xbc, 0x30, - 0x7c, 0xd6, 0xe9, 0x0c, 0x25, 0x8d, 0x86, 0x40, 0x4f, 0xec, 0xcc, - 0xa3, 0x7e, 0x38, 0xc6, 0x37, 0x11, 0x4f, 0xed, 0xdd, 0x68, 0x31, - 0x8e, 0x4c, 0xd2, 0xb3, 0x01, 0x74, 0xee, 0xbe, 0x75, 0x5e, 0x07, - 0x48, 0x1a, 0x7f, 0x70, 0xff, 0x16, 0x5c, 0x84, 0xc0, 0x79, 0x85, - 0xb8, 0x05, 0xfd, 0x7f, 0xbe, 0x65, 0x11, 0xa3, 0x0f, 0xc0, 0x02, - 0xb4, 0xf8, 0x52, 0x37, 0x39, 0x04, 0xd5, 0xa9, 0x31, 0x7a, 0x18, - 0xbf, 0xa0, 0x2a, 0xf4, 0x12, 0x99, 0xf7, 0xa3, 0x45, 0x82, 0xe3, - 0x3c, 0x5e, 0xf5, 0x9d, 0x9e, 0xb5, 0xc8, 0x9e, 0x7c, 0x2e, 0xc8, - 0xa4, 0x9e, 0x4e, 0x08, 0x14, 0x4b, 0x6d, 0xfd, 0x70, 0x6d, 0x6b, - 0x1a, 0x63, 0xbd, 0x64, 0xe6, 0x1f, 0xb7, 0xce, 0xf0, 0xf2, 0x9f, - 0x2e, 0xbb, 0x1b, 0xb7, 0xf2, 0x50, 0x88, 0x73, 0x92, 0xc2, 0xe2, - 0xe3, 0x16, 0x8d, 0x9a, 0x32, 0x02, 0xab, 0x8e, 0x18, 0xdd, 0xe9, - 0x10, 0x11, 0xee, 0x7e, 0x35, 0xab, 0x90, 0xaf, 0x3e, 0x30, 0x94, - 0x7a, 0xd0, 0x33, 0x3d, 0xa7, 0x65, 0x0f, 0xf5, 0xfc, 0x8e, 0x9e, - 0x62, 0xcf, 0x47, 0x44, 0x2c, 0x01, 0x5d, 0xbb, 0x1d, 0xb5, 0x32, - 0xd2, 0x47, 0xd2, 0x38, 0x2e, 0xd0, 0xfe, 0x81, 0xdc, 0x32, 0x6a, - 0x1e, 0xb5, 0xee, 0x3c, 0xd5, 0xfc, 0xe7, 0x81, 0x1d, 0x19, 0xc3, - 0x24, 0x42, 0xea, 0x63, 0x39, 0xa9, 0x30, 0x82, 0x02, 0x90, 0x30, - 0x82, 0x01, 0xf9, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, + 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, + 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0x55, 0xe4, 0x81, 0xd1, 0x11, 0x80, 0xbe, 0xd8, 0x89, 0xb9, 0x08, + 0xa3, 0x31, 0xf9, 0xa1, 0x24, 0x09, 0x16, 0xb9, 0x70, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x3b, 0x9b, 0x8f, 0x56, + 0x9b, 0x30, 0xe7, 0x53, 0x99, 0x7c, 0x7a, 0x79, 0xa7, 0x4d, 0x97, + 0xd7, 0x19, 0x95, 0x90, 0xfb, 0x06, 0x1f, 0xca, 0x33, 0x7c, 0x46, + 0x63, 0x8f, 0x96, 0x66, 0x24, 0xfa, 0x40, 0x1b, 0x21, 0x27, 0xca, + 0xe6, 0x72, 0x73, 0xf2, 0x4f, 0xfe, 0x31, 0x99, 0xfd, 0xc8, 0x0c, + 0x4c, 0x68, 0x53, 0xc6, 0x80, 0x82, 0x13, 0x98, 0xfa, 0xb6, 0xad, + 0xda, 0x5d, 0x3d, 0xf1, 0xce, 0x6e, 0xf6, 0x15, 0x11, 0x94, 0x82, + 0x0c, 0xee, 0x3f, 0x95, 0xaf, 0x11, 0xab, 0x0f, 0xd7, 0x2f, 0xde, + 0x1f, 0x03, 0x8f, 0x57, 0x2c, 0x1e, 0xc9, 0xbb, 0x9a, 0x1a, 0x44, + 0x95, 0xeb, 0x18, 0x4f, 0xa6, 0x1f, 0xcd, 0x7d, 0x57, 0x10, 0x2f, + 0x9b, 0x04, 0x09, 0x5a, 0x84, 0xb5, 0x6e, 0xd8, 0x1d, 0x3a, 0xe1, + 0xd6, 0x9e, 0xd1, 0x6c, 0x79, 0x5e, 0x79, 0x1c, 0x14, 0xc5, 0xe3, + 0xd0, 0x4c, 0x93, 0x3b, 0x65, 0x3c, 0xed, 0xdf, 0x3d, 0xbe, 0xa6, + 0xe5, 0x95, 0x1a, 0xc3, 0xb5, 0x19, 0xc3, 0xbd, 0x5e, 0x5b, 0xbb, + 0xff, 0x23, 0xef, 0x68, 0x19, 0xcb, 0x12, 0x93, 0x27, 0x5c, 0x03, + 0x2d, 0x6f, 0x30, 0xd0, 0x1e, 0xb6, 0x1a, 0xac, 0xde, 0x5a, 0xf7, + 0xd1, 0xaa, 0xa8, 0x27, 0xa6, 0xfe, 0x79, 0x81, 0xc4, 0x79, 0x99, + 0x33, 0x57, 0xba, 0x12, 0xb0, 0xa9, 0xe0, 0x42, 0x6c, 0x93, 0xca, + 0x56, 0xde, 0xfe, 0x6d, 0x84, 0x0b, 0x08, 0x8b, 0x7e, 0x8d, 0xea, + 0xd7, 0x98, 0x21, 0xc6, 0xf3, 0xe7, 0x3c, 0x79, 0x2f, 0x5e, 0x9c, + 0xd1, 0x4c, 0x15, 0x8d, 0xe1, 0xec, 0x22, 0x37, 0xcc, 0x9a, 0x43, + 0x0b, 0x97, 0xdc, 0x80, 0x90, 0x8d, 0xb3, 0x67, 0x9b, 0x6f, 0x48, + 0x08, 0x15, 0x56, 0xcf, 0xbf, 0xf1, 0x2b, 0x7c, 0x5e, 0x9a, 0x76, + 0xe9, 0x59, 0x90, 0xc5, 0x7c, 0x83, 0x35, 0x11, 0x65, 0x51, 0x30, + 0x82, 0x03, 0x77, 0x30, 0x82, 0x02, 0x5f, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x04, 0x02, 0x00, 0x00, 0xb9, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, + 0x30, 0x5a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x49, 0x45, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x13, 0x09, 0x42, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x6f, + 0x72, 0x65, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0b, + 0x13, 0x0a, 0x43, 0x79, 0x62, 0x65, 0x72, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, + 0x19, 0x42, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x6f, 0x72, 0x65, 0x20, + 0x43, 0x79, 0x62, 0x65, 0x72, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, + 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x30, 0x30, + 0x35, 0x31, 0x32, 0x31, 0x38, 0x34, 0x36, 0x30, 0x30, 0x5a, 0x17, + 0x0d, 0x32, 0x35, 0x30, 0x35, 0x31, 0x32, 0x32, 0x33, 0x35, 0x39, + 0x30, 0x30, 0x5a, 0x30, 0x5a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x49, 0x45, 0x31, 0x12, 0x30, 0x10, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x09, 0x42, 0x61, 0x6c, 0x74, + 0x69, 0x6d, 0x6f, 0x72, 0x65, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, + 0x55, 0x04, 0x0b, 0x13, 0x0a, 0x43, 0x79, 0x62, 0x65, 0x72, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x19, 0x42, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x6f, + 0x72, 0x65, 0x20, 0x43, 0x79, 0x62, 0x65, 0x72, 0x54, 0x72, 0x75, + 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x04, 0x05, 0x00, 0x30, 0x5a, 0x31, 0x0b, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x1c, 0x30, - 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x13, 0x45, 0x71, 0x75, - 0x69, 0x66, 0x61, 0x78, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, - 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x2d, 0x30, 0x2b, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x13, 0x24, 0x45, 0x71, 0x75, 0x69, 0x66, 0x61, - 0x78, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x65, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x20, 0x43, 0x41, 0x2d, 0x31, 0x30, 0x1e, 0x17, - 0x0d, 0x39, 0x39, 0x30, 0x36, 0x32, 0x31, 0x30, 0x34, 0x30, 0x30, - 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x30, 0x30, 0x36, 0x32, 0x31, - 0x30, 0x34, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x5a, 0x31, 0x0b, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, - 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x13, - 0x45, 0x71, 0x75, 0x69, 0x66, 0x61, 0x78, 0x20, 0x53, 0x65, 0x63, - 0x75, 0x72, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x2d, 0x30, - 0x2b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x24, 0x45, 0x71, 0x75, - 0x69, 0x66, 0x61, 0x78, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, - 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x65, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x43, 0x41, 0x2d, 0x31, - 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, - 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xba, 0xe7, 0x17, 0x90, - 0x02, 0x65, 0xb1, 0x34, 0x55, 0x3c, 0x49, 0xc2, 0x51, 0xd5, 0xdf, - 0xa7, 0xd1, 0x37, 0x8f, 0xd1, 0xe7, 0x81, 0x73, 0x41, 0x52, 0x60, - 0x9b, 0x9d, 0xa1, 0x17, 0x26, 0x78, 0xad, 0xc7, 0xb1, 0xe8, 0x26, - 0x94, 0x32, 0xb5, 0xde, 0x33, 0x8d, 0x3a, 0x2f, 0xdb, 0xf2, 0x9a, - 0x7a, 0x5a, 0x73, 0x98, 0xa3, 0x5c, 0xe9, 0xfb, 0x8a, 0x73, 0x1b, - 0x5c, 0xe7, 0xc3, 0xbf, 0x80, 0x6c, 0xcd, 0xa9, 0xf4, 0xd6, 0x2b, - 0xc0, 0xf7, 0xf9, 0x99, 0xaa, 0x63, 0xa2, 0xb1, 0x47, 0x02, 0x0f, - 0xd4, 0xe4, 0x51, 0x3a, 0x12, 0x3c, 0x6c, 0x8a, 0x5a, 0x54, 0x84, - 0x70, 0xdb, 0xc1, 0xc5, 0x90, 0xcf, 0x72, 0x45, 0xcb, 0xa8, 0x59, - 0xc0, 0xcd, 0x33, 0x9d, 0x3f, 0xa3, 0x96, 0xeb, 0x85, 0x33, 0x21, - 0x1c, 0x3e, 0x1e, 0x3e, 0x60, 0x6e, 0x76, 0x9c, 0x67, 0x85, 0xc5, - 0xc8, 0xc3, 0x61, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x66, 0x30, - 0x64, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, - 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, 0x00, 0x07, 0x30, 0x0f, - 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, - 0x03, 0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, - 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xbe, 0xa8, 0xa0, 0x74, 0x72, - 0x50, 0x6b, 0x44, 0xb7, 0xc9, 0x23, 0xd8, 0xfb, 0xa8, 0xff, 0xb3, - 0x57, 0x6b, 0x68, 0x6c, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, - 0x04, 0x16, 0x04, 0x14, 0xbe, 0xa8, 0xa0, 0x74, 0x72, 0x50, 0x6b, - 0x44, 0xb7, 0xc9, 0x23, 0xd8, 0xfb, 0xa8, 0xff, 0xb3, 0x57, 0x6b, - 0x68, 0x6c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x04, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x30, - 0xe2, 0x01, 0x51, 0xaa, 0xc7, 0xea, 0x5f, 0xda, 0xb9, 0xd0, 0x65, - 0x0f, 0x30, 0xd6, 0x3e, 0xda, 0x0d, 0x14, 0x49, 0x6e, 0x91, 0x93, - 0x27, 0x14, 0x31, 0xef, 0xc4, 0xf7, 0x2d, 0x45, 0xf8, 0xec, 0xc7, - 0xbf, 0xa2, 0x41, 0x0d, 0x23, 0xb4, 0x92, 0xf9, 0x19, 0x00, 0x67, - 0xbd, 0x01, 0xaf, 0xcd, 0xe0, 0x71, 0xfc, 0x5a, 0xcf, 0x64, 0xc4, - 0xe0, 0x96, 0x98, 0xd0, 0xa3, 0x40, 0xe2, 0x01, 0x8a, 0xef, 0x27, - 0x07, 0xf1, 0x65, 0x01, 0x8a, 0x44, 0x2d, 0x06, 0x65, 0x75, 0x52, - 0xc0, 0x86, 0x10, 0x20, 0x21, 0x5f, 0x6c, 0x6b, 0x0f, 0x6c, 0xae, - 0x09, 0x1c, 0xaf, 0xf2, 0xa2, 0x18, 0x34, 0xc4, 0x75, 0xa4, 0x73, - 0x1c, 0xf1, 0x8d, 0xdc, 0xef, 0xad, 0xf9, 0xb3, 0x76, 0xb4, 0x92, - 0xbf, 0xdc, 0x95, 0x10, 0x1e, 0xbe, 0xcb, 0xc8, 0x3b, 0x5a, 0x84, - 0x60, 0x19, 0x56, 0x94, 0xa9, 0x55, 0x30, 0x82, 0x02, 0x82, 0x30, - 0x82, 0x01, 0xeb, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x04, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x04, 0x05, 0x00, 0x30, 0x53, 0x31, 0x0b, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x1c, 0x30, - 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x13, 0x45, 0x71, 0x75, - 0x69, 0x66, 0x61, 0x78, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, - 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x26, 0x30, 0x24, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x13, 0x1d, 0x45, 0x71, 0x75, 0x69, 0x66, 0x61, - 0x78, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x65, 0x42, + 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, + 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa3, 0x04, 0xbb, 0x22, + 0xab, 0x98, 0x3d, 0x57, 0xe8, 0x26, 0x72, 0x9a, 0xb5, 0x79, 0xd4, + 0x29, 0xe2, 0xe1, 0xe8, 0x95, 0x80, 0xb1, 0xb0, 0xe3, 0x5b, 0x8e, + 0x2b, 0x29, 0x9a, 0x64, 0xdf, 0xa1, 0x5d, 0xed, 0xb0, 0x09, 0x05, + 0x6d, 0xdb, 0x28, 0x2e, 0xce, 0x62, 0xa2, 0x62, 0xfe, 0xb4, 0x88, + 0xda, 0x12, 0xeb, 0x38, 0xeb, 0x21, 0x9d, 0xc0, 0x41, 0x2b, 0x01, + 0x52, 0x7b, 0x88, 0x77, 0xd3, 0x1c, 0x8f, 0xc7, 0xba, 0xb9, 0x88, + 0xb5, 0x6a, 0x09, 0xe7, 0x73, 0xe8, 0x11, 0x40, 0xa7, 0xd1, 0xcc, + 0xca, 0x62, 0x8d, 0x2d, 0xe5, 0x8f, 0x0b, 0xa6, 0x50, 0xd2, 0xa8, + 0x50, 0xc3, 0x28, 0xea, 0xf5, 0xab, 0x25, 0x87, 0x8a, 0x9a, 0x96, + 0x1c, 0xa9, 0x67, 0xb8, 0x3f, 0x0c, 0xd5, 0xf7, 0xf9, 0x52, 0x13, + 0x2f, 0xc2, 0x1b, 0xd5, 0x70, 0x70, 0xf0, 0x8f, 0xc0, 0x12, 0xca, + 0x06, 0xcb, 0x9a, 0xe1, 0xd9, 0xca, 0x33, 0x7a, 0x77, 0xd6, 0xf8, + 0xec, 0xb9, 0xf1, 0x68, 0x44, 0x42, 0x48, 0x13, 0xd2, 0xc0, 0xc2, + 0xa4, 0xae, 0x5e, 0x60, 0xfe, 0xb6, 0xa6, 0x05, 0xfc, 0xb4, 0xdd, + 0x07, 0x59, 0x02, 0xd4, 0x59, 0x18, 0x98, 0x63, 0xf5, 0xa5, 0x63, + 0xe0, 0x90, 0x0c, 0x7d, 0x5d, 0xb2, 0x06, 0x7a, 0xf3, 0x85, 0xea, + 0xeb, 0xd4, 0x03, 0xae, 0x5e, 0x84, 0x3e, 0x5f, 0xff, 0x15, 0xed, + 0x69, 0xbc, 0xf9, 0x39, 0x36, 0x72, 0x75, 0xcf, 0x77, 0x52, 0x4d, + 0xf3, 0xc9, 0x90, 0x2c, 0xb9, 0x3d, 0xe5, 0xc9, 0x23, 0x53, 0x3f, + 0x1f, 0x24, 0x98, 0x21, 0x5c, 0x07, 0x99, 0x29, 0xbd, 0xc6, 0x3a, + 0xec, 0xe7, 0x6e, 0x86, 0x3a, 0x6b, 0x97, 0x74, 0x63, 0x33, 0xbd, + 0x68, 0x18, 0x31, 0xf0, 0x78, 0x8d, 0x76, 0xbf, 0xfc, 0x9e, 0x8e, + 0x5d, 0x2a, 0x86, 0xa7, 0x4d, 0x90, 0xdc, 0x27, 0x1a, 0x39, 0x02, + 0x03, 0x01, 0x00, 0x01, 0xa3, 0x45, 0x30, 0x43, 0x30, 0x1d, 0x06, + 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xe5, 0x9d, 0x59, + 0x30, 0x82, 0x47, 0x58, 0xcc, 0xac, 0xfa, 0x08, 0x54, 0x36, 0x86, + 0x7b, 0x3a, 0xb5, 0x04, 0x4d, 0xf0, 0x30, 0x12, 0x06, 0x03, 0x55, + 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, + 0xff, 0x02, 0x01, 0x03, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, + 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x85, 0x0c, 0x5d, 0x8e, + 0xe4, 0x6f, 0x51, 0x68, 0x42, 0x05, 0xa0, 0xdd, 0xbb, 0x4f, 0x27, + 0x25, 0x84, 0x03, 0xbd, 0xf7, 0x64, 0xfd, 0x2d, 0xd7, 0x30, 0xe3, + 0xa4, 0x10, 0x17, 0xeb, 0xda, 0x29, 0x29, 0xb6, 0x79, 0x3f, 0x76, + 0xf6, 0x19, 0x13, 0x23, 0xb8, 0x10, 0x0a, 0xf9, 0x58, 0xa4, 0xd4, + 0x61, 0x70, 0xbd, 0x04, 0x61, 0x6a, 0x12, 0x8a, 0x17, 0xd5, 0x0a, + 0xbd, 0xc5, 0xbc, 0x30, 0x7c, 0xd6, 0xe9, 0x0c, 0x25, 0x8d, 0x86, + 0x40, 0x4f, 0xec, 0xcc, 0xa3, 0x7e, 0x38, 0xc6, 0x37, 0x11, 0x4f, + 0xed, 0xdd, 0x68, 0x31, 0x8e, 0x4c, 0xd2, 0xb3, 0x01, 0x74, 0xee, + 0xbe, 0x75, 0x5e, 0x07, 0x48, 0x1a, 0x7f, 0x70, 0xff, 0x16, 0x5c, + 0x84, 0xc0, 0x79, 0x85, 0xb8, 0x05, 0xfd, 0x7f, 0xbe, 0x65, 0x11, + 0xa3, 0x0f, 0xc0, 0x02, 0xb4, 0xf8, 0x52, 0x37, 0x39, 0x04, 0xd5, + 0xa9, 0x31, 0x7a, 0x18, 0xbf, 0xa0, 0x2a, 0xf4, 0x12, 0x99, 0xf7, + 0xa3, 0x45, 0x82, 0xe3, 0x3c, 0x5e, 0xf5, 0x9d, 0x9e, 0xb5, 0xc8, + 0x9e, 0x7c, 0x2e, 0xc8, 0xa4, 0x9e, 0x4e, 0x08, 0x14, 0x4b, 0x6d, + 0xfd, 0x70, 0x6d, 0x6b, 0x1a, 0x63, 0xbd, 0x64, 0xe6, 0x1f, 0xb7, + 0xce, 0xf0, 0xf2, 0x9f, 0x2e, 0xbb, 0x1b, 0xb7, 0xf2, 0x50, 0x88, + 0x73, 0x92, 0xc2, 0xe2, 0xe3, 0x16, 0x8d, 0x9a, 0x32, 0x02, 0xab, + 0x8e, 0x18, 0xdd, 0xe9, 0x10, 0x11, 0xee, 0x7e, 0x35, 0xab, 0x90, + 0xaf, 0x3e, 0x30, 0x94, 0x7a, 0xd0, 0x33, 0x3d, 0xa7, 0x65, 0x0f, + 0xf5, 0xfc, 0x8e, 0x9e, 0x62, 0xcf, 0x47, 0x44, 0x2c, 0x01, 0x5d, + 0xbb, 0x1d, 0xb5, 0x32, 0xd2, 0x47, 0xd2, 0x38, 0x2e, 0xd0, 0xfe, + 0x81, 0xdc, 0x32, 0x6a, 0x1e, 0xb5, 0xee, 0x3c, 0xd5, 0xfc, 0xe7, + 0x81, 0x1d, 0x19, 0xc3, 0x24, 0x42, 0xea, 0x63, 0x39, 0xa9, 0x30, + 0x82, 0x02, 0x90, 0x30, 0x82, 0x01, 0xf9, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x04, 0x05, 0x00, 0x30, 0x5a, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, + 0x53, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x13, 0x45, 0x71, 0x75, 0x69, 0x66, 0x61, 0x78, 0x20, 0x53, 0x65, + 0x63, 0x75, 0x72, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x2d, + 0x30, 0x2b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x24, 0x45, 0x71, + 0x75, 0x69, 0x66, 0x61, 0x78, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x65, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x65, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x43, 0x41, 0x2d, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x39, 0x39, 0x30, 0x36, 0x32, 0x31, 0x30, 0x34, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x30, 0x30, 0x36, 0x32, 0x31, 0x30, 0x34, 0x30, 0x30, 0x30, 0x30, 0x5a, - 0x30, 0x53, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x30, 0x5a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x13, 0x45, 0x71, 0x75, 0x69, 0x66, 0x61, 0x78, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x49, 0x6e, 0x63, - 0x2e, 0x31, 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, - 0x1d, 0x45, 0x71, 0x75, 0x69, 0x66, 0x61, 0x78, 0x20, 0x53, 0x65, - 0x63, 0x75, 0x72, 0x65, 0x20, 0x65, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x20, 0x43, 0x41, 0x2d, 0x31, 0x30, 0x81, 0x9f, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, - 0x02, 0x81, 0x81, 0x00, 0xce, 0x2f, 0x19, 0xbc, 0x17, 0xb7, 0x77, - 0xde, 0x93, 0xa9, 0x5f, 0x5a, 0x0d, 0x17, 0x4f, 0x34, 0x1a, 0x0c, - 0x98, 0xf4, 0x22, 0xd9, 0x59, 0xd4, 0xc4, 0x68, 0x46, 0xf0, 0xb4, - 0x35, 0xc5, 0x85, 0x03, 0x20, 0xc6, 0xaf, 0x45, 0xa5, 0x21, 0x51, - 0x45, 0x41, 0xeb, 0x16, 0x58, 0x36, 0x32, 0x6f, 0xe2, 0x50, 0x62, - 0x64, 0xf9, 0xfd, 0x51, 0x9c, 0xaa, 0x24, 0xd9, 0xf4, 0x9d, 0x83, - 0x2a, 0x87, 0x0a, 0x21, 0xd3, 0x12, 0x38, 0x34, 0x6c, 0x8d, 0x00, - 0x6e, 0x5a, 0xa0, 0xd9, 0x42, 0xee, 0x1a, 0x21, 0x95, 0xf9, 0x52, - 0x4c, 0x55, 0x5a, 0xc5, 0x0f, 0x38, 0x4f, 0x46, 0xfa, 0x6d, 0xf8, - 0x2e, 0x35, 0xd6, 0x1d, 0x7c, 0xeb, 0xe2, 0xf0, 0xb0, 0x75, 0x80, - 0xc8, 0xa9, 0x13, 0xac, 0xbe, 0x88, 0xef, 0x3a, 0x6e, 0xab, 0x5f, - 0x2a, 0x38, 0x62, 0x02, 0xb0, 0x12, 0x7b, 0xfe, 0x8f, 0xa6, 0x03, - 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x66, 0x30, 0x64, 0x30, 0x11, - 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x01, - 0x04, 0x04, 0x03, 0x02, 0x00, 0x07, 0x30, 0x0f, 0x06, 0x03, 0x55, - 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, - 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, - 0x16, 0x80, 0x14, 0x4a, 0x78, 0x32, 0x52, 0x11, 0xdb, 0x59, 0x16, - 0x36, 0x5e, 0xdf, 0xc1, 0x14, 0x36, 0x40, 0x6a, 0x47, 0x7c, 0x4c, - 0xa1, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, - 0x14, 0x4a, 0x78, 0x32, 0x52, 0x11, 0xdb, 0x59, 0x16, 0x36, 0x5e, - 0xdf, 0xc1, 0x14, 0x36, 0x40, 0x6a, 0x47, 0x7c, 0x4c, 0xa1, 0x30, - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x04, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x75, 0x5b, 0xa8, 0x9b, - 0x03, 0x11, 0xe6, 0xe9, 0x56, 0x4c, 0xcd, 0xf9, 0xa9, 0x4c, 0xc0, - 0x0d, 0x9a, 0xf3, 0xcc, 0x65, 0x69, 0xe6, 0x25, 0x76, 0xcc, 0x59, - 0xb7, 0xd6, 0x54, 0xc3, 0x1d, 0xcd, 0x99, 0xac, 0x19, 0xdd, 0xb4, - 0x85, 0xd5, 0xe0, 0x3d, 0xfc, 0x62, 0x20, 0xa7, 0x84, 0x4b, 0x58, - 0x65, 0xf1, 0xe2, 0xf9, 0x95, 0x21, 0x3f, 0xf5, 0xd4, 0x7e, 0x58, - 0x1e, 0x47, 0x87, 0x54, 0x3e, 0x58, 0xa1, 0xb5, 0xb5, 0xf8, 0x2a, - 0xef, 0x71, 0xe7, 0xbc, 0xc3, 0xf6, 0xb1, 0x49, 0x46, 0xe2, 0xd7, - 0xa0, 0x6b, 0xe5, 0x56, 0x7a, 0x9a, 0x27, 0x98, 0x7c, 0x46, 0x62, - 0x14, 0xe7, 0xc9, 0xfc, 0x6e, 0x03, 0x12, 0x79, 0x80, 0x38, 0x1d, - 0x48, 0x82, 0x8d, 0xfc, 0x17, 0xfe, 0x2a, 0x96, 0x2b, 0xb5, 0x62, - 0xa6, 0xa6, 0x3d, 0xbd, 0x7f, 0x92, 0x59, 0xcd, 0x5a, 0x2a, 0x82, - 0xb2, 0x37, 0x79, 0x30, 0x82, 0x03, 0x20, 0x30, 0x82, 0x02, 0x89, - 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04, 0x37, 0x70, 0xcf, 0xb5, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x05, 0x05, 0x00, 0x30, 0x4e, 0x31, 0x0b, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, - 0x15, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0e, 0x45, 0x71, 0x75, - 0x69, 0x66, 0x61, 0x78, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, - 0x31, 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1d, - 0x45, 0x71, 0x75, 0x69, 0x66, 0x61, 0x78, 0x20, 0x53, 0x65, 0x63, - 0x75, 0x72, 0x65, 0x20, 0x65, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x20, 0x43, 0x41, 0x2d, 0x32, 0x30, 0x1e, 0x17, 0x0d, - 0x39, 0x39, 0x30, 0x36, 0x32, 0x33, 0x31, 0x32, 0x31, 0x34, 0x34, - 0x35, 0x5a, 0x17, 0x0d, 0x31, 0x39, 0x30, 0x36, 0x32, 0x33, 0x31, - 0x32, 0x31, 0x34, 0x34, 0x35, 0x5a, 0x30, 0x4e, 0x31, 0x0b, 0x30, - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, - 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0e, 0x45, - 0x71, 0x75, 0x69, 0x66, 0x61, 0x78, 0x20, 0x53, 0x65, 0x63, 0x75, - 0x72, 0x65, 0x31, 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x0b, - 0x13, 0x1d, 0x45, 0x71, 0x75, 0x69, 0x66, 0x61, 0x78, 0x20, 0x53, - 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x65, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x20, 0x43, 0x41, 0x2d, 0x32, 0x30, 0x81, - 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, - 0x89, 0x02, 0x81, 0x81, 0x00, 0xe4, 0x39, 0x39, 0x93, 0x1e, 0x52, - 0x06, 0x1b, 0x28, 0x36, 0xf8, 0xb2, 0xa3, 0x29, 0xc5, 0xed, 0x8e, - 0xb2, 0x11, 0xbd, 0xfe, 0xeb, 0xe7, 0xb4, 0x74, 0xc2, 0x8f, 0xff, - 0x05, 0xe7, 0xd9, 0x9d, 0x06, 0xbf, 0x12, 0xc8, 0x3f, 0x0e, 0xf2, - 0xd6, 0xd1, 0x24, 0xb2, 0x11, 0xde, 0xd1, 0x73, 0x09, 0x8a, 0xd4, - 0xb1, 0x2c, 0x98, 0x09, 0x0d, 0x1e, 0x50, 0x46, 0xb2, 0x83, 0xa6, - 0x45, 0x8d, 0x62, 0x68, 0xbb, 0x85, 0x1b, 0x20, 0x70, 0x32, 0xaa, - 0x40, 0xcd, 0xa6, 0x96, 0x5f, 0xc4, 0x71, 0x37, 0x3f, 0x04, 0xf3, - 0xb7, 0x41, 0x24, 0x39, 0x07, 0x1a, 0x1e, 0x2e, 0x61, 0x58, 0xa0, - 0x12, 0x0b, 0xe5, 0xa5, 0xdf, 0xc5, 0xab, 0xea, 0x37, 0x71, 0xcc, - 0x1c, 0xc8, 0x37, 0x3a, 0xb9, 0x97, 0x52, 0xa7, 0xac, 0xc5, 0x6a, - 0x24, 0x94, 0x4e, 0x9c, 0x7b, 0xcf, 0xc0, 0x6a, 0xd6, 0xdf, 0x21, - 0xbd, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x09, 0x30, - 0x82, 0x01, 0x05, 0x30, 0x70, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, - 0x69, 0x30, 0x67, 0x30, 0x65, 0xa0, 0x63, 0xa0, 0x61, 0xa4, 0x5f, - 0x30, 0x5d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x13, 0x0e, 0x45, 0x71, 0x75, 0x69, 0x66, 0x61, 0x78, - 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x31, 0x26, 0x30, 0x24, - 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1d, 0x45, 0x71, 0x75, 0x69, - 0x66, 0x61, 0x78, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, - 0x65, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x43, - 0x41, 0x2d, 0x32, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x13, 0x04, 0x43, 0x52, 0x4c, 0x31, 0x30, 0x1a, 0x06, 0x03, - 0x55, 0x1d, 0x10, 0x04, 0x13, 0x30, 0x11, 0x81, 0x0f, 0x32, 0x30, - 0x31, 0x39, 0x30, 0x36, 0x32, 0x33, 0x31, 0x32, 0x31, 0x34, 0x34, - 0x35, 0x5a, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, - 0x03, 0x02, 0x01, 0x06, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, - 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x50, 0x9e, 0x0b, 0xea, 0xaf, - 0x5e, 0xb9, 0x20, 0x48, 0xa6, 0x50, 0x6a, 0xcb, 0xfd, 0xd8, 0x20, - 0x7a, 0xa7, 0x82, 0x76, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, - 0x04, 0x16, 0x04, 0x14, 0x50, 0x9e, 0x0b, 0xea, 0xaf, 0x5e, 0xb9, - 0x20, 0x48, 0xa6, 0x50, 0x6a, 0xcb, 0xfd, 0xd8, 0x20, 0x7a, 0xa7, - 0x82, 0x76, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, - 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1a, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf6, 0x7d, 0x07, 0x41, 0x00, 0x04, 0x0d, 0x30, 0x0b, - 0x1b, 0x05, 0x56, 0x33, 0x2e, 0x30, 0x63, 0x03, 0x02, 0x06, 0xc0, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x05, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x0c, 0x86, 0x82, - 0xad, 0xe8, 0x4e, 0x1a, 0xf5, 0x8e, 0x89, 0x27, 0xe2, 0x35, 0x58, - 0x3d, 0x29, 0xb4, 0x07, 0x8f, 0x36, 0x50, 0x95, 0xbf, 0x6e, 0xc1, - 0x9e, 0xeb, 0xc4, 0x90, 0xb2, 0x85, 0xa8, 0xbb, 0xb7, 0x42, 0xe0, - 0x0f, 0x07, 0x39, 0xdf, 0xfb, 0x9e, 0x90, 0xb2, 0xd1, 0xc1, 0x3e, - 0x53, 0x9f, 0x03, 0x44, 0xb0, 0x7e, 0x4b, 0xf4, 0x6f, 0xe4, 0x7c, - 0x1f, 0xe7, 0xe2, 0xb1, 0xe4, 0xb8, 0x9a, 0xef, 0xc3, 0xbd, 0xce, - 0xde, 0x0b, 0x32, 0x34, 0xd9, 0xde, 0x28, 0xed, 0x33, 0x6b, 0xc4, - 0xd4, 0xd7, 0x3d, 0x12, 0x58, 0xab, 0x7d, 0x09, 0x2d, 0xcb, 0x70, - 0xf5, 0x13, 0x8a, 0x94, 0xa1, 0x27, 0xa4, 0xd6, 0x70, 0xc5, 0x6d, - 0x94, 0xb5, 0xc9, 0x7d, 0x9d, 0xa0, 0xd2, 0xc6, 0x08, 0x49, 0xd9, - 0x66, 0x9b, 0xa6, 0xd3, 0xf4, 0x0b, 0xdc, 0xc5, 0x26, 0x57, 0xe1, - 0x91, 0x30, 0xea, 0xcd, 0x30, 0x82, 0x04, 0x18, 0x30, 0x82, 0x03, - 0x00, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, - 0x05, 0x00, 0x30, 0x65, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x53, 0x45, 0x31, 0x14, 0x30, 0x12, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x41, 0x64, 0x64, 0x54, 0x72, - 0x75, 0x73, 0x74, 0x20, 0x41, 0x42, 0x31, 0x1d, 0x30, 0x1b, 0x06, - 0x03, 0x55, 0x04, 0x0b, 0x13, 0x14, 0x41, 0x64, 0x64, 0x54, 0x72, - 0x75, 0x73, 0x74, 0x20, 0x54, 0x54, 0x50, 0x20, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, - 0x04, 0x03, 0x13, 0x18, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x31, 0x20, 0x43, - 0x41, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x1e, 0x17, 0x0d, 0x30, - 0x30, 0x30, 0x35, 0x33, 0x30, 0x31, 0x30, 0x33, 0x38, 0x33, 0x31, - 0x5a, 0x17, 0x0d, 0x32, 0x30, 0x30, 0x35, 0x33, 0x30, 0x31, 0x30, - 0x33, 0x38, 0x33, 0x31, 0x5a, 0x30, 0x65, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x53, 0x45, 0x31, 0x14, - 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x41, 0x64, - 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x41, 0x42, 0x31, 0x1d, - 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x14, 0x41, 0x64, - 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x54, 0x54, 0x50, 0x20, - 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x21, 0x30, 0x1f, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x41, 0x64, 0x64, 0x54, - 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, - 0x31, 0x20, 0x43, 0x41, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x82, - 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, - 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0x96, 0x96, - 0xd4, 0x21, 0x49, 0x60, 0xe2, 0x6b, 0xe8, 0x41, 0x07, 0x0c, 0xde, - 0xc4, 0xe0, 0xdc, 0x13, 0x23, 0xcd, 0xc1, 0x35, 0xc7, 0xfb, 0xd6, - 0x4e, 0x11, 0x0a, 0x67, 0x5e, 0xf5, 0x06, 0x5b, 0x6b, 0xa5, 0x08, - 0x3b, 0x5b, 0x29, 0x16, 0x3a, 0xe7, 0x87, 0xb2, 0x34, 0x06, 0xc5, - 0xbc, 0x05, 0xa5, 0x03, 0x7c, 0x82, 0xcb, 0x29, 0x10, 0xae, 0xe1, - 0x88, 0x81, 0xbd, 0xd6, 0x9e, 0xd3, 0xfe, 0x2d, 0x56, 0xc1, 0x15, - 0xce, 0xe3, 0x26, 0x9d, 0x15, 0x2e, 0x10, 0xfb, 0x06, 0x8f, 0x30, - 0x04, 0xde, 0xa7, 0xb4, 0x63, 0xb4, 0xff, 0xb1, 0x9c, 0xae, 0x3c, - 0xaf, 0x77, 0xb6, 0x56, 0xc5, 0xb5, 0xab, 0xa2, 0xe9, 0x69, 0x3a, - 0x3d, 0x0e, 0x33, 0x79, 0x32, 0x3f, 0x70, 0x82, 0x92, 0x99, 0x61, - 0x6d, 0x8d, 0x30, 0x08, 0x8f, 0x71, 0x3f, 0xa6, 0x48, 0x57, 0x19, - 0xf8, 0x25, 0xdc, 0x4b, 0x66, 0x5c, 0xa5, 0x74, 0x8f, 0x98, 0xae, - 0xc8, 0xf9, 0xc0, 0x06, 0x22, 0xe7, 0xac, 0x73, 0xdf, 0xa5, 0x2e, - 0xfb, 0x52, 0xdc, 0xb1, 0x15, 0x65, 0x20, 0xfa, 0x35, 0x66, 0x69, - 0xde, 0xdf, 0x2c, 0xf1, 0x6e, 0xbc, 0x30, 0xdb, 0x2c, 0x24, 0x12, - 0xdb, 0xeb, 0x35, 0x35, 0x68, 0x90, 0xcb, 0x00, 0xb0, 0x97, 0x21, - 0x3d, 0x74, 0x21, 0x23, 0x65, 0x34, 0x2b, 0xbb, 0x78, 0x59, 0xa3, - 0xd6, 0xe1, 0x76, 0x39, 0x9a, 0xa4, 0x49, 0x8e, 0x8c, 0x74, 0xaf, - 0x6e, 0xa4, 0x9a, 0xa3, 0xd9, 0x9b, 0xd2, 0x38, 0x5c, 0x9b, 0xa2, - 0x18, 0xcc, 0x75, 0x23, 0x84, 0xbe, 0xeb, 0xe2, 0x4d, 0x33, 0x71, - 0x8e, 0x1a, 0xf0, 0xc2, 0xf8, 0xc7, 0x1d, 0xa2, 0xad, 0x03, 0x97, - 0x2c, 0xf8, 0xcf, 0x25, 0xc6, 0xf6, 0xb8, 0x24, 0x31, 0xb1, 0x63, - 0x5d, 0x92, 0x7f, 0x63, 0xf0, 0x25, 0xc9, 0x53, 0x2e, 0x1f, 0xbf, - 0x4d, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xd2, 0x30, 0x81, - 0xcf, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, - 0x14, 0x95, 0xb1, 0xb4, 0xf0, 0x94, 0xb6, 0xbd, 0xc7, 0xda, 0xd1, - 0x11, 0x09, 0x21, 0xbe, 0xc1, 0xaf, 0x49, 0xfd, 0x10, 0x7b, 0x30, - 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, - 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, - 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x81, 0x8f, 0x06, - 0x03, 0x55, 0x1d, 0x23, 0x04, 0x81, 0x87, 0x30, 0x81, 0x84, 0x80, - 0x14, 0x95, 0xb1, 0xb4, 0xf0, 0x94, 0xb6, 0xbd, 0xc7, 0xda, 0xd1, - 0x11, 0x09, 0x21, 0xbe, 0xc1, 0xaf, 0x49, 0xfd, 0x10, 0x7b, 0xa1, - 0x69, 0xa4, 0x67, 0x30, 0x65, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, - 0x55, 0x04, 0x06, 0x13, 0x02, 0x53, 0x45, 0x31, 0x14, 0x30, 0x12, - 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x41, 0x64, 0x64, 0x54, - 0x72, 0x75, 0x73, 0x74, 0x20, 0x41, 0x42, 0x31, 0x1d, 0x30, 0x1b, - 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x14, 0x41, 0x64, 0x64, 0x54, - 0x72, 0x75, 0x73, 0x74, 0x20, 0x54, 0x54, 0x50, 0x20, 0x4e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x13, 0x18, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, - 0x73, 0x74, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x31, 0x20, - 0x43, 0x41, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x82, 0x01, 0x01, 0x30, - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x2c, 0x6d, 0x64, - 0x1b, 0x1f, 0xcd, 0x0d, 0xdd, 0xb9, 0x01, 0xfa, 0x96, 0x63, 0x34, - 0x32, 0x48, 0x47, 0x99, 0xae, 0x97, 0xed, 0xfd, 0x72, 0x16, 0xa6, - 0x73, 0x47, 0x5a, 0xf4, 0xeb, 0xdd, 0xe9, 0xf5, 0xd6, 0xfb, 0x45, - 0xcc, 0x29, 0x89, 0x44, 0x5d, 0xbf, 0x46, 0x39, 0x3d, 0xe8, 0xee, - 0xbc, 0x4d, 0x54, 0x86, 0x1e, 0x1d, 0x6c, 0xe3, 0x17, 0x27, 0x43, - 0xe1, 0x89, 0x56, 0x2b, 0xa9, 0x6f, 0x72, 0x4e, 0x49, 0x33, 0xe3, - 0x72, 0x7c, 0x2a, 0x23, 0x9a, 0xbc, 0x3e, 0xff, 0x28, 0x2a, 0xed, - 0xa3, 0xff, 0x1c, 0x23, 0xba, 0x43, 0x57, 0x09, 0x67, 0x4d, 0x4b, - 0x62, 0x06, 0x2d, 0xf8, 0xff, 0x6c, 0x9d, 0x60, 0x1e, 0xd8, 0x1c, - 0x4b, 0x7d, 0xb5, 0x31, 0x2f, 0xd9, 0xd0, 0x7c, 0x5d, 0xf8, 0xde, - 0x6b, 0x83, 0x18, 0x78, 0x37, 0x57, 0x2f, 0xe8, 0x33, 0x07, 0x67, - 0xdf, 0x1e, 0xc7, 0x6b, 0x2a, 0x95, 0x76, 0xae, 0x8f, 0x57, 0xa3, - 0xf0, 0xf4, 0x52, 0xb4, 0xa9, 0x53, 0x08, 0xcf, 0xe0, 0x4f, 0xd3, - 0x7a, 0x53, 0x8b, 0xfd, 0xbb, 0x1c, 0x56, 0x36, 0xf2, 0xfe, 0xb2, - 0xb6, 0xe5, 0x76, 0xbb, 0xd5, 0x22, 0x65, 0xa7, 0x3f, 0xfe, 0xd1, - 0x66, 0xad, 0x0b, 0xbc, 0x6b, 0x99, 0x86, 0xef, 0x3f, 0x7d, 0xf3, - 0x18, 0x32, 0xca, 0x7b, 0xc6, 0xe3, 0xab, 0x64, 0x46, 0x95, 0xf8, - 0x26, 0x69, 0xd9, 0x55, 0x83, 0x7b, 0x2c, 0x96, 0x07, 0xff, 0x59, - 0x2c, 0x44, 0xa3, 0xc6, 0xe5, 0xe9, 0xa9, 0xdc, 0xa1, 0x63, 0x80, - 0x5a, 0x21, 0x5e, 0x21, 0xcf, 0x53, 0x54, 0xf0, 0xba, 0x6f, 0x89, - 0xdb, 0xa8, 0xaa, 0x95, 0xcf, 0x8b, 0xe3, 0x71, 0xcc, 0x1e, 0x1b, - 0x20, 0x44, 0x08, 0xc0, 0x7a, 0xb6, 0x40, 0xfd, 0xc4, 0xe4, 0x35, - 0xe1, 0x1d, 0x16, 0x1c, 0xd0, 0xbc, 0x2b, 0x8e, 0xd6, 0x71, 0xd9, - 0x30, 0x82, 0x04, 0x36, 0x30, 0x82, 0x03, 0x1e, 0xa0, 0x03, 0x02, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x6f, - 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x53, 0x45, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x13, 0x0b, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, - 0x41, 0x42, 0x31, 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x0b, - 0x13, 0x1d, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, - 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x54, 0x54, - 0x50, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x22, - 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x19, 0x41, 0x64, - 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x45, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x43, 0x41, 0x20, 0x52, 0x6f, 0x6f, - 0x74, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x30, 0x30, 0x35, 0x33, 0x30, - 0x31, 0x30, 0x34, 0x38, 0x33, 0x38, 0x5a, 0x17, 0x0d, 0x32, 0x30, - 0x30, 0x35, 0x33, 0x30, 0x31, 0x30, 0x34, 0x38, 0x33, 0x38, 0x5a, - 0x30, 0x6f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x53, 0x45, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x13, 0x0b, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x20, 0x41, 0x42, 0x31, 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, - 0x04, 0x0b, 0x13, 0x1d, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x20, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, - 0x54, 0x54, 0x50, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x19, - 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x45, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x43, 0x41, 0x20, 0x52, - 0x6f, 0x6f, 0x74, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2e, 0x31, 0x2d, 0x30, 0x2b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, + 0x24, 0x45, 0x71, 0x75, 0x69, 0x66, 0x61, 0x78, 0x20, 0x53, 0x65, + 0x63, 0x75, 0x72, 0x65, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x20, 0x65, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x20, + 0x43, 0x41, 0x2d, 0x31, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, - 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, - 0x01, 0x01, 0x00, 0xb7, 0xf7, 0x1a, 0x33, 0xe6, 0xf2, 0x00, 0x04, - 0x2d, 0x39, 0xe0, 0x4e, 0x5b, 0xed, 0x1f, 0xbc, 0x6c, 0x0f, 0xcd, - 0xb5, 0xfa, 0x23, 0xb6, 0xce, 0xde, 0x9b, 0x11, 0x33, 0x97, 0xa4, - 0x29, 0x4c, 0x7d, 0x93, 0x9f, 0xbd, 0x4a, 0xbc, 0x93, 0xed, 0x03, - 0x1a, 0xe3, 0x8f, 0xcf, 0xe5, 0x6d, 0x50, 0x5a, 0xd6, 0x97, 0x29, - 0x94, 0x5a, 0x80, 0xb0, 0x49, 0x7a, 0xdb, 0x2e, 0x95, 0xfd, 0xb8, - 0xca, 0xbf, 0x37, 0x38, 0x2d, 0x1e, 0x3e, 0x91, 0x41, 0xad, 0x70, - 0x56, 0xc7, 0xf0, 0x4f, 0x3f, 0xe8, 0x32, 0x9e, 0x74, 0xca, 0xc8, - 0x90, 0x54, 0xe9, 0xc6, 0x5f, 0x0f, 0x78, 0x9d, 0x9a, 0x40, 0x3c, - 0x0e, 0xac, 0x61, 0xaa, 0x5e, 0x14, 0x8f, 0x9e, 0x87, 0xa1, 0x6a, - 0x50, 0xdc, 0xd7, 0x9a, 0x4e, 0xaf, 0x05, 0xb3, 0xa6, 0x71, 0x94, - 0x9c, 0x71, 0xb3, 0x50, 0x60, 0x0a, 0xc7, 0x13, 0x9d, 0x38, 0x07, - 0x86, 0x02, 0xa8, 0xe9, 0xa8, 0x69, 0x26, 0x18, 0x90, 0xab, 0x4c, - 0xb0, 0x4f, 0x23, 0xab, 0x3a, 0x4f, 0x84, 0xd8, 0xdf, 0xce, 0x9f, - 0xe1, 0x69, 0x6f, 0xbb, 0xd7, 0x42, 0xd7, 0x6b, 0x44, 0xe4, 0xc7, - 0xad, 0xee, 0x6d, 0x41, 0x5f, 0x72, 0x5a, 0x71, 0x08, 0x37, 0xb3, - 0x79, 0x65, 0xa4, 0x59, 0xa0, 0x94, 0x37, 0xf7, 0x00, 0x2f, 0x0d, - 0xc2, 0x92, 0x72, 0xda, 0xd0, 0x38, 0x72, 0xdb, 0x14, 0xa8, 0x45, - 0xc4, 0x5d, 0x2a, 0x7d, 0xb7, 0xb4, 0xd6, 0xc4, 0xee, 0xac, 0xcd, - 0x13, 0x44, 0xb7, 0xc9, 0x2b, 0xdd, 0x43, 0x00, 0x25, 0xfa, 0x61, - 0xb9, 0x69, 0x6a, 0x58, 0x23, 0x11, 0xb7, 0xa7, 0x33, 0x8f, 0x56, - 0x75, 0x59, 0xf5, 0xcd, 0x29, 0xd7, 0x46, 0xb7, 0x0a, 0x2b, 0x65, - 0xb6, 0xd3, 0x42, 0x6f, 0x15, 0xb2, 0xb8, 0x7b, 0xfb, 0xef, 0xe9, - 0x5d, 0x53, 0xd5, 0x34, 0x5a, 0x27, 0x02, 0x03, 0x01, 0x00, 0x01, - 0xa3, 0x81, 0xdc, 0x30, 0x81, 0xd9, 0x30, 0x1d, 0x06, 0x03, 0x55, - 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xad, 0xbd, 0x98, 0x7a, 0x34, - 0xb4, 0x26, 0xf7, 0xfa, 0xc4, 0x26, 0x54, 0xef, 0x03, 0xbd, 0xe0, - 0x24, 0xcb, 0x54, 0x1a, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, - 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, - 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, - 0xff, 0x30, 0x81, 0x99, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x81, - 0x91, 0x30, 0x81, 0x8e, 0x80, 0x14, 0xad, 0xbd, 0x98, 0x7a, 0x34, - 0xb4, 0x26, 0xf7, 0xfa, 0xc4, 0x26, 0x54, 0xef, 0x03, 0xbd, 0xe0, - 0x24, 0xcb, 0x54, 0x1a, 0xa1, 0x73, 0xa4, 0x71, 0x30, 0x6f, 0x31, + 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, + 0xba, 0xe7, 0x17, 0x90, 0x02, 0x65, 0xb1, 0x34, 0x55, 0x3c, 0x49, + 0xc2, 0x51, 0xd5, 0xdf, 0xa7, 0xd1, 0x37, 0x8f, 0xd1, 0xe7, 0x81, + 0x73, 0x41, 0x52, 0x60, 0x9b, 0x9d, 0xa1, 0x17, 0x26, 0x78, 0xad, + 0xc7, 0xb1, 0xe8, 0x26, 0x94, 0x32, 0xb5, 0xde, 0x33, 0x8d, 0x3a, + 0x2f, 0xdb, 0xf2, 0x9a, 0x7a, 0x5a, 0x73, 0x98, 0xa3, 0x5c, 0xe9, + 0xfb, 0x8a, 0x73, 0x1b, 0x5c, 0xe7, 0xc3, 0xbf, 0x80, 0x6c, 0xcd, + 0xa9, 0xf4, 0xd6, 0x2b, 0xc0, 0xf7, 0xf9, 0x99, 0xaa, 0x63, 0xa2, + 0xb1, 0x47, 0x02, 0x0f, 0xd4, 0xe4, 0x51, 0x3a, 0x12, 0x3c, 0x6c, + 0x8a, 0x5a, 0x54, 0x84, 0x70, 0xdb, 0xc1, 0xc5, 0x90, 0xcf, 0x72, + 0x45, 0xcb, 0xa8, 0x59, 0xc0, 0xcd, 0x33, 0x9d, 0x3f, 0xa3, 0x96, + 0xeb, 0x85, 0x33, 0x21, 0x1c, 0x3e, 0x1e, 0x3e, 0x60, 0x6e, 0x76, + 0x9c, 0x67, 0x85, 0xc5, 0xc8, 0xc3, 0x61, 0x02, 0x03, 0x01, 0x00, + 0x01, 0xa3, 0x66, 0x30, 0x64, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, + 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, + 0x00, 0x07, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, + 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, + 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xbe, + 0xa8, 0xa0, 0x74, 0x72, 0x50, 0x6b, 0x44, 0xb7, 0xc9, 0x23, 0xd8, + 0xfb, 0xa8, 0xff, 0xb3, 0x57, 0x6b, 0x68, 0x6c, 0x30, 0x1d, 0x06, + 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xbe, 0xa8, 0xa0, + 0x74, 0x72, 0x50, 0x6b, 0x44, 0xb7, 0xc9, 0x23, 0xd8, 0xfb, 0xa8, + 0xff, 0xb3, 0x57, 0x6b, 0x68, 0x6c, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x04, 0x05, 0x00, 0x03, + 0x81, 0x81, 0x00, 0x30, 0xe2, 0x01, 0x51, 0xaa, 0xc7, 0xea, 0x5f, + 0xda, 0xb9, 0xd0, 0x65, 0x0f, 0x30, 0xd6, 0x3e, 0xda, 0x0d, 0x14, + 0x49, 0x6e, 0x91, 0x93, 0x27, 0x14, 0x31, 0xef, 0xc4, 0xf7, 0x2d, + 0x45, 0xf8, 0xec, 0xc7, 0xbf, 0xa2, 0x41, 0x0d, 0x23, 0xb4, 0x92, + 0xf9, 0x19, 0x00, 0x67, 0xbd, 0x01, 0xaf, 0xcd, 0xe0, 0x71, 0xfc, + 0x5a, 0xcf, 0x64, 0xc4, 0xe0, 0x96, 0x98, 0xd0, 0xa3, 0x40, 0xe2, + 0x01, 0x8a, 0xef, 0x27, 0x07, 0xf1, 0x65, 0x01, 0x8a, 0x44, 0x2d, + 0x06, 0x65, 0x75, 0x52, 0xc0, 0x86, 0x10, 0x20, 0x21, 0x5f, 0x6c, + 0x6b, 0x0f, 0x6c, 0xae, 0x09, 0x1c, 0xaf, 0xf2, 0xa2, 0x18, 0x34, + 0xc4, 0x75, 0xa4, 0x73, 0x1c, 0xf1, 0x8d, 0xdc, 0xef, 0xad, 0xf9, + 0xb3, 0x76, 0xb4, 0x92, 0xbf, 0xdc, 0x95, 0x10, 0x1e, 0xbe, 0xcb, + 0xc8, 0x3b, 0x5a, 0x84, 0x60, 0x19, 0x56, 0x94, 0xa9, 0x55, 0x30, + 0x82, 0x04, 0x18, 0x30, 0x82, 0x03, 0x00, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x65, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x53, 0x45, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x41, - 0x42, 0x31, 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, - 0x1d, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x45, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x54, 0x54, 0x50, - 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x22, 0x30, - 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x19, 0x41, 0x64, 0x64, - 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x45, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x20, 0x43, 0x41, 0x20, 0x52, 0x6f, 0x6f, 0x74, - 0x82, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, - 0x00, 0xb0, 0x9b, 0xe0, 0x85, 0x25, 0xc2, 0xd6, 0x23, 0xe2, 0x0f, - 0x96, 0x06, 0x92, 0x9d, 0x41, 0x98, 0x9c, 0xd9, 0x84, 0x79, 0x81, - 0xd9, 0x1e, 0x5b, 0x14, 0x07, 0x23, 0x36, 0x65, 0x8f, 0xb0, 0xd8, - 0x77, 0xbb, 0xac, 0x41, 0x6c, 0x47, 0x60, 0x83, 0x51, 0xb0, 0xf9, - 0x32, 0x3d, 0xe7, 0xfc, 0xf6, 0x26, 0x13, 0xc7, 0x80, 0x16, 0xa5, - 0xbf, 0x5a, 0xfc, 0x87, 0xcf, 0x78, 0x79, 0x89, 0x21, 0x9a, 0xe2, - 0x4c, 0x07, 0x0a, 0x86, 0x35, 0xbc, 0xf2, 0xde, 0x51, 0xc4, 0xd2, - 0x96, 0xb7, 0xdc, 0x7e, 0x4e, 0xee, 0x70, 0xfd, 0x1c, 0x39, 0xeb, - 0x0c, 0x02, 0x51, 0x14, 0x2d, 0x8e, 0xbd, 0x16, 0xe0, 0xc1, 0xdf, - 0x46, 0x75, 0xe7, 0x24, 0xad, 0xec, 0xf4, 0x42, 0xb4, 0x85, 0x93, - 0x70, 0x10, 0x67, 0xba, 0x9d, 0x06, 0x35, 0x4a, 0x18, 0xd3, 0x2b, - 0x7a, 0xcc, 0x51, 0x42, 0xa1, 0x7a, 0x63, 0xd1, 0xe6, 0xbb, 0xa1, - 0xc5, 0x2b, 0xc2, 0x36, 0xbe, 0x13, 0x0d, 0xe6, 0xbd, 0x63, 0x7e, - 0x79, 0x7b, 0xa7, 0x09, 0x0d, 0x40, 0xab, 0x6a, 0xdd, 0x8f, 0x8a, - 0xc3, 0xf6, 0xf6, 0x8c, 0x1a, 0x42, 0x05, 0x51, 0xd4, 0x45, 0xf5, - 0x9f, 0xa7, 0x62, 0x21, 0x68, 0x15, 0x20, 0x43, 0x3c, 0x99, 0xe7, - 0x7c, 0xbd, 0x24, 0xd8, 0xa9, 0x91, 0x17, 0x73, 0x88, 0x3f, 0x56, - 0x1b, 0x31, 0x38, 0x18, 0xb4, 0x71, 0x0f, 0x9a, 0xcd, 0xc8, 0x0e, - 0x9e, 0x8e, 0x2e, 0x1b, 0xe1, 0x8c, 0x98, 0x83, 0xcb, 0x1f, 0x31, - 0xf1, 0x44, 0x4c, 0xc6, 0x04, 0x73, 0x49, 0x76, 0x60, 0x0f, 0xc7, - 0xf8, 0xbd, 0x17, 0x80, 0x6b, 0x2e, 0xe9, 0xcc, 0x4c, 0x0e, 0x5a, - 0x9a, 0x79, 0x0f, 0x20, 0x0a, 0x2e, 0xd5, 0x9e, 0x63, 0x26, 0x1e, - 0x55, 0x92, 0x94, 0xd8, 0x82, 0x17, 0x5a, 0x7b, 0xd0, 0xbc, 0xc7, - 0x8f, 0x4e, 0x86, 0x04, 0x30, 0x82, 0x04, 0x15, 0x30, 0x82, 0x02, - 0xfd, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, - 0x05, 0x00, 0x30, 0x64, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x53, 0x45, 0x31, 0x14, 0x30, 0x12, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x41, 0x64, 0x64, 0x54, 0x72, - 0x75, 0x73, 0x74, 0x20, 0x41, 0x42, 0x31, 0x1d, 0x30, 0x1b, 0x06, - 0x03, 0x55, 0x04, 0x0b, 0x13, 0x14, 0x41, 0x64, 0x64, 0x54, 0x72, - 0x75, 0x73, 0x74, 0x20, 0x54, 0x54, 0x50, 0x20, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, - 0x04, 0x03, 0x13, 0x17, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x43, 0x41, - 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x30, - 0x30, 0x35, 0x33, 0x30, 0x31, 0x30, 0x34, 0x31, 0x35, 0x30, 0x5a, - 0x17, 0x0d, 0x32, 0x30, 0x30, 0x35, 0x33, 0x30, 0x31, 0x30, 0x34, - 0x31, 0x35, 0x30, 0x5a, 0x30, 0x64, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x42, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, + 0x14, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x54, + 0x54, 0x50, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, + 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x41, + 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x20, 0x31, 0x20, 0x43, 0x41, 0x20, 0x52, 0x6f, 0x6f, + 0x74, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x30, 0x30, 0x35, 0x33, 0x30, + 0x31, 0x30, 0x33, 0x38, 0x33, 0x31, 0x5a, 0x17, 0x0d, 0x32, 0x30, + 0x30, 0x35, 0x33, 0x30, 0x31, 0x30, 0x33, 0x38, 0x33, 0x31, 0x5a, + 0x30, 0x65, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x53, 0x45, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x13, 0x0b, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x20, 0x41, 0x42, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, + 0x04, 0x0b, 0x13, 0x14, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x20, 0x54, 0x54, 0x50, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x18, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x31, 0x20, 0x43, 0x41, 0x20, + 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, + 0x82, 0x01, 0x01, 0x00, 0x96, 0x96, 0xd4, 0x21, 0x49, 0x60, 0xe2, + 0x6b, 0xe8, 0x41, 0x07, 0x0c, 0xde, 0xc4, 0xe0, 0xdc, 0x13, 0x23, + 0xcd, 0xc1, 0x35, 0xc7, 0xfb, 0xd6, 0x4e, 0x11, 0x0a, 0x67, 0x5e, + 0xf5, 0x06, 0x5b, 0x6b, 0xa5, 0x08, 0x3b, 0x5b, 0x29, 0x16, 0x3a, + 0xe7, 0x87, 0xb2, 0x34, 0x06, 0xc5, 0xbc, 0x05, 0xa5, 0x03, 0x7c, + 0x82, 0xcb, 0x29, 0x10, 0xae, 0xe1, 0x88, 0x81, 0xbd, 0xd6, 0x9e, + 0xd3, 0xfe, 0x2d, 0x56, 0xc1, 0x15, 0xce, 0xe3, 0x26, 0x9d, 0x15, + 0x2e, 0x10, 0xfb, 0x06, 0x8f, 0x30, 0x04, 0xde, 0xa7, 0xb4, 0x63, + 0xb4, 0xff, 0xb1, 0x9c, 0xae, 0x3c, 0xaf, 0x77, 0xb6, 0x56, 0xc5, + 0xb5, 0xab, 0xa2, 0xe9, 0x69, 0x3a, 0x3d, 0x0e, 0x33, 0x79, 0x32, + 0x3f, 0x70, 0x82, 0x92, 0x99, 0x61, 0x6d, 0x8d, 0x30, 0x08, 0x8f, + 0x71, 0x3f, 0xa6, 0x48, 0x57, 0x19, 0xf8, 0x25, 0xdc, 0x4b, 0x66, + 0x5c, 0xa5, 0x74, 0x8f, 0x98, 0xae, 0xc8, 0xf9, 0xc0, 0x06, 0x22, + 0xe7, 0xac, 0x73, 0xdf, 0xa5, 0x2e, 0xfb, 0x52, 0xdc, 0xb1, 0x15, + 0x65, 0x20, 0xfa, 0x35, 0x66, 0x69, 0xde, 0xdf, 0x2c, 0xf1, 0x6e, + 0xbc, 0x30, 0xdb, 0x2c, 0x24, 0x12, 0xdb, 0xeb, 0x35, 0x35, 0x68, + 0x90, 0xcb, 0x00, 0xb0, 0x97, 0x21, 0x3d, 0x74, 0x21, 0x23, 0x65, + 0x34, 0x2b, 0xbb, 0x78, 0x59, 0xa3, 0xd6, 0xe1, 0x76, 0x39, 0x9a, + 0xa4, 0x49, 0x8e, 0x8c, 0x74, 0xaf, 0x6e, 0xa4, 0x9a, 0xa3, 0xd9, + 0x9b, 0xd2, 0x38, 0x5c, 0x9b, 0xa2, 0x18, 0xcc, 0x75, 0x23, 0x84, + 0xbe, 0xeb, 0xe2, 0x4d, 0x33, 0x71, 0x8e, 0x1a, 0xf0, 0xc2, 0xf8, + 0xc7, 0x1d, 0xa2, 0xad, 0x03, 0x97, 0x2c, 0xf8, 0xcf, 0x25, 0xc6, + 0xf6, 0xb8, 0x24, 0x31, 0xb1, 0x63, 0x5d, 0x92, 0x7f, 0x63, 0xf0, + 0x25, 0xc9, 0x53, 0x2e, 0x1f, 0xbf, 0x4d, 0x02, 0x03, 0x01, 0x00, + 0x01, 0xa3, 0x81, 0xd2, 0x30, 0x81, 0xcf, 0x30, 0x1d, 0x06, 0x03, + 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x95, 0xb1, 0xb4, 0xf0, + 0x94, 0xb6, 0xbd, 0xc7, 0xda, 0xd1, 0x11, 0x09, 0x21, 0xbe, 0xc1, + 0xaf, 0x49, 0xfd, 0x10, 0x7b, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, + 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, + 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, + 0x01, 0xff, 0x30, 0x81, 0x8f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, + 0x81, 0x87, 0x30, 0x81, 0x84, 0x80, 0x14, 0x95, 0xb1, 0xb4, 0xf0, + 0x94, 0xb6, 0xbd, 0xc7, 0xda, 0xd1, 0x11, 0x09, 0x21, 0xbe, 0xc1, + 0xaf, 0x49, 0xfd, 0x10, 0x7b, 0xa1, 0x69, 0xa4, 0x67, 0x30, 0x65, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x53, 0x45, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x13, 0x0b, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, + 0x41, 0x42, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0b, + 0x13, 0x14, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, + 0x54, 0x54, 0x50, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, + 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6c, + 0x61, 0x73, 0x73, 0x20, 0x31, 0x20, 0x43, 0x41, 0x20, 0x52, 0x6f, + 0x6f, 0x74, 0x82, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, + 0x01, 0x01, 0x00, 0x2c, 0x6d, 0x64, 0x1b, 0x1f, 0xcd, 0x0d, 0xdd, + 0xb9, 0x01, 0xfa, 0x96, 0x63, 0x34, 0x32, 0x48, 0x47, 0x99, 0xae, + 0x97, 0xed, 0xfd, 0x72, 0x16, 0xa6, 0x73, 0x47, 0x5a, 0xf4, 0xeb, + 0xdd, 0xe9, 0xf5, 0xd6, 0xfb, 0x45, 0xcc, 0x29, 0x89, 0x44, 0x5d, + 0xbf, 0x46, 0x39, 0x3d, 0xe8, 0xee, 0xbc, 0x4d, 0x54, 0x86, 0x1e, + 0x1d, 0x6c, 0xe3, 0x17, 0x27, 0x43, 0xe1, 0x89, 0x56, 0x2b, 0xa9, + 0x6f, 0x72, 0x4e, 0x49, 0x33, 0xe3, 0x72, 0x7c, 0x2a, 0x23, 0x9a, + 0xbc, 0x3e, 0xff, 0x28, 0x2a, 0xed, 0xa3, 0xff, 0x1c, 0x23, 0xba, + 0x43, 0x57, 0x09, 0x67, 0x4d, 0x4b, 0x62, 0x06, 0x2d, 0xf8, 0xff, + 0x6c, 0x9d, 0x60, 0x1e, 0xd8, 0x1c, 0x4b, 0x7d, 0xb5, 0x31, 0x2f, + 0xd9, 0xd0, 0x7c, 0x5d, 0xf8, 0xde, 0x6b, 0x83, 0x18, 0x78, 0x37, + 0x57, 0x2f, 0xe8, 0x33, 0x07, 0x67, 0xdf, 0x1e, 0xc7, 0x6b, 0x2a, + 0x95, 0x76, 0xae, 0x8f, 0x57, 0xa3, 0xf0, 0xf4, 0x52, 0xb4, 0xa9, + 0x53, 0x08, 0xcf, 0xe0, 0x4f, 0xd3, 0x7a, 0x53, 0x8b, 0xfd, 0xbb, + 0x1c, 0x56, 0x36, 0xf2, 0xfe, 0xb2, 0xb6, 0xe5, 0x76, 0xbb, 0xd5, + 0x22, 0x65, 0xa7, 0x3f, 0xfe, 0xd1, 0x66, 0xad, 0x0b, 0xbc, 0x6b, + 0x99, 0x86, 0xef, 0x3f, 0x7d, 0xf3, 0x18, 0x32, 0xca, 0x7b, 0xc6, + 0xe3, 0xab, 0x64, 0x46, 0x95, 0xf8, 0x26, 0x69, 0xd9, 0x55, 0x83, + 0x7b, 0x2c, 0x96, 0x07, 0xff, 0x59, 0x2c, 0x44, 0xa3, 0xc6, 0xe5, + 0xe9, 0xa9, 0xdc, 0xa1, 0x63, 0x80, 0x5a, 0x21, 0x5e, 0x21, 0xcf, + 0x53, 0x54, 0xf0, 0xba, 0x6f, 0x89, 0xdb, 0xa8, 0xaa, 0x95, 0xcf, + 0x8b, 0xe3, 0x71, 0xcc, 0x1e, 0x1b, 0x20, 0x44, 0x08, 0xc0, 0x7a, + 0xb6, 0x40, 0xfd, 0xc4, 0xe4, 0x35, 0xe1, 0x1d, 0x16, 0x1c, 0xd0, + 0xbc, 0x2b, 0x8e, 0xd6, 0x71, 0xd9, 0x30, 0x82, 0x04, 0x36, 0x30, + 0x82, 0x03, 0x1e, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x05, 0x05, 0x00, 0x30, 0x6f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x53, 0x45, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x41, 0x64, 0x64, - 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x41, 0x42, 0x31, 0x1d, 0x30, - 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x14, 0x41, 0x64, 0x64, - 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x54, 0x54, 0x50, 0x20, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x20, 0x30, 0x1e, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x41, 0x64, 0x64, 0x54, 0x72, - 0x75, 0x73, 0x74, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x43, 0x41, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x82, 0x01, 0x22, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, - 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xe9, 0x1a, 0x30, 0x8f, - 0x83, 0x88, 0x14, 0xc1, 0x20, 0xd8, 0x3c, 0x9b, 0x8f, 0x1b, 0x7e, - 0x03, 0x74, 0xbb, 0xda, 0x69, 0xd3, 0x46, 0xa5, 0xf8, 0x8e, 0xc2, - 0x0c, 0x11, 0x90, 0x51, 0xa5, 0x2f, 0x66, 0x54, 0x40, 0x55, 0xea, - 0xdb, 0x1f, 0x4a, 0x56, 0xee, 0x9f, 0x23, 0x6e, 0xf4, 0x39, 0xcb, - 0xa1, 0xb9, 0x6f, 0xf2, 0x7e, 0xf9, 0x5d, 0x87, 0x26, 0x61, 0x9e, - 0x1c, 0xf8, 0xe2, 0xec, 0xa6, 0x81, 0xf8, 0x21, 0xc5, 0x24, 0xcc, - 0x11, 0x0c, 0x3f, 0xdb, 0x26, 0x72, 0x7a, 0xc7, 0x01, 0x97, 0x07, - 0x17, 0xf9, 0xd7, 0x18, 0x2c, 0x30, 0x7d, 0x0e, 0x7a, 0x1e, 0x62, - 0x1e, 0xc6, 0x4b, 0xc0, 0xfd, 0x7d, 0x62, 0x77, 0xd3, 0x44, 0x1e, - 0x27, 0xf6, 0x3f, 0x4b, 0x44, 0xb3, 0xb7, 0x38, 0xd9, 0x39, 0x1f, - 0x60, 0xd5, 0x51, 0x92, 0x73, 0x03, 0xb4, 0x00, 0x69, 0xe3, 0xf3, - 0x14, 0x4e, 0xee, 0xd1, 0xdc, 0x09, 0xcf, 0x77, 0x34, 0x46, 0x50, - 0xb0, 0xf8, 0x11, 0xf2, 0xfe, 0x38, 0x79, 0xf7, 0x07, 0x39, 0xfe, - 0x51, 0x92, 0x97, 0x0b, 0x5b, 0x08, 0x5f, 0x34, 0x86, 0x01, 0xad, - 0x88, 0x97, 0xeb, 0x66, 0xcd, 0x5e, 0xd1, 0xff, 0xdc, 0x7d, 0xf2, - 0x84, 0xda, 0xba, 0x77, 0xad, 0xdc, 0x80, 0x08, 0xc7, 0xa7, 0x87, - 0xd6, 0x55, 0x9f, 0x97, 0x6a, 0xe8, 0xc8, 0x11, 0x64, 0xba, 0xe7, - 0x19, 0x29, 0x3f, 0x11, 0xb3, 0x78, 0x90, 0x84, 0x20, 0x52, 0x5b, - 0x11, 0xef, 0x78, 0xd0, 0x83, 0xf6, 0xd5, 0x48, 0x90, 0xd0, 0x30, - 0x1c, 0xcf, 0x80, 0xf9, 0x60, 0xfe, 0x79, 0xe4, 0x88, 0xf2, 0xdd, - 0x00, 0xeb, 0x94, 0x45, 0xeb, 0x65, 0x94, 0x69, 0x40, 0xba, 0xc0, - 0xd5, 0xb4, 0xb8, 0xba, 0x7d, 0x04, 0x11, 0xa8, 0xeb, 0x31, 0x05, - 0x96, 0x94, 0x4e, 0x58, 0x21, 0x8e, 0x9f, 0xd0, 0x60, 0xfd, 0x02, - 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xd1, 0x30, 0x81, 0xce, 0x30, - 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x81, - 0x3e, 0x37, 0xd8, 0x92, 0xb0, 0x1f, 0x77, 0x9f, 0x5c, 0xb4, 0xab, - 0x73, 0xaa, 0xe7, 0xf6, 0x34, 0x60, 0x2f, 0xfa, 0x30, 0x0b, 0x06, - 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, - 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, - 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x81, 0x8e, 0x06, 0x03, 0x55, - 0x1d, 0x23, 0x04, 0x81, 0x86, 0x30, 0x81, 0x83, 0x80, 0x14, 0x81, - 0x3e, 0x37, 0xd8, 0x92, 0xb0, 0x1f, 0x77, 0x9f, 0x5c, 0xb4, 0xab, - 0x73, 0xaa, 0xe7, 0xf6, 0x34, 0x60, 0x2f, 0xfa, 0xa1, 0x68, 0xa4, - 0x66, 0x30, 0x64, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x41, 0x42, 0x31, 0x26, 0x30, + 0x24, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1d, 0x41, 0x64, 0x64, + 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x20, 0x54, 0x54, 0x50, 0x20, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x19, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x20, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, + 0x43, 0x41, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x1e, 0x17, 0x0d, + 0x30, 0x30, 0x30, 0x35, 0x33, 0x30, 0x31, 0x30, 0x34, 0x38, 0x33, + 0x38, 0x5a, 0x17, 0x0d, 0x32, 0x30, 0x30, 0x35, 0x33, 0x30, 0x31, + 0x30, 0x34, 0x38, 0x33, 0x38, 0x5a, 0x30, 0x6f, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x53, 0x45, 0x31, + 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x41, + 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x41, 0x42, 0x31, + 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1d, 0x41, + 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x54, 0x54, 0x50, 0x20, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x22, 0x30, 0x20, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x13, 0x19, 0x41, 0x64, 0x64, 0x54, 0x72, + 0x75, 0x73, 0x74, 0x20, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x20, 0x43, 0x41, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x82, + 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, + 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb7, 0xf7, + 0x1a, 0x33, 0xe6, 0xf2, 0x00, 0x04, 0x2d, 0x39, 0xe0, 0x4e, 0x5b, + 0xed, 0x1f, 0xbc, 0x6c, 0x0f, 0xcd, 0xb5, 0xfa, 0x23, 0xb6, 0xce, + 0xde, 0x9b, 0x11, 0x33, 0x97, 0xa4, 0x29, 0x4c, 0x7d, 0x93, 0x9f, + 0xbd, 0x4a, 0xbc, 0x93, 0xed, 0x03, 0x1a, 0xe3, 0x8f, 0xcf, 0xe5, + 0x6d, 0x50, 0x5a, 0xd6, 0x97, 0x29, 0x94, 0x5a, 0x80, 0xb0, 0x49, + 0x7a, 0xdb, 0x2e, 0x95, 0xfd, 0xb8, 0xca, 0xbf, 0x37, 0x38, 0x2d, + 0x1e, 0x3e, 0x91, 0x41, 0xad, 0x70, 0x56, 0xc7, 0xf0, 0x4f, 0x3f, + 0xe8, 0x32, 0x9e, 0x74, 0xca, 0xc8, 0x90, 0x54, 0xe9, 0xc6, 0x5f, + 0x0f, 0x78, 0x9d, 0x9a, 0x40, 0x3c, 0x0e, 0xac, 0x61, 0xaa, 0x5e, + 0x14, 0x8f, 0x9e, 0x87, 0xa1, 0x6a, 0x50, 0xdc, 0xd7, 0x9a, 0x4e, + 0xaf, 0x05, 0xb3, 0xa6, 0x71, 0x94, 0x9c, 0x71, 0xb3, 0x50, 0x60, + 0x0a, 0xc7, 0x13, 0x9d, 0x38, 0x07, 0x86, 0x02, 0xa8, 0xe9, 0xa8, + 0x69, 0x26, 0x18, 0x90, 0xab, 0x4c, 0xb0, 0x4f, 0x23, 0xab, 0x3a, + 0x4f, 0x84, 0xd8, 0xdf, 0xce, 0x9f, 0xe1, 0x69, 0x6f, 0xbb, 0xd7, + 0x42, 0xd7, 0x6b, 0x44, 0xe4, 0xc7, 0xad, 0xee, 0x6d, 0x41, 0x5f, + 0x72, 0x5a, 0x71, 0x08, 0x37, 0xb3, 0x79, 0x65, 0xa4, 0x59, 0xa0, + 0x94, 0x37, 0xf7, 0x00, 0x2f, 0x0d, 0xc2, 0x92, 0x72, 0xda, 0xd0, + 0x38, 0x72, 0xdb, 0x14, 0xa8, 0x45, 0xc4, 0x5d, 0x2a, 0x7d, 0xb7, + 0xb4, 0xd6, 0xc4, 0xee, 0xac, 0xcd, 0x13, 0x44, 0xb7, 0xc9, 0x2b, + 0xdd, 0x43, 0x00, 0x25, 0xfa, 0x61, 0xb9, 0x69, 0x6a, 0x58, 0x23, + 0x11, 0xb7, 0xa7, 0x33, 0x8f, 0x56, 0x75, 0x59, 0xf5, 0xcd, 0x29, + 0xd7, 0x46, 0xb7, 0x0a, 0x2b, 0x65, 0xb6, 0xd3, 0x42, 0x6f, 0x15, + 0xb2, 0xb8, 0x7b, 0xfb, 0xef, 0xe9, 0x5d, 0x53, 0xd5, 0x34, 0x5a, + 0x27, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xdc, 0x30, 0x81, + 0xd9, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, + 0x14, 0xad, 0xbd, 0x98, 0x7a, 0x34, 0xb4, 0x26, 0xf7, 0xfa, 0xc4, + 0x26, 0x54, 0xef, 0x03, 0xbd, 0xe0, 0x24, 0xcb, 0x54, 0x1a, 0x30, + 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, + 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, + 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x81, 0x99, 0x06, + 0x03, 0x55, 0x1d, 0x23, 0x04, 0x81, 0x91, 0x30, 0x81, 0x8e, 0x80, + 0x14, 0xad, 0xbd, 0x98, 0x7a, 0x34, 0xb4, 0x26, 0xf7, 0xfa, 0xc4, + 0x26, 0x54, 0xef, 0x03, 0xbd, 0xe0, 0x24, 0xcb, 0x54, 0x1a, 0xa1, + 0x73, 0xa4, 0x71, 0x30, 0x6f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x53, 0x45, 0x31, 0x14, 0x30, 0x12, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x41, 0x64, 0x64, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x20, 0x41, 0x42, 0x31, 0x26, 0x30, 0x24, + 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1d, 0x41, 0x64, 0x64, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x20, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x20, 0x54, 0x54, 0x50, 0x20, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x19, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, + 0x20, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x43, + 0x41, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x82, 0x01, 0x01, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xb0, 0x9b, 0xe0, 0x85, + 0x25, 0xc2, 0xd6, 0x23, 0xe2, 0x0f, 0x96, 0x06, 0x92, 0x9d, 0x41, + 0x98, 0x9c, 0xd9, 0x84, 0x79, 0x81, 0xd9, 0x1e, 0x5b, 0x14, 0x07, + 0x23, 0x36, 0x65, 0x8f, 0xb0, 0xd8, 0x77, 0xbb, 0xac, 0x41, 0x6c, + 0x47, 0x60, 0x83, 0x51, 0xb0, 0xf9, 0x32, 0x3d, 0xe7, 0xfc, 0xf6, + 0x26, 0x13, 0xc7, 0x80, 0x16, 0xa5, 0xbf, 0x5a, 0xfc, 0x87, 0xcf, + 0x78, 0x79, 0x89, 0x21, 0x9a, 0xe2, 0x4c, 0x07, 0x0a, 0x86, 0x35, + 0xbc, 0xf2, 0xde, 0x51, 0xc4, 0xd2, 0x96, 0xb7, 0xdc, 0x7e, 0x4e, + 0xee, 0x70, 0xfd, 0x1c, 0x39, 0xeb, 0x0c, 0x02, 0x51, 0x14, 0x2d, + 0x8e, 0xbd, 0x16, 0xe0, 0xc1, 0xdf, 0x46, 0x75, 0xe7, 0x24, 0xad, + 0xec, 0xf4, 0x42, 0xb4, 0x85, 0x93, 0x70, 0x10, 0x67, 0xba, 0x9d, + 0x06, 0x35, 0x4a, 0x18, 0xd3, 0x2b, 0x7a, 0xcc, 0x51, 0x42, 0xa1, + 0x7a, 0x63, 0xd1, 0xe6, 0xbb, 0xa1, 0xc5, 0x2b, 0xc2, 0x36, 0xbe, + 0x13, 0x0d, 0xe6, 0xbd, 0x63, 0x7e, 0x79, 0x7b, 0xa7, 0x09, 0x0d, + 0x40, 0xab, 0x6a, 0xdd, 0x8f, 0x8a, 0xc3, 0xf6, 0xf6, 0x8c, 0x1a, + 0x42, 0x05, 0x51, 0xd4, 0x45, 0xf5, 0x9f, 0xa7, 0x62, 0x21, 0x68, + 0x15, 0x20, 0x43, 0x3c, 0x99, 0xe7, 0x7c, 0xbd, 0x24, 0xd8, 0xa9, + 0x91, 0x17, 0x73, 0x88, 0x3f, 0x56, 0x1b, 0x31, 0x38, 0x18, 0xb4, + 0x71, 0x0f, 0x9a, 0xcd, 0xc8, 0x0e, 0x9e, 0x8e, 0x2e, 0x1b, 0xe1, + 0x8c, 0x98, 0x83, 0xcb, 0x1f, 0x31, 0xf1, 0x44, 0x4c, 0xc6, 0x04, + 0x73, 0x49, 0x76, 0x60, 0x0f, 0xc7, 0xf8, 0xbd, 0x17, 0x80, 0x6b, + 0x2e, 0xe9, 0xcc, 0x4c, 0x0e, 0x5a, 0x9a, 0x79, 0x0f, 0x20, 0x0a, + 0x2e, 0xd5, 0x9e, 0x63, 0x26, 0x1e, 0x55, 0x92, 0x94, 0xd8, 0x82, + 0x17, 0x5a, 0x7b, 0xd0, 0xbc, 0xc7, 0x8f, 0x4e, 0x86, 0x04, 0x30, + 0x82, 0x04, 0x15, 0x30, 0x82, 0x02, 0xfd, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x64, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x53, + 0x45, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x0b, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x41, + 0x42, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, + 0x14, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x54, + 0x54, 0x50, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, + 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x41, + 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x20, 0x43, 0x41, 0x20, 0x52, 0x6f, 0x6f, 0x74, + 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x30, 0x30, 0x35, 0x33, 0x30, 0x31, + 0x30, 0x34, 0x31, 0x35, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x30, 0x30, + 0x35, 0x33, 0x30, 0x31, 0x30, 0x34, 0x31, 0x35, 0x30, 0x5a, 0x30, + 0x64, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x53, 0x45, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x13, 0x0b, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, + 0x20, 0x41, 0x42, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, + 0x0b, 0x13, 0x14, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, + 0x20, 0x54, 0x54, 0x50, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, + 0x17, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x50, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x43, 0x41, 0x20, 0x52, 0x6f, + 0x6f, 0x74, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, + 0x01, 0x00, 0xe9, 0x1a, 0x30, 0x8f, 0x83, 0x88, 0x14, 0xc1, 0x20, + 0xd8, 0x3c, 0x9b, 0x8f, 0x1b, 0x7e, 0x03, 0x74, 0xbb, 0xda, 0x69, + 0xd3, 0x46, 0xa5, 0xf8, 0x8e, 0xc2, 0x0c, 0x11, 0x90, 0x51, 0xa5, + 0x2f, 0x66, 0x54, 0x40, 0x55, 0xea, 0xdb, 0x1f, 0x4a, 0x56, 0xee, + 0x9f, 0x23, 0x6e, 0xf4, 0x39, 0xcb, 0xa1, 0xb9, 0x6f, 0xf2, 0x7e, + 0xf9, 0x5d, 0x87, 0x26, 0x61, 0x9e, 0x1c, 0xf8, 0xe2, 0xec, 0xa6, + 0x81, 0xf8, 0x21, 0xc5, 0x24, 0xcc, 0x11, 0x0c, 0x3f, 0xdb, 0x26, + 0x72, 0x7a, 0xc7, 0x01, 0x97, 0x07, 0x17, 0xf9, 0xd7, 0x18, 0x2c, + 0x30, 0x7d, 0x0e, 0x7a, 0x1e, 0x62, 0x1e, 0xc6, 0x4b, 0xc0, 0xfd, + 0x7d, 0x62, 0x77, 0xd3, 0x44, 0x1e, 0x27, 0xf6, 0x3f, 0x4b, 0x44, + 0xb3, 0xb7, 0x38, 0xd9, 0x39, 0x1f, 0x60, 0xd5, 0x51, 0x92, 0x73, + 0x03, 0xb4, 0x00, 0x69, 0xe3, 0xf3, 0x14, 0x4e, 0xee, 0xd1, 0xdc, + 0x09, 0xcf, 0x77, 0x34, 0x46, 0x50, 0xb0, 0xf8, 0x11, 0xf2, 0xfe, + 0x38, 0x79, 0xf7, 0x07, 0x39, 0xfe, 0x51, 0x92, 0x97, 0x0b, 0x5b, + 0x08, 0x5f, 0x34, 0x86, 0x01, 0xad, 0x88, 0x97, 0xeb, 0x66, 0xcd, + 0x5e, 0xd1, 0xff, 0xdc, 0x7d, 0xf2, 0x84, 0xda, 0xba, 0x77, 0xad, + 0xdc, 0x80, 0x08, 0xc7, 0xa7, 0x87, 0xd6, 0x55, 0x9f, 0x97, 0x6a, + 0xe8, 0xc8, 0x11, 0x64, 0xba, 0xe7, 0x19, 0x29, 0x3f, 0x11, 0xb3, + 0x78, 0x90, 0x84, 0x20, 0x52, 0x5b, 0x11, 0xef, 0x78, 0xd0, 0x83, + 0xf6, 0xd5, 0x48, 0x90, 0xd0, 0x30, 0x1c, 0xcf, 0x80, 0xf9, 0x60, + 0xfe, 0x79, 0xe4, 0x88, 0xf2, 0xdd, 0x00, 0xeb, 0x94, 0x45, 0xeb, + 0x65, 0x94, 0x69, 0x40, 0xba, 0xc0, 0xd5, 0xb4, 0xb8, 0xba, 0x7d, + 0x04, 0x11, 0xa8, 0xeb, 0x31, 0x05, 0x96, 0x94, 0x4e, 0x58, 0x21, + 0x8e, 0x9f, 0xd0, 0x60, 0xfd, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, + 0x81, 0xd1, 0x30, 0x81, 0xce, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, + 0x0e, 0x04, 0x16, 0x04, 0x14, 0x81, 0x3e, 0x37, 0xd8, 0x92, 0xb0, + 0x1f, 0x77, 0x9f, 0x5c, 0xb4, 0xab, 0x73, 0xaa, 0xe7, 0xf6, 0x34, + 0x60, 0x2f, 0xfa, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, + 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, + 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, + 0x30, 0x81, 0x8e, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x81, 0x86, + 0x30, 0x81, 0x83, 0x80, 0x14, 0x81, 0x3e, 0x37, 0xd8, 0x92, 0xb0, + 0x1f, 0x77, 0x9f, 0x5c, 0xb4, 0xab, 0x73, 0xaa, 0xe7, 0xf6, 0x34, + 0x60, 0x2f, 0xfa, 0xa1, 0x68, 0xa4, 0x66, 0x30, 0x64, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x53, 0x45, + 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, + 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x41, 0x42, + 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x14, + 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x54, 0x54, + 0x50, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x20, + 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x41, 0x64, + 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x50, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x20, 0x43, 0x41, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x82, + 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, + 0x03, 0xf7, 0x15, 0x4a, 0xf8, 0x24, 0xda, 0x23, 0x56, 0x16, 0x93, + 0x76, 0xdd, 0x36, 0x28, 0xb9, 0xae, 0x1b, 0xb8, 0xc3, 0xf1, 0x64, + 0xba, 0x20, 0x18, 0x78, 0x95, 0x29, 0x27, 0x57, 0x05, 0xbc, 0x7c, + 0x2a, 0xf4, 0xb9, 0x51, 0x55, 0xda, 0x87, 0x02, 0xde, 0x0f, 0x16, + 0x17, 0x31, 0xf8, 0xaa, 0x79, 0x2e, 0x09, 0x13, 0xbb, 0xaf, 0xb2, + 0x20, 0x19, 0x12, 0xe5, 0x93, 0xf9, 0x4b, 0xf9, 0x83, 0xe8, 0x44, + 0xd5, 0xb2, 0x41, 0x25, 0xbf, 0x88, 0x75, 0x6f, 0xff, 0x10, 0xfc, + 0x4a, 0x54, 0xd0, 0x5f, 0xf0, 0xfa, 0xef, 0x36, 0x73, 0x7d, 0x1b, + 0x36, 0x45, 0xc6, 0x21, 0x6d, 0xb4, 0x15, 0xb8, 0x4e, 0xcf, 0x9c, + 0x5c, 0xa5, 0x3d, 0x5a, 0x00, 0x8e, 0x06, 0xe3, 0x3c, 0x6b, 0x32, + 0x7b, 0xf2, 0x9f, 0xf0, 0xb6, 0xfd, 0xdf, 0xf0, 0x28, 0x18, 0x48, + 0xf0, 0xc6, 0xbc, 0xd0, 0xbf, 0x34, 0x80, 0x96, 0xc2, 0x4a, 0xb1, + 0x6d, 0x8e, 0xc7, 0x90, 0x45, 0xde, 0x2f, 0x67, 0xac, 0x45, 0x04, + 0xa3, 0x7a, 0xdc, 0x55, 0x92, 0xc9, 0x47, 0x66, 0xd8, 0x1a, 0x8c, + 0xc7, 0xed, 0x9c, 0x4e, 0x9a, 0xe0, 0x12, 0xbb, 0xb5, 0x6a, 0x4c, + 0x84, 0xe1, 0xe1, 0x22, 0x0d, 0x87, 0x00, 0x64, 0xfe, 0x8c, 0x7d, + 0x62, 0x39, 0x65, 0xa6, 0xef, 0x42, 0xb6, 0x80, 0x25, 0x12, 0x61, + 0x01, 0xa8, 0x24, 0x13, 0x70, 0x00, 0x11, 0x26, 0x5f, 0xfa, 0x35, + 0x50, 0xc5, 0x48, 0xcc, 0x06, 0x47, 0xe8, 0x27, 0xd8, 0x70, 0x8d, + 0x5f, 0x64, 0xe6, 0xa1, 0x44, 0x26, 0x5e, 0x22, 0xec, 0x92, 0xcd, + 0xff, 0x42, 0x9a, 0x44, 0x21, 0x6d, 0x5c, 0xc5, 0xe3, 0x22, 0x1d, + 0x5f, 0x47, 0x12, 0xe7, 0xce, 0x5f, 0x5d, 0xfa, 0xd8, 0xaa, 0xb1, + 0x33, 0x2d, 0xd9, 0x76, 0xf2, 0x4e, 0x3a, 0x33, 0x0c, 0x2b, 0xb3, + 0x2d, 0x90, 0x06, 0x30, 0x82, 0x04, 0x1e, 0x30, 0x82, 0x03, 0x06, + 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x30, 0x67, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x53, 0x45, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x41, 0x42, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x14, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x54, 0x54, 0x50, 0x20, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x13, 0x17, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x43, 0x41, 0x20, - 0x52, 0x6f, 0x6f, 0x74, 0x82, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, - 0x03, 0x82, 0x01, 0x01, 0x00, 0x03, 0xf7, 0x15, 0x4a, 0xf8, 0x24, - 0xda, 0x23, 0x56, 0x16, 0x93, 0x76, 0xdd, 0x36, 0x28, 0xb9, 0xae, - 0x1b, 0xb8, 0xc3, 0xf1, 0x64, 0xba, 0x20, 0x18, 0x78, 0x95, 0x29, - 0x27, 0x57, 0x05, 0xbc, 0x7c, 0x2a, 0xf4, 0xb9, 0x51, 0x55, 0xda, - 0x87, 0x02, 0xde, 0x0f, 0x16, 0x17, 0x31, 0xf8, 0xaa, 0x79, 0x2e, - 0x09, 0x13, 0xbb, 0xaf, 0xb2, 0x20, 0x19, 0x12, 0xe5, 0x93, 0xf9, - 0x4b, 0xf9, 0x83, 0xe8, 0x44, 0xd5, 0xb2, 0x41, 0x25, 0xbf, 0x88, - 0x75, 0x6f, 0xff, 0x10, 0xfc, 0x4a, 0x54, 0xd0, 0x5f, 0xf0, 0xfa, - 0xef, 0x36, 0x73, 0x7d, 0x1b, 0x36, 0x45, 0xc6, 0x21, 0x6d, 0xb4, - 0x15, 0xb8, 0x4e, 0xcf, 0x9c, 0x5c, 0xa5, 0x3d, 0x5a, 0x00, 0x8e, - 0x06, 0xe3, 0x3c, 0x6b, 0x32, 0x7b, 0xf2, 0x9f, 0xf0, 0xb6, 0xfd, - 0xdf, 0xf0, 0x28, 0x18, 0x48, 0xf0, 0xc6, 0xbc, 0xd0, 0xbf, 0x34, - 0x80, 0x96, 0xc2, 0x4a, 0xb1, 0x6d, 0x8e, 0xc7, 0x90, 0x45, 0xde, - 0x2f, 0x67, 0xac, 0x45, 0x04, 0xa3, 0x7a, 0xdc, 0x55, 0x92, 0xc9, - 0x47, 0x66, 0xd8, 0x1a, 0x8c, 0xc7, 0xed, 0x9c, 0x4e, 0x9a, 0xe0, - 0x12, 0xbb, 0xb5, 0x6a, 0x4c, 0x84, 0xe1, 0xe1, 0x22, 0x0d, 0x87, - 0x00, 0x64, 0xfe, 0x8c, 0x7d, 0x62, 0x39, 0x65, 0xa6, 0xef, 0x42, - 0xb6, 0x80, 0x25, 0x12, 0x61, 0x01, 0xa8, 0x24, 0x13, 0x70, 0x00, - 0x11, 0x26, 0x5f, 0xfa, 0x35, 0x50, 0xc5, 0x48, 0xcc, 0x06, 0x47, - 0xe8, 0x27, 0xd8, 0x70, 0x8d, 0x5f, 0x64, 0xe6, 0xa1, 0x44, 0x26, - 0x5e, 0x22, 0xec, 0x92, 0xcd, 0xff, 0x42, 0x9a, 0x44, 0x21, 0x6d, - 0x5c, 0xc5, 0xe3, 0x22, 0x1d, 0x5f, 0x47, 0x12, 0xe7, 0xce, 0x5f, - 0x5d, 0xfa, 0xd8, 0xaa, 0xb1, 0x33, 0x2d, 0xd9, 0x76, 0xf2, 0x4e, - 0x3a, 0x33, 0x0c, 0x2b, 0xb3, 0x2d, 0x90, 0x06, 0x30, 0x82, 0x04, - 0x1e, 0x30, 0x82, 0x03, 0x06, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, - 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x67, 0x31, 0x0b, 0x30, + 0x6f, 0x72, 0x6b, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x1a, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, + 0x20, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, + 0x43, 0x41, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x1e, 0x17, 0x0d, + 0x30, 0x30, 0x30, 0x35, 0x33, 0x30, 0x31, 0x30, 0x34, 0x34, 0x35, + 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x30, 0x30, 0x35, 0x33, 0x30, 0x31, + 0x30, 0x34, 0x34, 0x35, 0x30, 0x5a, 0x30, 0x67, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x53, 0x45, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x41, 0x42, 0x31, @@ -1911,920 +997,678 @@ static const unsigned char ca_bundle_data[] = { 0x21, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1a, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x43, 0x41, 0x20, 0x52, 0x6f, 0x6f, - 0x74, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x30, 0x30, 0x35, 0x33, 0x30, - 0x31, 0x30, 0x34, 0x34, 0x35, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x30, - 0x30, 0x35, 0x33, 0x30, 0x31, 0x30, 0x34, 0x34, 0x35, 0x30, 0x5a, - 0x30, 0x67, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x53, 0x45, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x13, 0x0b, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x20, 0x41, 0x42, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, - 0x04, 0x0b, 0x13, 0x14, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x20, 0x54, 0x54, 0x50, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, 0x03, - 0x13, 0x1a, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, - 0x51, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x43, - 0x41, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x82, 0x01, 0x22, 0x30, - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, - 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xe4, 0x1e, 0x9a, 0xfe, 0xdc, - 0x09, 0x5a, 0x87, 0xa4, 0x9f, 0x47, 0xbe, 0x11, 0x5f, 0xaf, 0x84, - 0x34, 0xdb, 0x62, 0x3c, 0x79, 0x78, 0xb7, 0xe9, 0x30, 0xb5, 0xec, - 0x0c, 0x1c, 0x2a, 0xc4, 0x16, 0xff, 0xe0, 0xec, 0x71, 0xeb, 0x8a, - 0xf5, 0x11, 0x6e, 0xed, 0x4f, 0x0d, 0x91, 0xd2, 0x12, 0x18, 0x2d, - 0x49, 0x15, 0x01, 0xc2, 0xa4, 0x22, 0x13, 0xc7, 0x11, 0x64, 0xff, - 0x22, 0x12, 0x9a, 0xb9, 0x8e, 0x5c, 0x2f, 0x08, 0xcf, 0x71, 0x6a, - 0xb3, 0x67, 0x01, 0x59, 0xf1, 0x5d, 0x46, 0xf3, 0xb0, 0x78, 0xa5, - 0xf6, 0x0e, 0x42, 0x7a, 0xe3, 0x7f, 0x1b, 0xcc, 0xd0, 0xf0, 0xb7, - 0x28, 0xfd, 0x2a, 0xea, 0x9e, 0xb3, 0xb0, 0xb9, 0x04, 0xaa, 0xfd, - 0xf6, 0xc7, 0xb4, 0xb1, 0xb8, 0x2a, 0xa0, 0xfb, 0x58, 0xf1, 0x19, - 0xa0, 0x6f, 0x70, 0x25, 0x7e, 0x3e, 0x69, 0x4a, 0x7f, 0x0f, 0x22, - 0xd8, 0xef, 0xad, 0x08, 0x11, 0x9a, 0x29, 0x99, 0xe1, 0xaa, 0x44, - 0x45, 0x9a, 0x12, 0x5e, 0x3e, 0x9d, 0x6d, 0x52, 0xfc, 0xe7, 0xa0, - 0x3d, 0x68, 0x2f, 0xf0, 0x4b, 0x70, 0x7c, 0x13, 0x38, 0xad, 0xbc, - 0x15, 0x25, 0xf1, 0xd6, 0xce, 0xab, 0xa2, 0xc0, 0x31, 0xd6, 0x2f, - 0x9f, 0xe0, 0xff, 0x14, 0x59, 0xfc, 0x84, 0x93, 0xd9, 0x87, 0x7c, - 0x4c, 0x54, 0x13, 0xeb, 0x9f, 0xd1, 0x2d, 0x11, 0xf8, 0x18, 0x3a, - 0x3a, 0xde, 0x25, 0xd9, 0xf7, 0xd3, 0x40, 0xed, 0xa4, 0x06, 0x12, - 0xc4, 0x3b, 0xe1, 0x91, 0xc1, 0x56, 0x35, 0xf0, 0x14, 0xdc, 0x65, - 0x36, 0x09, 0x6e, 0xab, 0xa4, 0x07, 0xc7, 0x35, 0xd1, 0xc2, 0x03, - 0x33, 0x36, 0x5b, 0x75, 0x26, 0x6d, 0x42, 0xf1, 0x12, 0x6b, 0x43, - 0x6f, 0x4b, 0x71, 0x94, 0xfa, 0x34, 0x1d, 0xed, 0x13, 0x6e, 0xca, - 0x80, 0x7f, 0x98, 0x2f, 0x6c, 0xb9, 0x65, 0xd8, 0xe9, 0x02, 0x03, - 0x01, 0x00, 0x01, 0xa3, 0x81, 0xd4, 0x30, 0x81, 0xd1, 0x30, 0x1d, - 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x39, 0x95, - 0x8b, 0x62, 0x8b, 0x5c, 0xc9, 0xd4, 0x80, 0xba, 0x58, 0x0f, 0x97, - 0x3f, 0x15, 0x08, 0x43, 0xcc, 0x98, 0xa7, 0x30, 0x0b, 0x06, 0x03, - 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, - 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, - 0x03, 0x01, 0x01, 0xff, 0x30, 0x81, 0x91, 0x06, 0x03, 0x55, 0x1d, - 0x23, 0x04, 0x81, 0x89, 0x30, 0x81, 0x86, 0x80, 0x14, 0x39, 0x95, - 0x8b, 0x62, 0x8b, 0x5c, 0xc9, 0xd4, 0x80, 0xba, 0x58, 0x0f, 0x97, - 0x3f, 0x15, 0x08, 0x43, 0xcc, 0x98, 0xa7, 0xa1, 0x6b, 0xa4, 0x69, - 0x30, 0x67, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x53, 0x45, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x13, 0x0b, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x20, 0x41, 0x42, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, - 0x04, 0x0b, 0x13, 0x14, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x20, 0x54, 0x54, 0x50, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, 0x03, - 0x13, 0x1a, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, - 0x51, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x43, - 0x41, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x82, 0x01, 0x01, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, - 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x19, 0xab, 0x75, 0xea, - 0xf8, 0x8b, 0x65, 0x61, 0x95, 0x13, 0xba, 0x69, 0x04, 0xef, 0x86, - 0xca, 0x13, 0xa0, 0xc7, 0xaa, 0x4f, 0x64, 0x1b, 0x3f, 0x18, 0xf6, - 0xa8, 0x2d, 0x2c, 0x55, 0x8f, 0x05, 0xb7, 0x30, 0xea, 0x42, 0x6a, - 0x1d, 0xc0, 0x25, 0x51, 0x2d, 0xa7, 0xbf, 0x0c, 0xb3, 0xed, 0xef, - 0x08, 0x7f, 0x6c, 0x3c, 0x46, 0x1a, 0xea, 0x18, 0x43, 0xdf, 0x76, - 0xcc, 0xf9, 0x66, 0x86, 0x9c, 0x2c, 0x68, 0xf5, 0xe9, 0x17, 0xf8, - 0x31, 0xb3, 0x18, 0xc4, 0xd6, 0x48, 0x7d, 0x23, 0x4c, 0x68, 0xc1, - 0x7e, 0xbb, 0x01, 0x14, 0x6f, 0xc5, 0xd9, 0x6e, 0xde, 0xbb, 0x04, - 0x42, 0x6a, 0xf8, 0xf6, 0x5c, 0x7d, 0xe5, 0xda, 0xfa, 0x87, 0xeb, - 0x0d, 0x35, 0x52, 0x67, 0xd0, 0x9e, 0x97, 0x76, 0x05, 0x93, 0x3f, - 0x95, 0xc7, 0x01, 0xe6, 0x69, 0x55, 0x38, 0x7f, 0x10, 0x61, 0x99, - 0xc9, 0xe3, 0x5f, 0xa6, 0xca, 0x3e, 0x82, 0x63, 0x48, 0xaa, 0xe2, - 0x08, 0x48, 0x3e, 0xaa, 0xf2, 0xb2, 0x85, 0x62, 0xa6, 0xb4, 0xa7, - 0xd9, 0xbd, 0x37, 0x9c, 0x68, 0xb5, 0x2d, 0x56, 0x7d, 0xb0, 0xb7, - 0x3f, 0xa0, 0xb1, 0x07, 0xd6, 0xe9, 0x4f, 0xdc, 0xde, 0x45, 0x71, - 0x30, 0x32, 0x7f, 0x1b, 0x2e, 0x09, 0xf9, 0xbf, 0x52, 0xa1, 0xee, - 0xc2, 0x80, 0x3e, 0x06, 0x5c, 0x2e, 0x55, 0x40, 0xc1, 0x1b, 0xf5, - 0x70, 0x45, 0xb0, 0xdc, 0x5d, 0xfa, 0xf6, 0x72, 0x5a, 0x77, 0xd2, - 0x63, 0xcd, 0xcf, 0x58, 0x89, 0x00, 0x42, 0x63, 0x3f, 0x79, 0x39, - 0xd0, 0x44, 0xb0, 0x82, 0x6e, 0x41, 0x19, 0xe8, 0xdd, 0xe0, 0xc1, - 0x88, 0x5a, 0xd1, 0x1e, 0x71, 0x93, 0x1f, 0x24, 0x30, 0x74, 0xe5, - 0x1e, 0xa8, 0xde, 0x3c, 0x27, 0x37, 0x7f, 0x83, 0xae, 0x9e, 0x77, - 0xcf, 0xf0, 0x30, 0xb1, 0xff, 0x4b, 0x99, 0xe8, 0xc6, 0xa1, 0x30, - 0x82, 0x04, 0x91, 0x30, 0x82, 0x03, 0x79, 0xa0, 0x03, 0x02, 0x01, - 0x02, 0x02, 0x04, 0x45, 0x6b, 0x50, 0x54, 0x30, 0x0d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, - 0x30, 0x81, 0xb0, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, - 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x39, 0x30, 0x37, - 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x30, 0x77, 0x77, 0x77, 0x2e, - 0x65, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, - 0x2f, 0x43, 0x50, 0x53, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x63, - 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, - 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x16, - 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x36, 0x20, 0x45, 0x6e, - 0x74, 0x72, 0x75, 0x73, 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, - 0x31, 0x2d, 0x30, 0x2b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x24, - 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, - 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x31, - 0x32, 0x37, 0x32, 0x30, 0x32, 0x33, 0x34, 0x32, 0x5a, 0x17, 0x0d, - 0x32, 0x36, 0x31, 0x31, 0x32, 0x37, 0x32, 0x30, 0x35, 0x33, 0x34, - 0x32, 0x5a, 0x30, 0x81, 0xb0, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, - 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, - 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x45, 0x6e, 0x74, 0x72, - 0x75, 0x73, 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x39, - 0x30, 0x37, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x30, 0x77, 0x77, - 0x77, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, - 0x65, 0x74, 0x2f, 0x43, 0x50, 0x53, 0x20, 0x69, 0x73, 0x20, 0x69, - 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, - 0x13, 0x16, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x36, 0x20, + 0x74, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, + 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, + 0x00, 0xe4, 0x1e, 0x9a, 0xfe, 0xdc, 0x09, 0x5a, 0x87, 0xa4, 0x9f, + 0x47, 0xbe, 0x11, 0x5f, 0xaf, 0x84, 0x34, 0xdb, 0x62, 0x3c, 0x79, + 0x78, 0xb7, 0xe9, 0x30, 0xb5, 0xec, 0x0c, 0x1c, 0x2a, 0xc4, 0x16, + 0xff, 0xe0, 0xec, 0x71, 0xeb, 0x8a, 0xf5, 0x11, 0x6e, 0xed, 0x4f, + 0x0d, 0x91, 0xd2, 0x12, 0x18, 0x2d, 0x49, 0x15, 0x01, 0xc2, 0xa4, + 0x22, 0x13, 0xc7, 0x11, 0x64, 0xff, 0x22, 0x12, 0x9a, 0xb9, 0x8e, + 0x5c, 0x2f, 0x08, 0xcf, 0x71, 0x6a, 0xb3, 0x67, 0x01, 0x59, 0xf1, + 0x5d, 0x46, 0xf3, 0xb0, 0x78, 0xa5, 0xf6, 0x0e, 0x42, 0x7a, 0xe3, + 0x7f, 0x1b, 0xcc, 0xd0, 0xf0, 0xb7, 0x28, 0xfd, 0x2a, 0xea, 0x9e, + 0xb3, 0xb0, 0xb9, 0x04, 0xaa, 0xfd, 0xf6, 0xc7, 0xb4, 0xb1, 0xb8, + 0x2a, 0xa0, 0xfb, 0x58, 0xf1, 0x19, 0xa0, 0x6f, 0x70, 0x25, 0x7e, + 0x3e, 0x69, 0x4a, 0x7f, 0x0f, 0x22, 0xd8, 0xef, 0xad, 0x08, 0x11, + 0x9a, 0x29, 0x99, 0xe1, 0xaa, 0x44, 0x45, 0x9a, 0x12, 0x5e, 0x3e, + 0x9d, 0x6d, 0x52, 0xfc, 0xe7, 0xa0, 0x3d, 0x68, 0x2f, 0xf0, 0x4b, + 0x70, 0x7c, 0x13, 0x38, 0xad, 0xbc, 0x15, 0x25, 0xf1, 0xd6, 0xce, + 0xab, 0xa2, 0xc0, 0x31, 0xd6, 0x2f, 0x9f, 0xe0, 0xff, 0x14, 0x59, + 0xfc, 0x84, 0x93, 0xd9, 0x87, 0x7c, 0x4c, 0x54, 0x13, 0xeb, 0x9f, + 0xd1, 0x2d, 0x11, 0xf8, 0x18, 0x3a, 0x3a, 0xde, 0x25, 0xd9, 0xf7, + 0xd3, 0x40, 0xed, 0xa4, 0x06, 0x12, 0xc4, 0x3b, 0xe1, 0x91, 0xc1, + 0x56, 0x35, 0xf0, 0x14, 0xdc, 0x65, 0x36, 0x09, 0x6e, 0xab, 0xa4, + 0x07, 0xc7, 0x35, 0xd1, 0xc2, 0x03, 0x33, 0x36, 0x5b, 0x75, 0x26, + 0x6d, 0x42, 0xf1, 0x12, 0x6b, 0x43, 0x6f, 0x4b, 0x71, 0x94, 0xfa, + 0x34, 0x1d, 0xed, 0x13, 0x6e, 0xca, 0x80, 0x7f, 0x98, 0x2f, 0x6c, + 0xb9, 0x65, 0xd8, 0xe9, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, + 0xd4, 0x30, 0x81, 0xd1, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, + 0x04, 0x16, 0x04, 0x14, 0x39, 0x95, 0x8b, 0x62, 0x8b, 0x5c, 0xc9, + 0xd4, 0x80, 0xba, 0x58, 0x0f, 0x97, 0x3f, 0x15, 0x08, 0x43, 0xcc, + 0x98, 0xa7, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, + 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, + 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, + 0x81, 0x91, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x81, 0x89, 0x30, + 0x81, 0x86, 0x80, 0x14, 0x39, 0x95, 0x8b, 0x62, 0x8b, 0x5c, 0xc9, + 0xd4, 0x80, 0xba, 0x58, 0x0f, 0x97, 0x3f, 0x15, 0x08, 0x43, 0xcc, + 0x98, 0xa7, 0xa1, 0x6b, 0xa4, 0x69, 0x30, 0x67, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x53, 0x45, 0x31, + 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x41, + 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x41, 0x42, 0x31, + 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x14, 0x41, + 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x54, 0x54, 0x50, + 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x23, 0x30, + 0x21, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1a, 0x41, 0x64, 0x64, + 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x51, 0x75, 0x61, 0x6c, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x20, 0x43, 0x41, 0x20, 0x52, 0x6f, 0x6f, + 0x74, 0x82, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x01, 0x00, 0x19, 0xab, 0x75, 0xea, 0xf8, 0x8b, 0x65, 0x61, 0x95, + 0x13, 0xba, 0x69, 0x04, 0xef, 0x86, 0xca, 0x13, 0xa0, 0xc7, 0xaa, + 0x4f, 0x64, 0x1b, 0x3f, 0x18, 0xf6, 0xa8, 0x2d, 0x2c, 0x55, 0x8f, + 0x05, 0xb7, 0x30, 0xea, 0x42, 0x6a, 0x1d, 0xc0, 0x25, 0x51, 0x2d, + 0xa7, 0xbf, 0x0c, 0xb3, 0xed, 0xef, 0x08, 0x7f, 0x6c, 0x3c, 0x46, + 0x1a, 0xea, 0x18, 0x43, 0xdf, 0x76, 0xcc, 0xf9, 0x66, 0x86, 0x9c, + 0x2c, 0x68, 0xf5, 0xe9, 0x17, 0xf8, 0x31, 0xb3, 0x18, 0xc4, 0xd6, + 0x48, 0x7d, 0x23, 0x4c, 0x68, 0xc1, 0x7e, 0xbb, 0x01, 0x14, 0x6f, + 0xc5, 0xd9, 0x6e, 0xde, 0xbb, 0x04, 0x42, 0x6a, 0xf8, 0xf6, 0x5c, + 0x7d, 0xe5, 0xda, 0xfa, 0x87, 0xeb, 0x0d, 0x35, 0x52, 0x67, 0xd0, + 0x9e, 0x97, 0x76, 0x05, 0x93, 0x3f, 0x95, 0xc7, 0x01, 0xe6, 0x69, + 0x55, 0x38, 0x7f, 0x10, 0x61, 0x99, 0xc9, 0xe3, 0x5f, 0xa6, 0xca, + 0x3e, 0x82, 0x63, 0x48, 0xaa, 0xe2, 0x08, 0x48, 0x3e, 0xaa, 0xf2, + 0xb2, 0x85, 0x62, 0xa6, 0xb4, 0xa7, 0xd9, 0xbd, 0x37, 0x9c, 0x68, + 0xb5, 0x2d, 0x56, 0x7d, 0xb0, 0xb7, 0x3f, 0xa0, 0xb1, 0x07, 0xd6, + 0xe9, 0x4f, 0xdc, 0xde, 0x45, 0x71, 0x30, 0x32, 0x7f, 0x1b, 0x2e, + 0x09, 0xf9, 0xbf, 0x52, 0xa1, 0xee, 0xc2, 0x80, 0x3e, 0x06, 0x5c, + 0x2e, 0x55, 0x40, 0xc1, 0x1b, 0xf5, 0x70, 0x45, 0xb0, 0xdc, 0x5d, + 0xfa, 0xf6, 0x72, 0x5a, 0x77, 0xd2, 0x63, 0xcd, 0xcf, 0x58, 0x89, + 0x00, 0x42, 0x63, 0x3f, 0x79, 0x39, 0xd0, 0x44, 0xb0, 0x82, 0x6e, + 0x41, 0x19, 0xe8, 0xdd, 0xe0, 0xc1, 0x88, 0x5a, 0xd1, 0x1e, 0x71, + 0x93, 0x1f, 0x24, 0x30, 0x74, 0xe5, 0x1e, 0xa8, 0xde, 0x3c, 0x27, + 0x37, 0x7f, 0x83, 0xae, 0x9e, 0x77, 0xcf, 0xf0, 0x30, 0xb1, 0xff, + 0x4b, 0x99, 0xe8, 0xc6, 0xa1, 0x30, 0x82, 0x04, 0x91, 0x30, 0x82, + 0x03, 0x79, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04, 0x45, 0x6b, + 0x50, 0x54, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0xb0, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, + 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2c, 0x20, 0x49, 0x6e, - 0x63, 0x2e, 0x31, 0x2d, 0x30, 0x2b, 0x06, 0x03, 0x55, 0x04, 0x03, - 0x13, 0x24, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, - 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, - 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, - 0x02, 0x82, 0x01, 0x01, 0x00, 0xb6, 0x95, 0xb6, 0x43, 0x42, 0xfa, - 0xc6, 0x6d, 0x2a, 0x6f, 0x48, 0xdf, 0x94, 0x4c, 0x39, 0x57, 0x05, - 0xee, 0xc3, 0x79, 0x11, 0x41, 0x68, 0x36, 0xed, 0xec, 0xfe, 0x9a, - 0x01, 0x8f, 0xa1, 0x38, 0x28, 0xfc, 0xf7, 0x10, 0x46, 0x66, 0x2e, - 0x4d, 0x1e, 0x1a, 0xb1, 0x1a, 0x4e, 0xc6, 0xd1, 0xc0, 0x95, 0x88, - 0xb0, 0xc9, 0xff, 0x31, 0x8b, 0x33, 0x03, 0xdb, 0xb7, 0x83, 0x7b, - 0x3e, 0x20, 0x84, 0x5e, 0xed, 0xb2, 0x56, 0x28, 0xa7, 0xf8, 0xe0, - 0xb9, 0x40, 0x71, 0x37, 0xc5, 0xcb, 0x47, 0x0e, 0x97, 0x2a, 0x68, - 0xc0, 0x22, 0x95, 0x62, 0x15, 0xdb, 0x47, 0xd9, 0xf5, 0xd0, 0x2b, - 0xff, 0x82, 0x4b, 0xc9, 0xad, 0x3e, 0xde, 0x4c, 0xdb, 0x90, 0x80, - 0x50, 0x3f, 0x09, 0x8a, 0x84, 0x00, 0xec, 0x30, 0x0a, 0x3d, 0x18, - 0xcd, 0xfb, 0xfd, 0x2a, 0x59, 0x9a, 0x23, 0x95, 0x17, 0x2c, 0x45, - 0x9e, 0x1f, 0x6e, 0x43, 0x79, 0x6d, 0x0c, 0x5c, 0x98, 0xfe, 0x48, - 0xa7, 0xc5, 0x23, 0x47, 0x5c, 0x5e, 0xfd, 0x6e, 0xe7, 0x1e, 0xb4, - 0xf6, 0x68, 0x45, 0xd1, 0x86, 0x83, 0x5b, 0xa2, 0x8a, 0x8d, 0xb1, - 0xe3, 0x29, 0x80, 0xfe, 0x25, 0x71, 0x88, 0xad, 0xbe, 0xbc, 0x8f, - 0xac, 0x52, 0x96, 0x4b, 0xaa, 0x51, 0x8d, 0xe4, 0x13, 0x31, 0x19, - 0xe8, 0x4e, 0x4d, 0x9f, 0xdb, 0xac, 0xb3, 0x6a, 0xd5, 0xbc, 0x39, - 0x54, 0x71, 0xca, 0x7a, 0x7a, 0x7f, 0x90, 0xdd, 0x7d, 0x1d, 0x80, - 0xd9, 0x81, 0xbb, 0x59, 0x26, 0xc2, 0x11, 0xfe, 0xe6, 0x93, 0xe2, - 0xf7, 0x80, 0xe4, 0x65, 0xfb, 0x34, 0x37, 0x0e, 0x29, 0x80, 0x70, - 0x4d, 0xaf, 0x38, 0x86, 0x2e, 0x9e, 0x7f, 0x57, 0xaf, 0x9e, 0x17, - 0xae, 0xeb, 0x1c, 0xcb, 0x28, 0x21, 0x5f, 0xb6, 0x1c, 0xd8, 0xe7, - 0xa2, 0x04, 0x22, 0xf9, 0xd3, 0xda, 0xd8, 0xcb, 0x02, 0x03, 0x01, - 0x00, 0x01, 0xa3, 0x81, 0xb0, 0x30, 0x81, 0xad, 0x30, 0x0e, 0x06, - 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, - 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, - 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x2b, 0x06, - 0x03, 0x55, 0x1d, 0x10, 0x04, 0x24, 0x30, 0x22, 0x80, 0x0f, 0x32, - 0x30, 0x30, 0x36, 0x31, 0x31, 0x32, 0x37, 0x32, 0x30, 0x32, 0x33, - 0x34, 0x32, 0x5a, 0x81, 0x0f, 0x32, 0x30, 0x32, 0x36, 0x31, 0x31, - 0x32, 0x37, 0x32, 0x30, 0x35, 0x33, 0x34, 0x32, 0x5a, 0x30, 0x1f, - 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, - 0x68, 0x90, 0xe4, 0x67, 0xa4, 0xa6, 0x53, 0x80, 0xc7, 0x86, 0x66, - 0xa4, 0xf1, 0xf7, 0x4b, 0x43, 0xfb, 0x84, 0xbd, 0x6d, 0x30, 0x1d, - 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x68, 0x90, - 0xe4, 0x67, 0xa4, 0xa6, 0x53, 0x80, 0xc7, 0x86, 0x66, 0xa4, 0xf1, - 0xf7, 0x4b, 0x43, 0xfb, 0x84, 0xbd, 0x6d, 0x30, 0x1d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf6, 0x7d, 0x07, 0x41, 0x00, 0x04, 0x10, - 0x30, 0x0e, 0x1b, 0x08, 0x56, 0x37, 0x2e, 0x31, 0x3a, 0x34, 0x2e, - 0x30, 0x03, 0x02, 0x04, 0x90, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, - 0x01, 0x01, 0x00, 0x93, 0xd4, 0x30, 0xb0, 0xd7, 0x03, 0x20, 0x2a, - 0xd0, 0xf9, 0x63, 0xe8, 0x91, 0x0c, 0x05, 0x20, 0xa9, 0x5f, 0x19, - 0xca, 0x7b, 0x72, 0x4e, 0xd4, 0xb1, 0xdb, 0xd0, 0x96, 0xfb, 0x54, - 0x5a, 0x19, 0x2c, 0x0c, 0x08, 0xf7, 0xb2, 0xbc, 0x85, 0xa8, 0x9d, - 0x7f, 0x6d, 0x3b, 0x52, 0xb3, 0x2a, 0xdb, 0xe7, 0xd4, 0x84, 0x8c, - 0x63, 0xf6, 0x0f, 0xcb, 0x26, 0x01, 0x91, 0x50, 0x6c, 0xf4, 0x5f, - 0x14, 0xe2, 0x93, 0x74, 0xc0, 0x13, 0x9e, 0x30, 0x3a, 0x50, 0xe3, - 0xb4, 0x60, 0xc5, 0x1c, 0xf0, 0x22, 0x44, 0x8d, 0x71, 0x47, 0xac, - 0xc8, 0x1a, 0xc9, 0xe9, 0x9b, 0x9a, 0x00, 0x60, 0x13, 0xff, 0x70, - 0x7e, 0x5f, 0x11, 0x4d, 0x49, 0x1b, 0xb3, 0x15, 0x52, 0x7b, 0xc9, - 0x54, 0xda, 0xbf, 0x9d, 0x95, 0xaf, 0x6b, 0x9a, 0xd8, 0x9e, 0xe9, - 0xf1, 0xe4, 0x43, 0x8d, 0xe2, 0x11, 0x44, 0x3a, 0xbf, 0xaf, 0xbd, - 0x83, 0x42, 0x73, 0x52, 0x8b, 0xaa, 0xbb, 0xa7, 0x29, 0xcf, 0xf5, - 0x64, 0x1c, 0x0a, 0x4d, 0xd1, 0xbc, 0xaa, 0xac, 0x9f, 0x2a, 0xd0, - 0xff, 0x7f, 0x7f, 0xda, 0x7d, 0xea, 0xb1, 0xed, 0x30, 0x25, 0xc1, - 0x84, 0xda, 0x34, 0xd2, 0x5b, 0x78, 0x83, 0x56, 0xec, 0x9c, 0x36, - 0xc3, 0x26, 0xe2, 0x11, 0xf6, 0x67, 0x49, 0x1d, 0x92, 0xab, 0x8c, - 0xfb, 0xeb, 0xff, 0x7a, 0xee, 0x85, 0x4a, 0xa7, 0x50, 0x80, 0xf0, - 0xa7, 0x5c, 0x4a, 0x94, 0x2e, 0x5f, 0x05, 0x99, 0x3c, 0x52, 0x41, - 0xe0, 0xcd, 0xb4, 0x63, 0xcf, 0x01, 0x43, 0xba, 0x9c, 0x83, 0xdc, - 0x8f, 0x60, 0x3b, 0xf3, 0x5a, 0xb4, 0xb4, 0x7b, 0xae, 0xda, 0x0b, - 0x90, 0x38, 0x75, 0xef, 0x81, 0x1d, 0x66, 0xd2, 0xf7, 0x57, 0x70, - 0x36, 0xb3, 0xbf, 0xfc, 0x28, 0xaf, 0x71, 0x25, 0x85, 0x5b, 0x13, - 0xfe, 0x1e, 0x7f, 0x5a, 0xb4, 0x3c, 0x30, 0x82, 0x03, 0x61, 0x30, - 0x82, 0x02, 0x49, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x0a, - 0x01, 0x01, 0x01, 0x00, 0x00, 0x02, 0x7c, 0x00, 0x00, 0x00, 0x0a, - 0x00, 0x00, 0x00, 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x3a, 0x31, - 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x52, - 0x53, 0x41, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, - 0x20, 0x49, 0x6e, 0x63, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, - 0x04, 0x0b, 0x13, 0x14, 0x52, 0x53, 0x41, 0x20, 0x53, 0x65, 0x63, - 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x32, 0x30, 0x34, 0x38, 0x20, - 0x56, 0x33, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x31, 0x30, 0x32, 0x32, - 0x32, 0x32, 0x30, 0x33, 0x39, 0x32, 0x33, 0x5a, 0x17, 0x0d, 0x32, - 0x36, 0x30, 0x32, 0x32, 0x32, 0x32, 0x30, 0x33, 0x39, 0x32, 0x33, - 0x5a, 0x30, 0x3a, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x10, 0x52, 0x53, 0x41, 0x20, 0x53, 0x65, 0x63, 0x75, - 0x72, 0x69, 0x74, 0x79, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x1d, 0x30, - 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x14, 0x52, 0x53, 0x41, - 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x32, - 0x30, 0x34, 0x38, 0x20, 0x56, 0x33, 0x30, 0x82, 0x01, 0x22, 0x30, + 0x63, 0x2e, 0x31, 0x39, 0x30, 0x37, 0x06, 0x03, 0x55, 0x04, 0x0b, + 0x13, 0x30, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x75, + 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x43, 0x50, 0x53, 0x20, + 0x69, 0x73, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x31, 0x1f, 0x30, 0x1d, 0x06, + 0x03, 0x55, 0x04, 0x0b, 0x13, 0x16, 0x28, 0x63, 0x29, 0x20, 0x32, + 0x30, 0x30, 0x36, 0x20, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, + 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x2d, 0x30, 0x2b, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x13, 0x24, 0x45, 0x6e, 0x74, 0x72, 0x75, + 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, + 0x17, 0x0d, 0x30, 0x36, 0x31, 0x31, 0x32, 0x37, 0x32, 0x30, 0x32, + 0x33, 0x34, 0x32, 0x5a, 0x17, 0x0d, 0x32, 0x36, 0x31, 0x31, 0x32, + 0x37, 0x32, 0x30, 0x35, 0x33, 0x34, 0x32, 0x5a, 0x30, 0x81, 0xb0, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x13, 0x0d, 0x45, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2c, 0x20, + 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x39, 0x30, 0x37, 0x06, 0x03, 0x55, + 0x04, 0x0b, 0x13, 0x30, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x6e, 0x74, + 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x43, 0x50, + 0x53, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x72, 0x70, + 0x6f, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x31, 0x1f, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x16, 0x28, 0x63, 0x29, + 0x20, 0x32, 0x30, 0x30, 0x36, 0x20, 0x45, 0x6e, 0x74, 0x72, 0x75, + 0x73, 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x2d, 0x30, + 0x2b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x24, 0x45, 0x6e, 0x74, + 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, + 0xb6, 0x95, 0xb6, 0x43, 0x42, 0xfa, 0xc6, 0x6d, 0x2a, 0x6f, 0x48, + 0xdf, 0x94, 0x4c, 0x39, 0x57, 0x05, 0xee, 0xc3, 0x79, 0x11, 0x41, + 0x68, 0x36, 0xed, 0xec, 0xfe, 0x9a, 0x01, 0x8f, 0xa1, 0x38, 0x28, + 0xfc, 0xf7, 0x10, 0x46, 0x66, 0x2e, 0x4d, 0x1e, 0x1a, 0xb1, 0x1a, + 0x4e, 0xc6, 0xd1, 0xc0, 0x95, 0x88, 0xb0, 0xc9, 0xff, 0x31, 0x8b, + 0x33, 0x03, 0xdb, 0xb7, 0x83, 0x7b, 0x3e, 0x20, 0x84, 0x5e, 0xed, + 0xb2, 0x56, 0x28, 0xa7, 0xf8, 0xe0, 0xb9, 0x40, 0x71, 0x37, 0xc5, + 0xcb, 0x47, 0x0e, 0x97, 0x2a, 0x68, 0xc0, 0x22, 0x95, 0x62, 0x15, + 0xdb, 0x47, 0xd9, 0xf5, 0xd0, 0x2b, 0xff, 0x82, 0x4b, 0xc9, 0xad, + 0x3e, 0xde, 0x4c, 0xdb, 0x90, 0x80, 0x50, 0x3f, 0x09, 0x8a, 0x84, + 0x00, 0xec, 0x30, 0x0a, 0x3d, 0x18, 0xcd, 0xfb, 0xfd, 0x2a, 0x59, + 0x9a, 0x23, 0x95, 0x17, 0x2c, 0x45, 0x9e, 0x1f, 0x6e, 0x43, 0x79, + 0x6d, 0x0c, 0x5c, 0x98, 0xfe, 0x48, 0xa7, 0xc5, 0x23, 0x47, 0x5c, + 0x5e, 0xfd, 0x6e, 0xe7, 0x1e, 0xb4, 0xf6, 0x68, 0x45, 0xd1, 0x86, + 0x83, 0x5b, 0xa2, 0x8a, 0x8d, 0xb1, 0xe3, 0x29, 0x80, 0xfe, 0x25, + 0x71, 0x88, 0xad, 0xbe, 0xbc, 0x8f, 0xac, 0x52, 0x96, 0x4b, 0xaa, + 0x51, 0x8d, 0xe4, 0x13, 0x31, 0x19, 0xe8, 0x4e, 0x4d, 0x9f, 0xdb, + 0xac, 0xb3, 0x6a, 0xd5, 0xbc, 0x39, 0x54, 0x71, 0xca, 0x7a, 0x7a, + 0x7f, 0x90, 0xdd, 0x7d, 0x1d, 0x80, 0xd9, 0x81, 0xbb, 0x59, 0x26, + 0xc2, 0x11, 0xfe, 0xe6, 0x93, 0xe2, 0xf7, 0x80, 0xe4, 0x65, 0xfb, + 0x34, 0x37, 0x0e, 0x29, 0x80, 0x70, 0x4d, 0xaf, 0x38, 0x86, 0x2e, + 0x9e, 0x7f, 0x57, 0xaf, 0x9e, 0x17, 0xae, 0xeb, 0x1c, 0xcb, 0x28, + 0x21, 0x5f, 0xb6, 0x1c, 0xd8, 0xe7, 0xa2, 0x04, 0x22, 0xf9, 0xd3, + 0xda, 0xd8, 0xcb, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xb0, + 0x30, 0x81, 0xad, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, + 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, + 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, + 0x01, 0x01, 0xff, 0x30, 0x2b, 0x06, 0x03, 0x55, 0x1d, 0x10, 0x04, + 0x24, 0x30, 0x22, 0x80, 0x0f, 0x32, 0x30, 0x30, 0x36, 0x31, 0x31, + 0x32, 0x37, 0x32, 0x30, 0x32, 0x33, 0x34, 0x32, 0x5a, 0x81, 0x0f, + 0x32, 0x30, 0x32, 0x36, 0x31, 0x31, 0x32, 0x37, 0x32, 0x30, 0x35, + 0x33, 0x34, 0x32, 0x5a, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, + 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x68, 0x90, 0xe4, 0x67, 0xa4, + 0xa6, 0x53, 0x80, 0xc7, 0x86, 0x66, 0xa4, 0xf1, 0xf7, 0x4b, 0x43, + 0xfb, 0x84, 0xbd, 0x6d, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, + 0x04, 0x16, 0x04, 0x14, 0x68, 0x90, 0xe4, 0x67, 0xa4, 0xa6, 0x53, + 0x80, 0xc7, 0x86, 0x66, 0xa4, 0xf1, 0xf7, 0x4b, 0x43, 0xfb, 0x84, + 0xbd, 0x6d, 0x30, 0x1d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf6, + 0x7d, 0x07, 0x41, 0x00, 0x04, 0x10, 0x30, 0x0e, 0x1b, 0x08, 0x56, + 0x37, 0x2e, 0x31, 0x3a, 0x34, 0x2e, 0x30, 0x03, 0x02, 0x04, 0x90, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x93, 0xd4, + 0x30, 0xb0, 0xd7, 0x03, 0x20, 0x2a, 0xd0, 0xf9, 0x63, 0xe8, 0x91, + 0x0c, 0x05, 0x20, 0xa9, 0x5f, 0x19, 0xca, 0x7b, 0x72, 0x4e, 0xd4, + 0xb1, 0xdb, 0xd0, 0x96, 0xfb, 0x54, 0x5a, 0x19, 0x2c, 0x0c, 0x08, + 0xf7, 0xb2, 0xbc, 0x85, 0xa8, 0x9d, 0x7f, 0x6d, 0x3b, 0x52, 0xb3, + 0x2a, 0xdb, 0xe7, 0xd4, 0x84, 0x8c, 0x63, 0xf6, 0x0f, 0xcb, 0x26, + 0x01, 0x91, 0x50, 0x6c, 0xf4, 0x5f, 0x14, 0xe2, 0x93, 0x74, 0xc0, + 0x13, 0x9e, 0x30, 0x3a, 0x50, 0xe3, 0xb4, 0x60, 0xc5, 0x1c, 0xf0, + 0x22, 0x44, 0x8d, 0x71, 0x47, 0xac, 0xc8, 0x1a, 0xc9, 0xe9, 0x9b, + 0x9a, 0x00, 0x60, 0x13, 0xff, 0x70, 0x7e, 0x5f, 0x11, 0x4d, 0x49, + 0x1b, 0xb3, 0x15, 0x52, 0x7b, 0xc9, 0x54, 0xda, 0xbf, 0x9d, 0x95, + 0xaf, 0x6b, 0x9a, 0xd8, 0x9e, 0xe9, 0xf1, 0xe4, 0x43, 0x8d, 0xe2, + 0x11, 0x44, 0x3a, 0xbf, 0xaf, 0xbd, 0x83, 0x42, 0x73, 0x52, 0x8b, + 0xaa, 0xbb, 0xa7, 0x29, 0xcf, 0xf5, 0x64, 0x1c, 0x0a, 0x4d, 0xd1, + 0xbc, 0xaa, 0xac, 0x9f, 0x2a, 0xd0, 0xff, 0x7f, 0x7f, 0xda, 0x7d, + 0xea, 0xb1, 0xed, 0x30, 0x25, 0xc1, 0x84, 0xda, 0x34, 0xd2, 0x5b, + 0x78, 0x83, 0x56, 0xec, 0x9c, 0x36, 0xc3, 0x26, 0xe2, 0x11, 0xf6, + 0x67, 0x49, 0x1d, 0x92, 0xab, 0x8c, 0xfb, 0xeb, 0xff, 0x7a, 0xee, + 0x85, 0x4a, 0xa7, 0x50, 0x80, 0xf0, 0xa7, 0x5c, 0x4a, 0x94, 0x2e, + 0x5f, 0x05, 0x99, 0x3c, 0x52, 0x41, 0xe0, 0xcd, 0xb4, 0x63, 0xcf, + 0x01, 0x43, 0xba, 0x9c, 0x83, 0xdc, 0x8f, 0x60, 0x3b, 0xf3, 0x5a, + 0xb4, 0xb4, 0x7b, 0xae, 0xda, 0x0b, 0x90, 0x38, 0x75, 0xef, 0x81, + 0x1d, 0x66, 0xd2, 0xf7, 0x57, 0x70, 0x36, 0xb3, 0xbf, 0xfc, 0x28, + 0xaf, 0x71, 0x25, 0x85, 0x5b, 0x13, 0xfe, 0x1e, 0x7f, 0x5a, 0xb4, + 0x3c, 0x30, 0x82, 0x03, 0x61, 0x30, 0x82, 0x02, 0x49, 0xa0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x10, 0x0a, 0x01, 0x01, 0x01, 0x00, 0x00, + 0x02, 0x7c, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, - 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb7, 0x8f, 0x55, 0x71, 0xd2, - 0x80, 0xdd, 0x7b, 0x69, 0x79, 0xa7, 0xf0, 0x18, 0x50, 0x32, 0x3c, - 0x62, 0x67, 0xf6, 0x0a, 0x95, 0x07, 0xdd, 0xe6, 0x1b, 0xf3, 0x9e, - 0xd9, 0xd2, 0x41, 0x54, 0x6b, 0xad, 0x9f, 0x7c, 0xbe, 0x19, 0xcd, - 0xfb, 0x46, 0xab, 0x41, 0x68, 0x1e, 0x18, 0xea, 0x55, 0xc8, 0x2f, - 0x91, 0x78, 0x89, 0x28, 0xfb, 0x27, 0x29, 0x60, 0xff, 0xdf, 0x8f, - 0x8c, 0x3b, 0xc9, 0x49, 0x9b, 0xb5, 0xa4, 0x94, 0xce, 0x01, 0xea, - 0x3e, 0xb5, 0x63, 0x7b, 0x7f, 0x26, 0xfd, 0x19, 0xdd, 0xc0, 0x21, - 0xbd, 0x84, 0xd1, 0x2d, 0x4f, 0x46, 0xc3, 0x4e, 0xdc, 0xd8, 0x37, - 0x39, 0x3b, 0x28, 0xaf, 0xcb, 0x9d, 0x1a, 0xea, 0x2b, 0xaf, 0x21, - 0xa5, 0xc1, 0x23, 0x22, 0xb8, 0xb8, 0x1b, 0x5a, 0x13, 0x87, 0x57, - 0x83, 0xd1, 0xf0, 0x20, 0xe7, 0xe8, 0x4f, 0x23, 0x42, 0xb0, 0x00, - 0xa5, 0x7d, 0x89, 0xe9, 0xe9, 0x61, 0x73, 0x94, 0x98, 0x71, 0x26, - 0xbc, 0x2d, 0x6a, 0xe0, 0xf7, 0x4d, 0xf0, 0xf1, 0xb6, 0x2a, 0x38, - 0x31, 0x81, 0x0d, 0x29, 0xe1, 0x00, 0xc1, 0x51, 0x0f, 0x4c, 0x52, - 0xf8, 0x04, 0x5a, 0xaa, 0x7d, 0x72, 0xd3, 0xb8, 0x87, 0x2a, 0xbb, - 0x63, 0x10, 0x03, 0x2a, 0xb3, 0xa1, 0x4f, 0x0d, 0x5a, 0x5e, 0x46, - 0xb7, 0x3d, 0x0e, 0xf5, 0x74, 0xec, 0x99, 0x9f, 0xf9, 0x3d, 0x24, - 0x81, 0x88, 0xa6, 0xdd, 0x60, 0x54, 0xe8, 0x95, 0x36, 0x3d, 0xc6, - 0x09, 0x93, 0x9a, 0xa3, 0x12, 0x80, 0x00, 0x55, 0x99, 0x19, 0x47, - 0xbd, 0xd0, 0xa5, 0x7c, 0xc3, 0xba, 0xfb, 0x1f, 0xf7, 0xf5, 0x0f, - 0xf8, 0xac, 0xb9, 0xb5, 0xf4, 0x37, 0x98, 0x13, 0x18, 0xde, 0x85, - 0x5b, 0xb7, 0x0c, 0x82, 0x3b, 0x87, 0x6f, 0x95, 0x39, 0x58, 0x30, - 0xda, 0x6e, 0x01, 0x68, 0x17, 0x22, 0xcc, 0xc0, 0x0b, 0x02, 0x03, - 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, 0x06, 0x03, - 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, - 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, - 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1f, 0x06, 0x03, - 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x07, 0xc3, - 0x51, 0x30, 0xa4, 0xaa, 0xe9, 0x45, 0xae, 0x35, 0x24, 0xfa, 0xff, - 0x24, 0x2c, 0x33, 0xd0, 0xb1, 0x9d, 0x8c, 0x30, 0x1d, 0x06, 0x03, - 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x07, 0xc3, 0x51, 0x30, - 0xa4, 0xaa, 0xe9, 0x45, 0xae, 0x35, 0x24, 0xfa, 0xff, 0x24, 0x2c, - 0x33, 0xd0, 0xb1, 0x9d, 0x8c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, - 0x01, 0x01, 0x00, 0x5f, 0x3e, 0x86, 0x76, 0x6e, 0xb8, 0x35, 0x3c, - 0x4e, 0x36, 0x1c, 0x1e, 0x79, 0x98, 0xbf, 0xfd, 0xd5, 0x12, 0x11, - 0x79, 0x52, 0x0e, 0xee, 0x31, 0x89, 0xbc, 0xdd, 0x7f, 0xf9, 0xd1, - 0xc6, 0x15, 0x21, 0xe8, 0x8a, 0x01, 0x54, 0x0d, 0x3a, 0xfb, 0x54, - 0xb9, 0xd6, 0x63, 0xd4, 0xb1, 0xaa, 0x96, 0x4d, 0xa2, 0x42, 0x4d, - 0xd4, 0x53, 0x1f, 0x8b, 0x10, 0xde, 0x7f, 0x65, 0xbe, 0x60, 0x13, - 0x27, 0x71, 0x88, 0xa4, 0x73, 0xe3, 0x84, 0x63, 0xd1, 0xa4, 0x55, - 0xe1, 0x50, 0x93, 0xe6, 0x1b, 0x0e, 0x79, 0xd0, 0x67, 0xbc, 0x46, - 0xc8, 0xbf, 0x3f, 0x17, 0x0d, 0x95, 0xe6, 0xc6, 0x90, 0x69, 0xde, - 0xe7, 0xb4, 0x2f, 0xde, 0x95, 0x7d, 0xd0, 0x12, 0x3f, 0x3d, 0x3e, - 0x7f, 0x4d, 0x3f, 0x14, 0x68, 0xf5, 0x11, 0x50, 0xd5, 0xc1, 0xf4, - 0x90, 0xa5, 0x08, 0x1d, 0x31, 0x60, 0xff, 0x60, 0x8c, 0x23, 0x54, - 0x0a, 0xaf, 0xfe, 0xa1, 0x6e, 0xc5, 0xd1, 0x7a, 0x2a, 0x68, 0x78, - 0xcf, 0x1e, 0x82, 0x0a, 0x20, 0xb4, 0x1f, 0xad, 0xe5, 0x85, 0xb2, - 0x6a, 0x68, 0x75, 0x4e, 0xad, 0x25, 0x37, 0x94, 0x85, 0xbe, 0xbd, - 0xa1, 0xd4, 0xea, 0xb7, 0x0c, 0x4b, 0x3c, 0x9d, 0xe8, 0x12, 0x00, - 0xf0, 0x5f, 0xac, 0x0d, 0xe1, 0xac, 0x70, 0x63, 0x73, 0xf7, 0x7f, - 0x79, 0x9f, 0x32, 0x25, 0x42, 0x74, 0x05, 0x80, 0x28, 0xbf, 0xbd, - 0xc1, 0x24, 0x96, 0x58, 0x15, 0xb1, 0x17, 0x21, 0xe9, 0x89, 0x4b, - 0xdb, 0x07, 0x88, 0x67, 0xf4, 0x15, 0xad, 0x70, 0x3e, 0x2f, 0x4d, - 0x85, 0x3b, 0xc2, 0xb7, 0xdb, 0xfe, 0x98, 0x68, 0x23, 0x89, 0xe1, - 0x74, 0x0f, 0xde, 0xf4, 0xc5, 0x84, 0x63, 0x29, 0x1b, 0xcc, 0xcb, - 0x07, 0xc9, 0x00, 0xa4, 0xa9, 0xd7, 0xc2, 0x22, 0x4f, 0x67, 0xd7, - 0x77, 0xec, 0x20, 0x05, 0x61, 0xde, 0x30, 0x82, 0x03, 0x54, 0x30, - 0x82, 0x02, 0x3c, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x02, - 0x34, 0x56, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x42, 0x31, 0x0b, 0x30, + 0x05, 0x05, 0x00, 0x30, 0x3a, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, + 0x55, 0x04, 0x0a, 0x13, 0x10, 0x52, 0x53, 0x41, 0x20, 0x53, 0x65, + 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x49, 0x6e, 0x63, 0x31, + 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x14, 0x52, + 0x53, 0x41, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x20, 0x32, 0x30, 0x34, 0x38, 0x20, 0x56, 0x33, 0x30, 0x1e, 0x17, + 0x0d, 0x30, 0x31, 0x30, 0x32, 0x32, 0x32, 0x32, 0x30, 0x33, 0x39, + 0x32, 0x33, 0x5a, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x32, 0x32, 0x32, + 0x32, 0x30, 0x33, 0x39, 0x32, 0x33, 0x5a, 0x30, 0x3a, 0x31, 0x19, + 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x52, 0x53, + 0x41, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, + 0x49, 0x6e, 0x63, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, + 0x0b, 0x13, 0x14, 0x52, 0x53, 0x41, 0x20, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x20, 0x32, 0x30, 0x34, 0x38, 0x20, 0x56, + 0x33, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, + 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, + 0x00, 0xb7, 0x8f, 0x55, 0x71, 0xd2, 0x80, 0xdd, 0x7b, 0x69, 0x79, + 0xa7, 0xf0, 0x18, 0x50, 0x32, 0x3c, 0x62, 0x67, 0xf6, 0x0a, 0x95, + 0x07, 0xdd, 0xe6, 0x1b, 0xf3, 0x9e, 0xd9, 0xd2, 0x41, 0x54, 0x6b, + 0xad, 0x9f, 0x7c, 0xbe, 0x19, 0xcd, 0xfb, 0x46, 0xab, 0x41, 0x68, + 0x1e, 0x18, 0xea, 0x55, 0xc8, 0x2f, 0x91, 0x78, 0x89, 0x28, 0xfb, + 0x27, 0x29, 0x60, 0xff, 0xdf, 0x8f, 0x8c, 0x3b, 0xc9, 0x49, 0x9b, + 0xb5, 0xa4, 0x94, 0xce, 0x01, 0xea, 0x3e, 0xb5, 0x63, 0x7b, 0x7f, + 0x26, 0xfd, 0x19, 0xdd, 0xc0, 0x21, 0xbd, 0x84, 0xd1, 0x2d, 0x4f, + 0x46, 0xc3, 0x4e, 0xdc, 0xd8, 0x37, 0x39, 0x3b, 0x28, 0xaf, 0xcb, + 0x9d, 0x1a, 0xea, 0x2b, 0xaf, 0x21, 0xa5, 0xc1, 0x23, 0x22, 0xb8, + 0xb8, 0x1b, 0x5a, 0x13, 0x87, 0x57, 0x83, 0xd1, 0xf0, 0x20, 0xe7, + 0xe8, 0x4f, 0x23, 0x42, 0xb0, 0x00, 0xa5, 0x7d, 0x89, 0xe9, 0xe9, + 0x61, 0x73, 0x94, 0x98, 0x71, 0x26, 0xbc, 0x2d, 0x6a, 0xe0, 0xf7, + 0x4d, 0xf0, 0xf1, 0xb6, 0x2a, 0x38, 0x31, 0x81, 0x0d, 0x29, 0xe1, + 0x00, 0xc1, 0x51, 0x0f, 0x4c, 0x52, 0xf8, 0x04, 0x5a, 0xaa, 0x7d, + 0x72, 0xd3, 0xb8, 0x87, 0x2a, 0xbb, 0x63, 0x10, 0x03, 0x2a, 0xb3, + 0xa1, 0x4f, 0x0d, 0x5a, 0x5e, 0x46, 0xb7, 0x3d, 0x0e, 0xf5, 0x74, + 0xec, 0x99, 0x9f, 0xf9, 0x3d, 0x24, 0x81, 0x88, 0xa6, 0xdd, 0x60, + 0x54, 0xe8, 0x95, 0x36, 0x3d, 0xc6, 0x09, 0x93, 0x9a, 0xa3, 0x12, + 0x80, 0x00, 0x55, 0x99, 0x19, 0x47, 0xbd, 0xd0, 0xa5, 0x7c, 0xc3, + 0xba, 0xfb, 0x1f, 0xf7, 0xf5, 0x0f, 0xf8, 0xac, 0xb9, 0xb5, 0xf4, + 0x37, 0x98, 0x13, 0x18, 0xde, 0x85, 0x5b, 0xb7, 0x0c, 0x82, 0x3b, + 0x87, 0x6f, 0x95, 0x39, 0x58, 0x30, 0xda, 0x6e, 0x01, 0x68, 0x17, + 0x22, 0xcc, 0xc0, 0x0b, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, + 0x30, 0x61, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, + 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, + 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, + 0x01, 0x06, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, + 0x30, 0x16, 0x80, 0x14, 0x07, 0xc3, 0x51, 0x30, 0xa4, 0xaa, 0xe9, + 0x45, 0xae, 0x35, 0x24, 0xfa, 0xff, 0x24, 0x2c, 0x33, 0xd0, 0xb1, + 0x9d, 0x8c, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, + 0x04, 0x14, 0x07, 0xc3, 0x51, 0x30, 0xa4, 0xaa, 0xe9, 0x45, 0xae, + 0x35, 0x24, 0xfa, 0xff, 0x24, 0x2c, 0x33, 0xd0, 0xb1, 0x9d, 0x8c, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x5f, 0x3e, + 0x86, 0x76, 0x6e, 0xb8, 0x35, 0x3c, 0x4e, 0x36, 0x1c, 0x1e, 0x79, + 0x98, 0xbf, 0xfd, 0xd5, 0x12, 0x11, 0x79, 0x52, 0x0e, 0xee, 0x31, + 0x89, 0xbc, 0xdd, 0x7f, 0xf9, 0xd1, 0xc6, 0x15, 0x21, 0xe8, 0x8a, + 0x01, 0x54, 0x0d, 0x3a, 0xfb, 0x54, 0xb9, 0xd6, 0x63, 0xd4, 0xb1, + 0xaa, 0x96, 0x4d, 0xa2, 0x42, 0x4d, 0xd4, 0x53, 0x1f, 0x8b, 0x10, + 0xde, 0x7f, 0x65, 0xbe, 0x60, 0x13, 0x27, 0x71, 0x88, 0xa4, 0x73, + 0xe3, 0x84, 0x63, 0xd1, 0xa4, 0x55, 0xe1, 0x50, 0x93, 0xe6, 0x1b, + 0x0e, 0x79, 0xd0, 0x67, 0xbc, 0x46, 0xc8, 0xbf, 0x3f, 0x17, 0x0d, + 0x95, 0xe6, 0xc6, 0x90, 0x69, 0xde, 0xe7, 0xb4, 0x2f, 0xde, 0x95, + 0x7d, 0xd0, 0x12, 0x3f, 0x3d, 0x3e, 0x7f, 0x4d, 0x3f, 0x14, 0x68, + 0xf5, 0x11, 0x50, 0xd5, 0xc1, 0xf4, 0x90, 0xa5, 0x08, 0x1d, 0x31, + 0x60, 0xff, 0x60, 0x8c, 0x23, 0x54, 0x0a, 0xaf, 0xfe, 0xa1, 0x6e, + 0xc5, 0xd1, 0x7a, 0x2a, 0x68, 0x78, 0xcf, 0x1e, 0x82, 0x0a, 0x20, + 0xb4, 0x1f, 0xad, 0xe5, 0x85, 0xb2, 0x6a, 0x68, 0x75, 0x4e, 0xad, + 0x25, 0x37, 0x94, 0x85, 0xbe, 0xbd, 0xa1, 0xd4, 0xea, 0xb7, 0x0c, + 0x4b, 0x3c, 0x9d, 0xe8, 0x12, 0x00, 0xf0, 0x5f, 0xac, 0x0d, 0xe1, + 0xac, 0x70, 0x63, 0x73, 0xf7, 0x7f, 0x79, 0x9f, 0x32, 0x25, 0x42, + 0x74, 0x05, 0x80, 0x28, 0xbf, 0xbd, 0xc1, 0x24, 0x96, 0x58, 0x15, + 0xb1, 0x17, 0x21, 0xe9, 0x89, 0x4b, 0xdb, 0x07, 0x88, 0x67, 0xf4, + 0x15, 0xad, 0x70, 0x3e, 0x2f, 0x4d, 0x85, 0x3b, 0xc2, 0xb7, 0xdb, + 0xfe, 0x98, 0x68, 0x23, 0x89, 0xe1, 0x74, 0x0f, 0xde, 0xf4, 0xc5, + 0x84, 0x63, 0x29, 0x1b, 0xcc, 0xcb, 0x07, 0xc9, 0x00, 0xa4, 0xa9, + 0xd7, 0xc2, 0x22, 0x4f, 0x67, 0xd7, 0x77, 0xec, 0x20, 0x05, 0x61, + 0xde, 0x30, 0x82, 0x03, 0x54, 0x30, 0x82, 0x02, 0x3c, 0xa0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x03, 0x02, 0x34, 0x56, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x30, 0x42, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, + 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, + 0x73, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x1b, 0x30, 0x19, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x47, 0x65, 0x6f, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x32, 0x30, 0x35, + 0x32, 0x31, 0x30, 0x34, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, + 0x32, 0x32, 0x30, 0x35, 0x32, 0x31, 0x30, 0x34, 0x30, 0x30, 0x30, + 0x30, 0x5a, 0x30, 0x42, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, + 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x47, 0x65, 0x6f, 0x54, 0x72, + 0x75, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x1b, 0x30, + 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x47, 0x65, 0x6f, + 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, + 0x82, 0x01, 0x01, 0x00, 0xda, 0xcc, 0x18, 0x63, 0x30, 0xfd, 0xf4, + 0x17, 0x23, 0x1a, 0x56, 0x7e, 0x5b, 0xdf, 0x3c, 0x6c, 0x38, 0xe4, + 0x71, 0xb7, 0x78, 0x91, 0xd4, 0xbc, 0xa1, 0xd8, 0x4c, 0xf8, 0xa8, + 0x43, 0xb6, 0x03, 0xe9, 0x4d, 0x21, 0x07, 0x08, 0x88, 0xda, 0x58, + 0x2f, 0x66, 0x39, 0x29, 0xbd, 0x05, 0x78, 0x8b, 0x9d, 0x38, 0xe8, + 0x05, 0xb7, 0x6a, 0x7e, 0x71, 0xa4, 0xe6, 0xc4, 0x60, 0xa6, 0xb0, + 0xef, 0x80, 0xe4, 0x89, 0x28, 0x0f, 0x9e, 0x25, 0xd6, 0xed, 0x83, + 0xf3, 0xad, 0xa6, 0x91, 0xc7, 0x98, 0xc9, 0x42, 0x18, 0x35, 0x14, + 0x9d, 0xad, 0x98, 0x46, 0x92, 0x2e, 0x4f, 0xca, 0xf1, 0x87, 0x43, + 0xc1, 0x16, 0x95, 0x57, 0x2d, 0x50, 0xef, 0x89, 0x2d, 0x80, 0x7a, + 0x57, 0xad, 0xf2, 0xee, 0x5f, 0x6b, 0xd2, 0x00, 0x8d, 0xb9, 0x14, + 0xf8, 0x14, 0x15, 0x35, 0xd9, 0xc0, 0x46, 0xa3, 0x7b, 0x72, 0xc8, + 0x91, 0xbf, 0xc9, 0x55, 0x2b, 0xcd, 0xd0, 0x97, 0x3e, 0x9c, 0x26, + 0x64, 0xcc, 0xdf, 0xce, 0x83, 0x19, 0x71, 0xca, 0x4e, 0xe6, 0xd4, + 0xd5, 0x7b, 0xa9, 0x19, 0xcd, 0x55, 0xde, 0xc8, 0xec, 0xd2, 0x5e, + 0x38, 0x53, 0xe5, 0x5c, 0x4f, 0x8c, 0x2d, 0xfe, 0x50, 0x23, 0x36, + 0xfc, 0x66, 0xe6, 0xcb, 0x8e, 0xa4, 0x39, 0x19, 0x00, 0xb7, 0x95, + 0x02, 0x39, 0x91, 0x0b, 0x0e, 0xfe, 0x38, 0x2e, 0xd1, 0x1d, 0x05, + 0x9a, 0xf6, 0x4d, 0x3e, 0x6f, 0x0f, 0x07, 0x1d, 0xaf, 0x2c, 0x1e, + 0x8f, 0x60, 0x39, 0xe2, 0xfa, 0x36, 0x53, 0x13, 0x39, 0xd4, 0x5e, + 0x26, 0x2b, 0xdb, 0x3d, 0xa8, 0x14, 0xbd, 0x32, 0xeb, 0x18, 0x03, + 0x28, 0x52, 0x04, 0x71, 0xe5, 0xab, 0x33, 0x3d, 0xe1, 0x38, 0xbb, + 0x07, 0x36, 0x84, 0x62, 0x9c, 0x79, 0xea, 0x16, 0x30, 0xf4, 0x5f, + 0xc0, 0x2b, 0xe8, 0x71, 0x6b, 0xe4, 0xf9, 0x02, 0x03, 0x01, 0x00, + 0x01, 0xa3, 0x53, 0x30, 0x51, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, + 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0xc0, 0x7a, 0x98, 0x68, 0x8d, 0x89, 0xfb, 0xab, 0x05, 0x64, 0x0c, + 0x11, 0x7d, 0xaa, 0x7d, 0x65, 0xb8, 0xca, 0xcc, 0x4e, 0x30, 0x1f, + 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, + 0xc0, 0x7a, 0x98, 0x68, 0x8d, 0x89, 0xfb, 0xab, 0x05, 0x64, 0x0c, + 0x11, 0x7d, 0xaa, 0x7d, 0x65, 0xb8, 0xca, 0xcc, 0x4e, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x35, 0xe3, 0x29, 0x6a, + 0xe5, 0x2f, 0x5d, 0x54, 0x8e, 0x29, 0x50, 0x94, 0x9f, 0x99, 0x1a, + 0x14, 0xe4, 0x8f, 0x78, 0x2a, 0x62, 0x94, 0xa2, 0x27, 0x67, 0x9e, + 0xd0, 0xcf, 0x1a, 0x5e, 0x47, 0xe9, 0xc1, 0xb2, 0xa4, 0xcf, 0xdd, + 0x41, 0x1a, 0x05, 0x4e, 0x9b, 0x4b, 0xee, 0x4a, 0x6f, 0x55, 0x52, + 0xb3, 0x24, 0xa1, 0x37, 0x0a, 0xeb, 0x64, 0x76, 0x2a, 0x2e, 0x2c, + 0xf3, 0xfd, 0x3b, 0x75, 0x90, 0xbf, 0xfa, 0x71, 0xd8, 0xc7, 0x3d, + 0x37, 0xd2, 0xb5, 0x05, 0x95, 0x62, 0xb9, 0xa6, 0xde, 0x89, 0x3d, + 0x36, 0x7b, 0x38, 0x77, 0x48, 0x97, 0xac, 0xa6, 0x20, 0x8f, 0x2e, + 0xa6, 0xc9, 0x0c, 0xc2, 0xb2, 0x99, 0x45, 0x00, 0xc7, 0xce, 0x11, + 0x51, 0x22, 0x22, 0xe0, 0xa5, 0xea, 0xb6, 0x15, 0x48, 0x09, 0x64, + 0xea, 0x5e, 0x4f, 0x74, 0xf7, 0x05, 0x3e, 0xc7, 0x8a, 0x52, 0x0c, + 0xdb, 0x15, 0xb4, 0xbd, 0x6d, 0x9b, 0xe5, 0xc6, 0xb1, 0x54, 0x68, + 0xa9, 0xe3, 0x69, 0x90, 0xb6, 0x9a, 0xa5, 0x0f, 0xb8, 0xb9, 0x3f, + 0x20, 0x7d, 0xae, 0x4a, 0xb5, 0xb8, 0x9c, 0xe4, 0x1d, 0xb6, 0xab, + 0xe6, 0x94, 0xa5, 0xc1, 0xc7, 0x83, 0xad, 0xdb, 0xf5, 0x27, 0x87, + 0x0e, 0x04, 0x6c, 0xd5, 0xff, 0xdd, 0xa0, 0x5d, 0xed, 0x87, 0x52, + 0xb7, 0x2b, 0x15, 0x02, 0xae, 0x39, 0xa6, 0x6a, 0x74, 0xe9, 0xda, + 0xc4, 0xe7, 0xbc, 0x4d, 0x34, 0x1e, 0xa9, 0x5c, 0x4d, 0x33, 0x5f, + 0x92, 0x09, 0x2f, 0x88, 0x66, 0x5d, 0x77, 0x97, 0xc7, 0x1d, 0x76, + 0x13, 0xa9, 0xd5, 0xe5, 0xf1, 0x16, 0x09, 0x11, 0x35, 0xd5, 0xac, + 0xdb, 0x24, 0x71, 0x70, 0x2c, 0x98, 0x56, 0x0b, 0xd9, 0x17, 0xb4, + 0xd1, 0xe3, 0x51, 0x2b, 0x5e, 0x75, 0xe8, 0xd5, 0xd0, 0xdc, 0x4f, + 0x34, 0xed, 0xc2, 0x05, 0x66, 0x80, 0xa1, 0xcb, 0xe6, 0x33, 0x30, + 0x82, 0x03, 0x66, 0x30, 0x82, 0x02, 0x4e, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x44, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, + 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x0d, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x49, + 0x6e, 0x63, 0x2e, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x14, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, + 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x43, 0x41, 0x20, + 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x34, 0x30, 0x33, 0x30, 0x34, + 0x30, 0x35, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x31, 0x39, + 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, 0x30, 0x30, 0x30, 0x30, 0x5a, + 0x30, 0x44, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x13, 0x0d, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x1d, 0x30, 0x1b, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x13, 0x14, 0x47, 0x65, 0x6f, 0x54, 0x72, + 0x75, 0x73, 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, + 0x43, 0x41, 0x20, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, + 0x82, 0x01, 0x01, 0x00, 0xef, 0x3c, 0x4d, 0x40, 0x3d, 0x10, 0xdf, + 0x3b, 0x53, 0x00, 0xe1, 0x67, 0xfe, 0x94, 0x60, 0x15, 0x3e, 0x85, + 0x88, 0xf1, 0x89, 0x0d, 0x90, 0xc8, 0x28, 0x23, 0x99, 0x05, 0xe8, + 0x2b, 0x20, 0x9d, 0xc6, 0xf3, 0x60, 0x46, 0xd8, 0xc1, 0xb2, 0xd5, + 0x8c, 0x31, 0xd9, 0xdc, 0x20, 0x79, 0x24, 0x81, 0xbf, 0x35, 0x32, + 0xfc, 0x63, 0x69, 0xdb, 0xb1, 0x2a, 0x6b, 0xee, 0x21, 0x58, 0xf2, + 0x08, 0xe9, 0x78, 0xcb, 0x6f, 0xcb, 0xfc, 0x16, 0x52, 0xc8, 0x91, + 0xc4, 0xff, 0x3d, 0x73, 0xde, 0xb1, 0x3e, 0xa7, 0xc2, 0x7d, 0x66, + 0xc1, 0xf5, 0x7e, 0x52, 0x24, 0x1a, 0xe2, 0xd5, 0x67, 0x91, 0xd0, + 0x82, 0x10, 0xd7, 0x78, 0x4b, 0x4f, 0x2b, 0x42, 0x39, 0xbd, 0x64, + 0x2d, 0x40, 0xa0, 0xb0, 0x10, 0xd3, 0x38, 0x48, 0x46, 0x88, 0xa1, + 0x0c, 0xbb, 0x3a, 0x33, 0x2a, 0x62, 0x98, 0xfb, 0x00, 0x9d, 0x13, + 0x59, 0x7f, 0x6f, 0x3b, 0x72, 0xaa, 0xee, 0xa6, 0x0f, 0x86, 0xf9, + 0x05, 0x61, 0xea, 0x67, 0x7f, 0x0c, 0x37, 0x96, 0x8b, 0xe6, 0x69, + 0x16, 0x47, 0x11, 0xc2, 0x27, 0x59, 0x03, 0xb3, 0xa6, 0x60, 0xc2, + 0x21, 0x40, 0x56, 0xfa, 0xa0, 0xc7, 0x7d, 0x3a, 0x13, 0xe3, 0xec, + 0x57, 0xc7, 0xb3, 0xd6, 0xae, 0x9d, 0x89, 0x80, 0xf7, 0x01, 0xe7, + 0x2c, 0xf6, 0x96, 0x2b, 0x13, 0x0d, 0x79, 0x2c, 0xd9, 0xc0, 0xe4, + 0x86, 0x7b, 0x4b, 0x8c, 0x0c, 0x72, 0x82, 0x8a, 0xfb, 0x17, 0xcd, + 0x00, 0x6c, 0x3a, 0x13, 0x3c, 0xb0, 0x84, 0x87, 0x4b, 0x16, 0x7a, + 0x29, 0xb2, 0x4f, 0xdb, 0x1d, 0xd4, 0x0b, 0xf3, 0x66, 0x37, 0xbd, + 0xd8, 0xf6, 0x57, 0xbb, 0x5e, 0x24, 0x7a, 0xb8, 0x3c, 0x8b, 0xb9, + 0xfa, 0x92, 0x1a, 0x1a, 0x84, 0x9e, 0xd8, 0x74, 0x8f, 0xaa, 0x1b, + 0x7f, 0x5e, 0xf4, 0xfe, 0x45, 0x22, 0x21, 0x02, 0x03, 0x01, 0x00, + 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, + 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0x71, 0x38, 0x36, 0xf2, 0x02, 0x31, 0x53, 0x47, 0x2b, 0x6e, 0xba, + 0x65, 0x46, 0xa9, 0x10, 0x15, 0x58, 0x20, 0x05, 0x09, 0x30, 0x1f, + 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, + 0x71, 0x38, 0x36, 0xf2, 0x02, 0x31, 0x53, 0x47, 0x2b, 0x6e, 0xba, + 0x65, 0x46, 0xa9, 0x10, 0x15, 0x58, 0x20, 0x05, 0x09, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, + 0x02, 0x01, 0x86, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, + 0x00, 0x03, 0xf7, 0xb5, 0x2b, 0xab, 0x5d, 0x10, 0xfc, 0x7b, 0xb2, + 0xb2, 0x5e, 0xac, 0x9b, 0x0e, 0x7e, 0x53, 0x78, 0x59, 0x3e, 0x42, + 0x04, 0xfe, 0x75, 0xa3, 0xad, 0xac, 0x81, 0x4e, 0xd7, 0x02, 0x8b, + 0x5e, 0xc4, 0x2d, 0xc8, 0x52, 0x76, 0xc7, 0x2c, 0x1f, 0xfc, 0x81, + 0x32, 0x98, 0xd1, 0x4b, 0xc6, 0x92, 0x93, 0x33, 0x35, 0x31, 0x2f, + 0xfc, 0xd8, 0x1d, 0x44, 0xdd, 0xe0, 0x81, 0x7f, 0x9d, 0xe9, 0x8b, + 0xe1, 0x64, 0x91, 0x62, 0x0b, 0x39, 0x08, 0x8c, 0xac, 0x74, 0x9d, + 0x59, 0xd9, 0x7a, 0x59, 0x52, 0x97, 0x11, 0xb9, 0x16, 0x7b, 0x6f, + 0x45, 0xd3, 0x96, 0xd9, 0x31, 0x7d, 0x02, 0x36, 0x0f, 0x9c, 0x3b, + 0x6e, 0xcf, 0x2c, 0x0d, 0x03, 0x46, 0x45, 0xeb, 0xa0, 0xf4, 0x7f, + 0x48, 0x44, 0xc6, 0x08, 0x40, 0xcc, 0xde, 0x1b, 0x70, 0xb5, 0x29, + 0xad, 0xba, 0x8b, 0x3b, 0x34, 0x65, 0x75, 0x1b, 0x71, 0x21, 0x1d, + 0x2c, 0x14, 0x0a, 0xb0, 0x96, 0x95, 0xb8, 0xd6, 0xea, 0xf2, 0x65, + 0xfb, 0x29, 0xba, 0x4f, 0xea, 0x91, 0x93, 0x74, 0x69, 0xb6, 0xf2, + 0xff, 0xe1, 0x1a, 0xd0, 0x0c, 0xd1, 0x76, 0x85, 0xcb, 0x8a, 0x25, + 0xbd, 0x97, 0x5e, 0x2c, 0x6f, 0x15, 0x99, 0x26, 0xe7, 0xb6, 0x29, + 0xff, 0x22, 0xec, 0xc9, 0x02, 0xc7, 0x56, 0x00, 0xcd, 0x49, 0xb9, + 0xb3, 0x6c, 0x7b, 0x53, 0x04, 0x1a, 0xe2, 0xa8, 0xc9, 0xaa, 0x12, + 0x05, 0x23, 0xc2, 0xce, 0xe7, 0xbb, 0x04, 0x02, 0xcc, 0xc0, 0x47, + 0xa2, 0xe4, 0xc4, 0x29, 0x2f, 0x5b, 0x45, 0x57, 0x89, 0x51, 0xee, + 0x3c, 0xeb, 0x52, 0x08, 0xff, 0x07, 0x35, 0x1e, 0x9f, 0x35, 0x6a, + 0x47, 0x4a, 0x56, 0x98, 0xd1, 0x5a, 0x85, 0x1f, 0x8c, 0xf5, 0x22, + 0xbf, 0xab, 0xce, 0x83, 0xf3, 0xe2, 0x22, 0x29, 0xae, 0x7d, 0x83, + 0x40, 0xa8, 0xba, 0x6c, 0x30, 0x82, 0x05, 0x68, 0x30, 0x82, 0x03, + 0x50, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, + 0x05, 0x00, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, + 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x47, 0x65, 0x6f, 0x54, 0x72, + 0x75, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x1e, 0x30, + 0x1c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x15, 0x47, 0x65, 0x6f, + 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, + 0x72, 0x73, 0x61, 0x6c, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, + 0x30, 0x34, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, 0x30, 0x30, 0x30, + 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x30, 0x33, 0x30, 0x34, 0x30, + 0x35, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x63, - 0x2e, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, - 0x12, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, - 0x0d, 0x30, 0x32, 0x30, 0x35, 0x32, 0x31, 0x30, 0x34, 0x30, 0x30, - 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x32, 0x30, 0x35, 0x32, 0x31, - 0x30, 0x34, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x42, 0x31, 0x0b, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, - 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, - 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x49, 0x6e, - 0x63, 0x2e, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, - 0x13, 0x12, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, - 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x43, 0x41, 0x30, 0x82, - 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, - 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xda, 0xcc, - 0x18, 0x63, 0x30, 0xfd, 0xf4, 0x17, 0x23, 0x1a, 0x56, 0x7e, 0x5b, - 0xdf, 0x3c, 0x6c, 0x38, 0xe4, 0x71, 0xb7, 0x78, 0x91, 0xd4, 0xbc, - 0xa1, 0xd8, 0x4c, 0xf8, 0xa8, 0x43, 0xb6, 0x03, 0xe9, 0x4d, 0x21, - 0x07, 0x08, 0x88, 0xda, 0x58, 0x2f, 0x66, 0x39, 0x29, 0xbd, 0x05, - 0x78, 0x8b, 0x9d, 0x38, 0xe8, 0x05, 0xb7, 0x6a, 0x7e, 0x71, 0xa4, - 0xe6, 0xc4, 0x60, 0xa6, 0xb0, 0xef, 0x80, 0xe4, 0x89, 0x28, 0x0f, - 0x9e, 0x25, 0xd6, 0xed, 0x83, 0xf3, 0xad, 0xa6, 0x91, 0xc7, 0x98, - 0xc9, 0x42, 0x18, 0x35, 0x14, 0x9d, 0xad, 0x98, 0x46, 0x92, 0x2e, - 0x4f, 0xca, 0xf1, 0x87, 0x43, 0xc1, 0x16, 0x95, 0x57, 0x2d, 0x50, - 0xef, 0x89, 0x2d, 0x80, 0x7a, 0x57, 0xad, 0xf2, 0xee, 0x5f, 0x6b, - 0xd2, 0x00, 0x8d, 0xb9, 0x14, 0xf8, 0x14, 0x15, 0x35, 0xd9, 0xc0, - 0x46, 0xa3, 0x7b, 0x72, 0xc8, 0x91, 0xbf, 0xc9, 0x55, 0x2b, 0xcd, - 0xd0, 0x97, 0x3e, 0x9c, 0x26, 0x64, 0xcc, 0xdf, 0xce, 0x83, 0x19, - 0x71, 0xca, 0x4e, 0xe6, 0xd4, 0xd5, 0x7b, 0xa9, 0x19, 0xcd, 0x55, - 0xde, 0xc8, 0xec, 0xd2, 0x5e, 0x38, 0x53, 0xe5, 0x5c, 0x4f, 0x8c, - 0x2d, 0xfe, 0x50, 0x23, 0x36, 0xfc, 0x66, 0xe6, 0xcb, 0x8e, 0xa4, - 0x39, 0x19, 0x00, 0xb7, 0x95, 0x02, 0x39, 0x91, 0x0b, 0x0e, 0xfe, - 0x38, 0x2e, 0xd1, 0x1d, 0x05, 0x9a, 0xf6, 0x4d, 0x3e, 0x6f, 0x0f, - 0x07, 0x1d, 0xaf, 0x2c, 0x1e, 0x8f, 0x60, 0x39, 0xe2, 0xfa, 0x36, - 0x53, 0x13, 0x39, 0xd4, 0x5e, 0x26, 0x2b, 0xdb, 0x3d, 0xa8, 0x14, - 0xbd, 0x32, 0xeb, 0x18, 0x03, 0x28, 0x52, 0x04, 0x71, 0xe5, 0xab, - 0x33, 0x3d, 0xe1, 0x38, 0xbb, 0x07, 0x36, 0x84, 0x62, 0x9c, 0x79, - 0xea, 0x16, 0x30, 0xf4, 0x5f, 0xc0, 0x2b, 0xe8, 0x71, 0x6b, 0xe4, - 0xf9, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x53, 0x30, 0x51, 0x30, - 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, - 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, - 0x0e, 0x04, 0x16, 0x04, 0x14, 0xc0, 0x7a, 0x98, 0x68, 0x8d, 0x89, - 0xfb, 0xab, 0x05, 0x64, 0x0c, 0x11, 0x7d, 0xaa, 0x7d, 0x65, 0xb8, - 0xca, 0xcc, 0x4e, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, - 0x18, 0x30, 0x16, 0x80, 0x14, 0xc0, 0x7a, 0x98, 0x68, 0x8d, 0x89, - 0xfb, 0xab, 0x05, 0x64, 0x0c, 0x11, 0x7d, 0xaa, 0x7d, 0x65, 0xb8, - 0xca, 0xcc, 0x4e, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, - 0x00, 0x35, 0xe3, 0x29, 0x6a, 0xe5, 0x2f, 0x5d, 0x54, 0x8e, 0x29, - 0x50, 0x94, 0x9f, 0x99, 0x1a, 0x14, 0xe4, 0x8f, 0x78, 0x2a, 0x62, - 0x94, 0xa2, 0x27, 0x67, 0x9e, 0xd0, 0xcf, 0x1a, 0x5e, 0x47, 0xe9, - 0xc1, 0xb2, 0xa4, 0xcf, 0xdd, 0x41, 0x1a, 0x05, 0x4e, 0x9b, 0x4b, - 0xee, 0x4a, 0x6f, 0x55, 0x52, 0xb3, 0x24, 0xa1, 0x37, 0x0a, 0xeb, - 0x64, 0x76, 0x2a, 0x2e, 0x2c, 0xf3, 0xfd, 0x3b, 0x75, 0x90, 0xbf, - 0xfa, 0x71, 0xd8, 0xc7, 0x3d, 0x37, 0xd2, 0xb5, 0x05, 0x95, 0x62, - 0xb9, 0xa6, 0xde, 0x89, 0x3d, 0x36, 0x7b, 0x38, 0x77, 0x48, 0x97, - 0xac, 0xa6, 0x20, 0x8f, 0x2e, 0xa6, 0xc9, 0x0c, 0xc2, 0xb2, 0x99, - 0x45, 0x00, 0xc7, 0xce, 0x11, 0x51, 0x22, 0x22, 0xe0, 0xa5, 0xea, - 0xb6, 0x15, 0x48, 0x09, 0x64, 0xea, 0x5e, 0x4f, 0x74, 0xf7, 0x05, - 0x3e, 0xc7, 0x8a, 0x52, 0x0c, 0xdb, 0x15, 0xb4, 0xbd, 0x6d, 0x9b, - 0xe5, 0xc6, 0xb1, 0x54, 0x68, 0xa9, 0xe3, 0x69, 0x90, 0xb6, 0x9a, - 0xa5, 0x0f, 0xb8, 0xb9, 0x3f, 0x20, 0x7d, 0xae, 0x4a, 0xb5, 0xb8, - 0x9c, 0xe4, 0x1d, 0xb6, 0xab, 0xe6, 0x94, 0xa5, 0xc1, 0xc7, 0x83, - 0xad, 0xdb, 0xf5, 0x27, 0x87, 0x0e, 0x04, 0x6c, 0xd5, 0xff, 0xdd, - 0xa0, 0x5d, 0xed, 0x87, 0x52, 0xb7, 0x2b, 0x15, 0x02, 0xae, 0x39, - 0xa6, 0x6a, 0x74, 0xe9, 0xda, 0xc4, 0xe7, 0xbc, 0x4d, 0x34, 0x1e, - 0xa9, 0x5c, 0x4d, 0x33, 0x5f, 0x92, 0x09, 0x2f, 0x88, 0x66, 0x5d, - 0x77, 0x97, 0xc7, 0x1d, 0x76, 0x13, 0xa9, 0xd5, 0xe5, 0xf1, 0x16, - 0x09, 0x11, 0x35, 0xd5, 0xac, 0xdb, 0x24, 0x71, 0x70, 0x2c, 0x98, - 0x56, 0x0b, 0xd9, 0x17, 0xb4, 0xd1, 0xe3, 0x51, 0x2b, 0x5e, 0x75, - 0xe8, 0xd5, 0xd0, 0xdc, 0x4f, 0x34, 0xed, 0xc2, 0x05, 0x66, 0x80, - 0xa1, 0xcb, 0xe6, 0x33, 0x30, 0x82, 0x03, 0x66, 0x30, 0x82, 0x02, - 0x4e, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, - 0x05, 0x00, 0x30, 0x44, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x47, 0x65, 0x6f, 0x54, 0x72, - 0x75, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x1d, 0x30, - 0x1b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x14, 0x47, 0x65, 0x6f, - 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x30, - 0x34, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, 0x30, 0x30, 0x30, 0x30, - 0x5a, 0x17, 0x0d, 0x31, 0x39, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, - 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x44, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x16, - 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x47, 0x65, - 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x2e, - 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x14, - 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x82, - 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, - 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xef, 0x3c, - 0x4d, 0x40, 0x3d, 0x10, 0xdf, 0x3b, 0x53, 0x00, 0xe1, 0x67, 0xfe, - 0x94, 0x60, 0x15, 0x3e, 0x85, 0x88, 0xf1, 0x89, 0x0d, 0x90, 0xc8, - 0x28, 0x23, 0x99, 0x05, 0xe8, 0x2b, 0x20, 0x9d, 0xc6, 0xf3, 0x60, - 0x46, 0xd8, 0xc1, 0xb2, 0xd5, 0x8c, 0x31, 0xd9, 0xdc, 0x20, 0x79, - 0x24, 0x81, 0xbf, 0x35, 0x32, 0xfc, 0x63, 0x69, 0xdb, 0xb1, 0x2a, - 0x6b, 0xee, 0x21, 0x58, 0xf2, 0x08, 0xe9, 0x78, 0xcb, 0x6f, 0xcb, - 0xfc, 0x16, 0x52, 0xc8, 0x91, 0xc4, 0xff, 0x3d, 0x73, 0xde, 0xb1, - 0x3e, 0xa7, 0xc2, 0x7d, 0x66, 0xc1, 0xf5, 0x7e, 0x52, 0x24, 0x1a, - 0xe2, 0xd5, 0x67, 0x91, 0xd0, 0x82, 0x10, 0xd7, 0x78, 0x4b, 0x4f, - 0x2b, 0x42, 0x39, 0xbd, 0x64, 0x2d, 0x40, 0xa0, 0xb0, 0x10, 0xd3, - 0x38, 0x48, 0x46, 0x88, 0xa1, 0x0c, 0xbb, 0x3a, 0x33, 0x2a, 0x62, - 0x98, 0xfb, 0x00, 0x9d, 0x13, 0x59, 0x7f, 0x6f, 0x3b, 0x72, 0xaa, - 0xee, 0xa6, 0x0f, 0x86, 0xf9, 0x05, 0x61, 0xea, 0x67, 0x7f, 0x0c, - 0x37, 0x96, 0x8b, 0xe6, 0x69, 0x16, 0x47, 0x11, 0xc2, 0x27, 0x59, - 0x03, 0xb3, 0xa6, 0x60, 0xc2, 0x21, 0x40, 0x56, 0xfa, 0xa0, 0xc7, - 0x7d, 0x3a, 0x13, 0xe3, 0xec, 0x57, 0xc7, 0xb3, 0xd6, 0xae, 0x9d, - 0x89, 0x80, 0xf7, 0x01, 0xe7, 0x2c, 0xf6, 0x96, 0x2b, 0x13, 0x0d, - 0x79, 0x2c, 0xd9, 0xc0, 0xe4, 0x86, 0x7b, 0x4b, 0x8c, 0x0c, 0x72, - 0x82, 0x8a, 0xfb, 0x17, 0xcd, 0x00, 0x6c, 0x3a, 0x13, 0x3c, 0xb0, - 0x84, 0x87, 0x4b, 0x16, 0x7a, 0x29, 0xb2, 0x4f, 0xdb, 0x1d, 0xd4, - 0x0b, 0xf3, 0x66, 0x37, 0xbd, 0xd8, 0xf6, 0x57, 0xbb, 0x5e, 0x24, - 0x7a, 0xb8, 0x3c, 0x8b, 0xb9, 0xfa, 0x92, 0x1a, 0x1a, 0x84, 0x9e, - 0xd8, 0x74, 0x8f, 0xaa, 0x1b, 0x7f, 0x5e, 0xf4, 0xfe, 0x45, 0x22, - 0x21, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, - 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, - 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, - 0x0e, 0x04, 0x16, 0x04, 0x14, 0x71, 0x38, 0x36, 0xf2, 0x02, 0x31, - 0x53, 0x47, 0x2b, 0x6e, 0xba, 0x65, 0x46, 0xa9, 0x10, 0x15, 0x58, - 0x20, 0x05, 0x09, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, - 0x18, 0x30, 0x16, 0x80, 0x14, 0x71, 0x38, 0x36, 0xf2, 0x02, 0x31, - 0x53, 0x47, 0x2b, 0x6e, 0xba, 0x65, 0x46, 0xa9, 0x10, 0x15, 0x58, - 0x20, 0x05, 0x09, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, - 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, - 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x03, 0xf7, 0xb5, 0x2b, 0xab, - 0x5d, 0x10, 0xfc, 0x7b, 0xb2, 0xb2, 0x5e, 0xac, 0x9b, 0x0e, 0x7e, - 0x53, 0x78, 0x59, 0x3e, 0x42, 0x04, 0xfe, 0x75, 0xa3, 0xad, 0xac, - 0x81, 0x4e, 0xd7, 0x02, 0x8b, 0x5e, 0xc4, 0x2d, 0xc8, 0x52, 0x76, - 0xc7, 0x2c, 0x1f, 0xfc, 0x81, 0x32, 0x98, 0xd1, 0x4b, 0xc6, 0x92, - 0x93, 0x33, 0x35, 0x31, 0x2f, 0xfc, 0xd8, 0x1d, 0x44, 0xdd, 0xe0, - 0x81, 0x7f, 0x9d, 0xe9, 0x8b, 0xe1, 0x64, 0x91, 0x62, 0x0b, 0x39, - 0x08, 0x8c, 0xac, 0x74, 0x9d, 0x59, 0xd9, 0x7a, 0x59, 0x52, 0x97, - 0x11, 0xb9, 0x16, 0x7b, 0x6f, 0x45, 0xd3, 0x96, 0xd9, 0x31, 0x7d, - 0x02, 0x36, 0x0f, 0x9c, 0x3b, 0x6e, 0xcf, 0x2c, 0x0d, 0x03, 0x46, - 0x45, 0xeb, 0xa0, 0xf4, 0x7f, 0x48, 0x44, 0xc6, 0x08, 0x40, 0xcc, - 0xde, 0x1b, 0x70, 0xb5, 0x29, 0xad, 0xba, 0x8b, 0x3b, 0x34, 0x65, - 0x75, 0x1b, 0x71, 0x21, 0x1d, 0x2c, 0x14, 0x0a, 0xb0, 0x96, 0x95, - 0xb8, 0xd6, 0xea, 0xf2, 0x65, 0xfb, 0x29, 0xba, 0x4f, 0xea, 0x91, - 0x93, 0x74, 0x69, 0xb6, 0xf2, 0xff, 0xe1, 0x1a, 0xd0, 0x0c, 0xd1, - 0x76, 0x85, 0xcb, 0x8a, 0x25, 0xbd, 0x97, 0x5e, 0x2c, 0x6f, 0x15, - 0x99, 0x26, 0xe7, 0xb6, 0x29, 0xff, 0x22, 0xec, 0xc9, 0x02, 0xc7, - 0x56, 0x00, 0xcd, 0x49, 0xb9, 0xb3, 0x6c, 0x7b, 0x53, 0x04, 0x1a, - 0xe2, 0xa8, 0xc9, 0xaa, 0x12, 0x05, 0x23, 0xc2, 0xce, 0xe7, 0xbb, - 0x04, 0x02, 0xcc, 0xc0, 0x47, 0xa2, 0xe4, 0xc4, 0x29, 0x2f, 0x5b, - 0x45, 0x57, 0x89, 0x51, 0xee, 0x3c, 0xeb, 0x52, 0x08, 0xff, 0x07, - 0x35, 0x1e, 0x9f, 0x35, 0x6a, 0x47, 0x4a, 0x56, 0x98, 0xd1, 0x5a, - 0x85, 0x1f, 0x8c, 0xf5, 0x22, 0xbf, 0xab, 0xce, 0x83, 0xf3, 0xe2, - 0x22, 0x29, 0xae, 0x7d, 0x83, 0x40, 0xa8, 0xba, 0x6c, 0x30, 0x82, - 0x05, 0x68, 0x30, 0x82, 0x03, 0x50, 0xa0, 0x03, 0x02, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x45, 0x31, 0x0b, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, - 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, - 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x49, 0x6e, - 0x63, 0x2e, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x03, - 0x13, 0x15, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, - 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x20, 0x43, - 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x34, 0x30, 0x33, 0x30, 0x34, - 0x30, 0x35, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x39, - 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, 0x30, 0x30, 0x30, 0x30, 0x5a, - 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x13, 0x0d, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x1e, 0x30, 0x1c, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x13, 0x15, 0x47, 0x65, 0x6f, 0x54, 0x72, - 0x75, 0x73, 0x74, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, - 0x61, 0x6c, 0x20, 0x43, 0x41, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, - 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, - 0x02, 0x82, 0x02, 0x01, 0x00, 0xa6, 0x15, 0x55, 0xa0, 0xa3, 0xc6, - 0xe0, 0x1f, 0x8c, 0x9d, 0x21, 0x50, 0xd7, 0xc1, 0xbe, 0x2b, 0x5b, - 0xb5, 0xa4, 0x9e, 0xa1, 0xd9, 0x72, 0x58, 0xbd, 0x00, 0x1b, 0x4c, - 0xbf, 0x61, 0xc9, 0x14, 0x1d, 0x45, 0x82, 0xab, 0xc6, 0x1d, 0x80, - 0xd6, 0x3d, 0xeb, 0x10, 0x9c, 0x3a, 0xaf, 0x6d, 0x24, 0xf8, 0xbc, - 0x71, 0x01, 0x9e, 0x06, 0xf5, 0x7c, 0x5f, 0x1e, 0xc1, 0x0e, 0x55, - 0xca, 0x83, 0x9a, 0x59, 0x30, 0xae, 0x19, 0xcb, 0x30, 0x48, 0x95, - 0xed, 0x22, 0x37, 0x8d, 0xf4, 0x4a, 0x9a, 0x72, 0x66, 0x3e, 0xad, - 0x95, 0xc0, 0xe0, 0x16, 0x00, 0xe0, 0x10, 0x1f, 0x2b, 0x31, 0x0e, - 0xd7, 0x94, 0x54, 0xd3, 0x42, 0x33, 0xa0, 0x34, 0x1d, 0x1e, 0x45, - 0x76, 0xdd, 0x4f, 0xca, 0x18, 0x37, 0xec, 0x85, 0x15, 0x7a, 0x19, - 0x08, 0xfc, 0xd5, 0xc7, 0x9c, 0xf0, 0xf2, 0xa9, 0x2e, 0x10, 0xa9, - 0x92, 0xe6, 0x3d, 0x58, 0x3d, 0xa9, 0x16, 0x68, 0x3c, 0x2f, 0x75, - 0x21, 0x18, 0x7f, 0x28, 0x77, 0xa5, 0xe1, 0x61, 0x17, 0xb7, 0xa6, - 0xe9, 0xf8, 0x1e, 0x99, 0xdb, 0x73, 0x6e, 0xf4, 0x0a, 0xa2, 0x21, - 0x6c, 0xee, 0xda, 0xaa, 0x85, 0x92, 0x66, 0xaf, 0xf6, 0x7a, 0x6b, - 0x82, 0xda, 0xba, 0x22, 0x08, 0x35, 0x0f, 0xcf, 0x42, 0xf1, 0x35, - 0xfa, 0x6a, 0xee, 0x7e, 0x2b, 0x25, 0xcc, 0x3a, 0x11, 0xe4, 0x6d, - 0xaf, 0x73, 0xb2, 0x76, 0x1d, 0xad, 0xd0, 0xb2, 0x78, 0x67, 0x1a, - 0xa4, 0x39, 0x1c, 0x51, 0x0b, 0x67, 0x56, 0x83, 0xfd, 0x38, 0x5d, - 0x0d, 0xce, 0xdd, 0xf0, 0xbb, 0x2b, 0x96, 0x1f, 0xde, 0x7b, 0x32, - 0x52, 0xfd, 0x1d, 0xbb, 0xb5, 0x06, 0xa1, 0xb2, 0x21, 0x5e, 0xa5, - 0xd6, 0x95, 0x68, 0x7f, 0xf0, 0x99, 0x9e, 0xdc, 0x45, 0x08, 0x3e, - 0xe7, 0xd2, 0x09, 0x0d, 0x35, 0x94, 0xdd, 0x80, 0x4e, 0x53, 0x97, - 0xd7, 0xb5, 0x09, 0x44, 0x20, 0x64, 0x16, 0x17, 0x03, 0x02, 0x4c, - 0x53, 0x0d, 0x68, 0xde, 0xd5, 0xaa, 0x72, 0x4d, 0x93, 0x6d, 0x82, - 0x0e, 0xdb, 0x9c, 0xbd, 0xcf, 0xb4, 0xf3, 0x5c, 0x5d, 0x54, 0x7a, - 0x69, 0x09, 0x96, 0xd6, 0xdb, 0x11, 0xc1, 0x8d, 0x75, 0xa8, 0xb4, - 0xcf, 0x39, 0xc8, 0xce, 0x3c, 0xbc, 0x24, 0x7c, 0xe6, 0x62, 0xca, - 0xe1, 0xbd, 0x7d, 0xa7, 0xbd, 0x57, 0x65, 0x0b, 0xe4, 0xfe, 0x25, - 0xed, 0xb6, 0x69, 0x10, 0xdc, 0x28, 0x1a, 0x46, 0xbd, 0x01, 0x1d, - 0xd0, 0x97, 0xb5, 0xe1, 0x98, 0x3b, 0xc0, 0x37, 0x64, 0xd6, 0x3d, - 0x94, 0xee, 0x0b, 0xe1, 0xf5, 0x28, 0xae, 0x0b, 0x56, 0xbf, 0x71, - 0x8b, 0x23, 0x29, 0x41, 0x8e, 0x86, 0xc5, 0x4b, 0x52, 0x7b, 0xd8, - 0x71, 0xab, 0x1f, 0x8a, 0x15, 0xa6, 0x3b, 0x83, 0x5a, 0xd7, 0x58, - 0x01, 0x51, 0xc6, 0x4c, 0x41, 0xd9, 0x7f, 0xd8, 0x41, 0x67, 0x72, - 0xa2, 0x28, 0xdf, 0x60, 0x83, 0xa9, 0x9e, 0xc8, 0x7b, 0xfc, 0x53, - 0x73, 0x72, 0x59, 0xf5, 0x93, 0x7a, 0x17, 0x76, 0x0e, 0xce, 0xf7, - 0xe5, 0x5c, 0xd9, 0x0b, 0x55, 0x34, 0xa2, 0xaa, 0x5b, 0xb5, 0x6a, - 0x54, 0xe7, 0x13, 0xca, 0x57, 0xec, 0x97, 0x6d, 0xf4, 0x5e, 0x06, - 0x2f, 0x45, 0x8b, 0x58, 0xd4, 0x23, 0x16, 0x92, 0xe4, 0x16, 0x6e, - 0x28, 0x63, 0x59, 0x30, 0xdf, 0x50, 0x01, 0x9c, 0x63, 0x89, 0x1a, - 0x9f, 0xdb, 0x17, 0x94, 0x82, 0x70, 0x37, 0xc3, 0x24, 0x9e, 0x9a, - 0x47, 0xd6, 0x5a, 0xca, 0x4e, 0xa8, 0x69, 0x89, 0x72, 0x1f, 0x91, - 0x6c, 0xdb, 0x7e, 0x9e, 0x1b, 0xad, 0xc7, 0x1f, 0x73, 0xdd, 0x2c, - 0x4f, 0x19, 0x65, 0xfd, 0x7f, 0x93, 0x40, 0x10, 0x2e, 0xd2, 0xf0, - 0xed, 0x3c, 0x9e, 0x2e, 0x28, 0x3e, 0x69, 0x26, 0x33, 0xc5, 0x7b, - 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, - 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, - 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, - 0x04, 0x16, 0x04, 0x14, 0xda, 0xbb, 0x2e, 0xaa, 0xb0, 0x0c, 0xb8, - 0x88, 0x26, 0x51, 0x74, 0x5c, 0x6d, 0x03, 0xd3, 0xc0, 0xd8, 0x8f, - 0x7a, 0xd6, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, - 0x30, 0x16, 0x80, 0x14, 0xda, 0xbb, 0x2e, 0xaa, 0xb0, 0x0c, 0xb8, - 0x88, 0x26, 0x51, 0x74, 0x5c, 0x6d, 0x03, 0xd3, 0xc0, 0xd8, 0x8f, - 0x7a, 0xd6, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, - 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, - 0x03, 0x82, 0x02, 0x01, 0x00, 0x31, 0x78, 0xe6, 0xc7, 0xb5, 0xdf, - 0xb8, 0x94, 0x40, 0xc9, 0x71, 0xc4, 0xa8, 0x35, 0xec, 0x46, 0x1d, - 0xc2, 0x85, 0xf3, 0x28, 0x58, 0x86, 0xb0, 0x0b, 0xfc, 0x8e, 0xb2, - 0x39, 0x8f, 0x44, 0x55, 0xab, 0x64, 0x84, 0x5c, 0x69, 0xa9, 0xd0, - 0x9a, 0x38, 0x3c, 0xfa, 0xe5, 0x1f, 0x35, 0xe5, 0x44, 0xe3, 0x80, - 0x79, 0x94, 0x68, 0xa4, 0xbb, 0xc4, 0x9f, 0x3d, 0xe1, 0x34, 0xcd, - 0x30, 0x46, 0x8b, 0x54, 0x2b, 0x95, 0xa5, 0xef, 0xf7, 0x3f, 0x99, - 0x84, 0xfd, 0x35, 0xe6, 0xcf, 0x31, 0xc6, 0xdc, 0x6a, 0xbf, 0xa7, - 0xd7, 0x23, 0x08, 0xe1, 0x98, 0x5e, 0xc3, 0x5a, 0x08, 0x76, 0xa9, - 0xa6, 0xaf, 0x77, 0x2f, 0xb7, 0x60, 0xbd, 0x44, 0x46, 0x6a, 0xef, - 0x97, 0xff, 0x73, 0x95, 0xc1, 0x8e, 0xe8, 0x93, 0xfb, 0xfd, 0x31, - 0xb7, 0xec, 0x57, 0x11, 0x11, 0x45, 0x9b, 0x30, 0xf1, 0x1a, 0x88, - 0x39, 0xc1, 0x4f, 0x3c, 0xa7, 0x00, 0xd5, 0xc7, 0xfc, 0xab, 0x6d, - 0x80, 0x22, 0x70, 0xa5, 0x0c, 0xe0, 0x5d, 0x04, 0x29, 0x02, 0xfb, - 0xcb, 0xa0, 0x91, 0xd1, 0x7c, 0xd6, 0xc3, 0x7e, 0x50, 0xd5, 0x9d, - 0x58, 0xbe, 0x41, 0x38, 0xeb, 0xb9, 0x75, 0x3c, 0x15, 0xd9, 0x9b, - 0xc9, 0x4a, 0x83, 0x59, 0xc0, 0xda, 0x53, 0xfd, 0x33, 0xbb, 0x36, - 0x18, 0x9b, 0x85, 0x0f, 0x15, 0xdd, 0xee, 0x2d, 0xac, 0x76, 0x93, - 0xb9, 0xd9, 0x01, 0x8d, 0x48, 0x10, 0xa8, 0xfb, 0xf5, 0x38, 0x86, - 0xf1, 0xdb, 0x0a, 0xc6, 0xbd, 0x84, 0xa3, 0x23, 0x41, 0xde, 0xd6, - 0x77, 0x6f, 0x85, 0xd4, 0x85, 0x1c, 0x50, 0xe0, 0xae, 0x51, 0x8a, - 0xba, 0x8d, 0x3e, 0x76, 0xe2, 0xb9, 0xca, 0x27, 0xf2, 0x5f, 0x9f, - 0xef, 0x6e, 0x59, 0x0d, 0x06, 0xd8, 0x2b, 0x17, 0xa4, 0xd2, 0x7c, - 0x6b, 0xbb, 0x5f, 0x14, 0x1a, 0x48, 0x8f, 0x1a, 0x4c, 0xe7, 0xb3, - 0x47, 0x1c, 0x8e, 0x4c, 0x45, 0x2b, 0x20, 0xee, 0x48, 0xdf, 0xe7, - 0xdd, 0x09, 0x8e, 0x18, 0xa8, 0xda, 0x40, 0x8d, 0x92, 0x26, 0x11, - 0x53, 0x61, 0x73, 0x5d, 0xeb, 0xbd, 0xe7, 0xc4, 0x4d, 0x29, 0x37, - 0x61, 0xeb, 0xac, 0x39, 0x2d, 0x67, 0x2e, 0x16, 0xd6, 0xf5, 0x00, - 0x83, 0x85, 0xa1, 0xcc, 0x7f, 0x76, 0xc4, 0x7d, 0xe4, 0xb7, 0x4b, - 0x66, 0xef, 0x03, 0x45, 0x60, 0x69, 0xb6, 0x0c, 0x52, 0x96, 0x92, - 0x84, 0x5e, 0xa6, 0xa3, 0xb5, 0xa4, 0x3e, 0x2b, 0xd9, 0xcc, 0xd8, - 0x1b, 0x47, 0xaa, 0xf2, 0x44, 0xda, 0x4f, 0xf9, 0x03, 0xe8, 0xf0, - 0x14, 0xcb, 0x3f, 0xf3, 0x83, 0xde, 0xd0, 0xc1, 0x54, 0xe3, 0xb7, - 0xe8, 0x0a, 0x37, 0x4d, 0x8b, 0x20, 0x59, 0x03, 0x30, 0x19, 0xa1, - 0x2c, 0xc8, 0xbd, 0x11, 0x1f, 0xdf, 0xae, 0xc9, 0x4a, 0xc5, 0xf3, - 0x27, 0x66, 0x66, 0x86, 0xac, 0x68, 0x91, 0xff, 0xd9, 0xe6, 0x53, - 0x1c, 0x0f, 0x8b, 0x5c, 0x69, 0x65, 0x0a, 0x26, 0xc8, 0x1e, 0x34, - 0xc3, 0x5d, 0x51, 0x7b, 0xd7, 0xa9, 0x9c, 0x06, 0xa1, 0x36, 0xdd, - 0xd5, 0x89, 0x94, 0xbc, 0xd9, 0xe4, 0x2d, 0x0c, 0x5e, 0x09, 0x6c, - 0x08, 0x97, 0x7c, 0xa3, 0x3d, 0x7c, 0x93, 0xff, 0x3f, 0xa1, 0x14, - 0xa7, 0xcf, 0xb5, 0x5d, 0xeb, 0xdb, 0xdb, 0x1c, 0xc4, 0x76, 0xdf, - 0x88, 0xb9, 0xbd, 0x45, 0x05, 0x95, 0x1b, 0xae, 0xfc, 0x46, 0x6a, - 0x4c, 0xaf, 0x48, 0xe3, 0xce, 0xae, 0x0f, 0xd2, 0x7e, 0xeb, 0xe6, - 0x6c, 0x9c, 0x4f, 0x81, 0x6a, 0x7a, 0x64, 0xac, 0xbb, 0x3e, 0xd5, - 0xe7, 0xcb, 0x76, 0x2e, 0xc5, 0xa7, 0x48, 0xc1, 0x5c, 0x90, 0x0f, - 0xcb, 0xc8, 0x3f, 0xfa, 0xe6, 0x32, 0xe1, 0x8d, 0x1b, 0x6f, 0xa4, - 0xe6, 0x8e, 0xd8, 0xf9, 0x29, 0x48, 0x8a, 0xce, 0x73, 0xfe, 0x2c, - 0x30, 0x82, 0x05, 0x6c, 0x30, 0x82, 0x03, 0x54, 0xa0, 0x03, 0x02, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x47, - 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x13, 0x0d, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, - 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, - 0x04, 0x03, 0x13, 0x17, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, - 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x34, - 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, 0x30, 0x30, 0x30, 0x30, 0x5a, - 0x17, 0x0d, 0x32, 0x39, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, 0x30, - 0x30, 0x30, 0x30, 0x5a, 0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x2e, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, + 0x15, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x55, + 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x20, 0x43, 0x41, + 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, + 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, + 0xa6, 0x15, 0x55, 0xa0, 0xa3, 0xc6, 0xe0, 0x1f, 0x8c, 0x9d, 0x21, + 0x50, 0xd7, 0xc1, 0xbe, 0x2b, 0x5b, 0xb5, 0xa4, 0x9e, 0xa1, 0xd9, + 0x72, 0x58, 0xbd, 0x00, 0x1b, 0x4c, 0xbf, 0x61, 0xc9, 0x14, 0x1d, + 0x45, 0x82, 0xab, 0xc6, 0x1d, 0x80, 0xd6, 0x3d, 0xeb, 0x10, 0x9c, + 0x3a, 0xaf, 0x6d, 0x24, 0xf8, 0xbc, 0x71, 0x01, 0x9e, 0x06, 0xf5, + 0x7c, 0x5f, 0x1e, 0xc1, 0x0e, 0x55, 0xca, 0x83, 0x9a, 0x59, 0x30, + 0xae, 0x19, 0xcb, 0x30, 0x48, 0x95, 0xed, 0x22, 0x37, 0x8d, 0xf4, + 0x4a, 0x9a, 0x72, 0x66, 0x3e, 0xad, 0x95, 0xc0, 0xe0, 0x16, 0x00, + 0xe0, 0x10, 0x1f, 0x2b, 0x31, 0x0e, 0xd7, 0x94, 0x54, 0xd3, 0x42, + 0x33, 0xa0, 0x34, 0x1d, 0x1e, 0x45, 0x76, 0xdd, 0x4f, 0xca, 0x18, + 0x37, 0xec, 0x85, 0x15, 0x7a, 0x19, 0x08, 0xfc, 0xd5, 0xc7, 0x9c, + 0xf0, 0xf2, 0xa9, 0x2e, 0x10, 0xa9, 0x92, 0xe6, 0x3d, 0x58, 0x3d, + 0xa9, 0x16, 0x68, 0x3c, 0x2f, 0x75, 0x21, 0x18, 0x7f, 0x28, 0x77, + 0xa5, 0xe1, 0x61, 0x17, 0xb7, 0xa6, 0xe9, 0xf8, 0x1e, 0x99, 0xdb, + 0x73, 0x6e, 0xf4, 0x0a, 0xa2, 0x21, 0x6c, 0xee, 0xda, 0xaa, 0x85, + 0x92, 0x66, 0xaf, 0xf6, 0x7a, 0x6b, 0x82, 0xda, 0xba, 0x22, 0x08, + 0x35, 0x0f, 0xcf, 0x42, 0xf1, 0x35, 0xfa, 0x6a, 0xee, 0x7e, 0x2b, + 0x25, 0xcc, 0x3a, 0x11, 0xe4, 0x6d, 0xaf, 0x73, 0xb2, 0x76, 0x1d, + 0xad, 0xd0, 0xb2, 0x78, 0x67, 0x1a, 0xa4, 0x39, 0x1c, 0x51, 0x0b, + 0x67, 0x56, 0x83, 0xfd, 0x38, 0x5d, 0x0d, 0xce, 0xdd, 0xf0, 0xbb, + 0x2b, 0x96, 0x1f, 0xde, 0x7b, 0x32, 0x52, 0xfd, 0x1d, 0xbb, 0xb5, + 0x06, 0xa1, 0xb2, 0x21, 0x5e, 0xa5, 0xd6, 0x95, 0x68, 0x7f, 0xf0, + 0x99, 0x9e, 0xdc, 0x45, 0x08, 0x3e, 0xe7, 0xd2, 0x09, 0x0d, 0x35, + 0x94, 0xdd, 0x80, 0x4e, 0x53, 0x97, 0xd7, 0xb5, 0x09, 0x44, 0x20, + 0x64, 0x16, 0x17, 0x03, 0x02, 0x4c, 0x53, 0x0d, 0x68, 0xde, 0xd5, + 0xaa, 0x72, 0x4d, 0x93, 0x6d, 0x82, 0x0e, 0xdb, 0x9c, 0xbd, 0xcf, + 0xb4, 0xf3, 0x5c, 0x5d, 0x54, 0x7a, 0x69, 0x09, 0x96, 0xd6, 0xdb, + 0x11, 0xc1, 0x8d, 0x75, 0xa8, 0xb4, 0xcf, 0x39, 0xc8, 0xce, 0x3c, + 0xbc, 0x24, 0x7c, 0xe6, 0x62, 0xca, 0xe1, 0xbd, 0x7d, 0xa7, 0xbd, + 0x57, 0x65, 0x0b, 0xe4, 0xfe, 0x25, 0xed, 0xb6, 0x69, 0x10, 0xdc, + 0x28, 0x1a, 0x46, 0xbd, 0x01, 0x1d, 0xd0, 0x97, 0xb5, 0xe1, 0x98, + 0x3b, 0xc0, 0x37, 0x64, 0xd6, 0x3d, 0x94, 0xee, 0x0b, 0xe1, 0xf5, + 0x28, 0xae, 0x0b, 0x56, 0xbf, 0x71, 0x8b, 0x23, 0x29, 0x41, 0x8e, + 0x86, 0xc5, 0x4b, 0x52, 0x7b, 0xd8, 0x71, 0xab, 0x1f, 0x8a, 0x15, + 0xa6, 0x3b, 0x83, 0x5a, 0xd7, 0x58, 0x01, 0x51, 0xc6, 0x4c, 0x41, + 0xd9, 0x7f, 0xd8, 0x41, 0x67, 0x72, 0xa2, 0x28, 0xdf, 0x60, 0x83, + 0xa9, 0x9e, 0xc8, 0x7b, 0xfc, 0x53, 0x73, 0x72, 0x59, 0xf5, 0x93, + 0x7a, 0x17, 0x76, 0x0e, 0xce, 0xf7, 0xe5, 0x5c, 0xd9, 0x0b, 0x55, + 0x34, 0xa2, 0xaa, 0x5b, 0xb5, 0x6a, 0x54, 0xe7, 0x13, 0xca, 0x57, + 0xec, 0x97, 0x6d, 0xf4, 0x5e, 0x06, 0x2f, 0x45, 0x8b, 0x58, 0xd4, + 0x23, 0x16, 0x92, 0xe4, 0x16, 0x6e, 0x28, 0x63, 0x59, 0x30, 0xdf, + 0x50, 0x01, 0x9c, 0x63, 0x89, 0x1a, 0x9f, 0xdb, 0x17, 0x94, 0x82, + 0x70, 0x37, 0xc3, 0x24, 0x9e, 0x9a, 0x47, 0xd6, 0x5a, 0xca, 0x4e, + 0xa8, 0x69, 0x89, 0x72, 0x1f, 0x91, 0x6c, 0xdb, 0x7e, 0x9e, 0x1b, + 0xad, 0xc7, 0x1f, 0x73, 0xdd, 0x2c, 0x4f, 0x19, 0x65, 0xfd, 0x7f, + 0x93, 0x40, 0x10, 0x2e, 0xd2, 0xf0, 0xed, 0x3c, 0x9e, 0x2e, 0x28, + 0x3e, 0x69, 0x26, 0x33, 0xc5, 0x7b, 0x02, 0x03, 0x01, 0x00, 0x01, + 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, + 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xda, + 0xbb, 0x2e, 0xaa, 0xb0, 0x0c, 0xb8, 0x88, 0x26, 0x51, 0x74, 0x5c, + 0x6d, 0x03, 0xd3, 0xc0, 0xd8, 0x8f, 0x7a, 0xd6, 0x30, 0x1f, 0x06, + 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xda, + 0xbb, 0x2e, 0xaa, 0xb0, 0x0c, 0xb8, 0x88, 0x26, 0x51, 0x74, 0x5c, + 0x6d, 0x03, 0xd3, 0xc0, 0xd8, 0x8f, 0x7a, 0xd6, 0x30, 0x0e, 0x06, + 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, + 0x01, 0x86, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, + 0x31, 0x78, 0xe6, 0xc7, 0xb5, 0xdf, 0xb8, 0x94, 0x40, 0xc9, 0x71, + 0xc4, 0xa8, 0x35, 0xec, 0x46, 0x1d, 0xc2, 0x85, 0xf3, 0x28, 0x58, + 0x86, 0xb0, 0x0b, 0xfc, 0x8e, 0xb2, 0x39, 0x8f, 0x44, 0x55, 0xab, + 0x64, 0x84, 0x5c, 0x69, 0xa9, 0xd0, 0x9a, 0x38, 0x3c, 0xfa, 0xe5, + 0x1f, 0x35, 0xe5, 0x44, 0xe3, 0x80, 0x79, 0x94, 0x68, 0xa4, 0xbb, + 0xc4, 0x9f, 0x3d, 0xe1, 0x34, 0xcd, 0x30, 0x46, 0x8b, 0x54, 0x2b, + 0x95, 0xa5, 0xef, 0xf7, 0x3f, 0x99, 0x84, 0xfd, 0x35, 0xe6, 0xcf, + 0x31, 0xc6, 0xdc, 0x6a, 0xbf, 0xa7, 0xd7, 0x23, 0x08, 0xe1, 0x98, + 0x5e, 0xc3, 0x5a, 0x08, 0x76, 0xa9, 0xa6, 0xaf, 0x77, 0x2f, 0xb7, + 0x60, 0xbd, 0x44, 0x46, 0x6a, 0xef, 0x97, 0xff, 0x73, 0x95, 0xc1, + 0x8e, 0xe8, 0x93, 0xfb, 0xfd, 0x31, 0xb7, 0xec, 0x57, 0x11, 0x11, + 0x45, 0x9b, 0x30, 0xf1, 0x1a, 0x88, 0x39, 0xc1, 0x4f, 0x3c, 0xa7, + 0x00, 0xd5, 0xc7, 0xfc, 0xab, 0x6d, 0x80, 0x22, 0x70, 0xa5, 0x0c, + 0xe0, 0x5d, 0x04, 0x29, 0x02, 0xfb, 0xcb, 0xa0, 0x91, 0xd1, 0x7c, + 0xd6, 0xc3, 0x7e, 0x50, 0xd5, 0x9d, 0x58, 0xbe, 0x41, 0x38, 0xeb, + 0xb9, 0x75, 0x3c, 0x15, 0xd9, 0x9b, 0xc9, 0x4a, 0x83, 0x59, 0xc0, + 0xda, 0x53, 0xfd, 0x33, 0xbb, 0x36, 0x18, 0x9b, 0x85, 0x0f, 0x15, + 0xdd, 0xee, 0x2d, 0xac, 0x76, 0x93, 0xb9, 0xd9, 0x01, 0x8d, 0x48, + 0x10, 0xa8, 0xfb, 0xf5, 0x38, 0x86, 0xf1, 0xdb, 0x0a, 0xc6, 0xbd, + 0x84, 0xa3, 0x23, 0x41, 0xde, 0xd6, 0x77, 0x6f, 0x85, 0xd4, 0x85, + 0x1c, 0x50, 0xe0, 0xae, 0x51, 0x8a, 0xba, 0x8d, 0x3e, 0x76, 0xe2, + 0xb9, 0xca, 0x27, 0xf2, 0x5f, 0x9f, 0xef, 0x6e, 0x59, 0x0d, 0x06, + 0xd8, 0x2b, 0x17, 0xa4, 0xd2, 0x7c, 0x6b, 0xbb, 0x5f, 0x14, 0x1a, + 0x48, 0x8f, 0x1a, 0x4c, 0xe7, 0xb3, 0x47, 0x1c, 0x8e, 0x4c, 0x45, + 0x2b, 0x20, 0xee, 0x48, 0xdf, 0xe7, 0xdd, 0x09, 0x8e, 0x18, 0xa8, + 0xda, 0x40, 0x8d, 0x92, 0x26, 0x11, 0x53, 0x61, 0x73, 0x5d, 0xeb, + 0xbd, 0xe7, 0xc4, 0x4d, 0x29, 0x37, 0x61, 0xeb, 0xac, 0x39, 0x2d, + 0x67, 0x2e, 0x16, 0xd6, 0xf5, 0x00, 0x83, 0x85, 0xa1, 0xcc, 0x7f, + 0x76, 0xc4, 0x7d, 0xe4, 0xb7, 0x4b, 0x66, 0xef, 0x03, 0x45, 0x60, + 0x69, 0xb6, 0x0c, 0x52, 0x96, 0x92, 0x84, 0x5e, 0xa6, 0xa3, 0xb5, + 0xa4, 0x3e, 0x2b, 0xd9, 0xcc, 0xd8, 0x1b, 0x47, 0xaa, 0xf2, 0x44, + 0xda, 0x4f, 0xf9, 0x03, 0xe8, 0xf0, 0x14, 0xcb, 0x3f, 0xf3, 0x83, + 0xde, 0xd0, 0xc1, 0x54, 0xe3, 0xb7, 0xe8, 0x0a, 0x37, 0x4d, 0x8b, + 0x20, 0x59, 0x03, 0x30, 0x19, 0xa1, 0x2c, 0xc8, 0xbd, 0x11, 0x1f, + 0xdf, 0xae, 0xc9, 0x4a, 0xc5, 0xf3, 0x27, 0x66, 0x66, 0x86, 0xac, + 0x68, 0x91, 0xff, 0xd9, 0xe6, 0x53, 0x1c, 0x0f, 0x8b, 0x5c, 0x69, + 0x65, 0x0a, 0x26, 0xc8, 0x1e, 0x34, 0xc3, 0x5d, 0x51, 0x7b, 0xd7, + 0xa9, 0x9c, 0x06, 0xa1, 0x36, 0xdd, 0xd5, 0x89, 0x94, 0xbc, 0xd9, + 0xe4, 0x2d, 0x0c, 0x5e, 0x09, 0x6c, 0x08, 0x97, 0x7c, 0xa3, 0x3d, + 0x7c, 0x93, 0xff, 0x3f, 0xa1, 0x14, 0xa7, 0xcf, 0xb5, 0x5d, 0xeb, + 0xdb, 0xdb, 0x1c, 0xc4, 0x76, 0xdf, 0x88, 0xb9, 0xbd, 0x45, 0x05, + 0x95, 0x1b, 0xae, 0xfc, 0x46, 0x6a, 0x4c, 0xaf, 0x48, 0xe3, 0xce, + 0xae, 0x0f, 0xd2, 0x7e, 0xeb, 0xe6, 0x6c, 0x9c, 0x4f, 0x81, 0x6a, + 0x7a, 0x64, 0xac, 0xbb, 0x3e, 0xd5, 0xe7, 0xcb, 0x76, 0x2e, 0xc5, + 0xa7, 0x48, 0xc1, 0x5c, 0x90, 0x0f, 0xcb, 0xc8, 0x3f, 0xfa, 0xe6, + 0x32, 0xe1, 0x8d, 0x1b, 0x6f, 0xa4, 0xe6, 0x8e, 0xd8, 0xf9, 0x29, + 0x48, 0x8a, 0xce, 0x73, 0xfe, 0x2c, 0x30, 0x82, 0x05, 0x6c, 0x30, + 0x82, 0x03, 0x54, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x05, 0x05, 0x00, 0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x20, 0x43, 0x41, 0x20, 0x32, - 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, - 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, - 0xb3, 0x54, 0x52, 0xc1, 0xc9, 0x3e, 0xf2, 0xd9, 0xdc, 0xb1, 0x53, - 0x1a, 0x59, 0x29, 0xe7, 0xb1, 0xc3, 0x45, 0x28, 0xe5, 0xd7, 0xd1, - 0xed, 0xc5, 0xc5, 0x4b, 0xa1, 0xaa, 0x74, 0x7b, 0x57, 0xaf, 0x4a, - 0x26, 0xfc, 0xd8, 0xf5, 0x5e, 0xa7, 0x6e, 0x19, 0xdb, 0x74, 0x0c, - 0x4f, 0x35, 0x5b, 0x32, 0x0b, 0x01, 0xe3, 0xdb, 0xeb, 0x7a, 0x77, - 0x35, 0xea, 0xaa, 0x5a, 0xe0, 0xd6, 0xe8, 0xa1, 0x57, 0x94, 0xf0, - 0x90, 0xa3, 0x74, 0x56, 0x94, 0x44, 0x30, 0x03, 0x1e, 0x5c, 0x4e, - 0x2b, 0x85, 0x26, 0x74, 0x82, 0x7a, 0x0c, 0x76, 0xa0, 0x6f, 0x4d, - 0xce, 0x41, 0x2d, 0xa0, 0x15, 0x06, 0x14, 0x5f, 0xb7, 0x42, 0xcd, - 0x7b, 0x8f, 0x58, 0x61, 0x34, 0xdc, 0x2a, 0x08, 0xf9, 0x2e, 0xc3, - 0x01, 0xa6, 0x22, 0x44, 0x1c, 0x4c, 0x07, 0x82, 0xe6, 0x5b, 0xce, - 0xd0, 0x4a, 0x7c, 0x04, 0xd3, 0x19, 0x73, 0x27, 0xf0, 0xaa, 0x98, - 0x7f, 0x2e, 0xaf, 0x4e, 0xeb, 0x87, 0x1e, 0x24, 0x77, 0x6a, 0x5d, - 0xb6, 0xe8, 0x5b, 0x45, 0xba, 0xdc, 0xc3, 0xa1, 0x05, 0x6f, 0x56, - 0x8e, 0x8f, 0x10, 0x26, 0xa5, 0x49, 0xc3, 0x2e, 0xd7, 0x41, 0x87, - 0x22, 0xe0, 0x4f, 0x86, 0xca, 0x60, 0xb5, 0xea, 0xa1, 0x63, 0xc0, - 0x01, 0x97, 0x10, 0x79, 0xbd, 0x00, 0x3c, 0x12, 0x6d, 0x2b, 0x15, - 0xb1, 0xac, 0x4b, 0xb1, 0xee, 0x18, 0xb9, 0x4e, 0x96, 0xdc, 0xdc, - 0x76, 0xff, 0x3b, 0xbe, 0xcf, 0x5f, 0x03, 0xc0, 0xfc, 0x3b, 0xe8, - 0xbe, 0x46, 0x1b, 0xff, 0xda, 0x40, 0xc2, 0x52, 0xf7, 0xfe, 0xe3, - 0x3a, 0xf7, 0x6a, 0x77, 0x35, 0xd0, 0xda, 0x8d, 0xeb, 0x5e, 0x18, - 0x6a, 0x31, 0xc7, 0x1e, 0xba, 0x3c, 0x1b, 0x28, 0xd6, 0x6b, 0x54, - 0xc6, 0xaa, 0x5b, 0xd7, 0xa2, 0x2c, 0x1b, 0x19, 0xcc, 0xa2, 0x02, - 0xf6, 0x9b, 0x59, 0xbd, 0x37, 0x6b, 0x86, 0xb5, 0x6d, 0x82, 0xba, - 0xd8, 0xea, 0xc9, 0x56, 0xbc, 0xa9, 0x36, 0x58, 0xfd, 0x3e, 0x19, - 0xf3, 0xed, 0x0c, 0x26, 0xa9, 0x93, 0x38, 0xf8, 0x4f, 0xc1, 0x5d, - 0x22, 0x06, 0xd0, 0x97, 0xea, 0xe1, 0xad, 0xc6, 0x55, 0xe0, 0x81, - 0x2b, 0x28, 0x83, 0x3a, 0xfa, 0xf4, 0x7b, 0x21, 0x51, 0x00, 0xbe, - 0x52, 0x38, 0xce, 0xcd, 0x66, 0x79, 0xa8, 0xf4, 0x81, 0x56, 0xe2, - 0xd0, 0x83, 0x09, 0x47, 0x51, 0x5b, 0x50, 0x6a, 0xcf, 0xdb, 0x48, - 0x1a, 0x5d, 0x3e, 0xf7, 0xcb, 0xf6, 0x65, 0xf7, 0x6c, 0xf1, 0x95, - 0xf8, 0x02, 0x3b, 0x32, 0x56, 0x82, 0x39, 0x7a, 0x5b, 0xbd, 0x2f, - 0x89, 0x1b, 0xbf, 0xa1, 0xb4, 0xe8, 0xff, 0x7f, 0x8d, 0x8c, 0xdf, - 0x03, 0xf1, 0x60, 0x4e, 0x58, 0x11, 0x4c, 0xeb, 0xa3, 0x3f, 0x10, - 0x2b, 0x83, 0x9a, 0x01, 0x73, 0xd9, 0x94, 0x6d, 0x84, 0x00, 0x27, - 0x66, 0xac, 0xf0, 0x70, 0x40, 0x09, 0x42, 0x92, 0xad, 0x4f, 0x93, - 0x0d, 0x61, 0x09, 0x51, 0x24, 0xd8, 0x92, 0xd5, 0x0b, 0x94, 0x61, - 0xb2, 0x87, 0xb2, 0xed, 0xff, 0x9a, 0x35, 0xff, 0x85, 0x54, 0xca, - 0xed, 0x44, 0x43, 0xac, 0x1b, 0x3c, 0x16, 0x6b, 0x48, 0x4a, 0x0a, - 0x1c, 0x40, 0x88, 0x1f, 0x92, 0xc2, 0x0b, 0x00, 0x05, 0xff, 0xf2, - 0xc8, 0x02, 0x4a, 0xa4, 0xaa, 0xa9, 0xcc, 0x99, 0x96, 0x9c, 0x2f, - 0x58, 0xe0, 0x7d, 0xe1, 0xbe, 0xbb, 0x07, 0xdc, 0x5f, 0x04, 0x72, - 0x5c, 0x31, 0x34, 0xc3, 0xec, 0x5f, 0x2d, 0xe0, 0x3d, 0x64, 0x90, - 0x22, 0xe6, 0xd1, 0xec, 0xb8, 0x2e, 0xdd, 0x59, 0xae, 0xd9, 0xa1, - 0x37, 0xbf, 0x54, 0x35, 0xdc, 0x73, 0x32, 0x4f, 0x8c, 0x04, 0x1e, - 0x33, 0xb2, 0xc9, 0x46, 0xf1, 0xd8, 0x5c, 0xc8, 0x55, 0x50, 0xc9, - 0x68, 0xbd, 0xa8, 0xba, 0x36, 0x09, 0x02, 0x03, 0x01, 0x00, 0x01, - 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, - 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, - 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x76, - 0xf3, 0x55, 0xe1, 0xfa, 0xa4, 0x36, 0xfb, 0xf0, 0x9f, 0x5c, 0x62, - 0x71, 0xed, 0x3c, 0xf4, 0x47, 0x38, 0x10, 0x2b, 0x30, 0x1f, 0x06, - 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x76, - 0xf3, 0x55, 0xe1, 0xfa, 0xa4, 0x36, 0xfb, 0xf0, 0x9f, 0x5c, 0x62, - 0x71, 0xed, 0x3c, 0xf4, 0x47, 0x38, 0x10, 0x2b, 0x30, 0x0e, 0x06, - 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, - 0x01, 0x86, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, - 0x66, 0xc1, 0xc6, 0x23, 0xf3, 0xd9, 0xe0, 0x2e, 0x6e, 0x5f, 0xe8, - 0xcf, 0xae, 0xb0, 0xb0, 0x25, 0x4d, 0x2b, 0xf8, 0x3b, 0x58, 0x9b, - 0x40, 0x24, 0x37, 0x5a, 0xcb, 0xab, 0x16, 0x49, 0xff, 0xb3, 0x75, - 0x79, 0x33, 0xa1, 0x2f, 0x6d, 0x70, 0x17, 0x34, 0x91, 0xfe, 0x67, - 0x7e, 0x8f, 0xec, 0x9b, 0xe5, 0x5e, 0x82, 0xa9, 0x55, 0x1f, 0x2f, - 0xdc, 0xd4, 0x51, 0x07, 0x12, 0xfe, 0xac, 0x16, 0x3e, 0x2c, 0x35, - 0xc6, 0x63, 0xfc, 0xdc, 0x10, 0xeb, 0x0d, 0xa3, 0xaa, 0xd0, 0x7c, - 0xcc, 0xd1, 0xd0, 0x2f, 0x51, 0x2e, 0xc4, 0x14, 0x5a, 0xde, 0xe8, - 0x19, 0xe1, 0x3e, 0xc6, 0xcc, 0xa4, 0x29, 0xe7, 0x2e, 0x84, 0xaa, - 0x06, 0x30, 0x78, 0x76, 0x54, 0x73, 0x28, 0x98, 0x59, 0x38, 0xe0, - 0x00, 0x0d, 0x62, 0xd3, 0x42, 0x7d, 0x21, 0x9f, 0xae, 0x3d, 0x3a, - 0x8c, 0xd5, 0xfa, 0x77, 0x0d, 0x18, 0x2b, 0x16, 0x0e, 0x5f, 0x36, - 0xe1, 0xfc, 0x2a, 0xb5, 0x30, 0x24, 0xcf, 0xe0, 0x63, 0x0c, 0x7b, - 0x58, 0x1a, 0xfe, 0x99, 0xba, 0x42, 0x12, 0xb1, 0x91, 0xf4, 0x7c, - 0x68, 0xe2, 0xc8, 0xe8, 0xaf, 0x2c, 0xea, 0xc9, 0x7e, 0xae, 0xbb, - 0x2a, 0x3d, 0x0d, 0x15, 0xdc, 0x34, 0x95, 0xb6, 0x18, 0x74, 0xa8, - 0x6a, 0x0f, 0xc7, 0xb4, 0xf4, 0x13, 0xc4, 0xe4, 0x5b, 0xed, 0x0a, - 0xd2, 0xa4, 0x97, 0x4c, 0x2a, 0xed, 0x2f, 0x6c, 0x12, 0x89, 0x3d, - 0xf1, 0x27, 0x70, 0xaa, 0x6a, 0x03, 0x52, 0x21, 0x9f, 0x40, 0xa8, - 0x67, 0x50, 0xf2, 0xf3, 0x5a, 0x1f, 0xdf, 0xdf, 0x23, 0xf6, 0xdc, - 0x78, 0x4e, 0xe6, 0x98, 0x4f, 0x55, 0x3a, 0x53, 0xe3, 0xef, 0xf2, - 0xf4, 0x9f, 0xc7, 0x7c, 0xd8, 0x58, 0xaf, 0x29, 0x22, 0x97, 0xb8, - 0xe0, 0xbd, 0x91, 0x2e, 0xb0, 0x76, 0xec, 0x57, 0x11, 0xcf, 0xef, - 0x29, 0x44, 0xf3, 0xe9, 0x85, 0x7a, 0x60, 0x63, 0xe4, 0x5d, 0x33, - 0x89, 0x17, 0xd9, 0x31, 0xaa, 0xda, 0xd6, 0xf3, 0x18, 0x35, 0x72, - 0xcf, 0x87, 0x2b, 0x2f, 0x63, 0x23, 0x84, 0x5d, 0x84, 0x8c, 0x3f, - 0x57, 0xa0, 0x88, 0xfc, 0x99, 0x91, 0x28, 0x26, 0x69, 0x99, 0xd4, - 0x8f, 0x97, 0x44, 0xbe, 0x8e, 0xd5, 0x48, 0xb1, 0xa4, 0x28, 0x29, - 0xf1, 0x15, 0xb4, 0xe1, 0xe5, 0x9e, 0xdd, 0xf8, 0x8f, 0xa6, 0x6f, - 0x26, 0xd7, 0x09, 0x3c, 0x3a, 0x1c, 0x11, 0x0e, 0xa6, 0x6c, 0x37, - 0xf7, 0xad, 0x44, 0x87, 0x2c, 0x28, 0xc7, 0xd8, 0x74, 0x82, 0xb3, - 0xd0, 0x6f, 0x4a, 0x57, 0xbb, 0x35, 0x29, 0x27, 0xa0, 0x8b, 0xe8, - 0x21, 0xa7, 0x87, 0x64, 0x36, 0x5d, 0xcc, 0xd8, 0x16, 0xac, 0xc7, - 0xb2, 0x27, 0x40, 0x92, 0x55, 0x38, 0x28, 0x8d, 0x51, 0x6e, 0xdd, - 0x14, 0x67, 0x53, 0x6c, 0x71, 0x5c, 0x26, 0x84, 0x4d, 0x75, 0x5a, - 0xb6, 0x7e, 0x60, 0x56, 0xa9, 0x4d, 0xad, 0xfb, 0x9b, 0x1e, 0x97, - 0xf3, 0x0d, 0xd9, 0xd2, 0x97, 0x54, 0x77, 0xda, 0x3d, 0x12, 0xb7, - 0xe0, 0x1e, 0xef, 0x08, 0x06, 0xac, 0xf9, 0x85, 0x87, 0xe9, 0xa2, - 0xdc, 0xaf, 0x7e, 0x18, 0x12, 0x83, 0xfd, 0x56, 0x17, 0x41, 0x2e, - 0xd5, 0x29, 0x82, 0x7d, 0x99, 0xf4, 0x31, 0xf6, 0x71, 0xa9, 0xcf, - 0x2c, 0x01, 0x27, 0xa5, 0x05, 0xb9, 0xaa, 0xb2, 0x48, 0x4e, 0x2a, - 0xef, 0x9f, 0x93, 0x52, 0x51, 0x95, 0x3c, 0x52, 0x73, 0x8e, 0x56, - 0x4c, 0x17, 0x40, 0xc0, 0x09, 0x28, 0xe4, 0x8b, 0x6a, 0x48, 0x53, - 0xdb, 0xec, 0xcd, 0x55, 0x55, 0xf1, 0xc6, 0xf8, 0xe9, 0xa2, 0x2c, - 0x4c, 0xa6, 0xd1, 0x26, 0x5f, 0x7e, 0xaf, 0x5a, 0x4c, 0xda, 0x1f, - 0xa6, 0xf2, 0x1c, 0x2c, 0x7e, 0xae, 0x02, 0x16, 0xd2, 0x56, 0xd0, - 0x2f, 0x57, 0x53, 0x47, 0xe8, 0x92, 0x30, 0x82, 0x03, 0xa4, 0x30, - 0x82, 0x02, 0x8c, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x05, 0x05, 0x00, 0x30, 0x63, 0x31, 0x0b, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x1c, 0x30, - 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x13, 0x41, 0x6d, 0x65, - 0x72, 0x69, 0x63, 0x61, 0x20, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, - 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x36, 0x30, 0x34, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x13, 0x2d, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, - 0x61, 0x20, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x52, 0x6f, - 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x74, 0x79, 0x20, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x30, - 0x32, 0x30, 0x35, 0x32, 0x38, 0x30, 0x36, 0x30, 0x30, 0x30, 0x30, - 0x5a, 0x17, 0x0d, 0x33, 0x37, 0x31, 0x31, 0x31, 0x39, 0x32, 0x30, - 0x34, 0x33, 0x30, 0x30, 0x5a, 0x30, 0x63, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x1c, - 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x13, 0x41, 0x6d, - 0x65, 0x72, 0x69, 0x63, 0x61, 0x20, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, - 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x36, 0x30, 0x34, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x13, 0x2d, 0x41, 0x6d, 0x65, 0x72, 0x69, - 0x63, 0x61, 0x20, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x52, - 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x31, 0x30, 0x82, 0x01, 0x22, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, - 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa8, 0x2f, 0xe8, 0xa4, - 0x69, 0x06, 0x03, 0x47, 0xc3, 0xe9, 0x2a, 0x98, 0xff, 0x19, 0xa2, - 0x70, 0x9a, 0xc6, 0x50, 0xb2, 0x7e, 0xa5, 0xdf, 0x68, 0x4d, 0x1b, - 0x7c, 0x0f, 0xb6, 0x97, 0x68, 0x7d, 0x2d, 0xa6, 0x8b, 0x97, 0xe9, - 0x64, 0x86, 0xc9, 0xa3, 0xef, 0xa0, 0x86, 0xbf, 0x60, 0x65, 0x9c, - 0x4b, 0x54, 0x88, 0xc2, 0x48, 0xc5, 0x4a, 0x39, 0xbf, 0x14, 0xe3, - 0x59, 0x55, 0xe5, 0x19, 0xb4, 0x74, 0xc8, 0xb4, 0x05, 0x39, 0x5c, - 0x16, 0xa5, 0xe2, 0x95, 0x05, 0xe0, 0x12, 0xae, 0x59, 0x8b, 0xa2, - 0x33, 0x68, 0x58, 0x1c, 0xa6, 0xd4, 0x15, 0xb7, 0xd8, 0x9f, 0xd7, - 0xdc, 0x71, 0xab, 0x7e, 0x9a, 0xbf, 0x9b, 0x8e, 0x33, 0x0f, 0x22, - 0xfd, 0x1f, 0x2e, 0xe7, 0x07, 0x36, 0xef, 0x62, 0x39, 0xc5, 0xdd, - 0xcb, 0xba, 0x25, 0x14, 0x23, 0xde, 0x0c, 0xc6, 0x3d, 0x3c, 0xce, - 0x82, 0x08, 0xe6, 0x66, 0x3e, 0xda, 0x51, 0x3b, 0x16, 0x3a, 0xa3, - 0x05, 0x7f, 0xa0, 0xdc, 0x87, 0xd5, 0x9c, 0xfc, 0x72, 0xa9, 0xa0, - 0x7d, 0x78, 0xe4, 0xb7, 0x31, 0x55, 0x1e, 0x65, 0xbb, 0xd4, 0x61, - 0xb0, 0x21, 0x60, 0xed, 0x10, 0x32, 0x72, 0xc5, 0x92, 0x25, 0x1e, - 0xf8, 0x90, 0x4a, 0x18, 0x78, 0x47, 0xdf, 0x7e, 0x30, 0x37, 0x3e, - 0x50, 0x1b, 0xdb, 0x1c, 0xd3, 0x6b, 0x9a, 0x86, 0x53, 0x07, 0xb0, - 0xef, 0xac, 0x06, 0x78, 0xf8, 0x84, 0x99, 0xfe, 0x21, 0x8d, 0x4c, - 0x80, 0xb6, 0x0c, 0x82, 0xf6, 0x66, 0x70, 0x79, 0x1a, 0xd3, 0x4f, - 0xa3, 0xcf, 0xf1, 0xcf, 0x46, 0xb0, 0x4b, 0x0f, 0x3e, 0xdd, 0x88, - 0x62, 0xb8, 0x8c, 0xa9, 0x09, 0x28, 0x3b, 0x7a, 0xc7, 0x97, 0xe1, - 0x1e, 0xe5, 0xf4, 0x9f, 0xc0, 0xc0, 0xae, 0x24, 0xa0, 0xc8, 0xa1, - 0xd9, 0x0f, 0xd6, 0x7b, 0x26, 0x82, 0x69, 0x32, 0x3d, 0xa7, 0x02, - 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, 0x06, - 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, - 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, - 0x16, 0x04, 0x14, 0x00, 0xad, 0xd9, 0xa3, 0xf6, 0x79, 0xf6, 0x6e, - 0x74, 0xa9, 0x7f, 0x33, 0x3d, 0x81, 0x17, 0xd7, 0x4c, 0xcf, 0x33, - 0xde, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, - 0x16, 0x80, 0x14, 0x00, 0xad, 0xd9, 0xa3, 0xf6, 0x79, 0xf6, 0x6e, - 0x74, 0xa9, 0x7f, 0x33, 0x3d, 0x81, 0x17, 0xd7, 0x4c, 0xcf, 0x33, - 0xde, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, - 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, - 0x82, 0x01, 0x01, 0x00, 0x7c, 0x8a, 0xd1, 0x1f, 0x18, 0x37, 0x82, - 0xe0, 0xb8, 0xb0, 0xa3, 0xed, 0x56, 0x95, 0xc8, 0x62, 0x61, 0x9c, - 0x05, 0xa2, 0xcd, 0xc2, 0x62, 0x26, 0x61, 0xcd, 0x10, 0x16, 0xd7, - 0xcc, 0xb4, 0x65, 0x34, 0xd0, 0x11, 0x8a, 0xad, 0xa8, 0xa9, 0x05, - 0x66, 0xef, 0x74, 0xf3, 0x6d, 0x5f, 0x9d, 0x99, 0xaf, 0xf6, 0x8b, - 0xfb, 0xeb, 0x52, 0xb2, 0x05, 0x98, 0xa2, 0x6f, 0x2a, 0xc5, 0x54, - 0xbd, 0x25, 0xbd, 0x5f, 0xae, 0xc8, 0x86, 0xea, 0x46, 0x2c, 0xc1, - 0xb3, 0xbd, 0xc1, 0xe9, 0x49, 0x70, 0x18, 0x16, 0x97, 0x08, 0x13, - 0x8c, 0x20, 0xe0, 0x1b, 0x2e, 0x3a, 0x47, 0xcb, 0x1e, 0xe4, 0x00, - 0x30, 0x95, 0x5b, 0xf4, 0x45, 0xa3, 0xc0, 0x1a, 0xb0, 0x01, 0x4e, - 0xab, 0xbd, 0xc0, 0x23, 0x6e, 0x63, 0x3f, 0x80, 0x4a, 0xc5, 0x07, - 0xed, 0xdc, 0xe2, 0x6f, 0xc7, 0xc1, 0x62, 0xf1, 0xe3, 0x72, 0xd6, - 0x04, 0xc8, 0x74, 0x67, 0x0b, 0xfa, 0x88, 0xab, 0xa1, 0x01, 0xc8, - 0x6f, 0xf0, 0x14, 0xaf, 0xd2, 0x99, 0xcd, 0x51, 0x93, 0x7e, 0xed, - 0x2e, 0x38, 0xc7, 0xbd, 0xce, 0x46, 0x50, 0x3d, 0x72, 0xe3, 0x79, - 0x25, 0x9d, 0x9b, 0x88, 0x2b, 0x10, 0x20, 0xdd, 0xa5, 0xb8, 0x32, - 0x9f, 0x8d, 0xe0, 0x29, 0xdf, 0x21, 0x74, 0x86, 0x82, 0xdb, 0x2f, - 0x82, 0x30, 0xc6, 0xc7, 0x35, 0x86, 0xb3, 0xf9, 0x96, 0x5f, 0x46, - 0xdb, 0x0c, 0x45, 0xfd, 0xf3, 0x50, 0xc3, 0x6f, 0xc6, 0xc3, 0x48, - 0xad, 0x46, 0xa6, 0xe1, 0x27, 0x47, 0x0a, 0x1d, 0x0e, 0x9b, 0xb6, - 0xc2, 0x77, 0x7f, 0x63, 0xf2, 0xe0, 0x7d, 0x1a, 0xbe, 0xfc, 0xe0, - 0xdf, 0xd7, 0xc7, 0xa7, 0x6c, 0xb0, 0xf9, 0xae, 0xba, 0x3c, 0xfd, - 0x74, 0xb4, 0x11, 0xe8, 0x58, 0x0d, 0x80, 0xbc, 0xd3, 0xa8, 0x80, - 0x3a, 0x99, 0xed, 0x75, 0xcc, 0x46, 0x7b, 0x30, 0x82, 0x05, 0xa4, - 0x30, 0x82, 0x03, 0x8c, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, - 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x63, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x1c, - 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x13, 0x41, 0x6d, - 0x65, 0x72, 0x69, 0x63, 0x61, 0x20, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, - 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x36, 0x30, 0x34, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x13, 0x2d, 0x41, 0x6d, 0x65, 0x72, 0x69, - 0x63, 0x61, 0x20, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x52, - 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x32, 0x30, 0x1e, 0x17, 0x0d, - 0x30, 0x32, 0x30, 0x35, 0x32, 0x38, 0x30, 0x36, 0x30, 0x30, 0x30, - 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x37, 0x30, 0x39, 0x32, 0x39, 0x31, - 0x34, 0x30, 0x38, 0x30, 0x30, 0x5a, 0x30, 0x63, 0x31, 0x0b, 0x30, - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, - 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x13, 0x41, - 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x20, 0x4f, 0x6e, 0x6c, 0x69, - 0x6e, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x36, 0x30, 0x34, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2d, 0x41, 0x6d, 0x65, 0x72, - 0x69, 0x63, 0x61, 0x20, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, - 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x32, 0x30, 0x82, 0x02, - 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, - 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xcc, 0x41, 0x45, - 0x1d, 0xe9, 0x3d, 0x4d, 0x10, 0xf6, 0x8c, 0xb1, 0x41, 0xc9, 0xe0, - 0x5e, 0xcb, 0x0d, 0xb7, 0xbf, 0x47, 0x73, 0xd3, 0xf0, 0x55, 0x4d, - 0xdd, 0xc6, 0x0c, 0xfa, 0xb1, 0x66, 0x05, 0x6a, 0xcd, 0x78, 0xb4, - 0xdc, 0x02, 0xdb, 0x4e, 0x81, 0xf3, 0xd7, 0xa7, 0x7c, 0x71, 0xbc, - 0x75, 0x63, 0xa0, 0x5d, 0xe3, 0x07, 0x0c, 0x48, 0xec, 0x25, 0xc4, - 0x03, 0x20, 0xf4, 0xff, 0x0e, 0x3b, 0x12, 0xff, 0x9b, 0x8d, 0xe1, - 0xc6, 0xd5, 0x1b, 0xb4, 0x6d, 0x22, 0xe3, 0xb1, 0xdb, 0x7f, 0x21, - 0x64, 0xaf, 0x86, 0xbc, 0x57, 0x22, 0x2a, 0xd6, 0x47, 0x81, 0x57, - 0x44, 0x82, 0x56, 0x53, 0xbd, 0x86, 0x14, 0x01, 0x0b, 0xfc, 0x7f, - 0x74, 0xa4, 0x5a, 0xae, 0xf1, 0xba, 0x11, 0xb5, 0x9b, 0x58, 0x5a, - 0x80, 0xb4, 0x37, 0x78, 0x09, 0x33, 0x7c, 0x32, 0x47, 0x03, 0x5c, - 0xc4, 0xa5, 0x83, 0x48, 0xf4, 0x57, 0x56, 0x6e, 0x81, 0x36, 0x27, - 0x18, 0x4f, 0xec, 0x9b, 0x28, 0xc2, 0xd4, 0xb4, 0xd7, 0x7c, 0x0c, - 0x3e, 0x0c, 0x2b, 0xdf, 0xca, 0x04, 0xd7, 0xc6, 0x8e, 0xea, 0x58, - 0x4e, 0xa8, 0xa4, 0xa5, 0x18, 0x1c, 0x6c, 0x45, 0x98, 0xa3, 0x41, - 0xd1, 0x2d, 0xd2, 0xc7, 0x6d, 0x8d, 0x19, 0xf1, 0xad, 0x79, 0xb7, - 0x81, 0x3f, 0xbd, 0x06, 0x82, 0x27, 0x2d, 0x10, 0x58, 0x05, 0xb5, - 0x78, 0x05, 0xb9, 0x2f, 0xdb, 0x0c, 0x6b, 0x90, 0x90, 0x7e, 0x14, - 0x59, 0x38, 0xbb, 0x94, 0x24, 0x13, 0xe5, 0xd1, 0x9d, 0x14, 0xdf, - 0xd3, 0x82, 0x4d, 0x46, 0xf0, 0x80, 0x39, 0x52, 0x32, 0x0f, 0xe3, - 0x84, 0xb2, 0x7a, 0x43, 0xf2, 0x5e, 0xde, 0x5f, 0x3f, 0x1d, 0xdd, - 0xe3, 0xb2, 0x1b, 0xa0, 0xa1, 0x2a, 0x23, 0x03, 0x6e, 0x2e, 0x01, - 0x15, 0x87, 0x5c, 0xa6, 0x75, 0x75, 0xc7, 0x97, 0x61, 0xbe, 0xde, - 0x86, 0xdc, 0xd4, 0x48, 0xdb, 0xbd, 0x2a, 0xbf, 0x4a, 0x55, 0xda, - 0xe8, 0x7d, 0x50, 0xfb, 0xb4, 0x80, 0x17, 0xb8, 0x94, 0xbf, 0x01, - 0x3d, 0xea, 0xda, 0xba, 0x7c, 0xe0, 0x58, 0x67, 0x17, 0xb9, 0x58, - 0xe0, 0x88, 0x86, 0x46, 0x67, 0x6c, 0x9d, 0x10, 0x47, 0x58, 0x32, - 0xd0, 0x35, 0x7c, 0x79, 0x2a, 0x90, 0xa2, 0x5a, 0x10, 0x11, 0x23, - 0x35, 0xad, 0x2f, 0xcc, 0xe4, 0x4a, 0x5b, 0xa7, 0xc8, 0x27, 0xf2, - 0x83, 0xde, 0x5e, 0xbb, 0x5e, 0x77, 0xe7, 0xe8, 0xa5, 0x6e, 0x63, - 0xc2, 0x0d, 0x5d, 0x61, 0xd0, 0x8c, 0xd2, 0x6c, 0x5a, 0x21, 0x0e, - 0xca, 0x28, 0xa3, 0xce, 0x2a, 0xe9, 0x95, 0xc7, 0x48, 0xcf, 0x96, - 0x6f, 0x1d, 0x92, 0x25, 0xc8, 0xc6, 0xc6, 0xc1, 0xc1, 0x0c, 0x05, - 0xac, 0x26, 0xc4, 0xd2, 0x75, 0xd2, 0xe1, 0x2a, 0x67, 0xc0, 0x3d, - 0x5b, 0xa5, 0x9a, 0xeb, 0xcf, 0x7b, 0x1a, 0xa8, 0x9d, 0x14, 0x45, - 0xe5, 0x0f, 0xa0, 0x9a, 0x65, 0xde, 0x2f, 0x28, 0xbd, 0xce, 0x6f, - 0x94, 0x66, 0x83, 0x48, 0x29, 0xd8, 0xea, 0x65, 0x8c, 0xaf, 0x93, - 0xd9, 0x64, 0x9f, 0x55, 0x57, 0x26, 0xbf, 0x6f, 0xcb, 0x37, 0x31, - 0x99, 0xa3, 0x60, 0xbb, 0x1c, 0xad, 0x89, 0x34, 0x32, 0x62, 0xb8, - 0x43, 0x21, 0x06, 0x72, 0x0c, 0xa1, 0x5c, 0x6d, 0x46, 0xc5, 0xfa, - 0x29, 0xcf, 0x30, 0xde, 0x89, 0xdc, 0x71, 0x5b, 0xdd, 0xb6, 0x37, - 0x3e, 0xdf, 0x50, 0xf5, 0xb8, 0x07, 0x25, 0x26, 0xe5, 0xbc, 0xb5, - 0xfe, 0x3c, 0x02, 0xb3, 0xb7, 0xf8, 0xbe, 0x43, 0xc1, 0x87, 0x11, - 0x94, 0x9e, 0x23, 0x6c, 0x17, 0x8a, 0xb8, 0x8a, 0x27, 0x0c, 0x54, - 0x47, 0xf0, 0xa9, 0xb3, 0xc0, 0x80, 0x8c, 0xa0, 0x27, 0xeb, 0x1d, - 0x19, 0xe3, 0x07, 0x8e, 0x77, 0x70, 0xca, 0x2b, 0xf4, 0x7d, 0x76, - 0xe0, 0x78, 0x67, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, - 0x61, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, - 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, - 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x4d, 0x45, 0xc1, 0x68, - 0x38, 0xbb, 0x73, 0xa9, 0x69, 0xa1, 0x20, 0xe7, 0xed, 0xf5, 0x22, - 0xa1, 0x23, 0x14, 0xd7, 0x9e, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, - 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x4d, 0x45, 0xc1, 0x68, - 0x38, 0xbb, 0x73, 0xa9, 0x69, 0xa1, 0x20, 0xe7, 0xed, 0xf5, 0x22, - 0xa1, 0x23, 0x14, 0xd7, 0x9e, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, - 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, + 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x34, 0x30, 0x33, 0x30, 0x34, 0x30, + 0x35, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x30, + 0x33, 0x30, 0x34, 0x30, 0x35, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, + 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x13, 0x0d, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, + 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x13, 0x17, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, + 0x73, 0x74, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, + 0x6c, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x67, 0x6b, 0x06, - 0xb9, 0x5f, 0x45, 0x3b, 0x2a, 0x4b, 0x33, 0xb3, 0xe6, 0x1b, 0x6b, - 0x59, 0x4e, 0x22, 0xcc, 0xb9, 0xb7, 0xa4, 0x25, 0xc9, 0xa7, 0xc4, - 0xf0, 0x54, 0x96, 0x0b, 0x64, 0xf3, 0xb1, 0x58, 0x4f, 0x5e, 0x51, - 0xfc, 0xb2, 0x97, 0x7b, 0x27, 0x65, 0xc2, 0xe5, 0xca, 0xe7, 0x0d, - 0x0c, 0x25, 0x7b, 0x62, 0xe3, 0xfa, 0x9f, 0xb4, 0x87, 0xb7, 0x45, - 0x46, 0xaf, 0x83, 0xa5, 0x97, 0x48, 0x8c, 0xa5, 0xbd, 0xf1, 0x16, - 0x2b, 0x9b, 0x76, 0x2c, 0x7a, 0x35, 0x60, 0x6c, 0x11, 0x80, 0x97, - 0xcc, 0xa9, 0x92, 0x52, 0xe6, 0x2b, 0xe6, 0x69, 0xed, 0xa9, 0xf8, - 0x36, 0x2d, 0x2c, 0x77, 0xbf, 0x61, 0x48, 0xd1, 0x63, 0x0b, 0xb9, - 0x5b, 0x52, 0xed, 0x18, 0xb0, 0x43, 0x42, 0x22, 0xa6, 0xb1, 0x77, - 0xae, 0xde, 0x69, 0xc5, 0xcd, 0xc7, 0x1c, 0xa1, 0xb1, 0xa5, 0x1c, - 0x10, 0xfb, 0x18, 0xbe, 0x1a, 0x70, 0xdd, 0xc1, 0x92, 0x4b, 0xbe, - 0x29, 0x5a, 0x9d, 0x3f, 0x35, 0xbe, 0xe5, 0x7d, 0x51, 0xf8, 0x55, - 0xe0, 0x25, 0x75, 0x23, 0x87, 0x1e, 0x5c, 0xdc, 0xba, 0x9d, 0xb0, - 0xac, 0xb3, 0x69, 0xdb, 0x17, 0x83, 0xc9, 0xf7, 0xde, 0x0c, 0xbc, - 0x08, 0xdc, 0x91, 0x9e, 0xa8, 0xd0, 0xd7, 0x15, 0x37, 0x73, 0xa5, - 0x35, 0xb8, 0xfc, 0x7e, 0xc5, 0x44, 0x40, 0x06, 0xc3, 0xeb, 0xf8, - 0x22, 0x80, 0x5c, 0x47, 0xce, 0x02, 0xe3, 0x11, 0x9f, 0x44, 0xff, - 0xfd, 0x9a, 0x32, 0xcc, 0x7d, 0x64, 0x51, 0x0e, 0xeb, 0x57, 0x26, - 0x76, 0x3a, 0xe3, 0x1e, 0x22, 0x3c, 0xc2, 0xa6, 0x36, 0xdd, 0x19, - 0xef, 0xa7, 0xfc, 0x12, 0xf3, 0x26, 0xc0, 0x59, 0x31, 0x85, 0x4c, - 0x9c, 0xd8, 0xcf, 0xdf, 0xa4, 0xcc, 0xcc, 0x29, 0x93, 0xff, 0x94, - 0x6d, 0x76, 0x5c, 0x13, 0x08, 0x97, 0xf2, 0xed, 0xa5, 0x0b, 0x4d, - 0xdd, 0xe8, 0xc9, 0x68, 0x0e, 0x66, 0xd3, 0x00, 0x0e, 0x33, 0x12, - 0x5b, 0xbc, 0x95, 0xe5, 0x32, 0x90, 0xa8, 0xb3, 0xc6, 0x6c, 0x83, - 0xad, 0x77, 0xee, 0x8b, 0x7e, 0x7e, 0xb1, 0xa9, 0xab, 0xd3, 0xe1, - 0xf1, 0xb6, 0xc0, 0xb1, 0xea, 0x88, 0xc0, 0xe7, 0xd3, 0x90, 0xe9, - 0x28, 0x92, 0x94, 0x7b, 0x68, 0x7b, 0x97, 0x2a, 0x0a, 0x67, 0x2d, - 0x85, 0x02, 0x38, 0x10, 0xe4, 0x03, 0x61, 0xd4, 0xda, 0x25, 0x36, - 0xc7, 0x08, 0x58, 0x2d, 0xa1, 0xa7, 0x51, 0xaf, 0x30, 0x0a, 0x49, - 0xf5, 0xa6, 0x69, 0x87, 0x07, 0x2d, 0x44, 0x46, 0x76, 0x8e, 0x2a, - 0xe5, 0x9a, 0x3b, 0xd7, 0x18, 0xa2, 0xfc, 0x9c, 0x38, 0x10, 0xcc, - 0xc6, 0x3b, 0xd2, 0xb5, 0x17, 0x3a, 0x6f, 0xfd, 0xae, 0x25, 0xbd, - 0xf5, 0x72, 0x59, 0x64, 0xb1, 0x74, 0x2a, 0x38, 0x5f, 0x18, 0x4c, - 0xdf, 0xcf, 0x71, 0x04, 0x5a, 0x36, 0xd4, 0xbf, 0x2f, 0x99, 0x9c, - 0xe8, 0xd9, 0xba, 0xb1, 0x95, 0xe6, 0x02, 0x4b, 0x21, 0xa1, 0x5b, - 0xd5, 0xc1, 0x4f, 0x8f, 0xae, 0x69, 0x6d, 0x53, 0xdb, 0x01, 0x93, - 0xb5, 0x5c, 0x1e, 0x18, 0xdd, 0x64, 0x5a, 0xca, 0x18, 0x28, 0x3e, - 0x63, 0x04, 0x11, 0xfd, 0x1c, 0x8d, 0x00, 0x0f, 0xb8, 0x37, 0xdf, - 0x67, 0x8a, 0x9d, 0x66, 0xa9, 0x02, 0x6a, 0x91, 0xff, 0x13, 0xca, - 0x2f, 0x5d, 0x83, 0xbc, 0x87, 0x93, 0x6c, 0xdc, 0x24, 0x51, 0x16, - 0x04, 0x25, 0x66, 0xfa, 0xb3, 0xd9, 0xc2, 0xba, 0x29, 0xbe, 0x9a, - 0x48, 0x38, 0x82, 0x99, 0xf4, 0xbf, 0x3b, 0x4a, 0x31, 0x19, 0xf9, - 0xbf, 0x8e, 0x21, 0x33, 0x14, 0xca, 0x4f, 0x54, 0x5f, 0xfb, 0xce, - 0xfb, 0x8f, 0x71, 0x7f, 0xfd, 0x5e, 0x19, 0xa0, 0x0f, 0x4b, 0x91, - 0xb8, 0xc4, 0x54, 0xbc, 0x06, 0xb0, 0x45, 0x8f, 0x26, 0x91, 0xa2, - 0x8e, 0xfe, 0xa9, 0x30, 0x82, 0x03, 0xa2, 0x30, 0x82, 0x02, 0x8a, - 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x13, 0x86, 0x35, 0x4d, - 0x1d, 0x3f, 0x06, 0xf2, 0xc1, 0xf9, 0x65, 0x05, 0xd5, 0x90, 0x1c, - 0x62, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x6b, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0d, - 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x04, 0x56, 0x49, - 0x53, 0x41, 0x31, 0x2f, 0x30, 0x2d, 0x06, 0x03, 0x55, 0x04, 0x0b, - 0x13, 0x26, 0x56, 0x69, 0x73, 0x61, 0x20, 0x49, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x41, 0x73, 0x73, 0x6f, - 0x63, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x1c, 0x30, 0x1a, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x56, 0x69, 0x73, 0x61, - 0x20, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x65, 0x20, - 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x32, 0x30, - 0x36, 0x32, 0x36, 0x30, 0x32, 0x31, 0x38, 0x33, 0x36, 0x5a, 0x17, - 0x0d, 0x32, 0x32, 0x30, 0x36, 0x32, 0x34, 0x30, 0x30, 0x31, 0x36, - 0x31, 0x32, 0x5a, 0x30, 0x6b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, + 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xb3, 0x54, 0x52, 0xc1, 0xc9, + 0x3e, 0xf2, 0xd9, 0xdc, 0xb1, 0x53, 0x1a, 0x59, 0x29, 0xe7, 0xb1, + 0xc3, 0x45, 0x28, 0xe5, 0xd7, 0xd1, 0xed, 0xc5, 0xc5, 0x4b, 0xa1, + 0xaa, 0x74, 0x7b, 0x57, 0xaf, 0x4a, 0x26, 0xfc, 0xd8, 0xf5, 0x5e, + 0xa7, 0x6e, 0x19, 0xdb, 0x74, 0x0c, 0x4f, 0x35, 0x5b, 0x32, 0x0b, + 0x01, 0xe3, 0xdb, 0xeb, 0x7a, 0x77, 0x35, 0xea, 0xaa, 0x5a, 0xe0, + 0xd6, 0xe8, 0xa1, 0x57, 0x94, 0xf0, 0x90, 0xa3, 0x74, 0x56, 0x94, + 0x44, 0x30, 0x03, 0x1e, 0x5c, 0x4e, 0x2b, 0x85, 0x26, 0x74, 0x82, + 0x7a, 0x0c, 0x76, 0xa0, 0x6f, 0x4d, 0xce, 0x41, 0x2d, 0xa0, 0x15, + 0x06, 0x14, 0x5f, 0xb7, 0x42, 0xcd, 0x7b, 0x8f, 0x58, 0x61, 0x34, + 0xdc, 0x2a, 0x08, 0xf9, 0x2e, 0xc3, 0x01, 0xa6, 0x22, 0x44, 0x1c, + 0x4c, 0x07, 0x82, 0xe6, 0x5b, 0xce, 0xd0, 0x4a, 0x7c, 0x04, 0xd3, + 0x19, 0x73, 0x27, 0xf0, 0xaa, 0x98, 0x7f, 0x2e, 0xaf, 0x4e, 0xeb, + 0x87, 0x1e, 0x24, 0x77, 0x6a, 0x5d, 0xb6, 0xe8, 0x5b, 0x45, 0xba, + 0xdc, 0xc3, 0xa1, 0x05, 0x6f, 0x56, 0x8e, 0x8f, 0x10, 0x26, 0xa5, + 0x49, 0xc3, 0x2e, 0xd7, 0x41, 0x87, 0x22, 0xe0, 0x4f, 0x86, 0xca, + 0x60, 0xb5, 0xea, 0xa1, 0x63, 0xc0, 0x01, 0x97, 0x10, 0x79, 0xbd, + 0x00, 0x3c, 0x12, 0x6d, 0x2b, 0x15, 0xb1, 0xac, 0x4b, 0xb1, 0xee, + 0x18, 0xb9, 0x4e, 0x96, 0xdc, 0xdc, 0x76, 0xff, 0x3b, 0xbe, 0xcf, + 0x5f, 0x03, 0xc0, 0xfc, 0x3b, 0xe8, 0xbe, 0x46, 0x1b, 0xff, 0xda, + 0x40, 0xc2, 0x52, 0xf7, 0xfe, 0xe3, 0x3a, 0xf7, 0x6a, 0x77, 0x35, + 0xd0, 0xda, 0x8d, 0xeb, 0x5e, 0x18, 0x6a, 0x31, 0xc7, 0x1e, 0xba, + 0x3c, 0x1b, 0x28, 0xd6, 0x6b, 0x54, 0xc6, 0xaa, 0x5b, 0xd7, 0xa2, + 0x2c, 0x1b, 0x19, 0xcc, 0xa2, 0x02, 0xf6, 0x9b, 0x59, 0xbd, 0x37, + 0x6b, 0x86, 0xb5, 0x6d, 0x82, 0xba, 0xd8, 0xea, 0xc9, 0x56, 0xbc, + 0xa9, 0x36, 0x58, 0xfd, 0x3e, 0x19, 0xf3, 0xed, 0x0c, 0x26, 0xa9, + 0x93, 0x38, 0xf8, 0x4f, 0xc1, 0x5d, 0x22, 0x06, 0xd0, 0x97, 0xea, + 0xe1, 0xad, 0xc6, 0x55, 0xe0, 0x81, 0x2b, 0x28, 0x83, 0x3a, 0xfa, + 0xf4, 0x7b, 0x21, 0x51, 0x00, 0xbe, 0x52, 0x38, 0xce, 0xcd, 0x66, + 0x79, 0xa8, 0xf4, 0x81, 0x56, 0xe2, 0xd0, 0x83, 0x09, 0x47, 0x51, + 0x5b, 0x50, 0x6a, 0xcf, 0xdb, 0x48, 0x1a, 0x5d, 0x3e, 0xf7, 0xcb, + 0xf6, 0x65, 0xf7, 0x6c, 0xf1, 0x95, 0xf8, 0x02, 0x3b, 0x32, 0x56, + 0x82, 0x39, 0x7a, 0x5b, 0xbd, 0x2f, 0x89, 0x1b, 0xbf, 0xa1, 0xb4, + 0xe8, 0xff, 0x7f, 0x8d, 0x8c, 0xdf, 0x03, 0xf1, 0x60, 0x4e, 0x58, + 0x11, 0x4c, 0xeb, 0xa3, 0x3f, 0x10, 0x2b, 0x83, 0x9a, 0x01, 0x73, + 0xd9, 0x94, 0x6d, 0x84, 0x00, 0x27, 0x66, 0xac, 0xf0, 0x70, 0x40, + 0x09, 0x42, 0x92, 0xad, 0x4f, 0x93, 0x0d, 0x61, 0x09, 0x51, 0x24, + 0xd8, 0x92, 0xd5, 0x0b, 0x94, 0x61, 0xb2, 0x87, 0xb2, 0xed, 0xff, + 0x9a, 0x35, 0xff, 0x85, 0x54, 0xca, 0xed, 0x44, 0x43, 0xac, 0x1b, + 0x3c, 0x16, 0x6b, 0x48, 0x4a, 0x0a, 0x1c, 0x40, 0x88, 0x1f, 0x92, + 0xc2, 0x0b, 0x00, 0x05, 0xff, 0xf2, 0xc8, 0x02, 0x4a, 0xa4, 0xaa, + 0xa9, 0xcc, 0x99, 0x96, 0x9c, 0x2f, 0x58, 0xe0, 0x7d, 0xe1, 0xbe, + 0xbb, 0x07, 0xdc, 0x5f, 0x04, 0x72, 0x5c, 0x31, 0x34, 0xc3, 0xec, + 0x5f, 0x2d, 0xe0, 0x3d, 0x64, 0x90, 0x22, 0xe6, 0xd1, 0xec, 0xb8, + 0x2e, 0xdd, 0x59, 0xae, 0xd9, 0xa1, 0x37, 0xbf, 0x54, 0x35, 0xdc, + 0x73, 0x32, 0x4f, 0x8c, 0x04, 0x1e, 0x33, 0xb2, 0xc9, 0x46, 0xf1, + 0xd8, 0x5c, 0xc8, 0x55, 0x50, 0xc9, 0x68, 0xbd, 0xa8, 0xba, 0x36, + 0x09, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, + 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, + 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, + 0x0e, 0x04, 0x16, 0x04, 0x14, 0x76, 0xf3, 0x55, 0xe1, 0xfa, 0xa4, + 0x36, 0xfb, 0xf0, 0x9f, 0x5c, 0x62, 0x71, 0xed, 0x3c, 0xf4, 0x47, + 0x38, 0x10, 0x2b, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, + 0x18, 0x30, 0x16, 0x80, 0x14, 0x76, 0xf3, 0x55, 0xe1, 0xfa, 0xa4, + 0x36, 0xfb, 0xf0, 0x9f, 0x5c, 0x62, 0x71, 0xed, 0x3c, 0xf4, 0x47, + 0x38, 0x10, 0x2b, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, + 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x66, 0xc1, 0xc6, 0x23, 0xf3, + 0xd9, 0xe0, 0x2e, 0x6e, 0x5f, 0xe8, 0xcf, 0xae, 0xb0, 0xb0, 0x25, + 0x4d, 0x2b, 0xf8, 0x3b, 0x58, 0x9b, 0x40, 0x24, 0x37, 0x5a, 0xcb, + 0xab, 0x16, 0x49, 0xff, 0xb3, 0x75, 0x79, 0x33, 0xa1, 0x2f, 0x6d, + 0x70, 0x17, 0x34, 0x91, 0xfe, 0x67, 0x7e, 0x8f, 0xec, 0x9b, 0xe5, + 0x5e, 0x82, 0xa9, 0x55, 0x1f, 0x2f, 0xdc, 0xd4, 0x51, 0x07, 0x12, + 0xfe, 0xac, 0x16, 0x3e, 0x2c, 0x35, 0xc6, 0x63, 0xfc, 0xdc, 0x10, + 0xeb, 0x0d, 0xa3, 0xaa, 0xd0, 0x7c, 0xcc, 0xd1, 0xd0, 0x2f, 0x51, + 0x2e, 0xc4, 0x14, 0x5a, 0xde, 0xe8, 0x19, 0xe1, 0x3e, 0xc6, 0xcc, + 0xa4, 0x29, 0xe7, 0x2e, 0x84, 0xaa, 0x06, 0x30, 0x78, 0x76, 0x54, + 0x73, 0x28, 0x98, 0x59, 0x38, 0xe0, 0x00, 0x0d, 0x62, 0xd3, 0x42, + 0x7d, 0x21, 0x9f, 0xae, 0x3d, 0x3a, 0x8c, 0xd5, 0xfa, 0x77, 0x0d, + 0x18, 0x2b, 0x16, 0x0e, 0x5f, 0x36, 0xe1, 0xfc, 0x2a, 0xb5, 0x30, + 0x24, 0xcf, 0xe0, 0x63, 0x0c, 0x7b, 0x58, 0x1a, 0xfe, 0x99, 0xba, + 0x42, 0x12, 0xb1, 0x91, 0xf4, 0x7c, 0x68, 0xe2, 0xc8, 0xe8, 0xaf, + 0x2c, 0xea, 0xc9, 0x7e, 0xae, 0xbb, 0x2a, 0x3d, 0x0d, 0x15, 0xdc, + 0x34, 0x95, 0xb6, 0x18, 0x74, 0xa8, 0x6a, 0x0f, 0xc7, 0xb4, 0xf4, + 0x13, 0xc4, 0xe4, 0x5b, 0xed, 0x0a, 0xd2, 0xa4, 0x97, 0x4c, 0x2a, + 0xed, 0x2f, 0x6c, 0x12, 0x89, 0x3d, 0xf1, 0x27, 0x70, 0xaa, 0x6a, + 0x03, 0x52, 0x21, 0x9f, 0x40, 0xa8, 0x67, 0x50, 0xf2, 0xf3, 0x5a, + 0x1f, 0xdf, 0xdf, 0x23, 0xf6, 0xdc, 0x78, 0x4e, 0xe6, 0x98, 0x4f, + 0x55, 0x3a, 0x53, 0xe3, 0xef, 0xf2, 0xf4, 0x9f, 0xc7, 0x7c, 0xd8, + 0x58, 0xaf, 0x29, 0x22, 0x97, 0xb8, 0xe0, 0xbd, 0x91, 0x2e, 0xb0, + 0x76, 0xec, 0x57, 0x11, 0xcf, 0xef, 0x29, 0x44, 0xf3, 0xe9, 0x85, + 0x7a, 0x60, 0x63, 0xe4, 0x5d, 0x33, 0x89, 0x17, 0xd9, 0x31, 0xaa, + 0xda, 0xd6, 0xf3, 0x18, 0x35, 0x72, 0xcf, 0x87, 0x2b, 0x2f, 0x63, + 0x23, 0x84, 0x5d, 0x84, 0x8c, 0x3f, 0x57, 0xa0, 0x88, 0xfc, 0x99, + 0x91, 0x28, 0x26, 0x69, 0x99, 0xd4, 0x8f, 0x97, 0x44, 0xbe, 0x8e, + 0xd5, 0x48, 0xb1, 0xa4, 0x28, 0x29, 0xf1, 0x15, 0xb4, 0xe1, 0xe5, + 0x9e, 0xdd, 0xf8, 0x8f, 0xa6, 0x6f, 0x26, 0xd7, 0x09, 0x3c, 0x3a, + 0x1c, 0x11, 0x0e, 0xa6, 0x6c, 0x37, 0xf7, 0xad, 0x44, 0x87, 0x2c, + 0x28, 0xc7, 0xd8, 0x74, 0x82, 0xb3, 0xd0, 0x6f, 0x4a, 0x57, 0xbb, + 0x35, 0x29, 0x27, 0xa0, 0x8b, 0xe8, 0x21, 0xa7, 0x87, 0x64, 0x36, + 0x5d, 0xcc, 0xd8, 0x16, 0xac, 0xc7, 0xb2, 0x27, 0x40, 0x92, 0x55, + 0x38, 0x28, 0x8d, 0x51, 0x6e, 0xdd, 0x14, 0x67, 0x53, 0x6c, 0x71, + 0x5c, 0x26, 0x84, 0x4d, 0x75, 0x5a, 0xb6, 0x7e, 0x60, 0x56, 0xa9, + 0x4d, 0xad, 0xfb, 0x9b, 0x1e, 0x97, 0xf3, 0x0d, 0xd9, 0xd2, 0x97, + 0x54, 0x77, 0xda, 0x3d, 0x12, 0xb7, 0xe0, 0x1e, 0xef, 0x08, 0x06, + 0xac, 0xf9, 0x85, 0x87, 0xe9, 0xa2, 0xdc, 0xaf, 0x7e, 0x18, 0x12, + 0x83, 0xfd, 0x56, 0x17, 0x41, 0x2e, 0xd5, 0x29, 0x82, 0x7d, 0x99, + 0xf4, 0x31, 0xf6, 0x71, 0xa9, 0xcf, 0x2c, 0x01, 0x27, 0xa5, 0x05, + 0xb9, 0xaa, 0xb2, 0x48, 0x4e, 0x2a, 0xef, 0x9f, 0x93, 0x52, 0x51, + 0x95, 0x3c, 0x52, 0x73, 0x8e, 0x56, 0x4c, 0x17, 0x40, 0xc0, 0x09, + 0x28, 0xe4, 0x8b, 0x6a, 0x48, 0x53, 0xdb, 0xec, 0xcd, 0x55, 0x55, + 0xf1, 0xc6, 0xf8, 0xe9, 0xa2, 0x2c, 0x4c, 0xa6, 0xd1, 0x26, 0x5f, + 0x7e, 0xaf, 0x5a, 0x4c, 0xda, 0x1f, 0xa6, 0xf2, 0x1c, 0x2c, 0x7e, + 0xae, 0x02, 0x16, 0xd2, 0x56, 0xd0, 0x2f, 0x57, 0x53, 0x47, 0xe8, + 0x92, 0x30, 0x82, 0x03, 0xa2, 0x30, 0x82, 0x02, 0x8a, 0xa0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x10, 0x13, 0x86, 0x35, 0x4d, 0x1d, 0x3f, + 0x06, 0xf2, 0xc1, 0xf9, 0x65, 0x05, 0xd5, 0x90, 0x1c, 0x62, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x05, 0x05, 0x00, 0x30, 0x6b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x04, 0x56, 0x49, 0x53, 0x41, 0x31, 0x2f, 0x30, 0x2d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x26, @@ -2834,351 +1678,152 @@ static const unsigned char ca_bundle_data[] = { 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x56, 0x69, 0x73, 0x61, 0x20, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x65, 0x20, 0x52, 0x6f, - 0x6f, 0x74, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, - 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, - 0x01, 0x00, 0xaf, 0x57, 0xde, 0x56, 0x1e, 0x6e, 0xa1, 0xda, 0x60, - 0xb1, 0x94, 0x27, 0xcb, 0x17, 0xdb, 0x07, 0x3f, 0x80, 0x85, 0x4f, - 0xc8, 0x9c, 0xb6, 0xd0, 0xf4, 0x6f, 0x4f, 0xcf, 0x99, 0xd8, 0xe1, - 0xdb, 0xc2, 0x48, 0x5c, 0x3a, 0xac, 0x39, 0x33, 0xc7, 0x1f, 0x6a, - 0x8b, 0x26, 0x3d, 0x2b, 0x35, 0xf5, 0x48, 0xb1, 0x91, 0xc1, 0x02, - 0x4e, 0x04, 0x96, 0x91, 0x7b, 0xb0, 0x33, 0xf0, 0xb1, 0x14, 0x4e, - 0x11, 0x6f, 0xb5, 0x40, 0xaf, 0x1b, 0x45, 0xa5, 0x4a, 0xef, 0x7e, - 0xb6, 0xac, 0xf2, 0xa0, 0x1f, 0x58, 0x3f, 0x12, 0x46, 0x60, 0x3c, - 0x8d, 0xa1, 0xe0, 0x7d, 0xcf, 0x57, 0x3e, 0x33, 0x1e, 0xfb, 0x47, - 0xf1, 0xaa, 0x15, 0x97, 0x07, 0x55, 0x66, 0xa5, 0xb5, 0x2d, 0x2e, - 0xd8, 0x80, 0x59, 0xb2, 0xa7, 0x0d, 0xb7, 0x46, 0xec, 0x21, 0x63, - 0xff, 0x35, 0xab, 0xa5, 0x02, 0xcf, 0x2a, 0xf4, 0x4c, 0xfe, 0x7b, - 0xf5, 0x94, 0x5d, 0x84, 0x4d, 0xa8, 0xf2, 0x60, 0x8f, 0xdb, 0x0e, - 0x25, 0x3c, 0x9f, 0x73, 0x71, 0xcf, 0x94, 0xdf, 0x4a, 0xea, 0xdb, - 0xdf, 0x72, 0x38, 0x8c, 0xf3, 0x96, 0xbd, 0xf1, 0x17, 0xbc, 0xd2, - 0xba, 0x3b, 0x45, 0x5a, 0xc6, 0xa7, 0xf6, 0xc6, 0x17, 0x8b, 0x01, - 0x9d, 0xfc, 0x19, 0xa8, 0x2a, 0x83, 0x16, 0xb8, 0x3a, 0x48, 0xfe, - 0x4e, 0x3e, 0xa0, 0xab, 0x06, 0x19, 0xe9, 0x53, 0xf3, 0x80, 0x13, - 0x07, 0xed, 0x2d, 0xbf, 0x3f, 0x0a, 0x3c, 0x55, 0x20, 0x39, 0x2c, - 0x2c, 0x00, 0x69, 0x74, 0x95, 0x4a, 0xbc, 0x20, 0xb2, 0xa9, 0x79, - 0xe5, 0x18, 0x89, 0x91, 0xa8, 0xdc, 0x1c, 0x4d, 0xef, 0xbb, 0x7e, - 0x37, 0x0b, 0x5d, 0xfe, 0x39, 0xa5, 0x88, 0x52, 0x8c, 0x00, 0x6c, - 0xec, 0x18, 0x7c, 0x41, 0xbd, 0xf6, 0x8b, 0x75, 0x77, 0xba, 0x60, - 0x9d, 0x84, 0xe7, 0xfe, 0x2d, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, - 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, - 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, - 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, - 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, - 0x16, 0x04, 0x14, 0x15, 0x38, 0x83, 0x0f, 0x3f, 0x2c, 0x3f, 0x70, - 0x33, 0x1e, 0xcd, 0x46, 0xfe, 0x07, 0x8c, 0x20, 0xe0, 0xd7, 0xc3, - 0xb7, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x5f, - 0xf1, 0x41, 0x7d, 0x7c, 0x5c, 0x08, 0xb9, 0x2b, 0xe0, 0xd5, 0x92, - 0x47, 0xfa, 0x67, 0x5c, 0xa5, 0x13, 0xc3, 0x03, 0x21, 0x9b, 0x2b, - 0x4c, 0x89, 0x46, 0xcf, 0x59, 0x4d, 0xc9, 0xfe, 0xa5, 0x40, 0xb6, - 0x63, 0xcd, 0xdd, 0x71, 0x28, 0x95, 0x67, 0x11, 0xcc, 0x24, 0xac, - 0xd3, 0x44, 0x6c, 0x71, 0xae, 0x01, 0x20, 0x6b, 0x03, 0xa2, 0x8f, - 0x18, 0xb7, 0x29, 0x3a, 0x7d, 0xe5, 0x16, 0x60, 0x53, 0x78, 0x3c, - 0xc0, 0xaf, 0x15, 0x83, 0xf7, 0x8f, 0x52, 0x33, 0x24, 0xbd, 0x64, - 0x93, 0x97, 0xee, 0x8b, 0xf7, 0xdb, 0x18, 0xa8, 0x6d, 0x71, 0xb3, - 0xf7, 0x2c, 0x17, 0xd0, 0x74, 0x25, 0x69, 0xf7, 0xfe, 0x6b, 0x3c, - 0x94, 0xbe, 0x4d, 0x4b, 0x41, 0x8c, 0x4e, 0xe2, 0x73, 0xd0, 0xe3, - 0x90, 0x22, 0x73, 0x43, 0xcd, 0xf3, 0xef, 0xea, 0x73, 0xce, 0x45, - 0x8a, 0xb0, 0xa6, 0x49, 0xff, 0x4c, 0x7d, 0x9d, 0x71, 0x88, 0xc4, - 0x76, 0x1d, 0x90, 0x5b, 0x1d, 0xee, 0xfd, 0xcc, 0xf7, 0xee, 0xfd, - 0x60, 0xa5, 0xb1, 0x7a, 0x16, 0x71, 0xd1, 0x16, 0xd0, 0x7c, 0x12, - 0x3c, 0x6c, 0x69, 0x97, 0xdb, 0xae, 0x5f, 0x39, 0x9a, 0x70, 0x2f, - 0x05, 0x3c, 0x19, 0x46, 0x04, 0x99, 0x20, 0x36, 0xd0, 0x60, 0x6e, - 0x61, 0x06, 0xbb, 0x16, 0x42, 0x8c, 0x70, 0xf7, 0x30, 0xfb, 0xe0, - 0xdb, 0x66, 0xa3, 0x00, 0x01, 0xbd, 0xe6, 0x2c, 0xda, 0x91, 0x5f, - 0xa0, 0x46, 0x8b, 0x4d, 0x6a, 0x9c, 0x3d, 0x3d, 0xdd, 0x05, 0x46, - 0xfe, 0x76, 0xbf, 0xa0, 0x0a, 0x3c, 0xe4, 0x00, 0xe6, 0x27, 0xb7, - 0xff, 0x84, 0x2d, 0xde, 0xba, 0x22, 0x27, 0x96, 0x10, 0x71, 0xeb, - 0x22, 0xed, 0xdf, 0xdf, 0x33, 0x9c, 0xcf, 0xe3, 0xad, 0xae, 0x8e, - 0xd4, 0x8e, 0xe6, 0x4f, 0x51, 0xaf, 0x16, 0x92, 0xe0, 0x5c, 0xf6, - 0x07, 0x0f, 0x30, 0x82, 0x03, 0x0c, 0x30, 0x82, 0x01, 0xf4, 0xa0, - 0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x01, 0x00, 0x20, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, - 0x05, 0x00, 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x50, 0x4c, 0x31, 0x1b, 0x30, 0x19, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x13, 0x12, 0x55, 0x6e, 0x69, 0x7a, 0x65, - 0x74, 0x6f, 0x20, 0x53, 0x70, 0x2e, 0x20, 0x7a, 0x20, 0x6f, 0x2e, - 0x6f, 0x2e, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x03, - 0x13, 0x09, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x43, 0x41, - 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x32, 0x30, 0x36, 0x31, 0x31, 0x31, - 0x30, 0x34, 0x36, 0x33, 0x39, 0x5a, 0x17, 0x0d, 0x32, 0x37, 0x30, - 0x36, 0x31, 0x31, 0x31, 0x30, 0x34, 0x36, 0x33, 0x39, 0x5a, 0x30, - 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, - 0x02, 0x50, 0x4c, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x12, 0x55, 0x6e, 0x69, 0x7a, 0x65, 0x74, 0x6f, 0x20, - 0x53, 0x70, 0x2e, 0x20, 0x7a, 0x20, 0x6f, 0x2e, 0x6f, 0x2e, 0x31, - 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x09, 0x43, - 0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, - 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, - 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xce, 0xb1, 0xc1, - 0x2e, 0xd3, 0x4f, 0x7c, 0xcd, 0x25, 0xce, 0x18, 0x3e, 0x4f, 0xc4, - 0x8c, 0x6f, 0x80, 0x6a, 0x73, 0xc8, 0x5b, 0x51, 0xf8, 0x9b, 0xd2, - 0xdc, 0xbb, 0x00, 0x5c, 0xb1, 0xa0, 0xfc, 0x75, 0x03, 0xee, 0x81, - 0xf0, 0x88, 0xee, 0x23, 0x52, 0xe9, 0xe6, 0x15, 0x33, 0x8d, 0xac, - 0x2d, 0x09, 0xc5, 0x76, 0xf9, 0x2b, 0x39, 0x80, 0x89, 0xe4, 0x97, - 0x4b, 0x90, 0xa5, 0xa8, 0x78, 0xf8, 0x73, 0x43, 0x7b, 0xa4, 0x61, - 0xb0, 0xd8, 0x58, 0xcc, 0xe1, 0x6c, 0x66, 0x7e, 0x9c, 0xf3, 0x09, - 0x5e, 0x55, 0x63, 0x84, 0xd5, 0xa8, 0xef, 0xf3, 0xb1, 0x2e, 0x30, - 0x68, 0xb3, 0xc4, 0x3c, 0xd8, 0xac, 0x6e, 0x8d, 0x99, 0x5a, 0x90, - 0x4e, 0x34, 0xdc, 0x36, 0x9a, 0x8f, 0x81, 0x88, 0x50, 0xb7, 0x6d, - 0x96, 0x42, 0x09, 0xf3, 0xd7, 0x95, 0x83, 0x0d, 0x41, 0x4b, 0xb0, - 0x6a, 0x6b, 0xf8, 0xfc, 0x0f, 0x7e, 0x62, 0x9f, 0x67, 0xc4, 0xed, - 0x26, 0x5f, 0x10, 0x26, 0x0f, 0x08, 0x4f, 0xf0, 0xa4, 0x57, 0x28, - 0xce, 0x8f, 0xb8, 0xed, 0x45, 0xf6, 0x6e, 0xee, 0x25, 0x5d, 0xaa, - 0x6e, 0x39, 0xbe, 0xe4, 0x93, 0x2f, 0xd9, 0x47, 0xa0, 0x72, 0xeb, - 0xfa, 0xa6, 0x5b, 0xaf, 0xca, 0x53, 0x3f, 0xe2, 0x0e, 0xc6, 0x96, - 0x56, 0x11, 0x6e, 0xf7, 0xe9, 0x66, 0xa9, 0x26, 0xd8, 0x7f, 0x95, - 0x53, 0xed, 0x0a, 0x85, 0x88, 0xba, 0x4f, 0x29, 0xa5, 0x42, 0x8c, - 0x5e, 0xb6, 0xfc, 0x85, 0x20, 0x00, 0xaa, 0x68, 0x0b, 0xa1, 0x1a, - 0x85, 0x01, 0x9c, 0xc4, 0x46, 0x63, 0x82, 0x88, 0xb6, 0x22, 0xb1, - 0xee, 0xfe, 0xaa, 0x46, 0x59, 0x7e, 0xcf, 0x35, 0x2c, 0xd5, 0xb6, - 0xda, 0x5d, 0xf7, 0x48, 0x33, 0x14, 0x54, 0xb6, 0xeb, 0xd9, 0x6f, - 0xce, 0xcd, 0x88, 0xd6, 0xab, 0x1b, 0xda, 0x96, 0x3b, 0x1d, 0x59, - 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x13, 0x30, 0x11, 0x30, 0x0f, - 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, - 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, - 0x01, 0x00, 0xb8, 0x8d, 0xce, 0xef, 0xe7, 0x14, 0xba, 0xcf, 0xee, - 0xb0, 0x44, 0x92, 0x6c, 0xb4, 0x39, 0x3e, 0xa2, 0x84, 0x6e, 0xad, - 0xb8, 0x21, 0x77, 0xd2, 0xd4, 0x77, 0x82, 0x87, 0xe6, 0x20, 0x41, - 0x81, 0xee, 0xe2, 0xf8, 0x11, 0xb7, 0x63, 0xd1, 0x17, 0x37, 0xbe, - 0x19, 0x76, 0x24, 0x1c, 0x04, 0x1a, 0x4c, 0xeb, 0x3d, 0xaa, 0x67, - 0x6f, 0x2d, 0xd4, 0xcd, 0xfe, 0x65, 0x31, 0x70, 0xc5, 0x1b, 0xa6, - 0x02, 0x0a, 0xba, 0x60, 0x7b, 0x6d, 0x58, 0xc2, 0x9a, 0x49, 0xfe, - 0x63, 0x32, 0x0b, 0x6b, 0xe3, 0x3a, 0xc0, 0xac, 0xab, 0x3b, 0xb0, - 0xe8, 0xd3, 0x09, 0x51, 0x8c, 0x10, 0x83, 0xc6, 0x34, 0xe0, 0xc5, - 0x2b, 0xe0, 0x1a, 0xb6, 0x60, 0x14, 0x27, 0x6c, 0x32, 0x77, 0x8c, - 0xbc, 0xb2, 0x72, 0x98, 0xcf, 0xcd, 0xcc, 0x3f, 0xb9, 0xc8, 0x24, - 0x42, 0x14, 0xd6, 0x57, 0xfc, 0xe6, 0x26, 0x43, 0xa9, 0x1d, 0xe5, - 0x80, 0x90, 0xce, 0x03, 0x54, 0x28, 0x3e, 0xf7, 0x3f, 0xd3, 0xf8, - 0x4d, 0xed, 0x6a, 0x0a, 0x3a, 0x93, 0x13, 0x9b, 0x3b, 0x14, 0x23, - 0x13, 0x63, 0x9c, 0x3f, 0xd1, 0x87, 0x27, 0x79, 0xe5, 0x4c, 0x51, - 0xe3, 0x01, 0xad, 0x85, 0x5d, 0x1a, 0x3b, 0xb1, 0xd5, 0x73, 0x10, - 0xa4, 0xd3, 0xf2, 0xbc, 0x6e, 0x64, 0xf5, 0x5a, 0x56, 0x90, 0xa8, - 0xc7, 0x0e, 0x4c, 0x74, 0x0f, 0x2e, 0x71, 0x3b, 0xf7, 0xc8, 0x47, - 0xf4, 0x69, 0x6f, 0x15, 0xf2, 0x11, 0x5e, 0x83, 0x1e, 0x9c, 0x7c, - 0x52, 0xae, 0xfd, 0x02, 0xda, 0x12, 0xa8, 0x59, 0x67, 0x18, 0xdb, - 0xbc, 0x70, 0xdd, 0x9b, 0xb1, 0x69, 0xed, 0x80, 0xce, 0x89, 0x40, - 0x48, 0x6a, 0x0e, 0x35, 0xca, 0x29, 0x66, 0x15, 0x21, 0x94, 0x2c, - 0xe8, 0x60, 0x2a, 0x9b, 0x85, 0x4a, 0x40, 0xf3, 0x6b, 0x8a, 0x24, - 0xec, 0x06, 0x16, 0x2c, 0x73, 0x30, 0x82, 0x04, 0x32, 0x30, 0x82, - 0x03, 0x1a, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, + 0x6f, 0x74, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x32, 0x30, 0x36, 0x32, + 0x36, 0x30, 0x32, 0x31, 0x38, 0x33, 0x36, 0x5a, 0x17, 0x0d, 0x32, + 0x32, 0x30, 0x36, 0x32, 0x34, 0x30, 0x30, 0x31, 0x36, 0x31, 0x32, + 0x5a, 0x30, 0x6b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, + 0x55, 0x04, 0x0a, 0x13, 0x04, 0x56, 0x49, 0x53, 0x41, 0x31, 0x2f, + 0x30, 0x2d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x26, 0x56, 0x69, + 0x73, 0x61, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x20, 0x41, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x13, 0x56, 0x69, 0x73, 0x61, 0x20, 0x65, 0x43, 0x6f, + 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x65, 0x20, 0x52, 0x6f, 0x6f, 0x74, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, + 0xaf, 0x57, 0xde, 0x56, 0x1e, 0x6e, 0xa1, 0xda, 0x60, 0xb1, 0x94, + 0x27, 0xcb, 0x17, 0xdb, 0x07, 0x3f, 0x80, 0x85, 0x4f, 0xc8, 0x9c, + 0xb6, 0xd0, 0xf4, 0x6f, 0x4f, 0xcf, 0x99, 0xd8, 0xe1, 0xdb, 0xc2, + 0x48, 0x5c, 0x3a, 0xac, 0x39, 0x33, 0xc7, 0x1f, 0x6a, 0x8b, 0x26, + 0x3d, 0x2b, 0x35, 0xf5, 0x48, 0xb1, 0x91, 0xc1, 0x02, 0x4e, 0x04, + 0x96, 0x91, 0x7b, 0xb0, 0x33, 0xf0, 0xb1, 0x14, 0x4e, 0x11, 0x6f, + 0xb5, 0x40, 0xaf, 0x1b, 0x45, 0xa5, 0x4a, 0xef, 0x7e, 0xb6, 0xac, + 0xf2, 0xa0, 0x1f, 0x58, 0x3f, 0x12, 0x46, 0x60, 0x3c, 0x8d, 0xa1, + 0xe0, 0x7d, 0xcf, 0x57, 0x3e, 0x33, 0x1e, 0xfb, 0x47, 0xf1, 0xaa, + 0x15, 0x97, 0x07, 0x55, 0x66, 0xa5, 0xb5, 0x2d, 0x2e, 0xd8, 0x80, + 0x59, 0xb2, 0xa7, 0x0d, 0xb7, 0x46, 0xec, 0x21, 0x63, 0xff, 0x35, + 0xab, 0xa5, 0x02, 0xcf, 0x2a, 0xf4, 0x4c, 0xfe, 0x7b, 0xf5, 0x94, + 0x5d, 0x84, 0x4d, 0xa8, 0xf2, 0x60, 0x8f, 0xdb, 0x0e, 0x25, 0x3c, + 0x9f, 0x73, 0x71, 0xcf, 0x94, 0xdf, 0x4a, 0xea, 0xdb, 0xdf, 0x72, + 0x38, 0x8c, 0xf3, 0x96, 0xbd, 0xf1, 0x17, 0xbc, 0xd2, 0xba, 0x3b, + 0x45, 0x5a, 0xc6, 0xa7, 0xf6, 0xc6, 0x17, 0x8b, 0x01, 0x9d, 0xfc, + 0x19, 0xa8, 0x2a, 0x83, 0x16, 0xb8, 0x3a, 0x48, 0xfe, 0x4e, 0x3e, + 0xa0, 0xab, 0x06, 0x19, 0xe9, 0x53, 0xf3, 0x80, 0x13, 0x07, 0xed, + 0x2d, 0xbf, 0x3f, 0x0a, 0x3c, 0x55, 0x20, 0x39, 0x2c, 0x2c, 0x00, + 0x69, 0x74, 0x95, 0x4a, 0xbc, 0x20, 0xb2, 0xa9, 0x79, 0xe5, 0x18, + 0x89, 0x91, 0xa8, 0xdc, 0x1c, 0x4d, 0xef, 0xbb, 0x7e, 0x37, 0x0b, + 0x5d, 0xfe, 0x39, 0xa5, 0x88, 0x52, 0x8c, 0x00, 0x6c, 0xec, 0x18, + 0x7c, 0x41, 0xbd, 0xf6, 0x8b, 0x75, 0x77, 0xba, 0x60, 0x9d, 0x84, + 0xe7, 0xfe, 0x2d, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, + 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, + 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, + 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, + 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, + 0x14, 0x15, 0x38, 0x83, 0x0f, 0x3f, 0x2c, 0x3f, 0x70, 0x33, 0x1e, + 0xcd, 0x46, 0xfe, 0x07, 0x8c, 0x20, 0xe0, 0xd7, 0xc3, 0xb7, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x05, 0x05, 0x00, 0x30, 0x7b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, - 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, - 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x12, 0x47, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, - 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, - 0x07, 0x0c, 0x07, 0x53, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, - 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x11, 0x43, - 0x6f, 0x6d, 0x6f, 0x64, 0x6f, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x0c, 0x18, 0x41, 0x41, 0x41, 0x20, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x30, 0x1e, 0x17, 0x0d, - 0x30, 0x34, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x38, 0x31, 0x32, 0x33, 0x31, 0x32, - 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x7b, 0x31, 0x0b, 0x30, - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, - 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x12, 0x47, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, - 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, - 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x53, 0x61, 0x6c, 0x66, 0x6f, - 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x0c, 0x11, 0x43, 0x6f, 0x6d, 0x6f, 0x64, 0x6f, 0x20, 0x43, 0x41, - 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x21, 0x30, - 0x1f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x18, 0x41, 0x41, 0x41, - 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x30, - 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, - 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbe, - 0x40, 0x9d, 0xf4, 0x6e, 0xe1, 0xea, 0x76, 0x87, 0x1c, 0x4d, 0x45, - 0x44, 0x8e, 0xbe, 0x46, 0xc8, 0x83, 0x06, 0x9d, 0xc1, 0x2a, 0xfe, - 0x18, 0x1f, 0x8e, 0xe4, 0x02, 0xfa, 0xf3, 0xab, 0x5d, 0x50, 0x8a, - 0x16, 0x31, 0x0b, 0x9a, 0x06, 0xd0, 0xc5, 0x70, 0x22, 0xcd, 0x49, - 0x2d, 0x54, 0x63, 0xcc, 0xb6, 0x6e, 0x68, 0x46, 0x0b, 0x53, 0xea, - 0xcb, 0x4c, 0x24, 0xc0, 0xbc, 0x72, 0x4e, 0xea, 0xf1, 0x15, 0xae, - 0xf4, 0x54, 0x9a, 0x12, 0x0a, 0xc3, 0x7a, 0xb2, 0x33, 0x60, 0xe2, - 0xda, 0x89, 0x55, 0xf3, 0x22, 0x58, 0xf3, 0xde, 0xdc, 0xcf, 0xef, - 0x83, 0x86, 0xa2, 0x8c, 0x94, 0x4f, 0x9f, 0x68, 0xf2, 0x98, 0x90, - 0x46, 0x84, 0x27, 0xc7, 0x76, 0xbf, 0xe3, 0xcc, 0x35, 0x2c, 0x8b, - 0x5e, 0x07, 0x64, 0x65, 0x82, 0xc0, 0x48, 0xb0, 0xa8, 0x91, 0xf9, - 0x61, 0x9f, 0x76, 0x20, 0x50, 0xa8, 0x91, 0xc7, 0x66, 0xb5, 0xeb, - 0x78, 0x62, 0x03, 0x56, 0xf0, 0x8a, 0x1a, 0x13, 0xea, 0x31, 0xa3, - 0x1e, 0xa0, 0x99, 0xfd, 0x38, 0xf6, 0xf6, 0x27, 0x32, 0x58, 0x6f, - 0x07, 0xf5, 0x6b, 0xb8, 0xfb, 0x14, 0x2b, 0xaf, 0xb7, 0xaa, 0xcc, - 0xd6, 0x63, 0x5f, 0x73, 0x8c, 0xda, 0x05, 0x99, 0xa8, 0x38, 0xa8, - 0xcb, 0x17, 0x78, 0x36, 0x51, 0xac, 0xe9, 0x9e, 0xf4, 0x78, 0x3a, - 0x8d, 0xcf, 0x0f, 0xd9, 0x42, 0xe2, 0x98, 0x0c, 0xab, 0x2f, 0x9f, - 0x0e, 0x01, 0xde, 0xef, 0x9f, 0x99, 0x49, 0xf1, 0x2d, 0xdf, 0xac, - 0x74, 0x4d, 0x1b, 0x98, 0xb5, 0x47, 0xc5, 0xe5, 0x29, 0xd1, 0xf9, - 0x90, 0x18, 0xc7, 0x62, 0x9c, 0xbe, 0x83, 0xc7, 0x26, 0x7b, 0x3e, - 0x8a, 0x25, 0xc7, 0xc0, 0xdd, 0x9d, 0xe6, 0x35, 0x68, 0x10, 0x20, - 0x9d, 0x8f, 0xd8, 0xde, 0xd2, 0xc3, 0x84, 0x9c, 0x0d, 0x5e, 0xe8, - 0x2f, 0xc9, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xc0, 0x30, - 0x81, 0xbd, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, - 0x04, 0x14, 0xa0, 0x11, 0x0a, 0x23, 0x3e, 0x96, 0xf1, 0x07, 0xec, - 0xe2, 0xaf, 0x29, 0xef, 0x82, 0xa5, 0x7f, 0xd0, 0x30, 0xa4, 0xb4, - 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, - 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, - 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, - 0x30, 0x7b, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x74, 0x30, 0x72, - 0x30, 0x38, 0xa0, 0x36, 0xa0, 0x34, 0x86, 0x32, 0x68, 0x74, 0x74, - 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, - 0x6f, 0x64, 0x6f, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, - 0x41, 0x41, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, - 0x63, 0x72, 0x6c, 0x30, 0x36, 0xa0, 0x34, 0xa0, 0x32, 0x86, 0x30, - 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, - 0x63, 0x6f, 0x6d, 0x6f, 0x64, 0x6f, 0x2e, 0x6e, 0x65, 0x74, 0x2f, - 0x41, 0x41, 0x41, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, - 0x01, 0x00, 0x08, 0x56, 0xfc, 0x02, 0xf0, 0x9b, 0xe8, 0xff, 0xa4, - 0xfa, 0xd6, 0x7b, 0xc6, 0x44, 0x80, 0xce, 0x4f, 0xc4, 0xc5, 0xf6, - 0x00, 0x58, 0xcc, 0xa6, 0xb6, 0xbc, 0x14, 0x49, 0x68, 0x04, 0x76, - 0xe8, 0xe6, 0xee, 0x5d, 0xec, 0x02, 0x0f, 0x60, 0xd6, 0x8d, 0x50, - 0x18, 0x4f, 0x26, 0x4e, 0x01, 0xe3, 0xe6, 0xb0, 0xa5, 0xee, 0xbf, - 0xbc, 0x74, 0x54, 0x41, 0xbf, 0xfd, 0xfc, 0x12, 0xb8, 0xc7, 0x4f, - 0x5a, 0xf4, 0x89, 0x60, 0x05, 0x7f, 0x60, 0xb7, 0x05, 0x4a, 0xf3, - 0xf6, 0xf1, 0xc2, 0xbf, 0xc4, 0xb9, 0x74, 0x86, 0xb6, 0x2d, 0x7d, - 0x6b, 0xcc, 0xd2, 0xf3, 0x46, 0xdd, 0x2f, 0xc6, 0xe0, 0x6a, 0xc3, - 0xc3, 0x34, 0x03, 0x2c, 0x7d, 0x96, 0xdd, 0x5a, 0xc2, 0x0e, 0xa7, - 0x0a, 0x99, 0xc1, 0x05, 0x8b, 0xab, 0x0c, 0x2f, 0xf3, 0x5c, 0x3a, - 0xcf, 0x6c, 0x37, 0x55, 0x09, 0x87, 0xde, 0x53, 0x40, 0x6c, 0x58, - 0xef, 0xfc, 0xb6, 0xab, 0x65, 0x6e, 0x04, 0xf6, 0x1b, 0xdc, 0x3c, - 0xe0, 0x5a, 0x15, 0xc6, 0x9e, 0xd9, 0xf1, 0x59, 0x48, 0x30, 0x21, - 0x65, 0x03, 0x6c, 0xec, 0xe9, 0x21, 0x73, 0xec, 0x9b, 0x03, 0xa1, - 0xe0, 0x37, 0xad, 0xa0, 0x15, 0x18, 0x8f, 0xfa, 0xba, 0x02, 0xce, - 0xa7, 0x2c, 0xa9, 0x10, 0x13, 0x2c, 0xd4, 0xe5, 0x08, 0x26, 0xab, - 0x22, 0x97, 0x60, 0xf8, 0x90, 0x5e, 0x74, 0xd4, 0xa2, 0x9a, 0x53, - 0xbd, 0xf2, 0xa9, 0x68, 0xe0, 0xa2, 0x6e, 0xc2, 0xd7, 0x6c, 0xb1, - 0xa3, 0x0f, 0x9e, 0xbf, 0xeb, 0x68, 0xe7, 0x56, 0xf2, 0xae, 0xf2, - 0xe3, 0x2b, 0x38, 0x3a, 0x09, 0x81, 0xb5, 0x6b, 0x85, 0xd7, 0xbe, - 0x2d, 0xed, 0x3f, 0x1a, 0xb7, 0xb2, 0x63, 0xe2, 0xf5, 0x62, 0x2c, - 0x82, 0xd4, 0x6a, 0x00, 0x41, 0x50, 0xf1, 0x39, 0x83, 0x9f, 0x95, - 0xe9, 0x36, 0x96, 0x98, 0x6e, 0x30, 0x82, 0x04, 0x3f, 0x30, 0x82, - 0x03, 0x27, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, + 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x5f, 0xf1, 0x41, + 0x7d, 0x7c, 0x5c, 0x08, 0xb9, 0x2b, 0xe0, 0xd5, 0x92, 0x47, 0xfa, + 0x67, 0x5c, 0xa5, 0x13, 0xc3, 0x03, 0x21, 0x9b, 0x2b, 0x4c, 0x89, + 0x46, 0xcf, 0x59, 0x4d, 0xc9, 0xfe, 0xa5, 0x40, 0xb6, 0x63, 0xcd, + 0xdd, 0x71, 0x28, 0x95, 0x67, 0x11, 0xcc, 0x24, 0xac, 0xd3, 0x44, + 0x6c, 0x71, 0xae, 0x01, 0x20, 0x6b, 0x03, 0xa2, 0x8f, 0x18, 0xb7, + 0x29, 0x3a, 0x7d, 0xe5, 0x16, 0x60, 0x53, 0x78, 0x3c, 0xc0, 0xaf, + 0x15, 0x83, 0xf7, 0x8f, 0x52, 0x33, 0x24, 0xbd, 0x64, 0x93, 0x97, + 0xee, 0x8b, 0xf7, 0xdb, 0x18, 0xa8, 0x6d, 0x71, 0xb3, 0xf7, 0x2c, + 0x17, 0xd0, 0x74, 0x25, 0x69, 0xf7, 0xfe, 0x6b, 0x3c, 0x94, 0xbe, + 0x4d, 0x4b, 0x41, 0x8c, 0x4e, 0xe2, 0x73, 0xd0, 0xe3, 0x90, 0x22, + 0x73, 0x43, 0xcd, 0xf3, 0xef, 0xea, 0x73, 0xce, 0x45, 0x8a, 0xb0, + 0xa6, 0x49, 0xff, 0x4c, 0x7d, 0x9d, 0x71, 0x88, 0xc4, 0x76, 0x1d, + 0x90, 0x5b, 0x1d, 0xee, 0xfd, 0xcc, 0xf7, 0xee, 0xfd, 0x60, 0xa5, + 0xb1, 0x7a, 0x16, 0x71, 0xd1, 0x16, 0xd0, 0x7c, 0x12, 0x3c, 0x6c, + 0x69, 0x97, 0xdb, 0xae, 0x5f, 0x39, 0x9a, 0x70, 0x2f, 0x05, 0x3c, + 0x19, 0x46, 0x04, 0x99, 0x20, 0x36, 0xd0, 0x60, 0x6e, 0x61, 0x06, + 0xbb, 0x16, 0x42, 0x8c, 0x70, 0xf7, 0x30, 0xfb, 0xe0, 0xdb, 0x66, + 0xa3, 0x00, 0x01, 0xbd, 0xe6, 0x2c, 0xda, 0x91, 0x5f, 0xa0, 0x46, + 0x8b, 0x4d, 0x6a, 0x9c, 0x3d, 0x3d, 0xdd, 0x05, 0x46, 0xfe, 0x76, + 0xbf, 0xa0, 0x0a, 0x3c, 0xe4, 0x00, 0xe6, 0x27, 0xb7, 0xff, 0x84, + 0x2d, 0xde, 0xba, 0x22, 0x27, 0x96, 0x10, 0x71, 0xeb, 0x22, 0xed, + 0xdf, 0xdf, 0x33, 0x9c, 0xcf, 0xe3, 0xad, 0xae, 0x8e, 0xd4, 0x8e, + 0xe6, 0x4f, 0x51, 0xaf, 0x16, 0x92, 0xe0, 0x5c, 0xf6, 0x07, 0x0f, + 0x30, 0x82, 0x03, 0x0c, 0x30, 0x82, 0x01, 0xf4, 0xa0, 0x03, 0x02, + 0x01, 0x02, 0x02, 0x03, 0x01, 0x00, 0x20, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, + 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x50, 0x4c, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x13, 0x12, 0x55, 0x6e, 0x69, 0x7a, 0x65, 0x74, 0x6f, + 0x20, 0x53, 0x70, 0x2e, 0x20, 0x7a, 0x20, 0x6f, 0x2e, 0x6f, 0x2e, + 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x09, + 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x43, 0x41, 0x30, 0x1e, + 0x17, 0x0d, 0x30, 0x32, 0x30, 0x36, 0x31, 0x31, 0x31, 0x30, 0x34, + 0x36, 0x33, 0x39, 0x5a, 0x17, 0x0d, 0x32, 0x37, 0x30, 0x36, 0x31, + 0x31, 0x31, 0x30, 0x34, 0x36, 0x33, 0x39, 0x5a, 0x30, 0x3e, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x50, + 0x4c, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x12, 0x55, 0x6e, 0x69, 0x7a, 0x65, 0x74, 0x6f, 0x20, 0x53, 0x70, + 0x2e, 0x20, 0x7a, 0x20, 0x6f, 0x2e, 0x6f, 0x2e, 0x31, 0x12, 0x30, + 0x10, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x09, 0x43, 0x65, 0x72, + 0x74, 0x75, 0x6d, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x05, 0x05, 0x00, 0x30, 0x7e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, - 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, - 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x12, 0x47, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, - 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, - 0x07, 0x0c, 0x07, 0x53, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, - 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x11, 0x43, - 0x6f, 0x6d, 0x6f, 0x64, 0x6f, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x0c, 0x1b, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, - 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x30, - 0x1e, 0x17, 0x0d, 0x30, 0x34, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x38, 0x31, 0x32, - 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x7e, - 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x08, - 0x0c, 0x12, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, - 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, - 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x53, 0x61, - 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x0c, 0x11, 0x43, 0x6f, 0x6d, 0x6f, 0x64, 0x6f, - 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, - 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1b, - 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, - 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, - 0x02, 0x82, 0x01, 0x01, 0x00, 0xc0, 0x71, 0x33, 0x82, 0x8a, 0xd0, - 0x70, 0xeb, 0x73, 0x87, 0x82, 0x40, 0xd5, 0x1d, 0xe4, 0xcb, 0xc9, - 0x0e, 0x42, 0x90, 0xf9, 0xde, 0x34, 0xb9, 0xa1, 0xba, 0x11, 0xf4, - 0x25, 0x85, 0xf3, 0xcc, 0x72, 0x6d, 0xf2, 0x7b, 0x97, 0x6b, 0xb3, - 0x07, 0xf1, 0x77, 0x24, 0x91, 0x5f, 0x25, 0x8f, 0xf6, 0x74, 0x3d, - 0xe4, 0x80, 0xc2, 0xf8, 0x3c, 0x0d, 0xf3, 0xbf, 0x40, 0xea, 0xf7, - 0xc8, 0x52, 0xd1, 0x72, 0x6f, 0xef, 0xc8, 0xab, 0x41, 0xb8, 0x6e, - 0x2e, 0x17, 0x2a, 0x95, 0x69, 0x0c, 0xcd, 0xd2, 0x1e, 0x94, 0x7b, - 0x2d, 0x94, 0x1d, 0xaa, 0x75, 0xd7, 0xb3, 0x98, 0xcb, 0xac, 0xbc, - 0x64, 0x53, 0x40, 0xbc, 0x8f, 0xac, 0xac, 0x36, 0xcb, 0x5c, 0xad, - 0xbb, 0xdd, 0xe0, 0x94, 0x17, 0xec, 0xd1, 0x5c, 0xd0, 0xbf, 0xef, - 0xa5, 0x95, 0xc9, 0x90, 0xc5, 0xb0, 0xac, 0xfb, 0x1b, 0x43, 0xdf, - 0x7a, 0x08, 0x5d, 0xb7, 0xb8, 0xf2, 0x40, 0x1b, 0x2b, 0x27, 0x9e, - 0x50, 0xce, 0x5e, 0x65, 0x82, 0x88, 0x8c, 0x5e, 0xd3, 0x4e, 0x0c, - 0x7a, 0xea, 0x08, 0x91, 0xb6, 0x36, 0xaa, 0x2b, 0x42, 0xfb, 0xea, - 0xc2, 0xa3, 0x39, 0xe5, 0xdb, 0x26, 0x38, 0xad, 0x8b, 0x0a, 0xee, - 0x19, 0x63, 0xc7, 0x1c, 0x24, 0xdf, 0x03, 0x78, 0xda, 0xe6, 0xea, - 0xc1, 0x47, 0x1a, 0x0b, 0x0b, 0x46, 0x09, 0xdd, 0x02, 0xfc, 0xde, - 0xcb, 0x87, 0x5f, 0xd7, 0x30, 0x63, 0x68, 0xa1, 0xae, 0xdc, 0x32, - 0xa1, 0xba, 0xbe, 0xfe, 0x44, 0xab, 0x68, 0xb6, 0xa5, 0x17, 0x15, - 0xfd, 0xbd, 0xd5, 0xa7, 0xa7, 0x9a, 0xe4, 0x44, 0x33, 0xe9, 0x88, - 0x8e, 0xfc, 0xed, 0x51, 0xeb, 0x93, 0x71, 0x4e, 0xad, 0x01, 0xe7, - 0x44, 0x8e, 0xab, 0x2d, 0xcb, 0xa8, 0xfe, 0x01, 0x49, 0x48, 0xf0, - 0xc0, 0xdd, 0xc7, 0x68, 0xd8, 0x92, 0xfe, 0x3d, 0x02, 0x03, 0x01, - 0x00, 0x01, 0xa3, 0x81, 0xc7, 0x30, 0x81, 0xc4, 0x30, 0x1d, 0x06, - 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x3c, 0xd8, 0x93, - 0x88, 0xc2, 0xc0, 0x82, 0x09, 0xcc, 0x01, 0x99, 0x06, 0x93, 0x20, - 0xe9, 0x9e, 0x70, 0x09, 0x63, 0x4f, 0x30, 0x0e, 0x06, 0x03, 0x55, - 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, - 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, - 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x81, 0x81, 0x06, 0x03, - 0x55, 0x1d, 0x1f, 0x04, 0x7a, 0x30, 0x78, 0x30, 0x3b, 0xa0, 0x39, - 0xa0, 0x37, 0x86, 0x35, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, - 0x63, 0x72, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6f, 0x64, 0x6f, 0x63, - 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x63, 0x75, 0x72, - 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x63, - 0x72, 0x6c, 0x30, 0x39, 0xa0, 0x37, 0xa0, 0x35, 0x86, 0x33, 0x68, - 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x63, - 0x6f, 0x6d, 0x6f, 0x64, 0x6f, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x53, - 0x65, 0x63, 0x75, 0x72, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, - 0x82, 0x01, 0x01, 0x00, 0x87, 0x01, 0x6d, 0x23, 0x1d, 0x7e, 0x5b, - 0x17, 0x7d, 0xc1, 0x61, 0x32, 0xcf, 0x8f, 0xe7, 0xf3, 0x8a, 0x94, - 0x59, 0x66, 0xe0, 0x9e, 0x28, 0xa8, 0x5e, 0xd3, 0xb7, 0xf4, 0x34, - 0xe6, 0xaa, 0x39, 0xb2, 0x97, 0x16, 0xc5, 0x82, 0x6f, 0x32, 0xa4, - 0xe9, 0x8c, 0xe7, 0xaf, 0xfd, 0xef, 0xc2, 0xe8, 0xb9, 0x4b, 0xaa, - 0xa3, 0xf4, 0xe6, 0xda, 0x8d, 0x65, 0x21, 0xfb, 0xba, 0x80, 0xeb, - 0x26, 0x28, 0x85, 0x1a, 0xfe, 0x39, 0x8c, 0xde, 0x5b, 0x04, 0x04, - 0xb4, 0x54, 0xf9, 0xa3, 0x67, 0x9e, 0x41, 0xfa, 0x09, 0x52, 0xcc, - 0x05, 0x48, 0xa8, 0xc9, 0x3f, 0x21, 0x04, 0x1e, 0xce, 0x48, 0x6b, - 0xfc, 0x85, 0xe8, 0xc2, 0x7b, 0xaf, 0x7f, 0xb7, 0xcc, 0xf8, 0x5f, - 0x3a, 0xfd, 0x35, 0xc6, 0x0d, 0xef, 0x97, 0xdc, 0x4c, 0xab, 0x11, - 0xe1, 0x6b, 0xcb, 0x31, 0xd1, 0x6c, 0xfb, 0x48, 0x80, 0xab, 0xdc, - 0x9c, 0x37, 0xb8, 0x21, 0x14, 0x4b, 0x0d, 0x71, 0x3d, 0xec, 0x83, - 0x33, 0x6e, 0xd1, 0x6e, 0x32, 0x16, 0xec, 0x98, 0xc7, 0x16, 0x8b, - 0x59, 0xa6, 0x34, 0xab, 0x05, 0x57, 0x2d, 0x93, 0xf7, 0xaa, 0x13, - 0xcb, 0xd2, 0x13, 0xe2, 0xb7, 0x2e, 0x3b, 0xcd, 0x6b, 0x50, 0x17, - 0x09, 0x68, 0x3e, 0xb5, 0x26, 0x57, 0xee, 0xb6, 0xe0, 0xb6, 0xdd, - 0xb9, 0x29, 0x80, 0x79, 0x7d, 0x8f, 0xa3, 0xf0, 0xa4, 0x28, 0xa4, - 0x15, 0xc4, 0x85, 0xf4, 0x27, 0xd4, 0x6b, 0xbf, 0xe5, 0x5c, 0xe4, - 0x65, 0x02, 0x76, 0x54, 0xb4, 0xe3, 0x37, 0x66, 0x24, 0xd3, 0x19, - 0x61, 0xc8, 0x52, 0x10, 0xe5, 0x8b, 0x37, 0x9a, 0xb9, 0xa9, 0xf9, - 0x1d, 0xbf, 0xea, 0x99, 0x92, 0x61, 0x96, 0xff, 0x01, 0xcd, 0xa1, - 0x5f, 0x0d, 0xbc, 0x71, 0xbc, 0x0e, 0xac, 0x0b, 0x1d, 0x47, 0x45, - 0x1d, 0xc1, 0xec, 0x7c, 0xec, 0xfd, 0x29, 0x30, 0x82, 0x04, 0x43, - 0x30, 0x82, 0x03, 0x2b, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, - 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x7f, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, - 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x12, 0x47, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, 0x68, - 0x65, 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, - 0x55, 0x04, 0x07, 0x0c, 0x07, 0x53, 0x61, 0x6c, 0x66, 0x6f, 0x72, - 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, - 0x11, 0x43, 0x6f, 0x6d, 0x6f, 0x64, 0x6f, 0x20, 0x43, 0x41, 0x20, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x25, 0x30, 0x23, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1c, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x65, 0x64, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x34, 0x30, 0x31, 0x30, - 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, - 0x38, 0x31, 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, - 0x5a, 0x30, 0x7f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, + 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xce, 0xb1, 0xc1, 0x2e, 0xd3, + 0x4f, 0x7c, 0xcd, 0x25, 0xce, 0x18, 0x3e, 0x4f, 0xc4, 0x8c, 0x6f, + 0x80, 0x6a, 0x73, 0xc8, 0x5b, 0x51, 0xf8, 0x9b, 0xd2, 0xdc, 0xbb, + 0x00, 0x5c, 0xb1, 0xa0, 0xfc, 0x75, 0x03, 0xee, 0x81, 0xf0, 0x88, + 0xee, 0x23, 0x52, 0xe9, 0xe6, 0x15, 0x33, 0x8d, 0xac, 0x2d, 0x09, + 0xc5, 0x76, 0xf9, 0x2b, 0x39, 0x80, 0x89, 0xe4, 0x97, 0x4b, 0x90, + 0xa5, 0xa8, 0x78, 0xf8, 0x73, 0x43, 0x7b, 0xa4, 0x61, 0xb0, 0xd8, + 0x58, 0xcc, 0xe1, 0x6c, 0x66, 0x7e, 0x9c, 0xf3, 0x09, 0x5e, 0x55, + 0x63, 0x84, 0xd5, 0xa8, 0xef, 0xf3, 0xb1, 0x2e, 0x30, 0x68, 0xb3, + 0xc4, 0x3c, 0xd8, 0xac, 0x6e, 0x8d, 0x99, 0x5a, 0x90, 0x4e, 0x34, + 0xdc, 0x36, 0x9a, 0x8f, 0x81, 0x88, 0x50, 0xb7, 0x6d, 0x96, 0x42, + 0x09, 0xf3, 0xd7, 0x95, 0x83, 0x0d, 0x41, 0x4b, 0xb0, 0x6a, 0x6b, + 0xf8, 0xfc, 0x0f, 0x7e, 0x62, 0x9f, 0x67, 0xc4, 0xed, 0x26, 0x5f, + 0x10, 0x26, 0x0f, 0x08, 0x4f, 0xf0, 0xa4, 0x57, 0x28, 0xce, 0x8f, + 0xb8, 0xed, 0x45, 0xf6, 0x6e, 0xee, 0x25, 0x5d, 0xaa, 0x6e, 0x39, + 0xbe, 0xe4, 0x93, 0x2f, 0xd9, 0x47, 0xa0, 0x72, 0xeb, 0xfa, 0xa6, + 0x5b, 0xaf, 0xca, 0x53, 0x3f, 0xe2, 0x0e, 0xc6, 0x96, 0x56, 0x11, + 0x6e, 0xf7, 0xe9, 0x66, 0xa9, 0x26, 0xd8, 0x7f, 0x95, 0x53, 0xed, + 0x0a, 0x85, 0x88, 0xba, 0x4f, 0x29, 0xa5, 0x42, 0x8c, 0x5e, 0xb6, + 0xfc, 0x85, 0x20, 0x00, 0xaa, 0x68, 0x0b, 0xa1, 0x1a, 0x85, 0x01, + 0x9c, 0xc4, 0x46, 0x63, 0x82, 0x88, 0xb6, 0x22, 0xb1, 0xee, 0xfe, + 0xaa, 0x46, 0x59, 0x7e, 0xcf, 0x35, 0x2c, 0xd5, 0xb6, 0xda, 0x5d, + 0xf7, 0x48, 0x33, 0x14, 0x54, 0xb6, 0xeb, 0xd9, 0x6f, 0xce, 0xcd, + 0x88, 0xd6, 0xab, 0x1b, 0xda, 0x96, 0x3b, 0x1d, 0x59, 0x02, 0x03, + 0x01, 0x00, 0x01, 0xa3, 0x13, 0x30, 0x11, 0x30, 0x0f, 0x06, 0x03, + 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, + 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, + 0xb8, 0x8d, 0xce, 0xef, 0xe7, 0x14, 0xba, 0xcf, 0xee, 0xb0, 0x44, + 0x92, 0x6c, 0xb4, 0x39, 0x3e, 0xa2, 0x84, 0x6e, 0xad, 0xb8, 0x21, + 0x77, 0xd2, 0xd4, 0x77, 0x82, 0x87, 0xe6, 0x20, 0x41, 0x81, 0xee, + 0xe2, 0xf8, 0x11, 0xb7, 0x63, 0xd1, 0x17, 0x37, 0xbe, 0x19, 0x76, + 0x24, 0x1c, 0x04, 0x1a, 0x4c, 0xeb, 0x3d, 0xaa, 0x67, 0x6f, 0x2d, + 0xd4, 0xcd, 0xfe, 0x65, 0x31, 0x70, 0xc5, 0x1b, 0xa6, 0x02, 0x0a, + 0xba, 0x60, 0x7b, 0x6d, 0x58, 0xc2, 0x9a, 0x49, 0xfe, 0x63, 0x32, + 0x0b, 0x6b, 0xe3, 0x3a, 0xc0, 0xac, 0xab, 0x3b, 0xb0, 0xe8, 0xd3, + 0x09, 0x51, 0x8c, 0x10, 0x83, 0xc6, 0x34, 0xe0, 0xc5, 0x2b, 0xe0, + 0x1a, 0xb6, 0x60, 0x14, 0x27, 0x6c, 0x32, 0x77, 0x8c, 0xbc, 0xb2, + 0x72, 0x98, 0xcf, 0xcd, 0xcc, 0x3f, 0xb9, 0xc8, 0x24, 0x42, 0x14, + 0xd6, 0x57, 0xfc, 0xe6, 0x26, 0x43, 0xa9, 0x1d, 0xe5, 0x80, 0x90, + 0xce, 0x03, 0x54, 0x28, 0x3e, 0xf7, 0x3f, 0xd3, 0xf8, 0x4d, 0xed, + 0x6a, 0x0a, 0x3a, 0x93, 0x13, 0x9b, 0x3b, 0x14, 0x23, 0x13, 0x63, + 0x9c, 0x3f, 0xd1, 0x87, 0x27, 0x79, 0xe5, 0x4c, 0x51, 0xe3, 0x01, + 0xad, 0x85, 0x5d, 0x1a, 0x3b, 0xb1, 0xd5, 0x73, 0x10, 0xa4, 0xd3, + 0xf2, 0xbc, 0x6e, 0x64, 0xf5, 0x5a, 0x56, 0x90, 0xa8, 0xc7, 0x0e, + 0x4c, 0x74, 0x0f, 0x2e, 0x71, 0x3b, 0xf7, 0xc8, 0x47, 0xf4, 0x69, + 0x6f, 0x15, 0xf2, 0x11, 0x5e, 0x83, 0x1e, 0x9c, 0x7c, 0x52, 0xae, + 0xfd, 0x02, 0xda, 0x12, 0xa8, 0x59, 0x67, 0x18, 0xdb, 0xbc, 0x70, + 0xdd, 0x9b, 0xb1, 0x69, 0xed, 0x80, 0xce, 0x89, 0x40, 0x48, 0x6a, + 0x0e, 0x35, 0xca, 0x29, 0x66, 0x15, 0x21, 0x94, 0x2c, 0xe8, 0x60, + 0x2a, 0x9b, 0x85, 0x4a, 0x40, 0xf3, 0x6b, 0x8a, 0x24, 0xec, 0x06, + 0x16, 0x2c, 0x73, 0x30, 0x82, 0x04, 0x32, 0x30, 0x82, 0x03, 0x1a, + 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x30, 0x7b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x12, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, @@ -3186,669 +1831,870 @@ static const unsigned char ca_bundle_data[] = { 0x07, 0x53, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x11, 0x43, 0x6f, 0x6d, 0x6f, 0x64, 0x6f, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x65, 0x64, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x0c, 0x1c, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, - 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x30, 0x82, - 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, - 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xdf, 0x71, - 0x6f, 0x36, 0x58, 0x53, 0x5a, 0xf2, 0x36, 0x54, 0x57, 0x80, 0xc4, - 0x74, 0x08, 0x20, 0xed, 0x18, 0x7f, 0x2a, 0x1d, 0xe6, 0x35, 0x9a, - 0x1e, 0x25, 0xac, 0x9c, 0xe5, 0x96, 0x7e, 0x72, 0x52, 0xa0, 0x15, - 0x42, 0xdb, 0x59, 0xdd, 0x64, 0x7a, 0x1a, 0xd0, 0xb8, 0x7b, 0xdd, - 0x39, 0x15, 0xbc, 0x55, 0x48, 0xc4, 0xed, 0x3a, 0x00, 0xea, 0x31, - 0x11, 0xba, 0xf2, 0x71, 0x74, 0x1a, 0x67, 0xb8, 0xcf, 0x33, 0xcc, - 0xa8, 0x31, 0xaf, 0xa3, 0xe3, 0xd7, 0x7f, 0xbf, 0x33, 0x2d, 0x4c, - 0x6a, 0x3c, 0xec, 0x8b, 0xc3, 0x92, 0xd2, 0x53, 0x77, 0x24, 0x74, - 0x9c, 0x07, 0x6e, 0x70, 0xfc, 0xbd, 0x0b, 0x5b, 0x76, 0xba, 0x5f, - 0xf2, 0xff, 0xd7, 0x37, 0x4b, 0x4a, 0x60, 0x78, 0xf7, 0xf0, 0xfa, - 0xca, 0x70, 0xb4, 0xea, 0x59, 0xaa, 0xa3, 0xce, 0x48, 0x2f, 0xa9, - 0xc3, 0xb2, 0x0b, 0x7e, 0x17, 0x72, 0x16, 0x0c, 0xa6, 0x07, 0x0c, - 0x1b, 0x38, 0xcf, 0xc9, 0x62, 0xb7, 0x3f, 0xa0, 0x93, 0xa5, 0x87, - 0x41, 0xf2, 0xb7, 0x70, 0x40, 0x77, 0xd8, 0xbe, 0x14, 0x7c, 0xe3, - 0xa8, 0xc0, 0x7a, 0x8e, 0xe9, 0x63, 0x6a, 0xd1, 0x0f, 0x9a, 0xc6, - 0xd2, 0xf4, 0x8b, 0x3a, 0x14, 0x04, 0x56, 0xd4, 0xed, 0xb8, 0xcc, - 0x6e, 0xf5, 0xfb, 0xe2, 0x2c, 0x58, 0xbd, 0x7f, 0x4f, 0x6b, 0x2b, - 0xf7, 0x60, 0x24, 0x58, 0x24, 0xce, 0x26, 0xef, 0x34, 0x91, 0x3a, - 0xd5, 0xe3, 0x81, 0xd0, 0xb2, 0xf0, 0x04, 0x02, 0xd7, 0x5b, 0xb7, - 0x3e, 0x92, 0xac, 0x6b, 0x12, 0x8a, 0xf9, 0xe4, 0x05, 0xb0, 0x3b, - 0x91, 0x49, 0x5c, 0xb2, 0xeb, 0x53, 0xea, 0xf8, 0x9f, 0x47, 0x86, - 0xee, 0xbf, 0x95, 0xc0, 0xc0, 0x06, 0x9f, 0xd2, 0x5b, 0x5e, 0x11, - 0x1b, 0xf4, 0xc7, 0x04, 0x35, 0x29, 0xd2, 0x55, 0x5c, 0xe4, 0xed, - 0xeb, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xc9, 0x30, 0x81, - 0xc6, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, - 0x14, 0xc5, 0x7b, 0x58, 0xbd, 0xed, 0xda, 0x25, 0x69, 0xd2, 0xf7, - 0x59, 0x16, 0xa8, 0xb3, 0x32, 0xc0, 0x7b, 0x27, 0x5b, 0xf4, 0x30, - 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, - 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, - 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, - 0x81, 0x83, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x7c, 0x30, 0x7a, - 0x30, 0x3c, 0xa0, 0x3a, 0xa0, 0x38, 0x86, 0x36, 0x68, 0x74, 0x74, - 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, - 0x6f, 0x64, 0x6f, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, - 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x3a, 0xa0, 0x38, - 0xa0, 0x36, 0x86, 0x34, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, - 0x63, 0x72, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6f, 0x64, 0x6f, 0x2e, - 0x6e, 0x65, 0x74, 0x2f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, + 0x74, 0x65, 0x64, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x18, 0x41, 0x41, 0x41, 0x20, 0x43, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x34, + 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, + 0x17, 0x0d, 0x32, 0x38, 0x31, 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, + 0x39, 0x35, 0x39, 0x5a, 0x30, 0x7b, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, + 0x19, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x12, 0x47, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, 0x68, 0x65, + 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x04, 0x07, 0x0c, 0x07, 0x53, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, + 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x11, + 0x43, 0x6f, 0x6d, 0x6f, 0x64, 0x6f, 0x20, 0x43, 0x41, 0x20, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x21, 0x30, 0x1f, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x0c, 0x18, 0x41, 0x41, 0x41, 0x20, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x30, 0x82, 0x01, + 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, + 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbe, 0x40, 0x9d, + 0xf4, 0x6e, 0xe1, 0xea, 0x76, 0x87, 0x1c, 0x4d, 0x45, 0x44, 0x8e, + 0xbe, 0x46, 0xc8, 0x83, 0x06, 0x9d, 0xc1, 0x2a, 0xfe, 0x18, 0x1f, + 0x8e, 0xe4, 0x02, 0xfa, 0xf3, 0xab, 0x5d, 0x50, 0x8a, 0x16, 0x31, + 0x0b, 0x9a, 0x06, 0xd0, 0xc5, 0x70, 0x22, 0xcd, 0x49, 0x2d, 0x54, + 0x63, 0xcc, 0xb6, 0x6e, 0x68, 0x46, 0x0b, 0x53, 0xea, 0xcb, 0x4c, + 0x24, 0xc0, 0xbc, 0x72, 0x4e, 0xea, 0xf1, 0x15, 0xae, 0xf4, 0x54, + 0x9a, 0x12, 0x0a, 0xc3, 0x7a, 0xb2, 0x33, 0x60, 0xe2, 0xda, 0x89, + 0x55, 0xf3, 0x22, 0x58, 0xf3, 0xde, 0xdc, 0xcf, 0xef, 0x83, 0x86, + 0xa2, 0x8c, 0x94, 0x4f, 0x9f, 0x68, 0xf2, 0x98, 0x90, 0x46, 0x84, + 0x27, 0xc7, 0x76, 0xbf, 0xe3, 0xcc, 0x35, 0x2c, 0x8b, 0x5e, 0x07, + 0x64, 0x65, 0x82, 0xc0, 0x48, 0xb0, 0xa8, 0x91, 0xf9, 0x61, 0x9f, + 0x76, 0x20, 0x50, 0xa8, 0x91, 0xc7, 0x66, 0xb5, 0xeb, 0x78, 0x62, + 0x03, 0x56, 0xf0, 0x8a, 0x1a, 0x13, 0xea, 0x31, 0xa3, 0x1e, 0xa0, + 0x99, 0xfd, 0x38, 0xf6, 0xf6, 0x27, 0x32, 0x58, 0x6f, 0x07, 0xf5, + 0x6b, 0xb8, 0xfb, 0x14, 0x2b, 0xaf, 0xb7, 0xaa, 0xcc, 0xd6, 0x63, + 0x5f, 0x73, 0x8c, 0xda, 0x05, 0x99, 0xa8, 0x38, 0xa8, 0xcb, 0x17, + 0x78, 0x36, 0x51, 0xac, 0xe9, 0x9e, 0xf4, 0x78, 0x3a, 0x8d, 0xcf, + 0x0f, 0xd9, 0x42, 0xe2, 0x98, 0x0c, 0xab, 0x2f, 0x9f, 0x0e, 0x01, + 0xde, 0xef, 0x9f, 0x99, 0x49, 0xf1, 0x2d, 0xdf, 0xac, 0x74, 0x4d, + 0x1b, 0x98, 0xb5, 0x47, 0xc5, 0xe5, 0x29, 0xd1, 0xf9, 0x90, 0x18, + 0xc7, 0x62, 0x9c, 0xbe, 0x83, 0xc7, 0x26, 0x7b, 0x3e, 0x8a, 0x25, + 0xc7, 0xc0, 0xdd, 0x9d, 0xe6, 0x35, 0x68, 0x10, 0x20, 0x9d, 0x8f, + 0xd8, 0xde, 0xd2, 0xc3, 0x84, 0x9c, 0x0d, 0x5e, 0xe8, 0x2f, 0xc9, + 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xc0, 0x30, 0x81, 0xbd, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0xa0, 0x11, 0x0a, 0x23, 0x3e, 0x96, 0xf1, 0x07, 0xec, 0xe2, 0xaf, + 0x29, 0xef, 0x82, 0xa5, 0x7f, 0xd0, 0x30, 0xa4, 0xb4, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, + 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, + 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x7b, + 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x74, 0x30, 0x72, 0x30, 0x38, + 0xa0, 0x36, 0xa0, 0x34, 0x86, 0x32, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6f, 0x64, + 0x6f, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x41, 0x41, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x63, 0x72, - 0x6c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xc8, - 0x93, 0x81, 0x3b, 0x89, 0xb4, 0xaf, 0xb8, 0x84, 0x12, 0x4c, 0x8d, - 0xd2, 0xf0, 0xdb, 0x70, 0xba, 0x57, 0x86, 0x15, 0x34, 0x10, 0xb9, - 0x2f, 0x7f, 0x1e, 0xb0, 0xa8, 0x89, 0x60, 0xa1, 0x8a, 0xc2, 0x77, - 0x0c, 0x50, 0x4a, 0x9b, 0x00, 0x8b, 0xd8, 0x8b, 0xf4, 0x41, 0xe2, - 0xd0, 0x83, 0x8a, 0x4a, 0x1c, 0x14, 0x06, 0xb0, 0xa3, 0x68, 0x05, - 0x70, 0x31, 0x30, 0xa7, 0x53, 0x9b, 0x0e, 0xe9, 0x4a, 0xa0, 0x58, - 0x69, 0x67, 0x0e, 0xae, 0x9d, 0xf6, 0xa5, 0x2c, 0x41, 0xbf, 0x3c, - 0x06, 0x6b, 0xe4, 0x59, 0xcc, 0x6d, 0x10, 0xf1, 0x96, 0x6f, 0x1f, - 0xdf, 0xf4, 0x04, 0x02, 0xa4, 0x9f, 0x45, 0x3e, 0xc8, 0xd8, 0xfa, - 0x36, 0x46, 0x44, 0x50, 0x3f, 0x82, 0x97, 0x91, 0x1f, 0x28, 0xdb, - 0x18, 0x11, 0x8c, 0x2a, 0xe4, 0x65, 0x83, 0x57, 0x12, 0x12, 0x8c, - 0x17, 0x3f, 0x94, 0x36, 0xfe, 0x5d, 0xb0, 0xc0, 0x04, 0x77, 0x13, - 0xb8, 0xf4, 0x15, 0xd5, 0x3f, 0x38, 0xcc, 0x94, 0x3a, 0x55, 0xd0, - 0xac, 0x98, 0xf5, 0xba, 0x00, 0x5f, 0xe0, 0x86, 0x19, 0x81, 0x78, - 0x2f, 0x28, 0xc0, 0x7e, 0xd3, 0xcc, 0x42, 0x0a, 0xf5, 0xae, 0x50, - 0xa0, 0xd1, 0x3e, 0xc6, 0xa1, 0x71, 0xec, 0x3f, 0xa0, 0x20, 0x8c, - 0x66, 0x3a, 0x89, 0xb4, 0x8e, 0xd4, 0xd8, 0xb1, 0x4d, 0x25, 0x47, - 0xee, 0x2f, 0x88, 0xc8, 0xb5, 0xe1, 0x05, 0x45, 0xc0, 0xbe, 0x14, - 0x71, 0xde, 0x7a, 0xfd, 0x8e, 0x7b, 0x7d, 0x4d, 0x08, 0x96, 0xa5, - 0x12, 0x73, 0xf0, 0x2d, 0xca, 0x37, 0x27, 0x74, 0x12, 0x27, 0x4c, - 0xcb, 0xb6, 0x97, 0xe9, 0xd9, 0xae, 0x08, 0x6d, 0x5a, 0x39, 0x40, - 0xdd, 0x05, 0x47, 0x75, 0x6a, 0x5a, 0x21, 0xb3, 0xa3, 0x18, 0xcf, - 0x4e, 0xf7, 0x2e, 0x57, 0xb7, 0x98, 0x70, 0x5e, 0xc8, 0xc4, 0x78, - 0xb0, 0x62, 0x30, 0x82, 0x05, 0xd0, 0x30, 0x82, 0x04, 0xb8, 0xa0, - 0x03, 0x02, 0x01, 0x02, 0x02, 0x04, 0x3a, 0xb6, 0x50, 0x8b, 0x30, + 0x6c, 0x30, 0x36, 0xa0, 0x34, 0xa0, 0x32, 0x86, 0x30, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x63, 0x6f, + 0x6d, 0x6f, 0x64, 0x6f, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x41, 0x41, + 0x41, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x63, + 0x72, 0x6c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, + 0x08, 0x56, 0xfc, 0x02, 0xf0, 0x9b, 0xe8, 0xff, 0xa4, 0xfa, 0xd6, + 0x7b, 0xc6, 0x44, 0x80, 0xce, 0x4f, 0xc4, 0xc5, 0xf6, 0x00, 0x58, + 0xcc, 0xa6, 0xb6, 0xbc, 0x14, 0x49, 0x68, 0x04, 0x76, 0xe8, 0xe6, + 0xee, 0x5d, 0xec, 0x02, 0x0f, 0x60, 0xd6, 0x8d, 0x50, 0x18, 0x4f, + 0x26, 0x4e, 0x01, 0xe3, 0xe6, 0xb0, 0xa5, 0xee, 0xbf, 0xbc, 0x74, + 0x54, 0x41, 0xbf, 0xfd, 0xfc, 0x12, 0xb8, 0xc7, 0x4f, 0x5a, 0xf4, + 0x89, 0x60, 0x05, 0x7f, 0x60, 0xb7, 0x05, 0x4a, 0xf3, 0xf6, 0xf1, + 0xc2, 0xbf, 0xc4, 0xb9, 0x74, 0x86, 0xb6, 0x2d, 0x7d, 0x6b, 0xcc, + 0xd2, 0xf3, 0x46, 0xdd, 0x2f, 0xc6, 0xe0, 0x6a, 0xc3, 0xc3, 0x34, + 0x03, 0x2c, 0x7d, 0x96, 0xdd, 0x5a, 0xc2, 0x0e, 0xa7, 0x0a, 0x99, + 0xc1, 0x05, 0x8b, 0xab, 0x0c, 0x2f, 0xf3, 0x5c, 0x3a, 0xcf, 0x6c, + 0x37, 0x55, 0x09, 0x87, 0xde, 0x53, 0x40, 0x6c, 0x58, 0xef, 0xfc, + 0xb6, 0xab, 0x65, 0x6e, 0x04, 0xf6, 0x1b, 0xdc, 0x3c, 0xe0, 0x5a, + 0x15, 0xc6, 0x9e, 0xd9, 0xf1, 0x59, 0x48, 0x30, 0x21, 0x65, 0x03, + 0x6c, 0xec, 0xe9, 0x21, 0x73, 0xec, 0x9b, 0x03, 0xa1, 0xe0, 0x37, + 0xad, 0xa0, 0x15, 0x18, 0x8f, 0xfa, 0xba, 0x02, 0xce, 0xa7, 0x2c, + 0xa9, 0x10, 0x13, 0x2c, 0xd4, 0xe5, 0x08, 0x26, 0xab, 0x22, 0x97, + 0x60, 0xf8, 0x90, 0x5e, 0x74, 0xd4, 0xa2, 0x9a, 0x53, 0xbd, 0xf2, + 0xa9, 0x68, 0xe0, 0xa2, 0x6e, 0xc2, 0xd7, 0x6c, 0xb1, 0xa3, 0x0f, + 0x9e, 0xbf, 0xeb, 0x68, 0xe7, 0x56, 0xf2, 0xae, 0xf2, 0xe3, 0x2b, + 0x38, 0x3a, 0x09, 0x81, 0xb5, 0x6b, 0x85, 0xd7, 0xbe, 0x2d, 0xed, + 0x3f, 0x1a, 0xb7, 0xb2, 0x63, 0xe2, 0xf5, 0x62, 0x2c, 0x82, 0xd4, + 0x6a, 0x00, 0x41, 0x50, 0xf1, 0x39, 0x83, 0x9f, 0x95, 0xe9, 0x36, + 0x96, 0x98, 0x6e, 0x30, 0x82, 0x04, 0x3f, 0x30, 0x82, 0x03, 0x27, + 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x30, 0x7e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, + 0x55, 0x04, 0x08, 0x0c, 0x12, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, + 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, + 0x07, 0x53, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, + 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x11, 0x43, 0x6f, 0x6d, + 0x6f, 0x64, 0x6f, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x65, 0x64, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x1b, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x30, 0x1e, 0x17, + 0x0d, 0x30, 0x34, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x38, 0x31, 0x32, 0x33, 0x31, + 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x7e, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, + 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x12, + 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, + 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x53, 0x61, 0x6c, 0x66, + 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x0c, 0x11, 0x43, 0x6f, 0x6d, 0x6f, 0x64, 0x6f, 0x20, 0x43, + 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x24, + 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1b, 0x53, 0x65, + 0x63, 0x75, 0x72, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, + 0x01, 0x01, 0x00, 0xc0, 0x71, 0x33, 0x82, 0x8a, 0xd0, 0x70, 0xeb, + 0x73, 0x87, 0x82, 0x40, 0xd5, 0x1d, 0xe4, 0xcb, 0xc9, 0x0e, 0x42, + 0x90, 0xf9, 0xde, 0x34, 0xb9, 0xa1, 0xba, 0x11, 0xf4, 0x25, 0x85, + 0xf3, 0xcc, 0x72, 0x6d, 0xf2, 0x7b, 0x97, 0x6b, 0xb3, 0x07, 0xf1, + 0x77, 0x24, 0x91, 0x5f, 0x25, 0x8f, 0xf6, 0x74, 0x3d, 0xe4, 0x80, + 0xc2, 0xf8, 0x3c, 0x0d, 0xf3, 0xbf, 0x40, 0xea, 0xf7, 0xc8, 0x52, + 0xd1, 0x72, 0x6f, 0xef, 0xc8, 0xab, 0x41, 0xb8, 0x6e, 0x2e, 0x17, + 0x2a, 0x95, 0x69, 0x0c, 0xcd, 0xd2, 0x1e, 0x94, 0x7b, 0x2d, 0x94, + 0x1d, 0xaa, 0x75, 0xd7, 0xb3, 0x98, 0xcb, 0xac, 0xbc, 0x64, 0x53, + 0x40, 0xbc, 0x8f, 0xac, 0xac, 0x36, 0xcb, 0x5c, 0xad, 0xbb, 0xdd, + 0xe0, 0x94, 0x17, 0xec, 0xd1, 0x5c, 0xd0, 0xbf, 0xef, 0xa5, 0x95, + 0xc9, 0x90, 0xc5, 0xb0, 0xac, 0xfb, 0x1b, 0x43, 0xdf, 0x7a, 0x08, + 0x5d, 0xb7, 0xb8, 0xf2, 0x40, 0x1b, 0x2b, 0x27, 0x9e, 0x50, 0xce, + 0x5e, 0x65, 0x82, 0x88, 0x8c, 0x5e, 0xd3, 0x4e, 0x0c, 0x7a, 0xea, + 0x08, 0x91, 0xb6, 0x36, 0xaa, 0x2b, 0x42, 0xfb, 0xea, 0xc2, 0xa3, + 0x39, 0xe5, 0xdb, 0x26, 0x38, 0xad, 0x8b, 0x0a, 0xee, 0x19, 0x63, + 0xc7, 0x1c, 0x24, 0xdf, 0x03, 0x78, 0xda, 0xe6, 0xea, 0xc1, 0x47, + 0x1a, 0x0b, 0x0b, 0x46, 0x09, 0xdd, 0x02, 0xfc, 0xde, 0xcb, 0x87, + 0x5f, 0xd7, 0x30, 0x63, 0x68, 0xa1, 0xae, 0xdc, 0x32, 0xa1, 0xba, + 0xbe, 0xfe, 0x44, 0xab, 0x68, 0xb6, 0xa5, 0x17, 0x15, 0xfd, 0xbd, + 0xd5, 0xa7, 0xa7, 0x9a, 0xe4, 0x44, 0x33, 0xe9, 0x88, 0x8e, 0xfc, + 0xed, 0x51, 0xeb, 0x93, 0x71, 0x4e, 0xad, 0x01, 0xe7, 0x44, 0x8e, + 0xab, 0x2d, 0xcb, 0xa8, 0xfe, 0x01, 0x49, 0x48, 0xf0, 0xc0, 0xdd, + 0xc7, 0x68, 0xd8, 0x92, 0xfe, 0x3d, 0x02, 0x03, 0x01, 0x00, 0x01, + 0xa3, 0x81, 0xc7, 0x30, 0x81, 0xc4, 0x30, 0x1d, 0x06, 0x03, 0x55, + 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x3c, 0xd8, 0x93, 0x88, 0xc2, + 0xc0, 0x82, 0x09, 0xcc, 0x01, 0x99, 0x06, 0x93, 0x20, 0xe9, 0x9e, + 0x70, 0x09, 0x63, 0x4f, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, + 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, + 0x03, 0x01, 0x01, 0xff, 0x30, 0x81, 0x81, 0x06, 0x03, 0x55, 0x1d, + 0x1f, 0x04, 0x7a, 0x30, 0x78, 0x30, 0x3b, 0xa0, 0x39, 0xa0, 0x37, + 0x86, 0x35, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, + 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6f, 0x64, 0x6f, 0x63, 0x61, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x63, 0x72, 0x6c, + 0x30, 0x39, 0xa0, 0x37, 0xa0, 0x35, 0x86, 0x33, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, + 0x6f, 0x64, 0x6f, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x53, 0x65, 0x63, + 0x75, 0x72, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x01, 0x00, 0x87, 0x01, 0x6d, 0x23, 0x1d, 0x7e, 0x5b, 0x17, 0x7d, + 0xc1, 0x61, 0x32, 0xcf, 0x8f, 0xe7, 0xf3, 0x8a, 0x94, 0x59, 0x66, + 0xe0, 0x9e, 0x28, 0xa8, 0x5e, 0xd3, 0xb7, 0xf4, 0x34, 0xe6, 0xaa, + 0x39, 0xb2, 0x97, 0x16, 0xc5, 0x82, 0x6f, 0x32, 0xa4, 0xe9, 0x8c, + 0xe7, 0xaf, 0xfd, 0xef, 0xc2, 0xe8, 0xb9, 0x4b, 0xaa, 0xa3, 0xf4, + 0xe6, 0xda, 0x8d, 0x65, 0x21, 0xfb, 0xba, 0x80, 0xeb, 0x26, 0x28, + 0x85, 0x1a, 0xfe, 0x39, 0x8c, 0xde, 0x5b, 0x04, 0x04, 0xb4, 0x54, + 0xf9, 0xa3, 0x67, 0x9e, 0x41, 0xfa, 0x09, 0x52, 0xcc, 0x05, 0x48, + 0xa8, 0xc9, 0x3f, 0x21, 0x04, 0x1e, 0xce, 0x48, 0x6b, 0xfc, 0x85, + 0xe8, 0xc2, 0x7b, 0xaf, 0x7f, 0xb7, 0xcc, 0xf8, 0x5f, 0x3a, 0xfd, + 0x35, 0xc6, 0x0d, 0xef, 0x97, 0xdc, 0x4c, 0xab, 0x11, 0xe1, 0x6b, + 0xcb, 0x31, 0xd1, 0x6c, 0xfb, 0x48, 0x80, 0xab, 0xdc, 0x9c, 0x37, + 0xb8, 0x21, 0x14, 0x4b, 0x0d, 0x71, 0x3d, 0xec, 0x83, 0x33, 0x6e, + 0xd1, 0x6e, 0x32, 0x16, 0xec, 0x98, 0xc7, 0x16, 0x8b, 0x59, 0xa6, + 0x34, 0xab, 0x05, 0x57, 0x2d, 0x93, 0xf7, 0xaa, 0x13, 0xcb, 0xd2, + 0x13, 0xe2, 0xb7, 0x2e, 0x3b, 0xcd, 0x6b, 0x50, 0x17, 0x09, 0x68, + 0x3e, 0xb5, 0x26, 0x57, 0xee, 0xb6, 0xe0, 0xb6, 0xdd, 0xb9, 0x29, + 0x80, 0x79, 0x7d, 0x8f, 0xa3, 0xf0, 0xa4, 0x28, 0xa4, 0x15, 0xc4, + 0x85, 0xf4, 0x27, 0xd4, 0x6b, 0xbf, 0xe5, 0x5c, 0xe4, 0x65, 0x02, + 0x76, 0x54, 0xb4, 0xe3, 0x37, 0x66, 0x24, 0xd3, 0x19, 0x61, 0xc8, + 0x52, 0x10, 0xe5, 0x8b, 0x37, 0x9a, 0xb9, 0xa9, 0xf9, 0x1d, 0xbf, + 0xea, 0x99, 0x92, 0x61, 0x96, 0xff, 0x01, 0xcd, 0xa1, 0x5f, 0x0d, + 0xbc, 0x71, 0xbc, 0x0e, 0xac, 0x0b, 0x1d, 0x47, 0x45, 0x1d, 0xc1, + 0xec, 0x7c, 0xec, 0xfd, 0x29, 0x30, 0x82, 0x04, 0x43, 0x30, 0x82, + 0x03, 0x2b, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x7f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, - 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, - 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, - 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, - 0x64, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, - 0x1c, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x2e, 0x30, 0x2c, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x51, 0x75, 0x6f, 0x56, - 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x31, 0x30, 0x33, 0x31, 0x39, 0x31, - 0x38, 0x33, 0x33, 0x33, 0x33, 0x5a, 0x17, 0x0d, 0x32, 0x31, 0x30, - 0x33, 0x31, 0x37, 0x31, 0x38, 0x33, 0x33, 0x33, 0x33, 0x5a, 0x30, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, + 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x12, 0x47, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, + 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, + 0x07, 0x0c, 0x07, 0x53, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, + 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x11, 0x43, + 0x6f, 0x6d, 0x6f, 0x64, 0x6f, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x0c, 0x1c, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, + 0x64, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x34, 0x30, 0x31, 0x30, 0x31, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x38, 0x31, + 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x7f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, - 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, - 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x25, 0x30, - 0x23, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1c, 0x52, 0x6f, 0x6f, - 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x74, 0x79, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x13, 0x25, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, - 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, 0x22, + 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, + 0x08, 0x0c, 0x12, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, + 0x4d, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, 0x31, + 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x53, + 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, + 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x11, 0x43, 0x6f, 0x6d, 0x6f, 0x64, + 0x6f, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, + 0x64, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, + 0x1c, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, - 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbf, 0x61, 0xb5, 0x95, - 0x53, 0xba, 0x57, 0xfc, 0xfa, 0xf2, 0x67, 0x0b, 0x3a, 0x1a, 0xdf, - 0x11, 0x80, 0x64, 0x95, 0xb4, 0xd1, 0xbc, 0xcd, 0x7a, 0xcf, 0xf6, - 0x29, 0x96, 0x2e, 0x24, 0x54, 0x40, 0x24, 0x38, 0xf7, 0x1a, 0x85, - 0xdc, 0x58, 0x4c, 0xcb, 0xa4, 0x27, 0x42, 0x97, 0xd0, 0x9f, 0x83, - 0x8a, 0xc3, 0xe4, 0x06, 0x03, 0x5b, 0x00, 0xa5, 0x51, 0x1e, 0x70, - 0x04, 0x74, 0xe2, 0xc1, 0xd4, 0x3a, 0xab, 0xd7, 0xad, 0x3b, 0x07, - 0x18, 0x05, 0x8e, 0xfd, 0x83, 0xac, 0xea, 0x66, 0xd9, 0x18, 0x1b, - 0x68, 0x8a, 0xf5, 0x57, 0x1a, 0x98, 0xba, 0xf5, 0xed, 0x76, 0x3d, - 0x7c, 0xd9, 0xde, 0x94, 0x6a, 0x3b, 0x4b, 0x17, 0xc1, 0xd5, 0x8f, - 0xbd, 0x65, 0x38, 0x3a, 0x95, 0xd0, 0x3d, 0x55, 0x36, 0x4e, 0xdf, - 0x79, 0x57, 0x31, 0x2a, 0x1e, 0xd8, 0x59, 0x65, 0x49, 0x58, 0x20, - 0x98, 0x7e, 0xab, 0x5f, 0x7e, 0x9f, 0xe9, 0xd6, 0x4d, 0xec, 0x83, - 0x74, 0xa9, 0xc7, 0x6c, 0xd8, 0xee, 0x29, 0x4a, 0x85, 0x2a, 0x06, - 0x14, 0xf9, 0x54, 0xe6, 0xd3, 0xda, 0x65, 0x07, 0x8b, 0x63, 0x37, - 0x12, 0xd7, 0xd0, 0xec, 0xc3, 0x7b, 0x20, 0x41, 0x44, 0xa3, 0xed, - 0xcb, 0xa0, 0x17, 0xe1, 0x71, 0x65, 0xce, 0x1d, 0x66, 0x31, 0xf7, - 0x76, 0x01, 0x19, 0xc8, 0x7d, 0x03, 0x58, 0xb6, 0x95, 0x49, 0x1d, - 0xa6, 0x12, 0x26, 0xe8, 0xc6, 0x0c, 0x76, 0xe0, 0xe3, 0x66, 0xcb, - 0xea, 0x5d, 0xa6, 0x26, 0xee, 0xe5, 0xcc, 0x5f, 0xbd, 0x67, 0xa7, - 0x01, 0x27, 0x0e, 0xa2, 0xca, 0x54, 0xc5, 0xb1, 0x7a, 0x95, 0x1d, - 0x71, 0x1e, 0x4a, 0x29, 0x8a, 0x03, 0xdc, 0x6a, 0x45, 0xc1, 0xa4, - 0x19, 0x5e, 0x6f, 0x36, 0xcd, 0xc3, 0xa2, 0xb0, 0xb7, 0xfe, 0x5c, - 0x38, 0xe2, 0x52, 0xbc, 0xf8, 0x44, 0x43, 0xe6, 0x90, 0xbb, 0x02, - 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x02, 0x52, 0x30, 0x82, 0x02, - 0x4e, 0x30, 0x3d, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, - 0x01, 0x01, 0x04, 0x31, 0x30, 0x2f, 0x30, 0x2d, 0x06, 0x08, 0x2b, - 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x21, 0x68, 0x74, - 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6f, 0x63, 0x73, 0x70, 0x2e, - 0x71, 0x75, 0x6f, 0x76, 0x61, 0x64, 0x69, 0x73, 0x6f, 0x66, 0x66, - 0x73, 0x68, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x0f, - 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, - 0x03, 0x01, 0x01, 0xff, 0x30, 0x82, 0x01, 0x1a, 0x06, 0x03, 0x55, - 0x1d, 0x20, 0x04, 0x82, 0x01, 0x11, 0x30, 0x82, 0x01, 0x0d, 0x30, - 0x82, 0x01, 0x09, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0xbe, - 0x58, 0x00, 0x01, 0x30, 0x81, 0xfb, 0x30, 0x81, 0xd4, 0x06, 0x08, - 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, 0x30, 0x81, 0xc7, - 0x1a, 0x81, 0xc4, 0x52, 0x65, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, - 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x51, 0x75, 0x6f, - 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, - 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x20, 0x62, 0x79, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x61, 0x72, - 0x74, 0x79, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x73, 0x20, - 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, - 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x74, - 0x65, 0x72, 0x6d, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, - 0x20, 0x75, 0x73, 0x65, 0x2c, 0x20, 0x63, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, - 0x61, 0x63, 0x74, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x51, 0x75, 0x6f, 0x56, 0x61, - 0x64, 0x69, 0x73, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x20, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x2e, 0x30, 0x22, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, - 0x02, 0x01, 0x16, 0x16, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, - 0x77, 0x77, 0x77, 0x2e, 0x71, 0x75, 0x6f, 0x76, 0x61, 0x64, 0x69, - 0x73, 0x2e, 0x62, 0x6d, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, - 0x04, 0x16, 0x04, 0x14, 0x8b, 0x4b, 0x6d, 0xed, 0xd3, 0x29, 0xb9, - 0x06, 0x19, 0xec, 0x39, 0x39, 0xa9, 0xf0, 0x97, 0x84, 0x6a, 0xcb, - 0xef, 0xdf, 0x30, 0x81, 0xae, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, - 0x81, 0xa6, 0x30, 0x81, 0xa3, 0x80, 0x14, 0x8b, 0x4b, 0x6d, 0xed, - 0xd3, 0x29, 0xb9, 0x06, 0x19, 0xec, 0x39, 0x39, 0xa9, 0xf0, 0x97, - 0x84, 0x6a, 0xcb, 0xef, 0xdf, 0xa1, 0x81, 0x84, 0xa4, 0x81, 0x81, - 0x30, 0x7f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, - 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x25, - 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1c, 0x52, 0x6f, - 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x74, 0x79, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, - 0x04, 0x03, 0x13, 0x25, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, - 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x82, 0x04, 0x3a, - 0xb6, 0x50, 0x8b, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, - 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, + 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xdf, 0x71, 0x6f, 0x36, + 0x58, 0x53, 0x5a, 0xf2, 0x36, 0x54, 0x57, 0x80, 0xc4, 0x74, 0x08, + 0x20, 0xed, 0x18, 0x7f, 0x2a, 0x1d, 0xe6, 0x35, 0x9a, 0x1e, 0x25, + 0xac, 0x9c, 0xe5, 0x96, 0x7e, 0x72, 0x52, 0xa0, 0x15, 0x42, 0xdb, + 0x59, 0xdd, 0x64, 0x7a, 0x1a, 0xd0, 0xb8, 0x7b, 0xdd, 0x39, 0x15, + 0xbc, 0x55, 0x48, 0xc4, 0xed, 0x3a, 0x00, 0xea, 0x31, 0x11, 0xba, + 0xf2, 0x71, 0x74, 0x1a, 0x67, 0xb8, 0xcf, 0x33, 0xcc, 0xa8, 0x31, + 0xaf, 0xa3, 0xe3, 0xd7, 0x7f, 0xbf, 0x33, 0x2d, 0x4c, 0x6a, 0x3c, + 0xec, 0x8b, 0xc3, 0x92, 0xd2, 0x53, 0x77, 0x24, 0x74, 0x9c, 0x07, + 0x6e, 0x70, 0xfc, 0xbd, 0x0b, 0x5b, 0x76, 0xba, 0x5f, 0xf2, 0xff, + 0xd7, 0x37, 0x4b, 0x4a, 0x60, 0x78, 0xf7, 0xf0, 0xfa, 0xca, 0x70, + 0xb4, 0xea, 0x59, 0xaa, 0xa3, 0xce, 0x48, 0x2f, 0xa9, 0xc3, 0xb2, + 0x0b, 0x7e, 0x17, 0x72, 0x16, 0x0c, 0xa6, 0x07, 0x0c, 0x1b, 0x38, + 0xcf, 0xc9, 0x62, 0xb7, 0x3f, 0xa0, 0x93, 0xa5, 0x87, 0x41, 0xf2, + 0xb7, 0x70, 0x40, 0x77, 0xd8, 0xbe, 0x14, 0x7c, 0xe3, 0xa8, 0xc0, + 0x7a, 0x8e, 0xe9, 0x63, 0x6a, 0xd1, 0x0f, 0x9a, 0xc6, 0xd2, 0xf4, + 0x8b, 0x3a, 0x14, 0x04, 0x56, 0xd4, 0xed, 0xb8, 0xcc, 0x6e, 0xf5, + 0xfb, 0xe2, 0x2c, 0x58, 0xbd, 0x7f, 0x4f, 0x6b, 0x2b, 0xf7, 0x60, + 0x24, 0x58, 0x24, 0xce, 0x26, 0xef, 0x34, 0x91, 0x3a, 0xd5, 0xe3, + 0x81, 0xd0, 0xb2, 0xf0, 0x04, 0x02, 0xd7, 0x5b, 0xb7, 0x3e, 0x92, + 0xac, 0x6b, 0x12, 0x8a, 0xf9, 0xe4, 0x05, 0xb0, 0x3b, 0x91, 0x49, + 0x5c, 0xb2, 0xeb, 0x53, 0xea, 0xf8, 0x9f, 0x47, 0x86, 0xee, 0xbf, + 0x95, 0xc0, 0xc0, 0x06, 0x9f, 0xd2, 0x5b, 0x5e, 0x11, 0x1b, 0xf4, + 0xc7, 0x04, 0x35, 0x29, 0xd2, 0x55, 0x5c, 0xe4, 0xed, 0xeb, 0x02, + 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xc9, 0x30, 0x81, 0xc6, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xc5, + 0x7b, 0x58, 0xbd, 0xed, 0xda, 0x25, 0x69, 0xd2, 0xf7, 0x59, 0x16, + 0xa8, 0xb3, 0x32, 0xc0, 0x7b, 0x27, 0x5b, 0xf4, 0x30, 0x0e, 0x06, + 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, + 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, + 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x81, 0x83, + 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x7c, 0x30, 0x7a, 0x30, 0x3c, + 0xa0, 0x3a, 0xa0, 0x38, 0x86, 0x36, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6f, 0x64, + 0x6f, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x72, 0x75, + 0x73, 0x74, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x3a, 0xa0, 0x38, 0xa0, 0x36, + 0x86, 0x34, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, + 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6f, 0x64, 0x6f, 0x2e, 0x6e, 0x65, + 0x74, 0x2f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x63, 0x72, 0x6c, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xc8, 0x93, 0x81, + 0x3b, 0x89, 0xb4, 0xaf, 0xb8, 0x84, 0x12, 0x4c, 0x8d, 0xd2, 0xf0, + 0xdb, 0x70, 0xba, 0x57, 0x86, 0x15, 0x34, 0x10, 0xb9, 0x2f, 0x7f, + 0x1e, 0xb0, 0xa8, 0x89, 0x60, 0xa1, 0x8a, 0xc2, 0x77, 0x0c, 0x50, + 0x4a, 0x9b, 0x00, 0x8b, 0xd8, 0x8b, 0xf4, 0x41, 0xe2, 0xd0, 0x83, + 0x8a, 0x4a, 0x1c, 0x14, 0x06, 0xb0, 0xa3, 0x68, 0x05, 0x70, 0x31, + 0x30, 0xa7, 0x53, 0x9b, 0x0e, 0xe9, 0x4a, 0xa0, 0x58, 0x69, 0x67, + 0x0e, 0xae, 0x9d, 0xf6, 0xa5, 0x2c, 0x41, 0xbf, 0x3c, 0x06, 0x6b, + 0xe4, 0x59, 0xcc, 0x6d, 0x10, 0xf1, 0x96, 0x6f, 0x1f, 0xdf, 0xf4, + 0x04, 0x02, 0xa4, 0x9f, 0x45, 0x3e, 0xc8, 0xd8, 0xfa, 0x36, 0x46, + 0x44, 0x50, 0x3f, 0x82, 0x97, 0x91, 0x1f, 0x28, 0xdb, 0x18, 0x11, + 0x8c, 0x2a, 0xe4, 0x65, 0x83, 0x57, 0x12, 0x12, 0x8c, 0x17, 0x3f, + 0x94, 0x36, 0xfe, 0x5d, 0xb0, 0xc0, 0x04, 0x77, 0x13, 0xb8, 0xf4, + 0x15, 0xd5, 0x3f, 0x38, 0xcc, 0x94, 0x3a, 0x55, 0xd0, 0xac, 0x98, + 0xf5, 0xba, 0x00, 0x5f, 0xe0, 0x86, 0x19, 0x81, 0x78, 0x2f, 0x28, + 0xc0, 0x7e, 0xd3, 0xcc, 0x42, 0x0a, 0xf5, 0xae, 0x50, 0xa0, 0xd1, + 0x3e, 0xc6, 0xa1, 0x71, 0xec, 0x3f, 0xa0, 0x20, 0x8c, 0x66, 0x3a, + 0x89, 0xb4, 0x8e, 0xd4, 0xd8, 0xb1, 0x4d, 0x25, 0x47, 0xee, 0x2f, + 0x88, 0xc8, 0xb5, 0xe1, 0x05, 0x45, 0xc0, 0xbe, 0x14, 0x71, 0xde, + 0x7a, 0xfd, 0x8e, 0x7b, 0x7d, 0x4d, 0x08, 0x96, 0xa5, 0x12, 0x73, + 0xf0, 0x2d, 0xca, 0x37, 0x27, 0x74, 0x12, 0x27, 0x4c, 0xcb, 0xb6, + 0x97, 0xe9, 0xd9, 0xae, 0x08, 0x6d, 0x5a, 0x39, 0x40, 0xdd, 0x05, + 0x47, 0x75, 0x6a, 0x5a, 0x21, 0xb3, 0xa3, 0x18, 0xcf, 0x4e, 0xf7, + 0x2e, 0x57, 0xb7, 0x98, 0x70, 0x5e, 0xc8, 0xc4, 0x78, 0xb0, 0x62, + 0x30, 0x82, 0x05, 0xd0, 0x30, 0x82, 0x04, 0xb8, 0xa0, 0x03, 0x02, + 0x01, 0x02, 0x02, 0x04, 0x3a, 0xb6, 0x50, 0x8b, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, - 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x8a, 0xd4, 0x14, 0xb5, 0xfe, - 0xf4, 0x9a, 0x92, 0xa7, 0x19, 0xd4, 0xa4, 0x7e, 0x72, 0x18, 0x8f, - 0xd9, 0x68, 0x7c, 0x52, 0x24, 0xdd, 0x67, 0x6f, 0x39, 0x7a, 0xc4, - 0xaa, 0x5e, 0x3d, 0xe2, 0x58, 0xb0, 0x4d, 0x70, 0x98, 0x84, 0x61, - 0xe8, 0x1b, 0xe3, 0x69, 0x18, 0x0e, 0xce, 0xfb, 0x47, 0x50, 0xa0, - 0x4e, 0xff, 0xf0, 0x24, 0x1f, 0xbd, 0xb2, 0xce, 0xf5, 0x27, 0xfc, - 0xec, 0x2f, 0x53, 0xaa, 0x73, 0x7b, 0x03, 0x3d, 0x74, 0x6e, 0xe6, - 0x16, 0x9e, 0xeb, 0xa5, 0x2e, 0xc4, 0xbf, 0x56, 0x27, 0x50, 0x2b, - 0x62, 0xba, 0xbe, 0x4b, 0x1c, 0x3c, 0x55, 0x5c, 0x41, 0x1d, 0x24, - 0xbe, 0x82, 0x20, 0x47, 0x5d, 0xd5, 0x44, 0x7e, 0x7a, 0x16, 0x68, - 0xdf, 0x7d, 0x4d, 0x51, 0x70, 0x78, 0x57, 0x1d, 0x33, 0x1e, 0xfd, - 0x02, 0x99, 0x9c, 0x0c, 0xcd, 0x0a, 0x05, 0x4f, 0xc7, 0xbb, 0x8e, - 0xa4, 0x75, 0xfa, 0x4a, 0x6d, 0xb1, 0x80, 0x8e, 0x09, 0x56, 0xb9, - 0x9c, 0x1a, 0x60, 0xfe, 0x5d, 0xc1, 0xd7, 0x7a, 0xdc, 0x11, 0x78, - 0xd0, 0xd6, 0x5d, 0xc1, 0xb7, 0xd5, 0xad, 0x32, 0x99, 0x03, 0x3a, - 0x8a, 0xcc, 0x54, 0x25, 0x39, 0x31, 0x81, 0x7b, 0x13, 0x22, 0x51, - 0xba, 0x46, 0x6c, 0xa1, 0xbb, 0x9e, 0xfa, 0x04, 0x6c, 0x49, 0x26, - 0x74, 0x8f, 0xd2, 0x73, 0xeb, 0xcc, 0x30, 0xa2, 0xe6, 0xea, 0x59, - 0x22, 0x87, 0xf8, 0x97, 0xf5, 0x0e, 0xfd, 0xea, 0xcc, 0x92, 0xa4, - 0x16, 0xc4, 0x52, 0x18, 0xea, 0x21, 0xce, 0xb1, 0xf1, 0xe6, 0x84, - 0x81, 0xe5, 0xba, 0xa9, 0x86, 0x28, 0xf2, 0x43, 0x5a, 0x5d, 0x12, - 0x9d, 0xac, 0x1e, 0xd9, 0xa8, 0xe5, 0x0a, 0x6a, 0xa7, 0x7f, 0xa0, - 0x87, 0x29, 0xcf, 0xf2, 0x89, 0x4d, 0xd4, 0xec, 0xc5, 0xe2, 0xe6, - 0x7a, 0xd0, 0x36, 0x23, 0x8a, 0x4a, 0x74, 0x36, 0xf9, 0x30, 0x82, - 0x05, 0xb7, 0x30, 0x82, 0x03, 0x9f, 0xa0, 0x03, 0x02, 0x01, 0x02, - 0x02, 0x02, 0x05, 0x09, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x45, 0x31, + 0x00, 0x30, 0x7f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, + 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, + 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, + 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1c, 0x52, + 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x13, 0x25, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, + 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, + 0x17, 0x0d, 0x30, 0x31, 0x30, 0x33, 0x31, 0x39, 0x31, 0x38, 0x33, + 0x33, 0x33, 0x33, 0x5a, 0x17, 0x0d, 0x32, 0x31, 0x30, 0x33, 0x31, + 0x37, 0x31, 0x38, 0x33, 0x33, 0x33, 0x33, 0x5a, 0x30, 0x7f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1b, 0x30, 0x19, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x51, 0x75, 0x6f, 0x56, 0x61, - 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, - 0x20, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x31, 0x32, - 0x34, 0x31, 0x38, 0x32, 0x37, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, - 0x31, 0x31, 0x31, 0x32, 0x34, 0x31, 0x38, 0x32, 0x33, 0x33, 0x33, - 0x5a, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, - 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, - 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x51, - 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, - 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x82, 0x02, 0x22, 0x30, - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, - 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0x9a, 0x18, 0xca, 0x4b, 0x94, - 0x0d, 0x00, 0x2d, 0xaf, 0x03, 0x29, 0x8a, 0xf0, 0x0f, 0x81, 0xc8, - 0xae, 0x4c, 0x19, 0x85, 0x1d, 0x08, 0x9f, 0xab, 0x29, 0x44, 0x85, - 0xf3, 0x2f, 0x81, 0xad, 0x32, 0x1e, 0x90, 0x46, 0xbf, 0xa3, 0x86, - 0x26, 0x1a, 0x1e, 0xfe, 0x7e, 0x1c, 0x18, 0x3a, 0x5c, 0x9c, 0x60, - 0x17, 0x2a, 0x3a, 0x74, 0x83, 0x33, 0x30, 0x7d, 0x61, 0x54, 0x11, - 0xcb, 0xed, 0xab, 0xe0, 0xe6, 0xd2, 0xa2, 0x7e, 0xf5, 0x6b, 0x6f, - 0x18, 0xb7, 0x0a, 0x0b, 0x2d, 0xfd, 0xe9, 0x3e, 0xef, 0x0a, 0xc6, - 0xb3, 0x10, 0xe9, 0xdc, 0xc2, 0x46, 0x17, 0xf8, 0x5d, 0xfd, 0xa4, - 0xda, 0xff, 0x9e, 0x49, 0x5a, 0x9c, 0xe6, 0x33, 0xe6, 0x24, 0x96, - 0xf7, 0x3f, 0xba, 0x5b, 0x2b, 0x1c, 0x7a, 0x35, 0xc2, 0xd6, 0x67, - 0xfe, 0xab, 0x66, 0x50, 0x8b, 0x6d, 0x28, 0x60, 0x2b, 0xef, 0xd7, - 0x60, 0xc3, 0xc7, 0x93, 0xbc, 0x8d, 0x36, 0x91, 0xf3, 0x7f, 0xf8, - 0xdb, 0x11, 0x13, 0xc4, 0x9c, 0x77, 0x76, 0xc1, 0xae, 0xb7, 0x02, - 0x6a, 0x81, 0x7a, 0xa9, 0x45, 0x83, 0xe2, 0x05, 0xe6, 0xb9, 0x56, - 0xc1, 0x94, 0x37, 0x8f, 0x48, 0x71, 0x63, 0x22, 0xec, 0x17, 0x65, - 0x07, 0x95, 0x8a, 0x4b, 0xdf, 0x8f, 0xc6, 0x5a, 0x0a, 0xe5, 0xb0, - 0xe3, 0x5f, 0x5e, 0x6b, 0x11, 0xab, 0x0c, 0xf9, 0x85, 0xeb, 0x44, - 0xe9, 0xf8, 0x04, 0x73, 0xf2, 0xe9, 0xfe, 0x5c, 0x98, 0x8c, 0xf5, - 0x73, 0xaf, 0x6b, 0xb4, 0x7e, 0xcd, 0xd4, 0x5c, 0x02, 0x2b, 0x4c, - 0x39, 0xe1, 0xb2, 0x95, 0x95, 0x2d, 0x42, 0x87, 0xd7, 0xd5, 0xb3, - 0x90, 0x43, 0xb7, 0x6c, 0x13, 0xf1, 0xde, 0xdd, 0xf6, 0xc4, 0xf8, - 0x89, 0x3f, 0xd1, 0x75, 0xf5, 0x92, 0xc3, 0x91, 0xd5, 0x8a, 0x88, - 0xd0, 0x90, 0xec, 0xdc, 0x6d, 0xde, 0x89, 0xc2, 0x65, 0x71, 0x96, - 0x8b, 0x0d, 0x03, 0xfd, 0x9c, 0xbf, 0x5b, 0x16, 0xac, 0x92, 0xdb, - 0xea, 0xfe, 0x79, 0x7c, 0xad, 0xeb, 0xaf, 0xf7, 0x16, 0xcb, 0xdb, - 0xcd, 0x25, 0x2b, 0xe5, 0x1f, 0xfb, 0x9a, 0x9f, 0xe2, 0x51, 0xcc, - 0x3a, 0x53, 0x0c, 0x48, 0xe6, 0x0e, 0xbd, 0xc9, 0xb4, 0x76, 0x06, - 0x52, 0xe6, 0x11, 0x13, 0x85, 0x72, 0x63, 0x03, 0x04, 0xe0, 0x04, - 0x36, 0x2b, 0x20, 0x19, 0x02, 0xe8, 0x74, 0xa7, 0x1f, 0xb6, 0xc9, - 0x56, 0x66, 0xf0, 0x75, 0x25, 0xdc, 0x67, 0xc1, 0x0e, 0x61, 0x60, - 0x88, 0xb3, 0x3e, 0xd1, 0xa8, 0xfc, 0xa3, 0xda, 0x1d, 0xb0, 0xd1, - 0xb1, 0x23, 0x54, 0xdf, 0x44, 0x76, 0x6d, 0xed, 0x41, 0xd8, 0xc1, - 0xb2, 0x22, 0xb6, 0x53, 0x1c, 0xdf, 0x35, 0x1d, 0xdc, 0xa1, 0x77, - 0x2a, 0x31, 0xe4, 0x2d, 0xf5, 0xe5, 0xe5, 0xdb, 0xc8, 0xe0, 0xff, - 0xe5, 0x80, 0xd7, 0x0b, 0x63, 0xa0, 0xff, 0x33, 0xa1, 0x0f, 0xba, - 0x2c, 0x15, 0x15, 0xea, 0x97, 0xb3, 0xd2, 0xa2, 0xb5, 0xbe, 0xf2, - 0x8c, 0x96, 0x1e, 0x1a, 0x8f, 0x1d, 0x6c, 0xa4, 0x61, 0x37, 0xb9, - 0x86, 0x73, 0x33, 0xd7, 0x97, 0x96, 0x9e, 0x23, 0x7d, 0x82, 0xa4, - 0x4c, 0x81, 0xe2, 0xa1, 0xd1, 0xba, 0x67, 0x5f, 0x95, 0x07, 0xa3, - 0x27, 0x11, 0xee, 0x16, 0x10, 0x7b, 0xbc, 0x45, 0x4a, 0x4c, 0xb2, - 0x04, 0xd2, 0xab, 0xef, 0xd5, 0xfd, 0x0c, 0x51, 0xce, 0x50, 0x6a, - 0x08, 0x31, 0xf9, 0x91, 0xda, 0x0c, 0x8f, 0x64, 0x5c, 0x03, 0xc3, - 0x3a, 0x8b, 0x20, 0x3f, 0x6e, 0x8d, 0x67, 0x3d, 0x3a, 0xd6, 0xfe, - 0x7d, 0x5b, 0x88, 0xc9, 0x5e, 0xfb, 0xcc, 0x61, 0xdc, 0x8b, 0x33, - 0x77, 0xd3, 0x44, 0x32, 0x35, 0x09, 0x62, 0x04, 0x92, 0x16, 0x10, - 0xd8, 0x9e, 0x27, 0x47, 0xfb, 0x3b, 0x21, 0xe3, 0xf8, 0xeb, 0x1d, - 0x5b, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xb0, 0x30, 0x81, - 0xad, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, - 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0b, 0x06, 0x03, - 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, - 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x1a, 0x84, - 0x62, 0xbc, 0x48, 0x4c, 0x33, 0x25, 0x04, 0xd4, 0xee, 0xd0, 0xf6, - 0x03, 0xc4, 0x19, 0x46, 0xd1, 0x94, 0x6b, 0x30, 0x6e, 0x06, 0x03, - 0x55, 0x1d, 0x23, 0x04, 0x67, 0x30, 0x65, 0x80, 0x14, 0x1a, 0x84, - 0x62, 0xbc, 0x48, 0x4c, 0x33, 0x25, 0x04, 0xd4, 0xee, 0xd0, 0xf6, - 0x03, 0xc4, 0x19, 0x46, 0xd1, 0x94, 0x6b, 0xa1, 0x49, 0xa4, 0x47, - 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, - 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1b, - 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x51, 0x75, - 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, - 0x20, 0x43, 0x41, 0x20, 0x32, 0x82, 0x02, 0x05, 0x09, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, - 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x3e, 0x0a, 0x16, 0x4d, - 0x9f, 0x06, 0x5b, 0xa8, 0xae, 0x71, 0x5d, 0x2f, 0x05, 0x2f, 0x67, - 0xe6, 0x13, 0x45, 0x83, 0xc4, 0x36, 0xf6, 0xf3, 0xc0, 0x26, 0x0c, - 0x0d, 0xb5, 0x47, 0x64, 0x5d, 0xf8, 0xb4, 0x72, 0xc9, 0x46, 0xa5, - 0x03, 0x18, 0x27, 0x55, 0x89, 0x78, 0x7d, 0x76, 0xea, 0x96, 0x34, - 0x80, 0x17, 0x20, 0xdc, 0xe7, 0x83, 0xf8, 0x8d, 0xfc, 0x07, 0xb8, - 0xda, 0x5f, 0x4d, 0x2e, 0x67, 0xb2, 0x84, 0xfd, 0xd9, 0x44, 0xfc, - 0x77, 0x50, 0x81, 0xe6, 0x7c, 0xb4, 0xc9, 0x0d, 0x0b, 0x72, 0x53, - 0xf8, 0x76, 0x07, 0x07, 0x41, 0x47, 0x96, 0x0c, 0xfb, 0xe0, 0x82, - 0x26, 0x93, 0x55, 0x8c, 0xfe, 0x22, 0x1f, 0x60, 0x65, 0x7c, 0x5f, - 0xe7, 0x26, 0xb3, 0xf7, 0x32, 0x90, 0x98, 0x50, 0xd4, 0x37, 0x71, - 0x55, 0xf6, 0x92, 0x21, 0x78, 0xf7, 0x95, 0x79, 0xfa, 0xf8, 0x2d, - 0x26, 0x87, 0x66, 0x56, 0x30, 0x77, 0xa6, 0x37, 0x78, 0x33, 0x52, - 0x10, 0x58, 0xae, 0x3f, 0x61, 0x8e, 0xf2, 0x6a, 0xb1, 0xef, 0x18, - 0x7e, 0x4a, 0x59, 0x63, 0xca, 0x8d, 0xa2, 0x56, 0xd5, 0xa7, 0x2f, - 0xbc, 0x56, 0x1f, 0xcf, 0x39, 0xc1, 0xe2, 0xfb, 0x0a, 0xa8, 0x15, - 0x2c, 0x7d, 0x4d, 0x7a, 0x63, 0xc6, 0x6c, 0x97, 0x44, 0x3c, 0xd2, - 0x6f, 0xc3, 0x4a, 0x17, 0x0a, 0xf8, 0x90, 0xd2, 0x57, 0xa2, 0x19, - 0x51, 0xa5, 0x2d, 0x97, 0x41, 0xda, 0x07, 0x4f, 0xa9, 0x50, 0xda, - 0x90, 0x8d, 0x94, 0x46, 0xe1, 0x3e, 0xf0, 0x94, 0xfd, 0x10, 0x00, - 0x38, 0xf5, 0x3b, 0xe8, 0x40, 0xe1, 0xb4, 0x6e, 0x56, 0x1a, 0x20, - 0xcc, 0x6f, 0x58, 0x8d, 0xed, 0x2e, 0x45, 0x8f, 0xd6, 0xe9, 0x93, - 0x3f, 0xe7, 0xb1, 0x2c, 0xdf, 0x3a, 0xd6, 0x22, 0x8c, 0xdc, 0x84, - 0xbb, 0x22, 0x6f, 0xd0, 0xf8, 0xe4, 0xc6, 0x39, 0xe9, 0x04, 0x88, - 0x3c, 0xc3, 0xba, 0xeb, 0x55, 0x7a, 0x6d, 0x80, 0x99, 0x24, 0xf5, - 0x6c, 0x01, 0xfb, 0xf8, 0x97, 0xb0, 0x94, 0x5b, 0xeb, 0xfd, 0xd2, - 0x6f, 0xf1, 0x77, 0x68, 0x0d, 0x35, 0x64, 0x23, 0xac, 0xb8, 0x55, - 0xa1, 0x03, 0xd1, 0x4d, 0x42, 0x19, 0xdc, 0xf8, 0x75, 0x59, 0x56, - 0xa3, 0xf9, 0xa8, 0x49, 0x79, 0xf8, 0xaf, 0x0e, 0xb9, 0x11, 0xa0, - 0x7c, 0xb7, 0x6a, 0xed, 0x34, 0xd0, 0xb6, 0x26, 0x62, 0x38, 0x1a, - 0x87, 0x0c, 0xf8, 0xe8, 0xfd, 0x2e, 0xd3, 0x90, 0x7f, 0x07, 0x91, - 0x2a, 0x1d, 0xd6, 0x7e, 0x5c, 0x85, 0x83, 0x99, 0xb0, 0x38, 0x08, - 0x3f, 0xe9, 0x5e, 0xf9, 0x35, 0x07, 0xe4, 0xc9, 0x62, 0x6e, 0x57, - 0x7f, 0xa7, 0x50, 0x95, 0xf7, 0xba, 0xc8, 0x9b, 0xe6, 0x8e, 0xa2, - 0x01, 0xc5, 0xd6, 0x66, 0xbf, 0x79, 0x61, 0xf3, 0x3c, 0x1c, 0xe1, - 0xb9, 0x82, 0x5c, 0x5d, 0xa0, 0xc3, 0xe9, 0xd8, 0x48, 0xbd, 0x19, - 0xa2, 0x11, 0x14, 0x19, 0x6e, 0xb2, 0x86, 0x1b, 0x68, 0x3e, 0x48, - 0x37, 0x1a, 0x88, 0xb7, 0x5d, 0x96, 0x5e, 0x9c, 0xc7, 0xef, 0x27, - 0x62, 0x08, 0xe2, 0x91, 0x19, 0x5c, 0xd2, 0xf1, 0x21, 0xdd, 0xba, - 0x17, 0x42, 0x82, 0x97, 0x71, 0x81, 0x53, 0x31, 0xa9, 0x9f, 0xf6, - 0x7d, 0x62, 0xbf, 0x72, 0xe1, 0xa3, 0x93, 0x1d, 0xcc, 0x8a, 0x26, - 0x5a, 0x09, 0x38, 0xd0, 0xce, 0xd7, 0x0d, 0x80, 0x16, 0xb4, 0x78, - 0xa5, 0x3a, 0x87, 0x4c, 0x8d, 0x8a, 0xa5, 0xd5, 0x46, 0x97, 0xf2, - 0x2c, 0x10, 0xb9, 0xbc, 0x54, 0x22, 0xc0, 0x01, 0x50, 0x69, 0x43, - 0x9e, 0xf4, 0xb2, 0xef, 0x6d, 0xf8, 0xec, 0xda, 0xf1, 0xe3, 0xb1, - 0xef, 0xdf, 0x91, 0x8f, 0x54, 0x2a, 0x0b, 0x25, 0xc1, 0x26, 0x19, - 0xc4, 0x52, 0x10, 0x05, 0x65, 0xd5, 0x82, 0x10, 0xea, 0xc2, 0x31, - 0xcd, 0x2e, 0x30, 0x82, 0x06, 0x9d, 0x30, 0x82, 0x04, 0x85, 0xa0, - 0x03, 0x02, 0x01, 0x02, 0x02, 0x02, 0x05, 0xc6, 0x30, 0x0d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, - 0x00, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, - 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, - 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x51, - 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, - 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x30, 0x1e, 0x17, 0x0d, 0x30, - 0x36, 0x31, 0x31, 0x32, 0x34, 0x31, 0x39, 0x31, 0x31, 0x32, 0x33, - 0x5a, 0x17, 0x0d, 0x33, 0x31, 0x31, 0x31, 0x32, 0x34, 0x31, 0x39, - 0x30, 0x36, 0x34, 0x34, 0x5a, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, - 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, - 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x65, 0x64, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x13, 0x12, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, - 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x30, - 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, - 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xcc, - 0x57, 0x42, 0x16, 0x54, 0x9c, 0xe6, 0x98, 0xd3, 0xd3, 0x4d, 0xee, - 0xfe, 0xed, 0xc7, 0x9f, 0x43, 0x39, 0x4a, 0x65, 0xb3, 0xe8, 0x16, - 0x88, 0x34, 0xdb, 0x0d, 0x59, 0x91, 0x74, 0xcf, 0x92, 0xb8, 0x04, - 0x40, 0xad, 0x02, 0x4b, 0x31, 0xab, 0xbc, 0x8d, 0x91, 0x68, 0xd8, - 0x20, 0x0e, 0x1a, 0x01, 0xe2, 0x1a, 0x7b, 0x4e, 0x17, 0x5d, 0xe2, - 0x8a, 0xb7, 0x3f, 0x99, 0x1a, 0xcd, 0xeb, 0x61, 0xab, 0xc2, 0x65, - 0xa6, 0x1f, 0xb7, 0xb7, 0xbd, 0xb7, 0x8f, 0xfc, 0xfd, 0x70, 0x8f, - 0x0b, 0xa0, 0x67, 0xbe, 0x01, 0xa2, 0x59, 0xcf, 0x71, 0xe6, 0x0f, - 0x29, 0x76, 0xff, 0xb1, 0x56, 0x79, 0x45, 0x2b, 0x1f, 0x9e, 0x7a, - 0x54, 0xe8, 0xa3, 0x29, 0x35, 0x68, 0xa4, 0x01, 0x4f, 0x0f, 0xa4, - 0x2e, 0x37, 0xef, 0x1b, 0xbf, 0xe3, 0x8f, 0x10, 0xa8, 0x72, 0xab, - 0x58, 0x57, 0xe7, 0x54, 0x86, 0xc8, 0xc9, 0xf3, 0x5b, 0xda, 0x2c, - 0xda, 0x5d, 0x8e, 0x6e, 0x3c, 0xa3, 0x3e, 0xda, 0xfb, 0x82, 0xe5, - 0xdd, 0xf2, 0x5c, 0xb2, 0x05, 0x33, 0x6f, 0x8a, 0x36, 0xce, 0xd0, - 0x13, 0x4e, 0xff, 0xbf, 0x4a, 0x0c, 0x34, 0x4c, 0xa6, 0xc3, 0x21, - 0xbd, 0x50, 0x04, 0x55, 0xeb, 0xb1, 0xbb, 0x9d, 0xfb, 0x45, 0x1e, - 0x64, 0x15, 0xde, 0x55, 0x01, 0x8c, 0x02, 0x76, 0xb5, 0xcb, 0xa1, - 0x3f, 0x42, 0x69, 0xbc, 0x2f, 0xbd, 0x68, 0x43, 0x16, 0x56, 0x89, - 0x2a, 0x37, 0x61, 0x91, 0xfd, 0xa6, 0xae, 0x4e, 0xc0, 0xcb, 0x14, - 0x65, 0x94, 0x37, 0x4b, 0x92, 0x06, 0xef, 0x04, 0xd0, 0xc8, 0x9c, - 0x88, 0xdb, 0x0b, 0x7b, 0x81, 0xaf, 0xb1, 0x3d, 0x2a, 0xc4, 0x65, - 0x3a, 0x78, 0xb6, 0xee, 0xdc, 0x80, 0xb1, 0xd2, 0xd3, 0x99, 0x9c, - 0x3a, 0xee, 0x6b, 0x5a, 0x6b, 0xb3, 0x8d, 0xb7, 0xd5, 0xce, 0x9c, - 0xc2, 0xbe, 0xa5, 0x4b, 0x2f, 0x16, 0xb1, 0x9e, 0x68, 0x3b, 0x06, - 0x6f, 0xae, 0x7d, 0x9f, 0xf8, 0xde, 0xec, 0xcc, 0x29, 0xa7, 0x98, - 0xa3, 0x25, 0x43, 0x2f, 0xef, 0xf1, 0x5f, 0x26, 0xe1, 0x88, 0x4d, - 0xf8, 0x5e, 0x6e, 0xd7, 0xd9, 0x14, 0x6e, 0x19, 0x33, 0x69, 0xa7, - 0x3b, 0x84, 0x89, 0x93, 0xc4, 0x53, 0x55, 0x13, 0xa1, 0x51, 0x78, - 0x40, 0xf8, 0xb8, 0xc9, 0xa2, 0xee, 0x7b, 0xba, 0x52, 0x42, 0x83, - 0x9e, 0x14, 0xed, 0x05, 0x52, 0x5a, 0x59, 0x56, 0xa7, 0x97, 0xfc, - 0x9d, 0x3f, 0x0a, 0x29, 0xd8, 0xdc, 0x4f, 0x91, 0x0e, 0x13, 0xbc, - 0xde, 0x95, 0xa4, 0xdf, 0x8b, 0x99, 0xbe, 0xac, 0x9b, 0x33, 0x88, - 0xef, 0xb5, 0x81, 0xaf, 0x1b, 0xc6, 0x22, 0x53, 0xc8, 0xf6, 0xc7, - 0xee, 0x97, 0x14, 0xb0, 0xc5, 0x7c, 0x78, 0x52, 0xc8, 0xf0, 0xce, - 0x6e, 0x77, 0x60, 0x84, 0xa6, 0xe9, 0x2a, 0x76, 0x20, 0xed, 0x58, - 0x01, 0x17, 0x30, 0x93, 0xe9, 0x1a, 0x8b, 0xe0, 0x73, 0x63, 0xd9, - 0x6a, 0x92, 0x94, 0x49, 0x4e, 0xb4, 0xad, 0x4a, 0x85, 0xc4, 0xa3, - 0x22, 0x30, 0xfc, 0x09, 0xed, 0x68, 0x22, 0x73, 0xa6, 0x88, 0x0c, - 0x55, 0x21, 0x58, 0xc5, 0xe1, 0x3a, 0x9f, 0x2a, 0xdd, 0xca, 0xe1, - 0x90, 0xe0, 0xd9, 0x73, 0xab, 0x6c, 0x80, 0xb8, 0xe8, 0x0b, 0x64, - 0x93, 0xa0, 0x9c, 0x8c, 0x19, 0xff, 0xb3, 0xd2, 0x0c, 0xec, 0x91, - 0x26, 0x87, 0x8a, 0xb3, 0xa2, 0xe1, 0x70, 0x8f, 0x2c, 0x0a, 0xe5, - 0xcd, 0x6d, 0x68, 0x51, 0xeb, 0xda, 0x3f, 0x05, 0x7f, 0x8b, 0x32, - 0xe6, 0x13, 0x5c, 0x6b, 0xfe, 0x5f, 0x40, 0xe2, 0x22, 0xc8, 0xb4, - 0xb4, 0x64, 0x4f, 0xd6, 0xba, 0x7d, 0x48, 0x3e, 0xa8, 0x69, 0x0c, - 0xd7, 0xbb, 0x86, 0x71, 0xc9, 0x73, 0xb8, 0x3f, 0x3b, 0x9d, 0x25, - 0x4b, 0xda, 0xff, 0x40, 0xeb, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, - 0x82, 0x01, 0x95, 0x30, 0x82, 0x01, 0x91, 0x30, 0x0f, 0x06, 0x03, + 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x25, 0x30, 0x23, 0x06, + 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1c, 0x52, 0x6f, 0x6f, 0x74, 0x20, + 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, + 0x25, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, + 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, + 0x02, 0x82, 0x01, 0x01, 0x00, 0xbf, 0x61, 0xb5, 0x95, 0x53, 0xba, + 0x57, 0xfc, 0xfa, 0xf2, 0x67, 0x0b, 0x3a, 0x1a, 0xdf, 0x11, 0x80, + 0x64, 0x95, 0xb4, 0xd1, 0xbc, 0xcd, 0x7a, 0xcf, 0xf6, 0x29, 0x96, + 0x2e, 0x24, 0x54, 0x40, 0x24, 0x38, 0xf7, 0x1a, 0x85, 0xdc, 0x58, + 0x4c, 0xcb, 0xa4, 0x27, 0x42, 0x97, 0xd0, 0x9f, 0x83, 0x8a, 0xc3, + 0xe4, 0x06, 0x03, 0x5b, 0x00, 0xa5, 0x51, 0x1e, 0x70, 0x04, 0x74, + 0xe2, 0xc1, 0xd4, 0x3a, 0xab, 0xd7, 0xad, 0x3b, 0x07, 0x18, 0x05, + 0x8e, 0xfd, 0x83, 0xac, 0xea, 0x66, 0xd9, 0x18, 0x1b, 0x68, 0x8a, + 0xf5, 0x57, 0x1a, 0x98, 0xba, 0xf5, 0xed, 0x76, 0x3d, 0x7c, 0xd9, + 0xde, 0x94, 0x6a, 0x3b, 0x4b, 0x17, 0xc1, 0xd5, 0x8f, 0xbd, 0x65, + 0x38, 0x3a, 0x95, 0xd0, 0x3d, 0x55, 0x36, 0x4e, 0xdf, 0x79, 0x57, + 0x31, 0x2a, 0x1e, 0xd8, 0x59, 0x65, 0x49, 0x58, 0x20, 0x98, 0x7e, + 0xab, 0x5f, 0x7e, 0x9f, 0xe9, 0xd6, 0x4d, 0xec, 0x83, 0x74, 0xa9, + 0xc7, 0x6c, 0xd8, 0xee, 0x29, 0x4a, 0x85, 0x2a, 0x06, 0x14, 0xf9, + 0x54, 0xe6, 0xd3, 0xda, 0x65, 0x07, 0x8b, 0x63, 0x37, 0x12, 0xd7, + 0xd0, 0xec, 0xc3, 0x7b, 0x20, 0x41, 0x44, 0xa3, 0xed, 0xcb, 0xa0, + 0x17, 0xe1, 0x71, 0x65, 0xce, 0x1d, 0x66, 0x31, 0xf7, 0x76, 0x01, + 0x19, 0xc8, 0x7d, 0x03, 0x58, 0xb6, 0x95, 0x49, 0x1d, 0xa6, 0x12, + 0x26, 0xe8, 0xc6, 0x0c, 0x76, 0xe0, 0xe3, 0x66, 0xcb, 0xea, 0x5d, + 0xa6, 0x26, 0xee, 0xe5, 0xcc, 0x5f, 0xbd, 0x67, 0xa7, 0x01, 0x27, + 0x0e, 0xa2, 0xca, 0x54, 0xc5, 0xb1, 0x7a, 0x95, 0x1d, 0x71, 0x1e, + 0x4a, 0x29, 0x8a, 0x03, 0xdc, 0x6a, 0x45, 0xc1, 0xa4, 0x19, 0x5e, + 0x6f, 0x36, 0xcd, 0xc3, 0xa2, 0xb0, 0xb7, 0xfe, 0x5c, 0x38, 0xe2, + 0x52, 0xbc, 0xf8, 0x44, 0x43, 0xe6, 0x90, 0xbb, 0x02, 0x03, 0x01, + 0x00, 0x01, 0xa3, 0x82, 0x02, 0x52, 0x30, 0x82, 0x02, 0x4e, 0x30, + 0x3d, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, + 0x04, 0x31, 0x30, 0x2f, 0x30, 0x2d, 0x06, 0x08, 0x2b, 0x06, 0x01, + 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x21, 0x68, 0x74, 0x74, 0x70, + 0x73, 0x3a, 0x2f, 0x2f, 0x6f, 0x63, 0x73, 0x70, 0x2e, 0x71, 0x75, + 0x6f, 0x76, 0x61, 0x64, 0x69, 0x73, 0x6f, 0x66, 0x66, 0x73, 0x68, + 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, - 0x01, 0xff, 0x30, 0x81, 0xe1, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, - 0x81, 0xd9, 0x30, 0x81, 0xd6, 0x30, 0x81, 0xd3, 0x06, 0x09, 0x2b, - 0x06, 0x01, 0x04, 0x01, 0xbe, 0x58, 0x00, 0x03, 0x30, 0x81, 0xc5, - 0x30, 0x81, 0x93, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, - 0x02, 0x02, 0x30, 0x81, 0x86, 0x1a, 0x81, 0x83, 0x41, 0x6e, 0x79, - 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, + 0x01, 0xff, 0x30, 0x82, 0x01, 0x1a, 0x06, 0x03, 0x55, 0x1d, 0x20, + 0x04, 0x82, 0x01, 0x11, 0x30, 0x82, 0x01, 0x0d, 0x30, 0x82, 0x01, + 0x09, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0xbe, 0x58, 0x00, + 0x01, 0x30, 0x81, 0xfb, 0x30, 0x81, 0xd4, 0x06, 0x08, 0x2b, 0x06, + 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, 0x30, 0x81, 0xc7, 0x1a, 0x81, + 0xc4, 0x52, 0x65, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x6f, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x51, 0x75, 0x6f, 0x56, 0x61, + 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x62, + 0x79, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x73, 0x20, 0x61, 0x63, + 0x63, 0x65, 0x70, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x73, + 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x74, 0x65, 0x72, + 0x6d, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x75, + 0x73, 0x65, 0x2c, 0x20, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x61, 0x63, + 0x74, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, - 0x74, 0x65, 0x73, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, - 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x20, 0x43, 0x65, 0x72, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x20, 0x2f, 0x20, 0x43, 0x65, 0x72, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x50, - 0x72, 0x61, 0x63, 0x74, 0x69, 0x63, 0x65, 0x20, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x30, 0x2d, 0x06, 0x08, - 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x21, 0x68, - 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x71, - 0x75, 0x6f, 0x76, 0x61, 0x64, 0x69, 0x73, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x70, 0x73, 0x30, - 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, - 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, - 0x14, 0xf2, 0xc0, 0x13, 0xe0, 0x82, 0x43, 0x3e, 0xfb, 0xee, 0x2f, - 0x67, 0x32, 0x96, 0x35, 0x5c, 0xdb, 0xb8, 0xcb, 0x02, 0xd0, 0x30, - 0x6e, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x67, 0x30, 0x65, 0x80, - 0x14, 0xf2, 0xc0, 0x13, 0xe0, 0x82, 0x43, 0x3e, 0xfb, 0xee, 0x2f, - 0x67, 0x32, 0x96, 0x35, 0x5c, 0xdb, 0xb8, 0xcb, 0x02, 0xd0, 0xa1, - 0x49, 0xa4, 0x47, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x74, 0x65, 0x20, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x30, + 0x22, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, + 0x16, 0x16, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, + 0x77, 0x2e, 0x71, 0x75, 0x6f, 0x76, 0x61, 0x64, 0x69, 0x73, 0x2e, + 0x62, 0x6d, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, + 0x04, 0x14, 0x8b, 0x4b, 0x6d, 0xed, 0xd3, 0x29, 0xb9, 0x06, 0x19, + 0xec, 0x39, 0x39, 0xa9, 0xf0, 0x97, 0x84, 0x6a, 0xcb, 0xef, 0xdf, + 0x30, 0x81, 0xae, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x81, 0xa6, + 0x30, 0x81, 0xa3, 0x80, 0x14, 0x8b, 0x4b, 0x6d, 0xed, 0xd3, 0x29, + 0xb9, 0x06, 0x19, 0xec, 0x39, 0x39, 0xa9, 0xf0, 0x97, 0x84, 0x6a, + 0xcb, 0xef, 0xdf, 0xa1, 0x81, 0x84, 0xa4, 0x81, 0x81, 0x30, 0x7f, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x25, 0x30, 0x23, + 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1c, 0x52, 0x6f, 0x6f, 0x74, + 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x74, 0x79, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x25, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, + 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x82, 0x04, 0x3a, 0xb6, 0x50, + 0x8b, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, + 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x01, 0x00, 0x8a, 0xd4, 0x14, 0xb5, 0xfe, 0xf4, 0x9a, + 0x92, 0xa7, 0x19, 0xd4, 0xa4, 0x7e, 0x72, 0x18, 0x8f, 0xd9, 0x68, + 0x7c, 0x52, 0x24, 0xdd, 0x67, 0x6f, 0x39, 0x7a, 0xc4, 0xaa, 0x5e, + 0x3d, 0xe2, 0x58, 0xb0, 0x4d, 0x70, 0x98, 0x84, 0x61, 0xe8, 0x1b, + 0xe3, 0x69, 0x18, 0x0e, 0xce, 0xfb, 0x47, 0x50, 0xa0, 0x4e, 0xff, + 0xf0, 0x24, 0x1f, 0xbd, 0xb2, 0xce, 0xf5, 0x27, 0xfc, 0xec, 0x2f, + 0x53, 0xaa, 0x73, 0x7b, 0x03, 0x3d, 0x74, 0x6e, 0xe6, 0x16, 0x9e, + 0xeb, 0xa5, 0x2e, 0xc4, 0xbf, 0x56, 0x27, 0x50, 0x2b, 0x62, 0xba, + 0xbe, 0x4b, 0x1c, 0x3c, 0x55, 0x5c, 0x41, 0x1d, 0x24, 0xbe, 0x82, + 0x20, 0x47, 0x5d, 0xd5, 0x44, 0x7e, 0x7a, 0x16, 0x68, 0xdf, 0x7d, + 0x4d, 0x51, 0x70, 0x78, 0x57, 0x1d, 0x33, 0x1e, 0xfd, 0x02, 0x99, + 0x9c, 0x0c, 0xcd, 0x0a, 0x05, 0x4f, 0xc7, 0xbb, 0x8e, 0xa4, 0x75, + 0xfa, 0x4a, 0x6d, 0xb1, 0x80, 0x8e, 0x09, 0x56, 0xb9, 0x9c, 0x1a, + 0x60, 0xfe, 0x5d, 0xc1, 0xd7, 0x7a, 0xdc, 0x11, 0x78, 0xd0, 0xd6, + 0x5d, 0xc1, 0xb7, 0xd5, 0xad, 0x32, 0x99, 0x03, 0x3a, 0x8a, 0xcc, + 0x54, 0x25, 0x39, 0x31, 0x81, 0x7b, 0x13, 0x22, 0x51, 0xba, 0x46, + 0x6c, 0xa1, 0xbb, 0x9e, 0xfa, 0x04, 0x6c, 0x49, 0x26, 0x74, 0x8f, + 0xd2, 0x73, 0xeb, 0xcc, 0x30, 0xa2, 0xe6, 0xea, 0x59, 0x22, 0x87, + 0xf8, 0x97, 0xf5, 0x0e, 0xfd, 0xea, 0xcc, 0x92, 0xa4, 0x16, 0xc4, + 0x52, 0x18, 0xea, 0x21, 0xce, 0xb1, 0xf1, 0xe6, 0x84, 0x81, 0xe5, + 0xba, 0xa9, 0x86, 0x28, 0xf2, 0x43, 0x5a, 0x5d, 0x12, 0x9d, 0xac, + 0x1e, 0xd9, 0xa8, 0xe5, 0x0a, 0x6a, 0xa7, 0x7f, 0xa0, 0x87, 0x29, + 0xcf, 0xf2, 0x89, 0x4d, 0xd4, 0xec, 0xc5, 0xe2, 0xe6, 0x7a, 0xd0, + 0x36, 0x23, 0x8a, 0x4a, 0x74, 0x36, 0xf9, 0x30, 0x82, 0x05, 0xb7, + 0x30, 0x82, 0x03, 0x9f, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x02, + 0x05, 0x09, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x45, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, + 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, + 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x65, 0x64, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x12, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, + 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, + 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x31, 0x32, 0x34, 0x31, + 0x38, 0x32, 0x37, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x31, 0x31, + 0x31, 0x32, 0x34, 0x31, 0x38, 0x32, 0x33, 0x33, 0x33, 0x5a, 0x30, + 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, + 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1b, 0x30, + 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x51, 0x75, 0x6f, + 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, + 0x43, 0x41, 0x20, 0x32, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, + 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, + 0x82, 0x02, 0x01, 0x00, 0x9a, 0x18, 0xca, 0x4b, 0x94, 0x0d, 0x00, + 0x2d, 0xaf, 0x03, 0x29, 0x8a, 0xf0, 0x0f, 0x81, 0xc8, 0xae, 0x4c, + 0x19, 0x85, 0x1d, 0x08, 0x9f, 0xab, 0x29, 0x44, 0x85, 0xf3, 0x2f, + 0x81, 0xad, 0x32, 0x1e, 0x90, 0x46, 0xbf, 0xa3, 0x86, 0x26, 0x1a, + 0x1e, 0xfe, 0x7e, 0x1c, 0x18, 0x3a, 0x5c, 0x9c, 0x60, 0x17, 0x2a, + 0x3a, 0x74, 0x83, 0x33, 0x30, 0x7d, 0x61, 0x54, 0x11, 0xcb, 0xed, + 0xab, 0xe0, 0xe6, 0xd2, 0xa2, 0x7e, 0xf5, 0x6b, 0x6f, 0x18, 0xb7, + 0x0a, 0x0b, 0x2d, 0xfd, 0xe9, 0x3e, 0xef, 0x0a, 0xc6, 0xb3, 0x10, + 0xe9, 0xdc, 0xc2, 0x46, 0x17, 0xf8, 0x5d, 0xfd, 0xa4, 0xda, 0xff, + 0x9e, 0x49, 0x5a, 0x9c, 0xe6, 0x33, 0xe6, 0x24, 0x96, 0xf7, 0x3f, + 0xba, 0x5b, 0x2b, 0x1c, 0x7a, 0x35, 0xc2, 0xd6, 0x67, 0xfe, 0xab, + 0x66, 0x50, 0x8b, 0x6d, 0x28, 0x60, 0x2b, 0xef, 0xd7, 0x60, 0xc3, + 0xc7, 0x93, 0xbc, 0x8d, 0x36, 0x91, 0xf3, 0x7f, 0xf8, 0xdb, 0x11, + 0x13, 0xc4, 0x9c, 0x77, 0x76, 0xc1, 0xae, 0xb7, 0x02, 0x6a, 0x81, + 0x7a, 0xa9, 0x45, 0x83, 0xe2, 0x05, 0xe6, 0xb9, 0x56, 0xc1, 0x94, + 0x37, 0x8f, 0x48, 0x71, 0x63, 0x22, 0xec, 0x17, 0x65, 0x07, 0x95, + 0x8a, 0x4b, 0xdf, 0x8f, 0xc6, 0x5a, 0x0a, 0xe5, 0xb0, 0xe3, 0x5f, + 0x5e, 0x6b, 0x11, 0xab, 0x0c, 0xf9, 0x85, 0xeb, 0x44, 0xe9, 0xf8, + 0x04, 0x73, 0xf2, 0xe9, 0xfe, 0x5c, 0x98, 0x8c, 0xf5, 0x73, 0xaf, + 0x6b, 0xb4, 0x7e, 0xcd, 0xd4, 0x5c, 0x02, 0x2b, 0x4c, 0x39, 0xe1, + 0xb2, 0x95, 0x95, 0x2d, 0x42, 0x87, 0xd7, 0xd5, 0xb3, 0x90, 0x43, + 0xb7, 0x6c, 0x13, 0xf1, 0xde, 0xdd, 0xf6, 0xc4, 0xf8, 0x89, 0x3f, + 0xd1, 0x75, 0xf5, 0x92, 0xc3, 0x91, 0xd5, 0x8a, 0x88, 0xd0, 0x90, + 0xec, 0xdc, 0x6d, 0xde, 0x89, 0xc2, 0x65, 0x71, 0x96, 0x8b, 0x0d, + 0x03, 0xfd, 0x9c, 0xbf, 0x5b, 0x16, 0xac, 0x92, 0xdb, 0xea, 0xfe, + 0x79, 0x7c, 0xad, 0xeb, 0xaf, 0xf7, 0x16, 0xcb, 0xdb, 0xcd, 0x25, + 0x2b, 0xe5, 0x1f, 0xfb, 0x9a, 0x9f, 0xe2, 0x51, 0xcc, 0x3a, 0x53, + 0x0c, 0x48, 0xe6, 0x0e, 0xbd, 0xc9, 0xb4, 0x76, 0x06, 0x52, 0xe6, + 0x11, 0x13, 0x85, 0x72, 0x63, 0x03, 0x04, 0xe0, 0x04, 0x36, 0x2b, + 0x20, 0x19, 0x02, 0xe8, 0x74, 0xa7, 0x1f, 0xb6, 0xc9, 0x56, 0x66, + 0xf0, 0x75, 0x25, 0xdc, 0x67, 0xc1, 0x0e, 0x61, 0x60, 0x88, 0xb3, + 0x3e, 0xd1, 0xa8, 0xfc, 0xa3, 0xda, 0x1d, 0xb0, 0xd1, 0xb1, 0x23, + 0x54, 0xdf, 0x44, 0x76, 0x6d, 0xed, 0x41, 0xd8, 0xc1, 0xb2, 0x22, + 0xb6, 0x53, 0x1c, 0xdf, 0x35, 0x1d, 0xdc, 0xa1, 0x77, 0x2a, 0x31, + 0xe4, 0x2d, 0xf5, 0xe5, 0xe5, 0xdb, 0xc8, 0xe0, 0xff, 0xe5, 0x80, + 0xd7, 0x0b, 0x63, 0xa0, 0xff, 0x33, 0xa1, 0x0f, 0xba, 0x2c, 0x15, + 0x15, 0xea, 0x97, 0xb3, 0xd2, 0xa2, 0xb5, 0xbe, 0xf2, 0x8c, 0x96, + 0x1e, 0x1a, 0x8f, 0x1d, 0x6c, 0xa4, 0x61, 0x37, 0xb9, 0x86, 0x73, + 0x33, 0xd7, 0x97, 0x96, 0x9e, 0x23, 0x7d, 0x82, 0xa4, 0x4c, 0x81, + 0xe2, 0xa1, 0xd1, 0xba, 0x67, 0x5f, 0x95, 0x07, 0xa3, 0x27, 0x11, + 0xee, 0x16, 0x10, 0x7b, 0xbc, 0x45, 0x4a, 0x4c, 0xb2, 0x04, 0xd2, + 0xab, 0xef, 0xd5, 0xfd, 0x0c, 0x51, 0xce, 0x50, 0x6a, 0x08, 0x31, + 0xf9, 0x91, 0xda, 0x0c, 0x8f, 0x64, 0x5c, 0x03, 0xc3, 0x3a, 0x8b, + 0x20, 0x3f, 0x6e, 0x8d, 0x67, 0x3d, 0x3a, 0xd6, 0xfe, 0x7d, 0x5b, + 0x88, 0xc9, 0x5e, 0xfb, 0xcc, 0x61, 0xdc, 0x8b, 0x33, 0x77, 0xd3, + 0x44, 0x32, 0x35, 0x09, 0x62, 0x04, 0x92, 0x16, 0x10, 0xd8, 0x9e, + 0x27, 0x47, 0xfb, 0x3b, 0x21, 0xe3, 0xf8, 0xeb, 0x1d, 0x5b, 0x02, + 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xb0, 0x30, 0x81, 0xad, 0x30, + 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, + 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, + 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, + 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x1a, 0x84, 0x62, 0xbc, + 0x48, 0x4c, 0x33, 0x25, 0x04, 0xd4, 0xee, 0xd0, 0xf6, 0x03, 0xc4, + 0x19, 0x46, 0xd1, 0x94, 0x6b, 0x30, 0x6e, 0x06, 0x03, 0x55, 0x1d, + 0x23, 0x04, 0x67, 0x30, 0x65, 0x80, 0x14, 0x1a, 0x84, 0x62, 0xbc, + 0x48, 0x4c, 0x33, 0x25, 0x04, 0xd4, 0xee, 0xd0, 0xf6, 0x03, 0xc4, + 0x19, 0x46, 0xd1, 0x94, 0x6b, 0xa1, 0x49, 0xa4, 0x47, 0x30, 0x45, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1b, 0x30, 0x19, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x51, 0x75, 0x6f, 0x56, + 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, + 0x41, 0x20, 0x32, 0x82, 0x02, 0x05, 0x09, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, + 0x03, 0x82, 0x02, 0x01, 0x00, 0x3e, 0x0a, 0x16, 0x4d, 0x9f, 0x06, + 0x5b, 0xa8, 0xae, 0x71, 0x5d, 0x2f, 0x05, 0x2f, 0x67, 0xe6, 0x13, + 0x45, 0x83, 0xc4, 0x36, 0xf6, 0xf3, 0xc0, 0x26, 0x0c, 0x0d, 0xb5, + 0x47, 0x64, 0x5d, 0xf8, 0xb4, 0x72, 0xc9, 0x46, 0xa5, 0x03, 0x18, + 0x27, 0x55, 0x89, 0x78, 0x7d, 0x76, 0xea, 0x96, 0x34, 0x80, 0x17, + 0x20, 0xdc, 0xe7, 0x83, 0xf8, 0x8d, 0xfc, 0x07, 0xb8, 0xda, 0x5f, + 0x4d, 0x2e, 0x67, 0xb2, 0x84, 0xfd, 0xd9, 0x44, 0xfc, 0x77, 0x50, + 0x81, 0xe6, 0x7c, 0xb4, 0xc9, 0x0d, 0x0b, 0x72, 0x53, 0xf8, 0x76, + 0x07, 0x07, 0x41, 0x47, 0x96, 0x0c, 0xfb, 0xe0, 0x82, 0x26, 0x93, + 0x55, 0x8c, 0xfe, 0x22, 0x1f, 0x60, 0x65, 0x7c, 0x5f, 0xe7, 0x26, + 0xb3, 0xf7, 0x32, 0x90, 0x98, 0x50, 0xd4, 0x37, 0x71, 0x55, 0xf6, + 0x92, 0x21, 0x78, 0xf7, 0x95, 0x79, 0xfa, 0xf8, 0x2d, 0x26, 0x87, + 0x66, 0x56, 0x30, 0x77, 0xa6, 0x37, 0x78, 0x33, 0x52, 0x10, 0x58, + 0xae, 0x3f, 0x61, 0x8e, 0xf2, 0x6a, 0xb1, 0xef, 0x18, 0x7e, 0x4a, + 0x59, 0x63, 0xca, 0x8d, 0xa2, 0x56, 0xd5, 0xa7, 0x2f, 0xbc, 0x56, + 0x1f, 0xcf, 0x39, 0xc1, 0xe2, 0xfb, 0x0a, 0xa8, 0x15, 0x2c, 0x7d, + 0x4d, 0x7a, 0x63, 0xc6, 0x6c, 0x97, 0x44, 0x3c, 0xd2, 0x6f, 0xc3, + 0x4a, 0x17, 0x0a, 0xf8, 0x90, 0xd2, 0x57, 0xa2, 0x19, 0x51, 0xa5, + 0x2d, 0x97, 0x41, 0xda, 0x07, 0x4f, 0xa9, 0x50, 0xda, 0x90, 0x8d, + 0x94, 0x46, 0xe1, 0x3e, 0xf0, 0x94, 0xfd, 0x10, 0x00, 0x38, 0xf5, + 0x3b, 0xe8, 0x40, 0xe1, 0xb4, 0x6e, 0x56, 0x1a, 0x20, 0xcc, 0x6f, + 0x58, 0x8d, 0xed, 0x2e, 0x45, 0x8f, 0xd6, 0xe9, 0x93, 0x3f, 0xe7, + 0xb1, 0x2c, 0xdf, 0x3a, 0xd6, 0x22, 0x8c, 0xdc, 0x84, 0xbb, 0x22, + 0x6f, 0xd0, 0xf8, 0xe4, 0xc6, 0x39, 0xe9, 0x04, 0x88, 0x3c, 0xc3, + 0xba, 0xeb, 0x55, 0x7a, 0x6d, 0x80, 0x99, 0x24, 0xf5, 0x6c, 0x01, + 0xfb, 0xf8, 0x97, 0xb0, 0x94, 0x5b, 0xeb, 0xfd, 0xd2, 0x6f, 0xf1, + 0x77, 0x68, 0x0d, 0x35, 0x64, 0x23, 0xac, 0xb8, 0x55, 0xa1, 0x03, + 0xd1, 0x4d, 0x42, 0x19, 0xdc, 0xf8, 0x75, 0x59, 0x56, 0xa3, 0xf9, + 0xa8, 0x49, 0x79, 0xf8, 0xaf, 0x0e, 0xb9, 0x11, 0xa0, 0x7c, 0xb7, + 0x6a, 0xed, 0x34, 0xd0, 0xb6, 0x26, 0x62, 0x38, 0x1a, 0x87, 0x0c, + 0xf8, 0xe8, 0xfd, 0x2e, 0xd3, 0x90, 0x7f, 0x07, 0x91, 0x2a, 0x1d, + 0xd6, 0x7e, 0x5c, 0x85, 0x83, 0x99, 0xb0, 0x38, 0x08, 0x3f, 0xe9, + 0x5e, 0xf9, 0x35, 0x07, 0xe4, 0xc9, 0x62, 0x6e, 0x57, 0x7f, 0xa7, + 0x50, 0x95, 0xf7, 0xba, 0xc8, 0x9b, 0xe6, 0x8e, 0xa2, 0x01, 0xc5, + 0xd6, 0x66, 0xbf, 0x79, 0x61, 0xf3, 0x3c, 0x1c, 0xe1, 0xb9, 0x82, + 0x5c, 0x5d, 0xa0, 0xc3, 0xe9, 0xd8, 0x48, 0xbd, 0x19, 0xa2, 0x11, + 0x14, 0x19, 0x6e, 0xb2, 0x86, 0x1b, 0x68, 0x3e, 0x48, 0x37, 0x1a, + 0x88, 0xb7, 0x5d, 0x96, 0x5e, 0x9c, 0xc7, 0xef, 0x27, 0x62, 0x08, + 0xe2, 0x91, 0x19, 0x5c, 0xd2, 0xf1, 0x21, 0xdd, 0xba, 0x17, 0x42, + 0x82, 0x97, 0x71, 0x81, 0x53, 0x31, 0xa9, 0x9f, 0xf6, 0x7d, 0x62, + 0xbf, 0x72, 0xe1, 0xa3, 0x93, 0x1d, 0xcc, 0x8a, 0x26, 0x5a, 0x09, + 0x38, 0xd0, 0xce, 0xd7, 0x0d, 0x80, 0x16, 0xb4, 0x78, 0xa5, 0x3a, + 0x87, 0x4c, 0x8d, 0x8a, 0xa5, 0xd5, 0x46, 0x97, 0xf2, 0x2c, 0x10, + 0xb9, 0xbc, 0x54, 0x22, 0xc0, 0x01, 0x50, 0x69, 0x43, 0x9e, 0xf4, + 0xb2, 0xef, 0x6d, 0xf8, 0xec, 0xda, 0xf1, 0xe3, 0xb1, 0xef, 0xdf, + 0x91, 0x8f, 0x54, 0x2a, 0x0b, 0x25, 0xc1, 0x26, 0x19, 0xc4, 0x52, + 0x10, 0x05, 0x65, 0xd5, 0x82, 0x10, 0xea, 0xc2, 0x31, 0xcd, 0x2e, + 0x30, 0x82, 0x06, 0x9d, 0x30, 0x82, 0x04, 0x85, 0xa0, 0x03, 0x02, + 0x01, 0x02, 0x02, 0x02, 0x05, 0xc6, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, + 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, + 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1b, 0x30, + 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x51, 0x75, 0x6f, + 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, + 0x43, 0x41, 0x20, 0x33, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, + 0x31, 0x32, 0x34, 0x31, 0x39, 0x31, 0x31, 0x32, 0x33, 0x5a, 0x17, + 0x0d, 0x33, 0x31, 0x31, 0x31, 0x32, 0x34, 0x31, 0x39, 0x30, 0x36, + 0x34, 0x34, 0x5a, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, - 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x82, 0x02, 0x05, - 0xc6, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x4f, - 0xad, 0xa0, 0x2c, 0x4c, 0xfa, 0xc0, 0xf2, 0x6f, 0xf7, 0x66, 0x55, - 0xab, 0x23, 0x34, 0xee, 0xe7, 0x29, 0xda, 0xc3, 0x5b, 0xb6, 0xb0, - 0x83, 0xd9, 0xd0, 0xd0, 0xe2, 0x21, 0xfb, 0xf3, 0x60, 0xa7, 0x3b, - 0x5d, 0x60, 0x53, 0x27, 0xa2, 0x9b, 0xf6, 0x08, 0x22, 0x2a, 0xe7, - 0xbf, 0xa0, 0x72, 0xe5, 0x9c, 0x24, 0x6a, 0x31, 0xb1, 0x90, 0x7a, - 0x27, 0xdb, 0x84, 0x11, 0x89, 0x27, 0xa6, 0x77, 0x5a, 0x38, 0xd7, - 0xbf, 0xac, 0x86, 0xfc, 0xee, 0x5d, 0x83, 0xbc, 0x06, 0xc6, 0xd1, - 0x77, 0x6b, 0x0f, 0x6d, 0x24, 0x2f, 0x4b, 0x7a, 0x6c, 0xa7, 0x07, - 0x96, 0xca, 0xe3, 0x84, 0x9f, 0xad, 0x88, 0x8b, 0x1d, 0xab, 0x16, - 0x8d, 0x5b, 0x66, 0x17, 0xd9, 0x16, 0xf4, 0x8b, 0x80, 0xd2, 0xdd, - 0xf8, 0xb2, 0x76, 0xc3, 0xfc, 0x38, 0x13, 0xaa, 0x0c, 0xde, 0x42, - 0x69, 0x2b, 0x6e, 0xf3, 0x3c, 0xeb, 0x80, 0x27, 0xdb, 0xf5, 0xa6, - 0x44, 0x0d, 0x9f, 0x5a, 0x55, 0x59, 0x0b, 0xd5, 0x0d, 0x52, 0x48, - 0xc5, 0xae, 0x9f, 0xf2, 0x2f, 0x80, 0xc5, 0xea, 0x32, 0x50, 0x35, - 0x12, 0x97, 0x2e, 0xc1, 0xe1, 0xff, 0xf1, 0x23, 0x88, 0x51, 0x38, - 0x9f, 0xf2, 0x66, 0x56, 0x76, 0xe7, 0x0f, 0x51, 0x97, 0xa5, 0x52, - 0x0c, 0x4d, 0x49, 0x51, 0x95, 0x36, 0x3d, 0xbf, 0xa2, 0x4b, 0x0c, - 0x10, 0x1d, 0x86, 0x99, 0x4c, 0xaa, 0xf3, 0x72, 0x11, 0x93, 0xe4, - 0xea, 0xf6, 0x9b, 0xda, 0xa8, 0x5d, 0xa7, 0x4d, 0xb7, 0x9e, 0x02, - 0xae, 0x73, 0x00, 0xc8, 0xda, 0x23, 0x03, 0xe8, 0xf9, 0xea, 0x19, - 0x74, 0x62, 0x00, 0x94, 0xcb, 0x22, 0x20, 0xbe, 0x94, 0xa7, 0x59, - 0xb5, 0x82, 0x6a, 0xbe, 0x99, 0x79, 0x7a, 0xa9, 0xf2, 0x4a, 0x24, - 0x52, 0xf7, 0x74, 0xfd, 0xba, 0x4e, 0xe6, 0xa8, 0x1d, 0x02, 0x6e, - 0xb1, 0x0d, 0x80, 0x44, 0xc1, 0xae, 0xd3, 0x23, 0x37, 0x5f, 0xbb, - 0x85, 0x7c, 0x2b, 0x92, 0x2e, 0xe8, 0x7e, 0xa5, 0x8b, 0xdd, 0x99, - 0xe1, 0xbf, 0x27, 0x6f, 0x2d, 0x5d, 0xaa, 0x7b, 0x87, 0xfe, 0x0a, - 0xdd, 0x4b, 0xfc, 0x8e, 0xf5, 0x26, 0xe4, 0x6e, 0x70, 0x42, 0x6e, - 0x33, 0xec, 0x31, 0x9e, 0x7b, 0x93, 0xc1, 0xe4, 0xc9, 0x69, 0x1a, - 0x3d, 0xc0, 0x6b, 0x4e, 0x22, 0x6d, 0xee, 0xab, 0x58, 0x4d, 0xc6, - 0xd0, 0x41, 0xc1, 0x2b, 0xea, 0x4f, 0x12, 0x87, 0x5e, 0xeb, 0x45, - 0xd8, 0x6c, 0xf5, 0x98, 0x02, 0xd3, 0xa0, 0xd8, 0x55, 0x8a, 0x06, - 0x99, 0x19, 0xa2, 0xa0, 0x77, 0xd1, 0x30, 0x9e, 0xac, 0xcc, 0x75, - 0xee, 0x83, 0xf5, 0xb0, 0x62, 0x39, 0xcf, 0x6c, 0x57, 0xe2, 0x4c, - 0xd2, 0x91, 0x0b, 0x0e, 0x75, 0x28, 0x1b, 0x9a, 0xbf, 0xfd, 0x1a, - 0x43, 0xf1, 0xca, 0x77, 0xfb, 0x3b, 0x8f, 0x61, 0xb8, 0x69, 0x28, - 0x16, 0x42, 0x04, 0x5e, 0x70, 0x2a, 0x1c, 0x21, 0xd8, 0x8f, 0xe1, - 0xbd, 0x23, 0x5b, 0x2d, 0x74, 0x40, 0x92, 0xd9, 0x63, 0x19, 0x0d, - 0x73, 0xdd, 0x69, 0xbc, 0x62, 0x47, 0xbc, 0xe0, 0x74, 0x2b, 0xb2, - 0xeb, 0x7d, 0xbe, 0x41, 0x1b, 0xb5, 0xc0, 0x46, 0xc5, 0xa1, 0x22, - 0xcb, 0x5f, 0x4e, 0xc1, 0x28, 0x92, 0xde, 0x18, 0xba, 0xd5, 0x2a, - 0x28, 0xbb, 0x11, 0x8b, 0x17, 0x93, 0x98, 0x99, 0x60, 0x94, 0x5c, - 0x23, 0xcf, 0x5a, 0x27, 0x97, 0x5e, 0x0b, 0x05, 0x06, 0x93, 0x37, - 0x1e, 0x3b, 0x69, 0x36, 0xeb, 0xa9, 0x9e, 0x61, 0x1d, 0x8f, 0x32, - 0xda, 0x8e, 0x0c, 0xd6, 0x74, 0x3e, 0x7b, 0x09, 0x24, 0xda, 0x01, - 0x77, 0x47, 0xc4, 0x3b, 0xcd, 0x34, 0x8c, 0x99, 0xf5, 0xca, 0xe1, - 0x25, 0x61, 0x33, 0xb2, 0x59, 0x1b, 0xe2, 0x6e, 0xd7, 0x37, 0x57, - 0xb6, 0x0d, 0xa9, 0x12, 0xda, 0x30, 0x82, 0x03, 0x5a, 0x30, 0x82, - 0x02, 0x42, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, 0x30, + 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x30, 0x82, 0x02, + 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, + 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xcc, 0x57, 0x42, + 0x16, 0x54, 0x9c, 0xe6, 0x98, 0xd3, 0xd3, 0x4d, 0xee, 0xfe, 0xed, + 0xc7, 0x9f, 0x43, 0x39, 0x4a, 0x65, 0xb3, 0xe8, 0x16, 0x88, 0x34, + 0xdb, 0x0d, 0x59, 0x91, 0x74, 0xcf, 0x92, 0xb8, 0x04, 0x40, 0xad, + 0x02, 0x4b, 0x31, 0xab, 0xbc, 0x8d, 0x91, 0x68, 0xd8, 0x20, 0x0e, + 0x1a, 0x01, 0xe2, 0x1a, 0x7b, 0x4e, 0x17, 0x5d, 0xe2, 0x8a, 0xb7, + 0x3f, 0x99, 0x1a, 0xcd, 0xeb, 0x61, 0xab, 0xc2, 0x65, 0xa6, 0x1f, + 0xb7, 0xb7, 0xbd, 0xb7, 0x8f, 0xfc, 0xfd, 0x70, 0x8f, 0x0b, 0xa0, + 0x67, 0xbe, 0x01, 0xa2, 0x59, 0xcf, 0x71, 0xe6, 0x0f, 0x29, 0x76, + 0xff, 0xb1, 0x56, 0x79, 0x45, 0x2b, 0x1f, 0x9e, 0x7a, 0x54, 0xe8, + 0xa3, 0x29, 0x35, 0x68, 0xa4, 0x01, 0x4f, 0x0f, 0xa4, 0x2e, 0x37, + 0xef, 0x1b, 0xbf, 0xe3, 0x8f, 0x10, 0xa8, 0x72, 0xab, 0x58, 0x57, + 0xe7, 0x54, 0x86, 0xc8, 0xc9, 0xf3, 0x5b, 0xda, 0x2c, 0xda, 0x5d, + 0x8e, 0x6e, 0x3c, 0xa3, 0x3e, 0xda, 0xfb, 0x82, 0xe5, 0xdd, 0xf2, + 0x5c, 0xb2, 0x05, 0x33, 0x6f, 0x8a, 0x36, 0xce, 0xd0, 0x13, 0x4e, + 0xff, 0xbf, 0x4a, 0x0c, 0x34, 0x4c, 0xa6, 0xc3, 0x21, 0xbd, 0x50, + 0x04, 0x55, 0xeb, 0xb1, 0xbb, 0x9d, 0xfb, 0x45, 0x1e, 0x64, 0x15, + 0xde, 0x55, 0x01, 0x8c, 0x02, 0x76, 0xb5, 0xcb, 0xa1, 0x3f, 0x42, + 0x69, 0xbc, 0x2f, 0xbd, 0x68, 0x43, 0x16, 0x56, 0x89, 0x2a, 0x37, + 0x61, 0x91, 0xfd, 0xa6, 0xae, 0x4e, 0xc0, 0xcb, 0x14, 0x65, 0x94, + 0x37, 0x4b, 0x92, 0x06, 0xef, 0x04, 0xd0, 0xc8, 0x9c, 0x88, 0xdb, + 0x0b, 0x7b, 0x81, 0xaf, 0xb1, 0x3d, 0x2a, 0xc4, 0x65, 0x3a, 0x78, + 0xb6, 0xee, 0xdc, 0x80, 0xb1, 0xd2, 0xd3, 0x99, 0x9c, 0x3a, 0xee, + 0x6b, 0x5a, 0x6b, 0xb3, 0x8d, 0xb7, 0xd5, 0xce, 0x9c, 0xc2, 0xbe, + 0xa5, 0x4b, 0x2f, 0x16, 0xb1, 0x9e, 0x68, 0x3b, 0x06, 0x6f, 0xae, + 0x7d, 0x9f, 0xf8, 0xde, 0xec, 0xcc, 0x29, 0xa7, 0x98, 0xa3, 0x25, + 0x43, 0x2f, 0xef, 0xf1, 0x5f, 0x26, 0xe1, 0x88, 0x4d, 0xf8, 0x5e, + 0x6e, 0xd7, 0xd9, 0x14, 0x6e, 0x19, 0x33, 0x69, 0xa7, 0x3b, 0x84, + 0x89, 0x93, 0xc4, 0x53, 0x55, 0x13, 0xa1, 0x51, 0x78, 0x40, 0xf8, + 0xb8, 0xc9, 0xa2, 0xee, 0x7b, 0xba, 0x52, 0x42, 0x83, 0x9e, 0x14, + 0xed, 0x05, 0x52, 0x5a, 0x59, 0x56, 0xa7, 0x97, 0xfc, 0x9d, 0x3f, + 0x0a, 0x29, 0xd8, 0xdc, 0x4f, 0x91, 0x0e, 0x13, 0xbc, 0xde, 0x95, + 0xa4, 0xdf, 0x8b, 0x99, 0xbe, 0xac, 0x9b, 0x33, 0x88, 0xef, 0xb5, + 0x81, 0xaf, 0x1b, 0xc6, 0x22, 0x53, 0xc8, 0xf6, 0xc7, 0xee, 0x97, + 0x14, 0xb0, 0xc5, 0x7c, 0x78, 0x52, 0xc8, 0xf0, 0xce, 0x6e, 0x77, + 0x60, 0x84, 0xa6, 0xe9, 0x2a, 0x76, 0x20, 0xed, 0x58, 0x01, 0x17, + 0x30, 0x93, 0xe9, 0x1a, 0x8b, 0xe0, 0x73, 0x63, 0xd9, 0x6a, 0x92, + 0x94, 0x49, 0x4e, 0xb4, 0xad, 0x4a, 0x85, 0xc4, 0xa3, 0x22, 0x30, + 0xfc, 0x09, 0xed, 0x68, 0x22, 0x73, 0xa6, 0x88, 0x0c, 0x55, 0x21, + 0x58, 0xc5, 0xe1, 0x3a, 0x9f, 0x2a, 0xdd, 0xca, 0xe1, 0x90, 0xe0, + 0xd9, 0x73, 0xab, 0x6c, 0x80, 0xb8, 0xe8, 0x0b, 0x64, 0x93, 0xa0, + 0x9c, 0x8c, 0x19, 0xff, 0xb3, 0xd2, 0x0c, 0xec, 0x91, 0x26, 0x87, + 0x8a, 0xb3, 0xa2, 0xe1, 0x70, 0x8f, 0x2c, 0x0a, 0xe5, 0xcd, 0x6d, + 0x68, 0x51, 0xeb, 0xda, 0x3f, 0x05, 0x7f, 0x8b, 0x32, 0xe6, 0x13, + 0x5c, 0x6b, 0xfe, 0x5f, 0x40, 0xe2, 0x22, 0xc8, 0xb4, 0xb4, 0x64, + 0x4f, 0xd6, 0xba, 0x7d, 0x48, 0x3e, 0xa8, 0x69, 0x0c, 0xd7, 0xbb, + 0x86, 0x71, 0xc9, 0x73, 0xb8, 0x3f, 0x3b, 0x9d, 0x25, 0x4b, 0xda, + 0xff, 0x40, 0xeb, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, + 0x95, 0x30, 0x82, 0x01, 0x91, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, + 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, + 0x30, 0x81, 0xe1, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x81, 0xd9, + 0x30, 0x81, 0xd6, 0x30, 0x81, 0xd3, 0x06, 0x09, 0x2b, 0x06, 0x01, + 0x04, 0x01, 0xbe, 0x58, 0x00, 0x03, 0x30, 0x81, 0xc5, 0x30, 0x81, + 0x93, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, + 0x30, 0x81, 0x86, 0x1a, 0x81, 0x83, 0x41, 0x6e, 0x79, 0x20, 0x75, + 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x65, + 0x73, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x51, 0x75, + 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, + 0x20, 0x43, 0x41, 0x20, 0x33, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x20, 0x2f, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x50, 0x72, 0x61, + 0x63, 0x74, 0x69, 0x63, 0x65, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x30, 0x2d, 0x06, 0x08, 0x2b, 0x06, + 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x21, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x71, 0x75, 0x6f, + 0x76, 0x61, 0x64, 0x69, 0x73, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x70, 0x73, 0x30, 0x0b, 0x06, + 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xf2, + 0xc0, 0x13, 0xe0, 0x82, 0x43, 0x3e, 0xfb, 0xee, 0x2f, 0x67, 0x32, + 0x96, 0x35, 0x5c, 0xdb, 0xb8, 0xcb, 0x02, 0xd0, 0x30, 0x6e, 0x06, + 0x03, 0x55, 0x1d, 0x23, 0x04, 0x67, 0x30, 0x65, 0x80, 0x14, 0xf2, + 0xc0, 0x13, 0xe0, 0x82, 0x43, 0x3e, 0xfb, 0xee, 0x2f, 0x67, 0x32, + 0x96, 0x35, 0x5c, 0xdb, 0xb8, 0xcb, 0x02, 0xd0, 0xa1, 0x49, 0xa4, + 0x47, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, + 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, + 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, + 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x51, + 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, + 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x82, 0x02, 0x05, 0xc6, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x05, 0x05, 0x00, 0x30, 0x50, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, - 0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, 0x18, 0x30, 0x16, - 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0f, 0x53, 0x45, 0x43, 0x4f, - 0x4d, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, - 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1e, - 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x43, 0x6f, - 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x31, 0x30, 0x1e, 0x17, - 0x0d, 0x30, 0x33, 0x30, 0x39, 0x33, 0x30, 0x30, 0x34, 0x32, 0x30, - 0x34, 0x39, 0x5a, 0x17, 0x0d, 0x32, 0x33, 0x30, 0x39, 0x33, 0x30, - 0x30, 0x34, 0x32, 0x30, 0x34, 0x39, 0x5a, 0x30, 0x50, 0x31, 0x0b, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, 0x50, - 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0f, - 0x53, 0x45, 0x43, 0x4f, 0x4d, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, - 0x2e, 0x6e, 0x65, 0x74, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, - 0x04, 0x0b, 0x13, 0x1e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, - 0x79, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, - 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x4f, 0xad, 0xa0, + 0x2c, 0x4c, 0xfa, 0xc0, 0xf2, 0x6f, 0xf7, 0x66, 0x55, 0xab, 0x23, + 0x34, 0xee, 0xe7, 0x29, 0xda, 0xc3, 0x5b, 0xb6, 0xb0, 0x83, 0xd9, + 0xd0, 0xd0, 0xe2, 0x21, 0xfb, 0xf3, 0x60, 0xa7, 0x3b, 0x5d, 0x60, + 0x53, 0x27, 0xa2, 0x9b, 0xf6, 0x08, 0x22, 0x2a, 0xe7, 0xbf, 0xa0, + 0x72, 0xe5, 0x9c, 0x24, 0x6a, 0x31, 0xb1, 0x90, 0x7a, 0x27, 0xdb, + 0x84, 0x11, 0x89, 0x27, 0xa6, 0x77, 0x5a, 0x38, 0xd7, 0xbf, 0xac, + 0x86, 0xfc, 0xee, 0x5d, 0x83, 0xbc, 0x06, 0xc6, 0xd1, 0x77, 0x6b, + 0x0f, 0x6d, 0x24, 0x2f, 0x4b, 0x7a, 0x6c, 0xa7, 0x07, 0x96, 0xca, + 0xe3, 0x84, 0x9f, 0xad, 0x88, 0x8b, 0x1d, 0xab, 0x16, 0x8d, 0x5b, + 0x66, 0x17, 0xd9, 0x16, 0xf4, 0x8b, 0x80, 0xd2, 0xdd, 0xf8, 0xb2, + 0x76, 0xc3, 0xfc, 0x38, 0x13, 0xaa, 0x0c, 0xde, 0x42, 0x69, 0x2b, + 0x6e, 0xf3, 0x3c, 0xeb, 0x80, 0x27, 0xdb, 0xf5, 0xa6, 0x44, 0x0d, + 0x9f, 0x5a, 0x55, 0x59, 0x0b, 0xd5, 0x0d, 0x52, 0x48, 0xc5, 0xae, + 0x9f, 0xf2, 0x2f, 0x80, 0xc5, 0xea, 0x32, 0x50, 0x35, 0x12, 0x97, + 0x2e, 0xc1, 0xe1, 0xff, 0xf1, 0x23, 0x88, 0x51, 0x38, 0x9f, 0xf2, + 0x66, 0x56, 0x76, 0xe7, 0x0f, 0x51, 0x97, 0xa5, 0x52, 0x0c, 0x4d, + 0x49, 0x51, 0x95, 0x36, 0x3d, 0xbf, 0xa2, 0x4b, 0x0c, 0x10, 0x1d, + 0x86, 0x99, 0x4c, 0xaa, 0xf3, 0x72, 0x11, 0x93, 0xe4, 0xea, 0xf6, + 0x9b, 0xda, 0xa8, 0x5d, 0xa7, 0x4d, 0xb7, 0x9e, 0x02, 0xae, 0x73, + 0x00, 0xc8, 0xda, 0x23, 0x03, 0xe8, 0xf9, 0xea, 0x19, 0x74, 0x62, + 0x00, 0x94, 0xcb, 0x22, 0x20, 0xbe, 0x94, 0xa7, 0x59, 0xb5, 0x82, + 0x6a, 0xbe, 0x99, 0x79, 0x7a, 0xa9, 0xf2, 0x4a, 0x24, 0x52, 0xf7, + 0x74, 0xfd, 0xba, 0x4e, 0xe6, 0xa8, 0x1d, 0x02, 0x6e, 0xb1, 0x0d, + 0x80, 0x44, 0xc1, 0xae, 0xd3, 0x23, 0x37, 0x5f, 0xbb, 0x85, 0x7c, + 0x2b, 0x92, 0x2e, 0xe8, 0x7e, 0xa5, 0x8b, 0xdd, 0x99, 0xe1, 0xbf, + 0x27, 0x6f, 0x2d, 0x5d, 0xaa, 0x7b, 0x87, 0xfe, 0x0a, 0xdd, 0x4b, + 0xfc, 0x8e, 0xf5, 0x26, 0xe4, 0x6e, 0x70, 0x42, 0x6e, 0x33, 0xec, + 0x31, 0x9e, 0x7b, 0x93, 0xc1, 0xe4, 0xc9, 0x69, 0x1a, 0x3d, 0xc0, + 0x6b, 0x4e, 0x22, 0x6d, 0xee, 0xab, 0x58, 0x4d, 0xc6, 0xd0, 0x41, + 0xc1, 0x2b, 0xea, 0x4f, 0x12, 0x87, 0x5e, 0xeb, 0x45, 0xd8, 0x6c, + 0xf5, 0x98, 0x02, 0xd3, 0xa0, 0xd8, 0x55, 0x8a, 0x06, 0x99, 0x19, + 0xa2, 0xa0, 0x77, 0xd1, 0x30, 0x9e, 0xac, 0xcc, 0x75, 0xee, 0x83, + 0xf5, 0xb0, 0x62, 0x39, 0xcf, 0x6c, 0x57, 0xe2, 0x4c, 0xd2, 0x91, + 0x0b, 0x0e, 0x75, 0x28, 0x1b, 0x9a, 0xbf, 0xfd, 0x1a, 0x43, 0xf1, + 0xca, 0x77, 0xfb, 0x3b, 0x8f, 0x61, 0xb8, 0x69, 0x28, 0x16, 0x42, + 0x04, 0x5e, 0x70, 0x2a, 0x1c, 0x21, 0xd8, 0x8f, 0xe1, 0xbd, 0x23, + 0x5b, 0x2d, 0x74, 0x40, 0x92, 0xd9, 0x63, 0x19, 0x0d, 0x73, 0xdd, + 0x69, 0xbc, 0x62, 0x47, 0xbc, 0xe0, 0x74, 0x2b, 0xb2, 0xeb, 0x7d, + 0xbe, 0x41, 0x1b, 0xb5, 0xc0, 0x46, 0xc5, 0xa1, 0x22, 0xcb, 0x5f, + 0x4e, 0xc1, 0x28, 0x92, 0xde, 0x18, 0xba, 0xd5, 0x2a, 0x28, 0xbb, + 0x11, 0x8b, 0x17, 0x93, 0x98, 0x99, 0x60, 0x94, 0x5c, 0x23, 0xcf, + 0x5a, 0x27, 0x97, 0x5e, 0x0b, 0x05, 0x06, 0x93, 0x37, 0x1e, 0x3b, + 0x69, 0x36, 0xeb, 0xa9, 0x9e, 0x61, 0x1d, 0x8f, 0x32, 0xda, 0x8e, + 0x0c, 0xd6, 0x74, 0x3e, 0x7b, 0x09, 0x24, 0xda, 0x01, 0x77, 0x47, + 0xc4, 0x3b, 0xcd, 0x34, 0x8c, 0x99, 0xf5, 0xca, 0xe1, 0x25, 0x61, + 0x33, 0xb2, 0x59, 0x1b, 0xe2, 0x6e, 0xd7, 0x37, 0x57, 0xb6, 0x0d, + 0xa9, 0x12, 0xda, 0x30, 0x82, 0x03, 0x5a, 0x30, 0x82, 0x02, 0x42, + 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x30, 0x50, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, + 0x55, 0x04, 0x0a, 0x13, 0x0f, 0x53, 0x45, 0x43, 0x4f, 0x4d, 0x20, + 0x54, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x31, 0x27, + 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1e, 0x53, 0x65, + 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x43, 0x6f, 0x6d, 0x6d, + 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x52, + 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x30, + 0x33, 0x30, 0x39, 0x33, 0x30, 0x30, 0x34, 0x32, 0x30, 0x34, 0x39, + 0x5a, 0x17, 0x0d, 0x32, 0x33, 0x30, 0x39, 0x33, 0x30, 0x30, 0x34, + 0x32, 0x30, 0x34, 0x39, 0x5a, 0x30, 0x50, 0x31, 0x0b, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, 0x18, + 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0f, 0x53, 0x45, + 0x43, 0x4f, 0x4d, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, + 0x65, 0x74, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, + 0x13, 0x1e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, + 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x31, 0x30, + 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, + 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb3, + 0xb3, 0xfe, 0x7f, 0xd3, 0x6d, 0xb1, 0xef, 0x16, 0x7c, 0x57, 0xa5, + 0x0c, 0x6d, 0x76, 0x8a, 0x2f, 0x4b, 0xbf, 0x64, 0xfb, 0x4c, 0xee, + 0x8a, 0xf0, 0xf3, 0x29, 0x7c, 0xf5, 0xff, 0xee, 0x2a, 0xe0, 0xe9, + 0xe9, 0xba, 0x5b, 0x64, 0x22, 0x9a, 0x9a, 0x6f, 0x2c, 0x3a, 0x26, + 0x69, 0x51, 0x05, 0x99, 0x26, 0xdc, 0xd5, 0x1c, 0x6a, 0x71, 0xc6, + 0x9a, 0x7d, 0x1e, 0x9d, 0xdd, 0x7c, 0x6c, 0xc6, 0x8c, 0x67, 0x67, + 0x4a, 0x3e, 0xf8, 0x71, 0xb0, 0x19, 0x27, 0xa9, 0x09, 0x0c, 0xa6, + 0x95, 0xbf, 0x4b, 0x8c, 0x0c, 0xfa, 0x55, 0x98, 0x3b, 0xd8, 0xe8, + 0x22, 0xa1, 0x4b, 0x71, 0x38, 0x79, 0xac, 0x97, 0x92, 0x69, 0xb3, + 0x89, 0x7e, 0xea, 0x21, 0x68, 0x06, 0x98, 0x14, 0x96, 0x87, 0xd2, + 0x61, 0x36, 0xbc, 0x6d, 0x27, 0x56, 0x9e, 0x57, 0xee, 0xc0, 0xc0, + 0x56, 0xfd, 0x32, 0xcf, 0xa4, 0xd9, 0x8e, 0xc2, 0x23, 0xd7, 0x8d, + 0xa8, 0xf3, 0xd8, 0x25, 0xac, 0x97, 0xe4, 0x70, 0x38, 0xf4, 0xb6, + 0x3a, 0xb4, 0x9d, 0x3b, 0x97, 0x26, 0x43, 0xa3, 0xa1, 0xbc, 0x49, + 0x59, 0x72, 0x4c, 0x23, 0x30, 0x87, 0x01, 0x58, 0xf6, 0x4e, 0xbe, + 0x1c, 0x68, 0x56, 0x66, 0xaf, 0xcd, 0x41, 0x5d, 0xc8, 0xb3, 0x4d, + 0x2a, 0x55, 0x46, 0xab, 0x1f, 0xda, 0x1e, 0xe2, 0x40, 0x3d, 0xdb, + 0xcd, 0x7d, 0xb9, 0x92, 0x80, 0x9c, 0x37, 0xdd, 0x0c, 0x96, 0x64, + 0x9d, 0xdc, 0x22, 0xf7, 0x64, 0x8b, 0xdf, 0x61, 0xde, 0x15, 0x94, + 0x52, 0x15, 0xa0, 0x7d, 0x52, 0xc9, 0x4b, 0xa8, 0x21, 0xc9, 0xc6, + 0xb1, 0xed, 0xcb, 0xc3, 0x95, 0x60, 0xd1, 0x0f, 0xf0, 0xab, 0x70, + 0xf8, 0xdf, 0xcb, 0x4d, 0x7e, 0xec, 0xd6, 0xfa, 0xab, 0xd9, 0xbd, + 0x7f, 0x54, 0xf2, 0xa5, 0xe9, 0x79, 0xfa, 0xd9, 0xd6, 0x76, 0x24, + 0x28, 0x73, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x3f, 0x30, 0x3d, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0xa0, 0x73, 0x49, 0x99, 0x68, 0xdc, 0x85, 0x5b, 0x65, 0xe3, 0x9b, + 0x28, 0x2f, 0x57, 0x9f, 0xbd, 0x33, 0xbc, 0x07, 0x48, 0x30, 0x0b, + 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, + 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x01, 0x00, 0x68, 0x40, 0xa9, 0xa8, 0xbb, 0xe4, 0x4f, + 0x5d, 0x79, 0xb3, 0x05, 0xb5, 0x17, 0xb3, 0x60, 0x13, 0xeb, 0xc6, + 0x92, 0x5d, 0xe0, 0xd1, 0xd3, 0x6a, 0xfe, 0xfb, 0xbe, 0x9b, 0x6d, + 0xbf, 0xc7, 0x05, 0x6d, 0x59, 0x20, 0xc4, 0x1c, 0xf0, 0xb7, 0xda, + 0x84, 0x58, 0x02, 0x63, 0xfa, 0x48, 0x16, 0xef, 0x4f, 0xa5, 0x0b, + 0xf7, 0x4a, 0x98, 0xf2, 0x3f, 0x9e, 0x1b, 0xad, 0x47, 0x6b, 0x63, + 0xce, 0x08, 0x47, 0xeb, 0x52, 0x3f, 0x78, 0x9c, 0xaf, 0x4d, 0xae, + 0xf8, 0xd5, 0x4f, 0xcf, 0x9a, 0x98, 0x2a, 0x10, 0x41, 0x39, 0x52, + 0xc4, 0xdd, 0xd9, 0x9b, 0x0e, 0xef, 0x93, 0x01, 0xae, 0xb2, 0x2e, + 0xca, 0x68, 0x42, 0x24, 0x42, 0x6c, 0xb0, 0xb3, 0x3a, 0x3e, 0xcd, + 0xe9, 0xda, 0x48, 0xc4, 0x15, 0xcb, 0xe9, 0xf9, 0x07, 0x0f, 0x92, + 0x50, 0x49, 0x8a, 0xdd, 0x31, 0x97, 0x5f, 0xc9, 0xe9, 0x37, 0xaa, + 0x3b, 0x59, 0x65, 0x97, 0x94, 0x32, 0xc9, 0xb3, 0x9f, 0x3e, 0x3a, + 0x62, 0x58, 0xc5, 0x49, 0xad, 0x62, 0x0e, 0x71, 0xa5, 0x32, 0xaa, + 0x2f, 0xc6, 0x89, 0x76, 0x43, 0x40, 0x13, 0x13, 0x67, 0x3d, 0xa2, + 0x54, 0x25, 0x10, 0xcb, 0xf1, 0x3a, 0xf2, 0xd9, 0xfa, 0xdb, 0x49, + 0x56, 0xbb, 0xa6, 0xfe, 0xa7, 0x41, 0x35, 0xc3, 0xe0, 0x88, 0x61, + 0xc9, 0x88, 0xc7, 0xdf, 0x36, 0x10, 0x22, 0x98, 0x59, 0xea, 0xb0, + 0x4a, 0xfb, 0x56, 0x16, 0x73, 0x6e, 0xac, 0x4d, 0xf7, 0x22, 0xa1, + 0x4f, 0xad, 0x1d, 0x7a, 0x2d, 0x45, 0x27, 0xe5, 0x30, 0xc1, 0x5e, + 0xf2, 0xda, 0x13, 0xcb, 0x25, 0x42, 0x51, 0x95, 0x47, 0x03, 0x8c, + 0x6c, 0x21, 0xcc, 0x74, 0x42, 0xed, 0x53, 0xff, 0x33, 0x8b, 0x8f, + 0x0f, 0x57, 0x01, 0x16, 0x2f, 0xcf, 0xa6, 0xee, 0xc9, 0x70, 0x22, + 0x14, 0xbd, 0xfd, 0xbe, 0x6c, 0x0b, 0x03, 0x30, 0x82, 0x03, 0x20, + 0x30, 0x82, 0x02, 0x08, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, + 0x1d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x39, 0x31, 0x0b, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x46, 0x49, 0x31, 0x0f, + 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x06, 0x53, 0x6f, + 0x6e, 0x65, 0x72, 0x61, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x10, 0x53, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x20, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x32, 0x20, 0x43, 0x41, 0x30, 0x1e, + 0x17, 0x0d, 0x30, 0x31, 0x30, 0x34, 0x30, 0x36, 0x30, 0x37, 0x32, + 0x39, 0x34, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x31, 0x30, 0x34, 0x30, + 0x36, 0x30, 0x37, 0x32, 0x39, 0x34, 0x30, 0x5a, 0x30, 0x39, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x46, + 0x49, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x06, 0x53, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x31, 0x19, 0x30, 0x17, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x53, 0x6f, 0x6e, 0x65, + 0x72, 0x61, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x32, 0x20, 0x43, + 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, - 0x00, 0xb3, 0xb3, 0xfe, 0x7f, 0xd3, 0x6d, 0xb1, 0xef, 0x16, 0x7c, - 0x57, 0xa5, 0x0c, 0x6d, 0x76, 0x8a, 0x2f, 0x4b, 0xbf, 0x64, 0xfb, - 0x4c, 0xee, 0x8a, 0xf0, 0xf3, 0x29, 0x7c, 0xf5, 0xff, 0xee, 0x2a, - 0xe0, 0xe9, 0xe9, 0xba, 0x5b, 0x64, 0x22, 0x9a, 0x9a, 0x6f, 0x2c, - 0x3a, 0x26, 0x69, 0x51, 0x05, 0x99, 0x26, 0xdc, 0xd5, 0x1c, 0x6a, - 0x71, 0xc6, 0x9a, 0x7d, 0x1e, 0x9d, 0xdd, 0x7c, 0x6c, 0xc6, 0x8c, - 0x67, 0x67, 0x4a, 0x3e, 0xf8, 0x71, 0xb0, 0x19, 0x27, 0xa9, 0x09, - 0x0c, 0xa6, 0x95, 0xbf, 0x4b, 0x8c, 0x0c, 0xfa, 0x55, 0x98, 0x3b, - 0xd8, 0xe8, 0x22, 0xa1, 0x4b, 0x71, 0x38, 0x79, 0xac, 0x97, 0x92, - 0x69, 0xb3, 0x89, 0x7e, 0xea, 0x21, 0x68, 0x06, 0x98, 0x14, 0x96, - 0x87, 0xd2, 0x61, 0x36, 0xbc, 0x6d, 0x27, 0x56, 0x9e, 0x57, 0xee, - 0xc0, 0xc0, 0x56, 0xfd, 0x32, 0xcf, 0xa4, 0xd9, 0x8e, 0xc2, 0x23, - 0xd7, 0x8d, 0xa8, 0xf3, 0xd8, 0x25, 0xac, 0x97, 0xe4, 0x70, 0x38, - 0xf4, 0xb6, 0x3a, 0xb4, 0x9d, 0x3b, 0x97, 0x26, 0x43, 0xa3, 0xa1, - 0xbc, 0x49, 0x59, 0x72, 0x4c, 0x23, 0x30, 0x87, 0x01, 0x58, 0xf6, - 0x4e, 0xbe, 0x1c, 0x68, 0x56, 0x66, 0xaf, 0xcd, 0x41, 0x5d, 0xc8, - 0xb3, 0x4d, 0x2a, 0x55, 0x46, 0xab, 0x1f, 0xda, 0x1e, 0xe2, 0x40, - 0x3d, 0xdb, 0xcd, 0x7d, 0xb9, 0x92, 0x80, 0x9c, 0x37, 0xdd, 0x0c, - 0x96, 0x64, 0x9d, 0xdc, 0x22, 0xf7, 0x64, 0x8b, 0xdf, 0x61, 0xde, - 0x15, 0x94, 0x52, 0x15, 0xa0, 0x7d, 0x52, 0xc9, 0x4b, 0xa8, 0x21, - 0xc9, 0xc6, 0xb1, 0xed, 0xcb, 0xc3, 0x95, 0x60, 0xd1, 0x0f, 0xf0, - 0xab, 0x70, 0xf8, 0xdf, 0xcb, 0x4d, 0x7e, 0xec, 0xd6, 0xfa, 0xab, - 0xd9, 0xbd, 0x7f, 0x54, 0xf2, 0xa5, 0xe9, 0x79, 0xfa, 0xd9, 0xd6, - 0x76, 0x24, 0x28, 0x73, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x3f, - 0x30, 0x3d, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, - 0x04, 0x14, 0xa0, 0x73, 0x49, 0x99, 0x68, 0xdc, 0x85, 0x5b, 0x65, - 0xe3, 0x9b, 0x28, 0x2f, 0x57, 0x9f, 0xbd, 0x33, 0xbc, 0x07, 0x48, - 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, - 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, - 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, - 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x68, 0x40, 0xa9, 0xa8, 0xbb, - 0xe4, 0x4f, 0x5d, 0x79, 0xb3, 0x05, 0xb5, 0x17, 0xb3, 0x60, 0x13, - 0xeb, 0xc6, 0x92, 0x5d, 0xe0, 0xd1, 0xd3, 0x6a, 0xfe, 0xfb, 0xbe, - 0x9b, 0x6d, 0xbf, 0xc7, 0x05, 0x6d, 0x59, 0x20, 0xc4, 0x1c, 0xf0, - 0xb7, 0xda, 0x84, 0x58, 0x02, 0x63, 0xfa, 0x48, 0x16, 0xef, 0x4f, - 0xa5, 0x0b, 0xf7, 0x4a, 0x98, 0xf2, 0x3f, 0x9e, 0x1b, 0xad, 0x47, - 0x6b, 0x63, 0xce, 0x08, 0x47, 0xeb, 0x52, 0x3f, 0x78, 0x9c, 0xaf, - 0x4d, 0xae, 0xf8, 0xd5, 0x4f, 0xcf, 0x9a, 0x98, 0x2a, 0x10, 0x41, - 0x39, 0x52, 0xc4, 0xdd, 0xd9, 0x9b, 0x0e, 0xef, 0x93, 0x01, 0xae, - 0xb2, 0x2e, 0xca, 0x68, 0x42, 0x24, 0x42, 0x6c, 0xb0, 0xb3, 0x3a, - 0x3e, 0xcd, 0xe9, 0xda, 0x48, 0xc4, 0x15, 0xcb, 0xe9, 0xf9, 0x07, - 0x0f, 0x92, 0x50, 0x49, 0x8a, 0xdd, 0x31, 0x97, 0x5f, 0xc9, 0xe9, - 0x37, 0xaa, 0x3b, 0x59, 0x65, 0x97, 0x94, 0x32, 0xc9, 0xb3, 0x9f, - 0x3e, 0x3a, 0x62, 0x58, 0xc5, 0x49, 0xad, 0x62, 0x0e, 0x71, 0xa5, - 0x32, 0xaa, 0x2f, 0xc6, 0x89, 0x76, 0x43, 0x40, 0x13, 0x13, 0x67, - 0x3d, 0xa2, 0x54, 0x25, 0x10, 0xcb, 0xf1, 0x3a, 0xf2, 0xd9, 0xfa, - 0xdb, 0x49, 0x56, 0xbb, 0xa6, 0xfe, 0xa7, 0x41, 0x35, 0xc3, 0xe0, - 0x88, 0x61, 0xc9, 0x88, 0xc7, 0xdf, 0x36, 0x10, 0x22, 0x98, 0x59, - 0xea, 0xb0, 0x4a, 0xfb, 0x56, 0x16, 0x73, 0x6e, 0xac, 0x4d, 0xf7, - 0x22, 0xa1, 0x4f, 0xad, 0x1d, 0x7a, 0x2d, 0x45, 0x27, 0xe5, 0x30, - 0xc1, 0x5e, 0xf2, 0xda, 0x13, 0xcb, 0x25, 0x42, 0x51, 0x95, 0x47, - 0x03, 0x8c, 0x6c, 0x21, 0xcc, 0x74, 0x42, 0xed, 0x53, 0xff, 0x33, - 0x8b, 0x8f, 0x0f, 0x57, 0x01, 0x16, 0x2f, 0xcf, 0xa6, 0xee, 0xc9, - 0x70, 0x22, 0x14, 0xbd, 0xfd, 0xbe, 0x6c, 0x0b, 0x03, 0x30, 0x82, - 0x03, 0x20, 0x30, 0x82, 0x02, 0x08, 0xa0, 0x03, 0x02, 0x01, 0x02, - 0x02, 0x01, 0x1d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x39, 0x31, 0x0b, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x46, 0x49, - 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x06, - 0x53, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x31, 0x19, 0x30, 0x17, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x53, 0x6f, 0x6e, 0x65, 0x72, - 0x61, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x32, 0x20, 0x43, 0x41, - 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x31, 0x30, 0x34, 0x30, 0x36, 0x30, - 0x37, 0x32, 0x39, 0x34, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x31, 0x30, - 0x34, 0x30, 0x36, 0x30, 0x37, 0x32, 0x39, 0x34, 0x30, 0x5a, 0x30, - 0x39, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, - 0x02, 0x46, 0x49, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x06, 0x53, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x31, 0x19, - 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x53, 0x6f, - 0x6e, 0x65, 0x72, 0x61, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x32, - 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, - 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, - 0x01, 0x01, 0x00, 0x90, 0x17, 0x4a, 0x35, 0x9d, 0xca, 0xf0, 0x0d, - 0x96, 0xc7, 0x44, 0xfa, 0x16, 0x37, 0xfc, 0x48, 0xbd, 0xbd, 0x7f, - 0x80, 0x2d, 0x35, 0x3b, 0xe1, 0x6f, 0xa8, 0x67, 0xa9, 0xbf, 0x03, - 0x1c, 0x4d, 0x8c, 0x6f, 0x32, 0x47, 0xd5, 0x41, 0x68, 0xa4, 0x13, - 0x04, 0xc1, 0x35, 0x0c, 0x9a, 0x84, 0x43, 0xfc, 0x5c, 0x1d, 0xff, - 0x89, 0xb3, 0xe8, 0x17, 0x18, 0xcd, 0x91, 0x5f, 0xfb, 0x89, 0xe3, - 0xea, 0xbf, 0x4e, 0x5d, 0x7c, 0x1b, 0x26, 0xd3, 0x75, 0x79, 0xed, - 0xe6, 0x84, 0xe3, 0x57, 0xe5, 0xad, 0x29, 0xc4, 0xf4, 0x3a, 0x28, - 0xe7, 0xa5, 0x7b, 0x84, 0x36, 0x69, 0xb3, 0xfd, 0x5e, 0x76, 0xbd, - 0xa3, 0x2d, 0x99, 0xd3, 0x90, 0x4e, 0x23, 0x28, 0x7d, 0x18, 0x63, - 0xf1, 0x54, 0x3b, 0x26, 0x9d, 0x76, 0x5b, 0x97, 0x42, 0xb2, 0xff, - 0xae, 0xf0, 0x4e, 0xec, 0xdd, 0x39, 0x95, 0x4e, 0x83, 0x06, 0x7f, - 0xe7, 0x49, 0x40, 0xc8, 0xc5, 0x01, 0xb2, 0x54, 0x5a, 0x66, 0x1d, - 0x3d, 0xfc, 0xf9, 0xe9, 0x3c, 0x0a, 0x9e, 0x81, 0xb8, 0x70, 0xf0, - 0x01, 0x8b, 0xe4, 0x23, 0x54, 0x7c, 0xc8, 0xae, 0xf8, 0x90, 0x1e, - 0x00, 0x96, 0x72, 0xd4, 0x54, 0xcf, 0x61, 0x23, 0xbc, 0xea, 0xfb, - 0x9d, 0x02, 0x95, 0xd1, 0xb6, 0xb9, 0x71, 0x3a, 0x69, 0x08, 0x3f, - 0x0f, 0xb4, 0xe1, 0x42, 0xc7, 0x88, 0xf5, 0x3f, 0x98, 0xa8, 0xa7, - 0xba, 0x1c, 0xe0, 0x71, 0x71, 0xef, 0x58, 0x57, 0x81, 0x50, 0x7a, - 0x5c, 0x6b, 0x74, 0x46, 0x0e, 0x83, 0x03, 0x98, 0xc3, 0x8e, 0xa8, - 0x6e, 0xf2, 0x76, 0x32, 0x6e, 0x27, 0x83, 0xc2, 0x73, 0xf3, 0xdc, - 0x18, 0xe8, 0xb4, 0x93, 0xea, 0x75, 0x44, 0x6b, 0x04, 0x60, 0x20, - 0x71, 0x57, 0x87, 0x9d, 0xf3, 0xbe, 0xa0, 0x90, 0x23, 0x3d, 0x8a, - 0x24, 0xe1, 0xda, 0x21, 0xdb, 0xc3, 0x02, 0x03, 0x01, 0x00, 0x01, - 0xa3, 0x33, 0x30, 0x31, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, - 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, - 0x11, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x0a, 0x04, 0x08, 0x4a, - 0xa0, 0xaa, 0x58, 0x84, 0xd3, 0x5e, 0x3c, 0x30, 0x0b, 0x06, 0x03, - 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, - 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x5a, 0xce, 0x87, 0xf9, - 0x16, 0x72, 0x15, 0x57, 0x4b, 0x1d, 0xd9, 0x9b, 0xe7, 0xa2, 0x26, - 0x30, 0xec, 0x93, 0x67, 0xdf, 0xd6, 0x2d, 0xd2, 0x34, 0xaf, 0xf7, - 0x38, 0xa5, 0xce, 0xab, 0x16, 0xb9, 0xab, 0x2f, 0x7c, 0x35, 0xcb, - 0xac, 0xd0, 0x0f, 0xb4, 0x4c, 0x2b, 0xfc, 0x80, 0xef, 0x6b, 0x8c, - 0x91, 0x5f, 0x36, 0x76, 0xf7, 0xdb, 0xb3, 0x1b, 0x19, 0xea, 0xf4, - 0xb2, 0x11, 0xfd, 0x61, 0x71, 0x44, 0xbf, 0x28, 0xb3, 0x3a, 0x1d, - 0xbf, 0xb3, 0x43, 0xe8, 0x9f, 0xbf, 0xdc, 0x31, 0x08, 0x71, 0xb0, - 0x9d, 0x8d, 0xd6, 0x34, 0x47, 0x32, 0x90, 0xc6, 0x65, 0x24, 0xf7, - 0xa0, 0x4a, 0x7c, 0x04, 0x73, 0x8f, 0x39, 0x6f, 0x17, 0x8c, 0x72, - 0xb5, 0xbd, 0x4b, 0xc8, 0x7a, 0xf8, 0x7b, 0x83, 0xc3, 0x28, 0x4e, - 0x9c, 0x09, 0xea, 0x67, 0x3f, 0xb2, 0x67, 0x04, 0x1b, 0xc3, 0x14, - 0xda, 0xf8, 0xe7, 0x49, 0x24, 0x91, 0xd0, 0x1d, 0x6a, 0xfa, 0x61, - 0x39, 0xef, 0x6b, 0xe7, 0x21, 0x75, 0x06, 0x07, 0xd8, 0x12, 0xb4, - 0x21, 0x20, 0x70, 0x42, 0x71, 0x81, 0xda, 0x3c, 0x9a, 0x36, 0xbe, - 0xa6, 0x5b, 0x0d, 0x6a, 0x6c, 0x9a, 0x1f, 0x91, 0x7b, 0xf9, 0xf9, - 0xef, 0x42, 0xba, 0x4e, 0x4e, 0x9e, 0xcc, 0x0c, 0x8d, 0x94, 0xdc, - 0xd9, 0x45, 0x9c, 0x5e, 0xec, 0x42, 0x50, 0x63, 0xae, 0xf4, 0x5d, - 0xc4, 0xb1, 0x12, 0xdc, 0xca, 0x3b, 0xa8, 0x2e, 0x9d, 0x14, 0x5a, - 0x05, 0x75, 0xb7, 0xec, 0xd7, 0x63, 0xe2, 0xba, 0x35, 0xb6, 0x04, - 0x08, 0x91, 0xe8, 0xda, 0x9d, 0x9c, 0xf6, 0x66, 0xb5, 0x18, 0xac, - 0x0a, 0xa6, 0x54, 0x26, 0x34, 0x33, 0xd2, 0x1b, 0xc1, 0xd4, 0x7f, - 0x1a, 0x3a, 0x8e, 0x0b, 0xaa, 0x32, 0x6e, 0xdb, 0xfc, 0x4f, 0x25, - 0x9f, 0xd9, 0x32, 0xc7, 0x96, 0x5a, 0x70, 0xac, 0xdf, 0x4c, 0x30, - 0x82, 0x03, 0xba, 0x30, 0x82, 0x02, 0xa2, 0xa0, 0x03, 0x02, 0x01, - 0x02, 0x02, 0x04, 0x00, 0x98, 0x96, 0x8a, 0x30, 0x0d, 0x06, 0x09, + 0x00, 0x90, 0x17, 0x4a, 0x35, 0x9d, 0xca, 0xf0, 0x0d, 0x96, 0xc7, + 0x44, 0xfa, 0x16, 0x37, 0xfc, 0x48, 0xbd, 0xbd, 0x7f, 0x80, 0x2d, + 0x35, 0x3b, 0xe1, 0x6f, 0xa8, 0x67, 0xa9, 0xbf, 0x03, 0x1c, 0x4d, + 0x8c, 0x6f, 0x32, 0x47, 0xd5, 0x41, 0x68, 0xa4, 0x13, 0x04, 0xc1, + 0x35, 0x0c, 0x9a, 0x84, 0x43, 0xfc, 0x5c, 0x1d, 0xff, 0x89, 0xb3, + 0xe8, 0x17, 0x18, 0xcd, 0x91, 0x5f, 0xfb, 0x89, 0xe3, 0xea, 0xbf, + 0x4e, 0x5d, 0x7c, 0x1b, 0x26, 0xd3, 0x75, 0x79, 0xed, 0xe6, 0x84, + 0xe3, 0x57, 0xe5, 0xad, 0x29, 0xc4, 0xf4, 0x3a, 0x28, 0xe7, 0xa5, + 0x7b, 0x84, 0x36, 0x69, 0xb3, 0xfd, 0x5e, 0x76, 0xbd, 0xa3, 0x2d, + 0x99, 0xd3, 0x90, 0x4e, 0x23, 0x28, 0x7d, 0x18, 0x63, 0xf1, 0x54, + 0x3b, 0x26, 0x9d, 0x76, 0x5b, 0x97, 0x42, 0xb2, 0xff, 0xae, 0xf0, + 0x4e, 0xec, 0xdd, 0x39, 0x95, 0x4e, 0x83, 0x06, 0x7f, 0xe7, 0x49, + 0x40, 0xc8, 0xc5, 0x01, 0xb2, 0x54, 0x5a, 0x66, 0x1d, 0x3d, 0xfc, + 0xf9, 0xe9, 0x3c, 0x0a, 0x9e, 0x81, 0xb8, 0x70, 0xf0, 0x01, 0x8b, + 0xe4, 0x23, 0x54, 0x7c, 0xc8, 0xae, 0xf8, 0x90, 0x1e, 0x00, 0x96, + 0x72, 0xd4, 0x54, 0xcf, 0x61, 0x23, 0xbc, 0xea, 0xfb, 0x9d, 0x02, + 0x95, 0xd1, 0xb6, 0xb9, 0x71, 0x3a, 0x69, 0x08, 0x3f, 0x0f, 0xb4, + 0xe1, 0x42, 0xc7, 0x88, 0xf5, 0x3f, 0x98, 0xa8, 0xa7, 0xba, 0x1c, + 0xe0, 0x71, 0x71, 0xef, 0x58, 0x57, 0x81, 0x50, 0x7a, 0x5c, 0x6b, + 0x74, 0x46, 0x0e, 0x83, 0x03, 0x98, 0xc3, 0x8e, 0xa8, 0x6e, 0xf2, + 0x76, 0x32, 0x6e, 0x27, 0x83, 0xc2, 0x73, 0xf3, 0xdc, 0x18, 0xe8, + 0xb4, 0x93, 0xea, 0x75, 0x44, 0x6b, 0x04, 0x60, 0x20, 0x71, 0x57, + 0x87, 0x9d, 0xf3, 0xbe, 0xa0, 0x90, 0x23, 0x3d, 0x8a, 0x24, 0xe1, + 0xda, 0x21, 0xdb, 0xc3, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x33, + 0x30, 0x31, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, + 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x11, 0x06, + 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x0a, 0x04, 0x08, 0x4a, 0xa0, 0xaa, + 0x58, 0x84, 0xd3, 0x5e, 0x3c, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, + 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, - 0x30, 0x55, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x13, 0x15, 0x53, 0x74, 0x61, 0x61, 0x74, 0x20, 0x64, - 0x65, 0x72, 0x20, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, - 0x64, 0x65, 0x6e, 0x31, 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x13, 0x1d, 0x53, 0x74, 0x61, 0x61, 0x74, 0x20, 0x64, 0x65, - 0x72, 0x20, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, - 0x65, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, - 0x1e, 0x17, 0x0d, 0x30, 0x32, 0x31, 0x32, 0x31, 0x37, 0x30, 0x39, - 0x32, 0x33, 0x34, 0x39, 0x5a, 0x17, 0x0d, 0x31, 0x35, 0x31, 0x32, - 0x31, 0x36, 0x30, 0x39, 0x31, 0x35, 0x33, 0x38, 0x5a, 0x30, 0x55, + 0x03, 0x82, 0x01, 0x01, 0x00, 0x5a, 0xce, 0x87, 0xf9, 0x16, 0x72, + 0x15, 0x57, 0x4b, 0x1d, 0xd9, 0x9b, 0xe7, 0xa2, 0x26, 0x30, 0xec, + 0x93, 0x67, 0xdf, 0xd6, 0x2d, 0xd2, 0x34, 0xaf, 0xf7, 0x38, 0xa5, + 0xce, 0xab, 0x16, 0xb9, 0xab, 0x2f, 0x7c, 0x35, 0xcb, 0xac, 0xd0, + 0x0f, 0xb4, 0x4c, 0x2b, 0xfc, 0x80, 0xef, 0x6b, 0x8c, 0x91, 0x5f, + 0x36, 0x76, 0xf7, 0xdb, 0xb3, 0x1b, 0x19, 0xea, 0xf4, 0xb2, 0x11, + 0xfd, 0x61, 0x71, 0x44, 0xbf, 0x28, 0xb3, 0x3a, 0x1d, 0xbf, 0xb3, + 0x43, 0xe8, 0x9f, 0xbf, 0xdc, 0x31, 0x08, 0x71, 0xb0, 0x9d, 0x8d, + 0xd6, 0x34, 0x47, 0x32, 0x90, 0xc6, 0x65, 0x24, 0xf7, 0xa0, 0x4a, + 0x7c, 0x04, 0x73, 0x8f, 0x39, 0x6f, 0x17, 0x8c, 0x72, 0xb5, 0xbd, + 0x4b, 0xc8, 0x7a, 0xf8, 0x7b, 0x83, 0xc3, 0x28, 0x4e, 0x9c, 0x09, + 0xea, 0x67, 0x3f, 0xb2, 0x67, 0x04, 0x1b, 0xc3, 0x14, 0xda, 0xf8, + 0xe7, 0x49, 0x24, 0x91, 0xd0, 0x1d, 0x6a, 0xfa, 0x61, 0x39, 0xef, + 0x6b, 0xe7, 0x21, 0x75, 0x06, 0x07, 0xd8, 0x12, 0xb4, 0x21, 0x20, + 0x70, 0x42, 0x71, 0x81, 0xda, 0x3c, 0x9a, 0x36, 0xbe, 0xa6, 0x5b, + 0x0d, 0x6a, 0x6c, 0x9a, 0x1f, 0x91, 0x7b, 0xf9, 0xf9, 0xef, 0x42, + 0xba, 0x4e, 0x4e, 0x9e, 0xcc, 0x0c, 0x8d, 0x94, 0xdc, 0xd9, 0x45, + 0x9c, 0x5e, 0xec, 0x42, 0x50, 0x63, 0xae, 0xf4, 0x5d, 0xc4, 0xb1, + 0x12, 0xdc, 0xca, 0x3b, 0xa8, 0x2e, 0x9d, 0x14, 0x5a, 0x05, 0x75, + 0xb7, 0xec, 0xd7, 0x63, 0xe2, 0xba, 0x35, 0xb6, 0x04, 0x08, 0x91, + 0xe8, 0xda, 0x9d, 0x9c, 0xf6, 0x66, 0xb5, 0x18, 0xac, 0x0a, 0xa6, + 0x54, 0x26, 0x34, 0x33, 0xd2, 0x1b, 0xc1, 0xd4, 0x7f, 0x1a, 0x3a, + 0x8e, 0x0b, 0xaa, 0x32, 0x6e, 0xdb, 0xfc, 0x4f, 0x25, 0x9f, 0xd9, + 0x32, 0xc7, 0x96, 0x5a, 0x70, 0xac, 0xdf, 0x4c, 0x30, 0x82, 0x03, + 0xba, 0x30, 0x82, 0x02, 0xa2, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, + 0x04, 0x00, 0x98, 0x96, 0x8a, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x55, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x53, 0x74, 0x61, 0x61, 0x74, 0x20, 0x64, 0x65, 0x72, @@ -3856,293 +2702,104 @@ static const unsigned char ca_bundle_data[] = { 0x6e, 0x31, 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1d, 0x53, 0x74, 0x61, 0x61, 0x74, 0x20, 0x64, 0x65, 0x72, 0x20, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x65, 0x6e, - 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, - 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, - 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0x98, 0xd2, 0xb5, - 0x51, 0x11, 0x7a, 0x81, 0xa6, 0x14, 0x98, 0x71, 0x6d, 0xbe, 0xcc, - 0xe7, 0x13, 0x1b, 0xd6, 0x27, 0x0e, 0x7a, 0xb3, 0x6a, 0x18, 0x1c, - 0xb6, 0x61, 0x5a, 0xd5, 0x61, 0x09, 0xbf, 0xde, 0x90, 0x13, 0xc7, - 0x67, 0xee, 0xdd, 0xf3, 0xda, 0xc5, 0x0c, 0x12, 0x9e, 0x35, 0x55, - 0x3e, 0x2c, 0x27, 0x88, 0x40, 0x6b, 0xf7, 0xdc, 0xdd, 0x22, 0x61, - 0xf5, 0xc2, 0xc7, 0x0e, 0xf5, 0xf6, 0xd5, 0x76, 0x53, 0x4d, 0x8f, - 0x8c, 0xbc, 0x18, 0x76, 0x37, 0x85, 0x9d, 0xe8, 0xca, 0x49, 0xc7, - 0xd2, 0x4f, 0x98, 0x13, 0x09, 0xa2, 0x3e, 0x22, 0x88, 0x9c, 0x7f, - 0xd6, 0xf2, 0x10, 0x65, 0xb4, 0xee, 0x5f, 0x18, 0xd5, 0x17, 0xe3, - 0xf8, 0xc5, 0xfd, 0xe2, 0x9d, 0xa2, 0xef, 0x53, 0x0e, 0x85, 0x77, - 0xa2, 0x0f, 0xe1, 0x30, 0x47, 0xee, 0x00, 0xe7, 0x33, 0x7d, 0x44, - 0x67, 0x1a, 0x0b, 0x51, 0xe8, 0x8b, 0xa0, 0x9e, 0x50, 0x98, 0x68, - 0x34, 0x52, 0x1f, 0x2e, 0x6d, 0x01, 0xf2, 0x60, 0x45, 0xf2, 0x31, - 0xeb, 0xa9, 0x31, 0x68, 0x29, 0xbb, 0x7a, 0x41, 0x9e, 0xc6, 0x19, - 0x7f, 0x94, 0xb4, 0x51, 0x39, 0x03, 0x7f, 0xb2, 0xde, 0xa7, 0x32, - 0x9b, 0xb4, 0x47, 0x8e, 0x6f, 0xb4, 0x4a, 0xae, 0xe5, 0xaf, 0xb1, - 0xdc, 0xb0, 0x1b, 0x61, 0xbc, 0x99, 0x72, 0xde, 0xe4, 0x89, 0xb7, - 0x7a, 0x26, 0x5d, 0xda, 0x33, 0x49, 0x5b, 0x52, 0x9c, 0x0e, 0xf5, - 0x8a, 0xad, 0xc3, 0xb8, 0x3d, 0xe8, 0x06, 0x6a, 0xc2, 0xd5, 0x2a, - 0x0b, 0x6c, 0x7b, 0x84, 0xbd, 0x56, 0x05, 0xcb, 0x86, 0x65, 0x92, - 0xec, 0x44, 0x2b, 0xb0, 0x8e, 0xb9, 0xdc, 0x70, 0x0b, 0x46, 0xda, - 0xad, 0xbc, 0x63, 0x88, 0x39, 0xfa, 0xdb, 0x6a, 0xfe, 0x23, 0xfa, - 0xbc, 0xe4, 0x48, 0xf4, 0x67, 0x2b, 0x6a, 0x11, 0x10, 0x21, 0x49, - 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x91, 0x30, 0x81, 0x8e, - 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, - 0x01, 0x01, 0xff, 0x30, 0x4f, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, - 0x48, 0x30, 0x46, 0x30, 0x44, 0x06, 0x04, 0x55, 0x1d, 0x20, 0x00, - 0x30, 0x3c, 0x30, 0x3a, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, - 0x07, 0x02, 0x01, 0x16, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, - 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x70, 0x6b, 0x69, 0x6f, 0x76, 0x65, - 0x72, 0x68, 0x65, 0x69, 0x64, 0x2e, 0x6e, 0x6c, 0x2f, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x72, 0x6f, 0x6f, 0x74, - 0x2d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x30, 0x0e, 0x06, 0x03, - 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, - 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, - 0x14, 0xa8, 0x7d, 0xeb, 0xbc, 0x63, 0xa4, 0x74, 0x13, 0x74, 0x00, - 0xec, 0x96, 0xe0, 0xd3, 0x34, 0xc1, 0x2c, 0xbf, 0x6c, 0xf8, 0x30, - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x05, 0x84, 0x87, - 0x55, 0x74, 0x36, 0x61, 0xc1, 0xbb, 0xd1, 0xd4, 0xc6, 0x15, 0xa8, - 0x13, 0xb4, 0x9f, 0xa4, 0xfe, 0xbb, 0xee, 0x15, 0xb4, 0x2f, 0x06, - 0x0c, 0x29, 0xf2, 0xa8, 0x92, 0xa4, 0x61, 0x0d, 0xfc, 0xab, 0x5c, - 0x08, 0x5b, 0x51, 0x13, 0x2b, 0x4d, 0xc2, 0x2a, 0x61, 0xc8, 0xf8, - 0x09, 0x58, 0xfc, 0x2d, 0x02, 0xb2, 0x39, 0x7d, 0x99, 0x66, 0x81, - 0xbf, 0x6e, 0x5c, 0x95, 0x45, 0x20, 0x6c, 0xe6, 0x79, 0xa7, 0xd1, - 0xd8, 0x1c, 0x29, 0xfc, 0xc2, 0x20, 0x27, 0x51, 0xc8, 0xf1, 0x7c, - 0x5d, 0x34, 0x67, 0x69, 0x85, 0x11, 0x30, 0xc6, 0x00, 0xd2, 0xd7, - 0xf3, 0xd3, 0x7c, 0xb6, 0xf0, 0x31, 0x57, 0x28, 0x12, 0x82, 0x73, - 0xe9, 0x33, 0x2f, 0xa6, 0x55, 0xb4, 0x0b, 0x91, 0x94, 0x47, 0x9c, - 0xfa, 0xbb, 0x7a, 0x42, 0x32, 0xe8, 0xae, 0x7e, 0x2d, 0xc8, 0xbc, - 0xac, 0x14, 0xbf, 0xd9, 0x0f, 0xd9, 0x5b, 0xfc, 0xc1, 0xf9, 0x7a, - 0x95, 0xe1, 0x7d, 0x7e, 0x96, 0xfc, 0x71, 0xb0, 0xc2, 0x4c, 0xc8, - 0xdf, 0x45, 0x34, 0xc9, 0xce, 0x0d, 0xf2, 0x9c, 0x64, 0x08, 0xd0, - 0x3b, 0xc3, 0x29, 0xc5, 0xb2, 0xed, 0x90, 0x04, 0xc1, 0xb1, 0x29, - 0x91, 0xc5, 0x30, 0x6f, 0xc1, 0xa9, 0x72, 0x33, 0xcc, 0xfe, 0x5d, - 0x16, 0x17, 0x2c, 0x11, 0x69, 0xe7, 0x7e, 0xfe, 0xc5, 0x83, 0x08, - 0xdf, 0xbc, 0xdc, 0x22, 0x3a, 0x2e, 0x20, 0x69, 0x23, 0x39, 0x56, - 0x60, 0x67, 0x90, 0x8b, 0x2e, 0x76, 0x39, 0xfb, 0x11, 0x88, 0x97, - 0xf6, 0x7c, 0xbd, 0x4b, 0xb8, 0x20, 0x16, 0x67, 0x05, 0x8d, 0xe2, - 0x3b, 0xc1, 0x72, 0x3f, 0x94, 0x95, 0x37, 0xc7, 0x5d, 0xb9, 0x9e, - 0xd8, 0x93, 0xa1, 0x17, 0x8f, 0xff, 0x0c, 0x66, 0x15, 0xc1, 0x24, - 0x7c, 0x32, 0x7c, 0x03, 0x1d, 0x3b, 0xa1, 0x58, 0x45, 0x32, 0x93, - 0x30, 0x82, 0x04, 0x2b, 0x30, 0x82, 0x03, 0x13, 0xa0, 0x03, 0x02, - 0x01, 0x02, 0x02, 0x04, 0x3a, 0xcc, 0xa5, 0x4c, 0x30, 0x0d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, - 0x00, 0x30, 0x43, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x44, 0x4b, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x54, 0x44, 0x43, 0x20, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x31, 0x1d, 0x30, 0x1b, 0x06, - 0x03, 0x55, 0x04, 0x0b, 0x13, 0x14, 0x54, 0x44, 0x43, 0x20, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x52, 0x6f, 0x6f, - 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x31, 0x30, - 0x34, 0x30, 0x35, 0x31, 0x36, 0x33, 0x33, 0x31, 0x37, 0x5a, 0x17, - 0x0d, 0x32, 0x31, 0x30, 0x34, 0x30, 0x35, 0x31, 0x37, 0x30, 0x33, - 0x31, 0x37, 0x5a, 0x30, 0x43, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, - 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x4b, 0x31, 0x15, 0x30, 0x13, - 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x54, 0x44, 0x43, 0x20, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x31, 0x1d, 0x30, - 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x14, 0x54, 0x44, 0x43, - 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x52, + 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, + 0x0d, 0x30, 0x32, 0x31, 0x32, 0x31, 0x37, 0x30, 0x39, 0x32, 0x33, + 0x34, 0x39, 0x5a, 0x17, 0x0d, 0x31, 0x35, 0x31, 0x32, 0x31, 0x36, + 0x30, 0x39, 0x31, 0x35, 0x33, 0x38, 0x5a, 0x30, 0x55, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, + 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, + 0x53, 0x74, 0x61, 0x61, 0x74, 0x20, 0x64, 0x65, 0x72, 0x20, 0x4e, + 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x65, 0x6e, 0x31, + 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1d, 0x53, + 0x74, 0x61, 0x61, 0x74, 0x20, 0x64, 0x65, 0x72, 0x20, 0x4e, 0x65, + 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x65, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, - 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xc4, 0xb8, 0x40, 0xbc, 0x91, - 0xd5, 0x63, 0x1f, 0xd7, 0x99, 0xa0, 0x8b, 0x0c, 0x40, 0x1e, 0x74, - 0xb7, 0x48, 0x9d, 0x46, 0x8c, 0x02, 0xb2, 0xe0, 0x24, 0x5f, 0xf0, - 0x19, 0x13, 0xa7, 0x37, 0x83, 0x6b, 0x5d, 0xc7, 0x8e, 0xf9, 0x84, - 0x30, 0xce, 0x1a, 0x3b, 0xfa, 0xfb, 0xce, 0x8b, 0x6d, 0x23, 0xc6, - 0xc3, 0x6e, 0x66, 0x9f, 0x89, 0xa5, 0xdf, 0xe0, 0x42, 0x50, 0x67, - 0xfa, 0x1f, 0x6c, 0x1e, 0xf4, 0xd0, 0x05, 0xd6, 0xbf, 0xca, 0xd6, - 0x4e, 0xe4, 0x68, 0x60, 0x6c, 0x46, 0xaa, 0x1c, 0x5d, 0x63, 0xe1, - 0x07, 0x86, 0x0e, 0x65, 0x00, 0xa7, 0x2e, 0xa6, 0x71, 0xc6, 0xbc, - 0xb9, 0x81, 0xa8, 0x3a, 0x7d, 0x1a, 0xd2, 0xf9, 0xd1, 0xac, 0x4b, - 0xcb, 0xce, 0x75, 0xaf, 0xdc, 0x7b, 0xfa, 0x81, 0x73, 0xd4, 0xfc, - 0xba, 0xbd, 0x41, 0x88, 0xd4, 0x74, 0xb3, 0xf9, 0x5e, 0x38, 0x3a, - 0x3c, 0x43, 0xa8, 0xd2, 0x95, 0x4e, 0x77, 0x6d, 0x13, 0x0c, 0x9d, - 0x8f, 0x78, 0x01, 0xb7, 0x5a, 0x20, 0x1f, 0x03, 0x37, 0x35, 0xe2, - 0x2c, 0xdb, 0x4b, 0x2b, 0x2c, 0x78, 0xb9, 0x49, 0xdb, 0xc4, 0xd0, - 0xc7, 0x9c, 0x9c, 0xe4, 0x8a, 0x20, 0x09, 0x21, 0x16, 0x56, 0x66, - 0xff, 0x05, 0xec, 0x5b, 0xe3, 0xf0, 0xcf, 0xab, 0x24, 0x24, 0x5e, - 0xc3, 0x7f, 0x70, 0x7a, 0x12, 0xc4, 0xd2, 0xb5, 0x10, 0xa0, 0xb6, - 0x21, 0xe1, 0x8d, 0x78, 0x69, 0x55, 0x44, 0x69, 0xf5, 0xca, 0x96, - 0x1c, 0x34, 0x85, 0x17, 0x25, 0x77, 0xe2, 0xf6, 0x2f, 0x27, 0x98, - 0x78, 0xfd, 0x79, 0x06, 0x3a, 0xa2, 0xd6, 0x5a, 0x43, 0xc1, 0xff, - 0xec, 0x04, 0x3b, 0xee, 0x13, 0xef, 0xd3, 0x58, 0x5a, 0xff, 0x92, - 0xeb, 0xec, 0xae, 0xda, 0xf2, 0x37, 0x03, 0x47, 0x41, 0xb6, 0x97, - 0xc9, 0x2d, 0x0a, 0x41, 0x22, 0xbb, 0xbb, 0xe6, 0xa7, 0x02, 0x03, - 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x25, 0x30, 0x82, 0x01, 0x21, - 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, - 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, 0x00, 0x07, 0x30, 0x65, 0x06, - 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x5e, 0x30, 0x5c, 0x30, 0x5a, 0xa0, - 0x58, 0xa0, 0x56, 0xa4, 0x54, 0x30, 0x52, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x4b, 0x31, 0x15, - 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x54, 0x44, - 0x43, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x31, - 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x14, 0x54, - 0x44, 0x43, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, - 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x31, 0x0d, 0x30, - 0x0b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x04, 0x43, 0x52, 0x4c, - 0x31, 0x30, 0x2b, 0x06, 0x03, 0x55, 0x1d, 0x10, 0x04, 0x24, 0x30, - 0x22, 0x80, 0x0f, 0x32, 0x30, 0x30, 0x31, 0x30, 0x34, 0x30, 0x35, - 0x31, 0x36, 0x33, 0x33, 0x31, 0x37, 0x5a, 0x81, 0x0f, 0x32, 0x30, - 0x32, 0x31, 0x30, 0x34, 0x30, 0x35, 0x31, 0x37, 0x30, 0x33, 0x31, - 0x37, 0x5a, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, - 0x03, 0x02, 0x01, 0x06, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, - 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x6c, 0x64, 0x01, 0xc7, 0xfd, - 0x85, 0x6d, 0xac, 0xc8, 0xda, 0x9e, 0x50, 0x08, 0x85, 0x08, 0xb5, - 0x3c, 0x56, 0xa8, 0x50, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, - 0x04, 0x16, 0x04, 0x14, 0x6c, 0x64, 0x01, 0xc7, 0xfd, 0x85, 0x6d, - 0xac, 0xc8, 0xda, 0x9e, 0x50, 0x08, 0x85, 0x08, 0xb5, 0x3c, 0x56, - 0xa8, 0x50, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, - 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf6, 0x7d, 0x07, 0x41, 0x00, 0x04, 0x10, 0x30, 0x0e, - 0x1b, 0x08, 0x56, 0x35, 0x2e, 0x30, 0x3a, 0x34, 0x2e, 0x30, 0x03, - 0x02, 0x04, 0x90, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, - 0x00, 0x4e, 0x43, 0xcc, 0xd1, 0xdd, 0x1d, 0x10, 0x1b, 0x06, 0x7f, - 0xb7, 0xa4, 0xfa, 0xd3, 0xd9, 0x4d, 0xfb, 0x23, 0x9f, 0x23, 0x54, - 0x5b, 0xe6, 0x8b, 0x2f, 0x04, 0x28, 0x8b, 0xb5, 0x27, 0x6d, 0x89, - 0xa1, 0xec, 0x98, 0x69, 0xdc, 0xe7, 0x8d, 0x26, 0x83, 0x05, 0x79, - 0x74, 0xec, 0xb4, 0xb9, 0xa3, 0x97, 0xc1, 0x35, 0x00, 0xfd, 0x15, - 0xda, 0x39, 0x81, 0x3a, 0x95, 0x31, 0x90, 0xde, 0x97, 0xe9, 0x86, - 0xa8, 0x99, 0x77, 0x0c, 0xe5, 0x5a, 0xa0, 0x84, 0xff, 0x12, 0x16, - 0xac, 0x6e, 0xb8, 0x8d, 0xc3, 0x7b, 0x92, 0xc2, 0xac, 0x2e, 0xd0, - 0x7d, 0x28, 0xec, 0xb6, 0xf3, 0x60, 0x38, 0x69, 0x6f, 0x3e, 0xd8, - 0x04, 0x55, 0x3e, 0x9e, 0xcc, 0x55, 0xd2, 0xba, 0xfe, 0xbb, 0x47, - 0x04, 0xd7, 0x0a, 0xd9, 0x16, 0x0a, 0x34, 0x29, 0xf5, 0x58, 0x13, - 0xd5, 0x4f, 0xcf, 0x8f, 0x56, 0x4b, 0xb3, 0x1e, 0xee, 0xd3, 0x98, - 0x79, 0xda, 0x08, 0x1e, 0x0c, 0x6f, 0xb8, 0xf8, 0x16, 0x27, 0xef, - 0xc2, 0x6f, 0x3d, 0xf6, 0xa3, 0x4b, 0x3e, 0x0e, 0xe4, 0x6d, 0x6c, - 0xdb, 0x3b, 0x41, 0x12, 0x9b, 0xbd, 0x0d, 0x47, 0x23, 0x7f, 0x3c, - 0x4a, 0xd0, 0xaf, 0xc0, 0xaf, 0xf6, 0xef, 0x1b, 0xb5, 0x15, 0xc4, - 0xeb, 0x83, 0xc4, 0x09, 0x5f, 0x74, 0x8b, 0xd9, 0x11, 0xfb, 0xc2, - 0x56, 0xb1, 0x3c, 0xf8, 0x70, 0xca, 0x34, 0x8d, 0x43, 0x40, 0x13, - 0x8c, 0xfd, 0x99, 0x03, 0x54, 0x79, 0xc6, 0x2e, 0xea, 0x86, 0xa1, - 0xf6, 0x3a, 0xd4, 0x09, 0xbc, 0xf4, 0xbc, 0x66, 0xcc, 0x3d, 0x58, - 0xd0, 0x57, 0x49, 0x0a, 0xee, 0x25, 0xe2, 0x41, 0xee, 0x13, 0xf9, - 0x9b, 0x38, 0x34, 0xd1, 0x00, 0xf5, 0x7e, 0xe7, 0x94, 0x1d, 0xfc, - 0x69, 0x03, 0x62, 0xb8, 0x99, 0x05, 0x05, 0x3d, 0x6b, 0x78, 0x12, - 0xbd, 0xb0, 0x6f, 0x65, 0x30, 0x82, 0x05, 0x19, 0x30, 0x82, 0x04, - 0x01, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04, 0x3e, 0x48, 0xbd, - 0xc4, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x31, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x4b, 0x31, 0x0c, - 0x30, 0x0a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x03, 0x54, 0x44, - 0x43, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, - 0x0b, 0x54, 0x44, 0x43, 0x20, 0x4f, 0x43, 0x45, 0x53, 0x20, 0x43, - 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x33, 0x30, 0x32, 0x31, 0x31, - 0x30, 0x38, 0x33, 0x39, 0x33, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x37, - 0x30, 0x32, 0x31, 0x31, 0x30, 0x39, 0x30, 0x39, 0x33, 0x30, 0x5a, - 0x30, 0x31, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x44, 0x4b, 0x31, 0x0c, 0x30, 0x0a, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x13, 0x03, 0x54, 0x44, 0x43, 0x31, 0x14, 0x30, 0x12, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0b, 0x54, 0x44, 0x43, 0x20, - 0x4f, 0x43, 0x45, 0x53, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, - 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xac, 0x62, 0xf6, 0x61, - 0x20, 0xb2, 0xcf, 0xc0, 0xc6, 0x85, 0xd7, 0xe3, 0x79, 0xe6, 0xcc, - 0xed, 0xf2, 0x39, 0x92, 0xa4, 0x97, 0x2e, 0x64, 0xa3, 0x84, 0x5b, - 0x87, 0x9c, 0x4c, 0xfd, 0xa4, 0xf3, 0xc4, 0x5f, 0x21, 0xbd, 0x56, - 0x10, 0xeb, 0xdb, 0x2e, 0x61, 0xec, 0x93, 0x69, 0xe3, 0xa3, 0xcc, - 0xbd, 0x99, 0xc3, 0x05, 0xfc, 0x06, 0xb8, 0xca, 0x36, 0x1c, 0xfe, - 0x90, 0x8e, 0x49, 0x4c, 0xc4, 0x56, 0x9a, 0x2f, 0x56, 0xbc, 0xcf, - 0x7b, 0x0c, 0xf1, 0x6f, 0x47, 0xa6, 0x0d, 0x43, 0x4d, 0xe2, 0xe9, - 0x1d, 0x39, 0x34, 0xcd, 0x8d, 0x2c, 0xd9, 0x12, 0x98, 0xf9, 0xe3, - 0xe1, 0xc1, 0x4a, 0x7c, 0x86, 0x38, 0xc4, 0xa9, 0xc4, 0x61, 0x88, - 0xd2, 0x5e, 0xaf, 0x1a, 0x26, 0x4d, 0xd5, 0xe4, 0xa0, 0x22, 0x47, - 0x84, 0xd9, 0x64, 0xb7, 0x19, 0x96, 0xfc, 0xec, 0x19, 0xe4, 0xb2, - 0x97, 0x26, 0x4e, 0x4a, 0x4c, 0xcb, 0x8f, 0x24, 0x8b, 0x54, 0x18, - 0x1c, 0x48, 0x61, 0x7b, 0xd5, 0x88, 0x68, 0xda, 0x5d, 0xb5, 0xea, - 0xcd, 0x1a, 0x30, 0xc1, 0x80, 0x83, 0x76, 0x50, 0xaa, 0x4f, 0xd1, - 0xd4, 0xdd, 0x38, 0xf0, 0xef, 0x16, 0xf4, 0xe1, 0x0c, 0x50, 0x06, - 0xbf, 0xea, 0xfb, 0x7a, 0x49, 0xa1, 0x28, 0x2b, 0x1c, 0xf6, 0xfc, - 0x15, 0x32, 0xa3, 0x74, 0x6a, 0x8f, 0xa9, 0xc3, 0x62, 0x29, 0x71, - 0x31, 0xe5, 0x3b, 0xa4, 0x60, 0x17, 0x5e, 0x74, 0xe6, 0xda, 0x13, - 0xed, 0xe9, 0x1f, 0x1f, 0x1b, 0xd1, 0xb2, 0x68, 0x73, 0xc6, 0x10, - 0x34, 0x75, 0x46, 0x10, 0x10, 0xe3, 0x90, 0x00, 0x76, 0x40, 0xcb, - 0x8b, 0xb7, 0x43, 0x09, 0x21, 0xff, 0xab, 0x4e, 0x93, 0xc6, 0x58, - 0xe9, 0xa5, 0x82, 0xdb, 0x77, 0xc4, 0x3a, 0x99, 0xb1, 0x72, 0x95, - 0x49, 0x04, 0xf0, 0xb7, 0x2b, 0xfa, 0x7b, 0x59, 0x8e, 0xdd, 0x02, - 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x02, 0x37, 0x30, 0x82, 0x02, - 0x33, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, - 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, - 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, - 0x06, 0x30, 0x81, 0xec, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x81, - 0xe4, 0x30, 0x81, 0xe1, 0x30, 0x81, 0xde, 0x06, 0x08, 0x2a, 0x81, - 0x50, 0x81, 0x29, 0x01, 0x01, 0x01, 0x30, 0x81, 0xd1, 0x30, 0x2f, - 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, - 0x23, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, - 0x2e, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x6b, 0x61, 0x74, - 0x2e, 0x64, 0x6b, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x30, 0x81, 0x9d, 0x06, 0x08, 0x2b, 0x06, 0x01, - 0x05, 0x05, 0x07, 0x02, 0x02, 0x30, 0x81, 0x90, 0x30, 0x0a, 0x16, - 0x03, 0x54, 0x44, 0x43, 0x30, 0x03, 0x02, 0x01, 0x01, 0x1a, 0x81, - 0x81, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x6b, 0x61, 0x74, - 0x65, 0x72, 0x20, 0x66, 0x72, 0x61, 0x20, 0x64, 0x65, 0x6e, 0x6e, - 0x65, 0x20, 0x43, 0x41, 0x20, 0x75, 0x64, 0x73, 0x74, 0x65, 0x64, - 0x65, 0x73, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x4f, 0x49, - 0x44, 0x20, 0x31, 0x2e, 0x32, 0x2e, 0x32, 0x30, 0x38, 0x2e, 0x31, - 0x36, 0x39, 0x2e, 0x31, 0x2e, 0x31, 0x2e, 0x31, 0x2e, 0x20, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, - 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, - 0x43, 0x41, 0x20, 0x61, 0x72, 0x65, 0x20, 0x69, 0x73, 0x73, 0x75, - 0x65, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x4f, 0x49, - 0x44, 0x20, 0x31, 0x2e, 0x32, 0x2e, 0x32, 0x30, 0x38, 0x2e, 0x31, - 0x36, 0x39, 0x2e, 0x31, 0x2e, 0x31, 0x2e, 0x31, 0x2e, 0x30, 0x11, - 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x01, - 0x04, 0x04, 0x03, 0x02, 0x00, 0x07, 0x30, 0x81, 0x81, 0x06, 0x03, - 0x55, 0x1d, 0x1f, 0x04, 0x7a, 0x30, 0x78, 0x30, 0x48, 0xa0, 0x46, - 0xa0, 0x44, 0xa4, 0x42, 0x30, 0x40, 0x31, 0x0b, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x4b, 0x31, 0x0c, 0x30, - 0x0a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x03, 0x54, 0x44, 0x43, - 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0b, - 0x54, 0x44, 0x43, 0x20, 0x4f, 0x43, 0x45, 0x53, 0x20, 0x43, 0x41, - 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x04, - 0x43, 0x52, 0x4c, 0x31, 0x30, 0x2c, 0xa0, 0x2a, 0xa0, 0x28, 0x86, - 0x26, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, - 0x2e, 0x6f, 0x63, 0x65, 0x73, 0x2e, 0x63, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x6b, 0x61, 0x74, 0x2e, 0x64, 0x6b, 0x2f, 0x6f, 0x63, - 0x65, 0x73, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x2b, 0x06, 0x03, 0x55, - 0x1d, 0x10, 0x04, 0x24, 0x30, 0x22, 0x80, 0x0f, 0x32, 0x30, 0x30, - 0x33, 0x30, 0x32, 0x31, 0x31, 0x30, 0x38, 0x33, 0x39, 0x33, 0x30, - 0x5a, 0x81, 0x0f, 0x32, 0x30, 0x33, 0x37, 0x30, 0x32, 0x31, 0x31, - 0x30, 0x39, 0x30, 0x39, 0x33, 0x30, 0x5a, 0x30, 0x1f, 0x06, 0x03, - 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x60, 0xb5, - 0x85, 0xec, 0x56, 0x64, 0x7e, 0x12, 0x19, 0x27, 0x67, 0x1d, 0x50, - 0x15, 0x4b, 0x73, 0xae, 0x3b, 0xf9, 0x12, 0x30, 0x1d, 0x06, 0x03, - 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x60, 0xb5, 0x85, 0xec, - 0x56, 0x64, 0x7e, 0x12, 0x19, 0x27, 0x67, 0x1d, 0x50, 0x15, 0x4b, - 0x73, 0xae, 0x3b, 0xf9, 0x12, 0x30, 0x1d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf6, 0x7d, 0x07, 0x41, 0x00, 0x04, 0x10, 0x30, 0x0e, - 0x1b, 0x08, 0x56, 0x36, 0x2e, 0x30, 0x3a, 0x34, 0x2e, 0x30, 0x03, - 0x02, 0x04, 0x90, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, - 0x00, 0x0a, 0xba, 0x26, 0x26, 0x46, 0xd3, 0x73, 0xa8, 0x09, 0xf3, - 0x6b, 0x0b, 0x30, 0x99, 0xfd, 0x8a, 0xe1, 0x57, 0x7a, 0x11, 0xd3, - 0xb8, 0x94, 0xd7, 0x09, 0x10, 0x6e, 0xa3, 0xb1, 0x38, 0x03, 0xd1, - 0xb6, 0xf2, 0x43, 0x41, 0x29, 0x62, 0xa7, 0x72, 0xd8, 0xfb, 0x7c, - 0x05, 0xe6, 0x31, 0x70, 0x27, 0x54, 0x18, 0x4e, 0x8a, 0x7c, 0x4e, - 0xe5, 0xd1, 0xca, 0x8c, 0x78, 0x88, 0xcf, 0x1b, 0xd3, 0x90, 0x8b, - 0xe6, 0x23, 0xf8, 0x0b, 0x0e, 0x33, 0x43, 0x7d, 0x9c, 0xe2, 0x0a, - 0x19, 0x8f, 0xc9, 0x01, 0x3e, 0x74, 0x5d, 0x74, 0xc9, 0x8b, 0x1c, - 0x03, 0xe5, 0x18, 0xc8, 0x01, 0x4c, 0x3f, 0xcb, 0x97, 0x05, 0x5d, - 0x98, 0x71, 0xa6, 0x98, 0x6f, 0xb6, 0x7c, 0xbd, 0x37, 0x7f, 0xbe, - 0xe1, 0x93, 0x25, 0x6d, 0x6f, 0xf0, 0x0a, 0xad, 0x17, 0x18, 0xe1, - 0x03, 0xbc, 0x07, 0x29, 0xc8, 0xad, 0x26, 0xe8, 0xf8, 0x61, 0xf0, - 0xfd, 0x21, 0x09, 0x7e, 0x9a, 0x8e, 0xa9, 0x68, 0x7d, 0x48, 0x62, - 0x72, 0xbd, 0x00, 0xea, 0x01, 0x99, 0xb8, 0x06, 0x82, 0x51, 0x81, - 0x4e, 0xf1, 0xf5, 0xb4, 0x91, 0x54, 0xb9, 0x23, 0x7a, 0x00, 0x9a, - 0x9f, 0x5d, 0x8d, 0xe0, 0x3c, 0x64, 0xb9, 0x1a, 0x12, 0x92, 0x2a, - 0xc7, 0x82, 0x44, 0x72, 0x39, 0xdc, 0xe2, 0x3c, 0xc6, 0xd8, 0x55, - 0xf5, 0x15, 0x4e, 0xc8, 0x05, 0x0e, 0xdb, 0xc6, 0xd0, 0x62, 0xa6, - 0xec, 0x15, 0xb4, 0xb5, 0x02, 0x82, 0xdb, 0xac, 0x8c, 0xa2, 0x81, - 0xf0, 0x9b, 0x99, 0x31, 0xf5, 0x20, 0x20, 0xa8, 0x88, 0x61, 0x0a, - 0x07, 0x9f, 0x94, 0xfc, 0xd0, 0xd7, 0x1b, 0xcc, 0x2e, 0x17, 0xf3, - 0x04, 0x27, 0x76, 0x67, 0xeb, 0x54, 0x83, 0xfd, 0xa4, 0x90, 0x7e, - 0x06, 0x3d, 0x04, 0xa3, 0x43, 0x2d, 0xda, 0xfc, 0x0b, 0x62, 0xea, - 0x2f, 0x5f, 0x62, 0x53, 0x30, 0x82, 0x04, 0x5e, 0x30, 0x82, 0x03, - 0x46, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x44, 0xbe, 0x0c, - 0x8b, 0x50, 0x00, 0x21, 0xb4, 0x11, 0xd3, 0x2a, 0x68, 0x06, 0xa9, - 0xad, 0x69, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0x93, 0x31, 0x0b, + 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0x98, 0xd2, 0xb5, 0x51, 0x11, + 0x7a, 0x81, 0xa6, 0x14, 0x98, 0x71, 0x6d, 0xbe, 0xcc, 0xe7, 0x13, + 0x1b, 0xd6, 0x27, 0x0e, 0x7a, 0xb3, 0x6a, 0x18, 0x1c, 0xb6, 0x61, + 0x5a, 0xd5, 0x61, 0x09, 0xbf, 0xde, 0x90, 0x13, 0xc7, 0x67, 0xee, + 0xdd, 0xf3, 0xda, 0xc5, 0x0c, 0x12, 0x9e, 0x35, 0x55, 0x3e, 0x2c, + 0x27, 0x88, 0x40, 0x6b, 0xf7, 0xdc, 0xdd, 0x22, 0x61, 0xf5, 0xc2, + 0xc7, 0x0e, 0xf5, 0xf6, 0xd5, 0x76, 0x53, 0x4d, 0x8f, 0x8c, 0xbc, + 0x18, 0x76, 0x37, 0x85, 0x9d, 0xe8, 0xca, 0x49, 0xc7, 0xd2, 0x4f, + 0x98, 0x13, 0x09, 0xa2, 0x3e, 0x22, 0x88, 0x9c, 0x7f, 0xd6, 0xf2, + 0x10, 0x65, 0xb4, 0xee, 0x5f, 0x18, 0xd5, 0x17, 0xe3, 0xf8, 0xc5, + 0xfd, 0xe2, 0x9d, 0xa2, 0xef, 0x53, 0x0e, 0x85, 0x77, 0xa2, 0x0f, + 0xe1, 0x30, 0x47, 0xee, 0x00, 0xe7, 0x33, 0x7d, 0x44, 0x67, 0x1a, + 0x0b, 0x51, 0xe8, 0x8b, 0xa0, 0x9e, 0x50, 0x98, 0x68, 0x34, 0x52, + 0x1f, 0x2e, 0x6d, 0x01, 0xf2, 0x60, 0x45, 0xf2, 0x31, 0xeb, 0xa9, + 0x31, 0x68, 0x29, 0xbb, 0x7a, 0x41, 0x9e, 0xc6, 0x19, 0x7f, 0x94, + 0xb4, 0x51, 0x39, 0x03, 0x7f, 0xb2, 0xde, 0xa7, 0x32, 0x9b, 0xb4, + 0x47, 0x8e, 0x6f, 0xb4, 0x4a, 0xae, 0xe5, 0xaf, 0xb1, 0xdc, 0xb0, + 0x1b, 0x61, 0xbc, 0x99, 0x72, 0xde, 0xe4, 0x89, 0xb7, 0x7a, 0x26, + 0x5d, 0xda, 0x33, 0x49, 0x5b, 0x52, 0x9c, 0x0e, 0xf5, 0x8a, 0xad, + 0xc3, 0xb8, 0x3d, 0xe8, 0x06, 0x6a, 0xc2, 0xd5, 0x2a, 0x0b, 0x6c, + 0x7b, 0x84, 0xbd, 0x56, 0x05, 0xcb, 0x86, 0x65, 0x92, 0xec, 0x44, + 0x2b, 0xb0, 0x8e, 0xb9, 0xdc, 0x70, 0x0b, 0x46, 0xda, 0xad, 0xbc, + 0x63, 0x88, 0x39, 0xfa, 0xdb, 0x6a, 0xfe, 0x23, 0xfa, 0xbc, 0xe4, + 0x48, 0xf4, 0x67, 0x2b, 0x6a, 0x11, 0x10, 0x21, 0x49, 0x02, 0x03, + 0x01, 0x00, 0x01, 0xa3, 0x81, 0x91, 0x30, 0x81, 0x8e, 0x30, 0x0c, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, + 0xff, 0x30, 0x4f, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x48, 0x30, + 0x46, 0x30, 0x44, 0x06, 0x04, 0x55, 0x1d, 0x20, 0x00, 0x30, 0x3c, + 0x30, 0x3a, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, + 0x01, 0x16, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x70, 0x6b, 0x69, 0x6f, 0x76, 0x65, 0x72, 0x68, + 0x65, 0x69, 0x64, 0x2e, 0x6e, 0x6c, 0x2f, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 0x2f, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, + 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa8, + 0x7d, 0xeb, 0xbc, 0x63, 0xa4, 0x74, 0x13, 0x74, 0x00, 0xec, 0x96, + 0xe0, 0xd3, 0x34, 0xc1, 0x2c, 0xbf, 0x6c, 0xf8, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x05, 0x84, 0x87, 0x55, 0x74, + 0x36, 0x61, 0xc1, 0xbb, 0xd1, 0xd4, 0xc6, 0x15, 0xa8, 0x13, 0xb4, + 0x9f, 0xa4, 0xfe, 0xbb, 0xee, 0x15, 0xb4, 0x2f, 0x06, 0x0c, 0x29, + 0xf2, 0xa8, 0x92, 0xa4, 0x61, 0x0d, 0xfc, 0xab, 0x5c, 0x08, 0x5b, + 0x51, 0x13, 0x2b, 0x4d, 0xc2, 0x2a, 0x61, 0xc8, 0xf8, 0x09, 0x58, + 0xfc, 0x2d, 0x02, 0xb2, 0x39, 0x7d, 0x99, 0x66, 0x81, 0xbf, 0x6e, + 0x5c, 0x95, 0x45, 0x20, 0x6c, 0xe6, 0x79, 0xa7, 0xd1, 0xd8, 0x1c, + 0x29, 0xfc, 0xc2, 0x20, 0x27, 0x51, 0xc8, 0xf1, 0x7c, 0x5d, 0x34, + 0x67, 0x69, 0x85, 0x11, 0x30, 0xc6, 0x00, 0xd2, 0xd7, 0xf3, 0xd3, + 0x7c, 0xb6, 0xf0, 0x31, 0x57, 0x28, 0x12, 0x82, 0x73, 0xe9, 0x33, + 0x2f, 0xa6, 0x55, 0xb4, 0x0b, 0x91, 0x94, 0x47, 0x9c, 0xfa, 0xbb, + 0x7a, 0x42, 0x32, 0xe8, 0xae, 0x7e, 0x2d, 0xc8, 0xbc, 0xac, 0x14, + 0xbf, 0xd9, 0x0f, 0xd9, 0x5b, 0xfc, 0xc1, 0xf9, 0x7a, 0x95, 0xe1, + 0x7d, 0x7e, 0x96, 0xfc, 0x71, 0xb0, 0xc2, 0x4c, 0xc8, 0xdf, 0x45, + 0x34, 0xc9, 0xce, 0x0d, 0xf2, 0x9c, 0x64, 0x08, 0xd0, 0x3b, 0xc3, + 0x29, 0xc5, 0xb2, 0xed, 0x90, 0x04, 0xc1, 0xb1, 0x29, 0x91, 0xc5, + 0x30, 0x6f, 0xc1, 0xa9, 0x72, 0x33, 0xcc, 0xfe, 0x5d, 0x16, 0x17, + 0x2c, 0x11, 0x69, 0xe7, 0x7e, 0xfe, 0xc5, 0x83, 0x08, 0xdf, 0xbc, + 0xdc, 0x22, 0x3a, 0x2e, 0x20, 0x69, 0x23, 0x39, 0x56, 0x60, 0x67, + 0x90, 0x8b, 0x2e, 0x76, 0x39, 0xfb, 0x11, 0x88, 0x97, 0xf6, 0x7c, + 0xbd, 0x4b, 0xb8, 0x20, 0x16, 0x67, 0x05, 0x8d, 0xe2, 0x3b, 0xc1, + 0x72, 0x3f, 0x94, 0x95, 0x37, 0xc7, 0x5d, 0xb9, 0x9e, 0xd8, 0x93, + 0xa1, 0x17, 0x8f, 0xff, 0x0c, 0x66, 0x15, 0xc1, 0x24, 0x7c, 0x32, + 0x7c, 0x03, 0x1d, 0x3b, 0xa1, 0x58, 0x45, 0x32, 0x93, 0x30, 0x82, + 0x04, 0x5e, 0x30, 0x82, 0x03, 0x46, 0xa0, 0x03, 0x02, 0x01, 0x02, + 0x02, 0x10, 0x44, 0xbe, 0x0c, 0x8b, 0x50, 0x00, 0x21, 0xb4, 0x11, + 0xd3, 0x2a, 0x68, 0x06, 0xa9, 0xad, 0x69, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, + 0x30, 0x81, 0x93, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x08, 0x13, 0x02, 0x55, 0x54, 0x31, 0x17, 0x30, 0x15, + 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0e, 0x53, 0x61, 0x6c, 0x74, + 0x20, 0x4c, 0x61, 0x6b, 0x65, 0x20, 0x43, 0x69, 0x74, 0x79, 0x31, + 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x54, + 0x68, 0x65, 0x20, 0x55, 0x53, 0x45, 0x52, 0x54, 0x52, 0x55, 0x53, + 0x54, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x21, + 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x18, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x75, 0x73, + 0x65, 0x72, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x6d, + 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, + 0x55, 0x54, 0x4e, 0x20, 0x2d, 0x20, 0x44, 0x41, 0x54, 0x41, 0x43, + 0x6f, 0x72, 0x70, 0x20, 0x53, 0x47, 0x43, 0x30, 0x1e, 0x17, 0x0d, + 0x39, 0x39, 0x30, 0x36, 0x32, 0x34, 0x31, 0x38, 0x35, 0x37, 0x32, + 0x31, 0x5a, 0x17, 0x0d, 0x31, 0x39, 0x30, 0x36, 0x32, 0x34, 0x31, + 0x39, 0x30, 0x36, 0x33, 0x30, 0x5a, 0x30, 0x81, 0x93, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x55, 0x54, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x07, @@ -4156,323 +2813,292 @@ static const unsigned char ca_bundle_data[] = { 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x55, 0x54, 0x4e, 0x20, 0x2d, 0x20, 0x44, 0x41, 0x54, 0x41, 0x43, 0x6f, 0x72, 0x70, 0x20, 0x53, - 0x47, 0x43, 0x30, 0x1e, 0x17, 0x0d, 0x39, 0x39, 0x30, 0x36, 0x32, - 0x34, 0x31, 0x38, 0x35, 0x37, 0x32, 0x31, 0x5a, 0x17, 0x0d, 0x31, - 0x39, 0x30, 0x36, 0x32, 0x34, 0x31, 0x39, 0x30, 0x36, 0x33, 0x30, - 0x5a, 0x30, 0x81, 0x93, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0b, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x55, 0x54, 0x31, 0x17, 0x30, - 0x15, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0e, 0x53, 0x61, 0x6c, - 0x74, 0x20, 0x4c, 0x61, 0x6b, 0x65, 0x20, 0x43, 0x69, 0x74, 0x79, - 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, - 0x54, 0x68, 0x65, 0x20, 0x55, 0x53, 0x45, 0x52, 0x54, 0x52, 0x55, - 0x53, 0x54, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, - 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x18, 0x68, - 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x75, - 0x73, 0x65, 0x72, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x63, 0x6f, - 0x6d, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, - 0x12, 0x55, 0x54, 0x4e, 0x20, 0x2d, 0x20, 0x44, 0x41, 0x54, 0x41, - 0x43, 0x6f, 0x72, 0x70, 0x20, 0x53, 0x47, 0x43, 0x30, 0x82, 0x01, - 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, - 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xdf, 0xee, 0x58, - 0x10, 0xa2, 0x2b, 0x6e, 0x55, 0xc4, 0x8e, 0xbf, 0x2e, 0x46, 0x09, - 0xe7, 0xe0, 0x08, 0x0f, 0x2e, 0x2b, 0x7a, 0x13, 0x94, 0x1b, 0xbd, - 0xf6, 0xb6, 0x80, 0x8e, 0x65, 0x05, 0x93, 0x00, 0x1e, 0xbc, 0xaf, - 0xe2, 0x0f, 0x8e, 0x19, 0x0d, 0x12, 0x47, 0xec, 0xac, 0xad, 0xa3, - 0xfa, 0x2e, 0x70, 0xf8, 0xde, 0x6e, 0xfb, 0x56, 0x42, 0x15, 0x9e, - 0x2e, 0x5c, 0xef, 0x23, 0xde, 0x21, 0xb9, 0x05, 0x76, 0x27, 0x19, - 0x0f, 0x4f, 0xd6, 0xc3, 0x9c, 0xb4, 0xbe, 0x94, 0x19, 0x63, 0xf2, - 0xa6, 0x11, 0x0a, 0xeb, 0x53, 0x48, 0x9c, 0xbe, 0xf2, 0x29, 0x3b, - 0x16, 0xe8, 0x1a, 0xa0, 0x4c, 0xa6, 0xc9, 0xf4, 0x18, 0x59, 0x68, - 0xc0, 0x70, 0xf2, 0x53, 0x00, 0xc0, 0x5e, 0x50, 0x82, 0xa5, 0x56, - 0x6f, 0x36, 0xf9, 0x4a, 0xe0, 0x44, 0x86, 0xa0, 0x4d, 0x4e, 0xd6, - 0x47, 0x6e, 0x49, 0x4a, 0xcb, 0x67, 0xd7, 0xa6, 0xc4, 0x05, 0xb9, - 0x8e, 0x1e, 0xf4, 0xfc, 0xff, 0xcd, 0xe7, 0x36, 0xe0, 0x9c, 0x05, - 0x6c, 0xb2, 0x33, 0x22, 0x15, 0xd0, 0xb4, 0xe0, 0xcc, 0x17, 0xc0, - 0xb2, 0xc0, 0xf4, 0xfe, 0x32, 0x3f, 0x29, 0x2a, 0x95, 0x7b, 0xd8, - 0xf2, 0xa7, 0x4e, 0x0f, 0x54, 0x7c, 0xa1, 0x0d, 0x80, 0xb3, 0x09, - 0x03, 0xc1, 0xff, 0x5c, 0xdd, 0x5e, 0x9a, 0x3e, 0xbc, 0xae, 0xbc, - 0x47, 0x8a, 0x6a, 0xae, 0x71, 0xca, 0x1f, 0xb1, 0x2a, 0xb8, 0x5f, - 0x42, 0x05, 0x0b, 0xec, 0x46, 0x30, 0xd1, 0x72, 0x0b, 0xca, 0xe9, - 0x56, 0x6d, 0xf5, 0xef, 0xdf, 0x78, 0xbe, 0x61, 0xba, 0xb2, 0xa5, - 0xae, 0x04, 0x4c, 0xbc, 0xa8, 0xac, 0x69, 0x15, 0x97, 0xbd, 0xef, - 0xeb, 0xb4, 0x8c, 0xbf, 0x35, 0xf8, 0xd4, 0xc3, 0xd1, 0x28, 0x0e, - 0x5c, 0x3a, 0x9f, 0x70, 0x18, 0x33, 0x20, 0x77, 0xc4, 0xa2, 0xaf, - 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xab, 0x30, 0x81, 0xa8, - 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, - 0x01, 0xc6, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, - 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, - 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x53, 0x32, 0xd1, - 0xb3, 0xcf, 0x7f, 0xfa, 0xe0, 0xf1, 0xa0, 0x5d, 0x85, 0x4e, 0x92, - 0xd2, 0x9e, 0x45, 0x1d, 0xb4, 0x4f, 0x30, 0x3d, 0x06, 0x03, 0x55, - 0x1d, 0x1f, 0x04, 0x36, 0x30, 0x34, 0x30, 0x32, 0xa0, 0x30, 0xa0, - 0x2e, 0x86, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, - 0x72, 0x6c, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x72, 0x75, 0x73, - 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x55, 0x54, 0x4e, 0x2d, 0x44, - 0x41, 0x54, 0x41, 0x43, 0x6f, 0x72, 0x70, 0x53, 0x47, 0x43, 0x2e, - 0x63, 0x72, 0x6c, 0x30, 0x2a, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, - 0x23, 0x30, 0x21, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, - 0x03, 0x01, 0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, - 0x0a, 0x03, 0x03, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, - 0x42, 0x04, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, - 0x00, 0x27, 0x35, 0x97, 0x00, 0x8a, 0x8b, 0x28, 0xbd, 0xc6, 0x33, - 0x30, 0x1e, 0x29, 0xfc, 0xe2, 0xf7, 0xd5, 0x98, 0xd4, 0x40, 0xbb, - 0x60, 0xca, 0xbf, 0xab, 0x17, 0x2c, 0x09, 0x36, 0x7f, 0x50, 0xfa, - 0x41, 0xdc, 0xae, 0x96, 0x3a, 0x0a, 0x23, 0x3e, 0x89, 0x59, 0xc9, - 0xa3, 0x07, 0xed, 0x1b, 0x37, 0xad, 0xfc, 0x7c, 0xbe, 0x51, 0x49, - 0x5a, 0xde, 0x3a, 0x0a, 0x54, 0x08, 0x16, 0x45, 0xc2, 0x99, 0xb1, - 0x87, 0xcd, 0x8c, 0x68, 0xe0, 0x69, 0x03, 0xe9, 0xc4, 0x4e, 0x98, - 0xb2, 0x3b, 0x8c, 0x16, 0xb3, 0x0e, 0xa0, 0x0c, 0x98, 0x50, 0x9b, - 0x93, 0xa9, 0x70, 0x09, 0xc8, 0x2c, 0xa3, 0x8f, 0xdf, 0x02, 0xe4, - 0xe0, 0x71, 0x3a, 0xf1, 0xb4, 0x23, 0x72, 0xa0, 0xaa, 0x01, 0xdf, - 0xdf, 0x98, 0x3e, 0x14, 0x50, 0xa0, 0x31, 0x26, 0xbd, 0x28, 0xe9, - 0x5a, 0x30, 0x26, 0x75, 0xf9, 0x7b, 0x60, 0x1c, 0x8d, 0xf3, 0xcd, - 0x50, 0x26, 0x6d, 0x04, 0x27, 0x9a, 0xdf, 0xd5, 0x0d, 0x45, 0x47, - 0x29, 0x6b, 0x2c, 0xe6, 0x76, 0xd9, 0xa9, 0x29, 0x7d, 0x32, 0xdd, - 0xc9, 0x36, 0x3c, 0xbd, 0xae, 0x35, 0xf1, 0x11, 0x9e, 0x1d, 0xbb, - 0x90, 0x3f, 0x12, 0x47, 0x4e, 0x8e, 0xd7, 0x7e, 0x0f, 0x62, 0x73, - 0x1d, 0x52, 0x26, 0x38, 0x1c, 0x18, 0x49, 0xfd, 0x30, 0x74, 0x9a, - 0xc4, 0xe5, 0x22, 0x2f, 0xd8, 0xc0, 0x8d, 0xed, 0x91, 0x7a, 0x4c, - 0x00, 0x8f, 0x72, 0x7f, 0x5d, 0xda, 0xdd, 0x1b, 0x8b, 0x45, 0x6b, - 0xe7, 0xdd, 0x69, 0x97, 0xa8, 0xc5, 0x56, 0x4c, 0x0f, 0x0c, 0xf6, - 0x9f, 0x7a, 0x91, 0x37, 0xf6, 0x97, 0x82, 0xe0, 0xdd, 0x71, 0x69, - 0xff, 0x76, 0x3f, 0x60, 0x4d, 0x3c, 0xcf, 0xf7, 0x99, 0xf9, 0xc6, - 0x57, 0xf4, 0xc9, 0x55, 0x39, 0x78, 0xba, 0x2c, 0x79, 0xc9, 0xa6, - 0x88, 0x2b, 0xf4, 0x08, 0x30, 0x82, 0x04, 0x74, 0x30, 0x82, 0x03, - 0x5c, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x44, 0xbe, 0x0c, - 0x8b, 0x50, 0x00, 0x24, 0xb4, 0x11, 0xd3, 0x36, 0x2a, 0xfe, 0x65, - 0x0a, 0xfd, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0x97, 0x31, 0x0b, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, - 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, - 0x55, 0x54, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x07, - 0x13, 0x0e, 0x53, 0x61, 0x6c, 0x74, 0x20, 0x4c, 0x61, 0x6b, 0x65, - 0x20, 0x43, 0x69, 0x74, 0x79, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x15, 0x54, 0x68, 0x65, 0x20, 0x55, 0x53, - 0x45, 0x52, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, - 0x04, 0x0b, 0x13, 0x18, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, - 0x77, 0x77, 0x77, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x72, 0x75, - 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x1f, 0x30, 0x1d, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x13, 0x16, 0x55, 0x54, 0x4e, 0x2d, 0x55, - 0x53, 0x45, 0x52, 0x46, 0x69, 0x72, 0x73, 0x74, 0x2d, 0x48, 0x61, - 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x30, 0x1e, 0x17, 0x0d, 0x39, - 0x39, 0x30, 0x37, 0x30, 0x39, 0x31, 0x38, 0x31, 0x30, 0x34, 0x32, - 0x5a, 0x17, 0x0d, 0x31, 0x39, 0x30, 0x37, 0x30, 0x39, 0x31, 0x38, - 0x31, 0x39, 0x32, 0x32, 0x5a, 0x30, 0x81, 0x97, 0x31, 0x0b, 0x30, - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, - 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x55, - 0x54, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, - 0x0e, 0x53, 0x61, 0x6c, 0x74, 0x20, 0x4c, 0x61, 0x6b, 0x65, 0x20, - 0x43, 0x69, 0x74, 0x79, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x13, 0x15, 0x54, 0x68, 0x65, 0x20, 0x55, 0x53, 0x45, - 0x52, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, - 0x0b, 0x13, 0x18, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, - 0x77, 0x77, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x72, 0x75, 0x73, - 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x13, 0x16, 0x55, 0x54, 0x4e, 0x2d, 0x55, 0x53, - 0x45, 0x52, 0x46, 0x69, 0x72, 0x73, 0x74, 0x2d, 0x48, 0x61, 0x72, - 0x64, 0x77, 0x61, 0x72, 0x65, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, - 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, - 0x02, 0x82, 0x01, 0x01, 0x00, 0xb1, 0xf7, 0xc3, 0x38, 0x3f, 0xb4, - 0xa8, 0x7f, 0xcf, 0x39, 0x82, 0x51, 0x67, 0xd0, 0x6d, 0x9f, 0xd2, - 0xff, 0x58, 0xf3, 0xe7, 0x9f, 0x2b, 0xec, 0x0d, 0x89, 0x54, 0x99, - 0xb9, 0x38, 0x99, 0x16, 0xf7, 0xe0, 0x21, 0x79, 0x48, 0xc2, 0xbb, - 0x61, 0x74, 0x12, 0x96, 0x1d, 0x3c, 0x6a, 0x72, 0xd5, 0x3c, 0x10, - 0x67, 0x3a, 0x39, 0xed, 0x2b, 0x13, 0xcd, 0x66, 0xeb, 0x95, 0x09, - 0x33, 0xa4, 0x6c, 0x97, 0xb1, 0xe8, 0xc6, 0xec, 0xc1, 0x75, 0x79, - 0x9c, 0x46, 0x5e, 0x8d, 0xab, 0xd0, 0x6a, 0xfd, 0xb9, 0x2a, 0x55, - 0x17, 0x10, 0x54, 0xb3, 0x19, 0xf0, 0x9a, 0xf6, 0xf1, 0xb1, 0x5d, - 0xb6, 0xa7, 0x6d, 0xfb, 0xe0, 0x71, 0x17, 0x6b, 0xa2, 0x88, 0xfb, - 0x00, 0xdf, 0xfe, 0x1a, 0x31, 0x77, 0x0c, 0x9a, 0x01, 0x7a, 0xb1, - 0x32, 0xe3, 0x2b, 0x01, 0x07, 0x38, 0x6e, 0xc3, 0xa5, 0x5e, 0x23, - 0xbc, 0x45, 0x9b, 0x7b, 0x50, 0xc1, 0xc9, 0x30, 0x8f, 0xdb, 0xe5, - 0x2b, 0x7a, 0xd3, 0x5b, 0xfb, 0x33, 0x40, 0x1e, 0xa0, 0xd5, 0x98, - 0x17, 0xbc, 0x8b, 0x87, 0xc3, 0x89, 0xd3, 0x5d, 0xa0, 0x8e, 0xb2, - 0xaa, 0xaa, 0xf6, 0x8e, 0x69, 0x88, 0x06, 0xc5, 0xfa, 0x89, 0x21, - 0xf3, 0x08, 0x9d, 0x69, 0x2e, 0x09, 0x33, 0x9b, 0x29, 0x0d, 0x46, - 0x0f, 0x8c, 0xcc, 0x49, 0x34, 0xb0, 0x69, 0x51, 0xbd, 0xf9, 0x06, - 0xcd, 0x68, 0xad, 0x66, 0x4c, 0xbc, 0x3e, 0xac, 0x61, 0xbd, 0x0a, - 0x88, 0x0e, 0xc8, 0xdf, 0x3d, 0xee, 0x7c, 0x04, 0x4c, 0x9d, 0x0a, - 0x5e, 0x6b, 0x91, 0xd6, 0xee, 0xc7, 0xed, 0x28, 0x8d, 0xab, 0x4d, - 0x87, 0x89, 0x73, 0xd0, 0x6e, 0xa4, 0xd0, 0x1e, 0x16, 0x8b, 0x14, - 0xe1, 0x76, 0x44, 0x03, 0x7f, 0x63, 0xac, 0xe4, 0xcd, 0x49, 0x9c, - 0xc5, 0x92, 0xf4, 0xab, 0x32, 0xa1, 0x48, 0x5b, 0x02, 0x03, 0x01, - 0x00, 0x01, 0xa3, 0x81, 0xb9, 0x30, 0x81, 0xb6, 0x30, 0x0b, 0x06, - 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0xc6, 0x30, - 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, - 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, - 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa1, 0x72, 0x5f, 0x26, 0x1b, 0x28, - 0x98, 0x43, 0x95, 0x5d, 0x07, 0x37, 0xd5, 0x85, 0x96, 0x9d, 0x4b, - 0xd2, 0xc3, 0x45, 0x30, 0x44, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, - 0x3d, 0x30, 0x3b, 0x30, 0x39, 0xa0, 0x37, 0xa0, 0x35, 0x86, 0x33, - 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x55, 0x54, 0x4e, 0x2d, 0x55, 0x53, 0x45, 0x52, - 0x46, 0x69, 0x72, 0x73, 0x74, 0x2d, 0x48, 0x61, 0x72, 0x64, 0x77, - 0x61, 0x72, 0x65, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x31, 0x06, 0x03, - 0x55, 0x1d, 0x25, 0x04, 0x2a, 0x30, 0x28, 0x06, 0x08, 0x2b, 0x06, - 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x06, 0x08, 0x2b, 0x06, 0x01, - 0x05, 0x05, 0x07, 0x03, 0x05, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, - 0x05, 0x07, 0x03, 0x06, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, - 0x07, 0x03, 0x07, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, - 0x00, 0x47, 0x19, 0x0f, 0xde, 0x74, 0xc6, 0x99, 0x97, 0xaf, 0xfc, - 0xad, 0x28, 0x5e, 0x75, 0x8e, 0xeb, 0x2d, 0x67, 0xee, 0x4e, 0x7b, - 0x2b, 0xd7, 0x0c, 0xff, 0xf6, 0xde, 0xcb, 0x55, 0xa2, 0x0a, 0xe1, - 0x4c, 0x54, 0x65, 0x93, 0x60, 0x6b, 0x9f, 0x12, 0x9c, 0xad, 0x5e, - 0x83, 0x2c, 0xeb, 0x5a, 0xae, 0xc0, 0xe4, 0x2d, 0xf4, 0x00, 0x63, - 0x1d, 0xb8, 0xc0, 0x6c, 0xf2, 0xcf, 0x49, 0xbb, 0x4d, 0x93, 0x6f, - 0x06, 0xa6, 0x0a, 0x22, 0xb2, 0x49, 0x62, 0x08, 0x4e, 0xff, 0xc8, - 0xc8, 0x14, 0xb2, 0x88, 0x16, 0x5d, 0xe7, 0x01, 0xe4, 0x12, 0x95, - 0xe5, 0x45, 0x34, 0xb3, 0x8b, 0x69, 0xbd, 0xcf, 0xb4, 0x85, 0x8f, - 0x75, 0x51, 0x9e, 0x7d, 0x3a, 0x38, 0x3a, 0x14, 0x48, 0x12, 0xc6, - 0xfb, 0xa7, 0x3b, 0x1a, 0x8d, 0x0d, 0x82, 0x40, 0x07, 0xe8, 0x04, - 0x08, 0x90, 0xa1, 0x89, 0xcb, 0x19, 0x50, 0xdf, 0xca, 0x1c, 0x01, - 0xbc, 0x1d, 0x04, 0x19, 0x7b, 0x10, 0x76, 0x97, 0x3b, 0xee, 0x90, - 0x90, 0xca, 0xc4, 0x0e, 0x1f, 0x16, 0x6e, 0x75, 0xef, 0x33, 0xf8, - 0xd3, 0x6f, 0x5b, 0x1e, 0x96, 0xe3, 0xe0, 0x74, 0x77, 0x74, 0x7b, - 0x8a, 0xa2, 0x6e, 0x2d, 0xdd, 0x76, 0xd6, 0x39, 0x30, 0x82, 0xf0, - 0xab, 0x9c, 0x52, 0xf2, 0x2a, 0xc7, 0xaf, 0x49, 0x5e, 0x7e, 0xc7, - 0x68, 0xe5, 0x82, 0x81, 0xc8, 0x6a, 0x27, 0xf9, 0x27, 0x88, 0x2a, - 0xd5, 0x58, 0x50, 0x95, 0x1f, 0xf0, 0x3b, 0x1c, 0x57, 0xbb, 0x7d, - 0x14, 0x39, 0x62, 0x2b, 0x9a, 0xc9, 0x94, 0x92, 0x2a, 0xa3, 0x22, - 0x0c, 0xff, 0x89, 0x26, 0x7d, 0x5f, 0x23, 0x2b, 0x47, 0xd7, 0x15, - 0x1d, 0xa9, 0x6a, 0x9e, 0x51, 0x0d, 0x2a, 0x51, 0x9e, 0x81, 0xf9, - 0xd4, 0x3b, 0x5e, 0x70, 0x12, 0x7f, 0x10, 0x32, 0x9c, 0x1e, 0xbb, - 0x9d, 0xf8, 0x66, 0xa8, 0x30, 0x82, 0x04, 0xbd, 0x30, 0x82, 0x03, - 0xa5, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, - 0x05, 0x00, 0x30, 0x7f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x45, 0x55, 0x31, 0x27, 0x30, 0x25, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1e, 0x41, 0x43, 0x20, 0x43, 0x61, - 0x6d, 0x65, 0x72, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x20, 0x53, 0x41, - 0x20, 0x43, 0x49, 0x46, 0x20, 0x41, 0x38, 0x32, 0x37, 0x34, 0x33, - 0x32, 0x38, 0x37, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, - 0x0b, 0x13, 0x1a, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, - 0x77, 0x77, 0x2e, 0x63, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, - 0x69, 0x67, 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x22, 0x30, 0x20, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x19, 0x43, 0x68, 0x61, 0x6d, - 0x62, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x43, 0x6f, 0x6d, - 0x6d, 0x65, 0x72, 0x63, 0x65, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, - 0x1e, 0x17, 0x0d, 0x30, 0x33, 0x30, 0x39, 0x33, 0x30, 0x31, 0x36, - 0x31, 0x33, 0x34, 0x33, 0x5a, 0x17, 0x0d, 0x33, 0x37, 0x30, 0x39, - 0x33, 0x30, 0x31, 0x36, 0x31, 0x33, 0x34, 0x34, 0x5a, 0x30, 0x7f, - 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x45, 0x55, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x13, 0x1e, 0x41, 0x43, 0x20, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x66, - 0x69, 0x72, 0x6d, 0x61, 0x20, 0x53, 0x41, 0x20, 0x43, 0x49, 0x46, - 0x20, 0x41, 0x38, 0x32, 0x37, 0x34, 0x33, 0x32, 0x38, 0x37, 0x31, - 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1a, 0x68, - 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x63, - 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x2e, - 0x6f, 0x72, 0x67, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x13, 0x19, 0x43, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, - 0x20, 0x6f, 0x66, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, - 0x65, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x82, 0x01, 0x20, 0x30, - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0d, 0x00, 0x30, 0x82, 0x01, - 0x08, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb7, 0x36, 0x55, 0xe5, 0xa5, - 0x5d, 0x18, 0x30, 0xe0, 0xda, 0x89, 0x54, 0x91, 0xfc, 0xc8, 0xc7, - 0x52, 0xf8, 0x2f, 0x50, 0xd9, 0xef, 0xb1, 0x75, 0x73, 0x65, 0x47, - 0x7d, 0x1b, 0x5b, 0xba, 0x75, 0xc5, 0xfc, 0xa1, 0x88, 0x24, 0xfa, - 0x2f, 0xed, 0xca, 0x08, 0x4a, 0x39, 0x54, 0xc4, 0x51, 0x7a, 0xb5, - 0xda, 0x60, 0xea, 0x38, 0x3c, 0x81, 0xb2, 0xcb, 0xf1, 0xbb, 0xd9, - 0x91, 0x23, 0x3f, 0x48, 0x01, 0x70, 0x75, 0xa9, 0x05, 0x2a, 0xad, - 0x1f, 0x71, 0xf3, 0xc9, 0x54, 0x3d, 0x1d, 0x06, 0x6a, 0x40, 0x3e, - 0xb3, 0x0c, 0x85, 0xee, 0x5c, 0x1b, 0x79, 0xc2, 0x62, 0xc4, 0xb8, - 0x36, 0x8e, 0x35, 0x5d, 0x01, 0x0c, 0x23, 0x04, 0x47, 0x35, 0xaa, - 0x9b, 0x60, 0x4e, 0xa0, 0x66, 0x3d, 0xcb, 0x26, 0x0a, 0x9c, 0x40, - 0xa1, 0xf4, 0x5d, 0x98, 0xbf, 0x71, 0xab, 0xa5, 0x00, 0x68, 0x2a, - 0xed, 0x83, 0x7a, 0x0f, 0xa2, 0x14, 0xb5, 0xd4, 0x22, 0xb3, 0x80, - 0xb0, 0x3c, 0x0c, 0x5a, 0x51, 0x69, 0x2d, 0x58, 0x18, 0x8f, 0xed, - 0x99, 0x9e, 0xf1, 0xae, 0xe2, 0x95, 0xe6, 0xf6, 0x47, 0xa8, 0xd6, - 0x0c, 0x0f, 0xb0, 0x58, 0x58, 0xdb, 0xc3, 0x66, 0x37, 0x9e, 0x9b, - 0x91, 0x54, 0x33, 0x37, 0xd2, 0x94, 0x1c, 0x6a, 0x48, 0xc9, 0xc9, - 0xf2, 0xa5, 0xda, 0xa5, 0x0c, 0x23, 0xf7, 0x23, 0x0e, 0x9c, 0x32, - 0x55, 0x5e, 0x71, 0x9c, 0x84, 0x05, 0x51, 0x9a, 0x2d, 0xfd, 0xe6, - 0x4e, 0x2a, 0x34, 0x5a, 0xde, 0xca, 0x40, 0x37, 0x67, 0x0c, 0x54, - 0x21, 0x55, 0x77, 0xda, 0x0a, 0x0c, 0xcc, 0x97, 0xae, 0x80, 0xdc, - 0x94, 0x36, 0x4a, 0xf4, 0x3e, 0xce, 0x36, 0x13, 0x1e, 0x53, 0xe4, - 0xac, 0x4e, 0x3a, 0x05, 0xec, 0xdb, 0xae, 0x72, 0x9c, 0x38, 0x8b, - 0xd0, 0x39, 0x3b, 0x89, 0x0a, 0x3e, 0x77, 0xfe, 0x75, 0x02, 0x01, - 0x03, 0xa3, 0x82, 0x01, 0x44, 0x30, 0x82, 0x01, 0x40, 0x30, 0x12, - 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, - 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x0c, 0x30, 0x3c, 0x06, 0x03, - 0x55, 0x1d, 0x1f, 0x04, 0x35, 0x30, 0x33, 0x30, 0x31, 0xa0, 0x2f, - 0xa0, 0x2d, 0x86, 0x2b, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, - 0x63, 0x72, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, - 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x68, - 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x2e, - 0x63, 0x72, 0x6c, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, - 0x16, 0x04, 0x14, 0xe3, 0x94, 0xf5, 0xb1, 0x4d, 0xe9, 0xdb, 0xa1, - 0x29, 0x5b, 0x57, 0x8b, 0x4d, 0x76, 0x06, 0x76, 0xe1, 0xd1, 0xa2, - 0x8a, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, - 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x11, 0x06, 0x09, 0x60, - 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, - 0x02, 0x00, 0x07, 0x30, 0x27, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, - 0x20, 0x30, 0x1e, 0x81, 0x1c, 0x63, 0x68, 0x61, 0x6d, 0x62, 0x65, - 0x72, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x40, 0x63, 0x68, 0x61, 0x6d, - 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x6f, 0x72, 0x67, - 0x30, 0x27, 0x06, 0x03, 0x55, 0x1d, 0x12, 0x04, 0x20, 0x30, 0x1e, - 0x81, 0x1c, 0x63, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x72, - 0x6f, 0x6f, 0x74, 0x40, 0x63, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, - 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x30, 0x58, 0x06, - 0x03, 0x55, 0x1d, 0x20, 0x04, 0x51, 0x30, 0x4f, 0x30, 0x4d, 0x06, - 0x0b, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x81, 0x87, 0x2e, 0x0a, 0x03, - 0x01, 0x30, 0x3e, 0x30, 0x3c, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, - 0x05, 0x07, 0x02, 0x01, 0x16, 0x30, 0x68, 0x74, 0x74, 0x70, 0x3a, - 0x2f, 0x2f, 0x63, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x6d, 0x62, - 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x2f, - 0x63, 0x70, 0x73, 0x2f, 0x63, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, - 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x30, - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x0c, 0x41, 0x97, - 0xc2, 0x1a, 0x86, 0xc0, 0x22, 0x7c, 0x9f, 0xfb, 0x90, 0xf3, 0x1a, - 0xd1, 0x03, 0xb1, 0xef, 0x13, 0xf9, 0x21, 0x5f, 0x04, 0x9c, 0xda, - 0xc9, 0xa5, 0x8d, 0x27, 0x6c, 0x96, 0x87, 0x91, 0xbe, 0x41, 0x90, - 0x01, 0x72, 0x93, 0xe7, 0x1e, 0x7d, 0x5f, 0xf6, 0x89, 0xc6, 0x5d, - 0xa7, 0x40, 0x09, 0x3d, 0xac, 0x49, 0x45, 0x45, 0xdc, 0x2e, 0x8d, - 0x30, 0x68, 0xb2, 0x09, 0xba, 0xfb, 0xc3, 0x2f, 0xcc, 0xba, 0x0b, - 0xdf, 0x3f, 0x77, 0x7b, 0x46, 0x7d, 0x3a, 0x12, 0x24, 0x8e, 0x96, - 0x8f, 0x3c, 0x05, 0x0a, 0x6f, 0xd2, 0x94, 0x28, 0x1d, 0x6d, 0x0c, - 0xc0, 0x2e, 0x88, 0x22, 0xd5, 0xd8, 0xcf, 0x1d, 0x13, 0xc7, 0xf0, - 0x48, 0xd7, 0xd7, 0x05, 0xa7, 0xcf, 0xc7, 0x47, 0x9e, 0x3b, 0x3c, - 0x34, 0xc8, 0x80, 0x4f, 0xd4, 0x14, 0xbb, 0xfc, 0x0d, 0x50, 0xf7, - 0xfa, 0xb3, 0xec, 0x42, 0x5f, 0xa9, 0xdd, 0x6d, 0xc8, 0xf4, 0x75, - 0xcf, 0x7b, 0xc1, 0x72, 0x26, 0xb1, 0x01, 0x1c, 0x5c, 0x2c, 0xfd, - 0x7a, 0x4e, 0xb4, 0x01, 0xc5, 0x05, 0x57, 0xb9, 0xe7, 0x3c, 0xaa, - 0x05, 0xd9, 0x88, 0xe9, 0x07, 0x46, 0x41, 0xce, 0xef, 0x41, 0x81, - 0xae, 0x58, 0xdf, 0x83, 0xa2, 0xae, 0xca, 0xd7, 0x77, 0x1f, 0xe7, - 0x00, 0x3c, 0x9d, 0x6f, 0x8e, 0xe4, 0x32, 0x09, 0x1d, 0x4d, 0x78, - 0x34, 0x78, 0x34, 0x3c, 0x94, 0x9b, 0x26, 0xed, 0x4f, 0x71, 0xc6, - 0x19, 0x7a, 0xbd, 0x20, 0x22, 0x48, 0x5a, 0xfe, 0x4b, 0x7d, 0x03, - 0xb7, 0xe7, 0x58, 0xbe, 0xc6, 0x32, 0x4e, 0x74, 0x1e, 0x68, 0xdd, - 0xa8, 0x68, 0x5b, 0xb3, 0x3e, 0xee, 0x62, 0x7d, 0xd9, 0x80, 0xe8, - 0x0a, 0x75, 0x7a, 0xb7, 0xee, 0xb4, 0x65, 0x9a, 0x21, 0x90, 0xe0, - 0xaa, 0xd0, 0x98, 0xbc, 0x38, 0xb5, 0x73, 0x3c, 0x8b, 0xf8, 0xdc, - 0x30, 0x82, 0x04, 0xc5, 0x30, 0x82, 0x03, 0xad, 0xa0, 0x03, 0x02, - 0x01, 0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x7d, - 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x45, 0x55, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x13, 0x1e, 0x41, 0x43, 0x20, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x66, - 0x69, 0x72, 0x6d, 0x61, 0x20, 0x53, 0x41, 0x20, 0x43, 0x49, 0x46, - 0x20, 0x41, 0x38, 0x32, 0x37, 0x34, 0x33, 0x32, 0x38, 0x37, 0x31, - 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1a, 0x68, - 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x63, - 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x2e, - 0x6f, 0x72, 0x67, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x13, 0x17, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x43, - 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x20, + 0x47, 0x43, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, + 0x01, 0x00, 0xdf, 0xee, 0x58, 0x10, 0xa2, 0x2b, 0x6e, 0x55, 0xc4, + 0x8e, 0xbf, 0x2e, 0x46, 0x09, 0xe7, 0xe0, 0x08, 0x0f, 0x2e, 0x2b, + 0x7a, 0x13, 0x94, 0x1b, 0xbd, 0xf6, 0xb6, 0x80, 0x8e, 0x65, 0x05, + 0x93, 0x00, 0x1e, 0xbc, 0xaf, 0xe2, 0x0f, 0x8e, 0x19, 0x0d, 0x12, + 0x47, 0xec, 0xac, 0xad, 0xa3, 0xfa, 0x2e, 0x70, 0xf8, 0xde, 0x6e, + 0xfb, 0x56, 0x42, 0x15, 0x9e, 0x2e, 0x5c, 0xef, 0x23, 0xde, 0x21, + 0xb9, 0x05, 0x76, 0x27, 0x19, 0x0f, 0x4f, 0xd6, 0xc3, 0x9c, 0xb4, + 0xbe, 0x94, 0x19, 0x63, 0xf2, 0xa6, 0x11, 0x0a, 0xeb, 0x53, 0x48, + 0x9c, 0xbe, 0xf2, 0x29, 0x3b, 0x16, 0xe8, 0x1a, 0xa0, 0x4c, 0xa6, + 0xc9, 0xf4, 0x18, 0x59, 0x68, 0xc0, 0x70, 0xf2, 0x53, 0x00, 0xc0, + 0x5e, 0x50, 0x82, 0xa5, 0x56, 0x6f, 0x36, 0xf9, 0x4a, 0xe0, 0x44, + 0x86, 0xa0, 0x4d, 0x4e, 0xd6, 0x47, 0x6e, 0x49, 0x4a, 0xcb, 0x67, + 0xd7, 0xa6, 0xc4, 0x05, 0xb9, 0x8e, 0x1e, 0xf4, 0xfc, 0xff, 0xcd, + 0xe7, 0x36, 0xe0, 0x9c, 0x05, 0x6c, 0xb2, 0x33, 0x22, 0x15, 0xd0, + 0xb4, 0xe0, 0xcc, 0x17, 0xc0, 0xb2, 0xc0, 0xf4, 0xfe, 0x32, 0x3f, + 0x29, 0x2a, 0x95, 0x7b, 0xd8, 0xf2, 0xa7, 0x4e, 0x0f, 0x54, 0x7c, + 0xa1, 0x0d, 0x80, 0xb3, 0x09, 0x03, 0xc1, 0xff, 0x5c, 0xdd, 0x5e, + 0x9a, 0x3e, 0xbc, 0xae, 0xbc, 0x47, 0x8a, 0x6a, 0xae, 0x71, 0xca, + 0x1f, 0xb1, 0x2a, 0xb8, 0x5f, 0x42, 0x05, 0x0b, 0xec, 0x46, 0x30, + 0xd1, 0x72, 0x0b, 0xca, 0xe9, 0x56, 0x6d, 0xf5, 0xef, 0xdf, 0x78, + 0xbe, 0x61, 0xba, 0xb2, 0xa5, 0xae, 0x04, 0x4c, 0xbc, 0xa8, 0xac, + 0x69, 0x15, 0x97, 0xbd, 0xef, 0xeb, 0xb4, 0x8c, 0xbf, 0x35, 0xf8, + 0xd4, 0xc3, 0xd1, 0x28, 0x0e, 0x5c, 0x3a, 0x9f, 0x70, 0x18, 0x33, + 0x20, 0x77, 0xc4, 0xa2, 0xaf, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, + 0x81, 0xab, 0x30, 0x81, 0xa8, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, + 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0xc6, 0x30, 0x0f, 0x06, 0x03, + 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, + 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, + 0x04, 0x14, 0x53, 0x32, 0xd1, 0xb3, 0xcf, 0x7f, 0xfa, 0xe0, 0xf1, + 0xa0, 0x5d, 0x85, 0x4e, 0x92, 0xd2, 0x9e, 0x45, 0x1d, 0xb4, 0x4f, + 0x30, 0x3d, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x36, 0x30, 0x34, + 0x30, 0x32, 0xa0, 0x30, 0xa0, 0x2e, 0x86, 0x2c, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x55, 0x54, 0x4e, 0x2d, 0x44, 0x41, 0x54, 0x41, 0x43, 0x6f, 0x72, + 0x70, 0x53, 0x47, 0x43, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x2a, 0x06, + 0x03, 0x55, 0x1d, 0x25, 0x04, 0x23, 0x30, 0x21, 0x06, 0x08, 0x2b, + 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x06, 0x0a, 0x2b, 0x06, + 0x01, 0x04, 0x01, 0x82, 0x37, 0x0a, 0x03, 0x03, 0x06, 0x09, 0x60, + 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x04, 0x01, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x27, 0x35, 0x97, 0x00, 0x8a, + 0x8b, 0x28, 0xbd, 0xc6, 0x33, 0x30, 0x1e, 0x29, 0xfc, 0xe2, 0xf7, + 0xd5, 0x98, 0xd4, 0x40, 0xbb, 0x60, 0xca, 0xbf, 0xab, 0x17, 0x2c, + 0x09, 0x36, 0x7f, 0x50, 0xfa, 0x41, 0xdc, 0xae, 0x96, 0x3a, 0x0a, + 0x23, 0x3e, 0x89, 0x59, 0xc9, 0xa3, 0x07, 0xed, 0x1b, 0x37, 0xad, + 0xfc, 0x7c, 0xbe, 0x51, 0x49, 0x5a, 0xde, 0x3a, 0x0a, 0x54, 0x08, + 0x16, 0x45, 0xc2, 0x99, 0xb1, 0x87, 0xcd, 0x8c, 0x68, 0xe0, 0x69, + 0x03, 0xe9, 0xc4, 0x4e, 0x98, 0xb2, 0x3b, 0x8c, 0x16, 0xb3, 0x0e, + 0xa0, 0x0c, 0x98, 0x50, 0x9b, 0x93, 0xa9, 0x70, 0x09, 0xc8, 0x2c, + 0xa3, 0x8f, 0xdf, 0x02, 0xe4, 0xe0, 0x71, 0x3a, 0xf1, 0xb4, 0x23, + 0x72, 0xa0, 0xaa, 0x01, 0xdf, 0xdf, 0x98, 0x3e, 0x14, 0x50, 0xa0, + 0x31, 0x26, 0xbd, 0x28, 0xe9, 0x5a, 0x30, 0x26, 0x75, 0xf9, 0x7b, + 0x60, 0x1c, 0x8d, 0xf3, 0xcd, 0x50, 0x26, 0x6d, 0x04, 0x27, 0x9a, + 0xdf, 0xd5, 0x0d, 0x45, 0x47, 0x29, 0x6b, 0x2c, 0xe6, 0x76, 0xd9, + 0xa9, 0x29, 0x7d, 0x32, 0xdd, 0xc9, 0x36, 0x3c, 0xbd, 0xae, 0x35, + 0xf1, 0x11, 0x9e, 0x1d, 0xbb, 0x90, 0x3f, 0x12, 0x47, 0x4e, 0x8e, + 0xd7, 0x7e, 0x0f, 0x62, 0x73, 0x1d, 0x52, 0x26, 0x38, 0x1c, 0x18, + 0x49, 0xfd, 0x30, 0x74, 0x9a, 0xc4, 0xe5, 0x22, 0x2f, 0xd8, 0xc0, + 0x8d, 0xed, 0x91, 0x7a, 0x4c, 0x00, 0x8f, 0x72, 0x7f, 0x5d, 0xda, + 0xdd, 0x1b, 0x8b, 0x45, 0x6b, 0xe7, 0xdd, 0x69, 0x97, 0xa8, 0xc5, + 0x56, 0x4c, 0x0f, 0x0c, 0xf6, 0x9f, 0x7a, 0x91, 0x37, 0xf6, 0x97, + 0x82, 0xe0, 0xdd, 0x71, 0x69, 0xff, 0x76, 0x3f, 0x60, 0x4d, 0x3c, + 0xcf, 0xf7, 0x99, 0xf9, 0xc6, 0x57, 0xf4, 0xc9, 0x55, 0x39, 0x78, + 0xba, 0x2c, 0x79, 0xc9, 0xa6, 0x88, 0x2b, 0xf4, 0x08, 0x30, 0x82, + 0x04, 0x74, 0x30, 0x82, 0x03, 0x5c, 0xa0, 0x03, 0x02, 0x01, 0x02, + 0x02, 0x10, 0x44, 0xbe, 0x0c, 0x8b, 0x50, 0x00, 0x24, 0xb4, 0x11, + 0xd3, 0x36, 0x2a, 0xfe, 0x65, 0x0a, 0xfd, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, + 0x30, 0x81, 0x97, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x08, 0x13, 0x02, 0x55, 0x54, 0x31, 0x17, 0x30, 0x15, + 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0e, 0x53, 0x61, 0x6c, 0x74, + 0x20, 0x4c, 0x61, 0x6b, 0x65, 0x20, 0x43, 0x69, 0x74, 0x79, 0x31, + 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x54, + 0x68, 0x65, 0x20, 0x55, 0x53, 0x45, 0x52, 0x54, 0x52, 0x55, 0x53, + 0x54, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x21, + 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x18, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x75, 0x73, + 0x65, 0x72, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x6d, + 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x16, + 0x55, 0x54, 0x4e, 0x2d, 0x55, 0x53, 0x45, 0x52, 0x46, 0x69, 0x72, + 0x73, 0x74, 0x2d, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, + 0x30, 0x1e, 0x17, 0x0d, 0x39, 0x39, 0x30, 0x37, 0x30, 0x39, 0x31, + 0x38, 0x31, 0x30, 0x34, 0x32, 0x5a, 0x17, 0x0d, 0x31, 0x39, 0x30, + 0x37, 0x30, 0x39, 0x31, 0x38, 0x31, 0x39, 0x32, 0x32, 0x5a, 0x30, + 0x81, 0x97, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x55, 0x53, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x08, 0x13, 0x02, 0x55, 0x54, 0x31, 0x17, 0x30, 0x15, 0x06, + 0x03, 0x55, 0x04, 0x07, 0x13, 0x0e, 0x53, 0x61, 0x6c, 0x74, 0x20, + 0x4c, 0x61, 0x6b, 0x65, 0x20, 0x43, 0x69, 0x74, 0x79, 0x31, 0x1e, + 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x54, 0x68, + 0x65, 0x20, 0x55, 0x53, 0x45, 0x52, 0x54, 0x52, 0x55, 0x53, 0x54, + 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x21, 0x30, + 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x18, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, + 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x16, 0x55, + 0x54, 0x4e, 0x2d, 0x55, 0x53, 0x45, 0x52, 0x46, 0x69, 0x72, 0x73, + 0x74, 0x2d, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x30, + 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, + 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb1, + 0xf7, 0xc3, 0x38, 0x3f, 0xb4, 0xa8, 0x7f, 0xcf, 0x39, 0x82, 0x51, + 0x67, 0xd0, 0x6d, 0x9f, 0xd2, 0xff, 0x58, 0xf3, 0xe7, 0x9f, 0x2b, + 0xec, 0x0d, 0x89, 0x54, 0x99, 0xb9, 0x38, 0x99, 0x16, 0xf7, 0xe0, + 0x21, 0x79, 0x48, 0xc2, 0xbb, 0x61, 0x74, 0x12, 0x96, 0x1d, 0x3c, + 0x6a, 0x72, 0xd5, 0x3c, 0x10, 0x67, 0x3a, 0x39, 0xed, 0x2b, 0x13, + 0xcd, 0x66, 0xeb, 0x95, 0x09, 0x33, 0xa4, 0x6c, 0x97, 0xb1, 0xe8, + 0xc6, 0xec, 0xc1, 0x75, 0x79, 0x9c, 0x46, 0x5e, 0x8d, 0xab, 0xd0, + 0x6a, 0xfd, 0xb9, 0x2a, 0x55, 0x17, 0x10, 0x54, 0xb3, 0x19, 0xf0, + 0x9a, 0xf6, 0xf1, 0xb1, 0x5d, 0xb6, 0xa7, 0x6d, 0xfb, 0xe0, 0x71, + 0x17, 0x6b, 0xa2, 0x88, 0xfb, 0x00, 0xdf, 0xfe, 0x1a, 0x31, 0x77, + 0x0c, 0x9a, 0x01, 0x7a, 0xb1, 0x32, 0xe3, 0x2b, 0x01, 0x07, 0x38, + 0x6e, 0xc3, 0xa5, 0x5e, 0x23, 0xbc, 0x45, 0x9b, 0x7b, 0x50, 0xc1, + 0xc9, 0x30, 0x8f, 0xdb, 0xe5, 0x2b, 0x7a, 0xd3, 0x5b, 0xfb, 0x33, + 0x40, 0x1e, 0xa0, 0xd5, 0x98, 0x17, 0xbc, 0x8b, 0x87, 0xc3, 0x89, + 0xd3, 0x5d, 0xa0, 0x8e, 0xb2, 0xaa, 0xaa, 0xf6, 0x8e, 0x69, 0x88, + 0x06, 0xc5, 0xfa, 0x89, 0x21, 0xf3, 0x08, 0x9d, 0x69, 0x2e, 0x09, + 0x33, 0x9b, 0x29, 0x0d, 0x46, 0x0f, 0x8c, 0xcc, 0x49, 0x34, 0xb0, + 0x69, 0x51, 0xbd, 0xf9, 0x06, 0xcd, 0x68, 0xad, 0x66, 0x4c, 0xbc, + 0x3e, 0xac, 0x61, 0xbd, 0x0a, 0x88, 0x0e, 0xc8, 0xdf, 0x3d, 0xee, + 0x7c, 0x04, 0x4c, 0x9d, 0x0a, 0x5e, 0x6b, 0x91, 0xd6, 0xee, 0xc7, + 0xed, 0x28, 0x8d, 0xab, 0x4d, 0x87, 0x89, 0x73, 0xd0, 0x6e, 0xa4, + 0xd0, 0x1e, 0x16, 0x8b, 0x14, 0xe1, 0x76, 0x44, 0x03, 0x7f, 0x63, + 0xac, 0xe4, 0xcd, 0x49, 0x9c, 0xc5, 0x92, 0xf4, 0xab, 0x32, 0xa1, + 0x48, 0x5b, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xb9, 0x30, + 0x81, 0xb6, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, + 0x03, 0x02, 0x01, 0xc6, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, + 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa1, + 0x72, 0x5f, 0x26, 0x1b, 0x28, 0x98, 0x43, 0x95, 0x5d, 0x07, 0x37, + 0xd5, 0x85, 0x96, 0x9d, 0x4b, 0xd2, 0xc3, 0x45, 0x30, 0x44, 0x06, + 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x3d, 0x30, 0x3b, 0x30, 0x39, 0xa0, + 0x37, 0xa0, 0x35, 0x86, 0x33, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x72, + 0x75, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x55, 0x54, 0x4e, + 0x2d, 0x55, 0x53, 0x45, 0x52, 0x46, 0x69, 0x72, 0x73, 0x74, 0x2d, + 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x63, 0x72, + 0x6c, 0x30, 0x31, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x2a, 0x30, + 0x28, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, + 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x05, 0x06, + 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x06, 0x06, 0x08, + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x07, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x47, 0x19, 0x0f, 0xde, 0x74, + 0xc6, 0x99, 0x97, 0xaf, 0xfc, 0xad, 0x28, 0x5e, 0x75, 0x8e, 0xeb, + 0x2d, 0x67, 0xee, 0x4e, 0x7b, 0x2b, 0xd7, 0x0c, 0xff, 0xf6, 0xde, + 0xcb, 0x55, 0xa2, 0x0a, 0xe1, 0x4c, 0x54, 0x65, 0x93, 0x60, 0x6b, + 0x9f, 0x12, 0x9c, 0xad, 0x5e, 0x83, 0x2c, 0xeb, 0x5a, 0xae, 0xc0, + 0xe4, 0x2d, 0xf4, 0x00, 0x63, 0x1d, 0xb8, 0xc0, 0x6c, 0xf2, 0xcf, + 0x49, 0xbb, 0x4d, 0x93, 0x6f, 0x06, 0xa6, 0x0a, 0x22, 0xb2, 0x49, + 0x62, 0x08, 0x4e, 0xff, 0xc8, 0xc8, 0x14, 0xb2, 0x88, 0x16, 0x5d, + 0xe7, 0x01, 0xe4, 0x12, 0x95, 0xe5, 0x45, 0x34, 0xb3, 0x8b, 0x69, + 0xbd, 0xcf, 0xb4, 0x85, 0x8f, 0x75, 0x51, 0x9e, 0x7d, 0x3a, 0x38, + 0x3a, 0x14, 0x48, 0x12, 0xc6, 0xfb, 0xa7, 0x3b, 0x1a, 0x8d, 0x0d, + 0x82, 0x40, 0x07, 0xe8, 0x04, 0x08, 0x90, 0xa1, 0x89, 0xcb, 0x19, + 0x50, 0xdf, 0xca, 0x1c, 0x01, 0xbc, 0x1d, 0x04, 0x19, 0x7b, 0x10, + 0x76, 0x97, 0x3b, 0xee, 0x90, 0x90, 0xca, 0xc4, 0x0e, 0x1f, 0x16, + 0x6e, 0x75, 0xef, 0x33, 0xf8, 0xd3, 0x6f, 0x5b, 0x1e, 0x96, 0xe3, + 0xe0, 0x74, 0x77, 0x74, 0x7b, 0x8a, 0xa2, 0x6e, 0x2d, 0xdd, 0x76, + 0xd6, 0x39, 0x30, 0x82, 0xf0, 0xab, 0x9c, 0x52, 0xf2, 0x2a, 0xc7, + 0xaf, 0x49, 0x5e, 0x7e, 0xc7, 0x68, 0xe5, 0x82, 0x81, 0xc8, 0x6a, + 0x27, 0xf9, 0x27, 0x88, 0x2a, 0xd5, 0x58, 0x50, 0x95, 0x1f, 0xf0, + 0x3b, 0x1c, 0x57, 0xbb, 0x7d, 0x14, 0x39, 0x62, 0x2b, 0x9a, 0xc9, + 0x94, 0x92, 0x2a, 0xa3, 0x22, 0x0c, 0xff, 0x89, 0x26, 0x7d, 0x5f, + 0x23, 0x2b, 0x47, 0xd7, 0x15, 0x1d, 0xa9, 0x6a, 0x9e, 0x51, 0x0d, + 0x2a, 0x51, 0x9e, 0x81, 0xf9, 0xd4, 0x3b, 0x5e, 0x70, 0x12, 0x7f, + 0x10, 0x32, 0x9c, 0x1e, 0xbb, 0x9d, 0xf8, 0x66, 0xa8, 0x30, 0x82, + 0x04, 0xbd, 0x30, 0x82, 0x03, 0xa5, 0xa0, 0x03, 0x02, 0x01, 0x02, + 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x7f, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x55, + 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1e, + 0x41, 0x43, 0x20, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x66, 0x69, 0x72, + 0x6d, 0x61, 0x20, 0x53, 0x41, 0x20, 0x43, 0x49, 0x46, 0x20, 0x41, + 0x38, 0x32, 0x37, 0x34, 0x33, 0x32, 0x38, 0x37, 0x31, 0x23, 0x30, + 0x21, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1a, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x63, 0x68, 0x61, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x6f, 0x72, + 0x67, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, + 0x19, 0x43, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x65, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x33, 0x30, - 0x39, 0x33, 0x30, 0x31, 0x36, 0x31, 0x34, 0x31, 0x38, 0x5a, 0x17, - 0x0d, 0x33, 0x37, 0x30, 0x39, 0x33, 0x30, 0x31, 0x36, 0x31, 0x34, - 0x31, 0x38, 0x5a, 0x30, 0x7d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x39, 0x33, 0x30, 0x31, 0x36, 0x31, 0x33, 0x34, 0x33, 0x5a, 0x17, + 0x0d, 0x33, 0x37, 0x30, 0x39, 0x33, 0x30, 0x31, 0x36, 0x31, 0x33, + 0x34, 0x34, 0x5a, 0x30, 0x7f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x55, 0x31, 0x27, 0x30, 0x25, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1e, 0x41, 0x43, 0x20, 0x43, + 0x61, 0x6d, 0x65, 0x72, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x20, 0x53, + 0x41, 0x20, 0x43, 0x49, 0x46, 0x20, 0x41, 0x38, 0x32, 0x37, 0x34, + 0x33, 0x32, 0x38, 0x37, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, + 0x04, 0x0b, 0x13, 0x1a, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x77, 0x77, 0x77, 0x2e, 0x63, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, + 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x22, 0x30, + 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x19, 0x43, 0x68, 0x61, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x43, 0x6f, + 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x65, 0x20, 0x52, 0x6f, 0x6f, 0x74, + 0x30, 0x82, 0x01, 0x20, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x0d, 0x00, 0x30, 0x82, 0x01, 0x08, 0x02, 0x82, 0x01, 0x01, 0x00, + 0xb7, 0x36, 0x55, 0xe5, 0xa5, 0x5d, 0x18, 0x30, 0xe0, 0xda, 0x89, + 0x54, 0x91, 0xfc, 0xc8, 0xc7, 0x52, 0xf8, 0x2f, 0x50, 0xd9, 0xef, + 0xb1, 0x75, 0x73, 0x65, 0x47, 0x7d, 0x1b, 0x5b, 0xba, 0x75, 0xc5, + 0xfc, 0xa1, 0x88, 0x24, 0xfa, 0x2f, 0xed, 0xca, 0x08, 0x4a, 0x39, + 0x54, 0xc4, 0x51, 0x7a, 0xb5, 0xda, 0x60, 0xea, 0x38, 0x3c, 0x81, + 0xb2, 0xcb, 0xf1, 0xbb, 0xd9, 0x91, 0x23, 0x3f, 0x48, 0x01, 0x70, + 0x75, 0xa9, 0x05, 0x2a, 0xad, 0x1f, 0x71, 0xf3, 0xc9, 0x54, 0x3d, + 0x1d, 0x06, 0x6a, 0x40, 0x3e, 0xb3, 0x0c, 0x85, 0xee, 0x5c, 0x1b, + 0x79, 0xc2, 0x62, 0xc4, 0xb8, 0x36, 0x8e, 0x35, 0x5d, 0x01, 0x0c, + 0x23, 0x04, 0x47, 0x35, 0xaa, 0x9b, 0x60, 0x4e, 0xa0, 0x66, 0x3d, + 0xcb, 0x26, 0x0a, 0x9c, 0x40, 0xa1, 0xf4, 0x5d, 0x98, 0xbf, 0x71, + 0xab, 0xa5, 0x00, 0x68, 0x2a, 0xed, 0x83, 0x7a, 0x0f, 0xa2, 0x14, + 0xb5, 0xd4, 0x22, 0xb3, 0x80, 0xb0, 0x3c, 0x0c, 0x5a, 0x51, 0x69, + 0x2d, 0x58, 0x18, 0x8f, 0xed, 0x99, 0x9e, 0xf1, 0xae, 0xe2, 0x95, + 0xe6, 0xf6, 0x47, 0xa8, 0xd6, 0x0c, 0x0f, 0xb0, 0x58, 0x58, 0xdb, + 0xc3, 0x66, 0x37, 0x9e, 0x9b, 0x91, 0x54, 0x33, 0x37, 0xd2, 0x94, + 0x1c, 0x6a, 0x48, 0xc9, 0xc9, 0xf2, 0xa5, 0xda, 0xa5, 0x0c, 0x23, + 0xf7, 0x23, 0x0e, 0x9c, 0x32, 0x55, 0x5e, 0x71, 0x9c, 0x84, 0x05, + 0x51, 0x9a, 0x2d, 0xfd, 0xe6, 0x4e, 0x2a, 0x34, 0x5a, 0xde, 0xca, + 0x40, 0x37, 0x67, 0x0c, 0x54, 0x21, 0x55, 0x77, 0xda, 0x0a, 0x0c, + 0xcc, 0x97, 0xae, 0x80, 0xdc, 0x94, 0x36, 0x4a, 0xf4, 0x3e, 0xce, + 0x36, 0x13, 0x1e, 0x53, 0xe4, 0xac, 0x4e, 0x3a, 0x05, 0xec, 0xdb, + 0xae, 0x72, 0x9c, 0x38, 0x8b, 0xd0, 0x39, 0x3b, 0x89, 0x0a, 0x3e, + 0x77, 0xfe, 0x75, 0x02, 0x01, 0x03, 0xa3, 0x82, 0x01, 0x44, 0x30, + 0x82, 0x01, 0x40, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, + 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, + 0x0c, 0x30, 0x3c, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x35, 0x30, + 0x33, 0x30, 0x31, 0xa0, 0x2f, 0xa0, 0x2d, 0x86, 0x2b, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x63, 0x68, + 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x6f, + 0x72, 0x67, 0x2f, 0x63, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x1d, 0x06, + 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xe3, 0x94, 0xf5, + 0xb1, 0x4d, 0xe9, 0xdb, 0xa1, 0x29, 0x5b, 0x57, 0x8b, 0x4d, 0x76, + 0x06, 0x76, 0xe1, 0xd1, 0xa2, 0x8a, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, + 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, + 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, 0x00, 0x07, 0x30, 0x27, 0x06, + 0x03, 0x55, 0x1d, 0x11, 0x04, 0x20, 0x30, 0x1e, 0x81, 0x1c, 0x63, + 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x72, 0x6f, 0x6f, 0x74, + 0x40, 0x63, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, + 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x30, 0x27, 0x06, 0x03, 0x55, 0x1d, + 0x12, 0x04, 0x20, 0x30, 0x1e, 0x81, 0x1c, 0x63, 0x68, 0x61, 0x6d, + 0x62, 0x65, 0x72, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x40, 0x63, 0x68, + 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x6f, + 0x72, 0x67, 0x30, 0x58, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x51, + 0x30, 0x4f, 0x30, 0x4d, 0x06, 0x0b, 0x2b, 0x06, 0x01, 0x04, 0x01, + 0x81, 0x87, 0x2e, 0x0a, 0x03, 0x01, 0x30, 0x3e, 0x30, 0x3c, 0x06, + 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x30, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x70, 0x73, 0x2e, + 0x63, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, + 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x70, 0x73, 0x2f, 0x63, 0x68, + 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x2e, + 0x68, 0x74, 0x6d, 0x6c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x01, 0x00, 0x0c, 0x41, 0x97, 0xc2, 0x1a, 0x86, 0xc0, 0x22, 0x7c, + 0x9f, 0xfb, 0x90, 0xf3, 0x1a, 0xd1, 0x03, 0xb1, 0xef, 0x13, 0xf9, + 0x21, 0x5f, 0x04, 0x9c, 0xda, 0xc9, 0xa5, 0x8d, 0x27, 0x6c, 0x96, + 0x87, 0x91, 0xbe, 0x41, 0x90, 0x01, 0x72, 0x93, 0xe7, 0x1e, 0x7d, + 0x5f, 0xf6, 0x89, 0xc6, 0x5d, 0xa7, 0x40, 0x09, 0x3d, 0xac, 0x49, + 0x45, 0x45, 0xdc, 0x2e, 0x8d, 0x30, 0x68, 0xb2, 0x09, 0xba, 0xfb, + 0xc3, 0x2f, 0xcc, 0xba, 0x0b, 0xdf, 0x3f, 0x77, 0x7b, 0x46, 0x7d, + 0x3a, 0x12, 0x24, 0x8e, 0x96, 0x8f, 0x3c, 0x05, 0x0a, 0x6f, 0xd2, + 0x94, 0x28, 0x1d, 0x6d, 0x0c, 0xc0, 0x2e, 0x88, 0x22, 0xd5, 0xd8, + 0xcf, 0x1d, 0x13, 0xc7, 0xf0, 0x48, 0xd7, 0xd7, 0x05, 0xa7, 0xcf, + 0xc7, 0x47, 0x9e, 0x3b, 0x3c, 0x34, 0xc8, 0x80, 0x4f, 0xd4, 0x14, + 0xbb, 0xfc, 0x0d, 0x50, 0xf7, 0xfa, 0xb3, 0xec, 0x42, 0x5f, 0xa9, + 0xdd, 0x6d, 0xc8, 0xf4, 0x75, 0xcf, 0x7b, 0xc1, 0x72, 0x26, 0xb1, + 0x01, 0x1c, 0x5c, 0x2c, 0xfd, 0x7a, 0x4e, 0xb4, 0x01, 0xc5, 0x05, + 0x57, 0xb9, 0xe7, 0x3c, 0xaa, 0x05, 0xd9, 0x88, 0xe9, 0x07, 0x46, + 0x41, 0xce, 0xef, 0x41, 0x81, 0xae, 0x58, 0xdf, 0x83, 0xa2, 0xae, + 0xca, 0xd7, 0x77, 0x1f, 0xe7, 0x00, 0x3c, 0x9d, 0x6f, 0x8e, 0xe4, + 0x32, 0x09, 0x1d, 0x4d, 0x78, 0x34, 0x78, 0x34, 0x3c, 0x94, 0x9b, + 0x26, 0xed, 0x4f, 0x71, 0xc6, 0x19, 0x7a, 0xbd, 0x20, 0x22, 0x48, + 0x5a, 0xfe, 0x4b, 0x7d, 0x03, 0xb7, 0xe7, 0x58, 0xbe, 0xc6, 0x32, + 0x4e, 0x74, 0x1e, 0x68, 0xdd, 0xa8, 0x68, 0x5b, 0xb3, 0x3e, 0xee, + 0x62, 0x7d, 0xd9, 0x80, 0xe8, 0x0a, 0x75, 0x7a, 0xb7, 0xee, 0xb4, + 0x65, 0x9a, 0x21, 0x90, 0xe0, 0xaa, 0xd0, 0x98, 0xbc, 0x38, 0xb5, + 0x73, 0x3c, 0x8b, 0xf8, 0xdc, 0x30, 0x82, 0x04, 0xc5, 0x30, 0x82, + 0x03, 0xad, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x05, 0x05, 0x00, 0x30, 0x7d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x55, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1e, 0x41, 0x43, 0x20, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x20, 0x53, @@ -4483,386 +3109,110 @@ static const unsigned char ca_bundle_data[] = { 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x43, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, - 0x73, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x82, - 0x01, 0x20, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0d, 0x00, - 0x30, 0x82, 0x01, 0x08, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa2, 0x70, - 0xa2, 0xd0, 0x9f, 0x42, 0xae, 0x5b, 0x17, 0xc7, 0xd8, 0x7d, 0xcf, - 0x14, 0x83, 0xfc, 0x4f, 0xc9, 0xa1, 0xb7, 0x13, 0xaf, 0x8a, 0xd7, - 0x9e, 0x3e, 0x04, 0x0a, 0x92, 0x8b, 0x60, 0x56, 0xfa, 0xb4, 0x32, - 0x2f, 0x88, 0x4d, 0xa1, 0x60, 0x08, 0xf4, 0xb7, 0x09, 0x4e, 0xa0, - 0x49, 0x2f, 0x49, 0xd6, 0xd3, 0xdf, 0x9d, 0x97, 0x5a, 0x9f, 0x94, - 0x04, 0x70, 0xec, 0x3f, 0x59, 0xd9, 0xb7, 0xcc, 0x66, 0x8b, 0x98, - 0x52, 0x28, 0x09, 0x02, 0xdf, 0xc5, 0x2f, 0x84, 0x8d, 0x7a, 0x97, - 0x77, 0xbf, 0xec, 0x40, 0x9d, 0x25, 0x72, 0xab, 0xb5, 0x3f, 0x32, - 0x98, 0xfb, 0xb7, 0xb7, 0xfc, 0x72, 0x84, 0xe5, 0x35, 0x87, 0xf9, - 0x55, 0xfa, 0xa3, 0x1f, 0x0e, 0x6f, 0x2e, 0x28, 0xdd, 0x69, 0xa0, - 0xd9, 0x42, 0x10, 0xc6, 0xf8, 0xb5, 0x44, 0xc2, 0xd0, 0x43, 0x7f, - 0xdb, 0xbc, 0xe4, 0xa2, 0x3c, 0x6a, 0x55, 0x78, 0x0a, 0x77, 0xa9, - 0xd8, 0xea, 0x19, 0x32, 0xb7, 0x2f, 0xfe, 0x5c, 0x3f, 0x1b, 0xee, - 0xb1, 0x98, 0xec, 0xca, 0xad, 0x7a, 0x69, 0x45, 0xe3, 0x96, 0x0f, - 0x55, 0xf6, 0xe6, 0xed, 0x75, 0xea, 0x65, 0xe8, 0x32, 0x56, 0x93, - 0x46, 0x89, 0xa8, 0x25, 0x8a, 0x65, 0x06, 0xee, 0x6b, 0xbf, 0x79, - 0x07, 0xd0, 0xf1, 0xb7, 0xaf, 0xed, 0x2c, 0x4d, 0x92, 0xbb, 0xc0, - 0xa8, 0x5f, 0xa7, 0x67, 0x7d, 0x04, 0xf2, 0x15, 0x08, 0x70, 0xac, - 0x92, 0xd6, 0x7d, 0x04, 0xd2, 0x33, 0xfb, 0x4c, 0xb6, 0x0b, 0x0b, - 0xfb, 0x1a, 0xc9, 0xc4, 0x8d, 0x03, 0xa9, 0x7e, 0x5c, 0xf2, 0x50, - 0xab, 0x12, 0xa5, 0xa1, 0xcf, 0x48, 0x50, 0xa5, 0xef, 0xd2, 0xc8, - 0x1a, 0x13, 0xfa, 0xb0, 0x7f, 0xb1, 0x82, 0x1c, 0x77, 0x6a, 0x0f, - 0x5f, 0xdc, 0x0b, 0x95, 0x8f, 0xef, 0x43, 0x7e, 0xe6, 0x45, 0x09, - 0x25, 0x02, 0x01, 0x03, 0xa3, 0x82, 0x01, 0x50, 0x30, 0x82, 0x01, - 0x4c, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, - 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x0c, 0x30, - 0x3f, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x38, 0x30, 0x36, 0x30, - 0x34, 0xa0, 0x32, 0xa0, 0x30, 0x86, 0x2e, 0x68, 0x74, 0x74, 0x70, - 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x6d, - 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x6f, 0x72, 0x67, - 0x2f, 0x63, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, - 0x6e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x1d, - 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x43, 0x9c, - 0x36, 0x9f, 0xb0, 0x9e, 0x30, 0x4d, 0xc6, 0xce, 0x5f, 0xad, 0x10, - 0xab, 0xe5, 0x03, 0xa5, 0xfa, 0xa9, 0x14, 0x30, 0x0e, 0x06, 0x03, - 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, - 0x06, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, - 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, 0x00, 0x07, 0x30, 0x2a, - 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x23, 0x30, 0x21, 0x81, 0x1f, - 0x63, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, - 0x72, 0x6f, 0x6f, 0x74, 0x40, 0x63, 0x68, 0x61, 0x6d, 0x62, 0x65, - 0x72, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x30, 0x2a, - 0x06, 0x03, 0x55, 0x1d, 0x12, 0x04, 0x23, 0x30, 0x21, 0x81, 0x1f, - 0x63, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, - 0x72, 0x6f, 0x6f, 0x74, 0x40, 0x63, 0x68, 0x61, 0x6d, 0x62, 0x65, - 0x72, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x30, 0x5b, - 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x54, 0x30, 0x52, 0x30, 0x50, - 0x06, 0x0b, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x81, 0x87, 0x2e, 0x0a, - 0x01, 0x01, 0x30, 0x41, 0x30, 0x3f, 0x06, 0x08, 0x2b, 0x06, 0x01, - 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x33, 0x68, 0x74, 0x74, 0x70, - 0x3a, 0x2f, 0x2f, 0x63, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x6d, - 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x6f, 0x72, 0x67, - 0x2f, 0x63, 0x70, 0x73, 0x2f, 0x63, 0x68, 0x61, 0x6d, 0x62, 0x65, - 0x72, 0x73, 0x69, 0x67, 0x6e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x68, - 0x74, 0x6d, 0x6c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, - 0x00, 0x3c, 0x3b, 0x70, 0x91, 0xf9, 0x04, 0x54, 0x27, 0x91, 0xe1, - 0xed, 0xed, 0xfe, 0x68, 0x7f, 0x61, 0x5d, 0xe5, 0x41, 0x65, 0x4f, - 0x32, 0xf1, 0x18, 0x05, 0x94, 0x6a, 0x1c, 0xde, 0x1f, 0x70, 0xdb, - 0x3e, 0x7b, 0x32, 0x02, 0x34, 0xb5, 0x0c, 0x6c, 0xa1, 0x8a, 0x7c, - 0xa5, 0xf4, 0x8f, 0xff, 0xd4, 0xd8, 0xad, 0x17, 0xd5, 0x2d, 0x04, - 0xd1, 0x3f, 0x58, 0x80, 0xe2, 0x81, 0x59, 0x88, 0xbe, 0xc0, 0xe3, - 0x46, 0x93, 0x24, 0xfe, 0x90, 0xbd, 0x26, 0xa2, 0x30, 0x2d, 0xe8, - 0x97, 0x26, 0x57, 0x35, 0x89, 0x74, 0x96, 0x18, 0xf6, 0x15, 0xe2, - 0xaf, 0x24, 0x19, 0x56, 0x02, 0x02, 0xb2, 0xba, 0x0f, 0x14, 0xea, - 0xc6, 0x8a, 0x66, 0xc1, 0x86, 0x45, 0x55, 0x8b, 0xbe, 0x92, 0xbe, - 0x9c, 0xa4, 0x04, 0xc7, 0x49, 0x3c, 0x9e, 0xe8, 0x29, 0x7a, 0x89, - 0xd7, 0xfe, 0xaf, 0xff, 0x68, 0xf5, 0xa5, 0x17, 0x90, 0xbd, 0xac, - 0x99, 0xcc, 0xa5, 0x86, 0x57, 0x09, 0x67, 0x46, 0xdb, 0xd6, 0x16, - 0xc2, 0x46, 0xf1, 0xe4, 0xa9, 0x50, 0xf5, 0x8f, 0xd1, 0x92, 0x15, - 0xd3, 0x5f, 0x3e, 0xc6, 0x00, 0x49, 0x3a, 0x6e, 0x58, 0xb2, 0xd1, - 0xd1, 0x27, 0x0d, 0x25, 0xc8, 0x32, 0xf8, 0x20, 0x11, 0xcd, 0x7d, - 0x32, 0x33, 0x48, 0x94, 0x54, 0x4c, 0xdd, 0xdc, 0x79, 0xc4, 0x30, - 0x9f, 0xeb, 0x8e, 0xb8, 0x55, 0xb5, 0xd7, 0x88, 0x5c, 0xc5, 0x6a, - 0x24, 0x3d, 0xb2, 0xd3, 0x05, 0x03, 0x51, 0xc6, 0x07, 0xef, 0xcc, - 0x14, 0x72, 0x74, 0x3d, 0x6e, 0x72, 0xce, 0x18, 0x28, 0x8c, 0x4a, - 0xa0, 0x77, 0xe5, 0x09, 0x2b, 0x45, 0x44, 0x47, 0xac, 0xb7, 0x67, - 0x7f, 0x01, 0x8a, 0x05, 0x5a, 0x93, 0xbe, 0xa1, 0xc1, 0xff, 0xf8, - 0xe7, 0x0e, 0x67, 0xa4, 0x47, 0x49, 0x76, 0x5d, 0x75, 0x90, 0x1a, - 0xf5, 0x26, 0x8f, 0xf0, 0x30, 0x82, 0x06, 0x7d, 0x30, 0x82, 0x05, - 0x65, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x02, 0x01, 0x03, 0x30, - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x04, 0x05, 0x00, 0x30, 0x81, 0xaf, 0x31, 0x0b, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x48, 0x55, 0x31, 0x10, 0x30, - 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x48, 0x75, 0x6e, - 0x67, 0x61, 0x72, 0x79, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, - 0x04, 0x07, 0x13, 0x08, 0x42, 0x75, 0x64, 0x61, 0x70, 0x65, 0x73, - 0x74, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, - 0x1e, 0x4e, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x48, 0x61, - 0x6c, 0x6f, 0x7a, 0x61, 0x74, 0x62, 0x69, 0x7a, 0x74, 0x6f, 0x6e, - 0x73, 0x61, 0x67, 0x69, 0x20, 0x4b, 0x66, 0x74, 0x2e, 0x31, 0x1a, - 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x11, 0x54, 0x61, - 0x6e, 0x75, 0x73, 0x69, 0x74, 0x76, 0x61, 0x6e, 0x79, 0x6b, 0x69, - 0x61, 0x64, 0x6f, 0x6b, 0x31, 0x36, 0x30, 0x34, 0x06, 0x03, 0x55, - 0x04, 0x03, 0x13, 0x2d, 0x4e, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, - 0x20, 0x4b, 0x6f, 0x7a, 0x6a, 0x65, 0x67, 0x79, 0x7a, 0x6f, 0x69, - 0x20, 0x28, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x41, 0x29, 0x20, - 0x54, 0x61, 0x6e, 0x75, 0x73, 0x69, 0x74, 0x76, 0x61, 0x6e, 0x79, - 0x6b, 0x69, 0x61, 0x64, 0x6f, 0x30, 0x1e, 0x17, 0x0d, 0x39, 0x39, - 0x30, 0x32, 0x32, 0x34, 0x32, 0x33, 0x31, 0x34, 0x34, 0x37, 0x5a, - 0x17, 0x0d, 0x31, 0x39, 0x30, 0x32, 0x31, 0x39, 0x32, 0x33, 0x31, - 0x34, 0x34, 0x37, 0x5a, 0x30, 0x81, 0xaf, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x48, 0x55, 0x31, 0x10, - 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x48, 0x75, - 0x6e, 0x67, 0x61, 0x72, 0x79, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, - 0x55, 0x04, 0x07, 0x13, 0x08, 0x42, 0x75, 0x64, 0x61, 0x70, 0x65, - 0x73, 0x74, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x13, 0x1e, 0x4e, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x48, - 0x61, 0x6c, 0x6f, 0x7a, 0x61, 0x74, 0x62, 0x69, 0x7a, 0x74, 0x6f, - 0x6e, 0x73, 0x61, 0x67, 0x69, 0x20, 0x4b, 0x66, 0x74, 0x2e, 0x31, - 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x11, 0x54, - 0x61, 0x6e, 0x75, 0x73, 0x69, 0x74, 0x76, 0x61, 0x6e, 0x79, 0x6b, - 0x69, 0x61, 0x64, 0x6f, 0x6b, 0x31, 0x36, 0x30, 0x34, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x13, 0x2d, 0x4e, 0x65, 0x74, 0x4c, 0x6f, 0x63, - 0x6b, 0x20, 0x4b, 0x6f, 0x7a, 0x6a, 0x65, 0x67, 0x79, 0x7a, 0x6f, - 0x69, 0x20, 0x28, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x41, 0x29, - 0x20, 0x54, 0x61, 0x6e, 0x75, 0x73, 0x69, 0x74, 0x76, 0x61, 0x6e, - 0x79, 0x6b, 0x69, 0x61, 0x64, 0x6f, 0x30, 0x82, 0x01, 0x22, 0x30, - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, - 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbc, 0x74, 0x8c, 0x0f, 0xbb, - 0x4c, 0xf4, 0x37, 0x1e, 0xa9, 0x05, 0x82, 0xd8, 0xe6, 0xe1, 0x6c, - 0x70, 0xea, 0x78, 0xb5, 0x6e, 0xd1, 0x38, 0x44, 0x0d, 0xa8, 0x83, - 0xce, 0x5d, 0xd2, 0xd6, 0xd5, 0x81, 0xc5, 0xd4, 0x4b, 0xe7, 0x5b, - 0x94, 0x70, 0x26, 0xdb, 0x3b, 0x9d, 0x6a, 0x4c, 0x62, 0xf7, 0x71, - 0xf3, 0x64, 0xd6, 0x61, 0x3b, 0x3d, 0xeb, 0x73, 0xa3, 0x37, 0xd9, - 0xcf, 0xea, 0x8c, 0x92, 0x3b, 0xcd, 0xf7, 0x07, 0xdc, 0x66, 0x74, - 0x97, 0xf4, 0x45, 0x22, 0xdd, 0xf4, 0x5c, 0xe0, 0xbf, 0x6d, 0xf3, - 0xbe, 0x65, 0x33, 0xe4, 0x15, 0x3a, 0xbf, 0xdb, 0x98, 0x90, 0x55, - 0x38, 0xc4, 0xed, 0xa6, 0x55, 0x63, 0x0b, 0xb0, 0x78, 0x04, 0xf4, - 0xe3, 0x6e, 0xc1, 0x3f, 0x8e, 0xfc, 0x51, 0x78, 0x1f, 0x92, 0x9e, - 0x83, 0xc2, 0xfe, 0xd9, 0xb0, 0xa9, 0xc9, 0xbc, 0x5a, 0x00, 0xff, - 0xa9, 0xa8, 0x98, 0x74, 0xfb, 0xf6, 0x2c, 0x3e, 0x15, 0x39, 0x0d, - 0xb6, 0x04, 0x55, 0xa8, 0x0e, 0x98, 0x20, 0x42, 0xb3, 0xb1, 0x25, - 0xad, 0x7e, 0x9a, 0x6f, 0x5d, 0x53, 0xb1, 0xab, 0x0c, 0xfc, 0xeb, - 0xe0, 0xf3, 0x7a, 0xb3, 0xa8, 0xb3, 0xff, 0x46, 0xf6, 0x63, 0xa2, - 0xd8, 0x3a, 0x98, 0x7b, 0xb6, 0xac, 0x85, 0xff, 0xb0, 0x25, 0x4f, - 0x74, 0x63, 0xe7, 0x13, 0x07, 0xa5, 0x0a, 0x8f, 0x05, 0xf7, 0xc0, - 0x64, 0x6f, 0x7e, 0xa7, 0x27, 0x80, 0x96, 0xde, 0xd4, 0x2e, 0x86, - 0x60, 0xc7, 0x6b, 0x2b, 0x5e, 0x73, 0x7b, 0x17, 0xe7, 0x91, 0x3f, - 0x64, 0x0c, 0xd8, 0x4b, 0x22, 0x34, 0x2b, 0x9b, 0x32, 0xf2, 0x48, - 0x1f, 0x9f, 0xa1, 0x0a, 0x84, 0x7a, 0xe2, 0xc2, 0xad, 0x97, 0x3d, - 0x8e, 0xd5, 0xc1, 0xf9, 0x56, 0xa3, 0x50, 0xe9, 0xc6, 0xb4, 0xfa, - 0x98, 0xa2, 0xee, 0x95, 0xe6, 0x2a, 0x03, 0x8c, 0xdf, 0x02, 0x03, - 0x01, 0x00, 0x01, 0xa3, 0x82, 0x02, 0x9f, 0x30, 0x82, 0x02, 0x9b, - 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, - 0x04, 0x03, 0x02, 0x00, 0x06, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, - 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, - 0x02, 0x01, 0x04, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, - 0x86, 0xf8, 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, 0x00, 0x07, - 0x30, 0x82, 0x02, 0x60, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, - 0xf8, 0x42, 0x01, 0x0d, 0x04, 0x82, 0x02, 0x51, 0x16, 0x82, 0x02, - 0x4d, 0x46, 0x49, 0x47, 0x59, 0x45, 0x4c, 0x45, 0x4d, 0x21, 0x20, - 0x45, 0x7a, 0x65, 0x6e, 0x20, 0x74, 0x61, 0x6e, 0x75, 0x73, 0x69, - 0x74, 0x76, 0x61, 0x6e, 0x79, 0x20, 0x61, 0x20, 0x4e, 0x65, 0x74, - 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x4b, 0x66, 0x74, 0x2e, 0x20, 0x41, - 0x6c, 0x74, 0x61, 0x6c, 0x61, 0x6e, 0x6f, 0x73, 0x20, 0x53, 0x7a, - 0x6f, 0x6c, 0x67, 0x61, 0x6c, 0x74, 0x61, 0x74, 0x61, 0x73, 0x69, - 0x20, 0x46, 0x65, 0x6c, 0x74, 0x65, 0x74, 0x65, 0x6c, 0x65, 0x69, - 0x62, 0x65, 0x6e, 0x20, 0x6c, 0x65, 0x69, 0x72, 0x74, 0x20, 0x65, - 0x6c, 0x6a, 0x61, 0x72, 0x61, 0x73, 0x6f, 0x6b, 0x20, 0x61, 0x6c, - 0x61, 0x70, 0x6a, 0x61, 0x6e, 0x20, 0x6b, 0x65, 0x73, 0x7a, 0x75, - 0x6c, 0x74, 0x2e, 0x20, 0x41, 0x20, 0x68, 0x69, 0x74, 0x65, 0x6c, - 0x65, 0x73, 0x69, 0x74, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x6c, 0x79, - 0x61, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x20, 0x61, 0x20, 0x4e, 0x65, - 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x4b, 0x66, 0x74, 0x2e, 0x20, - 0x74, 0x65, 0x72, 0x6d, 0x65, 0x6b, 0x66, 0x65, 0x6c, 0x65, 0x6c, - 0x6f, 0x73, 0x73, 0x65, 0x67, 0x2d, 0x62, 0x69, 0x7a, 0x74, 0x6f, - 0x73, 0x69, 0x74, 0x61, 0x73, 0x61, 0x20, 0x76, 0x65, 0x64, 0x69, - 0x2e, 0x20, 0x41, 0x20, 0x64, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, - 0x69, 0x73, 0x20, 0x61, 0x6c, 0x61, 0x69, 0x72, 0x61, 0x73, 0x20, - 0x65, 0x6c, 0x66, 0x6f, 0x67, 0x61, 0x64, 0x61, 0x73, 0x61, 0x6e, - 0x61, 0x6b, 0x20, 0x66, 0x65, 0x6c, 0x74, 0x65, 0x74, 0x65, 0x6c, - 0x65, 0x20, 0x61, 0x7a, 0x20, 0x65, 0x6c, 0x6f, 0x69, 0x72, 0x74, - 0x20, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x6f, 0x72, 0x7a, 0x65, 0x73, - 0x69, 0x20, 0x65, 0x6c, 0x6a, 0x61, 0x72, 0x61, 0x73, 0x20, 0x6d, - 0x65, 0x67, 0x74, 0x65, 0x74, 0x65, 0x6c, 0x65, 0x2e, 0x20, 0x41, - 0x7a, 0x20, 0x65, 0x6c, 0x6a, 0x61, 0x72, 0x61, 0x73, 0x20, 0x6c, - 0x65, 0x69, 0x72, 0x61, 0x73, 0x61, 0x20, 0x6d, 0x65, 0x67, 0x74, - 0x61, 0x6c, 0x61, 0x6c, 0x68, 0x61, 0x74, 0x6f, 0x20, 0x61, 0x20, - 0x4e, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x4b, 0x66, 0x74, - 0x2e, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, - 0x68, 0x6f, 0x6e, 0x6c, 0x61, 0x70, 0x6a, 0x61, 0x6e, 0x20, 0x61, - 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, - 0x77, 0x2e, 0x6e, 0x65, 0x74, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6e, - 0x65, 0x74, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x20, 0x63, 0x69, 0x6d, - 0x65, 0x6e, 0x20, 0x76, 0x61, 0x67, 0x79, 0x20, 0x6b, 0x65, 0x72, - 0x68, 0x65, 0x74, 0x6f, 0x20, 0x61, 0x7a, 0x20, 0x65, 0x6c, 0x6c, - 0x65, 0x6e, 0x6f, 0x72, 0x7a, 0x65, 0x73, 0x40, 0x6e, 0x65, 0x74, - 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6e, 0x65, 0x74, 0x20, 0x65, 0x2d, - 0x6d, 0x61, 0x69, 0x6c, 0x20, 0x63, 0x69, 0x6d, 0x65, 0x6e, 0x2e, - 0x20, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x21, - 0x20, 0x54, 0x68, 0x65, 0x20, 0x69, 0x73, 0x73, 0x75, 0x61, 0x6e, - 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, - 0x20, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x20, 0x69, 0x73, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4e, 0x65, - 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x43, 0x50, 0x53, 0x20, 0x61, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x74, - 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, - 0x77, 0x2e, 0x6e, 0x65, 0x74, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6e, - 0x65, 0x74, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x20, 0x6f, 0x72, 0x20, - 0x62, 0x79, 0x20, 0x65, 0x2d, 0x6d, 0x61, 0x69, 0x6c, 0x20, 0x61, - 0x74, 0x20, 0x63, 0x70, 0x73, 0x40, 0x6e, 0x65, 0x74, 0x6c, 0x6f, - 0x63, 0x6b, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x30, 0x0d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x04, 0x05, 0x00, - 0x03, 0x82, 0x01, 0x01, 0x00, 0x48, 0x24, 0x46, 0xf7, 0xba, 0x56, - 0x6f, 0xfa, 0xc8, 0x28, 0x03, 0x40, 0x4e, 0xe5, 0x31, 0x39, 0x6b, - 0x26, 0x6b, 0x53, 0x7f, 0xdb, 0xdf, 0xdf, 0xf3, 0x71, 0x3d, 0x26, - 0xc0, 0x14, 0x0e, 0xc6, 0x67, 0x7b, 0x23, 0xa8, 0x0c, 0x73, 0xdd, - 0x01, 0xbb, 0xc6, 0xca, 0x6e, 0x37, 0x39, 0x55, 0xd5, 0xc7, 0x8c, - 0x56, 0x20, 0x0e, 0x28, 0x0a, 0x0e, 0xd2, 0x2a, 0xa4, 0xb0, 0x49, - 0x52, 0xc6, 0x38, 0x07, 0xfe, 0xbe, 0x0a, 0x09, 0x8c, 0xd1, 0x98, - 0xcf, 0xca, 0xda, 0x14, 0x31, 0xa1, 0x4f, 0xd2, 0x39, 0xfc, 0x0f, - 0x11, 0x2c, 0x43, 0xc3, 0xdd, 0xab, 0x93, 0xc7, 0x55, 0x3e, 0x47, - 0x7c, 0x18, 0x1a, 0x00, 0xdc, 0xf3, 0x7b, 0xd8, 0xf2, 0x7f, 0x52, - 0x6c, 0x20, 0xf4, 0x0b, 0x5f, 0x69, 0x52, 0xf4, 0xee, 0xf8, 0xb2, - 0x29, 0x60, 0xeb, 0xe3, 0x49, 0x31, 0x21, 0x0d, 0xd6, 0xb5, 0x10, - 0x41, 0xe2, 0x41, 0x09, 0x6c, 0xe2, 0x1a, 0x9a, 0x56, 0x4b, 0x77, - 0x02, 0xf6, 0xa0, 0x9b, 0x9a, 0x27, 0x87, 0xe8, 0x55, 0x29, 0x71, - 0xc2, 0x90, 0x9f, 0x45, 0x78, 0x1a, 0xe1, 0x15, 0x64, 0x3d, 0xd0, - 0x0e, 0xd8, 0xa0, 0x76, 0x9f, 0xae, 0xc5, 0xd0, 0x2e, 0xea, 0xd6, - 0x0f, 0x56, 0xec, 0x64, 0x7f, 0x5a, 0x9b, 0x14, 0x58, 0x01, 0x27, - 0x7e, 0x13, 0x50, 0xc7, 0x6b, 0x2a, 0xe6, 0x68, 0x3c, 0xbf, 0x5c, - 0xa0, 0x0a, 0x1b, 0xe1, 0x0e, 0x7a, 0xe9, 0xe2, 0x80, 0xc3, 0xe9, - 0xe9, 0xf6, 0xfd, 0x6c, 0x11, 0x9e, 0xd0, 0xe5, 0x28, 0x27, 0x2b, - 0x54, 0x32, 0x42, 0x14, 0x82, 0x75, 0xe6, 0x4a, 0xf0, 0x2b, 0x66, - 0x75, 0x63, 0x8c, 0xa2, 0xfb, 0x04, 0x3e, 0x83, 0x0e, 0x9b, 0x36, - 0xf0, 0x18, 0xe4, 0x26, 0x20, 0xc3, 0x8c, 0xf0, 0x28, 0x07, 0xad, - 0x3c, 0x17, 0x66, 0x88, 0xb5, 0xfd, 0xb6, 0x88, 0x30, 0x82, 0x05, - 0x4b, 0x30, 0x82, 0x04, 0xb4, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, - 0x01, 0x69, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x04, 0x05, 0x00, 0x30, 0x81, 0x99, 0x31, 0x0b, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x48, 0x55, - 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x08, - 0x42, 0x75, 0x64, 0x61, 0x70, 0x65, 0x73, 0x74, 0x31, 0x27, 0x30, - 0x25, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1e, 0x4e, 0x65, 0x74, - 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x48, 0x61, 0x6c, 0x6f, 0x7a, 0x61, - 0x74, 0x62, 0x69, 0x7a, 0x74, 0x6f, 0x6e, 0x73, 0x61, 0x67, 0x69, - 0x20, 0x4b, 0x66, 0x74, 0x2e, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, - 0x55, 0x04, 0x0b, 0x13, 0x11, 0x54, 0x61, 0x6e, 0x75, 0x73, 0x69, - 0x74, 0x76, 0x61, 0x6e, 0x79, 0x6b, 0x69, 0x61, 0x64, 0x6f, 0x6b, - 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x29, - 0x4e, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x55, 0x7a, 0x6c, - 0x65, 0x74, 0x69, 0x20, 0x28, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, - 0x42, 0x29, 0x20, 0x54, 0x61, 0x6e, 0x75, 0x73, 0x69, 0x74, 0x76, - 0x61, 0x6e, 0x79, 0x6b, 0x69, 0x61, 0x64, 0x6f, 0x30, 0x1e, 0x17, - 0x0d, 0x39, 0x39, 0x30, 0x32, 0x32, 0x35, 0x31, 0x34, 0x31, 0x30, - 0x32, 0x32, 0x5a, 0x17, 0x0d, 0x31, 0x39, 0x30, 0x32, 0x32, 0x30, - 0x31, 0x34, 0x31, 0x30, 0x32, 0x32, 0x5a, 0x30, 0x81, 0x99, 0x31, - 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x48, - 0x55, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, - 0x08, 0x42, 0x75, 0x64, 0x61, 0x70, 0x65, 0x73, 0x74, 0x31, 0x27, - 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1e, 0x4e, 0x65, - 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x48, 0x61, 0x6c, 0x6f, 0x7a, - 0x61, 0x74, 0x62, 0x69, 0x7a, 0x74, 0x6f, 0x6e, 0x73, 0x61, 0x67, - 0x69, 0x20, 0x4b, 0x66, 0x74, 0x2e, 0x31, 0x1a, 0x30, 0x18, 0x06, - 0x03, 0x55, 0x04, 0x0b, 0x13, 0x11, 0x54, 0x61, 0x6e, 0x75, 0x73, - 0x69, 0x74, 0x76, 0x61, 0x6e, 0x79, 0x6b, 0x69, 0x61, 0x64, 0x6f, - 0x6b, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, - 0x29, 0x4e, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x55, 0x7a, - 0x6c, 0x65, 0x74, 0x69, 0x20, 0x28, 0x43, 0x6c, 0x61, 0x73, 0x73, - 0x20, 0x42, 0x29, 0x20, 0x54, 0x61, 0x6e, 0x75, 0x73, 0x69, 0x74, - 0x76, 0x61, 0x6e, 0x79, 0x6b, 0x69, 0x61, 0x64, 0x6f, 0x30, 0x81, - 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, - 0x89, 0x02, 0x81, 0x81, 0x00, 0xb1, 0xea, 0x04, 0xec, 0x20, 0xa0, - 0x23, 0xc2, 0x8f, 0x38, 0x60, 0xcf, 0xc7, 0x46, 0xb3, 0xd5, 0x1b, - 0xfe, 0xfb, 0xb9, 0x99, 0x9e, 0x04, 0xdc, 0x1c, 0x7f, 0x8c, 0x4a, - 0x81, 0x98, 0xee, 0xa4, 0xd4, 0xca, 0x8a, 0x17, 0xb9, 0x22, 0x7f, - 0x83, 0x0a, 0x75, 0x4c, 0x9b, 0xc0, 0x69, 0xd8, 0x64, 0x39, 0xa3, - 0xed, 0x92, 0xa3, 0xfd, 0x5b, 0x5c, 0x74, 0x1a, 0xc0, 0x47, 0xca, - 0x3a, 0x69, 0x76, 0x9a, 0xba, 0xe2, 0x44, 0x17, 0xfc, 0x4c, 0xa3, - 0xd5, 0xfe, 0xb8, 0x97, 0x88, 0xaf, 0x88, 0x03, 0x89, 0x1f, 0xa4, - 0xf2, 0x04, 0x3e, 0xc8, 0x07, 0x0b, 0xe6, 0xf9, 0xb3, 0x2f, 0x7a, - 0x62, 0x14, 0x09, 0x46, 0x14, 0xca, 0x64, 0xf5, 0x8b, 0x80, 0xb5, - 0x62, 0xa8, 0xd8, 0x6b, 0xd6, 0x71, 0x93, 0x2d, 0xb3, 0xbf, 0x09, - 0x54, 0x58, 0xed, 0x06, 0xeb, 0xa8, 0x7b, 0xdc, 0x43, 0xb1, 0xa1, - 0x69, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x02, 0x9f, 0x30, - 0x82, 0x02, 0x9b, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, - 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, - 0x04, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, - 0x04, 0x04, 0x03, 0x02, 0x00, 0x06, 0x30, 0x11, 0x06, 0x09, 0x60, + 0x73, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x1e, + 0x17, 0x0d, 0x30, 0x33, 0x30, 0x39, 0x33, 0x30, 0x31, 0x36, 0x31, + 0x34, 0x31, 0x38, 0x5a, 0x17, 0x0d, 0x33, 0x37, 0x30, 0x39, 0x33, + 0x30, 0x31, 0x36, 0x31, 0x34, 0x31, 0x38, 0x5a, 0x30, 0x7d, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, + 0x55, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x1e, 0x41, 0x43, 0x20, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x66, 0x69, + 0x72, 0x6d, 0x61, 0x20, 0x53, 0x41, 0x20, 0x43, 0x49, 0x46, 0x20, + 0x41, 0x38, 0x32, 0x37, 0x34, 0x33, 0x32, 0x38, 0x37, 0x31, 0x23, + 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1a, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x63, 0x68, + 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x6f, + 0x72, 0x67, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x17, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x43, 0x68, + 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x52, + 0x6f, 0x6f, 0x74, 0x30, 0x82, 0x01, 0x20, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x0d, 0x00, 0x30, 0x82, 0x01, 0x08, 0x02, 0x82, + 0x01, 0x01, 0x00, 0xa2, 0x70, 0xa2, 0xd0, 0x9f, 0x42, 0xae, 0x5b, + 0x17, 0xc7, 0xd8, 0x7d, 0xcf, 0x14, 0x83, 0xfc, 0x4f, 0xc9, 0xa1, + 0xb7, 0x13, 0xaf, 0x8a, 0xd7, 0x9e, 0x3e, 0x04, 0x0a, 0x92, 0x8b, + 0x60, 0x56, 0xfa, 0xb4, 0x32, 0x2f, 0x88, 0x4d, 0xa1, 0x60, 0x08, + 0xf4, 0xb7, 0x09, 0x4e, 0xa0, 0x49, 0x2f, 0x49, 0xd6, 0xd3, 0xdf, + 0x9d, 0x97, 0x5a, 0x9f, 0x94, 0x04, 0x70, 0xec, 0x3f, 0x59, 0xd9, + 0xb7, 0xcc, 0x66, 0x8b, 0x98, 0x52, 0x28, 0x09, 0x02, 0xdf, 0xc5, + 0x2f, 0x84, 0x8d, 0x7a, 0x97, 0x77, 0xbf, 0xec, 0x40, 0x9d, 0x25, + 0x72, 0xab, 0xb5, 0x3f, 0x32, 0x98, 0xfb, 0xb7, 0xb7, 0xfc, 0x72, + 0x84, 0xe5, 0x35, 0x87, 0xf9, 0x55, 0xfa, 0xa3, 0x1f, 0x0e, 0x6f, + 0x2e, 0x28, 0xdd, 0x69, 0xa0, 0xd9, 0x42, 0x10, 0xc6, 0xf8, 0xb5, + 0x44, 0xc2, 0xd0, 0x43, 0x7f, 0xdb, 0xbc, 0xe4, 0xa2, 0x3c, 0x6a, + 0x55, 0x78, 0x0a, 0x77, 0xa9, 0xd8, 0xea, 0x19, 0x32, 0xb7, 0x2f, + 0xfe, 0x5c, 0x3f, 0x1b, 0xee, 0xb1, 0x98, 0xec, 0xca, 0xad, 0x7a, + 0x69, 0x45, 0xe3, 0x96, 0x0f, 0x55, 0xf6, 0xe6, 0xed, 0x75, 0xea, + 0x65, 0xe8, 0x32, 0x56, 0x93, 0x46, 0x89, 0xa8, 0x25, 0x8a, 0x65, + 0x06, 0xee, 0x6b, 0xbf, 0x79, 0x07, 0xd0, 0xf1, 0xb7, 0xaf, 0xed, + 0x2c, 0x4d, 0x92, 0xbb, 0xc0, 0xa8, 0x5f, 0xa7, 0x67, 0x7d, 0x04, + 0xf2, 0x15, 0x08, 0x70, 0xac, 0x92, 0xd6, 0x7d, 0x04, 0xd2, 0x33, + 0xfb, 0x4c, 0xb6, 0x0b, 0x0b, 0xfb, 0x1a, 0xc9, 0xc4, 0x8d, 0x03, + 0xa9, 0x7e, 0x5c, 0xf2, 0x50, 0xab, 0x12, 0xa5, 0xa1, 0xcf, 0x48, + 0x50, 0xa5, 0xef, 0xd2, 0xc8, 0x1a, 0x13, 0xfa, 0xb0, 0x7f, 0xb1, + 0x82, 0x1c, 0x77, 0x6a, 0x0f, 0x5f, 0xdc, 0x0b, 0x95, 0x8f, 0xef, + 0x43, 0x7e, 0xe6, 0x45, 0x09, 0x25, 0x02, 0x01, 0x03, 0xa3, 0x82, + 0x01, 0x50, 0x30, 0x82, 0x01, 0x4c, 0x30, 0x12, 0x06, 0x03, 0x55, + 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, + 0xff, 0x02, 0x01, 0x0c, 0x30, 0x3f, 0x06, 0x03, 0x55, 0x1d, 0x1f, + 0x04, 0x38, 0x30, 0x36, 0x30, 0x34, 0xa0, 0x32, 0xa0, 0x30, 0x86, + 0x2e, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, + 0x2e, 0x63, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, + 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x68, 0x61, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, + 0x63, 0x72, 0x6c, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, + 0x16, 0x04, 0x14, 0x43, 0x9c, 0x36, 0x9f, 0xb0, 0x9e, 0x30, 0x4d, + 0xc6, 0xce, 0x5f, 0xad, 0x10, 0xab, 0xe5, 0x03, 0xa5, 0xfa, 0xa9, + 0x14, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, + 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, - 0x02, 0x00, 0x07, 0x30, 0x82, 0x02, 0x60, 0x06, 0x09, 0x60, 0x86, - 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x0d, 0x04, 0x82, 0x02, 0x51, - 0x16, 0x82, 0x02, 0x4d, 0x46, 0x49, 0x47, 0x59, 0x45, 0x4c, 0x45, - 0x4d, 0x21, 0x20, 0x45, 0x7a, 0x65, 0x6e, 0x20, 0x74, 0x61, 0x6e, - 0x75, 0x73, 0x69, 0x74, 0x76, 0x61, 0x6e, 0x79, 0x20, 0x61, 0x20, - 0x4e, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x4b, 0x66, 0x74, - 0x2e, 0x20, 0x41, 0x6c, 0x74, 0x61, 0x6c, 0x61, 0x6e, 0x6f, 0x73, - 0x20, 0x53, 0x7a, 0x6f, 0x6c, 0x67, 0x61, 0x6c, 0x74, 0x61, 0x74, - 0x61, 0x73, 0x69, 0x20, 0x46, 0x65, 0x6c, 0x74, 0x65, 0x74, 0x65, - 0x6c, 0x65, 0x69, 0x62, 0x65, 0x6e, 0x20, 0x6c, 0x65, 0x69, 0x72, - 0x74, 0x20, 0x65, 0x6c, 0x6a, 0x61, 0x72, 0x61, 0x73, 0x6f, 0x6b, - 0x20, 0x61, 0x6c, 0x61, 0x70, 0x6a, 0x61, 0x6e, 0x20, 0x6b, 0x65, - 0x73, 0x7a, 0x75, 0x6c, 0x74, 0x2e, 0x20, 0x41, 0x20, 0x68, 0x69, - 0x74, 0x65, 0x6c, 0x65, 0x73, 0x69, 0x74, 0x65, 0x73, 0x20, 0x66, - 0x6f, 0x6c, 0x79, 0x61, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x20, 0x61, - 0x20, 0x4e, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x4b, 0x66, - 0x74, 0x2e, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x6b, 0x66, 0x65, - 0x6c, 0x65, 0x6c, 0x6f, 0x73, 0x73, 0x65, 0x67, 0x2d, 0x62, 0x69, - 0x7a, 0x74, 0x6f, 0x73, 0x69, 0x74, 0x61, 0x73, 0x61, 0x20, 0x76, - 0x65, 0x64, 0x69, 0x2e, 0x20, 0x41, 0x20, 0x64, 0x69, 0x67, 0x69, - 0x74, 0x61, 0x6c, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x61, 0x69, 0x72, - 0x61, 0x73, 0x20, 0x65, 0x6c, 0x66, 0x6f, 0x67, 0x61, 0x64, 0x61, - 0x73, 0x61, 0x6e, 0x61, 0x6b, 0x20, 0x66, 0x65, 0x6c, 0x74, 0x65, - 0x74, 0x65, 0x6c, 0x65, 0x20, 0x61, 0x7a, 0x20, 0x65, 0x6c, 0x6f, - 0x69, 0x72, 0x74, 0x20, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x6f, 0x72, - 0x7a, 0x65, 0x73, 0x69, 0x20, 0x65, 0x6c, 0x6a, 0x61, 0x72, 0x61, - 0x73, 0x20, 0x6d, 0x65, 0x67, 0x74, 0x65, 0x74, 0x65, 0x6c, 0x65, - 0x2e, 0x20, 0x41, 0x7a, 0x20, 0x65, 0x6c, 0x6a, 0x61, 0x72, 0x61, - 0x73, 0x20, 0x6c, 0x65, 0x69, 0x72, 0x61, 0x73, 0x61, 0x20, 0x6d, - 0x65, 0x67, 0x74, 0x61, 0x6c, 0x61, 0x6c, 0x68, 0x61, 0x74, 0x6f, - 0x20, 0x61, 0x20, 0x4e, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, - 0x4b, 0x66, 0x74, 0x2e, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x65, 0x74, 0x20, 0x68, 0x6f, 0x6e, 0x6c, 0x61, 0x70, 0x6a, 0x61, - 0x6e, 0x20, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, - 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6e, 0x65, 0x74, 0x6c, 0x6f, 0x63, - 0x6b, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x20, - 0x63, 0x69, 0x6d, 0x65, 0x6e, 0x20, 0x76, 0x61, 0x67, 0x79, 0x20, - 0x6b, 0x65, 0x72, 0x68, 0x65, 0x74, 0x6f, 0x20, 0x61, 0x7a, 0x20, - 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x6f, 0x72, 0x7a, 0x65, 0x73, 0x40, - 0x6e, 0x65, 0x74, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6e, 0x65, 0x74, - 0x20, 0x65, 0x2d, 0x6d, 0x61, 0x69, 0x6c, 0x20, 0x63, 0x69, 0x6d, - 0x65, 0x6e, 0x2e, 0x20, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, - 0x4e, 0x54, 0x21, 0x20, 0x54, 0x68, 0x65, 0x20, 0x69, 0x73, 0x73, - 0x75, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x69, 0x73, 0x20, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x20, 0x69, 0x73, 0x20, 0x73, 0x75, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x4e, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x43, 0x50, - 0x53, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x20, 0x61, 0x74, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, - 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6e, 0x65, 0x74, 0x6c, 0x6f, 0x63, - 0x6b, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x20, - 0x6f, 0x72, 0x20, 0x62, 0x79, 0x20, 0x65, 0x2d, 0x6d, 0x61, 0x69, - 0x6c, 0x20, 0x61, 0x74, 0x20, 0x63, 0x70, 0x73, 0x40, 0x6e, 0x65, - 0x74, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x30, - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x04, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x04, 0xdb, 0xae, 0x8c, - 0x17, 0xaf, 0xf8, 0x0e, 0x90, 0x31, 0x4e, 0xcd, 0x3e, 0x09, 0xc0, - 0x6d, 0x3a, 0xb0, 0xf8, 0x33, 0x4c, 0x47, 0x4c, 0xe3, 0x75, 0x88, - 0x10, 0x97, 0xac, 0xb0, 0x38, 0x15, 0x91, 0xc6, 0x29, 0x96, 0xcc, - 0x21, 0xc0, 0x6d, 0x3c, 0xa5, 0x74, 0xcf, 0xd8, 0x82, 0xa5, 0x39, - 0xc3, 0x65, 0xe3, 0x42, 0x70, 0xbb, 0x22, 0x90, 0xe3, 0x7d, 0xdb, - 0x35, 0x76, 0xe1, 0xa0, 0xb5, 0xda, 0x9f, 0x70, 0x6e, 0x93, 0x1a, - 0x30, 0x39, 0x1d, 0x30, 0xdb, 0x2e, 0xe3, 0x7c, 0xb2, 0x91, 0xb2, - 0xd1, 0x37, 0x29, 0xfa, 0xb9, 0xd6, 0x17, 0x5c, 0x47, 0x4f, 0xe3, - 0x1d, 0x38, 0xeb, 0x9f, 0xd5, 0x7b, 0x95, 0xa8, 0x28, 0x9e, 0x15, - 0x4a, 0xd1, 0xd1, 0xd0, 0x2b, 0x00, 0x97, 0xa0, 0xe2, 0x92, 0x36, - 0x2b, 0x63, 0xac, 0x58, 0x01, 0x6b, 0x33, 0x29, 0x50, 0x86, 0x83, - 0xf1, 0x01, 0x48, 0x30, 0x82, 0x05, 0x4f, 0x30, 0x82, 0x04, 0xb8, - 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x68, 0x30, 0x0d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x04, 0x05, - 0x00, 0x30, 0x81, 0x9b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x48, 0x55, 0x31, 0x11, 0x30, 0x0f, 0x06, - 0x03, 0x55, 0x04, 0x07, 0x13, 0x08, 0x42, 0x75, 0x64, 0x61, 0x70, - 0x65, 0x73, 0x74, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x1e, 0x4e, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, - 0x48, 0x61, 0x6c, 0x6f, 0x7a, 0x61, 0x74, 0x62, 0x69, 0x7a, 0x74, - 0x6f, 0x6e, 0x73, 0x61, 0x67, 0x69, 0x20, 0x4b, 0x66, 0x74, 0x2e, - 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x11, - 0x54, 0x61, 0x6e, 0x75, 0x73, 0x69, 0x74, 0x76, 0x61, 0x6e, 0x79, - 0x6b, 0x69, 0x61, 0x64, 0x6f, 0x6b, 0x31, 0x34, 0x30, 0x32, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x13, 0x2b, 0x4e, 0x65, 0x74, 0x4c, 0x6f, - 0x63, 0x6b, 0x20, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x7a, - 0x20, 0x28, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x43, 0x29, 0x20, - 0x54, 0x61, 0x6e, 0x75, 0x73, 0x69, 0x74, 0x76, 0x61, 0x6e, 0x79, - 0x6b, 0x69, 0x61, 0x64, 0x6f, 0x30, 0x1e, 0x17, 0x0d, 0x39, 0x39, - 0x30, 0x32, 0x32, 0x35, 0x31, 0x34, 0x30, 0x38, 0x31, 0x31, 0x5a, - 0x17, 0x0d, 0x31, 0x39, 0x30, 0x32, 0x32, 0x30, 0x31, 0x34, 0x30, - 0x38, 0x31, 0x31, 0x5a, 0x30, 0x81, 0x9b, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x48, 0x55, 0x31, 0x11, + 0x02, 0x00, 0x07, 0x30, 0x2a, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, + 0x23, 0x30, 0x21, 0x81, 0x1f, 0x63, 0x68, 0x61, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x69, 0x67, 0x6e, 0x72, 0x6f, 0x6f, 0x74, 0x40, 0x63, + 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x2e, + 0x6f, 0x72, 0x67, 0x30, 0x2a, 0x06, 0x03, 0x55, 0x1d, 0x12, 0x04, + 0x23, 0x30, 0x21, 0x81, 0x1f, 0x63, 0x68, 0x61, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x69, 0x67, 0x6e, 0x72, 0x6f, 0x6f, 0x74, 0x40, 0x63, + 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x2e, + 0x6f, 0x72, 0x67, 0x30, 0x5b, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, + 0x54, 0x30, 0x52, 0x30, 0x50, 0x06, 0x0b, 0x2b, 0x06, 0x01, 0x04, + 0x01, 0x81, 0x87, 0x2e, 0x0a, 0x01, 0x01, 0x30, 0x41, 0x30, 0x3f, + 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, + 0x33, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x70, 0x73, + 0x2e, 0x63, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, + 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x70, 0x73, 0x2f, 0x63, + 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x72, + 0x6f, 0x6f, 0x74, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x3c, 0x3b, 0x70, 0x91, 0xf9, + 0x04, 0x54, 0x27, 0x91, 0xe1, 0xed, 0xed, 0xfe, 0x68, 0x7f, 0x61, + 0x5d, 0xe5, 0x41, 0x65, 0x4f, 0x32, 0xf1, 0x18, 0x05, 0x94, 0x6a, + 0x1c, 0xde, 0x1f, 0x70, 0xdb, 0x3e, 0x7b, 0x32, 0x02, 0x34, 0xb5, + 0x0c, 0x6c, 0xa1, 0x8a, 0x7c, 0xa5, 0xf4, 0x8f, 0xff, 0xd4, 0xd8, + 0xad, 0x17, 0xd5, 0x2d, 0x04, 0xd1, 0x3f, 0x58, 0x80, 0xe2, 0x81, + 0x59, 0x88, 0xbe, 0xc0, 0xe3, 0x46, 0x93, 0x24, 0xfe, 0x90, 0xbd, + 0x26, 0xa2, 0x30, 0x2d, 0xe8, 0x97, 0x26, 0x57, 0x35, 0x89, 0x74, + 0x96, 0x18, 0xf6, 0x15, 0xe2, 0xaf, 0x24, 0x19, 0x56, 0x02, 0x02, + 0xb2, 0xba, 0x0f, 0x14, 0xea, 0xc6, 0x8a, 0x66, 0xc1, 0x86, 0x45, + 0x55, 0x8b, 0xbe, 0x92, 0xbe, 0x9c, 0xa4, 0x04, 0xc7, 0x49, 0x3c, + 0x9e, 0xe8, 0x29, 0x7a, 0x89, 0xd7, 0xfe, 0xaf, 0xff, 0x68, 0xf5, + 0xa5, 0x17, 0x90, 0xbd, 0xac, 0x99, 0xcc, 0xa5, 0x86, 0x57, 0x09, + 0x67, 0x46, 0xdb, 0xd6, 0x16, 0xc2, 0x46, 0xf1, 0xe4, 0xa9, 0x50, + 0xf5, 0x8f, 0xd1, 0x92, 0x15, 0xd3, 0x5f, 0x3e, 0xc6, 0x00, 0x49, + 0x3a, 0x6e, 0x58, 0xb2, 0xd1, 0xd1, 0x27, 0x0d, 0x25, 0xc8, 0x32, + 0xf8, 0x20, 0x11, 0xcd, 0x7d, 0x32, 0x33, 0x48, 0x94, 0x54, 0x4c, + 0xdd, 0xdc, 0x79, 0xc4, 0x30, 0x9f, 0xeb, 0x8e, 0xb8, 0x55, 0xb5, + 0xd7, 0x88, 0x5c, 0xc5, 0x6a, 0x24, 0x3d, 0xb2, 0xd3, 0x05, 0x03, + 0x51, 0xc6, 0x07, 0xef, 0xcc, 0x14, 0x72, 0x74, 0x3d, 0x6e, 0x72, + 0xce, 0x18, 0x28, 0x8c, 0x4a, 0xa0, 0x77, 0xe5, 0x09, 0x2b, 0x45, + 0x44, 0x47, 0xac, 0xb7, 0x67, 0x7f, 0x01, 0x8a, 0x05, 0x5a, 0x93, + 0xbe, 0xa1, 0xc1, 0xff, 0xf8, 0xe7, 0x0e, 0x67, 0xa4, 0x47, 0x49, + 0x76, 0x5d, 0x75, 0x90, 0x1a, 0xf5, 0x26, 0x8f, 0xf0, 0x30, 0x82, + 0x06, 0x7d, 0x30, 0x82, 0x05, 0x65, 0xa0, 0x03, 0x02, 0x01, 0x02, + 0x02, 0x02, 0x01, 0x03, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x04, 0x05, 0x00, 0x30, 0x81, 0xaf, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x48, 0x55, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, + 0x13, 0x07, 0x48, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x79, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x08, 0x42, 0x75, 0x64, 0x61, 0x70, 0x65, 0x73, 0x74, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1e, 0x4e, 0x65, 0x74, 0x4c, 0x6f, @@ -4870,102 +3220,145 @@ static const unsigned char ca_bundle_data[] = { 0x69, 0x7a, 0x74, 0x6f, 0x6e, 0x73, 0x61, 0x67, 0x69, 0x20, 0x4b, 0x66, 0x74, 0x2e, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x11, 0x54, 0x61, 0x6e, 0x75, 0x73, 0x69, 0x74, 0x76, - 0x61, 0x6e, 0x79, 0x6b, 0x69, 0x61, 0x64, 0x6f, 0x6b, 0x31, 0x34, - 0x30, 0x32, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2b, 0x4e, 0x65, - 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x45, 0x78, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x7a, 0x20, 0x28, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, - 0x43, 0x29, 0x20, 0x54, 0x61, 0x6e, 0x75, 0x73, 0x69, 0x74, 0x76, - 0x61, 0x6e, 0x79, 0x6b, 0x69, 0x61, 0x64, 0x6f, 0x30, 0x81, 0x9f, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, - 0x02, 0x81, 0x81, 0x00, 0xeb, 0xec, 0xb0, 0x6c, 0x61, 0x8a, 0x23, - 0x25, 0xaf, 0x60, 0x20, 0xe3, 0xd9, 0x9f, 0xfc, 0x93, 0x0b, 0xdb, - 0x5d, 0x8d, 0xb0, 0xa1, 0xb3, 0x40, 0x3a, 0x82, 0xce, 0xfd, 0x75, - 0xe0, 0x78, 0x32, 0x03, 0x86, 0x5a, 0x86, 0x95, 0x91, 0xed, 0x53, - 0xfa, 0x9d, 0x40, 0xfc, 0xe6, 0xe8, 0xdd, 0xd9, 0x5b, 0x7a, 0x03, - 0xbd, 0x5d, 0xf3, 0x3b, 0x0c, 0xc3, 0x51, 0x79, 0x9b, 0xad, 0x55, - 0xa0, 0xe9, 0xd0, 0x03, 0x10, 0xaf, 0x0a, 0xba, 0x14, 0x42, 0xd9, - 0x52, 0x26, 0x11, 0x22, 0xc7, 0xd2, 0x20, 0xcc, 0x82, 0xa4, 0x9a, - 0xa9, 0xfe, 0xb8, 0x81, 0x76, 0x9d, 0x6a, 0xb7, 0xd2, 0x36, 0x75, - 0x3e, 0xb1, 0x86, 0x09, 0xf6, 0x6e, 0x6d, 0x7e, 0x4e, 0xb7, 0x7a, - 0xec, 0xae, 0x71, 0x84, 0xf6, 0x04, 0x33, 0x08, 0x25, 0x32, 0xeb, - 0x74, 0xac, 0x16, 0x44, 0xc6, 0xe4, 0x40, 0x93, 0x1d, 0x7f, 0xad, - 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x02, 0x9f, 0x30, 0x82, - 0x02, 0x9b, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, - 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x04, - 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, - 0x04, 0x03, 0x02, 0x00, 0x06, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, - 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, - 0x00, 0x07, 0x30, 0x82, 0x02, 0x60, 0x06, 0x09, 0x60, 0x86, 0x48, - 0x01, 0x86, 0xf8, 0x42, 0x01, 0x0d, 0x04, 0x82, 0x02, 0x51, 0x16, - 0x82, 0x02, 0x4d, 0x46, 0x49, 0x47, 0x59, 0x45, 0x4c, 0x45, 0x4d, - 0x21, 0x20, 0x45, 0x7a, 0x65, 0x6e, 0x20, 0x74, 0x61, 0x6e, 0x75, - 0x73, 0x69, 0x74, 0x76, 0x61, 0x6e, 0x79, 0x20, 0x61, 0x20, 0x4e, - 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x4b, 0x66, 0x74, 0x2e, - 0x20, 0x41, 0x6c, 0x74, 0x61, 0x6c, 0x61, 0x6e, 0x6f, 0x73, 0x20, - 0x53, 0x7a, 0x6f, 0x6c, 0x67, 0x61, 0x6c, 0x74, 0x61, 0x74, 0x61, - 0x73, 0x69, 0x20, 0x46, 0x65, 0x6c, 0x74, 0x65, 0x74, 0x65, 0x6c, - 0x65, 0x69, 0x62, 0x65, 0x6e, 0x20, 0x6c, 0x65, 0x69, 0x72, 0x74, - 0x20, 0x65, 0x6c, 0x6a, 0x61, 0x72, 0x61, 0x73, 0x6f, 0x6b, 0x20, - 0x61, 0x6c, 0x61, 0x70, 0x6a, 0x61, 0x6e, 0x20, 0x6b, 0x65, 0x73, - 0x7a, 0x75, 0x6c, 0x74, 0x2e, 0x20, 0x41, 0x20, 0x68, 0x69, 0x74, - 0x65, 0x6c, 0x65, 0x73, 0x69, 0x74, 0x65, 0x73, 0x20, 0x66, 0x6f, - 0x6c, 0x79, 0x61, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x20, 0x61, 0x20, - 0x4e, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x4b, 0x66, 0x74, - 0x2e, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x6b, 0x66, 0x65, 0x6c, - 0x65, 0x6c, 0x6f, 0x73, 0x73, 0x65, 0x67, 0x2d, 0x62, 0x69, 0x7a, - 0x74, 0x6f, 0x73, 0x69, 0x74, 0x61, 0x73, 0x61, 0x20, 0x76, 0x65, - 0x64, 0x69, 0x2e, 0x20, 0x41, 0x20, 0x64, 0x69, 0x67, 0x69, 0x74, - 0x61, 0x6c, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x61, 0x69, 0x72, 0x61, - 0x73, 0x20, 0x65, 0x6c, 0x66, 0x6f, 0x67, 0x61, 0x64, 0x61, 0x73, - 0x61, 0x6e, 0x61, 0x6b, 0x20, 0x66, 0x65, 0x6c, 0x74, 0x65, 0x74, - 0x65, 0x6c, 0x65, 0x20, 0x61, 0x7a, 0x20, 0x65, 0x6c, 0x6f, 0x69, - 0x72, 0x74, 0x20, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x6f, 0x72, 0x7a, - 0x65, 0x73, 0x69, 0x20, 0x65, 0x6c, 0x6a, 0x61, 0x72, 0x61, 0x73, - 0x20, 0x6d, 0x65, 0x67, 0x74, 0x65, 0x74, 0x65, 0x6c, 0x65, 0x2e, - 0x20, 0x41, 0x7a, 0x20, 0x65, 0x6c, 0x6a, 0x61, 0x72, 0x61, 0x73, - 0x20, 0x6c, 0x65, 0x69, 0x72, 0x61, 0x73, 0x61, 0x20, 0x6d, 0x65, - 0x67, 0x74, 0x61, 0x6c, 0x61, 0x6c, 0x68, 0x61, 0x74, 0x6f, 0x20, + 0x61, 0x6e, 0x79, 0x6b, 0x69, 0x61, 0x64, 0x6f, 0x6b, 0x31, 0x36, + 0x30, 0x34, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2d, 0x4e, 0x65, + 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x4b, 0x6f, 0x7a, 0x6a, 0x65, + 0x67, 0x79, 0x7a, 0x6f, 0x69, 0x20, 0x28, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x20, 0x41, 0x29, 0x20, 0x54, 0x61, 0x6e, 0x75, 0x73, 0x69, + 0x74, 0x76, 0x61, 0x6e, 0x79, 0x6b, 0x69, 0x61, 0x64, 0x6f, 0x30, + 0x1e, 0x17, 0x0d, 0x39, 0x39, 0x30, 0x32, 0x32, 0x34, 0x32, 0x33, + 0x31, 0x34, 0x34, 0x37, 0x5a, 0x17, 0x0d, 0x31, 0x39, 0x30, 0x32, + 0x31, 0x39, 0x32, 0x33, 0x31, 0x34, 0x34, 0x37, 0x5a, 0x30, 0x81, + 0xaf, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x48, 0x55, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, + 0x08, 0x13, 0x07, 0x48, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x79, 0x31, + 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x08, 0x42, + 0x75, 0x64, 0x61, 0x70, 0x65, 0x73, 0x74, 0x31, 0x27, 0x30, 0x25, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1e, 0x4e, 0x65, 0x74, 0x4c, + 0x6f, 0x63, 0x6b, 0x20, 0x48, 0x61, 0x6c, 0x6f, 0x7a, 0x61, 0x74, + 0x62, 0x69, 0x7a, 0x74, 0x6f, 0x6e, 0x73, 0x61, 0x67, 0x69, 0x20, + 0x4b, 0x66, 0x74, 0x2e, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, + 0x04, 0x0b, 0x13, 0x11, 0x54, 0x61, 0x6e, 0x75, 0x73, 0x69, 0x74, + 0x76, 0x61, 0x6e, 0x79, 0x6b, 0x69, 0x61, 0x64, 0x6f, 0x6b, 0x31, + 0x36, 0x30, 0x34, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2d, 0x4e, + 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x4b, 0x6f, 0x7a, 0x6a, + 0x65, 0x67, 0x79, 0x7a, 0x6f, 0x69, 0x20, 0x28, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x20, 0x41, 0x29, 0x20, 0x54, 0x61, 0x6e, 0x75, 0x73, + 0x69, 0x74, 0x76, 0x61, 0x6e, 0x79, 0x6b, 0x69, 0x61, 0x64, 0x6f, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, + 0xbc, 0x74, 0x8c, 0x0f, 0xbb, 0x4c, 0xf4, 0x37, 0x1e, 0xa9, 0x05, + 0x82, 0xd8, 0xe6, 0xe1, 0x6c, 0x70, 0xea, 0x78, 0xb5, 0x6e, 0xd1, + 0x38, 0x44, 0x0d, 0xa8, 0x83, 0xce, 0x5d, 0xd2, 0xd6, 0xd5, 0x81, + 0xc5, 0xd4, 0x4b, 0xe7, 0x5b, 0x94, 0x70, 0x26, 0xdb, 0x3b, 0x9d, + 0x6a, 0x4c, 0x62, 0xf7, 0x71, 0xf3, 0x64, 0xd6, 0x61, 0x3b, 0x3d, + 0xeb, 0x73, 0xa3, 0x37, 0xd9, 0xcf, 0xea, 0x8c, 0x92, 0x3b, 0xcd, + 0xf7, 0x07, 0xdc, 0x66, 0x74, 0x97, 0xf4, 0x45, 0x22, 0xdd, 0xf4, + 0x5c, 0xe0, 0xbf, 0x6d, 0xf3, 0xbe, 0x65, 0x33, 0xe4, 0x15, 0x3a, + 0xbf, 0xdb, 0x98, 0x90, 0x55, 0x38, 0xc4, 0xed, 0xa6, 0x55, 0x63, + 0x0b, 0xb0, 0x78, 0x04, 0xf4, 0xe3, 0x6e, 0xc1, 0x3f, 0x8e, 0xfc, + 0x51, 0x78, 0x1f, 0x92, 0x9e, 0x83, 0xc2, 0xfe, 0xd9, 0xb0, 0xa9, + 0xc9, 0xbc, 0x5a, 0x00, 0xff, 0xa9, 0xa8, 0x98, 0x74, 0xfb, 0xf6, + 0x2c, 0x3e, 0x15, 0x39, 0x0d, 0xb6, 0x04, 0x55, 0xa8, 0x0e, 0x98, + 0x20, 0x42, 0xb3, 0xb1, 0x25, 0xad, 0x7e, 0x9a, 0x6f, 0x5d, 0x53, + 0xb1, 0xab, 0x0c, 0xfc, 0xeb, 0xe0, 0xf3, 0x7a, 0xb3, 0xa8, 0xb3, + 0xff, 0x46, 0xf6, 0x63, 0xa2, 0xd8, 0x3a, 0x98, 0x7b, 0xb6, 0xac, + 0x85, 0xff, 0xb0, 0x25, 0x4f, 0x74, 0x63, 0xe7, 0x13, 0x07, 0xa5, + 0x0a, 0x8f, 0x05, 0xf7, 0xc0, 0x64, 0x6f, 0x7e, 0xa7, 0x27, 0x80, + 0x96, 0xde, 0xd4, 0x2e, 0x86, 0x60, 0xc7, 0x6b, 0x2b, 0x5e, 0x73, + 0x7b, 0x17, 0xe7, 0x91, 0x3f, 0x64, 0x0c, 0xd8, 0x4b, 0x22, 0x34, + 0x2b, 0x9b, 0x32, 0xf2, 0x48, 0x1f, 0x9f, 0xa1, 0x0a, 0x84, 0x7a, + 0xe2, 0xc2, 0xad, 0x97, 0x3d, 0x8e, 0xd5, 0xc1, 0xf9, 0x56, 0xa3, + 0x50, 0xe9, 0xc6, 0xb4, 0xfa, 0x98, 0xa2, 0xee, 0x95, 0xe6, 0x2a, + 0x03, 0x8c, 0xdf, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x02, + 0x9f, 0x30, 0x82, 0x02, 0x9b, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, + 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x00, 0x06, 0x30, + 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, + 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x04, 0x30, 0x11, 0x06, + 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x01, 0x04, + 0x04, 0x03, 0x02, 0x00, 0x07, 0x30, 0x82, 0x02, 0x60, 0x06, 0x09, + 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x0d, 0x04, 0x82, + 0x02, 0x51, 0x16, 0x82, 0x02, 0x4d, 0x46, 0x49, 0x47, 0x59, 0x45, + 0x4c, 0x45, 0x4d, 0x21, 0x20, 0x45, 0x7a, 0x65, 0x6e, 0x20, 0x74, + 0x61, 0x6e, 0x75, 0x73, 0x69, 0x74, 0x76, 0x61, 0x6e, 0x79, 0x20, 0x61, 0x20, 0x4e, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x4b, - 0x66, 0x74, 0x2e, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, - 0x74, 0x20, 0x68, 0x6f, 0x6e, 0x6c, 0x61, 0x70, 0x6a, 0x61, 0x6e, - 0x20, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, - 0x77, 0x77, 0x77, 0x2e, 0x6e, 0x65, 0x74, 0x6c, 0x6f, 0x63, 0x6b, - 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x20, 0x63, - 0x69, 0x6d, 0x65, 0x6e, 0x20, 0x76, 0x61, 0x67, 0x79, 0x20, 0x6b, - 0x65, 0x72, 0x68, 0x65, 0x74, 0x6f, 0x20, 0x61, 0x7a, 0x20, 0x65, - 0x6c, 0x6c, 0x65, 0x6e, 0x6f, 0x72, 0x7a, 0x65, 0x73, 0x40, 0x6e, - 0x65, 0x74, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6e, 0x65, 0x74, 0x20, - 0x65, 0x2d, 0x6d, 0x61, 0x69, 0x6c, 0x20, 0x63, 0x69, 0x6d, 0x65, - 0x6e, 0x2e, 0x20, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, - 0x54, 0x21, 0x20, 0x54, 0x68, 0x65, 0x20, 0x69, 0x73, 0x73, 0x75, - 0x61, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, - 0x69, 0x73, 0x20, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x20, 0x69, 0x73, 0x20, 0x73, 0x75, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x4e, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x43, 0x50, 0x53, - 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, - 0x61, 0x74, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, - 0x77, 0x77, 0x77, 0x2e, 0x6e, 0x65, 0x74, 0x6c, 0x6f, 0x63, 0x6b, - 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x20, 0x6f, - 0x72, 0x20, 0x62, 0x79, 0x20, 0x65, 0x2d, 0x6d, 0x61, 0x69, 0x6c, - 0x20, 0x61, 0x74, 0x20, 0x63, 0x70, 0x73, 0x40, 0x6e, 0x65, 0x74, - 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x04, - 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x10, 0xad, 0x7f, 0xd7, 0x0c, - 0x32, 0x80, 0x0a, 0xd8, 0x86, 0xf1, 0x79, 0x98, 0xb5, 0xad, 0xd4, - 0xcd, 0xb3, 0x36, 0xc4, 0x96, 0x48, 0xc1, 0x5c, 0xcd, 0x9a, 0xd9, - 0x05, 0x2e, 0x9f, 0xbe, 0x50, 0xeb, 0xf4, 0x26, 0x14, 0x10, 0x2d, - 0xd4, 0x66, 0x17, 0xf8, 0x9e, 0xc1, 0x27, 0xfd, 0xf1, 0xed, 0xe4, - 0x7b, 0x4b, 0xa0, 0x6c, 0xb5, 0xab, 0x9a, 0x57, 0x70, 0xa6, 0xed, - 0xa0, 0xa4, 0xed, 0x2e, 0xf5, 0xfd, 0xfc, 0xbd, 0xfe, 0x4d, 0x37, - 0x08, 0x0c, 0xbc, 0xe3, 0x96, 0x83, 0x22, 0xf5, 0x49, 0x1b, 0x7f, - 0x4b, 0x2b, 0xb4, 0x54, 0xc1, 0x80, 0x7c, 0x99, 0x4e, 0x1d, 0xd0, - 0x8c, 0xee, 0xd0, 0xac, 0xe5, 0x92, 0xfa, 0x75, 0x56, 0xfe, 0x64, - 0xa0, 0x13, 0x8f, 0xb8, 0xb8, 0x16, 0x9d, 0x61, 0x05, 0x67, 0x80, - 0xc8, 0xd0, 0xd8, 0xa5, 0x07, 0x02, 0x34, 0x98, 0x04, 0x8d, 0x33, - 0x04, 0xd4, 0x30, 0x82, 0x04, 0x30, 0x30, 0x82, 0x03, 0x18, 0xa0, + 0x66, 0x74, 0x2e, 0x20, 0x41, 0x6c, 0x74, 0x61, 0x6c, 0x61, 0x6e, + 0x6f, 0x73, 0x20, 0x53, 0x7a, 0x6f, 0x6c, 0x67, 0x61, 0x6c, 0x74, + 0x61, 0x74, 0x61, 0x73, 0x69, 0x20, 0x46, 0x65, 0x6c, 0x74, 0x65, + 0x74, 0x65, 0x6c, 0x65, 0x69, 0x62, 0x65, 0x6e, 0x20, 0x6c, 0x65, + 0x69, 0x72, 0x74, 0x20, 0x65, 0x6c, 0x6a, 0x61, 0x72, 0x61, 0x73, + 0x6f, 0x6b, 0x20, 0x61, 0x6c, 0x61, 0x70, 0x6a, 0x61, 0x6e, 0x20, + 0x6b, 0x65, 0x73, 0x7a, 0x75, 0x6c, 0x74, 0x2e, 0x20, 0x41, 0x20, + 0x68, 0x69, 0x74, 0x65, 0x6c, 0x65, 0x73, 0x69, 0x74, 0x65, 0x73, + 0x20, 0x66, 0x6f, 0x6c, 0x79, 0x61, 0x6d, 0x61, 0x74, 0x61, 0x74, + 0x20, 0x61, 0x20, 0x4e, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, + 0x4b, 0x66, 0x74, 0x2e, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x6b, + 0x66, 0x65, 0x6c, 0x65, 0x6c, 0x6f, 0x73, 0x73, 0x65, 0x67, 0x2d, + 0x62, 0x69, 0x7a, 0x74, 0x6f, 0x73, 0x69, 0x74, 0x61, 0x73, 0x61, + 0x20, 0x76, 0x65, 0x64, 0x69, 0x2e, 0x20, 0x41, 0x20, 0x64, 0x69, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x61, + 0x69, 0x72, 0x61, 0x73, 0x20, 0x65, 0x6c, 0x66, 0x6f, 0x67, 0x61, + 0x64, 0x61, 0x73, 0x61, 0x6e, 0x61, 0x6b, 0x20, 0x66, 0x65, 0x6c, + 0x74, 0x65, 0x74, 0x65, 0x6c, 0x65, 0x20, 0x61, 0x7a, 0x20, 0x65, + 0x6c, 0x6f, 0x69, 0x72, 0x74, 0x20, 0x65, 0x6c, 0x6c, 0x65, 0x6e, + 0x6f, 0x72, 0x7a, 0x65, 0x73, 0x69, 0x20, 0x65, 0x6c, 0x6a, 0x61, + 0x72, 0x61, 0x73, 0x20, 0x6d, 0x65, 0x67, 0x74, 0x65, 0x74, 0x65, + 0x6c, 0x65, 0x2e, 0x20, 0x41, 0x7a, 0x20, 0x65, 0x6c, 0x6a, 0x61, + 0x72, 0x61, 0x73, 0x20, 0x6c, 0x65, 0x69, 0x72, 0x61, 0x73, 0x61, + 0x20, 0x6d, 0x65, 0x67, 0x74, 0x61, 0x6c, 0x61, 0x6c, 0x68, 0x61, + 0x74, 0x6f, 0x20, 0x61, 0x20, 0x4e, 0x65, 0x74, 0x4c, 0x6f, 0x63, + 0x6b, 0x20, 0x4b, 0x66, 0x74, 0x2e, 0x20, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x65, 0x74, 0x20, 0x68, 0x6f, 0x6e, 0x6c, 0x61, 0x70, + 0x6a, 0x61, 0x6e, 0x20, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, + 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6e, 0x65, 0x74, 0x6c, + 0x6f, 0x63, 0x6b, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x64, 0x6f, 0x63, + 0x73, 0x20, 0x63, 0x69, 0x6d, 0x65, 0x6e, 0x20, 0x76, 0x61, 0x67, + 0x79, 0x20, 0x6b, 0x65, 0x72, 0x68, 0x65, 0x74, 0x6f, 0x20, 0x61, + 0x7a, 0x20, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x6f, 0x72, 0x7a, 0x65, + 0x73, 0x40, 0x6e, 0x65, 0x74, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6e, + 0x65, 0x74, 0x20, 0x65, 0x2d, 0x6d, 0x61, 0x69, 0x6c, 0x20, 0x63, + 0x69, 0x6d, 0x65, 0x6e, 0x2e, 0x20, 0x49, 0x4d, 0x50, 0x4f, 0x52, + 0x54, 0x41, 0x4e, 0x54, 0x21, 0x20, 0x54, 0x68, 0x65, 0x20, 0x69, + 0x73, 0x73, 0x75, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x69, 0x73, 0x20, 0x73, + 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4e, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, + 0x43, 0x50, 0x53, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x61, 0x74, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, + 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6e, 0x65, 0x74, 0x6c, + 0x6f, 0x63, 0x6b, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x64, 0x6f, 0x63, + 0x73, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x79, 0x20, 0x65, 0x2d, 0x6d, + 0x61, 0x69, 0x6c, 0x20, 0x61, 0x74, 0x20, 0x63, 0x70, 0x73, 0x40, + 0x6e, 0x65, 0x74, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6e, 0x65, 0x74, + 0x2e, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x04, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x48, + 0x24, 0x46, 0xf7, 0xba, 0x56, 0x6f, 0xfa, 0xc8, 0x28, 0x03, 0x40, + 0x4e, 0xe5, 0x31, 0x39, 0x6b, 0x26, 0x6b, 0x53, 0x7f, 0xdb, 0xdf, + 0xdf, 0xf3, 0x71, 0x3d, 0x26, 0xc0, 0x14, 0x0e, 0xc6, 0x67, 0x7b, + 0x23, 0xa8, 0x0c, 0x73, 0xdd, 0x01, 0xbb, 0xc6, 0xca, 0x6e, 0x37, + 0x39, 0x55, 0xd5, 0xc7, 0x8c, 0x56, 0x20, 0x0e, 0x28, 0x0a, 0x0e, + 0xd2, 0x2a, 0xa4, 0xb0, 0x49, 0x52, 0xc6, 0x38, 0x07, 0xfe, 0xbe, + 0x0a, 0x09, 0x8c, 0xd1, 0x98, 0xcf, 0xca, 0xda, 0x14, 0x31, 0xa1, + 0x4f, 0xd2, 0x39, 0xfc, 0x0f, 0x11, 0x2c, 0x43, 0xc3, 0xdd, 0xab, + 0x93, 0xc7, 0x55, 0x3e, 0x47, 0x7c, 0x18, 0x1a, 0x00, 0xdc, 0xf3, + 0x7b, 0xd8, 0xf2, 0x7f, 0x52, 0x6c, 0x20, 0xf4, 0x0b, 0x5f, 0x69, + 0x52, 0xf4, 0xee, 0xf8, 0xb2, 0x29, 0x60, 0xeb, 0xe3, 0x49, 0x31, + 0x21, 0x0d, 0xd6, 0xb5, 0x10, 0x41, 0xe2, 0x41, 0x09, 0x6c, 0xe2, + 0x1a, 0x9a, 0x56, 0x4b, 0x77, 0x02, 0xf6, 0xa0, 0x9b, 0x9a, 0x27, + 0x87, 0xe8, 0x55, 0x29, 0x71, 0xc2, 0x90, 0x9f, 0x45, 0x78, 0x1a, + 0xe1, 0x15, 0x64, 0x3d, 0xd0, 0x0e, 0xd8, 0xa0, 0x76, 0x9f, 0xae, + 0xc5, 0xd0, 0x2e, 0xea, 0xd6, 0x0f, 0x56, 0xec, 0x64, 0x7f, 0x5a, + 0x9b, 0x14, 0x58, 0x01, 0x27, 0x7e, 0x13, 0x50, 0xc7, 0x6b, 0x2a, + 0xe6, 0x68, 0x3c, 0xbf, 0x5c, 0xa0, 0x0a, 0x1b, 0xe1, 0x0e, 0x7a, + 0xe9, 0xe2, 0x80, 0xc3, 0xe9, 0xe9, 0xf6, 0xfd, 0x6c, 0x11, 0x9e, + 0xd0, 0xe5, 0x28, 0x27, 0x2b, 0x54, 0x32, 0x42, 0x14, 0x82, 0x75, + 0xe6, 0x4a, 0xf0, 0x2b, 0x66, 0x75, 0x63, 0x8c, 0xa2, 0xfb, 0x04, + 0x3e, 0x83, 0x0e, 0x9b, 0x36, 0xf0, 0x18, 0xe4, 0x26, 0x20, 0xc3, + 0x8c, 0xf0, 0x28, 0x07, 0xad, 0x3c, 0x17, 0x66, 0x88, 0xb5, 0xfd, + 0xb6, 0x88, 0x30, 0x82, 0x04, 0x30, 0x30, 0x82, 0x03, 0x18, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x50, 0x94, 0x6c, 0xec, 0x18, 0xea, 0xd5, 0x9c, 0x4d, 0xd5, 0x97, 0xef, 0x75, 0x8f, 0xa0, 0xad, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, @@ -5560,761 +3953,580 @@ static const unsigned char ca_bundle_data[] = { 0x93, 0xb2, 0xf9, 0xfc, 0x02, 0xd3, 0x47, 0xe6, 0x71, 0xce, 0x10, 0x02, 0xee, 0x27, 0x8c, 0x84, 0xff, 0xac, 0x45, 0x0d, 0x13, 0x5c, 0x83, 0x32, 0xe0, 0x25, 0xa5, 0x86, 0x2c, 0x7c, 0xf4, 0x12, 0x30, - 0x82, 0x04, 0x57, 0x30, 0x82, 0x03, 0x3f, 0xa0, 0x03, 0x02, 0x01, - 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0x9d, - 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x45, 0x53, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x07, - 0x13, 0x19, 0x43, 0x2f, 0x20, 0x4d, 0x75, 0x6e, 0x74, 0x61, 0x6e, - 0x65, 0x72, 0x20, 0x32, 0x34, 0x34, 0x20, 0x42, 0x61, 0x72, 0x63, - 0x65, 0x6c, 0x6f, 0x6e, 0x61, 0x31, 0x42, 0x30, 0x40, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x13, 0x39, 0x41, 0x75, 0x74, 0x6f, 0x72, 0x69, - 0x64, 0x61, 0x64, 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x20, 0x46, - 0x69, 0x72, 0x6d, 0x61, 0x70, 0x72, 0x6f, 0x66, 0x65, 0x73, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x43, 0x49, 0x46, 0x20, 0x41, 0x36, - 0x32, 0x36, 0x33, 0x34, 0x30, 0x36, 0x38, 0x31, 0x26, 0x30, 0x24, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, - 0x16, 0x17, 0x63, 0x61, 0x40, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x70, - 0x72, 0x6f, 0x66, 0x65, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2e, - 0x63, 0x6f, 0x6d, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x31, 0x31, 0x30, - 0x32, 0x34, 0x32, 0x32, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, - 0x31, 0x33, 0x31, 0x30, 0x32, 0x34, 0x32, 0x32, 0x30, 0x30, 0x30, - 0x30, 0x5a, 0x30, 0x81, 0x9d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, - 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x22, 0x30, 0x20, - 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x19, 0x43, 0x2f, 0x20, 0x4d, - 0x75, 0x6e, 0x74, 0x61, 0x6e, 0x65, 0x72, 0x20, 0x32, 0x34, 0x34, - 0x20, 0x42, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x6f, 0x6e, 0x61, 0x31, - 0x42, 0x30, 0x40, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x39, 0x41, - 0x75, 0x74, 0x6f, 0x72, 0x69, 0x64, 0x61, 0x64, 0x20, 0x64, 0x65, - 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, - 0x69, 0x6f, 0x6e, 0x20, 0x46, 0x69, 0x72, 0x6d, 0x61, 0x70, 0x72, - 0x6f, 0x66, 0x65, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x43, - 0x49, 0x46, 0x20, 0x41, 0x36, 0x32, 0x36, 0x33, 0x34, 0x30, 0x36, - 0x38, 0x31, 0x26, 0x30, 0x24, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x17, 0x63, 0x61, 0x40, 0x66, - 0x69, 0x72, 0x6d, 0x61, 0x70, 0x72, 0x6f, 0x66, 0x65, 0x73, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x82, 0x01, - 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, - 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xe7, 0x23, 0x03, - 0x6f, 0x6f, 0x23, 0xa5, 0x5e, 0x78, 0xce, 0x95, 0x2c, 0xed, 0x94, - 0x1e, 0x6e, 0x0a, 0x9e, 0x01, 0xc7, 0xea, 0x30, 0xd1, 0x2c, 0x9d, - 0xdd, 0x37, 0xe8, 0x9b, 0x98, 0x79, 0x56, 0xd3, 0xfc, 0x73, 0xdf, - 0xd0, 0x8a, 0xde, 0x55, 0x8f, 0x51, 0xf9, 0x5a, 0xea, 0xde, 0xb5, - 0x70, 0xc4, 0xed, 0xa4, 0xed, 0xff, 0xa3, 0x0d, 0x6e, 0x0f, 0x64, - 0x50, 0x31, 0xaf, 0x01, 0x27, 0x58, 0xae, 0xfe, 0x6c, 0xa7, 0x4a, - 0x2f, 0x17, 0x2d, 0xd3, 0x73, 0xd5, 0x13, 0x1c, 0x8f, 0x59, 0xa5, - 0x34, 0x2c, 0x1d, 0x54, 0x04, 0x45, 0xcd, 0x68, 0xb8, 0xa0, 0xc0, - 0x03, 0xa5, 0xcf, 0x85, 0x42, 0x47, 0x95, 0x28, 0x5b, 0xcf, 0xef, - 0x80, 0x6c, 0xe0, 0x90, 0x97, 0x8a, 0x01, 0x3c, 0x1d, 0xf3, 0x87, - 0x10, 0x30, 0x26, 0x48, 0x7d, 0xd7, 0xfc, 0xe9, 0x9d, 0x91, 0x71, - 0xff, 0x41, 0x9a, 0xa9, 0x40, 0xb5, 0x37, 0x9c, 0x29, 0x20, 0x4f, - 0x1f, 0x52, 0xe3, 0xa0, 0x7d, 0x13, 0x6d, 0x54, 0xb7, 0x0a, 0xde, - 0xe9, 0x6a, 0x4e, 0x07, 0xac, 0xac, 0x19, 0x5f, 0xdc, 0x7e, 0x62, - 0x74, 0xf6, 0xb2, 0x05, 0x00, 0xba, 0x85, 0xa0, 0xfd, 0x1d, 0x38, - 0x6e, 0xcb, 0x5a, 0xbb, 0x86, 0xbc, 0x94, 0x67, 0x33, 0x35, 0x83, - 0x2c, 0x1f, 0x23, 0xcd, 0xf8, 0xc8, 0x91, 0x71, 0xcc, 0x97, 0x8b, - 0xef, 0xae, 0x0f, 0xdc, 0x29, 0x03, 0x1b, 0xc0, 0x39, 0xeb, 0x70, - 0xed, 0xc1, 0x6e, 0x0e, 0xd8, 0x67, 0x0b, 0x89, 0xa9, 0xbc, 0x35, - 0xe4, 0xef, 0xb6, 0x34, 0xb4, 0xa5, 0xb6, 0xc4, 0x2d, 0xa5, 0xbe, - 0xd0, 0xc3, 0x94, 0x24, 0x48, 0xdb, 0xdf, 0x96, 0xd3, 0x00, 0xb5, - 0x66, 0x1a, 0x8b, 0x66, 0x05, 0x0f, 0xdd, 0x3f, 0x3f, 0xcb, 0x3f, - 0xaa, 0x5e, 0x9a, 0x4a, 0xf8, 0xb4, 0x4a, 0xef, 0x95, 0x37, 0x1b, - 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x9f, 0x30, 0x81, 0x9c, - 0x30, 0x2a, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x23, 0x30, 0x21, - 0x86, 0x1f, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, - 0x77, 0x2e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x70, 0x72, 0x6f, 0x66, - 0x65, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, - 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, - 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x01, 0x30, 0x2b, - 0x06, 0x03, 0x55, 0x1d, 0x10, 0x04, 0x24, 0x30, 0x22, 0x80, 0x0f, - 0x32, 0x30, 0x30, 0x31, 0x31, 0x30, 0x32, 0x34, 0x32, 0x32, 0x30, - 0x30, 0x30, 0x30, 0x5a, 0x81, 0x0f, 0x32, 0x30, 0x31, 0x33, 0x31, - 0x30, 0x32, 0x34, 0x32, 0x32, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, - 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, - 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, - 0x04, 0x16, 0x04, 0x14, 0x33, 0x0b, 0xa0, 0x66, 0xd1, 0xea, 0xda, - 0xce, 0xde, 0x62, 0x93, 0x04, 0x28, 0x52, 0xb5, 0x14, 0x7f, 0x38, - 0x68, 0xb7, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, - 0x47, 0x73, 0xfe, 0x8d, 0x27, 0x54, 0xf0, 0xf5, 0xd4, 0x77, 0x9c, - 0x27, 0x79, 0x57, 0x57, 0xb7, 0x15, 0x56, 0xec, 0xc7, 0xd8, 0x58, - 0xb7, 0x01, 0x02, 0xf4, 0x33, 0xed, 0x93, 0x50, 0x88, 0x9e, 0x7c, - 0x46, 0xb1, 0xbd, 0x3f, 0x14, 0x6f, 0xf1, 0xb3, 0x47, 0x48, 0x8b, - 0x8c, 0x97, 0x06, 0xd7, 0xea, 0x7e, 0xa3, 0x5c, 0x2a, 0xbb, 0x4d, - 0x2f, 0x47, 0xe2, 0xf8, 0x39, 0x06, 0xc9, 0x9c, 0x2e, 0x31, 0x1a, - 0x03, 0x78, 0xf4, 0xbc, 0x38, 0xc6, 0x22, 0x8b, 0x33, 0x31, 0xf0, - 0x16, 0x04, 0x04, 0x7d, 0xf9, 0x76, 0xe4, 0x4b, 0xd7, 0xc0, 0xe6, - 0x83, 0xec, 0x59, 0xcc, 0x3f, 0xde, 0xff, 0x4f, 0x6b, 0xb7, 0x67, - 0x7e, 0xa6, 0x86, 0x81, 0x32, 0x23, 0x03, 0x9d, 0xc8, 0xf7, 0x5f, - 0xc1, 0x4a, 0x60, 0xa5, 0x92, 0xa9, 0xb1, 0xa4, 0xa0, 0x60, 0xc3, - 0x78, 0x87, 0xb3, 0x22, 0xf3, 0x2a, 0xeb, 0x5b, 0xa9, 0xed, 0x05, - 0xab, 0x37, 0x0f, 0xb1, 0xe2, 0xd3, 0x95, 0x76, 0x63, 0x56, 0x74, - 0x8c, 0x58, 0x72, 0x1b, 0x37, 0xe5, 0x64, 0xa1, 0xbe, 0x4d, 0x0c, - 0x93, 0x98, 0x0c, 0x97, 0xf6, 0x87, 0x6d, 0xb3, 0x3f, 0xe7, 0xcb, - 0x80, 0xa6, 0xed, 0x88, 0xc7, 0x5f, 0x50, 0x62, 0x02, 0xe8, 0x99, - 0x74, 0x16, 0xd0, 0xe6, 0xb4, 0x39, 0xf1, 0x27, 0xcb, 0xc8, 0x40, - 0xd6, 0xe3, 0x86, 0x10, 0xa9, 0x23, 0x12, 0x92, 0xe0, 0x69, 0x41, - 0x63, 0xa7, 0xaf, 0x25, 0x0b, 0xc0, 0xc5, 0x92, 0xcb, 0x1e, 0x98, - 0xa3, 0x5a, 0xba, 0xc5, 0x33, 0x0f, 0xa0, 0x97, 0x01, 0xdd, 0x7f, - 0xe0, 0x7b, 0xd6, 0x06, 0x54, 0xcf, 0xa1, 0xe2, 0x4d, 0x38, 0xeb, - 0x4b, 0x50, 0xb5, 0xcb, 0x26, 0xf4, 0xca, 0xda, 0x70, 0x4a, 0x6a, - 0xa1, 0xe2, 0x79, 0xaa, 0xe1, 0xa7, 0x33, 0xf6, 0xfd, 0x4a, 0x1f, - 0xf6, 0xd9, 0x60, 0x30, 0x82, 0x03, 0xe5, 0x30, 0x82, 0x02, 0xcd, - 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04, 0x39, 0xe4, 0x97, 0x9e, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0x82, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x14, - 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x57, 0x65, - 0x6c, 0x6c, 0x73, 0x20, 0x46, 0x61, 0x72, 0x67, 0x6f, 0x31, 0x2c, - 0x30, 0x2a, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x23, 0x57, 0x65, - 0x6c, 0x6c, 0x73, 0x20, 0x46, 0x61, 0x72, 0x67, 0x6f, 0x20, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x31, 0x2f, 0x30, 0x2d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x26, - 0x57, 0x65, 0x6c, 0x6c, 0x73, 0x20, 0x46, 0x61, 0x72, 0x67, 0x6f, - 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x30, - 0x31, 0x30, 0x31, 0x31, 0x31, 0x36, 0x34, 0x31, 0x32, 0x38, 0x5a, - 0x17, 0x0d, 0x32, 0x31, 0x30, 0x31, 0x31, 0x34, 0x31, 0x36, 0x34, - 0x31, 0x32, 0x38, 0x5a, 0x30, 0x81, 0x82, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x14, - 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x57, 0x65, - 0x6c, 0x6c, 0x73, 0x20, 0x46, 0x61, 0x72, 0x67, 0x6f, 0x31, 0x2c, - 0x30, 0x2a, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x23, 0x57, 0x65, - 0x6c, 0x6c, 0x73, 0x20, 0x46, 0x61, 0x72, 0x67, 0x6f, 0x20, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x31, 0x2f, 0x30, 0x2d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x26, - 0x57, 0x65, 0x6c, 0x6c, 0x73, 0x20, 0x46, 0x61, 0x72, 0x67, 0x6f, - 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, - 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, - 0x02, 0x82, 0x01, 0x01, 0x00, 0xd5, 0xa8, 0x33, 0x3b, 0x26, 0xf9, - 0x34, 0xff, 0xcd, 0x9b, 0x7e, 0xe5, 0x04, 0x47, 0xce, 0x00, 0xe2, - 0x7d, 0x77, 0xe7, 0x31, 0xc2, 0x2e, 0x27, 0xa5, 0x4d, 0x68, 0xb9, - 0x31, 0xba, 0x8d, 0x43, 0x59, 0x97, 0xc7, 0x73, 0xaa, 0x7f, 0x3d, - 0x5c, 0x40, 0x9e, 0x05, 0xe5, 0xa1, 0xe2, 0x89, 0xd9, 0x4c, 0xb8, - 0x3f, 0x9b, 0xf9, 0x0c, 0xb4, 0xc8, 0x62, 0x19, 0x2c, 0x45, 0xae, - 0x91, 0x1e, 0x73, 0x71, 0x41, 0xc4, 0x4b, 0x13, 0xfd, 0x70, 0xc2, - 0x25, 0xac, 0x22, 0xf5, 0x75, 0x0b, 0xb7, 0x53, 0xe4, 0xa5, 0x2b, - 0xdd, 0xce, 0xbd, 0x1c, 0x3a, 0x7a, 0xc3, 0xf7, 0x13, 0x8f, 0x26, - 0x54, 0x9c, 0x16, 0x6b, 0x6b, 0xaf, 0xfb, 0xd8, 0x96, 0xb1, 0x60, - 0x9a, 0x48, 0xe0, 0x25, 0x22, 0x24, 0x79, 0x34, 0xce, 0x0e, 0x26, - 0x00, 0x0b, 0x4e, 0xab, 0xfd, 0x8b, 0xce, 0x82, 0xd7, 0x2f, 0x08, - 0x70, 0x68, 0xc1, 0xa8, 0x0a, 0xf9, 0x74, 0x4f, 0x07, 0xab, 0xa4, - 0xf9, 0xe2, 0x83, 0x7e, 0x27, 0x73, 0x74, 0x3e, 0xb8, 0xf9, 0x38, - 0x42, 0xfc, 0xa5, 0xa8, 0x5b, 0x48, 0x23, 0xb3, 0xeb, 0xe3, 0x25, - 0xb2, 0x80, 0xae, 0x96, 0xd4, 0x0a, 0x9c, 0xc2, 0x78, 0x9a, 0xc6, - 0x68, 0x18, 0xae, 0x37, 0x62, 0x37, 0x5e, 0x51, 0x75, 0xa8, 0x58, - 0x63, 0xc0, 0x51, 0xee, 0x40, 0x78, 0x7e, 0xa8, 0xaf, 0x1a, 0xa0, - 0xe1, 0xb0, 0x78, 0x9d, 0x50, 0x8c, 0x7b, 0xe7, 0xb3, 0xfc, 0x8e, - 0x23, 0xb0, 0xdb, 0x65, 0x00, 0x70, 0x84, 0x01, 0x08, 0x00, 0x14, - 0x6e, 0x54, 0x86, 0x9a, 0xba, 0xcc, 0xf9, 0x37, 0x10, 0xf6, 0xe0, - 0xde, 0x84, 0x2d, 0x9d, 0xa4, 0x85, 0x37, 0xd3, 0x87, 0xe3, 0x15, - 0xd0, 0xc1, 0x17, 0x90, 0x7e, 0x19, 0x21, 0x6a, 0x12, 0xa9, 0x76, - 0xfd, 0x12, 0x02, 0xe9, 0x4f, 0x21, 0x5e, 0x17, 0x02, 0x03, 0x01, - 0x00, 0x01, 0xa3, 0x61, 0x30, 0x5f, 0x30, 0x0f, 0x06, 0x03, 0x55, - 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, - 0xff, 0x30, 0x4c, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x45, 0x30, - 0x43, 0x30, 0x41, 0x06, 0x0b, 0x60, 0x86, 0x48, 0x01, 0x86, 0xfb, - 0x7b, 0x87, 0x07, 0x01, 0x0b, 0x30, 0x32, 0x30, 0x30, 0x06, 0x08, - 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x24, 0x68, - 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, - 0x65, 0x6c, 0x6c, 0x73, 0x66, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, - 0xd2, 0x27, 0xdd, 0x9c, 0x0a, 0x77, 0x2b, 0xbb, 0x22, 0xf2, 0x02, - 0xb5, 0x4a, 0x4a, 0x91, 0xf9, 0xd1, 0x2d, 0xbe, 0xe4, 0xbb, 0x1a, - 0x68, 0xef, 0x0e, 0xa4, 0x00, 0xe9, 0xee, 0xe7, 0xef, 0xee, 0xf6, - 0xf9, 0xe5, 0x74, 0xa4, 0xc2, 0xd8, 0x52, 0x58, 0xc4, 0x74, 0xfb, - 0xce, 0x6b, 0xb5, 0x3b, 0x29, 0x79, 0x18, 0x5a, 0xef, 0x9b, 0xed, - 0x1f, 0x6b, 0x36, 0xee, 0x48, 0x25, 0x25, 0x14, 0xb6, 0x56, 0xa2, - 0x10, 0xe8, 0xee, 0xa7, 0x7f, 0xd0, 0x3f, 0xa3, 0xd0, 0xc3, 0x5d, - 0x26, 0xee, 0x07, 0xcc, 0xc3, 0xc1, 0x24, 0x21, 0x87, 0x1e, 0xdf, - 0x2a, 0x12, 0x53, 0x6f, 0x41, 0x16, 0xe7, 0xed, 0xae, 0x94, 0xfa, - 0x8c, 0x72, 0xfa, 0x13, 0x47, 0xf0, 0x3c, 0x7e, 0xae, 0x7d, 0x11, - 0x3a, 0x13, 0xec, 0xed, 0xfa, 0x6f, 0x72, 0x64, 0x7b, 0x9d, 0x7d, - 0x7f, 0x26, 0xfd, 0x7a, 0xfb, 0x25, 0xad, 0xea, 0x3e, 0x29, 0x7f, - 0x4c, 0xe3, 0x00, 0x57, 0x32, 0xb0, 0xb3, 0xe9, 0xed, 0x53, 0x17, - 0xd9, 0x8b, 0xb2, 0x14, 0x0e, 0x30, 0xe8, 0xe5, 0xd5, 0x13, 0xc6, - 0x64, 0xaf, 0xc4, 0x00, 0xd5, 0xd8, 0x58, 0x24, 0xfc, 0xf5, 0x8f, - 0xec, 0xf1, 0xc7, 0x7d, 0xa5, 0xdb, 0x0f, 0x27, 0xd1, 0xc6, 0xf2, - 0x40, 0x88, 0xe6, 0x1f, 0xf6, 0x61, 0xa8, 0xf4, 0x42, 0xc8, 0xb9, - 0x37, 0xd3, 0xa9, 0xbe, 0x2c, 0x56, 0x78, 0xc2, 0x72, 0x9b, 0x59, - 0x5d, 0x35, 0x40, 0x8a, 0xe8, 0x4e, 0x63, 0x1a, 0xb6, 0xe9, 0x20, - 0x6a, 0x51, 0xe2, 0xce, 0xa4, 0x90, 0xdf, 0x76, 0x70, 0x99, 0x5c, - 0x70, 0x43, 0x4d, 0xb7, 0xb6, 0xa7, 0x19, 0x64, 0x4e, 0x92, 0xb7, - 0xc5, 0x91, 0x3c, 0x7f, 0x48, 0x16, 0x65, 0x7b, 0x16, 0xfd, 0xcb, - 0xfc, 0xfb, 0xd9, 0xd5, 0xd6, 0x4f, 0x21, 0x65, 0x3b, 0x4a, 0x7f, - 0x47, 0xa3, 0xfb, 0x30, 0x82, 0x05, 0xd9, 0x30, 0x82, 0x03, 0xc1, - 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x5c, 0x0b, 0x85, 0x5c, - 0x0b, 0xe7, 0x59, 0x41, 0xdf, 0x57, 0xcc, 0x3f, 0x7f, 0x9d, 0xa8, - 0x36, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x64, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x63, 0x68, 0x31, 0x11, - 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x53, 0x77, - 0x69, 0x73, 0x73, 0x63, 0x6f, 0x6d, 0x31, 0x25, 0x30, 0x23, 0x06, - 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1c, 0x44, 0x69, 0x67, 0x69, 0x74, - 0x61, 0x6c, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, - 0x12, 0x53, 0x77, 0x69, 0x73, 0x73, 0x63, 0x6f, 0x6d, 0x20, 0x52, - 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x30, 0x1e, 0x17, - 0x0d, 0x30, 0x35, 0x30, 0x38, 0x31, 0x38, 0x31, 0x32, 0x30, 0x36, - 0x32, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x35, 0x30, 0x38, 0x31, 0x38, - 0x32, 0x32, 0x30, 0x36, 0x32, 0x30, 0x5a, 0x30, 0x64, 0x31, 0x0b, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x63, 0x68, - 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, - 0x53, 0x77, 0x69, 0x73, 0x73, 0x63, 0x6f, 0x6d, 0x31, 0x25, 0x30, - 0x23, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1c, 0x44, 0x69, 0x67, - 0x69, 0x74, 0x61, 0x6c, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x13, 0x12, 0x53, 0x77, 0x69, 0x73, 0x73, 0x63, 0x6f, 0x6d, - 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x30, - 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, - 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xd0, - 0xb9, 0xb0, 0xa8, 0x0c, 0xd9, 0xbb, 0x3f, 0x21, 0xf8, 0x1b, 0xd5, - 0x33, 0x93, 0x80, 0x16, 0x65, 0x20, 0x75, 0xb2, 0x3d, 0x9b, 0x60, - 0x6d, 0x46, 0xc8, 0x8c, 0x31, 0x6f, 0x17, 0xc3, 0xfa, 0x9a, 0x6c, - 0x56, 0xed, 0x3c, 0xc5, 0x91, 0x57, 0xc3, 0xcd, 0xab, 0x96, 0x49, - 0x90, 0x2a, 0x19, 0x4b, 0x1e, 0xa3, 0x6d, 0x57, 0xdd, 0xf1, 0x2b, - 0x62, 0x28, 0x75, 0x45, 0x5e, 0xaa, 0xd6, 0x5b, 0xfa, 0x0b, 0x25, - 0xd8, 0xa1, 0x16, 0xf9, 0x1c, 0xc4, 0x2e, 0xe6, 0x95, 0x2a, 0x67, - 0xcc, 0xd0, 0x29, 0x6e, 0x3c, 0x85, 0x34, 0x38, 0x61, 0x49, 0xb1, - 0x00, 0x9f, 0xd6, 0x3a, 0x71, 0x5f, 0x4d, 0x6d, 0xce, 0x5f, 0xb9, - 0xa9, 0xe4, 0x89, 0x7f, 0x6a, 0x52, 0xfa, 0xca, 0x9b, 0xf2, 0xdc, - 0xa9, 0xf9, 0x9d, 0x99, 0x47, 0x3f, 0x4e, 0x29, 0x5f, 0xb4, 0xa6, - 0x8d, 0x5d, 0x7b, 0x0b, 0x99, 0x11, 0x03, 0x03, 0xfe, 0xe7, 0xdb, - 0xdb, 0xa3, 0xff, 0x1d, 0xa5, 0xcd, 0x90, 0x1e, 0x01, 0x1f, 0x35, - 0xb0, 0x7f, 0x00, 0xdb, 0x90, 0x6f, 0xc6, 0x7e, 0x7b, 0xd1, 0xee, - 0x7a, 0x7a, 0xa7, 0xaa, 0x0c, 0x57, 0x6f, 0xa4, 0x6d, 0xc5, 0x13, - 0x3b, 0xb0, 0xa5, 0xd9, 0xed, 0x32, 0x1c, 0xb4, 0x5e, 0x67, 0x8b, - 0x54, 0xdc, 0x73, 0x87, 0xe5, 0xd3, 0x17, 0x7c, 0x66, 0x50, 0x72, - 0x5d, 0xd4, 0x1a, 0x58, 0xc1, 0xd9, 0xcf, 0xd8, 0x89, 0x02, 0x6f, - 0xa7, 0x49, 0xb4, 0x36, 0x5d, 0xd0, 0xa4, 0xde, 0x07, 0x2c, 0xb6, - 0x75, 0xb7, 0x28, 0x91, 0xd6, 0x97, 0xbe, 0x28, 0xf5, 0x98, 0x1e, - 0xea, 0x5b, 0x26, 0xc9, 0xbd, 0xb0, 0x97, 0x73, 0xda, 0xae, 0x91, - 0x26, 0xeb, 0x68, 0xc1, 0xf9, 0x39, 0x15, 0xd6, 0x67, 0x4b, 0x0a, - 0x6d, 0x4f, 0xcb, 0xcf, 0xb0, 0xe4, 0x42, 0x71, 0x8c, 0x53, 0x79, - 0xe7, 0xee, 0xe1, 0xdb, 0x1d, 0xa0, 0x6e, 0x1d, 0x8c, 0x1a, 0x77, - 0x35, 0x5c, 0x16, 0x1e, 0x2b, 0x53, 0x1f, 0x34, 0x8b, 0xd1, 0x6c, - 0xfc, 0xf2, 0x67, 0x07, 0x7a, 0xf5, 0xad, 0xed, 0xd6, 0x9a, 0xab, - 0xa1, 0xb1, 0x4b, 0xe1, 0xcc, 0x37, 0x5f, 0xfd, 0x7f, 0xcd, 0x4d, - 0xae, 0xb8, 0x1f, 0x9c, 0x43, 0xf9, 0x2a, 0x58, 0x55, 0x43, 0x45, - 0xbc, 0x96, 0xcd, 0x70, 0x0e, 0xfc, 0xc9, 0xe3, 0x66, 0xba, 0x4e, - 0x8d, 0x3b, 0x81, 0xcb, 0x15, 0x64, 0x7b, 0xb9, 0x94, 0xe8, 0x5d, - 0x33, 0x52, 0x85, 0x71, 0x2e, 0x4f, 0x8e, 0xa2, 0x06, 0x11, 0x51, - 0xc9, 0xe3, 0xcb, 0xa1, 0x6e, 0x31, 0x08, 0x64, 0x0c, 0xc2, 0xd2, - 0x3c, 0xf5, 0x36, 0xe8, 0xd7, 0xd0, 0x0e, 0x78, 0x23, 0x20, 0x91, - 0xc9, 0x24, 0x2a, 0x65, 0x29, 0x5b, 0x22, 0xf7, 0x21, 0xce, 0x83, - 0x5e, 0xa4, 0xf3, 0xde, 0x4b, 0xd3, 0x68, 0x8f, 0x46, 0x75, 0x5c, - 0x83, 0x09, 0x6e, 0x29, 0x6b, 0xc4, 0x70, 0x8c, 0xf5, 0x9d, 0xd7, - 0x20, 0x2f, 0xff, 0x46, 0xd2, 0x2b, 0x38, 0xc2, 0x2f, 0x75, 0x1c, - 0x3d, 0x7e, 0xda, 0xa5, 0xef, 0x1e, 0x60, 0x85, 0x69, 0x42, 0xd3, - 0xcc, 0xf8, 0x63, 0xfe, 0x1e, 0x43, 0x39, 0x85, 0xa6, 0xb6, 0x63, - 0x41, 0x10, 0xb3, 0x73, 0x1e, 0xbc, 0xd3, 0xfa, 0xca, 0x7d, 0x16, - 0x47, 0xe2, 0xa7, 0xd5, 0xd0, 0xa3, 0x8a, 0x0a, 0x08, 0x96, 0x62, - 0x56, 0x6e, 0x34, 0xdb, 0xd9, 0x02, 0xb9, 0x30, 0x75, 0xe3, 0x04, - 0xd2, 0xe7, 0x8f, 0xc2, 0xb0, 0x11, 0x40, 0x0a, 0xac, 0xd5, 0x71, - 0x02, 0x62, 0x8b, 0x31, 0xbe, 0xdd, 0xc6, 0x23, 0x58, 0x31, 0x42, - 0x43, 0x2d, 0x74, 0xf9, 0xc6, 0x9e, 0xa6, 0x8a, 0x0f, 0xe9, 0xfe, - 0xbf, 0x83, 0xe6, 0x43, 0x57, 0x24, 0xba, 0xef, 0x46, 0x34, 0xaa, - 0xd7, 0x12, 0x01, 0x38, 0xed, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, - 0x81, 0x86, 0x30, 0x81, 0x83, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, - 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, - 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x21, 0x04, 0x16, 0x30, 0x14, 0x30, - 0x12, 0x06, 0x07, 0x60, 0x85, 0x74, 0x01, 0x53, 0x00, 0x01, 0x06, - 0x07, 0x60, 0x85, 0x74, 0x01, 0x53, 0x00, 0x01, 0x30, 0x12, 0x06, - 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, - 0x01, 0x01, 0xff, 0x02, 0x01, 0x07, 0x30, 0x1f, 0x06, 0x03, 0x55, - 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x03, 0x25, 0x2f, - 0xde, 0x6f, 0x82, 0x01, 0x3a, 0x5c, 0x2c, 0xdc, 0x2b, 0xa1, 0x69, - 0xb5, 0x67, 0xd4, 0x8c, 0xd3, 0xfd, 0x30, 0x1d, 0x06, 0x03, 0x55, - 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x03, 0x25, 0x2f, 0xde, 0x6f, - 0x82, 0x01, 0x3a, 0x5c, 0x2c, 0xdc, 0x2b, 0xa1, 0x69, 0xb5, 0x67, - 0xd4, 0x8c, 0xd3, 0xfd, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, - 0x01, 0x00, 0x35, 0x10, 0xcb, 0xec, 0xa6, 0x04, 0x0d, 0x0d, 0x0f, - 0xcd, 0xc0, 0xdb, 0xab, 0xa8, 0xf2, 0x88, 0x97, 0x0c, 0xdf, 0x93, - 0x2f, 0x4d, 0x7c, 0x40, 0x56, 0x31, 0x7a, 0xeb, 0xa4, 0x0f, 0x60, - 0xcd, 0x7a, 0xf3, 0xbe, 0xc3, 0x27, 0x8e, 0x03, 0x3e, 0xa4, 0xdd, - 0x12, 0xef, 0x7e, 0x1e, 0x74, 0x06, 0x3c, 0x3f, 0x31, 0xf2, 0x1c, - 0x7b, 0x91, 0x31, 0x21, 0xb4, 0xf0, 0xd0, 0x6c, 0x97, 0xd4, 0xe9, - 0x97, 0xb2, 0x24, 0x56, 0x1e, 0x56, 0xc3, 0x35, 0xbd, 0x88, 0x05, - 0x0f, 0x5b, 0x10, 0x1a, 0x64, 0xe1, 0xc7, 0x82, 0x30, 0xf9, 0x32, - 0xad, 0x9e, 0x50, 0x2c, 0xe7, 0x78, 0x05, 0xd0, 0x31, 0xb1, 0x5a, - 0x98, 0x8a, 0x75, 0x4e, 0x90, 0x5c, 0x6a, 0x14, 0x2a, 0xe0, 0x52, - 0x47, 0x82, 0x60, 0xe6, 0x1e, 0xda, 0x81, 0xb1, 0xfb, 0x14, 0x0b, - 0x5a, 0xf1, 0x9f, 0xd2, 0x95, 0xba, 0x3e, 0xd0, 0x1b, 0xd6, 0x15, - 0x1d, 0xa3, 0xbe, 0x86, 0xd5, 0xdb, 0x0f, 0xc0, 0x49, 0x64, 0xbb, - 0x2e, 0x50, 0x19, 0x4b, 0xd2, 0x24, 0xf8, 0xdd, 0x1e, 0x07, 0x56, - 0xd0, 0x38, 0xa0, 0x95, 0x70, 0x20, 0x76, 0x8c, 0xd7, 0xdd, 0x1e, - 0xde, 0x9f, 0x71, 0xc4, 0x23, 0xef, 0x83, 0x13, 0x5c, 0xa3, 0x24, - 0x15, 0x4d, 0x29, 0x40, 0x3c, 0x6a, 0xc4, 0xa9, 0xd8, 0xb7, 0xa6, - 0x44, 0xa5, 0x0d, 0xf4, 0xe0, 0x9d, 0x77, 0x1e, 0x40, 0x70, 0x26, - 0xfc, 0xda, 0xd9, 0x36, 0xe4, 0x79, 0xe4, 0xb5, 0x3f, 0xbc, 0x9b, - 0x65, 0xbe, 0xbb, 0x11, 0x96, 0xcf, 0xdb, 0xc6, 0x28, 0x39, 0x3a, - 0x08, 0xce, 0x47, 0x5b, 0x53, 0x5a, 0xc5, 0x99, 0xfe, 0x5d, 0xa9, - 0xdd, 0xef, 0x4c, 0xd4, 0xc6, 0xa5, 0xad, 0x02, 0xe6, 0x8c, 0x07, - 0x12, 0x1e, 0x6f, 0x03, 0xd1, 0x6f, 0xa0, 0xa3, 0xf3, 0x29, 0xbd, - 0x12, 0xc7, 0x50, 0xa2, 0xb0, 0x7f, 0x88, 0xa9, 0x99, 0x77, 0x9a, - 0xb1, 0xc0, 0xa5, 0x39, 0x2e, 0x5c, 0x7c, 0x69, 0xe2, 0x2c, 0xb0, - 0xea, 0x37, 0x6a, 0xa4, 0xe1, 0x5a, 0xe1, 0xf5, 0x50, 0xe5, 0x83, - 0xef, 0xa5, 0xbb, 0x2a, 0x88, 0xe7, 0x8c, 0xdb, 0xfd, 0x6d, 0x5e, - 0x97, 0x19, 0xa8, 0x7e, 0x66, 0x75, 0x6b, 0x71, 0xea, 0xbf, 0xb1, - 0xc7, 0x6f, 0xa0, 0xf4, 0x8e, 0xa4, 0xec, 0x34, 0x51, 0x5b, 0x8c, - 0x26, 0x03, 0x70, 0xa1, 0x77, 0xd5, 0x01, 0x12, 0x57, 0x00, 0x35, - 0xdb, 0x23, 0xde, 0x0e, 0x8a, 0x28, 0x99, 0xfd, 0xb1, 0x10, 0x6f, - 0x4b, 0xff, 0x38, 0x2d, 0x60, 0x4e, 0x2c, 0x9c, 0xeb, 0x67, 0xb5, - 0xad, 0x49, 0xee, 0x4b, 0x1f, 0xac, 0xaf, 0xfb, 0x0d, 0x90, 0x5a, - 0x66, 0x60, 0x70, 0x5d, 0xaa, 0xcd, 0x78, 0xd4, 0x24, 0xee, 0xc8, - 0x41, 0xa0, 0x93, 0x01, 0x92, 0x9c, 0x6a, 0x9e, 0xfc, 0xb9, 0x24, - 0xc5, 0xb3, 0x15, 0x82, 0x7e, 0xbe, 0xae, 0x95, 0x2b, 0xeb, 0xb1, - 0xc0, 0xda, 0xe3, 0x01, 0x60, 0x0b, 0x5e, 0x69, 0xac, 0x84, 0x56, - 0x61, 0xbe, 0x71, 0x17, 0xfe, 0x1d, 0x13, 0x0f, 0xfe, 0xc6, 0x87, - 0x45, 0xe9, 0xfe, 0x32, 0xa0, 0x1a, 0x0d, 0x13, 0xa4, 0x94, 0x55, - 0x71, 0xa5, 0x16, 0x8b, 0xba, 0xca, 0x89, 0xb0, 0xb2, 0xc7, 0xfc, - 0x8f, 0xd8, 0x54, 0xb5, 0x93, 0x62, 0x9d, 0xce, 0xcf, 0x59, 0xfb, - 0x3d, 0x18, 0xce, 0x2a, 0xcb, 0x35, 0x15, 0x82, 0x5d, 0xff, 0x54, - 0x22, 0x5b, 0x71, 0x52, 0xfb, 0xb7, 0xc9, 0xfe, 0x60, 0x9b, 0x00, - 0x41, 0x64, 0xf0, 0xaa, 0x2a, 0xec, 0xb6, 0x42, 0x43, 0xce, 0x89, - 0x66, 0x81, 0xc8, 0x8b, 0x9f, 0x39, 0x54, 0x03, 0x25, 0xd3, 0x16, - 0x35, 0x8e, 0x84, 0xd0, 0x5f, 0xfa, 0x30, 0x1a, 0xf5, 0x9a, 0x6c, - 0xf4, 0x0e, 0x53, 0xf9, 0x3a, 0x5b, 0xd1, 0x1c, 0x30, 0x82, 0x03, - 0xb7, 0x30, 0x82, 0x02, 0x9f, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, - 0x10, 0x0c, 0xe7, 0xe0, 0xe5, 0x17, 0xd8, 0x46, 0xfe, 0x8f, 0xe5, - 0x60, 0xfc, 0x1b, 0xf0, 0x30, 0x39, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, - 0x65, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, - 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, - 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, - 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, - 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x24, - 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1b, 0x44, 0x69, - 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x41, 0x73, 0x73, 0x75, - 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52, 0x6f, 0x6f, 0x74, - 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x31, - 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, - 0x33, 0x31, 0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x5a, 0x30, 0x65, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, - 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, - 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, - 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, - 0x6d, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, - 0x1b, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x41, - 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52, - 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, + 0x82, 0x05, 0xd9, 0x30, 0x82, 0x03, 0xc1, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x10, 0x5c, 0x0b, 0x85, 0x5c, 0x0b, 0xe7, 0x59, 0x41, + 0xdf, 0x57, 0xcc, 0x3f, 0x7f, 0x9d, 0xa8, 0x36, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x30, 0x64, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x63, 0x68, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, + 0x55, 0x04, 0x0a, 0x13, 0x08, 0x53, 0x77, 0x69, 0x73, 0x73, 0x63, + 0x6f, 0x6d, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0b, + 0x13, 0x1c, 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x31, 0x1b, 0x30, + 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x53, 0x77, 0x69, + 0x73, 0x73, 0x63, 0x6f, 0x6d, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, + 0x43, 0x41, 0x20, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x35, 0x30, + 0x38, 0x31, 0x38, 0x31, 0x32, 0x30, 0x36, 0x32, 0x30, 0x5a, 0x17, + 0x0d, 0x32, 0x35, 0x30, 0x38, 0x31, 0x38, 0x32, 0x32, 0x30, 0x36, + 0x32, 0x30, 0x5a, 0x30, 0x64, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x63, 0x68, 0x31, 0x11, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x53, 0x77, 0x69, 0x73, + 0x73, 0x63, 0x6f, 0x6d, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, + 0x04, 0x0b, 0x13, 0x1c, 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, + 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x31, + 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x53, + 0x77, 0x69, 0x73, 0x73, 0x63, 0x6f, 0x6d, 0x20, 0x52, 0x6f, 0x6f, + 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, - 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xad, 0x0e, 0x15, 0xce, 0xe4, - 0x43, 0x80, 0x5c, 0xb1, 0x87, 0xf3, 0xb7, 0x60, 0xf9, 0x71, 0x12, - 0xa5, 0xae, 0xdc, 0x26, 0x94, 0x88, 0xaa, 0xf4, 0xce, 0xf5, 0x20, - 0x39, 0x28, 0x58, 0x60, 0x0c, 0xf8, 0x80, 0xda, 0xa9, 0x15, 0x95, - 0x32, 0x61, 0x3c, 0xb5, 0xb1, 0x28, 0x84, 0x8a, 0x8a, 0xdc, 0x9f, - 0x0a, 0x0c, 0x83, 0x17, 0x7a, 0x8f, 0x90, 0xac, 0x8a, 0xe7, 0x79, - 0x53, 0x5c, 0x31, 0x84, 0x2a, 0xf6, 0x0f, 0x98, 0x32, 0x36, 0x76, - 0xcc, 0xde, 0xdd, 0x3c, 0xa8, 0xa2, 0xef, 0x6a, 0xfb, 0x21, 0xf2, - 0x52, 0x61, 0xdf, 0x9f, 0x20, 0xd7, 0x1f, 0xe2, 0xb1, 0xd9, 0xfe, - 0x18, 0x64, 0xd2, 0x12, 0x5b, 0x5f, 0xf9, 0x58, 0x18, 0x35, 0xbc, - 0x47, 0xcd, 0xa1, 0x36, 0xf9, 0x6b, 0x7f, 0xd4, 0xb0, 0x38, 0x3e, - 0xc1, 0x1b, 0xc3, 0x8c, 0x33, 0xd9, 0xd8, 0x2f, 0x18, 0xfe, 0x28, - 0x0f, 0xb3, 0xa7, 0x83, 0xd6, 0xc3, 0x6e, 0x44, 0xc0, 0x61, 0x35, - 0x96, 0x16, 0xfe, 0x59, 0x9c, 0x8b, 0x76, 0x6d, 0xd7, 0xf1, 0xa2, - 0x4b, 0x0d, 0x2b, 0xff, 0x0b, 0x72, 0xda, 0x9e, 0x60, 0xd0, 0x8e, - 0x90, 0x35, 0xc6, 0x78, 0x55, 0x87, 0x20, 0xa1, 0xcf, 0xe5, 0x6d, - 0x0a, 0xc8, 0x49, 0x7c, 0x31, 0x98, 0x33, 0x6c, 0x22, 0xe9, 0x87, - 0xd0, 0x32, 0x5a, 0xa2, 0xba, 0x13, 0x82, 0x11, 0xed, 0x39, 0x17, - 0x9d, 0x99, 0x3a, 0x72, 0xa1, 0xe6, 0xfa, 0xa4, 0xd9, 0xd5, 0x17, - 0x31, 0x75, 0xae, 0x85, 0x7d, 0x22, 0xae, 0x3f, 0x01, 0x46, 0x86, - 0xf6, 0x28, 0x79, 0xc8, 0xb1, 0xda, 0xe4, 0x57, 0x17, 0xc4, 0x7e, - 0x1c, 0x0e, 0xb0, 0xb4, 0x92, 0xa6, 0x56, 0xb3, 0xbd, 0xb2, 0x97, - 0xed, 0xaa, 0xa7, 0xf0, 0xb7, 0xc5, 0xa8, 0x3f, 0x95, 0x16, 0xd0, - 0xff, 0xa1, 0x96, 0xeb, 0x08, 0x5f, 0x18, 0x77, 0x4f, 0x02, 0x03, - 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0e, 0x06, 0x03, - 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, - 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, - 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, - 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x45, 0xeb, 0xa2, 0xaf, - 0xf4, 0x92, 0xcb, 0x82, 0x31, 0x2d, 0x51, 0x8b, 0xa7, 0xa7, 0x21, - 0x9d, 0xf3, 0x6d, 0xc8, 0x0f, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, - 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x45, 0xeb, 0xa2, 0xaf, - 0xf4, 0x92, 0xcb, 0x82, 0x31, 0x2d, 0x51, 0x8b, 0xa7, 0xa7, 0x21, - 0x9d, 0xf3, 0x6d, 0xc8, 0x0f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, - 0x01, 0x01, 0x00, 0xa2, 0x0e, 0xbc, 0xdf, 0xe2, 0xed, 0xf0, 0xe3, - 0x72, 0x73, 0x7a, 0x64, 0x94, 0xbf, 0xf7, 0x72, 0x66, 0xd8, 0x32, - 0xe4, 0x42, 0x75, 0x62, 0xae, 0x87, 0xeb, 0xf2, 0xd5, 0xd9, 0xde, - 0x56, 0xb3, 0x9f, 0xcc, 0xce, 0x14, 0x28, 0xb9, 0x0d, 0x97, 0x60, - 0x5c, 0x12, 0x4c, 0x58, 0xe4, 0xd3, 0x3d, 0x83, 0x49, 0x45, 0x58, - 0x97, 0x35, 0x69, 0x1a, 0xa8, 0x47, 0xea, 0x56, 0xc6, 0x79, 0xab, - 0x12, 0xd8, 0x67, 0x81, 0x84, 0xdf, 0x7f, 0x09, 0x3c, 0x94, 0xe6, - 0xb8, 0x26, 0x2c, 0x20, 0xbd, 0x3d, 0xb3, 0x28, 0x89, 0xf7, 0x5f, - 0xff, 0x22, 0xe2, 0x97, 0x84, 0x1f, 0xe9, 0x65, 0xef, 0x87, 0xe0, - 0xdf, 0xc1, 0x67, 0x49, 0xb3, 0x5d, 0xeb, 0xb2, 0x09, 0x2a, 0xeb, - 0x26, 0xed, 0x78, 0xbe, 0x7d, 0x3f, 0x2b, 0xf3, 0xb7, 0x26, 0x35, - 0x6d, 0x5f, 0x89, 0x01, 0xb6, 0x49, 0x5b, 0x9f, 0x01, 0x05, 0x9b, - 0xab, 0x3d, 0x25, 0xc1, 0xcc, 0xb6, 0x7f, 0xc2, 0xf1, 0x6f, 0x86, - 0xc6, 0xfa, 0x64, 0x68, 0xeb, 0x81, 0x2d, 0x94, 0xeb, 0x42, 0xb7, - 0xfa, 0x8c, 0x1e, 0xdd, 0x62, 0xf1, 0xbe, 0x50, 0x67, 0xb7, 0x6c, - 0xbd, 0xf3, 0xf1, 0x1f, 0x6b, 0x0c, 0x36, 0x07, 0x16, 0x7f, 0x37, - 0x7c, 0xa9, 0x5b, 0x6d, 0x7a, 0xf1, 0x12, 0x46, 0x60, 0x83, 0xd7, - 0x27, 0x04, 0xbe, 0x4b, 0xce, 0x97, 0xbe, 0xc3, 0x67, 0x2a, 0x68, - 0x11, 0xdf, 0x80, 0xe7, 0x0c, 0x33, 0x66, 0xbf, 0x13, 0x0d, 0x14, - 0x6e, 0xf3, 0x7f, 0x1f, 0x63, 0x10, 0x1e, 0xfa, 0x8d, 0x1b, 0x25, - 0x6d, 0x6c, 0x8f, 0xa5, 0xb7, 0x61, 0x01, 0xb1, 0xd2, 0xa3, 0x26, - 0xa1, 0x10, 0x71, 0x9d, 0xad, 0xe2, 0xc3, 0xf9, 0xc3, 0x99, 0x51, - 0xb7, 0x2b, 0x07, 0x08, 0xce, 0x2e, 0xe6, 0x50, 0xb2, 0xa7, 0xfa, - 0x0a, 0x45, 0x2f, 0xa2, 0xf0, 0xf2, 0x30, 0x82, 0x03, 0xaf, 0x30, - 0x82, 0x02, 0x97, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x08, - 0x3b, 0xe0, 0x56, 0x90, 0x42, 0x46, 0xb1, 0xa1, 0x75, 0x6a, 0xc9, - 0x59, 0x91, 0xc7, 0x4a, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x61, 0x31, - 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, - 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, - 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, - 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, - 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, - 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x20, 0x30, 0x1e, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x44, 0x69, 0x67, 0x69, - 0x43, 0x65, 0x72, 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, - 0x0d, 0x30, 0x36, 0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x31, 0x31, 0x31, 0x31, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x61, 0x31, 0x0b, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, - 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, - 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, - 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, - 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, - 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x20, 0x30, 0x1e, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x44, 0x69, 0x67, 0x69, 0x43, - 0x65, 0x72, 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, - 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, + 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, + 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xd0, 0xb9, 0xb0, 0xa8, 0x0c, + 0xd9, 0xbb, 0x3f, 0x21, 0xf8, 0x1b, 0xd5, 0x33, 0x93, 0x80, 0x16, + 0x65, 0x20, 0x75, 0xb2, 0x3d, 0x9b, 0x60, 0x6d, 0x46, 0xc8, 0x8c, + 0x31, 0x6f, 0x17, 0xc3, 0xfa, 0x9a, 0x6c, 0x56, 0xed, 0x3c, 0xc5, + 0x91, 0x57, 0xc3, 0xcd, 0xab, 0x96, 0x49, 0x90, 0x2a, 0x19, 0x4b, + 0x1e, 0xa3, 0x6d, 0x57, 0xdd, 0xf1, 0x2b, 0x62, 0x28, 0x75, 0x45, + 0x5e, 0xaa, 0xd6, 0x5b, 0xfa, 0x0b, 0x25, 0xd8, 0xa1, 0x16, 0xf9, + 0x1c, 0xc4, 0x2e, 0xe6, 0x95, 0x2a, 0x67, 0xcc, 0xd0, 0x29, 0x6e, + 0x3c, 0x85, 0x34, 0x38, 0x61, 0x49, 0xb1, 0x00, 0x9f, 0xd6, 0x3a, + 0x71, 0x5f, 0x4d, 0x6d, 0xce, 0x5f, 0xb9, 0xa9, 0xe4, 0x89, 0x7f, + 0x6a, 0x52, 0xfa, 0xca, 0x9b, 0xf2, 0xdc, 0xa9, 0xf9, 0x9d, 0x99, + 0x47, 0x3f, 0x4e, 0x29, 0x5f, 0xb4, 0xa6, 0x8d, 0x5d, 0x7b, 0x0b, + 0x99, 0x11, 0x03, 0x03, 0xfe, 0xe7, 0xdb, 0xdb, 0xa3, 0xff, 0x1d, + 0xa5, 0xcd, 0x90, 0x1e, 0x01, 0x1f, 0x35, 0xb0, 0x7f, 0x00, 0xdb, + 0x90, 0x6f, 0xc6, 0x7e, 0x7b, 0xd1, 0xee, 0x7a, 0x7a, 0xa7, 0xaa, + 0x0c, 0x57, 0x6f, 0xa4, 0x6d, 0xc5, 0x13, 0x3b, 0xb0, 0xa5, 0xd9, + 0xed, 0x32, 0x1c, 0xb4, 0x5e, 0x67, 0x8b, 0x54, 0xdc, 0x73, 0x87, + 0xe5, 0xd3, 0x17, 0x7c, 0x66, 0x50, 0x72, 0x5d, 0xd4, 0x1a, 0x58, + 0xc1, 0xd9, 0xcf, 0xd8, 0x89, 0x02, 0x6f, 0xa7, 0x49, 0xb4, 0x36, + 0x5d, 0xd0, 0xa4, 0xde, 0x07, 0x2c, 0xb6, 0x75, 0xb7, 0x28, 0x91, + 0xd6, 0x97, 0xbe, 0x28, 0xf5, 0x98, 0x1e, 0xea, 0x5b, 0x26, 0xc9, + 0xbd, 0xb0, 0x97, 0x73, 0xda, 0xae, 0x91, 0x26, 0xeb, 0x68, 0xc1, + 0xf9, 0x39, 0x15, 0xd6, 0x67, 0x4b, 0x0a, 0x6d, 0x4f, 0xcb, 0xcf, + 0xb0, 0xe4, 0x42, 0x71, 0x8c, 0x53, 0x79, 0xe7, 0xee, 0xe1, 0xdb, + 0x1d, 0xa0, 0x6e, 0x1d, 0x8c, 0x1a, 0x77, 0x35, 0x5c, 0x16, 0x1e, + 0x2b, 0x53, 0x1f, 0x34, 0x8b, 0xd1, 0x6c, 0xfc, 0xf2, 0x67, 0x07, + 0x7a, 0xf5, 0xad, 0xed, 0xd6, 0x9a, 0xab, 0xa1, 0xb1, 0x4b, 0xe1, + 0xcc, 0x37, 0x5f, 0xfd, 0x7f, 0xcd, 0x4d, 0xae, 0xb8, 0x1f, 0x9c, + 0x43, 0xf9, 0x2a, 0x58, 0x55, 0x43, 0x45, 0xbc, 0x96, 0xcd, 0x70, + 0x0e, 0xfc, 0xc9, 0xe3, 0x66, 0xba, 0x4e, 0x8d, 0x3b, 0x81, 0xcb, + 0x15, 0x64, 0x7b, 0xb9, 0x94, 0xe8, 0x5d, 0x33, 0x52, 0x85, 0x71, + 0x2e, 0x4f, 0x8e, 0xa2, 0x06, 0x11, 0x51, 0xc9, 0xe3, 0xcb, 0xa1, + 0x6e, 0x31, 0x08, 0x64, 0x0c, 0xc2, 0xd2, 0x3c, 0xf5, 0x36, 0xe8, + 0xd7, 0xd0, 0x0e, 0x78, 0x23, 0x20, 0x91, 0xc9, 0x24, 0x2a, 0x65, + 0x29, 0x5b, 0x22, 0xf7, 0x21, 0xce, 0x83, 0x5e, 0xa4, 0xf3, 0xde, + 0x4b, 0xd3, 0x68, 0x8f, 0x46, 0x75, 0x5c, 0x83, 0x09, 0x6e, 0x29, + 0x6b, 0xc4, 0x70, 0x8c, 0xf5, 0x9d, 0xd7, 0x20, 0x2f, 0xff, 0x46, + 0xd2, 0x2b, 0x38, 0xc2, 0x2f, 0x75, 0x1c, 0x3d, 0x7e, 0xda, 0xa5, + 0xef, 0x1e, 0x60, 0x85, 0x69, 0x42, 0xd3, 0xcc, 0xf8, 0x63, 0xfe, + 0x1e, 0x43, 0x39, 0x85, 0xa6, 0xb6, 0x63, 0x41, 0x10, 0xb3, 0x73, + 0x1e, 0xbc, 0xd3, 0xfa, 0xca, 0x7d, 0x16, 0x47, 0xe2, 0xa7, 0xd5, + 0xd0, 0xa3, 0x8a, 0x0a, 0x08, 0x96, 0x62, 0x56, 0x6e, 0x34, 0xdb, + 0xd9, 0x02, 0xb9, 0x30, 0x75, 0xe3, 0x04, 0xd2, 0xe7, 0x8f, 0xc2, + 0xb0, 0x11, 0x40, 0x0a, 0xac, 0xd5, 0x71, 0x02, 0x62, 0x8b, 0x31, + 0xbe, 0xdd, 0xc6, 0x23, 0x58, 0x31, 0x42, 0x43, 0x2d, 0x74, 0xf9, + 0xc6, 0x9e, 0xa6, 0x8a, 0x0f, 0xe9, 0xfe, 0xbf, 0x83, 0xe6, 0x43, + 0x57, 0x24, 0xba, 0xef, 0x46, 0x34, 0xaa, 0xd7, 0x12, 0x01, 0x38, + 0xed, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x86, 0x30, 0x81, + 0x83, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, + 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x1d, 0x06, 0x03, 0x55, + 0x1d, 0x21, 0x04, 0x16, 0x30, 0x14, 0x30, 0x12, 0x06, 0x07, 0x60, + 0x85, 0x74, 0x01, 0x53, 0x00, 0x01, 0x06, 0x07, 0x60, 0x85, 0x74, + 0x01, 0x53, 0x00, 0x01, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, + 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, + 0x01, 0x07, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, + 0x30, 0x16, 0x80, 0x14, 0x03, 0x25, 0x2f, 0xde, 0x6f, 0x82, 0x01, + 0x3a, 0x5c, 0x2c, 0xdc, 0x2b, 0xa1, 0x69, 0xb5, 0x67, 0xd4, 0x8c, + 0xd3, 0xfd, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, + 0x04, 0x14, 0x03, 0x25, 0x2f, 0xde, 0x6f, 0x82, 0x01, 0x3a, 0x5c, + 0x2c, 0xdc, 0x2b, 0xa1, 0x69, 0xb5, 0x67, 0xd4, 0x8c, 0xd3, 0xfd, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, - 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xe2, 0x3b, 0xe1, 0x11, - 0x72, 0xde, 0xa8, 0xa4, 0xd3, 0xa3, 0x57, 0xaa, 0x50, 0xa2, 0x8f, - 0x0b, 0x77, 0x90, 0xc9, 0xa2, 0xa5, 0xee, 0x12, 0xce, 0x96, 0x5b, - 0x01, 0x09, 0x20, 0xcc, 0x01, 0x93, 0xa7, 0x4e, 0x30, 0xb7, 0x53, - 0xf7, 0x43, 0xc4, 0x69, 0x00, 0x57, 0x9d, 0xe2, 0x8d, 0x22, 0xdd, - 0x87, 0x06, 0x40, 0x00, 0x81, 0x09, 0xce, 0xce, 0x1b, 0x83, 0xbf, - 0xdf, 0xcd, 0x3b, 0x71, 0x46, 0xe2, 0xd6, 0x66, 0xc7, 0x05, 0xb3, - 0x76, 0x27, 0x16, 0x8f, 0x7b, 0x9e, 0x1e, 0x95, 0x7d, 0xee, 0xb7, - 0x48, 0xa3, 0x08, 0xda, 0xd6, 0xaf, 0x7a, 0x0c, 0x39, 0x06, 0x65, - 0x7f, 0x4a, 0x5d, 0x1f, 0xbc, 0x17, 0xf8, 0xab, 0xbe, 0xee, 0x28, - 0xd7, 0x74, 0x7f, 0x7a, 0x78, 0x99, 0x59, 0x85, 0x68, 0x6e, 0x5c, - 0x23, 0x32, 0x4b, 0xbf, 0x4e, 0xc0, 0xe8, 0x5a, 0x6d, 0xe3, 0x70, - 0xbf, 0x77, 0x10, 0xbf, 0xfc, 0x01, 0xf6, 0x85, 0xd9, 0xa8, 0x44, - 0x10, 0x58, 0x32, 0xa9, 0x75, 0x18, 0xd5, 0xd1, 0xa2, 0xbe, 0x47, - 0xe2, 0x27, 0x6a, 0xf4, 0x9a, 0x33, 0xf8, 0x49, 0x08, 0x60, 0x8b, - 0xd4, 0x5f, 0xb4, 0x3a, 0x84, 0xbf, 0xa1, 0xaa, 0x4a, 0x4c, 0x7d, - 0x3e, 0xcf, 0x4f, 0x5f, 0x6c, 0x76, 0x5e, 0xa0, 0x4b, 0x37, 0x91, - 0x9e, 0xdc, 0x22, 0xe6, 0x6d, 0xce, 0x14, 0x1a, 0x8e, 0x6a, 0xcb, - 0xfe, 0xcd, 0xb3, 0x14, 0x64, 0x17, 0xc7, 0x5b, 0x29, 0x9e, 0x32, - 0xbf, 0xf2, 0xee, 0xfa, 0xd3, 0x0b, 0x42, 0xd4, 0xab, 0xb7, 0x41, - 0x32, 0xda, 0x0c, 0xd4, 0xef, 0xf8, 0x81, 0xd5, 0xbb, 0x8d, 0x58, - 0x3f, 0xb5, 0x1b, 0xe8, 0x49, 0x28, 0xa2, 0x70, 0xda, 0x31, 0x04, - 0xdd, 0xf7, 0xb2, 0x16, 0xf2, 0x4c, 0x0a, 0x4e, 0x07, 0xa8, 0xed, - 0x4a, 0x3d, 0x5e, 0xb5, 0x7f, 0xa3, 0x90, 0xc3, 0xaf, 0x27, 0x02, - 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0e, 0x06, - 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, - 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, - 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, - 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x03, 0xde, 0x50, - 0x35, 0x56, 0xd1, 0x4c, 0xbb, 0x66, 0xf0, 0xa3, 0xe2, 0x1b, 0x1b, - 0xc3, 0x97, 0xb2, 0x3d, 0xd1, 0x55, 0x30, 0x1f, 0x06, 0x03, 0x55, - 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x03, 0xde, 0x50, - 0x35, 0x56, 0xd1, 0x4c, 0xbb, 0x66, 0xf0, 0xa3, 0xe2, 0x1b, 0x1b, - 0xc3, 0x97, 0xb2, 0x3d, 0xd1, 0x55, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, - 0x82, 0x01, 0x01, 0x00, 0xcb, 0x9c, 0x37, 0xaa, 0x48, 0x13, 0x12, - 0x0a, 0xfa, 0xdd, 0x44, 0x9c, 0x4f, 0x52, 0xb0, 0xf4, 0xdf, 0xae, - 0x04, 0xf5, 0x79, 0x79, 0x08, 0xa3, 0x24, 0x18, 0xfc, 0x4b, 0x2b, - 0x84, 0xc0, 0x2d, 0xb9, 0xd5, 0xc7, 0xfe, 0xf4, 0xc1, 0x1f, 0x58, - 0xcb, 0xb8, 0x6d, 0x9c, 0x7a, 0x74, 0xe7, 0x98, 0x29, 0xab, 0x11, - 0xb5, 0xe3, 0x70, 0xa0, 0xa1, 0xcd, 0x4c, 0x88, 0x99, 0x93, 0x8c, - 0x91, 0x70, 0xe2, 0xab, 0x0f, 0x1c, 0xbe, 0x93, 0xa9, 0xff, 0x63, - 0xd5, 0xe4, 0x07, 0x60, 0xd3, 0xa3, 0xbf, 0x9d, 0x5b, 0x09, 0xf1, - 0xd5, 0x8e, 0xe3, 0x53, 0xf4, 0x8e, 0x63, 0xfa, 0x3f, 0xa7, 0xdb, - 0xb4, 0x66, 0xdf, 0x62, 0x66, 0xd6, 0xd1, 0x6e, 0x41, 0x8d, 0xf2, - 0x2d, 0xb5, 0xea, 0x77, 0x4a, 0x9f, 0x9d, 0x58, 0xe2, 0x2b, 0x59, - 0xc0, 0x40, 0x23, 0xed, 0x2d, 0x28, 0x82, 0x45, 0x3e, 0x79, 0x54, - 0x92, 0x26, 0x98, 0xe0, 0x80, 0x48, 0xa8, 0x37, 0xef, 0xf0, 0xd6, - 0x79, 0x60, 0x16, 0xde, 0xac, 0xe8, 0x0e, 0xcd, 0x6e, 0xac, 0x44, - 0x17, 0x38, 0x2f, 0x49, 0xda, 0xe1, 0x45, 0x3e, 0x2a, 0xb9, 0x36, - 0x53, 0xcf, 0x3a, 0x50, 0x06, 0xf7, 0x2e, 0xe8, 0xc4, 0x57, 0x49, - 0x6c, 0x61, 0x21, 0x18, 0xd5, 0x04, 0xad, 0x78, 0x3c, 0x2c, 0x3a, - 0x80, 0x6b, 0xa7, 0xeb, 0xaf, 0x15, 0x14, 0xe9, 0xd8, 0x89, 0xc1, - 0xb9, 0x38, 0x6c, 0xe2, 0x91, 0x6c, 0x8a, 0xff, 0x64, 0xb9, 0x77, - 0x25, 0x57, 0x30, 0xc0, 0x1b, 0x24, 0xa3, 0xe1, 0xdc, 0xe9, 0xdf, - 0x47, 0x7c, 0xb5, 0xb4, 0x24, 0x08, 0x05, 0x30, 0xec, 0x2d, 0xbd, - 0x0b, 0xbf, 0x45, 0xbf, 0x50, 0xb9, 0xa9, 0xf3, 0xeb, 0x98, 0x01, - 0x12, 0xad, 0xc8, 0x88, 0xc6, 0x98, 0x34, 0x5f, 0x8d, 0x0a, 0x3c, - 0xc6, 0xe9, 0xd5, 0x95, 0x95, 0x6d, 0xde, 0x30, 0x82, 0x03, 0xc5, - 0x30, 0x82, 0x02, 0xad, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, - 0x02, 0xac, 0x5c, 0x26, 0x6a, 0x0b, 0x40, 0x9b, 0x8f, 0x0b, 0x79, - 0xf2, 0xae, 0x46, 0x25, 0x77, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x6c, + 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x35, 0x10, + 0xcb, 0xec, 0xa6, 0x04, 0x0d, 0x0d, 0x0f, 0xcd, 0xc0, 0xdb, 0xab, + 0xa8, 0xf2, 0x88, 0x97, 0x0c, 0xdf, 0x93, 0x2f, 0x4d, 0x7c, 0x40, + 0x56, 0x31, 0x7a, 0xeb, 0xa4, 0x0f, 0x60, 0xcd, 0x7a, 0xf3, 0xbe, + 0xc3, 0x27, 0x8e, 0x03, 0x3e, 0xa4, 0xdd, 0x12, 0xef, 0x7e, 0x1e, + 0x74, 0x06, 0x3c, 0x3f, 0x31, 0xf2, 0x1c, 0x7b, 0x91, 0x31, 0x21, + 0xb4, 0xf0, 0xd0, 0x6c, 0x97, 0xd4, 0xe9, 0x97, 0xb2, 0x24, 0x56, + 0x1e, 0x56, 0xc3, 0x35, 0xbd, 0x88, 0x05, 0x0f, 0x5b, 0x10, 0x1a, + 0x64, 0xe1, 0xc7, 0x82, 0x30, 0xf9, 0x32, 0xad, 0x9e, 0x50, 0x2c, + 0xe7, 0x78, 0x05, 0xd0, 0x31, 0xb1, 0x5a, 0x98, 0x8a, 0x75, 0x4e, + 0x90, 0x5c, 0x6a, 0x14, 0x2a, 0xe0, 0x52, 0x47, 0x82, 0x60, 0xe6, + 0x1e, 0xda, 0x81, 0xb1, 0xfb, 0x14, 0x0b, 0x5a, 0xf1, 0x9f, 0xd2, + 0x95, 0xba, 0x3e, 0xd0, 0x1b, 0xd6, 0x15, 0x1d, 0xa3, 0xbe, 0x86, + 0xd5, 0xdb, 0x0f, 0xc0, 0x49, 0x64, 0xbb, 0x2e, 0x50, 0x19, 0x4b, + 0xd2, 0x24, 0xf8, 0xdd, 0x1e, 0x07, 0x56, 0xd0, 0x38, 0xa0, 0x95, + 0x70, 0x20, 0x76, 0x8c, 0xd7, 0xdd, 0x1e, 0xde, 0x9f, 0x71, 0xc4, + 0x23, 0xef, 0x83, 0x13, 0x5c, 0xa3, 0x24, 0x15, 0x4d, 0x29, 0x40, + 0x3c, 0x6a, 0xc4, 0xa9, 0xd8, 0xb7, 0xa6, 0x44, 0xa5, 0x0d, 0xf4, + 0xe0, 0x9d, 0x77, 0x1e, 0x40, 0x70, 0x26, 0xfc, 0xda, 0xd9, 0x36, + 0xe4, 0x79, 0xe4, 0xb5, 0x3f, 0xbc, 0x9b, 0x65, 0xbe, 0xbb, 0x11, + 0x96, 0xcf, 0xdb, 0xc6, 0x28, 0x39, 0x3a, 0x08, 0xce, 0x47, 0x5b, + 0x53, 0x5a, 0xc5, 0x99, 0xfe, 0x5d, 0xa9, 0xdd, 0xef, 0x4c, 0xd4, + 0xc6, 0xa5, 0xad, 0x02, 0xe6, 0x8c, 0x07, 0x12, 0x1e, 0x6f, 0x03, + 0xd1, 0x6f, 0xa0, 0xa3, 0xf3, 0x29, 0xbd, 0x12, 0xc7, 0x50, 0xa2, + 0xb0, 0x7f, 0x88, 0xa9, 0x99, 0x77, 0x9a, 0xb1, 0xc0, 0xa5, 0x39, + 0x2e, 0x5c, 0x7c, 0x69, 0xe2, 0x2c, 0xb0, 0xea, 0x37, 0x6a, 0xa4, + 0xe1, 0x5a, 0xe1, 0xf5, 0x50, 0xe5, 0x83, 0xef, 0xa5, 0xbb, 0x2a, + 0x88, 0xe7, 0x8c, 0xdb, 0xfd, 0x6d, 0x5e, 0x97, 0x19, 0xa8, 0x7e, + 0x66, 0x75, 0x6b, 0x71, 0xea, 0xbf, 0xb1, 0xc7, 0x6f, 0xa0, 0xf4, + 0x8e, 0xa4, 0xec, 0x34, 0x51, 0x5b, 0x8c, 0x26, 0x03, 0x70, 0xa1, + 0x77, 0xd5, 0x01, 0x12, 0x57, 0x00, 0x35, 0xdb, 0x23, 0xde, 0x0e, + 0x8a, 0x28, 0x99, 0xfd, 0xb1, 0x10, 0x6f, 0x4b, 0xff, 0x38, 0x2d, + 0x60, 0x4e, 0x2c, 0x9c, 0xeb, 0x67, 0xb5, 0xad, 0x49, 0xee, 0x4b, + 0x1f, 0xac, 0xaf, 0xfb, 0x0d, 0x90, 0x5a, 0x66, 0x60, 0x70, 0x5d, + 0xaa, 0xcd, 0x78, 0xd4, 0x24, 0xee, 0xc8, 0x41, 0xa0, 0x93, 0x01, + 0x92, 0x9c, 0x6a, 0x9e, 0xfc, 0xb9, 0x24, 0xc5, 0xb3, 0x15, 0x82, + 0x7e, 0xbe, 0xae, 0x95, 0x2b, 0xeb, 0xb1, 0xc0, 0xda, 0xe3, 0x01, + 0x60, 0x0b, 0x5e, 0x69, 0xac, 0x84, 0x56, 0x61, 0xbe, 0x71, 0x17, + 0xfe, 0x1d, 0x13, 0x0f, 0xfe, 0xc6, 0x87, 0x45, 0xe9, 0xfe, 0x32, + 0xa0, 0x1a, 0x0d, 0x13, 0xa4, 0x94, 0x55, 0x71, 0xa5, 0x16, 0x8b, + 0xba, 0xca, 0x89, 0xb0, 0xb2, 0xc7, 0xfc, 0x8f, 0xd8, 0x54, 0xb5, + 0x93, 0x62, 0x9d, 0xce, 0xcf, 0x59, 0xfb, 0x3d, 0x18, 0xce, 0x2a, + 0xcb, 0x35, 0x15, 0x82, 0x5d, 0xff, 0x54, 0x22, 0x5b, 0x71, 0x52, + 0xfb, 0xb7, 0xc9, 0xfe, 0x60, 0x9b, 0x00, 0x41, 0x64, 0xf0, 0xaa, + 0x2a, 0xec, 0xb6, 0x42, 0x43, 0xce, 0x89, 0x66, 0x81, 0xc8, 0x8b, + 0x9f, 0x39, 0x54, 0x03, 0x25, 0xd3, 0x16, 0x35, 0x8e, 0x84, 0xd0, + 0x5f, 0xfa, 0x30, 0x1a, 0xf5, 0x9a, 0x6c, 0xf4, 0x0e, 0x53, 0xf9, + 0x3a, 0x5b, 0xd1, 0x1c, 0x30, 0x82, 0x03, 0xb7, 0x30, 0x82, 0x02, + 0x9f, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x0c, 0xe7, 0xe0, + 0xe5, 0x17, 0xd8, 0x46, 0xfe, 0x8f, 0xe5, 0x60, 0xfc, 0x1b, 0xf0, + 0x30, 0x39, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x65, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, + 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, + 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, + 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, + 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, + 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, + 0x72, 0x74, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, + 0x49, 0x44, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, + 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x31, 0x31, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x31, 0x31, 0x31, + 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x65, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, - 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x2b, 0x30, - 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x44, 0x69, 0x67, - 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x48, 0x69, 0x67, 0x68, 0x20, - 0x41, 0x73, 0x73, 0x75, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x45, - 0x56, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, - 0x17, 0x0d, 0x30, 0x36, 0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x31, 0x31, 0x31, 0x31, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x6c, 0x31, - 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, - 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, - 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, - 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, - 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, - 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x2b, 0x30, 0x29, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x44, 0x69, 0x67, 0x69, - 0x43, 0x65, 0x72, 0x74, 0x20, 0x48, 0x69, 0x67, 0x68, 0x20, 0x41, - 0x73, 0x73, 0x75, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x45, 0x56, - 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, - 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, - 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xc6, 0xcc, 0xe5, - 0x73, 0xe6, 0xfb, 0xd4, 0xbb, 0xe5, 0x2d, 0x2d, 0x32, 0xa6, 0xdf, - 0xe5, 0x81, 0x3f, 0xc9, 0xcd, 0x25, 0x49, 0xb6, 0x71, 0x2a, 0xc3, - 0xd5, 0x94, 0x34, 0x67, 0xa2, 0x0a, 0x1c, 0xb0, 0x5f, 0x69, 0xa6, - 0x40, 0xb1, 0xc4, 0xb7, 0xb2, 0x8f, 0xd0, 0x98, 0xa4, 0xa9, 0x41, - 0x59, 0x3a, 0xd3, 0xdc, 0x94, 0xd6, 0x3c, 0xdb, 0x74, 0x38, 0xa4, - 0x4a, 0xcc, 0x4d, 0x25, 0x82, 0xf7, 0x4a, 0xa5, 0x53, 0x12, 0x38, - 0xee, 0xf3, 0x49, 0x6d, 0x71, 0x91, 0x7e, 0x63, 0xb6, 0xab, 0xa6, - 0x5f, 0xc3, 0xa4, 0x84, 0xf8, 0x4f, 0x62, 0x51, 0xbe, 0xf8, 0xc5, - 0xec, 0xdb, 0x38, 0x92, 0xe3, 0x06, 0xe5, 0x08, 0x91, 0x0c, 0xc4, - 0x28, 0x41, 0x55, 0xfb, 0xcb, 0x5a, 0x89, 0x15, 0x7e, 0x71, 0xe8, - 0x35, 0xbf, 0x4d, 0x72, 0x09, 0x3d, 0xbe, 0x3a, 0x38, 0x50, 0x5b, - 0x77, 0x31, 0x1b, 0x8d, 0xb3, 0xc7, 0x24, 0x45, 0x9a, 0xa7, 0xac, - 0x6d, 0x00, 0x14, 0x5a, 0x04, 0xb7, 0xba, 0x13, 0xeb, 0x51, 0x0a, - 0x98, 0x41, 0x41, 0x22, 0x4e, 0x65, 0x61, 0x87, 0x81, 0x41, 0x50, - 0xa6, 0x79, 0x5c, 0x89, 0xde, 0x19, 0x4a, 0x57, 0xd5, 0x2e, 0xe6, - 0x5d, 0x1c, 0x53, 0x2c, 0x7e, 0x98, 0xcd, 0x1a, 0x06, 0x16, 0xa4, - 0x68, 0x73, 0xd0, 0x34, 0x04, 0x13, 0x5c, 0xa1, 0x71, 0xd3, 0x5a, - 0x7c, 0x55, 0xdb, 0x5e, 0x64, 0xe1, 0x37, 0x87, 0x30, 0x56, 0x04, - 0xe5, 0x11, 0xb4, 0x29, 0x80, 0x12, 0xf1, 0x79, 0x39, 0x88, 0xa2, - 0x02, 0x11, 0x7c, 0x27, 0x66, 0xb7, 0x88, 0xb7, 0x78, 0xf2, 0xca, - 0x0a, 0xa8, 0x38, 0xab, 0x0a, 0x64, 0xc2, 0xbf, 0x66, 0x5d, 0x95, - 0x84, 0xc1, 0xa1, 0x25, 0x1e, 0x87, 0x5d, 0x1a, 0x50, 0x0b, 0x20, - 0x12, 0xcc, 0x41, 0xbb, 0x6e, 0x0b, 0x51, 0x38, 0xb8, 0x4b, 0xcb, - 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0e, - 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, - 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, - 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, - 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xb1, 0x3e, - 0xc3, 0x69, 0x03, 0xf8, 0xbf, 0x47, 0x01, 0xd4, 0x98, 0x26, 0x1a, - 0x08, 0x02, 0xef, 0x63, 0x64, 0x2b, 0xc3, 0x30, 0x1f, 0x06, 0x03, - 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xb1, 0x3e, - 0xc3, 0x69, 0x03, 0xf8, 0xbf, 0x47, 0x01, 0xd4, 0x98, 0x26, 0x1a, - 0x08, 0x02, 0xef, 0x63, 0x64, 0x2b, 0xc3, 0x30, 0x0d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, - 0x03, 0x82, 0x01, 0x01, 0x00, 0x1c, 0x1a, 0x06, 0x97, 0xdc, 0xd7, - 0x9c, 0x9f, 0x3c, 0x88, 0x66, 0x06, 0x08, 0x57, 0x21, 0xdb, 0x21, - 0x47, 0xf8, 0x2a, 0x67, 0xaa, 0xbf, 0x18, 0x32, 0x76, 0x40, 0x10, - 0x57, 0xc1, 0x8a, 0xf3, 0x7a, 0xd9, 0x11, 0x65, 0x8e, 0x35, 0xfa, - 0x9e, 0xfc, 0x45, 0xb5, 0x9e, 0xd9, 0x4c, 0x31, 0x4b, 0xb8, 0x91, - 0xe8, 0x43, 0x2c, 0x8e, 0xb3, 0x78, 0xce, 0xdb, 0xe3, 0x53, 0x79, - 0x71, 0xd6, 0xe5, 0x21, 0x94, 0x01, 0xda, 0x55, 0x87, 0x9a, 0x24, - 0x64, 0xf6, 0x8a, 0x66, 0xcc, 0xde, 0x9c, 0x37, 0xcd, 0xa8, 0x34, - 0xb1, 0x69, 0x9b, 0x23, 0xc8, 0x9e, 0x78, 0x22, 0x2b, 0x70, 0x43, - 0xe3, 0x55, 0x47, 0x31, 0x61, 0x19, 0xef, 0x58, 0xc5, 0x85, 0x2f, - 0x4e, 0x30, 0xf6, 0xa0, 0x31, 0x16, 0x23, 0xc8, 0xe7, 0xe2, 0x65, - 0x16, 0x33, 0xcb, 0xbf, 0x1a, 0x1b, 0xa0, 0x3d, 0xf8, 0xca, 0x5e, - 0x8b, 0x31, 0x8b, 0x60, 0x08, 0x89, 0x2d, 0x0c, 0x06, 0x5c, 0x52, - 0xb7, 0xc4, 0xf9, 0x0a, 0x98, 0xd1, 0x15, 0x5f, 0x9f, 0x12, 0xbe, - 0x7c, 0x36, 0x63, 0x38, 0xbd, 0x44, 0xa4, 0x7f, 0xe4, 0x26, 0x2b, - 0x0a, 0xc4, 0x97, 0x69, 0x0d, 0xe9, 0x8c, 0xe2, 0xc0, 0x10, 0x57, - 0xb8, 0xc8, 0x76, 0x12, 0x91, 0x55, 0xf2, 0x48, 0x69, 0xd8, 0xbc, - 0x2a, 0x02, 0x5b, 0x0f, 0x44, 0xd4, 0x20, 0x31, 0xdb, 0xf4, 0xba, - 0x70, 0x26, 0x5d, 0x90, 0x60, 0x9e, 0xbc, 0x4b, 0x17, 0x09, 0x2f, - 0xb4, 0xcb, 0x1e, 0x43, 0x68, 0xc9, 0x07, 0x27, 0xc1, 0xd2, 0x5c, - 0xf7, 0xea, 0x21, 0xb9, 0x68, 0x12, 0x9c, 0x3c, 0x9c, 0xbf, 0x9e, - 0xfc, 0x80, 0x5c, 0x9b, 0x63, 0xcd, 0xec, 0x47, 0xaa, 0x25, 0x27, - 0x67, 0xa0, 0x37, 0xf3, 0x00, 0x82, 0x7d, 0x54, 0xd7, 0xa9, 0xf8, - 0xe9, 0x2e, 0x13, 0xa3, 0x77, 0xe8, 0x1f, 0x4a, 0x30, 0x82, 0x03, - 0x92, 0x30, 0x82, 0x02, 0x7a, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, - 0x11, 0x00, 0x85, 0xbd, 0x4b, 0xf3, 0xd8, 0xda, 0xe3, 0x69, 0xf6, - 0x94, 0xd7, 0x5f, 0xc3, 0xa5, 0x44, 0x23, 0x30, 0x0d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, - 0x30, 0x3d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x46, 0x52, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x13, 0x08, 0x43, 0x65, 0x72, 0x74, 0x70, 0x6c, 0x75, - 0x73, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, - 0x12, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x50, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, - 0x0d, 0x39, 0x39, 0x30, 0x37, 0x30, 0x37, 0x31, 0x37, 0x30, 0x35, - 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x31, 0x39, 0x30, 0x37, 0x30, 0x36, - 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x3d, 0x31, 0x0b, + 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x24, 0x30, + 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1b, 0x44, 0x69, 0x67, + 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, + 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, + 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, + 0x01, 0x00, 0xad, 0x0e, 0x15, 0xce, 0xe4, 0x43, 0x80, 0x5c, 0xb1, + 0x87, 0xf3, 0xb7, 0x60, 0xf9, 0x71, 0x12, 0xa5, 0xae, 0xdc, 0x26, + 0x94, 0x88, 0xaa, 0xf4, 0xce, 0xf5, 0x20, 0x39, 0x28, 0x58, 0x60, + 0x0c, 0xf8, 0x80, 0xda, 0xa9, 0x15, 0x95, 0x32, 0x61, 0x3c, 0xb5, + 0xb1, 0x28, 0x84, 0x8a, 0x8a, 0xdc, 0x9f, 0x0a, 0x0c, 0x83, 0x17, + 0x7a, 0x8f, 0x90, 0xac, 0x8a, 0xe7, 0x79, 0x53, 0x5c, 0x31, 0x84, + 0x2a, 0xf6, 0x0f, 0x98, 0x32, 0x36, 0x76, 0xcc, 0xde, 0xdd, 0x3c, + 0xa8, 0xa2, 0xef, 0x6a, 0xfb, 0x21, 0xf2, 0x52, 0x61, 0xdf, 0x9f, + 0x20, 0xd7, 0x1f, 0xe2, 0xb1, 0xd9, 0xfe, 0x18, 0x64, 0xd2, 0x12, + 0x5b, 0x5f, 0xf9, 0x58, 0x18, 0x35, 0xbc, 0x47, 0xcd, 0xa1, 0x36, + 0xf9, 0x6b, 0x7f, 0xd4, 0xb0, 0x38, 0x3e, 0xc1, 0x1b, 0xc3, 0x8c, + 0x33, 0xd9, 0xd8, 0x2f, 0x18, 0xfe, 0x28, 0x0f, 0xb3, 0xa7, 0x83, + 0xd6, 0xc3, 0x6e, 0x44, 0xc0, 0x61, 0x35, 0x96, 0x16, 0xfe, 0x59, + 0x9c, 0x8b, 0x76, 0x6d, 0xd7, 0xf1, 0xa2, 0x4b, 0x0d, 0x2b, 0xff, + 0x0b, 0x72, 0xda, 0x9e, 0x60, 0xd0, 0x8e, 0x90, 0x35, 0xc6, 0x78, + 0x55, 0x87, 0x20, 0xa1, 0xcf, 0xe5, 0x6d, 0x0a, 0xc8, 0x49, 0x7c, + 0x31, 0x98, 0x33, 0x6c, 0x22, 0xe9, 0x87, 0xd0, 0x32, 0x5a, 0xa2, + 0xba, 0x13, 0x82, 0x11, 0xed, 0x39, 0x17, 0x9d, 0x99, 0x3a, 0x72, + 0xa1, 0xe6, 0xfa, 0xa4, 0xd9, 0xd5, 0x17, 0x31, 0x75, 0xae, 0x85, + 0x7d, 0x22, 0xae, 0x3f, 0x01, 0x46, 0x86, 0xf6, 0x28, 0x79, 0xc8, + 0xb1, 0xda, 0xe4, 0x57, 0x17, 0xc4, 0x7e, 0x1c, 0x0e, 0xb0, 0xb4, + 0x92, 0xa6, 0x56, 0xb3, 0xbd, 0xb2, 0x97, 0xed, 0xaa, 0xa7, 0xf0, + 0xb7, 0xc5, 0xa8, 0x3f, 0x95, 0x16, 0xd0, 0xff, 0xa1, 0x96, 0xeb, + 0x08, 0x5f, 0x18, 0x77, 0x4f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, + 0x63, 0x30, 0x61, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, + 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, + 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, + 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, + 0x16, 0x04, 0x14, 0x45, 0xeb, 0xa2, 0xaf, 0xf4, 0x92, 0xcb, 0x82, + 0x31, 0x2d, 0x51, 0x8b, 0xa7, 0xa7, 0x21, 0x9d, 0xf3, 0x6d, 0xc8, + 0x0f, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, + 0x16, 0x80, 0x14, 0x45, 0xeb, 0xa2, 0xaf, 0xf4, 0x92, 0xcb, 0x82, + 0x31, 0x2d, 0x51, 0x8b, 0xa7, 0xa7, 0x21, 0x9d, 0xf3, 0x6d, 0xc8, + 0x0f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xa2, + 0x0e, 0xbc, 0xdf, 0xe2, 0xed, 0xf0, 0xe3, 0x72, 0x73, 0x7a, 0x64, + 0x94, 0xbf, 0xf7, 0x72, 0x66, 0xd8, 0x32, 0xe4, 0x42, 0x75, 0x62, + 0xae, 0x87, 0xeb, 0xf2, 0xd5, 0xd9, 0xde, 0x56, 0xb3, 0x9f, 0xcc, + 0xce, 0x14, 0x28, 0xb9, 0x0d, 0x97, 0x60, 0x5c, 0x12, 0x4c, 0x58, + 0xe4, 0xd3, 0x3d, 0x83, 0x49, 0x45, 0x58, 0x97, 0x35, 0x69, 0x1a, + 0xa8, 0x47, 0xea, 0x56, 0xc6, 0x79, 0xab, 0x12, 0xd8, 0x67, 0x81, + 0x84, 0xdf, 0x7f, 0x09, 0x3c, 0x94, 0xe6, 0xb8, 0x26, 0x2c, 0x20, + 0xbd, 0x3d, 0xb3, 0x28, 0x89, 0xf7, 0x5f, 0xff, 0x22, 0xe2, 0x97, + 0x84, 0x1f, 0xe9, 0x65, 0xef, 0x87, 0xe0, 0xdf, 0xc1, 0x67, 0x49, + 0xb3, 0x5d, 0xeb, 0xb2, 0x09, 0x2a, 0xeb, 0x26, 0xed, 0x78, 0xbe, + 0x7d, 0x3f, 0x2b, 0xf3, 0xb7, 0x26, 0x35, 0x6d, 0x5f, 0x89, 0x01, + 0xb6, 0x49, 0x5b, 0x9f, 0x01, 0x05, 0x9b, 0xab, 0x3d, 0x25, 0xc1, + 0xcc, 0xb6, 0x7f, 0xc2, 0xf1, 0x6f, 0x86, 0xc6, 0xfa, 0x64, 0x68, + 0xeb, 0x81, 0x2d, 0x94, 0xeb, 0x42, 0xb7, 0xfa, 0x8c, 0x1e, 0xdd, + 0x62, 0xf1, 0xbe, 0x50, 0x67, 0xb7, 0x6c, 0xbd, 0xf3, 0xf1, 0x1f, + 0x6b, 0x0c, 0x36, 0x07, 0x16, 0x7f, 0x37, 0x7c, 0xa9, 0x5b, 0x6d, + 0x7a, 0xf1, 0x12, 0x46, 0x60, 0x83, 0xd7, 0x27, 0x04, 0xbe, 0x4b, + 0xce, 0x97, 0xbe, 0xc3, 0x67, 0x2a, 0x68, 0x11, 0xdf, 0x80, 0xe7, + 0x0c, 0x33, 0x66, 0xbf, 0x13, 0x0d, 0x14, 0x6e, 0xf3, 0x7f, 0x1f, + 0x63, 0x10, 0x1e, 0xfa, 0x8d, 0x1b, 0x25, 0x6d, 0x6c, 0x8f, 0xa5, + 0xb7, 0x61, 0x01, 0xb1, 0xd2, 0xa3, 0x26, 0xa1, 0x10, 0x71, 0x9d, + 0xad, 0xe2, 0xc3, 0xf9, 0xc3, 0x99, 0x51, 0xb7, 0x2b, 0x07, 0x08, + 0xce, 0x2e, 0xe6, 0x50, 0xb2, 0xa7, 0xfa, 0x0a, 0x45, 0x2f, 0xa2, + 0xf0, 0xf2, 0x30, 0x82, 0x03, 0xaf, 0x30, 0x82, 0x02, 0x97, 0xa0, + 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x08, 0x3b, 0xe0, 0x56, 0x90, + 0x42, 0x46, 0xb1, 0xa1, 0x75, 0x6a, 0xc9, 0x59, 0x91, 0xc7, 0x4a, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x05, 0x05, 0x00, 0x30, 0x61, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, + 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, + 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, + 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, + 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, + 0x63, 0x6f, 0x6d, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x17, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, + 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, + 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, + 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, + 0x0d, 0x33, 0x31, 0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x5a, 0x30, 0x61, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, + 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, + 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, + 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, + 0x6f, 0x6d, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x17, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, + 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, + 0x01, 0x01, 0x00, 0xe2, 0x3b, 0xe1, 0x11, 0x72, 0xde, 0xa8, 0xa4, + 0xd3, 0xa3, 0x57, 0xaa, 0x50, 0xa2, 0x8f, 0x0b, 0x77, 0x90, 0xc9, + 0xa2, 0xa5, 0xee, 0x12, 0xce, 0x96, 0x5b, 0x01, 0x09, 0x20, 0xcc, + 0x01, 0x93, 0xa7, 0x4e, 0x30, 0xb7, 0x53, 0xf7, 0x43, 0xc4, 0x69, + 0x00, 0x57, 0x9d, 0xe2, 0x8d, 0x22, 0xdd, 0x87, 0x06, 0x40, 0x00, + 0x81, 0x09, 0xce, 0xce, 0x1b, 0x83, 0xbf, 0xdf, 0xcd, 0x3b, 0x71, + 0x46, 0xe2, 0xd6, 0x66, 0xc7, 0x05, 0xb3, 0x76, 0x27, 0x16, 0x8f, + 0x7b, 0x9e, 0x1e, 0x95, 0x7d, 0xee, 0xb7, 0x48, 0xa3, 0x08, 0xda, + 0xd6, 0xaf, 0x7a, 0x0c, 0x39, 0x06, 0x65, 0x7f, 0x4a, 0x5d, 0x1f, + 0xbc, 0x17, 0xf8, 0xab, 0xbe, 0xee, 0x28, 0xd7, 0x74, 0x7f, 0x7a, + 0x78, 0x99, 0x59, 0x85, 0x68, 0x6e, 0x5c, 0x23, 0x32, 0x4b, 0xbf, + 0x4e, 0xc0, 0xe8, 0x5a, 0x6d, 0xe3, 0x70, 0xbf, 0x77, 0x10, 0xbf, + 0xfc, 0x01, 0xf6, 0x85, 0xd9, 0xa8, 0x44, 0x10, 0x58, 0x32, 0xa9, + 0x75, 0x18, 0xd5, 0xd1, 0xa2, 0xbe, 0x47, 0xe2, 0x27, 0x6a, 0xf4, + 0x9a, 0x33, 0xf8, 0x49, 0x08, 0x60, 0x8b, 0xd4, 0x5f, 0xb4, 0x3a, + 0x84, 0xbf, 0xa1, 0xaa, 0x4a, 0x4c, 0x7d, 0x3e, 0xcf, 0x4f, 0x5f, + 0x6c, 0x76, 0x5e, 0xa0, 0x4b, 0x37, 0x91, 0x9e, 0xdc, 0x22, 0xe6, + 0x6d, 0xce, 0x14, 0x1a, 0x8e, 0x6a, 0xcb, 0xfe, 0xcd, 0xb3, 0x14, + 0x64, 0x17, 0xc7, 0x5b, 0x29, 0x9e, 0x32, 0xbf, 0xf2, 0xee, 0xfa, + 0xd3, 0x0b, 0x42, 0xd4, 0xab, 0xb7, 0x41, 0x32, 0xda, 0x0c, 0xd4, + 0xef, 0xf8, 0x81, 0xd5, 0xbb, 0x8d, 0x58, 0x3f, 0xb5, 0x1b, 0xe8, + 0x49, 0x28, 0xa2, 0x70, 0xda, 0x31, 0x04, 0xdd, 0xf7, 0xb2, 0x16, + 0xf2, 0x4c, 0x0a, 0x4e, 0x07, 0xa8, 0xed, 0x4a, 0x3d, 0x5e, 0xb5, + 0x7f, 0xa3, 0x90, 0xc3, 0xaf, 0x27, 0x02, 0x03, 0x01, 0x00, 0x01, + 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, + 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, + 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, + 0x04, 0x16, 0x04, 0x14, 0x03, 0xde, 0x50, 0x35, 0x56, 0xd1, 0x4c, + 0xbb, 0x66, 0xf0, 0xa3, 0xe2, 0x1b, 0x1b, 0xc3, 0x97, 0xb2, 0x3d, + 0xd1, 0x55, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, + 0x30, 0x16, 0x80, 0x14, 0x03, 0xde, 0x50, 0x35, 0x56, 0xd1, 0x4c, + 0xbb, 0x66, 0xf0, 0xa3, 0xe2, 0x1b, 0x1b, 0xc3, 0x97, 0xb2, 0x3d, + 0xd1, 0x55, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, + 0xcb, 0x9c, 0x37, 0xaa, 0x48, 0x13, 0x12, 0x0a, 0xfa, 0xdd, 0x44, + 0x9c, 0x4f, 0x52, 0xb0, 0xf4, 0xdf, 0xae, 0x04, 0xf5, 0x79, 0x79, + 0x08, 0xa3, 0x24, 0x18, 0xfc, 0x4b, 0x2b, 0x84, 0xc0, 0x2d, 0xb9, + 0xd5, 0xc7, 0xfe, 0xf4, 0xc1, 0x1f, 0x58, 0xcb, 0xb8, 0x6d, 0x9c, + 0x7a, 0x74, 0xe7, 0x98, 0x29, 0xab, 0x11, 0xb5, 0xe3, 0x70, 0xa0, + 0xa1, 0xcd, 0x4c, 0x88, 0x99, 0x93, 0x8c, 0x91, 0x70, 0xe2, 0xab, + 0x0f, 0x1c, 0xbe, 0x93, 0xa9, 0xff, 0x63, 0xd5, 0xe4, 0x07, 0x60, + 0xd3, 0xa3, 0xbf, 0x9d, 0x5b, 0x09, 0xf1, 0xd5, 0x8e, 0xe3, 0x53, + 0xf4, 0x8e, 0x63, 0xfa, 0x3f, 0xa7, 0xdb, 0xb4, 0x66, 0xdf, 0x62, + 0x66, 0xd6, 0xd1, 0x6e, 0x41, 0x8d, 0xf2, 0x2d, 0xb5, 0xea, 0x77, + 0x4a, 0x9f, 0x9d, 0x58, 0xe2, 0x2b, 0x59, 0xc0, 0x40, 0x23, 0xed, + 0x2d, 0x28, 0x82, 0x45, 0x3e, 0x79, 0x54, 0x92, 0x26, 0x98, 0xe0, + 0x80, 0x48, 0xa8, 0x37, 0xef, 0xf0, 0xd6, 0x79, 0x60, 0x16, 0xde, + 0xac, 0xe8, 0x0e, 0xcd, 0x6e, 0xac, 0x44, 0x17, 0x38, 0x2f, 0x49, + 0xda, 0xe1, 0x45, 0x3e, 0x2a, 0xb9, 0x36, 0x53, 0xcf, 0x3a, 0x50, + 0x06, 0xf7, 0x2e, 0xe8, 0xc4, 0x57, 0x49, 0x6c, 0x61, 0x21, 0x18, + 0xd5, 0x04, 0xad, 0x78, 0x3c, 0x2c, 0x3a, 0x80, 0x6b, 0xa7, 0xeb, + 0xaf, 0x15, 0x14, 0xe9, 0xd8, 0x89, 0xc1, 0xb9, 0x38, 0x6c, 0xe2, + 0x91, 0x6c, 0x8a, 0xff, 0x64, 0xb9, 0x77, 0x25, 0x57, 0x30, 0xc0, + 0x1b, 0x24, 0xa3, 0xe1, 0xdc, 0xe9, 0xdf, 0x47, 0x7c, 0xb5, 0xb4, + 0x24, 0x08, 0x05, 0x30, 0xec, 0x2d, 0xbd, 0x0b, 0xbf, 0x45, 0xbf, + 0x50, 0xb9, 0xa9, 0xf3, 0xeb, 0x98, 0x01, 0x12, 0xad, 0xc8, 0x88, + 0xc6, 0x98, 0x34, 0x5f, 0x8d, 0x0a, 0x3c, 0xc6, 0xe9, 0xd5, 0x95, + 0x95, 0x6d, 0xde, 0x30, 0x82, 0x03, 0xc5, 0x30, 0x82, 0x02, 0xad, + 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x02, 0xac, 0x5c, 0x26, + 0x6a, 0x0b, 0x40, 0x9b, 0x8f, 0x0b, 0x79, 0xf2, 0xae, 0x46, 0x25, + 0x77, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x6c, 0x31, 0x0b, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, + 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, + 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, + 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, + 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, + 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x22, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, + 0x74, 0x20, 0x48, 0x69, 0x67, 0x68, 0x20, 0x41, 0x73, 0x73, 0x75, + 0x72, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x45, 0x56, 0x20, 0x52, 0x6f, + 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, + 0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, + 0x17, 0x0d, 0x33, 0x31, 0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x5a, 0x30, 0x6c, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, + 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, + 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, + 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, + 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, + 0x63, 0x6f, 0x6d, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x22, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, + 0x20, 0x48, 0x69, 0x67, 0x68, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, + 0x61, 0x6e, 0x63, 0x65, 0x20, 0x45, 0x56, 0x20, 0x52, 0x6f, 0x6f, + 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, + 0x82, 0x01, 0x01, 0x00, 0xc6, 0xcc, 0xe5, 0x73, 0xe6, 0xfb, 0xd4, + 0xbb, 0xe5, 0x2d, 0x2d, 0x32, 0xa6, 0xdf, 0xe5, 0x81, 0x3f, 0xc9, + 0xcd, 0x25, 0x49, 0xb6, 0x71, 0x2a, 0xc3, 0xd5, 0x94, 0x34, 0x67, + 0xa2, 0x0a, 0x1c, 0xb0, 0x5f, 0x69, 0xa6, 0x40, 0xb1, 0xc4, 0xb7, + 0xb2, 0x8f, 0xd0, 0x98, 0xa4, 0xa9, 0x41, 0x59, 0x3a, 0xd3, 0xdc, + 0x94, 0xd6, 0x3c, 0xdb, 0x74, 0x38, 0xa4, 0x4a, 0xcc, 0x4d, 0x25, + 0x82, 0xf7, 0x4a, 0xa5, 0x53, 0x12, 0x38, 0xee, 0xf3, 0x49, 0x6d, + 0x71, 0x91, 0x7e, 0x63, 0xb6, 0xab, 0xa6, 0x5f, 0xc3, 0xa4, 0x84, + 0xf8, 0x4f, 0x62, 0x51, 0xbe, 0xf8, 0xc5, 0xec, 0xdb, 0x38, 0x92, + 0xe3, 0x06, 0xe5, 0x08, 0x91, 0x0c, 0xc4, 0x28, 0x41, 0x55, 0xfb, + 0xcb, 0x5a, 0x89, 0x15, 0x7e, 0x71, 0xe8, 0x35, 0xbf, 0x4d, 0x72, + 0x09, 0x3d, 0xbe, 0x3a, 0x38, 0x50, 0x5b, 0x77, 0x31, 0x1b, 0x8d, + 0xb3, 0xc7, 0x24, 0x45, 0x9a, 0xa7, 0xac, 0x6d, 0x00, 0x14, 0x5a, + 0x04, 0xb7, 0xba, 0x13, 0xeb, 0x51, 0x0a, 0x98, 0x41, 0x41, 0x22, + 0x4e, 0x65, 0x61, 0x87, 0x81, 0x41, 0x50, 0xa6, 0x79, 0x5c, 0x89, + 0xde, 0x19, 0x4a, 0x57, 0xd5, 0x2e, 0xe6, 0x5d, 0x1c, 0x53, 0x2c, + 0x7e, 0x98, 0xcd, 0x1a, 0x06, 0x16, 0xa4, 0x68, 0x73, 0xd0, 0x34, + 0x04, 0x13, 0x5c, 0xa1, 0x71, 0xd3, 0x5a, 0x7c, 0x55, 0xdb, 0x5e, + 0x64, 0xe1, 0x37, 0x87, 0x30, 0x56, 0x04, 0xe5, 0x11, 0xb4, 0x29, + 0x80, 0x12, 0xf1, 0x79, 0x39, 0x88, 0xa2, 0x02, 0x11, 0x7c, 0x27, + 0x66, 0xb7, 0x88, 0xb7, 0x78, 0xf2, 0xca, 0x0a, 0xa8, 0x38, 0xab, + 0x0a, 0x64, 0xc2, 0xbf, 0x66, 0x5d, 0x95, 0x84, 0xc1, 0xa1, 0x25, + 0x1e, 0x87, 0x5d, 0x1a, 0x50, 0x0b, 0x20, 0x12, 0xcc, 0x41, 0xbb, + 0x6e, 0x0b, 0x51, 0x38, 0xb8, 0x4b, 0xcb, 0x02, 0x03, 0x01, 0x00, + 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, + 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, + 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, + 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, + 0x0e, 0x04, 0x16, 0x04, 0x14, 0xb1, 0x3e, 0xc3, 0x69, 0x03, 0xf8, + 0xbf, 0x47, 0x01, 0xd4, 0x98, 0x26, 0x1a, 0x08, 0x02, 0xef, 0x63, + 0x64, 0x2b, 0xc3, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, + 0x18, 0x30, 0x16, 0x80, 0x14, 0xb1, 0x3e, 0xc3, 0x69, 0x03, 0xf8, + 0xbf, 0x47, 0x01, 0xd4, 0x98, 0x26, 0x1a, 0x08, 0x02, 0xef, 0x63, + 0x64, 0x2b, 0xc3, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, + 0x00, 0x1c, 0x1a, 0x06, 0x97, 0xdc, 0xd7, 0x9c, 0x9f, 0x3c, 0x88, + 0x66, 0x06, 0x08, 0x57, 0x21, 0xdb, 0x21, 0x47, 0xf8, 0x2a, 0x67, + 0xaa, 0xbf, 0x18, 0x32, 0x76, 0x40, 0x10, 0x57, 0xc1, 0x8a, 0xf3, + 0x7a, 0xd9, 0x11, 0x65, 0x8e, 0x35, 0xfa, 0x9e, 0xfc, 0x45, 0xb5, + 0x9e, 0xd9, 0x4c, 0x31, 0x4b, 0xb8, 0x91, 0xe8, 0x43, 0x2c, 0x8e, + 0xb3, 0x78, 0xce, 0xdb, 0xe3, 0x53, 0x79, 0x71, 0xd6, 0xe5, 0x21, + 0x94, 0x01, 0xda, 0x55, 0x87, 0x9a, 0x24, 0x64, 0xf6, 0x8a, 0x66, + 0xcc, 0xde, 0x9c, 0x37, 0xcd, 0xa8, 0x34, 0xb1, 0x69, 0x9b, 0x23, + 0xc8, 0x9e, 0x78, 0x22, 0x2b, 0x70, 0x43, 0xe3, 0x55, 0x47, 0x31, + 0x61, 0x19, 0xef, 0x58, 0xc5, 0x85, 0x2f, 0x4e, 0x30, 0xf6, 0xa0, + 0x31, 0x16, 0x23, 0xc8, 0xe7, 0xe2, 0x65, 0x16, 0x33, 0xcb, 0xbf, + 0x1a, 0x1b, 0xa0, 0x3d, 0xf8, 0xca, 0x5e, 0x8b, 0x31, 0x8b, 0x60, + 0x08, 0x89, 0x2d, 0x0c, 0x06, 0x5c, 0x52, 0xb7, 0xc4, 0xf9, 0x0a, + 0x98, 0xd1, 0x15, 0x5f, 0x9f, 0x12, 0xbe, 0x7c, 0x36, 0x63, 0x38, + 0xbd, 0x44, 0xa4, 0x7f, 0xe4, 0x26, 0x2b, 0x0a, 0xc4, 0x97, 0x69, + 0x0d, 0xe9, 0x8c, 0xe2, 0xc0, 0x10, 0x57, 0xb8, 0xc8, 0x76, 0x12, + 0x91, 0x55, 0xf2, 0x48, 0x69, 0xd8, 0xbc, 0x2a, 0x02, 0x5b, 0x0f, + 0x44, 0xd4, 0x20, 0x31, 0xdb, 0xf4, 0xba, 0x70, 0x26, 0x5d, 0x90, + 0x60, 0x9e, 0xbc, 0x4b, 0x17, 0x09, 0x2f, 0xb4, 0xcb, 0x1e, 0x43, + 0x68, 0xc9, 0x07, 0x27, 0xc1, 0xd2, 0x5c, 0xf7, 0xea, 0x21, 0xb9, + 0x68, 0x12, 0x9c, 0x3c, 0x9c, 0xbf, 0x9e, 0xfc, 0x80, 0x5c, 0x9b, + 0x63, 0xcd, 0xec, 0x47, 0xaa, 0x25, 0x27, 0x67, 0xa0, 0x37, 0xf3, + 0x00, 0x82, 0x7d, 0x54, 0xd7, 0xa9, 0xf8, 0xe9, 0x2e, 0x13, 0xa3, + 0x77, 0xe8, 0x1f, 0x4a, 0x30, 0x82, 0x03, 0x92, 0x30, 0x82, 0x02, + 0x7a, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x11, 0x00, 0x85, 0xbd, + 0x4b, 0xf3, 0xd8, 0xda, 0xe3, 0x69, 0xf6, 0x94, 0xd7, 0x5f, 0xc3, + 0xa5, 0x44, 0x23, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x3d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x46, 0x52, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x43, 0x65, 0x72, 0x74, 0x70, 0x6c, 0x75, 0x73, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, - 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, - 0x82, 0x01, 0x01, 0x00, 0xdc, 0x50, 0x96, 0xd0, 0x12, 0xf8, 0x35, - 0xd2, 0x08, 0x78, 0x7a, 0xb6, 0x52, 0x70, 0xfd, 0x6f, 0xee, 0xcf, - 0xb9, 0x11, 0xcb, 0x5d, 0x77, 0xe1, 0xec, 0xe9, 0x7e, 0x04, 0x8d, - 0xd6, 0xcc, 0x6f, 0x73, 0x43, 0x57, 0x60, 0xac, 0x33, 0x0a, 0x44, - 0xec, 0x03, 0x5f, 0x1c, 0x80, 0x24, 0x91, 0xe5, 0xa8, 0x91, 0x56, - 0x12, 0x82, 0xf7, 0xe0, 0x2b, 0xf4, 0xdb, 0xae, 0x61, 0x2e, 0x89, - 0x10, 0x8d, 0x6b, 0x6c, 0xba, 0xb3, 0x02, 0xbd, 0xd5, 0x36, 0xc5, - 0x48, 0x37, 0x23, 0xe2, 0xf0, 0x5a, 0x37, 0x52, 0x33, 0x17, 0x12, - 0xe2, 0xd1, 0x60, 0x4d, 0xbe, 0x2f, 0x41, 0x11, 0xe3, 0xf6, 0x17, - 0x25, 0x0c, 0x8b, 0x91, 0xc0, 0x1b, 0x99, 0x7b, 0x99, 0x56, 0x0d, - 0xaf, 0xee, 0xd2, 0xbc, 0x47, 0x57, 0xe3, 0x79, 0x49, 0x7b, 0x34, - 0x89, 0x27, 0x24, 0x84, 0xde, 0xb1, 0xec, 0xe9, 0x58, 0x4e, 0xfe, - 0x4e, 0xdf, 0x5a, 0xbe, 0x41, 0xad, 0xac, 0x08, 0xc5, 0x18, 0x0e, - 0xef, 0xd2, 0x53, 0xee, 0x6c, 0xd0, 0x9d, 0x12, 0x01, 0x13, 0x8d, - 0xdc, 0x80, 0x62, 0xf7, 0x95, 0xa9, 0x44, 0x88, 0x4a, 0x71, 0x4e, - 0x60, 0x55, 0x9e, 0xdb, 0x23, 0x19, 0x79, 0x56, 0x07, 0x0c, 0x3f, - 0x63, 0x0b, 0x5c, 0xb0, 0xe2, 0xbe, 0x7e, 0x15, 0xfc, 0x94, 0x33, - 0x58, 0x41, 0x38, 0x74, 0xc4, 0xe1, 0x8f, 0x8b, 0xdf, 0x26, 0xac, - 0x1f, 0xb5, 0x8b, 0x3b, 0xb7, 0x43, 0x59, 0x6b, 0xb0, 0x24, 0xa6, - 0x6d, 0x90, 0x8b, 0xc4, 0x72, 0xea, 0x5d, 0x33, 0x98, 0xb7, 0xcb, - 0xde, 0x5e, 0x7b, 0xef, 0x94, 0xf1, 0x1b, 0x3e, 0xca, 0xc9, 0x21, - 0xc1, 0xc5, 0x98, 0x02, 0xaa, 0xa2, 0xf6, 0x5b, 0x77, 0x9b, 0xf5, - 0x7e, 0x96, 0x55, 0x34, 0x1c, 0x67, 0x69, 0xc0, 0xf1, 0x42, 0xe3, - 0x47, 0xac, 0xfc, 0x28, 0x1c, 0x66, 0x55, 0x02, 0x03, 0x01, 0x00, - 0x01, 0xa3, 0x81, 0x8c, 0x30, 0x81, 0x89, 0x30, 0x0f, 0x06, 0x03, - 0x55, 0x1d, 0x13, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, - 0x01, 0x0a, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, - 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, - 0x04, 0x16, 0x04, 0x14, 0xe3, 0x73, 0x2d, 0xdf, 0xcb, 0x0e, 0x28, - 0x0c, 0xde, 0xdd, 0xb3, 0xa4, 0xca, 0x79, 0xb8, 0x8e, 0xbb, 0xe8, - 0x30, 0x89, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, - 0xf8, 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, - 0x37, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x30, 0x30, 0x2e, 0x30, - 0x2c, 0xa0, 0x2a, 0xa0, 0x28, 0x86, 0x26, 0x68, 0x74, 0x74, 0x70, - 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x63, 0x65, 0x72, 0x74, - 0x70, 0x6c, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x52, - 0x4c, 0x2f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x32, 0x2e, 0x63, 0x72, - 0x6c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xa7, - 0x54, 0xcf, 0x88, 0x44, 0x19, 0xcb, 0xdf, 0xd4, 0x7f, 0x00, 0xdf, - 0x56, 0x33, 0x62, 0xb5, 0xf7, 0x51, 0x01, 0x90, 0xeb, 0xc3, 0x3f, - 0xd1, 0x88, 0x44, 0xe9, 0x24, 0x5d, 0xef, 0xe7, 0x14, 0xbd, 0x20, - 0xb7, 0x9a, 0x3c, 0x00, 0xfe, 0x6d, 0x9f, 0xdb, 0x90, 0xdc, 0xd7, - 0xf4, 0x62, 0xd6, 0x8b, 0x70, 0x5d, 0xe7, 0xe5, 0x04, 0x48, 0xa9, - 0x68, 0x7c, 0xc9, 0xf1, 0x42, 0xf3, 0x6c, 0x7f, 0xc5, 0x7a, 0x7c, - 0x1d, 0x51, 0x88, 0xba, 0xd2, 0x0a, 0x3e, 0x27, 0x5d, 0xde, 0x2d, - 0x51, 0x4e, 0xd3, 0x13, 0x64, 0x69, 0xe4, 0x2e, 0xe3, 0xd3, 0xe7, - 0x9b, 0x09, 0x99, 0xa6, 0xe0, 0x95, 0x9b, 0xce, 0x1a, 0xd7, 0x7f, - 0xbe, 0x3c, 0xce, 0x52, 0xb3, 0x11, 0x15, 0xc1, 0x0f, 0x17, 0xcd, - 0x03, 0xbb, 0x9c, 0x25, 0x15, 0xba, 0xa2, 0x76, 0x89, 0xfc, 0x06, - 0xf1, 0x18, 0xd0, 0x93, 0x4b, 0x0e, 0x7c, 0x82, 0xb7, 0xa5, 0xf4, - 0xf6, 0x5f, 0xfe, 0xed, 0x40, 0xa6, 0x9d, 0x84, 0x74, 0x39, 0xb9, - 0xdc, 0x1e, 0x85, 0x16, 0xda, 0x29, 0x1b, 0x86, 0x23, 0x00, 0xc9, - 0xbb, 0x89, 0x7e, 0x6e, 0x80, 0x88, 0x1e, 0x2f, 0x14, 0xb4, 0x03, - 0x24, 0xa8, 0x32, 0x6f, 0x03, 0x9a, 0x47, 0x2c, 0x30, 0xbe, 0x56, - 0xc6, 0xa7, 0x42, 0x02, 0x70, 0x1b, 0xea, 0x40, 0xd8, 0xba, 0x05, - 0x03, 0x70, 0x07, 0xa4, 0x96, 0xff, 0xfd, 0x48, 0x33, 0x0a, 0xe1, - 0xdc, 0xa5, 0x81, 0x90, 0x9b, 0x4d, 0xdd, 0x7d, 0xe7, 0xe7, 0xb2, - 0xcd, 0x5c, 0xc8, 0x6a, 0x95, 0xf8, 0xa5, 0xf6, 0x8d, 0xc4, 0x5d, - 0x78, 0x08, 0xbe, 0x7b, 0x06, 0xd6, 0x49, 0xcf, 0x19, 0x36, 0x50, - 0x23, 0x2e, 0x08, 0xe6, 0x9e, 0x05, 0x4d, 0x47, 0x18, 0xd5, 0x16, - 0xe9, 0xb1, 0xd6, 0xb6, 0x10, 0xd5, 0xbb, 0x97, 0xbf, 0xa2, 0x8e, - 0xb4, 0x54, 0x30, 0x82, 0x03, 0x4a, 0x30, 0x82, 0x02, 0x32, 0xa0, - 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x44, 0xaf, 0xb0, 0x80, 0xd6, - 0xa3, 0x27, 0xba, 0x89, 0x30, 0x39, 0x86, 0x2e, 0xf8, 0x40, 0x6b, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x05, 0x05, 0x00, 0x30, 0x3f, 0x31, 0x24, 0x30, 0x22, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69, 0x74, - 0x61, 0x6c, 0x20, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f, 0x2e, - 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0e, - 0x44, 0x53, 0x54, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, - 0x20, 0x58, 0x33, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x30, 0x30, 0x39, - 0x33, 0x30, 0x32, 0x31, 0x31, 0x32, 0x31, 0x39, 0x5a, 0x17, 0x0d, - 0x32, 0x31, 0x30, 0x39, 0x33, 0x30, 0x31, 0x34, 0x30, 0x31, 0x31, - 0x35, 0x5a, 0x30, 0x3f, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, - 0x20, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, - 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f, 0x2e, 0x31, 0x17, - 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0e, 0x44, 0x53, - 0x54, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x58, - 0x33, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, - 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, - 0x00, 0xdf, 0xaf, 0xe9, 0x97, 0x50, 0x08, 0x83, 0x57, 0xb4, 0xcc, - 0x62, 0x65, 0xf6, 0x90, 0x82, 0xec, 0xc7, 0xd3, 0x2c, 0x6b, 0x30, - 0xca, 0x5b, 0xec, 0xd9, 0xc3, 0x7d, 0xc7, 0x40, 0xc1, 0x18, 0x14, - 0x8b, 0xe0, 0xe8, 0x33, 0x76, 0x49, 0x2a, 0xe3, 0x3f, 0x21, 0x49, - 0x93, 0xac, 0x4e, 0x0e, 0xaf, 0x3e, 0x48, 0xcb, 0x65, 0xee, 0xfc, - 0xd3, 0x21, 0x0f, 0x65, 0xd2, 0x2a, 0xd9, 0x32, 0x8f, 0x8c, 0xe5, - 0xf7, 0x77, 0xb0, 0x12, 0x7b, 0xb5, 0x95, 0xc0, 0x89, 0xa3, 0xa9, - 0xba, 0xed, 0x73, 0x2e, 0x7a, 0x0c, 0x06, 0x32, 0x83, 0xa2, 0x7e, - 0x8a, 0x14, 0x30, 0xcd, 0x11, 0xa0, 0xe1, 0x2a, 0x38, 0xb9, 0x79, - 0x0a, 0x31, 0xfd, 0x50, 0xbd, 0x80, 0x65, 0xdf, 0xb7, 0x51, 0x63, - 0x83, 0xc8, 0xe2, 0x88, 0x61, 0xea, 0x4b, 0x61, 0x81, 0xec, 0x52, - 0x6b, 0xb9, 0xa2, 0xe2, 0x4b, 0x1a, 0x28, 0x9f, 0x48, 0xa3, 0x9e, - 0x0c, 0xda, 0x09, 0x8e, 0x3e, 0x17, 0x2e, 0x1e, 0xdd, 0x20, 0xdf, - 0x5b, 0xc6, 0x2a, 0x8a, 0xab, 0x2e, 0xbd, 0x70, 0xad, 0xc5, 0x0b, - 0x1a, 0x25, 0x90, 0x74, 0x72, 0xc5, 0x7b, 0x6a, 0xab, 0x34, 0xd6, - 0x30, 0x89, 0xff, 0xe5, 0x68, 0x13, 0x7b, 0x54, 0x0b, 0xc8, 0xd6, - 0xae, 0xec, 0x5a, 0x9c, 0x92, 0x1e, 0x3d, 0x64, 0xb3, 0x8c, 0xc6, - 0xdf, 0xbf, 0xc9, 0x41, 0x70, 0xec, 0x16, 0x72, 0xd5, 0x26, 0xec, - 0x38, 0x55, 0x39, 0x43, 0xd0, 0xfc, 0xfd, 0x18, 0x5c, 0x40, 0xf1, - 0x97, 0xeb, 0xd5, 0x9a, 0x9b, 0x8d, 0x1d, 0xba, 0xda, 0x25, 0xb9, - 0xc6, 0xd8, 0xdf, 0xc1, 0x15, 0x02, 0x3a, 0xab, 0xda, 0x6e, 0xf1, - 0x3e, 0x2e, 0xf5, 0x5c, 0x08, 0x9c, 0x3c, 0xd6, 0x83, 0x69, 0xe4, - 0x10, 0x9b, 0x19, 0x2a, 0xb6, 0x29, 0x57, 0xe3, 0xe5, 0x3d, 0x9b, - 0x9f, 0xf0, 0x02, 0x5d, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, - 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, - 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, - 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, - 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, - 0x04, 0x14, 0xc4, 0xa7, 0xb1, 0xa4, 0x7b, 0x2c, 0x71, 0xfa, 0xdb, - 0xe1, 0x4b, 0x90, 0x75, 0xff, 0xc4, 0x15, 0x60, 0x85, 0x89, 0x10, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xa3, 0x1a, - 0x2c, 0x9b, 0x17, 0x00, 0x5c, 0xa9, 0x1e, 0xee, 0x28, 0x66, 0x37, - 0x3a, 0xbf, 0x83, 0xc7, 0x3f, 0x4b, 0xc3, 0x09, 0xa0, 0x95, 0x20, - 0x5d, 0xe3, 0xd9, 0x59, 0x44, 0xd2, 0x3e, 0x0d, 0x3e, 0xbd, 0x8a, - 0x4b, 0xa0, 0x74, 0x1f, 0xce, 0x10, 0x82, 0x9c, 0x74, 0x1a, 0x1d, - 0x7e, 0x98, 0x1a, 0xdd, 0xcb, 0x13, 0x4b, 0xb3, 0x20, 0x44, 0xe4, - 0x91, 0xe9, 0xcc, 0xfc, 0x7d, 0xa5, 0xdb, 0x6a, 0xe5, 0xfe, 0xe6, - 0xfd, 0xe0, 0x4e, 0xdd, 0xb7, 0x00, 0x3a, 0xb5, 0x70, 0x49, 0xaf, - 0xf2, 0xe5, 0xeb, 0x02, 0xf1, 0xd1, 0x02, 0x8b, 0x19, 0xcb, 0x94, - 0x3a, 0x5e, 0x48, 0xc4, 0x18, 0x1e, 0x58, 0x19, 0x5f, 0x1e, 0x02, - 0x5a, 0xf0, 0x0c, 0xf1, 0xb1, 0xad, 0xa9, 0xdc, 0x59, 0x86, 0x8b, - 0x6e, 0xe9, 0x91, 0xf5, 0x86, 0xca, 0xfa, 0xb9, 0x66, 0x33, 0xaa, - 0x59, 0x5b, 0xce, 0xe2, 0xa7, 0x16, 0x73, 0x47, 0xcb, 0x2b, 0xcc, - 0x99, 0xb0, 0x37, 0x48, 0xcf, 0xe3, 0x56, 0x4b, 0xf5, 0xcf, 0x0f, - 0x0c, 0x72, 0x32, 0x87, 0xc6, 0xf0, 0x44, 0xbb, 0x53, 0x72, 0x6d, - 0x43, 0xf5, 0x26, 0x48, 0x9a, 0x52, 0x67, 0xb7, 0x58, 0xab, 0xfe, - 0x67, 0x76, 0x71, 0x78, 0xdb, 0x0d, 0xa2, 0x56, 0x14, 0x13, 0x39, - 0x24, 0x31, 0x85, 0xa2, 0xa8, 0x02, 0x5a, 0x30, 0x47, 0xe1, 0xdd, - 0x50, 0x07, 0xbc, 0x02, 0x09, 0x90, 0x00, 0xeb, 0x64, 0x63, 0x60, - 0x9b, 0x16, 0xbc, 0x88, 0xc9, 0x12, 0xe6, 0xd2, 0x7d, 0x91, 0x8b, - 0xf9, 0x3d, 0x32, 0x8d, 0x65, 0xb4, 0xe9, 0x7c, 0xb1, 0x57, 0x76, - 0xea, 0xc5, 0xb6, 0x28, 0x39, 0xbf, 0x15, 0x65, 0x1c, 0xc8, 0xf6, - 0x77, 0x96, 0x6a, 0x0a, 0x8d, 0x77, 0x0b, 0xd8, 0x91, 0x0b, 0x04, - 0x8e, 0x07, 0xdb, 0x29, 0xb6, 0x0a, 0xee, 0x9d, 0x82, 0x35, 0x35, - 0x10, 0x30, 0x82, 0x04, 0x09, 0x30, 0x82, 0x02, 0xf1, 0xa0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x10, 0x0d, 0x5e, 0x99, 0x0a, 0xd6, 0x9d, - 0xb7, 0x78, 0xec, 0xd8, 0x07, 0x56, 0x3b, 0x86, 0x15, 0xd9, 0x30, - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x05, 0x05, 0x00, 0x30, 0x5b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x79, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x39, 0x39, 0x30, + 0x37, 0x30, 0x37, 0x31, 0x37, 0x30, 0x35, 0x30, 0x30, 0x5a, 0x17, + 0x0d, 0x31, 0x39, 0x30, 0x37, 0x30, 0x36, 0x32, 0x33, 0x35, 0x39, + 0x35, 0x39, 0x5a, 0x30, 0x3d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x46, 0x52, 0x31, 0x11, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x43, 0x65, 0x72, 0x74, + 0x70, 0x6c, 0x75, 0x73, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x12, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, + 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x43, 0x41, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, + 0xdc, 0x50, 0x96, 0xd0, 0x12, 0xf8, 0x35, 0xd2, 0x08, 0x78, 0x7a, + 0xb6, 0x52, 0x70, 0xfd, 0x6f, 0xee, 0xcf, 0xb9, 0x11, 0xcb, 0x5d, + 0x77, 0xe1, 0xec, 0xe9, 0x7e, 0x04, 0x8d, 0xd6, 0xcc, 0x6f, 0x73, + 0x43, 0x57, 0x60, 0xac, 0x33, 0x0a, 0x44, 0xec, 0x03, 0x5f, 0x1c, + 0x80, 0x24, 0x91, 0xe5, 0xa8, 0x91, 0x56, 0x12, 0x82, 0xf7, 0xe0, + 0x2b, 0xf4, 0xdb, 0xae, 0x61, 0x2e, 0x89, 0x10, 0x8d, 0x6b, 0x6c, + 0xba, 0xb3, 0x02, 0xbd, 0xd5, 0x36, 0xc5, 0x48, 0x37, 0x23, 0xe2, + 0xf0, 0x5a, 0x37, 0x52, 0x33, 0x17, 0x12, 0xe2, 0xd1, 0x60, 0x4d, + 0xbe, 0x2f, 0x41, 0x11, 0xe3, 0xf6, 0x17, 0x25, 0x0c, 0x8b, 0x91, + 0xc0, 0x1b, 0x99, 0x7b, 0x99, 0x56, 0x0d, 0xaf, 0xee, 0xd2, 0xbc, + 0x47, 0x57, 0xe3, 0x79, 0x49, 0x7b, 0x34, 0x89, 0x27, 0x24, 0x84, + 0xde, 0xb1, 0xec, 0xe9, 0x58, 0x4e, 0xfe, 0x4e, 0xdf, 0x5a, 0xbe, + 0x41, 0xad, 0xac, 0x08, 0xc5, 0x18, 0x0e, 0xef, 0xd2, 0x53, 0xee, + 0x6c, 0xd0, 0x9d, 0x12, 0x01, 0x13, 0x8d, 0xdc, 0x80, 0x62, 0xf7, + 0x95, 0xa9, 0x44, 0x88, 0x4a, 0x71, 0x4e, 0x60, 0x55, 0x9e, 0xdb, + 0x23, 0x19, 0x79, 0x56, 0x07, 0x0c, 0x3f, 0x63, 0x0b, 0x5c, 0xb0, + 0xe2, 0xbe, 0x7e, 0x15, 0xfc, 0x94, 0x33, 0x58, 0x41, 0x38, 0x74, + 0xc4, 0xe1, 0x8f, 0x8b, 0xdf, 0x26, 0xac, 0x1f, 0xb5, 0x8b, 0x3b, + 0xb7, 0x43, 0x59, 0x6b, 0xb0, 0x24, 0xa6, 0x6d, 0x90, 0x8b, 0xc4, + 0x72, 0xea, 0x5d, 0x33, 0x98, 0xb7, 0xcb, 0xde, 0x5e, 0x7b, 0xef, + 0x94, 0xf1, 0x1b, 0x3e, 0xca, 0xc9, 0x21, 0xc1, 0xc5, 0x98, 0x02, + 0xaa, 0xa2, 0xf6, 0x5b, 0x77, 0x9b, 0xf5, 0x7e, 0x96, 0x55, 0x34, + 0x1c, 0x67, 0x69, 0xc0, 0xf1, 0x42, 0xe3, 0x47, 0xac, 0xfc, 0x28, + 0x1c, 0x66, 0x55, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x8c, + 0x30, 0x81, 0x89, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, + 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x0a, 0x30, 0x0b, + 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0xe3, 0x73, 0x2d, 0xdf, 0xcb, 0x0e, 0x28, 0x0c, 0xde, 0xdd, 0xb3, + 0xa4, 0xca, 0x79, 0xb8, 0x8e, 0xbb, 0xe8, 0x30, 0x89, 0x30, 0x11, + 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x01, + 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x37, 0x06, 0x03, 0x55, + 0x1d, 0x1f, 0x04, 0x30, 0x30, 0x2e, 0x30, 0x2c, 0xa0, 0x2a, 0xa0, + 0x28, 0x86, 0x26, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x63, 0x65, 0x72, 0x74, 0x70, 0x6c, 0x75, 0x73, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x52, 0x4c, 0x2f, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x32, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xa7, 0x54, 0xcf, 0x88, 0x44, + 0x19, 0xcb, 0xdf, 0xd4, 0x7f, 0x00, 0xdf, 0x56, 0x33, 0x62, 0xb5, + 0xf7, 0x51, 0x01, 0x90, 0xeb, 0xc3, 0x3f, 0xd1, 0x88, 0x44, 0xe9, + 0x24, 0x5d, 0xef, 0xe7, 0x14, 0xbd, 0x20, 0xb7, 0x9a, 0x3c, 0x00, + 0xfe, 0x6d, 0x9f, 0xdb, 0x90, 0xdc, 0xd7, 0xf4, 0x62, 0xd6, 0x8b, + 0x70, 0x5d, 0xe7, 0xe5, 0x04, 0x48, 0xa9, 0x68, 0x7c, 0xc9, 0xf1, + 0x42, 0xf3, 0x6c, 0x7f, 0xc5, 0x7a, 0x7c, 0x1d, 0x51, 0x88, 0xba, + 0xd2, 0x0a, 0x3e, 0x27, 0x5d, 0xde, 0x2d, 0x51, 0x4e, 0xd3, 0x13, + 0x64, 0x69, 0xe4, 0x2e, 0xe3, 0xd3, 0xe7, 0x9b, 0x09, 0x99, 0xa6, + 0xe0, 0x95, 0x9b, 0xce, 0x1a, 0xd7, 0x7f, 0xbe, 0x3c, 0xce, 0x52, + 0xb3, 0x11, 0x15, 0xc1, 0x0f, 0x17, 0xcd, 0x03, 0xbb, 0x9c, 0x25, + 0x15, 0xba, 0xa2, 0x76, 0x89, 0xfc, 0x06, 0xf1, 0x18, 0xd0, 0x93, + 0x4b, 0x0e, 0x7c, 0x82, 0xb7, 0xa5, 0xf4, 0xf6, 0x5f, 0xfe, 0xed, + 0x40, 0xa6, 0x9d, 0x84, 0x74, 0x39, 0xb9, 0xdc, 0x1e, 0x85, 0x16, + 0xda, 0x29, 0x1b, 0x86, 0x23, 0x00, 0xc9, 0xbb, 0x89, 0x7e, 0x6e, + 0x80, 0x88, 0x1e, 0x2f, 0x14, 0xb4, 0x03, 0x24, 0xa8, 0x32, 0x6f, + 0x03, 0x9a, 0x47, 0x2c, 0x30, 0xbe, 0x56, 0xc6, 0xa7, 0x42, 0x02, + 0x70, 0x1b, 0xea, 0x40, 0xd8, 0xba, 0x05, 0x03, 0x70, 0x07, 0xa4, + 0x96, 0xff, 0xfd, 0x48, 0x33, 0x0a, 0xe1, 0xdc, 0xa5, 0x81, 0x90, + 0x9b, 0x4d, 0xdd, 0x7d, 0xe7, 0xe7, 0xb2, 0xcd, 0x5c, 0xc8, 0x6a, + 0x95, 0xf8, 0xa5, 0xf6, 0x8d, 0xc4, 0x5d, 0x78, 0x08, 0xbe, 0x7b, + 0x06, 0xd6, 0x49, 0xcf, 0x19, 0x36, 0x50, 0x23, 0x2e, 0x08, 0xe6, + 0x9e, 0x05, 0x4d, 0x47, 0x18, 0xd5, 0x16, 0xe9, 0xb1, 0xd6, 0xb6, + 0x10, 0xd5, 0xbb, 0x97, 0xbf, 0xa2, 0x8e, 0xb4, 0x54, 0x30, 0x82, + 0x03, 0x4a, 0x30, 0x82, 0x02, 0x32, 0xa0, 0x03, 0x02, 0x01, 0x02, + 0x02, 0x10, 0x44, 0xaf, 0xb0, 0x80, 0xd6, 0xa3, 0x27, 0xba, 0x89, + 0x30, 0x39, 0x86, 0x2e, 0xf8, 0x40, 0x6b, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, + 0x30, 0x3f, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x53, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x54, 0x72, + 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f, 0x2e, 0x31, 0x17, 0x30, 0x15, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0e, 0x44, 0x53, 0x54, 0x20, + 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x58, 0x33, 0x30, + 0x1e, 0x17, 0x0d, 0x30, 0x30, 0x30, 0x39, 0x33, 0x30, 0x32, 0x31, + 0x31, 0x32, 0x31, 0x39, 0x5a, 0x17, 0x0d, 0x32, 0x31, 0x30, 0x39, + 0x33, 0x30, 0x31, 0x34, 0x30, 0x31, 0x31, 0x35, 0x5a, 0x30, 0x3f, + 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1b, + 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x20, 0x43, 0x6f, 0x2e, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x13, 0x0e, 0x44, 0x53, 0x54, 0x20, 0x52, 0x6f, + 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x58, 0x33, 0x30, 0x82, 0x01, + 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, + 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xdf, 0xaf, 0xe9, + 0x97, 0x50, 0x08, 0x83, 0x57, 0xb4, 0xcc, 0x62, 0x65, 0xf6, 0x90, + 0x82, 0xec, 0xc7, 0xd3, 0x2c, 0x6b, 0x30, 0xca, 0x5b, 0xec, 0xd9, + 0xc3, 0x7d, 0xc7, 0x40, 0xc1, 0x18, 0x14, 0x8b, 0xe0, 0xe8, 0x33, + 0x76, 0x49, 0x2a, 0xe3, 0x3f, 0x21, 0x49, 0x93, 0xac, 0x4e, 0x0e, + 0xaf, 0x3e, 0x48, 0xcb, 0x65, 0xee, 0xfc, 0xd3, 0x21, 0x0f, 0x65, + 0xd2, 0x2a, 0xd9, 0x32, 0x8f, 0x8c, 0xe5, 0xf7, 0x77, 0xb0, 0x12, + 0x7b, 0xb5, 0x95, 0xc0, 0x89, 0xa3, 0xa9, 0xba, 0xed, 0x73, 0x2e, + 0x7a, 0x0c, 0x06, 0x32, 0x83, 0xa2, 0x7e, 0x8a, 0x14, 0x30, 0xcd, + 0x11, 0xa0, 0xe1, 0x2a, 0x38, 0xb9, 0x79, 0x0a, 0x31, 0xfd, 0x50, + 0xbd, 0x80, 0x65, 0xdf, 0xb7, 0x51, 0x63, 0x83, 0xc8, 0xe2, 0x88, + 0x61, 0xea, 0x4b, 0x61, 0x81, 0xec, 0x52, 0x6b, 0xb9, 0xa2, 0xe2, + 0x4b, 0x1a, 0x28, 0x9f, 0x48, 0xa3, 0x9e, 0x0c, 0xda, 0x09, 0x8e, + 0x3e, 0x17, 0x2e, 0x1e, 0xdd, 0x20, 0xdf, 0x5b, 0xc6, 0x2a, 0x8a, + 0xab, 0x2e, 0xbd, 0x70, 0xad, 0xc5, 0x0b, 0x1a, 0x25, 0x90, 0x74, + 0x72, 0xc5, 0x7b, 0x6a, 0xab, 0x34, 0xd6, 0x30, 0x89, 0xff, 0xe5, + 0x68, 0x13, 0x7b, 0x54, 0x0b, 0xc8, 0xd6, 0xae, 0xec, 0x5a, 0x9c, + 0x92, 0x1e, 0x3d, 0x64, 0xb3, 0x8c, 0xc6, 0xdf, 0xbf, 0xc9, 0x41, + 0x70, 0xec, 0x16, 0x72, 0xd5, 0x26, 0xec, 0x38, 0x55, 0x39, 0x43, + 0xd0, 0xfc, 0xfd, 0x18, 0x5c, 0x40, 0xf1, 0x97, 0xeb, 0xd5, 0x9a, + 0x9b, 0x8d, 0x1d, 0xba, 0xda, 0x25, 0xb9, 0xc6, 0xd8, 0xdf, 0xc1, + 0x15, 0x02, 0x3a, 0xab, 0xda, 0x6e, 0xf1, 0x3e, 0x2e, 0xf5, 0x5c, + 0x08, 0x9c, 0x3c, 0xd6, 0x83, 0x69, 0xe4, 0x10, 0x9b, 0x19, 0x2a, + 0xb6, 0x29, 0x57, 0xe3, 0xe5, 0x3d, 0x9b, 0x9f, 0xf0, 0x02, 0x5d, + 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, + 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, + 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, + 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xc4, 0xa7, + 0xb1, 0xa4, 0x7b, 0x2c, 0x71, 0xfa, 0xdb, 0xe1, 0x4b, 0x90, 0x75, + 0xff, 0xc4, 0x15, 0x60, 0x85, 0x89, 0x10, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x01, 0x00, 0xa3, 0x1a, 0x2c, 0x9b, 0x17, 0x00, + 0x5c, 0xa9, 0x1e, 0xee, 0x28, 0x66, 0x37, 0x3a, 0xbf, 0x83, 0xc7, + 0x3f, 0x4b, 0xc3, 0x09, 0xa0, 0x95, 0x20, 0x5d, 0xe3, 0xd9, 0x59, + 0x44, 0xd2, 0x3e, 0x0d, 0x3e, 0xbd, 0x8a, 0x4b, 0xa0, 0x74, 0x1f, + 0xce, 0x10, 0x82, 0x9c, 0x74, 0x1a, 0x1d, 0x7e, 0x98, 0x1a, 0xdd, + 0xcb, 0x13, 0x4b, 0xb3, 0x20, 0x44, 0xe4, 0x91, 0xe9, 0xcc, 0xfc, + 0x7d, 0xa5, 0xdb, 0x6a, 0xe5, 0xfe, 0xe6, 0xfd, 0xe0, 0x4e, 0xdd, + 0xb7, 0x00, 0x3a, 0xb5, 0x70, 0x49, 0xaf, 0xf2, 0xe5, 0xeb, 0x02, + 0xf1, 0xd1, 0x02, 0x8b, 0x19, 0xcb, 0x94, 0x3a, 0x5e, 0x48, 0xc4, + 0x18, 0x1e, 0x58, 0x19, 0x5f, 0x1e, 0x02, 0x5a, 0xf0, 0x0c, 0xf1, + 0xb1, 0xad, 0xa9, 0xdc, 0x59, 0x86, 0x8b, 0x6e, 0xe9, 0x91, 0xf5, + 0x86, 0xca, 0xfa, 0xb9, 0x66, 0x33, 0xaa, 0x59, 0x5b, 0xce, 0xe2, + 0xa7, 0x16, 0x73, 0x47, 0xcb, 0x2b, 0xcc, 0x99, 0xb0, 0x37, 0x48, + 0xcf, 0xe3, 0x56, 0x4b, 0xf5, 0xcf, 0x0f, 0x0c, 0x72, 0x32, 0x87, + 0xc6, 0xf0, 0x44, 0xbb, 0x53, 0x72, 0x6d, 0x43, 0xf5, 0x26, 0x48, + 0x9a, 0x52, 0x67, 0xb7, 0x58, 0xab, 0xfe, 0x67, 0x76, 0x71, 0x78, + 0xdb, 0x0d, 0xa2, 0x56, 0x14, 0x13, 0x39, 0x24, 0x31, 0x85, 0xa2, + 0xa8, 0x02, 0x5a, 0x30, 0x47, 0xe1, 0xdd, 0x50, 0x07, 0xbc, 0x02, + 0x09, 0x90, 0x00, 0xeb, 0x64, 0x63, 0x60, 0x9b, 0x16, 0xbc, 0x88, + 0xc9, 0x12, 0xe6, 0xd2, 0x7d, 0x91, 0x8b, 0xf9, 0x3d, 0x32, 0x8d, + 0x65, 0xb4, 0xe9, 0x7c, 0xb1, 0x57, 0x76, 0xea, 0xc5, 0xb6, 0x28, + 0x39, 0xbf, 0x15, 0x65, 0x1c, 0xc8, 0xf6, 0x77, 0x96, 0x6a, 0x0a, + 0x8d, 0x77, 0x0b, 0xd8, 0x91, 0x0b, 0x04, 0x8e, 0x07, 0xdb, 0x29, + 0xb6, 0x0a, 0xee, 0x9d, 0x82, 0x35, 0x35, 0x10, 0x30, 0x82, 0x04, + 0x09, 0x30, 0x82, 0x02, 0xf1, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, + 0x10, 0x0d, 0x5e, 0x99, 0x0a, 0xd6, 0x9d, 0xb7, 0x78, 0xec, 0xd8, + 0x07, 0x56, 0x3b, 0x86, 0x15, 0xd9, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, + 0x5b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x55, 0x53, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x13, 0x17, 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, + 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, + 0x04, 0x0b, 0x13, 0x08, 0x44, 0x53, 0x54, 0x20, 0x41, 0x43, 0x45, + 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, + 0x0e, 0x44, 0x53, 0x54, 0x20, 0x41, 0x43, 0x45, 0x53, 0x20, 0x43, + 0x41, 0x20, 0x58, 0x36, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x33, 0x31, + 0x31, 0x32, 0x30, 0x32, 0x31, 0x31, 0x39, 0x35, 0x38, 0x5a, 0x17, + 0x0d, 0x31, 0x37, 0x31, 0x31, 0x32, 0x30, 0x32, 0x31, 0x31, 0x39, + 0x35, 0x38, 0x5a, 0x30, 0x5b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x17, 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, @@ -6322,1315 +4534,1021 @@ static const unsigned char ca_bundle_data[] = { 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x08, 0x44, 0x53, 0x54, 0x20, 0x41, 0x43, 0x45, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0e, 0x44, 0x53, 0x54, 0x20, 0x41, 0x43, - 0x45, 0x53, 0x20, 0x43, 0x41, 0x20, 0x58, 0x36, 0x30, 0x1e, 0x17, - 0x0d, 0x30, 0x33, 0x31, 0x31, 0x32, 0x30, 0x32, 0x31, 0x31, 0x39, - 0x35, 0x38, 0x5a, 0x17, 0x0d, 0x31, 0x37, 0x31, 0x31, 0x32, 0x30, - 0x32, 0x31, 0x31, 0x39, 0x35, 0x38, 0x5a, 0x30, 0x5b, 0x31, 0x0b, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, - 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x17, - 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, - 0x08, 0x44, 0x53, 0x54, 0x20, 0x41, 0x43, 0x45, 0x53, 0x31, 0x17, - 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0e, 0x44, 0x53, - 0x54, 0x20, 0x41, 0x43, 0x45, 0x53, 0x20, 0x43, 0x41, 0x20, 0x58, - 0x36, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, - 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, - 0x00, 0xb9, 0x3d, 0xf5, 0x2c, 0xc9, 0x94, 0xdc, 0x75, 0x8a, 0x95, - 0x5d, 0x63, 0xe8, 0x84, 0x77, 0x76, 0x66, 0xb9, 0x59, 0x91, 0x5c, - 0x46, 0xdd, 0x92, 0x3e, 0x9f, 0xf9, 0x0e, 0x03, 0xb4, 0x3d, 0x61, - 0x92, 0xbd, 0x23, 0x26, 0xb5, 0x63, 0xee, 0x92, 0xd2, 0x9e, 0xd6, - 0x3c, 0xc8, 0x0d, 0x90, 0x5f, 0x64, 0x81, 0xb1, 0xa8, 0x08, 0x0d, - 0x4c, 0xd8, 0xf9, 0xd3, 0x05, 0x28, 0x52, 0xb4, 0x01, 0x25, 0xc5, - 0x95, 0x1c, 0x0c, 0x7e, 0x3e, 0x10, 0x84, 0x75, 0xcf, 0xc1, 0x19, - 0x91, 0x63, 0xcf, 0xe8, 0xa8, 0x91, 0x88, 0xb9, 0x43, 0x52, 0xbb, - 0x80, 0xb1, 0x55, 0x89, 0x8b, 0x31, 0xfa, 0xd0, 0xb7, 0x76, 0xbe, - 0x41, 0x3d, 0x30, 0x9a, 0xa4, 0x22, 0x25, 0x17, 0x73, 0xe8, 0x1e, - 0xe2, 0xd3, 0xac, 0x2a, 0xbd, 0x5b, 0x38, 0x21, 0xd5, 0x2a, 0x4b, - 0xd7, 0x55, 0x7d, 0xe3, 0x3a, 0x55, 0xbd, 0xd7, 0x6d, 0x6b, 0x02, - 0x57, 0x6b, 0xe6, 0x47, 0x7c, 0x08, 0xc8, 0x82, 0xba, 0xde, 0xa7, - 0x87, 0x3d, 0xa1, 0x6d, 0xb8, 0x30, 0x56, 0xc2, 0xb3, 0x02, 0x81, - 0x5f, 0x2d, 0xf5, 0xe2, 0x9a, 0x30, 0x18, 0x28, 0xb8, 0x66, 0xd3, - 0xcb, 0x01, 0x96, 0x6f, 0xea, 0x8a, 0x45, 0x55, 0xd6, 0xe0, 0x9d, - 0xff, 0x67, 0x2b, 0x17, 0x02, 0xa6, 0x4e, 0x1a, 0x6a, 0x11, 0x0b, - 0x7e, 0xb7, 0x7b, 0xe7, 0x98, 0xd6, 0x8c, 0x76, 0x6f, 0xc1, 0x3b, - 0xdb, 0x50, 0x93, 0x7e, 0xe5, 0xd0, 0x8e, 0x1f, 0x37, 0xb8, 0xbd, - 0xba, 0xc6, 0x9f, 0x6c, 0xe9, 0x7c, 0x33, 0xf2, 0x32, 0x3c, 0x26, - 0x47, 0xfa, 0x27, 0x24, 0x02, 0xc9, 0x7e, 0x1d, 0x5b, 0x88, 0x42, - 0x13, 0x6a, 0x35, 0x7c, 0x7d, 0x35, 0xe9, 0x2e, 0x66, 0x91, 0x72, - 0x93, 0xd5, 0x32, 0x26, 0xc4, 0x74, 0xf5, 0x53, 0xa3, 0xb3, 0x5d, - 0x9a, 0xf6, 0x09, 0xcb, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, - 0xc8, 0x30, 0x81, 0xc5, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, - 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, - 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, - 0x03, 0x02, 0x01, 0xc6, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x11, - 0x04, 0x18, 0x30, 0x16, 0x81, 0x14, 0x70, 0x6b, 0x69, 0x2d, 0x6f, - 0x70, 0x73, 0x40, 0x74, 0x72, 0x75, 0x73, 0x74, 0x64, 0x73, 0x74, - 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x62, 0x06, 0x03, 0x55, 0x1d, 0x20, - 0x04, 0x5b, 0x30, 0x59, 0x30, 0x57, 0x06, 0x0a, 0x60, 0x86, 0x48, - 0x01, 0x65, 0x03, 0x02, 0x01, 0x01, 0x01, 0x30, 0x49, 0x30, 0x47, - 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, - 0x3b, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, - 0x2e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x64, 0x73, 0x74, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x73, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x2f, 0x41, 0x43, 0x45, 0x53, 0x2d, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, - 0x0e, 0x04, 0x16, 0x04, 0x14, 0x09, 0x72, 0x06, 0x4e, 0x18, 0x43, - 0x0f, 0xe5, 0xd6, 0xcc, 0xc3, 0x6a, 0x8b, 0x31, 0x7b, 0x78, 0x8f, - 0xa8, 0x83, 0xb8, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, - 0x00, 0xa3, 0xd8, 0x8e, 0xd6, 0xb2, 0xdb, 0xce, 0x05, 0xe7, 0x32, - 0xcd, 0x01, 0xd3, 0x04, 0x03, 0xe5, 0x76, 0xe4, 0x56, 0x2b, 0x9c, - 0x99, 0x90, 0xe8, 0x08, 0x30, 0x6c, 0xdf, 0x7d, 0x3d, 0xee, 0xe5, - 0xbf, 0xb5, 0x24, 0x40, 0x84, 0x49, 0xe1, 0xd1, 0x28, 0xae, 0xc4, - 0xc2, 0x3a, 0x53, 0x30, 0x88, 0xf1, 0xf5, 0x77, 0x6e, 0x51, 0xca, - 0xfa, 0xff, 0x99, 0xaf, 0x24, 0x5f, 0x1b, 0xa0, 0xfd, 0xf2, 0xac, - 0x84, 0xca, 0xdf, 0xa9, 0xf0, 0x5f, 0x04, 0x2e, 0xad, 0x16, 0xbf, - 0x21, 0x97, 0x10, 0x81, 0x3d, 0xe3, 0xff, 0x87, 0x8d, 0x32, 0xdc, - 0x94, 0xe5, 0x47, 0x8a, 0x5e, 0x6a, 0x13, 0xc9, 0x94, 0x95, 0x3d, - 0xd2, 0xee, 0xc8, 0x34, 0x95, 0xd0, 0x80, 0xd4, 0xad, 0x32, 0x08, - 0x80, 0x54, 0x3c, 0xe0, 0xbd, 0x52, 0x53, 0xd7, 0x52, 0x7c, 0xb2, - 0x69, 0x3f, 0x7f, 0x7a, 0xcf, 0x6a, 0x74, 0xca, 0xfa, 0x04, 0x2a, - 0x9c, 0x4c, 0x5a, 0x06, 0xa5, 0xe9, 0x20, 0xad, 0x45, 0x66, 0x0f, - 0x69, 0xf1, 0xdd, 0xbf, 0xe9, 0xe3, 0x32, 0x8b, 0xfa, 0xe0, 0xc1, - 0x86, 0x4d, 0x72, 0x3c, 0x2e, 0xd8, 0x93, 0x78, 0x0a, 0x2a, 0xf8, - 0xd8, 0xd2, 0x27, 0x3d, 0x19, 0x89, 0x5f, 0x5a, 0x7b, 0x8a, 0x3b, - 0xcc, 0x0c, 0xda, 0x51, 0xae, 0xc7, 0x0b, 0xf7, 0x2b, 0xb0, 0x37, - 0x05, 0xec, 0xbc, 0x57, 0x23, 0xe2, 0x38, 0xd2, 0x9b, 0x68, 0xf3, - 0x56, 0x12, 0x88, 0x4f, 0x42, 0x7c, 0xb8, 0x31, 0xc4, 0xb5, 0xdb, - 0xe4, 0xc8, 0x21, 0x34, 0xe9, 0x48, 0x11, 0x35, 0xee, 0xfa, 0xc7, - 0x92, 0x57, 0xc5, 0x9f, 0x34, 0xe4, 0xc7, 0xf6, 0xf7, 0x0e, 0x0b, - 0x4c, 0x9c, 0x68, 0x78, 0x7b, 0x71, 0x31, 0xc7, 0xeb, 0x1e, 0xe0, - 0x67, 0x41, 0xf3, 0xb7, 0xa0, 0xa7, 0xcd, 0xe5, 0x7a, 0x33, 0x36, - 0x6a, 0xfa, 0x9a, 0x2b, 0x30, 0x82, 0x03, 0xfb, 0x30, 0x82, 0x02, - 0xe3, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, - 0x05, 0x00, 0x30, 0x81, 0xb7, 0x31, 0x3f, 0x30, 0x3d, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x0c, 0x36, 0x54, 0xc3, 0x9c, 0x52, 0x4b, 0x54, - 0x52, 0x55, 0x53, 0x54, 0x20, 0x45, 0x6c, 0x65, 0x6b, 0x74, 0x72, - 0x6f, 0x6e, 0x69, 0x6b, 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x6b, 0x61, 0x20, 0x48, 0x69, 0x7a, 0x6d, 0x65, 0x74, 0x20, - 0x53, 0x61, 0xc4, 0x9f, 0x6c, 0x61, 0x79, 0xc4, 0xb1, 0x63, 0xc4, - 0xb1, 0x73, 0xc4, 0xb1, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x0c, 0x02, 0x54, 0x52, 0x31, 0x0f, 0x30, 0x0d, 0x06, - 0x03, 0x55, 0x04, 0x07, 0x0c, 0x06, 0x41, 0x4e, 0x4b, 0x41, 0x52, - 0x41, 0x31, 0x56, 0x30, 0x54, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, - 0x4d, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x35, 0x20, 0x54, - 0xc3, 0x9c, 0x52, 0x4b, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x42, - 0x69, 0x6c, 0x67, 0x69, 0x20, 0xc4, 0xb0, 0x6c, 0x65, 0x74, 0x69, - 0xc5, 0x9f, 0x69, 0x6d, 0x20, 0x76, 0x65, 0x20, 0x42, 0x69, 0x6c, - 0x69, 0xc5, 0x9f, 0x69, 0x6d, 0x20, 0x47, 0xc3, 0xbc, 0x76, 0x65, - 0x6e, 0x6c, 0x69, 0xc4, 0x9f, 0x69, 0x20, 0x48, 0x69, 0x7a, 0x6d, - 0x65, 0x74, 0x6c, 0x65, 0x72, 0x69, 0x20, 0x41, 0x2e, 0xc5, 0x9e, - 0x2e, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x35, 0x30, 0x35, 0x31, 0x33, - 0x31, 0x30, 0x32, 0x37, 0x31, 0x37, 0x5a, 0x17, 0x0d, 0x31, 0x35, - 0x30, 0x33, 0x32, 0x32, 0x31, 0x30, 0x32, 0x37, 0x31, 0x37, 0x5a, - 0x30, 0x81, 0xb7, 0x31, 0x3f, 0x30, 0x3d, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x0c, 0x36, 0x54, 0xc3, 0x9c, 0x52, 0x4b, 0x54, 0x52, 0x55, - 0x53, 0x54, 0x20, 0x45, 0x6c, 0x65, 0x6b, 0x74, 0x72, 0x6f, 0x6e, - 0x69, 0x6b, 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x6b, - 0x61, 0x20, 0x48, 0x69, 0x7a, 0x6d, 0x65, 0x74, 0x20, 0x53, 0x61, - 0xc4, 0x9f, 0x6c, 0x61, 0x79, 0xc4, 0xb1, 0x63, 0xc4, 0xb1, 0x73, - 0xc4, 0xb1, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x0c, 0x02, 0x54, 0x52, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, - 0x04, 0x07, 0x0c, 0x06, 0x41, 0x4e, 0x4b, 0x41, 0x52, 0x41, 0x31, - 0x56, 0x30, 0x54, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x4d, 0x28, - 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x35, 0x20, 0x54, 0xc3, 0x9c, - 0x52, 0x4b, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x42, 0x69, 0x6c, - 0x67, 0x69, 0x20, 0xc4, 0xb0, 0x6c, 0x65, 0x74, 0x69, 0xc5, 0x9f, - 0x69, 0x6d, 0x20, 0x76, 0x65, 0x20, 0x42, 0x69, 0x6c, 0x69, 0xc5, - 0x9f, 0x69, 0x6d, 0x20, 0x47, 0xc3, 0xbc, 0x76, 0x65, 0x6e, 0x6c, - 0x69, 0xc4, 0x9f, 0x69, 0x20, 0x48, 0x69, 0x7a, 0x6d, 0x65, 0x74, - 0x6c, 0x65, 0x72, 0x69, 0x20, 0x41, 0x2e, 0xc5, 0x9e, 0x2e, 0x30, - 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, - 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xca, - 0x52, 0x05, 0xd6, 0x63, 0x03, 0xd8, 0x1c, 0x5f, 0xdd, 0xd2, 0x7b, - 0x5d, 0xf2, 0x0c, 0x60, 0x61, 0x5b, 0x6b, 0x3b, 0x74, 0x2b, 0x78, - 0x0d, 0x7d, 0x45, 0xbd, 0x22, 0x74, 0xe8, 0x8c, 0x03, 0xc1, 0xc6, - 0x11, 0x2a, 0x3d, 0x95, 0xbc, 0xa9, 0x94, 0xb0, 0xbb, 0x91, 0x97, - 0xc8, 0x69, 0x7c, 0x84, 0xc5, 0xb4, 0x91, 0x6c, 0x6c, 0x13, 0x6a, - 0xa4, 0x55, 0xad, 0xa4, 0x85, 0xe8, 0x95, 0x7e, 0xb3, 0x00, 0xaf, - 0x00, 0xc2, 0x05, 0x18, 0xf5, 0x70, 0x9d, 0x36, 0x8b, 0xae, 0xcb, - 0xe4, 0x1b, 0x81, 0x7f, 0x93, 0x88, 0xfb, 0x6a, 0x55, 0xbb, 0x7d, - 0x85, 0x92, 0xce, 0xba, 0x58, 0x9f, 0xdb, 0x32, 0xc5, 0xbd, 0x5d, - 0xef, 0x22, 0x4a, 0x2f, 0x41, 0x07, 0x7e, 0x49, 0x61, 0xb3, 0x86, - 0xec, 0x4e, 0xa6, 0x41, 0x6e, 0x84, 0xbc, 0x03, 0xec, 0xf5, 0x3b, - 0x1c, 0xc8, 0x1f, 0xc2, 0xee, 0xa8, 0xee, 0xea, 0x12, 0x4a, 0x8d, - 0x14, 0xcf, 0xf3, 0x0a, 0xe0, 0x50, 0x39, 0xf9, 0x08, 0x35, 0xf8, - 0x11, 0x59, 0xad, 0xe7, 0x22, 0xea, 0x4b, 0xca, 0x14, 0x06, 0xde, - 0x42, 0xba, 0xb2, 0x99, 0xf3, 0x2d, 0x54, 0x88, 0x10, 0x06, 0xea, - 0xe1, 0x1a, 0x3e, 0x3d, 0x67, 0x1f, 0xfb, 0xce, 0xfb, 0x7c, 0x82, - 0xe8, 0x11, 0x5d, 0x4a, 0xc1, 0xb9, 0x14, 0xea, 0x54, 0xd9, 0x66, - 0x9b, 0x7c, 0x89, 0x7d, 0x04, 0x9a, 0x62, 0xc9, 0xe9, 0x52, 0x3c, - 0x9e, 0x9c, 0xef, 0xd2, 0xf5, 0x26, 0xe4, 0xe6, 0xe5, 0x18, 0x7c, - 0x8b, 0x6e, 0xdf, 0x6c, 0xcc, 0x78, 0x5b, 0x4f, 0x72, 0xb2, 0xcb, - 0x5c, 0x3f, 0x8c, 0x05, 0x8d, 0xd1, 0x4c, 0x8c, 0xad, 0x92, 0xc7, - 0xe1, 0x78, 0x7f, 0x65, 0x6c, 0x49, 0x06, 0x50, 0x2c, 0x9e, 0x32, - 0xc2, 0xd7, 0x4a, 0xc6, 0x75, 0x8a, 0x59, 0x4e, 0x75, 0x6f, 0x47, - 0x5e, 0xc1, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x10, 0x30, 0x0e, - 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, - 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, - 0x00, 0x15, 0xf5, 0x55, 0xff, 0x37, 0x96, 0x80, 0x59, 0x21, 0xa4, - 0xfc, 0xa1, 0x15, 0x4c, 0x20, 0xf6, 0xd4, 0x5f, 0xda, 0x03, 0x24, - 0xfc, 0xcf, 0x90, 0x1a, 0xf4, 0x21, 0x0a, 0x9a, 0xee, 0x3a, 0xb1, - 0x6a, 0xef, 0xef, 0xf8, 0x60, 0xd1, 0x4c, 0x36, 0x66, 0x45, 0x1d, - 0xf3, 0x66, 0x02, 0x74, 0x04, 0x7b, 0x92, 0x30, 0xa8, 0xde, 0x0a, - 0x76, 0x0f, 0xef, 0x95, 0x6e, 0xbd, 0xc9, 0x37, 0xe6, 0x1a, 0x0d, - 0xac, 0x89, 0x48, 0x5b, 0xcc, 0x83, 0x36, 0xc2, 0xf5, 0x46, 0x5c, - 0x59, 0x82, 0x56, 0xb4, 0xd5, 0xfe, 0x23, 0xb4, 0xd8, 0x54, 0x1c, - 0x44, 0xab, 0xc4, 0xa7, 0xe5, 0x14, 0xce, 0x3c, 0x41, 0x61, 0x7c, - 0x43, 0xe6, 0xcd, 0xc4, 0x81, 0x09, 0x8b, 0x24, 0xfb, 0x54, 0x25, - 0xd6, 0x16, 0xa8, 0x96, 0x0c, 0x67, 0x07, 0x6f, 0xb3, 0x50, 0x47, - 0xe3, 0x1c, 0x24, 0x28, 0xdd, 0x2a, 0x98, 0xa4, 0x61, 0xfe, 0xdb, - 0xea, 0x12, 0x37, 0xbc, 0x01, 0x1a, 0x34, 0x85, 0xbd, 0x6e, 0x4f, - 0xe7, 0x91, 0x72, 0x07, 0x44, 0x85, 0x1e, 0x58, 0xca, 0x54, 0x44, - 0xdd, 0xf7, 0xac, 0xb9, 0xcb, 0x89, 0x21, 0x72, 0xdb, 0x8f, 0xc0, - 0x69, 0x29, 0x97, 0x2a, 0xa3, 0xae, 0x18, 0x23, 0x97, 0x1c, 0x41, - 0x2a, 0x8b, 0x7c, 0x2a, 0xc1, 0x7c, 0x90, 0xe8, 0xa9, 0x28, 0xc0, - 0xd3, 0x91, 0xc6, 0xad, 0x28, 0x87, 0x40, 0x68, 0xb5, 0xff, 0xec, - 0xa7, 0xd2, 0xd3, 0x38, 0x18, 0x9c, 0xd3, 0x7d, 0x69, 0x5d, 0xf0, - 0xc6, 0xa5, 0x1e, 0x24, 0x1b, 0xa3, 0x47, 0xfc, 0x69, 0x07, 0x68, - 0xe7, 0xe4, 0x9a, 0xb4, 0xed, 0x0f, 0xa1, 0x87, 0x87, 0x02, 0xce, - 0x87, 0xd2, 0x48, 0x4e, 0xe1, 0xbc, 0xff, 0xcb, 0xf1, 0x72, 0x92, - 0x44, 0x64, 0x03, 0x25, 0xea, 0xde, 0x5b, 0x6e, 0x9f, 0xc9, 0xf2, - 0x4e, 0xac, 0xdd, 0xc7, 0x30, 0x82, 0x04, 0x3c, 0x30, 0x82, 0x03, - 0x24, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, - 0x05, 0x00, 0x30, 0x81, 0xbe, 0x31, 0x3f, 0x30, 0x3d, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x0c, 0x36, 0x54, 0xc3, 0x9c, 0x52, 0x4b, 0x54, - 0x52, 0x55, 0x53, 0x54, 0x20, 0x45, 0x6c, 0x65, 0x6b, 0x74, 0x72, - 0x6f, 0x6e, 0x69, 0x6b, 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x6b, 0x61, 0x20, 0x48, 0x69, 0x7a, 0x6d, 0x65, 0x74, 0x20, - 0x53, 0x61, 0xc4, 0x9f, 0x6c, 0x61, 0x79, 0xc4, 0xb1, 0x63, 0xc4, - 0xb1, 0x73, 0xc4, 0xb1, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x54, 0x52, 0x31, 0x0f, 0x30, 0x0d, 0x06, - 0x03, 0x55, 0x04, 0x07, 0x0c, 0x06, 0x41, 0x6e, 0x6b, 0x61, 0x72, - 0x61, 0x31, 0x5d, 0x30, 0x5b, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, - 0x54, 0x54, 0xc3, 0x9c, 0x52, 0x4b, 0x54, 0x52, 0x55, 0x53, 0x54, - 0x20, 0x42, 0x69, 0x6c, 0x67, 0x69, 0x20, 0xc4, 0xb0, 0x6c, 0x65, - 0x74, 0x69, 0xc5, 0x9f, 0x69, 0x6d, 0x20, 0x76, 0x65, 0x20, 0x42, - 0x69, 0x6c, 0x69, 0xc5, 0x9f, 0x69, 0x6d, 0x20, 0x47, 0xc3, 0xbc, - 0x76, 0x65, 0x6e, 0x6c, 0x69, 0xc4, 0x9f, 0x69, 0x20, 0x48, 0x69, - 0x7a, 0x6d, 0x65, 0x74, 0x6c, 0x65, 0x72, 0x69, 0x20, 0x41, 0x2e, - 0xc5, 0x9e, 0x2e, 0x20, 0x28, 0x63, 0x29, 0x20, 0x4b, 0x61, 0x73, - 0xc4, 0xb1, 0x6d, 0x20, 0x32, 0x30, 0x30, 0x35, 0x30, 0x1e, 0x17, - 0x0d, 0x30, 0x35, 0x31, 0x31, 0x30, 0x37, 0x31, 0x30, 0x30, 0x37, - 0x35, 0x37, 0x5a, 0x17, 0x0d, 0x31, 0x35, 0x30, 0x39, 0x31, 0x36, - 0x31, 0x30, 0x30, 0x37, 0x35, 0x37, 0x5a, 0x30, 0x81, 0xbe, 0x31, + 0x45, 0x53, 0x20, 0x43, 0x41, 0x20, 0x58, 0x36, 0x30, 0x82, 0x01, + 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, + 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb9, 0x3d, 0xf5, + 0x2c, 0xc9, 0x94, 0xdc, 0x75, 0x8a, 0x95, 0x5d, 0x63, 0xe8, 0x84, + 0x77, 0x76, 0x66, 0xb9, 0x59, 0x91, 0x5c, 0x46, 0xdd, 0x92, 0x3e, + 0x9f, 0xf9, 0x0e, 0x03, 0xb4, 0x3d, 0x61, 0x92, 0xbd, 0x23, 0x26, + 0xb5, 0x63, 0xee, 0x92, 0xd2, 0x9e, 0xd6, 0x3c, 0xc8, 0x0d, 0x90, + 0x5f, 0x64, 0x81, 0xb1, 0xa8, 0x08, 0x0d, 0x4c, 0xd8, 0xf9, 0xd3, + 0x05, 0x28, 0x52, 0xb4, 0x01, 0x25, 0xc5, 0x95, 0x1c, 0x0c, 0x7e, + 0x3e, 0x10, 0x84, 0x75, 0xcf, 0xc1, 0x19, 0x91, 0x63, 0xcf, 0xe8, + 0xa8, 0x91, 0x88, 0xb9, 0x43, 0x52, 0xbb, 0x80, 0xb1, 0x55, 0x89, + 0x8b, 0x31, 0xfa, 0xd0, 0xb7, 0x76, 0xbe, 0x41, 0x3d, 0x30, 0x9a, + 0xa4, 0x22, 0x25, 0x17, 0x73, 0xe8, 0x1e, 0xe2, 0xd3, 0xac, 0x2a, + 0xbd, 0x5b, 0x38, 0x21, 0xd5, 0x2a, 0x4b, 0xd7, 0x55, 0x7d, 0xe3, + 0x3a, 0x55, 0xbd, 0xd7, 0x6d, 0x6b, 0x02, 0x57, 0x6b, 0xe6, 0x47, + 0x7c, 0x08, 0xc8, 0x82, 0xba, 0xde, 0xa7, 0x87, 0x3d, 0xa1, 0x6d, + 0xb8, 0x30, 0x56, 0xc2, 0xb3, 0x02, 0x81, 0x5f, 0x2d, 0xf5, 0xe2, + 0x9a, 0x30, 0x18, 0x28, 0xb8, 0x66, 0xd3, 0xcb, 0x01, 0x96, 0x6f, + 0xea, 0x8a, 0x45, 0x55, 0xd6, 0xe0, 0x9d, 0xff, 0x67, 0x2b, 0x17, + 0x02, 0xa6, 0x4e, 0x1a, 0x6a, 0x11, 0x0b, 0x7e, 0xb7, 0x7b, 0xe7, + 0x98, 0xd6, 0x8c, 0x76, 0x6f, 0xc1, 0x3b, 0xdb, 0x50, 0x93, 0x7e, + 0xe5, 0xd0, 0x8e, 0x1f, 0x37, 0xb8, 0xbd, 0xba, 0xc6, 0x9f, 0x6c, + 0xe9, 0x7c, 0x33, 0xf2, 0x32, 0x3c, 0x26, 0x47, 0xfa, 0x27, 0x24, + 0x02, 0xc9, 0x7e, 0x1d, 0x5b, 0x88, 0x42, 0x13, 0x6a, 0x35, 0x7c, + 0x7d, 0x35, 0xe9, 0x2e, 0x66, 0x91, 0x72, 0x93, 0xd5, 0x32, 0x26, + 0xc4, 0x74, 0xf5, 0x53, 0xa3, 0xb3, 0x5d, 0x9a, 0xf6, 0x09, 0xcb, + 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xc8, 0x30, 0x81, 0xc5, + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, + 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0xc6, + 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x18, 0x30, 0x16, + 0x81, 0x14, 0x70, 0x6b, 0x69, 0x2d, 0x6f, 0x70, 0x73, 0x40, 0x74, + 0x72, 0x75, 0x73, 0x74, 0x64, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x6d, + 0x30, 0x62, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x5b, 0x30, 0x59, + 0x30, 0x57, 0x06, 0x0a, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x02, + 0x01, 0x01, 0x01, 0x30, 0x49, 0x30, 0x47, 0x06, 0x08, 0x2b, 0x06, + 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x3b, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74, 0x72, 0x75, + 0x73, 0x74, 0x64, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, + 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2f, 0x41, 0x43, 0x45, + 0x53, 0x2d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, + 0x6c, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, + 0x14, 0x09, 0x72, 0x06, 0x4e, 0x18, 0x43, 0x0f, 0xe5, 0xd6, 0xcc, + 0xc3, 0x6a, 0x8b, 0x31, 0x7b, 0x78, 0x8f, 0xa8, 0x83, 0xb8, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xa3, 0xd8, 0x8e, + 0xd6, 0xb2, 0xdb, 0xce, 0x05, 0xe7, 0x32, 0xcd, 0x01, 0xd3, 0x04, + 0x03, 0xe5, 0x76, 0xe4, 0x56, 0x2b, 0x9c, 0x99, 0x90, 0xe8, 0x08, + 0x30, 0x6c, 0xdf, 0x7d, 0x3d, 0xee, 0xe5, 0xbf, 0xb5, 0x24, 0x40, + 0x84, 0x49, 0xe1, 0xd1, 0x28, 0xae, 0xc4, 0xc2, 0x3a, 0x53, 0x30, + 0x88, 0xf1, 0xf5, 0x77, 0x6e, 0x51, 0xca, 0xfa, 0xff, 0x99, 0xaf, + 0x24, 0x5f, 0x1b, 0xa0, 0xfd, 0xf2, 0xac, 0x84, 0xca, 0xdf, 0xa9, + 0xf0, 0x5f, 0x04, 0x2e, 0xad, 0x16, 0xbf, 0x21, 0x97, 0x10, 0x81, + 0x3d, 0xe3, 0xff, 0x87, 0x8d, 0x32, 0xdc, 0x94, 0xe5, 0x47, 0x8a, + 0x5e, 0x6a, 0x13, 0xc9, 0x94, 0x95, 0x3d, 0xd2, 0xee, 0xc8, 0x34, + 0x95, 0xd0, 0x80, 0xd4, 0xad, 0x32, 0x08, 0x80, 0x54, 0x3c, 0xe0, + 0xbd, 0x52, 0x53, 0xd7, 0x52, 0x7c, 0xb2, 0x69, 0x3f, 0x7f, 0x7a, + 0xcf, 0x6a, 0x74, 0xca, 0xfa, 0x04, 0x2a, 0x9c, 0x4c, 0x5a, 0x06, + 0xa5, 0xe9, 0x20, 0xad, 0x45, 0x66, 0x0f, 0x69, 0xf1, 0xdd, 0xbf, + 0xe9, 0xe3, 0x32, 0x8b, 0xfa, 0xe0, 0xc1, 0x86, 0x4d, 0x72, 0x3c, + 0x2e, 0xd8, 0x93, 0x78, 0x0a, 0x2a, 0xf8, 0xd8, 0xd2, 0x27, 0x3d, + 0x19, 0x89, 0x5f, 0x5a, 0x7b, 0x8a, 0x3b, 0xcc, 0x0c, 0xda, 0x51, + 0xae, 0xc7, 0x0b, 0xf7, 0x2b, 0xb0, 0x37, 0x05, 0xec, 0xbc, 0x57, + 0x23, 0xe2, 0x38, 0xd2, 0x9b, 0x68, 0xf3, 0x56, 0x12, 0x88, 0x4f, + 0x42, 0x7c, 0xb8, 0x31, 0xc4, 0xb5, 0xdb, 0xe4, 0xc8, 0x21, 0x34, + 0xe9, 0x48, 0x11, 0x35, 0xee, 0xfa, 0xc7, 0x92, 0x57, 0xc5, 0x9f, + 0x34, 0xe4, 0xc7, 0xf6, 0xf7, 0x0e, 0x0b, 0x4c, 0x9c, 0x68, 0x78, + 0x7b, 0x71, 0x31, 0xc7, 0xeb, 0x1e, 0xe0, 0x67, 0x41, 0xf3, 0xb7, + 0xa0, 0xa7, 0xcd, 0xe5, 0x7a, 0x33, 0x36, 0x6a, 0xfa, 0x9a, 0x2b, + 0x30, 0x82, 0x03, 0xfb, 0x30, 0x82, 0x02, 0xe3, 0xa0, 0x03, 0x02, + 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, + 0xb7, 0x31, 0x3f, 0x30, 0x3d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, + 0x36, 0x54, 0xc3, 0x9c, 0x52, 0x4b, 0x54, 0x52, 0x55, 0x53, 0x54, + 0x20, 0x45, 0x6c, 0x65, 0x6b, 0x74, 0x72, 0x6f, 0x6e, 0x69, 0x6b, + 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x6b, 0x61, 0x20, + 0x48, 0x69, 0x7a, 0x6d, 0x65, 0x74, 0x20, 0x53, 0x61, 0xc4, 0x9f, + 0x6c, 0x61, 0x79, 0xc4, 0xb1, 0x63, 0xc4, 0xb1, 0x73, 0xc4, 0xb1, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x0c, 0x02, + 0x54, 0x52, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x07, + 0x0c, 0x06, 0x41, 0x4e, 0x4b, 0x41, 0x52, 0x41, 0x31, 0x56, 0x30, + 0x54, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x4d, 0x28, 0x63, 0x29, + 0x20, 0x32, 0x30, 0x30, 0x35, 0x20, 0x54, 0xc3, 0x9c, 0x52, 0x4b, + 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x42, 0x69, 0x6c, 0x67, 0x69, + 0x20, 0xc4, 0xb0, 0x6c, 0x65, 0x74, 0x69, 0xc5, 0x9f, 0x69, 0x6d, + 0x20, 0x76, 0x65, 0x20, 0x42, 0x69, 0x6c, 0x69, 0xc5, 0x9f, 0x69, + 0x6d, 0x20, 0x47, 0xc3, 0xbc, 0x76, 0x65, 0x6e, 0x6c, 0x69, 0xc4, + 0x9f, 0x69, 0x20, 0x48, 0x69, 0x7a, 0x6d, 0x65, 0x74, 0x6c, 0x65, + 0x72, 0x69, 0x20, 0x41, 0x2e, 0xc5, 0x9e, 0x2e, 0x30, 0x1e, 0x17, + 0x0d, 0x30, 0x35, 0x30, 0x35, 0x31, 0x33, 0x31, 0x30, 0x32, 0x37, + 0x31, 0x37, 0x5a, 0x17, 0x0d, 0x31, 0x35, 0x30, 0x33, 0x32, 0x32, + 0x31, 0x30, 0x32, 0x37, 0x31, 0x37, 0x5a, 0x30, 0x81, 0xb7, 0x31, 0x3f, 0x30, 0x3d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x36, 0x54, 0xc3, 0x9c, 0x52, 0x4b, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x45, 0x6c, 0x65, 0x6b, 0x74, 0x72, 0x6f, 0x6e, 0x69, 0x6b, 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x6b, 0x61, 0x20, 0x48, 0x69, 0x7a, 0x6d, 0x65, 0x74, 0x20, 0x53, 0x61, 0xc4, 0x9f, 0x6c, 0x61, 0x79, 0xc4, 0xb1, 0x63, 0xc4, 0xb1, 0x73, 0xc4, 0xb1, 0x31, 0x0b, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x54, 0x52, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x0c, 0x02, 0x54, 0x52, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x06, - 0x41, 0x6e, 0x6b, 0x61, 0x72, 0x61, 0x31, 0x5d, 0x30, 0x5b, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x54, 0x54, 0xc3, 0x9c, 0x52, 0x4b, - 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x42, 0x69, 0x6c, 0x67, 0x69, - 0x20, 0xc4, 0xb0, 0x6c, 0x65, 0x74, 0x69, 0xc5, 0x9f, 0x69, 0x6d, - 0x20, 0x76, 0x65, 0x20, 0x42, 0x69, 0x6c, 0x69, 0xc5, 0x9f, 0x69, - 0x6d, 0x20, 0x47, 0xc3, 0xbc, 0x76, 0x65, 0x6e, 0x6c, 0x69, 0xc4, - 0x9f, 0x69, 0x20, 0x48, 0x69, 0x7a, 0x6d, 0x65, 0x74, 0x6c, 0x65, - 0x72, 0x69, 0x20, 0x41, 0x2e, 0xc5, 0x9e, 0x2e, 0x20, 0x28, 0x63, - 0x29, 0x20, 0x4b, 0x61, 0x73, 0xc4, 0xb1, 0x6d, 0x20, 0x32, 0x30, - 0x30, 0x35, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, - 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, - 0x01, 0x00, 0xa9, 0x36, 0x7e, 0xc3, 0x91, 0x43, 0x4c, 0xc3, 0x19, - 0x98, 0x08, 0xc8, 0xc7, 0x58, 0x7b, 0x4f, 0x16, 0x8c, 0xa5, 0xce, - 0x49, 0x01, 0x1f, 0x73, 0x0e, 0xac, 0x75, 0x13, 0xa6, 0xfa, 0x9e, - 0x2c, 0x20, 0xde, 0xd8, 0x90, 0x0e, 0x0a, 0xd1, 0x69, 0xd2, 0x27, - 0xfb, 0xaa, 0x77, 0x9f, 0x27, 0x52, 0x25, 0xe2, 0xcb, 0x5d, 0xd8, - 0xd8, 0x83, 0x50, 0x17, 0x7d, 0x8a, 0xb5, 0x82, 0x3f, 0x04, 0x8e, - 0xb4, 0xd5, 0xf0, 0x49, 0xa7, 0x64, 0xb7, 0x1e, 0x2e, 0x5f, 0x20, - 0x9c, 0x50, 0x75, 0x4f, 0xaf, 0xe1, 0xb5, 0x41, 0x14, 0xf4, 0x98, - 0x92, 0x88, 0xc7, 0xe5, 0xe5, 0x64, 0x47, 0x61, 0x47, 0x79, 0xfd, - 0xc0, 0x51, 0xf1, 0xc1, 0x99, 0xe7, 0xdc, 0xce, 0x6a, 0xfb, 0xaf, - 0xb5, 0x01, 0x30, 0xdc, 0x46, 0x1c, 0xef, 0x8a, 0xec, 0x95, 0xef, - 0xdc, 0xff, 0xaf, 0x10, 0x1c, 0xeb, 0x9d, 0xd8, 0xb0, 0xaa, 0x6a, - 0x85, 0x18, 0x0d, 0x17, 0xc9, 0x3e, 0xbf, 0xf1, 0x9b, 0xd0, 0x09, - 0x89, 0x42, 0xfd, 0xa0, 0x42, 0xb4, 0x9d, 0x89, 0x51, 0x55, 0x29, - 0xcf, 0x1b, 0x70, 0xbc, 0x84, 0x54, 0xad, 0xc1, 0x13, 0x1f, 0x98, - 0xf4, 0x2e, 0x76, 0x60, 0x8b, 0x5d, 0x3f, 0x9a, 0xad, 0xca, 0x0c, - 0xbf, 0xa7, 0x56, 0x5b, 0x8f, 0x77, 0xb8, 0xd5, 0x9e, 0x79, 0x49, - 0x92, 0x3f, 0xe0, 0xf1, 0x97, 0x24, 0x7a, 0x6c, 0x9b, 0x17, 0x0f, - 0x6d, 0xef, 0x53, 0x98, 0x91, 0x2b, 0xe4, 0x0f, 0xbe, 0x59, 0x79, - 0x07, 0x78, 0xbb, 0x97, 0x95, 0xf4, 0x9f, 0x69, 0xd4, 0x58, 0x87, - 0x0a, 0xa9, 0xe3, 0xcc, 0xb6, 0x58, 0x19, 0x9f, 0x26, 0x21, 0xb1, - 0xc4, 0x59, 0x8d, 0xb2, 0x41, 0x75, 0xc0, 0xad, 0x69, 0xce, 0x9c, - 0x00, 0x08, 0xf2, 0x36, 0xff, 0x3e, 0xf0, 0xa1, 0x0f, 0x1a, 0xac, - 0x14, 0xfd, 0xa6, 0x60, 0x0f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, - 0x43, 0x30, 0x41, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, - 0x16, 0x04, 0x14, 0xd9, 0x37, 0xb3, 0x4e, 0x05, 0xfd, 0xd9, 0xcf, - 0x9f, 0x12, 0x16, 0xae, 0xb6, 0x89, 0x2f, 0xeb, 0x25, 0x3a, 0x88, - 0x1c, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, - 0x04, 0x05, 0x03, 0x03, 0x07, 0x06, 0x00, 0x30, 0x0f, 0x06, 0x03, - 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, - 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, - 0x72, 0x60, 0x96, 0xb7, 0xc9, 0xdc, 0xd8, 0x29, 0x5e, 0x23, 0x85, - 0x5f, 0xb2, 0xb3, 0x2d, 0x76, 0xfb, 0x88, 0xd7, 0x17, 0xfe, 0x7b, - 0x6d, 0x45, 0xb8, 0xf6, 0x85, 0x6c, 0x9f, 0x22, 0xfc, 0x2a, 0x10, - 0x22, 0xec, 0xaa, 0xb9, 0x30, 0xf6, 0xab, 0x58, 0xd6, 0x39, 0x10, - 0x31, 0x99, 0x29, 0x00, 0xbd, 0x89, 0x66, 0x41, 0xfb, 0x74, 0xde, - 0x91, 0xc1, 0x18, 0x0b, 0x9f, 0xb5, 0x61, 0xcb, 0x9d, 0x3a, 0xbe, - 0xf5, 0xa8, 0x94, 0xa3, 0x22, 0x55, 0x6e, 0x17, 0x49, 0xff, 0xd2, - 0x29, 0xf1, 0x38, 0x26, 0x5d, 0xef, 0xa5, 0xaa, 0x3a, 0xf9, 0x71, - 0x7b, 0xe6, 0xda, 0x58, 0x1d, 0xd3, 0x74, 0xc2, 0x01, 0xfa, 0x3e, - 0x69, 0x58, 0x5f, 0xad, 0xcb, 0x68, 0xbe, 0x14, 0x2e, 0x9b, 0x6c, - 0xc0, 0xb6, 0xdc, 0xa0, 0x26, 0xfa, 0x77, 0x1a, 0xe2, 0x24, 0xda, - 0x1a, 0x37, 0xe0, 0x67, 0xad, 0xd1, 0x73, 0x83, 0x0d, 0xa5, 0x1a, - 0x1d, 0x6e, 0x12, 0x92, 0x7e, 0x84, 0x62, 0x00, 0x17, 0xbd, 0xbc, - 0x25, 0x18, 0x57, 0xf2, 0xd7, 0xa9, 0x6f, 0x59, 0x88, 0xbc, 0x34, - 0xb7, 0x2e, 0x85, 0x78, 0x9d, 0x96, 0xdc, 0x14, 0xc3, 0x2c, 0x8a, - 0x52, 0x9b, 0x96, 0x8c, 0x52, 0x66, 0x3d, 0x86, 0x16, 0x8b, 0x47, - 0xb8, 0x51, 0x09, 0x8c, 0xea, 0x7d, 0xcd, 0x88, 0x72, 0xb3, 0x60, - 0x33, 0xb1, 0xf0, 0x0a, 0x44, 0xef, 0x0f, 0xf5, 0x09, 0x37, 0x88, - 0x24, 0x0e, 0x2c, 0x6b, 0x20, 0x3a, 0xa2, 0xfa, 0x11, 0xf2, 0x40, - 0x35, 0x9c, 0x44, 0x68, 0x63, 0x3b, 0xac, 0x33, 0x6f, 0x63, 0xbc, - 0x2c, 0xbb, 0xf2, 0xd2, 0xcb, 0x76, 0x7d, 0x7d, 0x88, 0xd8, 0x1d, - 0xc8, 0x05, 0x1d, 0x6e, 0xbc, 0x94, 0xa9, 0x66, 0x8c, 0x77, 0x71, - 0xc7, 0xfa, 0x91, 0xfa, 0x2f, 0x51, 0x9e, 0xe9, 0x39, 0x52, 0xb6, - 0xe7, 0x04, 0x42, 0x30, 0x82, 0x05, 0xba, 0x30, 0x82, 0x03, 0xa2, - 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0xbb, 0x40, 0x1c, - 0x43, 0xf5, 0x5e, 0x4f, 0xb0, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x45, + 0x41, 0x4e, 0x4b, 0x41, 0x52, 0x41, 0x31, 0x56, 0x30, 0x54, 0x06, + 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x4d, 0x28, 0x63, 0x29, 0x20, 0x32, + 0x30, 0x30, 0x35, 0x20, 0x54, 0xc3, 0x9c, 0x52, 0x4b, 0x54, 0x52, + 0x55, 0x53, 0x54, 0x20, 0x42, 0x69, 0x6c, 0x67, 0x69, 0x20, 0xc4, + 0xb0, 0x6c, 0x65, 0x74, 0x69, 0xc5, 0x9f, 0x69, 0x6d, 0x20, 0x76, + 0x65, 0x20, 0x42, 0x69, 0x6c, 0x69, 0xc5, 0x9f, 0x69, 0x6d, 0x20, + 0x47, 0xc3, 0xbc, 0x76, 0x65, 0x6e, 0x6c, 0x69, 0xc4, 0x9f, 0x69, + 0x20, 0x48, 0x69, 0x7a, 0x6d, 0x65, 0x74, 0x6c, 0x65, 0x72, 0x69, + 0x20, 0x41, 0x2e, 0xc5, 0x9e, 0x2e, 0x30, 0x82, 0x01, 0x22, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, + 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xca, 0x52, 0x05, 0xd6, 0x63, + 0x03, 0xd8, 0x1c, 0x5f, 0xdd, 0xd2, 0x7b, 0x5d, 0xf2, 0x0c, 0x60, + 0x61, 0x5b, 0x6b, 0x3b, 0x74, 0x2b, 0x78, 0x0d, 0x7d, 0x45, 0xbd, + 0x22, 0x74, 0xe8, 0x8c, 0x03, 0xc1, 0xc6, 0x11, 0x2a, 0x3d, 0x95, + 0xbc, 0xa9, 0x94, 0xb0, 0xbb, 0x91, 0x97, 0xc8, 0x69, 0x7c, 0x84, + 0xc5, 0xb4, 0x91, 0x6c, 0x6c, 0x13, 0x6a, 0xa4, 0x55, 0xad, 0xa4, + 0x85, 0xe8, 0x95, 0x7e, 0xb3, 0x00, 0xaf, 0x00, 0xc2, 0x05, 0x18, + 0xf5, 0x70, 0x9d, 0x36, 0x8b, 0xae, 0xcb, 0xe4, 0x1b, 0x81, 0x7f, + 0x93, 0x88, 0xfb, 0x6a, 0x55, 0xbb, 0x7d, 0x85, 0x92, 0xce, 0xba, + 0x58, 0x9f, 0xdb, 0x32, 0xc5, 0xbd, 0x5d, 0xef, 0x22, 0x4a, 0x2f, + 0x41, 0x07, 0x7e, 0x49, 0x61, 0xb3, 0x86, 0xec, 0x4e, 0xa6, 0x41, + 0x6e, 0x84, 0xbc, 0x03, 0xec, 0xf5, 0x3b, 0x1c, 0xc8, 0x1f, 0xc2, + 0xee, 0xa8, 0xee, 0xea, 0x12, 0x4a, 0x8d, 0x14, 0xcf, 0xf3, 0x0a, + 0xe0, 0x50, 0x39, 0xf9, 0x08, 0x35, 0xf8, 0x11, 0x59, 0xad, 0xe7, + 0x22, 0xea, 0x4b, 0xca, 0x14, 0x06, 0xde, 0x42, 0xba, 0xb2, 0x99, + 0xf3, 0x2d, 0x54, 0x88, 0x10, 0x06, 0xea, 0xe1, 0x1a, 0x3e, 0x3d, + 0x67, 0x1f, 0xfb, 0xce, 0xfb, 0x7c, 0x82, 0xe8, 0x11, 0x5d, 0x4a, + 0xc1, 0xb9, 0x14, 0xea, 0x54, 0xd9, 0x66, 0x9b, 0x7c, 0x89, 0x7d, + 0x04, 0x9a, 0x62, 0xc9, 0xe9, 0x52, 0x3c, 0x9e, 0x9c, 0xef, 0xd2, + 0xf5, 0x26, 0xe4, 0xe6, 0xe5, 0x18, 0x7c, 0x8b, 0x6e, 0xdf, 0x6c, + 0xcc, 0x78, 0x5b, 0x4f, 0x72, 0xb2, 0xcb, 0x5c, 0x3f, 0x8c, 0x05, + 0x8d, 0xd1, 0x4c, 0x8c, 0xad, 0x92, 0xc7, 0xe1, 0x78, 0x7f, 0x65, + 0x6c, 0x49, 0x06, 0x50, 0x2c, 0x9e, 0x32, 0xc2, 0xd7, 0x4a, 0xc6, + 0x75, 0x8a, 0x59, 0x4e, 0x75, 0x6f, 0x47, 0x5e, 0xc1, 0x02, 0x03, + 0x01, 0x00, 0x01, 0xa3, 0x10, 0x30, 0x0e, 0x30, 0x0c, 0x06, 0x03, + 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x15, 0xf5, 0x55, + 0xff, 0x37, 0x96, 0x80, 0x59, 0x21, 0xa4, 0xfc, 0xa1, 0x15, 0x4c, + 0x20, 0xf6, 0xd4, 0x5f, 0xda, 0x03, 0x24, 0xfc, 0xcf, 0x90, 0x1a, + 0xf4, 0x21, 0x0a, 0x9a, 0xee, 0x3a, 0xb1, 0x6a, 0xef, 0xef, 0xf8, + 0x60, 0xd1, 0x4c, 0x36, 0x66, 0x45, 0x1d, 0xf3, 0x66, 0x02, 0x74, + 0x04, 0x7b, 0x92, 0x30, 0xa8, 0xde, 0x0a, 0x76, 0x0f, 0xef, 0x95, + 0x6e, 0xbd, 0xc9, 0x37, 0xe6, 0x1a, 0x0d, 0xac, 0x89, 0x48, 0x5b, + 0xcc, 0x83, 0x36, 0xc2, 0xf5, 0x46, 0x5c, 0x59, 0x82, 0x56, 0xb4, + 0xd5, 0xfe, 0x23, 0xb4, 0xd8, 0x54, 0x1c, 0x44, 0xab, 0xc4, 0xa7, + 0xe5, 0x14, 0xce, 0x3c, 0x41, 0x61, 0x7c, 0x43, 0xe6, 0xcd, 0xc4, + 0x81, 0x09, 0x8b, 0x24, 0xfb, 0x54, 0x25, 0xd6, 0x16, 0xa8, 0x96, + 0x0c, 0x67, 0x07, 0x6f, 0xb3, 0x50, 0x47, 0xe3, 0x1c, 0x24, 0x28, + 0xdd, 0x2a, 0x98, 0xa4, 0x61, 0xfe, 0xdb, 0xea, 0x12, 0x37, 0xbc, + 0x01, 0x1a, 0x34, 0x85, 0xbd, 0x6e, 0x4f, 0xe7, 0x91, 0x72, 0x07, + 0x44, 0x85, 0x1e, 0x58, 0xca, 0x54, 0x44, 0xdd, 0xf7, 0xac, 0xb9, + 0xcb, 0x89, 0x21, 0x72, 0xdb, 0x8f, 0xc0, 0x69, 0x29, 0x97, 0x2a, + 0xa3, 0xae, 0x18, 0x23, 0x97, 0x1c, 0x41, 0x2a, 0x8b, 0x7c, 0x2a, + 0xc1, 0x7c, 0x90, 0xe8, 0xa9, 0x28, 0xc0, 0xd3, 0x91, 0xc6, 0xad, + 0x28, 0x87, 0x40, 0x68, 0xb5, 0xff, 0xec, 0xa7, 0xd2, 0xd3, 0x38, + 0x18, 0x9c, 0xd3, 0x7d, 0x69, 0x5d, 0xf0, 0xc6, 0xa5, 0x1e, 0x24, + 0x1b, 0xa3, 0x47, 0xfc, 0x69, 0x07, 0x68, 0xe7, 0xe4, 0x9a, 0xb4, + 0xed, 0x0f, 0xa1, 0x87, 0x87, 0x02, 0xce, 0x87, 0xd2, 0x48, 0x4e, + 0xe1, 0xbc, 0xff, 0xcb, 0xf1, 0x72, 0x92, 0x44, 0x64, 0x03, 0x25, + 0xea, 0xde, 0x5b, 0x6e, 0x9f, 0xc9, 0xf2, 0x4e, 0xac, 0xdd, 0xc7, + 0x30, 0x82, 0x04, 0x3c, 0x30, 0x82, 0x03, 0x24, 0xa0, 0x03, 0x02, + 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, + 0xbe, 0x31, 0x3f, 0x30, 0x3d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, + 0x36, 0x54, 0xc3, 0x9c, 0x52, 0x4b, 0x54, 0x52, 0x55, 0x53, 0x54, + 0x20, 0x45, 0x6c, 0x65, 0x6b, 0x74, 0x72, 0x6f, 0x6e, 0x69, 0x6b, + 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x6b, 0x61, 0x20, + 0x48, 0x69, 0x7a, 0x6d, 0x65, 0x74, 0x20, 0x53, 0x61, 0xc4, 0x9f, + 0x6c, 0x61, 0x79, 0xc4, 0xb1, 0x63, 0xc4, 0xb1, 0x73, 0xc4, 0xb1, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x54, 0x52, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x07, + 0x0c, 0x06, 0x41, 0x6e, 0x6b, 0x61, 0x72, 0x61, 0x31, 0x5d, 0x30, + 0x5b, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x54, 0x54, 0xc3, 0x9c, + 0x52, 0x4b, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x42, 0x69, 0x6c, + 0x67, 0x69, 0x20, 0xc4, 0xb0, 0x6c, 0x65, 0x74, 0x69, 0xc5, 0x9f, + 0x69, 0x6d, 0x20, 0x76, 0x65, 0x20, 0x42, 0x69, 0x6c, 0x69, 0xc5, + 0x9f, 0x69, 0x6d, 0x20, 0x47, 0xc3, 0xbc, 0x76, 0x65, 0x6e, 0x6c, + 0x69, 0xc4, 0x9f, 0x69, 0x20, 0x48, 0x69, 0x7a, 0x6d, 0x65, 0x74, + 0x6c, 0x65, 0x72, 0x69, 0x20, 0x41, 0x2e, 0xc5, 0x9e, 0x2e, 0x20, + 0x28, 0x63, 0x29, 0x20, 0x4b, 0x61, 0x73, 0xc4, 0xb1, 0x6d, 0x20, + 0x32, 0x30, 0x30, 0x35, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x35, 0x31, + 0x31, 0x30, 0x37, 0x31, 0x30, 0x30, 0x37, 0x35, 0x37, 0x5a, 0x17, + 0x0d, 0x31, 0x35, 0x30, 0x39, 0x31, 0x36, 0x31, 0x30, 0x30, 0x37, + 0x35, 0x37, 0x5a, 0x30, 0x81, 0xbe, 0x31, 0x3f, 0x30, 0x3d, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x0c, 0x36, 0x54, 0xc3, 0x9c, 0x52, 0x4b, + 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x45, 0x6c, 0x65, 0x6b, 0x74, + 0x72, 0x6f, 0x6e, 0x69, 0x6b, 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x6b, 0x61, 0x20, 0x48, 0x69, 0x7a, 0x6d, 0x65, 0x74, + 0x20, 0x53, 0x61, 0xc4, 0x9f, 0x6c, 0x61, 0x79, 0xc4, 0xb1, 0x63, + 0xc4, 0xb1, 0x73, 0xc4, 0xb1, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x54, 0x52, 0x31, 0x0f, 0x30, 0x0d, + 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x06, 0x41, 0x6e, 0x6b, 0x61, + 0x72, 0x61, 0x31, 0x5d, 0x30, 0x5b, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x0c, 0x54, 0x54, 0xc3, 0x9c, 0x52, 0x4b, 0x54, 0x52, 0x55, 0x53, + 0x54, 0x20, 0x42, 0x69, 0x6c, 0x67, 0x69, 0x20, 0xc4, 0xb0, 0x6c, + 0x65, 0x74, 0x69, 0xc5, 0x9f, 0x69, 0x6d, 0x20, 0x76, 0x65, 0x20, + 0x42, 0x69, 0x6c, 0x69, 0xc5, 0x9f, 0x69, 0x6d, 0x20, 0x47, 0xc3, + 0xbc, 0x76, 0x65, 0x6e, 0x6c, 0x69, 0xc4, 0x9f, 0x69, 0x20, 0x48, + 0x69, 0x7a, 0x6d, 0x65, 0x74, 0x6c, 0x65, 0x72, 0x69, 0x20, 0x41, + 0x2e, 0xc5, 0x9e, 0x2e, 0x20, 0x28, 0x63, 0x29, 0x20, 0x4b, 0x61, + 0x73, 0xc4, 0xb1, 0x6d, 0x20, 0x32, 0x30, 0x30, 0x35, 0x30, 0x82, + 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, + 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa9, 0x36, + 0x7e, 0xc3, 0x91, 0x43, 0x4c, 0xc3, 0x19, 0x98, 0x08, 0xc8, 0xc7, + 0x58, 0x7b, 0x4f, 0x16, 0x8c, 0xa5, 0xce, 0x49, 0x01, 0x1f, 0x73, + 0x0e, 0xac, 0x75, 0x13, 0xa6, 0xfa, 0x9e, 0x2c, 0x20, 0xde, 0xd8, + 0x90, 0x0e, 0x0a, 0xd1, 0x69, 0xd2, 0x27, 0xfb, 0xaa, 0x77, 0x9f, + 0x27, 0x52, 0x25, 0xe2, 0xcb, 0x5d, 0xd8, 0xd8, 0x83, 0x50, 0x17, + 0x7d, 0x8a, 0xb5, 0x82, 0x3f, 0x04, 0x8e, 0xb4, 0xd5, 0xf0, 0x49, + 0xa7, 0x64, 0xb7, 0x1e, 0x2e, 0x5f, 0x20, 0x9c, 0x50, 0x75, 0x4f, + 0xaf, 0xe1, 0xb5, 0x41, 0x14, 0xf4, 0x98, 0x92, 0x88, 0xc7, 0xe5, + 0xe5, 0x64, 0x47, 0x61, 0x47, 0x79, 0xfd, 0xc0, 0x51, 0xf1, 0xc1, + 0x99, 0xe7, 0xdc, 0xce, 0x6a, 0xfb, 0xaf, 0xb5, 0x01, 0x30, 0xdc, + 0x46, 0x1c, 0xef, 0x8a, 0xec, 0x95, 0xef, 0xdc, 0xff, 0xaf, 0x10, + 0x1c, 0xeb, 0x9d, 0xd8, 0xb0, 0xaa, 0x6a, 0x85, 0x18, 0x0d, 0x17, + 0xc9, 0x3e, 0xbf, 0xf1, 0x9b, 0xd0, 0x09, 0x89, 0x42, 0xfd, 0xa0, + 0x42, 0xb4, 0x9d, 0x89, 0x51, 0x55, 0x29, 0xcf, 0x1b, 0x70, 0xbc, + 0x84, 0x54, 0xad, 0xc1, 0x13, 0x1f, 0x98, 0xf4, 0x2e, 0x76, 0x60, + 0x8b, 0x5d, 0x3f, 0x9a, 0xad, 0xca, 0x0c, 0xbf, 0xa7, 0x56, 0x5b, + 0x8f, 0x77, 0xb8, 0xd5, 0x9e, 0x79, 0x49, 0x92, 0x3f, 0xe0, 0xf1, + 0x97, 0x24, 0x7a, 0x6c, 0x9b, 0x17, 0x0f, 0x6d, 0xef, 0x53, 0x98, + 0x91, 0x2b, 0xe4, 0x0f, 0xbe, 0x59, 0x79, 0x07, 0x78, 0xbb, 0x97, + 0x95, 0xf4, 0x9f, 0x69, 0xd4, 0x58, 0x87, 0x0a, 0xa9, 0xe3, 0xcc, + 0xb6, 0x58, 0x19, 0x9f, 0x26, 0x21, 0xb1, 0xc4, 0x59, 0x8d, 0xb2, + 0x41, 0x75, 0xc0, 0xad, 0x69, 0xce, 0x9c, 0x00, 0x08, 0xf2, 0x36, + 0xff, 0x3e, 0xf0, 0xa1, 0x0f, 0x1a, 0xac, 0x14, 0xfd, 0xa6, 0x60, + 0x0f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x43, 0x30, 0x41, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xd9, + 0x37, 0xb3, 0x4e, 0x05, 0xfd, 0xd9, 0xcf, 0x9f, 0x12, 0x16, 0xae, + 0xb6, 0x89, 0x2f, 0xeb, 0x25, 0x3a, 0x88, 0x1c, 0x30, 0x0f, 0x06, + 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x05, 0x03, 0x03, + 0x07, 0x06, 0x00, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, + 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x72, 0x60, 0x96, 0xb7, + 0xc9, 0xdc, 0xd8, 0x29, 0x5e, 0x23, 0x85, 0x5f, 0xb2, 0xb3, 0x2d, + 0x76, 0xfb, 0x88, 0xd7, 0x17, 0xfe, 0x7b, 0x6d, 0x45, 0xb8, 0xf6, + 0x85, 0x6c, 0x9f, 0x22, 0xfc, 0x2a, 0x10, 0x22, 0xec, 0xaa, 0xb9, + 0x30, 0xf6, 0xab, 0x58, 0xd6, 0x39, 0x10, 0x31, 0x99, 0x29, 0x00, + 0xbd, 0x89, 0x66, 0x41, 0xfb, 0x74, 0xde, 0x91, 0xc1, 0x18, 0x0b, + 0x9f, 0xb5, 0x61, 0xcb, 0x9d, 0x3a, 0xbe, 0xf5, 0xa8, 0x94, 0xa3, + 0x22, 0x55, 0x6e, 0x17, 0x49, 0xff, 0xd2, 0x29, 0xf1, 0x38, 0x26, + 0x5d, 0xef, 0xa5, 0xaa, 0x3a, 0xf9, 0x71, 0x7b, 0xe6, 0xda, 0x58, + 0x1d, 0xd3, 0x74, 0xc2, 0x01, 0xfa, 0x3e, 0x69, 0x58, 0x5f, 0xad, + 0xcb, 0x68, 0xbe, 0x14, 0x2e, 0x9b, 0x6c, 0xc0, 0xb6, 0xdc, 0xa0, + 0x26, 0xfa, 0x77, 0x1a, 0xe2, 0x24, 0xda, 0x1a, 0x37, 0xe0, 0x67, + 0xad, 0xd1, 0x73, 0x83, 0x0d, 0xa5, 0x1a, 0x1d, 0x6e, 0x12, 0x92, + 0x7e, 0x84, 0x62, 0x00, 0x17, 0xbd, 0xbc, 0x25, 0x18, 0x57, 0xf2, + 0xd7, 0xa9, 0x6f, 0x59, 0x88, 0xbc, 0x34, 0xb7, 0x2e, 0x85, 0x78, + 0x9d, 0x96, 0xdc, 0x14, 0xc3, 0x2c, 0x8a, 0x52, 0x9b, 0x96, 0x8c, + 0x52, 0x66, 0x3d, 0x86, 0x16, 0x8b, 0x47, 0xb8, 0x51, 0x09, 0x8c, + 0xea, 0x7d, 0xcd, 0x88, 0x72, 0xb3, 0x60, 0x33, 0xb1, 0xf0, 0x0a, + 0x44, 0xef, 0x0f, 0xf5, 0x09, 0x37, 0x88, 0x24, 0x0e, 0x2c, 0x6b, + 0x20, 0x3a, 0xa2, 0xfa, 0x11, 0xf2, 0x40, 0x35, 0x9c, 0x44, 0x68, + 0x63, 0x3b, 0xac, 0x33, 0x6f, 0x63, 0xbc, 0x2c, 0xbb, 0xf2, 0xd2, + 0xcb, 0x76, 0x7d, 0x7d, 0x88, 0xd8, 0x1d, 0xc8, 0x05, 0x1d, 0x6e, + 0xbc, 0x94, 0xa9, 0x66, 0x8c, 0x77, 0x71, 0xc7, 0xfa, 0x91, 0xfa, + 0x2f, 0x51, 0x9e, 0xe9, 0x39, 0x52, 0xb6, 0xe7, 0x04, 0x42, 0x30, + 0x82, 0x05, 0xba, 0x30, 0x82, 0x03, 0xa2, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x09, 0x00, 0xbb, 0x40, 0x1c, 0x43, 0xf5, 0x5e, 0x4f, + 0xb0, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x43, 0x48, 0x31, 0x15, + 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x53, 0x77, + 0x69, 0x73, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x41, 0x47, 0x31, + 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x16, 0x53, + 0x77, 0x69, 0x73, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x47, 0x6f, + 0x6c, 0x64, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, + 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x30, 0x32, 0x35, 0x30, 0x38, + 0x33, 0x30, 0x33, 0x35, 0x5a, 0x17, 0x0d, 0x33, 0x36, 0x31, 0x30, + 0x32, 0x35, 0x30, 0x38, 0x33, 0x30, 0x33, 0x35, 0x5a, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x43, 0x48, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x53, 0x77, 0x69, 0x73, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x41, 0x47, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x16, 0x53, 0x77, 0x69, 0x73, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x47, 0x6f, 0x6c, 0x64, 0x20, 0x43, 0x41, 0x20, 0x2d, - 0x20, 0x47, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x30, - 0x32, 0x35, 0x30, 0x38, 0x33, 0x30, 0x33, 0x35, 0x5a, 0x17, 0x0d, - 0x33, 0x36, 0x31, 0x30, 0x32, 0x35, 0x30, 0x38, 0x33, 0x30, 0x33, - 0x35, 0x5a, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x43, 0x48, 0x31, 0x15, 0x30, 0x13, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x53, 0x77, 0x69, 0x73, 0x73, - 0x53, 0x69, 0x67, 0x6e, 0x20, 0x41, 0x47, 0x31, 0x1f, 0x30, 0x1d, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x16, 0x53, 0x77, 0x69, 0x73, - 0x73, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x47, 0x6f, 0x6c, 0x64, 0x20, - 0x43, 0x41, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x82, 0x02, 0x22, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, - 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xaf, 0xe4, 0xee, 0x7e, - 0x8b, 0x24, 0x0e, 0x12, 0x6e, 0xa9, 0x50, 0x2d, 0x16, 0x44, 0x3b, - 0x92, 0x92, 0x5c, 0xca, 0xb8, 0x5d, 0x84, 0x92, 0x42, 0x13, 0x2a, - 0xbc, 0x65, 0x57, 0x82, 0x40, 0x3e, 0x57, 0x24, 0xcd, 0x50, 0x8b, - 0x25, 0x2a, 0xb7, 0x6f, 0xfc, 0xef, 0xa2, 0xd0, 0xc0, 0x1f, 0x02, - 0x24, 0x4a, 0x13, 0x96, 0x8f, 0x23, 0x13, 0xe6, 0x28, 0x58, 0x00, - 0xa3, 0x47, 0xc7, 0x06, 0xa7, 0x84, 0x23, 0x2b, 0xbb, 0xbd, 0x96, - 0x2b, 0x7f, 0x55, 0xcc, 0x8b, 0xc1, 0x57, 0x1f, 0x0e, 0x62, 0x65, - 0x0f, 0xdd, 0x3d, 0x56, 0x8a, 0x73, 0xda, 0xae, 0x7e, 0x6d, 0xba, - 0x81, 0x1c, 0x7e, 0x42, 0x8c, 0x20, 0x35, 0xd9, 0x43, 0x4d, 0x84, - 0xfa, 0x84, 0xdb, 0x52, 0x2c, 0xf3, 0x0e, 0x27, 0x77, 0x0b, 0x6b, - 0xbf, 0x11, 0x2f, 0x72, 0x78, 0x9f, 0x2e, 0xd8, 0x3e, 0xe6, 0x18, - 0x37, 0x5a, 0x2a, 0x72, 0xf9, 0xda, 0x62, 0x90, 0x92, 0x95, 0xca, - 0x1f, 0x9c, 0xe9, 0xb3, 0x3c, 0x2b, 0xcb, 0xf3, 0x01, 0x13, 0xbf, - 0x5a, 0xcf, 0xc1, 0xb5, 0x0a, 0x60, 0xbd, 0xdd, 0xb5, 0x99, 0x64, - 0x53, 0xb8, 0xa0, 0x96, 0xb3, 0x6f, 0xe2, 0x26, 0x77, 0x91, 0x8c, - 0xe0, 0x62, 0x10, 0x02, 0x9f, 0x34, 0x0f, 0xa4, 0xd5, 0x92, 0x33, - 0x51, 0xde, 0xbe, 0x8d, 0xba, 0x84, 0x7a, 0x60, 0x3c, 0x6a, 0xdb, - 0x9f, 0x2b, 0xec, 0xde, 0xde, 0x01, 0x3f, 0x6e, 0x4d, 0xe5, 0x50, - 0x86, 0xcb, 0xb4, 0xaf, 0xed, 0x44, 0x40, 0xc5, 0xca, 0x5a, 0x8c, - 0xda, 0xd2, 0x2b, 0x7c, 0xa8, 0xee, 0xbe, 0xa6, 0xe5, 0x0a, 0xaa, - 0x0e, 0xa5, 0xdf, 0x05, 0x52, 0xb7, 0x55, 0xc7, 0x22, 0x5d, 0x32, - 0x6a, 0x97, 0x97, 0x63, 0x13, 0xdb, 0xc9, 0xdb, 0x79, 0x36, 0x7b, - 0x85, 0x3a, 0x4a, 0xc5, 0x52, 0x89, 0xf9, 0x24, 0xe7, 0x9d, 0x77, - 0xa9, 0x82, 0xff, 0x55, 0x1c, 0xa5, 0x71, 0x69, 0x2b, 0xd1, 0x02, - 0x24, 0xf2, 0xb3, 0x26, 0xd4, 0x6b, 0xda, 0x04, 0x55, 0xe5, 0xc1, - 0x0a, 0xc7, 0x6d, 0x30, 0x37, 0x90, 0x2a, 0xe4, 0x9e, 0x14, 0x33, - 0x5e, 0x16, 0x17, 0x55, 0xc5, 0x5b, 0xb5, 0xcb, 0x34, 0x89, 0x92, - 0xf1, 0x9d, 0x26, 0x8f, 0xa1, 0x07, 0xd4, 0xc6, 0xb2, 0x78, 0x50, - 0xdb, 0x0c, 0x0c, 0x0b, 0x7c, 0x0b, 0x8c, 0x41, 0xd7, 0xb9, 0xe9, - 0xdd, 0x8c, 0x88, 0xf7, 0xa3, 0x4d, 0xb2, 0x32, 0xcc, 0xd8, 0x17, - 0xda, 0xcd, 0xb7, 0xce, 0x66, 0x9d, 0xd4, 0xfd, 0x5e, 0xff, 0xbd, - 0x97, 0x3e, 0x29, 0x75, 0xe7, 0x7e, 0xa7, 0x62, 0x58, 0xaf, 0x25, - 0x34, 0xa5, 0x41, 0xc7, 0x3d, 0xbc, 0x0d, 0x50, 0xca, 0x03, 0x03, - 0x0f, 0x08, 0x5a, 0x1f, 0x95, 0x73, 0x78, 0x62, 0xbf, 0xaf, 0x72, - 0x14, 0x69, 0x0e, 0xa5, 0xe5, 0x03, 0x0e, 0x78, 0x8e, 0x26, 0x28, - 0x42, 0xf0, 0x07, 0x0b, 0x62, 0x20, 0x10, 0x67, 0x39, 0x46, 0xfa, - 0xa9, 0x03, 0xcc, 0x04, 0x38, 0x7a, 0x66, 0xef, 0x20, 0x83, 0xb5, - 0x8c, 0x4a, 0x56, 0x8e, 0x91, 0x00, 0xfc, 0x8e, 0x5c, 0x82, 0xde, - 0x88, 0xa0, 0xc3, 0xe2, 0x68, 0x6e, 0x7d, 0x8d, 0xef, 0x3c, 0xdd, - 0x65, 0xf4, 0x5d, 0xac, 0x51, 0xef, 0x24, 0x80, 0xae, 0xaa, 0x56, - 0x97, 0x6f, 0xf9, 0xad, 0x7d, 0xda, 0x61, 0x3f, 0x98, 0x77, 0x3c, - 0xa5, 0x91, 0xb6, 0x1c, 0x8c, 0x26, 0xda, 0x65, 0xa2, 0x09, 0x6d, - 0xc1, 0xe2, 0x54, 0xe3, 0xb9, 0xca, 0x4c, 0x4c, 0x80, 0x8f, 0x77, - 0x7b, 0x60, 0x9a, 0x1e, 0xdf, 0xb6, 0xf2, 0x48, 0x1e, 0x0e, 0xba, - 0x4e, 0x54, 0x6d, 0x98, 0xe0, 0xe1, 0xa2, 0x1a, 0xa2, 0x77, 0x50, - 0xcf, 0xc4, 0x63, 0x92, 0xec, 0x47, 0x19, 0x9d, 0xeb, 0xe6, 0x6b, - 0xce, 0xc1, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xac, 0x30, - 0x81, 0xa9, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, - 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, - 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, - 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, - 0x04, 0x14, 0x5b, 0x25, 0x7b, 0x96, 0xa4, 0x65, 0x51, 0x7e, 0xb8, - 0x39, 0xf3, 0xc0, 0x78, 0x66, 0x5e, 0xe8, 0x3a, 0xe7, 0xf0, 0xee, - 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, - 0x80, 0x14, 0x5b, 0x25, 0x7b, 0x96, 0xa4, 0x65, 0x51, 0x7e, 0xb8, - 0x39, 0xf3, 0xc0, 0x78, 0x66, 0x5e, 0xe8, 0x3a, 0xe7, 0xf0, 0xee, - 0x30, 0x46, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x3f, 0x30, 0x3d, - 0x30, 0x3b, 0x06, 0x09, 0x60, 0x85, 0x74, 0x01, 0x59, 0x01, 0x02, - 0x01, 0x01, 0x30, 0x2e, 0x30, 0x2c, 0x06, 0x08, 0x2b, 0x06, 0x01, - 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x20, 0x68, 0x74, 0x74, 0x70, - 0x3a, 0x2f, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x73, 0x77, 0x69, 0x73, 0x73, 0x73, 0x69, 0x67, - 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, - 0x82, 0x02, 0x01, 0x00, 0x27, 0xba, 0xe3, 0x94, 0x7c, 0xf1, 0xae, - 0xc0, 0xde, 0x17, 0xe6, 0xe5, 0xd8, 0xd5, 0xf5, 0x54, 0xb0, 0x83, - 0xf4, 0xbb, 0xcd, 0x5e, 0x05, 0x7b, 0x4f, 0x9f, 0x75, 0x66, 0xaf, - 0x3c, 0xe8, 0x56, 0x7e, 0xfc, 0x72, 0x78, 0x38, 0x03, 0xd9, 0x2b, - 0x62, 0x1b, 0x00, 0xb9, 0xf8, 0xe9, 0x60, 0xcd, 0xcc, 0xce, 0x51, - 0x8a, 0xc7, 0x50, 0x31, 0x6e, 0xe1, 0x4a, 0x7e, 0x18, 0x2f, 0x69, - 0x59, 0xb6, 0x3d, 0x64, 0x81, 0x2b, 0xe3, 0x83, 0x84, 0xe6, 0x22, - 0x87, 0x8e, 0x7d, 0xe0, 0xee, 0x02, 0x99, 0x61, 0xb8, 0x1e, 0xf4, - 0xb8, 0x2b, 0x88, 0x12, 0x16, 0x84, 0xc2, 0x31, 0x93, 0x38, 0x96, - 0x31, 0xa6, 0xb9, 0x3b, 0x53, 0x3f, 0xc3, 0x24, 0x93, 0x56, 0x5b, - 0x69, 0x92, 0xec, 0xc5, 0xc1, 0xbb, 0x38, 0x00, 0xe3, 0xec, 0x17, - 0xa9, 0xb8, 0xdc, 0xc7, 0x7c, 0x01, 0x83, 0x9f, 0x32, 0x47, 0xba, - 0x52, 0x22, 0x34, 0x1d, 0x32, 0x7a, 0x09, 0x56, 0xa7, 0x7c, 0x25, - 0x36, 0xa9, 0x3d, 0x4b, 0xda, 0xc0, 0x82, 0x6f, 0x0a, 0xbb, 0x12, - 0xc8, 0x87, 0x4b, 0x27, 0x11, 0xf9, 0x1e, 0x2d, 0xc7, 0x93, 0x3f, - 0x9e, 0xdb, 0x5f, 0x26, 0x6b, 0x52, 0xd9, 0x2e, 0x8a, 0xf1, 0x14, - 0xc6, 0x44, 0x8d, 0x15, 0xa9, 0xb7, 0xbf, 0xbd, 0xde, 0xa6, 0x1a, - 0xee, 0xae, 0x2d, 0xfb, 0x48, 0x77, 0x17, 0xfe, 0xbb, 0xec, 0xaf, - 0x18, 0xf5, 0x2a, 0x51, 0xf0, 0x39, 0x84, 0x97, 0x95, 0x6c, 0x6e, - 0x1b, 0xc3, 0x2b, 0xc4, 0x74, 0x60, 0x79, 0x25, 0xb0, 0x0a, 0x27, - 0xdf, 0xdf, 0x5e, 0xd2, 0x39, 0xcf, 0x45, 0x7d, 0x42, 0x4b, 0xdf, - 0xb3, 0x2c, 0x1e, 0xc5, 0xc6, 0x5d, 0xca, 0x55, 0x3a, 0xa0, 0x9c, - 0x69, 0x9a, 0x8f, 0xda, 0xef, 0xb2, 0xb0, 0x3c, 0x9f, 0x87, 0x6c, - 0x12, 0x2b, 0x65, 0x70, 0x15, 0x52, 0x31, 0x1a, 0x24, 0xcf, 0x6f, - 0x31, 0x23, 0x50, 0x1f, 0x8c, 0x4f, 0x8f, 0x23, 0xc3, 0x74, 0x41, - 0x63, 0x1c, 0x55, 0xa8, 0x14, 0xdd, 0x3e, 0xe0, 0x51, 0x50, 0xcf, - 0xf1, 0x1b, 0x30, 0x56, 0x0e, 0x92, 0xb0, 0x82, 0x85, 0xd8, 0x83, - 0xcb, 0x22, 0x64, 0xbc, 0x2d, 0xb8, 0x25, 0xd5, 0x54, 0xa2, 0xb8, - 0x06, 0xea, 0xad, 0x92, 0xa4, 0x24, 0xa0, 0xc1, 0x86, 0xb5, 0x4a, - 0x13, 0x6a, 0x47, 0xcf, 0x2e, 0x0b, 0x56, 0x95, 0x54, 0xcb, 0xce, - 0x9a, 0xdb, 0x6a, 0xb4, 0xa6, 0xb2, 0xdb, 0x41, 0x08, 0x86, 0x27, - 0x77, 0xf7, 0x6a, 0xa0, 0x42, 0x6c, 0x0b, 0x38, 0xce, 0xd7, 0x75, - 0x50, 0x32, 0x92, 0xc2, 0xdf, 0x2b, 0x30, 0x22, 0x48, 0xd0, 0xd5, - 0x41, 0x38, 0x25, 0x5d, 0xa4, 0xe9, 0x5d, 0x9f, 0xc6, 0x94, 0x75, - 0xd0, 0x45, 0xfd, 0x30, 0x97, 0x43, 0x8f, 0x90, 0xab, 0x0a, 0xc7, - 0x86, 0x73, 0x60, 0x4a, 0x69, 0x2d, 0xde, 0xa5, 0x78, 0xd7, 0x06, - 0xda, 0x6a, 0x9e, 0x4b, 0x3e, 0x77, 0x3a, 0x20, 0x13, 0x22, 0x01, - 0xd0, 0xbf, 0x68, 0x9e, 0x63, 0x60, 0x6b, 0x35, 0x4d, 0x0b, 0x6d, - 0xba, 0xa1, 0x3d, 0xc0, 0x93, 0xe0, 0x7f, 0x23, 0xb3, 0x55, 0xad, - 0x72, 0x25, 0x4e, 0x46, 0xf9, 0xd2, 0x16, 0xef, 0xb0, 0x64, 0xc1, - 0x01, 0x9e, 0xe9, 0xca, 0xa0, 0x6a, 0x98, 0x0e, 0xcf, 0xd8, 0x60, - 0xf2, 0x2f, 0x49, 0xb8, 0xe4, 0x42, 0xe1, 0x38, 0x35, 0x16, 0xf4, - 0xc8, 0x6e, 0x4f, 0xf7, 0x81, 0x56, 0xe8, 0xba, 0xa3, 0xbe, 0x23, - 0xaf, 0xae, 0xfd, 0x6f, 0x03, 0xe0, 0x02, 0x3b, 0x30, 0x76, 0xfa, - 0x1b, 0x6d, 0x41, 0xcf, 0x01, 0xb1, 0xe9, 0xb8, 0xc9, 0x66, 0xf4, - 0xdb, 0x26, 0xf3, 0x3a, 0xa4, 0x74, 0xf2, 0x49, 0x24, 0x5b, 0xc9, - 0xb0, 0xd0, 0x57, 0xc1, 0xfa, 0x3e, 0x7a, 0xe1, 0x97, 0xc9, 0x30, - 0x82, 0x05, 0xbd, 0x30, 0x82, 0x03, 0xa5, 0xa0, 0x03, 0x02, 0x01, - 0x02, 0x02, 0x08, 0x4f, 0x1b, 0xd4, 0x2f, 0x54, 0xbb, 0x2f, 0x4b, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x05, 0x05, 0x00, 0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x43, 0x48, 0x31, 0x15, 0x30, - 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x53, 0x77, 0x69, - 0x73, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x41, 0x47, 0x31, 0x21, - 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x53, 0x77, - 0x69, 0x73, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x53, 0x69, 0x6c, - 0x76, 0x65, 0x72, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x47, 0x32, - 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x30, 0x32, 0x35, 0x30, - 0x38, 0x33, 0x32, 0x34, 0x36, 0x5a, 0x17, 0x0d, 0x33, 0x36, 0x31, - 0x30, 0x32, 0x35, 0x30, 0x38, 0x33, 0x32, 0x34, 0x36, 0x5a, 0x30, - 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, - 0x02, 0x43, 0x48, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x0c, 0x53, 0x77, 0x69, 0x73, 0x73, 0x53, 0x69, 0x67, - 0x6e, 0x20, 0x41, 0x47, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, - 0x04, 0x03, 0x13, 0x18, 0x53, 0x77, 0x69, 0x73, 0x73, 0x53, 0x69, - 0x67, 0x6e, 0x20, 0x53, 0x69, 0x6c, 0x76, 0x65, 0x72, 0x20, 0x43, - 0x41, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x82, 0x02, 0x22, 0x30, - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, - 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xc4, 0xf1, 0x87, 0x7f, 0xd3, - 0x78, 0x31, 0xf7, 0x38, 0xc9, 0xf8, 0xc3, 0x99, 0x43, 0xbc, 0xc7, - 0xf7, 0xbc, 0x37, 0xe7, 0x4e, 0x71, 0xba, 0x4b, 0x8f, 0xa5, 0x73, - 0x1d, 0x5c, 0x6e, 0x98, 0xae, 0x03, 0x57, 0xae, 0x38, 0x37, 0x43, - 0x2f, 0x17, 0x3d, 0x1f, 0xc8, 0xce, 0x68, 0x10, 0xc1, 0x78, 0xae, - 0x19, 0x03, 0x2b, 0x10, 0xfa, 0x2c, 0x79, 0x83, 0xf6, 0xe8, 0xb9, - 0x68, 0xb9, 0x55, 0xf2, 0x04, 0x44, 0xa7, 0x39, 0xf9, 0xfc, 0x04, - 0x8b, 0x1e, 0xf1, 0xa2, 0x4d, 0x27, 0xf9, 0x61, 0x7b, 0xba, 0xb7, - 0xe5, 0xa2, 0x13, 0xb6, 0xeb, 0x61, 0x3e, 0xd0, 0x6c, 0xd1, 0xe6, - 0xfb, 0xfa, 0x5e, 0xed, 0x1d, 0xb4, 0x9e, 0xa0, 0x35, 0x5b, 0xa1, - 0x92, 0xcb, 0xf0, 0x49, 0x92, 0xfe, 0x85, 0x0a, 0x05, 0x3e, 0xe6, - 0xd9, 0x0b, 0xe2, 0x4f, 0xbb, 0xdc, 0x95, 0x37, 0xfc, 0x91, 0xe9, - 0x32, 0x35, 0x22, 0xd1, 0x1f, 0x3a, 0x4e, 0x27, 0x85, 0x9d, 0xb0, - 0x15, 0x94, 0x32, 0xda, 0x61, 0x0d, 0x47, 0x4d, 0x60, 0x42, 0xae, - 0x92, 0x47, 0xe8, 0x83, 0x5a, 0x50, 0x58, 0xe9, 0x8a, 0x8b, 0xb9, - 0x5d, 0xa1, 0xdc, 0xdd, 0x99, 0x4a, 0x1f, 0x36, 0x67, 0xbb, 0x48, - 0xe4, 0x83, 0xb6, 0x37, 0xeb, 0x48, 0x3a, 0xaf, 0x0f, 0x67, 0x8f, - 0x17, 0x07, 0xe8, 0x04, 0xca, 0xef, 0x6a, 0x31, 0x87, 0xd4, 0xc0, - 0xb6, 0xf9, 0x94, 0x71, 0x7b, 0x67, 0x64, 0xb8, 0xb6, 0x91, 0x4a, - 0x42, 0x7b, 0x65, 0x2e, 0x30, 0x6a, 0x0c, 0xf5, 0x90, 0xee, 0x95, - 0xe6, 0xf2, 0xcd, 0x82, 0xec, 0xd9, 0xa1, 0x4a, 0xec, 0xf6, 0xb2, - 0x4b, 0xe5, 0x45, 0x85, 0xe6, 0x6d, 0x78, 0x93, 0x04, 0x2e, 0x9c, - 0x82, 0x6d, 0x36, 0xa9, 0xc4, 0x31, 0x64, 0x1f, 0x86, 0x83, 0x0b, - 0x2a, 0xf4, 0x35, 0x0a, 0x78, 0xc9, 0x55, 0xcf, 0x41, 0xb0, 0x47, - 0xe9, 0x30, 0x9f, 0x99, 0xbe, 0x61, 0xa8, 0x06, 0x84, 0xb9, 0x28, - 0x7a, 0x5f, 0x38, 0xd9, 0x1b, 0xa9, 0x38, 0xb0, 0x83, 0x7f, 0x73, - 0xc1, 0xc3, 0x3b, 0x48, 0x2a, 0x82, 0x0f, 0x21, 0x9b, 0xb8, 0xcc, - 0xa8, 0x35, 0xc3, 0x84, 0x1b, 0x83, 0xb3, 0x3e, 0xbe, 0xa4, 0x95, - 0x69, 0x01, 0x3a, 0x89, 0x00, 0x78, 0x04, 0xd9, 0xc9, 0xf4, 0x99, - 0x19, 0xab, 0x56, 0x7e, 0x5b, 0x8b, 0x86, 0x39, 0x15, 0x91, 0xa4, - 0x10, 0x2c, 0x09, 0x32, 0x80, 0x60, 0xb3, 0x93, 0xc0, 0x2a, 0xb6, - 0x18, 0x0b, 0x9d, 0x7e, 0x8d, 0x49, 0xf2, 0x10, 0x4a, 0x7f, 0xf9, - 0xd5, 0x46, 0x2f, 0x19, 0x92, 0xa3, 0x99, 0xa7, 0x26, 0xac, 0xbb, - 0x8c, 0x3c, 0xe6, 0x0e, 0xbc, 0x47, 0x07, 0xdc, 0x73, 0x51, 0xf1, - 0x70, 0x64, 0x2f, 0x08, 0xf9, 0xb4, 0x47, 0x1d, 0x30, 0x6c, 0x44, - 0xea, 0x29, 0x37, 0x85, 0x92, 0x68, 0x66, 0xbc, 0x83, 0x38, 0xfe, - 0x7b, 0x39, 0x2e, 0xd3, 0x50, 0xf0, 0x1f, 0xfb, 0x5e, 0x60, 0xb6, - 0xa9, 0xa6, 0xfa, 0x27, 0x41, 0xf1, 0x9b, 0x18, 0x72, 0xf2, 0xf5, - 0x84, 0x74, 0x4a, 0xc9, 0x67, 0xc4, 0x54, 0xae, 0x48, 0x64, 0xdf, - 0x8c, 0xd1, 0x6e, 0xb0, 0x1d, 0xe1, 0x07, 0x8f, 0x08, 0x1e, 0x99, - 0x9c, 0x71, 0xe9, 0x4c, 0xd8, 0xa5, 0xf7, 0x47, 0x12, 0x1f, 0x74, - 0xd1, 0x51, 0x9e, 0x86, 0xf3, 0xc2, 0xa2, 0x23, 0x40, 0x0b, 0x73, - 0xdb, 0x4b, 0xa6, 0xe7, 0x73, 0x06, 0x8c, 0xc1, 0xa0, 0xe9, 0xc1, - 0x59, 0xac, 0x46, 0xfa, 0xe6, 0x2f, 0xf8, 0xcf, 0x71, 0x9c, 0x46, - 0x6d, 0xb9, 0xc4, 0x15, 0x8d, 0x38, 0x79, 0x03, 0x45, 0x48, 0xef, - 0xc4, 0x5d, 0xd7, 0x08, 0xee, 0x87, 0x39, 0x22, 0x86, 0xb2, 0x0d, - 0x0f, 0x58, 0x43, 0xf7, 0x71, 0xa9, 0x48, 0x2e, 0xfd, 0xea, 0xd6, - 0x1f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xac, 0x30, 0x81, - 0xa9, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, - 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, - 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, - 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, - 0x14, 0x17, 0xa0, 0xcd, 0xc1, 0xe4, 0x41, 0xb6, 0x3a, 0x5b, 0x3b, - 0xcb, 0x45, 0x9d, 0xbd, 0x1c, 0xc2, 0x98, 0xfa, 0x86, 0x58, 0x30, - 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, - 0x14, 0x17, 0xa0, 0xcd, 0xc1, 0xe4, 0x41, 0xb6, 0x3a, 0x5b, 0x3b, - 0xcb, 0x45, 0x9d, 0xbd, 0x1c, 0xc2, 0x98, 0xfa, 0x86, 0x58, 0x30, - 0x46, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x3f, 0x30, 0x3d, 0x30, - 0x3b, 0x06, 0x09, 0x60, 0x85, 0x74, 0x01, 0x59, 0x01, 0x03, 0x01, - 0x01, 0x30, 0x2e, 0x30, 0x2c, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, - 0x05, 0x07, 0x02, 0x01, 0x16, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, - 0x2f, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x73, 0x77, 0x69, 0x73, 0x73, 0x73, 0x69, 0x67, 0x6e, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, - 0x02, 0x01, 0x00, 0x73, 0xc6, 0x81, 0xe0, 0x27, 0xd2, 0x2d, 0x0f, - 0xe0, 0x95, 0x30, 0xe2, 0x9a, 0x41, 0x7f, 0x50, 0x2c, 0x5f, 0x5f, - 0x62, 0x61, 0xa9, 0x86, 0x6a, 0x69, 0x18, 0x0c, 0x74, 0x49, 0xd6, - 0x5d, 0x84, 0xea, 0x41, 0x52, 0x18, 0x6f, 0x58, 0xad, 0x50, 0x56, - 0x20, 0x6a, 0xc6, 0xbd, 0x28, 0x69, 0x58, 0x91, 0xdc, 0x91, 0x11, - 0x35, 0xa9, 0x3a, 0x1d, 0xbc, 0x1a, 0xa5, 0x60, 0x9e, 0xd8, 0x1f, - 0x7f, 0x45, 0x91, 0x69, 0xd9, 0x7e, 0xbb, 0x78, 0x72, 0xc1, 0x06, - 0x0f, 0x2a, 0xce, 0x8f, 0x85, 0x70, 0x61, 0xac, 0xa0, 0xcd, 0x0b, - 0xb8, 0x39, 0x29, 0x56, 0x84, 0x32, 0x4e, 0x86, 0xbb, 0x3d, 0xc4, - 0x2a, 0xd9, 0xd7, 0x1f, 0x72, 0xee, 0xfe, 0x51, 0xa1, 0x22, 0x41, - 0xb1, 0x71, 0x02, 0x63, 0x1a, 0x82, 0xb0, 0x62, 0xab, 0x5e, 0x57, - 0x12, 0x1f, 0xdf, 0xcb, 0xdd, 0x75, 0xa0, 0xc0, 0x5d, 0x79, 0x90, - 0x8c, 0x1b, 0xe0, 0x50, 0xe6, 0xde, 0x31, 0xfe, 0x98, 0x7b, 0x70, - 0x5f, 0xa5, 0x90, 0xd8, 0xad, 0xf8, 0x02, 0xb6, 0x6f, 0xd3, 0x60, - 0xdd, 0x40, 0x4b, 0x22, 0xc5, 0x3d, 0xad, 0x3a, 0x7a, 0x9f, 0x1a, - 0x1a, 0x47, 0x91, 0x79, 0x33, 0xba, 0x82, 0xdc, 0x32, 0x69, 0x03, - 0x96, 0x6e, 0x1f, 0x4b, 0xf0, 0x71, 0xfe, 0xe3, 0x67, 0x72, 0xa0, - 0xb1, 0xbf, 0x5c, 0x8b, 0xe4, 0xfa, 0x99, 0x22, 0xc7, 0x84, 0xb9, - 0x1b, 0x8d, 0x23, 0x97, 0x3f, 0xed, 0x25, 0xe0, 0xcf, 0x65, 0xbb, - 0xf5, 0x61, 0x04, 0xef, 0xdd, 0x1e, 0xb2, 0x5a, 0x41, 0x22, 0x5a, - 0xa1, 0x9f, 0x5d, 0x2c, 0xe8, 0x5b, 0xc9, 0x6d, 0xa9, 0x0c, 0x0c, - 0x78, 0xaa, 0x60, 0xc6, 0x56, 0x8f, 0x01, 0x5a, 0x0c, 0x68, 0xbc, - 0x69, 0x19, 0x79, 0xc4, 0x1f, 0x7e, 0x97, 0x05, 0xbf, 0xc5, 0xe9, - 0x24, 0x51, 0x5e, 0xd4, 0xd5, 0x4b, 0x53, 0xed, 0xd9, 0x23, 0x5a, - 0x36, 0x03, 0x65, 0xa3, 0xc1, 0x03, 0xad, 0x41, 0x30, 0xf3, 0x46, - 0x1b, 0x85, 0x90, 0xaf, 0x65, 0xb5, 0xd5, 0xb1, 0xe4, 0x16, 0x5b, - 0x78, 0x75, 0x1d, 0x97, 0x7a, 0x6d, 0x59, 0xa9, 0x2a, 0x8f, 0x7b, - 0xde, 0xc3, 0x87, 0x89, 0x10, 0x99, 0x49, 0x73, 0x78, 0xc8, 0x3d, - 0xbd, 0x51, 0x35, 0x74, 0x2a, 0xd5, 0xf1, 0x7e, 0x69, 0x1b, 0x2a, - 0xbb, 0x3b, 0xbd, 0x25, 0xb8, 0x9a, 0x5a, 0x3d, 0x72, 0x61, 0x90, - 0x66, 0x87, 0xee, 0x0c, 0xd6, 0x4d, 0xd4, 0x11, 0x74, 0x0b, 0x6a, - 0xfe, 0x0b, 0x03, 0xfc, 0xa3, 0x55, 0x57, 0x89, 0xfe, 0x4a, 0xcb, - 0xae, 0x5b, 0x17, 0x05, 0xc8, 0xf2, 0x8d, 0x23, 0x31, 0x53, 0x38, - 0xd2, 0x2d, 0x6a, 0x3f, 0x82, 0xb9, 0x8d, 0x08, 0x6a, 0xf7, 0x5e, - 0x41, 0x74, 0x6e, 0xc3, 0x11, 0x7e, 0x07, 0xac, 0x29, 0x60, 0x91, - 0x3f, 0x38, 0xca, 0x57, 0x10, 0x0d, 0xbd, 0x30, 0x2f, 0xc7, 0xa5, - 0xe6, 0x41, 0xa0, 0xda, 0xae, 0x05, 0x87, 0x9a, 0xa0, 0xa4, 0x65, - 0x6c, 0x4c, 0x09, 0x0c, 0x89, 0xba, 0xb8, 0xd3, 0xb9, 0xc0, 0x93, - 0x8a, 0x30, 0xfa, 0x8d, 0xe5, 0x9a, 0x6b, 0x15, 0x01, 0x4e, 0x67, - 0xaa, 0xda, 0x62, 0x56, 0x3e, 0x84, 0x08, 0x66, 0xd2, 0xc4, 0x36, - 0x7d, 0xa7, 0x3e, 0x10, 0xfc, 0x88, 0xe0, 0xd4, 0x80, 0xe5, 0x00, - 0xbd, 0xaa, 0xf3, 0x4e, 0x06, 0xa3, 0x7a, 0x6a, 0xf9, 0x62, 0x72, - 0xe3, 0x09, 0x4f, 0xeb, 0x9b, 0x0e, 0x01, 0x23, 0xf1, 0x9f, 0xbb, - 0x7c, 0xdc, 0xdc, 0x6c, 0x11, 0x97, 0x25, 0xb2, 0xf2, 0xb4, 0x63, - 0x14, 0xd2, 0x06, 0x2a, 0x67, 0x8c, 0x83, 0xf5, 0xce, 0xea, 0x07, - 0xd8, 0x9a, 0x6a, 0x1e, 0xec, 0xe4, 0x0a, 0xbb, 0x2a, 0x4c, 0xeb, - 0x09, 0x60, 0x39, 0xce, 0xca, 0x62, 0xd8, 0x2e, 0x6e, 0x30, 0x82, - 0x03, 0x7c, 0x30, 0x82, 0x02, 0x64, 0xa0, 0x03, 0x02, 0x01, 0x02, - 0x02, 0x10, 0x18, 0xac, 0xb5, 0x6a, 0xfd, 0x69, 0xb6, 0x15, 0x3a, - 0x63, 0x6c, 0xaf, 0xda, 0xfa, 0xc4, 0xa1, 0x30, 0x0d, 0x06, 0x09, + 0x20, 0x47, 0x32, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, + 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, + 0x02, 0x01, 0x00, 0xaf, 0xe4, 0xee, 0x7e, 0x8b, 0x24, 0x0e, 0x12, + 0x6e, 0xa9, 0x50, 0x2d, 0x16, 0x44, 0x3b, 0x92, 0x92, 0x5c, 0xca, + 0xb8, 0x5d, 0x84, 0x92, 0x42, 0x13, 0x2a, 0xbc, 0x65, 0x57, 0x82, + 0x40, 0x3e, 0x57, 0x24, 0xcd, 0x50, 0x8b, 0x25, 0x2a, 0xb7, 0x6f, + 0xfc, 0xef, 0xa2, 0xd0, 0xc0, 0x1f, 0x02, 0x24, 0x4a, 0x13, 0x96, + 0x8f, 0x23, 0x13, 0xe6, 0x28, 0x58, 0x00, 0xa3, 0x47, 0xc7, 0x06, + 0xa7, 0x84, 0x23, 0x2b, 0xbb, 0xbd, 0x96, 0x2b, 0x7f, 0x55, 0xcc, + 0x8b, 0xc1, 0x57, 0x1f, 0x0e, 0x62, 0x65, 0x0f, 0xdd, 0x3d, 0x56, + 0x8a, 0x73, 0xda, 0xae, 0x7e, 0x6d, 0xba, 0x81, 0x1c, 0x7e, 0x42, + 0x8c, 0x20, 0x35, 0xd9, 0x43, 0x4d, 0x84, 0xfa, 0x84, 0xdb, 0x52, + 0x2c, 0xf3, 0x0e, 0x27, 0x77, 0x0b, 0x6b, 0xbf, 0x11, 0x2f, 0x72, + 0x78, 0x9f, 0x2e, 0xd8, 0x3e, 0xe6, 0x18, 0x37, 0x5a, 0x2a, 0x72, + 0xf9, 0xda, 0x62, 0x90, 0x92, 0x95, 0xca, 0x1f, 0x9c, 0xe9, 0xb3, + 0x3c, 0x2b, 0xcb, 0xf3, 0x01, 0x13, 0xbf, 0x5a, 0xcf, 0xc1, 0xb5, + 0x0a, 0x60, 0xbd, 0xdd, 0xb5, 0x99, 0x64, 0x53, 0xb8, 0xa0, 0x96, + 0xb3, 0x6f, 0xe2, 0x26, 0x77, 0x91, 0x8c, 0xe0, 0x62, 0x10, 0x02, + 0x9f, 0x34, 0x0f, 0xa4, 0xd5, 0x92, 0x33, 0x51, 0xde, 0xbe, 0x8d, + 0xba, 0x84, 0x7a, 0x60, 0x3c, 0x6a, 0xdb, 0x9f, 0x2b, 0xec, 0xde, + 0xde, 0x01, 0x3f, 0x6e, 0x4d, 0xe5, 0x50, 0x86, 0xcb, 0xb4, 0xaf, + 0xed, 0x44, 0x40, 0xc5, 0xca, 0x5a, 0x8c, 0xda, 0xd2, 0x2b, 0x7c, + 0xa8, 0xee, 0xbe, 0xa6, 0xe5, 0x0a, 0xaa, 0x0e, 0xa5, 0xdf, 0x05, + 0x52, 0xb7, 0x55, 0xc7, 0x22, 0x5d, 0x32, 0x6a, 0x97, 0x97, 0x63, + 0x13, 0xdb, 0xc9, 0xdb, 0x79, 0x36, 0x7b, 0x85, 0x3a, 0x4a, 0xc5, + 0x52, 0x89, 0xf9, 0x24, 0xe7, 0x9d, 0x77, 0xa9, 0x82, 0xff, 0x55, + 0x1c, 0xa5, 0x71, 0x69, 0x2b, 0xd1, 0x02, 0x24, 0xf2, 0xb3, 0x26, + 0xd4, 0x6b, 0xda, 0x04, 0x55, 0xe5, 0xc1, 0x0a, 0xc7, 0x6d, 0x30, + 0x37, 0x90, 0x2a, 0xe4, 0x9e, 0x14, 0x33, 0x5e, 0x16, 0x17, 0x55, + 0xc5, 0x5b, 0xb5, 0xcb, 0x34, 0x89, 0x92, 0xf1, 0x9d, 0x26, 0x8f, + 0xa1, 0x07, 0xd4, 0xc6, 0xb2, 0x78, 0x50, 0xdb, 0x0c, 0x0c, 0x0b, + 0x7c, 0x0b, 0x8c, 0x41, 0xd7, 0xb9, 0xe9, 0xdd, 0x8c, 0x88, 0xf7, + 0xa3, 0x4d, 0xb2, 0x32, 0xcc, 0xd8, 0x17, 0xda, 0xcd, 0xb7, 0xce, + 0x66, 0x9d, 0xd4, 0xfd, 0x5e, 0xff, 0xbd, 0x97, 0x3e, 0x29, 0x75, + 0xe7, 0x7e, 0xa7, 0x62, 0x58, 0xaf, 0x25, 0x34, 0xa5, 0x41, 0xc7, + 0x3d, 0xbc, 0x0d, 0x50, 0xca, 0x03, 0x03, 0x0f, 0x08, 0x5a, 0x1f, + 0x95, 0x73, 0x78, 0x62, 0xbf, 0xaf, 0x72, 0x14, 0x69, 0x0e, 0xa5, + 0xe5, 0x03, 0x0e, 0x78, 0x8e, 0x26, 0x28, 0x42, 0xf0, 0x07, 0x0b, + 0x62, 0x20, 0x10, 0x67, 0x39, 0x46, 0xfa, 0xa9, 0x03, 0xcc, 0x04, + 0x38, 0x7a, 0x66, 0xef, 0x20, 0x83, 0xb5, 0x8c, 0x4a, 0x56, 0x8e, + 0x91, 0x00, 0xfc, 0x8e, 0x5c, 0x82, 0xde, 0x88, 0xa0, 0xc3, 0xe2, + 0x68, 0x6e, 0x7d, 0x8d, 0xef, 0x3c, 0xdd, 0x65, 0xf4, 0x5d, 0xac, + 0x51, 0xef, 0x24, 0x80, 0xae, 0xaa, 0x56, 0x97, 0x6f, 0xf9, 0xad, + 0x7d, 0xda, 0x61, 0x3f, 0x98, 0x77, 0x3c, 0xa5, 0x91, 0xb6, 0x1c, + 0x8c, 0x26, 0xda, 0x65, 0xa2, 0x09, 0x6d, 0xc1, 0xe2, 0x54, 0xe3, + 0xb9, 0xca, 0x4c, 0x4c, 0x80, 0x8f, 0x77, 0x7b, 0x60, 0x9a, 0x1e, + 0xdf, 0xb6, 0xf2, 0x48, 0x1e, 0x0e, 0xba, 0x4e, 0x54, 0x6d, 0x98, + 0xe0, 0xe1, 0xa2, 0x1a, 0xa2, 0x77, 0x50, 0xcf, 0xc4, 0x63, 0x92, + 0xec, 0x47, 0x19, 0x9d, 0xeb, 0xe6, 0x6b, 0xce, 0xc1, 0x02, 0x03, + 0x01, 0x00, 0x01, 0xa3, 0x81, 0xac, 0x30, 0x81, 0xa9, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, + 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, + 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, + 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x5b, 0x25, + 0x7b, 0x96, 0xa4, 0x65, 0x51, 0x7e, 0xb8, 0x39, 0xf3, 0xc0, 0x78, + 0x66, 0x5e, 0xe8, 0x3a, 0xe7, 0xf0, 0xee, 0x30, 0x1f, 0x06, 0x03, + 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x5b, 0x25, + 0x7b, 0x96, 0xa4, 0x65, 0x51, 0x7e, 0xb8, 0x39, 0xf3, 0xc0, 0x78, + 0x66, 0x5e, 0xe8, 0x3a, 0xe7, 0xf0, 0xee, 0x30, 0x46, 0x06, 0x03, + 0x55, 0x1d, 0x20, 0x04, 0x3f, 0x30, 0x3d, 0x30, 0x3b, 0x06, 0x09, + 0x60, 0x85, 0x74, 0x01, 0x59, 0x01, 0x02, 0x01, 0x01, 0x30, 0x2e, + 0x30, 0x2c, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, + 0x01, 0x16, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x73, + 0x77, 0x69, 0x73, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, + 0x27, 0xba, 0xe3, 0x94, 0x7c, 0xf1, 0xae, 0xc0, 0xde, 0x17, 0xe6, + 0xe5, 0xd8, 0xd5, 0xf5, 0x54, 0xb0, 0x83, 0xf4, 0xbb, 0xcd, 0x5e, + 0x05, 0x7b, 0x4f, 0x9f, 0x75, 0x66, 0xaf, 0x3c, 0xe8, 0x56, 0x7e, + 0xfc, 0x72, 0x78, 0x38, 0x03, 0xd9, 0x2b, 0x62, 0x1b, 0x00, 0xb9, + 0xf8, 0xe9, 0x60, 0xcd, 0xcc, 0xce, 0x51, 0x8a, 0xc7, 0x50, 0x31, + 0x6e, 0xe1, 0x4a, 0x7e, 0x18, 0x2f, 0x69, 0x59, 0xb6, 0x3d, 0x64, + 0x81, 0x2b, 0xe3, 0x83, 0x84, 0xe6, 0x22, 0x87, 0x8e, 0x7d, 0xe0, + 0xee, 0x02, 0x99, 0x61, 0xb8, 0x1e, 0xf4, 0xb8, 0x2b, 0x88, 0x12, + 0x16, 0x84, 0xc2, 0x31, 0x93, 0x38, 0x96, 0x31, 0xa6, 0xb9, 0x3b, + 0x53, 0x3f, 0xc3, 0x24, 0x93, 0x56, 0x5b, 0x69, 0x92, 0xec, 0xc5, + 0xc1, 0xbb, 0x38, 0x00, 0xe3, 0xec, 0x17, 0xa9, 0xb8, 0xdc, 0xc7, + 0x7c, 0x01, 0x83, 0x9f, 0x32, 0x47, 0xba, 0x52, 0x22, 0x34, 0x1d, + 0x32, 0x7a, 0x09, 0x56, 0xa7, 0x7c, 0x25, 0x36, 0xa9, 0x3d, 0x4b, + 0xda, 0xc0, 0x82, 0x6f, 0x0a, 0xbb, 0x12, 0xc8, 0x87, 0x4b, 0x27, + 0x11, 0xf9, 0x1e, 0x2d, 0xc7, 0x93, 0x3f, 0x9e, 0xdb, 0x5f, 0x26, + 0x6b, 0x52, 0xd9, 0x2e, 0x8a, 0xf1, 0x14, 0xc6, 0x44, 0x8d, 0x15, + 0xa9, 0xb7, 0xbf, 0xbd, 0xde, 0xa6, 0x1a, 0xee, 0xae, 0x2d, 0xfb, + 0x48, 0x77, 0x17, 0xfe, 0xbb, 0xec, 0xaf, 0x18, 0xf5, 0x2a, 0x51, + 0xf0, 0x39, 0x84, 0x97, 0x95, 0x6c, 0x6e, 0x1b, 0xc3, 0x2b, 0xc4, + 0x74, 0x60, 0x79, 0x25, 0xb0, 0x0a, 0x27, 0xdf, 0xdf, 0x5e, 0xd2, + 0x39, 0xcf, 0x45, 0x7d, 0x42, 0x4b, 0xdf, 0xb3, 0x2c, 0x1e, 0xc5, + 0xc6, 0x5d, 0xca, 0x55, 0x3a, 0xa0, 0x9c, 0x69, 0x9a, 0x8f, 0xda, + 0xef, 0xb2, 0xb0, 0x3c, 0x9f, 0x87, 0x6c, 0x12, 0x2b, 0x65, 0x70, + 0x15, 0x52, 0x31, 0x1a, 0x24, 0xcf, 0x6f, 0x31, 0x23, 0x50, 0x1f, + 0x8c, 0x4f, 0x8f, 0x23, 0xc3, 0x74, 0x41, 0x63, 0x1c, 0x55, 0xa8, + 0x14, 0xdd, 0x3e, 0xe0, 0x51, 0x50, 0xcf, 0xf1, 0x1b, 0x30, 0x56, + 0x0e, 0x92, 0xb0, 0x82, 0x85, 0xd8, 0x83, 0xcb, 0x22, 0x64, 0xbc, + 0x2d, 0xb8, 0x25, 0xd5, 0x54, 0xa2, 0xb8, 0x06, 0xea, 0xad, 0x92, + 0xa4, 0x24, 0xa0, 0xc1, 0x86, 0xb5, 0x4a, 0x13, 0x6a, 0x47, 0xcf, + 0x2e, 0x0b, 0x56, 0x95, 0x54, 0xcb, 0xce, 0x9a, 0xdb, 0x6a, 0xb4, + 0xa6, 0xb2, 0xdb, 0x41, 0x08, 0x86, 0x27, 0x77, 0xf7, 0x6a, 0xa0, + 0x42, 0x6c, 0x0b, 0x38, 0xce, 0xd7, 0x75, 0x50, 0x32, 0x92, 0xc2, + 0xdf, 0x2b, 0x30, 0x22, 0x48, 0xd0, 0xd5, 0x41, 0x38, 0x25, 0x5d, + 0xa4, 0xe9, 0x5d, 0x9f, 0xc6, 0x94, 0x75, 0xd0, 0x45, 0xfd, 0x30, + 0x97, 0x43, 0x8f, 0x90, 0xab, 0x0a, 0xc7, 0x86, 0x73, 0x60, 0x4a, + 0x69, 0x2d, 0xde, 0xa5, 0x78, 0xd7, 0x06, 0xda, 0x6a, 0x9e, 0x4b, + 0x3e, 0x77, 0x3a, 0x20, 0x13, 0x22, 0x01, 0xd0, 0xbf, 0x68, 0x9e, + 0x63, 0x60, 0x6b, 0x35, 0x4d, 0x0b, 0x6d, 0xba, 0xa1, 0x3d, 0xc0, + 0x93, 0xe0, 0x7f, 0x23, 0xb3, 0x55, 0xad, 0x72, 0x25, 0x4e, 0x46, + 0xf9, 0xd2, 0x16, 0xef, 0xb0, 0x64, 0xc1, 0x01, 0x9e, 0xe9, 0xca, + 0xa0, 0x6a, 0x98, 0x0e, 0xcf, 0xd8, 0x60, 0xf2, 0x2f, 0x49, 0xb8, + 0xe4, 0x42, 0xe1, 0x38, 0x35, 0x16, 0xf4, 0xc8, 0x6e, 0x4f, 0xf7, + 0x81, 0x56, 0xe8, 0xba, 0xa3, 0xbe, 0x23, 0xaf, 0xae, 0xfd, 0x6f, + 0x03, 0xe0, 0x02, 0x3b, 0x30, 0x76, 0xfa, 0x1b, 0x6d, 0x41, 0xcf, + 0x01, 0xb1, 0xe9, 0xb8, 0xc9, 0x66, 0xf4, 0xdb, 0x26, 0xf3, 0x3a, + 0xa4, 0x74, 0xf2, 0x49, 0x24, 0x5b, 0xc9, 0xb0, 0xd0, 0x57, 0xc1, + 0xfa, 0x3e, 0x7a, 0xe1, 0x97, 0xc9, 0x30, 0x82, 0x05, 0xbd, 0x30, + 0x82, 0x03, 0xa5, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x4f, + 0x1b, 0xd4, 0x2f, 0x54, 0xbb, 0x2f, 0x4b, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, - 0x30, 0x58, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x13, 0x0d, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x31, 0x30, 0x2f, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x13, 0x28, 0x47, 0x65, 0x6f, 0x54, 0x72, - 0x75, 0x73, 0x74, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x31, 0x32, - 0x37, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, - 0x36, 0x30, 0x37, 0x31, 0x36, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, - 0x5a, 0x30, 0x58, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, - 0x73, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x31, 0x30, 0x2f, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x28, 0x47, 0x65, 0x6f, 0x54, - 0x72, 0x75, 0x73, 0x74, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x43, 0x48, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x13, 0x0c, 0x53, 0x77, 0x69, 0x73, 0x73, 0x53, 0x69, + 0x67, 0x6e, 0x20, 0x41, 0x47, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x13, 0x18, 0x53, 0x77, 0x69, 0x73, 0x73, 0x53, + 0x69, 0x67, 0x6e, 0x20, 0x53, 0x69, 0x6c, 0x76, 0x65, 0x72, 0x20, + 0x43, 0x41, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x1e, 0x17, 0x0d, + 0x30, 0x36, 0x31, 0x30, 0x32, 0x35, 0x30, 0x38, 0x33, 0x32, 0x34, + 0x36, 0x5a, 0x17, 0x0d, 0x33, 0x36, 0x31, 0x30, 0x32, 0x35, 0x30, + 0x38, 0x33, 0x32, 0x34, 0x36, 0x5a, 0x30, 0x47, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x43, 0x48, 0x31, + 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x53, + 0x77, 0x69, 0x73, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x41, 0x47, + 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, + 0x53, 0x77, 0x69, 0x73, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x53, + 0x69, 0x6c, 0x76, 0x65, 0x72, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, + 0x47, 0x32, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, + 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, + 0x01, 0x00, 0xc4, 0xf1, 0x87, 0x7f, 0xd3, 0x78, 0x31, 0xf7, 0x38, + 0xc9, 0xf8, 0xc3, 0x99, 0x43, 0xbc, 0xc7, 0xf7, 0xbc, 0x37, 0xe7, + 0x4e, 0x71, 0xba, 0x4b, 0x8f, 0xa5, 0x73, 0x1d, 0x5c, 0x6e, 0x98, + 0xae, 0x03, 0x57, 0xae, 0x38, 0x37, 0x43, 0x2f, 0x17, 0x3d, 0x1f, + 0xc8, 0xce, 0x68, 0x10, 0xc1, 0x78, 0xae, 0x19, 0x03, 0x2b, 0x10, + 0xfa, 0x2c, 0x79, 0x83, 0xf6, 0xe8, 0xb9, 0x68, 0xb9, 0x55, 0xf2, + 0x04, 0x44, 0xa7, 0x39, 0xf9, 0xfc, 0x04, 0x8b, 0x1e, 0xf1, 0xa2, + 0x4d, 0x27, 0xf9, 0x61, 0x7b, 0xba, 0xb7, 0xe5, 0xa2, 0x13, 0xb6, + 0xeb, 0x61, 0x3e, 0xd0, 0x6c, 0xd1, 0xe6, 0xfb, 0xfa, 0x5e, 0xed, + 0x1d, 0xb4, 0x9e, 0xa0, 0x35, 0x5b, 0xa1, 0x92, 0xcb, 0xf0, 0x49, + 0x92, 0xfe, 0x85, 0x0a, 0x05, 0x3e, 0xe6, 0xd9, 0x0b, 0xe2, 0x4f, + 0xbb, 0xdc, 0x95, 0x37, 0xfc, 0x91, 0xe9, 0x32, 0x35, 0x22, 0xd1, + 0x1f, 0x3a, 0x4e, 0x27, 0x85, 0x9d, 0xb0, 0x15, 0x94, 0x32, 0xda, + 0x61, 0x0d, 0x47, 0x4d, 0x60, 0x42, 0xae, 0x92, 0x47, 0xe8, 0x83, + 0x5a, 0x50, 0x58, 0xe9, 0x8a, 0x8b, 0xb9, 0x5d, 0xa1, 0xdc, 0xdd, + 0x99, 0x4a, 0x1f, 0x36, 0x67, 0xbb, 0x48, 0xe4, 0x83, 0xb6, 0x37, + 0xeb, 0x48, 0x3a, 0xaf, 0x0f, 0x67, 0x8f, 0x17, 0x07, 0xe8, 0x04, + 0xca, 0xef, 0x6a, 0x31, 0x87, 0xd4, 0xc0, 0xb6, 0xf9, 0x94, 0x71, + 0x7b, 0x67, 0x64, 0xb8, 0xb6, 0x91, 0x4a, 0x42, 0x7b, 0x65, 0x2e, + 0x30, 0x6a, 0x0c, 0xf5, 0x90, 0xee, 0x95, 0xe6, 0xf2, 0xcd, 0x82, + 0xec, 0xd9, 0xa1, 0x4a, 0xec, 0xf6, 0xb2, 0x4b, 0xe5, 0x45, 0x85, + 0xe6, 0x6d, 0x78, 0x93, 0x04, 0x2e, 0x9c, 0x82, 0x6d, 0x36, 0xa9, + 0xc4, 0x31, 0x64, 0x1f, 0x86, 0x83, 0x0b, 0x2a, 0xf4, 0x35, 0x0a, + 0x78, 0xc9, 0x55, 0xcf, 0x41, 0xb0, 0x47, 0xe9, 0x30, 0x9f, 0x99, + 0xbe, 0x61, 0xa8, 0x06, 0x84, 0xb9, 0x28, 0x7a, 0x5f, 0x38, 0xd9, + 0x1b, 0xa9, 0x38, 0xb0, 0x83, 0x7f, 0x73, 0xc1, 0xc3, 0x3b, 0x48, + 0x2a, 0x82, 0x0f, 0x21, 0x9b, 0xb8, 0xcc, 0xa8, 0x35, 0xc3, 0x84, + 0x1b, 0x83, 0xb3, 0x3e, 0xbe, 0xa4, 0x95, 0x69, 0x01, 0x3a, 0x89, + 0x00, 0x78, 0x04, 0xd9, 0xc9, 0xf4, 0x99, 0x19, 0xab, 0x56, 0x7e, + 0x5b, 0x8b, 0x86, 0x39, 0x15, 0x91, 0xa4, 0x10, 0x2c, 0x09, 0x32, + 0x80, 0x60, 0xb3, 0x93, 0xc0, 0x2a, 0xb6, 0x18, 0x0b, 0x9d, 0x7e, + 0x8d, 0x49, 0xf2, 0x10, 0x4a, 0x7f, 0xf9, 0xd5, 0x46, 0x2f, 0x19, + 0x92, 0xa3, 0x99, 0xa7, 0x26, 0xac, 0xbb, 0x8c, 0x3c, 0xe6, 0x0e, + 0xbc, 0x47, 0x07, 0xdc, 0x73, 0x51, 0xf1, 0x70, 0x64, 0x2f, 0x08, + 0xf9, 0xb4, 0x47, 0x1d, 0x30, 0x6c, 0x44, 0xea, 0x29, 0x37, 0x85, + 0x92, 0x68, 0x66, 0xbc, 0x83, 0x38, 0xfe, 0x7b, 0x39, 0x2e, 0xd3, + 0x50, 0xf0, 0x1f, 0xfb, 0x5e, 0x60, 0xb6, 0xa9, 0xa6, 0xfa, 0x27, + 0x41, 0xf1, 0x9b, 0x18, 0x72, 0xf2, 0xf5, 0x84, 0x74, 0x4a, 0xc9, + 0x67, 0xc4, 0x54, 0xae, 0x48, 0x64, 0xdf, 0x8c, 0xd1, 0x6e, 0xb0, + 0x1d, 0xe1, 0x07, 0x8f, 0x08, 0x1e, 0x99, 0x9c, 0x71, 0xe9, 0x4c, + 0xd8, 0xa5, 0xf7, 0x47, 0x12, 0x1f, 0x74, 0xd1, 0x51, 0x9e, 0x86, + 0xf3, 0xc2, 0xa2, 0x23, 0x40, 0x0b, 0x73, 0xdb, 0x4b, 0xa6, 0xe7, + 0x73, 0x06, 0x8c, 0xc1, 0xa0, 0xe9, 0xc1, 0x59, 0xac, 0x46, 0xfa, + 0xe6, 0x2f, 0xf8, 0xcf, 0x71, 0x9c, 0x46, 0x6d, 0xb9, 0xc4, 0x15, + 0x8d, 0x38, 0x79, 0x03, 0x45, 0x48, 0xef, 0xc4, 0x5d, 0xd7, 0x08, + 0xee, 0x87, 0x39, 0x22, 0x86, 0xb2, 0x0d, 0x0f, 0x58, 0x43, 0xf7, + 0x71, 0xa9, 0x48, 0x2e, 0xfd, 0xea, 0xd6, 0x1f, 0x02, 0x03, 0x01, + 0x00, 0x01, 0xa3, 0x81, 0xac, 0x30, 0x81, 0xa9, 0x30, 0x0e, 0x06, + 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, + 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, + 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, + 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x17, 0xa0, 0xcd, + 0xc1, 0xe4, 0x41, 0xb6, 0x3a, 0x5b, 0x3b, 0xcb, 0x45, 0x9d, 0xbd, + 0x1c, 0xc2, 0x98, 0xfa, 0x86, 0x58, 0x30, 0x1f, 0x06, 0x03, 0x55, + 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x17, 0xa0, 0xcd, + 0xc1, 0xe4, 0x41, 0xb6, 0x3a, 0x5b, 0x3b, 0xcb, 0x45, 0x9d, 0xbd, + 0x1c, 0xc2, 0x98, 0xfa, 0x86, 0x58, 0x30, 0x46, 0x06, 0x03, 0x55, + 0x1d, 0x20, 0x04, 0x3f, 0x30, 0x3d, 0x30, 0x3b, 0x06, 0x09, 0x60, + 0x85, 0x74, 0x01, 0x59, 0x01, 0x03, 0x01, 0x01, 0x30, 0x2e, 0x30, + 0x2c, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, + 0x16, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x72, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x73, 0x77, + 0x69, 0x73, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x73, + 0xc6, 0x81, 0xe0, 0x27, 0xd2, 0x2d, 0x0f, 0xe0, 0x95, 0x30, 0xe2, + 0x9a, 0x41, 0x7f, 0x50, 0x2c, 0x5f, 0x5f, 0x62, 0x61, 0xa9, 0x86, + 0x6a, 0x69, 0x18, 0x0c, 0x74, 0x49, 0xd6, 0x5d, 0x84, 0xea, 0x41, + 0x52, 0x18, 0x6f, 0x58, 0xad, 0x50, 0x56, 0x20, 0x6a, 0xc6, 0xbd, + 0x28, 0x69, 0x58, 0x91, 0xdc, 0x91, 0x11, 0x35, 0xa9, 0x3a, 0x1d, + 0xbc, 0x1a, 0xa5, 0x60, 0x9e, 0xd8, 0x1f, 0x7f, 0x45, 0x91, 0x69, + 0xd9, 0x7e, 0xbb, 0x78, 0x72, 0xc1, 0x06, 0x0f, 0x2a, 0xce, 0x8f, + 0x85, 0x70, 0x61, 0xac, 0xa0, 0xcd, 0x0b, 0xb8, 0x39, 0x29, 0x56, + 0x84, 0x32, 0x4e, 0x86, 0xbb, 0x3d, 0xc4, 0x2a, 0xd9, 0xd7, 0x1f, + 0x72, 0xee, 0xfe, 0x51, 0xa1, 0x22, 0x41, 0xb1, 0x71, 0x02, 0x63, + 0x1a, 0x82, 0xb0, 0x62, 0xab, 0x5e, 0x57, 0x12, 0x1f, 0xdf, 0xcb, + 0xdd, 0x75, 0xa0, 0xc0, 0x5d, 0x79, 0x90, 0x8c, 0x1b, 0xe0, 0x50, + 0xe6, 0xde, 0x31, 0xfe, 0x98, 0x7b, 0x70, 0x5f, 0xa5, 0x90, 0xd8, + 0xad, 0xf8, 0x02, 0xb6, 0x6f, 0xd3, 0x60, 0xdd, 0x40, 0x4b, 0x22, + 0xc5, 0x3d, 0xad, 0x3a, 0x7a, 0x9f, 0x1a, 0x1a, 0x47, 0x91, 0x79, + 0x33, 0xba, 0x82, 0xdc, 0x32, 0x69, 0x03, 0x96, 0x6e, 0x1f, 0x4b, + 0xf0, 0x71, 0xfe, 0xe3, 0x67, 0x72, 0xa0, 0xb1, 0xbf, 0x5c, 0x8b, + 0xe4, 0xfa, 0x99, 0x22, 0xc7, 0x84, 0xb9, 0x1b, 0x8d, 0x23, 0x97, + 0x3f, 0xed, 0x25, 0xe0, 0xcf, 0x65, 0xbb, 0xf5, 0x61, 0x04, 0xef, + 0xdd, 0x1e, 0xb2, 0x5a, 0x41, 0x22, 0x5a, 0xa1, 0x9f, 0x5d, 0x2c, + 0xe8, 0x5b, 0xc9, 0x6d, 0xa9, 0x0c, 0x0c, 0x78, 0xaa, 0x60, 0xc6, + 0x56, 0x8f, 0x01, 0x5a, 0x0c, 0x68, 0xbc, 0x69, 0x19, 0x79, 0xc4, + 0x1f, 0x7e, 0x97, 0x05, 0xbf, 0xc5, 0xe9, 0x24, 0x51, 0x5e, 0xd4, + 0xd5, 0x4b, 0x53, 0xed, 0xd9, 0x23, 0x5a, 0x36, 0x03, 0x65, 0xa3, + 0xc1, 0x03, 0xad, 0x41, 0x30, 0xf3, 0x46, 0x1b, 0x85, 0x90, 0xaf, + 0x65, 0xb5, 0xd5, 0xb1, 0xe4, 0x16, 0x5b, 0x78, 0x75, 0x1d, 0x97, + 0x7a, 0x6d, 0x59, 0xa9, 0x2a, 0x8f, 0x7b, 0xde, 0xc3, 0x87, 0x89, + 0x10, 0x99, 0x49, 0x73, 0x78, 0xc8, 0x3d, 0xbd, 0x51, 0x35, 0x74, + 0x2a, 0xd5, 0xf1, 0x7e, 0x69, 0x1b, 0x2a, 0xbb, 0x3b, 0xbd, 0x25, + 0xb8, 0x9a, 0x5a, 0x3d, 0x72, 0x61, 0x90, 0x66, 0x87, 0xee, 0x0c, + 0xd6, 0x4d, 0xd4, 0x11, 0x74, 0x0b, 0x6a, 0xfe, 0x0b, 0x03, 0xfc, + 0xa3, 0x55, 0x57, 0x89, 0xfe, 0x4a, 0xcb, 0xae, 0x5b, 0x17, 0x05, + 0xc8, 0xf2, 0x8d, 0x23, 0x31, 0x53, 0x38, 0xd2, 0x2d, 0x6a, 0x3f, + 0x82, 0xb9, 0x8d, 0x08, 0x6a, 0xf7, 0x5e, 0x41, 0x74, 0x6e, 0xc3, + 0x11, 0x7e, 0x07, 0xac, 0x29, 0x60, 0x91, 0x3f, 0x38, 0xca, 0x57, + 0x10, 0x0d, 0xbd, 0x30, 0x2f, 0xc7, 0xa5, 0xe6, 0x41, 0xa0, 0xda, + 0xae, 0x05, 0x87, 0x9a, 0xa0, 0xa4, 0x65, 0x6c, 0x4c, 0x09, 0x0c, + 0x89, 0xba, 0xb8, 0xd3, 0xb9, 0xc0, 0x93, 0x8a, 0x30, 0xfa, 0x8d, + 0xe5, 0x9a, 0x6b, 0x15, 0x01, 0x4e, 0x67, 0xaa, 0xda, 0x62, 0x56, + 0x3e, 0x84, 0x08, 0x66, 0xd2, 0xc4, 0x36, 0x7d, 0xa7, 0x3e, 0x10, + 0xfc, 0x88, 0xe0, 0xd4, 0x80, 0xe5, 0x00, 0xbd, 0xaa, 0xf3, 0x4e, + 0x06, 0xa3, 0x7a, 0x6a, 0xf9, 0x62, 0x72, 0xe3, 0x09, 0x4f, 0xeb, + 0x9b, 0x0e, 0x01, 0x23, 0xf1, 0x9f, 0xbb, 0x7c, 0xdc, 0xdc, 0x6c, + 0x11, 0x97, 0x25, 0xb2, 0xf2, 0xb4, 0x63, 0x14, 0xd2, 0x06, 0x2a, + 0x67, 0x8c, 0x83, 0xf5, 0xce, 0xea, 0x07, 0xd8, 0x9a, 0x6a, 0x1e, + 0xec, 0xe4, 0x0a, 0xbb, 0x2a, 0x4c, 0xeb, 0x09, 0x60, 0x39, 0xce, + 0xca, 0x62, 0xd8, 0x2e, 0x6e, 0x30, 0x82, 0x03, 0x7c, 0x30, 0x82, + 0x02, 0x64, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x18, 0xac, + 0xb5, 0x6a, 0xfd, 0x69, 0xb6, 0x15, 0x3a, 0x63, 0x6c, 0xaf, 0xda, + 0xfa, 0xc4, 0xa1, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x58, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, + 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, + 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x49, 0x6e, + 0x63, 0x2e, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x28, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, + 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x43, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, + 0x17, 0x0d, 0x30, 0x36, 0x31, 0x31, 0x32, 0x37, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x36, 0x30, 0x37, 0x31, + 0x36, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x58, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, + 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x0d, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x49, + 0x6e, 0x63, 0x2e, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x28, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, + 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, + 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, + 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbe, + 0xb8, 0x15, 0x7b, 0xff, 0xd4, 0x7c, 0x7d, 0x67, 0xad, 0x83, 0x64, + 0x7b, 0xc8, 0x42, 0x53, 0x2d, 0xdf, 0xf6, 0x84, 0x08, 0x20, 0x61, + 0xd6, 0x01, 0x59, 0x6a, 0x9c, 0x44, 0x11, 0xaf, 0xef, 0x76, 0xfd, + 0x95, 0x7e, 0xce, 0x61, 0x30, 0xbb, 0x7a, 0x83, 0x5f, 0x02, 0xbd, + 0x01, 0x66, 0xca, 0xee, 0x15, 0x8d, 0x6f, 0xa1, 0x30, 0x9c, 0xbd, + 0xa1, 0x85, 0x9e, 0x94, 0x3a, 0xf3, 0x56, 0x88, 0x00, 0x31, 0xcf, + 0xd8, 0xee, 0x6a, 0x96, 0x02, 0xd9, 0xed, 0x03, 0x8c, 0xfb, 0x75, + 0x6d, 0xe7, 0xea, 0xb8, 0x55, 0x16, 0x05, 0x16, 0x9a, 0xf4, 0xe0, + 0x5e, 0xb1, 0x88, 0xc0, 0x64, 0x85, 0x5c, 0x15, 0x4d, 0x88, 0xc7, + 0xb7, 0xba, 0xe0, 0x75, 0xe9, 0xad, 0x05, 0x3d, 0x9d, 0xc7, 0x89, + 0x48, 0xe0, 0xbb, 0x28, 0xc8, 0x03, 0xe1, 0x30, 0x93, 0x64, 0x5e, + 0x52, 0xc0, 0x59, 0x70, 0x22, 0x35, 0x57, 0x88, 0x8a, 0xf1, 0x95, + 0x0a, 0x83, 0xd7, 0xbc, 0x31, 0x73, 0x01, 0x34, 0xed, 0xef, 0x46, + 0x71, 0xe0, 0x6b, 0x02, 0xa8, 0x35, 0x72, 0x6b, 0x97, 0x9b, 0x66, + 0xe0, 0xcb, 0x1c, 0x79, 0x5f, 0xd8, 0x1a, 0x04, 0x68, 0x1e, 0x47, + 0x02, 0xe6, 0x9d, 0x60, 0xe2, 0x36, 0x97, 0x01, 0xdf, 0xce, 0x35, + 0x92, 0xdf, 0xbe, 0x67, 0xc7, 0x6d, 0x77, 0x59, 0x3b, 0x8f, 0x9d, + 0xd6, 0x90, 0x15, 0x94, 0xbc, 0x42, 0x34, 0x10, 0xc1, 0x39, 0xf9, + 0xb1, 0x27, 0x3e, 0x7e, 0xd6, 0x8a, 0x75, 0xc5, 0xb2, 0xaf, 0x96, + 0xd3, 0xa2, 0xde, 0x9b, 0xe4, 0x98, 0xbe, 0x7d, 0xe1, 0xe9, 0x81, + 0xad, 0xb6, 0x6f, 0xfc, 0xd7, 0x0e, 0xda, 0xe0, 0x34, 0xb0, 0x0d, + 0x1a, 0x77, 0xe7, 0xe3, 0x08, 0x98, 0xef, 0x58, 0xfa, 0x9c, 0x84, + 0xb7, 0x36, 0xaf, 0xc2, 0xdf, 0xac, 0xd2, 0xf4, 0x10, 0x06, 0x70, + 0x71, 0x35, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, + 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0x2c, 0xd5, 0x50, 0x41, 0x97, 0x15, 0x8b, 0xf0, 0x8f, 0x36, 0x61, + 0x5b, 0x4a, 0xfb, 0x6b, 0xd9, 0x99, 0xc9, 0x33, 0x92, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x5a, 0x70, 0x7f, 0x2c, + 0xdd, 0xb7, 0x34, 0x4f, 0xf5, 0x86, 0x51, 0xa9, 0x26, 0xbe, 0x4b, + 0xb8, 0xaa, 0xf1, 0x71, 0x0d, 0xdc, 0x61, 0xc7, 0xa0, 0xea, 0x34, + 0x1e, 0x7a, 0x77, 0x0f, 0x04, 0x35, 0xe8, 0x27, 0x8f, 0x6c, 0x90, + 0xbf, 0x91, 0x16, 0x24, 0x46, 0x3e, 0x4a, 0x4e, 0xce, 0x2b, 0x16, + 0xd5, 0x0b, 0x52, 0x1d, 0xfc, 0x1f, 0x67, 0xa2, 0x02, 0x45, 0x31, + 0x4f, 0xce, 0xf3, 0xfa, 0x03, 0xa7, 0x79, 0x9d, 0x53, 0x6a, 0xd9, + 0xda, 0x63, 0x3a, 0xf8, 0x80, 0xd7, 0xd3, 0x99, 0xe1, 0xa5, 0xe1, + 0xbe, 0xd4, 0x55, 0x71, 0x98, 0x35, 0x3a, 0xbe, 0x93, 0xea, 0xae, + 0xad, 0x42, 0xb2, 0x90, 0x6f, 0xe0, 0xfc, 0x21, 0x4d, 0x35, 0x63, + 0x33, 0x89, 0x49, 0xd6, 0x9b, 0x4e, 0xca, 0xc7, 0xe7, 0x4e, 0x09, + 0x00, 0xf7, 0xda, 0xc7, 0xef, 0x99, 0x62, 0x99, 0x77, 0xb6, 0x95, + 0x22, 0x5e, 0x8a, 0xa0, 0xab, 0xf4, 0xb8, 0x78, 0x98, 0xca, 0x38, + 0x19, 0x99, 0xc9, 0x72, 0x9e, 0x78, 0xcd, 0x4b, 0xac, 0xaf, 0x19, + 0xa0, 0x73, 0x12, 0x2d, 0xfc, 0xc2, 0x41, 0xba, 0x81, 0x91, 0xda, + 0x16, 0x5a, 0x31, 0xb7, 0xf9, 0xb4, 0x71, 0x80, 0x12, 0x48, 0x99, + 0x72, 0x73, 0x5a, 0x59, 0x53, 0xc1, 0x63, 0x52, 0x33, 0xed, 0xa7, + 0xc9, 0xd2, 0x39, 0x02, 0x70, 0xfa, 0xe0, 0xb1, 0x42, 0x66, 0x29, + 0xaa, 0x9b, 0x51, 0xed, 0x30, 0x54, 0x22, 0x14, 0x5f, 0xd9, 0xab, + 0x1d, 0xc1, 0xe4, 0x94, 0xf0, 0xf8, 0xf5, 0x2b, 0xf7, 0xea, 0xca, + 0x78, 0x46, 0xd6, 0xb8, 0x91, 0xfd, 0xa6, 0x0d, 0x2b, 0x1a, 0x14, + 0x01, 0x3e, 0x80, 0xf0, 0x42, 0xa0, 0x95, 0x07, 0x5e, 0x6d, 0xcd, + 0xcc, 0x4b, 0xa4, 0x45, 0x8d, 0xab, 0x12, 0xe8, 0xb3, 0xde, 0x5a, + 0xe5, 0xa0, 0x7c, 0xe8, 0x0f, 0x22, 0x1d, 0x5a, 0xe9, 0x59, 0x30, + 0x82, 0x04, 0x20, 0x30, 0x82, 0x03, 0x08, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x10, 0x34, 0x4e, 0xd5, 0x57, 0x20, 0xd5, 0xed, 0xec, + 0x49, 0xf4, 0x2f, 0xce, 0x37, 0xdb, 0x2b, 0x6d, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x30, 0x81, 0xa9, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, + 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x74, 0x68, 0x61, 0x77, 0x74, + 0x65, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x28, 0x30, 0x26, + 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1f, 0x43, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x44, 0x69, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, + 0x55, 0x04, 0x0b, 0x13, 0x2f, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, + 0x30, 0x36, 0x20, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65, 0x2c, 0x20, + 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x2d, 0x20, 0x46, 0x6f, 0x72, 0x20, + 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, + 0x75, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x31, 0x1f, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x16, 0x74, 0x68, 0x61, + 0x77, 0x74, 0x65, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, + 0x0d, 0x30, 0x36, 0x31, 0x31, 0x31, 0x37, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x36, 0x30, 0x37, 0x31, 0x36, + 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0xa9, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, + 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x0c, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65, 0x2c, 0x20, 0x49, 0x6e, + 0x63, 0x2e, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x0b, + 0x13, 0x1f, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x20, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2f, + 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x36, 0x20, 0x74, 0x68, + 0x61, 0x77, 0x74, 0x65, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, + 0x2d, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, + 0x6e, 0x6c, 0x79, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x16, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65, 0x20, 0x50, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x52, 0x6f, 0x6f, 0x74, + 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, - 0x01, 0x01, 0x00, 0xbe, 0xb8, 0x15, 0x7b, 0xff, 0xd4, 0x7c, 0x7d, - 0x67, 0xad, 0x83, 0x64, 0x7b, 0xc8, 0x42, 0x53, 0x2d, 0xdf, 0xf6, - 0x84, 0x08, 0x20, 0x61, 0xd6, 0x01, 0x59, 0x6a, 0x9c, 0x44, 0x11, - 0xaf, 0xef, 0x76, 0xfd, 0x95, 0x7e, 0xce, 0x61, 0x30, 0xbb, 0x7a, - 0x83, 0x5f, 0x02, 0xbd, 0x01, 0x66, 0xca, 0xee, 0x15, 0x8d, 0x6f, - 0xa1, 0x30, 0x9c, 0xbd, 0xa1, 0x85, 0x9e, 0x94, 0x3a, 0xf3, 0x56, - 0x88, 0x00, 0x31, 0xcf, 0xd8, 0xee, 0x6a, 0x96, 0x02, 0xd9, 0xed, - 0x03, 0x8c, 0xfb, 0x75, 0x6d, 0xe7, 0xea, 0xb8, 0x55, 0x16, 0x05, - 0x16, 0x9a, 0xf4, 0xe0, 0x5e, 0xb1, 0x88, 0xc0, 0x64, 0x85, 0x5c, - 0x15, 0x4d, 0x88, 0xc7, 0xb7, 0xba, 0xe0, 0x75, 0xe9, 0xad, 0x05, - 0x3d, 0x9d, 0xc7, 0x89, 0x48, 0xe0, 0xbb, 0x28, 0xc8, 0x03, 0xe1, - 0x30, 0x93, 0x64, 0x5e, 0x52, 0xc0, 0x59, 0x70, 0x22, 0x35, 0x57, - 0x88, 0x8a, 0xf1, 0x95, 0x0a, 0x83, 0xd7, 0xbc, 0x31, 0x73, 0x01, - 0x34, 0xed, 0xef, 0x46, 0x71, 0xe0, 0x6b, 0x02, 0xa8, 0x35, 0x72, - 0x6b, 0x97, 0x9b, 0x66, 0xe0, 0xcb, 0x1c, 0x79, 0x5f, 0xd8, 0x1a, - 0x04, 0x68, 0x1e, 0x47, 0x02, 0xe6, 0x9d, 0x60, 0xe2, 0x36, 0x97, - 0x01, 0xdf, 0xce, 0x35, 0x92, 0xdf, 0xbe, 0x67, 0xc7, 0x6d, 0x77, - 0x59, 0x3b, 0x8f, 0x9d, 0xd6, 0x90, 0x15, 0x94, 0xbc, 0x42, 0x34, - 0x10, 0xc1, 0x39, 0xf9, 0xb1, 0x27, 0x3e, 0x7e, 0xd6, 0x8a, 0x75, - 0xc5, 0xb2, 0xaf, 0x96, 0xd3, 0xa2, 0xde, 0x9b, 0xe4, 0x98, 0xbe, - 0x7d, 0xe1, 0xe9, 0x81, 0xad, 0xb6, 0x6f, 0xfc, 0xd7, 0x0e, 0xda, - 0xe0, 0x34, 0xb0, 0x0d, 0x1a, 0x77, 0xe7, 0xe3, 0x08, 0x98, 0xef, - 0x58, 0xfa, 0x9c, 0x84, 0xb7, 0x36, 0xaf, 0xc2, 0xdf, 0xac, 0xd2, - 0xf4, 0x10, 0x06, 0x70, 0x71, 0x35, 0x02, 0x03, 0x01, 0x00, 0x01, + 0x01, 0x01, 0x00, 0xac, 0xa0, 0xf0, 0xfb, 0x80, 0x59, 0xd4, 0x9c, + 0xc7, 0xa4, 0xcf, 0x9d, 0xa1, 0x59, 0x73, 0x09, 0x10, 0x45, 0x0c, + 0x0d, 0x2c, 0x6e, 0x68, 0xf1, 0x6c, 0x5b, 0x48, 0x68, 0x49, 0x59, + 0x37, 0xfc, 0x0b, 0x33, 0x19, 0xc2, 0x77, 0x7f, 0xcc, 0x10, 0x2d, + 0x95, 0x34, 0x1c, 0xe6, 0xeb, 0x4d, 0x09, 0xa7, 0x1c, 0xd2, 0xb8, + 0xc9, 0x97, 0x36, 0x02, 0xb7, 0x89, 0xd4, 0x24, 0x5f, 0x06, 0xc0, + 0xcc, 0x44, 0x94, 0x94, 0x8d, 0x02, 0x62, 0x6f, 0xeb, 0x5a, 0xdd, + 0x11, 0x8d, 0x28, 0x9a, 0x5c, 0x84, 0x90, 0x10, 0x7a, 0x0d, 0xbd, + 0x74, 0x66, 0x2f, 0x6a, 0x38, 0xa0, 0xe2, 0xd5, 0x54, 0x44, 0xeb, + 0x1d, 0x07, 0x9f, 0x07, 0xba, 0x6f, 0xee, 0xe9, 0xfd, 0x4e, 0x0b, + 0x29, 0xf5, 0x3e, 0x84, 0xa0, 0x01, 0xf1, 0x9c, 0xab, 0xf8, 0x1c, + 0x7e, 0x89, 0xa4, 0xe8, 0xa1, 0xd8, 0x71, 0x65, 0x0d, 0xa3, 0x51, + 0x7b, 0xee, 0xbc, 0xd2, 0x22, 0x60, 0x0d, 0xb9, 0x5b, 0x9d, 0xdf, + 0xba, 0xfc, 0x51, 0x5b, 0x0b, 0xaf, 0x98, 0xb2, 0xe9, 0x2e, 0xe9, + 0x04, 0xe8, 0x62, 0x87, 0xde, 0x2b, 0xc8, 0xd7, 0x4e, 0xc1, 0x4c, + 0x64, 0x1e, 0xdd, 0xcf, 0x87, 0x58, 0xba, 0x4a, 0x4f, 0xca, 0x68, + 0x07, 0x1d, 0x1c, 0x9d, 0x4a, 0xc6, 0xd5, 0x2f, 0x91, 0xcc, 0x7c, + 0x71, 0x72, 0x1c, 0xc5, 0xc0, 0x67, 0xeb, 0x32, 0xfd, 0xc9, 0x92, + 0x5c, 0x94, 0xda, 0x85, 0xc0, 0x9b, 0xbf, 0x53, 0x7d, 0x2b, 0x09, + 0xf4, 0x8c, 0x9d, 0x91, 0x1f, 0x97, 0x6a, 0x52, 0xcb, 0xde, 0x09, + 0x36, 0xa4, 0x77, 0xd8, 0x7b, 0x87, 0x50, 0x44, 0xd5, 0x3e, 0x6e, + 0x29, 0x69, 0xfb, 0x39, 0x49, 0x26, 0x1e, 0x09, 0xa5, 0x80, 0x7b, + 0x40, 0x2d, 0xeb, 0xe8, 0x27, 0x85, 0xc9, 0xfe, 0x61, 0xfd, 0x7e, + 0xe6, 0x7c, 0x97, 0x1d, 0xd5, 0x9d, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, - 0x04, 0x16, 0x04, 0x14, 0x2c, 0xd5, 0x50, 0x41, 0x97, 0x15, 0x8b, - 0xf0, 0x8f, 0x36, 0x61, 0x5b, 0x4a, 0xfb, 0x6b, 0xd9, 0x99, 0xc9, - 0x33, 0x92, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x04, 0x16, 0x04, 0x14, 0x7b, 0x5b, 0x45, 0xcf, 0xaf, 0xce, 0xcb, + 0x7a, 0xfd, 0x31, 0x92, 0x1a, 0x6a, 0xb6, 0xf3, 0x46, 0xeb, 0x57, + 0x48, 0x50, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, - 0x5a, 0x70, 0x7f, 0x2c, 0xdd, 0xb7, 0x34, 0x4f, 0xf5, 0x86, 0x51, - 0xa9, 0x26, 0xbe, 0x4b, 0xb8, 0xaa, 0xf1, 0x71, 0x0d, 0xdc, 0x61, - 0xc7, 0xa0, 0xea, 0x34, 0x1e, 0x7a, 0x77, 0x0f, 0x04, 0x35, 0xe8, - 0x27, 0x8f, 0x6c, 0x90, 0xbf, 0x91, 0x16, 0x24, 0x46, 0x3e, 0x4a, - 0x4e, 0xce, 0x2b, 0x16, 0xd5, 0x0b, 0x52, 0x1d, 0xfc, 0x1f, 0x67, - 0xa2, 0x02, 0x45, 0x31, 0x4f, 0xce, 0xf3, 0xfa, 0x03, 0xa7, 0x79, - 0x9d, 0x53, 0x6a, 0xd9, 0xda, 0x63, 0x3a, 0xf8, 0x80, 0xd7, 0xd3, - 0x99, 0xe1, 0xa5, 0xe1, 0xbe, 0xd4, 0x55, 0x71, 0x98, 0x35, 0x3a, - 0xbe, 0x93, 0xea, 0xae, 0xad, 0x42, 0xb2, 0x90, 0x6f, 0xe0, 0xfc, - 0x21, 0x4d, 0x35, 0x63, 0x33, 0x89, 0x49, 0xd6, 0x9b, 0x4e, 0xca, - 0xc7, 0xe7, 0x4e, 0x09, 0x00, 0xf7, 0xda, 0xc7, 0xef, 0x99, 0x62, - 0x99, 0x77, 0xb6, 0x95, 0x22, 0x5e, 0x8a, 0xa0, 0xab, 0xf4, 0xb8, - 0x78, 0x98, 0xca, 0x38, 0x19, 0x99, 0xc9, 0x72, 0x9e, 0x78, 0xcd, - 0x4b, 0xac, 0xaf, 0x19, 0xa0, 0x73, 0x12, 0x2d, 0xfc, 0xc2, 0x41, - 0xba, 0x81, 0x91, 0xda, 0x16, 0x5a, 0x31, 0xb7, 0xf9, 0xb4, 0x71, - 0x80, 0x12, 0x48, 0x99, 0x72, 0x73, 0x5a, 0x59, 0x53, 0xc1, 0x63, - 0x52, 0x33, 0xed, 0xa7, 0xc9, 0xd2, 0x39, 0x02, 0x70, 0xfa, 0xe0, - 0xb1, 0x42, 0x66, 0x29, 0xaa, 0x9b, 0x51, 0xed, 0x30, 0x54, 0x22, - 0x14, 0x5f, 0xd9, 0xab, 0x1d, 0xc1, 0xe4, 0x94, 0xf0, 0xf8, 0xf5, - 0x2b, 0xf7, 0xea, 0xca, 0x78, 0x46, 0xd6, 0xb8, 0x91, 0xfd, 0xa6, - 0x0d, 0x2b, 0x1a, 0x14, 0x01, 0x3e, 0x80, 0xf0, 0x42, 0xa0, 0x95, - 0x07, 0x5e, 0x6d, 0xcd, 0xcc, 0x4b, 0xa4, 0x45, 0x8d, 0xab, 0x12, - 0xe8, 0xb3, 0xde, 0x5a, 0xe5, 0xa0, 0x7c, 0xe8, 0x0f, 0x22, 0x1d, - 0x5a, 0xe9, 0x59, 0x30, 0x82, 0x04, 0x20, 0x30, 0x82, 0x03, 0x08, - 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x34, 0x4e, 0xd5, 0x57, - 0x20, 0xd5, 0xed, 0xec, 0x49, 0xf4, 0x2f, 0xce, 0x37, 0xdb, 0x2b, - 0x6d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0xa9, 0x31, 0x0b, 0x30, + 0x79, 0x11, 0xc0, 0x4b, 0xb3, 0x91, 0xb6, 0xfc, 0xf0, 0xe9, 0x67, + 0xd4, 0x0d, 0x6e, 0x45, 0xbe, 0x55, 0xe8, 0x93, 0xd2, 0xce, 0x03, + 0x3f, 0xed, 0xda, 0x25, 0xb0, 0x1d, 0x57, 0xcb, 0x1e, 0x3a, 0x76, + 0xa0, 0x4c, 0xec, 0x50, 0x76, 0xe8, 0x64, 0x72, 0x0c, 0xa4, 0xa9, + 0xf1, 0xb8, 0x8b, 0xd6, 0xd6, 0x87, 0x84, 0xbb, 0x32, 0xe5, 0x41, + 0x11, 0xc0, 0x77, 0xd9, 0xb3, 0x60, 0x9d, 0xeb, 0x1b, 0xd5, 0xd1, + 0x6e, 0x44, 0x44, 0xa9, 0xa6, 0x01, 0xec, 0x55, 0x62, 0x1d, 0x77, + 0xb8, 0x5c, 0x8e, 0x48, 0x49, 0x7c, 0x9c, 0x3b, 0x57, 0x11, 0xac, + 0xad, 0x73, 0x37, 0x8e, 0x2f, 0x78, 0x5c, 0x90, 0x68, 0x47, 0xd9, + 0x60, 0x60, 0xe6, 0xfc, 0x07, 0x3d, 0x22, 0x20, 0x17, 0xc4, 0xf7, + 0x16, 0xe9, 0xc4, 0xd8, 0x72, 0xf9, 0xc8, 0x73, 0x7c, 0xdf, 0x16, + 0x2f, 0x15, 0xa9, 0x3e, 0xfd, 0x6a, 0x27, 0xb6, 0xa1, 0xeb, 0x5a, + 0xba, 0x98, 0x1f, 0xd5, 0xe3, 0x4d, 0x64, 0x0a, 0x9d, 0x13, 0xc8, + 0x61, 0xba, 0xf5, 0x39, 0x1c, 0x87, 0xba, 0xb8, 0xbd, 0x7b, 0x22, + 0x7f, 0xf6, 0xfe, 0xac, 0x40, 0x79, 0xe5, 0xac, 0x10, 0x6f, 0x3d, + 0x8f, 0x1b, 0x79, 0x76, 0x8b, 0xc4, 0x37, 0xb3, 0x21, 0x18, 0x84, + 0xe5, 0x36, 0x00, 0xeb, 0x63, 0x20, 0x99, 0xb9, 0xe9, 0xfe, 0x33, + 0x04, 0xbb, 0x41, 0xc8, 0xc1, 0x02, 0xf9, 0x44, 0x63, 0x20, 0x9e, + 0x81, 0xce, 0x42, 0xd3, 0xd6, 0x3f, 0x2c, 0x76, 0xd3, 0x63, 0x9c, + 0x59, 0xdd, 0x8f, 0xa6, 0xe1, 0x0e, 0xa0, 0x2e, 0x41, 0xf7, 0x2e, + 0x95, 0x47, 0xcf, 0xbc, 0xfd, 0x33, 0xf3, 0xf6, 0x0b, 0x61, 0x7e, + 0x7e, 0x91, 0x2b, 0x81, 0x47, 0xc2, 0x27, 0x30, 0xee, 0xa7, 0x10, + 0x5d, 0x37, 0x8f, 0x5c, 0x39, 0x2b, 0xe4, 0x04, 0xf0, 0x7b, 0x8d, + 0x56, 0x8c, 0x68, 0x30, 0x82, 0x04, 0xd3, 0x30, 0x82, 0x03, 0xbb, + 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x18, 0xda, 0xd1, 0x9e, + 0x26, 0x7d, 0xe8, 0xbb, 0x4a, 0x21, 0x58, 0xcd, 0xcc, 0x6b, 0x3b, + 0x4a, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0xca, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, - 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x74, - 0x68, 0x61, 0x77, 0x74, 0x65, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, - 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1f, - 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x20, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x31, 0x38, - 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2f, 0x28, 0x63, - 0x29, 0x20, 0x32, 0x30, 0x30, 0x36, 0x20, 0x74, 0x68, 0x61, 0x77, - 0x74, 0x65, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x2d, 0x20, - 0x46, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x7a, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x6c, - 0x79, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, - 0x16, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65, 0x20, 0x50, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, - 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x31, 0x31, 0x37, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x36, - 0x30, 0x37, 0x31, 0x36, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, - 0x30, 0x81, 0xa9, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65, - 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x28, 0x30, 0x26, 0x06, - 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1f, 0x43, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x44, 0x69, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, - 0x04, 0x0b, 0x13, 0x2f, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, - 0x36, 0x20, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65, 0x2c, 0x20, 0x49, + 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0e, 0x56, + 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x49, 0x6e, + 0x63, 0x2e, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, + 0x13, 0x16, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x20, + 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x31, 0x3a, 0x30, 0x38, 0x06, 0x03, 0x55, 0x04, 0x0b, + 0x13, 0x31, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x36, 0x20, + 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x2d, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, - 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x31, 0x1f, 0x30, 0x1d, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x16, 0x74, 0x68, 0x61, 0x77, - 0x74, 0x65, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, - 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, + 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x31, 0x45, 0x30, 0x43, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x3c, 0x56, 0x65, 0x72, 0x69, + 0x53, 0x69, 0x67, 0x6e, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, + 0x33, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x50, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, + 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, + 0x35, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x31, 0x30, 0x38, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x36, + 0x30, 0x37, 0x31, 0x36, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, + 0x30, 0x81, 0xca, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, + 0x55, 0x04, 0x0a, 0x13, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, + 0x67, 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x1f, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x16, 0x56, 0x65, 0x72, + 0x69, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, + 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x3a, 0x30, + 0x38, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x31, 0x28, 0x63, 0x29, + 0x20, 0x32, 0x30, 0x30, 0x36, 0x20, 0x56, 0x65, 0x72, 0x69, 0x53, + 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x2d, + 0x20, 0x46, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x6e, + 0x6c, 0x79, 0x31, 0x45, 0x30, 0x43, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x3c, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x20, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x35, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, - 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xac, 0xa0, 0xf0, 0xfb, - 0x80, 0x59, 0xd4, 0x9c, 0xc7, 0xa4, 0xcf, 0x9d, 0xa1, 0x59, 0x73, - 0x09, 0x10, 0x45, 0x0c, 0x0d, 0x2c, 0x6e, 0x68, 0xf1, 0x6c, 0x5b, - 0x48, 0x68, 0x49, 0x59, 0x37, 0xfc, 0x0b, 0x33, 0x19, 0xc2, 0x77, - 0x7f, 0xcc, 0x10, 0x2d, 0x95, 0x34, 0x1c, 0xe6, 0xeb, 0x4d, 0x09, - 0xa7, 0x1c, 0xd2, 0xb8, 0xc9, 0x97, 0x36, 0x02, 0xb7, 0x89, 0xd4, - 0x24, 0x5f, 0x06, 0xc0, 0xcc, 0x44, 0x94, 0x94, 0x8d, 0x02, 0x62, - 0x6f, 0xeb, 0x5a, 0xdd, 0x11, 0x8d, 0x28, 0x9a, 0x5c, 0x84, 0x90, - 0x10, 0x7a, 0x0d, 0xbd, 0x74, 0x66, 0x2f, 0x6a, 0x38, 0xa0, 0xe2, - 0xd5, 0x54, 0x44, 0xeb, 0x1d, 0x07, 0x9f, 0x07, 0xba, 0x6f, 0xee, - 0xe9, 0xfd, 0x4e, 0x0b, 0x29, 0xf5, 0x3e, 0x84, 0xa0, 0x01, 0xf1, - 0x9c, 0xab, 0xf8, 0x1c, 0x7e, 0x89, 0xa4, 0xe8, 0xa1, 0xd8, 0x71, - 0x65, 0x0d, 0xa3, 0x51, 0x7b, 0xee, 0xbc, 0xd2, 0x22, 0x60, 0x0d, - 0xb9, 0x5b, 0x9d, 0xdf, 0xba, 0xfc, 0x51, 0x5b, 0x0b, 0xaf, 0x98, - 0xb2, 0xe9, 0x2e, 0xe9, 0x04, 0xe8, 0x62, 0x87, 0xde, 0x2b, 0xc8, - 0xd7, 0x4e, 0xc1, 0x4c, 0x64, 0x1e, 0xdd, 0xcf, 0x87, 0x58, 0xba, - 0x4a, 0x4f, 0xca, 0x68, 0x07, 0x1d, 0x1c, 0x9d, 0x4a, 0xc6, 0xd5, - 0x2f, 0x91, 0xcc, 0x7c, 0x71, 0x72, 0x1c, 0xc5, 0xc0, 0x67, 0xeb, - 0x32, 0xfd, 0xc9, 0x92, 0x5c, 0x94, 0xda, 0x85, 0xc0, 0x9b, 0xbf, - 0x53, 0x7d, 0x2b, 0x09, 0xf4, 0x8c, 0x9d, 0x91, 0x1f, 0x97, 0x6a, - 0x52, 0xcb, 0xde, 0x09, 0x36, 0xa4, 0x77, 0xd8, 0x7b, 0x87, 0x50, - 0x44, 0xd5, 0x3e, 0x6e, 0x29, 0x69, 0xfb, 0x39, 0x49, 0x26, 0x1e, - 0x09, 0xa5, 0x80, 0x7b, 0x40, 0x2d, 0xeb, 0xe8, 0x27, 0x85, 0xc9, - 0xfe, 0x61, 0xfd, 0x7e, 0xe6, 0x7c, 0x97, 0x1d, 0xd5, 0x9d, 0x02, - 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, - 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, - 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, - 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, - 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x7b, 0x5b, 0x45, - 0xcf, 0xaf, 0xce, 0xcb, 0x7a, 0xfd, 0x31, 0x92, 0x1a, 0x6a, 0xb6, - 0xf3, 0x46, 0xeb, 0x57, 0x48, 0x50, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, - 0x82, 0x01, 0x01, 0x00, 0x79, 0x11, 0xc0, 0x4b, 0xb3, 0x91, 0xb6, - 0xfc, 0xf0, 0xe9, 0x67, 0xd4, 0x0d, 0x6e, 0x45, 0xbe, 0x55, 0xe8, - 0x93, 0xd2, 0xce, 0x03, 0x3f, 0xed, 0xda, 0x25, 0xb0, 0x1d, 0x57, - 0xcb, 0x1e, 0x3a, 0x76, 0xa0, 0x4c, 0xec, 0x50, 0x76, 0xe8, 0x64, - 0x72, 0x0c, 0xa4, 0xa9, 0xf1, 0xb8, 0x8b, 0xd6, 0xd6, 0x87, 0x84, - 0xbb, 0x32, 0xe5, 0x41, 0x11, 0xc0, 0x77, 0xd9, 0xb3, 0x60, 0x9d, - 0xeb, 0x1b, 0xd5, 0xd1, 0x6e, 0x44, 0x44, 0xa9, 0xa6, 0x01, 0xec, - 0x55, 0x62, 0x1d, 0x77, 0xb8, 0x5c, 0x8e, 0x48, 0x49, 0x7c, 0x9c, - 0x3b, 0x57, 0x11, 0xac, 0xad, 0x73, 0x37, 0x8e, 0x2f, 0x78, 0x5c, - 0x90, 0x68, 0x47, 0xd9, 0x60, 0x60, 0xe6, 0xfc, 0x07, 0x3d, 0x22, - 0x20, 0x17, 0xc4, 0xf7, 0x16, 0xe9, 0xc4, 0xd8, 0x72, 0xf9, 0xc8, - 0x73, 0x7c, 0xdf, 0x16, 0x2f, 0x15, 0xa9, 0x3e, 0xfd, 0x6a, 0x27, - 0xb6, 0xa1, 0xeb, 0x5a, 0xba, 0x98, 0x1f, 0xd5, 0xe3, 0x4d, 0x64, - 0x0a, 0x9d, 0x13, 0xc8, 0x61, 0xba, 0xf5, 0x39, 0x1c, 0x87, 0xba, - 0xb8, 0xbd, 0x7b, 0x22, 0x7f, 0xf6, 0xfe, 0xac, 0x40, 0x79, 0xe5, - 0xac, 0x10, 0x6f, 0x3d, 0x8f, 0x1b, 0x79, 0x76, 0x8b, 0xc4, 0x37, - 0xb3, 0x21, 0x18, 0x84, 0xe5, 0x36, 0x00, 0xeb, 0x63, 0x20, 0x99, - 0xb9, 0xe9, 0xfe, 0x33, 0x04, 0xbb, 0x41, 0xc8, 0xc1, 0x02, 0xf9, - 0x44, 0x63, 0x20, 0x9e, 0x81, 0xce, 0x42, 0xd3, 0xd6, 0x3f, 0x2c, - 0x76, 0xd3, 0x63, 0x9c, 0x59, 0xdd, 0x8f, 0xa6, 0xe1, 0x0e, 0xa0, - 0x2e, 0x41, 0xf7, 0x2e, 0x95, 0x47, 0xcf, 0xbc, 0xfd, 0x33, 0xf3, - 0xf6, 0x0b, 0x61, 0x7e, 0x7e, 0x91, 0x2b, 0x81, 0x47, 0xc2, 0x27, - 0x30, 0xee, 0xa7, 0x10, 0x5d, 0x37, 0x8f, 0x5c, 0x39, 0x2b, 0xe4, - 0x04, 0xf0, 0x7b, 0x8d, 0x56, 0x8c, 0x68, 0x30, 0x82, 0x04, 0xd3, - 0x30, 0x82, 0x03, 0xbb, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, - 0x18, 0xda, 0xd1, 0x9e, 0x26, 0x7d, 0xe8, 0xbb, 0x4a, 0x21, 0x58, - 0xcd, 0xcc, 0x6b, 0x3b, 0x4a, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, - 0xca, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, - 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, - 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x1f, 0x30, 0x1d, 0x06, - 0x03, 0x55, 0x04, 0x0b, 0x13, 0x16, 0x56, 0x65, 0x72, 0x69, 0x53, - 0x69, 0x67, 0x6e, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x3a, 0x30, 0x38, 0x06, - 0x03, 0x55, 0x04, 0x0b, 0x13, 0x31, 0x28, 0x63, 0x29, 0x20, 0x32, - 0x30, 0x30, 0x36, 0x20, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, - 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x2d, 0x20, 0x46, - 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, - 0x31, 0x45, 0x30, 0x43, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x3c, - 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x20, 0x2d, 0x20, 0x47, 0x35, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, - 0x31, 0x31, 0x30, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, - 0x17, 0x0d, 0x33, 0x36, 0x30, 0x37, 0x31, 0x36, 0x32, 0x33, 0x35, - 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0xca, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x17, - 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0e, 0x56, 0x65, - 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, - 0x2e, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, - 0x16, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x54, - 0x72, 0x75, 0x73, 0x74, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x31, 0x3a, 0x30, 0x38, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, - 0x31, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x36, 0x20, 0x56, - 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x49, 0x6e, - 0x63, 0x2e, 0x20, 0x2d, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, 0x73, - 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x31, 0x45, 0x30, 0x43, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x13, 0x3c, 0x56, 0x65, 0x72, 0x69, 0x53, - 0x69, 0x67, 0x6e, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x50, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x35, - 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, - 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, - 0xaf, 0x24, 0x08, 0x08, 0x29, 0x7a, 0x35, 0x9e, 0x60, 0x0c, 0xaa, - 0xe7, 0x4b, 0x3b, 0x4e, 0xdc, 0x7c, 0xbc, 0x3c, 0x45, 0x1c, 0xbb, - 0x2b, 0xe0, 0xfe, 0x29, 0x02, 0xf9, 0x57, 0x08, 0xa3, 0x64, 0x85, - 0x15, 0x27, 0xf5, 0xf1, 0xad, 0xc8, 0x31, 0x89, 0x5d, 0x22, 0xe8, - 0x2a, 0xaa, 0xa6, 0x42, 0xb3, 0x8f, 0xf8, 0xb9, 0x55, 0xb7, 0xb1, - 0xb7, 0x4b, 0xb3, 0xfe, 0x8f, 0x7e, 0x07, 0x57, 0xec, 0xef, 0x43, - 0xdb, 0x66, 0x62, 0x15, 0x61, 0xcf, 0x60, 0x0d, 0xa4, 0xd8, 0xde, - 0xf8, 0xe0, 0xc3, 0x62, 0x08, 0x3d, 0x54, 0x13, 0xeb, 0x49, 0xca, - 0x59, 0x54, 0x85, 0x26, 0xe5, 0x2b, 0x8f, 0x1b, 0x9f, 0xeb, 0xf5, - 0xa1, 0x91, 0xc2, 0x33, 0x49, 0xd8, 0x43, 0x63, 0x6a, 0x52, 0x4b, - 0xd2, 0x8f, 0xe8, 0x70, 0x51, 0x4d, 0xd1, 0x89, 0x69, 0x7b, 0xc7, - 0x70, 0xf6, 0xb3, 0xdc, 0x12, 0x74, 0xdb, 0x7b, 0x5d, 0x4b, 0x56, - 0xd3, 0x96, 0xbf, 0x15, 0x77, 0xa1, 0xb0, 0xf4, 0xa2, 0x25, 0xf2, - 0xaf, 0x1c, 0x92, 0x67, 0x18, 0xe5, 0xf4, 0x06, 0x04, 0xef, 0x90, - 0xb9, 0xe4, 0x00, 0xe4, 0xdd, 0x3a, 0xb5, 0x19, 0xff, 0x02, 0xba, - 0xf4, 0x3c, 0xee, 0xe0, 0x8b, 0xeb, 0x37, 0x8b, 0xec, 0xf4, 0xd7, - 0xac, 0xf2, 0xf6, 0xf0, 0x3d, 0xaf, 0xdd, 0x75, 0x91, 0x33, 0x19, - 0x1d, 0x1c, 0x40, 0xcb, 0x74, 0x24, 0x19, 0x21, 0x93, 0xd9, 0x14, - 0xfe, 0xac, 0x2a, 0x52, 0xc7, 0x8f, 0xd5, 0x04, 0x49, 0xe4, 0x8d, - 0x63, 0x47, 0x88, 0x3c, 0x69, 0x83, 0xcb, 0xfe, 0x47, 0xbd, 0x2b, - 0x7e, 0x4f, 0xc5, 0x95, 0xae, 0x0e, 0x9d, 0xd4, 0xd1, 0x43, 0xc0, - 0x67, 0x73, 0xe3, 0x14, 0x08, 0x7e, 0xe5, 0x3f, 0x9f, 0x73, 0xb8, - 0x33, 0x0a, 0xcf, 0x5d, 0x3f, 0x34, 0x87, 0x96, 0x8a, 0xee, 0x53, - 0xe8, 0x25, 0x15, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xb2, - 0x30, 0x81, 0xaf, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, - 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, - 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, - 0x02, 0x01, 0x06, 0x30, 0x6d, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, - 0x05, 0x07, 0x01, 0x0c, 0x04, 0x61, 0x30, 0x5f, 0xa1, 0x5d, 0xa0, - 0x5b, 0x30, 0x59, 0x30, 0x57, 0x30, 0x55, 0x16, 0x09, 0x69, 0x6d, - 0x61, 0x67, 0x65, 0x2f, 0x67, 0x69, 0x66, 0x30, 0x21, 0x30, 0x1f, - 0x30, 0x07, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x04, 0x14, - 0x8f, 0xe5, 0xd3, 0x1a, 0x86, 0xac, 0x8d, 0x8e, 0x6b, 0xc3, 0xcf, - 0x80, 0x6a, 0xd4, 0x48, 0x18, 0x2c, 0x7b, 0x19, 0x2e, 0x30, 0x25, - 0x16, 0x23, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6c, 0x6f, - 0x67, 0x6f, 0x2e, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6e, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x76, 0x73, 0x6c, 0x6f, 0x67, 0x6f, - 0x2e, 0x67, 0x69, 0x66, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, - 0x04, 0x16, 0x04, 0x14, 0x7f, 0xd3, 0x65, 0xa7, 0xc2, 0xdd, 0xec, - 0xbb, 0xf0, 0x30, 0x09, 0xf3, 0x43, 0x39, 0xfa, 0x02, 0xaf, 0x33, - 0x31, 0x33, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, - 0x93, 0x24, 0x4a, 0x30, 0x5f, 0x62, 0xcf, 0xd8, 0x1a, 0x98, 0x2f, - 0x3d, 0xea, 0xdc, 0x99, 0x2d, 0xbd, 0x77, 0xf6, 0xa5, 0x79, 0x22, - 0x38, 0xec, 0xc4, 0xa7, 0xa0, 0x78, 0x12, 0xad, 0x62, 0x0e, 0x45, - 0x70, 0x64, 0xc5, 0xe7, 0x97, 0x66, 0x2d, 0x98, 0x09, 0x7e, 0x5f, - 0xaf, 0xd6, 0xcc, 0x28, 0x65, 0xf2, 0x01, 0xaa, 0x08, 0x1a, 0x47, - 0xde, 0xf9, 0xf9, 0x7c, 0x92, 0x5a, 0x08, 0x69, 0x20, 0x0d, 0xd9, - 0x3e, 0x6d, 0x6e, 0x3c, 0x0d, 0x6e, 0xd8, 0xe6, 0x06, 0x91, 0x40, - 0x18, 0xb9, 0xf8, 0xc1, 0xed, 0xdf, 0xdb, 0x41, 0xaa, 0xe0, 0x96, - 0x20, 0xc9, 0xcd, 0x64, 0x15, 0x38, 0x81, 0xc9, 0x94, 0xee, 0xa2, - 0x84, 0x29, 0x0b, 0x13, 0x6f, 0x8e, 0xdb, 0x0c, 0xdd, 0x25, 0x02, - 0xdb, 0xa4, 0x8b, 0x19, 0x44, 0xd2, 0x41, 0x7a, 0x05, 0x69, 0x4a, - 0x58, 0x4f, 0x60, 0xca, 0x7e, 0x82, 0x6a, 0x0b, 0x02, 0xaa, 0x25, - 0x17, 0x39, 0xb5, 0xdb, 0x7f, 0xe7, 0x84, 0x65, 0x2a, 0x95, 0x8a, - 0xbd, 0x86, 0xde, 0x5e, 0x81, 0x16, 0x83, 0x2d, 0x10, 0xcc, 0xde, - 0xfd, 0xa8, 0x82, 0x2a, 0x6d, 0x28, 0x1f, 0x0d, 0x0b, 0xc4, 0xe5, - 0xe7, 0x1a, 0x26, 0x19, 0xe1, 0xf4, 0x11, 0x6f, 0x10, 0xb5, 0x95, - 0xfc, 0xe7, 0x42, 0x05, 0x32, 0xdb, 0xce, 0x9d, 0x51, 0x5e, 0x28, - 0xb6, 0x9e, 0x85, 0xd3, 0x5b, 0xef, 0xa5, 0x7d, 0x45, 0x40, 0x72, - 0x8e, 0xb7, 0x0e, 0x6b, 0x0e, 0x06, 0xfb, 0x33, 0x35, 0x48, 0x71, - 0xb8, 0x9d, 0x27, 0x8b, 0xc4, 0x65, 0x5f, 0x0d, 0x86, 0x76, 0x9c, - 0x44, 0x7a, 0xf6, 0x95, 0x5c, 0xf6, 0x5d, 0x32, 0x08, 0x33, 0xa4, - 0x54, 0xb6, 0x18, 0x3f, 0x68, 0x5c, 0xf2, 0x42, 0x4a, 0x85, 0x38, - 0x54, 0x83, 0x5f, 0xd1, 0xe8, 0x2c, 0xf2, 0xac, 0x11, 0xd6, 0xa8, - 0xed, 0x63, 0x6a, 0x30, 0x82, 0x03, 0xb8, 0x30, 0x82, 0x02, 0xa0, - 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x0c, 0xf0, 0x8e, 0x5c, - 0x08, 0x16, 0xa5, 0xad, 0x42, 0x7f, 0xf0, 0xeb, 0x27, 0x18, 0x59, - 0xd0, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x48, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x20, - 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x17, 0x53, 0x65, - 0x63, 0x75, 0x72, 0x65, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, - 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, - 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0e, 0x53, - 0x65, 0x63, 0x75, 0x72, 0x65, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, - 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x31, 0x30, - 0x37, 0x31, 0x39, 0x33, 0x31, 0x31, 0x38, 0x5a, 0x17, 0x0d, 0x32, - 0x39, 0x31, 0x32, 0x33, 0x31, 0x31, 0x39, 0x34, 0x30, 0x35, 0x35, - 0x5a, 0x30, 0x48, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xaf, 0x24, 0x08, 0x08, + 0x29, 0x7a, 0x35, 0x9e, 0x60, 0x0c, 0xaa, 0xe7, 0x4b, 0x3b, 0x4e, + 0xdc, 0x7c, 0xbc, 0x3c, 0x45, 0x1c, 0xbb, 0x2b, 0xe0, 0xfe, 0x29, + 0x02, 0xf9, 0x57, 0x08, 0xa3, 0x64, 0x85, 0x15, 0x27, 0xf5, 0xf1, + 0xad, 0xc8, 0x31, 0x89, 0x5d, 0x22, 0xe8, 0x2a, 0xaa, 0xa6, 0x42, + 0xb3, 0x8f, 0xf8, 0xb9, 0x55, 0xb7, 0xb1, 0xb7, 0x4b, 0xb3, 0xfe, + 0x8f, 0x7e, 0x07, 0x57, 0xec, 0xef, 0x43, 0xdb, 0x66, 0x62, 0x15, + 0x61, 0xcf, 0x60, 0x0d, 0xa4, 0xd8, 0xde, 0xf8, 0xe0, 0xc3, 0x62, + 0x08, 0x3d, 0x54, 0x13, 0xeb, 0x49, 0xca, 0x59, 0x54, 0x85, 0x26, + 0xe5, 0x2b, 0x8f, 0x1b, 0x9f, 0xeb, 0xf5, 0xa1, 0x91, 0xc2, 0x33, + 0x49, 0xd8, 0x43, 0x63, 0x6a, 0x52, 0x4b, 0xd2, 0x8f, 0xe8, 0x70, + 0x51, 0x4d, 0xd1, 0x89, 0x69, 0x7b, 0xc7, 0x70, 0xf6, 0xb3, 0xdc, + 0x12, 0x74, 0xdb, 0x7b, 0x5d, 0x4b, 0x56, 0xd3, 0x96, 0xbf, 0x15, + 0x77, 0xa1, 0xb0, 0xf4, 0xa2, 0x25, 0xf2, 0xaf, 0x1c, 0x92, 0x67, + 0x18, 0xe5, 0xf4, 0x06, 0x04, 0xef, 0x90, 0xb9, 0xe4, 0x00, 0xe4, + 0xdd, 0x3a, 0xb5, 0x19, 0xff, 0x02, 0xba, 0xf4, 0x3c, 0xee, 0xe0, + 0x8b, 0xeb, 0x37, 0x8b, 0xec, 0xf4, 0xd7, 0xac, 0xf2, 0xf6, 0xf0, + 0x3d, 0xaf, 0xdd, 0x75, 0x91, 0x33, 0x19, 0x1d, 0x1c, 0x40, 0xcb, + 0x74, 0x24, 0x19, 0x21, 0x93, 0xd9, 0x14, 0xfe, 0xac, 0x2a, 0x52, + 0xc7, 0x8f, 0xd5, 0x04, 0x49, 0xe4, 0x8d, 0x63, 0x47, 0x88, 0x3c, + 0x69, 0x83, 0xcb, 0xfe, 0x47, 0xbd, 0x2b, 0x7e, 0x4f, 0xc5, 0x95, + 0xae, 0x0e, 0x9d, 0xd4, 0xd1, 0x43, 0xc0, 0x67, 0x73, 0xe3, 0x14, + 0x08, 0x7e, 0xe5, 0x3f, 0x9f, 0x73, 0xb8, 0x33, 0x0a, 0xcf, 0x5d, + 0x3f, 0x34, 0x87, 0x96, 0x8a, 0xee, 0x53, 0xe8, 0x25, 0x15, 0x02, + 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xb2, 0x30, 0x81, 0xaf, 0x30, + 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, + 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, + 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, + 0x6d, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x0c, + 0x04, 0x61, 0x30, 0x5f, 0xa1, 0x5d, 0xa0, 0x5b, 0x30, 0x59, 0x30, + 0x57, 0x30, 0x55, 0x16, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, + 0x67, 0x69, 0x66, 0x30, 0x21, 0x30, 0x1f, 0x30, 0x07, 0x06, 0x05, + 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x04, 0x14, 0x8f, 0xe5, 0xd3, 0x1a, + 0x86, 0xac, 0x8d, 0x8e, 0x6b, 0xc3, 0xcf, 0x80, 0x6a, 0xd4, 0x48, + 0x18, 0x2c, 0x7b, 0x19, 0x2e, 0x30, 0x25, 0x16, 0x23, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x76, + 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x76, 0x73, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x67, 0x69, 0x66, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0x7f, 0xd3, 0x65, 0xa7, 0xc2, 0xdd, 0xec, 0xbb, 0xf0, 0x30, 0x09, + 0xf3, 0x43, 0x39, 0xfa, 0x02, 0xaf, 0x33, 0x31, 0x33, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x93, 0x24, 0x4a, 0x30, + 0x5f, 0x62, 0xcf, 0xd8, 0x1a, 0x98, 0x2f, 0x3d, 0xea, 0xdc, 0x99, + 0x2d, 0xbd, 0x77, 0xf6, 0xa5, 0x79, 0x22, 0x38, 0xec, 0xc4, 0xa7, + 0xa0, 0x78, 0x12, 0xad, 0x62, 0x0e, 0x45, 0x70, 0x64, 0xc5, 0xe7, + 0x97, 0x66, 0x2d, 0x98, 0x09, 0x7e, 0x5f, 0xaf, 0xd6, 0xcc, 0x28, + 0x65, 0xf2, 0x01, 0xaa, 0x08, 0x1a, 0x47, 0xde, 0xf9, 0xf9, 0x7c, + 0x92, 0x5a, 0x08, 0x69, 0x20, 0x0d, 0xd9, 0x3e, 0x6d, 0x6e, 0x3c, + 0x0d, 0x6e, 0xd8, 0xe6, 0x06, 0x91, 0x40, 0x18, 0xb9, 0xf8, 0xc1, + 0xed, 0xdf, 0xdb, 0x41, 0xaa, 0xe0, 0x96, 0x20, 0xc9, 0xcd, 0x64, + 0x15, 0x38, 0x81, 0xc9, 0x94, 0xee, 0xa2, 0x84, 0x29, 0x0b, 0x13, + 0x6f, 0x8e, 0xdb, 0x0c, 0xdd, 0x25, 0x02, 0xdb, 0xa4, 0x8b, 0x19, + 0x44, 0xd2, 0x41, 0x7a, 0x05, 0x69, 0x4a, 0x58, 0x4f, 0x60, 0xca, + 0x7e, 0x82, 0x6a, 0x0b, 0x02, 0xaa, 0x25, 0x17, 0x39, 0xb5, 0xdb, + 0x7f, 0xe7, 0x84, 0x65, 0x2a, 0x95, 0x8a, 0xbd, 0x86, 0xde, 0x5e, + 0x81, 0x16, 0x83, 0x2d, 0x10, 0xcc, 0xde, 0xfd, 0xa8, 0x82, 0x2a, + 0x6d, 0x28, 0x1f, 0x0d, 0x0b, 0xc4, 0xe5, 0xe7, 0x1a, 0x26, 0x19, + 0xe1, 0xf4, 0x11, 0x6f, 0x10, 0xb5, 0x95, 0xfc, 0xe7, 0x42, 0x05, + 0x32, 0xdb, 0xce, 0x9d, 0x51, 0x5e, 0x28, 0xb6, 0x9e, 0x85, 0xd3, + 0x5b, 0xef, 0xa5, 0x7d, 0x45, 0x40, 0x72, 0x8e, 0xb7, 0x0e, 0x6b, + 0x0e, 0x06, 0xfb, 0x33, 0x35, 0x48, 0x71, 0xb8, 0x9d, 0x27, 0x8b, + 0xc4, 0x65, 0x5f, 0x0d, 0x86, 0x76, 0x9c, 0x44, 0x7a, 0xf6, 0x95, + 0x5c, 0xf6, 0x5d, 0x32, 0x08, 0x33, 0xa4, 0x54, 0xb6, 0x18, 0x3f, + 0x68, 0x5c, 0xf2, 0x42, 0x4a, 0x85, 0x38, 0x54, 0x83, 0x5f, 0xd1, + 0xe8, 0x2c, 0xf2, 0xac, 0x11, 0xd6, 0xa8, 0xed, 0x63, 0x6a, 0x30, + 0x82, 0x03, 0xb8, 0x30, 0x82, 0x02, 0xa0, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x10, 0x0c, 0xf0, 0x8e, 0x5c, 0x08, 0x16, 0xa5, 0xad, + 0x42, 0x7f, 0xf0, 0xeb, 0x27, 0x18, 0x59, 0xd0, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x30, 0x48, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x17, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0e, 0x53, 0x65, 0x63, 0x75, 0x72, - 0x65, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, - 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, - 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xab, 0xa4, - 0x81, 0xe5, 0x95, 0xcd, 0xf5, 0xf6, 0x14, 0x8e, 0xc2, 0x4f, 0xca, - 0xd4, 0xe2, 0x78, 0x95, 0x58, 0x9c, 0x41, 0xe1, 0x0d, 0x99, 0x40, - 0x24, 0x17, 0x39, 0x91, 0x33, 0x66, 0xe9, 0xbe, 0xe1, 0x83, 0xaf, - 0x62, 0x5c, 0x89, 0xd1, 0xfc, 0x24, 0x5b, 0x61, 0xb3, 0xe0, 0x11, - 0x11, 0x41, 0x1c, 0x1d, 0x6e, 0xf0, 0xb8, 0xbb, 0xf8, 0xde, 0xa7, - 0x81, 0xba, 0xa6, 0x48, 0xc6, 0x9f, 0x1d, 0xbd, 0xbe, 0x8e, 0xa9, - 0x41, 0x3e, 0xb8, 0x94, 0xed, 0x29, 0x1a, 0xd4, 0x8e, 0xd2, 0x03, - 0x1d, 0x03, 0xef, 0x6d, 0x0d, 0x67, 0x1c, 0x57, 0xd7, 0x06, 0xad, - 0xca, 0xc8, 0xf5, 0xfe, 0x0e, 0xaf, 0x66, 0x25, 0x48, 0x04, 0x96, - 0x0b, 0x5d, 0xa3, 0xba, 0x16, 0xc3, 0x08, 0x4f, 0xd1, 0x46, 0xf8, - 0x14, 0x5c, 0xf2, 0xc8, 0x5e, 0x01, 0x99, 0x6d, 0xfd, 0x88, 0xcc, - 0x86, 0xa8, 0xc1, 0x6f, 0x31, 0x42, 0x6c, 0x52, 0x3e, 0x68, 0xcb, - 0xf3, 0x19, 0x34, 0xdf, 0xbb, 0x87, 0x18, 0x56, 0x80, 0x26, 0xc4, - 0xd0, 0xdc, 0xc0, 0x6f, 0xdf, 0xde, 0xa0, 0xc2, 0x91, 0x16, 0xa0, - 0x64, 0x11, 0x4b, 0x44, 0xbc, 0x1e, 0xf6, 0xe7, 0xfa, 0x63, 0xde, - 0x66, 0xac, 0x76, 0xa4, 0x71, 0xa3, 0xec, 0x36, 0x94, 0x68, 0x7a, - 0x77, 0xa4, 0xb1, 0xe7, 0x0e, 0x2f, 0x81, 0x7a, 0xe2, 0xb5, 0x72, - 0x86, 0xef, 0xa2, 0x6b, 0x8b, 0xf0, 0x0f, 0xdb, 0xd3, 0x59, 0x3f, - 0xba, 0x72, 0xbc, 0x44, 0x24, 0x9c, 0xe3, 0x73, 0xb3, 0xf7, 0xaf, - 0x57, 0x2f, 0x42, 0x26, 0x9d, 0xa9, 0x74, 0xba, 0x00, 0x52, 0xf2, - 0x4b, 0xcd, 0x53, 0x7c, 0x47, 0x0b, 0x36, 0x85, 0x0e, 0x66, 0xa9, - 0x08, 0x97, 0x16, 0x34, 0x57, 0xc1, 0x66, 0xf7, 0x80, 0xe3, 0xed, - 0x70, 0x54, 0xc7, 0x93, 0xe0, 0x2e, 0x28, 0x15, 0x59, 0x87, 0xba, - 0xbb, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x9d, 0x30, 0x81, - 0x9a, 0x30, 0x13, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, - 0x37, 0x14, 0x02, 0x04, 0x06, 0x1e, 0x04, 0x00, 0x43, 0x00, 0x41, - 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, - 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, - 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, - 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x42, 0x32, 0xb6, - 0x16, 0xfa, 0x04, 0xfd, 0xfe, 0x5d, 0x4b, 0x7a, 0xc3, 0xfd, 0xf7, - 0x4c, 0x40, 0x1d, 0x5a, 0x43, 0xaf, 0x30, 0x34, 0x06, 0x03, 0x55, - 0x1d, 0x1f, 0x04, 0x2d, 0x30, 0x2b, 0x30, 0x29, 0xa0, 0x27, 0xa0, - 0x25, 0x86, 0x23, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, - 0x72, 0x6c, 0x2e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x74, 0x72, - 0x75, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x54, 0x43, - 0x41, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x10, 0x06, 0x09, 0x2b, 0x06, - 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x01, 0x04, 0x03, 0x02, 0x01, - 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x30, - 0xed, 0x4f, 0x4a, 0xe1, 0x58, 0x3a, 0x52, 0x72, 0x5b, 0xb5, 0xa6, - 0xa3, 0x65, 0x18, 0xa6, 0xbb, 0x51, 0x3b, 0x77, 0xe9, 0x9d, 0xea, - 0xd3, 0x9f, 0x5c, 0xe0, 0x45, 0x65, 0x7b, 0x0d, 0xca, 0x5b, 0xe2, - 0x70, 0x50, 0xb2, 0x94, 0x05, 0x14, 0xae, 0x49, 0xc7, 0x8d, 0x41, - 0x07, 0x12, 0x73, 0x94, 0x7e, 0x0c, 0x23, 0x21, 0xfd, 0xbc, 0x10, - 0x7f, 0x60, 0x10, 0x5a, 0x72, 0xf5, 0x98, 0x0e, 0xac, 0xec, 0xb9, - 0x7f, 0xdd, 0x7a, 0x6f, 0x5d, 0xd3, 0x1c, 0xf4, 0xff, 0x88, 0x05, - 0x69, 0x42, 0xa9, 0x05, 0x71, 0xc8, 0xb7, 0xac, 0x26, 0xe8, 0x2e, - 0xb4, 0x8c, 0x6a, 0xff, 0x71, 0xdc, 0xb8, 0xb1, 0xdf, 0x99, 0xbc, - 0x7c, 0x21, 0x54, 0x2b, 0xe4, 0x58, 0xa2, 0xbb, 0x57, 0x29, 0xae, - 0x9e, 0xa9, 0xa3, 0x19, 0x26, 0x0f, 0x99, 0x2e, 0x08, 0xb0, 0xef, - 0xfd, 0x69, 0xcf, 0x99, 0x1a, 0x09, 0x8d, 0xe3, 0xa7, 0x9f, 0x2b, - 0xc9, 0x36, 0x34, 0x7b, 0x24, 0xb3, 0x78, 0x4c, 0x95, 0x17, 0xa4, - 0x06, 0x26, 0x1e, 0xb6, 0x64, 0x52, 0x36, 0x5f, 0x60, 0x67, 0xd9, - 0x9c, 0xc5, 0x05, 0x74, 0x0b, 0xe7, 0x67, 0x23, 0xd2, 0x08, 0xfc, - 0x88, 0xe9, 0xae, 0x8b, 0x7f, 0xe1, 0x30, 0xf4, 0x37, 0x7e, 0xfd, - 0xc6, 0x32, 0xda, 0x2d, 0x9e, 0x44, 0x30, 0x30, 0x6c, 0xee, 0x07, - 0xde, 0xd2, 0x34, 0xfc, 0xd2, 0xff, 0x40, 0xf6, 0x4b, 0xf4, 0x66, - 0x46, 0x06, 0x54, 0xa6, 0xf2, 0x32, 0x0a, 0x63, 0x26, 0x30, 0x6b, - 0x9b, 0xd1, 0xdc, 0x8b, 0x47, 0xba, 0xe1, 0xb9, 0xd5, 0x62, 0xd0, - 0xa2, 0xa0, 0xf4, 0x67, 0x05, 0x78, 0x29, 0x63, 0x1a, 0x6f, 0x04, - 0xd6, 0xf8, 0xc6, 0x4c, 0xa3, 0x9a, 0xb1, 0x37, 0xb4, 0x8d, 0xe5, - 0x28, 0x4b, 0x1d, 0x9e, 0x2c, 0xc2, 0xb8, 0x68, 0xbc, 0xed, 0x02, - 0xee, 0x31, 0x30, 0x82, 0x03, 0xbc, 0x30, 0x82, 0x02, 0xa4, 0xa0, - 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x07, 0x56, 0x22, 0xa4, 0xe8, - 0xd4, 0x8a, 0x89, 0x4d, 0xf4, 0x13, 0xc8, 0xf0, 0xf8, 0xea, 0xa5, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x05, 0x05, 0x00, 0x30, 0x4a, 0x31, 0x0b, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x20, 0x30, - 0x1e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x17, 0x53, 0x65, 0x63, - 0x75, 0x72, 0x65, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f, - 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x19, - 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x53, 0x65, - 0x63, 0x75, 0x72, 0x65, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x31, - 0x30, 0x37, 0x31, 0x39, 0x34, 0x32, 0x32, 0x38, 0x5a, 0x17, 0x0d, - 0x32, 0x39, 0x31, 0x32, 0x33, 0x31, 0x31, 0x39, 0x35, 0x32, 0x30, - 0x36, 0x5a, 0x30, 0x4a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x20, 0x30, 0x1e, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x13, 0x17, 0x53, 0x65, 0x63, 0x75, 0x72, - 0x65, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, - 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x19, 0x30, 0x17, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x53, 0x65, 0x63, 0x75, - 0x72, 0x65, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x43, - 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, - 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, - 0x00, 0xaf, 0x35, 0x2e, 0xd8, 0xac, 0x6c, 0x55, 0x69, 0x06, 0x71, - 0xe5, 0x13, 0x68, 0x24, 0xb3, 0x4f, 0xd8, 0xcc, 0x21, 0x47, 0xf8, - 0xf1, 0x60, 0x38, 0x89, 0x89, 0x03, 0xe9, 0xbd, 0xea, 0x5e, 0x46, - 0x53, 0x09, 0xdc, 0x5c, 0xf5, 0x5a, 0xe8, 0xf7, 0x45, 0x2a, 0x02, - 0xeb, 0x31, 0x61, 0xd7, 0x29, 0x33, 0x4c, 0xce, 0xc7, 0x7c, 0x0a, - 0x37, 0x7e, 0x0f, 0xba, 0x32, 0x98, 0xe1, 0x1d, 0x97, 0xaf, 0x8f, - 0xc7, 0xdc, 0xc9, 0x38, 0x96, 0xf3, 0xdb, 0x1a, 0xfc, 0x51, 0xed, - 0x68, 0xc6, 0xd0, 0x6e, 0xa4, 0x7c, 0x24, 0xd1, 0xae, 0x42, 0xc8, - 0x96, 0x50, 0x63, 0x2e, 0xe0, 0xfe, 0x75, 0xfe, 0x98, 0xa7, 0x5f, - 0x49, 0x2e, 0x95, 0xe3, 0x39, 0x33, 0x64, 0x8e, 0x1e, 0xa4, 0x5f, - 0x90, 0xd2, 0x67, 0x3c, 0xb2, 0xd9, 0xfe, 0x41, 0xb9, 0x55, 0xa7, - 0x09, 0x8e, 0x72, 0x05, 0x1e, 0x8b, 0xdd, 0x44, 0x85, 0x82, 0x42, - 0xd0, 0x49, 0xc0, 0x1d, 0x60, 0xf0, 0xd1, 0x17, 0x2c, 0x95, 0xeb, - 0xf6, 0xa5, 0xc1, 0x92, 0xa3, 0xc5, 0xc2, 0xa7, 0x08, 0x60, 0x0d, - 0x60, 0x04, 0x10, 0x96, 0x79, 0x9e, 0x16, 0x34, 0xe6, 0xa9, 0xb6, - 0xfa, 0x25, 0x45, 0x39, 0xc8, 0x1e, 0x65, 0xf9, 0x93, 0xf5, 0xaa, - 0xf1, 0x52, 0xdc, 0x99, 0x98, 0x3d, 0xa5, 0x86, 0x1a, 0x0c, 0x35, - 0x33, 0xfa, 0x4b, 0xa5, 0x04, 0x06, 0x15, 0x1c, 0x31, 0x80, 0xef, - 0xaa, 0x18, 0x6b, 0xc2, 0x7b, 0xd7, 0xda, 0xce, 0xf9, 0x33, 0x20, - 0xd5, 0xf5, 0xbd, 0x6a, 0x33, 0x2d, 0x81, 0x04, 0xfb, 0xb0, 0x5c, - 0xd4, 0x9c, 0xa3, 0xe2, 0x5c, 0x1d, 0xe3, 0xa9, 0x42, 0x75, 0x5e, - 0x7b, 0xd4, 0x77, 0xef, 0x39, 0x54, 0xba, 0xc9, 0x0a, 0x18, 0x1b, - 0x12, 0x99, 0x49, 0x2f, 0x88, 0x4b, 0xfd, 0x50, 0x62, 0xd1, 0x73, - 0xe7, 0x8f, 0x7a, 0x43, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, - 0x9d, 0x30, 0x81, 0x9a, 0x30, 0x13, 0x06, 0x09, 0x2b, 0x06, 0x01, - 0x04, 0x01, 0x82, 0x37, 0x14, 0x02, 0x04, 0x06, 0x1e, 0x04, 0x00, - 0x43, 0x00, 0x41, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, - 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, - 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, - 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, - 0xaf, 0x44, 0x04, 0xc2, 0x41, 0x7e, 0x48, 0x83, 0xdb, 0x4e, 0x39, - 0x02, 0xec, 0xec, 0x84, 0x7a, 0xe6, 0xce, 0xc9, 0xa4, 0x30, 0x34, - 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x2d, 0x30, 0x2b, 0x30, 0x29, - 0xa0, 0x27, 0xa0, 0x25, 0x86, 0x23, 0x68, 0x74, 0x74, 0x70, 0x3a, - 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x73, 0x65, 0x63, 0x75, 0x72, - 0x65, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x53, 0x47, 0x43, 0x41, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x10, 0x06, - 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x01, 0x04, - 0x03, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, - 0x01, 0x00, 0x63, 0x1a, 0x08, 0x40, 0x7d, 0xa4, 0x5e, 0x53, 0x0d, - 0x77, 0xd8, 0x7a, 0xae, 0x1f, 0x0d, 0x0b, 0x51, 0x16, 0x03, 0xef, - 0x18, 0x7c, 0xc8, 0xe3, 0xaf, 0x6a, 0x58, 0x93, 0x14, 0x60, 0x91, - 0xb2, 0x84, 0xdc, 0x88, 0x4e, 0xbe, 0x39, 0x8a, 0x3a, 0xf3, 0xe6, - 0x82, 0x89, 0x5d, 0x01, 0x37, 0xb3, 0xab, 0x24, 0xa4, 0x15, 0x0e, - 0x92, 0x35, 0x5a, 0x4a, 0x44, 0x5e, 0x4e, 0x57, 0xfa, 0x75, 0xce, - 0x1f, 0x48, 0xce, 0x66, 0xf4, 0x3c, 0x40, 0x26, 0x92, 0x98, 0x6c, - 0x1b, 0xee, 0x24, 0x46, 0x0c, 0x17, 0xb3, 0x52, 0xa5, 0xdb, 0xa5, - 0x91, 0x91, 0xcf, 0x37, 0xd3, 0x6f, 0xe7, 0x27, 0x08, 0x3a, 0x4e, - 0x19, 0x1f, 0x3a, 0xa7, 0x58, 0x5c, 0x17, 0xcf, 0x79, 0x3f, 0x8b, - 0xe4, 0xa7, 0xd3, 0x26, 0x23, 0x9d, 0x26, 0x0f, 0x58, 0x69, 0xfc, - 0x47, 0x7e, 0xb2, 0xd0, 0x8d, 0x8b, 0x93, 0xbf, 0x29, 0x4f, 0x43, - 0x69, 0x74, 0x76, 0x67, 0x4b, 0xcf, 0x07, 0x8c, 0xe6, 0x02, 0xf7, - 0xb5, 0xe1, 0xb4, 0x43, 0xb5, 0x4b, 0x2d, 0x14, 0x9f, 0xf9, 0xdc, - 0x26, 0x0d, 0xbf, 0xa6, 0x47, 0x74, 0x06, 0xd8, 0x88, 0xd1, 0x3a, - 0x29, 0x30, 0x84, 0xce, 0xd2, 0x39, 0x80, 0x62, 0x1b, 0xa8, 0xc7, - 0x57, 0x49, 0xbc, 0x6a, 0x55, 0x51, 0x67, 0x15, 0x4a, 0xbe, 0x35, - 0x07, 0xe4, 0xd5, 0x75, 0x98, 0x37, 0x79, 0x30, 0x14, 0xdb, 0x29, - 0x9d, 0x6c, 0xc5, 0x69, 0xcc, 0x47, 0x55, 0xa2, 0x30, 0xf7, 0xcc, - 0x5c, 0x7f, 0xc2, 0xc3, 0x98, 0x1c, 0x6b, 0x4e, 0x16, 0x80, 0xeb, - 0x7a, 0x78, 0x65, 0x45, 0xa2, 0x00, 0x1a, 0xaf, 0x0c, 0x0d, 0x55, - 0x64, 0x34, 0x48, 0xb8, 0x92, 0xb9, 0xf1, 0xb4, 0x50, 0x29, 0xf2, - 0x4f, 0x23, 0x1f, 0xda, 0x6c, 0xac, 0x1f, 0x44, 0xe1, 0xdd, 0x23, - 0x78, 0x51, 0x5b, 0xc7, 0x16, 0x30, 0x82, 0x04, 0x1d, 0x30, 0x82, - 0x03, 0x05, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x4e, 0x81, - 0x2d, 0x8a, 0x82, 0x65, 0xe0, 0x0b, 0x02, 0xee, 0x3e, 0x35, 0x02, - 0x46, 0xe5, 0x3d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0x81, 0x31, - 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, - 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, - 0x12, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, - 0x6e, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, - 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x53, 0x61, 0x6c, - 0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x13, 0x11, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, - 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, - 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1e, 0x43, - 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, - 0x30, 0x36, 0x31, 0x32, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x31, 0x32, 0x33, 0x31, 0x32, - 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0x81, 0x31, 0x0b, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, - 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x12, - 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, - 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, - 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x53, 0x61, 0x6c, 0x66, - 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x11, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x43, - 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x27, - 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1e, 0x43, 0x4f, - 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, 0x22, 0x30, - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, - 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xd0, 0x40, 0x8b, 0x8b, 0x72, - 0xe3, 0x91, 0x1b, 0xf7, 0x51, 0xc1, 0x1b, 0x54, 0x04, 0x98, 0xd3, - 0xa9, 0xbf, 0xc1, 0xe6, 0x8a, 0x5d, 0x3b, 0x87, 0xfb, 0xbb, 0x88, - 0xce, 0x0d, 0xe3, 0x2f, 0x3f, 0x06, 0x96, 0xf0, 0xa2, 0x29, 0x50, - 0x99, 0xae, 0xdb, 0x3b, 0xa1, 0x57, 0xb0, 0x74, 0x51, 0x71, 0xcd, - 0xed, 0x42, 0x91, 0x4d, 0x41, 0xfe, 0xa9, 0xc8, 0xd8, 0x6a, 0x86, - 0x77, 0x44, 0xbb, 0x59, 0x66, 0x97, 0x50, 0x5e, 0xb4, 0xd4, 0x2c, - 0x70, 0x44, 0xcf, 0xda, 0x37, 0x95, 0x42, 0x69, 0x3c, 0x30, 0xc4, - 0x71, 0xb3, 0x52, 0xf0, 0x21, 0x4d, 0xa1, 0xd8, 0xba, 0x39, 0x7c, - 0x1c, 0x9e, 0xa3, 0x24, 0x9d, 0xf2, 0x83, 0x16, 0x98, 0xaa, 0x16, - 0x7c, 0x43, 0x9b, 0x15, 0x5b, 0xb7, 0xae, 0x34, 0x91, 0xfe, 0xd4, - 0x62, 0x26, 0x18, 0x46, 0x9a, 0x3f, 0xeb, 0xc1, 0xf9, 0xf1, 0x90, - 0x57, 0xeb, 0xac, 0x7a, 0x0d, 0x8b, 0xdb, 0x72, 0x30, 0x6a, 0x66, - 0xd5, 0xe0, 0x46, 0xa3, 0x70, 0xdc, 0x68, 0xd9, 0xff, 0x04, 0x48, - 0x89, 0x77, 0xde, 0xb5, 0xe9, 0xfb, 0x67, 0x6d, 0x41, 0xe9, 0xbc, - 0x39, 0xbd, 0x32, 0xd9, 0x62, 0x02, 0xf1, 0xb1, 0xa8, 0x3d, 0x6e, - 0x37, 0x9c, 0xe2, 0x2f, 0xe2, 0xd3, 0xa2, 0x26, 0x8b, 0xc6, 0xb8, - 0x55, 0x43, 0x88, 0xe1, 0x23, 0x3e, 0xa5, 0xd2, 0x24, 0x39, 0x6a, - 0x47, 0xab, 0x00, 0xd4, 0xa1, 0xb3, 0xa9, 0x25, 0xfe, 0x0d, 0x3f, - 0xa7, 0x1d, 0xba, 0xd3, 0x51, 0xc1, 0x0b, 0xa4, 0xda, 0xac, 0x38, - 0xef, 0x55, 0x50, 0x24, 0x05, 0x65, 0x46, 0x93, 0x34, 0x4f, 0x2d, - 0x8d, 0xad, 0xc6, 0xd4, 0x21, 0x19, 0xd2, 0x8e, 0xca, 0x05, 0x61, - 0x71, 0x07, 0x73, 0x47, 0xe5, 0x8a, 0x19, 0x12, 0xbd, 0x04, 0x4d, - 0xce, 0x4e, 0x9c, 0xa5, 0x48, 0xac, 0xbb, 0x26, 0xf7, 0x02, 0x03, - 0x01, 0x00, 0x01, 0xa3, 0x81, 0x8e, 0x30, 0x81, 0x8b, 0x30, 0x1d, - 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x0b, 0x58, - 0xe5, 0x8b, 0xc6, 0x4c, 0x15, 0x37, 0xa4, 0x40, 0xa9, 0x30, 0xa9, - 0x21, 0xbe, 0x47, 0x36, 0x5a, 0x56, 0xff, 0x30, 0x0e, 0x06, 0x03, - 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, - 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, - 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x49, 0x06, 0x03, - 0x55, 0x1d, 0x1f, 0x04, 0x42, 0x30, 0x40, 0x30, 0x3e, 0xa0, 0x3c, - 0xa0, 0x3a, 0x86, 0x38, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, - 0x63, 0x72, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6f, 0x64, 0x6f, 0x63, - 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x4f, 0x4d, 0x4f, 0x44, - 0x4f, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, - 0x01, 0x01, 0x00, 0x3e, 0x98, 0x9e, 0x9b, 0xf6, 0x1b, 0xe9, 0xd7, - 0x39, 0xb7, 0x78, 0xae, 0x1d, 0x72, 0x18, 0x49, 0xd3, 0x87, 0xe4, - 0x43, 0x82, 0xeb, 0x3f, 0xc9, 0xaa, 0xf5, 0xa8, 0xb5, 0xef, 0x55, - 0x7c, 0x21, 0x52, 0x65, 0xf9, 0xd5, 0x0d, 0xe1, 0x6c, 0xf4, 0x3e, - 0x8c, 0x93, 0x73, 0x91, 0x2e, 0x02, 0xc4, 0x4e, 0x07, 0x71, 0x6f, - 0xc0, 0x8f, 0x38, 0x61, 0x08, 0xa8, 0x1e, 0x81, 0x0a, 0xc0, 0x2f, - 0x20, 0x2f, 0x41, 0x8b, 0x91, 0xdc, 0x48, 0x45, 0xbc, 0xf1, 0xc6, - 0xde, 0xba, 0x76, 0x6b, 0x33, 0xc8, 0x00, 0x2d, 0x31, 0x46, 0x4c, - 0xed, 0xe7, 0x9d, 0xcf, 0x88, 0x94, 0xff, 0x33, 0xc0, 0x56, 0xe8, - 0x24, 0x86, 0x26, 0xb8, 0xd8, 0x38, 0x38, 0xdf, 0x2a, 0x6b, 0xdd, - 0x12, 0xcc, 0xc7, 0x3f, 0x47, 0x17, 0x4c, 0xa2, 0xc2, 0x06, 0x96, - 0x09, 0xd6, 0xdb, 0xfe, 0x3f, 0x3c, 0x46, 0x41, 0xdf, 0x58, 0xe2, - 0x56, 0x0f, 0x3c, 0x3b, 0xc1, 0x1c, 0x93, 0x35, 0xd9, 0x38, 0x52, - 0xac, 0xee, 0xc8, 0xec, 0x2e, 0x30, 0x4e, 0x94, 0x35, 0xb4, 0x24, - 0x1f, 0x4b, 0x78, 0x69, 0xda, 0xf2, 0x02, 0x38, 0xcc, 0x95, 0x52, - 0x93, 0xf0, 0x70, 0x25, 0x59, 0x9c, 0x20, 0x67, 0xc4, 0xee, 0xf9, - 0x8b, 0x57, 0x61, 0xf4, 0x92, 0x76, 0x7d, 0x3f, 0x84, 0x8d, 0x55, - 0xb7, 0xe8, 0xe5, 0xac, 0xd5, 0xf1, 0xf5, 0x19, 0x56, 0xa6, 0x5a, - 0xfb, 0x90, 0x1c, 0xaf, 0x93, 0xeb, 0xe5, 0x1c, 0xd4, 0x67, 0x97, - 0x5d, 0x04, 0x0e, 0xbe, 0x0b, 0x83, 0xa6, 0x17, 0x83, 0xb9, 0x30, - 0x12, 0xa0, 0xc5, 0x33, 0x15, 0x05, 0xb9, 0x0d, 0xfb, 0xc7, 0x05, - 0x76, 0xe3, 0xd8, 0x4a, 0x8d, 0xfc, 0x34, 0x17, 0xa3, 0xc6, 0x21, - 0x28, 0xbe, 0x30, 0x45, 0x31, 0x1e, 0xc7, 0x78, 0xbe, 0x58, 0x61, - 0x38, 0xac, 0x3b, 0xe2, 0x01, 0x65, 0x30, 0x82, 0x03, 0xe6, 0x30, - 0x82, 0x02, 0xce, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x57, - 0xcb, 0x33, 0x6f, 0xc2, 0x5c, 0x16, 0xe6, 0x47, 0x16, 0x17, 0xe3, - 0x90, 0x31, 0x68, 0xe0, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x62, 0x31, + 0x65, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, + 0x17, 0x0d, 0x30, 0x36, 0x31, 0x31, 0x30, 0x37, 0x31, 0x39, 0x33, + 0x31, 0x31, 0x38, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x31, 0x32, 0x33, + 0x31, 0x31, 0x39, 0x34, 0x30, 0x35, 0x35, 0x5a, 0x30, 0x48, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, - 0x53, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, - 0x18, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x53, 0x6f, - 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x4c, 0x2e, 0x4c, - 0x2e, 0x43, 0x2e, 0x31, 0x30, 0x30, 0x2e, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x13, 0x27, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, - 0x53, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, - 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, - 0x17, 0x0d, 0x30, 0x36, 0x31, 0x32, 0x30, 0x31, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x31, 0x32, 0x33, - 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x62, 0x31, - 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, - 0x53, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, - 0x18, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x53, 0x6f, - 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x4c, 0x2e, 0x4c, - 0x2e, 0x43, 0x2e, 0x31, 0x30, 0x30, 0x2e, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x13, 0x27, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, - 0x53, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, - 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, - 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, - 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xe4, 0xbc, - 0x7e, 0x92, 0x30, 0x6d, 0xc6, 0xd8, 0x8e, 0x2b, 0x0b, 0xbc, 0x46, - 0xce, 0xe0, 0x27, 0x96, 0xde, 0xde, 0xf9, 0xfa, 0x12, 0xd3, 0x3c, - 0x33, 0x73, 0xb3, 0x04, 0x2f, 0xbc, 0x71, 0x8c, 0xe5, 0x9f, 0xb6, - 0x22, 0x60, 0x3e, 0x5f, 0x5d, 0xce, 0x09, 0xff, 0x82, 0x0c, 0x1b, - 0x9a, 0x51, 0x50, 0x1a, 0x26, 0x89, 0xdd, 0xd5, 0x61, 0x5d, 0x19, - 0xdc, 0x12, 0x0f, 0x2d, 0x0a, 0xa2, 0x43, 0x5d, 0x17, 0xd0, 0x34, - 0x92, 0x20, 0xea, 0x73, 0xcf, 0x38, 0x2c, 0x06, 0x26, 0x09, 0x7a, - 0x72, 0xf7, 0xfa, 0x50, 0x32, 0xf8, 0xc2, 0x93, 0xd3, 0x69, 0xa2, - 0x23, 0xce, 0x41, 0xb1, 0xcc, 0xe4, 0xd5, 0x1f, 0x36, 0xd1, 0x8a, - 0x3a, 0xf8, 0x8c, 0x63, 0xe2, 0x14, 0x59, 0x69, 0xed, 0x0d, 0xd3, - 0x7f, 0x6b, 0xe8, 0xb8, 0x03, 0xe5, 0x4f, 0x6a, 0xe5, 0x98, 0x63, - 0x69, 0x48, 0x05, 0xbe, 0x2e, 0xff, 0x33, 0xb6, 0xe9, 0x97, 0x59, - 0x69, 0xf8, 0x67, 0x19, 0xae, 0x93, 0x61, 0x96, 0x44, 0x15, 0xd3, - 0x72, 0xb0, 0x3f, 0xbc, 0x6a, 0x7d, 0xec, 0x48, 0x7f, 0x8d, 0xc3, - 0xab, 0xaa, 0x71, 0x2b, 0x53, 0x69, 0x41, 0x53, 0x34, 0xb5, 0xb0, - 0xb9, 0xc5, 0x06, 0x0a, 0xc4, 0xb0, 0x45, 0xf5, 0x41, 0x5d, 0x6e, - 0x89, 0x45, 0x7b, 0x3d, 0x3b, 0x26, 0x8c, 0x74, 0xc2, 0xe5, 0xd2, - 0xd1, 0x7d, 0xb2, 0x11, 0xd4, 0xfb, 0x58, 0x32, 0x22, 0x9a, 0x80, - 0xc9, 0xdc, 0xfd, 0x0c, 0xe9, 0x7f, 0x5e, 0x03, 0x97, 0xce, 0x3b, - 0x00, 0x14, 0x87, 0x27, 0x70, 0x38, 0xa9, 0x8e, 0x6e, 0xb3, 0x27, - 0x76, 0x98, 0x51, 0xe0, 0x05, 0xe3, 0x21, 0xab, 0x1a, 0xd5, 0x85, - 0x22, 0x3c, 0x29, 0xb5, 0x9a, 0x16, 0xc5, 0x80, 0xa8, 0xf4, 0xbb, - 0x6b, 0x30, 0x8f, 0x2f, 0x46, 0x02, 0xa2, 0xb1, 0x0c, 0x22, 0xe0, - 0xd3, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x97, 0x30, 0x81, - 0x94, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, - 0x14, 0x21, 0x30, 0xc9, 0xfb, 0x00, 0xd7, 0x4e, 0x98, 0xda, 0x87, - 0xaa, 0x2a, 0xd0, 0xa7, 0x2e, 0xb1, 0x40, 0x31, 0xa7, 0x4c, 0x30, - 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, - 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, - 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, - 0x52, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x4b, 0x30, 0x49, 0x30, - 0x47, 0xa0, 0x45, 0xa0, 0x43, 0x86, 0x41, 0x68, 0x74, 0x74, 0x70, - 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x6e, 0x65, 0x74, 0x73, - 0x6f, 0x6c, 0x73, 0x73, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x6f, 0x6c, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x74, 0x79, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, - 0x82, 0x01, 0x01, 0x00, 0xbb, 0xae, 0x4b, 0xe7, 0xb7, 0x57, 0xeb, - 0x7f, 0xaa, 0x2d, 0xb7, 0x73, 0x47, 0x85, 0x6a, 0xc1, 0xe4, 0xa5, - 0x1d, 0xe4, 0xe7, 0x3c, 0xe9, 0xf4, 0x59, 0x65, 0x77, 0xb5, 0x7a, - 0x5b, 0x5a, 0x8d, 0x25, 0x36, 0xe0, 0x7a, 0x97, 0x2e, 0x38, 0xc0, - 0x57, 0x60, 0x83, 0x98, 0x06, 0x83, 0x9f, 0xb9, 0x76, 0x7a, 0x6e, - 0x50, 0xe0, 0xba, 0x88, 0x2c, 0xfc, 0x45, 0xcc, 0x18, 0xb0, 0x99, - 0x95, 0x51, 0x0e, 0xec, 0x1d, 0xb8, 0x88, 0xff, 0x87, 0x50, 0x1c, - 0x82, 0xc2, 0xe3, 0xe0, 0x32, 0x80, 0xbf, 0xa0, 0x0b, 0x47, 0xc8, - 0xc3, 0x31, 0xef, 0x99, 0x67, 0x32, 0x80, 0x4f, 0x17, 0x21, 0x79, - 0x0c, 0x69, 0x5c, 0xde, 0x5e, 0x34, 0xae, 0x02, 0xb5, 0x26, 0xea, - 0x50, 0xdf, 0x7f, 0x18, 0x65, 0x2c, 0xc9, 0xf2, 0x63, 0xe1, 0xa9, - 0x07, 0xfe, 0x7c, 0x71, 0x1f, 0x6b, 0x33, 0x24, 0x6a, 0x1e, 0x05, - 0xf7, 0x05, 0x68, 0xc0, 0x6a, 0x12, 0xcb, 0x2e, 0x5e, 0x61, 0xcb, - 0xae, 0x28, 0xd3, 0x7e, 0xc2, 0xb4, 0x66, 0x91, 0x26, 0x5f, 0x3c, - 0x2e, 0x24, 0x5f, 0xcb, 0x58, 0x0f, 0xeb, 0x28, 0xec, 0xaf, 0x11, - 0x96, 0xf3, 0xdc, 0x7b, 0x6f, 0xc0, 0xa7, 0x88, 0xf2, 0x53, 0x77, - 0xb3, 0x60, 0x5e, 0xae, 0xae, 0x28, 0xda, 0x35, 0x2c, 0x6f, 0x34, - 0x45, 0xd3, 0x26, 0xe1, 0xde, 0xec, 0x5b, 0x4f, 0x27, 0x6b, 0x16, - 0x7c, 0xbd, 0x44, 0x04, 0x18, 0x82, 0xb3, 0x89, 0x79, 0x17, 0x10, - 0x71, 0x3d, 0x7a, 0xa2, 0x16, 0x4e, 0xf5, 0x01, 0xcd, 0xa4, 0x6c, - 0x65, 0x68, 0xa1, 0x49, 0x76, 0x5c, 0x43, 0xc9, 0xd8, 0xbc, 0x36, - 0x67, 0x6c, 0xa5, 0x94, 0xb5, 0xd4, 0xcc, 0xb9, 0xbd, 0x6a, 0x35, - 0x56, 0x21, 0xde, 0xd8, 0xc3, 0xeb, 0xfb, 0xcb, 0xa4, 0x60, 0x4c, - 0xb0, 0x55, 0xa0, 0xa0, 0x7b, 0x57, 0xb2, 0x30, 0x82, 0x04, 0xbd, - 0x30, 0x82, 0x03, 0xa5, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, - 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0x85, 0x31, 0x0b, 0x30, - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, - 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x17, 0x57, - 0x65, 0x6c, 0x6c, 0x73, 0x20, 0x46, 0x61, 0x72, 0x67, 0x6f, 0x20, - 0x57, 0x65, 0x6c, 0x6c, 0x73, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, - 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x13, - 0x57, 0x65, 0x6c, 0x6c, 0x73, 0x20, 0x46, 0x61, 0x72, 0x67, 0x6f, - 0x20, 0x42, 0x61, 0x6e, 0x6b, 0x20, 0x4e, 0x41, 0x31, 0x36, 0x30, - 0x34, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2d, 0x57, 0x65, 0x6c, - 0x6c, 0x73, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x50, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, - 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, - 0x17, 0x0d, 0x30, 0x37, 0x31, 0x32, 0x31, 0x33, 0x31, 0x37, 0x30, - 0x37, 0x35, 0x34, 0x5a, 0x17, 0x0d, 0x32, 0x32, 0x31, 0x32, 0x31, - 0x34, 0x30, 0x30, 0x30, 0x37, 0x35, 0x34, 0x5a, 0x30, 0x81, 0x85, + 0x53, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x17, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x0e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x54, 0x72, 0x75, + 0x73, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, + 0x02, 0x82, 0x01, 0x01, 0x00, 0xab, 0xa4, 0x81, 0xe5, 0x95, 0xcd, + 0xf5, 0xf6, 0x14, 0x8e, 0xc2, 0x4f, 0xca, 0xd4, 0xe2, 0x78, 0x95, + 0x58, 0x9c, 0x41, 0xe1, 0x0d, 0x99, 0x40, 0x24, 0x17, 0x39, 0x91, + 0x33, 0x66, 0xe9, 0xbe, 0xe1, 0x83, 0xaf, 0x62, 0x5c, 0x89, 0xd1, + 0xfc, 0x24, 0x5b, 0x61, 0xb3, 0xe0, 0x11, 0x11, 0x41, 0x1c, 0x1d, + 0x6e, 0xf0, 0xb8, 0xbb, 0xf8, 0xde, 0xa7, 0x81, 0xba, 0xa6, 0x48, + 0xc6, 0x9f, 0x1d, 0xbd, 0xbe, 0x8e, 0xa9, 0x41, 0x3e, 0xb8, 0x94, + 0xed, 0x29, 0x1a, 0xd4, 0x8e, 0xd2, 0x03, 0x1d, 0x03, 0xef, 0x6d, + 0x0d, 0x67, 0x1c, 0x57, 0xd7, 0x06, 0xad, 0xca, 0xc8, 0xf5, 0xfe, + 0x0e, 0xaf, 0x66, 0x25, 0x48, 0x04, 0x96, 0x0b, 0x5d, 0xa3, 0xba, + 0x16, 0xc3, 0x08, 0x4f, 0xd1, 0x46, 0xf8, 0x14, 0x5c, 0xf2, 0xc8, + 0x5e, 0x01, 0x99, 0x6d, 0xfd, 0x88, 0xcc, 0x86, 0xa8, 0xc1, 0x6f, + 0x31, 0x42, 0x6c, 0x52, 0x3e, 0x68, 0xcb, 0xf3, 0x19, 0x34, 0xdf, + 0xbb, 0x87, 0x18, 0x56, 0x80, 0x26, 0xc4, 0xd0, 0xdc, 0xc0, 0x6f, + 0xdf, 0xde, 0xa0, 0xc2, 0x91, 0x16, 0xa0, 0x64, 0x11, 0x4b, 0x44, + 0xbc, 0x1e, 0xf6, 0xe7, 0xfa, 0x63, 0xde, 0x66, 0xac, 0x76, 0xa4, + 0x71, 0xa3, 0xec, 0x36, 0x94, 0x68, 0x7a, 0x77, 0xa4, 0xb1, 0xe7, + 0x0e, 0x2f, 0x81, 0x7a, 0xe2, 0xb5, 0x72, 0x86, 0xef, 0xa2, 0x6b, + 0x8b, 0xf0, 0x0f, 0xdb, 0xd3, 0x59, 0x3f, 0xba, 0x72, 0xbc, 0x44, + 0x24, 0x9c, 0xe3, 0x73, 0xb3, 0xf7, 0xaf, 0x57, 0x2f, 0x42, 0x26, + 0x9d, 0xa9, 0x74, 0xba, 0x00, 0x52, 0xf2, 0x4b, 0xcd, 0x53, 0x7c, + 0x47, 0x0b, 0x36, 0x85, 0x0e, 0x66, 0xa9, 0x08, 0x97, 0x16, 0x34, + 0x57, 0xc1, 0x66, 0xf7, 0x80, 0xe3, 0xed, 0x70, 0x54, 0xc7, 0x93, + 0xe0, 0x2e, 0x28, 0x15, 0x59, 0x87, 0xba, 0xbb, 0x02, 0x03, 0x01, + 0x00, 0x01, 0xa3, 0x81, 0x9d, 0x30, 0x81, 0x9a, 0x30, 0x13, 0x06, + 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x14, 0x02, 0x04, + 0x06, 0x1e, 0x04, 0x00, 0x43, 0x00, 0x41, 0x30, 0x0b, 0x06, 0x03, + 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, + 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, + 0x04, 0x16, 0x04, 0x14, 0x42, 0x32, 0xb6, 0x16, 0xfa, 0x04, 0xfd, + 0xfe, 0x5d, 0x4b, 0x7a, 0xc3, 0xfd, 0xf7, 0x4c, 0x40, 0x1d, 0x5a, + 0x43, 0xaf, 0x30, 0x34, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x2d, + 0x30, 0x2b, 0x30, 0x29, 0xa0, 0x27, 0xa0, 0x25, 0x86, 0x23, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x73, + 0x65, 0x63, 0x75, 0x72, 0x65, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x54, 0x43, 0x41, 0x2e, 0x63, 0x72, + 0x6c, 0x30, 0x10, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, + 0x37, 0x15, 0x01, 0x04, 0x03, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x30, 0xed, 0x4f, 0x4a, 0xe1, + 0x58, 0x3a, 0x52, 0x72, 0x5b, 0xb5, 0xa6, 0xa3, 0x65, 0x18, 0xa6, + 0xbb, 0x51, 0x3b, 0x77, 0xe9, 0x9d, 0xea, 0xd3, 0x9f, 0x5c, 0xe0, + 0x45, 0x65, 0x7b, 0x0d, 0xca, 0x5b, 0xe2, 0x70, 0x50, 0xb2, 0x94, + 0x05, 0x14, 0xae, 0x49, 0xc7, 0x8d, 0x41, 0x07, 0x12, 0x73, 0x94, + 0x7e, 0x0c, 0x23, 0x21, 0xfd, 0xbc, 0x10, 0x7f, 0x60, 0x10, 0x5a, + 0x72, 0xf5, 0x98, 0x0e, 0xac, 0xec, 0xb9, 0x7f, 0xdd, 0x7a, 0x6f, + 0x5d, 0xd3, 0x1c, 0xf4, 0xff, 0x88, 0x05, 0x69, 0x42, 0xa9, 0x05, + 0x71, 0xc8, 0xb7, 0xac, 0x26, 0xe8, 0x2e, 0xb4, 0x8c, 0x6a, 0xff, + 0x71, 0xdc, 0xb8, 0xb1, 0xdf, 0x99, 0xbc, 0x7c, 0x21, 0x54, 0x2b, + 0xe4, 0x58, 0xa2, 0xbb, 0x57, 0x29, 0xae, 0x9e, 0xa9, 0xa3, 0x19, + 0x26, 0x0f, 0x99, 0x2e, 0x08, 0xb0, 0xef, 0xfd, 0x69, 0xcf, 0x99, + 0x1a, 0x09, 0x8d, 0xe3, 0xa7, 0x9f, 0x2b, 0xc9, 0x36, 0x34, 0x7b, + 0x24, 0xb3, 0x78, 0x4c, 0x95, 0x17, 0xa4, 0x06, 0x26, 0x1e, 0xb6, + 0x64, 0x52, 0x36, 0x5f, 0x60, 0x67, 0xd9, 0x9c, 0xc5, 0x05, 0x74, + 0x0b, 0xe7, 0x67, 0x23, 0xd2, 0x08, 0xfc, 0x88, 0xe9, 0xae, 0x8b, + 0x7f, 0xe1, 0x30, 0xf4, 0x37, 0x7e, 0xfd, 0xc6, 0x32, 0xda, 0x2d, + 0x9e, 0x44, 0x30, 0x30, 0x6c, 0xee, 0x07, 0xde, 0xd2, 0x34, 0xfc, + 0xd2, 0xff, 0x40, 0xf6, 0x4b, 0xf4, 0x66, 0x46, 0x06, 0x54, 0xa6, + 0xf2, 0x32, 0x0a, 0x63, 0x26, 0x30, 0x6b, 0x9b, 0xd1, 0xdc, 0x8b, + 0x47, 0xba, 0xe1, 0xb9, 0xd5, 0x62, 0xd0, 0xa2, 0xa0, 0xf4, 0x67, + 0x05, 0x78, 0x29, 0x63, 0x1a, 0x6f, 0x04, 0xd6, 0xf8, 0xc6, 0x4c, + 0xa3, 0x9a, 0xb1, 0x37, 0xb4, 0x8d, 0xe5, 0x28, 0x4b, 0x1d, 0x9e, + 0x2c, 0xc2, 0xb8, 0x68, 0xbc, 0xed, 0x02, 0xee, 0x31, 0x30, 0x82, + 0x03, 0xbc, 0x30, 0x82, 0x02, 0xa4, 0xa0, 0x03, 0x02, 0x01, 0x02, + 0x02, 0x10, 0x07, 0x56, 0x22, 0xa4, 0xe8, 0xd4, 0x8a, 0x89, 0x4d, + 0xf4, 0x13, 0xc8, 0xf0, 0xf8, 0xea, 0xa5, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, + 0x30, 0x4a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x55, 0x53, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x13, 0x17, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x13, 0x10, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, + 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x43, 0x41, 0x30, + 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x31, 0x30, 0x37, 0x31, 0x39, + 0x34, 0x32, 0x32, 0x38, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x31, 0x32, + 0x33, 0x31, 0x31, 0x39, 0x35, 0x32, 0x30, 0x36, 0x5a, 0x30, 0x4a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x0c, 0x17, 0x57, 0x65, 0x6c, 0x6c, 0x73, 0x20, 0x46, 0x61, 0x72, - 0x67, 0x6f, 0x20, 0x57, 0x65, 0x6c, 0x6c, 0x73, 0x53, 0x65, 0x63, - 0x75, 0x72, 0x65, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, - 0x0b, 0x0c, 0x13, 0x57, 0x65, 0x6c, 0x6c, 0x73, 0x20, 0x46, 0x61, - 0x72, 0x67, 0x6f, 0x20, 0x42, 0x61, 0x6e, 0x6b, 0x20, 0x4e, 0x41, - 0x31, 0x36, 0x30, 0x34, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2d, - 0x57, 0x65, 0x6c, 0x6c, 0x73, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x52, 0x6f, 0x6f, - 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, - 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, - 0x00, 0xee, 0x6f, 0xb4, 0xbd, 0x79, 0xe2, 0x8f, 0x08, 0x21, 0x9e, - 0x38, 0x04, 0x41, 0x25, 0xef, 0xab, 0x5b, 0x1c, 0x53, 0x92, 0xac, - 0x6d, 0x9e, 0xdd, 0xc2, 0xc4, 0x2e, 0x45, 0x94, 0x03, 0x35, 0x88, - 0x67, 0x74, 0x57, 0xe3, 0xdf, 0x8c, 0xb8, 0xa7, 0x76, 0x8f, 0x3b, - 0xf7, 0xa8, 0xc4, 0xdb, 0x29, 0x63, 0x0e, 0x91, 0x68, 0x36, 0x8a, - 0x97, 0x8e, 0x8a, 0x71, 0x68, 0x09, 0x07, 0xe4, 0xe8, 0xd4, 0x0e, - 0x4f, 0xf8, 0xd6, 0x2b, 0x4c, 0xa4, 0x16, 0xf9, 0xef, 0x43, 0x98, - 0x8f, 0xb3, 0x9e, 0x52, 0xdf, 0x6d, 0x91, 0x39, 0x8f, 0x38, 0xbd, - 0x77, 0x8b, 0x43, 0x63, 0xeb, 0xb7, 0x93, 0xfc, 0x30, 0x4c, 0x1c, - 0x01, 0x93, 0xb6, 0x13, 0xfb, 0xf7, 0xa1, 0x1f, 0xbf, 0x25, 0xe1, - 0x74, 0x37, 0x2c, 0x1e, 0xa4, 0x5e, 0x3c, 0x68, 0xf8, 0x4b, 0xbf, - 0x0d, 0xb9, 0x1e, 0x2e, 0x36, 0xe8, 0xa9, 0xe4, 0xa7, 0xf8, 0x0f, - 0xcb, 0x82, 0x75, 0x7c, 0x35, 0x2d, 0x22, 0xd6, 0xc2, 0xbf, 0x0b, - 0xf3, 0xb4, 0xfc, 0x6c, 0x95, 0x61, 0x1e, 0x57, 0xd7, 0x04, 0x81, - 0x32, 0x83, 0x52, 0x79, 0xe6, 0x83, 0x63, 0xcf, 0xb7, 0xcb, 0x63, - 0x8b, 0x11, 0xe2, 0xbd, 0x5e, 0xeb, 0xf6, 0x8d, 0xed, 0x95, 0x72, - 0x28, 0xb4, 0xac, 0x12, 0x62, 0xe9, 0x4a, 0x33, 0xe6, 0x83, 0x32, - 0xae, 0x05, 0x75, 0x95, 0xbd, 0x84, 0x95, 0xdb, 0x2a, 0x5c, 0x9b, - 0x8e, 0x2e, 0x0c, 0xb8, 0x81, 0x2b, 0x41, 0xe6, 0x38, 0x56, 0x9f, - 0x49, 0x9b, 0x6c, 0x76, 0xfa, 0x8a, 0x5d, 0xf7, 0x01, 0x79, 0x81, - 0x7c, 0xc1, 0x83, 0x40, 0x05, 0xfe, 0x71, 0xfd, 0x0c, 0x3f, 0xcc, - 0x4e, 0x60, 0x09, 0x0e, 0x65, 0x47, 0x10, 0x2f, 0x01, 0xc0, 0x05, - 0x3f, 0x8f, 0xf8, 0xb3, 0x41, 0xef, 0x5a, 0x42, 0x7e, 0x59, 0xef, - 0xd2, 0x97, 0x0c, 0x65, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, - 0x01, 0x34, 0x30, 0x82, 0x01, 0x30, 0x30, 0x0f, 0x06, 0x03, 0x55, - 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, - 0xff, 0x30, 0x39, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x32, 0x30, - 0x30, 0x30, 0x2e, 0xa0, 0x2c, 0xa0, 0x2a, 0x86, 0x28, 0x68, 0x74, - 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x70, 0x6b, - 0x69, 0x2e, 0x77, 0x65, 0x6c, 0x6c, 0x73, 0x66, 0x61, 0x72, 0x67, - 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x77, 0x73, 0x70, 0x72, 0x63, - 0x61, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, - 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0xc6, 0x30, - 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x26, - 0x95, 0x19, 0x10, 0xd9, 0xe8, 0xa1, 0x97, 0x91, 0xff, 0xdc, 0x19, - 0xd9, 0xb5, 0x04, 0x3e, 0xd2, 0x73, 0x0a, 0x6a, 0x30, 0x81, 0xb2, - 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x81, 0xaa, 0x30, 0x81, 0xa7, - 0x80, 0x14, 0x26, 0x95, 0x19, 0x10, 0xd9, 0xe8, 0xa1, 0x97, 0x91, - 0xff, 0xdc, 0x19, 0xd9, 0xb5, 0x04, 0x3e, 0xd2, 0x73, 0x0a, 0x6a, - 0xa1, 0x81, 0x8b, 0xa4, 0x81, 0x88, 0x30, 0x81, 0x85, 0x31, 0x0b, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, - 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x17, - 0x57, 0x65, 0x6c, 0x6c, 0x73, 0x20, 0x46, 0x61, 0x72, 0x67, 0x6f, - 0x20, 0x57, 0x65, 0x6c, 0x6c, 0x73, 0x53, 0x65, 0x63, 0x75, 0x72, - 0x65, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, - 0x13, 0x57, 0x65, 0x6c, 0x6c, 0x73, 0x20, 0x46, 0x61, 0x72, 0x67, - 0x6f, 0x20, 0x42, 0x61, 0x6e, 0x6b, 0x20, 0x4e, 0x41, 0x31, 0x36, - 0x30, 0x34, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2d, 0x57, 0x65, - 0x6c, 0x6c, 0x73, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, - 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x82, - 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, - 0xb9, 0x15, 0xb1, 0x44, 0x91, 0xcc, 0x23, 0xc8, 0x2b, 0x4d, 0x77, - 0xe3, 0xf8, 0x9a, 0x7b, 0x27, 0x0d, 0xcd, 0x72, 0xbb, 0x99, 0x00, - 0xca, 0x7c, 0x66, 0x19, 0x50, 0xc6, 0xd5, 0x98, 0xed, 0xab, 0xbf, - 0x03, 0x5a, 0xe5, 0x4d, 0xe5, 0x1e, 0xc8, 0x4f, 0x71, 0x97, 0x86, - 0xd5, 0xe3, 0x1d, 0xfd, 0x90, 0xc9, 0x3c, 0x75, 0x77, 0x57, 0x7a, - 0x7d, 0xf8, 0xde, 0xf4, 0xd4, 0xd5, 0xf7, 0x95, 0xe6, 0x74, 0x6e, - 0x1d, 0x3c, 0xae, 0x7c, 0x9d, 0xdb, 0x02, 0x03, 0x05, 0x2c, 0x71, - 0x4b, 0x25, 0x3e, 0x07, 0xe3, 0x5e, 0x9a, 0xf5, 0x66, 0x17, 0x29, - 0x88, 0x1a, 0x38, 0x9f, 0xcf, 0xaa, 0x41, 0x03, 0x84, 0x97, 0x6b, - 0x93, 0x38, 0x7a, 0xca, 0x30, 0x44, 0x1b, 0x24, 0x44, 0x33, 0xd0, - 0xe4, 0xd1, 0xdc, 0x28, 0x38, 0xf4, 0x13, 0x43, 0x35, 0x35, 0x29, - 0x63, 0xa8, 0x7c, 0xa2, 0xb5, 0xad, 0x38, 0xa4, 0xed, 0xad, 0xfd, - 0xc6, 0x9a, 0x1f, 0xff, 0x97, 0x73, 0xfe, 0xfb, 0xb3, 0x35, 0xa7, - 0x93, 0x86, 0xc6, 0x76, 0x91, 0x00, 0xe6, 0xac, 0x51, 0x16, 0xc4, - 0x27, 0x32, 0x5c, 0xdb, 0x73, 0xda, 0xa5, 0x93, 0x57, 0x8e, 0x3e, - 0x6d, 0x35, 0x26, 0x08, 0x59, 0xd5, 0xe7, 0x44, 0xd7, 0x76, 0x20, - 0x63, 0xe7, 0xac, 0x13, 0x67, 0xc3, 0x6d, 0xb1, 0x70, 0x46, 0x7c, - 0xd5, 0x96, 0x11, 0x3d, 0x89, 0x6f, 0x5d, 0xa8, 0xa1, 0xeb, 0x8d, - 0x0a, 0xda, 0xc3, 0x1d, 0x33, 0x6c, 0xa3, 0xea, 0x67, 0x19, 0x9a, - 0x99, 0x7f, 0x4b, 0x3d, 0x83, 0x51, 0x2a, 0x1d, 0xca, 0x2f, 0x86, - 0x0c, 0xa2, 0x7e, 0x10, 0x2d, 0x2b, 0xd4, 0x16, 0x95, 0x0b, 0x07, - 0xaa, 0x2e, 0x14, 0x92, 0x49, 0xb7, 0x29, 0x6f, 0xd8, 0x6d, 0x31, - 0x7d, 0xf5, 0xfc, 0xa1, 0x10, 0x07, 0x87, 0xce, 0x2f, 0x59, 0xdc, - 0x3e, 0x58, 0xdb, 0x30, 0x82, 0x02, 0x89, 0x30, 0x82, 0x02, 0x0f, - 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x1f, 0x47, 0xaf, 0xaa, - 0x62, 0x00, 0x70, 0x50, 0x54, 0x4c, 0x01, 0x9e, 0x9b, 0x63, 0x99, - 0x2a, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, - 0x03, 0x03, 0x30, 0x81, 0x85, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x13, 0x17, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x54, 0x72, 0x75, + 0x73, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x10, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, + 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, + 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xaf, 0x35, 0x2e, + 0xd8, 0xac, 0x6c, 0x55, 0x69, 0x06, 0x71, 0xe5, 0x13, 0x68, 0x24, + 0xb3, 0x4f, 0xd8, 0xcc, 0x21, 0x47, 0xf8, 0xf1, 0x60, 0x38, 0x89, + 0x89, 0x03, 0xe9, 0xbd, 0xea, 0x5e, 0x46, 0x53, 0x09, 0xdc, 0x5c, + 0xf5, 0x5a, 0xe8, 0xf7, 0x45, 0x2a, 0x02, 0xeb, 0x31, 0x61, 0xd7, + 0x29, 0x33, 0x4c, 0xce, 0xc7, 0x7c, 0x0a, 0x37, 0x7e, 0x0f, 0xba, + 0x32, 0x98, 0xe1, 0x1d, 0x97, 0xaf, 0x8f, 0xc7, 0xdc, 0xc9, 0x38, + 0x96, 0xf3, 0xdb, 0x1a, 0xfc, 0x51, 0xed, 0x68, 0xc6, 0xd0, 0x6e, + 0xa4, 0x7c, 0x24, 0xd1, 0xae, 0x42, 0xc8, 0x96, 0x50, 0x63, 0x2e, + 0xe0, 0xfe, 0x75, 0xfe, 0x98, 0xa7, 0x5f, 0x49, 0x2e, 0x95, 0xe3, + 0x39, 0x33, 0x64, 0x8e, 0x1e, 0xa4, 0x5f, 0x90, 0xd2, 0x67, 0x3c, + 0xb2, 0xd9, 0xfe, 0x41, 0xb9, 0x55, 0xa7, 0x09, 0x8e, 0x72, 0x05, + 0x1e, 0x8b, 0xdd, 0x44, 0x85, 0x82, 0x42, 0xd0, 0x49, 0xc0, 0x1d, + 0x60, 0xf0, 0xd1, 0x17, 0x2c, 0x95, 0xeb, 0xf6, 0xa5, 0xc1, 0x92, + 0xa3, 0xc5, 0xc2, 0xa7, 0x08, 0x60, 0x0d, 0x60, 0x04, 0x10, 0x96, + 0x79, 0x9e, 0x16, 0x34, 0xe6, 0xa9, 0xb6, 0xfa, 0x25, 0x45, 0x39, + 0xc8, 0x1e, 0x65, 0xf9, 0x93, 0xf5, 0xaa, 0xf1, 0x52, 0xdc, 0x99, + 0x98, 0x3d, 0xa5, 0x86, 0x1a, 0x0c, 0x35, 0x33, 0xfa, 0x4b, 0xa5, + 0x04, 0x06, 0x15, 0x1c, 0x31, 0x80, 0xef, 0xaa, 0x18, 0x6b, 0xc2, + 0x7b, 0xd7, 0xda, 0xce, 0xf9, 0x33, 0x20, 0xd5, 0xf5, 0xbd, 0x6a, + 0x33, 0x2d, 0x81, 0x04, 0xfb, 0xb0, 0x5c, 0xd4, 0x9c, 0xa3, 0xe2, + 0x5c, 0x1d, 0xe3, 0xa9, 0x42, 0x75, 0x5e, 0x7b, 0xd4, 0x77, 0xef, + 0x39, 0x54, 0xba, 0xc9, 0x0a, 0x18, 0x1b, 0x12, 0x99, 0x49, 0x2f, + 0x88, 0x4b, 0xfd, 0x50, 0x62, 0xd1, 0x73, 0xe7, 0x8f, 0x7a, 0x43, + 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x9d, 0x30, 0x81, 0x9a, + 0x30, 0x13, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, + 0x14, 0x02, 0x04, 0x06, 0x1e, 0x04, 0x00, 0x43, 0x00, 0x41, 0x30, + 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, + 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, + 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, + 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xaf, 0x44, 0x04, 0xc2, + 0x41, 0x7e, 0x48, 0x83, 0xdb, 0x4e, 0x39, 0x02, 0xec, 0xec, 0x84, + 0x7a, 0xe6, 0xce, 0xc9, 0xa4, 0x30, 0x34, 0x06, 0x03, 0x55, 0x1d, + 0x1f, 0x04, 0x2d, 0x30, 0x2b, 0x30, 0x29, 0xa0, 0x27, 0xa0, 0x25, + 0x86, 0x23, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, + 0x6c, 0x2e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x74, 0x72, 0x75, + 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x47, 0x43, 0x41, + 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x10, 0x06, 0x09, 0x2b, 0x06, 0x01, + 0x04, 0x01, 0x82, 0x37, 0x15, 0x01, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x63, 0x1a, + 0x08, 0x40, 0x7d, 0xa4, 0x5e, 0x53, 0x0d, 0x77, 0xd8, 0x7a, 0xae, + 0x1f, 0x0d, 0x0b, 0x51, 0x16, 0x03, 0xef, 0x18, 0x7c, 0xc8, 0xe3, + 0xaf, 0x6a, 0x58, 0x93, 0x14, 0x60, 0x91, 0xb2, 0x84, 0xdc, 0x88, + 0x4e, 0xbe, 0x39, 0x8a, 0x3a, 0xf3, 0xe6, 0x82, 0x89, 0x5d, 0x01, + 0x37, 0xb3, 0xab, 0x24, 0xa4, 0x15, 0x0e, 0x92, 0x35, 0x5a, 0x4a, + 0x44, 0x5e, 0x4e, 0x57, 0xfa, 0x75, 0xce, 0x1f, 0x48, 0xce, 0x66, + 0xf4, 0x3c, 0x40, 0x26, 0x92, 0x98, 0x6c, 0x1b, 0xee, 0x24, 0x46, + 0x0c, 0x17, 0xb3, 0x52, 0xa5, 0xdb, 0xa5, 0x91, 0x91, 0xcf, 0x37, + 0xd3, 0x6f, 0xe7, 0x27, 0x08, 0x3a, 0x4e, 0x19, 0x1f, 0x3a, 0xa7, + 0x58, 0x5c, 0x17, 0xcf, 0x79, 0x3f, 0x8b, 0xe4, 0xa7, 0xd3, 0x26, + 0x23, 0x9d, 0x26, 0x0f, 0x58, 0x69, 0xfc, 0x47, 0x7e, 0xb2, 0xd0, + 0x8d, 0x8b, 0x93, 0xbf, 0x29, 0x4f, 0x43, 0x69, 0x74, 0x76, 0x67, + 0x4b, 0xcf, 0x07, 0x8c, 0xe6, 0x02, 0xf7, 0xb5, 0xe1, 0xb4, 0x43, + 0xb5, 0x4b, 0x2d, 0x14, 0x9f, 0xf9, 0xdc, 0x26, 0x0d, 0xbf, 0xa6, + 0x47, 0x74, 0x06, 0xd8, 0x88, 0xd1, 0x3a, 0x29, 0x30, 0x84, 0xce, + 0xd2, 0x39, 0x80, 0x62, 0x1b, 0xa8, 0xc7, 0x57, 0x49, 0xbc, 0x6a, + 0x55, 0x51, 0x67, 0x15, 0x4a, 0xbe, 0x35, 0x07, 0xe4, 0xd5, 0x75, + 0x98, 0x37, 0x79, 0x30, 0x14, 0xdb, 0x29, 0x9d, 0x6c, 0xc5, 0x69, + 0xcc, 0x47, 0x55, 0xa2, 0x30, 0xf7, 0xcc, 0x5c, 0x7f, 0xc2, 0xc3, + 0x98, 0x1c, 0x6b, 0x4e, 0x16, 0x80, 0xeb, 0x7a, 0x78, 0x65, 0x45, + 0xa2, 0x00, 0x1a, 0xaf, 0x0c, 0x0d, 0x55, 0x64, 0x34, 0x48, 0xb8, + 0x92, 0xb9, 0xf1, 0xb4, 0x50, 0x29, 0xf2, 0x4f, 0x23, 0x1f, 0xda, + 0x6c, 0xac, 0x1f, 0x44, 0xe1, 0xdd, 0x23, 0x78, 0x51, 0x5b, 0xc7, + 0x16, 0x30, 0x82, 0x04, 0x1d, 0x30, 0x82, 0x03, 0x05, 0xa0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x10, 0x4e, 0x81, 0x2d, 0x8a, 0x82, 0x65, + 0xe0, 0x0b, 0x02, 0xee, 0x3e, 0x35, 0x02, 0x46, 0xe5, 0x3d, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x05, 0x05, 0x00, 0x30, 0x81, 0x81, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, + 0x19, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x12, 0x47, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, 0x68, 0x65, + 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x04, 0x07, 0x13, 0x07, 0x53, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, + 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, + 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x43, 0x41, 0x20, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x27, 0x30, 0x25, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x13, 0x1e, 0x43, 0x4f, 0x4d, 0x4f, 0x44, + 0x4f, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x32, + 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, + 0x32, 0x39, 0x31, 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, + 0x39, 0x5a, 0x30, 0x81, 0x81, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x12, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, @@ -7638,460 +5556,622 @@ static const unsigned char ca_bundle_data[] = { 0x07, 0x13, 0x07, 0x53, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x13, 0x22, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, - 0x20, 0x45, 0x43, 0x43, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, - 0x38, 0x30, 0x33, 0x30, 0x36, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x31, 0x31, 0x38, 0x32, 0x33, - 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0x85, 0x31, 0x0b, 0x30, - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, - 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x12, 0x47, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, - 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, - 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x53, 0x61, 0x6c, 0x66, 0x6f, - 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x13, 0x11, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x43, 0x41, - 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x2b, 0x30, - 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x43, 0x4f, 0x4d, - 0x4f, 0x44, 0x4f, 0x20, 0x45, 0x43, 0x43, 0x20, 0x43, 0x65, 0x72, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x76, - 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, - 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, - 0x03, 0x47, 0x7b, 0x2f, 0x75, 0xc9, 0x82, 0x15, 0x85, 0xfb, 0x75, - 0xe4, 0x91, 0x16, 0xd4, 0xab, 0x62, 0x99, 0xf5, 0x3e, 0x52, 0x0b, - 0x06, 0xce, 0x41, 0x00, 0x7f, 0x97, 0xe1, 0x0a, 0x24, 0x3c, 0x1d, - 0x01, 0x04, 0xee, 0x3d, 0xd2, 0x8d, 0x09, 0x97, 0x0c, 0xe0, 0x75, - 0xe4, 0xfa, 0xfb, 0x77, 0x8a, 0x2a, 0xf5, 0x03, 0x60, 0x4b, 0x36, - 0x8b, 0x16, 0x23, 0x16, 0xad, 0x09, 0x71, 0xf4, 0x4a, 0xf4, 0x28, - 0x50, 0xb4, 0xfe, 0x88, 0x1c, 0x6e, 0x3f, 0x6c, 0x2f, 0x2f, 0x09, - 0x59, 0x5b, 0xa5, 0x5b, 0x0b, 0x33, 0x99, 0xe2, 0xc3, 0x3d, 0x89, - 0xf9, 0x6a, 0x2c, 0xef, 0xb2, 0xd3, 0x06, 0xe9, 0xa3, 0x42, 0x30, - 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, - 0x14, 0x75, 0x71, 0xa7, 0x19, 0x48, 0x19, 0xbc, 0x9d, 0x9d, 0xea, - 0x41, 0x47, 0xdf, 0x94, 0xc4, 0x48, 0x77, 0x99, 0xd3, 0x79, 0x30, - 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, - 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, - 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, - 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, - 0x03, 0x68, 0x00, 0x30, 0x65, 0x02, 0x31, 0x00, 0xef, 0x03, 0x5b, - 0x7a, 0xac, 0xb7, 0x78, 0x0a, 0x72, 0xb7, 0x88, 0xdf, 0xff, 0xb5, - 0x46, 0x14, 0x09, 0x0a, 0xfa, 0xa0, 0xe6, 0x7d, 0x08, 0xc6, 0x1a, - 0x87, 0xbd, 0x18, 0xa8, 0x73, 0xbd, 0x26, 0xca, 0x60, 0x0c, 0x9d, - 0xce, 0x99, 0x9f, 0xcf, 0x5c, 0x0f, 0x30, 0xe1, 0xbe, 0x14, 0x31, - 0xea, 0x02, 0x30, 0x14, 0xf4, 0x93, 0x3c, 0x49, 0xa7, 0x33, 0x7a, - 0x90, 0x46, 0x47, 0xb3, 0x63, 0x7d, 0x13, 0x9b, 0x4e, 0xb7, 0x6f, - 0x18, 0x37, 0x80, 0x53, 0xfe, 0xdd, 0x20, 0xe0, 0x35, 0x9a, 0x36, - 0xd1, 0xc7, 0x01, 0xb9, 0xe6, 0xdc, 0xdd, 0xf3, 0xff, 0x1d, 0x2c, - 0x3a, 0x16, 0x57, 0xd9, 0x92, 0x39, 0xd6, 0x30, 0x82, 0x04, 0x02, - 0x30, 0x82, 0x02, 0xea, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x05, - 0x39, 0x11, 0x45, 0x10, 0x94, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, - 0x85, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, - 0x02, 0x46, 0x52, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, - 0x08, 0x13, 0x06, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x31, 0x0e, - 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x05, 0x50, 0x61, - 0x72, 0x69, 0x73, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x07, 0x50, 0x4d, 0x2f, 0x53, 0x47, 0x44, 0x4e, 0x31, - 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x05, 0x44, - 0x43, 0x53, 0x53, 0x49, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, - 0x04, 0x03, 0x13, 0x05, 0x49, 0x47, 0x43, 0x2f, 0x41, 0x31, 0x23, - 0x30, 0x21, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x09, 0x01, 0x16, 0x14, 0x69, 0x67, 0x63, 0x61, 0x40, 0x73, 0x67, - 0x64, 0x6e, 0x2e, 0x70, 0x6d, 0x2e, 0x67, 0x6f, 0x75, 0x76, 0x2e, - 0x66, 0x72, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x32, 0x31, 0x32, 0x31, - 0x33, 0x31, 0x34, 0x32, 0x39, 0x32, 0x33, 0x5a, 0x17, 0x0d, 0x32, - 0x30, 0x31, 0x30, 0x31, 0x37, 0x31, 0x34, 0x32, 0x39, 0x32, 0x32, - 0x5a, 0x30, 0x81, 0x85, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x46, 0x52, 0x31, 0x0f, 0x30, 0x0d, 0x06, - 0x03, 0x55, 0x04, 0x08, 0x13, 0x06, 0x46, 0x72, 0x61, 0x6e, 0x63, - 0x65, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, - 0x05, 0x50, 0x61, 0x72, 0x69, 0x73, 0x31, 0x10, 0x30, 0x0e, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x13, 0x07, 0x50, 0x4d, 0x2f, 0x53, 0x47, - 0x44, 0x4e, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, 0x0b, - 0x13, 0x05, 0x44, 0x43, 0x53, 0x53, 0x49, 0x31, 0x0e, 0x30, 0x0c, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x05, 0x49, 0x47, 0x43, 0x2f, - 0x41, 0x31, 0x23, 0x30, 0x21, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x14, 0x69, 0x67, 0x63, 0x61, - 0x40, 0x73, 0x67, 0x64, 0x6e, 0x2e, 0x70, 0x6d, 0x2e, 0x67, 0x6f, - 0x75, 0x76, 0x2e, 0x66, 0x72, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, + 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x13, 0x1e, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, + 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x74, 0x79, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, + 0x01, 0x00, 0xd0, 0x40, 0x8b, 0x8b, 0x72, 0xe3, 0x91, 0x1b, 0xf7, + 0x51, 0xc1, 0x1b, 0x54, 0x04, 0x98, 0xd3, 0xa9, 0xbf, 0xc1, 0xe6, + 0x8a, 0x5d, 0x3b, 0x87, 0xfb, 0xbb, 0x88, 0xce, 0x0d, 0xe3, 0x2f, + 0x3f, 0x06, 0x96, 0xf0, 0xa2, 0x29, 0x50, 0x99, 0xae, 0xdb, 0x3b, + 0xa1, 0x57, 0xb0, 0x74, 0x51, 0x71, 0xcd, 0xed, 0x42, 0x91, 0x4d, + 0x41, 0xfe, 0xa9, 0xc8, 0xd8, 0x6a, 0x86, 0x77, 0x44, 0xbb, 0x59, + 0x66, 0x97, 0x50, 0x5e, 0xb4, 0xd4, 0x2c, 0x70, 0x44, 0xcf, 0xda, + 0x37, 0x95, 0x42, 0x69, 0x3c, 0x30, 0xc4, 0x71, 0xb3, 0x52, 0xf0, + 0x21, 0x4d, 0xa1, 0xd8, 0xba, 0x39, 0x7c, 0x1c, 0x9e, 0xa3, 0x24, + 0x9d, 0xf2, 0x83, 0x16, 0x98, 0xaa, 0x16, 0x7c, 0x43, 0x9b, 0x15, + 0x5b, 0xb7, 0xae, 0x34, 0x91, 0xfe, 0xd4, 0x62, 0x26, 0x18, 0x46, + 0x9a, 0x3f, 0xeb, 0xc1, 0xf9, 0xf1, 0x90, 0x57, 0xeb, 0xac, 0x7a, + 0x0d, 0x8b, 0xdb, 0x72, 0x30, 0x6a, 0x66, 0xd5, 0xe0, 0x46, 0xa3, + 0x70, 0xdc, 0x68, 0xd9, 0xff, 0x04, 0x48, 0x89, 0x77, 0xde, 0xb5, + 0xe9, 0xfb, 0x67, 0x6d, 0x41, 0xe9, 0xbc, 0x39, 0xbd, 0x32, 0xd9, + 0x62, 0x02, 0xf1, 0xb1, 0xa8, 0x3d, 0x6e, 0x37, 0x9c, 0xe2, 0x2f, + 0xe2, 0xd3, 0xa2, 0x26, 0x8b, 0xc6, 0xb8, 0x55, 0x43, 0x88, 0xe1, + 0x23, 0x3e, 0xa5, 0xd2, 0x24, 0x39, 0x6a, 0x47, 0xab, 0x00, 0xd4, + 0xa1, 0xb3, 0xa9, 0x25, 0xfe, 0x0d, 0x3f, 0xa7, 0x1d, 0xba, 0xd3, + 0x51, 0xc1, 0x0b, 0xa4, 0xda, 0xac, 0x38, 0xef, 0x55, 0x50, 0x24, + 0x05, 0x65, 0x46, 0x93, 0x34, 0x4f, 0x2d, 0x8d, 0xad, 0xc6, 0xd4, + 0x21, 0x19, 0xd2, 0x8e, 0xca, 0x05, 0x61, 0x71, 0x07, 0x73, 0x47, + 0xe5, 0x8a, 0x19, 0x12, 0xbd, 0x04, 0x4d, 0xce, 0x4e, 0x9c, 0xa5, + 0x48, 0xac, 0xbb, 0x26, 0xf7, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, + 0x81, 0x8e, 0x30, 0x81, 0x8b, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, + 0x0e, 0x04, 0x16, 0x04, 0x14, 0x0b, 0x58, 0xe5, 0x8b, 0xc6, 0x4c, + 0x15, 0x37, 0xa4, 0x40, 0xa9, 0x30, 0xa9, 0x21, 0xbe, 0x47, 0x36, + 0x5a, 0x56, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, + 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, + 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, + 0x01, 0x01, 0xff, 0x30, 0x49, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, + 0x42, 0x30, 0x40, 0x30, 0x3e, 0xa0, 0x3c, 0xa0, 0x3a, 0x86, 0x38, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, + 0x63, 0x6f, 0x6d, 0x6f, 0x64, 0x6f, 0x63, 0x61, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x43, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x2e, 0x63, 0x72, + 0x6c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x3e, + 0x98, 0x9e, 0x9b, 0xf6, 0x1b, 0xe9, 0xd7, 0x39, 0xb7, 0x78, 0xae, + 0x1d, 0x72, 0x18, 0x49, 0xd3, 0x87, 0xe4, 0x43, 0x82, 0xeb, 0x3f, + 0xc9, 0xaa, 0xf5, 0xa8, 0xb5, 0xef, 0x55, 0x7c, 0x21, 0x52, 0x65, + 0xf9, 0xd5, 0x0d, 0xe1, 0x6c, 0xf4, 0x3e, 0x8c, 0x93, 0x73, 0x91, + 0x2e, 0x02, 0xc4, 0x4e, 0x07, 0x71, 0x6f, 0xc0, 0x8f, 0x38, 0x61, + 0x08, 0xa8, 0x1e, 0x81, 0x0a, 0xc0, 0x2f, 0x20, 0x2f, 0x41, 0x8b, + 0x91, 0xdc, 0x48, 0x45, 0xbc, 0xf1, 0xc6, 0xde, 0xba, 0x76, 0x6b, + 0x33, 0xc8, 0x00, 0x2d, 0x31, 0x46, 0x4c, 0xed, 0xe7, 0x9d, 0xcf, + 0x88, 0x94, 0xff, 0x33, 0xc0, 0x56, 0xe8, 0x24, 0x86, 0x26, 0xb8, + 0xd8, 0x38, 0x38, 0xdf, 0x2a, 0x6b, 0xdd, 0x12, 0xcc, 0xc7, 0x3f, + 0x47, 0x17, 0x4c, 0xa2, 0xc2, 0x06, 0x96, 0x09, 0xd6, 0xdb, 0xfe, + 0x3f, 0x3c, 0x46, 0x41, 0xdf, 0x58, 0xe2, 0x56, 0x0f, 0x3c, 0x3b, + 0xc1, 0x1c, 0x93, 0x35, 0xd9, 0x38, 0x52, 0xac, 0xee, 0xc8, 0xec, + 0x2e, 0x30, 0x4e, 0x94, 0x35, 0xb4, 0x24, 0x1f, 0x4b, 0x78, 0x69, + 0xda, 0xf2, 0x02, 0x38, 0xcc, 0x95, 0x52, 0x93, 0xf0, 0x70, 0x25, + 0x59, 0x9c, 0x20, 0x67, 0xc4, 0xee, 0xf9, 0x8b, 0x57, 0x61, 0xf4, + 0x92, 0x76, 0x7d, 0x3f, 0x84, 0x8d, 0x55, 0xb7, 0xe8, 0xe5, 0xac, + 0xd5, 0xf1, 0xf5, 0x19, 0x56, 0xa6, 0x5a, 0xfb, 0x90, 0x1c, 0xaf, + 0x93, 0xeb, 0xe5, 0x1c, 0xd4, 0x67, 0x97, 0x5d, 0x04, 0x0e, 0xbe, + 0x0b, 0x83, 0xa6, 0x17, 0x83, 0xb9, 0x30, 0x12, 0xa0, 0xc5, 0x33, + 0x15, 0x05, 0xb9, 0x0d, 0xfb, 0xc7, 0x05, 0x76, 0xe3, 0xd8, 0x4a, + 0x8d, 0xfc, 0x34, 0x17, 0xa3, 0xc6, 0x21, 0x28, 0xbe, 0x30, 0x45, + 0x31, 0x1e, 0xc7, 0x78, 0xbe, 0x58, 0x61, 0x38, 0xac, 0x3b, 0xe2, + 0x01, 0x65, 0x30, 0x82, 0x03, 0xe6, 0x30, 0x82, 0x02, 0xce, 0xa0, + 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x57, 0xcb, 0x33, 0x6f, 0xc2, + 0x5c, 0x16, 0xe6, 0x47, 0x16, 0x17, 0xe3, 0x90, 0x31, 0x68, 0xe0, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x05, 0x05, 0x00, 0x30, 0x62, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x21, 0x30, + 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x53, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x4c, 0x2e, 0x4c, 0x2e, 0x43, 0x2e, 0x31, + 0x30, 0x30, 0x2e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x27, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x53, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, + 0x31, 0x32, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, + 0x17, 0x0d, 0x32, 0x39, 0x31, 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, + 0x39, 0x35, 0x39, 0x5a, 0x30, 0x62, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x21, 0x30, + 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x53, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x4c, 0x2e, 0x4c, 0x2e, 0x43, 0x2e, 0x31, + 0x30, 0x30, 0x2e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x27, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x53, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, - 0x02, 0x82, 0x01, 0x01, 0x00, 0xb2, 0x1f, 0xd1, 0xd0, 0x62, 0xc5, - 0x33, 0x3b, 0xc0, 0x04, 0x86, 0x88, 0xb3, 0xdc, 0xf8, 0x88, 0xf7, - 0xfd, 0xdf, 0x43, 0xdf, 0x7a, 0x8d, 0x9a, 0x49, 0x5c, 0xf6, 0x4e, - 0xaa, 0xcc, 0x1c, 0xb9, 0xa1, 0xeb, 0x27, 0x89, 0xf2, 0x46, 0xe9, - 0x3b, 0x4a, 0x71, 0xd5, 0x1d, 0x8e, 0x2d, 0xcf, 0xe6, 0xad, 0xab, - 0x63, 0x50, 0xc7, 0x54, 0x0b, 0x6e, 0x12, 0xc9, 0x90, 0x36, 0xc6, - 0xd8, 0x2f, 0xda, 0x91, 0xaa, 0x68, 0xc5, 0x72, 0xfe, 0x17, 0x0a, - 0xb2, 0x17, 0x7e, 0x79, 0xb5, 0x32, 0x88, 0x70, 0xca, 0x70, 0xc0, - 0x96, 0x4a, 0x8e, 0xe4, 0x55, 0xcd, 0x1d, 0x27, 0x94, 0xbf, 0xce, - 0x72, 0x2a, 0xec, 0x5c, 0xf9, 0x73, 0x20, 0xfe, 0xbd, 0xf7, 0x2e, - 0x89, 0x67, 0xb8, 0xbb, 0x47, 0x73, 0x12, 0xf7, 0xd1, 0x35, 0x69, - 0x3a, 0xf2, 0x0a, 0xb9, 0xae, 0xff, 0x46, 0x42, 0x46, 0xa2, 0xbf, - 0xa1, 0x85, 0x1a, 0xf9, 0xbf, 0xe4, 0xff, 0x49, 0x85, 0xf7, 0xa3, - 0x70, 0x86, 0x32, 0x1c, 0x5d, 0x9f, 0x60, 0xf7, 0xa9, 0xad, 0xa5, - 0xff, 0xcf, 0xd1, 0x34, 0xf9, 0x7d, 0x5b, 0x17, 0xc6, 0xdc, 0xd6, - 0x0e, 0x28, 0x6b, 0xc2, 0xdd, 0xf1, 0xf5, 0x33, 0x68, 0x9d, 0x4e, - 0xfc, 0x87, 0x7c, 0x36, 0x12, 0xd6, 0xa3, 0x80, 0xe8, 0x43, 0x0d, - 0x55, 0x61, 0x94, 0xea, 0x64, 0x37, 0x47, 0xea, 0x77, 0xca, 0xd0, - 0xb2, 0x58, 0x05, 0xc3, 0x5d, 0x7e, 0xb1, 0xa8, 0x46, 0x90, 0x31, - 0x56, 0xce, 0x70, 0x2a, 0x96, 0xb2, 0x30, 0xb8, 0x77, 0xe6, 0x79, - 0xc0, 0xbd, 0x29, 0x3b, 0xfd, 0x94, 0x77, 0x4c, 0xbd, 0x20, 0xcd, - 0x41, 0x25, 0xe0, 0x2e, 0xc7, 0x1b, 0xbb, 0xee, 0xa4, 0x04, 0x41, - 0xd2, 0x5d, 0xad, 0x12, 0x6a, 0x8a, 0x9b, 0x47, 0xfb, 0xc9, 0xdd, - 0x46, 0x40, 0xe1, 0x9d, 0x3c, 0x33, 0xd0, 0xb5, 0x02, 0x03, 0x01, - 0x00, 0x01, 0xa3, 0x77, 0x30, 0x75, 0x30, 0x0f, 0x06, 0x03, 0x55, - 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, - 0xff, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, - 0x02, 0x01, 0x46, 0x30, 0x15, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, - 0x0e, 0x30, 0x0c, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x81, 0x7a, 0x01, - 0x79, 0x01, 0x01, 0x01, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, - 0x04, 0x16, 0x04, 0x14, 0xa3, 0x05, 0x2f, 0x18, 0x60, 0x50, 0xc2, - 0x89, 0x0a, 0xdd, 0x2b, 0x21, 0x4f, 0xff, 0x8e, 0x4e, 0xa8, 0x30, - 0x31, 0x36, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, - 0x30, 0x16, 0x80, 0x14, 0xa3, 0x05, 0x2f, 0x18, 0x60, 0x50, 0xc2, - 0x89, 0x0a, 0xdd, 0x2b, 0x21, 0x4f, 0xff, 0x8e, 0x4e, 0xa8, 0x30, - 0x31, 0x36, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x02, 0x82, 0x01, 0x01, 0x00, 0xe4, 0xbc, 0x7e, 0x92, 0x30, 0x6d, + 0xc6, 0xd8, 0x8e, 0x2b, 0x0b, 0xbc, 0x46, 0xce, 0xe0, 0x27, 0x96, + 0xde, 0xde, 0xf9, 0xfa, 0x12, 0xd3, 0x3c, 0x33, 0x73, 0xb3, 0x04, + 0x2f, 0xbc, 0x71, 0x8c, 0xe5, 0x9f, 0xb6, 0x22, 0x60, 0x3e, 0x5f, + 0x5d, 0xce, 0x09, 0xff, 0x82, 0x0c, 0x1b, 0x9a, 0x51, 0x50, 0x1a, + 0x26, 0x89, 0xdd, 0xd5, 0x61, 0x5d, 0x19, 0xdc, 0x12, 0x0f, 0x2d, + 0x0a, 0xa2, 0x43, 0x5d, 0x17, 0xd0, 0x34, 0x92, 0x20, 0xea, 0x73, + 0xcf, 0x38, 0x2c, 0x06, 0x26, 0x09, 0x7a, 0x72, 0xf7, 0xfa, 0x50, + 0x32, 0xf8, 0xc2, 0x93, 0xd3, 0x69, 0xa2, 0x23, 0xce, 0x41, 0xb1, + 0xcc, 0xe4, 0xd5, 0x1f, 0x36, 0xd1, 0x8a, 0x3a, 0xf8, 0x8c, 0x63, + 0xe2, 0x14, 0x59, 0x69, 0xed, 0x0d, 0xd3, 0x7f, 0x6b, 0xe8, 0xb8, + 0x03, 0xe5, 0x4f, 0x6a, 0xe5, 0x98, 0x63, 0x69, 0x48, 0x05, 0xbe, + 0x2e, 0xff, 0x33, 0xb6, 0xe9, 0x97, 0x59, 0x69, 0xf8, 0x67, 0x19, + 0xae, 0x93, 0x61, 0x96, 0x44, 0x15, 0xd3, 0x72, 0xb0, 0x3f, 0xbc, + 0x6a, 0x7d, 0xec, 0x48, 0x7f, 0x8d, 0xc3, 0xab, 0xaa, 0x71, 0x2b, + 0x53, 0x69, 0x41, 0x53, 0x34, 0xb5, 0xb0, 0xb9, 0xc5, 0x06, 0x0a, + 0xc4, 0xb0, 0x45, 0xf5, 0x41, 0x5d, 0x6e, 0x89, 0x45, 0x7b, 0x3d, + 0x3b, 0x26, 0x8c, 0x74, 0xc2, 0xe5, 0xd2, 0xd1, 0x7d, 0xb2, 0x11, + 0xd4, 0xfb, 0x58, 0x32, 0x22, 0x9a, 0x80, 0xc9, 0xdc, 0xfd, 0x0c, + 0xe9, 0x7f, 0x5e, 0x03, 0x97, 0xce, 0x3b, 0x00, 0x14, 0x87, 0x27, + 0x70, 0x38, 0xa9, 0x8e, 0x6e, 0xb3, 0x27, 0x76, 0x98, 0x51, 0xe0, + 0x05, 0xe3, 0x21, 0xab, 0x1a, 0xd5, 0x85, 0x22, 0x3c, 0x29, 0xb5, + 0x9a, 0x16, 0xc5, 0x80, 0xa8, 0xf4, 0xbb, 0x6b, 0x30, 0x8f, 0x2f, + 0x46, 0x02, 0xa2, 0xb1, 0x0c, 0x22, 0xe0, 0xd3, 0x02, 0x03, 0x01, + 0x00, 0x01, 0xa3, 0x81, 0x97, 0x30, 0x81, 0x94, 0x30, 0x1d, 0x06, + 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x21, 0x30, 0xc9, + 0xfb, 0x00, 0xd7, 0x4e, 0x98, 0xda, 0x87, 0xaa, 0x2a, 0xd0, 0xa7, + 0x2e, 0xb1, 0x40, 0x31, 0xa7, 0x4c, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, + 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x52, 0x06, 0x03, 0x55, + 0x1d, 0x1f, 0x04, 0x4b, 0x30, 0x49, 0x30, 0x47, 0xa0, 0x45, 0xa0, + 0x43, 0x86, 0x41, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, + 0x72, 0x6c, 0x2e, 0x6e, 0x65, 0x74, 0x73, 0x6f, 0x6c, 0x73, 0x73, + 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x53, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x2e, 0x63, + 0x72, 0x6c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, - 0x05, 0xdc, 0x26, 0xd8, 0xfa, 0x77, 0x15, 0x44, 0x68, 0xfc, 0x2f, - 0x66, 0x3a, 0x74, 0xe0, 0x5d, 0xe4, 0x29, 0xff, 0x06, 0x07, 0x13, - 0x84, 0x4a, 0xab, 0xcf, 0x6d, 0xa0, 0x1f, 0x51, 0x94, 0xf8, 0x49, - 0xcb, 0x74, 0x36, 0x14, 0xbc, 0x15, 0xdd, 0xdb, 0x89, 0x2f, 0xdd, - 0x8f, 0xa0, 0x5d, 0x7c, 0xf5, 0x12, 0xeb, 0x9f, 0x9e, 0x38, 0xa4, - 0x47, 0xcc, 0xb3, 0x96, 0xd9, 0xbe, 0x9c, 0x25, 0xab, 0x03, 0x7e, - 0x33, 0x0f, 0x95, 0x81, 0x0d, 0xfd, 0x16, 0xe0, 0x88, 0xbe, 0x37, - 0xf0, 0x6c, 0x5d, 0xd0, 0x31, 0x9b, 0x32, 0x2b, 0x5d, 0x17, 0x65, - 0x93, 0x98, 0x60, 0xbc, 0x6e, 0x8f, 0xb1, 0xa8, 0x3c, 0x1e, 0xd9, - 0x1c, 0xf3, 0xa9, 0x26, 0x42, 0xf9, 0x64, 0x1d, 0xc2, 0xe7, 0x92, - 0xf6, 0xf4, 0x1e, 0x5a, 0xaa, 0x19, 0x52, 0x5d, 0xaf, 0xe8, 0xa2, - 0xf7, 0x60, 0xa0, 0xf6, 0x8d, 0xf0, 0x89, 0xf5, 0x6e, 0xe0, 0x0a, - 0x05, 0x01, 0x95, 0xc9, 0x8b, 0x20, 0x0a, 0xba, 0x5a, 0xfc, 0x9a, - 0x2c, 0x3c, 0xbd, 0xc3, 0xb7, 0xc9, 0x5d, 0x78, 0x25, 0x05, 0x3f, - 0x56, 0x14, 0x9b, 0x0c, 0xda, 0xfb, 0x3a, 0x48, 0xfe, 0x97, 0x69, - 0x5e, 0xca, 0x10, 0x86, 0xf7, 0x4e, 0x96, 0x04, 0x08, 0x4d, 0xec, - 0xb0, 0xbe, 0x5d, 0xdc, 0x3b, 0x8e, 0x4f, 0xc1, 0xfd, 0x9a, 0x36, - 0x34, 0x9a, 0x4c, 0x54, 0x7e, 0x17, 0x03, 0x48, 0x95, 0x08, 0x11, - 0x1c, 0x07, 0x6f, 0x85, 0x08, 0x7e, 0x5d, 0x4d, 0xc4, 0x9d, 0xdb, - 0xfb, 0xae, 0xce, 0xb2, 0xd1, 0xb3, 0xb8, 0x83, 0x6c, 0x1d, 0xb2, - 0xb3, 0x79, 0xf1, 0xd8, 0x70, 0x99, 0x7e, 0xf0, 0x13, 0x02, 0xce, - 0x5e, 0xdd, 0x51, 0xd3, 0xdf, 0x36, 0x81, 0xa1, 0x1b, 0x78, 0x2f, - 0x71, 0xb3, 0xf1, 0x59, 0x4c, 0x46, 0x18, 0x28, 0xab, 0x85, 0xd2, - 0x60, 0x56, 0x5a, 0x30, 0x82, 0x03, 0x7d, 0x30, 0x82, 0x02, 0x65, - 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, + 0xbb, 0xae, 0x4b, 0xe7, 0xb7, 0x57, 0xeb, 0x7f, 0xaa, 0x2d, 0xb7, + 0x73, 0x47, 0x85, 0x6a, 0xc1, 0xe4, 0xa5, 0x1d, 0xe4, 0xe7, 0x3c, + 0xe9, 0xf4, 0x59, 0x65, 0x77, 0xb5, 0x7a, 0x5b, 0x5a, 0x8d, 0x25, + 0x36, 0xe0, 0x7a, 0x97, 0x2e, 0x38, 0xc0, 0x57, 0x60, 0x83, 0x98, + 0x06, 0x83, 0x9f, 0xb9, 0x76, 0x7a, 0x6e, 0x50, 0xe0, 0xba, 0x88, + 0x2c, 0xfc, 0x45, 0xcc, 0x18, 0xb0, 0x99, 0x95, 0x51, 0x0e, 0xec, + 0x1d, 0xb8, 0x88, 0xff, 0x87, 0x50, 0x1c, 0x82, 0xc2, 0xe3, 0xe0, + 0x32, 0x80, 0xbf, 0xa0, 0x0b, 0x47, 0xc8, 0xc3, 0x31, 0xef, 0x99, + 0x67, 0x32, 0x80, 0x4f, 0x17, 0x21, 0x79, 0x0c, 0x69, 0x5c, 0xde, + 0x5e, 0x34, 0xae, 0x02, 0xb5, 0x26, 0xea, 0x50, 0xdf, 0x7f, 0x18, + 0x65, 0x2c, 0xc9, 0xf2, 0x63, 0xe1, 0xa9, 0x07, 0xfe, 0x7c, 0x71, + 0x1f, 0x6b, 0x33, 0x24, 0x6a, 0x1e, 0x05, 0xf7, 0x05, 0x68, 0xc0, + 0x6a, 0x12, 0xcb, 0x2e, 0x5e, 0x61, 0xcb, 0xae, 0x28, 0xd3, 0x7e, + 0xc2, 0xb4, 0x66, 0x91, 0x26, 0x5f, 0x3c, 0x2e, 0x24, 0x5f, 0xcb, + 0x58, 0x0f, 0xeb, 0x28, 0xec, 0xaf, 0x11, 0x96, 0xf3, 0xdc, 0x7b, + 0x6f, 0xc0, 0xa7, 0x88, 0xf2, 0x53, 0x77, 0xb3, 0x60, 0x5e, 0xae, + 0xae, 0x28, 0xda, 0x35, 0x2c, 0x6f, 0x34, 0x45, 0xd3, 0x26, 0xe1, + 0xde, 0xec, 0x5b, 0x4f, 0x27, 0x6b, 0x16, 0x7c, 0xbd, 0x44, 0x04, + 0x18, 0x82, 0xb3, 0x89, 0x79, 0x17, 0x10, 0x71, 0x3d, 0x7a, 0xa2, + 0x16, 0x4e, 0xf5, 0x01, 0xcd, 0xa4, 0x6c, 0x65, 0x68, 0xa1, 0x49, + 0x76, 0x5c, 0x43, 0xc9, 0xd8, 0xbc, 0x36, 0x67, 0x6c, 0xa5, 0x94, + 0xb5, 0xd4, 0xcc, 0xb9, 0xbd, 0x6a, 0x35, 0x56, 0x21, 0xde, 0xd8, + 0xc3, 0xeb, 0xfb, 0xcb, 0xa4, 0x60, 0x4c, 0xb0, 0x55, 0xa0, 0xa0, + 0x7b, 0x57, 0xb2, 0x30, 0x82, 0x04, 0xbd, 0x30, 0x82, 0x03, 0xa5, + 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, - 0x00, 0x30, 0x60, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x45, 0x43, 0x4f, 0x4d, 0x20, - 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, - 0x6d, 0x73, 0x20, 0x43, 0x4f, 0x2e, 0x2c, 0x4c, 0x54, 0x44, 0x2e, - 0x31, 0x2a, 0x30, 0x28, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x21, - 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x43, 0x6f, - 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x45, 0x56, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x31, - 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x37, 0x30, 0x36, 0x30, 0x36, 0x30, - 0x32, 0x31, 0x32, 0x33, 0x32, 0x5a, 0x17, 0x0d, 0x33, 0x37, 0x30, - 0x36, 0x30, 0x36, 0x30, 0x32, 0x31, 0x32, 0x33, 0x32, 0x5a, 0x30, - 0x60, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, - 0x02, 0x4a, 0x50, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x1c, 0x53, 0x45, 0x43, 0x4f, 0x4d, 0x20, 0x54, 0x72, - 0x75, 0x73, 0x74, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, - 0x20, 0x43, 0x4f, 0x2e, 0x2c, 0x4c, 0x54, 0x44, 0x2e, 0x31, 0x2a, - 0x30, 0x28, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x21, 0x53, 0x65, - 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x43, 0x6f, 0x6d, 0x6d, - 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x45, - 0x56, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x31, 0x30, 0x82, - 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, - 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbc, 0x7f, - 0xec, 0x57, 0x9b, 0x24, 0xe0, 0xfe, 0x9c, 0xba, 0x42, 0x79, 0xa9, - 0x88, 0x8a, 0xfa, 0x80, 0xe0, 0xf5, 0x07, 0x29, 0x43, 0xea, 0x8e, - 0x0a, 0x34, 0x36, 0x8d, 0x1c, 0xfa, 0xa7, 0xb5, 0x39, 0x78, 0xff, - 0x97, 0x75, 0xf7, 0x2f, 0xe4, 0xaa, 0x6b, 0x04, 0x84, 0x44, 0xca, - 0xa6, 0xe2, 0x68, 0x8e, 0xfd, 0x55, 0x50, 0x62, 0x0f, 0xa4, 0x71, - 0x0e, 0xce, 0x07, 0x38, 0x2d, 0x42, 0x85, 0x50, 0xad, 0x3c, 0x96, - 0x6f, 0x8b, 0xd5, 0xa2, 0x0e, 0xcf, 0xde, 0x49, 0x89, 0x3d, 0xd6, - 0x64, 0x2e, 0x38, 0xe5, 0x1e, 0x6c, 0xb5, 0x57, 0x8a, 0x9e, 0xef, - 0x48, 0x0e, 0xcd, 0x7a, 0x69, 0x16, 0x87, 0x44, 0xb5, 0x90, 0xe4, - 0x06, 0x9d, 0xae, 0xa1, 0x04, 0x97, 0x58, 0x79, 0xef, 0x20, 0x4a, - 0x82, 0x6b, 0x8c, 0x22, 0xbf, 0xec, 0x1f, 0x0f, 0xe9, 0x84, 0x71, - 0xed, 0xf1, 0x0e, 0xe4, 0xb8, 0x18, 0x13, 0xcc, 0x56, 0x36, 0x5d, - 0xd1, 0x9a, 0x1e, 0x51, 0x6b, 0x39, 0x6e, 0x60, 0x76, 0x88, 0x34, - 0x0b, 0xf3, 0xb3, 0xd1, 0xb0, 0x9d, 0xca, 0x61, 0xe2, 0x64, 0x1d, - 0xc1, 0x46, 0x07, 0xb8, 0x63, 0xdd, 0x1e, 0x33, 0x65, 0xb3, 0x8e, - 0x09, 0x55, 0x52, 0x3d, 0xb5, 0xbd, 0xff, 0x07, 0xeb, 0xad, 0x61, - 0x55, 0x18, 0x2c, 0xa9, 0x69, 0x98, 0x4a, 0xaa, 0x40, 0xc5, 0x33, - 0x14, 0x65, 0x74, 0x00, 0xf9, 0x91, 0xde, 0xaf, 0x03, 0x48, 0xc5, - 0x40, 0x54, 0xdc, 0x0f, 0x84, 0x90, 0x68, 0x20, 0xc5, 0x92, 0x96, - 0xdc, 0x2e, 0xe5, 0x02, 0x45, 0xaa, 0xc0, 0x5f, 0x54, 0xf8, 0x6d, - 0xea, 0x49, 0xcf, 0x5d, 0x6c, 0x4b, 0xaf, 0xef, 0x9a, 0xc2, 0x56, - 0x5c, 0xc6, 0x35, 0x56, 0x42, 0x6a, 0x30, 0x5f, 0xc2, 0xab, 0xf6, - 0xe2, 0x3d, 0x3f, 0xb3, 0xc9, 0x11, 0x8f, 0x31, 0x4c, 0xd7, 0x9f, - 0x49, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, - 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x35, - 0x4a, 0xf5, 0x4d, 0xaf, 0x3f, 0xd7, 0x82, 0x38, 0xac, 0xab, 0x71, - 0x65, 0x17, 0x75, 0x8c, 0x9d, 0x55, 0x93, 0xe6, 0x30, 0x0e, 0x06, - 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, - 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, - 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, - 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xa8, 0x87, 0xe9, 0xec, 0xf8, - 0x40, 0x67, 0x5d, 0xc3, 0xc1, 0x66, 0xc7, 0x40, 0x4b, 0x97, 0xfc, - 0x87, 0x13, 0x90, 0x5a, 0xc4, 0xef, 0xa0, 0xca, 0x5f, 0x8b, 0xb7, - 0xa7, 0xb7, 0xf1, 0xd6, 0xb5, 0x64, 0xb7, 0x8a, 0xb3, 0xb8, 0x1b, - 0xcc, 0xda, 0xfb, 0xac, 0x66, 0x88, 0x41, 0xce, 0xe8, 0xfc, 0xe4, - 0xdb, 0x1e, 0x88, 0xa6, 0xed, 0x27, 0x50, 0x1b, 0x02, 0x30, 0x24, - 0x46, 0x79, 0xfe, 0x04, 0x87, 0x70, 0x97, 0x40, 0x73, 0xd1, 0xc0, - 0xc1, 0x57, 0x19, 0x9a, 0x69, 0xa5, 0x27, 0x99, 0xab, 0x9d, 0x62, - 0x84, 0xf6, 0x51, 0xc1, 0x2c, 0xc9, 0x23, 0x15, 0xd8, 0x28, 0xb7, - 0xab, 0x25, 0x13, 0xb5, 0x46, 0xe1, 0x86, 0x02, 0xff, 0x26, 0x8c, - 0xc4, 0x88, 0x92, 0x1d, 0x56, 0xfe, 0x19, 0x67, 0xf2, 0x55, 0xe4, - 0x80, 0xa3, 0x6b, 0x9c, 0xab, 0x77, 0xe1, 0x51, 0x71, 0x0d, 0x20, - 0xdb, 0x10, 0x9a, 0xdb, 0xbd, 0x76, 0x79, 0x07, 0x77, 0x99, 0x28, - 0xad, 0x9a, 0x5e, 0xda, 0xb1, 0x4f, 0x44, 0x2c, 0x35, 0x8e, 0xa5, - 0x96, 0xc7, 0xfd, 0x83, 0xf0, 0x58, 0xc6, 0x79, 0xd6, 0x98, 0x7c, - 0xa8, 0x8d, 0xfe, 0x86, 0x3e, 0x07, 0x16, 0x92, 0xe1, 0x7b, 0xe7, - 0x1d, 0xec, 0x33, 0x76, 0x7e, 0x42, 0x2e, 0x4a, 0x85, 0xf9, 0x91, - 0x89, 0x68, 0x84, 0x03, 0x81, 0xa5, 0x9b, 0x9a, 0xbe, 0xe3, 0x37, - 0xc5, 0x54, 0xab, 0x56, 0x3b, 0x18, 0x2d, 0x41, 0xa4, 0x0c, 0xf8, - 0x42, 0xdb, 0x99, 0xa0, 0xe0, 0x72, 0x6f, 0xbb, 0x5d, 0xe1, 0x16, - 0x4f, 0x53, 0x0a, 0x64, 0xf9, 0x4e, 0xf4, 0xbf, 0x4e, 0x54, 0xbd, - 0x78, 0x6c, 0x88, 0xea, 0xbf, 0x9c, 0x13, 0x24, 0xc2, 0x70, 0x69, - 0xa2, 0x7f, 0x0f, 0xc8, 0x3c, 0xad, 0x08, 0xc9, 0xb0, 0x98, 0x40, - 0xa3, 0x2a, 0xe7, 0x88, 0x83, 0xed, 0x77, 0x8f, 0x74, 0x30, 0x82, - 0x03, 0xf1, 0x30, 0x82, 0x02, 0xd9, 0xa0, 0x03, 0x02, 0x01, 0x02, - 0x02, 0x10, 0x41, 0x3d, 0x72, 0xc7, 0xf4, 0x6b, 0x1f, 0x81, 0x43, - 0x7d, 0xf1, 0xd2, 0x28, 0x54, 0xdf, 0x9a, 0x30, 0x0d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, - 0x30, 0x81, 0x8a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x43, 0x48, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x07, 0x57, 0x49, 0x53, 0x65, 0x4b, 0x65, - 0x79, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, - 0x12, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, - 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x35, 0x31, 0x22, 0x30, - 0x20, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x19, 0x4f, 0x49, 0x53, - 0x54, 0x45, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x45, 0x6e, 0x64, 0x6f, 0x72, 0x73, 0x65, 0x64, - 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1f, - 0x4f, 0x49, 0x53, 0x54, 0x45, 0x20, 0x57, 0x49, 0x53, 0x65, 0x4b, - 0x65, 0x79, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, - 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x41, 0x20, 0x43, 0x41, 0x30, 0x1e, - 0x17, 0x0d, 0x30, 0x35, 0x31, 0x32, 0x31, 0x31, 0x31, 0x36, 0x30, - 0x33, 0x34, 0x34, 0x5a, 0x17, 0x0d, 0x33, 0x37, 0x31, 0x32, 0x31, - 0x31, 0x31, 0x36, 0x30, 0x39, 0x35, 0x31, 0x5a, 0x30, 0x81, 0x8a, + 0x00, 0x30, 0x81, 0x85, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x20, 0x30, 0x1e, 0x06, + 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x17, 0x57, 0x65, 0x6c, 0x6c, 0x73, + 0x20, 0x46, 0x61, 0x72, 0x67, 0x6f, 0x20, 0x57, 0x65, 0x6c, 0x6c, + 0x73, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x31, 0x1c, 0x30, 0x1a, + 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x13, 0x57, 0x65, 0x6c, 0x6c, + 0x73, 0x20, 0x46, 0x61, 0x72, 0x67, 0x6f, 0x20, 0x42, 0x61, 0x6e, + 0x6b, 0x20, 0x4e, 0x41, 0x31, 0x36, 0x30, 0x34, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x0c, 0x2d, 0x57, 0x65, 0x6c, 0x6c, 0x73, 0x53, 0x65, + 0x63, 0x75, 0x72, 0x65, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x37, + 0x31, 0x32, 0x31, 0x33, 0x31, 0x37, 0x30, 0x37, 0x35, 0x34, 0x5a, + 0x17, 0x0d, 0x32, 0x32, 0x31, 0x32, 0x31, 0x34, 0x30, 0x30, 0x30, + 0x37, 0x35, 0x34, 0x5a, 0x30, 0x81, 0x85, 0x31, 0x0b, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x20, + 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x17, 0x57, 0x65, + 0x6c, 0x6c, 0x73, 0x20, 0x46, 0x61, 0x72, 0x67, 0x6f, 0x20, 0x57, + 0x65, 0x6c, 0x6c, 0x73, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x31, + 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x13, 0x57, + 0x65, 0x6c, 0x6c, 0x73, 0x20, 0x46, 0x61, 0x72, 0x67, 0x6f, 0x20, + 0x42, 0x61, 0x6e, 0x6b, 0x20, 0x4e, 0x41, 0x31, 0x36, 0x30, 0x34, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2d, 0x57, 0x65, 0x6c, 0x6c, + 0x73, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, + 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, + 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xee, 0x6f, 0xb4, + 0xbd, 0x79, 0xe2, 0x8f, 0x08, 0x21, 0x9e, 0x38, 0x04, 0x41, 0x25, + 0xef, 0xab, 0x5b, 0x1c, 0x53, 0x92, 0xac, 0x6d, 0x9e, 0xdd, 0xc2, + 0xc4, 0x2e, 0x45, 0x94, 0x03, 0x35, 0x88, 0x67, 0x74, 0x57, 0xe3, + 0xdf, 0x8c, 0xb8, 0xa7, 0x76, 0x8f, 0x3b, 0xf7, 0xa8, 0xc4, 0xdb, + 0x29, 0x63, 0x0e, 0x91, 0x68, 0x36, 0x8a, 0x97, 0x8e, 0x8a, 0x71, + 0x68, 0x09, 0x07, 0xe4, 0xe8, 0xd4, 0x0e, 0x4f, 0xf8, 0xd6, 0x2b, + 0x4c, 0xa4, 0x16, 0xf9, 0xef, 0x43, 0x98, 0x8f, 0xb3, 0x9e, 0x52, + 0xdf, 0x6d, 0x91, 0x39, 0x8f, 0x38, 0xbd, 0x77, 0x8b, 0x43, 0x63, + 0xeb, 0xb7, 0x93, 0xfc, 0x30, 0x4c, 0x1c, 0x01, 0x93, 0xb6, 0x13, + 0xfb, 0xf7, 0xa1, 0x1f, 0xbf, 0x25, 0xe1, 0x74, 0x37, 0x2c, 0x1e, + 0xa4, 0x5e, 0x3c, 0x68, 0xf8, 0x4b, 0xbf, 0x0d, 0xb9, 0x1e, 0x2e, + 0x36, 0xe8, 0xa9, 0xe4, 0xa7, 0xf8, 0x0f, 0xcb, 0x82, 0x75, 0x7c, + 0x35, 0x2d, 0x22, 0xd6, 0xc2, 0xbf, 0x0b, 0xf3, 0xb4, 0xfc, 0x6c, + 0x95, 0x61, 0x1e, 0x57, 0xd7, 0x04, 0x81, 0x32, 0x83, 0x52, 0x79, + 0xe6, 0x83, 0x63, 0xcf, 0xb7, 0xcb, 0x63, 0x8b, 0x11, 0xe2, 0xbd, + 0x5e, 0xeb, 0xf6, 0x8d, 0xed, 0x95, 0x72, 0x28, 0xb4, 0xac, 0x12, + 0x62, 0xe9, 0x4a, 0x33, 0xe6, 0x83, 0x32, 0xae, 0x05, 0x75, 0x95, + 0xbd, 0x84, 0x95, 0xdb, 0x2a, 0x5c, 0x9b, 0x8e, 0x2e, 0x0c, 0xb8, + 0x81, 0x2b, 0x41, 0xe6, 0x38, 0x56, 0x9f, 0x49, 0x9b, 0x6c, 0x76, + 0xfa, 0x8a, 0x5d, 0xf7, 0x01, 0x79, 0x81, 0x7c, 0xc1, 0x83, 0x40, + 0x05, 0xfe, 0x71, 0xfd, 0x0c, 0x3f, 0xcc, 0x4e, 0x60, 0x09, 0x0e, + 0x65, 0x47, 0x10, 0x2f, 0x01, 0xc0, 0x05, 0x3f, 0x8f, 0xf8, 0xb3, + 0x41, 0xef, 0x5a, 0x42, 0x7e, 0x59, 0xef, 0xd2, 0x97, 0x0c, 0x65, + 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x34, 0x30, 0x82, + 0x01, 0x30, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, + 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x39, 0x06, + 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x32, 0x30, 0x30, 0x30, 0x2e, 0xa0, + 0x2c, 0xa0, 0x2a, 0x86, 0x28, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x70, 0x6b, 0x69, 0x2e, 0x77, 0x65, + 0x6c, 0x6c, 0x73, 0x66, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x77, 0x73, 0x70, 0x72, 0x63, 0x61, 0x2e, 0x63, 0x72, + 0x6c, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, + 0x04, 0x04, 0x03, 0x02, 0x01, 0xc6, 0x30, 0x1d, 0x06, 0x03, 0x55, + 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x26, 0x95, 0x19, 0x10, 0xd9, + 0xe8, 0xa1, 0x97, 0x91, 0xff, 0xdc, 0x19, 0xd9, 0xb5, 0x04, 0x3e, + 0xd2, 0x73, 0x0a, 0x6a, 0x30, 0x81, 0xb2, 0x06, 0x03, 0x55, 0x1d, + 0x23, 0x04, 0x81, 0xaa, 0x30, 0x81, 0xa7, 0x80, 0x14, 0x26, 0x95, + 0x19, 0x10, 0xd9, 0xe8, 0xa1, 0x97, 0x91, 0xff, 0xdc, 0x19, 0xd9, + 0xb5, 0x04, 0x3e, 0xd2, 0x73, 0x0a, 0x6a, 0xa1, 0x81, 0x8b, 0xa4, + 0x81, 0x88, 0x30, 0x81, 0x85, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x20, 0x30, 0x1e, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x17, 0x57, 0x65, 0x6c, 0x6c, + 0x73, 0x20, 0x46, 0x61, 0x72, 0x67, 0x6f, 0x20, 0x57, 0x65, 0x6c, + 0x6c, 0x73, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x31, 0x1c, 0x30, + 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x13, 0x57, 0x65, 0x6c, + 0x6c, 0x73, 0x20, 0x46, 0x61, 0x72, 0x67, 0x6f, 0x20, 0x42, 0x61, + 0x6e, 0x6b, 0x20, 0x4e, 0x41, 0x31, 0x36, 0x30, 0x34, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x0c, 0x2d, 0x57, 0x65, 0x6c, 0x6c, 0x73, 0x53, + 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x82, 0x01, 0x01, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xb9, 0x15, 0xb1, 0x44, + 0x91, 0xcc, 0x23, 0xc8, 0x2b, 0x4d, 0x77, 0xe3, 0xf8, 0x9a, 0x7b, + 0x27, 0x0d, 0xcd, 0x72, 0xbb, 0x99, 0x00, 0xca, 0x7c, 0x66, 0x19, + 0x50, 0xc6, 0xd5, 0x98, 0xed, 0xab, 0xbf, 0x03, 0x5a, 0xe5, 0x4d, + 0xe5, 0x1e, 0xc8, 0x4f, 0x71, 0x97, 0x86, 0xd5, 0xe3, 0x1d, 0xfd, + 0x90, 0xc9, 0x3c, 0x75, 0x77, 0x57, 0x7a, 0x7d, 0xf8, 0xde, 0xf4, + 0xd4, 0xd5, 0xf7, 0x95, 0xe6, 0x74, 0x6e, 0x1d, 0x3c, 0xae, 0x7c, + 0x9d, 0xdb, 0x02, 0x03, 0x05, 0x2c, 0x71, 0x4b, 0x25, 0x3e, 0x07, + 0xe3, 0x5e, 0x9a, 0xf5, 0x66, 0x17, 0x29, 0x88, 0x1a, 0x38, 0x9f, + 0xcf, 0xaa, 0x41, 0x03, 0x84, 0x97, 0x6b, 0x93, 0x38, 0x7a, 0xca, + 0x30, 0x44, 0x1b, 0x24, 0x44, 0x33, 0xd0, 0xe4, 0xd1, 0xdc, 0x28, + 0x38, 0xf4, 0x13, 0x43, 0x35, 0x35, 0x29, 0x63, 0xa8, 0x7c, 0xa2, + 0xb5, 0xad, 0x38, 0xa4, 0xed, 0xad, 0xfd, 0xc6, 0x9a, 0x1f, 0xff, + 0x97, 0x73, 0xfe, 0xfb, 0xb3, 0x35, 0xa7, 0x93, 0x86, 0xc6, 0x76, + 0x91, 0x00, 0xe6, 0xac, 0x51, 0x16, 0xc4, 0x27, 0x32, 0x5c, 0xdb, + 0x73, 0xda, 0xa5, 0x93, 0x57, 0x8e, 0x3e, 0x6d, 0x35, 0x26, 0x08, + 0x59, 0xd5, 0xe7, 0x44, 0xd7, 0x76, 0x20, 0x63, 0xe7, 0xac, 0x13, + 0x67, 0xc3, 0x6d, 0xb1, 0x70, 0x46, 0x7c, 0xd5, 0x96, 0x11, 0x3d, + 0x89, 0x6f, 0x5d, 0xa8, 0xa1, 0xeb, 0x8d, 0x0a, 0xda, 0xc3, 0x1d, + 0x33, 0x6c, 0xa3, 0xea, 0x67, 0x19, 0x9a, 0x99, 0x7f, 0x4b, 0x3d, + 0x83, 0x51, 0x2a, 0x1d, 0xca, 0x2f, 0x86, 0x0c, 0xa2, 0x7e, 0x10, + 0x2d, 0x2b, 0xd4, 0x16, 0x95, 0x0b, 0x07, 0xaa, 0x2e, 0x14, 0x92, + 0x49, 0xb7, 0x29, 0x6f, 0xd8, 0x6d, 0x31, 0x7d, 0xf5, 0xfc, 0xa1, + 0x10, 0x07, 0x87, 0xce, 0x2f, 0x59, 0xdc, 0x3e, 0x58, 0xdb, 0x30, + 0x82, 0x02, 0x89, 0x30, 0x82, 0x02, 0x0f, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x10, 0x1f, 0x47, 0xaf, 0xaa, 0x62, 0x00, 0x70, 0x50, + 0x54, 0x4c, 0x01, 0x9e, 0x9b, 0x63, 0x99, 0x2a, 0x30, 0x0a, 0x06, + 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x81, + 0x85, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, + 0x08, 0x13, 0x12, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, + 0x4d, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, 0x31, + 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x53, + 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, + 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x43, 0x4f, 0x4d, 0x4f, 0x44, + 0x4f, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, + 0x64, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, + 0x22, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x45, 0x43, 0x43, + 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x30, 0x33, 0x30, + 0x36, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, + 0x38, 0x30, 0x31, 0x31, 0x38, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, + 0x5a, 0x30, 0x81, 0x85, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, + 0x03, 0x55, 0x04, 0x08, 0x13, 0x12, 0x47, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x74, + 0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, + 0x13, 0x07, 0x53, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, + 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x43, 0x4f, + 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x65, 0x64, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x22, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, + 0x45, 0x43, 0x43, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, + 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, + 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x03, 0x47, 0x7b, 0x2f, + 0x75, 0xc9, 0x82, 0x15, 0x85, 0xfb, 0x75, 0xe4, 0x91, 0x16, 0xd4, + 0xab, 0x62, 0x99, 0xf5, 0x3e, 0x52, 0x0b, 0x06, 0xce, 0x41, 0x00, + 0x7f, 0x97, 0xe1, 0x0a, 0x24, 0x3c, 0x1d, 0x01, 0x04, 0xee, 0x3d, + 0xd2, 0x8d, 0x09, 0x97, 0x0c, 0xe0, 0x75, 0xe4, 0xfa, 0xfb, 0x77, + 0x8a, 0x2a, 0xf5, 0x03, 0x60, 0x4b, 0x36, 0x8b, 0x16, 0x23, 0x16, + 0xad, 0x09, 0x71, 0xf4, 0x4a, 0xf4, 0x28, 0x50, 0xb4, 0xfe, 0x88, + 0x1c, 0x6e, 0x3f, 0x6c, 0x2f, 0x2f, 0x09, 0x59, 0x5b, 0xa5, 0x5b, + 0x0b, 0x33, 0x99, 0xe2, 0xc3, 0x3d, 0x89, 0xf9, 0x6a, 0x2c, 0xef, + 0xb2, 0xd3, 0x06, 0xe9, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, + 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x75, 0x71, 0xa7, + 0x19, 0x48, 0x19, 0xbc, 0x9d, 0x9d, 0xea, 0x41, 0x47, 0xdf, 0x94, + 0xc4, 0x48, 0x77, 0x99, 0xd3, 0x79, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, + 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0a, 0x06, 0x08, 0x2a, + 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x68, 0x00, 0x30, + 0x65, 0x02, 0x31, 0x00, 0xef, 0x03, 0x5b, 0x7a, 0xac, 0xb7, 0x78, + 0x0a, 0x72, 0xb7, 0x88, 0xdf, 0xff, 0xb5, 0x46, 0x14, 0x09, 0x0a, + 0xfa, 0xa0, 0xe6, 0x7d, 0x08, 0xc6, 0x1a, 0x87, 0xbd, 0x18, 0xa8, + 0x73, 0xbd, 0x26, 0xca, 0x60, 0x0c, 0x9d, 0xce, 0x99, 0x9f, 0xcf, + 0x5c, 0x0f, 0x30, 0xe1, 0xbe, 0x14, 0x31, 0xea, 0x02, 0x30, 0x14, + 0xf4, 0x93, 0x3c, 0x49, 0xa7, 0x33, 0x7a, 0x90, 0x46, 0x47, 0xb3, + 0x63, 0x7d, 0x13, 0x9b, 0x4e, 0xb7, 0x6f, 0x18, 0x37, 0x80, 0x53, + 0xfe, 0xdd, 0x20, 0xe0, 0x35, 0x9a, 0x36, 0xd1, 0xc7, 0x01, 0xb9, + 0xe6, 0xdc, 0xdd, 0xf3, 0xff, 0x1d, 0x2c, 0x3a, 0x16, 0x57, 0xd9, + 0x92, 0x39, 0xd6, 0x30, 0x82, 0x04, 0x02, 0x30, 0x82, 0x02, 0xea, + 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x05, 0x39, 0x11, 0x45, 0x10, + 0x94, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0x85, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x46, 0x52, 0x31, + 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x06, 0x46, + 0x72, 0x61, 0x6e, 0x63, 0x65, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, + 0x55, 0x04, 0x07, 0x13, 0x05, 0x50, 0x61, 0x72, 0x69, 0x73, 0x31, + 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x07, 0x50, + 0x4d, 0x2f, 0x53, 0x47, 0x44, 0x4e, 0x31, 0x0e, 0x30, 0x0c, 0x06, + 0x03, 0x55, 0x04, 0x0b, 0x13, 0x05, 0x44, 0x43, 0x53, 0x53, 0x49, + 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x05, + 0x49, 0x47, 0x43, 0x2f, 0x41, 0x31, 0x23, 0x30, 0x21, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x14, + 0x69, 0x67, 0x63, 0x61, 0x40, 0x73, 0x67, 0x64, 0x6e, 0x2e, 0x70, + 0x6d, 0x2e, 0x67, 0x6f, 0x75, 0x76, 0x2e, 0x66, 0x72, 0x30, 0x1e, + 0x17, 0x0d, 0x30, 0x32, 0x31, 0x32, 0x31, 0x33, 0x31, 0x34, 0x32, + 0x39, 0x32, 0x33, 0x5a, 0x17, 0x0d, 0x32, 0x30, 0x31, 0x30, 0x31, + 0x37, 0x31, 0x34, 0x32, 0x39, 0x32, 0x32, 0x5a, 0x30, 0x81, 0x85, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x43, 0x48, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x13, 0x07, 0x57, 0x49, 0x53, 0x65, 0x4b, 0x65, 0x79, 0x31, 0x1b, - 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x12, 0x43, 0x6f, - 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, - 0x20, 0x32, 0x30, 0x30, 0x35, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, - 0x55, 0x04, 0x0b, 0x13, 0x19, 0x4f, 0x49, 0x53, 0x54, 0x45, 0x20, - 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x45, 0x6e, 0x64, 0x6f, 0x72, 0x73, 0x65, 0x64, 0x31, 0x28, 0x30, - 0x26, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1f, 0x4f, 0x49, 0x53, - 0x54, 0x45, 0x20, 0x57, 0x49, 0x53, 0x65, 0x4b, 0x65, 0x79, 0x20, - 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, - 0x20, 0x47, 0x41, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, - 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xcb, 0x4f, 0xb3, 0x00, 0x9b, - 0x3d, 0x36, 0xdd, 0xf9, 0xd1, 0x49, 0x6a, 0x6b, 0x10, 0x49, 0x1f, - 0xec, 0xd8, 0x2b, 0xb2, 0xc6, 0xf8, 0x32, 0x81, 0x29, 0x43, 0x95, - 0x4c, 0x9a, 0x19, 0x23, 0x21, 0x15, 0x45, 0xde, 0xe3, 0xc8, 0x1c, - 0x51, 0x55, 0x5b, 0xae, 0x93, 0xe8, 0x37, 0xff, 0x2b, 0x6b, 0xe9, - 0xd4, 0xea, 0xbe, 0x2a, 0xdd, 0xa8, 0x51, 0x2b, 0xd7, 0x66, 0xc3, - 0x61, 0x5c, 0x60, 0x02, 0xc8, 0xf5, 0xce, 0x72, 0x7b, 0x3b, 0xb8, - 0xf2, 0x4e, 0x65, 0x08, 0x9a, 0xcd, 0xa4, 0x6a, 0x19, 0xc1, 0x01, - 0xbb, 0x73, 0xa6, 0xd7, 0xf6, 0xc3, 0xdd, 0xcd, 0xbc, 0xa4, 0x8b, - 0xb5, 0x99, 0x61, 0xb8, 0x01, 0xa2, 0xa3, 0xd4, 0x4d, 0xd4, 0x05, - 0x3d, 0x91, 0xad, 0xf8, 0xb4, 0x08, 0x71, 0x64, 0xaf, 0x70, 0xf1, - 0x1c, 0x6b, 0x7e, 0xf6, 0xc3, 0x77, 0x9d, 0x24, 0x73, 0x7b, 0xe4, - 0x0c, 0x8c, 0xe1, 0xd9, 0x36, 0xe1, 0x99, 0x8b, 0x05, 0x99, 0x0b, - 0xed, 0x45, 0x31, 0x09, 0xca, 0xc2, 0x00, 0xdb, 0xf7, 0x72, 0xa0, - 0x96, 0xaa, 0x95, 0x87, 0xd0, 0x8e, 0xc7, 0xb6, 0x61, 0x73, 0x0d, - 0x76, 0x66, 0x8c, 0xdc, 0x1b, 0xb4, 0x63, 0xa2, 0x9f, 0x7f, 0x93, - 0x13, 0x30, 0xf1, 0xa1, 0x27, 0xdb, 0xd9, 0xff, 0x2c, 0x55, 0x88, - 0x91, 0xa0, 0xe0, 0x4f, 0x07, 0xb0, 0x28, 0x56, 0x8c, 0x18, 0x1b, - 0x97, 0x44, 0x8e, 0x89, 0xdd, 0xe0, 0x17, 0x6e, 0xe7, 0x2a, 0xef, - 0x8f, 0x39, 0x0a, 0x31, 0x84, 0x82, 0xd8, 0x40, 0x14, 0x49, 0x2e, - 0x7a, 0x41, 0xe4, 0xa7, 0xfe, 0xe3, 0x64, 0xcc, 0xc1, 0x59, 0x71, - 0x4b, 0x2c, 0x21, 0xa7, 0x5b, 0x7d, 0xe0, 0x1d, 0xd1, 0x2e, 0x81, - 0x9b, 0xc3, 0xd8, 0x68, 0xf7, 0xbd, 0x96, 0x1b, 0xac, 0x70, 0xb1, - 0x16, 0x14, 0x0b, 0xdb, 0x60, 0xb9, 0x26, 0x01, 0x05, 0x02, 0x03, - 0x01, 0x00, 0x01, 0xa3, 0x51, 0x30, 0x4f, 0x30, 0x0b, 0x06, 0x03, - 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, + 0x46, 0x52, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x08, + 0x13, 0x06, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x31, 0x0e, 0x30, + 0x0c, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x05, 0x50, 0x61, 0x72, + 0x69, 0x73, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x13, 0x07, 0x50, 0x4d, 0x2f, 0x53, 0x47, 0x44, 0x4e, 0x31, 0x0e, + 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x05, 0x44, 0x43, + 0x53, 0x53, 0x49, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x05, 0x49, 0x47, 0x43, 0x2f, 0x41, 0x31, 0x23, 0x30, + 0x21, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, + 0x01, 0x16, 0x14, 0x69, 0x67, 0x63, 0x61, 0x40, 0x73, 0x67, 0x64, + 0x6e, 0x2e, 0x70, 0x6d, 0x2e, 0x67, 0x6f, 0x75, 0x76, 0x2e, 0x66, + 0x72, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, + 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, + 0x00, 0xb2, 0x1f, 0xd1, 0xd0, 0x62, 0xc5, 0x33, 0x3b, 0xc0, 0x04, + 0x86, 0x88, 0xb3, 0xdc, 0xf8, 0x88, 0xf7, 0xfd, 0xdf, 0x43, 0xdf, + 0x7a, 0x8d, 0x9a, 0x49, 0x5c, 0xf6, 0x4e, 0xaa, 0xcc, 0x1c, 0xb9, + 0xa1, 0xeb, 0x27, 0x89, 0xf2, 0x46, 0xe9, 0x3b, 0x4a, 0x71, 0xd5, + 0x1d, 0x8e, 0x2d, 0xcf, 0xe6, 0xad, 0xab, 0x63, 0x50, 0xc7, 0x54, + 0x0b, 0x6e, 0x12, 0xc9, 0x90, 0x36, 0xc6, 0xd8, 0x2f, 0xda, 0x91, + 0xaa, 0x68, 0xc5, 0x72, 0xfe, 0x17, 0x0a, 0xb2, 0x17, 0x7e, 0x79, + 0xb5, 0x32, 0x88, 0x70, 0xca, 0x70, 0xc0, 0x96, 0x4a, 0x8e, 0xe4, + 0x55, 0xcd, 0x1d, 0x27, 0x94, 0xbf, 0xce, 0x72, 0x2a, 0xec, 0x5c, + 0xf9, 0x73, 0x20, 0xfe, 0xbd, 0xf7, 0x2e, 0x89, 0x67, 0xb8, 0xbb, + 0x47, 0x73, 0x12, 0xf7, 0xd1, 0x35, 0x69, 0x3a, 0xf2, 0x0a, 0xb9, + 0xae, 0xff, 0x46, 0x42, 0x46, 0xa2, 0xbf, 0xa1, 0x85, 0x1a, 0xf9, + 0xbf, 0xe4, 0xff, 0x49, 0x85, 0xf7, 0xa3, 0x70, 0x86, 0x32, 0x1c, + 0x5d, 0x9f, 0x60, 0xf7, 0xa9, 0xad, 0xa5, 0xff, 0xcf, 0xd1, 0x34, + 0xf9, 0x7d, 0x5b, 0x17, 0xc6, 0xdc, 0xd6, 0x0e, 0x28, 0x6b, 0xc2, + 0xdd, 0xf1, 0xf5, 0x33, 0x68, 0x9d, 0x4e, 0xfc, 0x87, 0x7c, 0x36, + 0x12, 0xd6, 0xa3, 0x80, 0xe8, 0x43, 0x0d, 0x55, 0x61, 0x94, 0xea, + 0x64, 0x37, 0x47, 0xea, 0x77, 0xca, 0xd0, 0xb2, 0x58, 0x05, 0xc3, + 0x5d, 0x7e, 0xb1, 0xa8, 0x46, 0x90, 0x31, 0x56, 0xce, 0x70, 0x2a, + 0x96, 0xb2, 0x30, 0xb8, 0x77, 0xe6, 0x79, 0xc0, 0xbd, 0x29, 0x3b, + 0xfd, 0x94, 0x77, 0x4c, 0xbd, 0x20, 0xcd, 0x41, 0x25, 0xe0, 0x2e, + 0xc7, 0x1b, 0xbb, 0xee, 0xa4, 0x04, 0x41, 0xd2, 0x5d, 0xad, 0x12, + 0x6a, 0x8a, 0x9b, 0x47, 0xfb, 0xc9, 0xdd, 0x46, 0x40, 0xe1, 0x9d, + 0x3c, 0x33, 0xd0, 0xb5, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x77, + 0x30, 0x75, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, + 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0b, 0x06, + 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x46, 0x30, + 0x15, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x0e, 0x30, 0x0c, 0x30, + 0x0a, 0x06, 0x08, 0x2a, 0x81, 0x7a, 0x01, 0x79, 0x01, 0x01, 0x01, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0xa3, 0x05, 0x2f, 0x18, 0x60, 0x50, 0xc2, 0x89, 0x0a, 0xdd, 0x2b, + 0x21, 0x4f, 0xff, 0x8e, 0x4e, 0xa8, 0x30, 0x31, 0x36, 0x30, 0x1f, + 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, + 0xa3, 0x05, 0x2f, 0x18, 0x60, 0x50, 0xc2, 0x89, 0x0a, 0xdd, 0x2b, + 0x21, 0x4f, 0xff, 0x8e, 0x4e, 0xa8, 0x30, 0x31, 0x36, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x05, 0xdc, 0x26, 0xd8, + 0xfa, 0x77, 0x15, 0x44, 0x68, 0xfc, 0x2f, 0x66, 0x3a, 0x74, 0xe0, + 0x5d, 0xe4, 0x29, 0xff, 0x06, 0x07, 0x13, 0x84, 0x4a, 0xab, 0xcf, + 0x6d, 0xa0, 0x1f, 0x51, 0x94, 0xf8, 0x49, 0xcb, 0x74, 0x36, 0x14, + 0xbc, 0x15, 0xdd, 0xdb, 0x89, 0x2f, 0xdd, 0x8f, 0xa0, 0x5d, 0x7c, + 0xf5, 0x12, 0xeb, 0x9f, 0x9e, 0x38, 0xa4, 0x47, 0xcc, 0xb3, 0x96, + 0xd9, 0xbe, 0x9c, 0x25, 0xab, 0x03, 0x7e, 0x33, 0x0f, 0x95, 0x81, + 0x0d, 0xfd, 0x16, 0xe0, 0x88, 0xbe, 0x37, 0xf0, 0x6c, 0x5d, 0xd0, + 0x31, 0x9b, 0x32, 0x2b, 0x5d, 0x17, 0x65, 0x93, 0x98, 0x60, 0xbc, + 0x6e, 0x8f, 0xb1, 0xa8, 0x3c, 0x1e, 0xd9, 0x1c, 0xf3, 0xa9, 0x26, + 0x42, 0xf9, 0x64, 0x1d, 0xc2, 0xe7, 0x92, 0xf6, 0xf4, 0x1e, 0x5a, + 0xaa, 0x19, 0x52, 0x5d, 0xaf, 0xe8, 0xa2, 0xf7, 0x60, 0xa0, 0xf6, + 0x8d, 0xf0, 0x89, 0xf5, 0x6e, 0xe0, 0x0a, 0x05, 0x01, 0x95, 0xc9, + 0x8b, 0x20, 0x0a, 0xba, 0x5a, 0xfc, 0x9a, 0x2c, 0x3c, 0xbd, 0xc3, + 0xb7, 0xc9, 0x5d, 0x78, 0x25, 0x05, 0x3f, 0x56, 0x14, 0x9b, 0x0c, + 0xda, 0xfb, 0x3a, 0x48, 0xfe, 0x97, 0x69, 0x5e, 0xca, 0x10, 0x86, + 0xf7, 0x4e, 0x96, 0x04, 0x08, 0x4d, 0xec, 0xb0, 0xbe, 0x5d, 0xdc, + 0x3b, 0x8e, 0x4f, 0xc1, 0xfd, 0x9a, 0x36, 0x34, 0x9a, 0x4c, 0x54, + 0x7e, 0x17, 0x03, 0x48, 0x95, 0x08, 0x11, 0x1c, 0x07, 0x6f, 0x85, + 0x08, 0x7e, 0x5d, 0x4d, 0xc4, 0x9d, 0xdb, 0xfb, 0xae, 0xce, 0xb2, + 0xd1, 0xb3, 0xb8, 0x83, 0x6c, 0x1d, 0xb2, 0xb3, 0x79, 0xf1, 0xd8, + 0x70, 0x99, 0x7e, 0xf0, 0x13, 0x02, 0xce, 0x5e, 0xdd, 0x51, 0xd3, + 0xdf, 0x36, 0x81, 0xa1, 0x1b, 0x78, 0x2f, 0x71, 0xb3, 0xf1, 0x59, + 0x4c, 0x46, 0x18, 0x28, 0xab, 0x85, 0xd2, 0x60, 0x56, 0x5a, 0x30, + 0x82, 0x03, 0x7d, 0x30, 0x82, 0x02, 0x65, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x60, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, + 0x50, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x1c, 0x53, 0x45, 0x43, 0x4f, 0x4d, 0x20, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x43, + 0x4f, 0x2e, 0x2c, 0x4c, 0x54, 0x44, 0x2e, 0x31, 0x2a, 0x30, 0x28, + 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x21, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x45, 0x56, 0x20, + 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x31, 0x30, 0x1e, 0x17, 0x0d, + 0x30, 0x37, 0x30, 0x36, 0x30, 0x36, 0x30, 0x32, 0x31, 0x32, 0x33, + 0x32, 0x5a, 0x17, 0x0d, 0x33, 0x37, 0x30, 0x36, 0x30, 0x36, 0x30, + 0x32, 0x31, 0x32, 0x33, 0x32, 0x5a, 0x30, 0x60, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, + 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, + 0x45, 0x43, 0x4f, 0x4d, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, + 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x43, 0x4f, 0x2e, + 0x2c, 0x4c, 0x54, 0x44, 0x2e, 0x31, 0x2a, 0x30, 0x28, 0x06, 0x03, + 0x55, 0x04, 0x0b, 0x13, 0x21, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, + 0x74, 0x79, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x45, 0x56, 0x20, 0x52, 0x6f, + 0x6f, 0x74, 0x43, 0x41, 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, + 0x02, 0x82, 0x01, 0x01, 0x00, 0xbc, 0x7f, 0xec, 0x57, 0x9b, 0x24, + 0xe0, 0xfe, 0x9c, 0xba, 0x42, 0x79, 0xa9, 0x88, 0x8a, 0xfa, 0x80, + 0xe0, 0xf5, 0x07, 0x29, 0x43, 0xea, 0x8e, 0x0a, 0x34, 0x36, 0x8d, + 0x1c, 0xfa, 0xa7, 0xb5, 0x39, 0x78, 0xff, 0x97, 0x75, 0xf7, 0x2f, + 0xe4, 0xaa, 0x6b, 0x04, 0x84, 0x44, 0xca, 0xa6, 0xe2, 0x68, 0x8e, + 0xfd, 0x55, 0x50, 0x62, 0x0f, 0xa4, 0x71, 0x0e, 0xce, 0x07, 0x38, + 0x2d, 0x42, 0x85, 0x50, 0xad, 0x3c, 0x96, 0x6f, 0x8b, 0xd5, 0xa2, + 0x0e, 0xcf, 0xde, 0x49, 0x89, 0x3d, 0xd6, 0x64, 0x2e, 0x38, 0xe5, + 0x1e, 0x6c, 0xb5, 0x57, 0x8a, 0x9e, 0xef, 0x48, 0x0e, 0xcd, 0x7a, + 0x69, 0x16, 0x87, 0x44, 0xb5, 0x90, 0xe4, 0x06, 0x9d, 0xae, 0xa1, + 0x04, 0x97, 0x58, 0x79, 0xef, 0x20, 0x4a, 0x82, 0x6b, 0x8c, 0x22, + 0xbf, 0xec, 0x1f, 0x0f, 0xe9, 0x84, 0x71, 0xed, 0xf1, 0x0e, 0xe4, + 0xb8, 0x18, 0x13, 0xcc, 0x56, 0x36, 0x5d, 0xd1, 0x9a, 0x1e, 0x51, + 0x6b, 0x39, 0x6e, 0x60, 0x76, 0x88, 0x34, 0x0b, 0xf3, 0xb3, 0xd1, + 0xb0, 0x9d, 0xca, 0x61, 0xe2, 0x64, 0x1d, 0xc1, 0x46, 0x07, 0xb8, + 0x63, 0xdd, 0x1e, 0x33, 0x65, 0xb3, 0x8e, 0x09, 0x55, 0x52, 0x3d, + 0xb5, 0xbd, 0xff, 0x07, 0xeb, 0xad, 0x61, 0x55, 0x18, 0x2c, 0xa9, + 0x69, 0x98, 0x4a, 0xaa, 0x40, 0xc5, 0x33, 0x14, 0x65, 0x74, 0x00, + 0xf9, 0x91, 0xde, 0xaf, 0x03, 0x48, 0xc5, 0x40, 0x54, 0xdc, 0x0f, + 0x84, 0x90, 0x68, 0x20, 0xc5, 0x92, 0x96, 0xdc, 0x2e, 0xe5, 0x02, + 0x45, 0xaa, 0xc0, 0x5f, 0x54, 0xf8, 0x6d, 0xea, 0x49, 0xcf, 0x5d, + 0x6c, 0x4b, 0xaf, 0xef, 0x9a, 0xc2, 0x56, 0x5c, 0xc6, 0x35, 0x56, + 0x42, 0x6a, 0x30, 0x5f, 0xc2, 0xab, 0xf6, 0xe2, 0x3d, 0x3f, 0xb3, + 0xc9, 0x11, 0x8f, 0x31, 0x4c, 0xd7, 0x9f, 0x49, 0x02, 0x03, 0x01, + 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, + 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x35, 0x4a, 0xf5, 0x4d, 0xaf, + 0x3f, 0xd7, 0x82, 0x38, 0xac, 0xab, 0x71, 0x65, 0x17, 0x75, 0x8c, + 0x9d, 0x55, 0x93, 0xe6, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, + 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, - 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, - 0x04, 0x16, 0x04, 0x14, 0xb3, 0x03, 0x7e, 0xae, 0x36, 0xbc, 0xb0, - 0x79, 0xd1, 0xdc, 0x94, 0x26, 0xb6, 0x11, 0xbe, 0x21, 0xb2, 0x69, - 0x86, 0x94, 0x30, 0x10, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, - 0x82, 0x37, 0x15, 0x01, 0x04, 0x03, 0x02, 0x01, 0x00, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, - 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x4b, 0xa1, 0xff, 0x0b, - 0x87, 0x6e, 0xb3, 0xf9, 0xc1, 0x43, 0xb1, 0x48, 0xf3, 0x28, 0xc0, - 0x1d, 0x2e, 0xc9, 0x09, 0x41, 0xfa, 0x94, 0x00, 0x1c, 0xa4, 0xa4, - 0xab, 0x49, 0x4f, 0x8f, 0x3d, 0x1e, 0xef, 0x4d, 0x6f, 0xbd, 0xbc, - 0xa4, 0xf6, 0xf2, 0x26, 0x30, 0xc9, 0x10, 0xca, 0x1d, 0x88, 0xfb, - 0x74, 0x19, 0x1f, 0x85, 0x45, 0xbd, 0xb0, 0x6c, 0x51, 0xf9, 0x36, - 0x7e, 0xdb, 0xf5, 0x4c, 0x32, 0x3a, 0x41, 0x4f, 0x5b, 0x47, 0xcf, - 0xe8, 0x0b, 0x2d, 0xb6, 0xc4, 0x19, 0x9d, 0x74, 0xc5, 0x47, 0xc6, - 0x3b, 0x6a, 0x0f, 0xac, 0x14, 0xdb, 0x3c, 0xf4, 0x73, 0x9c, 0xa9, - 0x05, 0xdf, 0x00, 0xdc, 0x74, 0x78, 0xfa, 0xf8, 0x35, 0x60, 0x59, - 0x02, 0x13, 0x18, 0x7c, 0xbc, 0xfb, 0x4d, 0xb0, 0x20, 0x6d, 0x43, - 0xbb, 0x60, 0x30, 0x7a, 0x67, 0x33, 0x5c, 0xc5, 0x99, 0xd1, 0xf8, - 0x2d, 0x39, 0x52, 0x73, 0xfb, 0x8c, 0xaa, 0x97, 0x25, 0x5c, 0x72, - 0xd9, 0x08, 0x1e, 0xab, 0x4e, 0x3c, 0xe3, 0x81, 0x31, 0x9f, 0x03, - 0xa6, 0xfb, 0xc0, 0xfe, 0x29, 0x88, 0x55, 0xda, 0x84, 0xd5, 0x50, - 0x03, 0xb6, 0xe2, 0x84, 0xa3, 0xa6, 0x36, 0xaa, 0x11, 0x3a, 0x01, - 0xe1, 0x18, 0x4b, 0xd6, 0x44, 0x68, 0xb3, 0x3d, 0xf9, 0x53, 0x74, - 0x84, 0xb3, 0x46, 0x91, 0x46, 0x96, 0x00, 0xb7, 0x80, 0x2c, 0xb6, - 0xe1, 0xe3, 0x10, 0xe2, 0xdb, 0xa2, 0xe7, 0x28, 0x8f, 0x01, 0x96, - 0x62, 0x16, 0x3e, 0x00, 0xe3, 0x1c, 0xa5, 0x36, 0x81, 0x18, 0xa2, - 0x4c, 0x52, 0x76, 0xc0, 0x11, 0xa3, 0x6e, 0xe6, 0x1d, 0xba, 0xe3, - 0x5a, 0xbe, 0x36, 0x53, 0xc5, 0x3e, 0x75, 0x8f, 0x86, 0x69, 0x29, - 0x58, 0x53, 0xb5, 0x9c, 0xbb, 0x6f, 0x9f, 0x5c, 0xc5, 0x18, 0xec, - 0xdd, 0x2f, 0xe1, 0x98, 0xc9, 0xfc, 0xbe, 0xdf, 0x0a, 0x0d, 0x30, - 0x82, 0x07, 0xa8, 0x30, 0x82, 0x06, 0x90, 0xa0, 0x03, 0x02, 0x01, - 0x02, 0x02, 0x11, 0x00, 0xcc, 0xb8, 0xe7, 0xbf, 0x4e, 0x29, 0x1a, - 0xfd, 0xa2, 0xdc, 0x66, 0xa5, 0x1c, 0x2c, 0x0f, 0x11, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, - 0x05, 0x00, 0x30, 0x72, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x48, 0x55, 0x31, 0x11, 0x30, 0x0f, 0x06, - 0x03, 0x55, 0x04, 0x07, 0x13, 0x08, 0x42, 0x75, 0x64, 0x61, 0x70, - 0x65, 0x73, 0x74, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x0d, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x65, 0x63, - 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, - 0x55, 0x04, 0x0b, 0x13, 0x0b, 0x65, 0x2d, 0x53, 0x7a, 0x69, 0x67, - 0x6e, 0x6f, 0x20, 0x43, 0x41, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x13, 0x19, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, - 0x65, 0x63, 0x20, 0x65, 0x2d, 0x53, 0x7a, 0x69, 0x67, 0x6e, 0x6f, - 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, - 0x0d, 0x30, 0x35, 0x30, 0x34, 0x30, 0x36, 0x31, 0x32, 0x32, 0x38, - 0x34, 0x34, 0x5a, 0x17, 0x0d, 0x31, 0x37, 0x30, 0x34, 0x30, 0x36, - 0x31, 0x32, 0x32, 0x38, 0x34, 0x34, 0x5a, 0x30, 0x72, 0x31, 0x0b, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x48, 0x55, - 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x08, - 0x42, 0x75, 0x64, 0x61, 0x70, 0x65, 0x73, 0x74, 0x31, 0x16, 0x30, - 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x4d, 0x69, 0x63, - 0x72, 0x6f, 0x73, 0x65, 0x63, 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x31, - 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0b, 0x65, - 0x2d, 0x53, 0x7a, 0x69, 0x67, 0x6e, 0x6f, 0x20, 0x43, 0x41, 0x31, - 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x19, 0x4d, - 0x69, 0x63, 0x72, 0x6f, 0x73, 0x65, 0x63, 0x20, 0x65, 0x2d, 0x53, - 0x7a, 0x69, 0x67, 0x6e, 0x6f, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, + 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x01, 0x00, 0xa8, 0x87, 0xe9, 0xec, 0xf8, 0x40, 0x67, 0x5d, 0xc3, + 0xc1, 0x66, 0xc7, 0x40, 0x4b, 0x97, 0xfc, 0x87, 0x13, 0x90, 0x5a, + 0xc4, 0xef, 0xa0, 0xca, 0x5f, 0x8b, 0xb7, 0xa7, 0xb7, 0xf1, 0xd6, + 0xb5, 0x64, 0xb7, 0x8a, 0xb3, 0xb8, 0x1b, 0xcc, 0xda, 0xfb, 0xac, + 0x66, 0x88, 0x41, 0xce, 0xe8, 0xfc, 0xe4, 0xdb, 0x1e, 0x88, 0xa6, + 0xed, 0x27, 0x50, 0x1b, 0x02, 0x30, 0x24, 0x46, 0x79, 0xfe, 0x04, + 0x87, 0x70, 0x97, 0x40, 0x73, 0xd1, 0xc0, 0xc1, 0x57, 0x19, 0x9a, + 0x69, 0xa5, 0x27, 0x99, 0xab, 0x9d, 0x62, 0x84, 0xf6, 0x51, 0xc1, + 0x2c, 0xc9, 0x23, 0x15, 0xd8, 0x28, 0xb7, 0xab, 0x25, 0x13, 0xb5, + 0x46, 0xe1, 0x86, 0x02, 0xff, 0x26, 0x8c, 0xc4, 0x88, 0x92, 0x1d, + 0x56, 0xfe, 0x19, 0x67, 0xf2, 0x55, 0xe4, 0x80, 0xa3, 0x6b, 0x9c, + 0xab, 0x77, 0xe1, 0x51, 0x71, 0x0d, 0x20, 0xdb, 0x10, 0x9a, 0xdb, + 0xbd, 0x76, 0x79, 0x07, 0x77, 0x99, 0x28, 0xad, 0x9a, 0x5e, 0xda, + 0xb1, 0x4f, 0x44, 0x2c, 0x35, 0x8e, 0xa5, 0x96, 0xc7, 0xfd, 0x83, + 0xf0, 0x58, 0xc6, 0x79, 0xd6, 0x98, 0x7c, 0xa8, 0x8d, 0xfe, 0x86, + 0x3e, 0x07, 0x16, 0x92, 0xe1, 0x7b, 0xe7, 0x1d, 0xec, 0x33, 0x76, + 0x7e, 0x42, 0x2e, 0x4a, 0x85, 0xf9, 0x91, 0x89, 0x68, 0x84, 0x03, + 0x81, 0xa5, 0x9b, 0x9a, 0xbe, 0xe3, 0x37, 0xc5, 0x54, 0xab, 0x56, + 0x3b, 0x18, 0x2d, 0x41, 0xa4, 0x0c, 0xf8, 0x42, 0xdb, 0x99, 0xa0, + 0xe0, 0x72, 0x6f, 0xbb, 0x5d, 0xe1, 0x16, 0x4f, 0x53, 0x0a, 0x64, + 0xf9, 0x4e, 0xf4, 0xbf, 0x4e, 0x54, 0xbd, 0x78, 0x6c, 0x88, 0xea, + 0xbf, 0x9c, 0x13, 0x24, 0xc2, 0x70, 0x69, 0xa2, 0x7f, 0x0f, 0xc8, + 0x3c, 0xad, 0x08, 0xc9, 0xb0, 0x98, 0x40, 0xa3, 0x2a, 0xe7, 0x88, + 0x83, 0xed, 0x77, 0x8f, 0x74, 0x30, 0x82, 0x03, 0xf1, 0x30, 0x82, + 0x02, 0xd9, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x41, 0x3d, + 0x72, 0xc7, 0xf4, 0x6b, 0x1f, 0x81, 0x43, 0x7d, 0xf1, 0xd2, 0x28, + 0x54, 0xdf, 0x9a, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0x8a, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x43, + 0x48, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x07, 0x57, 0x49, 0x53, 0x65, 0x4b, 0x65, 0x79, 0x31, 0x1b, 0x30, + 0x19, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x12, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, + 0x32, 0x30, 0x30, 0x35, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, + 0x04, 0x0b, 0x13, 0x19, 0x4f, 0x49, 0x53, 0x54, 0x45, 0x20, 0x46, + 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x45, + 0x6e, 0x64, 0x6f, 0x72, 0x73, 0x65, 0x64, 0x31, 0x28, 0x30, 0x26, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1f, 0x4f, 0x49, 0x53, 0x54, + 0x45, 0x20, 0x57, 0x49, 0x53, 0x65, 0x4b, 0x65, 0x79, 0x20, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, + 0x47, 0x41, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x35, + 0x31, 0x32, 0x31, 0x31, 0x31, 0x36, 0x30, 0x33, 0x34, 0x34, 0x5a, + 0x17, 0x0d, 0x33, 0x37, 0x31, 0x32, 0x31, 0x31, 0x31, 0x36, 0x30, + 0x39, 0x35, 0x31, 0x5a, 0x30, 0x81, 0x8a, 0x31, 0x0b, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x43, 0x48, 0x31, 0x10, + 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x07, 0x57, 0x49, + 0x53, 0x65, 0x4b, 0x65, 0x79, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, + 0x55, 0x04, 0x0b, 0x13, 0x12, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, + 0x35, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, + 0x19, 0x4f, 0x49, 0x53, 0x54, 0x45, 0x20, 0x46, 0x6f, 0x75, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x45, 0x6e, 0x64, 0x6f, + 0x72, 0x73, 0x65, 0x64, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x1f, 0x4f, 0x49, 0x53, 0x54, 0x45, 0x20, 0x57, + 0x49, 0x53, 0x65, 0x4b, 0x65, 0x79, 0x20, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x41, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, - 0x01, 0x00, 0xed, 0xc8, 0x00, 0xd5, 0x81, 0x7b, 0xcd, 0x38, 0x00, - 0x47, 0xcc, 0xdb, 0x84, 0xc1, 0x21, 0x69, 0x2c, 0x74, 0x90, 0x0c, - 0x21, 0xd9, 0x53, 0x87, 0xed, 0x3e, 0x43, 0x44, 0x53, 0xaf, 0xab, - 0xf8, 0x80, 0x9b, 0x3c, 0x78, 0x8d, 0xd4, 0x8d, 0xae, 0xb8, 0xef, - 0xd3, 0x11, 0xdc, 0x81, 0xe6, 0xcf, 0x3b, 0x96, 0x8c, 0xd6, 0x6f, - 0x15, 0xc6, 0x77, 0x7e, 0xa1, 0x2f, 0xe0, 0x5f, 0x92, 0xb6, 0x27, - 0xd7, 0x76, 0x9a, 0x1d, 0x43, 0x3c, 0xea, 0xd9, 0xec, 0x2f, 0xee, - 0x39, 0xf3, 0x6a, 0x67, 0x4b, 0x8b, 0x82, 0xcf, 0x22, 0xf8, 0x65, - 0x55, 0xfe, 0x2c, 0xcb, 0x2f, 0x7d, 0x48, 0x7a, 0x3d, 0x75, 0xf9, - 0xaa, 0xa0, 0x27, 0xbb, 0x78, 0xc2, 0x06, 0xca, 0x51, 0xc2, 0x7e, - 0x66, 0x4b, 0xaf, 0xcd, 0xa2, 0xa7, 0x4d, 0x02, 0x82, 0x3f, 0x82, - 0xac, 0x85, 0xc6, 0xe1, 0x0f, 0x90, 0x47, 0x99, 0x94, 0x0a, 0x71, - 0x72, 0x93, 0x2a, 0xc9, 0xa6, 0xc0, 0xbe, 0x3c, 0x56, 0x4c, 0x73, - 0x92, 0x27, 0xf1, 0x6b, 0xb5, 0xf5, 0xfd, 0xfc, 0x30, 0x05, 0x60, - 0x92, 0xc6, 0xeb, 0x96, 0x7e, 0x01, 0x91, 0xc2, 0x69, 0xb1, 0x1e, - 0x1d, 0x7b, 0x53, 0x45, 0xb8, 0xdc, 0x41, 0x1f, 0xc9, 0x8b, 0x71, - 0xd6, 0x54, 0x14, 0xe3, 0x8b, 0x54, 0x78, 0x3f, 0xbe, 0xf4, 0x62, - 0x3b, 0x5b, 0xf5, 0xa3, 0xec, 0xd5, 0x92, 0x74, 0xe2, 0x74, 0x30, - 0xef, 0x01, 0xdb, 0xe1, 0xd4, 0xab, 0x99, 0x9b, 0x2a, 0x6b, 0xf8, - 0xbd, 0xa6, 0x1c, 0x86, 0x23, 0x42, 0x5f, 0xec, 0x49, 0xde, 0x9a, - 0x8b, 0x5b, 0xf4, 0x72, 0x3a, 0x40, 0xc5, 0x49, 0x3e, 0xa5, 0xbe, - 0x8e, 0xaa, 0x71, 0xeb, 0x6c, 0xfa, 0xf5, 0x1a, 0xe4, 0x6a, 0xfd, - 0x7b, 0x7d, 0x55, 0x40, 0xef, 0x58, 0x6e, 0xe6, 0xd9, 0xd5, 0xbc, - 0x24, 0xab, 0xc1, 0xef, 0xb7, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, - 0x82, 0x04, 0x37, 0x30, 0x82, 0x04, 0x33, 0x30, 0x67, 0x06, 0x08, - 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x5b, 0x30, - 0x59, 0x30, 0x28, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, - 0x30, 0x01, 0x86, 0x1c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, - 0x2f, 0x72, 0x63, 0x61, 0x2e, 0x65, 0x2d, 0x73, 0x7a, 0x69, 0x67, - 0x6e, 0x6f, 0x2e, 0x68, 0x75, 0x2f, 0x6f, 0x63, 0x73, 0x70, 0x30, - 0x2d, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, - 0x86, 0x21, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, - 0x77, 0x2e, 0x65, 0x2d, 0x73, 0x7a, 0x69, 0x67, 0x6e, 0x6f, 0x2e, - 0x68, 0x75, 0x2f, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x2e, 0x63, - 0x72, 0x74, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, - 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x82, 0x01, - 0x73, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x82, 0x01, 0x6a, 0x30, - 0x82, 0x01, 0x66, 0x30, 0x82, 0x01, 0x62, 0x06, 0x0c, 0x2b, 0x06, - 0x01, 0x04, 0x01, 0x81, 0xa8, 0x18, 0x02, 0x01, 0x01, 0x01, 0x30, - 0x82, 0x01, 0x50, 0x30, 0x28, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, - 0x05, 0x07, 0x02, 0x01, 0x16, 0x1c, 0x68, 0x74, 0x74, 0x70, 0x3a, - 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x2d, 0x73, 0x7a, 0x69, - 0x67, 0x6e, 0x6f, 0x2e, 0x68, 0x75, 0x2f, 0x53, 0x5a, 0x53, 0x5a, - 0x2f, 0x30, 0x82, 0x01, 0x22, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, - 0x05, 0x07, 0x02, 0x02, 0x30, 0x82, 0x01, 0x14, 0x1e, 0x82, 0x01, - 0x10, 0x00, 0x41, 0x00, 0x20, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6e, - 0x00, 0xfa, 0x00, 0x73, 0x00, 0xed, 0x00, 0x74, 0x00, 0x76, 0x00, - 0xe1, 0x00, 0x6e, 0x00, 0x79, 0x00, 0x20, 0x00, 0xe9, 0x00, 0x72, - 0x00, 0x74, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x65, 0x00, - 0x7a, 0x00, 0xe9, 0x00, 0x73, 0x00, 0xe9, 0x00, 0x68, 0x00, 0x65, - 0x00, 0x7a, 0x00, 0x20, 0x00, 0xe9, 0x00, 0x73, 0x00, 0x20, 0x00, - 0x65, 0x00, 0x6c, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x67, 0x00, 0x61, - 0x00, 0x64, 0x00, 0xe1, 0x00, 0x73, 0x00, 0xe1, 0x00, 0x68, 0x00, - 0x6f, 0x00, 0x7a, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, 0x53, - 0x00, 0x7a, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x67, 0x00, 0xe1, 0x00, - 0x6c, 0x00, 0x74, 0x00, 0x61, 0x00, 0x74, 0x00, 0xf3, 0x00, 0x20, - 0x00, 0x53, 0x00, 0x7a, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x67, 0x00, - 0xe1, 0x00, 0x6c, 0x00, 0x74, 0x00, 0x61, 0x00, 0x74, 0x00, 0xe1, - 0x00, 0x73, 0x00, 0x69, 0x00, 0x20, 0x00, 0x53, 0x00, 0x7a, 0x00, - 0x61, 0x00, 0x62, 0x00, 0xe1, 0x00, 0x6c, 0x00, 0x79, 0x00, 0x7a, - 0x00, 0x61, 0x00, 0x74, 0x00, 0x61, 0x00, 0x20, 0x00, 0x73, 0x00, - 0x7a, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x74, - 0x00, 0x20, 0x00, 0x6b, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, - 0x20, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6a, 0x00, 0xe1, 0x00, 0x72, - 0x00, 0x6e, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x20, 0x00, 0x68, 0x00, - 0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, - 0x00, 0x77, 0x00, 0x77, 0x00, 0x77, 0x00, 0x2e, 0x00, 0x65, 0x00, - 0x2d, 0x00, 0x73, 0x00, 0x7a, 0x00, 0x69, 0x00, 0x67, 0x00, 0x6e, - 0x00, 0x6f, 0x00, 0x2e, 0x00, 0x68, 0x00, 0x75, 0x00, 0x2f, 0x00, - 0x53, 0x00, 0x5a, 0x00, 0x53, 0x00, 0x5a, 0x00, 0x2f, 0x30, 0x81, - 0xc8, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x81, 0xc0, 0x30, 0x81, - 0xbd, 0x30, 0x81, 0xba, 0xa0, 0x81, 0xb7, 0xa0, 0x81, 0xb4, 0x86, - 0x21, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, - 0x2e, 0x65, 0x2d, 0x73, 0x7a, 0x69, 0x67, 0x6e, 0x6f, 0x2e, 0x68, - 0x75, 0x2f, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x2e, 0x63, 0x72, - 0x6c, 0x86, 0x81, 0x8e, 0x6c, 0x64, 0x61, 0x70, 0x3a, 0x2f, 0x2f, - 0x6c, 0x64, 0x61, 0x70, 0x2e, 0x65, 0x2d, 0x73, 0x7a, 0x69, 0x67, - 0x6e, 0x6f, 0x2e, 0x68, 0x75, 0x2f, 0x43, 0x4e, 0x3d, 0x4d, 0x69, - 0x63, 0x72, 0x6f, 0x73, 0x65, 0x63, 0x25, 0x32, 0x30, 0x65, 0x2d, - 0x53, 0x7a, 0x69, 0x67, 0x6e, 0x6f, 0x25, 0x32, 0x30, 0x52, 0x6f, - 0x6f, 0x74, 0x25, 0x32, 0x30, 0x43, 0x41, 0x2c, 0x4f, 0x55, 0x3d, - 0x65, 0x2d, 0x53, 0x7a, 0x69, 0x67, 0x6e, 0x6f, 0x25, 0x32, 0x30, - 0x43, 0x41, 0x2c, 0x4f, 0x3d, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, - 0x65, 0x63, 0x25, 0x32, 0x30, 0x4c, 0x74, 0x64, 0x2e, 0x2c, 0x4c, - 0x3d, 0x42, 0x75, 0x64, 0x61, 0x70, 0x65, 0x73, 0x74, 0x2c, 0x43, - 0x3d, 0x48, 0x55, 0x3f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x3b, 0x62, 0x69, 0x6e, - 0x61, 0x72, 0x79, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, - 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x81, 0x96, - 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x81, 0x8e, 0x30, 0x81, 0x8b, - 0x81, 0x10, 0x69, 0x6e, 0x66, 0x6f, 0x40, 0x65, 0x2d, 0x73, 0x7a, - 0x69, 0x67, 0x6e, 0x6f, 0x2e, 0x68, 0x75, 0xa4, 0x77, 0x30, 0x75, - 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1a, - 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x65, 0x63, 0x20, 0x65, 0x2d, - 0x53, 0x7a, 0x69, 0x67, 0x6e, 0xc3, 0xb3, 0x20, 0x52, 0x6f, 0x6f, - 0x74, 0x20, 0x43, 0x41, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, - 0x04, 0x0b, 0x0c, 0x0d, 0x65, 0x2d, 0x53, 0x7a, 0x69, 0x67, 0x6e, - 0xc3, 0xb3, 0x20, 0x48, 0x53, 0x5a, 0x31, 0x16, 0x30, 0x14, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x4d, 0x69, 0x63, 0x72, 0x6f, - 0x73, 0x65, 0x63, 0x20, 0x4b, 0x66, 0x74, 0x2e, 0x31, 0x11, 0x30, - 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x08, 0x42, 0x75, 0x64, - 0x61, 0x70, 0x65, 0x73, 0x74, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, - 0x55, 0x04, 0x06, 0x13, 0x02, 0x48, 0x55, 0x30, 0x81, 0xac, 0x06, - 0x03, 0x55, 0x1d, 0x23, 0x04, 0x81, 0xa4, 0x30, 0x81, 0xa1, 0x80, - 0x14, 0xc7, 0xa0, 0x49, 0x75, 0x16, 0x61, 0x84, 0xdb, 0x31, 0x4b, - 0x84, 0xd2, 0xf1, 0x37, 0x40, 0x90, 0xef, 0x4e, 0xdc, 0xf7, 0xa1, - 0x76, 0xa4, 0x74, 0x30, 0x72, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x01, 0x00, 0xcb, 0x4f, 0xb3, 0x00, 0x9b, 0x3d, 0x36, 0xdd, 0xf9, + 0xd1, 0x49, 0x6a, 0x6b, 0x10, 0x49, 0x1f, 0xec, 0xd8, 0x2b, 0xb2, + 0xc6, 0xf8, 0x32, 0x81, 0x29, 0x43, 0x95, 0x4c, 0x9a, 0x19, 0x23, + 0x21, 0x15, 0x45, 0xde, 0xe3, 0xc8, 0x1c, 0x51, 0x55, 0x5b, 0xae, + 0x93, 0xe8, 0x37, 0xff, 0x2b, 0x6b, 0xe9, 0xd4, 0xea, 0xbe, 0x2a, + 0xdd, 0xa8, 0x51, 0x2b, 0xd7, 0x66, 0xc3, 0x61, 0x5c, 0x60, 0x02, + 0xc8, 0xf5, 0xce, 0x72, 0x7b, 0x3b, 0xb8, 0xf2, 0x4e, 0x65, 0x08, + 0x9a, 0xcd, 0xa4, 0x6a, 0x19, 0xc1, 0x01, 0xbb, 0x73, 0xa6, 0xd7, + 0xf6, 0xc3, 0xdd, 0xcd, 0xbc, 0xa4, 0x8b, 0xb5, 0x99, 0x61, 0xb8, + 0x01, 0xa2, 0xa3, 0xd4, 0x4d, 0xd4, 0x05, 0x3d, 0x91, 0xad, 0xf8, + 0xb4, 0x08, 0x71, 0x64, 0xaf, 0x70, 0xf1, 0x1c, 0x6b, 0x7e, 0xf6, + 0xc3, 0x77, 0x9d, 0x24, 0x73, 0x7b, 0xe4, 0x0c, 0x8c, 0xe1, 0xd9, + 0x36, 0xe1, 0x99, 0x8b, 0x05, 0x99, 0x0b, 0xed, 0x45, 0x31, 0x09, + 0xca, 0xc2, 0x00, 0xdb, 0xf7, 0x72, 0xa0, 0x96, 0xaa, 0x95, 0x87, + 0xd0, 0x8e, 0xc7, 0xb6, 0x61, 0x73, 0x0d, 0x76, 0x66, 0x8c, 0xdc, + 0x1b, 0xb4, 0x63, 0xa2, 0x9f, 0x7f, 0x93, 0x13, 0x30, 0xf1, 0xa1, + 0x27, 0xdb, 0xd9, 0xff, 0x2c, 0x55, 0x88, 0x91, 0xa0, 0xe0, 0x4f, + 0x07, 0xb0, 0x28, 0x56, 0x8c, 0x18, 0x1b, 0x97, 0x44, 0x8e, 0x89, + 0xdd, 0xe0, 0x17, 0x6e, 0xe7, 0x2a, 0xef, 0x8f, 0x39, 0x0a, 0x31, + 0x84, 0x82, 0xd8, 0x40, 0x14, 0x49, 0x2e, 0x7a, 0x41, 0xe4, 0xa7, + 0xfe, 0xe3, 0x64, 0xcc, 0xc1, 0x59, 0x71, 0x4b, 0x2c, 0x21, 0xa7, + 0x5b, 0x7d, 0xe0, 0x1d, 0xd1, 0x2e, 0x81, 0x9b, 0xc3, 0xd8, 0x68, + 0xf7, 0xbd, 0x96, 0x1b, 0xac, 0x70, 0xb1, 0x16, 0x14, 0x0b, 0xdb, + 0x60, 0xb9, 0x26, 0x01, 0x05, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, + 0x51, 0x30, 0x4f, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, + 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, + 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0xb3, 0x03, 0x7e, 0xae, 0x36, 0xbc, 0xb0, 0x79, 0xd1, 0xdc, 0x94, + 0x26, 0xb6, 0x11, 0xbe, 0x21, 0xb2, 0x69, 0x86, 0x94, 0x30, 0x10, + 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x01, + 0x04, 0x03, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, + 0x01, 0x01, 0x00, 0x4b, 0xa1, 0xff, 0x0b, 0x87, 0x6e, 0xb3, 0xf9, + 0xc1, 0x43, 0xb1, 0x48, 0xf3, 0x28, 0xc0, 0x1d, 0x2e, 0xc9, 0x09, + 0x41, 0xfa, 0x94, 0x00, 0x1c, 0xa4, 0xa4, 0xab, 0x49, 0x4f, 0x8f, + 0x3d, 0x1e, 0xef, 0x4d, 0x6f, 0xbd, 0xbc, 0xa4, 0xf6, 0xf2, 0x26, + 0x30, 0xc9, 0x10, 0xca, 0x1d, 0x88, 0xfb, 0x74, 0x19, 0x1f, 0x85, + 0x45, 0xbd, 0xb0, 0x6c, 0x51, 0xf9, 0x36, 0x7e, 0xdb, 0xf5, 0x4c, + 0x32, 0x3a, 0x41, 0x4f, 0x5b, 0x47, 0xcf, 0xe8, 0x0b, 0x2d, 0xb6, + 0xc4, 0x19, 0x9d, 0x74, 0xc5, 0x47, 0xc6, 0x3b, 0x6a, 0x0f, 0xac, + 0x14, 0xdb, 0x3c, 0xf4, 0x73, 0x9c, 0xa9, 0x05, 0xdf, 0x00, 0xdc, + 0x74, 0x78, 0xfa, 0xf8, 0x35, 0x60, 0x59, 0x02, 0x13, 0x18, 0x7c, + 0xbc, 0xfb, 0x4d, 0xb0, 0x20, 0x6d, 0x43, 0xbb, 0x60, 0x30, 0x7a, + 0x67, 0x33, 0x5c, 0xc5, 0x99, 0xd1, 0xf8, 0x2d, 0x39, 0x52, 0x73, + 0xfb, 0x8c, 0xaa, 0x97, 0x25, 0x5c, 0x72, 0xd9, 0x08, 0x1e, 0xab, + 0x4e, 0x3c, 0xe3, 0x81, 0x31, 0x9f, 0x03, 0xa6, 0xfb, 0xc0, 0xfe, + 0x29, 0x88, 0x55, 0xda, 0x84, 0xd5, 0x50, 0x03, 0xb6, 0xe2, 0x84, + 0xa3, 0xa6, 0x36, 0xaa, 0x11, 0x3a, 0x01, 0xe1, 0x18, 0x4b, 0xd6, + 0x44, 0x68, 0xb3, 0x3d, 0xf9, 0x53, 0x74, 0x84, 0xb3, 0x46, 0x91, + 0x46, 0x96, 0x00, 0xb7, 0x80, 0x2c, 0xb6, 0xe1, 0xe3, 0x10, 0xe2, + 0xdb, 0xa2, 0xe7, 0x28, 0x8f, 0x01, 0x96, 0x62, 0x16, 0x3e, 0x00, + 0xe3, 0x1c, 0xa5, 0x36, 0x81, 0x18, 0xa2, 0x4c, 0x52, 0x76, 0xc0, + 0x11, 0xa3, 0x6e, 0xe6, 0x1d, 0xba, 0xe3, 0x5a, 0xbe, 0x36, 0x53, + 0xc5, 0x3e, 0x75, 0x8f, 0x86, 0x69, 0x29, 0x58, 0x53, 0xb5, 0x9c, + 0xbb, 0x6f, 0x9f, 0x5c, 0xc5, 0x18, 0xec, 0xdd, 0x2f, 0xe1, 0x98, + 0xc9, 0xfc, 0xbe, 0xdf, 0x0a, 0x0d, 0x30, 0x82, 0x07, 0xa8, 0x30, + 0x82, 0x06, 0x90, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x11, 0x00, + 0xcc, 0xb8, 0xe7, 0xbf, 0x4e, 0x29, 0x1a, 0xfd, 0xa2, 0xdc, 0x66, + 0xa5, 0x1c, 0x2c, 0x0f, 0x11, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x72, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x48, 0x55, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, + 0x13, 0x08, 0x42, 0x75, 0x64, 0x61, 0x70, 0x65, 0x73, 0x74, 0x31, + 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x4d, + 0x69, 0x63, 0x72, 0x6f, 0x73, 0x65, 0x63, 0x20, 0x4c, 0x74, 0x64, + 0x2e, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, + 0x0b, 0x65, 0x2d, 0x53, 0x7a, 0x69, 0x67, 0x6e, 0x6f, 0x20, 0x43, + 0x41, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, + 0x19, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x65, 0x63, 0x20, 0x65, + 0x2d, 0x53, 0x7a, 0x69, 0x67, 0x6e, 0x6f, 0x20, 0x52, 0x6f, 0x6f, + 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x35, 0x30, + 0x34, 0x30, 0x36, 0x31, 0x32, 0x32, 0x38, 0x34, 0x34, 0x5a, 0x17, + 0x0d, 0x31, 0x37, 0x30, 0x34, 0x30, 0x36, 0x31, 0x32, 0x32, 0x38, + 0x34, 0x34, 0x5a, 0x30, 0x72, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x48, 0x55, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x08, 0x42, 0x75, 0x64, 0x61, 0x70, 0x65, 0x73, 0x74, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, @@ -8101,596 +6181,554 @@ static const unsigned char ca_bundle_data[] = { 0x67, 0x6e, 0x6f, 0x20, 0x43, 0x41, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x19, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x65, 0x63, 0x20, 0x65, 0x2d, 0x53, 0x7a, 0x69, 0x67, 0x6e, - 0x6f, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x82, 0x11, - 0x00, 0xcc, 0xb8, 0xe7, 0xbf, 0x4e, 0x29, 0x1a, 0xfd, 0xa2, 0xdc, - 0x66, 0xa5, 0x1c, 0x2c, 0x0f, 0x11, 0x30, 0x1d, 0x06, 0x03, 0x55, - 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xc7, 0xa0, 0x49, 0x75, 0x16, - 0x61, 0x84, 0xdb, 0x31, 0x4b, 0x84, 0xd2, 0xf1, 0x37, 0x40, 0x90, - 0xef, 0x4e, 0xdc, 0xf7, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, - 0x01, 0x00, 0xd3, 0x13, 0x9c, 0x66, 0x63, 0x59, 0x2e, 0xca, 0x5c, - 0x70, 0x0c, 0xfc, 0x83, 0xbc, 0x55, 0xb1, 0xf4, 0x8e, 0x07, 0x6c, - 0x66, 0x27, 0xce, 0xc1, 0x3b, 0x20, 0xa9, 0x1c, 0xbb, 0x46, 0x54, - 0x70, 0xee, 0x5a, 0xcc, 0xa0, 0x77, 0xea, 0x68, 0x44, 0x27, 0xeb, - 0xf2, 0x29, 0xdd, 0x77, 0xa9, 0xd5, 0xfb, 0xe3, 0xd4, 0xa7, 0x04, - 0xc4, 0x95, 0xb8, 0x0b, 0xe1, 0x44, 0x68, 0x60, 0x07, 0x43, 0x30, - 0x31, 0x42, 0x61, 0xe5, 0xee, 0xd9, 0xe5, 0x24, 0xd5, 0x1b, 0xdf, - 0xe1, 0x4a, 0x1b, 0xaa, 0x9f, 0xc7, 0x5f, 0xf8, 0x7a, 0x11, 0xea, - 0x13, 0x93, 0x00, 0xca, 0x8a, 0x58, 0xb1, 0xee, 0xed, 0x0e, 0x4d, - 0xb4, 0xd7, 0xa8, 0x36, 0x26, 0x7c, 0xe0, 0x3a, 0xc1, 0xd5, 0x57, - 0x82, 0xf1, 0x75, 0xb6, 0xfd, 0x89, 0x5f, 0xda, 0xf3, 0xa8, 0x38, - 0x9f, 0x35, 0x06, 0x08, 0xce, 0x22, 0x95, 0xbe, 0xcd, 0xd5, 0xfc, - 0xbe, 0x5b, 0xde, 0x79, 0x6b, 0xdc, 0x7a, 0xa9, 0x65, 0x66, 0xbe, - 0xb1, 0x25, 0x5a, 0x5f, 0xed, 0x7e, 0xd3, 0xac, 0x46, 0x6d, 0x4c, - 0xf4, 0x32, 0x87, 0xb4, 0x20, 0x04, 0xe0, 0x6c, 0x78, 0xb0, 0x77, - 0xd1, 0x85, 0x46, 0x4b, 0xa6, 0x12, 0xb7, 0x75, 0xe8, 0x4a, 0xc9, - 0x56, 0x6c, 0xd7, 0x92, 0xab, 0x9d, 0xf5, 0x49, 0x38, 0xd2, 0x4f, - 0x53, 0xe3, 0x55, 0x90, 0x11, 0xdb, 0x98, 0x96, 0xc6, 0x49, 0xf2, - 0x3e, 0xf4, 0x9f, 0x1b, 0xe0, 0xf7, 0x88, 0xdc, 0x25, 0x62, 0x99, - 0x44, 0xd8, 0x73, 0xbf, 0x3f, 0x30, 0xf3, 0x0c, 0x37, 0x3e, 0xd4, - 0xc2, 0x28, 0x80, 0x73, 0xb1, 0x01, 0xb7, 0x9d, 0x5a, 0x96, 0x14, - 0x01, 0x4b, 0xa9, 0x11, 0x9d, 0x29, 0x6a, 0x2e, 0xd0, 0x5d, 0x81, - 0xc0, 0xcf, 0xb2, 0x20, 0x43, 0xc7, 0x03, 0xe0, 0x37, 0x4e, 0x5d, - 0x0a, 0xdc, 0x59, 0x20, 0x25, 0x30, 0x82, 0x03, 0xa8, 0x30, 0x82, - 0x02, 0x90, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0xfe, - 0xdc, 0xe3, 0x01, 0x0f, 0xc9, 0x48, 0xff, 0x30, 0x0d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, - 0x30, 0x34, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x46, 0x52, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x0c, 0x09, 0x44, 0x68, 0x69, 0x6d, 0x79, 0x6f, 0x74, - 0x69, 0x73, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x03, - 0x0c, 0x08, 0x43, 0x65, 0x72, 0x74, 0x69, 0x67, 0x6e, 0x61, 0x30, - 0x1e, 0x17, 0x0d, 0x30, 0x37, 0x30, 0x36, 0x32, 0x39, 0x31, 0x35, - 0x31, 0x33, 0x30, 0x35, 0x5a, 0x17, 0x0d, 0x32, 0x37, 0x30, 0x36, - 0x32, 0x39, 0x31, 0x35, 0x31, 0x33, 0x30, 0x35, 0x5a, 0x30, 0x34, - 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x46, 0x52, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x0c, 0x09, 0x44, 0x68, 0x69, 0x6d, 0x79, 0x6f, 0x74, 0x69, 0x73, - 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x08, - 0x43, 0x65, 0x72, 0x74, 0x69, 0x67, 0x6e, 0x61, 0x30, 0x82, 0x01, - 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, - 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xc8, 0x68, 0xf1, - 0xc9, 0xd6, 0xd6, 0xb3, 0x34, 0x75, 0x26, 0x82, 0x1e, 0xec, 0xb4, - 0xbe, 0xea, 0x5c, 0xe1, 0x26, 0xed, 0x11, 0x47, 0x61, 0xe1, 0xa2, - 0x7c, 0x16, 0x78, 0x40, 0x21, 0xe4, 0x60, 0x9e, 0x5a, 0xc8, 0x63, - 0xe1, 0xc4, 0xb1, 0x96, 0x92, 0xff, 0x18, 0x6d, 0x69, 0x23, 0xe1, - 0x2b, 0x62, 0xf7, 0xdd, 0xe2, 0x36, 0x2f, 0x91, 0x07, 0xb9, 0x48, - 0xcf, 0x0e, 0xec, 0x79, 0xb6, 0x2c, 0xe7, 0x34, 0x4b, 0x70, 0x08, - 0x25, 0xa3, 0x3c, 0x87, 0x1b, 0x19, 0xf2, 0x81, 0x07, 0x0f, 0x38, - 0x90, 0x19, 0xd3, 0x11, 0xfe, 0x86, 0xb4, 0xf2, 0xd1, 0x5e, 0x1e, - 0x1e, 0x96, 0xcd, 0x80, 0x6c, 0xce, 0x3b, 0x31, 0x93, 0xb6, 0xf2, - 0xa0, 0xd0, 0xa9, 0x95, 0x12, 0x7d, 0xa5, 0x9a, 0xcc, 0x6b, 0xc8, - 0x84, 0x56, 0x8a, 0x33, 0xa9, 0xe7, 0x22, 0x15, 0x53, 0x16, 0xf0, - 0xcc, 0x17, 0xec, 0x57, 0x5f, 0xe9, 0xa2, 0x0a, 0x98, 0x09, 0xde, - 0xe3, 0x5f, 0x9c, 0x6f, 0xdc, 0x48, 0xe3, 0x85, 0x0b, 0x15, 0x5a, - 0xa6, 0xba, 0x9f, 0xac, 0x48, 0xe3, 0x09, 0xb2, 0xf7, 0xf4, 0x32, - 0xde, 0x5e, 0x34, 0xbe, 0x1c, 0x78, 0x5d, 0x42, 0x5b, 0xce, 0x0e, - 0x22, 0x8f, 0x4d, 0x90, 0xd7, 0x7d, 0x32, 0x18, 0xb3, 0x0b, 0x2c, - 0x6a, 0xbf, 0x8e, 0x3f, 0x14, 0x11, 0x89, 0x20, 0x0e, 0x77, 0x14, - 0xb5, 0x3d, 0x94, 0x08, 0x87, 0xf7, 0x25, 0x1e, 0xd5, 0xb2, 0x60, - 0x00, 0xec, 0x6f, 0x2a, 0x28, 0x25, 0x6e, 0x2a, 0x3e, 0x18, 0x63, - 0x17, 0x25, 0x3f, 0x3e, 0x44, 0x20, 0x16, 0xf6, 0x26, 0xc8, 0x25, - 0xae, 0x05, 0x4a, 0xb4, 0xe7, 0x63, 0x2c, 0xf3, 0x8c, 0x16, 0x53, - 0x7e, 0x5c, 0xfb, 0x11, 0x1a, 0x08, 0xc1, 0x46, 0x62, 0x9f, 0x22, - 0xb8, 0xf1, 0xc2, 0x8d, 0x69, 0xdc, 0xfa, 0x3a, 0x58, 0x06, 0xdf, - 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xbc, 0x30, 0x81, 0xb9, - 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, - 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, - 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x1a, 0xed, 0xfe, 0x41, 0x39, - 0x90, 0xb4, 0x24, 0x59, 0xbe, 0x01, 0xf2, 0x52, 0xd5, 0x45, 0xf6, - 0x5a, 0x39, 0xdc, 0x11, 0x30, 0x64, 0x06, 0x03, 0x55, 0x1d, 0x23, - 0x04, 0x5d, 0x30, 0x5b, 0x80, 0x14, 0x1a, 0xed, 0xfe, 0x41, 0x39, - 0x90, 0xb4, 0x24, 0x59, 0xbe, 0x01, 0xf2, 0x52, 0xd5, 0x45, 0xf6, - 0x5a, 0x39, 0xdc, 0x11, 0xa1, 0x38, 0xa4, 0x36, 0x30, 0x34, 0x31, - 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x46, - 0x52, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, - 0x09, 0x44, 0x68, 0x69, 0x6d, 0x79, 0x6f, 0x74, 0x69, 0x73, 0x31, - 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x08, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x67, 0x6e, 0x61, 0x82, 0x09, 0x00, 0xfe, - 0xdc, 0xe3, 0x01, 0x0f, 0xc9, 0x48, 0xff, 0x30, 0x0e, 0x06, 0x03, - 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, - 0x06, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, - 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, 0x00, 0x07, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, - 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x85, 0x03, 0x1e, 0x92, - 0x71, 0xf6, 0x42, 0xaf, 0xe1, 0xa3, 0x61, 0x9e, 0xeb, 0xf3, 0xc0, - 0x0f, 0xf2, 0xa5, 0xd4, 0xda, 0x95, 0xe6, 0xd6, 0xbe, 0x68, 0x36, - 0x3d, 0x7e, 0x6e, 0x1f, 0x4c, 0x8a, 0xef, 0xd1, 0x0f, 0x21, 0x6d, - 0x5e, 0xa5, 0x52, 0x63, 0xce, 0x12, 0xf8, 0xef, 0x2a, 0xda, 0x6f, - 0xeb, 0x37, 0xfe, 0x13, 0x02, 0xc7, 0xcb, 0x3b, 0x3e, 0x22, 0x6b, - 0xda, 0x61, 0x2e, 0x7f, 0xd4, 0x72, 0x3d, 0xdd, 0x30, 0xe1, 0x1e, - 0x4c, 0x40, 0x19, 0x8c, 0x0f, 0xd7, 0x9c, 0xd1, 0x83, 0x30, 0x7b, - 0x98, 0x59, 0xdc, 0x7d, 0xc6, 0xb9, 0x0c, 0x29, 0x4c, 0xa1, 0x33, - 0xa2, 0xeb, 0x67, 0x3a, 0x65, 0x84, 0xd3, 0x96, 0xe2, 0xed, 0x76, - 0x45, 0x70, 0x8f, 0xb5, 0x2b, 0xde, 0xf9, 0x23, 0xd6, 0x49, 0x6e, - 0x3c, 0x14, 0xb5, 0xc6, 0x9f, 0x35, 0x1e, 0x50, 0xd0, 0xc1, 0x8f, - 0x6a, 0x70, 0x44, 0x02, 0x62, 0xcb, 0xae, 0x1d, 0x68, 0x41, 0xa7, - 0xaa, 0x57, 0xe8, 0x53, 0xaa, 0x07, 0xd2, 0x06, 0xf6, 0xd5, 0x14, - 0x06, 0x0b, 0x91, 0x03, 0x75, 0x2c, 0x6c, 0x72, 0xb5, 0x61, 0x95, - 0x9a, 0x0d, 0x8b, 0xb9, 0x0d, 0xe7, 0xf5, 0xdf, 0x54, 0xcd, 0xde, - 0xe6, 0xd8, 0xd6, 0x09, 0x08, 0x97, 0x63, 0xe5, 0xc1, 0x2e, 0xb0, - 0xb7, 0x44, 0x26, 0xc0, 0x26, 0xc0, 0xaf, 0x55, 0x30, 0x9e, 0x3b, - 0xd5, 0x36, 0x2a, 0x19, 0x04, 0xf4, 0x5c, 0x1e, 0xff, 0xcf, 0x2c, - 0xb7, 0xff, 0xd0, 0xfd, 0x87, 0x40, 0x11, 0xd5, 0x11, 0x23, 0xbb, - 0x48, 0xc0, 0x21, 0xa9, 0xa4, 0x28, 0x2d, 0xfd, 0x15, 0xf8, 0xb0, - 0x4e, 0x2b, 0xf4, 0x30, 0x5b, 0x21, 0xfc, 0x11, 0x91, 0x34, 0xbe, - 0x41, 0xef, 0x7b, 0x9d, 0x97, 0x75, 0xff, 0x97, 0x95, 0xc0, 0x96, - 0x58, 0x2f, 0xea, 0xbb, 0x46, 0xd7, 0xbb, 0xe4, 0xd9, 0x2e, 0x30, - 0x82, 0x06, 0x66, 0x30, 0x82, 0x04, 0x4e, 0xa0, 0x03, 0x02, 0x01, - 0x02, 0x02, 0x0f, 0x07, 0x7e, 0x52, 0x93, 0x7b, 0xe0, 0x15, 0xe3, - 0x57, 0xf0, 0x69, 0x8c, 0xcb, 0xec, 0x0c, 0x30, 0x0d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, - 0x30, 0x7b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x43, 0x4f, 0x31, 0x47, 0x30, 0x45, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x0c, 0x3e, 0x53, 0x6f, 0x63, 0x69, 0x65, 0x64, 0x61, - 0x64, 0x20, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x64, - 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x20, 0x44, 0x69, 0x67, 0x69, 0x74, - 0x61, 0x6c, 0x20, 0x2d, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x63, - 0xc3, 0xa1, 0x6d, 0x61, 0x72, 0x61, 0x20, 0x53, 0x2e, 0x41, 0x2e, - 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1a, - 0x41, 0x43, 0x20, 0x52, 0x61, 0xc3, 0xad, 0x7a, 0x20, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x63, 0xc3, 0xa1, 0x6d, 0x61, 0x72, 0x61, 0x20, - 0x53, 0x2e, 0x41, 0x2e, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, - 0x31, 0x32, 0x37, 0x32, 0x30, 0x34, 0x36, 0x32, 0x39, 0x5a, 0x17, - 0x0d, 0x33, 0x30, 0x30, 0x34, 0x30, 0x32, 0x32, 0x31, 0x34, 0x32, - 0x30, 0x32, 0x5a, 0x30, 0x7b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, - 0x55, 0x04, 0x06, 0x13, 0x02, 0x43, 0x4f, 0x31, 0x47, 0x30, 0x45, - 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x3e, 0x53, 0x6f, 0x63, 0x69, - 0x65, 0x64, 0x61, 0x64, 0x20, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, - 0x6c, 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x20, 0x44, 0x69, - 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x2d, 0x20, 0x43, 0x65, 0x72, - 0x74, 0x69, 0x63, 0xc3, 0xa1, 0x6d, 0x61, 0x72, 0x61, 0x20, 0x53, - 0x2e, 0x41, 0x2e, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x0c, 0x1a, 0x41, 0x43, 0x20, 0x52, 0x61, 0xc3, 0xad, 0x7a, - 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x63, 0xc3, 0xa1, 0x6d, 0x61, - 0x72, 0x61, 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x30, 0x82, 0x02, 0x22, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, - 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xab, 0x6b, 0x89, 0xa3, - 0x53, 0xcc, 0x48, 0x23, 0x08, 0xfb, 0xc3, 0xcf, 0x51, 0x96, 0x08, - 0x2e, 0xb8, 0x08, 0x7a, 0x6d, 0x3c, 0x90, 0x17, 0x86, 0xa9, 0xe9, - 0xed, 0x2e, 0x13, 0x34, 0x47, 0xb2, 0xd0, 0x70, 0xdc, 0xc9, 0x3c, - 0xd0, 0x8d, 0xca, 0xee, 0x4b, 0x17, 0xab, 0xd0, 0x85, 0xb0, 0xa7, - 0x23, 0x04, 0xcb, 0xa8, 0xa2, 0xfc, 0xe5, 0x75, 0xdb, 0x40, 0xca, - 0x62, 0x89, 0x8f, 0x50, 0x9e, 0x01, 0x3d, 0x26, 0x5b, 0x18, 0x84, - 0x1c, 0xcb, 0x7c, 0x37, 0xb7, 0x7d, 0xec, 0xd3, 0x7f, 0x73, 0x19, - 0xb0, 0x6a, 0xb2, 0xd8, 0x88, 0x8a, 0x2d, 0x45, 0x74, 0xa8, 0xf7, - 0xb3, 0xb8, 0xc0, 0xd4, 0xda, 0xcd, 0x22, 0x89, 0x74, 0x4d, 0x5a, - 0x15, 0x39, 0x73, 0x18, 0x74, 0x4f, 0xb5, 0xeb, 0x99, 0xa7, 0xc1, - 0x1e, 0x88, 0xb4, 0xc2, 0x93, 0x90, 0x63, 0x97, 0xf3, 0xa7, 0xa7, - 0x12, 0xb2, 0x09, 0x22, 0x07, 0x33, 0xd9, 0x91, 0xcd, 0x0e, 0x9c, - 0x1f, 0x0e, 0x20, 0xc7, 0xee, 0xbb, 0x33, 0x8d, 0x8f, 0xc2, 0xd2, - 0x58, 0xa7, 0x5f, 0xfd, 0x65, 0x37, 0xe2, 0x88, 0xc2, 0xd8, 0x8f, - 0x86, 0x75, 0x5e, 0xf9, 0x2d, 0xa7, 0x87, 0x33, 0xf2, 0x78, 0x37, - 0x2f, 0x8b, 0xbc, 0x1d, 0x86, 0x37, 0x39, 0xb1, 0x94, 0xf2, 0xd8, - 0xbc, 0x4a, 0x9c, 0x83, 0x18, 0x5a, 0x06, 0xfc, 0xf3, 0xd4, 0xd4, - 0xba, 0x8c, 0x15, 0x09, 0x25, 0xf0, 0xf9, 0xb6, 0x8d, 0x04, 0x7e, - 0x17, 0x12, 0x33, 0x6b, 0x57, 0x48, 0x4c, 0x4f, 0xdb, 0x26, 0x1e, - 0xeb, 0xcc, 0x90, 0xe7, 0x8b, 0xf9, 0x68, 0x7c, 0x70, 0x0f, 0xa3, - 0x2a, 0xd0, 0x3a, 0x38, 0xdf, 0x37, 0x97, 0xe2, 0x5b, 0xde, 0x80, - 0x61, 0xd3, 0x80, 0xd8, 0x91, 0x83, 0x42, 0x5a, 0x4c, 0x04, 0x89, - 0x68, 0x11, 0x3c, 0xac, 0x5f, 0x68, 0x80, 0x41, 0xcc, 0x60, 0x42, - 0xce, 0x0d, 0x5a, 0x2a, 0x0c, 0x0f, 0x9b, 0x30, 0xc0, 0xa6, 0xf0, - 0x86, 0xdb, 0xab, 0x49, 0xd7, 0x97, 0x6d, 0x48, 0x8b, 0xf9, 0x03, - 0xc0, 0x52, 0x67, 0x9b, 0x12, 0xf7, 0xc2, 0xf2, 0x2e, 0x98, 0x65, - 0x42, 0xd9, 0xd6, 0x9a, 0xe3, 0xd0, 0x19, 0x31, 0x0c, 0xad, 0x87, - 0xd5, 0x57, 0x02, 0x7a, 0x30, 0xe8, 0x86, 0x26, 0xfb, 0x8f, 0x23, - 0x8a, 0x54, 0x87, 0xe4, 0xbf, 0x3c, 0xee, 0xeb, 0xc3, 0x75, 0x48, - 0x5f, 0x1e, 0x39, 0x6f, 0x81, 0x62, 0x6c, 0xc5, 0x2d, 0xc4, 0x17, - 0x54, 0x19, 0xb7, 0x37, 0x8d, 0x9c, 0x37, 0x91, 0xc8, 0xf6, 0x0b, - 0xd5, 0xea, 0x63, 0x6f, 0x83, 0xac, 0x38, 0xc2, 0xf3, 0x3f, 0xde, - 0x9a, 0xfb, 0xe1, 0x23, 0x61, 0xf0, 0xc8, 0x26, 0xcb, 0x36, 0xc8, - 0xa1, 0xf3, 0x30, 0x8f, 0xa4, 0xa3, 0xa2, 0xa1, 0xdd, 0x53, 0xb3, - 0xde, 0xf0, 0x9a, 0x32, 0x1f, 0x83, 0x91, 0x79, 0x30, 0xc1, 0xa9, - 0x1f, 0x53, 0x9b, 0x53, 0xa2, 0x15, 0x53, 0x3f, 0xdd, 0x9d, 0xb3, - 0x10, 0x3b, 0x48, 0x7d, 0x89, 0x0f, 0xfc, 0xed, 0x03, 0xf5, 0xfb, - 0x25, 0x64, 0x75, 0x0e, 0x17, 0x19, 0x0d, 0x8f, 0x00, 0x16, 0x67, - 0x79, 0x7a, 0x40, 0xfc, 0x2d, 0x59, 0x07, 0xd9, 0x90, 0xfa, 0x9a, - 0xad, 0x3d, 0xdc, 0x80, 0x8a, 0xe6, 0x5c, 0x35, 0xa2, 0x67, 0x4c, - 0x11, 0x6b, 0xb1, 0xf8, 0x80, 0x64, 0x00, 0x2d, 0x6f, 0x22, 0x61, - 0xc5, 0xac, 0x4b, 0x26, 0xe5, 0x5a, 0x10, 0x82, 0x9b, 0xa4, 0x83, - 0x7b, 0x34, 0xf7, 0x9e, 0x89, 0x91, 0x20, 0x97, 0x8e, 0xb7, 0x42, - 0xc7, 0x66, 0xc3, 0xd0, 0xe9, 0xa4, 0xd6, 0xf5, 0x20, 0x8d, 0xc4, - 0xc3, 0x95, 0xac, 0x44, 0x0a, 0x9d, 0x5b, 0x73, 0x3c, 0x26, 0x3d, - 0x2f, 0x4a, 0xbe, 0xa7, 0xc9, 0xa7, 0x10, 0x1e, 0xfb, 0x9f, 0x50, - 0x69, 0xf3, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xe6, 0x30, - 0x81, 0xe3, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, - 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, - 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, - 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, - 0x04, 0x14, 0xd1, 0x09, 0xd0, 0xe9, 0xd7, 0xce, 0x79, 0x74, 0x54, - 0xf9, 0x3a, 0x30, 0xb3, 0xf4, 0x6d, 0x2c, 0x03, 0x03, 0x1b, 0x68, - 0x30, 0x81, 0xa0, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x81, 0x98, - 0x30, 0x81, 0x95, 0x30, 0x81, 0x92, 0x06, 0x04, 0x55, 0x1d, 0x20, - 0x00, 0x30, 0x81, 0x89, 0x30, 0x2b, 0x06, 0x08, 0x2b, 0x06, 0x01, - 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x1f, 0x68, 0x74, 0x74, 0x70, - 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x63, 0x65, 0x72, 0x74, - 0x69, 0x63, 0x61, 0x6d, 0x61, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x64, 0x70, 0x63, 0x2f, 0x30, 0x5a, 0x06, 0x08, 0x2b, 0x06, - 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, 0x30, 0x4e, 0x1a, 0x4c, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x65, 0x73, - 0x20, 0x64, 0x65, 0x20, 0x67, 0x61, 0x72, 0x61, 0x6e, 0x74, 0xed, - 0x61, 0x73, 0x20, 0x64, 0x65, 0x20, 0x65, 0x73, 0x74, 0x65, 0x20, - 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x64, 0x6f, - 0x20, 0x73, 0x65, 0x20, 0x70, 0x75, 0x65, 0x64, 0x65, 0x6e, 0x20, - 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x72, 0x20, 0x65, - 0x6e, 0x20, 0x6c, 0x61, 0x20, 0x44, 0x50, 0x43, 0x2e, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, - 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x5c, 0x94, 0xb5, 0xb8, - 0x45, 0x91, 0x4d, 0x8e, 0x61, 0x1f, 0x03, 0x28, 0x0f, 0x53, 0x7c, - 0xe6, 0xa4, 0x59, 0xa9, 0xb3, 0x8a, 0x7a, 0xc5, 0xb0, 0xff, 0x08, - 0x7c, 0x2c, 0xa3, 0x71, 0x1c, 0x21, 0x13, 0x67, 0xa1, 0x95, 0x12, - 0x40, 0x35, 0x83, 0x83, 0x8f, 0x74, 0xdb, 0x33, 0x5c, 0xf0, 0x49, - 0x76, 0x0a, 0x81, 0x52, 0xdd, 0x49, 0xd4, 0x9a, 0x32, 0x33, 0xef, - 0x9b, 0xa7, 0xcb, 0x75, 0xe5, 0x7a, 0xcb, 0x97, 0x12, 0x90, 0x5c, - 0xba, 0x7b, 0xc5, 0x9b, 0xdf, 0xbb, 0x39, 0x23, 0xc8, 0xff, 0x98, - 0xce, 0x0a, 0x4d, 0x22, 0x01, 0x48, 0x07, 0x7e, 0x8a, 0xc0, 0xd5, - 0x20, 0x42, 0x94, 0x44, 0xef, 0xbf, 0x77, 0xa2, 0x89, 0x67, 0x48, - 0x1b, 0x40, 0x03, 0x05, 0xa1, 0x89, 0xec, 0xcf, 0x62, 0xe3, 0x3d, - 0x25, 0x76, 0x66, 0xbf, 0x26, 0xb7, 0xbb, 0x22, 0xbe, 0x6f, 0xff, - 0x39, 0x57, 0x74, 0xba, 0x7a, 0xc9, 0x01, 0x95, 0xc1, 0x95, 0x51, - 0xe8, 0xab, 0x2c, 0xf8, 0xb1, 0x86, 0x20, 0xe9, 0x3f, 0xcb, 0x35, - 0x5b, 0xd2, 0x17, 0xe9, 0x2a, 0xfe, 0x83, 0x13, 0x17, 0x40, 0xee, - 0x88, 0x62, 0x65, 0x5b, 0xd5, 0x3b, 0x60, 0xe9, 0x7b, 0x3c, 0xb8, - 0xc9, 0xd5, 0x7f, 0x36, 0x02, 0x25, 0xaa, 0x68, 0xc2, 0x31, 0x15, - 0xb7, 0x30, 0x65, 0xeb, 0x7f, 0x1d, 0x48, 0x79, 0xb1, 0xcf, 0x39, - 0xe2, 0x42, 0x80, 0x16, 0xd3, 0xf5, 0x93, 0x23, 0xfc, 0x4c, 0x97, - 0xc9, 0x5a, 0x37, 0x6c, 0x7c, 0x22, 0xd8, 0x4a, 0xcd, 0xd2, 0x8e, - 0x36, 0x83, 0x39, 0x91, 0x90, 0x10, 0xc8, 0xf1, 0xc9, 0x35, 0x7e, - 0x3f, 0xb8, 0xd3, 0x81, 0xc6, 0x20, 0x64, 0x1a, 0xb6, 0x50, 0xc2, - 0x21, 0xa4, 0x78, 0xdc, 0xd0, 0x2f, 0x3b, 0x64, 0x93, 0x74, 0xf0, - 0x96, 0x90, 0xf1, 0xef, 0xfb, 0x09, 0x5a, 0x34, 0x40, 0x96, 0xf0, - 0x36, 0x12, 0xc1, 0xa3, 0x74, 0x8c, 0x93, 0x7e, 0x41, 0xde, 0x77, - 0x8b, 0xec, 0x86, 0xd9, 0xd2, 0x0f, 0x3f, 0x2d, 0xd1, 0xcc, 0x40, - 0xa2, 0x89, 0x66, 0x48, 0x1e, 0x20, 0xb3, 0x9c, 0x23, 0x59, 0x73, - 0xa9, 0x44, 0x73, 0xbc, 0x24, 0x79, 0x90, 0x56, 0x37, 0xb3, 0xc6, - 0x29, 0x7e, 0xa3, 0x0f, 0xf1, 0x29, 0x39, 0xef, 0x7e, 0x5c, 0x28, - 0x32, 0x70, 0x35, 0xac, 0xda, 0xb8, 0xc8, 0x75, 0x66, 0xfc, 0x9b, - 0x4c, 0x39, 0x47, 0x8e, 0x1b, 0x6f, 0x9b, 0x4d, 0x02, 0x54, 0x22, - 0x33, 0xef, 0x61, 0xba, 0x9e, 0x29, 0x84, 0xef, 0x4e, 0x4b, 0x33, - 0x47, 0x76, 0x97, 0x6a, 0xcb, 0x7e, 0x5f, 0xfd, 0x15, 0xa6, 0x9e, - 0x42, 0x43, 0x5b, 0x66, 0x5a, 0x8a, 0x88, 0x0d, 0xf7, 0x16, 0xb9, - 0x3f, 0x51, 0x65, 0x2b, 0x66, 0x6a, 0x8b, 0xd1, 0x38, 0x52, 0xa2, - 0xd6, 0x46, 0x11, 0xfa, 0xfc, 0x9a, 0x1c, 0x74, 0x9e, 0x8f, 0x97, - 0x0b, 0x02, 0x4f, 0x64, 0xc6, 0xf5, 0x68, 0xd3, 0x4b, 0x2d, 0xff, - 0xa4, 0x37, 0x1e, 0x8b, 0x3f, 0xbf, 0x44, 0xbe, 0x61, 0x46, 0xa1, - 0x84, 0x3d, 0x08, 0x27, 0x4c, 0x81, 0x20, 0x77, 0x89, 0x08, 0xea, - 0x67, 0x40, 0x5e, 0x6c, 0x08, 0x51, 0x5f, 0x34, 0x5a, 0x8c, 0x96, - 0x68, 0xcd, 0xd7, 0xf7, 0x89, 0xc2, 0x1c, 0xd3, 0x32, 0x00, 0xaf, - 0x52, 0xcb, 0xd3, 0x60, 0x5b, 0x2a, 0x3a, 0x47, 0x7e, 0x6b, 0x30, - 0x33, 0xa1, 0x62, 0x29, 0x7f, 0x4a, 0xb9, 0xe1, 0x2d, 0xe7, 0x14, - 0x23, 0x0e, 0x0e, 0x18, 0x47, 0xe1, 0x79, 0xfc, 0x15, 0x55, 0xd0, - 0xb1, 0xfc, 0x25, 0x71, 0x63, 0x75, 0x33, 0x1c, 0x23, 0x2b, 0xaf, - 0x5c, 0xd9, 0xed, 0x47, 0x77, 0x60, 0x0e, 0x3b, 0x0f, 0x1e, 0xd2, - 0xc0, 0xdc, 0x64, 0x05, 0x89, 0xfc, 0x78, 0xd6, 0x5c, 0x2c, 0x26, - 0x43, 0xa9, 0x30, 0x82, 0x04, 0xaa, 0x30, 0x82, 0x03, 0x92, 0xa0, - 0x03, 0x02, 0x01, 0x02, 0x02, 0x0e, 0x2e, 0x6a, 0x00, 0x01, 0x00, - 0x02, 0x1f, 0xd7, 0x52, 0x21, 0x2c, 0x11, 0x5c, 0x3b, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, - 0x05, 0x00, 0x30, 0x76, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, 0x1c, 0x30, 0x1a, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x13, 0x13, 0x54, 0x43, 0x20, 0x54, 0x72, - 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x47, - 0x6d, 0x62, 0x48, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, - 0x0b, 0x13, 0x19, 0x54, 0x43, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, - 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x20, 0x32, 0x20, 0x43, 0x41, 0x31, 0x25, 0x30, 0x23, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x13, 0x1c, 0x54, 0x43, 0x20, 0x54, 0x72, - 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x43, - 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x43, 0x41, 0x20, 0x49, - 0x49, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x30, 0x31, 0x31, 0x32, - 0x31, 0x34, 0x33, 0x38, 0x34, 0x33, 0x5a, 0x17, 0x0d, 0x32, 0x35, - 0x31, 0x32, 0x33, 0x31, 0x32, 0x32, 0x35, 0x39, 0x35, 0x39, 0x5a, - 0x30, 0x76, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x44, 0x45, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x13, 0x13, 0x54, 0x43, 0x20, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x47, 0x6d, 0x62, - 0x48, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, - 0x19, 0x54, 0x43, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x65, - 0x6e, 0x74, 0x65, 0x72, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, - 0x32, 0x20, 0x43, 0x41, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, - 0x04, 0x03, 0x13, 0x1c, 0x54, 0x43, 0x20, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x43, 0x6c, 0x61, - 0x73, 0x73, 0x20, 0x32, 0x20, 0x43, 0x41, 0x20, 0x49, 0x49, 0x30, - 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, - 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xab, - 0x80, 0x87, 0x9b, 0x8e, 0xf0, 0xc3, 0x7c, 0x87, 0xd7, 0xe8, 0x24, - 0x82, 0x11, 0xb3, 0x3c, 0xdd, 0x43, 0x62, 0xee, 0xf8, 0xc3, 0x45, - 0xda, 0xe8, 0xe1, 0xa0, 0x5f, 0xd1, 0x2a, 0xb2, 0xea, 0x93, 0x68, - 0xdf, 0xb4, 0xc8, 0xd6, 0x43, 0xe9, 0xc4, 0x75, 0x59, 0x7f, 0xfc, - 0xe1, 0x1d, 0xf8, 0x31, 0x70, 0x23, 0x1b, 0x88, 0x9e, 0x27, 0xb9, - 0x7b, 0xfd, 0x3a, 0xd2, 0xc9, 0xa9, 0xe9, 0x14, 0x2f, 0x90, 0xbe, - 0x03, 0x52, 0xc1, 0x49, 0xcd, 0xf6, 0xfd, 0xe4, 0x08, 0x66, 0x0b, - 0x57, 0x8a, 0xa2, 0x42, 0xa0, 0xb8, 0xd5, 0x7f, 0x69, 0x5c, 0x90, - 0x32, 0xb2, 0x97, 0x0d, 0xca, 0x4a, 0xdc, 0x46, 0x3e, 0x02, 0x55, - 0x89, 0x53, 0xe3, 0x1a, 0x5a, 0xcb, 0x36, 0xc6, 0x07, 0x56, 0xf7, - 0x8c, 0xcf, 0x11, 0xf4, 0x4c, 0xbb, 0x30, 0x70, 0x04, 0x95, 0xa5, - 0xf6, 0x39, 0x8c, 0xfd, 0x73, 0x81, 0x08, 0x7d, 0x89, 0x5e, 0x32, - 0x1e, 0x22, 0xa9, 0x22, 0x45, 0x4b, 0xb0, 0x66, 0x2e, 0x30, 0xcc, - 0x9f, 0x65, 0xfd, 0xfc, 0xcb, 0x81, 0xa9, 0xf1, 0xe0, 0x3b, 0xaf, - 0xa3, 0x86, 0xd1, 0x89, 0xea, 0xc4, 0x45, 0x79, 0x50, 0x5d, 0xae, - 0xe9, 0x21, 0x74, 0x92, 0x4d, 0x8b, 0x59, 0x82, 0x8f, 0x94, 0xe3, - 0xe9, 0x4a, 0xf1, 0xe7, 0x49, 0xb0, 0x14, 0xe3, 0xf5, 0x62, 0xcb, - 0xd5, 0x72, 0xbd, 0x1f, 0xb9, 0xd2, 0x9f, 0xa0, 0xcd, 0xa8, 0xfa, - 0x01, 0xc8, 0xd9, 0x0d, 0xdf, 0xda, 0xfc, 0x47, 0x9d, 0xb3, 0xc8, - 0x54, 0xdf, 0x49, 0x4a, 0xf1, 0x21, 0xa9, 0xfe, 0x18, 0x4e, 0xee, - 0x48, 0xd4, 0x19, 0xbb, 0xef, 0x7d, 0xe4, 0xe2, 0x9d, 0xcb, 0x5b, - 0xb6, 0x6e, 0xff, 0xe3, 0xcd, 0x5a, 0xe7, 0x74, 0x82, 0x05, 0xba, - 0x80, 0x25, 0x38, 0xcb, 0xe4, 0x69, 0x9e, 0xaf, 0x41, 0xaa, 0x1a, - 0x84, 0xf5, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x34, - 0x30, 0x82, 0x01, 0x30, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, - 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, - 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, - 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, - 0x04, 0x16, 0x04, 0x14, 0xe3, 0xab, 0x54, 0x4c, 0x80, 0xa1, 0xdb, - 0x56, 0x43, 0xb7, 0x91, 0x4a, 0xcb, 0xf3, 0x82, 0x7a, 0x13, 0x5c, - 0x08, 0xab, 0x30, 0x81, 0xed, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, - 0x81, 0xe5, 0x30, 0x81, 0xe2, 0x30, 0x81, 0xdf, 0xa0, 0x81, 0xdc, - 0xa0, 0x81, 0xd9, 0x86, 0x35, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, - 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x63, - 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x2f, 0x63, 0x72, - 0x6c, 0x2f, 0x76, 0x32, 0x2f, 0x74, 0x63, 0x5f, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x5f, 0x32, 0x5f, 0x63, 0x61, 0x5f, 0x49, 0x49, 0x2e, - 0x63, 0x72, 0x6c, 0x86, 0x81, 0x9f, 0x6c, 0x64, 0x61, 0x70, 0x3a, - 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74, 0x72, 0x75, 0x73, 0x74, - 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x2f, 0x43, - 0x4e, 0x3d, 0x54, 0x43, 0x25, 0x32, 0x30, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x25, 0x32, 0x30, 0x43, - 0x6c, 0x61, 0x73, 0x73, 0x25, 0x32, 0x30, 0x32, 0x25, 0x32, 0x30, - 0x43, 0x41, 0x25, 0x32, 0x30, 0x49, 0x49, 0x2c, 0x4f, 0x3d, 0x54, - 0x43, 0x25, 0x32, 0x30, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x65, - 0x6e, 0x74, 0x65, 0x72, 0x25, 0x32, 0x30, 0x47, 0x6d, 0x62, 0x48, - 0x2c, 0x4f, 0x55, 0x3d, 0x72, 0x6f, 0x6f, 0x74, 0x63, 0x65, 0x72, - 0x74, 0x73, 0x2c, 0x44, 0x43, 0x3d, 0x74, 0x72, 0x75, 0x73, 0x74, - 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2c, 0x44, 0x43, 0x3d, 0x64, - 0x65, 0x3f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x3f, 0x62, 0x61, 0x73, 0x65, 0x3f, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x8c, 0xd7, - 0xdf, 0x7e, 0xee, 0x1b, 0x80, 0x10, 0xb3, 0x83, 0xf5, 0xdb, 0x11, - 0xea, 0x6b, 0x4b, 0xa8, 0x92, 0x18, 0xd9, 0xf7, 0x07, 0x39, 0xf5, - 0x2c, 0xbe, 0x06, 0x75, 0x7a, 0x68, 0x53, 0x15, 0x1c, 0xea, 0x4a, - 0xed, 0x5e, 0xfc, 0x23, 0xb2, 0x13, 0xa0, 0xd3, 0x09, 0xff, 0xf6, - 0xf6, 0x2e, 0x6b, 0x41, 0x71, 0x79, 0xcd, 0xe2, 0x6d, 0xfd, 0xae, - 0x59, 0x6b, 0x85, 0x1d, 0xb8, 0x4e, 0x22, 0x9a, 0xed, 0x66, 0x39, - 0x6e, 0x4b, 0x94, 0xe6, 0x55, 0xfc, 0x0b, 0x1b, 0x8b, 0x77, 0xc1, - 0x53, 0x13, 0x66, 0x89, 0xd9, 0x28, 0xd6, 0x8b, 0xf3, 0x45, 0x4a, - 0x63, 0xb7, 0xfd, 0x7b, 0x0b, 0x61, 0x5d, 0xb8, 0x6d, 0xbe, 0xc3, - 0xdc, 0x5b, 0x79, 0xd2, 0xed, 0x86, 0xe5, 0xa2, 0x4d, 0xbe, 0x5e, - 0x74, 0x7c, 0x6a, 0xed, 0x16, 0x38, 0x1f, 0x7f, 0x58, 0x81, 0x5a, - 0x1a, 0xeb, 0x32, 0x88, 0x2d, 0xb2, 0xf3, 0x39, 0x77, 0x80, 0xaf, - 0x5e, 0xb6, 0x61, 0x75, 0x29, 0xdb, 0x23, 0x4d, 0x88, 0xca, 0x50, - 0x28, 0xcb, 0x85, 0xd2, 0xd3, 0x10, 0xa2, 0x59, 0x6e, 0xd3, 0x93, - 0x54, 0x00, 0x7a, 0xa2, 0x46, 0x95, 0x86, 0x05, 0x9c, 0xa9, 0x19, - 0x98, 0xe5, 0x31, 0x72, 0x0c, 0x00, 0xe2, 0x67, 0xd9, 0x40, 0xe0, - 0x24, 0x33, 0x7b, 0x6f, 0x2c, 0xb9, 0x5c, 0xab, 0x65, 0x9d, 0x2c, - 0xac, 0x76, 0xea, 0x35, 0x99, 0xf5, 0x97, 0xb9, 0x0f, 0x24, 0xec, - 0xc7, 0x76, 0x21, 0x28, 0x65, 0xae, 0x57, 0xe8, 0x07, 0x88, 0x75, - 0x4a, 0x56, 0xa0, 0xd2, 0x05, 0x3a, 0xa4, 0xe6, 0x8d, 0x92, 0x88, - 0x2c, 0xf3, 0xf2, 0xe1, 0xc1, 0xc6, 0x61, 0xdb, 0x41, 0xc5, 0xc7, - 0x9b, 0xf7, 0x0e, 0x1a, 0x51, 0x45, 0xc2, 0x61, 0x6b, 0xdc, 0x64, - 0x27, 0x17, 0x8c, 0x5a, 0xb7, 0xda, 0x74, 0x28, 0xcd, 0x97, 0xe4, - 0xbd, 0x30, 0x82, 0x04, 0xaa, 0x30, 0x82, 0x03, 0x92, 0xa0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x0e, 0x4a, 0x47, 0x00, 0x01, 0x00, 0x02, - 0xe5, 0xa0, 0x5d, 0xd6, 0x3f, 0x00, 0x51, 0xbf, 0x30, 0x0d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, - 0x00, 0x30, 0x76, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x13, 0x54, 0x43, 0x20, 0x54, 0x72, 0x75, - 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x47, 0x6d, - 0x62, 0x48, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0b, - 0x13, 0x19, 0x54, 0x43, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, - 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, - 0x20, 0x33, 0x20, 0x43, 0x41, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x13, 0x1c, 0x54, 0x43, 0x20, 0x54, 0x72, 0x75, - 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x43, 0x41, 0x20, 0x49, 0x49, - 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x30, 0x31, 0x31, 0x32, 0x31, - 0x34, 0x34, 0x31, 0x35, 0x37, 0x5a, 0x17, 0x0d, 0x32, 0x35, 0x31, - 0x32, 0x33, 0x31, 0x32, 0x32, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, - 0x76, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, - 0x02, 0x44, 0x45, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x13, 0x54, 0x43, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, - 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x47, 0x6d, 0x62, 0x48, - 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x19, - 0x54, 0x43, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, - 0x74, 0x65, 0x72, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, - 0x20, 0x43, 0x41, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x13, 0x1c, 0x54, 0x43, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, - 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x20, 0x33, 0x20, 0x43, 0x41, 0x20, 0x49, 0x49, 0x30, 0x82, + 0x6f, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, - 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb4, 0xe0, - 0xbb, 0x51, 0xbb, 0x39, 0x5c, 0x8b, 0x04, 0xc5, 0x4c, 0x79, 0x1c, - 0x23, 0x86, 0x31, 0x10, 0x63, 0x43, 0x55, 0x27, 0x3f, 0xc6, 0x45, - 0xc7, 0xa4, 0x3d, 0xec, 0x09, 0x0d, 0x1a, 0x1e, 0x20, 0xc2, 0x56, - 0x1e, 0xde, 0x1b, 0x37, 0x07, 0x30, 0x22, 0x2f, 0x6f, 0xf1, 0x06, - 0xf1, 0xab, 0xad, 0xd6, 0xc8, 0xab, 0x61, 0xa3, 0x2f, 0x43, 0xc4, - 0xb0, 0xb2, 0x2d, 0xfc, 0xc3, 0x96, 0x69, 0x7b, 0x7e, 0x8a, 0xe4, - 0xcc, 0xc0, 0x39, 0x12, 0x90, 0x42, 0x60, 0xc9, 0xcc, 0x35, 0x68, - 0xee, 0xda, 0x5f, 0x90, 0x56, 0x5f, 0xcd, 0x1c, 0x4d, 0x5b, 0x58, - 0x49, 0xeb, 0x0e, 0x01, 0x4f, 0x64, 0xfa, 0x2c, 0x3c, 0x89, 0x58, - 0xd8, 0x2f, 0x2e, 0xe2, 0xb0, 0x68, 0xe9, 0x22, 0x3b, 0x75, 0x89, - 0xd6, 0x44, 0x1a, 0x65, 0xf2, 0x1b, 0x97, 0x26, 0x1d, 0x28, 0x6d, - 0xac, 0xe8, 0xbd, 0x59, 0x1d, 0x2b, 0x24, 0xf6, 0xd6, 0x84, 0x03, - 0x66, 0x88, 0x24, 0x00, 0x78, 0x60, 0xf1, 0xf8, 0xab, 0xfe, 0x02, - 0xb2, 0x6b, 0xfb, 0x22, 0xfb, 0x35, 0xe6, 0x16, 0xd1, 0xad, 0xf6, - 0x2e, 0x12, 0xe4, 0xfa, 0x35, 0x6a, 0xe5, 0x19, 0xb9, 0x5d, 0xdb, - 0x3b, 0x1e, 0x1a, 0xfb, 0xd3, 0xff, 0x15, 0x14, 0x08, 0xd8, 0x09, - 0x6a, 0xba, 0x45, 0x9d, 0x14, 0x79, 0x60, 0x7d, 0xaf, 0x40, 0x8a, - 0x07, 0x73, 0xb3, 0x93, 0x96, 0xd3, 0x74, 0x34, 0x8d, 0x3a, 0x37, - 0x29, 0xde, 0x5c, 0xec, 0xf5, 0xee, 0x2e, 0x31, 0xc2, 0x20, 0xdc, - 0xbe, 0xf1, 0x4f, 0x7f, 0x23, 0x52, 0xd9, 0x5b, 0xe2, 0x64, 0xd9, - 0x9c, 0xaa, 0x07, 0x08, 0xb5, 0x45, 0xbd, 0xd1, 0xd0, 0x31, 0xc1, - 0xab, 0x54, 0x9f, 0xa9, 0xd2, 0xc3, 0x62, 0x60, 0x03, 0xf1, 0xbb, - 0x39, 0x4a, 0x92, 0x4a, 0x3d, 0x0a, 0xb9, 0x9d, 0xc5, 0xa0, 0xfe, - 0x37, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x34, 0x30, - 0x82, 0x01, 0x30, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, - 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, - 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, - 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, - 0x16, 0x04, 0x14, 0xd4, 0xa2, 0xfc, 0x9f, 0xb3, 0xc3, 0xd8, 0x03, - 0xd3, 0x57, 0x5c, 0x07, 0xa4, 0xd0, 0x24, 0xa7, 0xc0, 0xf2, 0x00, - 0xd4, 0x30, 0x81, 0xed, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x81, - 0xe5, 0x30, 0x81, 0xe2, 0x30, 0x81, 0xdf, 0xa0, 0x81, 0xdc, 0xa0, - 0x81, 0xd9, 0x86, 0x35, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, - 0x77, 0x77, 0x77, 0x2e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x63, 0x65, - 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x2f, 0x63, 0x72, 0x6c, - 0x2f, 0x76, 0x32, 0x2f, 0x74, 0x63, 0x5f, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x5f, 0x33, 0x5f, 0x63, 0x61, 0x5f, 0x49, 0x49, 0x2e, 0x63, - 0x72, 0x6c, 0x86, 0x81, 0x9f, 0x6c, 0x64, 0x61, 0x70, 0x3a, 0x2f, - 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x63, - 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x2f, 0x43, 0x4e, - 0x3d, 0x54, 0x43, 0x25, 0x32, 0x30, 0x54, 0x72, 0x75, 0x73, 0x74, - 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x25, 0x32, 0x30, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x25, 0x32, 0x30, 0x33, 0x25, 0x32, 0x30, 0x43, - 0x41, 0x25, 0x32, 0x30, 0x49, 0x49, 0x2c, 0x4f, 0x3d, 0x54, 0x43, - 0x25, 0x32, 0x30, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, - 0x74, 0x65, 0x72, 0x25, 0x32, 0x30, 0x47, 0x6d, 0x62, 0x48, 0x2c, - 0x4f, 0x55, 0x3d, 0x72, 0x6f, 0x6f, 0x74, 0x63, 0x65, 0x72, 0x74, - 0x73, 0x2c, 0x44, 0x43, 0x3d, 0x74, 0x72, 0x75, 0x73, 0x74, 0x63, - 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2c, 0x44, 0x43, 0x3d, 0x64, 0x65, - 0x3f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x4c, 0x69, 0x73, 0x74, 0x3f, 0x62, 0x61, 0x73, 0x65, 0x3f, 0x30, - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x36, 0x60, 0xe4, - 0x70, 0xf7, 0x06, 0x20, 0x43, 0xd9, 0x23, 0x1a, 0x42, 0xf2, 0xf8, - 0xa3, 0xb2, 0xb9, 0x4d, 0x8a, 0xb4, 0xf3, 0xc2, 0x9a, 0x55, 0x31, - 0x7c, 0xc4, 0x3b, 0x67, 0x9a, 0xb4, 0xdf, 0x4d, 0x0e, 0x8a, 0x93, - 0x4a, 0x17, 0x8b, 0x1b, 0x8d, 0xca, 0x89, 0xe1, 0xcf, 0x3a, 0x1e, - 0xac, 0x1d, 0xf1, 0x9c, 0x32, 0xb4, 0x8e, 0x59, 0x76, 0xa2, 0x41, - 0x85, 0x25, 0x37, 0xa0, 0x13, 0xd0, 0xf5, 0x7c, 0x4e, 0xd5, 0xea, - 0x96, 0xe2, 0x6e, 0x72, 0xc1, 0xbb, 0x2a, 0xfe, 0x6c, 0x6e, 0xf8, - 0x91, 0x98, 0x46, 0xfc, 0xc9, 0x1b, 0x57, 0x5b, 0xea, 0xc8, 0x1a, - 0x3b, 0x3f, 0xb0, 0x51, 0x98, 0x3c, 0x07, 0xda, 0x2c, 0x59, 0x01, - 0xda, 0x8b, 0x44, 0xe8, 0xe1, 0x74, 0xfd, 0xa7, 0x68, 0xdd, 0x54, - 0xba, 0x83, 0x46, 0xec, 0xc8, 0x46, 0xb5, 0xf8, 0xaf, 0x97, 0xc0, - 0x3b, 0x09, 0x1c, 0x8f, 0xce, 0x72, 0x96, 0x3d, 0x33, 0x56, 0x70, - 0xbc, 0x96, 0xcb, 0xd8, 0xd5, 0x7d, 0x20, 0x9a, 0x83, 0x9f, 0x1a, - 0xdc, 0x39, 0xf1, 0xc5, 0x72, 0xa3, 0x11, 0x03, 0xfd, 0x3b, 0x42, - 0x52, 0x29, 0xdb, 0xe8, 0x01, 0xf7, 0x9b, 0x5e, 0x8c, 0xd6, 0x8d, - 0x86, 0x4e, 0x19, 0xfa, 0xbc, 0x1c, 0xbe, 0xc5, 0x21, 0xa5, 0x87, - 0x9e, 0x78, 0x2e, 0x36, 0xdb, 0x09, 0x71, 0xa3, 0x72, 0x34, 0xf8, - 0x6c, 0xe3, 0x06, 0x09, 0xf2, 0x5e, 0x56, 0xa5, 0xd3, 0xdd, 0x98, - 0xfa, 0xd4, 0xe6, 0x06, 0xf4, 0xf0, 0xb6, 0x20, 0x63, 0x4b, 0xea, - 0x29, 0xbd, 0xaa, 0x82, 0x66, 0x1e, 0xfb, 0x81, 0xaa, 0xa7, 0x37, - 0xad, 0x13, 0x18, 0xe6, 0x92, 0xc3, 0x81, 0xc1, 0x33, 0xbb, 0x88, - 0x1e, 0xa1, 0xe7, 0xe2, 0xb4, 0xbd, 0x31, 0x6c, 0x0e, 0x51, 0x3d, - 0x6f, 0xfb, 0x96, 0x56, 0x80, 0xe2, 0x36, 0x17, 0xd1, 0xdc, 0xe4, - 0x30, 0x82, 0x03, 0xdd, 0x30, 0x82, 0x02, 0xc5, 0xa0, 0x03, 0x02, - 0x01, 0x02, 0x02, 0x0e, 0x1d, 0xa2, 0x00, 0x01, 0x00, 0x02, 0xec, - 0xb7, 0x60, 0x80, 0x78, 0x8d, 0xb6, 0x06, 0x30, 0x0d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, - 0x30, 0x79, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x44, 0x45, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x13, 0x13, 0x54, 0x43, 0x20, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x47, 0x6d, 0x62, - 0x48, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, - 0x1b, 0x54, 0x43, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x65, - 0x6e, 0x74, 0x65, 0x72, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, - 0x73, 0x61, 0x6c, 0x20, 0x43, 0x41, 0x31, 0x26, 0x30, 0x24, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x13, 0x1d, 0x54, 0x43, 0x20, 0x54, 0x72, - 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x55, - 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x20, 0x43, 0x41, - 0x20, 0x49, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x30, 0x33, 0x32, - 0x32, 0x31, 0x35, 0x35, 0x34, 0x32, 0x38, 0x5a, 0x17, 0x0d, 0x32, - 0x35, 0x31, 0x32, 0x33, 0x31, 0x32, 0x32, 0x35, 0x39, 0x35, 0x39, - 0x5a, 0x30, 0x79, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x13, 0x54, 0x43, 0x20, 0x54, 0x72, 0x75, - 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x47, 0x6d, - 0x62, 0x48, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0b, - 0x13, 0x1b, 0x54, 0x43, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, - 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, - 0x72, 0x73, 0x61, 0x6c, 0x20, 0x43, 0x41, 0x31, 0x26, 0x30, 0x24, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1d, 0x54, 0x43, 0x20, 0x54, + 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xed, 0xc8, + 0x00, 0xd5, 0x81, 0x7b, 0xcd, 0x38, 0x00, 0x47, 0xcc, 0xdb, 0x84, + 0xc1, 0x21, 0x69, 0x2c, 0x74, 0x90, 0x0c, 0x21, 0xd9, 0x53, 0x87, + 0xed, 0x3e, 0x43, 0x44, 0x53, 0xaf, 0xab, 0xf8, 0x80, 0x9b, 0x3c, + 0x78, 0x8d, 0xd4, 0x8d, 0xae, 0xb8, 0xef, 0xd3, 0x11, 0xdc, 0x81, + 0xe6, 0xcf, 0x3b, 0x96, 0x8c, 0xd6, 0x6f, 0x15, 0xc6, 0x77, 0x7e, + 0xa1, 0x2f, 0xe0, 0x5f, 0x92, 0xb6, 0x27, 0xd7, 0x76, 0x9a, 0x1d, + 0x43, 0x3c, 0xea, 0xd9, 0xec, 0x2f, 0xee, 0x39, 0xf3, 0x6a, 0x67, + 0x4b, 0x8b, 0x82, 0xcf, 0x22, 0xf8, 0x65, 0x55, 0xfe, 0x2c, 0xcb, + 0x2f, 0x7d, 0x48, 0x7a, 0x3d, 0x75, 0xf9, 0xaa, 0xa0, 0x27, 0xbb, + 0x78, 0xc2, 0x06, 0xca, 0x51, 0xc2, 0x7e, 0x66, 0x4b, 0xaf, 0xcd, + 0xa2, 0xa7, 0x4d, 0x02, 0x82, 0x3f, 0x82, 0xac, 0x85, 0xc6, 0xe1, + 0x0f, 0x90, 0x47, 0x99, 0x94, 0x0a, 0x71, 0x72, 0x93, 0x2a, 0xc9, + 0xa6, 0xc0, 0xbe, 0x3c, 0x56, 0x4c, 0x73, 0x92, 0x27, 0xf1, 0x6b, + 0xb5, 0xf5, 0xfd, 0xfc, 0x30, 0x05, 0x60, 0x92, 0xc6, 0xeb, 0x96, + 0x7e, 0x01, 0x91, 0xc2, 0x69, 0xb1, 0x1e, 0x1d, 0x7b, 0x53, 0x45, + 0xb8, 0xdc, 0x41, 0x1f, 0xc9, 0x8b, 0x71, 0xd6, 0x54, 0x14, 0xe3, + 0x8b, 0x54, 0x78, 0x3f, 0xbe, 0xf4, 0x62, 0x3b, 0x5b, 0xf5, 0xa3, + 0xec, 0xd5, 0x92, 0x74, 0xe2, 0x74, 0x30, 0xef, 0x01, 0xdb, 0xe1, + 0xd4, 0xab, 0x99, 0x9b, 0x2a, 0x6b, 0xf8, 0xbd, 0xa6, 0x1c, 0x86, + 0x23, 0x42, 0x5f, 0xec, 0x49, 0xde, 0x9a, 0x8b, 0x5b, 0xf4, 0x72, + 0x3a, 0x40, 0xc5, 0x49, 0x3e, 0xa5, 0xbe, 0x8e, 0xaa, 0x71, 0xeb, + 0x6c, 0xfa, 0xf5, 0x1a, 0xe4, 0x6a, 0xfd, 0x7b, 0x7d, 0x55, 0x40, + 0xef, 0x58, 0x6e, 0xe6, 0xd9, 0xd5, 0xbc, 0x24, 0xab, 0xc1, 0xef, + 0xb7, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x04, 0x37, 0x30, + 0x82, 0x04, 0x33, 0x30, 0x67, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, + 0x05, 0x07, 0x01, 0x01, 0x04, 0x5b, 0x30, 0x59, 0x30, 0x28, 0x06, + 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x1c, + 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x72, 0x63, 0x61, + 0x2e, 0x65, 0x2d, 0x73, 0x7a, 0x69, 0x67, 0x6e, 0x6f, 0x2e, 0x68, + 0x75, 0x2f, 0x6f, 0x63, 0x73, 0x70, 0x30, 0x2d, 0x06, 0x08, 0x2b, + 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x21, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x2d, + 0x73, 0x7a, 0x69, 0x67, 0x6e, 0x6f, 0x2e, 0x68, 0x75, 0x2f, 0x52, + 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x2e, 0x63, 0x72, 0x74, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, + 0x03, 0x01, 0x01, 0xff, 0x30, 0x82, 0x01, 0x73, 0x06, 0x03, 0x55, + 0x1d, 0x20, 0x04, 0x82, 0x01, 0x6a, 0x30, 0x82, 0x01, 0x66, 0x30, + 0x82, 0x01, 0x62, 0x06, 0x0c, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x81, + 0xa8, 0x18, 0x02, 0x01, 0x01, 0x01, 0x30, 0x82, 0x01, 0x50, 0x30, + 0x28, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, + 0x16, 0x1c, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, + 0x77, 0x2e, 0x65, 0x2d, 0x73, 0x7a, 0x69, 0x67, 0x6e, 0x6f, 0x2e, + 0x68, 0x75, 0x2f, 0x53, 0x5a, 0x53, 0x5a, 0x2f, 0x30, 0x82, 0x01, + 0x22, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, + 0x30, 0x82, 0x01, 0x14, 0x1e, 0x82, 0x01, 0x10, 0x00, 0x41, 0x00, + 0x20, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6e, 0x00, 0xfa, 0x00, 0x73, + 0x00, 0xed, 0x00, 0x74, 0x00, 0x76, 0x00, 0xe1, 0x00, 0x6e, 0x00, + 0x79, 0x00, 0x20, 0x00, 0xe9, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, + 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x7a, 0x00, 0xe9, 0x00, + 0x73, 0x00, 0xe9, 0x00, 0x68, 0x00, 0x65, 0x00, 0x7a, 0x00, 0x20, + 0x00, 0xe9, 0x00, 0x73, 0x00, 0x20, 0x00, 0x65, 0x00, 0x6c, 0x00, + 0x66, 0x00, 0x6f, 0x00, 0x67, 0x00, 0x61, 0x00, 0x64, 0x00, 0xe1, + 0x00, 0x73, 0x00, 0xe1, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x7a, 0x00, + 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, 0x53, 0x00, 0x7a, 0x00, 0x6f, + 0x00, 0x6c, 0x00, 0x67, 0x00, 0xe1, 0x00, 0x6c, 0x00, 0x74, 0x00, + 0x61, 0x00, 0x74, 0x00, 0xf3, 0x00, 0x20, 0x00, 0x53, 0x00, 0x7a, + 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x67, 0x00, 0xe1, 0x00, 0x6c, 0x00, + 0x74, 0x00, 0x61, 0x00, 0x74, 0x00, 0xe1, 0x00, 0x73, 0x00, 0x69, + 0x00, 0x20, 0x00, 0x53, 0x00, 0x7a, 0x00, 0x61, 0x00, 0x62, 0x00, + 0xe1, 0x00, 0x6c, 0x00, 0x79, 0x00, 0x7a, 0x00, 0x61, 0x00, 0x74, + 0x00, 0x61, 0x00, 0x20, 0x00, 0x73, 0x00, 0x7a, 0x00, 0x65, 0x00, + 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x6b, + 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x65, 0x00, + 0x6c, 0x00, 0x6a, 0x00, 0xe1, 0x00, 0x72, 0x00, 0x6e, 0x00, 0x69, + 0x00, 0x3a, 0x00, 0x20, 0x00, 0x68, 0x00, 0x74, 0x00, 0x74, 0x00, + 0x70, 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x77, 0x00, 0x77, + 0x00, 0x77, 0x00, 0x2e, 0x00, 0x65, 0x00, 0x2d, 0x00, 0x73, 0x00, + 0x7a, 0x00, 0x69, 0x00, 0x67, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x2e, + 0x00, 0x68, 0x00, 0x75, 0x00, 0x2f, 0x00, 0x53, 0x00, 0x5a, 0x00, + 0x53, 0x00, 0x5a, 0x00, 0x2f, 0x30, 0x81, 0xc8, 0x06, 0x03, 0x55, + 0x1d, 0x1f, 0x04, 0x81, 0xc0, 0x30, 0x81, 0xbd, 0x30, 0x81, 0xba, + 0xa0, 0x81, 0xb7, 0xa0, 0x81, 0xb4, 0x86, 0x21, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x2d, 0x73, + 0x7a, 0x69, 0x67, 0x6e, 0x6f, 0x2e, 0x68, 0x75, 0x2f, 0x52, 0x6f, + 0x6f, 0x74, 0x43, 0x41, 0x2e, 0x63, 0x72, 0x6c, 0x86, 0x81, 0x8e, + 0x6c, 0x64, 0x61, 0x70, 0x3a, 0x2f, 0x2f, 0x6c, 0x64, 0x61, 0x70, + 0x2e, 0x65, 0x2d, 0x73, 0x7a, 0x69, 0x67, 0x6e, 0x6f, 0x2e, 0x68, + 0x75, 0x2f, 0x43, 0x4e, 0x3d, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, + 0x65, 0x63, 0x25, 0x32, 0x30, 0x65, 0x2d, 0x53, 0x7a, 0x69, 0x67, + 0x6e, 0x6f, 0x25, 0x32, 0x30, 0x52, 0x6f, 0x6f, 0x74, 0x25, 0x32, + 0x30, 0x43, 0x41, 0x2c, 0x4f, 0x55, 0x3d, 0x65, 0x2d, 0x53, 0x7a, + 0x69, 0x67, 0x6e, 0x6f, 0x25, 0x32, 0x30, 0x43, 0x41, 0x2c, 0x4f, + 0x3d, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x65, 0x63, 0x25, 0x32, + 0x30, 0x4c, 0x74, 0x64, 0x2e, 0x2c, 0x4c, 0x3d, 0x42, 0x75, 0x64, + 0x61, 0x70, 0x65, 0x73, 0x74, 0x2c, 0x43, 0x3d, 0x48, 0x55, 0x3f, + 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, + 0x69, 0x73, 0x74, 0x3b, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x30, + 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, + 0x03, 0x02, 0x01, 0x06, 0x30, 0x81, 0x96, 0x06, 0x03, 0x55, 0x1d, + 0x11, 0x04, 0x81, 0x8e, 0x30, 0x81, 0x8b, 0x81, 0x10, 0x69, 0x6e, + 0x66, 0x6f, 0x40, 0x65, 0x2d, 0x73, 0x7a, 0x69, 0x67, 0x6e, 0x6f, + 0x2e, 0x68, 0x75, 0xa4, 0x77, 0x30, 0x75, 0x31, 0x23, 0x30, 0x21, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1a, 0x4d, 0x69, 0x63, 0x72, + 0x6f, 0x73, 0x65, 0x63, 0x20, 0x65, 0x2d, 0x53, 0x7a, 0x69, 0x67, + 0x6e, 0xc3, 0xb3, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, + 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x0d, + 0x65, 0x2d, 0x53, 0x7a, 0x69, 0x67, 0x6e, 0xc3, 0xb3, 0x20, 0x48, + 0x53, 0x5a, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x13, 0x0d, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x65, 0x63, 0x20, + 0x4b, 0x66, 0x74, 0x2e, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, + 0x04, 0x07, 0x13, 0x08, 0x42, 0x75, 0x64, 0x61, 0x70, 0x65, 0x73, + 0x74, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x48, 0x55, 0x30, 0x81, 0xac, 0x06, 0x03, 0x55, 0x1d, 0x23, + 0x04, 0x81, 0xa4, 0x30, 0x81, 0xa1, 0x80, 0x14, 0xc7, 0xa0, 0x49, + 0x75, 0x16, 0x61, 0x84, 0xdb, 0x31, 0x4b, 0x84, 0xd2, 0xf1, 0x37, + 0x40, 0x90, 0xef, 0x4e, 0xdc, 0xf7, 0xa1, 0x76, 0xa4, 0x74, 0x30, + 0x72, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x48, 0x55, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, + 0x07, 0x13, 0x08, 0x42, 0x75, 0x64, 0x61, 0x70, 0x65, 0x73, 0x74, + 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, + 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x65, 0x63, 0x20, 0x4c, 0x74, + 0x64, 0x2e, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, + 0x13, 0x0b, 0x65, 0x2d, 0x53, 0x7a, 0x69, 0x67, 0x6e, 0x6f, 0x20, + 0x43, 0x41, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x19, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x65, 0x63, 0x20, + 0x65, 0x2d, 0x53, 0x7a, 0x69, 0x67, 0x6e, 0x6f, 0x20, 0x52, 0x6f, + 0x6f, 0x74, 0x20, 0x43, 0x41, 0x82, 0x11, 0x00, 0xcc, 0xb8, 0xe7, + 0xbf, 0x4e, 0x29, 0x1a, 0xfd, 0xa2, 0xdc, 0x66, 0xa5, 0x1c, 0x2c, + 0x0f, 0x11, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, + 0x04, 0x14, 0xc7, 0xa0, 0x49, 0x75, 0x16, 0x61, 0x84, 0xdb, 0x31, + 0x4b, 0x84, 0xd2, 0xf1, 0x37, 0x40, 0x90, 0xef, 0x4e, 0xdc, 0xf7, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xd3, 0x13, + 0x9c, 0x66, 0x63, 0x59, 0x2e, 0xca, 0x5c, 0x70, 0x0c, 0xfc, 0x83, + 0xbc, 0x55, 0xb1, 0xf4, 0x8e, 0x07, 0x6c, 0x66, 0x27, 0xce, 0xc1, + 0x3b, 0x20, 0xa9, 0x1c, 0xbb, 0x46, 0x54, 0x70, 0xee, 0x5a, 0xcc, + 0xa0, 0x77, 0xea, 0x68, 0x44, 0x27, 0xeb, 0xf2, 0x29, 0xdd, 0x77, + 0xa9, 0xd5, 0xfb, 0xe3, 0xd4, 0xa7, 0x04, 0xc4, 0x95, 0xb8, 0x0b, + 0xe1, 0x44, 0x68, 0x60, 0x07, 0x43, 0x30, 0x31, 0x42, 0x61, 0xe5, + 0xee, 0xd9, 0xe5, 0x24, 0xd5, 0x1b, 0xdf, 0xe1, 0x4a, 0x1b, 0xaa, + 0x9f, 0xc7, 0x5f, 0xf8, 0x7a, 0x11, 0xea, 0x13, 0x93, 0x00, 0xca, + 0x8a, 0x58, 0xb1, 0xee, 0xed, 0x0e, 0x4d, 0xb4, 0xd7, 0xa8, 0x36, + 0x26, 0x7c, 0xe0, 0x3a, 0xc1, 0xd5, 0x57, 0x82, 0xf1, 0x75, 0xb6, + 0xfd, 0x89, 0x5f, 0xda, 0xf3, 0xa8, 0x38, 0x9f, 0x35, 0x06, 0x08, + 0xce, 0x22, 0x95, 0xbe, 0xcd, 0xd5, 0xfc, 0xbe, 0x5b, 0xde, 0x79, + 0x6b, 0xdc, 0x7a, 0xa9, 0x65, 0x66, 0xbe, 0xb1, 0x25, 0x5a, 0x5f, + 0xed, 0x7e, 0xd3, 0xac, 0x46, 0x6d, 0x4c, 0xf4, 0x32, 0x87, 0xb4, + 0x20, 0x04, 0xe0, 0x6c, 0x78, 0xb0, 0x77, 0xd1, 0x85, 0x46, 0x4b, + 0xa6, 0x12, 0xb7, 0x75, 0xe8, 0x4a, 0xc9, 0x56, 0x6c, 0xd7, 0x92, + 0xab, 0x9d, 0xf5, 0x49, 0x38, 0xd2, 0x4f, 0x53, 0xe3, 0x55, 0x90, + 0x11, 0xdb, 0x98, 0x96, 0xc6, 0x49, 0xf2, 0x3e, 0xf4, 0x9f, 0x1b, + 0xe0, 0xf7, 0x88, 0xdc, 0x25, 0x62, 0x99, 0x44, 0xd8, 0x73, 0xbf, + 0x3f, 0x30, 0xf3, 0x0c, 0x37, 0x3e, 0xd4, 0xc2, 0x28, 0x80, 0x73, + 0xb1, 0x01, 0xb7, 0x9d, 0x5a, 0x96, 0x14, 0x01, 0x4b, 0xa9, 0x11, + 0x9d, 0x29, 0x6a, 0x2e, 0xd0, 0x5d, 0x81, 0xc0, 0xcf, 0xb2, 0x20, + 0x43, 0xc7, 0x03, 0xe0, 0x37, 0x4e, 0x5d, 0x0a, 0xdc, 0x59, 0x20, + 0x25, 0x30, 0x82, 0x03, 0xa8, 0x30, 0x82, 0x02, 0x90, 0xa0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0xfe, 0xdc, 0xe3, 0x01, 0x0f, + 0xc9, 0x48, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x34, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x46, 0x52, + 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x09, + 0x44, 0x68, 0x69, 0x6d, 0x79, 0x6f, 0x74, 0x69, 0x73, 0x31, 0x11, + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x08, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x67, 0x6e, 0x61, 0x30, 0x1e, 0x17, 0x0d, 0x30, + 0x37, 0x30, 0x36, 0x32, 0x39, 0x31, 0x35, 0x31, 0x33, 0x30, 0x35, + 0x5a, 0x17, 0x0d, 0x32, 0x37, 0x30, 0x36, 0x32, 0x39, 0x31, 0x35, + 0x31, 0x33, 0x30, 0x35, 0x5a, 0x30, 0x34, 0x31, 0x0b, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x46, 0x52, 0x31, 0x12, + 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x09, 0x44, 0x68, + 0x69, 0x6d, 0x79, 0x6f, 0x74, 0x69, 0x73, 0x31, 0x11, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x08, 0x43, 0x65, 0x72, 0x74, + 0x69, 0x67, 0x6e, 0x61, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, + 0x82, 0x01, 0x01, 0x00, 0xc8, 0x68, 0xf1, 0xc9, 0xd6, 0xd6, 0xb3, + 0x34, 0x75, 0x26, 0x82, 0x1e, 0xec, 0xb4, 0xbe, 0xea, 0x5c, 0xe1, + 0x26, 0xed, 0x11, 0x47, 0x61, 0xe1, 0xa2, 0x7c, 0x16, 0x78, 0x40, + 0x21, 0xe4, 0x60, 0x9e, 0x5a, 0xc8, 0x63, 0xe1, 0xc4, 0xb1, 0x96, + 0x92, 0xff, 0x18, 0x6d, 0x69, 0x23, 0xe1, 0x2b, 0x62, 0xf7, 0xdd, + 0xe2, 0x36, 0x2f, 0x91, 0x07, 0xb9, 0x48, 0xcf, 0x0e, 0xec, 0x79, + 0xb6, 0x2c, 0xe7, 0x34, 0x4b, 0x70, 0x08, 0x25, 0xa3, 0x3c, 0x87, + 0x1b, 0x19, 0xf2, 0x81, 0x07, 0x0f, 0x38, 0x90, 0x19, 0xd3, 0x11, + 0xfe, 0x86, 0xb4, 0xf2, 0xd1, 0x5e, 0x1e, 0x1e, 0x96, 0xcd, 0x80, + 0x6c, 0xce, 0x3b, 0x31, 0x93, 0xb6, 0xf2, 0xa0, 0xd0, 0xa9, 0x95, + 0x12, 0x7d, 0xa5, 0x9a, 0xcc, 0x6b, 0xc8, 0x84, 0x56, 0x8a, 0x33, + 0xa9, 0xe7, 0x22, 0x15, 0x53, 0x16, 0xf0, 0xcc, 0x17, 0xec, 0x57, + 0x5f, 0xe9, 0xa2, 0x0a, 0x98, 0x09, 0xde, 0xe3, 0x5f, 0x9c, 0x6f, + 0xdc, 0x48, 0xe3, 0x85, 0x0b, 0x15, 0x5a, 0xa6, 0xba, 0x9f, 0xac, + 0x48, 0xe3, 0x09, 0xb2, 0xf7, 0xf4, 0x32, 0xde, 0x5e, 0x34, 0xbe, + 0x1c, 0x78, 0x5d, 0x42, 0x5b, 0xce, 0x0e, 0x22, 0x8f, 0x4d, 0x90, + 0xd7, 0x7d, 0x32, 0x18, 0xb3, 0x0b, 0x2c, 0x6a, 0xbf, 0x8e, 0x3f, + 0x14, 0x11, 0x89, 0x20, 0x0e, 0x77, 0x14, 0xb5, 0x3d, 0x94, 0x08, + 0x87, 0xf7, 0x25, 0x1e, 0xd5, 0xb2, 0x60, 0x00, 0xec, 0x6f, 0x2a, + 0x28, 0x25, 0x6e, 0x2a, 0x3e, 0x18, 0x63, 0x17, 0x25, 0x3f, 0x3e, + 0x44, 0x20, 0x16, 0xf6, 0x26, 0xc8, 0x25, 0xae, 0x05, 0x4a, 0xb4, + 0xe7, 0x63, 0x2c, 0xf3, 0x8c, 0x16, 0x53, 0x7e, 0x5c, 0xfb, 0x11, + 0x1a, 0x08, 0xc1, 0x46, 0x62, 0x9f, 0x22, 0xb8, 0xf1, 0xc2, 0x8d, + 0x69, 0xdc, 0xfa, 0x3a, 0x58, 0x06, 0xdf, 0x02, 0x03, 0x01, 0x00, + 0x01, 0xa3, 0x81, 0xbc, 0x30, 0x81, 0xb9, 0x30, 0x0f, 0x06, 0x03, + 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, + 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, + 0x04, 0x14, 0x1a, 0xed, 0xfe, 0x41, 0x39, 0x90, 0xb4, 0x24, 0x59, + 0xbe, 0x01, 0xf2, 0x52, 0xd5, 0x45, 0xf6, 0x5a, 0x39, 0xdc, 0x11, + 0x30, 0x64, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x5d, 0x30, 0x5b, + 0x80, 0x14, 0x1a, 0xed, 0xfe, 0x41, 0x39, 0x90, 0xb4, 0x24, 0x59, + 0xbe, 0x01, 0xf2, 0x52, 0xd5, 0x45, 0xf6, 0x5a, 0x39, 0xdc, 0x11, + 0xa1, 0x38, 0xa4, 0x36, 0x30, 0x34, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x46, 0x52, 0x31, 0x12, 0x30, + 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x09, 0x44, 0x68, 0x69, + 0x6d, 0x79, 0x6f, 0x74, 0x69, 0x73, 0x31, 0x11, 0x30, 0x0f, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x0c, 0x08, 0x43, 0x65, 0x72, 0x74, 0x69, + 0x67, 0x6e, 0x61, 0x82, 0x09, 0x00, 0xfe, 0xdc, 0xe3, 0x01, 0x0f, + 0xc9, 0x48, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, + 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x11, 0x06, + 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x01, 0x04, + 0x04, 0x03, 0x02, 0x00, 0x07, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, + 0x01, 0x01, 0x00, 0x85, 0x03, 0x1e, 0x92, 0x71, 0xf6, 0x42, 0xaf, + 0xe1, 0xa3, 0x61, 0x9e, 0xeb, 0xf3, 0xc0, 0x0f, 0xf2, 0xa5, 0xd4, + 0xda, 0x95, 0xe6, 0xd6, 0xbe, 0x68, 0x36, 0x3d, 0x7e, 0x6e, 0x1f, + 0x4c, 0x8a, 0xef, 0xd1, 0x0f, 0x21, 0x6d, 0x5e, 0xa5, 0x52, 0x63, + 0xce, 0x12, 0xf8, 0xef, 0x2a, 0xda, 0x6f, 0xeb, 0x37, 0xfe, 0x13, + 0x02, 0xc7, 0xcb, 0x3b, 0x3e, 0x22, 0x6b, 0xda, 0x61, 0x2e, 0x7f, + 0xd4, 0x72, 0x3d, 0xdd, 0x30, 0xe1, 0x1e, 0x4c, 0x40, 0x19, 0x8c, + 0x0f, 0xd7, 0x9c, 0xd1, 0x83, 0x30, 0x7b, 0x98, 0x59, 0xdc, 0x7d, + 0xc6, 0xb9, 0x0c, 0x29, 0x4c, 0xa1, 0x33, 0xa2, 0xeb, 0x67, 0x3a, + 0x65, 0x84, 0xd3, 0x96, 0xe2, 0xed, 0x76, 0x45, 0x70, 0x8f, 0xb5, + 0x2b, 0xde, 0xf9, 0x23, 0xd6, 0x49, 0x6e, 0x3c, 0x14, 0xb5, 0xc6, + 0x9f, 0x35, 0x1e, 0x50, 0xd0, 0xc1, 0x8f, 0x6a, 0x70, 0x44, 0x02, + 0x62, 0xcb, 0xae, 0x1d, 0x68, 0x41, 0xa7, 0xaa, 0x57, 0xe8, 0x53, + 0xaa, 0x07, 0xd2, 0x06, 0xf6, 0xd5, 0x14, 0x06, 0x0b, 0x91, 0x03, + 0x75, 0x2c, 0x6c, 0x72, 0xb5, 0x61, 0x95, 0x9a, 0x0d, 0x8b, 0xb9, + 0x0d, 0xe7, 0xf5, 0xdf, 0x54, 0xcd, 0xde, 0xe6, 0xd8, 0xd6, 0x09, + 0x08, 0x97, 0x63, 0xe5, 0xc1, 0x2e, 0xb0, 0xb7, 0x44, 0x26, 0xc0, + 0x26, 0xc0, 0xaf, 0x55, 0x30, 0x9e, 0x3b, 0xd5, 0x36, 0x2a, 0x19, + 0x04, 0xf4, 0x5c, 0x1e, 0xff, 0xcf, 0x2c, 0xb7, 0xff, 0xd0, 0xfd, + 0x87, 0x40, 0x11, 0xd5, 0x11, 0x23, 0xbb, 0x48, 0xc0, 0x21, 0xa9, + 0xa4, 0x28, 0x2d, 0xfd, 0x15, 0xf8, 0xb0, 0x4e, 0x2b, 0xf4, 0x30, + 0x5b, 0x21, 0xfc, 0x11, 0x91, 0x34, 0xbe, 0x41, 0xef, 0x7b, 0x9d, + 0x97, 0x75, 0xff, 0x97, 0x95, 0xc0, 0x96, 0x58, 0x2f, 0xea, 0xbb, + 0x46, 0xd7, 0xbb, 0xe4, 0xd9, 0x2e, 0x30, 0x82, 0x04, 0xaa, 0x30, + 0x82, 0x03, 0x92, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0e, 0x2e, + 0x6a, 0x00, 0x01, 0x00, 0x02, 0x1f, 0xd7, 0x52, 0x21, 0x2c, 0x11, + 0x5c, 0x3b, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x76, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, + 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x13, 0x54, + 0x43, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x20, 0x47, 0x6d, 0x62, 0x48, 0x31, 0x22, 0x30, 0x20, + 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x19, 0x54, 0x43, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, - 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x20, 0x43, - 0x41, 0x20, 0x49, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x43, 0x41, 0x31, + 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1c, 0x54, + 0x43, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, + 0x43, 0x41, 0x20, 0x49, 0x49, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, + 0x30, 0x31, 0x31, 0x32, 0x31, 0x34, 0x33, 0x38, 0x34, 0x33, 0x5a, + 0x17, 0x0d, 0x32, 0x35, 0x31, 0x32, 0x33, 0x31, 0x32, 0x32, 0x35, + 0x39, 0x35, 0x39, 0x5a, 0x30, 0x76, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, 0x1c, 0x30, + 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x13, 0x54, 0x43, 0x20, + 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x20, 0x47, 0x6d, 0x62, 0x48, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, + 0x55, 0x04, 0x0b, 0x13, 0x19, 0x54, 0x43, 0x20, 0x54, 0x72, 0x75, + 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x43, 0x6c, + 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x43, 0x41, 0x31, 0x25, 0x30, + 0x23, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1c, 0x54, 0x43, 0x20, + 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x43, 0x41, + 0x20, 0x49, 0x49, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, - 0x01, 0x01, 0x00, 0xa4, 0x77, 0x23, 0x96, 0x44, 0xaf, 0x90, 0xf4, - 0x31, 0xa7, 0x10, 0xf4, 0x26, 0x87, 0x9c, 0xf3, 0x38, 0xd9, 0x0f, - 0x5e, 0xde, 0xcf, 0x41, 0xe8, 0x31, 0xad, 0xc6, 0x74, 0x91, 0x24, - 0x96, 0x78, 0x1e, 0x09, 0xa0, 0x9b, 0x9a, 0x95, 0x4a, 0x4a, 0xf5, - 0x62, 0x7c, 0x02, 0xa8, 0xca, 0xac, 0xfb, 0x5a, 0x04, 0x76, 0x39, - 0xde, 0x5f, 0xf1, 0xf9, 0xb3, 0xbf, 0xf3, 0x03, 0x58, 0x55, 0xd2, - 0xaa, 0xb7, 0xe3, 0x04, 0x22, 0xd1, 0xf8, 0x94, 0xda, 0x22, 0x08, - 0x00, 0x8d, 0xd3, 0x7c, 0x26, 0x5d, 0xcc, 0x77, 0x79, 0xe7, 0x2c, - 0x78, 0x39, 0xa8, 0x26, 0x73, 0x0e, 0xa2, 0x5d, 0x25, 0x69, 0x85, - 0x4f, 0x55, 0x0e, 0x9a, 0xef, 0xc6, 0xb9, 0x44, 0xe1, 0x57, 0x3d, - 0xdf, 0x1f, 0x54, 0x22, 0xe5, 0x6f, 0x65, 0xaa, 0x33, 0x84, 0x3a, - 0xf3, 0xce, 0x7a, 0xbe, 0x55, 0x97, 0xae, 0x8d, 0x12, 0x0f, 0x14, - 0x33, 0xe2, 0x50, 0x70, 0xc3, 0x49, 0x87, 0x13, 0xbc, 0x51, 0xde, - 0xd7, 0x98, 0x12, 0x5a, 0xef, 0x3a, 0x83, 0x33, 0x92, 0x06, 0x75, - 0x8b, 0x92, 0x7c, 0x12, 0x68, 0x7b, 0x70, 0x6a, 0x0f, 0xb5, 0x9b, - 0xb6, 0x77, 0x5b, 0x48, 0x59, 0x9d, 0xe4, 0xef, 0x5a, 0xad, 0xf3, - 0xc1, 0x9e, 0xd4, 0xd7, 0x45, 0x4e, 0xca, 0x56, 0x34, 0x21, 0xbc, - 0x3e, 0x17, 0x5b, 0x6f, 0x77, 0x0c, 0x48, 0x01, 0x43, 0x29, 0xb0, - 0xdd, 0x3f, 0x96, 0x6e, 0xe6, 0x95, 0xaa, 0x0c, 0xc0, 0x20, 0xb6, - 0xfd, 0x3e, 0x36, 0x27, 0x9c, 0xe3, 0x5c, 0xcf, 0x4e, 0x81, 0xdc, - 0x19, 0xbb, 0x91, 0x90, 0x7d, 0xec, 0xe6, 0x97, 0x04, 0x1e, 0x93, - 0xcc, 0x22, 0x49, 0xd7, 0x97, 0x86, 0xb6, 0x13, 0x0a, 0x3c, 0x43, - 0x23, 0x77, 0x7e, 0xf0, 0xdc, 0xe6, 0xcd, 0x24, 0x1f, 0x3b, 0x83, - 0x9b, 0x34, 0x3a, 0x83, 0x34, 0xe3, 0x02, 0x03, 0x01, 0x00, 0x01, - 0xa3, 0x63, 0x30, 0x61, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, - 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x92, 0xa4, 0x75, 0x2c, 0xa4, - 0x9e, 0xbe, 0x81, 0x44, 0xeb, 0x79, 0xfc, 0x8a, 0xc5, 0x95, 0xa5, - 0xeb, 0x10, 0x75, 0x73, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, - 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, - 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, - 0x03, 0x02, 0x01, 0x86, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, - 0x04, 0x16, 0x04, 0x14, 0x92, 0xa4, 0x75, 0x2c, 0xa4, 0x9e, 0xbe, - 0x81, 0x44, 0xeb, 0x79, 0xfc, 0x8a, 0xc5, 0x95, 0xa5, 0xeb, 0x10, - 0x75, 0x73, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, - 0x28, 0xd2, 0xe0, 0x86, 0xd5, 0xe6, 0xf8, 0x7b, 0xf0, 0x97, 0xdc, - 0x22, 0x6b, 0x3b, 0x95, 0x14, 0x56, 0x0f, 0x11, 0x30, 0xa5, 0x9a, - 0x4f, 0x3a, 0xb0, 0x3a, 0xe0, 0x06, 0xcb, 0x65, 0xf5, 0xed, 0xc6, - 0x97, 0x27, 0xfe, 0x25, 0xf2, 0x57, 0xe6, 0x5e, 0x95, 0x8c, 0x3e, - 0x64, 0x60, 0x15, 0x5a, 0x7f, 0x2f, 0x0d, 0x01, 0xc5, 0xb1, 0x60, - 0xfd, 0x45, 0x35, 0xcf, 0xf0, 0xb2, 0xbf, 0x06, 0xd9, 0xef, 0x5a, - 0xbe, 0xb3, 0x62, 0x21, 0xb4, 0xd7, 0xab, 0x35, 0x7c, 0x53, 0x3e, - 0xa6, 0x27, 0xf1, 0xa1, 0x2d, 0xda, 0x1a, 0x23, 0x9d, 0xcc, 0xdd, - 0xec, 0x3c, 0x2d, 0x9e, 0x27, 0x34, 0x5d, 0x0f, 0xc2, 0x36, 0x79, - 0xbc, 0xc9, 0x4a, 0x62, 0x2d, 0xed, 0x6b, 0xd9, 0x7d, 0x41, 0x43, - 0x7c, 0xb6, 0xaa, 0xca, 0xed, 0x61, 0xb1, 0x37, 0x82, 0x15, 0x09, - 0x1a, 0x8a, 0x16, 0x30, 0xd8, 0xec, 0xc9, 0xd6, 0x47, 0x72, 0x78, - 0x4b, 0x10, 0x46, 0x14, 0x8e, 0x5f, 0x0e, 0xaf, 0xec, 0xc7, 0x2f, - 0xab, 0x10, 0xd7, 0xb6, 0xf1, 0x6e, 0xec, 0x86, 0xb2, 0xc2, 0xe8, - 0x0d, 0x92, 0x73, 0xdc, 0xa2, 0xf4, 0x0f, 0x3a, 0xbf, 0x61, 0x23, - 0x10, 0x89, 0x9c, 0x48, 0x40, 0x6e, 0x70, 0x00, 0xb3, 0xd3, 0xba, - 0x37, 0x44, 0x58, 0x11, 0x7a, 0x02, 0x6a, 0x88, 0xf0, 0x37, 0x34, - 0xf0, 0x19, 0xe9, 0xac, 0xd4, 0x65, 0x73, 0xf6, 0x69, 0x8c, 0x64, - 0x94, 0x3a, 0x79, 0x85, 0x29, 0xb0, 0x16, 0x2b, 0x0c, 0x82, 0x3f, - 0x06, 0x9c, 0xc7, 0xfd, 0x10, 0x2b, 0x9e, 0x0f, 0x2c, 0xb6, 0x9e, - 0xe3, 0x15, 0xbf, 0xd9, 0x36, 0x1c, 0xba, 0x25, 0x1a, 0x52, 0x3d, - 0x1a, 0xec, 0x22, 0x0c, 0x1c, 0xe0, 0xa4, 0xa2, 0x3d, 0xf0, 0xe8, - 0x39, 0xcf, 0x81, 0xc0, 0x7b, 0xed, 0x5d, 0x1f, 0x6f, 0xc5, 0xd0, - 0x0b, 0xd7, 0x98, 0x30, 0x82, 0x03, 0x9f, 0x30, 0x82, 0x02, 0x87, - 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x26, 0x30, 0x0d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, - 0x00, 0x30, 0x71, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x13, 0x44, 0x65, 0x75, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x20, 0x54, 0x65, 0x6c, 0x65, 0x6b, 0x6f, 0x6d, 0x20, - 0x41, 0x47, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, - 0x13, 0x16, 0x54, 0x2d, 0x54, 0x65, 0x6c, 0x65, 0x53, 0x65, 0x63, - 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, 0x03, - 0x13, 0x1a, 0x44, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0x65, 0x20, - 0x54, 0x65, 0x6c, 0x65, 0x6b, 0x6f, 0x6d, 0x20, 0x52, 0x6f, 0x6f, - 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x39, - 0x39, 0x30, 0x37, 0x30, 0x39, 0x31, 0x32, 0x31, 0x31, 0x30, 0x30, - 0x5a, 0x17, 0x0d, 0x31, 0x39, 0x30, 0x37, 0x30, 0x39, 0x32, 0x33, - 0x35, 0x39, 0x30, 0x30, 0x5a, 0x30, 0x71, 0x31, 0x0b, 0x30, 0x09, + 0x01, 0x01, 0x00, 0xab, 0x80, 0x87, 0x9b, 0x8e, 0xf0, 0xc3, 0x7c, + 0x87, 0xd7, 0xe8, 0x24, 0x82, 0x11, 0xb3, 0x3c, 0xdd, 0x43, 0x62, + 0xee, 0xf8, 0xc3, 0x45, 0xda, 0xe8, 0xe1, 0xa0, 0x5f, 0xd1, 0x2a, + 0xb2, 0xea, 0x93, 0x68, 0xdf, 0xb4, 0xc8, 0xd6, 0x43, 0xe9, 0xc4, + 0x75, 0x59, 0x7f, 0xfc, 0xe1, 0x1d, 0xf8, 0x31, 0x70, 0x23, 0x1b, + 0x88, 0x9e, 0x27, 0xb9, 0x7b, 0xfd, 0x3a, 0xd2, 0xc9, 0xa9, 0xe9, + 0x14, 0x2f, 0x90, 0xbe, 0x03, 0x52, 0xc1, 0x49, 0xcd, 0xf6, 0xfd, + 0xe4, 0x08, 0x66, 0x0b, 0x57, 0x8a, 0xa2, 0x42, 0xa0, 0xb8, 0xd5, + 0x7f, 0x69, 0x5c, 0x90, 0x32, 0xb2, 0x97, 0x0d, 0xca, 0x4a, 0xdc, + 0x46, 0x3e, 0x02, 0x55, 0x89, 0x53, 0xe3, 0x1a, 0x5a, 0xcb, 0x36, + 0xc6, 0x07, 0x56, 0xf7, 0x8c, 0xcf, 0x11, 0xf4, 0x4c, 0xbb, 0x30, + 0x70, 0x04, 0x95, 0xa5, 0xf6, 0x39, 0x8c, 0xfd, 0x73, 0x81, 0x08, + 0x7d, 0x89, 0x5e, 0x32, 0x1e, 0x22, 0xa9, 0x22, 0x45, 0x4b, 0xb0, + 0x66, 0x2e, 0x30, 0xcc, 0x9f, 0x65, 0xfd, 0xfc, 0xcb, 0x81, 0xa9, + 0xf1, 0xe0, 0x3b, 0xaf, 0xa3, 0x86, 0xd1, 0x89, 0xea, 0xc4, 0x45, + 0x79, 0x50, 0x5d, 0xae, 0xe9, 0x21, 0x74, 0x92, 0x4d, 0x8b, 0x59, + 0x82, 0x8f, 0x94, 0xe3, 0xe9, 0x4a, 0xf1, 0xe7, 0x49, 0xb0, 0x14, + 0xe3, 0xf5, 0x62, 0xcb, 0xd5, 0x72, 0xbd, 0x1f, 0xb9, 0xd2, 0x9f, + 0xa0, 0xcd, 0xa8, 0xfa, 0x01, 0xc8, 0xd9, 0x0d, 0xdf, 0xda, 0xfc, + 0x47, 0x9d, 0xb3, 0xc8, 0x54, 0xdf, 0x49, 0x4a, 0xf1, 0x21, 0xa9, + 0xfe, 0x18, 0x4e, 0xee, 0x48, 0xd4, 0x19, 0xbb, 0xef, 0x7d, 0xe4, + 0xe2, 0x9d, 0xcb, 0x5b, 0xb6, 0x6e, 0xff, 0xe3, 0xcd, 0x5a, 0xe7, + 0x74, 0x82, 0x05, 0xba, 0x80, 0x25, 0x38, 0xcb, 0xe4, 0x69, 0x9e, + 0xaf, 0x41, 0xaa, 0x1a, 0x84, 0xf5, 0x02, 0x03, 0x01, 0x00, 0x01, + 0xa3, 0x82, 0x01, 0x34, 0x30, 0x82, 0x01, 0x30, 0x30, 0x0f, 0x06, + 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, + 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, + 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, + 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xe3, 0xab, 0x54, + 0x4c, 0x80, 0xa1, 0xdb, 0x56, 0x43, 0xb7, 0x91, 0x4a, 0xcb, 0xf3, + 0x82, 0x7a, 0x13, 0x5c, 0x08, 0xab, 0x30, 0x81, 0xed, 0x06, 0x03, + 0x55, 0x1d, 0x1f, 0x04, 0x81, 0xe5, 0x30, 0x81, 0xe2, 0x30, 0x81, + 0xdf, 0xa0, 0x81, 0xdc, 0xa0, 0x81, 0xd9, 0x86, 0x35, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74, 0x72, + 0x75, 0x73, 0x74, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x64, + 0x65, 0x2f, 0x63, 0x72, 0x6c, 0x2f, 0x76, 0x32, 0x2f, 0x74, 0x63, + 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x32, 0x5f, 0x63, 0x61, + 0x5f, 0x49, 0x49, 0x2e, 0x63, 0x72, 0x6c, 0x86, 0x81, 0x9f, 0x6c, + 0x64, 0x61, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74, + 0x72, 0x75, 0x73, 0x74, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, + 0x64, 0x65, 0x2f, 0x43, 0x4e, 0x3d, 0x54, 0x43, 0x25, 0x32, 0x30, + 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x25, 0x32, 0x30, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x25, 0x32, 0x30, + 0x32, 0x25, 0x32, 0x30, 0x43, 0x41, 0x25, 0x32, 0x30, 0x49, 0x49, + 0x2c, 0x4f, 0x3d, 0x54, 0x43, 0x25, 0x32, 0x30, 0x54, 0x72, 0x75, + 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x25, 0x32, 0x30, + 0x47, 0x6d, 0x62, 0x48, 0x2c, 0x4f, 0x55, 0x3d, 0x72, 0x6f, 0x6f, + 0x74, 0x63, 0x65, 0x72, 0x74, 0x73, 0x2c, 0x44, 0x43, 0x3d, 0x74, + 0x72, 0x75, 0x73, 0x74, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2c, + 0x44, 0x43, 0x3d, 0x64, 0x65, 0x3f, 0x63, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x3f, 0x62, + 0x61, 0x73, 0x65, 0x3f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x01, 0x00, 0x8c, 0xd7, 0xdf, 0x7e, 0xee, 0x1b, 0x80, 0x10, 0xb3, + 0x83, 0xf5, 0xdb, 0x11, 0xea, 0x6b, 0x4b, 0xa8, 0x92, 0x18, 0xd9, + 0xf7, 0x07, 0x39, 0xf5, 0x2c, 0xbe, 0x06, 0x75, 0x7a, 0x68, 0x53, + 0x15, 0x1c, 0xea, 0x4a, 0xed, 0x5e, 0xfc, 0x23, 0xb2, 0x13, 0xa0, + 0xd3, 0x09, 0xff, 0xf6, 0xf6, 0x2e, 0x6b, 0x41, 0x71, 0x79, 0xcd, + 0xe2, 0x6d, 0xfd, 0xae, 0x59, 0x6b, 0x85, 0x1d, 0xb8, 0x4e, 0x22, + 0x9a, 0xed, 0x66, 0x39, 0x6e, 0x4b, 0x94, 0xe6, 0x55, 0xfc, 0x0b, + 0x1b, 0x8b, 0x77, 0xc1, 0x53, 0x13, 0x66, 0x89, 0xd9, 0x28, 0xd6, + 0x8b, 0xf3, 0x45, 0x4a, 0x63, 0xb7, 0xfd, 0x7b, 0x0b, 0x61, 0x5d, + 0xb8, 0x6d, 0xbe, 0xc3, 0xdc, 0x5b, 0x79, 0xd2, 0xed, 0x86, 0xe5, + 0xa2, 0x4d, 0xbe, 0x5e, 0x74, 0x7c, 0x6a, 0xed, 0x16, 0x38, 0x1f, + 0x7f, 0x58, 0x81, 0x5a, 0x1a, 0xeb, 0x32, 0x88, 0x2d, 0xb2, 0xf3, + 0x39, 0x77, 0x80, 0xaf, 0x5e, 0xb6, 0x61, 0x75, 0x29, 0xdb, 0x23, + 0x4d, 0x88, 0xca, 0x50, 0x28, 0xcb, 0x85, 0xd2, 0xd3, 0x10, 0xa2, + 0x59, 0x6e, 0xd3, 0x93, 0x54, 0x00, 0x7a, 0xa2, 0x46, 0x95, 0x86, + 0x05, 0x9c, 0xa9, 0x19, 0x98, 0xe5, 0x31, 0x72, 0x0c, 0x00, 0xe2, + 0x67, 0xd9, 0x40, 0xe0, 0x24, 0x33, 0x7b, 0x6f, 0x2c, 0xb9, 0x5c, + 0xab, 0x65, 0x9d, 0x2c, 0xac, 0x76, 0xea, 0x35, 0x99, 0xf5, 0x97, + 0xb9, 0x0f, 0x24, 0xec, 0xc7, 0x76, 0x21, 0x28, 0x65, 0xae, 0x57, + 0xe8, 0x07, 0x88, 0x75, 0x4a, 0x56, 0xa0, 0xd2, 0x05, 0x3a, 0xa4, + 0xe6, 0x8d, 0x92, 0x88, 0x2c, 0xf3, 0xf2, 0xe1, 0xc1, 0xc6, 0x61, + 0xdb, 0x41, 0xc5, 0xc7, 0x9b, 0xf7, 0x0e, 0x1a, 0x51, 0x45, 0xc2, + 0x61, 0x6b, 0xdc, 0x64, 0x27, 0x17, 0x8c, 0x5a, 0xb7, 0xda, 0x74, + 0x28, 0xcd, 0x97, 0xe4, 0xbd, 0x30, 0x82, 0x04, 0xaa, 0x30, 0x82, + 0x03, 0x92, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0e, 0x4a, 0x47, + 0x00, 0x01, 0x00, 0x02, 0xe5, 0xa0, 0x5d, 0xd6, 0x3f, 0x00, 0x51, + 0xbf, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x76, 0x31, 0x0b, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, 0x1c, + 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x13, 0x54, 0x43, + 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x20, 0x47, 0x6d, 0x62, 0x48, 0x31, 0x22, 0x30, 0x20, 0x06, + 0x03, 0x55, 0x04, 0x0b, 0x13, 0x19, 0x54, 0x43, 0x20, 0x54, 0x72, + 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x43, 0x41, 0x31, 0x25, + 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1c, 0x54, 0x43, + 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x43, + 0x41, 0x20, 0x49, 0x49, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x30, + 0x31, 0x31, 0x32, 0x31, 0x34, 0x34, 0x31, 0x35, 0x37, 0x5a, 0x17, + 0x0d, 0x32, 0x35, 0x31, 0x32, 0x33, 0x31, 0x32, 0x32, 0x35, 0x39, + 0x35, 0x39, 0x5a, 0x30, 0x76, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, 0x1c, 0x30, 0x1a, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x13, 0x54, 0x43, 0x20, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, + 0x47, 0x6d, 0x62, 0x48, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, + 0x04, 0x0b, 0x13, 0x19, 0x54, 0x43, 0x20, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x20, 0x33, 0x20, 0x43, 0x41, 0x31, 0x25, 0x30, 0x23, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1c, 0x54, 0x43, 0x20, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x43, 0x41, 0x20, + 0x49, 0x49, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, + 0x01, 0x00, 0xb4, 0xe0, 0xbb, 0x51, 0xbb, 0x39, 0x5c, 0x8b, 0x04, + 0xc5, 0x4c, 0x79, 0x1c, 0x23, 0x86, 0x31, 0x10, 0x63, 0x43, 0x55, + 0x27, 0x3f, 0xc6, 0x45, 0xc7, 0xa4, 0x3d, 0xec, 0x09, 0x0d, 0x1a, + 0x1e, 0x20, 0xc2, 0x56, 0x1e, 0xde, 0x1b, 0x37, 0x07, 0x30, 0x22, + 0x2f, 0x6f, 0xf1, 0x06, 0xf1, 0xab, 0xad, 0xd6, 0xc8, 0xab, 0x61, + 0xa3, 0x2f, 0x43, 0xc4, 0xb0, 0xb2, 0x2d, 0xfc, 0xc3, 0x96, 0x69, + 0x7b, 0x7e, 0x8a, 0xe4, 0xcc, 0xc0, 0x39, 0x12, 0x90, 0x42, 0x60, + 0xc9, 0xcc, 0x35, 0x68, 0xee, 0xda, 0x5f, 0x90, 0x56, 0x5f, 0xcd, + 0x1c, 0x4d, 0x5b, 0x58, 0x49, 0xeb, 0x0e, 0x01, 0x4f, 0x64, 0xfa, + 0x2c, 0x3c, 0x89, 0x58, 0xd8, 0x2f, 0x2e, 0xe2, 0xb0, 0x68, 0xe9, + 0x22, 0x3b, 0x75, 0x89, 0xd6, 0x44, 0x1a, 0x65, 0xf2, 0x1b, 0x97, + 0x26, 0x1d, 0x28, 0x6d, 0xac, 0xe8, 0xbd, 0x59, 0x1d, 0x2b, 0x24, + 0xf6, 0xd6, 0x84, 0x03, 0x66, 0x88, 0x24, 0x00, 0x78, 0x60, 0xf1, + 0xf8, 0xab, 0xfe, 0x02, 0xb2, 0x6b, 0xfb, 0x22, 0xfb, 0x35, 0xe6, + 0x16, 0xd1, 0xad, 0xf6, 0x2e, 0x12, 0xe4, 0xfa, 0x35, 0x6a, 0xe5, + 0x19, 0xb9, 0x5d, 0xdb, 0x3b, 0x1e, 0x1a, 0xfb, 0xd3, 0xff, 0x15, + 0x14, 0x08, 0xd8, 0x09, 0x6a, 0xba, 0x45, 0x9d, 0x14, 0x79, 0x60, + 0x7d, 0xaf, 0x40, 0x8a, 0x07, 0x73, 0xb3, 0x93, 0x96, 0xd3, 0x74, + 0x34, 0x8d, 0x3a, 0x37, 0x29, 0xde, 0x5c, 0xec, 0xf5, 0xee, 0x2e, + 0x31, 0xc2, 0x20, 0xdc, 0xbe, 0xf1, 0x4f, 0x7f, 0x23, 0x52, 0xd9, + 0x5b, 0xe2, 0x64, 0xd9, 0x9c, 0xaa, 0x07, 0x08, 0xb5, 0x45, 0xbd, + 0xd1, 0xd0, 0x31, 0xc1, 0xab, 0x54, 0x9f, 0xa9, 0xd2, 0xc3, 0x62, + 0x60, 0x03, 0xf1, 0xbb, 0x39, 0x4a, 0x92, 0x4a, 0x3d, 0x0a, 0xb9, + 0x9d, 0xc5, 0xa0, 0xfe, 0x37, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, + 0x82, 0x01, 0x34, 0x30, 0x82, 0x01, 0x30, 0x30, 0x0f, 0x06, 0x03, + 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, + 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, + 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, + 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xd4, 0xa2, 0xfc, 0x9f, + 0xb3, 0xc3, 0xd8, 0x03, 0xd3, 0x57, 0x5c, 0x07, 0xa4, 0xd0, 0x24, + 0xa7, 0xc0, 0xf2, 0x00, 0xd4, 0x30, 0x81, 0xed, 0x06, 0x03, 0x55, + 0x1d, 0x1f, 0x04, 0x81, 0xe5, 0x30, 0x81, 0xe2, 0x30, 0x81, 0xdf, + 0xa0, 0x81, 0xdc, 0xa0, 0x81, 0xd9, 0x86, 0x35, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74, 0x72, 0x75, + 0x73, 0x74, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x64, 0x65, + 0x2f, 0x63, 0x72, 0x6c, 0x2f, 0x76, 0x32, 0x2f, 0x74, 0x63, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x33, 0x5f, 0x63, 0x61, 0x5f, + 0x49, 0x49, 0x2e, 0x63, 0x72, 0x6c, 0x86, 0x81, 0x9f, 0x6c, 0x64, + 0x61, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74, 0x72, + 0x75, 0x73, 0x74, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x64, + 0x65, 0x2f, 0x43, 0x4e, 0x3d, 0x54, 0x43, 0x25, 0x32, 0x30, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x25, + 0x32, 0x30, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x25, 0x32, 0x30, 0x33, + 0x25, 0x32, 0x30, 0x43, 0x41, 0x25, 0x32, 0x30, 0x49, 0x49, 0x2c, + 0x4f, 0x3d, 0x54, 0x43, 0x25, 0x32, 0x30, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x25, 0x32, 0x30, 0x47, + 0x6d, 0x62, 0x48, 0x2c, 0x4f, 0x55, 0x3d, 0x72, 0x6f, 0x6f, 0x74, + 0x63, 0x65, 0x72, 0x74, 0x73, 0x2c, 0x44, 0x43, 0x3d, 0x74, 0x72, + 0x75, 0x73, 0x74, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2c, 0x44, + 0x43, 0x3d, 0x64, 0x65, 0x3f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x3f, 0x62, 0x61, + 0x73, 0x65, 0x3f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, + 0x00, 0x36, 0x60, 0xe4, 0x70, 0xf7, 0x06, 0x20, 0x43, 0xd9, 0x23, + 0x1a, 0x42, 0xf2, 0xf8, 0xa3, 0xb2, 0xb9, 0x4d, 0x8a, 0xb4, 0xf3, + 0xc2, 0x9a, 0x55, 0x31, 0x7c, 0xc4, 0x3b, 0x67, 0x9a, 0xb4, 0xdf, + 0x4d, 0x0e, 0x8a, 0x93, 0x4a, 0x17, 0x8b, 0x1b, 0x8d, 0xca, 0x89, + 0xe1, 0xcf, 0x3a, 0x1e, 0xac, 0x1d, 0xf1, 0x9c, 0x32, 0xb4, 0x8e, + 0x59, 0x76, 0xa2, 0x41, 0x85, 0x25, 0x37, 0xa0, 0x13, 0xd0, 0xf5, + 0x7c, 0x4e, 0xd5, 0xea, 0x96, 0xe2, 0x6e, 0x72, 0xc1, 0xbb, 0x2a, + 0xfe, 0x6c, 0x6e, 0xf8, 0x91, 0x98, 0x46, 0xfc, 0xc9, 0x1b, 0x57, + 0x5b, 0xea, 0xc8, 0x1a, 0x3b, 0x3f, 0xb0, 0x51, 0x98, 0x3c, 0x07, + 0xda, 0x2c, 0x59, 0x01, 0xda, 0x8b, 0x44, 0xe8, 0xe1, 0x74, 0xfd, + 0xa7, 0x68, 0xdd, 0x54, 0xba, 0x83, 0x46, 0xec, 0xc8, 0x46, 0xb5, + 0xf8, 0xaf, 0x97, 0xc0, 0x3b, 0x09, 0x1c, 0x8f, 0xce, 0x72, 0x96, + 0x3d, 0x33, 0x56, 0x70, 0xbc, 0x96, 0xcb, 0xd8, 0xd5, 0x7d, 0x20, + 0x9a, 0x83, 0x9f, 0x1a, 0xdc, 0x39, 0xf1, 0xc5, 0x72, 0xa3, 0x11, + 0x03, 0xfd, 0x3b, 0x42, 0x52, 0x29, 0xdb, 0xe8, 0x01, 0xf7, 0x9b, + 0x5e, 0x8c, 0xd6, 0x8d, 0x86, 0x4e, 0x19, 0xfa, 0xbc, 0x1c, 0xbe, + 0xc5, 0x21, 0xa5, 0x87, 0x9e, 0x78, 0x2e, 0x36, 0xdb, 0x09, 0x71, + 0xa3, 0x72, 0x34, 0xf8, 0x6c, 0xe3, 0x06, 0x09, 0xf2, 0x5e, 0x56, + 0xa5, 0xd3, 0xdd, 0x98, 0xfa, 0xd4, 0xe6, 0x06, 0xf4, 0xf0, 0xb6, + 0x20, 0x63, 0x4b, 0xea, 0x29, 0xbd, 0xaa, 0x82, 0x66, 0x1e, 0xfb, + 0x81, 0xaa, 0xa7, 0x37, 0xad, 0x13, 0x18, 0xe6, 0x92, 0xc3, 0x81, + 0xc1, 0x33, 0xbb, 0x88, 0x1e, 0xa1, 0xe7, 0xe2, 0xb4, 0xbd, 0x31, + 0x6c, 0x0e, 0x51, 0x3d, 0x6f, 0xfb, 0x96, 0x56, 0x80, 0xe2, 0x36, + 0x17, 0xd1, 0xdc, 0xe4, 0x30, 0x82, 0x03, 0xdd, 0x30, 0x82, 0x02, + 0xc5, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0e, 0x1d, 0xa2, 0x00, + 0x01, 0x00, 0x02, 0xec, 0xb7, 0x60, 0x80, 0x78, 0x8d, 0xb6, 0x06, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x05, 0x05, 0x00, 0x30, 0x79, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, 0x1c, 0x30, + 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x13, 0x54, 0x43, 0x20, + 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x20, 0x47, 0x6d, 0x62, 0x48, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, + 0x55, 0x04, 0x0b, 0x13, 0x1b, 0x54, 0x43, 0x20, 0x54, 0x72, 0x75, + 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x55, 0x6e, + 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x20, 0x43, 0x41, 0x31, + 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1d, 0x54, + 0x43, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, + 0x6c, 0x20, 0x43, 0x41, 0x20, 0x49, 0x30, 0x1e, 0x17, 0x0d, 0x30, + 0x36, 0x30, 0x33, 0x32, 0x32, 0x31, 0x35, 0x35, 0x34, 0x32, 0x38, + 0x5a, 0x17, 0x0d, 0x32, 0x35, 0x31, 0x32, 0x33, 0x31, 0x32, 0x32, + 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x79, 0x31, 0x0b, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, 0x1c, + 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x13, 0x54, 0x43, + 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x20, 0x47, 0x6d, 0x62, 0x48, 0x31, 0x24, 0x30, 0x22, 0x06, + 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1b, 0x54, 0x43, 0x20, 0x54, 0x72, + 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x55, + 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x20, 0x43, 0x41, + 0x31, 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1d, + 0x54, 0x43, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, + 0x61, 0x6c, 0x20, 0x43, 0x41, 0x20, 0x49, 0x30, 0x82, 0x01, 0x22, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, + 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa4, 0x77, 0x23, 0x96, + 0x44, 0xaf, 0x90, 0xf4, 0x31, 0xa7, 0x10, 0xf4, 0x26, 0x87, 0x9c, + 0xf3, 0x38, 0xd9, 0x0f, 0x5e, 0xde, 0xcf, 0x41, 0xe8, 0x31, 0xad, + 0xc6, 0x74, 0x91, 0x24, 0x96, 0x78, 0x1e, 0x09, 0xa0, 0x9b, 0x9a, + 0x95, 0x4a, 0x4a, 0xf5, 0x62, 0x7c, 0x02, 0xa8, 0xca, 0xac, 0xfb, + 0x5a, 0x04, 0x76, 0x39, 0xde, 0x5f, 0xf1, 0xf9, 0xb3, 0xbf, 0xf3, + 0x03, 0x58, 0x55, 0xd2, 0xaa, 0xb7, 0xe3, 0x04, 0x22, 0xd1, 0xf8, + 0x94, 0xda, 0x22, 0x08, 0x00, 0x8d, 0xd3, 0x7c, 0x26, 0x5d, 0xcc, + 0x77, 0x79, 0xe7, 0x2c, 0x78, 0x39, 0xa8, 0x26, 0x73, 0x0e, 0xa2, + 0x5d, 0x25, 0x69, 0x85, 0x4f, 0x55, 0x0e, 0x9a, 0xef, 0xc6, 0xb9, + 0x44, 0xe1, 0x57, 0x3d, 0xdf, 0x1f, 0x54, 0x22, 0xe5, 0x6f, 0x65, + 0xaa, 0x33, 0x84, 0x3a, 0xf3, 0xce, 0x7a, 0xbe, 0x55, 0x97, 0xae, + 0x8d, 0x12, 0x0f, 0x14, 0x33, 0xe2, 0x50, 0x70, 0xc3, 0x49, 0x87, + 0x13, 0xbc, 0x51, 0xde, 0xd7, 0x98, 0x12, 0x5a, 0xef, 0x3a, 0x83, + 0x33, 0x92, 0x06, 0x75, 0x8b, 0x92, 0x7c, 0x12, 0x68, 0x7b, 0x70, + 0x6a, 0x0f, 0xb5, 0x9b, 0xb6, 0x77, 0x5b, 0x48, 0x59, 0x9d, 0xe4, + 0xef, 0x5a, 0xad, 0xf3, 0xc1, 0x9e, 0xd4, 0xd7, 0x45, 0x4e, 0xca, + 0x56, 0x34, 0x21, 0xbc, 0x3e, 0x17, 0x5b, 0x6f, 0x77, 0x0c, 0x48, + 0x01, 0x43, 0x29, 0xb0, 0xdd, 0x3f, 0x96, 0x6e, 0xe6, 0x95, 0xaa, + 0x0c, 0xc0, 0x20, 0xb6, 0xfd, 0x3e, 0x36, 0x27, 0x9c, 0xe3, 0x5c, + 0xcf, 0x4e, 0x81, 0xdc, 0x19, 0xbb, 0x91, 0x90, 0x7d, 0xec, 0xe6, + 0x97, 0x04, 0x1e, 0x93, 0xcc, 0x22, 0x49, 0xd7, 0x97, 0x86, 0xb6, + 0x13, 0x0a, 0x3c, 0x43, 0x23, 0x77, 0x7e, 0xf0, 0xdc, 0xe6, 0xcd, + 0x24, 0x1f, 0x3b, 0x83, 0x9b, 0x34, 0x3a, 0x83, 0x34, 0xe3, 0x02, + 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x1f, 0x06, + 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x92, + 0xa4, 0x75, 0x2c, 0xa4, 0x9e, 0xbe, 0x81, 0x44, 0xeb, 0x79, 0xfc, + 0x8a, 0xc5, 0x95, 0xa5, 0xeb, 0x10, 0x75, 0x73, 0x30, 0x0f, 0x06, + 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, + 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, + 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x1d, 0x06, + 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x92, 0xa4, 0x75, + 0x2c, 0xa4, 0x9e, 0xbe, 0x81, 0x44, 0xeb, 0x79, 0xfc, 0x8a, 0xc5, + 0x95, 0xa5, 0xeb, 0x10, 0x75, 0x73, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x01, 0x00, 0x28, 0xd2, 0xe0, 0x86, 0xd5, 0xe6, 0xf8, + 0x7b, 0xf0, 0x97, 0xdc, 0x22, 0x6b, 0x3b, 0x95, 0x14, 0x56, 0x0f, + 0x11, 0x30, 0xa5, 0x9a, 0x4f, 0x3a, 0xb0, 0x3a, 0xe0, 0x06, 0xcb, + 0x65, 0xf5, 0xed, 0xc6, 0x97, 0x27, 0xfe, 0x25, 0xf2, 0x57, 0xe6, + 0x5e, 0x95, 0x8c, 0x3e, 0x64, 0x60, 0x15, 0x5a, 0x7f, 0x2f, 0x0d, + 0x01, 0xc5, 0xb1, 0x60, 0xfd, 0x45, 0x35, 0xcf, 0xf0, 0xb2, 0xbf, + 0x06, 0xd9, 0xef, 0x5a, 0xbe, 0xb3, 0x62, 0x21, 0xb4, 0xd7, 0xab, + 0x35, 0x7c, 0x53, 0x3e, 0xa6, 0x27, 0xf1, 0xa1, 0x2d, 0xda, 0x1a, + 0x23, 0x9d, 0xcc, 0xdd, 0xec, 0x3c, 0x2d, 0x9e, 0x27, 0x34, 0x5d, + 0x0f, 0xc2, 0x36, 0x79, 0xbc, 0xc9, 0x4a, 0x62, 0x2d, 0xed, 0x6b, + 0xd9, 0x7d, 0x41, 0x43, 0x7c, 0xb6, 0xaa, 0xca, 0xed, 0x61, 0xb1, + 0x37, 0x82, 0x15, 0x09, 0x1a, 0x8a, 0x16, 0x30, 0xd8, 0xec, 0xc9, + 0xd6, 0x47, 0x72, 0x78, 0x4b, 0x10, 0x46, 0x14, 0x8e, 0x5f, 0x0e, + 0xaf, 0xec, 0xc7, 0x2f, 0xab, 0x10, 0xd7, 0xb6, 0xf1, 0x6e, 0xec, + 0x86, 0xb2, 0xc2, 0xe8, 0x0d, 0x92, 0x73, 0xdc, 0xa2, 0xf4, 0x0f, + 0x3a, 0xbf, 0x61, 0x23, 0x10, 0x89, 0x9c, 0x48, 0x40, 0x6e, 0x70, + 0x00, 0xb3, 0xd3, 0xba, 0x37, 0x44, 0x58, 0x11, 0x7a, 0x02, 0x6a, + 0x88, 0xf0, 0x37, 0x34, 0xf0, 0x19, 0xe9, 0xac, 0xd4, 0x65, 0x73, + 0xf6, 0x69, 0x8c, 0x64, 0x94, 0x3a, 0x79, 0x85, 0x29, 0xb0, 0x16, + 0x2b, 0x0c, 0x82, 0x3f, 0x06, 0x9c, 0xc7, 0xfd, 0x10, 0x2b, 0x9e, + 0x0f, 0x2c, 0xb6, 0x9e, 0xe3, 0x15, 0xbf, 0xd9, 0x36, 0x1c, 0xba, + 0x25, 0x1a, 0x52, 0x3d, 0x1a, 0xec, 0x22, 0x0c, 0x1c, 0xe0, 0xa4, + 0xa2, 0x3d, 0xf0, 0xe8, 0x39, 0xcf, 0x81, 0xc0, 0x7b, 0xed, 0x5d, + 0x1f, 0x6f, 0xc5, 0xd0, 0x0b, 0xd7, 0x98, 0x30, 0x82, 0x03, 0x9f, + 0x30, 0x82, 0x02, 0x87, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, + 0x26, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x71, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x13, 0x44, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0x65, 0x20, 0x54, 0x65, 0x6c, 0x65, @@ -8701,239 +6739,264 @@ static const unsigned char ca_bundle_data[] = { 0x03, 0x55, 0x04, 0x03, 0x13, 0x1a, 0x44, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0x65, 0x20, 0x54, 0x65, 0x6c, 0x65, 0x6b, 0x6f, 0x6d, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, - 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, - 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xab, - 0x0b, 0xa3, 0x35, 0xe0, 0x8b, 0x29, 0x14, 0xb1, 0x14, 0x85, 0xaf, - 0x3c, 0x10, 0xe4, 0x39, 0x6f, 0x35, 0x5d, 0x4a, 0xae, 0xdd, 0xea, - 0x61, 0x8d, 0x95, 0x49, 0xf4, 0x6f, 0x64, 0xa3, 0x1a, 0x60, 0x66, - 0xa4, 0xa9, 0x40, 0x22, 0x84, 0xd9, 0xd4, 0xa5, 0xe5, 0x78, 0x93, - 0x0e, 0x68, 0x01, 0xad, 0xb9, 0x4d, 0x5c, 0x3a, 0xce, 0xd3, 0xb8, - 0xa8, 0x42, 0x40, 0xdf, 0xcf, 0xa3, 0xba, 0x82, 0x59, 0x6a, 0x92, - 0x1b, 0xac, 0x1c, 0x9a, 0xda, 0x08, 0x2b, 0x25, 0x27, 0xf9, 0x69, - 0x23, 0x47, 0xf1, 0xe0, 0xeb, 0x2c, 0x7a, 0x9b, 0xf5, 0x13, 0x02, - 0xd0, 0x7e, 0x34, 0x7c, 0xc2, 0x9e, 0x3c, 0x00, 0x59, 0xab, 0xf5, - 0xda, 0x0c, 0xf5, 0x32, 0x3c, 0x2b, 0xac, 0x50, 0xda, 0xd6, 0xc3, - 0xde, 0x83, 0x94, 0xca, 0xa8, 0x0c, 0x99, 0x32, 0x0e, 0x08, 0x48, - 0x56, 0x5b, 0x6a, 0xfb, 0xda, 0xe1, 0x58, 0x58, 0x01, 0x49, 0x5f, - 0x72, 0x41, 0x3c, 0x15, 0x06, 0x01, 0x8e, 0x5d, 0xad, 0xaa, 0xb8, - 0x93, 0xb4, 0xcd, 0x9e, 0xeb, 0xa7, 0xe8, 0x6a, 0x2d, 0x52, 0x34, - 0xdb, 0x3a, 0xef, 0x5c, 0x75, 0x51, 0xda, 0xdb, 0xf3, 0x31, 0xf9, - 0xee, 0x71, 0x98, 0x32, 0xc4, 0x54, 0x15, 0x44, 0x0c, 0xf9, 0x9b, - 0x55, 0xed, 0xad, 0xdf, 0x18, 0x08, 0xa0, 0xa3, 0x86, 0x8a, 0x49, - 0xee, 0x53, 0x05, 0x8f, 0x19, 0x4c, 0xd5, 0xde, 0x58, 0x79, 0x9b, - 0xd2, 0x6a, 0x1c, 0x42, 0xab, 0xc5, 0xd5, 0xa7, 0xcf, 0x68, 0x0f, - 0x96, 0xe4, 0xe1, 0x61, 0x98, 0x76, 0x61, 0xc8, 0x91, 0x7c, 0xd6, - 0x3e, 0x00, 0xe2, 0x91, 0x50, 0x87, 0xe1, 0x9d, 0x0a, 0xe6, 0xad, - 0x97, 0xd2, 0x1d, 0xc6, 0x3a, 0x7d, 0xcb, 0xbc, 0xda, 0x03, 0x34, - 0xd5, 0x8e, 0x5b, 0x01, 0xf5, 0x6a, 0x07, 0xb7, 0x16, 0xb6, 0x6e, - 0x4a, 0x7f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, - 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, - 0x31, 0xc3, 0x79, 0x1b, 0xba, 0xf5, 0x53, 0xd7, 0x17, 0xe0, 0x89, - 0x7a, 0x2d, 0x17, 0x6c, 0x0a, 0xb3, 0x2b, 0x9d, 0x33, 0x30, 0x0f, - 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, - 0xff, 0x02, 0x01, 0x05, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, - 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, - 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x94, 0x64, 0x59, 0xad, - 0x39, 0x64, 0xe7, 0x29, 0xeb, 0x13, 0xfe, 0x5a, 0xc3, 0x8b, 0x13, - 0x57, 0xc8, 0x04, 0x24, 0xf0, 0x74, 0x77, 0xc0, 0x60, 0xe3, 0x67, - 0xfb, 0xe9, 0x89, 0xa6, 0x83, 0xbf, 0x96, 0x82, 0x7c, 0x6e, 0xd4, - 0xc3, 0x3d, 0xef, 0x9e, 0x80, 0x6e, 0xbb, 0x29, 0xb4, 0x98, 0x7a, - 0xb1, 0x3b, 0x54, 0xeb, 0x39, 0x17, 0x47, 0x7e, 0x1a, 0x8e, 0x0b, - 0xfc, 0x1f, 0x31, 0x59, 0x31, 0x04, 0xb2, 0xce, 0x17, 0xf3, 0x2c, - 0xc7, 0x62, 0x36, 0x55, 0xe2, 0x22, 0xd8, 0x89, 0x55, 0xb4, 0x98, - 0x48, 0xaa, 0x64, 0xfa, 0xd6, 0x1c, 0x36, 0xd8, 0x44, 0x78, 0x5a, - 0x5a, 0x23, 0x3a, 0x57, 0x97, 0xf5, 0x7a, 0x30, 0x4f, 0xae, 0x9f, - 0x6a, 0x4c, 0x4b, 0x2b, 0x8e, 0xa0, 0x03, 0xe3, 0x3e, 0xe0, 0xa9, - 0xd4, 0xd2, 0x7b, 0xd2, 0xb3, 0xa8, 0xe2, 0x72, 0x3c, 0xad, 0x9e, - 0xff, 0x80, 0x59, 0xe4, 0x9b, 0x45, 0xb4, 0xf6, 0x3b, 0xb0, 0xcd, - 0x39, 0x19, 0x98, 0x32, 0xe5, 0xea, 0x21, 0x61, 0x90, 0xe4, 0x31, - 0x21, 0x8e, 0x34, 0xb1, 0xf7, 0x2f, 0x35, 0x4a, 0x85, 0x10, 0xda, - 0xe7, 0x8a, 0x37, 0x21, 0xbe, 0x59, 0x63, 0xe0, 0xf2, 0x85, 0x88, - 0x31, 0x53, 0xd4, 0x54, 0x14, 0x85, 0x70, 0x79, 0xf4, 0x2e, 0x06, - 0x77, 0x27, 0x75, 0x2f, 0x1f, 0xb8, 0x8a, 0xf9, 0xfe, 0xc5, 0xba, - 0xd8, 0x36, 0xe4, 0x83, 0xec, 0xe7, 0x65, 0xb7, 0xbf, 0x63, 0x5a, - 0xf3, 0x46, 0xaf, 0x81, 0x94, 0x37, 0xd4, 0x41, 0x8c, 0xd6, 0x23, - 0xd6, 0x1e, 0xcf, 0xf5, 0x68, 0x1b, 0x44, 0x63, 0xa2, 0x5a, 0xba, - 0xa7, 0x35, 0x59, 0xa1, 0xe5, 0x70, 0x05, 0x9b, 0x0e, 0x23, 0x57, - 0x99, 0x94, 0x0a, 0x6d, 0xba, 0x39, 0x63, 0x28, 0x86, 0x92, 0xf3, - 0x18, 0x84, 0xd8, 0xfb, 0xd1, 0xcf, 0x05, 0x56, 0x64, 0x57, 0x30, - 0x82, 0x03, 0xab, 0x30, 0x82, 0x02, 0x93, 0xa0, 0x03, 0x02, 0x01, - 0x02, 0x02, 0x11, 0x00, 0xc7, 0x28, 0x47, 0x09, 0xb3, 0xb8, 0x6c, - 0x45, 0x8c, 0x1d, 0xfa, 0x24, 0xf5, 0x36, 0x4e, 0xe9, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, - 0x05, 0x00, 0x30, 0x3c, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, - 0x04, 0x03, 0x13, 0x12, 0x43, 0x6f, 0x6d, 0x53, 0x69, 0x67, 0x6e, - 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x64, 0x20, 0x43, 0x41, - 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x07, - 0x43, 0x6f, 0x6d, 0x53, 0x69, 0x67, 0x6e, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49, 0x4c, 0x30, 0x1e, - 0x17, 0x0d, 0x30, 0x34, 0x30, 0x33, 0x32, 0x34, 0x31, 0x31, 0x33, - 0x37, 0x32, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x30, 0x33, 0x31, - 0x36, 0x31, 0x35, 0x30, 0x34, 0x35, 0x36, 0x5a, 0x30, 0x3c, 0x31, - 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x43, - 0x6f, 0x6d, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x53, 0x65, 0x63, 0x75, - 0x72, 0x65, 0x64, 0x20, 0x43, 0x41, 0x31, 0x10, 0x30, 0x0e, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x13, 0x07, 0x43, 0x6f, 0x6d, 0x53, 0x69, - 0x67, 0x6e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x49, 0x4c, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, - 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, - 0x82, 0x01, 0x01, 0x00, 0xc6, 0xb5, 0x68, 0x5f, 0x1d, 0x94, 0x15, - 0xc3, 0xa4, 0x08, 0x55, 0x2d, 0xe3, 0xa0, 0x57, 0x7a, 0xef, 0xe9, - 0x74, 0x2a, 0xbb, 0xb9, 0x7c, 0x57, 0x49, 0x1a, 0x11, 0x5e, 0x4f, - 0x29, 0x87, 0x0c, 0x48, 0xd6, 0x6a, 0xe7, 0x8f, 0xd4, 0x7e, 0x57, - 0x24, 0xb9, 0x06, 0x89, 0xe4, 0x1c, 0x3c, 0xea, 0xac, 0xe3, 0xda, - 0x21, 0x80, 0x73, 0x21, 0x0a, 0xef, 0x79, 0x98, 0x6c, 0x1f, 0x08, - 0xff, 0xa1, 0x50, 0x7d, 0xf2, 0x98, 0x1b, 0xc9, 0x54, 0x6f, 0x3e, - 0xa5, 0x28, 0xec, 0x21, 0x04, 0x0f, 0x45, 0xbb, 0x07, 0x3d, 0xa1, - 0xc0, 0xfa, 0x2a, 0x98, 0x1d, 0x4e, 0x06, 0x93, 0xfb, 0xf5, 0x88, - 0x3b, 0xab, 0x5f, 0xcb, 0x16, 0xbf, 0xe6, 0xf3, 0x9e, 0x4a, 0x87, - 0xed, 0x19, 0xea, 0xc2, 0x9f, 0x43, 0xe4, 0xf1, 0x81, 0xa5, 0x7f, - 0x10, 0x4f, 0x3e, 0xd1, 0x4a, 0x62, 0xad, 0x53, 0x1b, 0xcb, 0x83, - 0xff, 0x07, 0x65, 0xa5, 0x92, 0x2d, 0x66, 0xa9, 0x5b, 0xb8, 0x5a, - 0xf4, 0x1d, 0xb4, 0x21, 0x91, 0x4a, 0x17, 0x7b, 0x9e, 0x32, 0xfe, - 0x56, 0x24, 0x39, 0xb2, 0x54, 0x84, 0x43, 0xf5, 0x84, 0xc2, 0xd8, - 0xbc, 0x41, 0x90, 0xcc, 0x9d, 0xd6, 0x68, 0xda, 0xe9, 0x82, 0x50, - 0xa9, 0x3b, 0x68, 0xcf, 0xb5, 0x5d, 0x02, 0x94, 0x60, 0x16, 0xb1, - 0x43, 0xd9, 0x43, 0x5d, 0xdd, 0x5d, 0x87, 0x6e, 0xea, 0xbb, 0xb3, - 0xc9, 0x6b, 0xf6, 0x03, 0x94, 0x09, 0x70, 0xde, 0x16, 0x11, 0x7a, - 0x2b, 0xe8, 0x76, 0x8f, 0x49, 0x10, 0x98, 0x77, 0xb9, 0x63, 0x5c, - 0x8b, 0x33, 0x97, 0x75, 0xf6, 0x0b, 0x8c, 0xb2, 0xab, 0x5b, 0xde, - 0x74, 0x20, 0x25, 0x3f, 0xe3, 0xf3, 0x11, 0xf9, 0x87, 0x68, 0x86, - 0x35, 0x71, 0xc3, 0x1d, 0x8c, 0x2d, 0xeb, 0xe5, 0x1a, 0xac, 0x0f, - 0x73, 0xd5, 0x82, 0x59, 0x40, 0x80, 0xd3, 0x02, 0x03, 0x01, 0x00, - 0x01, 0xa3, 0x81, 0xa7, 0x30, 0x81, 0xa4, 0x30, 0x0c, 0x06, 0x03, - 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, - 0x44, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x3d, 0x30, 0x3b, 0x30, - 0x39, 0xa0, 0x37, 0xa0, 0x35, 0x86, 0x33, 0x68, 0x74, 0x74, 0x70, - 0x3a, 0x2f, 0x2f, 0x66, 0x65, 0x64, 0x69, 0x72, 0x2e, 0x63, 0x6f, - 0x6d, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x63, 0x6f, 0x2e, 0x69, 0x6c, - 0x2f, 0x63, 0x72, 0x6c, 0x2f, 0x43, 0x6f, 0x6d, 0x53, 0x69, 0x67, - 0x6e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x64, 0x43, 0x41, 0x2e, - 0x63, 0x72, 0x6c, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, - 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x1f, 0x06, - 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xc1, - 0x4b, 0xed, 0x70, 0xb6, 0xf7, 0x3e, 0x7c, 0x00, 0x3b, 0x00, 0x8f, - 0xc7, 0x3e, 0x0e, 0x45, 0x9f, 0x1e, 0x5d, 0xec, 0x30, 0x1d, 0x06, - 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xc1, 0x4b, 0xed, - 0x70, 0xb6, 0xf7, 0x3e, 0x7c, 0x00, 0x3b, 0x00, 0x8f, 0xc7, 0x3e, - 0x0e, 0x45, 0x9f, 0x1e, 0x5d, 0xec, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, - 0x82, 0x01, 0x01, 0x00, 0x16, 0xcf, 0xee, 0x92, 0x13, 0x50, 0xab, - 0x7b, 0x14, 0x9e, 0x33, 0xb6, 0x42, 0x20, 0x6a, 0xd4, 0x15, 0xbd, - 0x09, 0xab, 0xfc, 0x72, 0xe8, 0xef, 0x47, 0x7a, 0x90, 0xac, 0x51, - 0xc1, 0x64, 0x4e, 0xe9, 0x88, 0xbd, 0x43, 0x45, 0x81, 0xe3, 0x66, - 0x23, 0x3f, 0x12, 0x86, 0x4d, 0x19, 0xe4, 0x05, 0xb0, 0xe6, 0x37, - 0xc2, 0x8d, 0xda, 0x06, 0x28, 0xc9, 0x0f, 0x89, 0xa4, 0x53, 0xa9, - 0x75, 0x3f, 0xb0, 0x96, 0xfb, 0xab, 0x4c, 0x33, 0x55, 0xf9, 0x78, - 0x26, 0x46, 0x6f, 0x1b, 0x36, 0x98, 0xfb, 0x42, 0x76, 0xc1, 0x82, - 0xb9, 0x8e, 0xde, 0xfb, 0x45, 0xf9, 0x63, 0x1b, 0x62, 0x3b, 0x39, - 0x06, 0xca, 0x77, 0x7a, 0xa8, 0x3c, 0x09, 0xcf, 0x6c, 0x36, 0x3d, - 0x0f, 0x0a, 0x45, 0x4b, 0x69, 0x16, 0x1a, 0x45, 0x7d, 0x33, 0x03, - 0x65, 0xf9, 0x52, 0x71, 0x90, 0x26, 0x95, 0xac, 0x4c, 0x0c, 0xf5, - 0x8b, 0x93, 0x3f, 0xcc, 0x75, 0x74, 0x85, 0x98, 0xba, 0xff, 0x62, - 0x7a, 0x4d, 0x1f, 0x89, 0xfe, 0xae, 0xbd, 0x94, 0x00, 0x99, 0xbf, - 0x11, 0xa5, 0xdc, 0xe0, 0x79, 0xc5, 0x16, 0x0b, 0x7d, 0x02, 0x61, - 0x1d, 0xea, 0x85, 0xf9, 0x02, 0x15, 0x4f, 0xe7, 0x5a, 0x89, 0x4e, - 0x14, 0x6f, 0xe3, 0x37, 0x4b, 0x85, 0xf5, 0xc1, 0x3c, 0x61, 0xe0, - 0xfd, 0x05, 0x41, 0xb2, 0x92, 0x7f, 0xc3, 0x1d, 0xa0, 0xd0, 0xae, - 0x52, 0x64, 0x60, 0x6b, 0x18, 0xc6, 0x26, 0x9c, 0xd8, 0xf5, 0x64, - 0xe4, 0x36, 0x1a, 0x62, 0x9f, 0x8a, 0x0f, 0x3e, 0xff, 0x6d, 0x4e, - 0x19, 0x56, 0x4e, 0x20, 0x91, 0x6c, 0x9f, 0x34, 0x33, 0x3a, 0x34, - 0x57, 0x50, 0x3a, 0x6f, 0x81, 0x5e, 0x06, 0xc6, 0xf5, 0x3e, 0x7c, - 0x4e, 0x8e, 0x2b, 0xce, 0x65, 0x06, 0x2e, 0x5d, 0xd2, 0x2a, 0x53, - 0x74, 0x5e, 0xd3, 0x6e, 0x27, 0x9e, 0x8f, 0x30, 0x82, 0x03, 0xa1, - 0x30, 0x82, 0x02, 0x89, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0b, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x85, 0xaa, 0x2d, 0x48, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x05, 0x05, 0x00, 0x30, 0x3b, 0x31, 0x18, 0x30, 0x16, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0f, 0x43, 0x79, 0x62, 0x65, 0x72, - 0x74, 0x72, 0x75, 0x73, 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x31, - 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x16, 0x43, - 0x79, 0x62, 0x65, 0x72, 0x74, 0x72, 0x75, 0x73, 0x74, 0x20, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, - 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x32, 0x31, 0x35, 0x30, 0x38, - 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x31, 0x31, 0x32, - 0x31, 0x35, 0x30, 0x38, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x3b, - 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0f, - 0x43, 0x79, 0x62, 0x65, 0x72, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2c, - 0x20, 0x49, 0x6e, 0x63, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, - 0x04, 0x03, 0x13, 0x16, 0x43, 0x79, 0x62, 0x65, 0x72, 0x74, 0x72, - 0x75, 0x73, 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, - 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, - 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, - 0x82, 0x01, 0x01, 0x00, 0xf8, 0xc8, 0xbc, 0xbd, 0x14, 0x50, 0x66, - 0x13, 0xff, 0xf0, 0xd3, 0x79, 0xec, 0x23, 0xf2, 0xb7, 0x1a, 0xc7, - 0x8e, 0x85, 0xf1, 0x12, 0x73, 0xa6, 0x19, 0xaa, 0x10, 0xdb, 0x9c, - 0xa2, 0x65, 0x74, 0x5a, 0x77, 0x3e, 0x51, 0x7d, 0x56, 0xf6, 0xdc, - 0x23, 0xb6, 0xd4, 0xed, 0x5f, 0x58, 0xb1, 0x37, 0x4d, 0xd5, 0x49, - 0x0e, 0x6e, 0xf5, 0x6a, 0x87, 0xd6, 0xd2, 0x8c, 0xd2, 0x27, 0xc6, - 0xe2, 0xff, 0x36, 0x9f, 0x98, 0x65, 0xa0, 0x13, 0x4e, 0xc6, 0x2a, - 0x64, 0x9b, 0xd5, 0x90, 0x12, 0xcf, 0x14, 0x06, 0xf4, 0x3b, 0xe3, - 0xd4, 0x28, 0xbe, 0xe8, 0x0e, 0xf8, 0xab, 0x4e, 0x48, 0x94, 0x6d, - 0x8e, 0x95, 0x31, 0x10, 0x5c, 0xed, 0xa2, 0x2d, 0xbd, 0xd5, 0x3a, - 0x6d, 0xb2, 0x1c, 0xbb, 0x60, 0xc0, 0x46, 0x4b, 0x01, 0xf5, 0x49, - 0xae, 0x7e, 0x46, 0x8a, 0xd0, 0x74, 0x8d, 0xa1, 0x0c, 0x02, 0xce, - 0xee, 0xfc, 0xe7, 0x8f, 0xb8, 0x6b, 0x66, 0xf3, 0x7f, 0x44, 0x00, - 0xbf, 0x66, 0x25, 0x14, 0x2b, 0xdd, 0x10, 0x30, 0x1d, 0x07, 0x96, - 0x3f, 0x4d, 0xf6, 0x6b, 0xb8, 0x8f, 0xb7, 0x7b, 0x0c, 0xa5, 0x38, - 0xeb, 0xde, 0x47, 0xdb, 0xd5, 0x5d, 0x39, 0xfc, 0x88, 0xa7, 0xf3, - 0xd7, 0x2a, 0x74, 0xf1, 0xe8, 0x5a, 0xa2, 0x3b, 0x9f, 0x50, 0xba, - 0xa6, 0x8c, 0x45, 0x35, 0xc2, 0x50, 0x65, 0x95, 0xdc, 0x63, 0x82, - 0xef, 0xdd, 0xbf, 0x77, 0x4d, 0x9c, 0x62, 0xc9, 0x63, 0x73, 0x16, - 0xd0, 0x29, 0x0f, 0x49, 0xa9, 0x48, 0xf0, 0xb3, 0xaa, 0xb7, 0x6c, - 0xc5, 0xa7, 0x30, 0x39, 0x40, 0x5d, 0xae, 0xc4, 0xe2, 0x5d, 0x26, - 0x53, 0xf0, 0xce, 0x1c, 0x23, 0x08, 0x61, 0xa8, 0x94, 0x19, 0xba, - 0x04, 0x62, 0x40, 0xec, 0x1f, 0x38, 0x70, 0x77, 0x12, 0x06, 0x71, - 0xa7, 0x30, 0x18, 0x5d, 0x25, 0x27, 0xa5, 0x02, 0x03, 0x01, 0x00, - 0x01, 0xa3, 0x81, 0xa5, 0x30, 0x81, 0xa2, 0x30, 0x0e, 0x06, 0x03, + 0x1e, 0x17, 0x0d, 0x39, 0x39, 0x30, 0x37, 0x30, 0x39, 0x31, 0x32, + 0x31, 0x31, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x31, 0x39, 0x30, 0x37, + 0x30, 0x39, 0x32, 0x33, 0x35, 0x39, 0x30, 0x30, 0x5a, 0x30, 0x71, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x44, 0x45, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x13, 0x13, 0x44, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0x65, 0x20, + 0x54, 0x65, 0x6c, 0x65, 0x6b, 0x6f, 0x6d, 0x20, 0x41, 0x47, 0x31, + 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x16, 0x54, + 0x2d, 0x54, 0x65, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x20, 0x54, 0x72, + 0x75, 0x73, 0x74, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x31, + 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1a, 0x44, + 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0x65, 0x20, 0x54, 0x65, 0x6c, + 0x65, 0x6b, 0x6f, 0x6d, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, + 0x41, 0x20, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, + 0x01, 0x01, 0x00, 0xab, 0x0b, 0xa3, 0x35, 0xe0, 0x8b, 0x29, 0x14, + 0xb1, 0x14, 0x85, 0xaf, 0x3c, 0x10, 0xe4, 0x39, 0x6f, 0x35, 0x5d, + 0x4a, 0xae, 0xdd, 0xea, 0x61, 0x8d, 0x95, 0x49, 0xf4, 0x6f, 0x64, + 0xa3, 0x1a, 0x60, 0x66, 0xa4, 0xa9, 0x40, 0x22, 0x84, 0xd9, 0xd4, + 0xa5, 0xe5, 0x78, 0x93, 0x0e, 0x68, 0x01, 0xad, 0xb9, 0x4d, 0x5c, + 0x3a, 0xce, 0xd3, 0xb8, 0xa8, 0x42, 0x40, 0xdf, 0xcf, 0xa3, 0xba, + 0x82, 0x59, 0x6a, 0x92, 0x1b, 0xac, 0x1c, 0x9a, 0xda, 0x08, 0x2b, + 0x25, 0x27, 0xf9, 0x69, 0x23, 0x47, 0xf1, 0xe0, 0xeb, 0x2c, 0x7a, + 0x9b, 0xf5, 0x13, 0x02, 0xd0, 0x7e, 0x34, 0x7c, 0xc2, 0x9e, 0x3c, + 0x00, 0x59, 0xab, 0xf5, 0xda, 0x0c, 0xf5, 0x32, 0x3c, 0x2b, 0xac, + 0x50, 0xda, 0xd6, 0xc3, 0xde, 0x83, 0x94, 0xca, 0xa8, 0x0c, 0x99, + 0x32, 0x0e, 0x08, 0x48, 0x56, 0x5b, 0x6a, 0xfb, 0xda, 0xe1, 0x58, + 0x58, 0x01, 0x49, 0x5f, 0x72, 0x41, 0x3c, 0x15, 0x06, 0x01, 0x8e, + 0x5d, 0xad, 0xaa, 0xb8, 0x93, 0xb4, 0xcd, 0x9e, 0xeb, 0xa7, 0xe8, + 0x6a, 0x2d, 0x52, 0x34, 0xdb, 0x3a, 0xef, 0x5c, 0x75, 0x51, 0xda, + 0xdb, 0xf3, 0x31, 0xf9, 0xee, 0x71, 0x98, 0x32, 0xc4, 0x54, 0x15, + 0x44, 0x0c, 0xf9, 0x9b, 0x55, 0xed, 0xad, 0xdf, 0x18, 0x08, 0xa0, + 0xa3, 0x86, 0x8a, 0x49, 0xee, 0x53, 0x05, 0x8f, 0x19, 0x4c, 0xd5, + 0xde, 0x58, 0x79, 0x9b, 0xd2, 0x6a, 0x1c, 0x42, 0xab, 0xc5, 0xd5, + 0xa7, 0xcf, 0x68, 0x0f, 0x96, 0xe4, 0xe1, 0x61, 0x98, 0x76, 0x61, + 0xc8, 0x91, 0x7c, 0xd6, 0x3e, 0x00, 0xe2, 0x91, 0x50, 0x87, 0xe1, + 0x9d, 0x0a, 0xe6, 0xad, 0x97, 0xd2, 0x1d, 0xc6, 0x3a, 0x7d, 0xcb, + 0xbc, 0xda, 0x03, 0x34, 0xd5, 0x8e, 0x5b, 0x01, 0xf5, 0x6a, 0x07, + 0xb7, 0x16, 0xb6, 0x6e, 0x4a, 0x7f, 0x02, 0x03, 0x01, 0x00, 0x01, + 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, + 0x04, 0x16, 0x04, 0x14, 0x31, 0xc3, 0x79, 0x1b, 0xba, 0xf5, 0x53, + 0xd7, 0x17, 0xe0, 0x89, 0x7a, 0x2d, 0x17, 0x6c, 0x0a, 0xb3, 0x2b, + 0x9d, 0x33, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x08, + 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x05, 0x30, 0x0e, 0x06, + 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, + 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, + 0x94, 0x64, 0x59, 0xad, 0x39, 0x64, 0xe7, 0x29, 0xeb, 0x13, 0xfe, + 0x5a, 0xc3, 0x8b, 0x13, 0x57, 0xc8, 0x04, 0x24, 0xf0, 0x74, 0x77, + 0xc0, 0x60, 0xe3, 0x67, 0xfb, 0xe9, 0x89, 0xa6, 0x83, 0xbf, 0x96, + 0x82, 0x7c, 0x6e, 0xd4, 0xc3, 0x3d, 0xef, 0x9e, 0x80, 0x6e, 0xbb, + 0x29, 0xb4, 0x98, 0x7a, 0xb1, 0x3b, 0x54, 0xeb, 0x39, 0x17, 0x47, + 0x7e, 0x1a, 0x8e, 0x0b, 0xfc, 0x1f, 0x31, 0x59, 0x31, 0x04, 0xb2, + 0xce, 0x17, 0xf3, 0x2c, 0xc7, 0x62, 0x36, 0x55, 0xe2, 0x22, 0xd8, + 0x89, 0x55, 0xb4, 0x98, 0x48, 0xaa, 0x64, 0xfa, 0xd6, 0x1c, 0x36, + 0xd8, 0x44, 0x78, 0x5a, 0x5a, 0x23, 0x3a, 0x57, 0x97, 0xf5, 0x7a, + 0x30, 0x4f, 0xae, 0x9f, 0x6a, 0x4c, 0x4b, 0x2b, 0x8e, 0xa0, 0x03, + 0xe3, 0x3e, 0xe0, 0xa9, 0xd4, 0xd2, 0x7b, 0xd2, 0xb3, 0xa8, 0xe2, + 0x72, 0x3c, 0xad, 0x9e, 0xff, 0x80, 0x59, 0xe4, 0x9b, 0x45, 0xb4, + 0xf6, 0x3b, 0xb0, 0xcd, 0x39, 0x19, 0x98, 0x32, 0xe5, 0xea, 0x21, + 0x61, 0x90, 0xe4, 0x31, 0x21, 0x8e, 0x34, 0xb1, 0xf7, 0x2f, 0x35, + 0x4a, 0x85, 0x10, 0xda, 0xe7, 0x8a, 0x37, 0x21, 0xbe, 0x59, 0x63, + 0xe0, 0xf2, 0x85, 0x88, 0x31, 0x53, 0xd4, 0x54, 0x14, 0x85, 0x70, + 0x79, 0xf4, 0x2e, 0x06, 0x77, 0x27, 0x75, 0x2f, 0x1f, 0xb8, 0x8a, + 0xf9, 0xfe, 0xc5, 0xba, 0xd8, 0x36, 0xe4, 0x83, 0xec, 0xe7, 0x65, + 0xb7, 0xbf, 0x63, 0x5a, 0xf3, 0x46, 0xaf, 0x81, 0x94, 0x37, 0xd4, + 0x41, 0x8c, 0xd6, 0x23, 0xd6, 0x1e, 0xcf, 0xf5, 0x68, 0x1b, 0x44, + 0x63, 0xa2, 0x5a, 0xba, 0xa7, 0x35, 0x59, 0xa1, 0xe5, 0x70, 0x05, + 0x9b, 0x0e, 0x23, 0x57, 0x99, 0x94, 0x0a, 0x6d, 0xba, 0x39, 0x63, + 0x28, 0x86, 0x92, 0xf3, 0x18, 0x84, 0xd8, 0xfb, 0xd1, 0xcf, 0x05, + 0x56, 0x64, 0x57, 0x30, 0x82, 0x03, 0xab, 0x30, 0x82, 0x02, 0x93, + 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x11, 0x00, 0xc7, 0x28, 0x47, + 0x09, 0xb3, 0xb8, 0x6c, 0x45, 0x8c, 0x1d, 0xfa, 0x24, 0xf5, 0x36, + 0x4e, 0xe9, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x3c, 0x31, 0x1b, 0x30, + 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x43, 0x6f, 0x6d, + 0x53, 0x69, 0x67, 0x6e, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, + 0x64, 0x20, 0x43, 0x41, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x13, 0x07, 0x43, 0x6f, 0x6d, 0x53, 0x69, 0x67, 0x6e, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x49, 0x4c, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x34, 0x30, 0x33, 0x32, + 0x34, 0x31, 0x31, 0x33, 0x37, 0x32, 0x30, 0x5a, 0x17, 0x0d, 0x32, + 0x39, 0x30, 0x33, 0x31, 0x36, 0x31, 0x35, 0x30, 0x34, 0x35, 0x36, + 0x5a, 0x30, 0x3c, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x12, 0x43, 0x6f, 0x6d, 0x53, 0x69, 0x67, 0x6e, 0x20, + 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x64, 0x20, 0x43, 0x41, 0x31, + 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x07, 0x43, + 0x6f, 0x6d, 0x53, 0x69, 0x67, 0x6e, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49, 0x4c, 0x30, 0x82, 0x01, + 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, + 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xc6, 0xb5, 0x68, + 0x5f, 0x1d, 0x94, 0x15, 0xc3, 0xa4, 0x08, 0x55, 0x2d, 0xe3, 0xa0, + 0x57, 0x7a, 0xef, 0xe9, 0x74, 0x2a, 0xbb, 0xb9, 0x7c, 0x57, 0x49, + 0x1a, 0x11, 0x5e, 0x4f, 0x29, 0x87, 0x0c, 0x48, 0xd6, 0x6a, 0xe7, + 0x8f, 0xd4, 0x7e, 0x57, 0x24, 0xb9, 0x06, 0x89, 0xe4, 0x1c, 0x3c, + 0xea, 0xac, 0xe3, 0xda, 0x21, 0x80, 0x73, 0x21, 0x0a, 0xef, 0x79, + 0x98, 0x6c, 0x1f, 0x08, 0xff, 0xa1, 0x50, 0x7d, 0xf2, 0x98, 0x1b, + 0xc9, 0x54, 0x6f, 0x3e, 0xa5, 0x28, 0xec, 0x21, 0x04, 0x0f, 0x45, + 0xbb, 0x07, 0x3d, 0xa1, 0xc0, 0xfa, 0x2a, 0x98, 0x1d, 0x4e, 0x06, + 0x93, 0xfb, 0xf5, 0x88, 0x3b, 0xab, 0x5f, 0xcb, 0x16, 0xbf, 0xe6, + 0xf3, 0x9e, 0x4a, 0x87, 0xed, 0x19, 0xea, 0xc2, 0x9f, 0x43, 0xe4, + 0xf1, 0x81, 0xa5, 0x7f, 0x10, 0x4f, 0x3e, 0xd1, 0x4a, 0x62, 0xad, + 0x53, 0x1b, 0xcb, 0x83, 0xff, 0x07, 0x65, 0xa5, 0x92, 0x2d, 0x66, + 0xa9, 0x5b, 0xb8, 0x5a, 0xf4, 0x1d, 0xb4, 0x21, 0x91, 0x4a, 0x17, + 0x7b, 0x9e, 0x32, 0xfe, 0x56, 0x24, 0x39, 0xb2, 0x54, 0x84, 0x43, + 0xf5, 0x84, 0xc2, 0xd8, 0xbc, 0x41, 0x90, 0xcc, 0x9d, 0xd6, 0x68, + 0xda, 0xe9, 0x82, 0x50, 0xa9, 0x3b, 0x68, 0xcf, 0xb5, 0x5d, 0x02, + 0x94, 0x60, 0x16, 0xb1, 0x43, 0xd9, 0x43, 0x5d, 0xdd, 0x5d, 0x87, + 0x6e, 0xea, 0xbb, 0xb3, 0xc9, 0x6b, 0xf6, 0x03, 0x94, 0x09, 0x70, + 0xde, 0x16, 0x11, 0x7a, 0x2b, 0xe8, 0x76, 0x8f, 0x49, 0x10, 0x98, + 0x77, 0xb9, 0x63, 0x5c, 0x8b, 0x33, 0x97, 0x75, 0xf6, 0x0b, 0x8c, + 0xb2, 0xab, 0x5b, 0xde, 0x74, 0x20, 0x25, 0x3f, 0xe3, 0xf3, 0x11, + 0xf9, 0x87, 0x68, 0x86, 0x35, 0x71, 0xc3, 0x1d, 0x8c, 0x2d, 0xeb, + 0xe5, 0x1a, 0xac, 0x0f, 0x73, 0xd5, 0x82, 0x59, 0x40, 0x80, 0xd3, + 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xa7, 0x30, 0x81, 0xa4, + 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, + 0x01, 0x01, 0xff, 0x30, 0x44, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, + 0x3d, 0x30, 0x3b, 0x30, 0x39, 0xa0, 0x37, 0xa0, 0x35, 0x86, 0x33, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x66, 0x65, 0x64, 0x69, + 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x63, + 0x6f, 0x2e, 0x69, 0x6c, 0x2f, 0x63, 0x72, 0x6c, 0x2f, 0x43, 0x6f, + 0x6d, 0x53, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, + 0x64, 0x43, 0x41, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, - 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, - 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, - 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xb6, 0x08, 0x7b, 0x0d, - 0x7a, 0xcc, 0xac, 0x20, 0x4c, 0x86, 0x56, 0x32, 0x5e, 0xcf, 0xab, - 0x6e, 0x85, 0x2d, 0x70, 0x57, 0x30, 0x3f, 0x06, 0x03, 0x55, 0x1d, - 0x1f, 0x04, 0x38, 0x30, 0x36, 0x30, 0x34, 0xa0, 0x32, 0xa0, 0x30, - 0x86, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, - 0x77, 0x32, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2d, 0x74, - 0x72, 0x75, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x72, - 0x6c, 0x2f, 0x63, 0x74, 0x2f, 0x63, 0x74, 0x72, 0x6f, 0x6f, 0x74, - 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, - 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xb6, 0x08, 0x7b, 0x0d, 0x7a, - 0xcc, 0xac, 0x20, 0x4c, 0x86, 0x56, 0x32, 0x5e, 0xcf, 0xab, 0x6e, - 0x85, 0x2d, 0x70, 0x57, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, - 0x01, 0x00, 0x56, 0xef, 0x0a, 0x23, 0xa0, 0x54, 0x4e, 0x95, 0x97, - 0xc9, 0xf8, 0x89, 0xda, 0x45, 0xc1, 0xd4, 0xa3, 0x00, 0x25, 0xf4, - 0x1f, 0x13, 0xab, 0xb7, 0xa3, 0x85, 0x58, 0x69, 0xc2, 0x30, 0xad, - 0xd8, 0x15, 0x8a, 0x2d, 0xe3, 0xc9, 0xcd, 0x81, 0x5a, 0xf8, 0x73, - 0x23, 0x5a, 0xa7, 0x7c, 0x05, 0xf3, 0xfd, 0x22, 0x3b, 0x0e, 0xd1, - 0x06, 0xc4, 0xdb, 0x36, 0x4c, 0x73, 0x04, 0x8e, 0xe5, 0xb0, 0x22, - 0xe4, 0xc5, 0xf3, 0x2e, 0xa5, 0xd9, 0x23, 0xe3, 0xb8, 0x4e, 0x4a, - 0x20, 0xa7, 0x6e, 0x02, 0x24, 0x9f, 0x22, 0x60, 0x67, 0x7b, 0x8b, - 0x1d, 0x72, 0x09, 0xc5, 0x31, 0x5c, 0xe9, 0x79, 0x9f, 0x80, 0x47, - 0x3d, 0xad, 0xa1, 0x0b, 0x07, 0x14, 0x3d, 0x47, 0xff, 0x03, 0x69, - 0x1a, 0x0c, 0x0b, 0x44, 0xe7, 0x63, 0x25, 0xa7, 0x7f, 0xb2, 0xc9, - 0xb8, 0x76, 0x84, 0xed, 0x23, 0xf6, 0x7d, 0x07, 0xab, 0x45, 0x7e, - 0xd3, 0xdf, 0xb3, 0xbf, 0xe9, 0x8a, 0xb6, 0xcd, 0xa8, 0xa2, 0x67, - 0x2b, 0x52, 0xd5, 0xb7, 0x65, 0xf0, 0x39, 0x4c, 0x63, 0xa0, 0x91, - 0x79, 0x93, 0x52, 0x0f, 0x54, 0xdd, 0x83, 0xbb, 0x9f, 0xd1, 0x8f, - 0xa7, 0x53, 0x73, 0xc3, 0xcb, 0xff, 0x30, 0xec, 0x7c, 0x04, 0xb8, - 0xd8, 0x44, 0x1f, 0x93, 0x5f, 0x71, 0x09, 0x22, 0xb7, 0x6e, 0x3e, - 0xea, 0x1c, 0x03, 0x4e, 0x9d, 0x1a, 0x20, 0x61, 0xfb, 0x81, 0x37, - 0xec, 0x5e, 0xfc, 0x0a, 0x45, 0xab, 0xd7, 0xe7, 0x17, 0x55, 0xd0, - 0xa0, 0xea, 0x60, 0x9b, 0xa6, 0xf6, 0xe3, 0x8c, 0x5b, 0x29, 0xc2, - 0x06, 0x60, 0x14, 0x9d, 0x2d, 0x97, 0x4c, 0xa9, 0x93, 0x15, 0x9d, - 0x61, 0xc4, 0x01, 0x5f, 0x48, 0xd6, 0x58, 0xbd, 0x56, 0x31, 0x12, - 0x4e, 0x11, 0xc8, 0x21, 0xe0, 0xb3, 0x11, 0x91, 0x65, 0xdb, 0xb4, - 0xa6, 0x88, 0x38, 0xce, 0x55, 0x30, 0x82, 0x05, 0xb0, 0x30, 0x82, - 0x03, 0x98, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x15, 0xc8, - 0xbd, 0x65, 0x47, 0x5c, 0xaf, 0xb8, 0x97, 0x00, 0x5e, 0xe4, 0x06, - 0xd2, 0xbc, 0x9d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x5e, 0x31, 0x0b, + 0x86, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, + 0x16, 0x80, 0x14, 0xc1, 0x4b, 0xed, 0x70, 0xb6, 0xf7, 0x3e, 0x7c, + 0x00, 0x3b, 0x00, 0x8f, 0xc7, 0x3e, 0x0e, 0x45, 0x9f, 0x1e, 0x5d, + 0xec, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, + 0x14, 0xc1, 0x4b, 0xed, 0x70, 0xb6, 0xf7, 0x3e, 0x7c, 0x00, 0x3b, + 0x00, 0x8f, 0xc7, 0x3e, 0x0e, 0x45, 0x9f, 0x1e, 0x5d, 0xec, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x16, 0xcf, 0xee, + 0x92, 0x13, 0x50, 0xab, 0x7b, 0x14, 0x9e, 0x33, 0xb6, 0x42, 0x20, + 0x6a, 0xd4, 0x15, 0xbd, 0x09, 0xab, 0xfc, 0x72, 0xe8, 0xef, 0x47, + 0x7a, 0x90, 0xac, 0x51, 0xc1, 0x64, 0x4e, 0xe9, 0x88, 0xbd, 0x43, + 0x45, 0x81, 0xe3, 0x66, 0x23, 0x3f, 0x12, 0x86, 0x4d, 0x19, 0xe4, + 0x05, 0xb0, 0xe6, 0x37, 0xc2, 0x8d, 0xda, 0x06, 0x28, 0xc9, 0x0f, + 0x89, 0xa4, 0x53, 0xa9, 0x75, 0x3f, 0xb0, 0x96, 0xfb, 0xab, 0x4c, + 0x33, 0x55, 0xf9, 0x78, 0x26, 0x46, 0x6f, 0x1b, 0x36, 0x98, 0xfb, + 0x42, 0x76, 0xc1, 0x82, 0xb9, 0x8e, 0xde, 0xfb, 0x45, 0xf9, 0x63, + 0x1b, 0x62, 0x3b, 0x39, 0x06, 0xca, 0x77, 0x7a, 0xa8, 0x3c, 0x09, + 0xcf, 0x6c, 0x36, 0x3d, 0x0f, 0x0a, 0x45, 0x4b, 0x69, 0x16, 0x1a, + 0x45, 0x7d, 0x33, 0x03, 0x65, 0xf9, 0x52, 0x71, 0x90, 0x26, 0x95, + 0xac, 0x4c, 0x0c, 0xf5, 0x8b, 0x93, 0x3f, 0xcc, 0x75, 0x74, 0x85, + 0x98, 0xba, 0xff, 0x62, 0x7a, 0x4d, 0x1f, 0x89, 0xfe, 0xae, 0xbd, + 0x94, 0x00, 0x99, 0xbf, 0x11, 0xa5, 0xdc, 0xe0, 0x79, 0xc5, 0x16, + 0x0b, 0x7d, 0x02, 0x61, 0x1d, 0xea, 0x85, 0xf9, 0x02, 0x15, 0x4f, + 0xe7, 0x5a, 0x89, 0x4e, 0x14, 0x6f, 0xe3, 0x37, 0x4b, 0x85, 0xf5, + 0xc1, 0x3c, 0x61, 0xe0, 0xfd, 0x05, 0x41, 0xb2, 0x92, 0x7f, 0xc3, + 0x1d, 0xa0, 0xd0, 0xae, 0x52, 0x64, 0x60, 0x6b, 0x18, 0xc6, 0x26, + 0x9c, 0xd8, 0xf5, 0x64, 0xe4, 0x36, 0x1a, 0x62, 0x9f, 0x8a, 0x0f, + 0x3e, 0xff, 0x6d, 0x4e, 0x19, 0x56, 0x4e, 0x20, 0x91, 0x6c, 0x9f, + 0x34, 0x33, 0x3a, 0x34, 0x57, 0x50, 0x3a, 0x6f, 0x81, 0x5e, 0x06, + 0xc6, 0xf5, 0x3e, 0x7c, 0x4e, 0x8e, 0x2b, 0xce, 0x65, 0x06, 0x2e, + 0x5d, 0xd2, 0x2a, 0x53, 0x74, 0x5e, 0xd3, 0x6e, 0x27, 0x9e, 0x8f, + 0x30, 0x82, 0x03, 0xa1, 0x30, 0x82, 0x02, 0x89, 0xa0, 0x03, 0x02, + 0x01, 0x02, 0x02, 0x0b, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0f, + 0x85, 0xaa, 0x2d, 0x48, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x3b, 0x31, + 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0f, 0x43, + 0x79, 0x62, 0x65, 0x72, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2c, 0x20, + 0x49, 0x6e, 0x63, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x16, 0x43, 0x79, 0x62, 0x65, 0x72, 0x74, 0x72, 0x75, + 0x73, 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, + 0x6f, 0x6f, 0x74, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x32, + 0x31, 0x35, 0x30, 0x38, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, + 0x32, 0x31, 0x31, 0x32, 0x31, 0x35, 0x30, 0x38, 0x30, 0x30, 0x30, + 0x30, 0x5a, 0x30, 0x3b, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x13, 0x0f, 0x43, 0x79, 0x62, 0x65, 0x72, 0x74, 0x72, + 0x75, 0x73, 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x1f, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x16, 0x43, 0x79, 0x62, + 0x65, 0x72, 0x74, 0x72, 0x75, 0x73, 0x74, 0x20, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x82, 0x01, + 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, + 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xf8, 0xc8, 0xbc, + 0xbd, 0x14, 0x50, 0x66, 0x13, 0xff, 0xf0, 0xd3, 0x79, 0xec, 0x23, + 0xf2, 0xb7, 0x1a, 0xc7, 0x8e, 0x85, 0xf1, 0x12, 0x73, 0xa6, 0x19, + 0xaa, 0x10, 0xdb, 0x9c, 0xa2, 0x65, 0x74, 0x5a, 0x77, 0x3e, 0x51, + 0x7d, 0x56, 0xf6, 0xdc, 0x23, 0xb6, 0xd4, 0xed, 0x5f, 0x58, 0xb1, + 0x37, 0x4d, 0xd5, 0x49, 0x0e, 0x6e, 0xf5, 0x6a, 0x87, 0xd6, 0xd2, + 0x8c, 0xd2, 0x27, 0xc6, 0xe2, 0xff, 0x36, 0x9f, 0x98, 0x65, 0xa0, + 0x13, 0x4e, 0xc6, 0x2a, 0x64, 0x9b, 0xd5, 0x90, 0x12, 0xcf, 0x14, + 0x06, 0xf4, 0x3b, 0xe3, 0xd4, 0x28, 0xbe, 0xe8, 0x0e, 0xf8, 0xab, + 0x4e, 0x48, 0x94, 0x6d, 0x8e, 0x95, 0x31, 0x10, 0x5c, 0xed, 0xa2, + 0x2d, 0xbd, 0xd5, 0x3a, 0x6d, 0xb2, 0x1c, 0xbb, 0x60, 0xc0, 0x46, + 0x4b, 0x01, 0xf5, 0x49, 0xae, 0x7e, 0x46, 0x8a, 0xd0, 0x74, 0x8d, + 0xa1, 0x0c, 0x02, 0xce, 0xee, 0xfc, 0xe7, 0x8f, 0xb8, 0x6b, 0x66, + 0xf3, 0x7f, 0x44, 0x00, 0xbf, 0x66, 0x25, 0x14, 0x2b, 0xdd, 0x10, + 0x30, 0x1d, 0x07, 0x96, 0x3f, 0x4d, 0xf6, 0x6b, 0xb8, 0x8f, 0xb7, + 0x7b, 0x0c, 0xa5, 0x38, 0xeb, 0xde, 0x47, 0xdb, 0xd5, 0x5d, 0x39, + 0xfc, 0x88, 0xa7, 0xf3, 0xd7, 0x2a, 0x74, 0xf1, 0xe8, 0x5a, 0xa2, + 0x3b, 0x9f, 0x50, 0xba, 0xa6, 0x8c, 0x45, 0x35, 0xc2, 0x50, 0x65, + 0x95, 0xdc, 0x63, 0x82, 0xef, 0xdd, 0xbf, 0x77, 0x4d, 0x9c, 0x62, + 0xc9, 0x63, 0x73, 0x16, 0xd0, 0x29, 0x0f, 0x49, 0xa9, 0x48, 0xf0, + 0xb3, 0xaa, 0xb7, 0x6c, 0xc5, 0xa7, 0x30, 0x39, 0x40, 0x5d, 0xae, + 0xc4, 0xe2, 0x5d, 0x26, 0x53, 0xf0, 0xce, 0x1c, 0x23, 0x08, 0x61, + 0xa8, 0x94, 0x19, 0xba, 0x04, 0x62, 0x40, 0xec, 0x1f, 0x38, 0x70, + 0x77, 0x12, 0x06, 0x71, 0xa7, 0x30, 0x18, 0x5d, 0x25, 0x27, 0xa5, + 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xa5, 0x30, 0x81, 0xa2, + 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, + 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, + 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0xb6, 0x08, 0x7b, 0x0d, 0x7a, 0xcc, 0xac, 0x20, 0x4c, 0x86, 0x56, + 0x32, 0x5e, 0xcf, 0xab, 0x6e, 0x85, 0x2d, 0x70, 0x57, 0x30, 0x3f, + 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x38, 0x30, 0x36, 0x30, 0x34, + 0xa0, 0x32, 0xa0, 0x30, 0x86, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x32, 0x2e, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x2d, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x63, 0x72, 0x6c, 0x2f, 0x63, 0x74, 0x2f, 0x63, 0x74, + 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x1f, 0x06, + 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xb6, + 0x08, 0x7b, 0x0d, 0x7a, 0xcc, 0xac, 0x20, 0x4c, 0x86, 0x56, 0x32, + 0x5e, 0xcf, 0xab, 0x6e, 0x85, 0x2d, 0x70, 0x57, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x56, 0xef, 0x0a, 0x23, 0xa0, + 0x54, 0x4e, 0x95, 0x97, 0xc9, 0xf8, 0x89, 0xda, 0x45, 0xc1, 0xd4, + 0xa3, 0x00, 0x25, 0xf4, 0x1f, 0x13, 0xab, 0xb7, 0xa3, 0x85, 0x58, + 0x69, 0xc2, 0x30, 0xad, 0xd8, 0x15, 0x8a, 0x2d, 0xe3, 0xc9, 0xcd, + 0x81, 0x5a, 0xf8, 0x73, 0x23, 0x5a, 0xa7, 0x7c, 0x05, 0xf3, 0xfd, + 0x22, 0x3b, 0x0e, 0xd1, 0x06, 0xc4, 0xdb, 0x36, 0x4c, 0x73, 0x04, + 0x8e, 0xe5, 0xb0, 0x22, 0xe4, 0xc5, 0xf3, 0x2e, 0xa5, 0xd9, 0x23, + 0xe3, 0xb8, 0x4e, 0x4a, 0x20, 0xa7, 0x6e, 0x02, 0x24, 0x9f, 0x22, + 0x60, 0x67, 0x7b, 0x8b, 0x1d, 0x72, 0x09, 0xc5, 0x31, 0x5c, 0xe9, + 0x79, 0x9f, 0x80, 0x47, 0x3d, 0xad, 0xa1, 0x0b, 0x07, 0x14, 0x3d, + 0x47, 0xff, 0x03, 0x69, 0x1a, 0x0c, 0x0b, 0x44, 0xe7, 0x63, 0x25, + 0xa7, 0x7f, 0xb2, 0xc9, 0xb8, 0x76, 0x84, 0xed, 0x23, 0xf6, 0x7d, + 0x07, 0xab, 0x45, 0x7e, 0xd3, 0xdf, 0xb3, 0xbf, 0xe9, 0x8a, 0xb6, + 0xcd, 0xa8, 0xa2, 0x67, 0x2b, 0x52, 0xd5, 0xb7, 0x65, 0xf0, 0x39, + 0x4c, 0x63, 0xa0, 0x91, 0x79, 0x93, 0x52, 0x0f, 0x54, 0xdd, 0x83, + 0xbb, 0x9f, 0xd1, 0x8f, 0xa7, 0x53, 0x73, 0xc3, 0xcb, 0xff, 0x30, + 0xec, 0x7c, 0x04, 0xb8, 0xd8, 0x44, 0x1f, 0x93, 0x5f, 0x71, 0x09, + 0x22, 0xb7, 0x6e, 0x3e, 0xea, 0x1c, 0x03, 0x4e, 0x9d, 0x1a, 0x20, + 0x61, 0xfb, 0x81, 0x37, 0xec, 0x5e, 0xfc, 0x0a, 0x45, 0xab, 0xd7, + 0xe7, 0x17, 0x55, 0xd0, 0xa0, 0xea, 0x60, 0x9b, 0xa6, 0xf6, 0xe3, + 0x8c, 0x5b, 0x29, 0xc2, 0x06, 0x60, 0x14, 0x9d, 0x2d, 0x97, 0x4c, + 0xa9, 0x93, 0x15, 0x9d, 0x61, 0xc4, 0x01, 0x5f, 0x48, 0xd6, 0x58, + 0xbd, 0x56, 0x31, 0x12, 0x4e, 0x11, 0xc8, 0x21, 0xe0, 0xb3, 0x11, + 0x91, 0x65, 0xdb, 0xb4, 0xa6, 0x88, 0x38, 0xce, 0x55, 0x30, 0x82, + 0x05, 0xb0, 0x30, 0x82, 0x03, 0x98, 0xa0, 0x03, 0x02, 0x01, 0x02, + 0x02, 0x10, 0x15, 0xc8, 0xbd, 0x65, 0x47, 0x5c, 0xaf, 0xb8, 0x97, + 0x00, 0x5e, 0xe4, 0x06, 0xd2, 0xbc, 0x9d, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, + 0x30, 0x5e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x54, 0x57, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x0c, 0x1a, 0x43, 0x68, 0x75, 0x6e, 0x67, 0x68, 0x77, + 0x61, 0x20, 0x54, 0x65, 0x6c, 0x65, 0x63, 0x6f, 0x6d, 0x20, 0x43, + 0x6f, 0x2e, 0x2c, 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x31, 0x2a, 0x30, + 0x28, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x21, 0x65, 0x50, 0x4b, + 0x49, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, + 0x0d, 0x30, 0x34, 0x31, 0x32, 0x32, 0x30, 0x30, 0x32, 0x33, 0x31, + 0x32, 0x37, 0x5a, 0x17, 0x0d, 0x33, 0x34, 0x31, 0x32, 0x32, 0x30, + 0x30, 0x32, 0x33, 0x31, 0x32, 0x37, 0x5a, 0x30, 0x5e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x54, 0x57, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1a, 0x43, 0x68, 0x75, 0x6e, 0x67, 0x68, 0x77, 0x61, 0x20, 0x54, 0x65, @@ -8942,1114 +7005,1082 @@ static const unsigned char ca_bundle_data[] = { 0x04, 0x0b, 0x0c, 0x21, 0x65, 0x50, 0x4b, 0x49, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x34, 0x31, - 0x32, 0x32, 0x30, 0x30, 0x32, 0x33, 0x31, 0x32, 0x37, 0x5a, 0x17, - 0x0d, 0x33, 0x34, 0x31, 0x32, 0x32, 0x30, 0x30, 0x32, 0x33, 0x31, - 0x32, 0x37, 0x5a, 0x30, 0x5e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, - 0x55, 0x04, 0x06, 0x13, 0x02, 0x54, 0x57, 0x31, 0x23, 0x30, 0x21, - 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1a, 0x43, 0x68, 0x75, 0x6e, - 0x67, 0x68, 0x77, 0x61, 0x20, 0x54, 0x65, 0x6c, 0x65, 0x63, 0x6f, - 0x6d, 0x20, 0x43, 0x6f, 0x2e, 0x2c, 0x20, 0x4c, 0x74, 0x64, 0x2e, - 0x31, 0x2a, 0x30, 0x28, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x21, - 0x65, 0x50, 0x4b, 0x49, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, - 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, - 0xe1, 0x25, 0x0f, 0xee, 0x8d, 0xdb, 0x88, 0x33, 0x75, 0x67, 0xcd, - 0xad, 0x1f, 0x7d, 0x3a, 0x4e, 0x6d, 0x9d, 0xd3, 0x2f, 0x14, 0xf3, - 0x63, 0x74, 0xcb, 0x01, 0x21, 0x6a, 0x37, 0xea, 0x84, 0x50, 0x07, - 0x4b, 0x26, 0x5b, 0x09, 0x43, 0x6c, 0x21, 0x9e, 0x6a, 0xc8, 0xd5, - 0x03, 0xf5, 0x60, 0x69, 0x8f, 0xcc, 0xf0, 0x22, 0xe4, 0x1f, 0xe7, - 0xf7, 0x6a, 0x22, 0x31, 0xb7, 0x2c, 0x15, 0xf2, 0xe0, 0xfe, 0x00, - 0x6a, 0x43, 0xff, 0x87, 0x65, 0xc6, 0xb5, 0x1a, 0xc1, 0xa7, 0x4c, - 0x6d, 0x22, 0x70, 0x21, 0x8a, 0x31, 0xf2, 0x97, 0x74, 0x89, 0x09, - 0x12, 0x26, 0x1c, 0x9e, 0xca, 0xd9, 0x12, 0xa2, 0x95, 0x3c, 0xda, - 0xe9, 0x67, 0xbf, 0x08, 0xa0, 0x64, 0xe3, 0xd6, 0x42, 0xb7, 0x45, - 0xef, 0x97, 0xf4, 0xf6, 0xf5, 0xd7, 0xb5, 0x4a, 0x15, 0x02, 0x58, - 0x7d, 0x98, 0x58, 0x4b, 0x60, 0xbc, 0xcd, 0xd7, 0x0d, 0x9a, 0x13, - 0x33, 0x53, 0xd1, 0x61, 0xf9, 0x7a, 0xd5, 0xd7, 0x78, 0xb3, 0x9a, - 0x33, 0xf7, 0x00, 0x86, 0xce, 0x1d, 0x4d, 0x94, 0x38, 0xaf, 0xa8, - 0xec, 0x78, 0x51, 0x70, 0x8a, 0x5c, 0x10, 0x83, 0x51, 0x21, 0xf7, - 0x11, 0x3d, 0x34, 0x86, 0x5e, 0xe5, 0x48, 0xcd, 0x97, 0x81, 0x82, - 0x35, 0x4c, 0x19, 0xec, 0x65, 0xf6, 0x6b, 0xc5, 0x05, 0xa1, 0xee, - 0x47, 0x13, 0xd6, 0xb3, 0x21, 0x27, 0x94, 0x10, 0x0a, 0xd9, 0x24, - 0x3b, 0xba, 0xbe, 0x44, 0x13, 0x46, 0x30, 0x3f, 0x97, 0x3c, 0xd8, - 0xd7, 0xd7, 0x6a, 0xee, 0x3b, 0x38, 0xe3, 0x2b, 0xd4, 0x97, 0x0e, - 0xb9, 0x1b, 0xe7, 0x07, 0x49, 0x7f, 0x37, 0x2a, 0xf9, 0x77, 0x78, - 0xcf, 0x54, 0xed, 0x5b, 0x46, 0x9d, 0xa3, 0x80, 0x0e, 0x91, 0x43, - 0xc1, 0xd6, 0x5b, 0x5f, 0x14, 0xba, 0x9f, 0xa6, 0x8d, 0x24, 0x47, - 0x40, 0x59, 0xbf, 0x72, 0x38, 0xb2, 0x36, 0x6c, 0x37, 0xff, 0x99, - 0xd1, 0x5d, 0x0e, 0x59, 0x0a, 0xab, 0x69, 0xf7, 0xc0, 0xb2, 0x04, - 0x45, 0x7a, 0x54, 0x00, 0xae, 0xbe, 0x53, 0xf6, 0xb5, 0xe7, 0xe1, - 0xf8, 0x3c, 0xa3, 0x31, 0xd2, 0xa9, 0xfe, 0x21, 0x52, 0x64, 0xc5, - 0xa6, 0x67, 0xf0, 0x75, 0x07, 0x06, 0x94, 0x14, 0x81, 0x55, 0xc6, - 0x27, 0xe4, 0x01, 0x8f, 0x17, 0xc1, 0x6a, 0x71, 0xd7, 0xbe, 0x4b, - 0xfb, 0x94, 0x58, 0x7d, 0x7e, 0x11, 0x33, 0xb1, 0x42, 0xf7, 0x62, - 0x6c, 0x18, 0xd6, 0xcf, 0x09, 0x68, 0x3e, 0x7f, 0x6c, 0xf6, 0x1e, - 0x8f, 0x62, 0xad, 0xa5, 0x63, 0xdb, 0x09, 0xa7, 0x1f, 0x22, 0x42, - 0x41, 0x1e, 0x6f, 0x99, 0x8a, 0x3e, 0xd7, 0xf9, 0x3f, 0x40, 0x7a, - 0x79, 0xb0, 0xa5, 0x01, 0x92, 0xd2, 0x9d, 0x3d, 0x08, 0x15, 0xa5, - 0x10, 0x01, 0x2d, 0xb3, 0x32, 0x76, 0xa8, 0x95, 0x0d, 0xb3, 0x7a, - 0x9a, 0xfb, 0x07, 0x10, 0x78, 0x11, 0x6f, 0xe1, 0x8f, 0xc7, 0xba, - 0x0f, 0x25, 0x1a, 0x74, 0x2a, 0xe5, 0x1c, 0x98, 0x41, 0x99, 0xdf, - 0x21, 0x87, 0xe8, 0x95, 0x06, 0x6a, 0x0a, 0xb3, 0x6a, 0x47, 0x76, - 0x65, 0xf6, 0x3a, 0xcf, 0x8f, 0x62, 0x17, 0x19, 0x7b, 0x0a, 0x28, - 0xcd, 0x1a, 0xd2, 0x83, 0x1e, 0x21, 0xc7, 0x2c, 0xbf, 0xbe, 0xff, - 0x61, 0x68, 0xb7, 0x67, 0x1b, 0xbb, 0x78, 0x4d, 0x8d, 0xce, 0x67, - 0xe5, 0xe4, 0xc1, 0x8e, 0xb7, 0x23, 0x66, 0xe2, 0x9d, 0x90, 0x75, - 0x34, 0x98, 0xa9, 0x36, 0x2b, 0x8a, 0x9a, 0x94, 0xb9, 0x9d, 0xec, - 0xcc, 0x8a, 0xb1, 0xf8, 0x25, 0x89, 0x5c, 0x5a, 0xb6, 0x2f, 0x8c, - 0x1f, 0x6d, 0x79, 0x24, 0xa7, 0x52, 0x68, 0xc3, 0x84, 0x35, 0xe2, - 0x66, 0x8d, 0x63, 0x0e, 0x25, 0x4d, 0xd5, 0x19, 0xb2, 0xe6, 0x79, - 0x37, 0xa7, 0x22, 0x9d, 0x54, 0x31, 0x02, 0x03, 0x01, 0x00, 0x01, - 0xa3, 0x6a, 0x30, 0x68, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, - 0x04, 0x16, 0x04, 0x14, 0x1e, 0x0c, 0xf7, 0xb6, 0x67, 0xf2, 0xe1, - 0x92, 0x26, 0x09, 0x45, 0xc0, 0x55, 0x39, 0x2e, 0x77, 0x3f, 0x42, - 0x4a, 0xa2, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, - 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x39, 0x06, 0x04, 0x67, 0x2a, - 0x07, 0x00, 0x04, 0x31, 0x30, 0x2f, 0x30, 0x2d, 0x02, 0x01, 0x00, - 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, - 0x30, 0x07, 0x06, 0x05, 0x67, 0x2a, 0x03, 0x00, 0x00, 0x04, 0x14, - 0x45, 0xb0, 0xc2, 0xc7, 0x0a, 0x56, 0x7c, 0xee, 0x5b, 0x78, 0x0c, - 0x95, 0xf9, 0x18, 0x53, 0xc1, 0xa6, 0x1c, 0xd8, 0x10, 0x30, 0x0d, + 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, + 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, + 0x82, 0x02, 0x01, 0x00, 0xe1, 0x25, 0x0f, 0xee, 0x8d, 0xdb, 0x88, + 0x33, 0x75, 0x67, 0xcd, 0xad, 0x1f, 0x7d, 0x3a, 0x4e, 0x6d, 0x9d, + 0xd3, 0x2f, 0x14, 0xf3, 0x63, 0x74, 0xcb, 0x01, 0x21, 0x6a, 0x37, + 0xea, 0x84, 0x50, 0x07, 0x4b, 0x26, 0x5b, 0x09, 0x43, 0x6c, 0x21, + 0x9e, 0x6a, 0xc8, 0xd5, 0x03, 0xf5, 0x60, 0x69, 0x8f, 0xcc, 0xf0, + 0x22, 0xe4, 0x1f, 0xe7, 0xf7, 0x6a, 0x22, 0x31, 0xb7, 0x2c, 0x15, + 0xf2, 0xe0, 0xfe, 0x00, 0x6a, 0x43, 0xff, 0x87, 0x65, 0xc6, 0xb5, + 0x1a, 0xc1, 0xa7, 0x4c, 0x6d, 0x22, 0x70, 0x21, 0x8a, 0x31, 0xf2, + 0x97, 0x74, 0x89, 0x09, 0x12, 0x26, 0x1c, 0x9e, 0xca, 0xd9, 0x12, + 0xa2, 0x95, 0x3c, 0xda, 0xe9, 0x67, 0xbf, 0x08, 0xa0, 0x64, 0xe3, + 0xd6, 0x42, 0xb7, 0x45, 0xef, 0x97, 0xf4, 0xf6, 0xf5, 0xd7, 0xb5, + 0x4a, 0x15, 0x02, 0x58, 0x7d, 0x98, 0x58, 0x4b, 0x60, 0xbc, 0xcd, + 0xd7, 0x0d, 0x9a, 0x13, 0x33, 0x53, 0xd1, 0x61, 0xf9, 0x7a, 0xd5, + 0xd7, 0x78, 0xb3, 0x9a, 0x33, 0xf7, 0x00, 0x86, 0xce, 0x1d, 0x4d, + 0x94, 0x38, 0xaf, 0xa8, 0xec, 0x78, 0x51, 0x70, 0x8a, 0x5c, 0x10, + 0x83, 0x51, 0x21, 0xf7, 0x11, 0x3d, 0x34, 0x86, 0x5e, 0xe5, 0x48, + 0xcd, 0x97, 0x81, 0x82, 0x35, 0x4c, 0x19, 0xec, 0x65, 0xf6, 0x6b, + 0xc5, 0x05, 0xa1, 0xee, 0x47, 0x13, 0xd6, 0xb3, 0x21, 0x27, 0x94, + 0x10, 0x0a, 0xd9, 0x24, 0x3b, 0xba, 0xbe, 0x44, 0x13, 0x46, 0x30, + 0x3f, 0x97, 0x3c, 0xd8, 0xd7, 0xd7, 0x6a, 0xee, 0x3b, 0x38, 0xe3, + 0x2b, 0xd4, 0x97, 0x0e, 0xb9, 0x1b, 0xe7, 0x07, 0x49, 0x7f, 0x37, + 0x2a, 0xf9, 0x77, 0x78, 0xcf, 0x54, 0xed, 0x5b, 0x46, 0x9d, 0xa3, + 0x80, 0x0e, 0x91, 0x43, 0xc1, 0xd6, 0x5b, 0x5f, 0x14, 0xba, 0x9f, + 0xa6, 0x8d, 0x24, 0x47, 0x40, 0x59, 0xbf, 0x72, 0x38, 0xb2, 0x36, + 0x6c, 0x37, 0xff, 0x99, 0xd1, 0x5d, 0x0e, 0x59, 0x0a, 0xab, 0x69, + 0xf7, 0xc0, 0xb2, 0x04, 0x45, 0x7a, 0x54, 0x00, 0xae, 0xbe, 0x53, + 0xf6, 0xb5, 0xe7, 0xe1, 0xf8, 0x3c, 0xa3, 0x31, 0xd2, 0xa9, 0xfe, + 0x21, 0x52, 0x64, 0xc5, 0xa6, 0x67, 0xf0, 0x75, 0x07, 0x06, 0x94, + 0x14, 0x81, 0x55, 0xc6, 0x27, 0xe4, 0x01, 0x8f, 0x17, 0xc1, 0x6a, + 0x71, 0xd7, 0xbe, 0x4b, 0xfb, 0x94, 0x58, 0x7d, 0x7e, 0x11, 0x33, + 0xb1, 0x42, 0xf7, 0x62, 0x6c, 0x18, 0xd6, 0xcf, 0x09, 0x68, 0x3e, + 0x7f, 0x6c, 0xf6, 0x1e, 0x8f, 0x62, 0xad, 0xa5, 0x63, 0xdb, 0x09, + 0xa7, 0x1f, 0x22, 0x42, 0x41, 0x1e, 0x6f, 0x99, 0x8a, 0x3e, 0xd7, + 0xf9, 0x3f, 0x40, 0x7a, 0x79, 0xb0, 0xa5, 0x01, 0x92, 0xd2, 0x9d, + 0x3d, 0x08, 0x15, 0xa5, 0x10, 0x01, 0x2d, 0xb3, 0x32, 0x76, 0xa8, + 0x95, 0x0d, 0xb3, 0x7a, 0x9a, 0xfb, 0x07, 0x10, 0x78, 0x11, 0x6f, + 0xe1, 0x8f, 0xc7, 0xba, 0x0f, 0x25, 0x1a, 0x74, 0x2a, 0xe5, 0x1c, + 0x98, 0x41, 0x99, 0xdf, 0x21, 0x87, 0xe8, 0x95, 0x06, 0x6a, 0x0a, + 0xb3, 0x6a, 0x47, 0x76, 0x65, 0xf6, 0x3a, 0xcf, 0x8f, 0x62, 0x17, + 0x19, 0x7b, 0x0a, 0x28, 0xcd, 0x1a, 0xd2, 0x83, 0x1e, 0x21, 0xc7, + 0x2c, 0xbf, 0xbe, 0xff, 0x61, 0x68, 0xb7, 0x67, 0x1b, 0xbb, 0x78, + 0x4d, 0x8d, 0xce, 0x67, 0xe5, 0xe4, 0xc1, 0x8e, 0xb7, 0x23, 0x66, + 0xe2, 0x9d, 0x90, 0x75, 0x34, 0x98, 0xa9, 0x36, 0x2b, 0x8a, 0x9a, + 0x94, 0xb9, 0x9d, 0xec, 0xcc, 0x8a, 0xb1, 0xf8, 0x25, 0x89, 0x5c, + 0x5a, 0xb6, 0x2f, 0x8c, 0x1f, 0x6d, 0x79, 0x24, 0xa7, 0x52, 0x68, + 0xc3, 0x84, 0x35, 0xe2, 0x66, 0x8d, 0x63, 0x0e, 0x25, 0x4d, 0xd5, + 0x19, 0xb2, 0xe6, 0x79, 0x37, 0xa7, 0x22, 0x9d, 0x54, 0x31, 0x02, + 0x03, 0x01, 0x00, 0x01, 0xa3, 0x6a, 0x30, 0x68, 0x30, 0x1d, 0x06, + 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x1e, 0x0c, 0xf7, + 0xb6, 0x67, 0xf2, 0xe1, 0x92, 0x26, 0x09, 0x45, 0xc0, 0x55, 0x39, + 0x2e, 0x77, 0x3f, 0x42, 0x4a, 0xa2, 0x30, 0x0c, 0x06, 0x03, 0x55, + 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x39, + 0x06, 0x04, 0x67, 0x2a, 0x07, 0x00, 0x04, 0x31, 0x30, 0x2f, 0x30, + 0x2d, 0x02, 0x01, 0x00, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, + 0x02, 0x1a, 0x05, 0x00, 0x30, 0x07, 0x06, 0x05, 0x67, 0x2a, 0x03, + 0x00, 0x00, 0x04, 0x14, 0x45, 0xb0, 0xc2, 0xc7, 0x0a, 0x56, 0x7c, + 0xee, 0x5b, 0x78, 0x0c, 0x95, 0xf9, 0x18, 0x53, 0xc1, 0xa6, 0x1c, + 0xd8, 0x10, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, + 0x09, 0xb3, 0x83, 0x53, 0x59, 0x01, 0x3e, 0x95, 0x49, 0xb9, 0xf1, + 0x81, 0xba, 0xf9, 0x76, 0x20, 0x23, 0xb5, 0x27, 0x60, 0x74, 0xd4, + 0x6a, 0x99, 0x34, 0x5e, 0x6c, 0x00, 0x53, 0xd9, 0x9f, 0xf2, 0xa6, + 0xb1, 0x24, 0x07, 0x44, 0x6a, 0x2a, 0xc6, 0xa5, 0x8e, 0x78, 0x12, + 0xe8, 0x47, 0xd9, 0x58, 0x1b, 0x13, 0x2a, 0x5e, 0x79, 0x9b, 0x9f, + 0x0a, 0x2a, 0x67, 0xa6, 0x25, 0x3f, 0x06, 0x69, 0x56, 0x73, 0xc3, + 0x8a, 0x66, 0x48, 0xfb, 0x29, 0x81, 0x57, 0x74, 0x06, 0xca, 0x9c, + 0xea, 0x28, 0xe8, 0x38, 0x67, 0x26, 0x2b, 0xf1, 0xd5, 0xb5, 0x3f, + 0x65, 0x93, 0xf8, 0x36, 0x5d, 0x8e, 0x8d, 0x8d, 0x40, 0x20, 0x87, + 0x19, 0xea, 0xef, 0x27, 0xc0, 0x3d, 0xb4, 0x39, 0x0f, 0x25, 0x7b, + 0x68, 0x50, 0x74, 0x55, 0x9c, 0x0c, 0x59, 0x7d, 0x5a, 0x3d, 0x41, + 0x94, 0x25, 0x52, 0x08, 0xe0, 0x47, 0x2c, 0x15, 0x31, 0x19, 0xd5, + 0xbf, 0x07, 0x55, 0xc6, 0xbb, 0x12, 0xb5, 0x97, 0xf4, 0x5f, 0x83, + 0x85, 0xba, 0x71, 0xc1, 0xd9, 0x6c, 0x81, 0x11, 0x76, 0x0a, 0x0a, + 0xb0, 0xbf, 0x82, 0x97, 0xf7, 0xea, 0x3d, 0xfa, 0xfa, 0xec, 0x2d, + 0xa9, 0x28, 0x94, 0x3b, 0x56, 0xdd, 0xd2, 0x51, 0x2e, 0xae, 0xc0, + 0xbd, 0x08, 0x15, 0x8c, 0x77, 0x52, 0x34, 0x96, 0xd6, 0x9b, 0xac, + 0xd3, 0x1d, 0x8e, 0x61, 0x0f, 0x35, 0x7b, 0x9b, 0xae, 0x39, 0x69, + 0x0b, 0x62, 0x60, 0x40, 0x20, 0x36, 0x8f, 0xaf, 0xfb, 0x36, 0xee, + 0x2d, 0x08, 0x4a, 0x1d, 0xb8, 0xbf, 0x9b, 0x5c, 0xf8, 0xea, 0xa5, + 0x1b, 0xa0, 0x73, 0xa6, 0xd8, 0xf8, 0x6e, 0xe0, 0x33, 0x04, 0x5f, + 0x68, 0xaa, 0x27, 0x87, 0xed, 0xd9, 0xc1, 0x90, 0x9c, 0xed, 0xbd, + 0xe3, 0x6a, 0x35, 0xaf, 0x63, 0xdf, 0xab, 0x18, 0xd9, 0xba, 0xe6, + 0xe9, 0x4a, 0xea, 0x50, 0x8a, 0x0f, 0x61, 0x93, 0x1e, 0xe2, 0x2d, + 0x19, 0xe2, 0x30, 0x94, 0x35, 0x92, 0x5d, 0x0e, 0xb6, 0x07, 0xaf, + 0x19, 0x80, 0x8f, 0x47, 0x90, 0x51, 0x4b, 0x2e, 0x4d, 0xdd, 0x85, + 0xe2, 0xd2, 0x0a, 0x52, 0x0a, 0x17, 0x9a, 0xfc, 0x1a, 0xb0, 0x50, + 0x02, 0xe5, 0x01, 0xa3, 0x63, 0x37, 0x21, 0x4c, 0x44, 0xc4, 0x9b, + 0x51, 0x99, 0x11, 0x0e, 0x73, 0x9c, 0x06, 0x8f, 0x54, 0x2e, 0xa7, + 0x28, 0x5e, 0x44, 0x39, 0x87, 0x56, 0x2d, 0x37, 0xbd, 0x85, 0x44, + 0x94, 0xe1, 0x0c, 0x4b, 0x2c, 0x9c, 0xc3, 0x92, 0x85, 0x34, 0x61, + 0xcb, 0x0f, 0xb8, 0x9b, 0x4a, 0x43, 0x52, 0xfe, 0x34, 0x3a, 0x7d, + 0xb8, 0xe9, 0x29, 0xdc, 0x76, 0xa9, 0xc8, 0x30, 0xf8, 0x14, 0x71, + 0x80, 0xc6, 0x1e, 0x36, 0x48, 0x74, 0x22, 0x41, 0x5c, 0x87, 0x82, + 0xe8, 0x18, 0x71, 0x8b, 0x41, 0x89, 0x44, 0xe7, 0x7e, 0x58, 0x5b, + 0xa8, 0xb8, 0x8d, 0x13, 0xe9, 0xa7, 0x6c, 0xc3, 0x47, 0xed, 0xb3, + 0x1a, 0x9d, 0x62, 0xae, 0x8d, 0x82, 0xea, 0x94, 0x9e, 0xdd, 0x59, + 0x10, 0xc3, 0xad, 0xdd, 0xe2, 0x4d, 0xe3, 0x31, 0xd5, 0xc7, 0xec, + 0xe8, 0xf2, 0xb0, 0xfe, 0x92, 0x1e, 0x16, 0x0a, 0x1a, 0xfc, 0xd9, + 0xf3, 0xf8, 0x27, 0xb6, 0xc9, 0xbe, 0x1d, 0xb4, 0x6c, 0x64, 0x90, + 0x7f, 0xf4, 0xe4, 0xc4, 0x5b, 0xd7, 0x37, 0xae, 0x42, 0x0e, 0xdd, + 0xa4, 0x1a, 0x6f, 0x7c, 0x88, 0x54, 0xc5, 0x16, 0x6e, 0xe1, 0x7a, + 0x68, 0x2e, 0xf8, 0x3a, 0xbf, 0x0d, 0xa4, 0x3c, 0x89, 0x3b, 0x78, + 0xa7, 0x4e, 0x63, 0x83, 0x04, 0x21, 0x08, 0x67, 0x8d, 0xf2, 0x82, + 0x49, 0xd0, 0x5b, 0xfd, 0xb1, 0xcd, 0x0f, 0x83, 0x84, 0xd4, 0x3e, + 0x20, 0x85, 0xf7, 0x4a, 0x3d, 0x2b, 0x9c, 0xfd, 0x2a, 0x0a, 0x09, + 0x4d, 0xea, 0x81, 0xf8, 0x11, 0x9c, 0x30, 0x82, 0x05, 0x17, 0x30, + 0x82, 0x03, 0xff, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x11, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x05, 0x05, 0x00, 0x30, 0x82, 0x01, 0x2b, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x54, 0x52, 0x31, + 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x0f, 0x47, + 0x65, 0x62, 0x7a, 0x65, 0x20, 0x2d, 0x20, 0x4b, 0x6f, 0x63, 0x61, + 0x65, 0x6c, 0x69, 0x31, 0x47, 0x30, 0x45, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x0c, 0x3e, 0x54, 0xc3, 0xbc, 0x72, 0x6b, 0x69, 0x79, 0x65, + 0x20, 0x42, 0x69, 0x6c, 0x69, 0x6d, 0x73, 0x65, 0x6c, 0x20, 0x76, + 0x65, 0x20, 0x54, 0x65, 0x6b, 0x6e, 0x6f, 0x6c, 0x6f, 0x6a, 0x69, + 0x6b, 0x20, 0x41, 0x72, 0x61, 0xc5, 0x9f, 0x74, 0xc4, 0xb1, 0x72, + 0x6d, 0x61, 0x20, 0x4b, 0x75, 0x72, 0x75, 0x6d, 0x75, 0x20, 0x2d, + 0x20, 0x54, 0xc3, 0x9c, 0x42, 0xc4, 0xb0, 0x54, 0x41, 0x4b, 0x31, + 0x48, 0x30, 0x46, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x3f, 0x55, + 0x6c, 0x75, 0x73, 0x61, 0x6c, 0x20, 0x45, 0x6c, 0x65, 0x6b, 0x74, + 0x72, 0x6f, 0x6e, 0x69, 0x6b, 0x20, 0x76, 0x65, 0x20, 0x4b, 0x72, + 0x69, 0x70, 0x74, 0x6f, 0x6c, 0x6f, 0x6a, 0x69, 0x20, 0x41, 0x72, + 0x61, 0xc5, 0x9f, 0x74, 0xc4, 0xb1, 0x72, 0x6d, 0x61, 0x20, 0x45, + 0x6e, 0x73, 0x74, 0x69, 0x74, 0xc3, 0xbc, 0x73, 0xc3, 0xbc, 0x20, + 0x2d, 0x20, 0x55, 0x45, 0x4b, 0x41, 0x45, 0x31, 0x23, 0x30, 0x21, + 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x1a, 0x4b, 0x61, 0x6d, 0x75, + 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x6b, 0x61, 0x73, + 0x79, 0x6f, 0x6e, 0x20, 0x4d, 0x65, 0x72, 0x6b, 0x65, 0x7a, 0x69, + 0x31, 0x4a, 0x30, 0x48, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x41, + 0x54, 0xc3, 0x9c, 0x42, 0xc4, 0xb0, 0x54, 0x41, 0x4b, 0x20, 0x55, + 0x45, 0x4b, 0x41, 0x45, 0x20, 0x4b, 0xc3, 0xb6, 0x6b, 0x20, 0x53, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x6b, 0x61, 0x20, 0x48, 0x69, + 0x7a, 0x6d, 0x65, 0x74, 0x20, 0x53, 0x61, 0xc4, 0x9f, 0x6c, 0x61, + 0x79, 0xc4, 0xb1, 0x63, 0xc4, 0xb1, 0x73, 0xc4, 0xb1, 0x20, 0x2d, + 0x20, 0x53, 0xc3, 0xbc, 0x72, 0xc3, 0xbc, 0x6d, 0x20, 0x33, 0x30, + 0x1e, 0x17, 0x0d, 0x30, 0x37, 0x30, 0x38, 0x32, 0x34, 0x31, 0x31, + 0x33, 0x37, 0x30, 0x37, 0x5a, 0x17, 0x0d, 0x31, 0x37, 0x30, 0x38, + 0x32, 0x31, 0x31, 0x31, 0x33, 0x37, 0x30, 0x37, 0x5a, 0x30, 0x82, + 0x01, 0x2b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x54, 0x52, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, + 0x04, 0x07, 0x0c, 0x0f, 0x47, 0x65, 0x62, 0x7a, 0x65, 0x20, 0x2d, + 0x20, 0x4b, 0x6f, 0x63, 0x61, 0x65, 0x6c, 0x69, 0x31, 0x47, 0x30, + 0x45, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x3e, 0x54, 0xc3, 0xbc, + 0x72, 0x6b, 0x69, 0x79, 0x65, 0x20, 0x42, 0x69, 0x6c, 0x69, 0x6d, + 0x73, 0x65, 0x6c, 0x20, 0x76, 0x65, 0x20, 0x54, 0x65, 0x6b, 0x6e, + 0x6f, 0x6c, 0x6f, 0x6a, 0x69, 0x6b, 0x20, 0x41, 0x72, 0x61, 0xc5, + 0x9f, 0x74, 0xc4, 0xb1, 0x72, 0x6d, 0x61, 0x20, 0x4b, 0x75, 0x72, + 0x75, 0x6d, 0x75, 0x20, 0x2d, 0x20, 0x54, 0xc3, 0x9c, 0x42, 0xc4, + 0xb0, 0x54, 0x41, 0x4b, 0x31, 0x48, 0x30, 0x46, 0x06, 0x03, 0x55, + 0x04, 0x0b, 0x0c, 0x3f, 0x55, 0x6c, 0x75, 0x73, 0x61, 0x6c, 0x20, + 0x45, 0x6c, 0x65, 0x6b, 0x74, 0x72, 0x6f, 0x6e, 0x69, 0x6b, 0x20, + 0x76, 0x65, 0x20, 0x4b, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x6c, 0x6f, + 0x6a, 0x69, 0x20, 0x41, 0x72, 0x61, 0xc5, 0x9f, 0x74, 0xc4, 0xb1, + 0x72, 0x6d, 0x61, 0x20, 0x45, 0x6e, 0x73, 0x74, 0x69, 0x74, 0xc3, + 0xbc, 0x73, 0xc3, 0xbc, 0x20, 0x2d, 0x20, 0x55, 0x45, 0x4b, 0x41, + 0x45, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, + 0x1a, 0x4b, 0x61, 0x6d, 0x75, 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x6b, 0x61, 0x73, 0x79, 0x6f, 0x6e, 0x20, 0x4d, 0x65, + 0x72, 0x6b, 0x65, 0x7a, 0x69, 0x31, 0x4a, 0x30, 0x48, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x0c, 0x41, 0x54, 0xc3, 0x9c, 0x42, 0xc4, 0xb0, + 0x54, 0x41, 0x4b, 0x20, 0x55, 0x45, 0x4b, 0x41, 0x45, 0x20, 0x4b, + 0xc3, 0xb6, 0x6b, 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x6b, 0x61, 0x20, 0x48, 0x69, 0x7a, 0x6d, 0x65, 0x74, 0x20, 0x53, + 0x61, 0xc4, 0x9f, 0x6c, 0x61, 0x79, 0xc4, 0xb1, 0x63, 0xc4, 0xb1, + 0x73, 0xc4, 0xb1, 0x20, 0x2d, 0x20, 0x53, 0xc3, 0xbc, 0x72, 0xc3, + 0xbc, 0x6d, 0x20, 0x33, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, + 0x82, 0x01, 0x01, 0x00, 0x8a, 0x6d, 0x4b, 0xff, 0x10, 0x88, 0x3a, + 0xc3, 0xf6, 0x7e, 0x94, 0xe8, 0xea, 0x20, 0x64, 0x70, 0xae, 0x21, + 0x81, 0xbe, 0x3a, 0x7b, 0x3c, 0xdb, 0xf1, 0x1d, 0x52, 0x7f, 0x59, + 0xfa, 0xf3, 0x22, 0x4c, 0x95, 0xa0, 0x90, 0xbc, 0x48, 0x4e, 0x11, + 0xab, 0xfb, 0xb7, 0xb5, 0x8d, 0x7a, 0x83, 0x28, 0x8c, 0x26, 0x46, + 0xd8, 0x4e, 0x95, 0x40, 0x87, 0x61, 0x9f, 0xc5, 0x9e, 0x6d, 0x81, + 0x87, 0x57, 0x6c, 0x8a, 0x3b, 0xb4, 0x66, 0xea, 0xcc, 0x40, 0xfc, + 0xe3, 0xaa, 0x6c, 0xb2, 0xcb, 0x01, 0xdb, 0x32, 0xbf, 0xd2, 0xeb, + 0x85, 0xcf, 0xa1, 0x0d, 0x55, 0xc3, 0x5b, 0x38, 0x57, 0x70, 0xb8, + 0x75, 0xc6, 0x79, 0xd1, 0x14, 0x30, 0xed, 0x1b, 0x58, 0x5b, 0x6b, + 0xef, 0x35, 0xf2, 0xa1, 0x21, 0x4e, 0xc5, 0xce, 0x7c, 0x99, 0x5f, + 0x6c, 0xb9, 0xb8, 0x22, 0x93, 0x50, 0xa7, 0xcd, 0x4c, 0x70, 0x6a, + 0xbe, 0x6a, 0x05, 0x7f, 0x13, 0x9c, 0x2b, 0x1e, 0xea, 0xfe, 0x47, + 0xce, 0x04, 0xa5, 0x6f, 0xac, 0x93, 0x2e, 0x7c, 0x2b, 0x9f, 0x9e, + 0x79, 0x13, 0x91, 0xe8, 0xea, 0x9e, 0xca, 0x38, 0x75, 0x8e, 0x62, + 0xb0, 0x95, 0x93, 0x2a, 0xe5, 0xdf, 0xe9, 0x5e, 0x97, 0x6e, 0x20, + 0x5f, 0x5f, 0x84, 0x7a, 0x44, 0x39, 0x19, 0x40, 0x1c, 0xba, 0x55, + 0x2b, 0xfb, 0x30, 0xb2, 0x81, 0xef, 0x84, 0xe3, 0xdc, 0xec, 0x98, + 0x38, 0x39, 0x03, 0x85, 0x08, 0xa9, 0x54, 0x03, 0x05, 0x29, 0xf0, + 0xc9, 0x8f, 0x8b, 0xea, 0x0b, 0x86, 0x65, 0x19, 0x11, 0xd3, 0xe9, + 0x09, 0x23, 0xde, 0x68, 0x93, 0x03, 0xc9, 0x36, 0x1c, 0x21, 0x6e, + 0xce, 0x8c, 0x66, 0xf1, 0x99, 0x30, 0xd8, 0xd7, 0xb3, 0xc3, 0x1d, + 0xf8, 0x81, 0x2e, 0xa8, 0xbd, 0x82, 0x0b, 0x66, 0xfe, 0x82, 0xcb, + 0xe1, 0xe0, 0x1a, 0x82, 0xc3, 0x40, 0x81, 0x02, 0x03, 0x01, 0x00, + 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, + 0x0e, 0x04, 0x16, 0x04, 0x14, 0xbd, 0x88, 0x87, 0xc9, 0x8f, 0xf6, + 0xa4, 0x0a, 0x0b, 0xaa, 0xeb, 0xc5, 0xfe, 0x91, 0x23, 0x9d, 0xab, + 0x4a, 0x8a, 0x32, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, + 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, + 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, + 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, + 0x00, 0x1d, 0x7c, 0xfa, 0x49, 0x8f, 0x34, 0xe9, 0xb7, 0x26, 0x92, + 0x16, 0x9a, 0x05, 0x74, 0xe7, 0x4b, 0xd0, 0x6d, 0x39, 0x6c, 0xc3, + 0x26, 0xf6, 0xce, 0xb8, 0x31, 0xbc, 0xc4, 0xdf, 0xbc, 0x2a, 0xf8, + 0x37, 0x91, 0x18, 0xdc, 0x04, 0xc8, 0x64, 0x99, 0x2b, 0x18, 0x6d, + 0x80, 0x03, 0x59, 0xc9, 0xae, 0xf8, 0x58, 0xd0, 0x3e, 0xed, 0xc3, + 0x23, 0x9f, 0x69, 0x3c, 0x86, 0x38, 0x1c, 0x9e, 0xef, 0xda, 0x27, + 0x78, 0xd1, 0x84, 0x37, 0x71, 0x8a, 0x3c, 0x4b, 0x39, 0xcf, 0x7e, + 0x45, 0x06, 0xd6, 0x2d, 0xd8, 0x8a, 0x4d, 0x78, 0x12, 0xd6, 0xad, + 0xc2, 0xd3, 0xcb, 0xd2, 0xd0, 0x41, 0xf3, 0x26, 0x36, 0x4a, 0x9b, + 0x95, 0x6c, 0x0c, 0xee, 0xe5, 0xd1, 0x43, 0x27, 0x66, 0xc1, 0x88, + 0xf7, 0x7a, 0xb3, 0x20, 0x6c, 0xea, 0xb0, 0x69, 0x2b, 0xc7, 0x20, + 0xe8, 0x0c, 0x03, 0xc4, 0x41, 0x05, 0x99, 0xe2, 0x3f, 0xe4, 0x6b, + 0xf8, 0xa0, 0x86, 0x81, 0xc7, 0x84, 0xc6, 0x1f, 0xd5, 0x4b, 0x81, + 0x12, 0xb2, 0x16, 0x21, 0x2c, 0x13, 0xa1, 0x80, 0xb2, 0x5e, 0x0c, + 0x4a, 0x13, 0x9e, 0x20, 0xd8, 0x62, 0x40, 0xab, 0x90, 0xea, 0x64, + 0x4a, 0x2f, 0xac, 0x0d, 0x01, 0x12, 0x79, 0x45, 0xa8, 0x2f, 0x87, + 0x19, 0x68, 0xc8, 0xe2, 0x85, 0xc7, 0x30, 0xb2, 0x75, 0xf9, 0x38, + 0x3f, 0xb2, 0xc0, 0x93, 0xb4, 0x6b, 0xe2, 0x03, 0x44, 0xce, 0x67, + 0xa0, 0xdf, 0x89, 0xd6, 0xad, 0x8c, 0x76, 0xa3, 0x13, 0xc3, 0x94, + 0x61, 0x2b, 0x6b, 0xd9, 0x6c, 0xc1, 0x07, 0x0a, 0x22, 0x07, 0x85, + 0x6c, 0x85, 0x24, 0x46, 0xa9, 0xbe, 0x3f, 0x8b, 0x78, 0x84, 0x82, + 0x7e, 0x24, 0x0c, 0x9d, 0xfd, 0x81, 0x37, 0xe3, 0x25, 0xa8, 0xed, + 0x36, 0x4e, 0x95, 0x2c, 0xc9, 0x9c, 0x90, 0xda, 0xec, 0xa9, 0x42, + 0x3c, 0xad, 0xb6, 0x02, 0x30, 0x82, 0x03, 0x53, 0x30, 0x82, 0x02, + 0x3b, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, - 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x09, 0xb3, 0x83, 0x53, - 0x59, 0x01, 0x3e, 0x95, 0x49, 0xb9, 0xf1, 0x81, 0xba, 0xf9, 0x76, - 0x20, 0x23, 0xb5, 0x27, 0x60, 0x74, 0xd4, 0x6a, 0x99, 0x34, 0x5e, - 0x6c, 0x00, 0x53, 0xd9, 0x9f, 0xf2, 0xa6, 0xb1, 0x24, 0x07, 0x44, - 0x6a, 0x2a, 0xc6, 0xa5, 0x8e, 0x78, 0x12, 0xe8, 0x47, 0xd9, 0x58, - 0x1b, 0x13, 0x2a, 0x5e, 0x79, 0x9b, 0x9f, 0x0a, 0x2a, 0x67, 0xa6, - 0x25, 0x3f, 0x06, 0x69, 0x56, 0x73, 0xc3, 0x8a, 0x66, 0x48, 0xfb, - 0x29, 0x81, 0x57, 0x74, 0x06, 0xca, 0x9c, 0xea, 0x28, 0xe8, 0x38, - 0x67, 0x26, 0x2b, 0xf1, 0xd5, 0xb5, 0x3f, 0x65, 0x93, 0xf8, 0x36, - 0x5d, 0x8e, 0x8d, 0x8d, 0x40, 0x20, 0x87, 0x19, 0xea, 0xef, 0x27, - 0xc0, 0x3d, 0xb4, 0x39, 0x0f, 0x25, 0x7b, 0x68, 0x50, 0x74, 0x55, - 0x9c, 0x0c, 0x59, 0x7d, 0x5a, 0x3d, 0x41, 0x94, 0x25, 0x52, 0x08, - 0xe0, 0x47, 0x2c, 0x15, 0x31, 0x19, 0xd5, 0xbf, 0x07, 0x55, 0xc6, - 0xbb, 0x12, 0xb5, 0x97, 0xf4, 0x5f, 0x83, 0x85, 0xba, 0x71, 0xc1, - 0xd9, 0x6c, 0x81, 0x11, 0x76, 0x0a, 0x0a, 0xb0, 0xbf, 0x82, 0x97, - 0xf7, 0xea, 0x3d, 0xfa, 0xfa, 0xec, 0x2d, 0xa9, 0x28, 0x94, 0x3b, - 0x56, 0xdd, 0xd2, 0x51, 0x2e, 0xae, 0xc0, 0xbd, 0x08, 0x15, 0x8c, - 0x77, 0x52, 0x34, 0x96, 0xd6, 0x9b, 0xac, 0xd3, 0x1d, 0x8e, 0x61, - 0x0f, 0x35, 0x7b, 0x9b, 0xae, 0x39, 0x69, 0x0b, 0x62, 0x60, 0x40, - 0x20, 0x36, 0x8f, 0xaf, 0xfb, 0x36, 0xee, 0x2d, 0x08, 0x4a, 0x1d, - 0xb8, 0xbf, 0x9b, 0x5c, 0xf8, 0xea, 0xa5, 0x1b, 0xa0, 0x73, 0xa6, - 0xd8, 0xf8, 0x6e, 0xe0, 0x33, 0x04, 0x5f, 0x68, 0xaa, 0x27, 0x87, - 0xed, 0xd9, 0xc1, 0x90, 0x9c, 0xed, 0xbd, 0xe3, 0x6a, 0x35, 0xaf, - 0x63, 0xdf, 0xab, 0x18, 0xd9, 0xba, 0xe6, 0xe9, 0x4a, 0xea, 0x50, - 0x8a, 0x0f, 0x61, 0x93, 0x1e, 0xe2, 0x2d, 0x19, 0xe2, 0x30, 0x94, - 0x35, 0x92, 0x5d, 0x0e, 0xb6, 0x07, 0xaf, 0x19, 0x80, 0x8f, 0x47, - 0x90, 0x51, 0x4b, 0x2e, 0x4d, 0xdd, 0x85, 0xe2, 0xd2, 0x0a, 0x52, - 0x0a, 0x17, 0x9a, 0xfc, 0x1a, 0xb0, 0x50, 0x02, 0xe5, 0x01, 0xa3, - 0x63, 0x37, 0x21, 0x4c, 0x44, 0xc4, 0x9b, 0x51, 0x99, 0x11, 0x0e, - 0x73, 0x9c, 0x06, 0x8f, 0x54, 0x2e, 0xa7, 0x28, 0x5e, 0x44, 0x39, - 0x87, 0x56, 0x2d, 0x37, 0xbd, 0x85, 0x44, 0x94, 0xe1, 0x0c, 0x4b, - 0x2c, 0x9c, 0xc3, 0x92, 0x85, 0x34, 0x61, 0xcb, 0x0f, 0xb8, 0x9b, - 0x4a, 0x43, 0x52, 0xfe, 0x34, 0x3a, 0x7d, 0xb8, 0xe9, 0x29, 0xdc, - 0x76, 0xa9, 0xc8, 0x30, 0xf8, 0x14, 0x71, 0x80, 0xc6, 0x1e, 0x36, - 0x48, 0x74, 0x22, 0x41, 0x5c, 0x87, 0x82, 0xe8, 0x18, 0x71, 0x8b, - 0x41, 0x89, 0x44, 0xe7, 0x7e, 0x58, 0x5b, 0xa8, 0xb8, 0x8d, 0x13, - 0xe9, 0xa7, 0x6c, 0xc3, 0x47, 0xed, 0xb3, 0x1a, 0x9d, 0x62, 0xae, - 0x8d, 0x82, 0xea, 0x94, 0x9e, 0xdd, 0x59, 0x10, 0xc3, 0xad, 0xdd, - 0xe2, 0x4d, 0xe3, 0x31, 0xd5, 0xc7, 0xec, 0xe8, 0xf2, 0xb0, 0xfe, - 0x92, 0x1e, 0x16, 0x0a, 0x1a, 0xfc, 0xd9, 0xf3, 0xf8, 0x27, 0xb6, - 0xc9, 0xbe, 0x1d, 0xb4, 0x6c, 0x64, 0x90, 0x7f, 0xf4, 0xe4, 0xc4, - 0x5b, 0xd7, 0x37, 0xae, 0x42, 0x0e, 0xdd, 0xa4, 0x1a, 0x6f, 0x7c, - 0x88, 0x54, 0xc5, 0x16, 0x6e, 0xe1, 0x7a, 0x68, 0x2e, 0xf8, 0x3a, - 0xbf, 0x0d, 0xa4, 0x3c, 0x89, 0x3b, 0x78, 0xa7, 0x4e, 0x63, 0x83, - 0x04, 0x21, 0x08, 0x67, 0x8d, 0xf2, 0x82, 0x49, 0xd0, 0x5b, 0xfd, - 0xb1, 0xcd, 0x0f, 0x83, 0x84, 0xd4, 0x3e, 0x20, 0x85, 0xf7, 0x4a, - 0x3d, 0x2b, 0x9c, 0xfd, 0x2a, 0x0a, 0x09, 0x4d, 0xea, 0x81, 0xf8, - 0x11, 0x9c, 0x30, 0x82, 0x05, 0x17, 0x30, 0x82, 0x03, 0xff, 0xa0, - 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x11, 0x30, 0x0d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, - 0x30, 0x82, 0x01, 0x2b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x54, 0x52, 0x31, 0x18, 0x30, 0x16, 0x06, - 0x03, 0x55, 0x04, 0x07, 0x0c, 0x0f, 0x47, 0x65, 0x62, 0x7a, 0x65, - 0x20, 0x2d, 0x20, 0x4b, 0x6f, 0x63, 0x61, 0x65, 0x6c, 0x69, 0x31, - 0x47, 0x30, 0x45, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x3e, 0x54, - 0xc3, 0xbc, 0x72, 0x6b, 0x69, 0x79, 0x65, 0x20, 0x42, 0x69, 0x6c, - 0x69, 0x6d, 0x73, 0x65, 0x6c, 0x20, 0x76, 0x65, 0x20, 0x54, 0x65, - 0x6b, 0x6e, 0x6f, 0x6c, 0x6f, 0x6a, 0x69, 0x6b, 0x20, 0x41, 0x72, - 0x61, 0xc5, 0x9f, 0x74, 0xc4, 0xb1, 0x72, 0x6d, 0x61, 0x20, 0x4b, - 0x75, 0x72, 0x75, 0x6d, 0x75, 0x20, 0x2d, 0x20, 0x54, 0xc3, 0x9c, - 0x42, 0xc4, 0xb0, 0x54, 0x41, 0x4b, 0x31, 0x48, 0x30, 0x46, 0x06, - 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x3f, 0x55, 0x6c, 0x75, 0x73, 0x61, - 0x6c, 0x20, 0x45, 0x6c, 0x65, 0x6b, 0x74, 0x72, 0x6f, 0x6e, 0x69, - 0x6b, 0x20, 0x76, 0x65, 0x20, 0x4b, 0x72, 0x69, 0x70, 0x74, 0x6f, - 0x6c, 0x6f, 0x6a, 0x69, 0x20, 0x41, 0x72, 0x61, 0xc5, 0x9f, 0x74, - 0xc4, 0xb1, 0x72, 0x6d, 0x61, 0x20, 0x45, 0x6e, 0x73, 0x74, 0x69, - 0x74, 0xc3, 0xbc, 0x73, 0xc3, 0xbc, 0x20, 0x2d, 0x20, 0x55, 0x45, - 0x4b, 0x41, 0x45, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, - 0x0b, 0x0c, 0x1a, 0x4b, 0x61, 0x6d, 0x75, 0x20, 0x53, 0x65, 0x72, - 0x74, 0x69, 0x66, 0x69, 0x6b, 0x61, 0x73, 0x79, 0x6f, 0x6e, 0x20, - 0x4d, 0x65, 0x72, 0x6b, 0x65, 0x7a, 0x69, 0x31, 0x4a, 0x30, 0x48, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x41, 0x54, 0xc3, 0x9c, 0x42, - 0xc4, 0xb0, 0x54, 0x41, 0x4b, 0x20, 0x55, 0x45, 0x4b, 0x41, 0x45, - 0x20, 0x4b, 0xc3, 0xb6, 0x6b, 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x6b, 0x61, 0x20, 0x48, 0x69, 0x7a, 0x6d, 0x65, 0x74, - 0x20, 0x53, 0x61, 0xc4, 0x9f, 0x6c, 0x61, 0x79, 0xc4, 0xb1, 0x63, - 0xc4, 0xb1, 0x73, 0xc4, 0xb1, 0x20, 0x2d, 0x20, 0x53, 0xc3, 0xbc, - 0x72, 0xc3, 0xbc, 0x6d, 0x20, 0x33, 0x30, 0x1e, 0x17, 0x0d, 0x30, - 0x37, 0x30, 0x38, 0x32, 0x34, 0x31, 0x31, 0x33, 0x37, 0x30, 0x37, - 0x5a, 0x17, 0x0d, 0x31, 0x37, 0x30, 0x38, 0x32, 0x31, 0x31, 0x31, - 0x33, 0x37, 0x30, 0x37, 0x5a, 0x30, 0x82, 0x01, 0x2b, 0x31, 0x0b, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x54, 0x52, - 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x0f, - 0x47, 0x65, 0x62, 0x7a, 0x65, 0x20, 0x2d, 0x20, 0x4b, 0x6f, 0x63, - 0x61, 0x65, 0x6c, 0x69, 0x31, 0x47, 0x30, 0x45, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x0c, 0x3e, 0x54, 0xc3, 0xbc, 0x72, 0x6b, 0x69, 0x79, - 0x65, 0x20, 0x42, 0x69, 0x6c, 0x69, 0x6d, 0x73, 0x65, 0x6c, 0x20, - 0x76, 0x65, 0x20, 0x54, 0x65, 0x6b, 0x6e, 0x6f, 0x6c, 0x6f, 0x6a, - 0x69, 0x6b, 0x20, 0x41, 0x72, 0x61, 0xc5, 0x9f, 0x74, 0xc4, 0xb1, - 0x72, 0x6d, 0x61, 0x20, 0x4b, 0x75, 0x72, 0x75, 0x6d, 0x75, 0x20, - 0x2d, 0x20, 0x54, 0xc3, 0x9c, 0x42, 0xc4, 0xb0, 0x54, 0x41, 0x4b, - 0x31, 0x48, 0x30, 0x46, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x3f, - 0x55, 0x6c, 0x75, 0x73, 0x61, 0x6c, 0x20, 0x45, 0x6c, 0x65, 0x6b, - 0x74, 0x72, 0x6f, 0x6e, 0x69, 0x6b, 0x20, 0x76, 0x65, 0x20, 0x4b, - 0x72, 0x69, 0x70, 0x74, 0x6f, 0x6c, 0x6f, 0x6a, 0x69, 0x20, 0x41, - 0x72, 0x61, 0xc5, 0x9f, 0x74, 0xc4, 0xb1, 0x72, 0x6d, 0x61, 0x20, - 0x45, 0x6e, 0x73, 0x74, 0x69, 0x74, 0xc3, 0xbc, 0x73, 0xc3, 0xbc, - 0x20, 0x2d, 0x20, 0x55, 0x45, 0x4b, 0x41, 0x45, 0x31, 0x23, 0x30, - 0x21, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x1a, 0x4b, 0x61, 0x6d, - 0x75, 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x6b, 0x61, - 0x73, 0x79, 0x6f, 0x6e, 0x20, 0x4d, 0x65, 0x72, 0x6b, 0x65, 0x7a, - 0x69, 0x31, 0x4a, 0x30, 0x48, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, - 0x41, 0x54, 0xc3, 0x9c, 0x42, 0xc4, 0xb0, 0x54, 0x41, 0x4b, 0x20, - 0x55, 0x45, 0x4b, 0x41, 0x45, 0x20, 0x4b, 0xc3, 0xb6, 0x6b, 0x20, - 0x53, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x6b, 0x61, 0x20, 0x48, - 0x69, 0x7a, 0x6d, 0x65, 0x74, 0x20, 0x53, 0x61, 0xc4, 0x9f, 0x6c, - 0x61, 0x79, 0xc4, 0xb1, 0x63, 0xc4, 0xb1, 0x73, 0xc4, 0xb1, 0x20, - 0x2d, 0x20, 0x53, 0xc3, 0xbc, 0x72, 0xc3, 0xbc, 0x6d, 0x20, 0x33, - 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, - 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, - 0x8a, 0x6d, 0x4b, 0xff, 0x10, 0x88, 0x3a, 0xc3, 0xf6, 0x7e, 0x94, - 0xe8, 0xea, 0x20, 0x64, 0x70, 0xae, 0x21, 0x81, 0xbe, 0x3a, 0x7b, - 0x3c, 0xdb, 0xf1, 0x1d, 0x52, 0x7f, 0x59, 0xfa, 0xf3, 0x22, 0x4c, - 0x95, 0xa0, 0x90, 0xbc, 0x48, 0x4e, 0x11, 0xab, 0xfb, 0xb7, 0xb5, - 0x8d, 0x7a, 0x83, 0x28, 0x8c, 0x26, 0x46, 0xd8, 0x4e, 0x95, 0x40, - 0x87, 0x61, 0x9f, 0xc5, 0x9e, 0x6d, 0x81, 0x87, 0x57, 0x6c, 0x8a, - 0x3b, 0xb4, 0x66, 0xea, 0xcc, 0x40, 0xfc, 0xe3, 0xaa, 0x6c, 0xb2, - 0xcb, 0x01, 0xdb, 0x32, 0xbf, 0xd2, 0xeb, 0x85, 0xcf, 0xa1, 0x0d, - 0x55, 0xc3, 0x5b, 0x38, 0x57, 0x70, 0xb8, 0x75, 0xc6, 0x79, 0xd1, - 0x14, 0x30, 0xed, 0x1b, 0x58, 0x5b, 0x6b, 0xef, 0x35, 0xf2, 0xa1, - 0x21, 0x4e, 0xc5, 0xce, 0x7c, 0x99, 0x5f, 0x6c, 0xb9, 0xb8, 0x22, - 0x93, 0x50, 0xa7, 0xcd, 0x4c, 0x70, 0x6a, 0xbe, 0x6a, 0x05, 0x7f, - 0x13, 0x9c, 0x2b, 0x1e, 0xea, 0xfe, 0x47, 0xce, 0x04, 0xa5, 0x6f, - 0xac, 0x93, 0x2e, 0x7c, 0x2b, 0x9f, 0x9e, 0x79, 0x13, 0x91, 0xe8, - 0xea, 0x9e, 0xca, 0x38, 0x75, 0x8e, 0x62, 0xb0, 0x95, 0x93, 0x2a, - 0xe5, 0xdf, 0xe9, 0x5e, 0x97, 0x6e, 0x20, 0x5f, 0x5f, 0x84, 0x7a, - 0x44, 0x39, 0x19, 0x40, 0x1c, 0xba, 0x55, 0x2b, 0xfb, 0x30, 0xb2, - 0x81, 0xef, 0x84, 0xe3, 0xdc, 0xec, 0x98, 0x38, 0x39, 0x03, 0x85, - 0x08, 0xa9, 0x54, 0x03, 0x05, 0x29, 0xf0, 0xc9, 0x8f, 0x8b, 0xea, - 0x0b, 0x86, 0x65, 0x19, 0x11, 0xd3, 0xe9, 0x09, 0x23, 0xde, 0x68, - 0x93, 0x03, 0xc9, 0x36, 0x1c, 0x21, 0x6e, 0xce, 0x8c, 0x66, 0xf1, - 0x99, 0x30, 0xd8, 0xd7, 0xb3, 0xc3, 0x1d, 0xf8, 0x81, 0x2e, 0xa8, - 0xbd, 0x82, 0x0b, 0x66, 0xfe, 0x82, 0xcb, 0xe1, 0xe0, 0x1a, 0x82, - 0xc3, 0x40, 0x81, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, - 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, - 0x14, 0xbd, 0x88, 0x87, 0xc9, 0x8f, 0xf6, 0xa4, 0x0a, 0x0b, 0xaa, - 0xeb, 0xc5, 0xfe, 0x91, 0x23, 0x9d, 0xab, 0x4a, 0x8a, 0x32, 0x30, - 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, - 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, - 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x1d, 0x7c, 0xfa, - 0x49, 0x8f, 0x34, 0xe9, 0xb7, 0x26, 0x92, 0x16, 0x9a, 0x05, 0x74, - 0xe7, 0x4b, 0xd0, 0x6d, 0x39, 0x6c, 0xc3, 0x26, 0xf6, 0xce, 0xb8, - 0x31, 0xbc, 0xc4, 0xdf, 0xbc, 0x2a, 0xf8, 0x37, 0x91, 0x18, 0xdc, - 0x04, 0xc8, 0x64, 0x99, 0x2b, 0x18, 0x6d, 0x80, 0x03, 0x59, 0xc9, - 0xae, 0xf8, 0x58, 0xd0, 0x3e, 0xed, 0xc3, 0x23, 0x9f, 0x69, 0x3c, - 0x86, 0x38, 0x1c, 0x9e, 0xef, 0xda, 0x27, 0x78, 0xd1, 0x84, 0x37, - 0x71, 0x8a, 0x3c, 0x4b, 0x39, 0xcf, 0x7e, 0x45, 0x06, 0xd6, 0x2d, - 0xd8, 0x8a, 0x4d, 0x78, 0x12, 0xd6, 0xad, 0xc2, 0xd3, 0xcb, 0xd2, - 0xd0, 0x41, 0xf3, 0x26, 0x36, 0x4a, 0x9b, 0x95, 0x6c, 0x0c, 0xee, - 0xe5, 0xd1, 0x43, 0x27, 0x66, 0xc1, 0x88, 0xf7, 0x7a, 0xb3, 0x20, - 0x6c, 0xea, 0xb0, 0x69, 0x2b, 0xc7, 0x20, 0xe8, 0x0c, 0x03, 0xc4, - 0x41, 0x05, 0x99, 0xe2, 0x3f, 0xe4, 0x6b, 0xf8, 0xa0, 0x86, 0x81, - 0xc7, 0x84, 0xc6, 0x1f, 0xd5, 0x4b, 0x81, 0x12, 0xb2, 0x16, 0x21, - 0x2c, 0x13, 0xa1, 0x80, 0xb2, 0x5e, 0x0c, 0x4a, 0x13, 0x9e, 0x20, - 0xd8, 0x62, 0x40, 0xab, 0x90, 0xea, 0x64, 0x4a, 0x2f, 0xac, 0x0d, - 0x01, 0x12, 0x79, 0x45, 0xa8, 0x2f, 0x87, 0x19, 0x68, 0xc8, 0xe2, - 0x85, 0xc7, 0x30, 0xb2, 0x75, 0xf9, 0x38, 0x3f, 0xb2, 0xc0, 0x93, - 0xb4, 0x6b, 0xe2, 0x03, 0x44, 0xce, 0x67, 0xa0, 0xdf, 0x89, 0xd6, - 0xad, 0x8c, 0x76, 0xa3, 0x13, 0xc3, 0x94, 0x61, 0x2b, 0x6b, 0xd9, - 0x6c, 0xc1, 0x07, 0x0a, 0x22, 0x07, 0x85, 0x6c, 0x85, 0x24, 0x46, - 0xa9, 0xbe, 0x3f, 0x8b, 0x78, 0x84, 0x82, 0x7e, 0x24, 0x0c, 0x9d, - 0xfd, 0x81, 0x37, 0xe3, 0x25, 0xa8, 0xed, 0x36, 0x4e, 0x95, 0x2c, - 0xc9, 0x9c, 0x90, 0xda, 0xec, 0xa9, 0x42, 0x3c, 0xad, 0xb6, 0x02, - 0x30, 0x82, 0x03, 0x53, 0x30, 0x82, 0x02, 0x3b, 0xa0, 0x03, 0x02, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x4b, + 0x05, 0x00, 0x30, 0x4b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4f, 0x31, 0x1d, 0x30, 0x1b, 0x06, + 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x14, 0x42, 0x75, 0x79, 0x70, 0x61, + 0x73, 0x73, 0x20, 0x41, 0x53, 0x2d, 0x39, 0x38, 0x33, 0x31, 0x36, + 0x33, 0x33, 0x32, 0x37, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x0c, 0x14, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, + 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x43, 0x41, + 0x20, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x30, 0x31, + 0x33, 0x31, 0x30, 0x32, 0x35, 0x30, 0x39, 0x5a, 0x17, 0x0d, 0x31, + 0x36, 0x31, 0x30, 0x31, 0x33, 0x31, 0x30, 0x32, 0x35, 0x30, 0x39, + 0x5a, 0x30, 0x4b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x4e, 0x4f, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, + 0x55, 0x04, 0x0a, 0x0c, 0x14, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, + 0x73, 0x20, 0x41, 0x53, 0x2d, 0x39, 0x38, 0x33, 0x31, 0x36, 0x33, + 0x33, 0x32, 0x37, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x14, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x43, 0x41, 0x20, + 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, + 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, + 0x00, 0x8b, 0x3c, 0x07, 0x45, 0xd8, 0xf6, 0xdf, 0xe6, 0xc7, 0xca, + 0xba, 0x8d, 0x43, 0xc5, 0x47, 0x8d, 0xb0, 0x5a, 0xc1, 0x38, 0xdb, + 0x92, 0x84, 0x1c, 0xaf, 0x13, 0xd4, 0x0f, 0x6f, 0x36, 0x46, 0x20, + 0xc4, 0x2e, 0xcc, 0x71, 0x70, 0x34, 0xa2, 0x34, 0xd3, 0x37, 0x2e, + 0xd8, 0xdd, 0x3a, 0x77, 0x2f, 0xc0, 0xeb, 0x29, 0xe8, 0x5c, 0xd2, + 0xb5, 0xa9, 0x91, 0x34, 0x87, 0x22, 0x59, 0xfe, 0xcc, 0xdb, 0xe7, + 0x99, 0xaf, 0x96, 0xc1, 0xa8, 0xc7, 0x40, 0xdd, 0xa5, 0x15, 0x8c, + 0x6e, 0xc8, 0x7c, 0x97, 0x03, 0xcb, 0xe6, 0x20, 0xf2, 0xd7, 0x97, + 0x5f, 0x31, 0xa1, 0x2f, 0x37, 0xd2, 0xbe, 0xee, 0xbe, 0xa9, 0xad, + 0xa8, 0x4c, 0x9e, 0x21, 0x66, 0x43, 0x3b, 0xa8, 0xbc, 0xf3, 0x09, + 0xa3, 0x38, 0xd5, 0x59, 0x24, 0xc1, 0xc2, 0x47, 0x76, 0xb1, 0x88, + 0x5c, 0x82, 0x3b, 0xbb, 0x2b, 0xa6, 0x04, 0xd7, 0x8c, 0x07, 0x8f, + 0xcd, 0xd5, 0x41, 0x1d, 0xf0, 0xae, 0xb8, 0x29, 0x2c, 0x94, 0x52, + 0x60, 0x34, 0x94, 0x3b, 0xda, 0xe0, 0x38, 0xd1, 0x9d, 0x33, 0x3e, + 0x15, 0xf4, 0x93, 0x32, 0xc5, 0x00, 0xda, 0xb5, 0x29, 0x66, 0x0e, + 0x3a, 0x78, 0x0f, 0x21, 0x52, 0x5f, 0x02, 0xe5, 0x92, 0x7b, 0x25, + 0xd3, 0x92, 0x1e, 0x2f, 0x15, 0x9d, 0x81, 0xe4, 0x9d, 0x8e, 0xe8, + 0xef, 0x89, 0xce, 0x14, 0x4c, 0x54, 0x1d, 0x1c, 0x81, 0x12, 0x4d, + 0x70, 0xa8, 0xbe, 0x10, 0x05, 0x17, 0x7e, 0x1f, 0xd1, 0xb8, 0x57, + 0x55, 0xed, 0xcd, 0xbb, 0x52, 0xc2, 0xb0, 0x1e, 0x78, 0xc2, 0x4d, + 0x36, 0x68, 0xcb, 0x56, 0x26, 0xc1, 0x52, 0xc1, 0xbd, 0x76, 0xf7, + 0x58, 0xd5, 0x72, 0x7e, 0x1f, 0x44, 0x76, 0xbb, 0x00, 0x89, 0x1d, + 0x16, 0x9d, 0x51, 0x35, 0xef, 0x4d, 0xc2, 0x56, 0xef, 0x6b, 0xe0, + 0x8c, 0x3b, 0x0d, 0xe9, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, + 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, + 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, + 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x3f, 0x8d, 0x9a, + 0x59, 0x8b, 0xfc, 0x7b, 0x7b, 0x9c, 0xa3, 0xaf, 0x38, 0xb0, 0x39, + 0xed, 0x90, 0x71, 0x80, 0xd6, 0xc8, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x15, 0x1a, + 0x7e, 0x13, 0x8a, 0xb9, 0xe8, 0x07, 0xa3, 0x4b, 0x27, 0x32, 0xb2, + 0x40, 0x91, 0xf2, 0x21, 0xd1, 0x64, 0x85, 0xbe, 0x63, 0x6a, 0xd2, + 0xcf, 0x81, 0xc2, 0x15, 0xd5, 0x7a, 0x7e, 0x0c, 0x29, 0xac, 0x37, + 0x1e, 0x1c, 0x7c, 0x76, 0x52, 0x95, 0xda, 0xb5, 0x7f, 0x23, 0xa1, + 0x29, 0x77, 0x65, 0xc9, 0x32, 0x9d, 0xa8, 0x2e, 0x56, 0xab, 0x60, + 0x76, 0xce, 0x16, 0xb4, 0x8d, 0x7f, 0x78, 0xc0, 0xd5, 0x99, 0x51, + 0x83, 0x7f, 0x5e, 0xd9, 0xbe, 0x0c, 0xa8, 0x50, 0xed, 0x22, 0xc7, + 0xad, 0x05, 0x4c, 0x76, 0xfb, 0xed, 0xee, 0x1e, 0x47, 0x64, 0xf6, + 0xf7, 0x27, 0x7d, 0x5c, 0x28, 0x0f, 0x45, 0xc5, 0x5c, 0x62, 0x5e, + 0xa6, 0x9a, 0x91, 0x91, 0xb7, 0x53, 0x17, 0x2e, 0xdc, 0xad, 0x60, + 0x9d, 0x96, 0x64, 0x39, 0xbd, 0x67, 0x68, 0xb2, 0xae, 0x05, 0xcb, + 0x4d, 0xe7, 0x5f, 0x1f, 0x57, 0x86, 0xd5, 0x20, 0x9c, 0x28, 0xfb, + 0x6f, 0x13, 0x38, 0xf5, 0xf6, 0x11, 0x92, 0xf6, 0x7d, 0x99, 0x5e, + 0x1f, 0x0c, 0xe8, 0xab, 0x44, 0x24, 0x29, 0x72, 0x40, 0x3d, 0x36, + 0x52, 0xaf, 0x8c, 0x58, 0x90, 0x73, 0xc1, 0xec, 0x61, 0x2c, 0x79, + 0xa1, 0xec, 0x87, 0xb5, 0x3f, 0xda, 0x4d, 0xd9, 0x21, 0x00, 0x30, + 0xde, 0x90, 0xda, 0x0e, 0xd3, 0x1a, 0x48, 0xa9, 0x3e, 0x85, 0x0b, + 0x14, 0x8b, 0x8c, 0xbc, 0x41, 0x9e, 0x6a, 0xf7, 0x0e, 0x70, 0xc0, + 0x35, 0xf7, 0x39, 0xa2, 0x5d, 0x66, 0xd0, 0x7b, 0x59, 0x9f, 0xa8, + 0x47, 0x12, 0x9a, 0x27, 0x23, 0xa4, 0x2d, 0x8e, 0x27, 0x83, 0x92, + 0x20, 0xa1, 0xd7, 0x15, 0x7f, 0xf1, 0x2e, 0x18, 0xee, 0xf4, 0x48, + 0x7f, 0x2f, 0x7f, 0xf1, 0xa1, 0x18, 0xb5, 0xa1, 0x0b, 0x94, 0xa0, + 0x62, 0x20, 0x32, 0x9c, 0x1d, 0xf6, 0xd4, 0xef, 0xbf, 0x4c, 0x88, + 0x68, 0x30, 0x82, 0x03, 0x53, 0x30, 0x82, 0x02, 0x3b, 0xa0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x01, 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, + 0x4b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x4e, 0x4f, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x0c, 0x14, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, + 0x41, 0x53, 0x2d, 0x39, 0x38, 0x33, 0x31, 0x36, 0x33, 0x33, 0x32, + 0x37, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, + 0x14, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x43, 0x6c, + 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x43, 0x41, 0x20, 0x31, 0x30, + 0x1e, 0x17, 0x0d, 0x30, 0x35, 0x30, 0x35, 0x30, 0x39, 0x31, 0x34, + 0x31, 0x33, 0x30, 0x33, 0x5a, 0x17, 0x0d, 0x31, 0x35, 0x30, 0x35, + 0x30, 0x39, 0x31, 0x34, 0x31, 0x33, 0x30, 0x33, 0x5a, 0x30, 0x4b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4f, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x14, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x41, 0x53, 0x2d, 0x39, 0x38, 0x33, 0x31, 0x36, 0x33, 0x33, 0x32, 0x37, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x14, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x43, 0x6c, 0x61, - 0x73, 0x73, 0x20, 0x32, 0x20, 0x43, 0x41, 0x20, 0x31, 0x30, 0x1e, - 0x17, 0x0d, 0x30, 0x36, 0x31, 0x30, 0x31, 0x33, 0x31, 0x30, 0x32, - 0x35, 0x30, 0x39, 0x5a, 0x17, 0x0d, 0x31, 0x36, 0x31, 0x30, 0x31, - 0x33, 0x31, 0x30, 0x32, 0x35, 0x30, 0x39, 0x5a, 0x30, 0x4b, 0x31, - 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, - 0x4f, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, - 0x14, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x41, 0x53, - 0x2d, 0x39, 0x38, 0x33, 0x31, 0x36, 0x33, 0x33, 0x32, 0x37, 0x31, - 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x14, 0x42, - 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x20, 0x32, 0x20, 0x43, 0x41, 0x20, 0x31, 0x30, 0x82, 0x01, - 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, - 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0x8b, 0x3c, 0x07, - 0x45, 0xd8, 0xf6, 0xdf, 0xe6, 0xc7, 0xca, 0xba, 0x8d, 0x43, 0xc5, - 0x47, 0x8d, 0xb0, 0x5a, 0xc1, 0x38, 0xdb, 0x92, 0x84, 0x1c, 0xaf, - 0x13, 0xd4, 0x0f, 0x6f, 0x36, 0x46, 0x20, 0xc4, 0x2e, 0xcc, 0x71, - 0x70, 0x34, 0xa2, 0x34, 0xd3, 0x37, 0x2e, 0xd8, 0xdd, 0x3a, 0x77, - 0x2f, 0xc0, 0xeb, 0x29, 0xe8, 0x5c, 0xd2, 0xb5, 0xa9, 0x91, 0x34, - 0x87, 0x22, 0x59, 0xfe, 0xcc, 0xdb, 0xe7, 0x99, 0xaf, 0x96, 0xc1, - 0xa8, 0xc7, 0x40, 0xdd, 0xa5, 0x15, 0x8c, 0x6e, 0xc8, 0x7c, 0x97, - 0x03, 0xcb, 0xe6, 0x20, 0xf2, 0xd7, 0x97, 0x5f, 0x31, 0xa1, 0x2f, - 0x37, 0xd2, 0xbe, 0xee, 0xbe, 0xa9, 0xad, 0xa8, 0x4c, 0x9e, 0x21, - 0x66, 0x43, 0x3b, 0xa8, 0xbc, 0xf3, 0x09, 0xa3, 0x38, 0xd5, 0x59, - 0x24, 0xc1, 0xc2, 0x47, 0x76, 0xb1, 0x88, 0x5c, 0x82, 0x3b, 0xbb, - 0x2b, 0xa6, 0x04, 0xd7, 0x8c, 0x07, 0x8f, 0xcd, 0xd5, 0x41, 0x1d, - 0xf0, 0xae, 0xb8, 0x29, 0x2c, 0x94, 0x52, 0x60, 0x34, 0x94, 0x3b, - 0xda, 0xe0, 0x38, 0xd1, 0x9d, 0x33, 0x3e, 0x15, 0xf4, 0x93, 0x32, - 0xc5, 0x00, 0xda, 0xb5, 0x29, 0x66, 0x0e, 0x3a, 0x78, 0x0f, 0x21, - 0x52, 0x5f, 0x02, 0xe5, 0x92, 0x7b, 0x25, 0xd3, 0x92, 0x1e, 0x2f, - 0x15, 0x9d, 0x81, 0xe4, 0x9d, 0x8e, 0xe8, 0xef, 0x89, 0xce, 0x14, - 0x4c, 0x54, 0x1d, 0x1c, 0x81, 0x12, 0x4d, 0x70, 0xa8, 0xbe, 0x10, - 0x05, 0x17, 0x7e, 0x1f, 0xd1, 0xb8, 0x57, 0x55, 0xed, 0xcd, 0xbb, - 0x52, 0xc2, 0xb0, 0x1e, 0x78, 0xc2, 0x4d, 0x36, 0x68, 0xcb, 0x56, - 0x26, 0xc1, 0x52, 0xc1, 0xbd, 0x76, 0xf7, 0x58, 0xd5, 0x72, 0x7e, - 0x1f, 0x44, 0x76, 0xbb, 0x00, 0x89, 0x1d, 0x16, 0x9d, 0x51, 0x35, - 0xef, 0x4d, 0xc2, 0x56, 0xef, 0x6b, 0xe0, 0x8c, 0x3b, 0x0d, 0xe9, - 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, - 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, - 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, - 0x04, 0x16, 0x04, 0x14, 0x3f, 0x8d, 0x9a, 0x59, 0x8b, 0xfc, 0x7b, - 0x7b, 0x9c, 0xa3, 0xaf, 0x38, 0xb0, 0x39, 0xed, 0x90, 0x71, 0x80, - 0xd6, 0xc8, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, - 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, - 0x03, 0x82, 0x01, 0x01, 0x00, 0x15, 0x1a, 0x7e, 0x13, 0x8a, 0xb9, - 0xe8, 0x07, 0xa3, 0x4b, 0x27, 0x32, 0xb2, 0x40, 0x91, 0xf2, 0x21, - 0xd1, 0x64, 0x85, 0xbe, 0x63, 0x6a, 0xd2, 0xcf, 0x81, 0xc2, 0x15, - 0xd5, 0x7a, 0x7e, 0x0c, 0x29, 0xac, 0x37, 0x1e, 0x1c, 0x7c, 0x76, - 0x52, 0x95, 0xda, 0xb5, 0x7f, 0x23, 0xa1, 0x29, 0x77, 0x65, 0xc9, - 0x32, 0x9d, 0xa8, 0x2e, 0x56, 0xab, 0x60, 0x76, 0xce, 0x16, 0xb4, - 0x8d, 0x7f, 0x78, 0xc0, 0xd5, 0x99, 0x51, 0x83, 0x7f, 0x5e, 0xd9, - 0xbe, 0x0c, 0xa8, 0x50, 0xed, 0x22, 0xc7, 0xad, 0x05, 0x4c, 0x76, - 0xfb, 0xed, 0xee, 0x1e, 0x47, 0x64, 0xf6, 0xf7, 0x27, 0x7d, 0x5c, - 0x28, 0x0f, 0x45, 0xc5, 0x5c, 0x62, 0x5e, 0xa6, 0x9a, 0x91, 0x91, - 0xb7, 0x53, 0x17, 0x2e, 0xdc, 0xad, 0x60, 0x9d, 0x96, 0x64, 0x39, - 0xbd, 0x67, 0x68, 0xb2, 0xae, 0x05, 0xcb, 0x4d, 0xe7, 0x5f, 0x1f, - 0x57, 0x86, 0xd5, 0x20, 0x9c, 0x28, 0xfb, 0x6f, 0x13, 0x38, 0xf5, - 0xf6, 0x11, 0x92, 0xf6, 0x7d, 0x99, 0x5e, 0x1f, 0x0c, 0xe8, 0xab, - 0x44, 0x24, 0x29, 0x72, 0x40, 0x3d, 0x36, 0x52, 0xaf, 0x8c, 0x58, - 0x90, 0x73, 0xc1, 0xec, 0x61, 0x2c, 0x79, 0xa1, 0xec, 0x87, 0xb5, - 0x3f, 0xda, 0x4d, 0xd9, 0x21, 0x00, 0x30, 0xde, 0x90, 0xda, 0x0e, - 0xd3, 0x1a, 0x48, 0xa9, 0x3e, 0x85, 0x0b, 0x14, 0x8b, 0x8c, 0xbc, - 0x41, 0x9e, 0x6a, 0xf7, 0x0e, 0x70, 0xc0, 0x35, 0xf7, 0x39, 0xa2, - 0x5d, 0x66, 0xd0, 0x7b, 0x59, 0x9f, 0xa8, 0x47, 0x12, 0x9a, 0x27, - 0x23, 0xa4, 0x2d, 0x8e, 0x27, 0x83, 0x92, 0x20, 0xa1, 0xd7, 0x15, - 0x7f, 0xf1, 0x2e, 0x18, 0xee, 0xf4, 0x48, 0x7f, 0x2f, 0x7f, 0xf1, - 0xa1, 0x18, 0xb5, 0xa1, 0x0b, 0x94, 0xa0, 0x62, 0x20, 0x32, 0x9c, - 0x1d, 0xf6, 0xd4, 0xef, 0xbf, 0x4c, 0x88, 0x68, 0x30, 0x82, 0x03, - 0x53, 0x30, 0x82, 0x02, 0x3b, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, - 0x01, 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x4b, 0x31, 0x0b, 0x30, - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4f, 0x31, - 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x14, 0x42, - 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x41, 0x53, 0x2d, 0x39, - 0x38, 0x33, 0x31, 0x36, 0x33, 0x33, 0x32, 0x37, 0x31, 0x1d, 0x30, - 0x1b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x14, 0x42, 0x75, 0x79, - 0x70, 0x61, 0x73, 0x73, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, - 0x33, 0x20, 0x43, 0x41, 0x20, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x30, - 0x35, 0x30, 0x35, 0x30, 0x39, 0x31, 0x34, 0x31, 0x33, 0x30, 0x33, - 0x5a, 0x17, 0x0d, 0x31, 0x35, 0x30, 0x35, 0x30, 0x39, 0x31, 0x34, - 0x31, 0x33, 0x30, 0x33, 0x5a, 0x30, 0x4b, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4f, 0x31, 0x1d, - 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x14, 0x42, 0x75, - 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x41, 0x53, 0x2d, 0x39, 0x38, - 0x33, 0x31, 0x36, 0x33, 0x33, 0x32, 0x37, 0x31, 0x1d, 0x30, 0x1b, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x14, 0x42, 0x75, 0x79, 0x70, - 0x61, 0x73, 0x73, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, - 0x20, 0x43, 0x41, 0x20, 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, - 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, - 0x02, 0x82, 0x01, 0x01, 0x00, 0xa4, 0x8e, 0xd7, 0x74, 0xd9, 0x29, - 0x64, 0xde, 0x5f, 0x1f, 0x87, 0x80, 0x91, 0xea, 0x4e, 0x39, 0xe6, - 0x19, 0xc6, 0x44, 0x0b, 0x80, 0xd5, 0x0b, 0xaf, 0x53, 0x07, 0x8b, - 0x12, 0xbd, 0xe6, 0x67, 0xf0, 0x02, 0xb1, 0x89, 0xf6, 0x60, 0x8a, - 0xc4, 0x5b, 0xb0, 0x42, 0xd1, 0xc0, 0x21, 0xa8, 0xcb, 0xe1, 0x9b, - 0xef, 0x64, 0x51, 0xb6, 0xa7, 0xcf, 0x15, 0xf5, 0x74, 0x80, 0x68, - 0x04, 0x90, 0xa0, 0x58, 0xa2, 0xe6, 0x74, 0xa6, 0x53, 0x53, 0x55, - 0x48, 0x63, 0x3f, 0x92, 0x56, 0xdd, 0x24, 0x4e, 0x8e, 0xf8, 0xba, - 0x2b, 0xff, 0xf3, 0x34, 0x8a, 0x9e, 0x28, 0xd7, 0x34, 0x9f, 0xac, - 0x2f, 0xd6, 0x0f, 0xf1, 0xa4, 0x2f, 0xbd, 0x52, 0xb2, 0x49, 0x85, - 0x6d, 0x39, 0x35, 0xf0, 0x44, 0x30, 0x93, 0x46, 0x24, 0xf3, 0xb6, - 0xe7, 0x53, 0xfb, 0xbc, 0x61, 0xaf, 0xa9, 0xa3, 0x14, 0xfb, 0xc2, - 0x17, 0x17, 0x84, 0x6c, 0xe0, 0x7c, 0x88, 0xf8, 0xc9, 0x1c, 0x57, - 0x2c, 0xf0, 0x3d, 0x7e, 0x94, 0xbc, 0x25, 0x93, 0x84, 0xe8, 0x9a, - 0x00, 0x9a, 0x45, 0x05, 0x42, 0x57, 0x80, 0xf4, 0x4e, 0xce, 0xd9, - 0xae, 0x39, 0xf6, 0xc8, 0x53, 0x10, 0x0c, 0x65, 0x3a, 0x47, 0x7b, - 0x60, 0xc2, 0xd6, 0xfa, 0x91, 0xc9, 0xc6, 0x71, 0x6c, 0xbd, 0x91, - 0x87, 0x3c, 0x91, 0x86, 0x49, 0xab, 0xf3, 0x0f, 0xa0, 0x6c, 0x26, - 0x76, 0x5e, 0x1c, 0xac, 0x9b, 0x71, 0xe5, 0x8d, 0xbc, 0x9b, 0x21, - 0x1e, 0x9c, 0xd6, 0x38, 0x7e, 0x24, 0x80, 0x15, 0x31, 0x82, 0x96, - 0xb1, 0x49, 0xd3, 0x62, 0x37, 0x5b, 0x88, 0x0c, 0x0a, 0x62, 0x34, - 0xfe, 0xa7, 0x48, 0x7e, 0x99, 0xb1, 0x30, 0x8b, 0x90, 0x37, 0x95, - 0x1c, 0xa8, 0x1f, 0xa5, 0x2c, 0x8d, 0xf4, 0x55, 0xc8, 0xdb, 0xdd, - 0x59, 0x0a, 0xc2, 0xad, 0x78, 0xa0, 0xf4, 0x8b, 0x02, 0x03, 0x01, - 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, - 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, - 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, - 0x14, 0x38, 0x14, 0xe6, 0xc8, 0xf0, 0xa9, 0xa4, 0x03, 0xf4, 0x4e, - 0x3e, 0x22, 0xa3, 0x5b, 0xf2, 0xd6, 0xe0, 0xad, 0x40, 0x74, 0x30, + 0x73, 0x73, 0x20, 0x33, 0x20, 0x43, 0x41, 0x20, 0x31, 0x30, 0x82, + 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, + 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa4, 0x8e, + 0xd7, 0x74, 0xd9, 0x29, 0x64, 0xde, 0x5f, 0x1f, 0x87, 0x80, 0x91, + 0xea, 0x4e, 0x39, 0xe6, 0x19, 0xc6, 0x44, 0x0b, 0x80, 0xd5, 0x0b, + 0xaf, 0x53, 0x07, 0x8b, 0x12, 0xbd, 0xe6, 0x67, 0xf0, 0x02, 0xb1, + 0x89, 0xf6, 0x60, 0x8a, 0xc4, 0x5b, 0xb0, 0x42, 0xd1, 0xc0, 0x21, + 0xa8, 0xcb, 0xe1, 0x9b, 0xef, 0x64, 0x51, 0xb6, 0xa7, 0xcf, 0x15, + 0xf5, 0x74, 0x80, 0x68, 0x04, 0x90, 0xa0, 0x58, 0xa2, 0xe6, 0x74, + 0xa6, 0x53, 0x53, 0x55, 0x48, 0x63, 0x3f, 0x92, 0x56, 0xdd, 0x24, + 0x4e, 0x8e, 0xf8, 0xba, 0x2b, 0xff, 0xf3, 0x34, 0x8a, 0x9e, 0x28, + 0xd7, 0x34, 0x9f, 0xac, 0x2f, 0xd6, 0x0f, 0xf1, 0xa4, 0x2f, 0xbd, + 0x52, 0xb2, 0x49, 0x85, 0x6d, 0x39, 0x35, 0xf0, 0x44, 0x30, 0x93, + 0x46, 0x24, 0xf3, 0xb6, 0xe7, 0x53, 0xfb, 0xbc, 0x61, 0xaf, 0xa9, + 0xa3, 0x14, 0xfb, 0xc2, 0x17, 0x17, 0x84, 0x6c, 0xe0, 0x7c, 0x88, + 0xf8, 0xc9, 0x1c, 0x57, 0x2c, 0xf0, 0x3d, 0x7e, 0x94, 0xbc, 0x25, + 0x93, 0x84, 0xe8, 0x9a, 0x00, 0x9a, 0x45, 0x05, 0x42, 0x57, 0x80, + 0xf4, 0x4e, 0xce, 0xd9, 0xae, 0x39, 0xf6, 0xc8, 0x53, 0x10, 0x0c, + 0x65, 0x3a, 0x47, 0x7b, 0x60, 0xc2, 0xd6, 0xfa, 0x91, 0xc9, 0xc6, + 0x71, 0x6c, 0xbd, 0x91, 0x87, 0x3c, 0x91, 0x86, 0x49, 0xab, 0xf3, + 0x0f, 0xa0, 0x6c, 0x26, 0x76, 0x5e, 0x1c, 0xac, 0x9b, 0x71, 0xe5, + 0x8d, 0xbc, 0x9b, 0x21, 0x1e, 0x9c, 0xd6, 0x38, 0x7e, 0x24, 0x80, + 0x15, 0x31, 0x82, 0x96, 0xb1, 0x49, 0xd3, 0x62, 0x37, 0x5b, 0x88, + 0x0c, 0x0a, 0x62, 0x34, 0xfe, 0xa7, 0x48, 0x7e, 0x99, 0xb1, 0x30, + 0x8b, 0x90, 0x37, 0x95, 0x1c, 0xa8, 0x1f, 0xa5, 0x2c, 0x8d, 0xf4, + 0x55, 0xc8, 0xdb, 0xdd, 0x59, 0x0a, 0xc2, 0xad, 0x78, 0xa0, 0xf4, + 0x8b, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, + 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, + 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, + 0x0e, 0x04, 0x16, 0x04, 0x14, 0x38, 0x14, 0xe6, 0xc8, 0xf0, 0xa9, + 0xa4, 0x03, 0xf4, 0x4e, 0x3e, 0x22, 0xa3, 0x5b, 0xf2, 0xd6, 0xe0, + 0xad, 0x40, 0x74, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, + 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x01, 0x67, 0xa3, 0x8c, 0xc9, + 0x25, 0x3d, 0x13, 0x63, 0x5d, 0x16, 0x6f, 0xec, 0xa1, 0x3e, 0x09, + 0x5c, 0x91, 0x15, 0x2a, 0x2a, 0xd9, 0x80, 0x21, 0x4f, 0x05, 0xdc, + 0xbb, 0xa5, 0x89, 0xab, 0x13, 0x33, 0x2a, 0x9e, 0x38, 0xb7, 0x8c, + 0x6f, 0x02, 0x72, 0x63, 0xc7, 0x73, 0x77, 0x1e, 0x09, 0x06, 0xba, + 0x3b, 0x28, 0x7b, 0xa4, 0x47, 0xc9, 0x61, 0x6b, 0x08, 0x08, 0x20, + 0xfc, 0x8a, 0x05, 0x8a, 0x1f, 0xbc, 0xba, 0xc6, 0xc2, 0xfe, 0xcf, + 0x6e, 0xec, 0x13, 0x33, 0x71, 0x67, 0x2e, 0x69, 0xfa, 0xa9, 0x2c, + 0x3f, 0x66, 0xc0, 0x12, 0x59, 0x4d, 0x0b, 0x54, 0x02, 0x92, 0x84, + 0xbb, 0xdb, 0x12, 0xef, 0x83, 0x70, 0x70, 0x78, 0xc8, 0x53, 0xfa, + 0xdf, 0xc6, 0xc6, 0xff, 0xdc, 0x88, 0x2f, 0x07, 0xc0, 0x49, 0x9d, + 0x32, 0x57, 0x60, 0xd3, 0xf2, 0xf6, 0x99, 0x29, 0x5f, 0xe7, 0xaa, + 0x01, 0xcc, 0xac, 0x33, 0xa8, 0x1c, 0x0a, 0xbb, 0x91, 0xc4, 0x03, + 0xa0, 0x6f, 0xb6, 0x34, 0xf9, 0x86, 0xd3, 0xb3, 0x76, 0x54, 0x98, + 0xf4, 0x4a, 0x81, 0xb3, 0x53, 0x9d, 0x4d, 0x40, 0xec, 0xe5, 0x77, + 0x13, 0x45, 0xaf, 0x5b, 0xaa, 0x1f, 0xd8, 0x2f, 0x4c, 0x82, 0x7b, + 0xfe, 0x2a, 0xc4, 0x58, 0xbb, 0x4f, 0xfc, 0x9e, 0xfd, 0x03, 0x65, + 0x1a, 0x2a, 0x0e, 0xc3, 0xa5, 0x20, 0x16, 0x94, 0x6b, 0x79, 0xa6, + 0xa2, 0x12, 0xb4, 0xbb, 0x1a, 0xa4, 0x23, 0x7a, 0x5f, 0xf0, 0xae, + 0x84, 0x24, 0xe4, 0xf3, 0x2b, 0xfb, 0x8a, 0x24, 0xa3, 0x27, 0x98, + 0x65, 0xda, 0x30, 0x75, 0x76, 0xfc, 0x19, 0x91, 0xe8, 0xdb, 0xeb, + 0x9b, 0x3f, 0x32, 0xbf, 0x40, 0x97, 0x07, 0x26, 0xba, 0xcc, 0xf3, + 0x94, 0x85, 0x4a, 0x7a, 0x27, 0x93, 0xcf, 0x90, 0x42, 0xd4, 0xb8, + 0x5b, 0x16, 0xa6, 0xe7, 0xcb, 0x40, 0x03, 0xdd, 0x79, 0x30, 0x82, + 0x05, 0xe7, 0x30, 0x82, 0x03, 0xcf, 0xa0, 0x03, 0x02, 0x01, 0x02, + 0x02, 0x08, 0x4c, 0xaf, 0x73, 0x42, 0x1c, 0x8e, 0x74, 0x02, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x05, 0x05, 0x00, 0x30, 0x81, 0x80, 0x31, 0x38, 0x30, 0x36, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2f, 0x45, 0x42, 0x47, 0x20, 0x45, + 0x6c, 0x65, 0x6b, 0x74, 0x72, 0x6f, 0x6e, 0x69, 0x6b, 0x20, 0x53, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x6b, 0x61, 0x20, 0x48, 0x69, + 0x7a, 0x6d, 0x65, 0x74, 0x20, 0x53, 0x61, 0xc4, 0x9f, 0x6c, 0x61, + 0x79, 0xc4, 0xb1, 0x63, 0xc4, 0xb1, 0x73, 0xc4, 0xb1, 0x31, 0x37, + 0x30, 0x35, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x2e, 0x45, 0x42, + 0x47, 0x20, 0x42, 0x69, 0x6c, 0x69, 0xc5, 0x9f, 0x69, 0x6d, 0x20, + 0x54, 0x65, 0x6b, 0x6e, 0x6f, 0x6c, 0x6f, 0x6a, 0x69, 0x6c, 0x65, + 0x72, 0x69, 0x20, 0x76, 0x65, 0x20, 0x48, 0x69, 0x7a, 0x6d, 0x65, + 0x74, 0x6c, 0x65, 0x72, 0x69, 0x20, 0x41, 0x2e, 0xc5, 0x9e, 0x2e, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x54, 0x52, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x30, 0x38, 0x31, + 0x37, 0x30, 0x30, 0x32, 0x31, 0x30, 0x39, 0x5a, 0x17, 0x0d, 0x31, + 0x36, 0x30, 0x38, 0x31, 0x34, 0x30, 0x30, 0x33, 0x31, 0x30, 0x39, + 0x5a, 0x30, 0x81, 0x80, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x0c, 0x2f, 0x45, 0x42, 0x47, 0x20, 0x45, 0x6c, 0x65, + 0x6b, 0x74, 0x72, 0x6f, 0x6e, 0x69, 0x6b, 0x20, 0x53, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x6b, 0x61, 0x20, 0x48, 0x69, 0x7a, 0x6d, + 0x65, 0x74, 0x20, 0x53, 0x61, 0xc4, 0x9f, 0x6c, 0x61, 0x79, 0xc4, + 0xb1, 0x63, 0xc4, 0xb1, 0x73, 0xc4, 0xb1, 0x31, 0x37, 0x30, 0x35, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x2e, 0x45, 0x42, 0x47, 0x20, + 0x42, 0x69, 0x6c, 0x69, 0xc5, 0x9f, 0x69, 0x6d, 0x20, 0x54, 0x65, + 0x6b, 0x6e, 0x6f, 0x6c, 0x6f, 0x6a, 0x69, 0x6c, 0x65, 0x72, 0x69, + 0x20, 0x76, 0x65, 0x20, 0x48, 0x69, 0x7a, 0x6d, 0x65, 0x74, 0x6c, + 0x65, 0x72, 0x69, 0x20, 0x41, 0x2e, 0xc5, 0x9e, 0x2e, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x54, 0x52, + 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, + 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, + 0xee, 0xa0, 0x84, 0x61, 0xd0, 0x3a, 0x6a, 0x66, 0x10, 0x32, 0xd8, + 0x31, 0x38, 0x7f, 0xa7, 0xa7, 0xe5, 0xfd, 0xa1, 0xe1, 0xfb, 0x97, + 0x77, 0xb8, 0x71, 0x96, 0xe8, 0x13, 0x96, 0x46, 0x83, 0x4f, 0xb6, + 0xf2, 0x5f, 0x72, 0x56, 0x6e, 0x13, 0x60, 0xa5, 0x01, 0x91, 0xe2, + 0x5b, 0xc5, 0xcd, 0x57, 0x1f, 0x77, 0x63, 0x51, 0xff, 0x2f, 0x3d, + 0xdb, 0xb9, 0x3f, 0xaa, 0xa9, 0x35, 0xe7, 0x79, 0xd0, 0xf5, 0xd0, + 0x24, 0xb6, 0x21, 0xea, 0xeb, 0x23, 0x94, 0xfe, 0x29, 0xbf, 0xfb, + 0x89, 0x91, 0x0c, 0x64, 0x9a, 0x05, 0x4a, 0x2b, 0xcc, 0x0c, 0xee, + 0xf1, 0x3d, 0x9b, 0x82, 0x69, 0xa4, 0x4c, 0xf8, 0x9a, 0x6f, 0xe7, + 0x22, 0xda, 0x10, 0xba, 0x5f, 0x92, 0xfc, 0x18, 0x27, 0x0a, 0xa8, + 0xaa, 0x44, 0xfa, 0x2e, 0x2c, 0xb4, 0xfb, 0x46, 0x9a, 0x08, 0x03, + 0x83, 0x72, 0xab, 0x88, 0xe4, 0x6a, 0x72, 0xc9, 0xe5, 0x65, 0x1f, + 0x6e, 0x2a, 0x0f, 0x9d, 0xb3, 0xe8, 0x3b, 0xe4, 0x0c, 0x6e, 0x7a, + 0xda, 0x57, 0xfd, 0xd7, 0xeb, 0x79, 0x8b, 0x5e, 0x20, 0x06, 0xd3, + 0x76, 0x0b, 0x6c, 0x02, 0x95, 0xa3, 0x96, 0xe4, 0xcb, 0x76, 0x51, + 0xd1, 0x28, 0x9d, 0xa1, 0x1a, 0xfc, 0x44, 0xa2, 0x4d, 0xcc, 0x7a, + 0x76, 0xa8, 0x0d, 0x3d, 0xbf, 0x17, 0x4f, 0x22, 0x88, 0x50, 0xfd, + 0xae, 0xb6, 0xec, 0x90, 0x50, 0x4a, 0x5b, 0x9f, 0x95, 0x41, 0xaa, + 0xca, 0x0f, 0xb2, 0x4a, 0xfe, 0x80, 0x99, 0x4e, 0xa3, 0x46, 0x15, + 0xab, 0xf8, 0x73, 0x42, 0x6a, 0xc2, 0x66, 0x76, 0xb1, 0x0a, 0x26, + 0x15, 0xdd, 0x93, 0x92, 0xec, 0xdb, 0xa9, 0x5f, 0x54, 0x22, 0x52, + 0x91, 0x70, 0x5d, 0x13, 0xea, 0x48, 0xec, 0x6e, 0x03, 0x6c, 0xd9, + 0xdd, 0x6c, 0xfc, 0xeb, 0x0d, 0x03, 0xff, 0xa6, 0x83, 0x12, 0x9b, + 0xf1, 0xa9, 0x93, 0x0f, 0xc5, 0x26, 0x4c, 0x31, 0xb2, 0x63, 0x99, + 0x61, 0x72, 0xe7, 0x2a, 0x64, 0x99, 0xd2, 0xb8, 0xe9, 0x75, 0xe2, + 0x7c, 0xa9, 0xa9, 0x9a, 0x1a, 0xaa, 0xc3, 0x56, 0xdb, 0x10, 0x9a, + 0x3c, 0x83, 0x52, 0xb6, 0x7b, 0x96, 0xb7, 0xac, 0x87, 0x77, 0xa8, + 0xb9, 0xf2, 0x67, 0x0b, 0x94, 0x43, 0xb3, 0xaf, 0x3e, 0x73, 0xfa, + 0x42, 0x36, 0xb1, 0x25, 0xc5, 0x0a, 0x31, 0x26, 0x37, 0x56, 0x67, + 0xba, 0xa3, 0x0b, 0x7d, 0xd6, 0xf7, 0x89, 0xcd, 0x67, 0xa1, 0xb7, + 0x3a, 0x1e, 0x66, 0x4f, 0xf6, 0xa0, 0x55, 0x14, 0x25, 0x4c, 0x2c, + 0x33, 0x0d, 0xa6, 0x41, 0x8c, 0xbd, 0x04, 0x31, 0x6a, 0x10, 0x72, + 0x0a, 0x9d, 0x0e, 0x2e, 0x76, 0xbd, 0x5e, 0xf3, 0x51, 0x89, 0x8b, + 0xa8, 0x3f, 0x55, 0x73, 0xbf, 0xdb, 0x3a, 0xc6, 0x24, 0x05, 0x96, + 0x92, 0x48, 0xaa, 0x4b, 0x8d, 0x2a, 0x03, 0xe5, 0x57, 0x91, 0x10, + 0xf4, 0x6a, 0x28, 0x15, 0x6e, 0x47, 0x77, 0x84, 0x5c, 0x51, 0x74, + 0x9f, 0x19, 0xe9, 0xe6, 0x1e, 0x63, 0x16, 0x39, 0xe3, 0x11, 0x15, + 0xe3, 0x58, 0x1a, 0x44, 0xbd, 0xcb, 0xc4, 0x6c, 0x66, 0xd7, 0x84, + 0x06, 0xdf, 0x30, 0xf4, 0x37, 0xa2, 0x43, 0x22, 0x79, 0xd2, 0x10, + 0x6c, 0xdf, 0xbb, 0xe6, 0x13, 0x11, 0xfc, 0x9d, 0x84, 0x0a, 0x13, + 0x7b, 0xf0, 0x3b, 0xd0, 0xfc, 0xa3, 0x0a, 0xd7, 0x89, 0xea, 0x96, + 0x7e, 0x8d, 0x48, 0x85, 0x1e, 0x64, 0x5f, 0xdb, 0x54, 0xa2, 0xac, + 0xd5, 0x7a, 0x02, 0x79, 0x6b, 0xd2, 0x8a, 0xf0, 0x67, 0xda, 0x65, + 0x72, 0x0d, 0x14, 0x70, 0xe4, 0xe9, 0x8e, 0x78, 0x8f, 0x32, 0x74, + 0x7c, 0x57, 0xf2, 0xd6, 0xd6, 0xf4, 0x36, 0x89, 0x1b, 0xf8, 0x29, + 0x6c, 0x8b, 0xb9, 0xf6, 0x97, 0xd1, 0xa4, 0x2e, 0xaa, 0xbe, 0x0b, + 0x19, 0xc2, 0x45, 0xe9, 0x70, 0x5d, 0x02, 0x03, 0x00, 0x9d, 0xd9, + 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, + 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, - 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, - 0x01, 0x00, 0x01, 0x67, 0xa3, 0x8c, 0xc9, 0x25, 0x3d, 0x13, 0x63, - 0x5d, 0x16, 0x6f, 0xec, 0xa1, 0x3e, 0x09, 0x5c, 0x91, 0x15, 0x2a, - 0x2a, 0xd9, 0x80, 0x21, 0x4f, 0x05, 0xdc, 0xbb, 0xa5, 0x89, 0xab, - 0x13, 0x33, 0x2a, 0x9e, 0x38, 0xb7, 0x8c, 0x6f, 0x02, 0x72, 0x63, - 0xc7, 0x73, 0x77, 0x1e, 0x09, 0x06, 0xba, 0x3b, 0x28, 0x7b, 0xa4, - 0x47, 0xc9, 0x61, 0x6b, 0x08, 0x08, 0x20, 0xfc, 0x8a, 0x05, 0x8a, - 0x1f, 0xbc, 0xba, 0xc6, 0xc2, 0xfe, 0xcf, 0x6e, 0xec, 0x13, 0x33, - 0x71, 0x67, 0x2e, 0x69, 0xfa, 0xa9, 0x2c, 0x3f, 0x66, 0xc0, 0x12, - 0x59, 0x4d, 0x0b, 0x54, 0x02, 0x92, 0x84, 0xbb, 0xdb, 0x12, 0xef, - 0x83, 0x70, 0x70, 0x78, 0xc8, 0x53, 0xfa, 0xdf, 0xc6, 0xc6, 0xff, - 0xdc, 0x88, 0x2f, 0x07, 0xc0, 0x49, 0x9d, 0x32, 0x57, 0x60, 0xd3, - 0xf2, 0xf6, 0x99, 0x29, 0x5f, 0xe7, 0xaa, 0x01, 0xcc, 0xac, 0x33, - 0xa8, 0x1c, 0x0a, 0xbb, 0x91, 0xc4, 0x03, 0xa0, 0x6f, 0xb6, 0x34, - 0xf9, 0x86, 0xd3, 0xb3, 0x76, 0x54, 0x98, 0xf4, 0x4a, 0x81, 0xb3, - 0x53, 0x9d, 0x4d, 0x40, 0xec, 0xe5, 0x77, 0x13, 0x45, 0xaf, 0x5b, - 0xaa, 0x1f, 0xd8, 0x2f, 0x4c, 0x82, 0x7b, 0xfe, 0x2a, 0xc4, 0x58, - 0xbb, 0x4f, 0xfc, 0x9e, 0xfd, 0x03, 0x65, 0x1a, 0x2a, 0x0e, 0xc3, - 0xa5, 0x20, 0x16, 0x94, 0x6b, 0x79, 0xa6, 0xa2, 0x12, 0xb4, 0xbb, - 0x1a, 0xa4, 0x23, 0x7a, 0x5f, 0xf0, 0xae, 0x84, 0x24, 0xe4, 0xf3, - 0x2b, 0xfb, 0x8a, 0x24, 0xa3, 0x27, 0x98, 0x65, 0xda, 0x30, 0x75, - 0x76, 0xfc, 0x19, 0x91, 0xe8, 0xdb, 0xeb, 0x9b, 0x3f, 0x32, 0xbf, - 0x40, 0x97, 0x07, 0x26, 0xba, 0xcc, 0xf3, 0x94, 0x85, 0x4a, 0x7a, - 0x27, 0x93, 0xcf, 0x90, 0x42, 0xd4, 0xb8, 0x5b, 0x16, 0xa6, 0xe7, - 0xcb, 0x40, 0x03, 0xdd, 0x79, 0x30, 0x82, 0x05, 0xe7, 0x30, 0x82, - 0x03, 0xcf, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x4c, 0xaf, - 0x73, 0x42, 0x1c, 0x8e, 0x74, 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, + 0x04, 0x16, 0x04, 0x14, 0xe7, 0xce, 0xc6, 0x4f, 0xfc, 0x16, 0x67, + 0x96, 0xfa, 0x4a, 0xa3, 0x07, 0xc1, 0x04, 0xa7, 0xcb, 0x6a, 0xde, + 0xda, 0x47, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, + 0x30, 0x16, 0x80, 0x14, 0xe7, 0xce, 0xc6, 0x4f, 0xfc, 0x16, 0x67, + 0x96, 0xfa, 0x4a, 0xa3, 0x07, 0xc1, 0x04, 0xa7, 0xcb, 0x6a, 0xde, + 0xda, 0x47, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, + 0x9b, 0x98, 0x9a, 0x5d, 0xbe, 0xf3, 0x28, 0x23, 0x76, 0xc6, 0x6c, + 0xf7, 0x7f, 0xe6, 0x40, 0x9e, 0xc0, 0x36, 0xdc, 0x95, 0x0d, 0x1d, + 0xad, 0x15, 0xc5, 0x36, 0xd8, 0xd5, 0x39, 0xef, 0xf2, 0x1e, 0x22, + 0x5e, 0xb3, 0x82, 0xb4, 0x5d, 0xbb, 0x4c, 0x1a, 0xca, 0x92, 0x0d, + 0xdf, 0x47, 0x24, 0x1e, 0xb3, 0x24, 0xda, 0x91, 0x88, 0xe9, 0x83, + 0x70, 0xdd, 0x93, 0xd7, 0xe9, 0xba, 0xb3, 0xdf, 0x16, 0x5a, 0x3e, + 0xde, 0xe0, 0xc8, 0xfb, 0xd3, 0xfd, 0x6c, 0x29, 0xf8, 0x15, 0x46, + 0xa0, 0x68, 0x26, 0xcc, 0x93, 0x52, 0xae, 0x82, 0x01, 0x93, 0x90, + 0xca, 0x77, 0xca, 0x4d, 0x49, 0xef, 0xe2, 0x5a, 0xd9, 0x2a, 0xbd, + 0x30, 0xce, 0x4c, 0xb2, 0x81, 0xb6, 0x30, 0xce, 0x59, 0x4f, 0xda, + 0x59, 0x1d, 0x6a, 0x7a, 0xa4, 0x45, 0xb0, 0x82, 0x26, 0x81, 0x86, + 0x76, 0xf5, 0xf5, 0x10, 0x00, 0xb8, 0xee, 0xb3, 0x09, 0xe8, 0x4f, + 0x87, 0x02, 0x07, 0xae, 0x24, 0x5c, 0xf0, 0x5f, 0xac, 0x0a, 0x30, + 0xcc, 0x8a, 0x40, 0xa0, 0x73, 0x04, 0xc1, 0xfb, 0x89, 0x24, 0xf6, + 0x9a, 0x1c, 0x5c, 0xb7, 0x3c, 0x0a, 0x67, 0x36, 0x05, 0x08, 0x31, + 0xb3, 0xaf, 0xd8, 0x01, 0x68, 0x2a, 0xe0, 0x78, 0x8f, 0x74, 0xde, + 0xb8, 0x51, 0xa4, 0x8c, 0x6c, 0x20, 0x3d, 0xa2, 0xfb, 0xb3, 0xd4, + 0x09, 0xfd, 0x7b, 0xc2, 0x80, 0xaa, 0x93, 0x6c, 0x29, 0x98, 0x21, + 0xa8, 0xbb, 0x16, 0xf3, 0xa9, 0x12, 0x5f, 0x74, 0xb5, 0x87, 0x98, + 0xf2, 0x95, 0x26, 0xdf, 0x34, 0xef, 0x8a, 0x53, 0x91, 0x88, 0x5d, + 0x1a, 0x94, 0xa3, 0x3f, 0x7c, 0x22, 0xf8, 0xd7, 0x88, 0xba, 0xa6, + 0x8c, 0x96, 0xa8, 0x3d, 0x52, 0x34, 0x62, 0x9f, 0x00, 0x1e, 0x54, + 0x55, 0x42, 0x67, 0xc6, 0x4d, 0x46, 0x8f, 0xbb, 0x14, 0x45, 0x3d, + 0x0a, 0x96, 0x16, 0x8e, 0x10, 0xa1, 0x97, 0x99, 0xd5, 0xd3, 0x30, + 0x85, 0xcc, 0xde, 0xb4, 0x72, 0xb7, 0xbc, 0x8a, 0x3c, 0x18, 0x29, + 0x68, 0xfd, 0xdc, 0x71, 0x07, 0xee, 0x24, 0x39, 0x6a, 0xfa, 0xed, + 0xa5, 0xac, 0x38, 0x2f, 0xf9, 0x1e, 0x10, 0x0e, 0x06, 0x71, 0x1a, + 0x10, 0x4c, 0xfe, 0x75, 0x7e, 0xff, 0x1e, 0x57, 0x39, 0x42, 0xca, + 0xd7, 0xe1, 0x15, 0xa1, 0x56, 0x55, 0x59, 0x1b, 0xd1, 0xa3, 0xaf, + 0x11, 0xd8, 0x4e, 0xc3, 0xa5, 0x2b, 0xef, 0x90, 0xbf, 0xc0, 0xec, + 0x82, 0x13, 0x5b, 0x8d, 0xd6, 0x72, 0x2c, 0x93, 0x4e, 0x8f, 0x6a, + 0x29, 0xdf, 0x85, 0x3c, 0xd3, 0x0d, 0xe0, 0xa2, 0x18, 0x12, 0xcc, + 0x55, 0x2f, 0x47, 0xb7, 0xa7, 0x9b, 0x02, 0xfe, 0x41, 0xf6, 0x88, + 0x4c, 0x6d, 0xda, 0xa9, 0x01, 0x47, 0x83, 0x64, 0x27, 0x62, 0x10, + 0x82, 0xd6, 0x12, 0x7b, 0x5e, 0x03, 0x1f, 0x34, 0xa9, 0xc9, 0x91, + 0xfe, 0xaf, 0x5d, 0x6d, 0x86, 0x27, 0xb7, 0x23, 0xaa, 0x75, 0x18, + 0xca, 0x20, 0xe7, 0xb0, 0x0f, 0xd7, 0x89, 0x0e, 0xa6, 0x67, 0x22, + 0x63, 0xf4, 0x83, 0x41, 0x2b, 0x06, 0x4b, 0xbb, 0x58, 0xd5, 0xd1, + 0xd7, 0xb7, 0xb9, 0x10, 0x63, 0xd8, 0x89, 0x4a, 0xb4, 0xaa, 0xdd, + 0x16, 0x63, 0xf5, 0x6e, 0xbe, 0x60, 0xa1, 0xf8, 0xed, 0xe8, 0xd6, + 0x90, 0x4f, 0x1a, 0xc6, 0xc5, 0xa0, 0x29, 0xd3, 0xa7, 0x21, 0xa8, + 0xf5, 0x5a, 0x3c, 0xf7, 0xc7, 0x49, 0xa2, 0x21, 0x9a, 0x4a, 0x95, + 0x52, 0x20, 0x96, 0x72, 0x9a, 0x66, 0xcb, 0xf7, 0xd2, 0x86, 0x43, + 0x7c, 0x22, 0xbe, 0x96, 0xf9, 0xbd, 0x01, 0xa8, 0x47, 0xdd, 0xe5, + 0x3b, 0x40, 0xf9, 0x75, 0x2b, 0x9b, 0x2b, 0x46, 0x64, 0x86, 0x8d, + 0x1e, 0xf4, 0x8f, 0xfb, 0x07, 0x77, 0xd0, 0xea, 0x49, 0xa2, 0x1c, + 0x8d, 0x52, 0x14, 0xa6, 0x0a, 0x93, 0x30, 0x82, 0x03, 0x38, 0x30, + 0x82, 0x02, 0x20, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x06, 0x20, + 0x06, 0x05, 0x16, 0x70, 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x3b, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x52, 0x4f, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x13, 0x08, 0x63, 0x65, 0x72, 0x74, 0x53, 0x49, 0x47, 0x4e, 0x31, + 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x63, + 0x65, 0x72, 0x74, 0x53, 0x49, 0x47, 0x4e, 0x20, 0x52, 0x4f, 0x4f, + 0x54, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x30, + 0x37, 0x30, 0x34, 0x31, 0x37, 0x32, 0x30, 0x30, 0x34, 0x5a, 0x17, + 0x0d, 0x33, 0x31, 0x30, 0x37, 0x30, 0x34, 0x31, 0x37, 0x32, 0x30, + 0x30, 0x34, 0x5a, 0x30, 0x3b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x52, 0x4f, 0x31, 0x11, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x63, 0x65, 0x72, 0x74, + 0x53, 0x49, 0x47, 0x4e, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, + 0x04, 0x0b, 0x13, 0x10, 0x63, 0x65, 0x72, 0x74, 0x53, 0x49, 0x47, + 0x4e, 0x20, 0x52, 0x4f, 0x4f, 0x54, 0x20, 0x43, 0x41, 0x30, 0x82, + 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, + 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb7, 0x33, + 0xb9, 0x7e, 0xc8, 0x25, 0x4a, 0x8e, 0xb5, 0xdb, 0xb4, 0x28, 0x1b, + 0xaa, 0x57, 0x90, 0xe8, 0xd1, 0x22, 0xd3, 0x64, 0xba, 0xd3, 0x93, + 0xe8, 0xd4, 0xac, 0x86, 0x61, 0x40, 0x6a, 0x60, 0x57, 0x68, 0x54, + 0x84, 0x4d, 0xbc, 0x6a, 0x54, 0x02, 0x05, 0xff, 0xdf, 0x9b, 0x9a, + 0x2a, 0xae, 0x5d, 0x07, 0x8f, 0x4a, 0xc3, 0x28, 0x7f, 0xef, 0xfb, + 0x2b, 0xfa, 0x79, 0xf1, 0xc7, 0xad, 0xf0, 0x10, 0x53, 0x24, 0x90, + 0x8b, 0x66, 0xc9, 0xa8, 0x88, 0xab, 0xaf, 0x5a, 0xa3, 0x00, 0xe9, + 0xbe, 0xba, 0x46, 0xee, 0x5b, 0x73, 0x7b, 0x2c, 0x17, 0x82, 0x81, + 0x5e, 0x62, 0x2c, 0xa1, 0x02, 0x65, 0xb3, 0xbd, 0xc5, 0x2b, 0x00, + 0x7e, 0xc4, 0xfc, 0x03, 0x33, 0x57, 0x0d, 0xed, 0xe2, 0xfa, 0xce, + 0x5d, 0x45, 0xd6, 0x38, 0xcd, 0x35, 0xb6, 0xb2, 0xc1, 0xd0, 0x9c, + 0x81, 0x4a, 0xaa, 0xe4, 0xb2, 0x01, 0x5c, 0x1d, 0x8f, 0x5f, 0x99, + 0xc4, 0xb1, 0xad, 0xdb, 0x88, 0x21, 0xeb, 0x90, 0x08, 0x82, 0x80, + 0xf3, 0x30, 0xa3, 0x43, 0xe6, 0x90, 0x82, 0xae, 0x55, 0x28, 0x49, + 0xed, 0x5b, 0xd7, 0xa9, 0x10, 0x38, 0x0e, 0xfe, 0x8f, 0x4c, 0x5b, + 0x9b, 0x46, 0xea, 0x41, 0xf5, 0xb0, 0x08, 0x74, 0xc3, 0xd0, 0x88, + 0x33, 0xb6, 0x7c, 0xd7, 0x74, 0xdf, 0xdc, 0x84, 0xd1, 0x43, 0x0e, + 0x75, 0x39, 0xa1, 0x25, 0x40, 0x28, 0xea, 0x78, 0xcb, 0x0e, 0x2c, + 0x2e, 0x39, 0x9d, 0x8c, 0x8b, 0x6e, 0x16, 0x1c, 0x2f, 0x26, 0x82, + 0x10, 0xe2, 0xe3, 0x65, 0x94, 0x0a, 0x04, 0xc0, 0x5e, 0xf7, 0x5d, + 0x5b, 0xf8, 0x10, 0xe2, 0xd0, 0xba, 0x7a, 0x4b, 0xfb, 0xde, 0x37, + 0x00, 0x00, 0x1a, 0x5b, 0x28, 0xe3, 0xd2, 0x9c, 0x73, 0x3e, 0x32, + 0x87, 0x98, 0xa1, 0xc9, 0x51, 0x2f, 0xd7, 0xde, 0xac, 0x33, 0xb3, + 0x4f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, + 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, + 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, + 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0xc6, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xe0, + 0x8c, 0x9b, 0xdb, 0x25, 0x49, 0xb3, 0xf1, 0x7c, 0x86, 0xd6, 0xb2, + 0x42, 0x87, 0x0b, 0xd0, 0x6b, 0xa0, 0xd9, 0xe4, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x3e, 0xd2, 0x1c, 0x89, 0x2e, + 0x35, 0xfc, 0xf8, 0x75, 0xdd, 0xe6, 0x7f, 0x65, 0x88, 0xf4, 0x72, + 0x4c, 0xc9, 0x2c, 0xd7, 0x32, 0x4e, 0xf3, 0xdd, 0x19, 0x79, 0x47, + 0xbd, 0x8e, 0x3b, 0x5b, 0x93, 0x0f, 0x50, 0x49, 0x24, 0x13, 0x6b, + 0x14, 0x06, 0x72, 0xef, 0x09, 0xd3, 0xa1, 0xa1, 0xe3, 0x40, 0x84, + 0xc9, 0xe7, 0x18, 0x32, 0x74, 0x3c, 0x48, 0x6e, 0x0f, 0x9f, 0x4b, + 0xd4, 0xf7, 0x1e, 0xd3, 0x93, 0x86, 0x64, 0x54, 0x97, 0x63, 0x72, + 0x50, 0xd5, 0x55, 0xcf, 0xfa, 0x20, 0x93, 0x02, 0xa2, 0x9b, 0xc3, + 0x23, 0x93, 0x4e, 0x16, 0x55, 0x76, 0xa0, 0x70, 0x79, 0x6d, 0xcd, + 0x21, 0x1f, 0xcf, 0x2f, 0x2d, 0xbc, 0x19, 0xe3, 0x88, 0x31, 0xf8, + 0x59, 0x1a, 0x81, 0x09, 0xc8, 0x97, 0xa6, 0x74, 0xc7, 0x60, 0xc4, + 0x5b, 0xcc, 0x57, 0x8e, 0xb2, 0x75, 0xfd, 0x1b, 0x02, 0x09, 0xdb, + 0x59, 0x6f, 0x72, 0x93, 0x69, 0xf7, 0x31, 0x41, 0xd6, 0x88, 0x38, + 0xbf, 0x87, 0xb2, 0xbd, 0x16, 0x79, 0xf9, 0xaa, 0xe4, 0xbe, 0x88, + 0x25, 0xdd, 0x61, 0x27, 0x23, 0x1c, 0xb5, 0x31, 0x07, 0x04, 0x36, + 0xb4, 0x1a, 0x90, 0xbd, 0xa0, 0x74, 0x71, 0x50, 0x89, 0x6d, 0xbc, + 0x14, 0xe3, 0x0f, 0x86, 0xae, 0xf1, 0xab, 0x3e, 0xc7, 0xa0, 0x09, + 0xcc, 0xa3, 0x48, 0xd1, 0xe0, 0xdb, 0x64, 0xe7, 0x92, 0xb5, 0xcf, + 0xaf, 0x72, 0x43, 0x70, 0x8b, 0xf9, 0xc3, 0x84, 0x3c, 0x13, 0xaa, + 0x7e, 0x92, 0x9b, 0x57, 0x53, 0x93, 0xfa, 0x70, 0xc2, 0x91, 0x0e, + 0x31, 0xf9, 0x9b, 0x67, 0x5d, 0xe9, 0x96, 0x38, 0x5e, 0x5f, 0xb3, + 0x73, 0x4e, 0x88, 0x15, 0x67, 0xde, 0x9e, 0x76, 0x10, 0x62, 0x20, + 0xbe, 0x55, 0x69, 0x95, 0x43, 0x00, 0x39, 0x4d, 0xf6, 0xee, 0xb0, + 0x5a, 0x4e, 0x49, 0x44, 0x54, 0x58, 0x5f, 0x42, 0x83, 0x30, 0x82, + 0x03, 0x55, 0x30, 0x82, 0x02, 0x3d, 0xa0, 0x03, 0x02, 0x01, 0x02, + 0x02, 0x04, 0x49, 0x33, 0x00, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, - 0x81, 0x80, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, - 0x0c, 0x2f, 0x45, 0x42, 0x47, 0x20, 0x45, 0x6c, 0x65, 0x6b, 0x74, - 0x72, 0x6f, 0x6e, 0x69, 0x6b, 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x6b, 0x61, 0x20, 0x48, 0x69, 0x7a, 0x6d, 0x65, 0x74, - 0x20, 0x53, 0x61, 0xc4, 0x9f, 0x6c, 0x61, 0x79, 0xc4, 0xb1, 0x63, - 0xc4, 0xb1, 0x73, 0xc4, 0xb1, 0x31, 0x37, 0x30, 0x35, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x0c, 0x2e, 0x45, 0x42, 0x47, 0x20, 0x42, 0x69, - 0x6c, 0x69, 0xc5, 0x9f, 0x69, 0x6d, 0x20, 0x54, 0x65, 0x6b, 0x6e, - 0x6f, 0x6c, 0x6f, 0x6a, 0x69, 0x6c, 0x65, 0x72, 0x69, 0x20, 0x76, - 0x65, 0x20, 0x48, 0x69, 0x7a, 0x6d, 0x65, 0x74, 0x6c, 0x65, 0x72, - 0x69, 0x20, 0x41, 0x2e, 0xc5, 0x9e, 0x2e, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x54, 0x52, 0x30, 0x1e, - 0x17, 0x0d, 0x30, 0x36, 0x30, 0x38, 0x31, 0x37, 0x30, 0x30, 0x32, - 0x31, 0x30, 0x39, 0x5a, 0x17, 0x0d, 0x31, 0x36, 0x30, 0x38, 0x31, - 0x34, 0x30, 0x30, 0x33, 0x31, 0x30, 0x39, 0x5a, 0x30, 0x81, 0x80, - 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2f, - 0x45, 0x42, 0x47, 0x20, 0x45, 0x6c, 0x65, 0x6b, 0x74, 0x72, 0x6f, - 0x6e, 0x69, 0x6b, 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x6b, 0x61, 0x20, 0x48, 0x69, 0x7a, 0x6d, 0x65, 0x74, 0x20, 0x53, - 0x61, 0xc4, 0x9f, 0x6c, 0x61, 0x79, 0xc4, 0xb1, 0x63, 0xc4, 0xb1, - 0x73, 0xc4, 0xb1, 0x31, 0x37, 0x30, 0x35, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x0c, 0x2e, 0x45, 0x42, 0x47, 0x20, 0x42, 0x69, 0x6c, 0x69, - 0xc5, 0x9f, 0x69, 0x6d, 0x20, 0x54, 0x65, 0x6b, 0x6e, 0x6f, 0x6c, - 0x6f, 0x6a, 0x69, 0x6c, 0x65, 0x72, 0x69, 0x20, 0x76, 0x65, 0x20, - 0x48, 0x69, 0x7a, 0x6d, 0x65, 0x74, 0x6c, 0x65, 0x72, 0x69, 0x20, - 0x41, 0x2e, 0xc5, 0x9e, 0x2e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, - 0x55, 0x04, 0x06, 0x13, 0x02, 0x54, 0x52, 0x30, 0x82, 0x02, 0x22, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, - 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xee, 0xa0, 0x84, 0x61, - 0xd0, 0x3a, 0x6a, 0x66, 0x10, 0x32, 0xd8, 0x31, 0x38, 0x7f, 0xa7, - 0xa7, 0xe5, 0xfd, 0xa1, 0xe1, 0xfb, 0x97, 0x77, 0xb8, 0x71, 0x96, - 0xe8, 0x13, 0x96, 0x46, 0x83, 0x4f, 0xb6, 0xf2, 0x5f, 0x72, 0x56, - 0x6e, 0x13, 0x60, 0xa5, 0x01, 0x91, 0xe2, 0x5b, 0xc5, 0xcd, 0x57, - 0x1f, 0x77, 0x63, 0x51, 0xff, 0x2f, 0x3d, 0xdb, 0xb9, 0x3f, 0xaa, - 0xa9, 0x35, 0xe7, 0x79, 0xd0, 0xf5, 0xd0, 0x24, 0xb6, 0x21, 0xea, - 0xeb, 0x23, 0x94, 0xfe, 0x29, 0xbf, 0xfb, 0x89, 0x91, 0x0c, 0x64, - 0x9a, 0x05, 0x4a, 0x2b, 0xcc, 0x0c, 0xee, 0xf1, 0x3d, 0x9b, 0x82, - 0x69, 0xa4, 0x4c, 0xf8, 0x9a, 0x6f, 0xe7, 0x22, 0xda, 0x10, 0xba, - 0x5f, 0x92, 0xfc, 0x18, 0x27, 0x0a, 0xa8, 0xaa, 0x44, 0xfa, 0x2e, - 0x2c, 0xb4, 0xfb, 0x46, 0x9a, 0x08, 0x03, 0x83, 0x72, 0xab, 0x88, - 0xe4, 0x6a, 0x72, 0xc9, 0xe5, 0x65, 0x1f, 0x6e, 0x2a, 0x0f, 0x9d, - 0xb3, 0xe8, 0x3b, 0xe4, 0x0c, 0x6e, 0x7a, 0xda, 0x57, 0xfd, 0xd7, - 0xeb, 0x79, 0x8b, 0x5e, 0x20, 0x06, 0xd3, 0x76, 0x0b, 0x6c, 0x02, - 0x95, 0xa3, 0x96, 0xe4, 0xcb, 0x76, 0x51, 0xd1, 0x28, 0x9d, 0xa1, - 0x1a, 0xfc, 0x44, 0xa2, 0x4d, 0xcc, 0x7a, 0x76, 0xa8, 0x0d, 0x3d, - 0xbf, 0x17, 0x4f, 0x22, 0x88, 0x50, 0xfd, 0xae, 0xb6, 0xec, 0x90, - 0x50, 0x4a, 0x5b, 0x9f, 0x95, 0x41, 0xaa, 0xca, 0x0f, 0xb2, 0x4a, - 0xfe, 0x80, 0x99, 0x4e, 0xa3, 0x46, 0x15, 0xab, 0xf8, 0x73, 0x42, - 0x6a, 0xc2, 0x66, 0x76, 0xb1, 0x0a, 0x26, 0x15, 0xdd, 0x93, 0x92, - 0xec, 0xdb, 0xa9, 0x5f, 0x54, 0x22, 0x52, 0x91, 0x70, 0x5d, 0x13, - 0xea, 0x48, 0xec, 0x6e, 0x03, 0x6c, 0xd9, 0xdd, 0x6c, 0xfc, 0xeb, - 0x0d, 0x03, 0xff, 0xa6, 0x83, 0x12, 0x9b, 0xf1, 0xa9, 0x93, 0x0f, - 0xc5, 0x26, 0x4c, 0x31, 0xb2, 0x63, 0x99, 0x61, 0x72, 0xe7, 0x2a, - 0x64, 0x99, 0xd2, 0xb8, 0xe9, 0x75, 0xe2, 0x7c, 0xa9, 0xa9, 0x9a, - 0x1a, 0xaa, 0xc3, 0x56, 0xdb, 0x10, 0x9a, 0x3c, 0x83, 0x52, 0xb6, - 0x7b, 0x96, 0xb7, 0xac, 0x87, 0x77, 0xa8, 0xb9, 0xf2, 0x67, 0x0b, - 0x94, 0x43, 0xb3, 0xaf, 0x3e, 0x73, 0xfa, 0x42, 0x36, 0xb1, 0x25, - 0xc5, 0x0a, 0x31, 0x26, 0x37, 0x56, 0x67, 0xba, 0xa3, 0x0b, 0x7d, - 0xd6, 0xf7, 0x89, 0xcd, 0x67, 0xa1, 0xb7, 0x3a, 0x1e, 0x66, 0x4f, - 0xf6, 0xa0, 0x55, 0x14, 0x25, 0x4c, 0x2c, 0x33, 0x0d, 0xa6, 0x41, - 0x8c, 0xbd, 0x04, 0x31, 0x6a, 0x10, 0x72, 0x0a, 0x9d, 0x0e, 0x2e, - 0x76, 0xbd, 0x5e, 0xf3, 0x51, 0x89, 0x8b, 0xa8, 0x3f, 0x55, 0x73, - 0xbf, 0xdb, 0x3a, 0xc6, 0x24, 0x05, 0x96, 0x92, 0x48, 0xaa, 0x4b, - 0x8d, 0x2a, 0x03, 0xe5, 0x57, 0x91, 0x10, 0xf4, 0x6a, 0x28, 0x15, - 0x6e, 0x47, 0x77, 0x84, 0x5c, 0x51, 0x74, 0x9f, 0x19, 0xe9, 0xe6, - 0x1e, 0x63, 0x16, 0x39, 0xe3, 0x11, 0x15, 0xe3, 0x58, 0x1a, 0x44, - 0xbd, 0xcb, 0xc4, 0x6c, 0x66, 0xd7, 0x84, 0x06, 0xdf, 0x30, 0xf4, - 0x37, 0xa2, 0x43, 0x22, 0x79, 0xd2, 0x10, 0x6c, 0xdf, 0xbb, 0xe6, - 0x13, 0x11, 0xfc, 0x9d, 0x84, 0x0a, 0x13, 0x7b, 0xf0, 0x3b, 0xd0, - 0xfc, 0xa3, 0x0a, 0xd7, 0x89, 0xea, 0x96, 0x7e, 0x8d, 0x48, 0x85, - 0x1e, 0x64, 0x5f, 0xdb, 0x54, 0xa2, 0xac, 0xd5, 0x7a, 0x02, 0x79, - 0x6b, 0xd2, 0x8a, 0xf0, 0x67, 0xda, 0x65, 0x72, 0x0d, 0x14, 0x70, - 0xe4, 0xe9, 0x8e, 0x78, 0x8f, 0x32, 0x74, 0x7c, 0x57, 0xf2, 0xd6, - 0xd6, 0xf4, 0x36, 0x89, 0x1b, 0xf8, 0x29, 0x6c, 0x8b, 0xb9, 0xf6, - 0x97, 0xd1, 0xa4, 0x2e, 0xaa, 0xbe, 0x0b, 0x19, 0xc2, 0x45, 0xe9, - 0x70, 0x5d, 0x02, 0x03, 0x00, 0x9d, 0xd9, 0xa3, 0x63, 0x30, 0x61, - 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, - 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, - 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, - 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, - 0xe7, 0xce, 0xc6, 0x4f, 0xfc, 0x16, 0x67, 0x96, 0xfa, 0x4a, 0xa3, - 0x07, 0xc1, 0x04, 0xa7, 0xcb, 0x6a, 0xde, 0xda, 0x47, 0x30, 0x1f, - 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, - 0xe7, 0xce, 0xc6, 0x4f, 0xfc, 0x16, 0x67, 0x96, 0xfa, 0x4a, 0xa3, - 0x07, 0xc1, 0x04, 0xa7, 0xcb, 0x6a, 0xde, 0xda, 0x47, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, - 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x9b, 0x98, 0x9a, 0x5d, - 0xbe, 0xf3, 0x28, 0x23, 0x76, 0xc6, 0x6c, 0xf7, 0x7f, 0xe6, 0x40, - 0x9e, 0xc0, 0x36, 0xdc, 0x95, 0x0d, 0x1d, 0xad, 0x15, 0xc5, 0x36, - 0xd8, 0xd5, 0x39, 0xef, 0xf2, 0x1e, 0x22, 0x5e, 0xb3, 0x82, 0xb4, - 0x5d, 0xbb, 0x4c, 0x1a, 0xca, 0x92, 0x0d, 0xdf, 0x47, 0x24, 0x1e, - 0xb3, 0x24, 0xda, 0x91, 0x88, 0xe9, 0x83, 0x70, 0xdd, 0x93, 0xd7, - 0xe9, 0xba, 0xb3, 0xdf, 0x16, 0x5a, 0x3e, 0xde, 0xe0, 0xc8, 0xfb, - 0xd3, 0xfd, 0x6c, 0x29, 0xf8, 0x15, 0x46, 0xa0, 0x68, 0x26, 0xcc, - 0x93, 0x52, 0xae, 0x82, 0x01, 0x93, 0x90, 0xca, 0x77, 0xca, 0x4d, - 0x49, 0xef, 0xe2, 0x5a, 0xd9, 0x2a, 0xbd, 0x30, 0xce, 0x4c, 0xb2, - 0x81, 0xb6, 0x30, 0xce, 0x59, 0x4f, 0xda, 0x59, 0x1d, 0x6a, 0x7a, - 0xa4, 0x45, 0xb0, 0x82, 0x26, 0x81, 0x86, 0x76, 0xf5, 0xf5, 0x10, - 0x00, 0xb8, 0xee, 0xb3, 0x09, 0xe8, 0x4f, 0x87, 0x02, 0x07, 0xae, - 0x24, 0x5c, 0xf0, 0x5f, 0xac, 0x0a, 0x30, 0xcc, 0x8a, 0x40, 0xa0, - 0x73, 0x04, 0xc1, 0xfb, 0x89, 0x24, 0xf6, 0x9a, 0x1c, 0x5c, 0xb7, - 0x3c, 0x0a, 0x67, 0x36, 0x05, 0x08, 0x31, 0xb3, 0xaf, 0xd8, 0x01, - 0x68, 0x2a, 0xe0, 0x78, 0x8f, 0x74, 0xde, 0xb8, 0x51, 0xa4, 0x8c, - 0x6c, 0x20, 0x3d, 0xa2, 0xfb, 0xb3, 0xd4, 0x09, 0xfd, 0x7b, 0xc2, - 0x80, 0xaa, 0x93, 0x6c, 0x29, 0x98, 0x21, 0xa8, 0xbb, 0x16, 0xf3, - 0xa9, 0x12, 0x5f, 0x74, 0xb5, 0x87, 0x98, 0xf2, 0x95, 0x26, 0xdf, - 0x34, 0xef, 0x8a, 0x53, 0x91, 0x88, 0x5d, 0x1a, 0x94, 0xa3, 0x3f, - 0x7c, 0x22, 0xf8, 0xd7, 0x88, 0xba, 0xa6, 0x8c, 0x96, 0xa8, 0x3d, - 0x52, 0x34, 0x62, 0x9f, 0x00, 0x1e, 0x54, 0x55, 0x42, 0x67, 0xc6, - 0x4d, 0x46, 0x8f, 0xbb, 0x14, 0x45, 0x3d, 0x0a, 0x96, 0x16, 0x8e, - 0x10, 0xa1, 0x97, 0x99, 0xd5, 0xd3, 0x30, 0x85, 0xcc, 0xde, 0xb4, - 0x72, 0xb7, 0xbc, 0x8a, 0x3c, 0x18, 0x29, 0x68, 0xfd, 0xdc, 0x71, - 0x07, 0xee, 0x24, 0x39, 0x6a, 0xfa, 0xed, 0xa5, 0xac, 0x38, 0x2f, - 0xf9, 0x1e, 0x10, 0x0e, 0x06, 0x71, 0x1a, 0x10, 0x4c, 0xfe, 0x75, - 0x7e, 0xff, 0x1e, 0x57, 0x39, 0x42, 0xca, 0xd7, 0xe1, 0x15, 0xa1, - 0x56, 0x55, 0x59, 0x1b, 0xd1, 0xa3, 0xaf, 0x11, 0xd8, 0x4e, 0xc3, - 0xa5, 0x2b, 0xef, 0x90, 0xbf, 0xc0, 0xec, 0x82, 0x13, 0x5b, 0x8d, - 0xd6, 0x72, 0x2c, 0x93, 0x4e, 0x8f, 0x6a, 0x29, 0xdf, 0x85, 0x3c, - 0xd3, 0x0d, 0xe0, 0xa2, 0x18, 0x12, 0xcc, 0x55, 0x2f, 0x47, 0xb7, - 0xa7, 0x9b, 0x02, 0xfe, 0x41, 0xf6, 0x88, 0x4c, 0x6d, 0xda, 0xa9, - 0x01, 0x47, 0x83, 0x64, 0x27, 0x62, 0x10, 0x82, 0xd6, 0x12, 0x7b, - 0x5e, 0x03, 0x1f, 0x34, 0xa9, 0xc9, 0x91, 0xfe, 0xaf, 0x5d, 0x6d, - 0x86, 0x27, 0xb7, 0x23, 0xaa, 0x75, 0x18, 0xca, 0x20, 0xe7, 0xb0, - 0x0f, 0xd7, 0x89, 0x0e, 0xa6, 0x67, 0x22, 0x63, 0xf4, 0x83, 0x41, - 0x2b, 0x06, 0x4b, 0xbb, 0x58, 0xd5, 0xd1, 0xd7, 0xb7, 0xb9, 0x10, - 0x63, 0xd8, 0x89, 0x4a, 0xb4, 0xaa, 0xdd, 0x16, 0x63, 0xf5, 0x6e, - 0xbe, 0x60, 0xa1, 0xf8, 0xed, 0xe8, 0xd6, 0x90, 0x4f, 0x1a, 0xc6, - 0xc5, 0xa0, 0x29, 0xd3, 0xa7, 0x21, 0xa8, 0xf5, 0x5a, 0x3c, 0xf7, - 0xc7, 0x49, 0xa2, 0x21, 0x9a, 0x4a, 0x95, 0x52, 0x20, 0x96, 0x72, - 0x9a, 0x66, 0xcb, 0xf7, 0xd2, 0x86, 0x43, 0x7c, 0x22, 0xbe, 0x96, - 0xf9, 0xbd, 0x01, 0xa8, 0x47, 0xdd, 0xe5, 0x3b, 0x40, 0xf9, 0x75, - 0x2b, 0x9b, 0x2b, 0x46, 0x64, 0x86, 0x8d, 0x1e, 0xf4, 0x8f, 0xfb, - 0x07, 0x77, 0xd0, 0xea, 0x49, 0xa2, 0x1c, 0x8d, 0x52, 0x14, 0xa6, - 0x0a, 0x93, 0x30, 0x82, 0x03, 0x38, 0x30, 0x82, 0x02, 0x20, 0xa0, - 0x03, 0x02, 0x01, 0x02, 0x02, 0x06, 0x20, 0x06, 0x05, 0x16, 0x70, - 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x3b, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x52, 0x4f, 0x31, 0x11, - 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x63, 0x65, - 0x72, 0x74, 0x53, 0x49, 0x47, 0x4e, 0x31, 0x19, 0x30, 0x17, 0x06, - 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x63, 0x65, 0x72, 0x74, 0x53, - 0x49, 0x47, 0x4e, 0x20, 0x52, 0x4f, 0x4f, 0x54, 0x20, 0x43, 0x41, - 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x30, 0x37, 0x30, 0x34, 0x31, - 0x37, 0x32, 0x30, 0x30, 0x34, 0x5a, 0x17, 0x0d, 0x33, 0x31, 0x30, - 0x37, 0x30, 0x34, 0x31, 0x37, 0x32, 0x30, 0x30, 0x34, 0x5a, 0x30, - 0x3b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, - 0x02, 0x52, 0x4f, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x08, 0x63, 0x65, 0x72, 0x74, 0x53, 0x49, 0x47, 0x4e, - 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, - 0x63, 0x65, 0x72, 0x74, 0x53, 0x49, 0x47, 0x4e, 0x20, 0x52, 0x4f, - 0x4f, 0x54, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, - 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, - 0x02, 0x82, 0x01, 0x01, 0x00, 0xb7, 0x33, 0xb9, 0x7e, 0xc8, 0x25, - 0x4a, 0x8e, 0xb5, 0xdb, 0xb4, 0x28, 0x1b, 0xaa, 0x57, 0x90, 0xe8, - 0xd1, 0x22, 0xd3, 0x64, 0xba, 0xd3, 0x93, 0xe8, 0xd4, 0xac, 0x86, - 0x61, 0x40, 0x6a, 0x60, 0x57, 0x68, 0x54, 0x84, 0x4d, 0xbc, 0x6a, - 0x54, 0x02, 0x05, 0xff, 0xdf, 0x9b, 0x9a, 0x2a, 0xae, 0x5d, 0x07, - 0x8f, 0x4a, 0xc3, 0x28, 0x7f, 0xef, 0xfb, 0x2b, 0xfa, 0x79, 0xf1, - 0xc7, 0xad, 0xf0, 0x10, 0x53, 0x24, 0x90, 0x8b, 0x66, 0xc9, 0xa8, - 0x88, 0xab, 0xaf, 0x5a, 0xa3, 0x00, 0xe9, 0xbe, 0xba, 0x46, 0xee, - 0x5b, 0x73, 0x7b, 0x2c, 0x17, 0x82, 0x81, 0x5e, 0x62, 0x2c, 0xa1, - 0x02, 0x65, 0xb3, 0xbd, 0xc5, 0x2b, 0x00, 0x7e, 0xc4, 0xfc, 0x03, - 0x33, 0x57, 0x0d, 0xed, 0xe2, 0xfa, 0xce, 0x5d, 0x45, 0xd6, 0x38, - 0xcd, 0x35, 0xb6, 0xb2, 0xc1, 0xd0, 0x9c, 0x81, 0x4a, 0xaa, 0xe4, - 0xb2, 0x01, 0x5c, 0x1d, 0x8f, 0x5f, 0x99, 0xc4, 0xb1, 0xad, 0xdb, - 0x88, 0x21, 0xeb, 0x90, 0x08, 0x82, 0x80, 0xf3, 0x30, 0xa3, 0x43, - 0xe6, 0x90, 0x82, 0xae, 0x55, 0x28, 0x49, 0xed, 0x5b, 0xd7, 0xa9, - 0x10, 0x38, 0x0e, 0xfe, 0x8f, 0x4c, 0x5b, 0x9b, 0x46, 0xea, 0x41, - 0xf5, 0xb0, 0x08, 0x74, 0xc3, 0xd0, 0x88, 0x33, 0xb6, 0x7c, 0xd7, - 0x74, 0xdf, 0xdc, 0x84, 0xd1, 0x43, 0x0e, 0x75, 0x39, 0xa1, 0x25, - 0x40, 0x28, 0xea, 0x78, 0xcb, 0x0e, 0x2c, 0x2e, 0x39, 0x9d, 0x8c, - 0x8b, 0x6e, 0x16, 0x1c, 0x2f, 0x26, 0x82, 0x10, 0xe2, 0xe3, 0x65, - 0x94, 0x0a, 0x04, 0xc0, 0x5e, 0xf7, 0x5d, 0x5b, 0xf8, 0x10, 0xe2, - 0xd0, 0xba, 0x7a, 0x4b, 0xfb, 0xde, 0x37, 0x00, 0x00, 0x1a, 0x5b, - 0x28, 0xe3, 0xd2, 0x9c, 0x73, 0x3e, 0x32, 0x87, 0x98, 0xa1, 0xc9, - 0x51, 0x2f, 0xd7, 0xde, 0xac, 0x33, 0xb3, 0x4f, 0x02, 0x03, 0x01, - 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, - 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, - 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, - 0x04, 0x04, 0x03, 0x02, 0x01, 0xc6, 0x30, 0x1d, 0x06, 0x03, 0x55, - 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xe0, 0x8c, 0x9b, 0xdb, 0x25, - 0x49, 0xb3, 0xf1, 0x7c, 0x86, 0xd6, 0xb2, 0x42, 0x87, 0x0b, 0xd0, - 0x6b, 0xa0, 0xd9, 0xe4, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, - 0x01, 0x00, 0x3e, 0xd2, 0x1c, 0x89, 0x2e, 0x35, 0xfc, 0xf8, 0x75, - 0xdd, 0xe6, 0x7f, 0x65, 0x88, 0xf4, 0x72, 0x4c, 0xc9, 0x2c, 0xd7, - 0x32, 0x4e, 0xf3, 0xdd, 0x19, 0x79, 0x47, 0xbd, 0x8e, 0x3b, 0x5b, - 0x93, 0x0f, 0x50, 0x49, 0x24, 0x13, 0x6b, 0x14, 0x06, 0x72, 0xef, - 0x09, 0xd3, 0xa1, 0xa1, 0xe3, 0x40, 0x84, 0xc9, 0xe7, 0x18, 0x32, - 0x74, 0x3c, 0x48, 0x6e, 0x0f, 0x9f, 0x4b, 0xd4, 0xf7, 0x1e, 0xd3, - 0x93, 0x86, 0x64, 0x54, 0x97, 0x63, 0x72, 0x50, 0xd5, 0x55, 0xcf, - 0xfa, 0x20, 0x93, 0x02, 0xa2, 0x9b, 0xc3, 0x23, 0x93, 0x4e, 0x16, - 0x55, 0x76, 0xa0, 0x70, 0x79, 0x6d, 0xcd, 0x21, 0x1f, 0xcf, 0x2f, - 0x2d, 0xbc, 0x19, 0xe3, 0x88, 0x31, 0xf8, 0x59, 0x1a, 0x81, 0x09, - 0xc8, 0x97, 0xa6, 0x74, 0xc7, 0x60, 0xc4, 0x5b, 0xcc, 0x57, 0x8e, - 0xb2, 0x75, 0xfd, 0x1b, 0x02, 0x09, 0xdb, 0x59, 0x6f, 0x72, 0x93, - 0x69, 0xf7, 0x31, 0x41, 0xd6, 0x88, 0x38, 0xbf, 0x87, 0xb2, 0xbd, - 0x16, 0x79, 0xf9, 0xaa, 0xe4, 0xbe, 0x88, 0x25, 0xdd, 0x61, 0x27, - 0x23, 0x1c, 0xb5, 0x31, 0x07, 0x04, 0x36, 0xb4, 0x1a, 0x90, 0xbd, - 0xa0, 0x74, 0x71, 0x50, 0x89, 0x6d, 0xbc, 0x14, 0xe3, 0x0f, 0x86, - 0xae, 0xf1, 0xab, 0x3e, 0xc7, 0xa0, 0x09, 0xcc, 0xa3, 0x48, 0xd1, - 0xe0, 0xdb, 0x64, 0xe7, 0x92, 0xb5, 0xcf, 0xaf, 0x72, 0x43, 0x70, - 0x8b, 0xf9, 0xc3, 0x84, 0x3c, 0x13, 0xaa, 0x7e, 0x92, 0x9b, 0x57, - 0x53, 0x93, 0xfa, 0x70, 0xc2, 0x91, 0x0e, 0x31, 0xf9, 0x9b, 0x67, - 0x5d, 0xe9, 0x96, 0x38, 0x5e, 0x5f, 0xb3, 0x73, 0x4e, 0x88, 0x15, - 0x67, 0xde, 0x9e, 0x76, 0x10, 0x62, 0x20, 0xbe, 0x55, 0x69, 0x95, - 0x43, 0x00, 0x39, 0x4d, 0xf6, 0xee, 0xb0, 0x5a, 0x4e, 0x49, 0x44, - 0x54, 0x58, 0x5f, 0x42, 0x83, 0x30, 0x82, 0x03, 0x55, 0x30, 0x82, - 0x02, 0x3d, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04, 0x49, 0x33, - 0x00, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x32, 0x31, 0x0b, 0x30, + 0x32, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x43, 0x4e, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x13, 0x05, 0x43, 0x4e, 0x4e, 0x49, 0x43, 0x31, 0x13, 0x30, + 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0a, 0x43, 0x4e, 0x4e, + 0x49, 0x43, 0x20, 0x52, 0x4f, 0x4f, 0x54, 0x30, 0x1e, 0x17, 0x0d, + 0x30, 0x37, 0x30, 0x34, 0x31, 0x36, 0x30, 0x37, 0x30, 0x39, 0x31, + 0x34, 0x5a, 0x17, 0x0d, 0x32, 0x37, 0x30, 0x34, 0x31, 0x36, 0x30, + 0x37, 0x30, 0x39, 0x31, 0x34, 0x5a, 0x30, 0x32, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x43, 0x4e, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x05, 0x43, 0x4e, 0x4e, 0x49, 0x43, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0a, 0x43, 0x4e, 0x4e, 0x49, 0x43, 0x20, 0x52, - 0x4f, 0x4f, 0x54, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x37, 0x30, 0x34, - 0x31, 0x36, 0x30, 0x37, 0x30, 0x39, 0x31, 0x34, 0x5a, 0x17, 0x0d, - 0x32, 0x37, 0x30, 0x34, 0x31, 0x36, 0x30, 0x37, 0x30, 0x39, 0x31, - 0x34, 0x5a, 0x30, 0x32, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x43, 0x4e, 0x31, 0x0e, 0x30, 0x0c, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x13, 0x05, 0x43, 0x4e, 0x4e, 0x49, 0x43, - 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0a, - 0x43, 0x4e, 0x4e, 0x49, 0x43, 0x20, 0x52, 0x4f, 0x4f, 0x54, 0x30, - 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, - 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xd3, - 0x35, 0xf7, 0x3f, 0x73, 0x77, 0xad, 0xe8, 0x5b, 0x73, 0x17, 0xc2, - 0xd1, 0x6f, 0xed, 0x55, 0xbc, 0x6e, 0xea, 0xe8, 0xa4, 0x79, 0xb2, - 0x6c, 0xc3, 0xa3, 0xef, 0xe1, 0x9f, 0xb1, 0x3b, 0x48, 0x85, 0xf5, - 0x9a, 0x5c, 0x21, 0x22, 0x10, 0x2c, 0xc5, 0x82, 0xce, 0xda, 0xe3, - 0x9a, 0x6e, 0x37, 0xe1, 0x87, 0x2c, 0xdc, 0xb9, 0x0c, 0x5a, 0xba, - 0x88, 0x55, 0xdf, 0xfd, 0xaa, 0xdb, 0x1f, 0x31, 0xea, 0x01, 0xf1, - 0xdf, 0x39, 0x01, 0xc1, 0x13, 0xfd, 0x48, 0x52, 0x21, 0xc4, 0x55, - 0xdf, 0xda, 0xd8, 0xb3, 0x54, 0x76, 0xba, 0x74, 0xb1, 0xb7, 0x7d, - 0xd7, 0xc0, 0xe8, 0xf6, 0x59, 0xc5, 0x4d, 0xc8, 0xbd, 0xad, 0x1f, - 0x14, 0xda, 0xdf, 0x58, 0x44, 0x25, 0x32, 0x19, 0x2a, 0xc7, 0x7e, - 0x7e, 0x8e, 0xae, 0x38, 0xb0, 0x30, 0x7b, 0x47, 0x72, 0x09, 0x31, - 0xf0, 0x30, 0xdb, 0xc3, 0x1b, 0x76, 0x29, 0xbb, 0x69, 0x76, 0x4e, - 0x57, 0xf9, 0x1b, 0x64, 0xa2, 0x93, 0x56, 0xb7, 0x6f, 0x99, 0x6e, - 0xdb, 0x0a, 0x04, 0x9c, 0x11, 0xe3, 0x80, 0x1f, 0xcb, 0x63, 0x94, - 0x10, 0x0a, 0xa9, 0xe1, 0x64, 0x82, 0x31, 0xf9, 0x8c, 0x27, 0xed, - 0xa6, 0x99, 0x00, 0xf6, 0x70, 0x93, 0x18, 0xf8, 0xa1, 0x34, 0x86, - 0xa3, 0xdd, 0x7a, 0xc2, 0x18, 0x79, 0xf6, 0x7a, 0x65, 0x35, 0xcf, - 0x90, 0xeb, 0xbd, 0x33, 0x93, 0x9f, 0x53, 0xab, 0x73, 0x3b, 0xe6, - 0x9b, 0x34, 0x20, 0x2f, 0x1d, 0xef, 0xa9, 0x1d, 0x63, 0x1a, 0xa0, - 0x80, 0xdb, 0x03, 0x2f, 0xf9, 0x26, 0x1a, 0x86, 0xd2, 0x8d, 0xbb, - 0xa9, 0xbe, 0x52, 0x3a, 0x87, 0x67, 0x48, 0x0d, 0xbf, 0xb4, 0xa0, - 0xd8, 0x26, 0xbe, 0x23, 0x5f, 0x73, 0x37, 0x7f, 0x26, 0xe6, 0x92, - 0x04, 0xa3, 0x7f, 0xcf, 0x20, 0xa7, 0xb7, 0xf3, 0x3a, 0xca, 0xcb, - 0x99, 0xcb, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x73, 0x30, 0x71, - 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, - 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, 0x00, 0x07, 0x30, 0x1f, 0x06, - 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x65, - 0xf2, 0x31, 0xad, 0x2a, 0xf7, 0xf7, 0xdd, 0x52, 0x96, 0x0a, 0xc7, - 0x02, 0xc1, 0x0e, 0xef, 0xa6, 0xd5, 0x3b, 0x11, 0x30, 0x0f, 0x06, - 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, - 0x01, 0x01, 0xff, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, - 0x04, 0x03, 0x02, 0x01, 0xfe, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, - 0x0e, 0x04, 0x16, 0x04, 0x14, 0x65, 0xf2, 0x31, 0xad, 0x2a, 0xf7, - 0xf7, 0xdd, 0x52, 0x96, 0x0a, 0xc7, 0x02, 0xc1, 0x0e, 0xef, 0xa6, - 0xd5, 0x3b, 0x11, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, - 0x00, 0x4b, 0x35, 0xee, 0xcc, 0xe4, 0xae, 0xbf, 0xc3, 0x6e, 0xad, - 0x9f, 0x95, 0x3b, 0x4b, 0x3f, 0x5b, 0x1e, 0xdf, 0x57, 0x29, 0xa2, - 0x59, 0xca, 0x38, 0xe2, 0xb9, 0x1a, 0xff, 0x9e, 0xe6, 0x6e, 0x32, - 0xdd, 0x1e, 0xae, 0xea, 0x35, 0xb7, 0xf5, 0x93, 0x91, 0x4e, 0xda, - 0x42, 0xe1, 0xc3, 0x17, 0x60, 0x50, 0xf2, 0xd1, 0x5c, 0x26, 0xb9, - 0x82, 0xb7, 0xea, 0x6d, 0xe4, 0x9c, 0x84, 0xe7, 0x03, 0x79, 0x17, - 0xaf, 0x98, 0x3d, 0x94, 0xdb, 0xc7, 0xba, 0x00, 0xe7, 0xb8, 0xbf, - 0x01, 0x57, 0xc1, 0x77, 0x45, 0x32, 0x0c, 0x3b, 0xf1, 0xb4, 0x1c, - 0x08, 0xb0, 0xfd, 0x51, 0xa0, 0xa1, 0xdd, 0x9a, 0x1d, 0x13, 0x36, - 0x9a, 0x6d, 0xb7, 0xc7, 0x3c, 0xb9, 0xe1, 0xc5, 0xd9, 0x17, 0xfa, - 0x83, 0xd5, 0x3d, 0x15, 0xa0, 0x3c, 0xbb, 0x1e, 0x0b, 0xe2, 0xc8, - 0x90, 0x3f, 0xa8, 0x86, 0x0c, 0xfc, 0xf9, 0x8b, 0x5e, 0x85, 0xcb, - 0x4f, 0x5b, 0x4b, 0x62, 0x11, 0x47, 0xc5, 0x45, 0x7c, 0x05, 0x2f, - 0x41, 0xb1, 0x9e, 0x10, 0x69, 0x1b, 0x99, 0x96, 0xe0, 0x55, 0x79, - 0xfb, 0x4e, 0x86, 0x99, 0xb8, 0x94, 0xda, 0x86, 0x38, 0x6a, 0x93, - 0xa3, 0xe7, 0xcb, 0x6e, 0xe5, 0xdf, 0xea, 0x21, 0x55, 0x89, 0x9c, - 0x7d, 0x7d, 0x7f, 0x98, 0xf5, 0x00, 0x89, 0xee, 0xe3, 0x84, 0xc0, - 0x5c, 0x96, 0xb5, 0xc5, 0x46, 0xea, 0x46, 0xe0, 0x85, 0x55, 0xb6, - 0x1b, 0xc9, 0x12, 0xd6, 0xc1, 0xcd, 0xcd, 0x80, 0xf3, 0x02, 0x01, - 0x3c, 0xc8, 0x69, 0xcb, 0x45, 0x48, 0x63, 0xd8, 0x94, 0xd0, 0xec, - 0x85, 0x0e, 0x3b, 0x4e, 0x11, 0x65, 0xf4, 0x82, 0x8c, 0xa6, 0x3d, - 0xae, 0x2e, 0x22, 0x94, 0x09, 0xc8, 0x5c, 0xea, 0x3c, 0x81, 0x5d, - 0x16, 0x2a, 0x03, 0x97, 0x16, 0x55, 0x09, 0xdb, 0x8a, 0x41, 0x82, - 0x9e, 0x66, 0x9b, 0x11, 0x30, 0x82, 0x03, 0xa0, 0x30, 0x82, 0x02, - 0x88, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x31, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, - 0x05, 0x00, 0x30, 0x43, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, 0x1c, 0x30, 0x1a, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x13, 0x13, 0x4a, 0x61, 0x70, 0x61, 0x6e, - 0x65, 0x73, 0x65, 0x20, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, - 0x0b, 0x13, 0x0d, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x37, - 0x31, 0x32, 0x31, 0x32, 0x31, 0x35, 0x30, 0x30, 0x30, 0x30, 0x5a, - 0x17, 0x0d, 0x31, 0x37, 0x31, 0x32, 0x31, 0x32, 0x31, 0x35, 0x30, - 0x30, 0x30, 0x30, 0x5a, 0x30, 0x43, 0x31, 0x0b, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, 0x1c, 0x30, - 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x13, 0x4a, 0x61, 0x70, - 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x47, 0x6f, 0x76, 0x65, 0x72, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, - 0x55, 0x04, 0x0b, 0x13, 0x0d, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, - 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa7, 0x6d, 0xe0, 0x74, - 0x4e, 0x87, 0x8f, 0xa5, 0x06, 0xde, 0x68, 0xa2, 0xdb, 0x86, 0x99, - 0x4b, 0x64, 0x0d, 0x71, 0xf0, 0x0a, 0x05, 0x9b, 0x8e, 0xaa, 0xe1, - 0xcc, 0x2e, 0xd2, 0x6a, 0x3b, 0xc1, 0x7a, 0xb4, 0x97, 0x61, 0x8d, - 0x8a, 0xbe, 0xc6, 0x9a, 0x9c, 0x06, 0xb4, 0x86, 0x51, 0xe4, 0x37, - 0x0e, 0x74, 0x78, 0x7e, 0x5f, 0x8a, 0x7f, 0x94, 0xa4, 0xd7, 0x47, - 0x08, 0xfd, 0x50, 0x5a, 0x56, 0xe4, 0x68, 0xac, 0x28, 0x73, 0xa0, - 0x7b, 0xe9, 0x7f, 0x18, 0x92, 0x40, 0x4f, 0x2d, 0x9d, 0xf5, 0xae, - 0x44, 0x48, 0x73, 0x36, 0x06, 0x9e, 0x64, 0x2c, 0x3b, 0x34, 0x23, - 0xdb, 0x5c, 0x26, 0xe4, 0x71, 0x79, 0x8f, 0xd4, 0x6e, 0x79, 0x22, - 0xb9, 0x93, 0xc1, 0xca, 0xcd, 0xc1, 0x56, 0xed, 0x88, 0x6a, 0xd7, - 0xa0, 0x39, 0x21, 0x04, 0x57, 0x2c, 0xa2, 0xf5, 0xbc, 0x47, 0x41, - 0x4f, 0x5e, 0x34, 0x22, 0x95, 0xb5, 0x1f, 0x29, 0x6d, 0x5e, 0x4a, - 0xf3, 0x4d, 0x72, 0xbe, 0x41, 0x56, 0x20, 0x87, 0xfc, 0xe9, 0x50, - 0x47, 0xd7, 0x30, 0x14, 0xee, 0x5c, 0x8c, 0x55, 0xba, 0x59, 0x8d, - 0x87, 0xfc, 0x23, 0xde, 0x93, 0xd0, 0x04, 0x8c, 0xfd, 0xef, 0x6d, - 0xbd, 0xd0, 0x7a, 0xc9, 0xa5, 0x3a, 0x6a, 0x72, 0x33, 0xc6, 0x4a, - 0x0d, 0x05, 0x17, 0x2a, 0x2d, 0x7b, 0xb1, 0xa7, 0xd8, 0xd6, 0xf0, - 0xbe, 0xf4, 0x3f, 0xea, 0x0e, 0x28, 0x6d, 0x41, 0x61, 0x23, 0x76, - 0x78, 0xc3, 0xb8, 0x65, 0xa4, 0xf3, 0x5a, 0xae, 0xcc, 0xc2, 0xaa, - 0xd9, 0xe7, 0x58, 0xde, 0xb6, 0x7e, 0x9d, 0x85, 0x6e, 0x9f, 0x2a, - 0x0a, 0x6f, 0x9f, 0x03, 0x29, 0x30, 0x97, 0x28, 0x1d, 0xbc, 0xb7, - 0xcf, 0x54, 0x29, 0x4e, 0x51, 0x31, 0xf9, 0x27, 0xb6, 0x28, 0x26, - 0xfe, 0xa2, 0x63, 0xe6, 0x41, 0x16, 0xf0, 0x33, 0x98, 0x47, 0x02, - 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x9e, 0x30, 0x81, 0x9b, 0x30, - 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x54, - 0x5a, 0xcb, 0x26, 0x3f, 0x71, 0xcc, 0x94, 0x46, 0x0d, 0x96, 0x53, - 0xea, 0x6b, 0x48, 0xd0, 0x93, 0xfe, 0x42, 0x75, 0x30, 0x0e, 0x06, - 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, - 0x01, 0x06, 0x30, 0x59, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x52, - 0x30, 0x50, 0xa4, 0x4e, 0x30, 0x4c, 0x31, 0x0b, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, 0x18, 0x30, - 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0xe6, 0x97, 0xa5, - 0xe6, 0x9c, 0xac, 0xe5, 0x9b, 0xbd, 0xe6, 0x94, 0xbf, 0xe5, 0xba, - 0x9c, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, - 0x1a, 0xe3, 0x82, 0xa2, 0xe3, 0x83, 0x97, 0xe3, 0x83, 0xaa, 0xe3, - 0x82, 0xb1, 0xe3, 0x83, 0xbc, 0xe3, 0x82, 0xb7, 0xe3, 0x83, 0xa7, - 0xe3, 0x83, 0xb3, 0x43, 0x41, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, - 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x39, 0x6a, - 0x44, 0x76, 0x77, 0x38, 0x3a, 0xec, 0xa3, 0x67, 0x46, 0x0f, 0xf9, - 0x8b, 0x06, 0xa8, 0xfb, 0x6a, 0x90, 0x31, 0xce, 0x7e, 0xec, 0xda, - 0xd1, 0x89, 0x7c, 0x7a, 0xeb, 0x2e, 0x0c, 0xbd, 0x99, 0x32, 0xe7, - 0xb0, 0x24, 0xd6, 0xc3, 0xff, 0xf5, 0xb2, 0x88, 0x09, 0x87, 0x2c, - 0xe3, 0x54, 0xe1, 0xa3, 0xa6, 0xb2, 0x08, 0x0b, 0xc0, 0x85, 0xa8, - 0xc8, 0xd2, 0x9c, 0x71, 0xf6, 0x1d, 0x9f, 0x60, 0xfc, 0x38, 0x33, - 0x13, 0xe1, 0x9e, 0xdc, 0x0b, 0x5f, 0xda, 0x16, 0x50, 0x29, 0x7b, - 0x2f, 0x70, 0x91, 0x0f, 0x99, 0xba, 0x34, 0x34, 0x8d, 0x95, 0x74, - 0xc5, 0x7e, 0x78, 0xa9, 0x66, 0x5d, 0xbd, 0xca, 0x21, 0x77, 0x42, - 0x10, 0xac, 0x66, 0x26, 0x3d, 0xde, 0x91, 0xab, 0xfd, 0x15, 0xf0, - 0x6f, 0xed, 0x6c, 0x5f, 0x10, 0xf8, 0xf3, 0x16, 0xf6, 0x03, 0x8a, - 0x8f, 0xa7, 0x12, 0x11, 0x0c, 0xcb, 0xfd, 0x3f, 0x79, 0xc1, 0x9c, - 0xfd, 0x62, 0xee, 0xa3, 0xcf, 0x54, 0x0c, 0xd1, 0x2b, 0x5f, 0x17, - 0x3e, 0xe3, 0x3e, 0xbf, 0xc0, 0x2b, 0x3e, 0x09, 0x9b, 0xfe, 0x88, - 0xa6, 0x7e, 0xb4, 0x92, 0x17, 0xfc, 0x23, 0x94, 0x81, 0xbd, 0x6e, - 0xa7, 0xc5, 0x8c, 0xc2, 0xeb, 0x11, 0x45, 0xdb, 0xf8, 0x41, 0xc9, - 0x96, 0x76, 0xea, 0x70, 0x5f, 0x79, 0x12, 0x6b, 0xe4, 0xa3, 0x07, - 0x5a, 0x05, 0xef, 0x27, 0x49, 0xcf, 0x21, 0x9f, 0x8a, 0x4c, 0x09, - 0x70, 0x66, 0xa9, 0x26, 0xc1, 0x2b, 0x11, 0x4e, 0x33, 0xd2, 0x0e, - 0xfc, 0xd6, 0x6c, 0xd2, 0x0e, 0x32, 0x64, 0x68, 0xff, 0xad, 0x05, - 0x78, 0x5f, 0x03, 0x1d, 0xa8, 0xe3, 0x90, 0xac, 0x24, 0xe0, 0x0f, - 0x40, 0xa7, 0x4b, 0xae, 0x8b, 0x28, 0xb7, 0x82, 0xca, 0x18, 0x07, - 0xe6, 0xb7, 0x5b, 0x74, 0xe9, 0x20, 0x19, 0x7f, 0xb2, 0x1b, 0x89, - 0x54, 0x30, 0x82, 0x03, 0xfe, 0x30, 0x82, 0x02, 0xe6, 0xa0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x10, 0x15, 0xac, 0x6e, 0x94, 0x19, 0xb2, - 0x79, 0x4b, 0x41, 0xf6, 0x27, 0xa9, 0xc3, 0x18, 0x0f, 0x1f, 0x30, - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x0b, 0x05, 0x00, 0x30, 0x81, 0x98, 0x31, 0x0b, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, - 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x47, 0x65, 0x6f, - 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, - 0x39, 0x30, 0x37, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x30, 0x28, - 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x38, 0x20, 0x47, 0x65, 0x6f, - 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, - 0x2d, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, - 0x6e, 0x6c, 0x79, 0x31, 0x36, 0x30, 0x34, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x13, 0x2d, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, - 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, - 0x2d, 0x20, 0x47, 0x33, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x30, - 0x34, 0x30, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, - 0x0d, 0x33, 0x37, 0x31, 0x32, 0x30, 0x31, 0x32, 0x33, 0x35, 0x39, - 0x35, 0x39, 0x5a, 0x30, 0x81, 0x98, 0x31, 0x0b, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, - 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x47, 0x65, 0x6f, - 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, - 0x39, 0x30, 0x37, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x30, 0x28, - 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x38, 0x20, 0x47, 0x65, 0x6f, - 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, - 0x2d, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, - 0x6e, 0x6c, 0x79, 0x31, 0x36, 0x30, 0x34, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x13, 0x2d, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, - 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, - 0x2d, 0x20, 0x47, 0x33, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, - 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, - 0x82, 0x01, 0x01, 0x00, 0xdc, 0xe2, 0x5e, 0x62, 0x58, 0x1d, 0x33, - 0x57, 0x39, 0x32, 0x33, 0xfa, 0xeb, 0xcb, 0x87, 0x8c, 0xa7, 0xd4, - 0x4a, 0xdd, 0x06, 0x88, 0xea, 0x64, 0x8e, 0x31, 0x98, 0xa5, 0x38, - 0x90, 0x1e, 0x98, 0xcf, 0x2e, 0x63, 0x2b, 0xf0, 0x46, 0xbc, 0x44, - 0xb2, 0x89, 0xa1, 0xc0, 0x28, 0x0c, 0x49, 0x70, 0x21, 0x95, 0x9f, - 0x64, 0xc0, 0xa6, 0x93, 0x12, 0x02, 0x65, 0x26, 0x86, 0xc6, 0xa5, - 0x89, 0xf0, 0xfa, 0xd7, 0x84, 0xa0, 0x70, 0xaf, 0x4f, 0x1a, 0x97, - 0x3f, 0x06, 0x44, 0xd5, 0xc9, 0xeb, 0x72, 0x10, 0x7d, 0xe4, 0x31, - 0x28, 0xfb, 0x1c, 0x61, 0xe6, 0x28, 0x07, 0x44, 0x73, 0x92, 0x22, - 0x69, 0xa7, 0x03, 0x88, 0x6c, 0x9d, 0x63, 0xc8, 0x52, 0xda, 0x98, - 0x27, 0xe7, 0x08, 0x4c, 0x70, 0x3e, 0xb4, 0xc9, 0x12, 0xc1, 0xc5, - 0x67, 0x83, 0x5d, 0x33, 0xf3, 0x03, 0x11, 0xec, 0x6a, 0xd0, 0x53, - 0xe2, 0xd1, 0xba, 0x36, 0x60, 0x94, 0x80, 0xbb, 0x61, 0x63, 0x6c, - 0x5b, 0x17, 0x7e, 0xdf, 0x40, 0x94, 0x1e, 0xab, 0x0d, 0xc2, 0x21, - 0x28, 0x70, 0x88, 0xff, 0xd6, 0x26, 0x6c, 0x6c, 0x60, 0x04, 0x25, - 0x4e, 0x55, 0x7e, 0x7d, 0xef, 0xbf, 0x94, 0x48, 0xde, 0xb7, 0x1d, - 0xdd, 0x70, 0x8d, 0x05, 0x5f, 0x88, 0xa5, 0x9b, 0xf2, 0xc2, 0xee, - 0xea, 0xd1, 0x40, 0x41, 0x6d, 0x62, 0x38, 0x1d, 0x56, 0x06, 0xc5, - 0x03, 0x47, 0x51, 0x20, 0x19, 0xfc, 0x7b, 0x10, 0x0b, 0x0e, 0x62, - 0xae, 0x76, 0x55, 0xbf, 0x5f, 0x77, 0xbe, 0x3e, 0x49, 0x01, 0x53, - 0x3d, 0x98, 0x25, 0x03, 0x76, 0x24, 0x5a, 0x1d, 0xb4, 0xdb, 0x89, - 0xea, 0x79, 0xe5, 0xb6, 0xb3, 0x3b, 0x3f, 0xba, 0x4c, 0x28, 0x41, - 0x7f, 0x06, 0xac, 0x6a, 0x8e, 0xc1, 0xd0, 0xf6, 0x05, 0x1d, 0x7d, - 0xe6, 0x42, 0x86, 0xe3, 0xa5, 0xd5, 0x47, 0x02, 0x03, 0x01, 0x00, - 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, - 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, - 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, - 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, - 0x0e, 0x04, 0x16, 0x04, 0x14, 0xc4, 0x79, 0xca, 0x8e, 0xa1, 0x4e, - 0x03, 0x1d, 0x1c, 0xdc, 0x6b, 0xdb, 0x31, 0x5b, 0x94, 0x3e, 0x3f, - 0x30, 0x7f, 0x2d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, - 0x00, 0x2d, 0xc5, 0x13, 0xcf, 0x56, 0x80, 0x7b, 0x7a, 0x78, 0xbd, - 0x9f, 0xae, 0x2c, 0x99, 0xe7, 0xef, 0xda, 0xdf, 0x94, 0x5e, 0x09, - 0x69, 0xa7, 0xe7, 0x6e, 0x68, 0x8c, 0xbd, 0x72, 0xbe, 0x47, 0xa9, - 0x0e, 0x97, 0x12, 0xb8, 0x4a, 0xf1, 0x64, 0xd3, 0x39, 0xdf, 0x25, - 0x34, 0xd4, 0xc1, 0xcd, 0x4e, 0x81, 0xf0, 0x0f, 0x04, 0xc4, 0x24, - 0xb3, 0x34, 0x96, 0xc6, 0xa6, 0xaa, 0x30, 0xdf, 0x68, 0x61, 0x73, - 0xd7, 0xf9, 0x8e, 0x85, 0x89, 0xef, 0x0e, 0x5e, 0x95, 0x28, 0x4a, - 0x2a, 0x27, 0x8f, 0x10, 0x8e, 0x2e, 0x7c, 0x86, 0xc4, 0x02, 0x9e, - 0xda, 0x0c, 0x77, 0x65, 0x0e, 0x44, 0x0d, 0x92, 0xfd, 0xfd, 0xb3, - 0x16, 0x36, 0xfa, 0x11, 0x0d, 0x1d, 0x8c, 0x0e, 0x07, 0x89, 0x6a, - 0x29, 0x56, 0xf7, 0x72, 0xf4, 0xdd, 0x15, 0x9c, 0x77, 0x35, 0x66, - 0x57, 0xab, 0x13, 0x53, 0xd8, 0x8e, 0xc1, 0x40, 0xc5, 0xd7, 0x13, - 0x16, 0x5a, 0x72, 0xc7, 0xb7, 0x69, 0x01, 0xc4, 0x7a, 0xb1, 0x83, - 0x01, 0x68, 0x7d, 0x8d, 0x41, 0xa1, 0x94, 0x18, 0xc1, 0x25, 0x5c, - 0xfc, 0xf0, 0xfe, 0x83, 0x02, 0x87, 0x7c, 0x0d, 0x0d, 0xcf, 0x2e, - 0x08, 0x5c, 0x4a, 0x40, 0x0d, 0x3e, 0xec, 0x81, 0x61, 0xe6, 0x24, - 0xdb, 0xca, 0xe0, 0x0e, 0x2d, 0x07, 0xb2, 0x3e, 0x56, 0xdc, 0x8d, - 0xf5, 0x41, 0x85, 0x07, 0x48, 0x9b, 0x0c, 0x0b, 0xcb, 0x49, 0x3f, - 0x7d, 0xec, 0xb7, 0xfd, 0xcb, 0x8d, 0x67, 0x89, 0x1a, 0xab, 0xed, - 0xbb, 0x1e, 0xa3, 0x00, 0x08, 0x08, 0x17, 0x2a, 0x82, 0x5c, 0x31, - 0x5d, 0x46, 0x8a, 0x2d, 0x0f, 0x86, 0x9b, 0x74, 0xd9, 0x45, 0xfb, - 0xd4, 0x40, 0xb1, 0x7a, 0xaa, 0x68, 0x2d, 0x86, 0xb2, 0x99, 0x22, - 0xe1, 0xc1, 0x2b, 0xc7, 0x9c, 0xf8, 0xf3, 0x5f, 0xa8, 0x82, 0x12, - 0xeb, 0x19, 0x11, 0x2d, 0x30, 0x82, 0x02, 0x88, 0x30, 0x82, 0x02, - 0x0d, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x35, 0xfc, 0x26, - 0x5c, 0xd9, 0x84, 0x4f, 0xc9, 0x3d, 0x26, 0x3d, 0x57, 0x9b, 0xae, - 0xd7, 0x56, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, - 0x04, 0x03, 0x03, 0x30, 0x81, 0x84, 0x31, 0x0b, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, - 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x74, 0x68, 0x61, - 0x77, 0x74, 0x65, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x38, - 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2f, 0x28, 0x63, - 0x29, 0x20, 0x32, 0x30, 0x30, 0x37, 0x20, 0x74, 0x68, 0x61, 0x77, - 0x74, 0x65, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x2d, 0x20, - 0x46, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x7a, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x6c, - 0x79, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, - 0x1b, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65, 0x20, 0x50, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, - 0x41, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x30, - 0x37, 0x31, 0x31, 0x30, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x31, 0x31, 0x38, 0x32, 0x33, - 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0x84, 0x31, 0x0b, 0x30, - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, - 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x74, - 0x68, 0x61, 0x77, 0x74, 0x65, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, - 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2f, - 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x37, 0x20, 0x74, 0x68, - 0x61, 0x77, 0x74, 0x65, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, - 0x2d, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, - 0x6e, 0x6c, 0x79, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x13, 0x1b, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65, 0x20, 0x50, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x52, 0x6f, 0x6f, 0x74, - 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x76, 0x30, - 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, - 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0xa2, - 0xd5, 0x9c, 0x82, 0x7b, 0x95, 0x9d, 0xf1, 0x52, 0x78, 0x87, 0xfe, - 0x8a, 0x16, 0xbf, 0x05, 0xe6, 0xdf, 0xa3, 0x02, 0x4f, 0x0d, 0x07, - 0xc6, 0x00, 0x51, 0xba, 0x0c, 0x02, 0x52, 0x2d, 0x22, 0xa4, 0x42, - 0x39, 0xc4, 0xfe, 0x8f, 0xea, 0xc9, 0xc1, 0xbe, 0xd4, 0x4d, 0xff, - 0x9f, 0x7a, 0x9e, 0xe2, 0xb1, 0x7c, 0x9a, 0xad, 0xa7, 0x86, 0x09, - 0x73, 0x87, 0xd1, 0xe7, 0x9a, 0xe3, 0x7a, 0xa5, 0xaa, 0x6e, 0xfb, - 0xba, 0xb3, 0x70, 0xc0, 0x67, 0x88, 0xa2, 0x35, 0xd4, 0xa3, 0x9a, - 0xb1, 0xfd, 0xad, 0xc2, 0xef, 0x31, 0xfa, 0xa8, 0xb9, 0xf3, 0xfb, - 0x08, 0xc6, 0x91, 0xd1, 0xfb, 0x29, 0x95, 0xa3, 0x42, 0x30, 0x40, - 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, - 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, - 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, - 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, - 0x9a, 0xd8, 0x00, 0x30, 0x00, 0xe7, 0x6b, 0x7f, 0x85, 0x18, 0xee, - 0x8b, 0xb6, 0xce, 0x8a, 0x0c, 0xf8, 0x11, 0xe1, 0xbb, 0x30, 0x0a, - 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, - 0x69, 0x00, 0x30, 0x66, 0x02, 0x31, 0x00, 0xdd, 0xf8, 0xe0, 0x57, - 0x47, 0x5b, 0xa7, 0xe6, 0x0a, 0xc3, 0xbd, 0xf5, 0x80, 0x8a, 0x97, - 0x35, 0x0d, 0x1b, 0x89, 0x3c, 0x54, 0x86, 0x77, 0x28, 0xca, 0xa1, - 0xf4, 0x79, 0xde, 0xb5, 0xe6, 0x38, 0xb0, 0xf0, 0x65, 0x70, 0x8c, - 0x7f, 0x02, 0x54, 0xc2, 0xbf, 0xff, 0xd8, 0xa1, 0x3e, 0xd9, 0xcf, - 0x02, 0x31, 0x00, 0xc4, 0x8d, 0x94, 0xfc, 0xdc, 0x53, 0xd2, 0xdc, - 0x9d, 0x78, 0x16, 0x1f, 0x15, 0x33, 0x23, 0x53, 0x52, 0xe3, 0x5a, - 0x31, 0x5d, 0x9d, 0xca, 0xae, 0xbd, 0x13, 0x29, 0x44, 0x0d, 0x27, - 0x5b, 0xa8, 0xe7, 0x68, 0x9c, 0x12, 0xf7, 0x58, 0x3f, 0x2e, 0x72, - 0x02, 0x57, 0xa3, 0x8f, 0xa1, 0x14, 0x2e, 0x30, 0x82, 0x04, 0x2a, - 0x30, 0x82, 0x03, 0x12, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, - 0x60, 0x01, 0x97, 0xb7, 0x46, 0xa7, 0xea, 0xb4, 0xb4, 0x9a, 0xd6, - 0x4b, 0x2f, 0xf7, 0x90, 0xfb, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, - 0xae, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, - 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x0c, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65, 0x2c, 0x20, - 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, - 0x04, 0x0b, 0x13, 0x1f, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x20, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x0b, - 0x13, 0x2f, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x38, 0x20, + 0x4f, 0x4f, 0x54, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, + 0x01, 0x01, 0x00, 0xd3, 0x35, 0xf7, 0x3f, 0x73, 0x77, 0xad, 0xe8, + 0x5b, 0x73, 0x17, 0xc2, 0xd1, 0x6f, 0xed, 0x55, 0xbc, 0x6e, 0xea, + 0xe8, 0xa4, 0x79, 0xb2, 0x6c, 0xc3, 0xa3, 0xef, 0xe1, 0x9f, 0xb1, + 0x3b, 0x48, 0x85, 0xf5, 0x9a, 0x5c, 0x21, 0x22, 0x10, 0x2c, 0xc5, + 0x82, 0xce, 0xda, 0xe3, 0x9a, 0x6e, 0x37, 0xe1, 0x87, 0x2c, 0xdc, + 0xb9, 0x0c, 0x5a, 0xba, 0x88, 0x55, 0xdf, 0xfd, 0xaa, 0xdb, 0x1f, + 0x31, 0xea, 0x01, 0xf1, 0xdf, 0x39, 0x01, 0xc1, 0x13, 0xfd, 0x48, + 0x52, 0x21, 0xc4, 0x55, 0xdf, 0xda, 0xd8, 0xb3, 0x54, 0x76, 0xba, + 0x74, 0xb1, 0xb7, 0x7d, 0xd7, 0xc0, 0xe8, 0xf6, 0x59, 0xc5, 0x4d, + 0xc8, 0xbd, 0xad, 0x1f, 0x14, 0xda, 0xdf, 0x58, 0x44, 0x25, 0x32, + 0x19, 0x2a, 0xc7, 0x7e, 0x7e, 0x8e, 0xae, 0x38, 0xb0, 0x30, 0x7b, + 0x47, 0x72, 0x09, 0x31, 0xf0, 0x30, 0xdb, 0xc3, 0x1b, 0x76, 0x29, + 0xbb, 0x69, 0x76, 0x4e, 0x57, 0xf9, 0x1b, 0x64, 0xa2, 0x93, 0x56, + 0xb7, 0x6f, 0x99, 0x6e, 0xdb, 0x0a, 0x04, 0x9c, 0x11, 0xe3, 0x80, + 0x1f, 0xcb, 0x63, 0x94, 0x10, 0x0a, 0xa9, 0xe1, 0x64, 0x82, 0x31, + 0xf9, 0x8c, 0x27, 0xed, 0xa6, 0x99, 0x00, 0xf6, 0x70, 0x93, 0x18, + 0xf8, 0xa1, 0x34, 0x86, 0xa3, 0xdd, 0x7a, 0xc2, 0x18, 0x79, 0xf6, + 0x7a, 0x65, 0x35, 0xcf, 0x90, 0xeb, 0xbd, 0x33, 0x93, 0x9f, 0x53, + 0xab, 0x73, 0x3b, 0xe6, 0x9b, 0x34, 0x20, 0x2f, 0x1d, 0xef, 0xa9, + 0x1d, 0x63, 0x1a, 0xa0, 0x80, 0xdb, 0x03, 0x2f, 0xf9, 0x26, 0x1a, + 0x86, 0xd2, 0x8d, 0xbb, 0xa9, 0xbe, 0x52, 0x3a, 0x87, 0x67, 0x48, + 0x0d, 0xbf, 0xb4, 0xa0, 0xd8, 0x26, 0xbe, 0x23, 0x5f, 0x73, 0x37, + 0x7f, 0x26, 0xe6, 0x92, 0x04, 0xa3, 0x7f, 0xcf, 0x20, 0xa7, 0xb7, + 0xf3, 0x3a, 0xca, 0xcb, 0x99, 0xcb, 0x02, 0x03, 0x01, 0x00, 0x01, + 0xa3, 0x73, 0x30, 0x71, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, + 0x01, 0x86, 0xf8, 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, 0x00, + 0x07, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, + 0x16, 0x80, 0x14, 0x65, 0xf2, 0x31, 0xad, 0x2a, 0xf7, 0xf7, 0xdd, + 0x52, 0x96, 0x0a, 0xc7, 0x02, 0xc1, 0x0e, 0xef, 0xa6, 0xd5, 0x3b, + 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, + 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0b, 0x06, 0x03, + 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0xfe, 0x30, 0x1d, + 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x65, 0xf2, + 0x31, 0xad, 0x2a, 0xf7, 0xf7, 0xdd, 0x52, 0x96, 0x0a, 0xc7, 0x02, + 0xc1, 0x0e, 0xef, 0xa6, 0xd5, 0x3b, 0x11, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x01, 0x00, 0x4b, 0x35, 0xee, 0xcc, 0xe4, 0xae, + 0xbf, 0xc3, 0x6e, 0xad, 0x9f, 0x95, 0x3b, 0x4b, 0x3f, 0x5b, 0x1e, + 0xdf, 0x57, 0x29, 0xa2, 0x59, 0xca, 0x38, 0xe2, 0xb9, 0x1a, 0xff, + 0x9e, 0xe6, 0x6e, 0x32, 0xdd, 0x1e, 0xae, 0xea, 0x35, 0xb7, 0xf5, + 0x93, 0x91, 0x4e, 0xda, 0x42, 0xe1, 0xc3, 0x17, 0x60, 0x50, 0xf2, + 0xd1, 0x5c, 0x26, 0xb9, 0x82, 0xb7, 0xea, 0x6d, 0xe4, 0x9c, 0x84, + 0xe7, 0x03, 0x79, 0x17, 0xaf, 0x98, 0x3d, 0x94, 0xdb, 0xc7, 0xba, + 0x00, 0xe7, 0xb8, 0xbf, 0x01, 0x57, 0xc1, 0x77, 0x45, 0x32, 0x0c, + 0x3b, 0xf1, 0xb4, 0x1c, 0x08, 0xb0, 0xfd, 0x51, 0xa0, 0xa1, 0xdd, + 0x9a, 0x1d, 0x13, 0x36, 0x9a, 0x6d, 0xb7, 0xc7, 0x3c, 0xb9, 0xe1, + 0xc5, 0xd9, 0x17, 0xfa, 0x83, 0xd5, 0x3d, 0x15, 0xa0, 0x3c, 0xbb, + 0x1e, 0x0b, 0xe2, 0xc8, 0x90, 0x3f, 0xa8, 0x86, 0x0c, 0xfc, 0xf9, + 0x8b, 0x5e, 0x85, 0xcb, 0x4f, 0x5b, 0x4b, 0x62, 0x11, 0x47, 0xc5, + 0x45, 0x7c, 0x05, 0x2f, 0x41, 0xb1, 0x9e, 0x10, 0x69, 0x1b, 0x99, + 0x96, 0xe0, 0x55, 0x79, 0xfb, 0x4e, 0x86, 0x99, 0xb8, 0x94, 0xda, + 0x86, 0x38, 0x6a, 0x93, 0xa3, 0xe7, 0xcb, 0x6e, 0xe5, 0xdf, 0xea, + 0x21, 0x55, 0x89, 0x9c, 0x7d, 0x7d, 0x7f, 0x98, 0xf5, 0x00, 0x89, + 0xee, 0xe3, 0x84, 0xc0, 0x5c, 0x96, 0xb5, 0xc5, 0x46, 0xea, 0x46, + 0xe0, 0x85, 0x55, 0xb6, 0x1b, 0xc9, 0x12, 0xd6, 0xc1, 0xcd, 0xcd, + 0x80, 0xf3, 0x02, 0x01, 0x3c, 0xc8, 0x69, 0xcb, 0x45, 0x48, 0x63, + 0xd8, 0x94, 0xd0, 0xec, 0x85, 0x0e, 0x3b, 0x4e, 0x11, 0x65, 0xf4, + 0x82, 0x8c, 0xa6, 0x3d, 0xae, 0x2e, 0x22, 0x94, 0x09, 0xc8, 0x5c, + 0xea, 0x3c, 0x81, 0x5d, 0x16, 0x2a, 0x03, 0x97, 0x16, 0x55, 0x09, + 0xdb, 0x8a, 0x41, 0x82, 0x9e, 0x66, 0x9b, 0x11, 0x30, 0x82, 0x03, + 0xa0, 0x30, 0x82, 0x02, 0x88, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, + 0x01, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x43, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, + 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x13, 0x4a, + 0x61, 0x70, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x47, 0x6f, 0x76, + 0x65, 0x72, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x31, 0x16, 0x30, 0x14, + 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0d, 0x41, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x41, 0x30, 0x1e, + 0x17, 0x0d, 0x30, 0x37, 0x31, 0x32, 0x31, 0x32, 0x31, 0x35, 0x30, + 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x31, 0x37, 0x31, 0x32, 0x31, + 0x32, 0x31, 0x35, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x43, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, + 0x50, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x13, 0x4a, 0x61, 0x70, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x47, + 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x31, 0x16, + 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0d, 0x41, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x41, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, + 0xa7, 0x6d, 0xe0, 0x74, 0x4e, 0x87, 0x8f, 0xa5, 0x06, 0xde, 0x68, + 0xa2, 0xdb, 0x86, 0x99, 0x4b, 0x64, 0x0d, 0x71, 0xf0, 0x0a, 0x05, + 0x9b, 0x8e, 0xaa, 0xe1, 0xcc, 0x2e, 0xd2, 0x6a, 0x3b, 0xc1, 0x7a, + 0xb4, 0x97, 0x61, 0x8d, 0x8a, 0xbe, 0xc6, 0x9a, 0x9c, 0x06, 0xb4, + 0x86, 0x51, 0xe4, 0x37, 0x0e, 0x74, 0x78, 0x7e, 0x5f, 0x8a, 0x7f, + 0x94, 0xa4, 0xd7, 0x47, 0x08, 0xfd, 0x50, 0x5a, 0x56, 0xe4, 0x68, + 0xac, 0x28, 0x73, 0xa0, 0x7b, 0xe9, 0x7f, 0x18, 0x92, 0x40, 0x4f, + 0x2d, 0x9d, 0xf5, 0xae, 0x44, 0x48, 0x73, 0x36, 0x06, 0x9e, 0x64, + 0x2c, 0x3b, 0x34, 0x23, 0xdb, 0x5c, 0x26, 0xe4, 0x71, 0x79, 0x8f, + 0xd4, 0x6e, 0x79, 0x22, 0xb9, 0x93, 0xc1, 0xca, 0xcd, 0xc1, 0x56, + 0xed, 0x88, 0x6a, 0xd7, 0xa0, 0x39, 0x21, 0x04, 0x57, 0x2c, 0xa2, + 0xf5, 0xbc, 0x47, 0x41, 0x4f, 0x5e, 0x34, 0x22, 0x95, 0xb5, 0x1f, + 0x29, 0x6d, 0x5e, 0x4a, 0xf3, 0x4d, 0x72, 0xbe, 0x41, 0x56, 0x20, + 0x87, 0xfc, 0xe9, 0x50, 0x47, 0xd7, 0x30, 0x14, 0xee, 0x5c, 0x8c, + 0x55, 0xba, 0x59, 0x8d, 0x87, 0xfc, 0x23, 0xde, 0x93, 0xd0, 0x04, + 0x8c, 0xfd, 0xef, 0x6d, 0xbd, 0xd0, 0x7a, 0xc9, 0xa5, 0x3a, 0x6a, + 0x72, 0x33, 0xc6, 0x4a, 0x0d, 0x05, 0x17, 0x2a, 0x2d, 0x7b, 0xb1, + 0xa7, 0xd8, 0xd6, 0xf0, 0xbe, 0xf4, 0x3f, 0xea, 0x0e, 0x28, 0x6d, + 0x41, 0x61, 0x23, 0x76, 0x78, 0xc3, 0xb8, 0x65, 0xa4, 0xf3, 0x5a, + 0xae, 0xcc, 0xc2, 0xaa, 0xd9, 0xe7, 0x58, 0xde, 0xb6, 0x7e, 0x9d, + 0x85, 0x6e, 0x9f, 0x2a, 0x0a, 0x6f, 0x9f, 0x03, 0x29, 0x30, 0x97, + 0x28, 0x1d, 0xbc, 0xb7, 0xcf, 0x54, 0x29, 0x4e, 0x51, 0x31, 0xf9, + 0x27, 0xb6, 0x28, 0x26, 0xfe, 0xa2, 0x63, 0xe6, 0x41, 0x16, 0xf0, + 0x33, 0x98, 0x47, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x9e, + 0x30, 0x81, 0x9b, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, + 0x16, 0x04, 0x14, 0x54, 0x5a, 0xcb, 0x26, 0x3f, 0x71, 0xcc, 0x94, + 0x46, 0x0d, 0x96, 0x53, 0xea, 0x6b, 0x48, 0xd0, 0x93, 0xfe, 0x42, + 0x75, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, + 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x59, 0x06, 0x03, 0x55, + 0x1d, 0x11, 0x04, 0x52, 0x30, 0x50, 0xa4, 0x4e, 0x30, 0x4c, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, + 0x50, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, + 0x0f, 0xe6, 0x97, 0xa5, 0xe6, 0x9c, 0xac, 0xe5, 0x9b, 0xbd, 0xe6, + 0x94, 0xbf, 0xe5, 0xba, 0x9c, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, + 0x55, 0x04, 0x0b, 0x0c, 0x1a, 0xe3, 0x82, 0xa2, 0xe3, 0x83, 0x97, + 0xe3, 0x83, 0xaa, 0xe3, 0x82, 0xb1, 0xe3, 0x83, 0xbc, 0xe3, 0x82, + 0xb7, 0xe3, 0x83, 0xa7, 0xe3, 0x83, 0xb3, 0x43, 0x41, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, + 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x01, 0x00, 0x39, 0x6a, 0x44, 0x76, 0x77, 0x38, 0x3a, 0xec, 0xa3, + 0x67, 0x46, 0x0f, 0xf9, 0x8b, 0x06, 0xa8, 0xfb, 0x6a, 0x90, 0x31, + 0xce, 0x7e, 0xec, 0xda, 0xd1, 0x89, 0x7c, 0x7a, 0xeb, 0x2e, 0x0c, + 0xbd, 0x99, 0x32, 0xe7, 0xb0, 0x24, 0xd6, 0xc3, 0xff, 0xf5, 0xb2, + 0x88, 0x09, 0x87, 0x2c, 0xe3, 0x54, 0xe1, 0xa3, 0xa6, 0xb2, 0x08, + 0x0b, 0xc0, 0x85, 0xa8, 0xc8, 0xd2, 0x9c, 0x71, 0xf6, 0x1d, 0x9f, + 0x60, 0xfc, 0x38, 0x33, 0x13, 0xe1, 0x9e, 0xdc, 0x0b, 0x5f, 0xda, + 0x16, 0x50, 0x29, 0x7b, 0x2f, 0x70, 0x91, 0x0f, 0x99, 0xba, 0x34, + 0x34, 0x8d, 0x95, 0x74, 0xc5, 0x7e, 0x78, 0xa9, 0x66, 0x5d, 0xbd, + 0xca, 0x21, 0x77, 0x42, 0x10, 0xac, 0x66, 0x26, 0x3d, 0xde, 0x91, + 0xab, 0xfd, 0x15, 0xf0, 0x6f, 0xed, 0x6c, 0x5f, 0x10, 0xf8, 0xf3, + 0x16, 0xf6, 0x03, 0x8a, 0x8f, 0xa7, 0x12, 0x11, 0x0c, 0xcb, 0xfd, + 0x3f, 0x79, 0xc1, 0x9c, 0xfd, 0x62, 0xee, 0xa3, 0xcf, 0x54, 0x0c, + 0xd1, 0x2b, 0x5f, 0x17, 0x3e, 0xe3, 0x3e, 0xbf, 0xc0, 0x2b, 0x3e, + 0x09, 0x9b, 0xfe, 0x88, 0xa6, 0x7e, 0xb4, 0x92, 0x17, 0xfc, 0x23, + 0x94, 0x81, 0xbd, 0x6e, 0xa7, 0xc5, 0x8c, 0xc2, 0xeb, 0x11, 0x45, + 0xdb, 0xf8, 0x41, 0xc9, 0x96, 0x76, 0xea, 0x70, 0x5f, 0x79, 0x12, + 0x6b, 0xe4, 0xa3, 0x07, 0x5a, 0x05, 0xef, 0x27, 0x49, 0xcf, 0x21, + 0x9f, 0x8a, 0x4c, 0x09, 0x70, 0x66, 0xa9, 0x26, 0xc1, 0x2b, 0x11, + 0x4e, 0x33, 0xd2, 0x0e, 0xfc, 0xd6, 0x6c, 0xd2, 0x0e, 0x32, 0x64, + 0x68, 0xff, 0xad, 0x05, 0x78, 0x5f, 0x03, 0x1d, 0xa8, 0xe3, 0x90, + 0xac, 0x24, 0xe0, 0x0f, 0x40, 0xa7, 0x4b, 0xae, 0x8b, 0x28, 0xb7, + 0x82, 0xca, 0x18, 0x07, 0xe6, 0xb7, 0x5b, 0x74, 0xe9, 0x20, 0x19, + 0x7f, 0xb2, 0x1b, 0x89, 0x54, 0x30, 0x82, 0x03, 0xfe, 0x30, 0x82, + 0x02, 0xe6, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x15, 0xac, + 0x6e, 0x94, 0x19, 0xb2, 0x79, 0x4b, 0x41, 0xf6, 0x27, 0xa9, 0xc3, + 0x18, 0x0f, 0x1f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0x98, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, + 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x0d, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x49, + 0x6e, 0x63, 0x2e, 0x31, 0x39, 0x30, 0x37, 0x06, 0x03, 0x55, 0x04, + 0x0b, 0x13, 0x30, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x38, + 0x20, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x49, + 0x6e, 0x63, 0x2e, 0x20, 0x2d, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x61, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, + 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x31, 0x36, 0x30, 0x34, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2d, 0x47, 0x65, 0x6f, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x33, 0x30, 0x1e, 0x17, + 0x0d, 0x30, 0x38, 0x30, 0x34, 0x30, 0x32, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x37, 0x31, 0x32, 0x30, 0x31, + 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0x98, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, + 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x0d, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x49, + 0x6e, 0x63, 0x2e, 0x31, 0x39, 0x30, 0x37, 0x06, 0x03, 0x55, 0x04, + 0x0b, 0x13, 0x30, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x38, + 0x20, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x49, + 0x6e, 0x63, 0x2e, 0x20, 0x2d, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x61, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, + 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x31, 0x36, 0x30, 0x34, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2d, 0x47, 0x65, 0x6f, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x33, 0x30, 0x82, 0x01, + 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, + 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xdc, 0xe2, 0x5e, + 0x62, 0x58, 0x1d, 0x33, 0x57, 0x39, 0x32, 0x33, 0xfa, 0xeb, 0xcb, + 0x87, 0x8c, 0xa7, 0xd4, 0x4a, 0xdd, 0x06, 0x88, 0xea, 0x64, 0x8e, + 0x31, 0x98, 0xa5, 0x38, 0x90, 0x1e, 0x98, 0xcf, 0x2e, 0x63, 0x2b, + 0xf0, 0x46, 0xbc, 0x44, 0xb2, 0x89, 0xa1, 0xc0, 0x28, 0x0c, 0x49, + 0x70, 0x21, 0x95, 0x9f, 0x64, 0xc0, 0xa6, 0x93, 0x12, 0x02, 0x65, + 0x26, 0x86, 0xc6, 0xa5, 0x89, 0xf0, 0xfa, 0xd7, 0x84, 0xa0, 0x70, + 0xaf, 0x4f, 0x1a, 0x97, 0x3f, 0x06, 0x44, 0xd5, 0xc9, 0xeb, 0x72, + 0x10, 0x7d, 0xe4, 0x31, 0x28, 0xfb, 0x1c, 0x61, 0xe6, 0x28, 0x07, + 0x44, 0x73, 0x92, 0x22, 0x69, 0xa7, 0x03, 0x88, 0x6c, 0x9d, 0x63, + 0xc8, 0x52, 0xda, 0x98, 0x27, 0xe7, 0x08, 0x4c, 0x70, 0x3e, 0xb4, + 0xc9, 0x12, 0xc1, 0xc5, 0x67, 0x83, 0x5d, 0x33, 0xf3, 0x03, 0x11, + 0xec, 0x6a, 0xd0, 0x53, 0xe2, 0xd1, 0xba, 0x36, 0x60, 0x94, 0x80, + 0xbb, 0x61, 0x63, 0x6c, 0x5b, 0x17, 0x7e, 0xdf, 0x40, 0x94, 0x1e, + 0xab, 0x0d, 0xc2, 0x21, 0x28, 0x70, 0x88, 0xff, 0xd6, 0x26, 0x6c, + 0x6c, 0x60, 0x04, 0x25, 0x4e, 0x55, 0x7e, 0x7d, 0xef, 0xbf, 0x94, + 0x48, 0xde, 0xb7, 0x1d, 0xdd, 0x70, 0x8d, 0x05, 0x5f, 0x88, 0xa5, + 0x9b, 0xf2, 0xc2, 0xee, 0xea, 0xd1, 0x40, 0x41, 0x6d, 0x62, 0x38, + 0x1d, 0x56, 0x06, 0xc5, 0x03, 0x47, 0x51, 0x20, 0x19, 0xfc, 0x7b, + 0x10, 0x0b, 0x0e, 0x62, 0xae, 0x76, 0x55, 0xbf, 0x5f, 0x77, 0xbe, + 0x3e, 0x49, 0x01, 0x53, 0x3d, 0x98, 0x25, 0x03, 0x76, 0x24, 0x5a, + 0x1d, 0xb4, 0xdb, 0x89, 0xea, 0x79, 0xe5, 0xb6, 0xb3, 0x3b, 0x3f, + 0xba, 0x4c, 0x28, 0x41, 0x7f, 0x06, 0xac, 0x6a, 0x8e, 0xc1, 0xd0, + 0xf6, 0x05, 0x1d, 0x7d, 0xe6, 0x42, 0x86, 0xe3, 0xa5, 0xd5, 0x47, + 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, + 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, + 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, + 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xc4, 0x79, + 0xca, 0x8e, 0xa1, 0x4e, 0x03, 0x1d, 0x1c, 0xdc, 0x6b, 0xdb, 0x31, + 0x5b, 0x94, 0x3e, 0x3f, 0x30, 0x7f, 0x2d, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x01, 0x00, 0x2d, 0xc5, 0x13, 0xcf, 0x56, 0x80, + 0x7b, 0x7a, 0x78, 0xbd, 0x9f, 0xae, 0x2c, 0x99, 0xe7, 0xef, 0xda, + 0xdf, 0x94, 0x5e, 0x09, 0x69, 0xa7, 0xe7, 0x6e, 0x68, 0x8c, 0xbd, + 0x72, 0xbe, 0x47, 0xa9, 0x0e, 0x97, 0x12, 0xb8, 0x4a, 0xf1, 0x64, + 0xd3, 0x39, 0xdf, 0x25, 0x34, 0xd4, 0xc1, 0xcd, 0x4e, 0x81, 0xf0, + 0x0f, 0x04, 0xc4, 0x24, 0xb3, 0x34, 0x96, 0xc6, 0xa6, 0xaa, 0x30, + 0xdf, 0x68, 0x61, 0x73, 0xd7, 0xf9, 0x8e, 0x85, 0x89, 0xef, 0x0e, + 0x5e, 0x95, 0x28, 0x4a, 0x2a, 0x27, 0x8f, 0x10, 0x8e, 0x2e, 0x7c, + 0x86, 0xc4, 0x02, 0x9e, 0xda, 0x0c, 0x77, 0x65, 0x0e, 0x44, 0x0d, + 0x92, 0xfd, 0xfd, 0xb3, 0x16, 0x36, 0xfa, 0x11, 0x0d, 0x1d, 0x8c, + 0x0e, 0x07, 0x89, 0x6a, 0x29, 0x56, 0xf7, 0x72, 0xf4, 0xdd, 0x15, + 0x9c, 0x77, 0x35, 0x66, 0x57, 0xab, 0x13, 0x53, 0xd8, 0x8e, 0xc1, + 0x40, 0xc5, 0xd7, 0x13, 0x16, 0x5a, 0x72, 0xc7, 0xb7, 0x69, 0x01, + 0xc4, 0x7a, 0xb1, 0x83, 0x01, 0x68, 0x7d, 0x8d, 0x41, 0xa1, 0x94, + 0x18, 0xc1, 0x25, 0x5c, 0xfc, 0xf0, 0xfe, 0x83, 0x02, 0x87, 0x7c, + 0x0d, 0x0d, 0xcf, 0x2e, 0x08, 0x5c, 0x4a, 0x40, 0x0d, 0x3e, 0xec, + 0x81, 0x61, 0xe6, 0x24, 0xdb, 0xca, 0xe0, 0x0e, 0x2d, 0x07, 0xb2, + 0x3e, 0x56, 0xdc, 0x8d, 0xf5, 0x41, 0x85, 0x07, 0x48, 0x9b, 0x0c, + 0x0b, 0xcb, 0x49, 0x3f, 0x7d, 0xec, 0xb7, 0xfd, 0xcb, 0x8d, 0x67, + 0x89, 0x1a, 0xab, 0xed, 0xbb, 0x1e, 0xa3, 0x00, 0x08, 0x08, 0x17, + 0x2a, 0x82, 0x5c, 0x31, 0x5d, 0x46, 0x8a, 0x2d, 0x0f, 0x86, 0x9b, + 0x74, 0xd9, 0x45, 0xfb, 0xd4, 0x40, 0xb1, 0x7a, 0xaa, 0x68, 0x2d, + 0x86, 0xb2, 0x99, 0x22, 0xe1, 0xc1, 0x2b, 0xc7, 0x9c, 0xf8, 0xf3, + 0x5f, 0xa8, 0x82, 0x12, 0xeb, 0x19, 0x11, 0x2d, 0x30, 0x82, 0x02, + 0x88, 0x30, 0x82, 0x02, 0x0d, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, + 0x10, 0x35, 0xfc, 0x26, 0x5c, 0xd9, 0x84, 0x4f, 0xc9, 0x3d, 0x26, + 0x3d, 0x57, 0x9b, 0xae, 0xd7, 0x56, 0x30, 0x0a, 0x06, 0x08, 0x2a, + 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x81, 0x84, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, + 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x0c, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65, 0x2c, 0x20, 0x49, 0x6e, + 0x63, 0x2e, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x0b, + 0x13, 0x2f, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x37, 0x20, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x2d, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1b, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x52, 0x6f, - 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x47, 0x33, 0x30, - 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x30, 0x34, 0x30, 0x32, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x37, 0x31, 0x32, - 0x30, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, - 0xae, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, - 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x0c, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65, 0x2c, 0x20, - 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, - 0x04, 0x0b, 0x13, 0x1f, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x20, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x0b, - 0x13, 0x2f, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x38, 0x20, - 0x74, 0x68, 0x61, 0x77, 0x74, 0x65, 0x2c, 0x20, 0x49, 0x6e, 0x63, - 0x2e, 0x20, 0x2d, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, - 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x13, 0x1b, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65, - 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x52, 0x6f, - 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x47, 0x33, 0x30, - 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, - 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb2, - 0xbf, 0x27, 0x2c, 0xfb, 0xdb, 0xd8, 0x5b, 0xdd, 0x78, 0x7b, 0x1b, - 0x9e, 0x77, 0x66, 0x81, 0xcb, 0x3e, 0xbc, 0x7c, 0xae, 0xf3, 0xa6, - 0x27, 0x9a, 0x34, 0xa3, 0x68, 0x31, 0x71, 0x38, 0x33, 0x62, 0xe4, - 0xf3, 0x71, 0x66, 0x79, 0xb1, 0xa9, 0x65, 0xa3, 0xa5, 0x8b, 0xd5, - 0x8f, 0x60, 0x2d, 0x3f, 0x42, 0xcc, 0xaa, 0x6b, 0x32, 0xc0, 0x23, - 0xcb, 0x2c, 0x41, 0xdd, 0xe4, 0xdf, 0xfc, 0x61, 0x9c, 0xe2, 0x73, - 0xb2, 0x22, 0x95, 0x11, 0x43, 0x18, 0x5f, 0xc4, 0xb6, 0x1f, 0x57, - 0x6c, 0x0a, 0x05, 0x58, 0x22, 0xc8, 0x36, 0x4c, 0x3a, 0x7c, 0xa5, - 0xd1, 0xcf, 0x86, 0xaf, 0x88, 0xa7, 0x44, 0x02, 0x13, 0x74, 0x71, - 0x73, 0x0a, 0x42, 0x59, 0x02, 0xf8, 0x1b, 0x14, 0x6b, 0x42, 0xdf, - 0x6f, 0x5f, 0xba, 0x6b, 0x82, 0xa2, 0x9d, 0x5b, 0xe7, 0x4a, 0xbd, - 0x1e, 0x01, 0x72, 0xdb, 0x4b, 0x74, 0xe8, 0x3b, 0x7f, 0x7f, 0x7d, - 0x1f, 0x04, 0xb4, 0x26, 0x9b, 0xe0, 0xb4, 0x5a, 0xac, 0x47, 0x3d, - 0x55, 0xb8, 0xd7, 0xb0, 0x26, 0x52, 0x28, 0x01, 0x31, 0x40, 0x66, - 0xd8, 0xd9, 0x24, 0xbd, 0xf6, 0x2a, 0xd8, 0xec, 0x21, 0x49, 0x5c, - 0x9b, 0xf6, 0x7a, 0xe9, 0x7f, 0x55, 0x35, 0x7e, 0x96, 0x6b, 0x8d, - 0x93, 0x93, 0x27, 0xcb, 0x92, 0xbb, 0xea, 0xac, 0x40, 0xc0, 0x9f, - 0xc2, 0xf8, 0x80, 0xcf, 0x5d, 0xf4, 0x5a, 0xdc, 0xce, 0x74, 0x86, - 0xa6, 0x3e, 0x6c, 0x0b, 0x53, 0xca, 0xbd, 0x92, 0xce, 0x19, 0x06, - 0x72, 0xe6, 0x0c, 0x5c, 0x38, 0x69, 0xc7, 0x04, 0xd6, 0xbc, 0x6c, - 0xce, 0x5b, 0xf6, 0xf7, 0x68, 0x9c, 0xdc, 0x25, 0x15, 0x48, 0x88, - 0xa1, 0xe9, 0xa9, 0xf8, 0x98, 0x9c, 0xe0, 0xf3, 0xd5, 0x31, 0x28, - 0x61, 0x11, 0x6c, 0x67, 0x96, 0x8d, 0x39, 0x99, 0xcb, 0xc2, 0x45, - 0x24, 0x39, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, - 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, - 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, - 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, - 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, - 0xad, 0x6c, 0xaa, 0x94, 0x60, 0x9c, 0xed, 0xe4, 0xff, 0xfa, 0x3e, - 0x0a, 0x74, 0x2b, 0x63, 0x03, 0xf7, 0xb6, 0x59, 0xbf, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, - 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x1a, 0x40, 0xd8, 0x95, - 0x65, 0xac, 0x09, 0x92, 0x89, 0xc6, 0x39, 0xf4, 0x10, 0xe5, 0xa9, - 0x0e, 0x66, 0x53, 0x5d, 0x78, 0xde, 0xfa, 0x24, 0x91, 0xbb, 0xe7, - 0x44, 0x51, 0xdf, 0xc6, 0x16, 0x34, 0x0a, 0xef, 0x6a, 0x44, 0x51, - 0xea, 0x2b, 0x07, 0x8a, 0x03, 0x7a, 0xc3, 0xeb, 0x3f, 0x0a, 0x2c, - 0x52, 0x16, 0xa0, 0x2b, 0x43, 0xb9, 0x25, 0x90, 0x3f, 0x70, 0xa9, - 0x33, 0x25, 0x6d, 0x45, 0x1a, 0x28, 0x3b, 0x27, 0xcf, 0xaa, 0xc3, - 0x29, 0x42, 0x1b, 0xdf, 0x3b, 0x4c, 0xc0, 0x33, 0x34, 0x5b, 0x41, - 0x88, 0xbf, 0x6b, 0x2b, 0x65, 0xaf, 0x28, 0xef, 0xb2, 0xf5, 0xc3, - 0xaa, 0x66, 0xce, 0x7b, 0x56, 0xee, 0xb7, 0xc8, 0xcb, 0x67, 0xc1, - 0xc9, 0x9c, 0x1a, 0x18, 0xb8, 0xc4, 0xc3, 0x49, 0x03, 0xf1, 0x60, - 0x0e, 0x50, 0xcd, 0x46, 0xc5, 0xf3, 0x77, 0x79, 0xf7, 0xb6, 0x15, - 0xe0, 0x38, 0xdb, 0xc7, 0x2f, 0x28, 0xa0, 0x0c, 0x3f, 0x77, 0x26, - 0x74, 0xd9, 0x25, 0x12, 0xda, 0x31, 0xda, 0x1a, 0x1e, 0xdc, 0x29, - 0x41, 0x91, 0x22, 0x3c, 0x69, 0xa7, 0xbb, 0x02, 0xf2, 0xb6, 0x5c, - 0x27, 0x03, 0x89, 0xf4, 0x06, 0xea, 0x9b, 0xe4, 0x72, 0x82, 0xe3, - 0xa1, 0x09, 0xc1, 0xe9, 0x00, 0x19, 0xd3, 0x3e, 0xd4, 0x70, 0x6b, - 0xba, 0x71, 0xa6, 0xaa, 0x58, 0xae, 0xf4, 0xbb, 0xe9, 0x6c, 0xb6, - 0xef, 0x87, 0xcc, 0x9b, 0xbb, 0xff, 0x39, 0xe6, 0x56, 0x61, 0xd3, - 0x0a, 0xa7, 0xc4, 0x5c, 0x4c, 0x60, 0x7b, 0x05, 0x77, 0x26, 0x7a, - 0xbf, 0xd8, 0x07, 0x52, 0x2c, 0x62, 0xf7, 0x70, 0x63, 0xd9, 0x39, - 0xbc, 0x6f, 0x1c, 0xc2, 0x79, 0xdc, 0x76, 0x29, 0xaf, 0xce, 0xc5, - 0x2c, 0x64, 0x04, 0x5e, 0x88, 0x36, 0x6e, 0x31, 0xd4, 0x40, 0x1a, - 0x62, 0x34, 0x36, 0x3f, 0x35, 0x01, 0xae, 0xac, 0x63, 0xa0, 0x30, - 0x82, 0x02, 0xae, 0x30, 0x82, 0x02, 0x35, 0xa0, 0x03, 0x02, 0x01, - 0x02, 0x02, 0x10, 0x3c, 0xb2, 0xf4, 0x48, 0x0a, 0x00, 0xe2, 0xfe, - 0xeb, 0x24, 0x3b, 0x5e, 0x60, 0x3e, 0xc3, 0x6b, 0x30, 0x0a, 0x06, - 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x81, - 0x98, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, - 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x0d, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, - 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x39, 0x30, 0x37, 0x06, 0x03, - 0x55, 0x04, 0x0b, 0x13, 0x30, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, - 0x30, 0x37, 0x20, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, - 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x2d, 0x20, 0x46, 0x6f, 0x72, - 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, - 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x31, 0x36, - 0x30, 0x34, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2d, 0x47, 0x65, - 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x50, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, + 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x37, 0x31, 0x31, 0x30, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x31, 0x31, 0x38, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, - 0x98, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, - 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x0d, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, - 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x39, 0x30, 0x37, 0x06, 0x03, - 0x55, 0x04, 0x0b, 0x13, 0x30, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, - 0x30, 0x37, 0x20, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, + 0x84, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x13, 0x0c, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65, 0x2c, 0x20, + 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, + 0x04, 0x0b, 0x13, 0x2f, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, + 0x37, 0x20, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65, 0x2c, 0x20, 0x49, + 0x6e, 0x63, 0x2e, 0x20, 0x2d, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x61, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, + 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x31, 0x24, 0x30, 0x22, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1b, 0x74, 0x68, 0x61, 0x77, + 0x74, 0x65, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, + 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x47, + 0x32, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, + 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, + 0x62, 0x00, 0x04, 0xa2, 0xd5, 0x9c, 0x82, 0x7b, 0x95, 0x9d, 0xf1, + 0x52, 0x78, 0x87, 0xfe, 0x8a, 0x16, 0xbf, 0x05, 0xe6, 0xdf, 0xa3, + 0x02, 0x4f, 0x0d, 0x07, 0xc6, 0x00, 0x51, 0xba, 0x0c, 0x02, 0x52, + 0x2d, 0x22, 0xa4, 0x42, 0x39, 0xc4, 0xfe, 0x8f, 0xea, 0xc9, 0xc1, + 0xbe, 0xd4, 0x4d, 0xff, 0x9f, 0x7a, 0x9e, 0xe2, 0xb1, 0x7c, 0x9a, + 0xad, 0xa7, 0x86, 0x09, 0x73, 0x87, 0xd1, 0xe7, 0x9a, 0xe3, 0x7a, + 0xa5, 0xaa, 0x6e, 0xfb, 0xba, 0xb3, 0x70, 0xc0, 0x67, 0x88, 0xa2, + 0x35, 0xd4, 0xa3, 0x9a, 0xb1, 0xfd, 0xad, 0xc2, 0xef, 0x31, 0xfa, + 0xa8, 0xb9, 0xf3, 0xfb, 0x08, 0xc6, 0x91, 0xd1, 0xfb, 0x29, 0x95, + 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, + 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, + 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, + 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, + 0x04, 0x16, 0x04, 0x14, 0x9a, 0xd8, 0x00, 0x30, 0x00, 0xe7, 0x6b, + 0x7f, 0x85, 0x18, 0xee, 0x8b, 0xb6, 0xce, 0x8a, 0x0c, 0xf8, 0x11, + 0xe1, 0xbb, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, + 0x04, 0x03, 0x03, 0x03, 0x69, 0x00, 0x30, 0x66, 0x02, 0x31, 0x00, + 0xdd, 0xf8, 0xe0, 0x57, 0x47, 0x5b, 0xa7, 0xe6, 0x0a, 0xc3, 0xbd, + 0xf5, 0x80, 0x8a, 0x97, 0x35, 0x0d, 0x1b, 0x89, 0x3c, 0x54, 0x86, + 0x77, 0x28, 0xca, 0xa1, 0xf4, 0x79, 0xde, 0xb5, 0xe6, 0x38, 0xb0, + 0xf0, 0x65, 0x70, 0x8c, 0x7f, 0x02, 0x54, 0xc2, 0xbf, 0xff, 0xd8, + 0xa1, 0x3e, 0xd9, 0xcf, 0x02, 0x31, 0x00, 0xc4, 0x8d, 0x94, 0xfc, + 0xdc, 0x53, 0xd2, 0xdc, 0x9d, 0x78, 0x16, 0x1f, 0x15, 0x33, 0x23, + 0x53, 0x52, 0xe3, 0x5a, 0x31, 0x5d, 0x9d, 0xca, 0xae, 0xbd, 0x13, + 0x29, 0x44, 0x0d, 0x27, 0x5b, 0xa8, 0xe7, 0x68, 0x9c, 0x12, 0xf7, + 0x58, 0x3f, 0x2e, 0x72, 0x02, 0x57, 0xa3, 0x8f, 0xa1, 0x14, 0x2e, + 0x30, 0x82, 0x04, 0x2a, 0x30, 0x82, 0x03, 0x12, 0xa0, 0x03, 0x02, + 0x01, 0x02, 0x02, 0x10, 0x60, 0x01, 0x97, 0xb7, 0x46, 0xa7, 0xea, + 0xb4, 0xb4, 0x9a, 0xd6, 0x4b, 0x2f, 0xf7, 0x90, 0xfb, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x30, 0x81, 0xae, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x74, 0x68, 0x61, 0x77, + 0x74, 0x65, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x28, 0x30, + 0x26, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1f, 0x43, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x44, 0x69, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x31, 0x38, 0x30, 0x36, 0x06, + 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2f, 0x28, 0x63, 0x29, 0x20, 0x32, + 0x30, 0x30, 0x38, 0x20, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x2d, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, - 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x31, 0x36, - 0x30, 0x34, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2d, 0x47, 0x65, - 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x50, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, - 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, - 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, - 0x04, 0x15, 0xb1, 0xe8, 0xfd, 0x03, 0x15, 0x43, 0xe5, 0xac, 0xeb, - 0x87, 0x37, 0x11, 0x62, 0xef, 0xd2, 0x83, 0x36, 0x52, 0x7d, 0x45, - 0x57, 0x0b, 0x4a, 0x8d, 0x7b, 0x54, 0x3b, 0x3a, 0x6e, 0x5f, 0x15, - 0x02, 0xc0, 0x50, 0xa6, 0xcf, 0x25, 0x2f, 0x7d, 0xca, 0x48, 0xb8, - 0xc7, 0x50, 0x63, 0x1c, 0x2a, 0x21, 0x08, 0x7c, 0x9a, 0x36, 0xd8, - 0x0b, 0xfe, 0xd1, 0x26, 0xc5, 0x58, 0x31, 0x30, 0x28, 0x25, 0xf3, - 0x5d, 0x5d, 0xa3, 0xb8, 0xb6, 0xa5, 0xb4, 0x92, 0xed, 0x6c, 0x2c, - 0x9f, 0xeb, 0xdd, 0x43, 0x89, 0xa2, 0x3c, 0x4b, 0x48, 0x91, 0x1d, - 0x50, 0xec, 0x26, 0xdf, 0xd6, 0x60, 0x2e, 0xbd, 0x21, 0xa3, 0x42, - 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, - 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, - 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, - 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, - 0x04, 0x14, 0x15, 0x5f, 0x35, 0x57, 0x51, 0x55, 0xfb, 0x25, 0xb2, - 0xad, 0x03, 0x69, 0xfc, 0x01, 0xa3, 0xfa, 0xbe, 0x11, 0x55, 0xd5, - 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, - 0x03, 0x03, 0x67, 0x00, 0x30, 0x64, 0x02, 0x30, 0x64, 0x96, 0x59, - 0xa6, 0xe8, 0x09, 0xde, 0x8b, 0xba, 0xfa, 0x5a, 0x88, 0x88, 0xf0, - 0x1f, 0x91, 0xd3, 0x46, 0xa8, 0xf2, 0x4a, 0x4c, 0x02, 0x63, 0xfb, - 0x6c, 0x5f, 0x38, 0xdb, 0x2e, 0x41, 0x93, 0xa9, 0x0e, 0xe6, 0x9d, - 0xdc, 0x31, 0x1c, 0xb2, 0xa0, 0xa7, 0x18, 0x1c, 0x79, 0xe1, 0xc7, - 0x36, 0x02, 0x30, 0x3a, 0x56, 0xaf, 0x9a, 0x74, 0x6c, 0xf6, 0xfb, - 0x83, 0xe0, 0x33, 0xd3, 0x08, 0x5f, 0xa1, 0x9c, 0xc2, 0x5b, 0x9f, - 0x46, 0xd6, 0xb6, 0xcb, 0x91, 0x06, 0x63, 0xa2, 0x06, 0xe7, 0x33, - 0xac, 0x3e, 0xa8, 0x81, 0x12, 0xd0, 0xcb, 0xba, 0xd0, 0x92, 0x0b, - 0xb6, 0x9e, 0x96, 0xaa, 0x04, 0x0f, 0x8a, 0x30, 0x82, 0x04, 0xb9, - 0x30, 0x82, 0x03, 0xa1, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, - 0x40, 0x1a, 0xc4, 0x64, 0x21, 0xb3, 0x13, 0x21, 0x03, 0x0e, 0xbb, - 0xe4, 0x12, 0x1a, 0xc5, 0x1d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, - 0xbd, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, - 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, - 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x1f, 0x30, 0x1d, 0x06, - 0x03, 0x55, 0x04, 0x0b, 0x13, 0x16, 0x56, 0x65, 0x72, 0x69, 0x53, - 0x69, 0x67, 0x6e, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x3a, 0x30, 0x38, 0x06, - 0x03, 0x55, 0x04, 0x0b, 0x13, 0x31, 0x28, 0x63, 0x29, 0x20, 0x32, - 0x30, 0x30, 0x38, 0x20, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, - 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x2d, 0x20, 0x46, - 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, - 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2f, - 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x55, 0x6e, - 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, - 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x30, 0x34, + 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x31, 0x24, + 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1b, 0x74, 0x68, + 0x61, 0x77, 0x74, 0x65, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, + 0x20, 0x47, 0x33, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x30, 0x34, 0x30, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x37, 0x31, 0x32, 0x30, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, - 0x39, 0x5a, 0x30, 0x81, 0xbd, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x39, 0x5a, 0x30, 0x81, 0xae, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x74, 0x68, 0x61, 0x77, + 0x74, 0x65, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x28, 0x30, + 0x26, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1f, 0x43, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x44, 0x69, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x31, 0x38, 0x30, 0x36, 0x06, + 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2f, 0x28, 0x63, 0x29, 0x20, 0x32, + 0x30, 0x30, 0x38, 0x20, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65, 0x2c, + 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x2d, 0x20, 0x46, 0x6f, 0x72, + 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, + 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x31, 0x24, + 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1b, 0x74, 0x68, + 0x61, 0x77, 0x74, 0x65, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, + 0x20, 0x47, 0x33, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, + 0x01, 0x01, 0x00, 0xb2, 0xbf, 0x27, 0x2c, 0xfb, 0xdb, 0xd8, 0x5b, + 0xdd, 0x78, 0x7b, 0x1b, 0x9e, 0x77, 0x66, 0x81, 0xcb, 0x3e, 0xbc, + 0x7c, 0xae, 0xf3, 0xa6, 0x27, 0x9a, 0x34, 0xa3, 0x68, 0x31, 0x71, + 0x38, 0x33, 0x62, 0xe4, 0xf3, 0x71, 0x66, 0x79, 0xb1, 0xa9, 0x65, + 0xa3, 0xa5, 0x8b, 0xd5, 0x8f, 0x60, 0x2d, 0x3f, 0x42, 0xcc, 0xaa, + 0x6b, 0x32, 0xc0, 0x23, 0xcb, 0x2c, 0x41, 0xdd, 0xe4, 0xdf, 0xfc, + 0x61, 0x9c, 0xe2, 0x73, 0xb2, 0x22, 0x95, 0x11, 0x43, 0x18, 0x5f, + 0xc4, 0xb6, 0x1f, 0x57, 0x6c, 0x0a, 0x05, 0x58, 0x22, 0xc8, 0x36, + 0x4c, 0x3a, 0x7c, 0xa5, 0xd1, 0xcf, 0x86, 0xaf, 0x88, 0xa7, 0x44, + 0x02, 0x13, 0x74, 0x71, 0x73, 0x0a, 0x42, 0x59, 0x02, 0xf8, 0x1b, + 0x14, 0x6b, 0x42, 0xdf, 0x6f, 0x5f, 0xba, 0x6b, 0x82, 0xa2, 0x9d, + 0x5b, 0xe7, 0x4a, 0xbd, 0x1e, 0x01, 0x72, 0xdb, 0x4b, 0x74, 0xe8, + 0x3b, 0x7f, 0x7f, 0x7d, 0x1f, 0x04, 0xb4, 0x26, 0x9b, 0xe0, 0xb4, + 0x5a, 0xac, 0x47, 0x3d, 0x55, 0xb8, 0xd7, 0xb0, 0x26, 0x52, 0x28, + 0x01, 0x31, 0x40, 0x66, 0xd8, 0xd9, 0x24, 0xbd, 0xf6, 0x2a, 0xd8, + 0xec, 0x21, 0x49, 0x5c, 0x9b, 0xf6, 0x7a, 0xe9, 0x7f, 0x55, 0x35, + 0x7e, 0x96, 0x6b, 0x8d, 0x93, 0x93, 0x27, 0xcb, 0x92, 0xbb, 0xea, + 0xac, 0x40, 0xc0, 0x9f, 0xc2, 0xf8, 0x80, 0xcf, 0x5d, 0xf4, 0x5a, + 0xdc, 0xce, 0x74, 0x86, 0xa6, 0x3e, 0x6c, 0x0b, 0x53, 0xca, 0xbd, + 0x92, 0xce, 0x19, 0x06, 0x72, 0xe6, 0x0c, 0x5c, 0x38, 0x69, 0xc7, + 0x04, 0xd6, 0xbc, 0x6c, 0xce, 0x5b, 0xf6, 0xf7, 0x68, 0x9c, 0xdc, + 0x25, 0x15, 0x48, 0x88, 0xa1, 0xe9, 0xa9, 0xf8, 0x98, 0x9c, 0xe0, + 0xf3, 0xd5, 0x31, 0x28, 0x61, 0x11, 0x6c, 0x67, 0x96, 0x8d, 0x39, + 0x99, 0xcb, 0xc2, 0x45, 0x24, 0x39, 0x02, 0x03, 0x01, 0x00, 0x01, + 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, + 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, + 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, + 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, + 0x04, 0x16, 0x04, 0x14, 0xad, 0x6c, 0xaa, 0x94, 0x60, 0x9c, 0xed, + 0xe4, 0xff, 0xfa, 0x3e, 0x0a, 0x74, 0x2b, 0x63, 0x03, 0xf7, 0xb6, + 0x59, 0xbf, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, + 0x1a, 0x40, 0xd8, 0x95, 0x65, 0xac, 0x09, 0x92, 0x89, 0xc6, 0x39, + 0xf4, 0x10, 0xe5, 0xa9, 0x0e, 0x66, 0x53, 0x5d, 0x78, 0xde, 0xfa, + 0x24, 0x91, 0xbb, 0xe7, 0x44, 0x51, 0xdf, 0xc6, 0x16, 0x34, 0x0a, + 0xef, 0x6a, 0x44, 0x51, 0xea, 0x2b, 0x07, 0x8a, 0x03, 0x7a, 0xc3, + 0xeb, 0x3f, 0x0a, 0x2c, 0x52, 0x16, 0xa0, 0x2b, 0x43, 0xb9, 0x25, + 0x90, 0x3f, 0x70, 0xa9, 0x33, 0x25, 0x6d, 0x45, 0x1a, 0x28, 0x3b, + 0x27, 0xcf, 0xaa, 0xc3, 0x29, 0x42, 0x1b, 0xdf, 0x3b, 0x4c, 0xc0, + 0x33, 0x34, 0x5b, 0x41, 0x88, 0xbf, 0x6b, 0x2b, 0x65, 0xaf, 0x28, + 0xef, 0xb2, 0xf5, 0xc3, 0xaa, 0x66, 0xce, 0x7b, 0x56, 0xee, 0xb7, + 0xc8, 0xcb, 0x67, 0xc1, 0xc9, 0x9c, 0x1a, 0x18, 0xb8, 0xc4, 0xc3, + 0x49, 0x03, 0xf1, 0x60, 0x0e, 0x50, 0xcd, 0x46, 0xc5, 0xf3, 0x77, + 0x79, 0xf7, 0xb6, 0x15, 0xe0, 0x38, 0xdb, 0xc7, 0x2f, 0x28, 0xa0, + 0x0c, 0x3f, 0x77, 0x26, 0x74, 0xd9, 0x25, 0x12, 0xda, 0x31, 0xda, + 0x1a, 0x1e, 0xdc, 0x29, 0x41, 0x91, 0x22, 0x3c, 0x69, 0xa7, 0xbb, + 0x02, 0xf2, 0xb6, 0x5c, 0x27, 0x03, 0x89, 0xf4, 0x06, 0xea, 0x9b, + 0xe4, 0x72, 0x82, 0xe3, 0xa1, 0x09, 0xc1, 0xe9, 0x00, 0x19, 0xd3, + 0x3e, 0xd4, 0x70, 0x6b, 0xba, 0x71, 0xa6, 0xaa, 0x58, 0xae, 0xf4, + 0xbb, 0xe9, 0x6c, 0xb6, 0xef, 0x87, 0xcc, 0x9b, 0xbb, 0xff, 0x39, + 0xe6, 0x56, 0x61, 0xd3, 0x0a, 0xa7, 0xc4, 0x5c, 0x4c, 0x60, 0x7b, + 0x05, 0x77, 0x26, 0x7a, 0xbf, 0xd8, 0x07, 0x52, 0x2c, 0x62, 0xf7, + 0x70, 0x63, 0xd9, 0x39, 0xbc, 0x6f, 0x1c, 0xc2, 0x79, 0xdc, 0x76, + 0x29, 0xaf, 0xce, 0xc5, 0x2c, 0x64, 0x04, 0x5e, 0x88, 0x36, 0x6e, + 0x31, 0xd4, 0x40, 0x1a, 0x62, 0x34, 0x36, 0x3f, 0x35, 0x01, 0xae, + 0xac, 0x63, 0xa0, 0x30, 0x82, 0x02, 0xae, 0x30, 0x82, 0x02, 0x35, + 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x3c, 0xb2, 0xf4, 0x48, + 0x0a, 0x00, 0xe2, 0xfe, 0xeb, 0x24, 0x3b, 0x5e, 0x60, 0x3e, 0xc3, + 0x6b, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, + 0x03, 0x03, 0x30, 0x81, 0x98, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x47, 0x65, 0x6f, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x39, + 0x30, 0x37, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x30, 0x28, 0x63, + 0x29, 0x20, 0x32, 0x30, 0x30, 0x37, 0x20, 0x47, 0x65, 0x6f, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x2d, + 0x20, 0x46, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x6e, + 0x6c, 0x79, 0x31, 0x36, 0x30, 0x34, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x2d, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, + 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x43, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, + 0x20, 0x47, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x37, 0x31, 0x31, + 0x30, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, + 0x33, 0x38, 0x30, 0x31, 0x31, 0x38, 0x32, 0x33, 0x35, 0x39, 0x35, + 0x39, 0x5a, 0x30, 0x81, 0x98, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x47, 0x65, 0x6f, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x39, + 0x30, 0x37, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x30, 0x28, 0x63, + 0x29, 0x20, 0x32, 0x30, 0x30, 0x37, 0x20, 0x47, 0x65, 0x6f, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x2d, + 0x20, 0x46, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x6e, + 0x6c, 0x79, 0x31, 0x36, 0x30, 0x34, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x2d, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, + 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x43, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, + 0x20, 0x47, 0x32, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, + 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, + 0x22, 0x03, 0x62, 0x00, 0x04, 0x15, 0xb1, 0xe8, 0xfd, 0x03, 0x15, + 0x43, 0xe5, 0xac, 0xeb, 0x87, 0x37, 0x11, 0x62, 0xef, 0xd2, 0x83, + 0x36, 0x52, 0x7d, 0x45, 0x57, 0x0b, 0x4a, 0x8d, 0x7b, 0x54, 0x3b, + 0x3a, 0x6e, 0x5f, 0x15, 0x02, 0xc0, 0x50, 0xa6, 0xcf, 0x25, 0x2f, + 0x7d, 0xca, 0x48, 0xb8, 0xc7, 0x50, 0x63, 0x1c, 0x2a, 0x21, 0x08, + 0x7c, 0x9a, 0x36, 0xd8, 0x0b, 0xfe, 0xd1, 0x26, 0xc5, 0x58, 0x31, + 0x30, 0x28, 0x25, 0xf3, 0x5d, 0x5d, 0xa3, 0xb8, 0xb6, 0xa5, 0xb4, + 0x92, 0xed, 0x6c, 0x2c, 0x9f, 0xeb, 0xdd, 0x43, 0x89, 0xa2, 0x3c, + 0x4b, 0x48, 0x91, 0x1d, 0x50, 0xec, 0x26, 0xdf, 0xd6, 0x60, 0x2e, + 0xbd, 0x21, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, + 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, + 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, + 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, + 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x15, 0x5f, 0x35, 0x57, 0x51, + 0x55, 0xfb, 0x25, 0xb2, 0xad, 0x03, 0x69, 0xfc, 0x01, 0xa3, 0xfa, + 0xbe, 0x11, 0x55, 0xd5, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, + 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x67, 0x00, 0x30, 0x64, 0x02, + 0x30, 0x64, 0x96, 0x59, 0xa6, 0xe8, 0x09, 0xde, 0x8b, 0xba, 0xfa, + 0x5a, 0x88, 0x88, 0xf0, 0x1f, 0x91, 0xd3, 0x46, 0xa8, 0xf2, 0x4a, + 0x4c, 0x02, 0x63, 0xfb, 0x6c, 0x5f, 0x38, 0xdb, 0x2e, 0x41, 0x93, + 0xa9, 0x0e, 0xe6, 0x9d, 0xdc, 0x31, 0x1c, 0xb2, 0xa0, 0xa7, 0x18, + 0x1c, 0x79, 0xe1, 0xc7, 0x36, 0x02, 0x30, 0x3a, 0x56, 0xaf, 0x9a, + 0x74, 0x6c, 0xf6, 0xfb, 0x83, 0xe0, 0x33, 0xd3, 0x08, 0x5f, 0xa1, + 0x9c, 0xc2, 0x5b, 0x9f, 0x46, 0xd6, 0xb6, 0xcb, 0x91, 0x06, 0x63, + 0xa2, 0x06, 0xe7, 0x33, 0xac, 0x3e, 0xa8, 0x81, 0x12, 0xd0, 0xcb, + 0xba, 0xd0, 0x92, 0x0b, 0xb6, 0x9e, 0x96, 0xaa, 0x04, 0x0f, 0x8a, + 0x30, 0x82, 0x04, 0xb9, 0x30, 0x82, 0x03, 0xa1, 0xa0, 0x03, 0x02, + 0x01, 0x02, 0x02, 0x10, 0x40, 0x1a, 0xc4, 0x64, 0x21, 0xb3, 0x13, + 0x21, 0x03, 0x0e, 0xbb, 0xe4, 0x12, 0x1a, 0xc5, 0x1d, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x30, 0x81, 0xbd, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, @@ -10066,179 +8097,181 @@ static const unsigned char ca_bundle_data[] = { 0x6e, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, 0x22, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, - 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xc7, 0x61, 0x37, 0x5e, - 0xb1, 0x01, 0x34, 0xdb, 0x62, 0xd7, 0x15, 0x9b, 0xff, 0x58, 0x5a, - 0x8c, 0x23, 0x23, 0xd6, 0x60, 0x8e, 0x91, 0xd7, 0x90, 0x98, 0x83, - 0x7a, 0xe6, 0x58, 0x19, 0x38, 0x8c, 0xc5, 0xf6, 0xe5, 0x64, 0x85, - 0xb4, 0xa2, 0x71, 0xfb, 0xed, 0xbd, 0xb9, 0xda, 0xcd, 0x4d, 0x00, - 0xb4, 0xc8, 0x2d, 0x73, 0xa5, 0xc7, 0x69, 0x71, 0x95, 0x1f, 0x39, - 0x3c, 0xb2, 0x44, 0x07, 0x9c, 0xe8, 0x0e, 0xfa, 0x4d, 0x4a, 0xc4, - 0x21, 0xdf, 0x29, 0x61, 0x8f, 0x32, 0x22, 0x61, 0x82, 0xc5, 0x87, - 0x1f, 0x6e, 0x8c, 0x7c, 0x5f, 0x16, 0x20, 0x51, 0x44, 0xd1, 0x70, - 0x4f, 0x57, 0xea, 0xe3, 0x1c, 0xe3, 0xcc, 0x79, 0xee, 0x58, 0xd8, - 0x0e, 0xc2, 0xb3, 0x45, 0x93, 0xc0, 0x2c, 0xe7, 0x9a, 0x17, 0x2b, - 0x7b, 0x00, 0x37, 0x7a, 0x41, 0x33, 0x78, 0xe1, 0x33, 0xe2, 0xf3, - 0x10, 0x1a, 0x7f, 0x87, 0x2c, 0xbe, 0xf6, 0xf5, 0xf7, 0x42, 0xe2, - 0xe5, 0xbf, 0x87, 0x62, 0x89, 0x5f, 0x00, 0x4b, 0xdf, 0xc5, 0xdd, - 0xe4, 0x75, 0x44, 0x32, 0x41, 0x3a, 0x1e, 0x71, 0x6e, 0x69, 0xcb, - 0x0b, 0x75, 0x46, 0x08, 0xd1, 0xca, 0xd2, 0x2b, 0x95, 0xd0, 0xcf, - 0xfb, 0xb9, 0x40, 0x6b, 0x64, 0x8c, 0x57, 0x4d, 0xfc, 0x13, 0x11, - 0x79, 0x84, 0xed, 0x5e, 0x54, 0xf6, 0x34, 0x9f, 0x08, 0x01, 0xf3, - 0x10, 0x25, 0x06, 0x17, 0x4a, 0xda, 0xf1, 0x1d, 0x7a, 0x66, 0x6b, - 0x98, 0x60, 0x66, 0xa4, 0xd9, 0xef, 0xd2, 0x2e, 0x82, 0xf1, 0xf0, - 0xef, 0x09, 0xea, 0x44, 0xc9, 0x15, 0x6a, 0xe2, 0x03, 0x6e, 0x33, - 0xd3, 0xac, 0x9f, 0x55, 0x00, 0xc7, 0xf6, 0x08, 0x6a, 0x94, 0xb9, - 0x5f, 0xdc, 0xe0, 0x33, 0xf1, 0x84, 0x60, 0xf9, 0x5b, 0x27, 0x11, - 0xb4, 0xfc, 0x16, 0xf2, 0xbb, 0x56, 0x6a, 0x80, 0x25, 0x8d, 0x02, - 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xb2, 0x30, 0x81, 0xaf, 0x30, - 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, - 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, - 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, - 0x6d, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x0c, - 0x04, 0x61, 0x30, 0x5f, 0xa1, 0x5d, 0xa0, 0x5b, 0x30, 0x59, 0x30, - 0x57, 0x30, 0x55, 0x16, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, - 0x67, 0x69, 0x66, 0x30, 0x21, 0x30, 0x1f, 0x30, 0x07, 0x06, 0x05, - 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x04, 0x14, 0x8f, 0xe5, 0xd3, 0x1a, - 0x86, 0xac, 0x8d, 0x8e, 0x6b, 0xc3, 0xcf, 0x80, 0x6a, 0xd4, 0x48, - 0x18, 0x2c, 0x7b, 0x19, 0x2e, 0x30, 0x25, 0x16, 0x23, 0x68, 0x74, - 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x76, - 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x76, 0x73, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x67, 0x69, 0x66, - 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, - 0xb6, 0x77, 0xfa, 0x69, 0x48, 0x47, 0x9f, 0x53, 0x12, 0xd5, 0xc2, - 0xea, 0x07, 0x32, 0x76, 0x07, 0xd1, 0x97, 0x07, 0x19, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, - 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x4a, 0xf8, 0xf8, 0xb0, - 0x03, 0xe6, 0x2c, 0x67, 0x7b, 0xe4, 0x94, 0x77, 0x63, 0xcc, 0x6e, - 0x4c, 0xf9, 0x7d, 0x0e, 0x0d, 0xdc, 0xc8, 0xb9, 0x35, 0xb9, 0x70, - 0x4f, 0x63, 0xfa, 0x24, 0xfa, 0x6c, 0x83, 0x8c, 0x47, 0x9d, 0x3b, - 0x63, 0xf3, 0x9a, 0xf9, 0x76, 0x32, 0x95, 0x91, 0xb1, 0x77, 0xbc, - 0xac, 0x9a, 0xbe, 0xb1, 0xe4, 0x31, 0x21, 0xc6, 0x81, 0x95, 0x56, - 0x5a, 0x0e, 0xb1, 0xc2, 0xd4, 0xb1, 0xa6, 0x59, 0xac, 0xf1, 0x63, - 0xcb, 0xb8, 0x4c, 0x1d, 0x59, 0x90, 0x4a, 0xef, 0x90, 0x16, 0x28, - 0x1f, 0x5a, 0xae, 0x10, 0xfb, 0x81, 0x50, 0x38, 0x0c, 0x6c, 0xcc, - 0xf1, 0x3d, 0xc3, 0xf5, 0x63, 0xe3, 0xb3, 0xe3, 0x21, 0xc9, 0x24, - 0x39, 0xe9, 0xfd, 0x15, 0x66, 0x46, 0xf4, 0x1b, 0x11, 0xd0, 0x4d, - 0x73, 0xa3, 0x7d, 0x46, 0xf9, 0x3d, 0xed, 0xa8, 0x5f, 0x62, 0xd4, - 0xf1, 0x3f, 0xf8, 0xe0, 0x74, 0x57, 0x2b, 0x18, 0x9d, 0x81, 0xb4, - 0xc4, 0x28, 0xda, 0x94, 0x97, 0xa5, 0x70, 0xeb, 0xac, 0x1d, 0xbe, - 0x07, 0x11, 0xf0, 0xd5, 0xdb, 0xdd, 0xe5, 0x8c, 0xf0, 0xd5, 0x32, - 0xb0, 0x83, 0xe6, 0x57, 0xe2, 0x8f, 0xbf, 0xbe, 0xa1, 0xaa, 0xbf, - 0x3d, 0x1d, 0xb5, 0xd4, 0x38, 0xea, 0xd7, 0xb0, 0x5c, 0x3a, 0x4f, - 0x6a, 0x3f, 0x8f, 0xc0, 0x66, 0x6c, 0x63, 0xaa, 0xe9, 0xd9, 0xa4, - 0x16, 0xf4, 0x81, 0xd1, 0x95, 0x14, 0x0e, 0x7d, 0xcd, 0x95, 0x34, - 0xd9, 0xd2, 0x8f, 0x70, 0x73, 0x81, 0x7b, 0x9c, 0x7e, 0xbd, 0x98, - 0x61, 0xd8, 0x45, 0x87, 0x98, 0x90, 0xc5, 0xeb, 0x86, 0x30, 0xc6, - 0x35, 0xbf, 0xf0, 0xff, 0xc3, 0x55, 0x88, 0x83, 0x4b, 0xef, 0x05, - 0x92, 0x06, 0x71, 0xf2, 0xb8, 0x98, 0x93, 0xb7, 0xec, 0xcd, 0x82, - 0x61, 0xf1, 0x38, 0xe6, 0x4f, 0x97, 0x98, 0x2a, 0x5a, 0x8d, 0x30, - 0x82, 0x03, 0x84, 0x30, 0x82, 0x03, 0x0a, 0xa0, 0x03, 0x02, 0x01, - 0x02, 0x02, 0x10, 0x2f, 0x80, 0xfe, 0x23, 0x8c, 0x0e, 0x22, 0x0f, - 0x48, 0x67, 0x12, 0x28, 0x91, 0x87, 0xac, 0xb3, 0x30, 0x0a, 0x06, - 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x81, - 0xca, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, - 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, - 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x1f, 0x30, 0x1d, 0x06, - 0x03, 0x55, 0x04, 0x0b, 0x13, 0x16, 0x56, 0x65, 0x72, 0x69, 0x53, - 0x69, 0x67, 0x6e, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x3a, 0x30, 0x38, 0x06, - 0x03, 0x55, 0x04, 0x0b, 0x13, 0x31, 0x28, 0x63, 0x29, 0x20, 0x32, - 0x30, 0x30, 0x37, 0x20, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, - 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x2d, 0x20, 0x46, - 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, - 0x31, 0x45, 0x30, 0x43, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x3c, - 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x43, + 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, + 0x30, 0x38, 0x30, 0x34, 0x30, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x37, 0x31, 0x32, 0x30, 0x31, 0x32, + 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0xbd, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, + 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0e, + 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x49, + 0x6e, 0x63, 0x2e, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, + 0x0b, 0x13, 0x16, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, + 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x31, 0x3a, 0x30, 0x38, 0x06, 0x03, 0x55, 0x04, + 0x0b, 0x13, 0x31, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x38, + 0x20, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x2c, 0x20, + 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x2d, 0x20, 0x46, 0x6f, 0x72, 0x20, + 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, + 0x75, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x31, 0x38, 0x30, + 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2f, 0x56, 0x65, 0x72, + 0x69, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, + 0x72, 0x73, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x20, 0x2d, 0x20, 0x47, 0x34, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x37, - 0x31, 0x31, 0x30, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, - 0x17, 0x0d, 0x33, 0x38, 0x30, 0x31, 0x31, 0x38, 0x32, 0x33, 0x35, - 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0xca, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x17, - 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0e, 0x56, 0x65, - 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, - 0x2e, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, - 0x16, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x54, - 0x72, 0x75, 0x73, 0x74, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x31, 0x3a, 0x30, 0x38, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, - 0x31, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x37, 0x20, 0x56, - 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x49, 0x6e, - 0x63, 0x2e, 0x20, 0x2d, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, 0x73, - 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x31, 0x45, 0x30, 0x43, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x13, 0x3c, 0x56, 0x65, 0x72, 0x69, 0x53, - 0x69, 0x67, 0x6e, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x50, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x34, - 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, - 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, - 0x00, 0x04, 0xa7, 0x56, 0x7a, 0x7c, 0x52, 0xda, 0x64, 0x9b, 0x0e, - 0x2d, 0x5c, 0xd8, 0x5e, 0xac, 0x92, 0x3d, 0xfe, 0x01, 0xe6, 0x19, - 0x4a, 0x3d, 0x14, 0x03, 0x4b, 0xfa, 0x60, 0x27, 0x20, 0xd9, 0x83, - 0x89, 0x69, 0xfa, 0x54, 0xc6, 0x9a, 0x18, 0x5e, 0x55, 0x2a, 0x64, - 0xde, 0x06, 0xf6, 0x8d, 0x4a, 0x3b, 0xad, 0x10, 0x3c, 0x65, 0x3d, - 0x90, 0x88, 0x04, 0x89, 0xe0, 0x30, 0x61, 0xb3, 0xae, 0x5d, 0x01, - 0xa7, 0x7b, 0xde, 0x7c, 0xb2, 0xbe, 0xca, 0x65, 0x61, 0x00, 0x86, - 0xae, 0xda, 0x8f, 0x7b, 0xd0, 0x89, 0xad, 0x4d, 0x1d, 0x59, 0x9a, - 0x41, 0xb1, 0xbc, 0x47, 0x80, 0xdc, 0x9e, 0x62, 0xc3, 0xf9, 0xa3, - 0x81, 0xb2, 0x30, 0x81, 0xaf, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, - 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, - 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, - 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x6d, 0x06, 0x08, 0x2b, 0x06, - 0x01, 0x05, 0x05, 0x07, 0x01, 0x0c, 0x04, 0x61, 0x30, 0x5f, 0xa1, - 0x5d, 0xa0, 0x5b, 0x30, 0x59, 0x30, 0x57, 0x30, 0x55, 0x16, 0x09, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x67, 0x69, 0x66, 0x30, 0x21, - 0x30, 0x1f, 0x30, 0x07, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, - 0x04, 0x14, 0x8f, 0xe5, 0xd3, 0x1a, 0x86, 0xac, 0x8d, 0x8e, 0x6b, - 0xc3, 0xcf, 0x80, 0x6a, 0xd4, 0x48, 0x18, 0x2c, 0x7b, 0x19, 0x2e, - 0x30, 0x25, 0x16, 0x23, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, - 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, - 0x67, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x76, 0x73, 0x6c, 0x6f, - 0x67, 0x6f, 0x2e, 0x67, 0x69, 0x66, 0x30, 0x1d, 0x06, 0x03, 0x55, - 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xb3, 0x16, 0x91, 0xfd, 0xee, - 0xa6, 0x6e, 0xe4, 0xb5, 0x2e, 0x49, 0x8f, 0x87, 0x78, 0x81, 0x80, - 0xec, 0xe5, 0xb1, 0xb5, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, - 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x68, 0x00, 0x30, 0x65, 0x02, - 0x30, 0x66, 0x21, 0x0c, 0x18, 0x26, 0x60, 0x5a, 0x38, 0x7b, 0x56, - 0x42, 0xe0, 0xa7, 0xfc, 0x36, 0x84, 0x51, 0x91, 0x20, 0x2c, 0x76, - 0x4d, 0x43, 0x3d, 0xc4, 0x1d, 0x84, 0x23, 0xd0, 0xac, 0xd6, 0x7c, - 0x35, 0x06, 0xce, 0xcd, 0x69, 0xbd, 0x90, 0x0d, 0xdb, 0x6c, 0x48, - 0x42, 0x1d, 0x0e, 0xaa, 0x42, 0x02, 0x31, 0x00, 0x9c, 0x3d, 0x48, - 0x39, 0x23, 0x39, 0x58, 0x1a, 0x15, 0x12, 0x59, 0x6a, 0x9e, 0xef, - 0xd5, 0x59, 0xb2, 0x1d, 0x52, 0x2c, 0x99, 0x71, 0xcd, 0xc7, 0x29, - 0xdf, 0x1b, 0x2a, 0x61, 0x7b, 0x71, 0xd1, 0xde, 0xf3, 0xc0, 0xe5, - 0x0d, 0x3a, 0x4a, 0xaa, 0x2d, 0xa7, 0xd8, 0x86, 0x2a, 0xdd, 0x2e, - 0x10, 0x30, 0x82, 0x04, 0x15, 0x30, 0x82, 0x02, 0xfd, 0xa0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x06, 0x49, 0x41, 0x2c, 0xe4, 0x00, 0x10, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0xa7, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x48, 0x55, 0x31, 0x11, - 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x08, 0x42, 0x75, - 0x64, 0x61, 0x70, 0x65, 0x73, 0x74, 0x31, 0x15, 0x30, 0x13, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0c, 0x4e, 0x65, 0x74, 0x4c, 0x6f, - 0x63, 0x6b, 0x20, 0x4b, 0x66, 0x74, 0x2e, 0x31, 0x37, 0x30, 0x35, - 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x2e, 0x54, 0x61, 0x6e, 0xc3, - 0xba, 0x73, 0xc3, 0xad, 0x74, 0x76, 0xc3, 0xa1, 0x6e, 0x79, 0x6b, - 0x69, 0x61, 0x64, 0xc3, 0xb3, 0x6b, 0x20, 0x28, 0x43, 0x65, 0x72, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x29, 0x31, 0x35, - 0x30, 0x33, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2c, 0x4e, 0x65, - 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x41, 0x72, 0x61, 0x6e, 0x79, - 0x20, 0x28, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x47, 0x6f, 0x6c, - 0x64, 0x29, 0x20, 0x46, 0xc5, 0x91, 0x74, 0x61, 0x6e, 0xc3, 0xba, - 0x73, 0xc3, 0xad, 0x74, 0x76, 0xc3, 0xa1, 0x6e, 0x79, 0x30, 0x1e, - 0x17, 0x0d, 0x30, 0x38, 0x31, 0x32, 0x31, 0x31, 0x31, 0x35, 0x30, - 0x38, 0x32, 0x31, 0x5a, 0x17, 0x0d, 0x32, 0x38, 0x31, 0x32, 0x30, - 0x36, 0x31, 0x35, 0x30, 0x38, 0x32, 0x31, 0x5a, 0x30, 0x81, 0xa7, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, + 0xc7, 0x61, 0x37, 0x5e, 0xb1, 0x01, 0x34, 0xdb, 0x62, 0xd7, 0x15, + 0x9b, 0xff, 0x58, 0x5a, 0x8c, 0x23, 0x23, 0xd6, 0x60, 0x8e, 0x91, + 0xd7, 0x90, 0x98, 0x83, 0x7a, 0xe6, 0x58, 0x19, 0x38, 0x8c, 0xc5, + 0xf6, 0xe5, 0x64, 0x85, 0xb4, 0xa2, 0x71, 0xfb, 0xed, 0xbd, 0xb9, + 0xda, 0xcd, 0x4d, 0x00, 0xb4, 0xc8, 0x2d, 0x73, 0xa5, 0xc7, 0x69, + 0x71, 0x95, 0x1f, 0x39, 0x3c, 0xb2, 0x44, 0x07, 0x9c, 0xe8, 0x0e, + 0xfa, 0x4d, 0x4a, 0xc4, 0x21, 0xdf, 0x29, 0x61, 0x8f, 0x32, 0x22, + 0x61, 0x82, 0xc5, 0x87, 0x1f, 0x6e, 0x8c, 0x7c, 0x5f, 0x16, 0x20, + 0x51, 0x44, 0xd1, 0x70, 0x4f, 0x57, 0xea, 0xe3, 0x1c, 0xe3, 0xcc, + 0x79, 0xee, 0x58, 0xd8, 0x0e, 0xc2, 0xb3, 0x45, 0x93, 0xc0, 0x2c, + 0xe7, 0x9a, 0x17, 0x2b, 0x7b, 0x00, 0x37, 0x7a, 0x41, 0x33, 0x78, + 0xe1, 0x33, 0xe2, 0xf3, 0x10, 0x1a, 0x7f, 0x87, 0x2c, 0xbe, 0xf6, + 0xf5, 0xf7, 0x42, 0xe2, 0xe5, 0xbf, 0x87, 0x62, 0x89, 0x5f, 0x00, + 0x4b, 0xdf, 0xc5, 0xdd, 0xe4, 0x75, 0x44, 0x32, 0x41, 0x3a, 0x1e, + 0x71, 0x6e, 0x69, 0xcb, 0x0b, 0x75, 0x46, 0x08, 0xd1, 0xca, 0xd2, + 0x2b, 0x95, 0xd0, 0xcf, 0xfb, 0xb9, 0x40, 0x6b, 0x64, 0x8c, 0x57, + 0x4d, 0xfc, 0x13, 0x11, 0x79, 0x84, 0xed, 0x5e, 0x54, 0xf6, 0x34, + 0x9f, 0x08, 0x01, 0xf3, 0x10, 0x25, 0x06, 0x17, 0x4a, 0xda, 0xf1, + 0x1d, 0x7a, 0x66, 0x6b, 0x98, 0x60, 0x66, 0xa4, 0xd9, 0xef, 0xd2, + 0x2e, 0x82, 0xf1, 0xf0, 0xef, 0x09, 0xea, 0x44, 0xc9, 0x15, 0x6a, + 0xe2, 0x03, 0x6e, 0x33, 0xd3, 0xac, 0x9f, 0x55, 0x00, 0xc7, 0xf6, + 0x08, 0x6a, 0x94, 0xb9, 0x5f, 0xdc, 0xe0, 0x33, 0xf1, 0x84, 0x60, + 0xf9, 0x5b, 0x27, 0x11, 0xb4, 0xfc, 0x16, 0xf2, 0xbb, 0x56, 0x6a, + 0x80, 0x25, 0x8d, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xb2, + 0x30, 0x81, 0xaf, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, + 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, + 0x02, 0x01, 0x06, 0x30, 0x6d, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, + 0x05, 0x07, 0x01, 0x0c, 0x04, 0x61, 0x30, 0x5f, 0xa1, 0x5d, 0xa0, + 0x5b, 0x30, 0x59, 0x30, 0x57, 0x30, 0x55, 0x16, 0x09, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x2f, 0x67, 0x69, 0x66, 0x30, 0x21, 0x30, 0x1f, + 0x30, 0x07, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x04, 0x14, + 0x8f, 0xe5, 0xd3, 0x1a, 0x86, 0xac, 0x8d, 0x8e, 0x6b, 0xc3, 0xcf, + 0x80, 0x6a, 0xd4, 0x48, 0x18, 0x2c, 0x7b, 0x19, 0x2e, 0x30, 0x25, + 0x16, 0x23, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6c, 0x6f, + 0x67, 0x6f, 0x2e, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6e, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x76, 0x73, 0x6c, 0x6f, 0x67, 0x6f, + 0x2e, 0x67, 0x69, 0x66, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, + 0x04, 0x16, 0x04, 0x14, 0xb6, 0x77, 0xfa, 0x69, 0x48, 0x47, 0x9f, + 0x53, 0x12, 0xd5, 0xc2, 0xea, 0x07, 0x32, 0x76, 0x07, 0xd1, 0x97, + 0x07, 0x19, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, + 0x4a, 0xf8, 0xf8, 0xb0, 0x03, 0xe6, 0x2c, 0x67, 0x7b, 0xe4, 0x94, + 0x77, 0x63, 0xcc, 0x6e, 0x4c, 0xf9, 0x7d, 0x0e, 0x0d, 0xdc, 0xc8, + 0xb9, 0x35, 0xb9, 0x70, 0x4f, 0x63, 0xfa, 0x24, 0xfa, 0x6c, 0x83, + 0x8c, 0x47, 0x9d, 0x3b, 0x63, 0xf3, 0x9a, 0xf9, 0x76, 0x32, 0x95, + 0x91, 0xb1, 0x77, 0xbc, 0xac, 0x9a, 0xbe, 0xb1, 0xe4, 0x31, 0x21, + 0xc6, 0x81, 0x95, 0x56, 0x5a, 0x0e, 0xb1, 0xc2, 0xd4, 0xb1, 0xa6, + 0x59, 0xac, 0xf1, 0x63, 0xcb, 0xb8, 0x4c, 0x1d, 0x59, 0x90, 0x4a, + 0xef, 0x90, 0x16, 0x28, 0x1f, 0x5a, 0xae, 0x10, 0xfb, 0x81, 0x50, + 0x38, 0x0c, 0x6c, 0xcc, 0xf1, 0x3d, 0xc3, 0xf5, 0x63, 0xe3, 0xb3, + 0xe3, 0x21, 0xc9, 0x24, 0x39, 0xe9, 0xfd, 0x15, 0x66, 0x46, 0xf4, + 0x1b, 0x11, 0xd0, 0x4d, 0x73, 0xa3, 0x7d, 0x46, 0xf9, 0x3d, 0xed, + 0xa8, 0x5f, 0x62, 0xd4, 0xf1, 0x3f, 0xf8, 0xe0, 0x74, 0x57, 0x2b, + 0x18, 0x9d, 0x81, 0xb4, 0xc4, 0x28, 0xda, 0x94, 0x97, 0xa5, 0x70, + 0xeb, 0xac, 0x1d, 0xbe, 0x07, 0x11, 0xf0, 0xd5, 0xdb, 0xdd, 0xe5, + 0x8c, 0xf0, 0xd5, 0x32, 0xb0, 0x83, 0xe6, 0x57, 0xe2, 0x8f, 0xbf, + 0xbe, 0xa1, 0xaa, 0xbf, 0x3d, 0x1d, 0xb5, 0xd4, 0x38, 0xea, 0xd7, + 0xb0, 0x5c, 0x3a, 0x4f, 0x6a, 0x3f, 0x8f, 0xc0, 0x66, 0x6c, 0x63, + 0xaa, 0xe9, 0xd9, 0xa4, 0x16, 0xf4, 0x81, 0xd1, 0x95, 0x14, 0x0e, + 0x7d, 0xcd, 0x95, 0x34, 0xd9, 0xd2, 0x8f, 0x70, 0x73, 0x81, 0x7b, + 0x9c, 0x7e, 0xbd, 0x98, 0x61, 0xd8, 0x45, 0x87, 0x98, 0x90, 0xc5, + 0xeb, 0x86, 0x30, 0xc6, 0x35, 0xbf, 0xf0, 0xff, 0xc3, 0x55, 0x88, + 0x83, 0x4b, 0xef, 0x05, 0x92, 0x06, 0x71, 0xf2, 0xb8, 0x98, 0x93, + 0xb7, 0xec, 0xcd, 0x82, 0x61, 0xf1, 0x38, 0xe6, 0x4f, 0x97, 0x98, + 0x2a, 0x5a, 0x8d, 0x30, 0x82, 0x03, 0x84, 0x30, 0x82, 0x03, 0x0a, + 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x2f, 0x80, 0xfe, 0x23, + 0x8c, 0x0e, 0x22, 0x0f, 0x48, 0x67, 0x12, 0x28, 0x91, 0x87, 0xac, + 0xb3, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, + 0x03, 0x03, 0x30, 0x81, 0xca, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0e, 0x56, 0x65, 0x72, 0x69, + 0x53, 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, + 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x16, 0x56, + 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x54, 0x72, 0x75, + 0x73, 0x74, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, + 0x3a, 0x30, 0x38, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x31, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x37, 0x20, 0x56, 0x65, 0x72, + 0x69, 0x53, 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, + 0x20, 0x2d, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, + 0x6f, 0x6e, 0x6c, 0x79, 0x31, 0x45, 0x30, 0x43, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x3c, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, + 0x6e, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x50, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x34, 0x30, 0x1e, + 0x17, 0x0d, 0x30, 0x37, 0x31, 0x31, 0x30, 0x35, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x31, 0x31, + 0x38, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0xca, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x13, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x2c, + 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, + 0x55, 0x04, 0x0b, 0x13, 0x16, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, + 0x67, 0x6e, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x3a, 0x30, 0x38, 0x06, 0x03, + 0x55, 0x04, 0x0b, 0x13, 0x31, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, + 0x30, 0x37, 0x20, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, + 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x2d, 0x20, 0x46, 0x6f, + 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, + 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x31, + 0x45, 0x30, 0x43, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x3c, 0x56, + 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x20, 0x33, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, + 0x2d, 0x20, 0x47, 0x34, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, + 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, + 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0xa7, 0x56, 0x7a, 0x7c, 0x52, + 0xda, 0x64, 0x9b, 0x0e, 0x2d, 0x5c, 0xd8, 0x5e, 0xac, 0x92, 0x3d, + 0xfe, 0x01, 0xe6, 0x19, 0x4a, 0x3d, 0x14, 0x03, 0x4b, 0xfa, 0x60, + 0x27, 0x20, 0xd9, 0x83, 0x89, 0x69, 0xfa, 0x54, 0xc6, 0x9a, 0x18, + 0x5e, 0x55, 0x2a, 0x64, 0xde, 0x06, 0xf6, 0x8d, 0x4a, 0x3b, 0xad, + 0x10, 0x3c, 0x65, 0x3d, 0x90, 0x88, 0x04, 0x89, 0xe0, 0x30, 0x61, + 0xb3, 0xae, 0x5d, 0x01, 0xa7, 0x7b, 0xde, 0x7c, 0xb2, 0xbe, 0xca, + 0x65, 0x61, 0x00, 0x86, 0xae, 0xda, 0x8f, 0x7b, 0xd0, 0x89, 0xad, + 0x4d, 0x1d, 0x59, 0x9a, 0x41, 0xb1, 0xbc, 0x47, 0x80, 0xdc, 0x9e, + 0x62, 0xc3, 0xf9, 0xa3, 0x81, 0xb2, 0x30, 0x81, 0xaf, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, + 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, + 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x6d, + 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x0c, 0x04, + 0x61, 0x30, 0x5f, 0xa1, 0x5d, 0xa0, 0x5b, 0x30, 0x59, 0x30, 0x57, + 0x30, 0x55, 0x16, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x67, + 0x69, 0x66, 0x30, 0x21, 0x30, 0x1f, 0x30, 0x07, 0x06, 0x05, 0x2b, + 0x0e, 0x03, 0x02, 0x1a, 0x04, 0x14, 0x8f, 0xe5, 0xd3, 0x1a, 0x86, + 0xac, 0x8d, 0x8e, 0x6b, 0xc3, 0xcf, 0x80, 0x6a, 0xd4, 0x48, 0x18, + 0x2c, 0x7b, 0x19, 0x2e, 0x30, 0x25, 0x16, 0x23, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x76, 0x65, + 0x72, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x76, 0x73, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x67, 0x69, 0x66, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xb3, + 0x16, 0x91, 0xfd, 0xee, 0xa6, 0x6e, 0xe4, 0xb5, 0x2e, 0x49, 0x8f, + 0x87, 0x78, 0x81, 0x80, 0xec, 0xe5, 0xb1, 0xb5, 0x30, 0x0a, 0x06, + 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x68, + 0x00, 0x30, 0x65, 0x02, 0x30, 0x66, 0x21, 0x0c, 0x18, 0x26, 0x60, + 0x5a, 0x38, 0x7b, 0x56, 0x42, 0xe0, 0xa7, 0xfc, 0x36, 0x84, 0x51, + 0x91, 0x20, 0x2c, 0x76, 0x4d, 0x43, 0x3d, 0xc4, 0x1d, 0x84, 0x23, + 0xd0, 0xac, 0xd6, 0x7c, 0x35, 0x06, 0xce, 0xcd, 0x69, 0xbd, 0x90, + 0x0d, 0xdb, 0x6c, 0x48, 0x42, 0x1d, 0x0e, 0xaa, 0x42, 0x02, 0x31, + 0x00, 0x9c, 0x3d, 0x48, 0x39, 0x23, 0x39, 0x58, 0x1a, 0x15, 0x12, + 0x59, 0x6a, 0x9e, 0xef, 0xd5, 0x59, 0xb2, 0x1d, 0x52, 0x2c, 0x99, + 0x71, 0xcd, 0xc7, 0x29, 0xdf, 0x1b, 0x2a, 0x61, 0x7b, 0x71, 0xd1, + 0xde, 0xf3, 0xc0, 0xe5, 0x0d, 0x3a, 0x4a, 0xaa, 0x2d, 0xa7, 0xd8, + 0x86, 0x2a, 0xdd, 0x2e, 0x10, 0x30, 0x82, 0x04, 0x15, 0x30, 0x82, + 0x02, 0xfd, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x06, 0x49, 0x41, + 0x2c, 0xe4, 0x00, 0x10, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0xa7, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x48, 0x55, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x08, 0x42, 0x75, 0x64, 0x61, 0x70, 0x65, 0x73, 0x74, 0x31, @@ -10254,749 +8287,715 @@ static const unsigned char ca_bundle_data[] = { 0x72, 0x61, 0x6e, 0x79, 0x20, 0x28, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x47, 0x6f, 0x6c, 0x64, 0x29, 0x20, 0x46, 0xc5, 0x91, 0x74, 0x61, 0x6e, 0xc3, 0xba, 0x73, 0xc3, 0xad, 0x74, 0x76, 0xc3, 0xa1, - 0x6e, 0x79, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x6e, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x31, 0x32, 0x31, + 0x31, 0x31, 0x35, 0x30, 0x38, 0x32, 0x31, 0x5a, 0x17, 0x0d, 0x32, + 0x38, 0x31, 0x32, 0x30, 0x36, 0x31, 0x35, 0x30, 0x38, 0x32, 0x31, + 0x5a, 0x30, 0x81, 0xa7, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x48, 0x55, 0x31, 0x11, 0x30, 0x0f, 0x06, + 0x03, 0x55, 0x04, 0x07, 0x0c, 0x08, 0x42, 0x75, 0x64, 0x61, 0x70, + 0x65, 0x73, 0x74, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x0c, 0x0c, 0x4e, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x20, + 0x4b, 0x66, 0x74, 0x2e, 0x31, 0x37, 0x30, 0x35, 0x06, 0x03, 0x55, + 0x04, 0x0b, 0x0c, 0x2e, 0x54, 0x61, 0x6e, 0xc3, 0xba, 0x73, 0xc3, + 0xad, 0x74, 0x76, 0xc3, 0xa1, 0x6e, 0x79, 0x6b, 0x69, 0x61, 0x64, + 0xc3, 0xb3, 0x6b, 0x20, 0x28, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x29, 0x31, 0x35, 0x30, 0x33, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2c, 0x4e, 0x65, 0x74, 0x4c, 0x6f, + 0x63, 0x6b, 0x20, 0x41, 0x72, 0x61, 0x6e, 0x79, 0x20, 0x28, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x20, 0x47, 0x6f, 0x6c, 0x64, 0x29, 0x20, + 0x46, 0xc5, 0x91, 0x74, 0x61, 0x6e, 0xc3, 0xba, 0x73, 0xc3, 0xad, + 0x74, 0x76, 0xc3, 0xa1, 0x6e, 0x79, 0x30, 0x82, 0x01, 0x22, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, + 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xc4, 0x24, 0x5e, 0x73, 0xbe, + 0x4b, 0x6d, 0x14, 0xc3, 0xa1, 0xf4, 0xe3, 0x97, 0x90, 0x6e, 0xd2, + 0x30, 0x45, 0x1e, 0x3c, 0xee, 0x67, 0xd9, 0x64, 0xe0, 0x1a, 0x8a, + 0x7f, 0xca, 0x30, 0xca, 0x83, 0xe3, 0x20, 0xc1, 0xe3, 0xf4, 0x3a, + 0xd3, 0x94, 0x5f, 0x1a, 0x7c, 0x5b, 0x6d, 0xbf, 0x30, 0x4f, 0x84, + 0x27, 0xf6, 0x9f, 0x1f, 0x49, 0xbc, 0xc6, 0x99, 0x0a, 0x90, 0xf2, + 0x0f, 0xf5, 0x7f, 0x43, 0x84, 0x37, 0x63, 0x51, 0x8b, 0x7a, 0xa5, + 0x70, 0xfc, 0x7a, 0x58, 0xcd, 0x8e, 0x9b, 0xed, 0xc3, 0x46, 0x6c, + 0x84, 0x70, 0x5d, 0xda, 0xf3, 0x01, 0x90, 0x23, 0xfc, 0x4e, 0x30, + 0xa9, 0x7e, 0xe1, 0x27, 0x63, 0xe7, 0xed, 0x64, 0x3c, 0xa0, 0xb8, + 0xc9, 0x33, 0x63, 0xfe, 0x16, 0x90, 0xff, 0xb0, 0xb8, 0xfd, 0xd7, + 0xa8, 0xc0, 0xc0, 0x94, 0x43, 0x0b, 0xb6, 0xd5, 0x59, 0xa6, 0x9e, + 0x56, 0xd0, 0x24, 0x1f, 0x70, 0x79, 0xaf, 0xdb, 0x39, 0x54, 0x0d, + 0x65, 0x75, 0xd9, 0x15, 0x41, 0x94, 0x01, 0xaf, 0x5e, 0xec, 0xf6, + 0x8d, 0xf1, 0xff, 0xad, 0x64, 0xfe, 0x20, 0x9a, 0xd7, 0x5c, 0xeb, + 0xfe, 0xa6, 0x1f, 0x08, 0x64, 0xa3, 0x8b, 0x76, 0x55, 0xad, 0x1e, + 0x3b, 0x28, 0x60, 0x2e, 0x87, 0x25, 0xe8, 0xaa, 0xaf, 0x1f, 0xc6, + 0x64, 0x46, 0x20, 0xb7, 0x70, 0x7f, 0x3c, 0xde, 0x48, 0xdb, 0x96, + 0x53, 0xb7, 0x39, 0x77, 0xe4, 0x1a, 0xe2, 0xc7, 0x16, 0x84, 0x76, + 0x97, 0x5b, 0x2f, 0xbb, 0x19, 0x15, 0x85, 0xf8, 0x69, 0x85, 0xf5, + 0x99, 0xa7, 0xa9, 0xf2, 0x34, 0xa7, 0xa9, 0xb6, 0xa6, 0x03, 0xfc, + 0x6f, 0x86, 0x3d, 0x54, 0x7c, 0x76, 0x04, 0x9b, 0x6b, 0xf9, 0x40, + 0x5d, 0x00, 0x34, 0xc7, 0x2e, 0x99, 0x75, 0x9d, 0xe5, 0x88, 0x03, + 0xaa, 0x4d, 0xf8, 0x03, 0xd2, 0x42, 0x76, 0xc0, 0x1b, 0x02, 0x03, + 0x00, 0xa8, 0x8b, 0xa3, 0x45, 0x30, 0x43, 0x30, 0x12, 0x06, 0x03, + 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, + 0x01, 0xff, 0x02, 0x01, 0x04, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, + 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xcc, + 0xfa, 0x67, 0x93, 0xf0, 0xb6, 0xb8, 0xd0, 0xa5, 0xc0, 0x1e, 0xf3, + 0x53, 0xfd, 0x8c, 0x53, 0xdf, 0x83, 0xd7, 0x96, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xab, 0x7f, 0xee, 0x1c, 0x16, + 0xa9, 0x9c, 0x3c, 0x51, 0x00, 0xa0, 0xc0, 0x11, 0x08, 0x05, 0xa7, + 0x99, 0xe6, 0x6f, 0x01, 0x88, 0x54, 0x61, 0x6e, 0xf1, 0xb9, 0x18, + 0xad, 0x4a, 0xad, 0xfe, 0x81, 0x40, 0x23, 0x94, 0x2f, 0xfb, 0x75, + 0x7c, 0x2f, 0x28, 0x4b, 0x62, 0x24, 0x81, 0x82, 0x0b, 0xf5, 0x61, + 0xf1, 0x1c, 0x6e, 0xb8, 0x61, 0x38, 0xeb, 0x81, 0xfa, 0x62, 0xa1, + 0x3b, 0x5a, 0x62, 0xd3, 0x94, 0x65, 0xc4, 0xe1, 0xe6, 0x6d, 0x82, + 0xf8, 0x2f, 0x25, 0x70, 0xb2, 0x21, 0x26, 0xc1, 0x72, 0x51, 0x1f, + 0x8c, 0x2c, 0xc3, 0x84, 0x90, 0xc3, 0x5a, 0x8f, 0xba, 0xcf, 0xf4, + 0xa7, 0x65, 0xa5, 0xeb, 0x98, 0xd1, 0xfb, 0x05, 0xb2, 0x46, 0x75, + 0x15, 0x23, 0x6a, 0x6f, 0x85, 0x63, 0x30, 0x80, 0xf0, 0xd5, 0x9e, + 0x1f, 0x29, 0x1c, 0xc2, 0x6c, 0xb0, 0x50, 0x59, 0x5d, 0x90, 0x5b, + 0x3b, 0xa8, 0x0d, 0x30, 0xcf, 0xbf, 0x7d, 0x7f, 0xce, 0xf1, 0x9d, + 0x83, 0xbd, 0xc9, 0x46, 0x6e, 0x20, 0xa6, 0xf9, 0x61, 0x51, 0xba, + 0x21, 0x2f, 0x7b, 0xbe, 0xa5, 0x15, 0x63, 0xa1, 0xd4, 0x95, 0x87, + 0xf1, 0x9e, 0xb9, 0xf3, 0x89, 0xf3, 0x3d, 0x85, 0xb8, 0xb8, 0xdb, + 0xbe, 0xb5, 0xb9, 0x29, 0xf9, 0xda, 0x37, 0x05, 0x00, 0x49, 0x94, + 0x03, 0x84, 0x44, 0xe7, 0xbf, 0x43, 0x31, 0xcf, 0x75, 0x8b, 0x25, + 0xd1, 0xf4, 0xa6, 0x64, 0xf5, 0x92, 0xf6, 0xab, 0x05, 0xeb, 0x3d, + 0xe9, 0xa5, 0x0b, 0x36, 0x62, 0xda, 0xcc, 0x06, 0x5f, 0x36, 0x8b, + 0xb6, 0x5e, 0x31, 0xb8, 0x2a, 0xfb, 0x5e, 0xf6, 0x71, 0xdf, 0x44, + 0x26, 0x9e, 0xc4, 0xe6, 0x0d, 0x91, 0xb4, 0x2e, 0x75, 0x95, 0x80, + 0x51, 0x6a, 0x4b, 0x30, 0xa6, 0xb0, 0x62, 0xa1, 0x93, 0xf1, 0x9b, + 0xd8, 0xce, 0xc4, 0x63, 0x75, 0x3f, 0x59, 0x47, 0xb1, 0x30, 0x82, + 0x05, 0xca, 0x30, 0x82, 0x03, 0xb2, 0xa0, 0x03, 0x02, 0x01, 0x02, + 0x02, 0x04, 0x00, 0x98, 0x96, 0x8c, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, + 0x5a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x4e, 0x4c, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x0c, 0x15, 0x53, 0x74, 0x61, 0x61, 0x74, 0x20, 0x64, 0x65, + 0x72, 0x20, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, + 0x65, 0x6e, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0c, 0x22, 0x53, 0x74, 0x61, 0x61, 0x74, 0x20, 0x64, 0x65, 0x72, + 0x20, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x65, + 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, + 0x20, 0x47, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x30, 0x33, + 0x32, 0x36, 0x31, 0x31, 0x31, 0x38, 0x31, 0x37, 0x5a, 0x17, 0x0d, + 0x32, 0x30, 0x30, 0x33, 0x32, 0x35, 0x31, 0x31, 0x30, 0x33, 0x31, + 0x30, 0x5a, 0x30, 0x5a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x1e, 0x30, 0x1c, 0x06, + 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x15, 0x53, 0x74, 0x61, 0x61, 0x74, + 0x20, 0x64, 0x65, 0x72, 0x20, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, + 0x61, 0x6e, 0x64, 0x65, 0x6e, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x0c, 0x22, 0x53, 0x74, 0x61, 0x61, 0x74, 0x20, + 0x64, 0x65, 0x72, 0x20, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, + 0x6e, 0x64, 0x65, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, + 0x41, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x82, 0x02, 0x22, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, + 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xc5, 0x59, 0xe7, 0x6f, 0x75, + 0xaa, 0x3e, 0x4b, 0x9c, 0xb5, 0xb8, 0xac, 0x9e, 0x0b, 0xe4, 0xf9, + 0xd9, 0xca, 0xab, 0x5d, 0x8f, 0xb5, 0x39, 0x10, 0x82, 0xd7, 0xaf, + 0x51, 0xe0, 0x3b, 0xe1, 0x00, 0x48, 0x6a, 0xcf, 0xda, 0xe1, 0x06, + 0x43, 0x11, 0x99, 0xaa, 0x14, 0x25, 0x12, 0xad, 0x22, 0xe8, 0x00, + 0x6d, 0x43, 0xc4, 0xa9, 0xb8, 0xe5, 0x1f, 0x89, 0x4b, 0x67, 0xbd, + 0x61, 0x48, 0xef, 0xfd, 0xd2, 0xe0, 0x60, 0x88, 0xe5, 0xb9, 0x18, + 0x60, 0x28, 0xc3, 0x77, 0x2b, 0xad, 0xb0, 0x37, 0xaa, 0x37, 0xde, + 0x64, 0x59, 0x2a, 0x46, 0x57, 0xe4, 0x4b, 0xb9, 0xf8, 0x37, 0x7c, + 0xd5, 0x36, 0xe7, 0x80, 0xc1, 0xb6, 0xf3, 0xd4, 0x67, 0x9b, 0x96, + 0xe8, 0xce, 0xd7, 0xc6, 0x0a, 0x53, 0xd0, 0x6b, 0x49, 0x96, 0xf3, + 0xa3, 0x0b, 0x05, 0x77, 0x48, 0xf7, 0x25, 0xe5, 0x70, 0xac, 0x30, + 0x14, 0x20, 0x25, 0xe3, 0x7f, 0x75, 0x5a, 0xe5, 0x48, 0xf8, 0x4e, + 0x7b, 0x03, 0x07, 0x04, 0xfa, 0x82, 0x61, 0x87, 0x6e, 0xf0, 0x3b, + 0xc4, 0xa4, 0xc7, 0xd0, 0xf5, 0x74, 0x3e, 0xa5, 0x5d, 0x1a, 0x08, + 0xf2, 0x9b, 0x25, 0xd2, 0xf6, 0xac, 0x04, 0x26, 0x3e, 0x55, 0x3a, + 0x62, 0x28, 0xa5, 0x7b, 0xb2, 0x30, 0xaf, 0xf8, 0x37, 0xc2, 0xd1, + 0xba, 0xd6, 0x38, 0xfd, 0xf4, 0xef, 0x49, 0x30, 0x37, 0x99, 0x26, + 0x21, 0x48, 0x85, 0x01, 0xa9, 0xe5, 0x16, 0xe7, 0xdc, 0x90, 0x55, + 0xdf, 0x0f, 0xe8, 0x38, 0xcd, 0x99, 0x37, 0x21, 0x4f, 0x5d, 0xf5, + 0x22, 0x6f, 0x6a, 0xc5, 0x12, 0x16, 0x60, 0x17, 0x55, 0xf2, 0x65, + 0x66, 0xa6, 0xa7, 0x30, 0x91, 0x38, 0xc1, 0x38, 0x1d, 0x86, 0x04, + 0x84, 0xba, 0x1a, 0x25, 0x78, 0x5e, 0x9d, 0xaf, 0xcc, 0x50, 0x60, + 0xd6, 0x13, 0x87, 0x52, 0xed, 0x63, 0x1f, 0x6d, 0x65, 0x7d, 0xc2, + 0x15, 0x18, 0x74, 0xca, 0xe1, 0x7e, 0x64, 0x29, 0x8c, 0x72, 0xd8, + 0x16, 0x13, 0x7d, 0x0b, 0x49, 0x4a, 0xf1, 0x28, 0x1b, 0x20, 0x74, + 0x6b, 0xc5, 0x3d, 0xdd, 0xb0, 0xaa, 0x48, 0x09, 0x3d, 0x2e, 0x82, + 0x94, 0xcd, 0x1a, 0x65, 0xd9, 0x2b, 0x88, 0x9a, 0x99, 0xbc, 0x18, + 0x7e, 0x9f, 0xee, 0x7d, 0x66, 0x7c, 0x3e, 0xbd, 0x94, 0xb8, 0x81, + 0xce, 0xcd, 0x98, 0x30, 0x78, 0xc1, 0x6f, 0x67, 0xd0, 0xbe, 0x5f, + 0xe0, 0x68, 0xed, 0xde, 0xe2, 0xb1, 0xc9, 0x2c, 0x59, 0x78, 0x92, + 0xaa, 0xdf, 0x2b, 0x60, 0x63, 0xf2, 0xe5, 0x5e, 0xb9, 0xe3, 0xca, + 0xfa, 0x7f, 0x50, 0x86, 0x3e, 0xa2, 0x34, 0x18, 0x0c, 0x09, 0x68, + 0x28, 0x11, 0x1c, 0xe4, 0xe1, 0xb9, 0x5c, 0x3e, 0x47, 0xba, 0x32, + 0x3f, 0x18, 0xcc, 0x5b, 0x84, 0xf5, 0xf3, 0x6b, 0x74, 0xc4, 0x72, + 0x74, 0xe1, 0xe3, 0x8b, 0xa0, 0x4a, 0xbd, 0x8d, 0x66, 0x2f, 0xea, + 0xad, 0x35, 0xda, 0x20, 0xd3, 0x88, 0x82, 0x61, 0xf0, 0x12, 0x22, + 0xb6, 0xbc, 0xd0, 0xd5, 0xa4, 0xec, 0xaf, 0x54, 0x88, 0x25, 0x24, + 0x3c, 0xa7, 0x6d, 0xb1, 0x72, 0x29, 0x3f, 0x3e, 0x57, 0xa6, 0x7f, + 0x55, 0xaf, 0x6e, 0x26, 0xc6, 0xfe, 0xe7, 0xcc, 0x40, 0x5c, 0x51, + 0x44, 0x81, 0x0a, 0x78, 0xde, 0x4a, 0xce, 0x55, 0xbf, 0x1d, 0xd5, + 0xd9, 0xb7, 0x56, 0xef, 0xf0, 0x76, 0xff, 0x0b, 0x79, 0xb5, 0xaf, + 0xbd, 0xfb, 0xa9, 0x69, 0x91, 0x46, 0x97, 0x68, 0x80, 0x14, 0x36, + 0x1d, 0xb3, 0x7f, 0xbb, 0x29, 0x98, 0x36, 0xa5, 0x20, 0xfa, 0x82, + 0x60, 0x62, 0x33, 0xa4, 0xec, 0xd6, 0xba, 0x07, 0xa7, 0x6e, 0xc5, + 0xcf, 0x14, 0xa6, 0xe7, 0xd6, 0x92, 0x34, 0xd8, 0x81, 0xf5, 0xfc, + 0x1d, 0x5d, 0xaa, 0x5c, 0x1e, 0xf6, 0xa3, 0x4d, 0x3b, 0xb8, 0xf7, + 0x39, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x97, 0x30, 0x81, + 0x94, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, + 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x52, 0x06, 0x03, + 0x55, 0x1d, 0x20, 0x04, 0x4b, 0x30, 0x49, 0x30, 0x47, 0x06, 0x04, + 0x55, 0x1d, 0x20, 0x00, 0x30, 0x3f, 0x30, 0x3d, 0x06, 0x08, 0x2b, + 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x31, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x70, 0x6b, + 0x69, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x69, 0x64, 0x2e, 0x6e, + 0x6c, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, + 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2d, 0x47, 0x32, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, + 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, + 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x91, 0x68, 0x32, + 0x87, 0x15, 0x1d, 0x89, 0xe2, 0xb5, 0xf1, 0xac, 0x36, 0x28, 0x34, + 0x8d, 0x0b, 0x7c, 0x62, 0x88, 0xeb, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, + 0x82, 0x02, 0x01, 0x00, 0xa8, 0x41, 0x4a, 0x67, 0x2a, 0x92, 0x81, + 0x82, 0x50, 0x6e, 0xe1, 0xd7, 0xd8, 0xb3, 0x39, 0x3b, 0xf3, 0x02, + 0x15, 0x09, 0x50, 0x51, 0xef, 0x2d, 0xbd, 0x24, 0x7b, 0x88, 0x86, + 0x3b, 0xf9, 0xb4, 0xbc, 0x92, 0x09, 0x96, 0xb9, 0xf6, 0xc0, 0xab, + 0x23, 0x60, 0x06, 0x79, 0x8c, 0x11, 0x4e, 0x51, 0xd2, 0x79, 0x80, + 0x33, 0xfb, 0x9d, 0x48, 0xbe, 0xec, 0x41, 0x43, 0x81, 0x1f, 0x7e, + 0x47, 0x40, 0x1c, 0xe5, 0x7a, 0x08, 0xca, 0xaa, 0x8b, 0x75, 0xad, + 0x14, 0xc4, 0xc2, 0xe8, 0x66, 0x3c, 0x82, 0x07, 0xa7, 0xe6, 0x27, + 0x82, 0x5b, 0x18, 0xe6, 0x0f, 0x6e, 0xd9, 0x50, 0x3e, 0x8a, 0x42, + 0x18, 0x29, 0xc6, 0xb4, 0x56, 0xfc, 0x56, 0x10, 0xa0, 0x05, 0x17, + 0xbd, 0x0c, 0x23, 0x7f, 0xf4, 0x93, 0xed, 0x9c, 0x1a, 0x51, 0xbe, + 0xdd, 0x45, 0x41, 0xbf, 0x91, 0x24, 0xb4, 0x1f, 0x8c, 0xe9, 0x5f, + 0xcf, 0x7b, 0x21, 0x99, 0x9f, 0x95, 0x9f, 0x39, 0x3a, 0x46, 0x1c, + 0x6c, 0xf9, 0xcd, 0x7b, 0x9c, 0x90, 0xcd, 0x28, 0xa9, 0xc7, 0xa9, + 0x55, 0xbb, 0xac, 0x62, 0x34, 0x62, 0x35, 0x13, 0x4b, 0x14, 0x3a, + 0x55, 0x83, 0xb9, 0x86, 0x8d, 0x92, 0xa6, 0xc6, 0xf4, 0x07, 0x25, + 0x54, 0xcc, 0x16, 0x57, 0x12, 0x4a, 0x82, 0x78, 0xc8, 0x14, 0xd9, + 0x17, 0x82, 0x26, 0x2d, 0x5d, 0x20, 0x1f, 0x79, 0xae, 0xfe, 0xd4, + 0x70, 0x16, 0x16, 0x95, 0x83, 0xd8, 0x35, 0x39, 0xff, 0x52, 0x5d, + 0x75, 0x1c, 0x16, 0xc5, 0x13, 0x55, 0xcf, 0x47, 0xcc, 0x75, 0x65, + 0x52, 0x4a, 0xde, 0xf0, 0xb0, 0xa7, 0xe4, 0x0a, 0x96, 0x0b, 0xfb, + 0xad, 0xc2, 0xe2, 0x25, 0x84, 0xb2, 0xdd, 0xe4, 0xbd, 0x7e, 0x59, + 0x6c, 0x9b, 0xf0, 0xf0, 0xd8, 0xe7, 0xca, 0xf2, 0xe9, 0x97, 0x38, + 0x7e, 0x89, 0xbe, 0xcc, 0xfb, 0x39, 0x17, 0x61, 0x3f, 0x72, 0xdb, + 0x3a, 0x91, 0xd8, 0x65, 0x01, 0x19, 0x1d, 0xad, 0x50, 0xa4, 0x57, + 0x0a, 0x7c, 0x4b, 0xbc, 0x9c, 0x71, 0x73, 0x2a, 0x45, 0x51, 0x19, + 0x85, 0xcc, 0x8e, 0xfd, 0x47, 0xa7, 0x74, 0x95, 0x1d, 0xa8, 0xd1, + 0xaf, 0x4e, 0x17, 0xb1, 0x69, 0x26, 0xc2, 0xaa, 0x78, 0x57, 0x5b, + 0xc5, 0x4d, 0xa7, 0xe5, 0x9e, 0x05, 0x17, 0x94, 0xca, 0xb2, 0x5f, + 0xa0, 0x49, 0x18, 0x8d, 0x34, 0xe9, 0x26, 0x6c, 0x48, 0x1e, 0xaa, + 0x68, 0x92, 0x05, 0xe1, 0x82, 0x73, 0x5a, 0x9b, 0xdc, 0x07, 0x5b, + 0x08, 0x6d, 0x7d, 0x9d, 0xd7, 0x8d, 0x21, 0xd9, 0xfc, 0x14, 0x20, + 0xaa, 0xc2, 0x45, 0xdf, 0x3f, 0xe7, 0x00, 0xb2, 0x51, 0xe4, 0xc2, + 0xf8, 0x05, 0xb9, 0x79, 0x1a, 0x8c, 0x34, 0xf3, 0x9e, 0x5b, 0xe4, + 0x37, 0x5b, 0x6b, 0x4a, 0xdf, 0x2c, 0x57, 0x8a, 0x40, 0x5a, 0x36, + 0xba, 0xdd, 0x75, 0x44, 0x08, 0x37, 0x42, 0x70, 0x0c, 0xfe, 0xdc, + 0x5e, 0x21, 0xa0, 0xa3, 0x8a, 0xc0, 0x90, 0x9c, 0x68, 0xda, 0x50, + 0xe6, 0x45, 0x10, 0x47, 0x78, 0xb6, 0x4e, 0xd2, 0x65, 0xc9, 0xc3, + 0x37, 0xdf, 0xe1, 0x42, 0x63, 0xb0, 0x57, 0x37, 0x45, 0x2d, 0x7b, + 0x8a, 0x9c, 0xbf, 0x05, 0xea, 0x65, 0x55, 0x33, 0xf7, 0x39, 0x10, + 0xc5, 0x28, 0x2a, 0x21, 0x7a, 0x1b, 0x8a, 0xc4, 0x24, 0xf9, 0x3f, + 0x15, 0xc8, 0x9a, 0x15, 0x20, 0xf5, 0x55, 0x62, 0x96, 0xed, 0x6d, + 0x93, 0x50, 0xbc, 0xe4, 0xaa, 0x78, 0xad, 0xd9, 0xcb, 0x0a, 0x65, + 0x87, 0xa6, 0x66, 0xc1, 0xc4, 0x81, 0xa3, 0x77, 0x3a, 0x58, 0x1e, + 0x0b, 0xee, 0x83, 0x8b, 0x9d, 0x1e, 0xd2, 0x52, 0xa4, 0xcc, 0x1d, + 0x6f, 0xb0, 0x98, 0x6d, 0x94, 0x31, 0xb5, 0xf8, 0x71, 0x0a, 0xdc, + 0xb9, 0xfc, 0x7d, 0x32, 0x60, 0xe6, 0xeb, 0xaf, 0x8a, 0x01, 0x30, + 0x82, 0x04, 0x0f, 0x30, 0x82, 0x02, 0xf7, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x4a, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x53, + 0x4b, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, + 0x0a, 0x42, 0x72, 0x61, 0x74, 0x69, 0x73, 0x6c, 0x61, 0x76, 0x61, + 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, + 0x44, 0x69, 0x73, 0x69, 0x67, 0x20, 0x61, 0x2e, 0x73, 0x2e, 0x31, + 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x08, 0x43, + 0x41, 0x20, 0x44, 0x69, 0x73, 0x69, 0x67, 0x30, 0x1e, 0x17, 0x0d, + 0x30, 0x36, 0x30, 0x33, 0x32, 0x32, 0x30, 0x31, 0x33, 0x39, 0x33, + 0x34, 0x5a, 0x17, 0x0d, 0x31, 0x36, 0x30, 0x33, 0x32, 0x32, 0x30, + 0x31, 0x33, 0x39, 0x33, 0x34, 0x5a, 0x30, 0x4a, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x53, 0x4b, 0x31, + 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x42, + 0x72, 0x61, 0x74, 0x69, 0x73, 0x6c, 0x61, 0x76, 0x61, 0x31, 0x13, + 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x44, 0x69, + 0x73, 0x69, 0x67, 0x20, 0x61, 0x2e, 0x73, 0x2e, 0x31, 0x11, 0x30, + 0x0f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x08, 0x43, 0x41, 0x20, + 0x44, 0x69, 0x73, 0x69, 0x67, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, + 0x02, 0x82, 0x01, 0x01, 0x00, 0x92, 0xf6, 0x31, 0xc1, 0x7d, 0x88, + 0xfd, 0x99, 0x01, 0xa9, 0xd8, 0x7b, 0xf2, 0x71, 0x75, 0xf1, 0x31, + 0xc6, 0xf3, 0x75, 0x66, 0xfa, 0x51, 0x28, 0x46, 0x84, 0x97, 0x78, + 0x34, 0xbc, 0x6c, 0xfc, 0xbc, 0x45, 0x59, 0x88, 0x26, 0x18, 0x4a, + 0xc4, 0x37, 0x1f, 0xa1, 0x4a, 0x44, 0xbd, 0xe3, 0x71, 0x04, 0xf5, + 0x44, 0x17, 0xe2, 0x3f, 0xfc, 0x48, 0x58, 0x6f, 0x5c, 0x9e, 0x7a, + 0x09, 0xba, 0x51, 0x37, 0x22, 0x23, 0x66, 0x43, 0x21, 0xb0, 0x3c, + 0x64, 0xa2, 0xf8, 0x6a, 0x15, 0x0e, 0x3f, 0xeb, 0x51, 0xe1, 0x54, + 0xa9, 0xdd, 0x06, 0x99, 0xd7, 0x9a, 0x3c, 0x54, 0x8b, 0x39, 0x03, + 0x3f, 0x0f, 0xc5, 0xce, 0xc6, 0xeb, 0x83, 0x72, 0x02, 0xa8, 0x1f, + 0x71, 0xf3, 0x2d, 0xf8, 0x75, 0x08, 0xdb, 0x62, 0x4c, 0xe8, 0xfa, + 0xce, 0xf9, 0xe7, 0x6a, 0x1f, 0xb6, 0x6b, 0x35, 0x82, 0xba, 0xe2, + 0x8f, 0x16, 0x92, 0x7d, 0x05, 0x0c, 0x6c, 0x46, 0x03, 0x5d, 0xc0, + 0xed, 0x69, 0xbf, 0x3a, 0xc1, 0x8a, 0xa0, 0xe8, 0x8e, 0xd9, 0xb9, + 0x45, 0x28, 0x87, 0x08, 0xec, 0xb4, 0xca, 0x15, 0xbe, 0x82, 0xdd, + 0xb5, 0x44, 0x8b, 0x2d, 0xad, 0x86, 0x0c, 0x68, 0x62, 0x6d, 0x85, + 0x56, 0xf2, 0xac, 0x14, 0x63, 0x3a, 0xc6, 0xd1, 0x99, 0xac, 0x34, + 0x78, 0x56, 0x4b, 0xcf, 0xb6, 0xad, 0x3f, 0x8c, 0x8a, 0xd7, 0x04, + 0xe5, 0xe3, 0x78, 0x4c, 0xf5, 0x86, 0xaa, 0xf5, 0x8f, 0xfa, 0x3d, + 0x6c, 0x71, 0xa3, 0x2d, 0xca, 0x67, 0xeb, 0x68, 0x7b, 0x6e, 0x33, + 0xa9, 0x0c, 0x82, 0x28, 0xa8, 0x4c, 0x6a, 0x21, 0x40, 0x15, 0x20, + 0x0c, 0x26, 0x5b, 0x83, 0xc2, 0xa9, 0x16, 0x15, 0xc0, 0x24, 0x82, + 0x5d, 0x2b, 0x16, 0xad, 0xca, 0x63, 0xf6, 0x74, 0x00, 0xb0, 0xdf, + 0x43, 0xc4, 0x10, 0x60, 0x56, 0x67, 0x63, 0x45, 0x02, 0x03, 0x01, + 0x00, 0x01, 0xa3, 0x81, 0xff, 0x30, 0x81, 0xfc, 0x30, 0x0f, 0x06, + 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, + 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, + 0x16, 0x04, 0x14, 0x8d, 0xb2, 0x49, 0x68, 0x9d, 0x72, 0x08, 0x25, + 0xb9, 0xc0, 0x27, 0xf5, 0x50, 0x93, 0x56, 0x48, 0x46, 0x71, 0xf9, + 0x8f, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, + 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x36, 0x06, 0x03, 0x55, + 0x1d, 0x11, 0x04, 0x2f, 0x30, 0x2d, 0x81, 0x13, 0x63, 0x61, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x40, 0x64, 0x69, 0x73, + 0x69, 0x67, 0x2e, 0x73, 0x6b, 0x86, 0x16, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x73, 0x69, + 0x67, 0x2e, 0x73, 0x6b, 0x2f, 0x63, 0x61, 0x30, 0x66, 0x06, 0x03, + 0x55, 0x1d, 0x1f, 0x04, 0x5f, 0x30, 0x5d, 0x30, 0x2d, 0xa0, 0x2b, + 0xa0, 0x29, 0x86, 0x27, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x73, + 0x6b, 0x2f, 0x63, 0x61, 0x2f, 0x63, 0x72, 0x6c, 0x2f, 0x63, 0x61, + 0x5f, 0x64, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x63, 0x72, 0x6c, 0x30, + 0x2c, 0xa0, 0x2a, 0xa0, 0x28, 0x86, 0x26, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x63, 0x61, 0x2e, 0x64, 0x69, 0x73, 0x69, 0x67, + 0x2e, 0x73, 0x6b, 0x2f, 0x63, 0x61, 0x2f, 0x63, 0x72, 0x6c, 0x2f, + 0x63, 0x61, 0x5f, 0x64, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x63, 0x72, + 0x6c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x13, 0x30, + 0x11, 0x30, 0x0f, 0x06, 0x0d, 0x2b, 0x81, 0x1e, 0x91, 0x93, 0xe6, + 0x0a, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x01, 0x00, 0x5d, 0x34, 0x74, 0x61, 0x4c, 0xaf, + 0x3b, 0xd8, 0xff, 0x9f, 0x6d, 0x58, 0x36, 0x1c, 0x3d, 0x0b, 0x81, + 0x0d, 0x12, 0x2b, 0x46, 0x10, 0x80, 0xfd, 0xe7, 0x3c, 0x27, 0xd0, + 0x7a, 0xc8, 0xa9, 0xb6, 0x7e, 0x74, 0x30, 0x33, 0xa3, 0x3a, 0x8a, + 0x7b, 0x74, 0xc0, 0x79, 0x79, 0x42, 0x93, 0x6d, 0xff, 0xb1, 0x29, + 0x14, 0x82, 0xab, 0x21, 0x8c, 0x2f, 0x17, 0xf9, 0x3f, 0x26, 0x2f, + 0xf5, 0x59, 0xc6, 0xef, 0x80, 0x06, 0xb7, 0x9a, 0x49, 0x29, 0xec, + 0xce, 0x7e, 0x71, 0x3c, 0x6a, 0x10, 0x41, 0xc0, 0xf6, 0xd3, 0x9a, + 0xb2, 0x7c, 0x5a, 0x91, 0x9c, 0xc0, 0xac, 0x5b, 0xc8, 0x4d, 0x5e, + 0xf7, 0xe1, 0x53, 0xff, 0x43, 0x77, 0xfc, 0x9e, 0x4b, 0x67, 0x6c, + 0xd7, 0xf3, 0x83, 0xd1, 0xa0, 0xe0, 0x7f, 0x25, 0xdf, 0xb8, 0x98, + 0x0b, 0x9a, 0x32, 0x38, 0x6c, 0x30, 0xa0, 0xf3, 0xff, 0x08, 0x15, + 0x33, 0xf7, 0x50, 0x4a, 0x7b, 0x3e, 0xa3, 0x3e, 0x20, 0xa9, 0xdc, + 0x2f, 0x56, 0x80, 0x0a, 0xed, 0x41, 0x50, 0xb0, 0xc9, 0xf4, 0xec, + 0xb2, 0xe3, 0x26, 0x44, 0x00, 0x0e, 0x6f, 0x9e, 0x06, 0xbc, 0x22, + 0x96, 0x53, 0x70, 0x65, 0xc4, 0x50, 0x0a, 0x46, 0x6b, 0xa4, 0x2f, + 0x27, 0x81, 0x12, 0x27, 0x13, 0x5f, 0x10, 0xa1, 0x76, 0xce, 0x8a, + 0x7b, 0x37, 0xea, 0xc3, 0x39, 0x61, 0x03, 0x95, 0x98, 0x3a, 0xe7, + 0x6c, 0x88, 0x25, 0x08, 0xfc, 0x79, 0x68, 0x0d, 0x87, 0x7d, 0x62, + 0xf8, 0xb4, 0x5f, 0xfb, 0xc5, 0xd8, 0x4c, 0xbd, 0x58, 0xbc, 0x3f, + 0x43, 0x5b, 0xd4, 0x1e, 0x01, 0x4d, 0x3c, 0x63, 0xbe, 0x23, 0xef, + 0x8c, 0xcd, 0x5a, 0x50, 0xb8, 0x68, 0x54, 0xf9, 0x0a, 0x99, 0x33, + 0x11, 0x00, 0xe1, 0x9e, 0xc2, 0x46, 0x77, 0x82, 0xf5, 0x59, 0x06, + 0x8c, 0x21, 0x4c, 0x87, 0x09, 0xcd, 0xe5, 0xa8, 0x30, 0x82, 0x04, + 0xe6, 0x30, 0x82, 0x03, 0xce, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, + 0x04, 0x3b, 0x8e, 0x4b, 0xfc, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x5d, + 0x31, 0x18, 0x30, 0x16, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x09, 0x01, 0x16, 0x09, 0x70, 0x6b, 0x69, 0x40, 0x73, + 0x6b, 0x2e, 0x65, 0x65, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x45, 0x45, 0x31, 0x22, 0x30, 0x20, 0x06, + 0x03, 0x55, 0x04, 0x0a, 0x13, 0x19, 0x41, 0x53, 0x20, 0x53, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x74, 0x73, 0x65, 0x65, 0x72, 0x69, + 0x6d, 0x69, 0x73, 0x6b, 0x65, 0x73, 0x6b, 0x75, 0x73, 0x31, 0x10, + 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x07, 0x4a, 0x75, + 0x75, 0x72, 0x2d, 0x53, 0x4b, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x31, + 0x30, 0x38, 0x33, 0x30, 0x31, 0x34, 0x32, 0x33, 0x30, 0x31, 0x5a, + 0x17, 0x0d, 0x31, 0x36, 0x30, 0x38, 0x32, 0x36, 0x31, 0x34, 0x32, + 0x33, 0x30, 0x31, 0x5a, 0x30, 0x5d, 0x31, 0x18, 0x30, 0x16, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, + 0x09, 0x70, 0x6b, 0x69, 0x40, 0x73, 0x6b, 0x2e, 0x65, 0x65, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, + 0x45, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x19, 0x41, 0x53, 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x74, 0x73, 0x65, 0x65, 0x72, 0x69, 0x6d, 0x69, 0x73, 0x6b, 0x65, + 0x73, 0x6b, 0x75, 0x73, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x07, 0x4a, 0x75, 0x75, 0x72, 0x2d, 0x53, 0x4b, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, + 0x81, 0x71, 0x36, 0x3e, 0x33, 0x07, 0xd6, 0xe3, 0x30, 0x8d, 0x13, + 0x7e, 0x77, 0x32, 0x46, 0xcb, 0xcf, 0x19, 0xb2, 0x60, 0x31, 0x46, + 0x97, 0x86, 0xf4, 0x98, 0x46, 0xa4, 0xc2, 0x65, 0x45, 0xcf, 0xd3, + 0x40, 0x7c, 0xe3, 0x5a, 0x22, 0xa8, 0x10, 0x78, 0x33, 0xcc, 0x88, + 0xb1, 0xd3, 0x81, 0x4a, 0xf6, 0x62, 0x17, 0x7b, 0x5f, 0x4d, 0x0a, + 0x2e, 0xd0, 0xcf, 0x8b, 0x23, 0xee, 0x4f, 0x02, 0x4e, 0xbb, 0xeb, + 0x0e, 0xca, 0xbd, 0x18, 0x63, 0xe8, 0x80, 0x1c, 0x8d, 0xe1, 0x1c, + 0x8d, 0x3d, 0xe0, 0xff, 0x5b, 0x5f, 0xea, 0x64, 0xe5, 0x97, 0xe8, + 0x3f, 0x99, 0x7f, 0x0c, 0x0a, 0x09, 0x33, 0x00, 0x1a, 0x53, 0xa7, + 0x21, 0xe1, 0x38, 0x4b, 0xd6, 0x83, 0x1b, 0xad, 0xaf, 0x64, 0xc2, + 0xf9, 0x1c, 0x7a, 0x8c, 0x66, 0x48, 0x4d, 0x66, 0x1f, 0x18, 0x0a, + 0xe2, 0x3e, 0xbb, 0x1f, 0x07, 0x65, 0x93, 0x85, 0xb9, 0x1a, 0xb0, + 0xb9, 0xc4, 0xfb, 0x0d, 0x11, 0xf6, 0xf5, 0xd6, 0xf9, 0x1b, 0xc7, + 0x2c, 0x2b, 0xb7, 0x18, 0x51, 0xfe, 0xe0, 0x7b, 0xf6, 0xa8, 0x48, + 0xaf, 0x6c, 0x3b, 0x4f, 0x2f, 0xef, 0xf8, 0xd1, 0x47, 0x1e, 0x26, + 0x57, 0xf0, 0x51, 0x1d, 0x33, 0x96, 0xff, 0xef, 0x59, 0x3d, 0xda, + 0x4d, 0xd1, 0x15, 0x34, 0xc7, 0xea, 0x3f, 0x16, 0x48, 0x7b, 0x91, + 0x1c, 0x80, 0x43, 0x0f, 0x3d, 0xb8, 0x05, 0x3e, 0xd1, 0xb3, 0x95, + 0xcd, 0xd8, 0xca, 0x0f, 0xc2, 0x43, 0x67, 0xdb, 0xb7, 0x93, 0xe0, + 0x22, 0x82, 0x2e, 0xbe, 0xf5, 0x68, 0x28, 0x83, 0xb9, 0xc1, 0x3b, + 0x69, 0x7b, 0x20, 0xda, 0x4e, 0x9c, 0x6d, 0xe1, 0xba, 0xcd, 0x8f, + 0x7a, 0x6c, 0xb0, 0x09, 0x22, 0xd7, 0x8b, 0x0b, 0xdb, 0x1c, 0xd5, + 0x5a, 0x26, 0x5b, 0x0d, 0xc0, 0xea, 0xe5, 0x60, 0xd0, 0x9f, 0xfe, + 0x35, 0xdf, 0x3f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, + 0xac, 0x30, 0x82, 0x01, 0xa8, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, + 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, + 0x30, 0x82, 0x01, 0x16, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x82, + 0x01, 0x0d, 0x30, 0x82, 0x01, 0x09, 0x30, 0x82, 0x01, 0x05, 0x06, + 0x0a, 0x2b, 0x06, 0x01, 0x04, 0x01, 0xce, 0x1f, 0x01, 0x01, 0x01, + 0x30, 0x81, 0xf6, 0x30, 0x81, 0xd0, 0x06, 0x08, 0x2b, 0x06, 0x01, + 0x05, 0x05, 0x07, 0x02, 0x02, 0x30, 0x81, 0xc3, 0x1e, 0x81, 0xc0, + 0x00, 0x53, 0x00, 0x65, 0x00, 0x65, 0x00, 0x20, 0x00, 0x73, 0x00, + 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, + 0x00, 0x6b, 0x00, 0x61, 0x00, 0x61, 0x00, 0x74, 0x00, 0x20, 0x00, + 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x76, 0x00, 0xe4, 0x00, 0x6c, + 0x00, 0x6a, 0x00, 0x61, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, + 0x74, 0x00, 0x75, 0x00, 0x64, 0x00, 0x20, 0x00, 0x41, 0x00, 0x53, + 0x00, 0x2d, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x53, 0x00, + 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, + 0x00, 0x74, 0x00, 0x73, 0x00, 0x65, 0x00, 0x65, 0x00, 0x72, 0x00, + 0x69, 0x00, 0x6d, 0x00, 0x69, 0x00, 0x73, 0x00, 0x6b, 0x00, 0x65, + 0x00, 0x73, 0x00, 0x6b, 0x00, 0x75, 0x00, 0x73, 0x00, 0x20, 0x00, + 0x61, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x2d, 0x00, 0x53, + 0x00, 0x4b, 0x00, 0x20, 0x00, 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, + 0x74, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6b, 0x00, 0x61, + 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x64, 0x00, 0x65, 0x00, + 0x20, 0x00, 0x6b, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x69, + 0x00, 0x74, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x69, 0x00, 0x73, 0x00, + 0x65, 0x00, 0x6b, 0x00, 0x73, 0x30, 0x21, 0x06, 0x08, 0x2b, 0x06, + 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x15, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x6b, 0x2e, + 0x65, 0x65, 0x2f, 0x63, 0x70, 0x73, 0x2f, 0x30, 0x2b, 0x06, 0x03, + 0x55, 0x1d, 0x1f, 0x04, 0x24, 0x30, 0x22, 0x30, 0x20, 0xa0, 0x1e, + 0xa0, 0x1c, 0x86, 0x1a, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x77, 0x77, 0x77, 0x2e, 0x73, 0x6b, 0x2e, 0x65, 0x65, 0x2f, 0x6a, + 0x75, 0x75, 0x72, 0x2f, 0x63, 0x72, 0x6c, 0x2f, 0x30, 0x1d, 0x06, + 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x04, 0xaa, 0x7a, + 0x47, 0xa3, 0xe4, 0x89, 0xaf, 0x1a, 0xcf, 0x0a, 0x40, 0xa7, 0x18, + 0x3f, 0x6f, 0xef, 0xe9, 0x7d, 0xbe, 0x30, 0x1f, 0x06, 0x03, 0x55, + 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x04, 0xaa, 0x7a, + 0x47, 0xa3, 0xe4, 0x89, 0xaf, 0x1a, 0xcf, 0x0a, 0x40, 0xa7, 0x18, + 0x3f, 0x6f, 0xef, 0xe9, 0x7d, 0xbe, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0xe6, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x7b, 0xc1, + 0x18, 0x94, 0x53, 0xa2, 0x09, 0xf3, 0xfe, 0x26, 0x67, 0x9a, 0x50, + 0xe4, 0xc3, 0x05, 0x2f, 0x2b, 0x35, 0x78, 0x91, 0x4c, 0x7c, 0xa8, + 0x11, 0x11, 0x79, 0x4c, 0x49, 0x59, 0xac, 0xc8, 0xf7, 0x85, 0x65, + 0x5c, 0x46, 0xbb, 0x3b, 0x10, 0xa0, 0x02, 0xaf, 0xcd, 0x4f, 0xb5, + 0xcc, 0x36, 0x2a, 0xec, 0x5d, 0xfe, 0xef, 0xa0, 0x91, 0xc9, 0xb6, + 0x93, 0x6f, 0x7c, 0x80, 0x54, 0xec, 0xc7, 0x08, 0x70, 0x0d, 0x8e, + 0xfb, 0x82, 0xec, 0x2a, 0x60, 0x78, 0x69, 0x36, 0x36, 0xd1, 0xc5, + 0x9c, 0x8b, 0x69, 0xb5, 0x40, 0xc8, 0x94, 0x65, 0x77, 0xf2, 0x57, + 0x21, 0x66, 0x3b, 0xce, 0x85, 0x40, 0xb6, 0x33, 0x63, 0x1a, 0xbf, + 0x79, 0x1e, 0xfc, 0x5c, 0x1d, 0xd3, 0x1d, 0x93, 0x1b, 0x8b, 0x0c, + 0x5d, 0x85, 0xbd, 0x99, 0x30, 0x32, 0x18, 0x09, 0x91, 0x52, 0xe9, + 0x7c, 0xa1, 0xba, 0xff, 0x64, 0x92, 0x9a, 0xec, 0xfe, 0x35, 0xee, + 0x8c, 0x2f, 0xae, 0xfc, 0x20, 0x86, 0xec, 0x4a, 0xde, 0x1b, 0x78, + 0x32, 0x37, 0xa6, 0x81, 0xd2, 0x9d, 0xaf, 0x5a, 0x12, 0x16, 0xca, + 0x99, 0x5b, 0xfc, 0x6f, 0x6d, 0x0e, 0xc5, 0xa0, 0x1e, 0x86, 0xc9, + 0x91, 0xd0, 0x5c, 0x98, 0x82, 0x5f, 0x63, 0x0c, 0x8a, 0x5a, 0xab, + 0xd8, 0x95, 0xa6, 0xcc, 0xcb, 0x8a, 0xd6, 0xbf, 0x64, 0x4b, 0x8e, + 0xca, 0x8a, 0xb2, 0xb0, 0xe9, 0x21, 0x32, 0x9e, 0xaa, 0xa8, 0x85, + 0x98, 0x34, 0x81, 0x39, 0x21, 0x3b, 0xa8, 0x3a, 0x52, 0x32, 0x3d, + 0xf6, 0x6b, 0x37, 0x86, 0x06, 0x5a, 0x15, 0x98, 0xdc, 0xf0, 0x11, + 0x66, 0xfe, 0x34, 0x20, 0xb7, 0x03, 0xf4, 0x41, 0x10, 0x7d, 0x39, + 0x84, 0x79, 0x96, 0x72, 0x63, 0xb6, 0x96, 0x02, 0xe5, 0x6b, 0xb9, + 0xad, 0x19, 0x4d, 0xbb, 0xc6, 0x44, 0xdb, 0x36, 0xcb, 0x2a, 0x9c, + 0x8e, 0x30, 0x82, 0x03, 0x30, 0x30, 0x82, 0x02, 0x18, 0xa0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, 0xe8, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, + 0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x48, 0x4b, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x13, 0x0d, 0x48, 0x6f, 0x6e, 0x67, 0x6b, 0x6f, 0x6e, + 0x67, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x31, 0x20, 0x30, 0x1e, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x48, 0x6f, 0x6e, 0x67, 0x6b, + 0x6f, 0x6e, 0x67, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x20, 0x52, 0x6f, + 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x30, 0x1e, 0x17, 0x0d, + 0x30, 0x33, 0x30, 0x35, 0x31, 0x35, 0x30, 0x35, 0x31, 0x33, 0x31, + 0x34, 0x5a, 0x17, 0x0d, 0x32, 0x33, 0x30, 0x35, 0x31, 0x35, 0x30, + 0x34, 0x35, 0x32, 0x32, 0x39, 0x5a, 0x30, 0x47, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x48, 0x4b, 0x31, + 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x48, + 0x6f, 0x6e, 0x67, 0x6b, 0x6f, 0x6e, 0x67, 0x20, 0x50, 0x6f, 0x73, + 0x74, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, + 0x17, 0x48, 0x6f, 0x6e, 0x67, 0x6b, 0x6f, 0x6e, 0x67, 0x20, 0x50, + 0x6f, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, + 0x20, 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, - 0x01, 0x00, 0xc4, 0x24, 0x5e, 0x73, 0xbe, 0x4b, 0x6d, 0x14, 0xc3, - 0xa1, 0xf4, 0xe3, 0x97, 0x90, 0x6e, 0xd2, 0x30, 0x45, 0x1e, 0x3c, - 0xee, 0x67, 0xd9, 0x64, 0xe0, 0x1a, 0x8a, 0x7f, 0xca, 0x30, 0xca, - 0x83, 0xe3, 0x20, 0xc1, 0xe3, 0xf4, 0x3a, 0xd3, 0x94, 0x5f, 0x1a, - 0x7c, 0x5b, 0x6d, 0xbf, 0x30, 0x4f, 0x84, 0x27, 0xf6, 0x9f, 0x1f, - 0x49, 0xbc, 0xc6, 0x99, 0x0a, 0x90, 0xf2, 0x0f, 0xf5, 0x7f, 0x43, - 0x84, 0x37, 0x63, 0x51, 0x8b, 0x7a, 0xa5, 0x70, 0xfc, 0x7a, 0x58, - 0xcd, 0x8e, 0x9b, 0xed, 0xc3, 0x46, 0x6c, 0x84, 0x70, 0x5d, 0xda, - 0xf3, 0x01, 0x90, 0x23, 0xfc, 0x4e, 0x30, 0xa9, 0x7e, 0xe1, 0x27, - 0x63, 0xe7, 0xed, 0x64, 0x3c, 0xa0, 0xb8, 0xc9, 0x33, 0x63, 0xfe, - 0x16, 0x90, 0xff, 0xb0, 0xb8, 0xfd, 0xd7, 0xa8, 0xc0, 0xc0, 0x94, - 0x43, 0x0b, 0xb6, 0xd5, 0x59, 0xa6, 0x9e, 0x56, 0xd0, 0x24, 0x1f, - 0x70, 0x79, 0xaf, 0xdb, 0x39, 0x54, 0x0d, 0x65, 0x75, 0xd9, 0x15, - 0x41, 0x94, 0x01, 0xaf, 0x5e, 0xec, 0xf6, 0x8d, 0xf1, 0xff, 0xad, - 0x64, 0xfe, 0x20, 0x9a, 0xd7, 0x5c, 0xeb, 0xfe, 0xa6, 0x1f, 0x08, - 0x64, 0xa3, 0x8b, 0x76, 0x55, 0xad, 0x1e, 0x3b, 0x28, 0x60, 0x2e, - 0x87, 0x25, 0xe8, 0xaa, 0xaf, 0x1f, 0xc6, 0x64, 0x46, 0x20, 0xb7, - 0x70, 0x7f, 0x3c, 0xde, 0x48, 0xdb, 0x96, 0x53, 0xb7, 0x39, 0x77, - 0xe4, 0x1a, 0xe2, 0xc7, 0x16, 0x84, 0x76, 0x97, 0x5b, 0x2f, 0xbb, - 0x19, 0x15, 0x85, 0xf8, 0x69, 0x85, 0xf5, 0x99, 0xa7, 0xa9, 0xf2, - 0x34, 0xa7, 0xa9, 0xb6, 0xa6, 0x03, 0xfc, 0x6f, 0x86, 0x3d, 0x54, - 0x7c, 0x76, 0x04, 0x9b, 0x6b, 0xf9, 0x40, 0x5d, 0x00, 0x34, 0xc7, - 0x2e, 0x99, 0x75, 0x9d, 0xe5, 0x88, 0x03, 0xaa, 0x4d, 0xf8, 0x03, - 0xd2, 0x42, 0x76, 0xc0, 0x1b, 0x02, 0x03, 0x00, 0xa8, 0x8b, 0xa3, - 0x45, 0x30, 0x43, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, + 0x01, 0x00, 0xac, 0xff, 0x38, 0xb6, 0xe9, 0x66, 0x02, 0x49, 0xe3, + 0xa2, 0xb4, 0xe1, 0x90, 0xf9, 0x40, 0x8f, 0x79, 0xf9, 0xe2, 0xbd, + 0x79, 0xfe, 0x02, 0xbd, 0xee, 0x24, 0x92, 0x1d, 0x22, 0xf6, 0xda, + 0x85, 0x72, 0x69, 0xfe, 0xd7, 0x3f, 0x09, 0xd4, 0xdd, 0x91, 0xb5, + 0x02, 0x9c, 0xd0, 0x8d, 0x5a, 0xe1, 0x55, 0xc3, 0x50, 0x86, 0xb9, + 0x29, 0x26, 0xc2, 0xe3, 0xd9, 0xa0, 0xf1, 0x69, 0x03, 0x28, 0x20, + 0x80, 0x45, 0x22, 0x2d, 0x56, 0xa7, 0x3b, 0x54, 0x95, 0x56, 0x22, + 0x59, 0x1f, 0x28, 0xdf, 0x1f, 0x20, 0x3d, 0x6d, 0xa2, 0x36, 0xbe, + 0x23, 0xa0, 0xb1, 0x6e, 0xb5, 0xb1, 0x27, 0x3f, 0x39, 0x53, 0x09, + 0xea, 0xab, 0x6a, 0xe8, 0x74, 0xb2, 0xc2, 0x65, 0x5c, 0x8e, 0xbf, + 0x7c, 0xc3, 0x78, 0x84, 0xcd, 0x9e, 0x16, 0xfc, 0xf5, 0x2e, 0x4f, + 0x20, 0x2a, 0x08, 0x9f, 0x77, 0xf3, 0xc5, 0x1e, 0xc4, 0x9a, 0x52, + 0x66, 0x1e, 0x48, 0x5e, 0xe3, 0x10, 0x06, 0x8f, 0x22, 0x98, 0xe1, + 0x65, 0x8e, 0x1b, 0x5d, 0x23, 0x66, 0x3b, 0xb8, 0xa5, 0x32, 0x51, + 0xc8, 0x86, 0xaa, 0xa1, 0xa9, 0x9e, 0x7f, 0x76, 0x94, 0xc2, 0xa6, + 0x6c, 0xb7, 0x41, 0xf0, 0xd5, 0xc8, 0x06, 0x38, 0xe6, 0xd4, 0x0c, + 0xe2, 0xf3, 0x3b, 0x4c, 0x6d, 0x50, 0x8c, 0xc4, 0x83, 0x27, 0xc1, + 0x13, 0x84, 0x59, 0x3d, 0x9e, 0x75, 0x74, 0xb6, 0xd8, 0x02, 0x5e, + 0x3a, 0x90, 0x7a, 0xc0, 0x42, 0x36, 0x72, 0xec, 0x6a, 0x4d, 0xdc, + 0xef, 0xc4, 0x00, 0xdf, 0x13, 0x18, 0x57, 0x5f, 0x26, 0x78, 0xc8, + 0xd6, 0x0a, 0x79, 0x77, 0xbf, 0xf7, 0xaf, 0xb7, 0x76, 0xb9, 0xa5, + 0x0b, 0x84, 0x17, 0x5d, 0x10, 0xea, 0x6f, 0xe1, 0xab, 0x95, 0x11, + 0x5f, 0x6d, 0x3c, 0xa3, 0x5c, 0x4d, 0x83, 0x5b, 0xf2, 0xb3, 0x19, + 0x8a, 0x80, 0x8b, 0x0b, 0x87, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, + 0x26, 0x30, 0x24, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, - 0x04, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, - 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, - 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xcc, 0xfa, 0x67, 0x93, 0xf0, - 0xb6, 0xb8, 0xd0, 0xa5, 0xc0, 0x1e, 0xf3, 0x53, 0xfd, 0x8c, 0x53, - 0xdf, 0x83, 0xd7, 0x96, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, - 0x01, 0x00, 0xab, 0x7f, 0xee, 0x1c, 0x16, 0xa9, 0x9c, 0x3c, 0x51, - 0x00, 0xa0, 0xc0, 0x11, 0x08, 0x05, 0xa7, 0x99, 0xe6, 0x6f, 0x01, - 0x88, 0x54, 0x61, 0x6e, 0xf1, 0xb9, 0x18, 0xad, 0x4a, 0xad, 0xfe, - 0x81, 0x40, 0x23, 0x94, 0x2f, 0xfb, 0x75, 0x7c, 0x2f, 0x28, 0x4b, - 0x62, 0x24, 0x81, 0x82, 0x0b, 0xf5, 0x61, 0xf1, 0x1c, 0x6e, 0xb8, - 0x61, 0x38, 0xeb, 0x81, 0xfa, 0x62, 0xa1, 0x3b, 0x5a, 0x62, 0xd3, - 0x94, 0x65, 0xc4, 0xe1, 0xe6, 0x6d, 0x82, 0xf8, 0x2f, 0x25, 0x70, - 0xb2, 0x21, 0x26, 0xc1, 0x72, 0x51, 0x1f, 0x8c, 0x2c, 0xc3, 0x84, - 0x90, 0xc3, 0x5a, 0x8f, 0xba, 0xcf, 0xf4, 0xa7, 0x65, 0xa5, 0xeb, - 0x98, 0xd1, 0xfb, 0x05, 0xb2, 0x46, 0x75, 0x15, 0x23, 0x6a, 0x6f, - 0x85, 0x63, 0x30, 0x80, 0xf0, 0xd5, 0x9e, 0x1f, 0x29, 0x1c, 0xc2, - 0x6c, 0xb0, 0x50, 0x59, 0x5d, 0x90, 0x5b, 0x3b, 0xa8, 0x0d, 0x30, - 0xcf, 0xbf, 0x7d, 0x7f, 0xce, 0xf1, 0x9d, 0x83, 0xbd, 0xc9, 0x46, - 0x6e, 0x20, 0xa6, 0xf9, 0x61, 0x51, 0xba, 0x21, 0x2f, 0x7b, 0xbe, - 0xa5, 0x15, 0x63, 0xa1, 0xd4, 0x95, 0x87, 0xf1, 0x9e, 0xb9, 0xf3, - 0x89, 0xf3, 0x3d, 0x85, 0xb8, 0xb8, 0xdb, 0xbe, 0xb5, 0xb9, 0x29, - 0xf9, 0xda, 0x37, 0x05, 0x00, 0x49, 0x94, 0x03, 0x84, 0x44, 0xe7, - 0xbf, 0x43, 0x31, 0xcf, 0x75, 0x8b, 0x25, 0xd1, 0xf4, 0xa6, 0x64, - 0xf5, 0x92, 0xf6, 0xab, 0x05, 0xeb, 0x3d, 0xe9, 0xa5, 0x0b, 0x36, - 0x62, 0xda, 0xcc, 0x06, 0x5f, 0x36, 0x8b, 0xb6, 0x5e, 0x31, 0xb8, - 0x2a, 0xfb, 0x5e, 0xf6, 0x71, 0xdf, 0x44, 0x26, 0x9e, 0xc4, 0xe6, - 0x0d, 0x91, 0xb4, 0x2e, 0x75, 0x95, 0x80, 0x51, 0x6a, 0x4b, 0x30, - 0xa6, 0xb0, 0x62, 0xa1, 0x93, 0xf1, 0x9b, 0xd8, 0xce, 0xc4, 0x63, - 0x75, 0x3f, 0x59, 0x47, 0xb1, 0x30, 0x82, 0x05, 0xca, 0x30, 0x82, - 0x03, 0xb2, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04, 0x00, 0x98, - 0x96, 0x8c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x5a, 0x31, 0x0b, 0x30, - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, - 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x15, 0x53, - 0x74, 0x61, 0x61, 0x74, 0x20, 0x64, 0x65, 0x72, 0x20, 0x4e, 0x65, - 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x65, 0x6e, 0x31, 0x2b, - 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x22, 0x53, 0x74, - 0x61, 0x61, 0x74, 0x20, 0x64, 0x65, 0x72, 0x20, 0x4e, 0x65, 0x64, - 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x65, 0x6e, 0x20, 0x52, 0x6f, - 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, - 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x30, 0x33, 0x32, 0x36, 0x31, 0x31, - 0x31, 0x38, 0x31, 0x37, 0x5a, 0x17, 0x0d, 0x32, 0x30, 0x30, 0x33, - 0x32, 0x35, 0x31, 0x31, 0x30, 0x33, 0x31, 0x30, 0x5a, 0x30, 0x5a, - 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x4e, 0x4c, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x0c, 0x15, 0x53, 0x74, 0x61, 0x61, 0x74, 0x20, 0x64, 0x65, 0x72, - 0x20, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x65, - 0x6e, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, - 0x22, 0x53, 0x74, 0x61, 0x61, 0x74, 0x20, 0x64, 0x65, 0x72, 0x20, - 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x65, 0x6e, - 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, - 0x47, 0x32, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, - 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, - 0x01, 0x00, 0xc5, 0x59, 0xe7, 0x6f, 0x75, 0xaa, 0x3e, 0x4b, 0x9c, - 0xb5, 0xb8, 0xac, 0x9e, 0x0b, 0xe4, 0xf9, 0xd9, 0xca, 0xab, 0x5d, - 0x8f, 0xb5, 0x39, 0x10, 0x82, 0xd7, 0xaf, 0x51, 0xe0, 0x3b, 0xe1, - 0x00, 0x48, 0x6a, 0xcf, 0xda, 0xe1, 0x06, 0x43, 0x11, 0x99, 0xaa, - 0x14, 0x25, 0x12, 0xad, 0x22, 0xe8, 0x00, 0x6d, 0x43, 0xc4, 0xa9, - 0xb8, 0xe5, 0x1f, 0x89, 0x4b, 0x67, 0xbd, 0x61, 0x48, 0xef, 0xfd, - 0xd2, 0xe0, 0x60, 0x88, 0xe5, 0xb9, 0x18, 0x60, 0x28, 0xc3, 0x77, - 0x2b, 0xad, 0xb0, 0x37, 0xaa, 0x37, 0xde, 0x64, 0x59, 0x2a, 0x46, - 0x57, 0xe4, 0x4b, 0xb9, 0xf8, 0x37, 0x7c, 0xd5, 0x36, 0xe7, 0x80, - 0xc1, 0xb6, 0xf3, 0xd4, 0x67, 0x9b, 0x96, 0xe8, 0xce, 0xd7, 0xc6, - 0x0a, 0x53, 0xd0, 0x6b, 0x49, 0x96, 0xf3, 0xa3, 0x0b, 0x05, 0x77, - 0x48, 0xf7, 0x25, 0xe5, 0x70, 0xac, 0x30, 0x14, 0x20, 0x25, 0xe3, - 0x7f, 0x75, 0x5a, 0xe5, 0x48, 0xf8, 0x4e, 0x7b, 0x03, 0x07, 0x04, - 0xfa, 0x82, 0x61, 0x87, 0x6e, 0xf0, 0x3b, 0xc4, 0xa4, 0xc7, 0xd0, - 0xf5, 0x74, 0x3e, 0xa5, 0x5d, 0x1a, 0x08, 0xf2, 0x9b, 0x25, 0xd2, - 0xf6, 0xac, 0x04, 0x26, 0x3e, 0x55, 0x3a, 0x62, 0x28, 0xa5, 0x7b, - 0xb2, 0x30, 0xaf, 0xf8, 0x37, 0xc2, 0xd1, 0xba, 0xd6, 0x38, 0xfd, - 0xf4, 0xef, 0x49, 0x30, 0x37, 0x99, 0x26, 0x21, 0x48, 0x85, 0x01, - 0xa9, 0xe5, 0x16, 0xe7, 0xdc, 0x90, 0x55, 0xdf, 0x0f, 0xe8, 0x38, - 0xcd, 0x99, 0x37, 0x21, 0x4f, 0x5d, 0xf5, 0x22, 0x6f, 0x6a, 0xc5, - 0x12, 0x16, 0x60, 0x17, 0x55, 0xf2, 0x65, 0x66, 0xa6, 0xa7, 0x30, - 0x91, 0x38, 0xc1, 0x38, 0x1d, 0x86, 0x04, 0x84, 0xba, 0x1a, 0x25, - 0x78, 0x5e, 0x9d, 0xaf, 0xcc, 0x50, 0x60, 0xd6, 0x13, 0x87, 0x52, - 0xed, 0x63, 0x1f, 0x6d, 0x65, 0x7d, 0xc2, 0x15, 0x18, 0x74, 0xca, - 0xe1, 0x7e, 0x64, 0x29, 0x8c, 0x72, 0xd8, 0x16, 0x13, 0x7d, 0x0b, - 0x49, 0x4a, 0xf1, 0x28, 0x1b, 0x20, 0x74, 0x6b, 0xc5, 0x3d, 0xdd, - 0xb0, 0xaa, 0x48, 0x09, 0x3d, 0x2e, 0x82, 0x94, 0xcd, 0x1a, 0x65, - 0xd9, 0x2b, 0x88, 0x9a, 0x99, 0xbc, 0x18, 0x7e, 0x9f, 0xee, 0x7d, - 0x66, 0x7c, 0x3e, 0xbd, 0x94, 0xb8, 0x81, 0xce, 0xcd, 0x98, 0x30, - 0x78, 0xc1, 0x6f, 0x67, 0xd0, 0xbe, 0x5f, 0xe0, 0x68, 0xed, 0xde, - 0xe2, 0xb1, 0xc9, 0x2c, 0x59, 0x78, 0x92, 0xaa, 0xdf, 0x2b, 0x60, - 0x63, 0xf2, 0xe5, 0x5e, 0xb9, 0xe3, 0xca, 0xfa, 0x7f, 0x50, 0x86, - 0x3e, 0xa2, 0x34, 0x18, 0x0c, 0x09, 0x68, 0x28, 0x11, 0x1c, 0xe4, - 0xe1, 0xb9, 0x5c, 0x3e, 0x47, 0xba, 0x32, 0x3f, 0x18, 0xcc, 0x5b, - 0x84, 0xf5, 0xf3, 0x6b, 0x74, 0xc4, 0x72, 0x74, 0xe1, 0xe3, 0x8b, - 0xa0, 0x4a, 0xbd, 0x8d, 0x66, 0x2f, 0xea, 0xad, 0x35, 0xda, 0x20, - 0xd3, 0x88, 0x82, 0x61, 0xf0, 0x12, 0x22, 0xb6, 0xbc, 0xd0, 0xd5, - 0xa4, 0xec, 0xaf, 0x54, 0x88, 0x25, 0x24, 0x3c, 0xa7, 0x6d, 0xb1, - 0x72, 0x29, 0x3f, 0x3e, 0x57, 0xa6, 0x7f, 0x55, 0xaf, 0x6e, 0x26, - 0xc6, 0xfe, 0xe7, 0xcc, 0x40, 0x5c, 0x51, 0x44, 0x81, 0x0a, 0x78, - 0xde, 0x4a, 0xce, 0x55, 0xbf, 0x1d, 0xd5, 0xd9, 0xb7, 0x56, 0xef, - 0xf0, 0x76, 0xff, 0x0b, 0x79, 0xb5, 0xaf, 0xbd, 0xfb, 0xa9, 0x69, - 0x91, 0x46, 0x97, 0x68, 0x80, 0x14, 0x36, 0x1d, 0xb3, 0x7f, 0xbb, - 0x29, 0x98, 0x36, 0xa5, 0x20, 0xfa, 0x82, 0x60, 0x62, 0x33, 0xa4, - 0xec, 0xd6, 0xba, 0x07, 0xa7, 0x6e, 0xc5, 0xcf, 0x14, 0xa6, 0xe7, - 0xd6, 0x92, 0x34, 0xd8, 0x81, 0xf5, 0xfc, 0x1d, 0x5d, 0xaa, 0x5c, - 0x1e, 0xf6, 0xa3, 0x4d, 0x3b, 0xb8, 0xf7, 0x39, 0x02, 0x03, 0x01, - 0x00, 0x01, 0xa3, 0x81, 0x97, 0x30, 0x81, 0x94, 0x30, 0x0f, 0x06, - 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, - 0x01, 0x01, 0xff, 0x30, 0x52, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, - 0x4b, 0x30, 0x49, 0x30, 0x47, 0x06, 0x04, 0x55, 0x1d, 0x20, 0x00, - 0x30, 0x3f, 0x30, 0x3d, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, - 0x07, 0x02, 0x01, 0x16, 0x31, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, - 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x70, 0x6b, 0x69, 0x6f, 0x76, 0x65, - 0x72, 0x68, 0x65, 0x69, 0x64, 0x2e, 0x6e, 0x6c, 0x2f, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x72, 0x6f, 0x6f, 0x74, - 0x2d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2d, 0x47, 0x32, 0x30, - 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, - 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, - 0x04, 0x16, 0x04, 0x14, 0x91, 0x68, 0x32, 0x87, 0x15, 0x1d, 0x89, - 0xe2, 0xb5, 0xf1, 0xac, 0x36, 0x28, 0x34, 0x8d, 0x0b, 0x7c, 0x62, - 0x88, 0xeb, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, - 0xa8, 0x41, 0x4a, 0x67, 0x2a, 0x92, 0x81, 0x82, 0x50, 0x6e, 0xe1, - 0xd7, 0xd8, 0xb3, 0x39, 0x3b, 0xf3, 0x02, 0x15, 0x09, 0x50, 0x51, - 0xef, 0x2d, 0xbd, 0x24, 0x7b, 0x88, 0x86, 0x3b, 0xf9, 0xb4, 0xbc, - 0x92, 0x09, 0x96, 0xb9, 0xf6, 0xc0, 0xab, 0x23, 0x60, 0x06, 0x79, - 0x8c, 0x11, 0x4e, 0x51, 0xd2, 0x79, 0x80, 0x33, 0xfb, 0x9d, 0x48, - 0xbe, 0xec, 0x41, 0x43, 0x81, 0x1f, 0x7e, 0x47, 0x40, 0x1c, 0xe5, - 0x7a, 0x08, 0xca, 0xaa, 0x8b, 0x75, 0xad, 0x14, 0xc4, 0xc2, 0xe8, - 0x66, 0x3c, 0x82, 0x07, 0xa7, 0xe6, 0x27, 0x82, 0x5b, 0x18, 0xe6, - 0x0f, 0x6e, 0xd9, 0x50, 0x3e, 0x8a, 0x42, 0x18, 0x29, 0xc6, 0xb4, - 0x56, 0xfc, 0x56, 0x10, 0xa0, 0x05, 0x17, 0xbd, 0x0c, 0x23, 0x7f, - 0xf4, 0x93, 0xed, 0x9c, 0x1a, 0x51, 0xbe, 0xdd, 0x45, 0x41, 0xbf, - 0x91, 0x24, 0xb4, 0x1f, 0x8c, 0xe9, 0x5f, 0xcf, 0x7b, 0x21, 0x99, - 0x9f, 0x95, 0x9f, 0x39, 0x3a, 0x46, 0x1c, 0x6c, 0xf9, 0xcd, 0x7b, - 0x9c, 0x90, 0xcd, 0x28, 0xa9, 0xc7, 0xa9, 0x55, 0xbb, 0xac, 0x62, - 0x34, 0x62, 0x35, 0x13, 0x4b, 0x14, 0x3a, 0x55, 0x83, 0xb9, 0x86, - 0x8d, 0x92, 0xa6, 0xc6, 0xf4, 0x07, 0x25, 0x54, 0xcc, 0x16, 0x57, - 0x12, 0x4a, 0x82, 0x78, 0xc8, 0x14, 0xd9, 0x17, 0x82, 0x26, 0x2d, - 0x5d, 0x20, 0x1f, 0x79, 0xae, 0xfe, 0xd4, 0x70, 0x16, 0x16, 0x95, - 0x83, 0xd8, 0x35, 0x39, 0xff, 0x52, 0x5d, 0x75, 0x1c, 0x16, 0xc5, - 0x13, 0x55, 0xcf, 0x47, 0xcc, 0x75, 0x65, 0x52, 0x4a, 0xde, 0xf0, - 0xb0, 0xa7, 0xe4, 0x0a, 0x96, 0x0b, 0xfb, 0xad, 0xc2, 0xe2, 0x25, - 0x84, 0xb2, 0xdd, 0xe4, 0xbd, 0x7e, 0x59, 0x6c, 0x9b, 0xf0, 0xf0, - 0xd8, 0xe7, 0xca, 0xf2, 0xe9, 0x97, 0x38, 0x7e, 0x89, 0xbe, 0xcc, - 0xfb, 0x39, 0x17, 0x61, 0x3f, 0x72, 0xdb, 0x3a, 0x91, 0xd8, 0x65, - 0x01, 0x19, 0x1d, 0xad, 0x50, 0xa4, 0x57, 0x0a, 0x7c, 0x4b, 0xbc, - 0x9c, 0x71, 0x73, 0x2a, 0x45, 0x51, 0x19, 0x85, 0xcc, 0x8e, 0xfd, - 0x47, 0xa7, 0x74, 0x95, 0x1d, 0xa8, 0xd1, 0xaf, 0x4e, 0x17, 0xb1, - 0x69, 0x26, 0xc2, 0xaa, 0x78, 0x57, 0x5b, 0xc5, 0x4d, 0xa7, 0xe5, - 0x9e, 0x05, 0x17, 0x94, 0xca, 0xb2, 0x5f, 0xa0, 0x49, 0x18, 0x8d, - 0x34, 0xe9, 0x26, 0x6c, 0x48, 0x1e, 0xaa, 0x68, 0x92, 0x05, 0xe1, - 0x82, 0x73, 0x5a, 0x9b, 0xdc, 0x07, 0x5b, 0x08, 0x6d, 0x7d, 0x9d, - 0xd7, 0x8d, 0x21, 0xd9, 0xfc, 0x14, 0x20, 0xaa, 0xc2, 0x45, 0xdf, - 0x3f, 0xe7, 0x00, 0xb2, 0x51, 0xe4, 0xc2, 0xf8, 0x05, 0xb9, 0x79, - 0x1a, 0x8c, 0x34, 0xf3, 0x9e, 0x5b, 0xe4, 0x37, 0x5b, 0x6b, 0x4a, - 0xdf, 0x2c, 0x57, 0x8a, 0x40, 0x5a, 0x36, 0xba, 0xdd, 0x75, 0x44, - 0x08, 0x37, 0x42, 0x70, 0x0c, 0xfe, 0xdc, 0x5e, 0x21, 0xa0, 0xa3, - 0x8a, 0xc0, 0x90, 0x9c, 0x68, 0xda, 0x50, 0xe6, 0x45, 0x10, 0x47, - 0x78, 0xb6, 0x4e, 0xd2, 0x65, 0xc9, 0xc3, 0x37, 0xdf, 0xe1, 0x42, - 0x63, 0xb0, 0x57, 0x37, 0x45, 0x2d, 0x7b, 0x8a, 0x9c, 0xbf, 0x05, - 0xea, 0x65, 0x55, 0x33, 0xf7, 0x39, 0x10, 0xc5, 0x28, 0x2a, 0x21, - 0x7a, 0x1b, 0x8a, 0xc4, 0x24, 0xf9, 0x3f, 0x15, 0xc8, 0x9a, 0x15, - 0x20, 0xf5, 0x55, 0x62, 0x96, 0xed, 0x6d, 0x93, 0x50, 0xbc, 0xe4, - 0xaa, 0x78, 0xad, 0xd9, 0xcb, 0x0a, 0x65, 0x87, 0xa6, 0x66, 0xc1, - 0xc4, 0x81, 0xa3, 0x77, 0x3a, 0x58, 0x1e, 0x0b, 0xee, 0x83, 0x8b, - 0x9d, 0x1e, 0xd2, 0x52, 0xa4, 0xcc, 0x1d, 0x6f, 0xb0, 0x98, 0x6d, - 0x94, 0x31, 0xb5, 0xf8, 0x71, 0x0a, 0xdc, 0xb9, 0xfc, 0x7d, 0x32, - 0x60, 0xe6, 0xeb, 0xaf, 0x8a, 0x01, 0x30, 0x82, 0x04, 0x0f, 0x30, - 0x82, 0x02, 0xf7, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x05, 0x05, 0x00, 0x30, 0x4a, 0x31, 0x0b, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x53, 0x4b, 0x31, 0x13, 0x30, - 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x42, 0x72, 0x61, - 0x74, 0x69, 0x73, 0x6c, 0x61, 0x76, 0x61, 0x31, 0x13, 0x30, 0x11, - 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x44, 0x69, 0x73, 0x69, - 0x67, 0x20, 0x61, 0x2e, 0x73, 0x2e, 0x31, 0x11, 0x30, 0x0f, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x13, 0x08, 0x43, 0x41, 0x20, 0x44, 0x69, - 0x73, 0x69, 0x67, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x30, 0x33, - 0x32, 0x32, 0x30, 0x31, 0x33, 0x39, 0x33, 0x34, 0x5a, 0x17, 0x0d, - 0x31, 0x36, 0x30, 0x33, 0x32, 0x32, 0x30, 0x31, 0x33, 0x39, 0x33, - 0x34, 0x5a, 0x30, 0x4a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x53, 0x4b, 0x31, 0x13, 0x30, 0x11, 0x06, - 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x42, 0x72, 0x61, 0x74, 0x69, - 0x73, 0x6c, 0x61, 0x76, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x44, 0x69, 0x73, 0x69, 0x67, 0x20, - 0x61, 0x2e, 0x73, 0x2e, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, - 0x04, 0x03, 0x13, 0x08, 0x43, 0x41, 0x20, 0x44, 0x69, 0x73, 0x69, - 0x67, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, - 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, - 0x00, 0x92, 0xf6, 0x31, 0xc1, 0x7d, 0x88, 0xfd, 0x99, 0x01, 0xa9, - 0xd8, 0x7b, 0xf2, 0x71, 0x75, 0xf1, 0x31, 0xc6, 0xf3, 0x75, 0x66, - 0xfa, 0x51, 0x28, 0x46, 0x84, 0x97, 0x78, 0x34, 0xbc, 0x6c, 0xfc, - 0xbc, 0x45, 0x59, 0x88, 0x26, 0x18, 0x4a, 0xc4, 0x37, 0x1f, 0xa1, - 0x4a, 0x44, 0xbd, 0xe3, 0x71, 0x04, 0xf5, 0x44, 0x17, 0xe2, 0x3f, - 0xfc, 0x48, 0x58, 0x6f, 0x5c, 0x9e, 0x7a, 0x09, 0xba, 0x51, 0x37, - 0x22, 0x23, 0x66, 0x43, 0x21, 0xb0, 0x3c, 0x64, 0xa2, 0xf8, 0x6a, - 0x15, 0x0e, 0x3f, 0xeb, 0x51, 0xe1, 0x54, 0xa9, 0xdd, 0x06, 0x99, - 0xd7, 0x9a, 0x3c, 0x54, 0x8b, 0x39, 0x03, 0x3f, 0x0f, 0xc5, 0xce, - 0xc6, 0xeb, 0x83, 0x72, 0x02, 0xa8, 0x1f, 0x71, 0xf3, 0x2d, 0xf8, - 0x75, 0x08, 0xdb, 0x62, 0x4c, 0xe8, 0xfa, 0xce, 0xf9, 0xe7, 0x6a, - 0x1f, 0xb6, 0x6b, 0x35, 0x82, 0xba, 0xe2, 0x8f, 0x16, 0x92, 0x7d, - 0x05, 0x0c, 0x6c, 0x46, 0x03, 0x5d, 0xc0, 0xed, 0x69, 0xbf, 0x3a, - 0xc1, 0x8a, 0xa0, 0xe8, 0x8e, 0xd9, 0xb9, 0x45, 0x28, 0x87, 0x08, - 0xec, 0xb4, 0xca, 0x15, 0xbe, 0x82, 0xdd, 0xb5, 0x44, 0x8b, 0x2d, - 0xad, 0x86, 0x0c, 0x68, 0x62, 0x6d, 0x85, 0x56, 0xf2, 0xac, 0x14, - 0x63, 0x3a, 0xc6, 0xd1, 0x99, 0xac, 0x34, 0x78, 0x56, 0x4b, 0xcf, - 0xb6, 0xad, 0x3f, 0x8c, 0x8a, 0xd7, 0x04, 0xe5, 0xe3, 0x78, 0x4c, - 0xf5, 0x86, 0xaa, 0xf5, 0x8f, 0xfa, 0x3d, 0x6c, 0x71, 0xa3, 0x2d, - 0xca, 0x67, 0xeb, 0x68, 0x7b, 0x6e, 0x33, 0xa9, 0x0c, 0x82, 0x28, - 0xa8, 0x4c, 0x6a, 0x21, 0x40, 0x15, 0x20, 0x0c, 0x26, 0x5b, 0x83, - 0xc2, 0xa9, 0x16, 0x15, 0xc0, 0x24, 0x82, 0x5d, 0x2b, 0x16, 0xad, - 0xca, 0x63, 0xf6, 0x74, 0x00, 0xb0, 0xdf, 0x43, 0xc4, 0x10, 0x60, - 0x56, 0x67, 0x63, 0x45, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, - 0xff, 0x30, 0x81, 0xfc, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, - 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, - 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x8d, - 0xb2, 0x49, 0x68, 0x9d, 0x72, 0x08, 0x25, 0xb9, 0xc0, 0x27, 0xf5, - 0x50, 0x93, 0x56, 0x48, 0x46, 0x71, 0xf9, 0x8f, 0x30, 0x0e, 0x06, - 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, - 0x01, 0x06, 0x30, 0x36, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x2f, - 0x30, 0x2d, 0x81, 0x13, 0x63, 0x61, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x40, 0x64, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x73, - 0x6b, 0x86, 0x16, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, - 0x77, 0x77, 0x2e, 0x64, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x73, 0x6b, - 0x2f, 0x63, 0x61, 0x30, 0x66, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, - 0x5f, 0x30, 0x5d, 0x30, 0x2d, 0xa0, 0x2b, 0xa0, 0x29, 0x86, 0x27, - 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, - 0x64, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x73, 0x6b, 0x2f, 0x63, 0x61, - 0x2f, 0x63, 0x72, 0x6c, 0x2f, 0x63, 0x61, 0x5f, 0x64, 0x69, 0x73, - 0x69, 0x67, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x2c, 0xa0, 0x2a, 0xa0, - 0x28, 0x86, 0x26, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, - 0x61, 0x2e, 0x64, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x73, 0x6b, 0x2f, - 0x63, 0x61, 0x2f, 0x63, 0x72, 0x6c, 0x2f, 0x63, 0x61, 0x5f, 0x64, - 0x69, 0x73, 0x69, 0x67, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x1a, 0x06, - 0x03, 0x55, 0x1d, 0x20, 0x04, 0x13, 0x30, 0x11, 0x30, 0x0f, 0x06, - 0x0d, 0x2b, 0x81, 0x1e, 0x91, 0x93, 0xe6, 0x0a, 0x00, 0x00, 0x00, - 0x01, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, - 0x00, 0x5d, 0x34, 0x74, 0x61, 0x4c, 0xaf, 0x3b, 0xd8, 0xff, 0x9f, - 0x6d, 0x58, 0x36, 0x1c, 0x3d, 0x0b, 0x81, 0x0d, 0x12, 0x2b, 0x46, - 0x10, 0x80, 0xfd, 0xe7, 0x3c, 0x27, 0xd0, 0x7a, 0xc8, 0xa9, 0xb6, - 0x7e, 0x74, 0x30, 0x33, 0xa3, 0x3a, 0x8a, 0x7b, 0x74, 0xc0, 0x79, - 0x79, 0x42, 0x93, 0x6d, 0xff, 0xb1, 0x29, 0x14, 0x82, 0xab, 0x21, - 0x8c, 0x2f, 0x17, 0xf9, 0x3f, 0x26, 0x2f, 0xf5, 0x59, 0xc6, 0xef, - 0x80, 0x06, 0xb7, 0x9a, 0x49, 0x29, 0xec, 0xce, 0x7e, 0x71, 0x3c, - 0x6a, 0x10, 0x41, 0xc0, 0xf6, 0xd3, 0x9a, 0xb2, 0x7c, 0x5a, 0x91, - 0x9c, 0xc0, 0xac, 0x5b, 0xc8, 0x4d, 0x5e, 0xf7, 0xe1, 0x53, 0xff, - 0x43, 0x77, 0xfc, 0x9e, 0x4b, 0x67, 0x6c, 0xd7, 0xf3, 0x83, 0xd1, - 0xa0, 0xe0, 0x7f, 0x25, 0xdf, 0xb8, 0x98, 0x0b, 0x9a, 0x32, 0x38, - 0x6c, 0x30, 0xa0, 0xf3, 0xff, 0x08, 0x15, 0x33, 0xf7, 0x50, 0x4a, - 0x7b, 0x3e, 0xa3, 0x3e, 0x20, 0xa9, 0xdc, 0x2f, 0x56, 0x80, 0x0a, - 0xed, 0x41, 0x50, 0xb0, 0xc9, 0xf4, 0xec, 0xb2, 0xe3, 0x26, 0x44, - 0x00, 0x0e, 0x6f, 0x9e, 0x06, 0xbc, 0x22, 0x96, 0x53, 0x70, 0x65, - 0xc4, 0x50, 0x0a, 0x46, 0x6b, 0xa4, 0x2f, 0x27, 0x81, 0x12, 0x27, - 0x13, 0x5f, 0x10, 0xa1, 0x76, 0xce, 0x8a, 0x7b, 0x37, 0xea, 0xc3, - 0x39, 0x61, 0x03, 0x95, 0x98, 0x3a, 0xe7, 0x6c, 0x88, 0x25, 0x08, - 0xfc, 0x79, 0x68, 0x0d, 0x87, 0x7d, 0x62, 0xf8, 0xb4, 0x5f, 0xfb, - 0xc5, 0xd8, 0x4c, 0xbd, 0x58, 0xbc, 0x3f, 0x43, 0x5b, 0xd4, 0x1e, - 0x01, 0x4d, 0x3c, 0x63, 0xbe, 0x23, 0xef, 0x8c, 0xcd, 0x5a, 0x50, - 0xb8, 0x68, 0x54, 0xf9, 0x0a, 0x99, 0x33, 0x11, 0x00, 0xe1, 0x9e, - 0xc2, 0x46, 0x77, 0x82, 0xf5, 0x59, 0x06, 0x8c, 0x21, 0x4c, 0x87, - 0x09, 0xcd, 0xe5, 0xa8, 0x30, 0x82, 0x04, 0xe6, 0x30, 0x82, 0x03, - 0xce, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04, 0x3b, 0x8e, 0x4b, - 0xfc, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x5d, 0x31, 0x18, 0x30, 0x16, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, - 0x16, 0x09, 0x70, 0x6b, 0x69, 0x40, 0x73, 0x6b, 0x2e, 0x65, 0x65, - 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x45, 0x45, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x13, 0x19, 0x41, 0x53, 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x74, 0x73, 0x65, 0x65, 0x72, 0x69, 0x6d, 0x69, 0x73, 0x6b, - 0x65, 0x73, 0x6b, 0x75, 0x73, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x13, 0x07, 0x4a, 0x75, 0x75, 0x72, 0x2d, 0x53, - 0x4b, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x31, 0x30, 0x38, 0x33, 0x30, - 0x31, 0x34, 0x32, 0x33, 0x30, 0x31, 0x5a, 0x17, 0x0d, 0x31, 0x36, - 0x30, 0x38, 0x32, 0x36, 0x31, 0x34, 0x32, 0x33, 0x30, 0x31, 0x5a, - 0x30, 0x5d, 0x31, 0x18, 0x30, 0x16, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x09, 0x70, 0x6b, 0x69, - 0x40, 0x73, 0x6b, 0x2e, 0x65, 0x65, 0x31, 0x0b, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x45, 0x31, 0x22, 0x30, - 0x20, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x19, 0x41, 0x53, 0x20, - 0x53, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x74, 0x73, 0x65, 0x65, - 0x72, 0x69, 0x6d, 0x69, 0x73, 0x6b, 0x65, 0x73, 0x6b, 0x75, 0x73, - 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x07, - 0x4a, 0x75, 0x75, 0x72, 0x2d, 0x53, 0x4b, 0x30, 0x82, 0x01, 0x22, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, - 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0x81, 0x71, 0x36, 0x3e, - 0x33, 0x07, 0xd6, 0xe3, 0x30, 0x8d, 0x13, 0x7e, 0x77, 0x32, 0x46, - 0xcb, 0xcf, 0x19, 0xb2, 0x60, 0x31, 0x46, 0x97, 0x86, 0xf4, 0x98, - 0x46, 0xa4, 0xc2, 0x65, 0x45, 0xcf, 0xd3, 0x40, 0x7c, 0xe3, 0x5a, - 0x22, 0xa8, 0x10, 0x78, 0x33, 0xcc, 0x88, 0xb1, 0xd3, 0x81, 0x4a, - 0xf6, 0x62, 0x17, 0x7b, 0x5f, 0x4d, 0x0a, 0x2e, 0xd0, 0xcf, 0x8b, - 0x23, 0xee, 0x4f, 0x02, 0x4e, 0xbb, 0xeb, 0x0e, 0xca, 0xbd, 0x18, - 0x63, 0xe8, 0x80, 0x1c, 0x8d, 0xe1, 0x1c, 0x8d, 0x3d, 0xe0, 0xff, - 0x5b, 0x5f, 0xea, 0x64, 0xe5, 0x97, 0xe8, 0x3f, 0x99, 0x7f, 0x0c, - 0x0a, 0x09, 0x33, 0x00, 0x1a, 0x53, 0xa7, 0x21, 0xe1, 0x38, 0x4b, - 0xd6, 0x83, 0x1b, 0xad, 0xaf, 0x64, 0xc2, 0xf9, 0x1c, 0x7a, 0x8c, - 0x66, 0x48, 0x4d, 0x66, 0x1f, 0x18, 0x0a, 0xe2, 0x3e, 0xbb, 0x1f, - 0x07, 0x65, 0x93, 0x85, 0xb9, 0x1a, 0xb0, 0xb9, 0xc4, 0xfb, 0x0d, - 0x11, 0xf6, 0xf5, 0xd6, 0xf9, 0x1b, 0xc7, 0x2c, 0x2b, 0xb7, 0x18, - 0x51, 0xfe, 0xe0, 0x7b, 0xf6, 0xa8, 0x48, 0xaf, 0x6c, 0x3b, 0x4f, - 0x2f, 0xef, 0xf8, 0xd1, 0x47, 0x1e, 0x26, 0x57, 0xf0, 0x51, 0x1d, - 0x33, 0x96, 0xff, 0xef, 0x59, 0x3d, 0xda, 0x4d, 0xd1, 0x15, 0x34, - 0xc7, 0xea, 0x3f, 0x16, 0x48, 0x7b, 0x91, 0x1c, 0x80, 0x43, 0x0f, - 0x3d, 0xb8, 0x05, 0x3e, 0xd1, 0xb3, 0x95, 0xcd, 0xd8, 0xca, 0x0f, - 0xc2, 0x43, 0x67, 0xdb, 0xb7, 0x93, 0xe0, 0x22, 0x82, 0x2e, 0xbe, - 0xf5, 0x68, 0x28, 0x83, 0xb9, 0xc1, 0x3b, 0x69, 0x7b, 0x20, 0xda, - 0x4e, 0x9c, 0x6d, 0xe1, 0xba, 0xcd, 0x8f, 0x7a, 0x6c, 0xb0, 0x09, - 0x22, 0xd7, 0x8b, 0x0b, 0xdb, 0x1c, 0xd5, 0x5a, 0x26, 0x5b, 0x0d, - 0xc0, 0xea, 0xe5, 0x60, 0xd0, 0x9f, 0xfe, 0x35, 0xdf, 0x3f, 0x02, - 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0xac, 0x30, 0x82, 0x01, - 0xa8, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, - 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x82, 0x01, 0x16, - 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x82, 0x01, 0x0d, 0x30, 0x82, - 0x01, 0x09, 0x30, 0x82, 0x01, 0x05, 0x06, 0x0a, 0x2b, 0x06, 0x01, - 0x04, 0x01, 0xce, 0x1f, 0x01, 0x01, 0x01, 0x30, 0x81, 0xf6, 0x30, - 0x81, 0xd0, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, - 0x02, 0x30, 0x81, 0xc3, 0x1e, 0x81, 0xc0, 0x00, 0x53, 0x00, 0x65, - 0x00, 0x65, 0x00, 0x20, 0x00, 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, - 0x74, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6b, 0x00, 0x61, - 0x00, 0x61, 0x00, 0x74, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x6e, 0x00, - 0x20, 0x00, 0x76, 0x00, 0xe4, 0x00, 0x6c, 0x00, 0x6a, 0x00, 0x61, - 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x74, 0x00, 0x75, 0x00, - 0x64, 0x00, 0x20, 0x00, 0x41, 0x00, 0x53, 0x00, 0x2d, 0x00, 0x69, - 0x00, 0x73, 0x00, 0x20, 0x00, 0x53, 0x00, 0x65, 0x00, 0x72, 0x00, - 0x74, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, - 0x00, 0x65, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6d, 0x00, - 0x69, 0x00, 0x73, 0x00, 0x6b, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6b, - 0x00, 0x75, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6c, 0x00, - 0x61, 0x00, 0x6d, 0x00, 0x2d, 0x00, 0x53, 0x00, 0x4b, 0x00, 0x20, - 0x00, 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x69, 0x00, - 0x66, 0x00, 0x69, 0x00, 0x6b, 0x00, 0x61, 0x00, 0x61, 0x00, 0x74, - 0x00, 0x69, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6b, 0x00, - 0x69, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x69, 0x00, 0x74, 0x00, 0x61, - 0x00, 0x6d, 0x00, 0x69, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6b, 0x00, - 0x73, 0x30, 0x21, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, - 0x02, 0x01, 0x16, 0x15, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, - 0x77, 0x77, 0x77, 0x2e, 0x73, 0x6b, 0x2e, 0x65, 0x65, 0x2f, 0x63, - 0x70, 0x73, 0x2f, 0x30, 0x2b, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, - 0x24, 0x30, 0x22, 0x30, 0x20, 0xa0, 0x1e, 0xa0, 0x1c, 0x86, 0x1a, - 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, - 0x73, 0x6b, 0x2e, 0x65, 0x65, 0x2f, 0x6a, 0x75, 0x75, 0x72, 0x2f, - 0x63, 0x72, 0x6c, 0x2f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, - 0x04, 0x16, 0x04, 0x14, 0x04, 0xaa, 0x7a, 0x47, 0xa3, 0xe4, 0x89, - 0xaf, 0x1a, 0xcf, 0x0a, 0x40, 0xa7, 0x18, 0x3f, 0x6f, 0xef, 0xe9, - 0x7d, 0xbe, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, - 0x30, 0x16, 0x80, 0x14, 0x04, 0xaa, 0x7a, 0x47, 0xa3, 0xe4, 0x89, - 0xaf, 0x1a, 0xcf, 0x0a, 0x40, 0xa7, 0x18, 0x3f, 0x6f, 0xef, 0xe9, - 0x7d, 0xbe, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, - 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0xe6, 0x30, 0x0d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, - 0x03, 0x82, 0x01, 0x01, 0x00, 0x7b, 0xc1, 0x18, 0x94, 0x53, 0xa2, - 0x09, 0xf3, 0xfe, 0x26, 0x67, 0x9a, 0x50, 0xe4, 0xc3, 0x05, 0x2f, - 0x2b, 0x35, 0x78, 0x91, 0x4c, 0x7c, 0xa8, 0x11, 0x11, 0x79, 0x4c, - 0x49, 0x59, 0xac, 0xc8, 0xf7, 0x85, 0x65, 0x5c, 0x46, 0xbb, 0x3b, - 0x10, 0xa0, 0x02, 0xaf, 0xcd, 0x4f, 0xb5, 0xcc, 0x36, 0x2a, 0xec, - 0x5d, 0xfe, 0xef, 0xa0, 0x91, 0xc9, 0xb6, 0x93, 0x6f, 0x7c, 0x80, - 0x54, 0xec, 0xc7, 0x08, 0x70, 0x0d, 0x8e, 0xfb, 0x82, 0xec, 0x2a, - 0x60, 0x78, 0x69, 0x36, 0x36, 0xd1, 0xc5, 0x9c, 0x8b, 0x69, 0xb5, - 0x40, 0xc8, 0x94, 0x65, 0x77, 0xf2, 0x57, 0x21, 0x66, 0x3b, 0xce, - 0x85, 0x40, 0xb6, 0x33, 0x63, 0x1a, 0xbf, 0x79, 0x1e, 0xfc, 0x5c, - 0x1d, 0xd3, 0x1d, 0x93, 0x1b, 0x8b, 0x0c, 0x5d, 0x85, 0xbd, 0x99, - 0x30, 0x32, 0x18, 0x09, 0x91, 0x52, 0xe9, 0x7c, 0xa1, 0xba, 0xff, - 0x64, 0x92, 0x9a, 0xec, 0xfe, 0x35, 0xee, 0x8c, 0x2f, 0xae, 0xfc, - 0x20, 0x86, 0xec, 0x4a, 0xde, 0x1b, 0x78, 0x32, 0x37, 0xa6, 0x81, - 0xd2, 0x9d, 0xaf, 0x5a, 0x12, 0x16, 0xca, 0x99, 0x5b, 0xfc, 0x6f, - 0x6d, 0x0e, 0xc5, 0xa0, 0x1e, 0x86, 0xc9, 0x91, 0xd0, 0x5c, 0x98, - 0x82, 0x5f, 0x63, 0x0c, 0x8a, 0x5a, 0xab, 0xd8, 0x95, 0xa6, 0xcc, - 0xcb, 0x8a, 0xd6, 0xbf, 0x64, 0x4b, 0x8e, 0xca, 0x8a, 0xb2, 0xb0, - 0xe9, 0x21, 0x32, 0x9e, 0xaa, 0xa8, 0x85, 0x98, 0x34, 0x81, 0x39, - 0x21, 0x3b, 0xa8, 0x3a, 0x52, 0x32, 0x3d, 0xf6, 0x6b, 0x37, 0x86, - 0x06, 0x5a, 0x15, 0x98, 0xdc, 0xf0, 0x11, 0x66, 0xfe, 0x34, 0x20, - 0xb7, 0x03, 0xf4, 0x41, 0x10, 0x7d, 0x39, 0x84, 0x79, 0x96, 0x72, - 0x63, 0xb6, 0x96, 0x02, 0xe5, 0x6b, 0xb9, 0xad, 0x19, 0x4d, 0xbb, - 0xc6, 0x44, 0xdb, 0x36, 0xcb, 0x2a, 0x9c, 0x8e, 0x30, 0x82, 0x03, - 0x30, 0x30, 0x82, 0x02, 0x18, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, - 0x02, 0x03, 0xe8, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x47, 0x31, 0x0b, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x48, 0x4b, - 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, - 0x48, 0x6f, 0x6e, 0x67, 0x6b, 0x6f, 0x6e, 0x67, 0x20, 0x50, 0x6f, - 0x73, 0x74, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, - 0x13, 0x17, 0x48, 0x6f, 0x6e, 0x67, 0x6b, 0x6f, 0x6e, 0x67, 0x20, - 0x50, 0x6f, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, - 0x41, 0x20, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x33, 0x30, 0x35, - 0x31, 0x35, 0x30, 0x35, 0x31, 0x33, 0x31, 0x34, 0x5a, 0x17, 0x0d, - 0x32, 0x33, 0x30, 0x35, 0x31, 0x35, 0x30, 0x34, 0x35, 0x32, 0x32, - 0x39, 0x5a, 0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x48, 0x4b, 0x31, 0x16, 0x30, 0x14, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x48, 0x6f, 0x6e, 0x67, 0x6b, - 0x6f, 0x6e, 0x67, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x31, 0x20, 0x30, - 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x48, 0x6f, 0x6e, - 0x67, 0x6b, 0x6f, 0x6e, 0x67, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x20, - 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x30, 0x82, - 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, - 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xac, 0xff, - 0x38, 0xb6, 0xe9, 0x66, 0x02, 0x49, 0xe3, 0xa2, 0xb4, 0xe1, 0x90, - 0xf9, 0x40, 0x8f, 0x79, 0xf9, 0xe2, 0xbd, 0x79, 0xfe, 0x02, 0xbd, - 0xee, 0x24, 0x92, 0x1d, 0x22, 0xf6, 0xda, 0x85, 0x72, 0x69, 0xfe, - 0xd7, 0x3f, 0x09, 0xd4, 0xdd, 0x91, 0xb5, 0x02, 0x9c, 0xd0, 0x8d, - 0x5a, 0xe1, 0x55, 0xc3, 0x50, 0x86, 0xb9, 0x29, 0x26, 0xc2, 0xe3, - 0xd9, 0xa0, 0xf1, 0x69, 0x03, 0x28, 0x20, 0x80, 0x45, 0x22, 0x2d, - 0x56, 0xa7, 0x3b, 0x54, 0x95, 0x56, 0x22, 0x59, 0x1f, 0x28, 0xdf, - 0x1f, 0x20, 0x3d, 0x6d, 0xa2, 0x36, 0xbe, 0x23, 0xa0, 0xb1, 0x6e, - 0xb5, 0xb1, 0x27, 0x3f, 0x39, 0x53, 0x09, 0xea, 0xab, 0x6a, 0xe8, - 0x74, 0xb2, 0xc2, 0x65, 0x5c, 0x8e, 0xbf, 0x7c, 0xc3, 0x78, 0x84, - 0xcd, 0x9e, 0x16, 0xfc, 0xf5, 0x2e, 0x4f, 0x20, 0x2a, 0x08, 0x9f, - 0x77, 0xf3, 0xc5, 0x1e, 0xc4, 0x9a, 0x52, 0x66, 0x1e, 0x48, 0x5e, - 0xe3, 0x10, 0x06, 0x8f, 0x22, 0x98, 0xe1, 0x65, 0x8e, 0x1b, 0x5d, - 0x23, 0x66, 0x3b, 0xb8, 0xa5, 0x32, 0x51, 0xc8, 0x86, 0xaa, 0xa1, - 0xa9, 0x9e, 0x7f, 0x76, 0x94, 0xc2, 0xa6, 0x6c, 0xb7, 0x41, 0xf0, - 0xd5, 0xc8, 0x06, 0x38, 0xe6, 0xd4, 0x0c, 0xe2, 0xf3, 0x3b, 0x4c, - 0x6d, 0x50, 0x8c, 0xc4, 0x83, 0x27, 0xc1, 0x13, 0x84, 0x59, 0x3d, - 0x9e, 0x75, 0x74, 0xb6, 0xd8, 0x02, 0x5e, 0x3a, 0x90, 0x7a, 0xc0, - 0x42, 0x36, 0x72, 0xec, 0x6a, 0x4d, 0xdc, 0xef, 0xc4, 0x00, 0xdf, - 0x13, 0x18, 0x57, 0x5f, 0x26, 0x78, 0xc8, 0xd6, 0x0a, 0x79, 0x77, - 0xbf, 0xf7, 0xaf, 0xb7, 0x76, 0xb9, 0xa5, 0x0b, 0x84, 0x17, 0x5d, - 0x10, 0xea, 0x6f, 0xe1, 0xab, 0x95, 0x11, 0x5f, 0x6d, 0x3c, 0xa3, - 0x5c, 0x4d, 0x83, 0x5b, 0xf2, 0xb3, 0x19, 0x8a, 0x80, 0x8b, 0x0b, - 0x87, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x26, 0x30, 0x24, 0x30, - 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, - 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x03, 0x30, 0x0e, 0x06, - 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, - 0x01, 0xc6, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, - 0x0e, 0x46, 0xd5, 0x3c, 0xae, 0xe2, 0x87, 0xd9, 0x5e, 0x81, 0x8b, - 0x02, 0x98, 0x41, 0x08, 0x8c, 0x4c, 0xbc, 0xda, 0xdb, 0xee, 0x27, - 0x1b, 0x82, 0xe7, 0x6a, 0x45, 0xec, 0x16, 0x8b, 0x4f, 0x85, 0xa0, - 0xf3, 0xb2, 0x70, 0xbd, 0x5a, 0x96, 0xba, 0xca, 0x6e, 0x6d, 0xee, - 0x46, 0x8b, 0x6e, 0xe7, 0x2a, 0x2e, 0x96, 0xb3, 0x19, 0x33, 0xeb, - 0xb4, 0x9f, 0xa8, 0xb2, 0x37, 0xee, 0x98, 0xa8, 0x97, 0xb6, 0x2e, - 0xb6, 0x67, 0x27, 0xd4, 0xa6, 0x49, 0xfd, 0x1c, 0x93, 0x65, 0x76, - 0x9e, 0x42, 0x2f, 0xdc, 0x22, 0x6c, 0x9a, 0x4f, 0xf2, 0x5a, 0x15, - 0x39, 0xb1, 0x71, 0xd7, 0x2b, 0x51, 0xe8, 0x6d, 0x1c, 0x98, 0xc0, - 0xd9, 0x2a, 0xf4, 0xa1, 0x82, 0x7b, 0xd5, 0xc9, 0x41, 0xa2, 0x23, - 0x01, 0x74, 0x38, 0x55, 0x8b, 0x0f, 0xb9, 0x2e, 0x67, 0xa2, 0x20, - 0x04, 0x37, 0xda, 0x9c, 0x0b, 0xd3, 0x17, 0x21, 0xe0, 0x8f, 0x97, - 0x79, 0x34, 0x6f, 0x84, 0x48, 0x02, 0x20, 0x33, 0x1b, 0xe6, 0x34, - 0x44, 0x9f, 0x91, 0x70, 0xf4, 0x80, 0x5e, 0x84, 0x43, 0xc2, 0x29, - 0xd2, 0x6c, 0x12, 0x14, 0xe4, 0x61, 0x8d, 0xac, 0x10, 0x90, 0x9e, - 0x84, 0x50, 0xbb, 0xf0, 0x96, 0x6f, 0x45, 0x9f, 0x8a, 0xf3, 0xca, - 0x6c, 0x4f, 0xfa, 0x11, 0x3a, 0x15, 0x15, 0x46, 0xc3, 0xcd, 0x1f, - 0x83, 0x5b, 0x2d, 0x41, 0x12, 0xed, 0x50, 0x67, 0x41, 0x13, 0x3d, - 0x21, 0xab, 0x94, 0x8a, 0xaa, 0x4e, 0x7c, 0xc1, 0xb1, 0xfb, 0xa7, - 0xd6, 0xb5, 0x27, 0x2f, 0x97, 0xab, 0x6e, 0xe0, 0x1d, 0xe2, 0xd1, - 0x1c, 0x2c, 0x1f, 0x44, 0xe2, 0xfc, 0xbe, 0x91, 0xa1, 0x9c, 0xfb, - 0xd6, 0x29, 0x53, 0x73, 0x86, 0x9f, 0x53, 0xd8, 0x43, 0x0e, 0x5d, - 0xd6, 0x63, 0x82, 0x71, 0x1d, 0x80, 0x74, 0xca, 0xf6, 0xe2, 0x02, - 0x6b, 0xd9, 0x5a, 0x30, 0x82, 0x03, 0x6d, 0x30, 0x82, 0x02, 0x55, - 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, - 0x00, 0x30, 0x58, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x22, 0x4a, 0x61, 0x70, 0x61, 0x6e, 0x20, - 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x1c, 0x30, 0x1a, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x53, 0x65, 0x63, 0x75, 0x72, - 0x65, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, - 0x41, 0x31, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, 0x30, 0x34, - 0x30, 0x38, 0x30, 0x34, 0x35, 0x36, 0x34, 0x37, 0x5a, 0x17, 0x0d, - 0x32, 0x39, 0x30, 0x34, 0x30, 0x38, 0x30, 0x34, 0x35, 0x36, 0x34, - 0x37, 0x5a, 0x30, 0x58, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, 0x2b, 0x30, 0x29, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x13, 0x22, 0x4a, 0x61, 0x70, 0x61, 0x6e, - 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x1c, 0x30, 0x1a, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x53, 0x65, 0x63, 0x75, - 0x72, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, - 0x43, 0x41, 0x31, 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, - 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, - 0x82, 0x01, 0x01, 0x00, 0xfd, 0x77, 0xaa, 0xa5, 0x1c, 0x90, 0x05, - 0x3b, 0xcb, 0x4c, 0x9b, 0x33, 0x8b, 0x5a, 0x14, 0x45, 0xa4, 0xe7, - 0x90, 0x16, 0xd1, 0xdf, 0x57, 0xd2, 0x21, 0x10, 0xa4, 0x17, 0xfd, - 0xdf, 0xac, 0xd6, 0x1f, 0xa7, 0xe4, 0xdb, 0x7c, 0xf7, 0xec, 0xdf, - 0xb8, 0x03, 0xda, 0x94, 0x58, 0xfd, 0x5d, 0x72, 0x7c, 0x8c, 0x3f, - 0x5f, 0x01, 0x67, 0x74, 0x15, 0x96, 0xe3, 0x02, 0x3c, 0x87, 0xdb, - 0xae, 0xcb, 0x01, 0x8e, 0xc2, 0xf3, 0x66, 0xc6, 0x85, 0x45, 0xf4, - 0x02, 0xc6, 0x3a, 0xb5, 0x62, 0xb2, 0xaf, 0xfa, 0x9c, 0xbf, 0xa4, - 0xe6, 0xd4, 0x80, 0x30, 0x98, 0xf3, 0x0d, 0xb6, 0x93, 0x8f, 0xa9, - 0xd4, 0xd8, 0x36, 0xf2, 0xb0, 0xfc, 0x8a, 0xca, 0x2c, 0xa1, 0x15, - 0x33, 0x95, 0x31, 0xda, 0xc0, 0x1b, 0xf2, 0xee, 0x62, 0x99, 0x86, - 0x63, 0x3f, 0xbf, 0xdd, 0x93, 0x2a, 0x83, 0xa8, 0x76, 0xb9, 0x13, - 0x1f, 0xb7, 0xce, 0x4e, 0x42, 0x85, 0x8f, 0x22, 0xe7, 0x2e, 0x1a, - 0xf2, 0x95, 0x09, 0xb2, 0x05, 0xb5, 0x44, 0x4e, 0x77, 0xa1, 0x20, - 0xbd, 0xa9, 0xf2, 0x4e, 0x0a, 0x7d, 0x50, 0xad, 0xf5, 0x05, 0x0d, - 0x45, 0x4f, 0x46, 0x71, 0xfd, 0x28, 0x3e, 0x53, 0xfb, 0x04, 0xd8, - 0x2d, 0xd7, 0x65, 0x1d, 0x4a, 0x1b, 0xfa, 0xcf, 0x3b, 0xb0, 0x31, - 0x9a, 0x35, 0x6e, 0xc8, 0x8b, 0x06, 0xd3, 0x00, 0x91, 0xf2, 0x94, - 0x08, 0x65, 0x4c, 0xb1, 0x34, 0x06, 0x00, 0x7a, 0x89, 0xe2, 0xf0, - 0xc7, 0x03, 0x59, 0xcf, 0xd5, 0xd6, 0xe8, 0xa7, 0x32, 0xb3, 0xe6, - 0x98, 0x40, 0x86, 0xc5, 0xcd, 0x27, 0x12, 0x8b, 0xcc, 0x7b, 0xce, - 0xb7, 0x11, 0x3c, 0x62, 0x60, 0x07, 0x23, 0x3e, 0x2b, 0x40, 0x6e, - 0x94, 0x80, 0x09, 0x6d, 0xb6, 0xb3, 0x6f, 0x77, 0x6f, 0x35, 0x08, - 0x50, 0xfb, 0x02, 0x87, 0xc5, 0x3e, 0x89, 0x02, 0x03, 0x01, 0x00, - 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, - 0x0e, 0x04, 0x16, 0x04, 0x14, 0x5b, 0xf8, 0x4d, 0x4f, 0xb2, 0xa5, - 0x86, 0xd4, 0x3a, 0xd2, 0xf1, 0x63, 0x9a, 0xa0, 0xbe, 0x09, 0xf6, - 0x57, 0xb7, 0xde, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, - 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, - 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, - 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, - 0x00, 0xa0, 0xa1, 0x38, 0x16, 0x66, 0x2e, 0xa7, 0x56, 0x1f, 0x21, - 0x9c, 0x06, 0xfa, 0x1d, 0xed, 0xb9, 0x22, 0xc5, 0x38, 0x26, 0xd8, - 0x4e, 0x4f, 0xec, 0xa3, 0x7f, 0x79, 0xde, 0x46, 0x21, 0xa1, 0x87, - 0x77, 0x8f, 0x07, 0x08, 0x9a, 0xb2, 0xa4, 0xc5, 0xaf, 0x0f, 0x32, - 0x98, 0x0b, 0x7c, 0x66, 0x29, 0xb6, 0x9b, 0x7d, 0x25, 0x52, 0x49, - 0x43, 0xab, 0x4c, 0x2e, 0x2b, 0x6e, 0x7a, 0x70, 0xaf, 0x16, 0x0e, - 0xe3, 0x02, 0x6c, 0xfb, 0x42, 0xe6, 0x18, 0x9d, 0x45, 0xd8, 0x55, - 0xc8, 0xe8, 0x3b, 0xdd, 0xe7, 0xe1, 0xf4, 0x2e, 0x0b, 0x1c, 0x34, - 0x5c, 0x6c, 0x58, 0x4a, 0xfb, 0x8c, 0x88, 0x50, 0x5f, 0x95, 0x1c, - 0xbf, 0xed, 0xab, 0x22, 0xb5, 0x65, 0xb3, 0x85, 0xba, 0x9e, 0x0f, - 0xb8, 0xad, 0xe5, 0x7a, 0x1b, 0x8a, 0x50, 0x3a, 0x1d, 0xbd, 0x0d, - 0xbc, 0x7b, 0x54, 0x50, 0x0b, 0xb9, 0x42, 0xaf, 0x55, 0xa0, 0x18, - 0x81, 0xad, 0x65, 0x99, 0xef, 0xbe, 0xe4, 0x9c, 0xbf, 0xc4, 0x85, - 0xab, 0x41, 0xb2, 0x54, 0x6f, 0xdc, 0x25, 0xcd, 0xed, 0x78, 0xe2, - 0x8e, 0x0c, 0x8d, 0x09, 0x49, 0xdd, 0x63, 0x7b, 0x5a, 0x69, 0x96, - 0x02, 0x21, 0xa8, 0xbd, 0x52, 0x59, 0xe9, 0x7d, 0x35, 0xcb, 0xc8, - 0x52, 0xca, 0x7f, 0x81, 0xfe, 0xd9, 0x6b, 0xd3, 0xf7, 0x11, 0xed, - 0x25, 0xdf, 0xf8, 0xe7, 0xf9, 0xa4, 0xfa, 0x72, 0x97, 0x84, 0x53, - 0x0d, 0xa5, 0xd0, 0x32, 0x18, 0x51, 0x76, 0x59, 0x14, 0x6c, 0x0f, - 0xeb, 0xec, 0x5f, 0x80, 0x8c, 0x75, 0x43, 0x83, 0xc3, 0x85, 0x98, - 0xff, 0x4c, 0x9e, 0x2d, 0x0d, 0xe4, 0x77, 0x83, 0x93, 0x4e, 0xb5, - 0x96, 0x07, 0x8b, 0x28, 0x13, 0x9b, 0x8c, 0x19, 0x8d, 0x41, 0x27, - 0x49, 0x40, 0xee, 0xde, 0xe6, 0x23, 0x44, 0x39, 0xdc, 0xa1, 0x22, - 0xd6, 0xba, 0x03, 0xf2, 0x30, 0x82, 0x05, 0xb5, 0x30, 0x82, 0x03, - 0x9d, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x61, 0x8d, 0xc7, - 0x86, 0x3b, 0x01, 0x82, 0x05, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x44, - 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0d, - 0x41, 0x43, 0x45, 0x44, 0x49, 0x43, 0x4f, 0x4d, 0x20, 0x52, 0x6f, - 0x6f, 0x74, 0x31, 0x0c, 0x30, 0x0a, 0x06, 0x03, 0x55, 0x04, 0x0b, - 0x0c, 0x03, 0x50, 0x4b, 0x49, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x0c, 0x06, 0x45, 0x44, 0x49, 0x43, 0x4f, 0x4d, - 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x45, 0x53, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x30, 0x34, 0x31, - 0x38, 0x31, 0x36, 0x32, 0x34, 0x32, 0x32, 0x5a, 0x17, 0x0d, 0x32, - 0x38, 0x30, 0x34, 0x31, 0x33, 0x31, 0x36, 0x32, 0x34, 0x32, 0x32, - 0x5a, 0x30, 0x44, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x0c, 0x0d, 0x41, 0x43, 0x45, 0x44, 0x49, 0x43, 0x4f, 0x4d, - 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x31, 0x0c, 0x30, 0x0a, 0x06, 0x03, - 0x55, 0x04, 0x0b, 0x0c, 0x03, 0x50, 0x4b, 0x49, 0x31, 0x0f, 0x30, - 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x06, 0x45, 0x44, 0x49, - 0x43, 0x4f, 0x4d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x45, 0x53, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, - 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, - 0x02, 0x82, 0x02, 0x01, 0x00, 0xff, 0x92, 0x95, 0xe1, 0x68, 0x06, - 0x76, 0xb4, 0x2c, 0xc8, 0x58, 0x48, 0xca, 0xfd, 0x80, 0x54, 0x29, - 0x55, 0x63, 0x24, 0xff, 0x90, 0x65, 0x9b, 0x10, 0x75, 0x7b, 0xc3, - 0x6a, 0xdb, 0x62, 0x02, 0x01, 0xf2, 0x18, 0x86, 0xb5, 0x7c, 0x5a, - 0x38, 0xb1, 0xe4, 0x58, 0xb9, 0xfb, 0xd3, 0xd8, 0x2d, 0x9f, 0xbd, - 0x32, 0x37, 0xbf, 0x2c, 0x15, 0x6d, 0xbe, 0xb5, 0xf4, 0x21, 0xd2, - 0x13, 0x91, 0xd9, 0x07, 0xad, 0x01, 0x05, 0xd6, 0xf3, 0xbd, 0x77, - 0xce, 0x5f, 0x42, 0x81, 0x0a, 0xf9, 0x6a, 0xe3, 0x83, 0x00, 0xa8, - 0x2b, 0x2e, 0x55, 0x13, 0x63, 0x81, 0xca, 0x47, 0x1c, 0x7b, 0x5c, - 0x16, 0x57, 0x7a, 0x1b, 0x83, 0x60, 0x04, 0x3a, 0x3e, 0x65, 0xc3, - 0xcd, 0x01, 0xde, 0xde, 0xa4, 0xd6, 0x0c, 0xba, 0x8e, 0xde, 0xd9, - 0x04, 0xee, 0x17, 0x56, 0x22, 0x9b, 0x8f, 0x63, 0xfd, 0x4d, 0x16, - 0x0b, 0xb7, 0x7b, 0x77, 0x8c, 0xf9, 0x25, 0xb5, 0xd1, 0x6d, 0x99, - 0x12, 0x2e, 0x4f, 0x1a, 0xb8, 0xe6, 0xea, 0x04, 0x92, 0xae, 0x3d, - 0x11, 0xb9, 0x51, 0x42, 0x3d, 0x87, 0xb0, 0x31, 0x85, 0xaf, 0x79, - 0x5a, 0x9c, 0xfe, 0xe7, 0x4e, 0x5e, 0x92, 0x4f, 0x43, 0xfc, 0xab, - 0x3a, 0xad, 0xa5, 0x12, 0x26, 0x66, 0xb9, 0xe2, 0x0c, 0xd7, 0x98, - 0xce, 0xd4, 0x58, 0xa5, 0x95, 0x40, 0x0a, 0xb7, 0x44, 0x9d, 0x13, - 0x74, 0x2b, 0xc2, 0xa5, 0xeb, 0x22, 0x15, 0x98, 0x10, 0xd8, 0x8b, - 0xc5, 0x04, 0x9f, 0x1d, 0x8f, 0x60, 0xe5, 0x06, 0x1b, 0x9b, 0xcf, - 0xb9, 0x79, 0xa0, 0x3d, 0xa2, 0x23, 0x3f, 0x42, 0x3f, 0x6b, 0xfa, - 0x1c, 0x03, 0x7b, 0x30, 0x8d, 0xce, 0x6c, 0xc0, 0xbf, 0xe6, 0x1b, - 0x5f, 0xbf, 0x67, 0xb8, 0x84, 0x19, 0xd5, 0x15, 0xef, 0x7b, 0xcb, - 0x90, 0x36, 0x31, 0x62, 0xc9, 0xbc, 0x02, 0xab, 0x46, 0x5f, 0x9b, - 0xfe, 0x1a, 0x68, 0x94, 0x34, 0x3d, 0x90, 0x8e, 0xad, 0xf6, 0xe4, - 0x1d, 0x09, 0x7f, 0x4a, 0x88, 0x38, 0x3f, 0xbe, 0x67, 0xfd, 0x34, - 0x96, 0xf5, 0x1d, 0xbc, 0x30, 0x74, 0xcb, 0x38, 0xee, 0xd5, 0x6c, - 0xab, 0xd4, 0xfc, 0xf4, 0x00, 0xb7, 0x00, 0x5b, 0x85, 0x32, 0x16, - 0x76, 0x33, 0xe9, 0xd8, 0xa3, 0x99, 0x9d, 0x05, 0x00, 0xaa, 0x16, - 0xe6, 0xf3, 0x81, 0x7d, 0x6f, 0x7d, 0xaa, 0x86, 0x6d, 0xad, 0x15, - 0x74, 0xd3, 0xc4, 0xa2, 0x71, 0xaa, 0xf4, 0x14, 0x7d, 0xe7, 0x32, - 0xb8, 0x1f, 0xbc, 0xd5, 0xf1, 0x4e, 0xbd, 0x6f, 0x17, 0x02, 0x39, - 0xd7, 0x0e, 0x95, 0x42, 0x3a, 0xc7, 0x00, 0x3e, 0xe9, 0x26, 0x63, - 0x11, 0xea, 0x0b, 0xd1, 0x4a, 0xff, 0x18, 0x9d, 0xb2, 0xd7, 0x7b, - 0x2f, 0x3a, 0xd9, 0x96, 0xfb, 0xe8, 0x1e, 0x92, 0xae, 0x13, 0x55, - 0xc8, 0xd9, 0x27, 0xf6, 0xdc, 0x48, 0x1b, 0xb0, 0x24, 0xc1, 0x85, - 0xe3, 0x77, 0x9d, 0x9a, 0xa4, 0xf3, 0x0c, 0x11, 0x1d, 0x0d, 0xc8, - 0xb4, 0x14, 0xee, 0xb5, 0x82, 0x57, 0x09, 0xbf, 0x20, 0x58, 0x7f, - 0x2f, 0x22, 0x23, 0xd8, 0x70, 0xcb, 0x79, 0x6c, 0xc9, 0x4b, 0xf2, - 0xa9, 0x2a, 0xc8, 0xfc, 0x87, 0x2b, 0xd7, 0x1a, 0x50, 0xf8, 0x27, - 0xe8, 0x2f, 0x43, 0xe3, 0x3a, 0xbd, 0xd8, 0x57, 0x71, 0xfd, 0xce, - 0xa6, 0x52, 0x5b, 0xf9, 0xdd, 0x4d, 0xed, 0xe5, 0xf6, 0x6f, 0x89, - 0xed, 0xbb, 0x93, 0x9c, 0x76, 0x21, 0x75, 0xf0, 0x92, 0x4c, 0x29, - 0xf7, 0x2f, 0x9c, 0x01, 0x2e, 0xfe, 0x50, 0x46, 0x9e, 0x64, 0x0c, - 0x14, 0xb3, 0x07, 0x5b, 0xc5, 0xc2, 0x73, 0x6c, 0xf1, 0x07, 0x5c, - 0x45, 0x24, 0x14, 0x35, 0xae, 0x83, 0xf1, 0x6a, 0x4d, 0x89, 0x7a, - 0xfa, 0xb3, 0xd8, 0x2d, 0x66, 0xf0, 0x36, 0x87, 0xf5, 0x2b, 0x53, - 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xaa, 0x30, 0x81, 0xa7, - 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, - 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, - 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xa6, 0xb3, 0xe1, - 0x2b, 0x2b, 0x49, 0xb6, 0xd7, 0x73, 0xa1, 0xaa, 0x94, 0xf5, 0x01, - 0xe7, 0x73, 0x65, 0x4c, 0xac, 0x50, 0x30, 0x0e, 0x06, 0x03, 0x55, - 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, - 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, - 0xa6, 0xb3, 0xe1, 0x2b, 0x2b, 0x49, 0xb6, 0xd7, 0x73, 0xa1, 0xaa, - 0x94, 0xf5, 0x01, 0xe7, 0x73, 0x65, 0x4c, 0xac, 0x50, 0x30, 0x44, - 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x3d, 0x30, 0x3b, 0x30, 0x39, - 0x06, 0x04, 0x55, 0x1d, 0x20, 0x00, 0x30, 0x31, 0x30, 0x2f, 0x06, - 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x23, - 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x61, 0x63, 0x65, 0x64, - 0x69, 0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x64, 0x69, 0x63, 0x6f, 0x6d, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, - 0x6f, 0x63, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, - 0xce, 0x2c, 0x0b, 0x52, 0x51, 0x62, 0x26, 0x7d, 0x0c, 0x27, 0x83, - 0x8f, 0xc5, 0xf6, 0xda, 0xa0, 0x68, 0x7b, 0x4f, 0x92, 0x5e, 0xea, - 0xa4, 0x73, 0x32, 0x11, 0x53, 0x44, 0xb2, 0x44, 0xcb, 0x9d, 0xec, - 0x0f, 0x79, 0x42, 0xb3, 0x10, 0xa6, 0xc7, 0x0d, 0x9d, 0xcb, 0xb6, - 0xfa, 0x3f, 0x3a, 0x7c, 0xea, 0xbf, 0x88, 0x53, 0x1b, 0x3c, 0xf7, - 0x82, 0xfa, 0x05, 0x35, 0x33, 0xe1, 0x35, 0xa8, 0x57, 0xc0, 0xe7, - 0xfd, 0x8d, 0x4f, 0x3f, 0x93, 0x32, 0x4f, 0x78, 0x66, 0x03, 0x77, - 0x07, 0x58, 0xe9, 0x95, 0xc8, 0x7e, 0x3e, 0xd0, 0x79, 0x00, 0x8c, - 0xf2, 0x1b, 0x51, 0x33, 0x9b, 0xbc, 0x94, 0xe9, 0x3a, 0x7b, 0x6e, - 0x52, 0x2d, 0x32, 0x9e, 0x23, 0xa4, 0x45, 0xfb, 0xb6, 0x2e, 0x13, - 0xb0, 0x8b, 0x18, 0xb1, 0xdd, 0xce, 0xd5, 0x1d, 0xa7, 0x42, 0x7f, - 0x55, 0xbe, 0xfb, 0x5b, 0xbb, 0x47, 0xd4, 0xfc, 0x24, 0xcd, 0x04, - 0xae, 0x96, 0x05, 0x15, 0xd6, 0xac, 0xce, 0x30, 0xf3, 0xca, 0x0b, - 0xc5, 0xba, 0xe2, 0x22, 0xe0, 0xa6, 0xad, 0x22, 0xe4, 0x02, 0xee, - 0x74, 0x11, 0x7f, 0x4c, 0xff, 0x78, 0x1d, 0x35, 0xda, 0xe6, 0x02, - 0x34, 0xeb, 0x18, 0x12, 0x61, 0x77, 0x06, 0x09, 0x16, 0x63, 0xea, - 0x18, 0xad, 0xa2, 0x87, 0x1f, 0xf2, 0xc7, 0x80, 0x09, 0x09, 0x75, - 0x4e, 0x10, 0xa8, 0x8f, 0x3d, 0x86, 0xb8, 0x75, 0x11, 0xc0, 0x24, - 0x62, 0x8a, 0x96, 0x7b, 0x4a, 0x45, 0xe9, 0xec, 0x59, 0xc5, 0xbe, - 0x6b, 0x83, 0xe6, 0xe1, 0xe8, 0xac, 0xb5, 0x30, 0x1e, 0xfe, 0x05, - 0x07, 0x80, 0xf9, 0xe1, 0x23, 0x0d, 0x50, 0x8f, 0x05, 0x98, 0xff, - 0x2c, 0x5f, 0xe8, 0x3b, 0xb6, 0xad, 0xcf, 0x81, 0xb5, 0x21, 0x87, - 0xca, 0x08, 0x2a, 0x23, 0x27, 0x30, 0x20, 0x2b, 0xcf, 0xed, 0x94, - 0x5b, 0xac, 0xb2, 0x7a, 0xd2, 0xc7, 0x28, 0xa1, 0x8a, 0x0b, 0x9b, - 0x4d, 0x4a, 0x2c, 0x6d, 0x85, 0x3f, 0x09, 0x72, 0x3c, 0x67, 0xe2, - 0xd9, 0xdc, 0x07, 0xba, 0xeb, 0x65, 0x7b, 0x5a, 0x01, 0x63, 0xd6, - 0x90, 0x5b, 0x4f, 0x17, 0x66, 0x3d, 0x7f, 0x0b, 0x19, 0xa3, 0x93, - 0x63, 0x10, 0x52, 0x2a, 0x9f, 0x14, 0x16, 0x58, 0xe2, 0xdc, 0xa5, - 0xf4, 0xa1, 0x16, 0x8b, 0x0e, 0x91, 0x8b, 0x81, 0xca, 0x9b, 0x59, - 0xfa, 0xd8, 0x6b, 0x91, 0x07, 0x65, 0x55, 0x5f, 0x52, 0x1f, 0xaf, - 0x3a, 0xfb, 0x90, 0xdd, 0x69, 0xa5, 0x5b, 0x9c, 0x6d, 0x0e, 0x2c, - 0xb6, 0xfa, 0xce, 0xac, 0xa5, 0x7c, 0x32, 0x4a, 0x67, 0x40, 0xdc, - 0x30, 0x34, 0x23, 0xdd, 0xd7, 0x04, 0x23, 0x66, 0xf0, 0xfc, 0x55, - 0x80, 0xa7, 0xfb, 0x66, 0x19, 0x82, 0x35, 0x67, 0x62, 0x70, 0x39, - 0x5e, 0x6f, 0xc7, 0xea, 0x90, 0x40, 0x44, 0x08, 0x1e, 0xb8, 0xb2, - 0xd6, 0xdb, 0xee, 0x59, 0xa7, 0x0d, 0x18, 0x79, 0x34, 0xbc, 0x54, - 0x18, 0x5e, 0x53, 0xca, 0x34, 0x51, 0xed, 0x45, 0x0a, 0xe6, 0x8e, - 0xc7, 0x82, 0x36, 0x3e, 0xa7, 0x38, 0x63, 0xa9, 0x30, 0x2c, 0x17, - 0x10, 0x60, 0x92, 0x9f, 0x55, 0x87, 0x12, 0x59, 0x10, 0xc2, 0x0f, - 0x67, 0x69, 0x11, 0xcc, 0x4e, 0x1e, 0x7e, 0x4a, 0x9a, 0xad, 0xaf, - 0x40, 0xa8, 0x75, 0xac, 0x56, 0x90, 0x74, 0xb8, 0xa0, 0x9c, 0xa5, - 0x79, 0x6f, 0xdc, 0xe9, 0x1a, 0xc8, 0x69, 0x05, 0xe9, 0xba, 0xfa, - 0x03, 0xb3, 0x7c, 0xe4, 0xe0, 0x4e, 0xc2, 0xce, 0x9d, 0xe8, 0xb6, - 0x46, 0x0d, 0x6e, 0x7e, 0x57, 0x3a, 0x67, 0x94, 0xc2, 0xcb, 0x1f, - 0x9c, 0x77, 0x4a, 0x67, 0x4e, 0x69, 0x86, 0x43, 0x93, 0x38, 0xfb, - 0xb6, 0xdb, 0x4f, 0x83, 0x91, 0xd4, 0x60, 0x7e, 0x4b, 0x3e, 0x2b, - 0x38, 0x07, 0x55, 0x98, 0x5e, 0xa4, 0x30, 0x82, 0x02, 0x3c, 0x30, - 0x82, 0x01, 0xa5, 0x02, 0x10, 0x3c, 0x91, 0x31, 0xcb, 0x1f, 0xf6, - 0xd0, 0x1b, 0x0e, 0x9a, 0xb8, 0xd0, 0x44, 0xbf, 0x12, 0xbe, 0x30, - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x05, 0x05, 0x00, 0x30, 0x5f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, - 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, - 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0e, 0x56, 0x65, 0x72, 0x69, - 0x53, 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, - 0x37, 0x30, 0x35, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2e, 0x43, - 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, - 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x39, 0x36, 0x30, 0x31, 0x32, 0x39, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x38, - 0x30, 0x38, 0x30, 0x32, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, - 0x30, 0x5f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x13, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, - 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x37, 0x30, 0x35, - 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2e, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x20, 0x33, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x43, 0x65, 0x72, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x81, - 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, - 0x89, 0x02, 0x81, 0x81, 0x00, 0xc9, 0x5c, 0x59, 0x9e, 0xf2, 0x1b, - 0x8a, 0x01, 0x14, 0xb4, 0x10, 0xdf, 0x04, 0x40, 0xdb, 0xe3, 0x57, - 0xaf, 0x6a, 0x45, 0x40, 0x8f, 0x84, 0x0c, 0x0b, 0xd1, 0x33, 0xd9, - 0xd9, 0x11, 0xcf, 0xee, 0x02, 0x58, 0x1f, 0x25, 0xf7, 0x2a, 0xa8, - 0x44, 0x05, 0xaa, 0xec, 0x03, 0x1f, 0x78, 0x7f, 0x9e, 0x93, 0xb9, - 0x9a, 0x00, 0xaa, 0x23, 0x7d, 0xd6, 0xac, 0x85, 0xa2, 0x63, 0x45, - 0xc7, 0x72, 0x27, 0xcc, 0xf4, 0x4c, 0xc6, 0x75, 0x71, 0xd2, 0x39, - 0xef, 0x4f, 0x42, 0xf0, 0x75, 0xdf, 0x0a, 0x90, 0xc6, 0x8e, 0x20, - 0x6f, 0x98, 0x0f, 0xf8, 0xac, 0x23, 0x5f, 0x70, 0x29, 0x36, 0xa4, - 0xc9, 0x86, 0xe7, 0xb1, 0x9a, 0x20, 0xcb, 0x53, 0xa5, 0x85, 0xe7, - 0x3d, 0xbe, 0x7d, 0x9a, 0xfe, 0x24, 0x45, 0x33, 0xdc, 0x76, 0x15, - 0xed, 0x0f, 0xa2, 0x71, 0x64, 0x4c, 0x65, 0x2e, 0x81, 0x68, 0x45, - 0xa7, 0x02, 0x03, 0x01, 0x00, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x03, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, + 0x04, 0x04, 0x03, 0x02, 0x01, 0xc6, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, - 0x81, 0x81, 0x00, 0x10, 0x72, 0x52, 0xa9, 0x05, 0x14, 0x19, 0x32, - 0x08, 0x41, 0xf0, 0xc5, 0x6b, 0x0a, 0xcc, 0x7e, 0x0f, 0x21, 0x19, - 0xcd, 0xe4, 0x67, 0xdc, 0x5f, 0xa9, 0x1b, 0xe6, 0xca, 0xe8, 0x73, - 0x9d, 0x22, 0xd8, 0x98, 0x6e, 0x73, 0x03, 0x61, 0x91, 0xc5, 0x7c, - 0xb0, 0x45, 0x40, 0x6e, 0x44, 0x9d, 0x8d, 0xb0, 0xb1, 0x96, 0x74, - 0x61, 0x2d, 0x0d, 0xa9, 0x45, 0xd2, 0xa4, 0x92, 0x2a, 0xd6, 0x9a, - 0x75, 0x97, 0x6e, 0x3f, 0x53, 0xfd, 0x45, 0x99, 0x60, 0x1d, 0xa8, - 0x2b, 0x4c, 0xf9, 0x5e, 0xa7, 0x09, 0xd8, 0x75, 0x30, 0xd7, 0xd2, - 0x65, 0x60, 0x3d, 0x67, 0xd6, 0x48, 0x55, 0x75, 0x69, 0x3f, 0x91, - 0xf5, 0x48, 0x0b, 0x47, 0x69, 0x22, 0x69, 0x82, 0x96, 0xbe, 0xc9, - 0xc8, 0x38, 0x86, 0x4a, 0x7a, 0x2c, 0x73, 0x19, 0x48, 0x69, 0x4e, - 0x6b, 0x7c, 0x65, 0xbf, 0x0f, 0xfc, 0x70, 0xce, 0x88, 0x90, 0x30, + 0x82, 0x01, 0x01, 0x00, 0x0e, 0x46, 0xd5, 0x3c, 0xae, 0xe2, 0x87, + 0xd9, 0x5e, 0x81, 0x8b, 0x02, 0x98, 0x41, 0x08, 0x8c, 0x4c, 0xbc, + 0xda, 0xdb, 0xee, 0x27, 0x1b, 0x82, 0xe7, 0x6a, 0x45, 0xec, 0x16, + 0x8b, 0x4f, 0x85, 0xa0, 0xf3, 0xb2, 0x70, 0xbd, 0x5a, 0x96, 0xba, + 0xca, 0x6e, 0x6d, 0xee, 0x46, 0x8b, 0x6e, 0xe7, 0x2a, 0x2e, 0x96, + 0xb3, 0x19, 0x33, 0xeb, 0xb4, 0x9f, 0xa8, 0xb2, 0x37, 0xee, 0x98, + 0xa8, 0x97, 0xb6, 0x2e, 0xb6, 0x67, 0x27, 0xd4, 0xa6, 0x49, 0xfd, + 0x1c, 0x93, 0x65, 0x76, 0x9e, 0x42, 0x2f, 0xdc, 0x22, 0x6c, 0x9a, + 0x4f, 0xf2, 0x5a, 0x15, 0x39, 0xb1, 0x71, 0xd7, 0x2b, 0x51, 0xe8, + 0x6d, 0x1c, 0x98, 0xc0, 0xd9, 0x2a, 0xf4, 0xa1, 0x82, 0x7b, 0xd5, + 0xc9, 0x41, 0xa2, 0x23, 0x01, 0x74, 0x38, 0x55, 0x8b, 0x0f, 0xb9, + 0x2e, 0x67, 0xa2, 0x20, 0x04, 0x37, 0xda, 0x9c, 0x0b, 0xd3, 0x17, + 0x21, 0xe0, 0x8f, 0x97, 0x79, 0x34, 0x6f, 0x84, 0x48, 0x02, 0x20, + 0x33, 0x1b, 0xe6, 0x34, 0x44, 0x9f, 0x91, 0x70, 0xf4, 0x80, 0x5e, + 0x84, 0x43, 0xc2, 0x29, 0xd2, 0x6c, 0x12, 0x14, 0xe4, 0x61, 0x8d, + 0xac, 0x10, 0x90, 0x9e, 0x84, 0x50, 0xbb, 0xf0, 0x96, 0x6f, 0x45, + 0x9f, 0x8a, 0xf3, 0xca, 0x6c, 0x4f, 0xfa, 0x11, 0x3a, 0x15, 0x15, + 0x46, 0xc3, 0xcd, 0x1f, 0x83, 0x5b, 0x2d, 0x41, 0x12, 0xed, 0x50, + 0x67, 0x41, 0x13, 0x3d, 0x21, 0xab, 0x94, 0x8a, 0xaa, 0x4e, 0x7c, + 0xc1, 0xb1, 0xfb, 0xa7, 0xd6, 0xb5, 0x27, 0x2f, 0x97, 0xab, 0x6e, + 0xe0, 0x1d, 0xe2, 0xd1, 0x1c, 0x2c, 0x1f, 0x44, 0xe2, 0xfc, 0xbe, + 0x91, 0xa1, 0x9c, 0xfb, 0xd6, 0x29, 0x53, 0x73, 0x86, 0x9f, 0x53, + 0xd8, 0x43, 0x0e, 0x5d, 0xd6, 0x63, 0x82, 0x71, 0x1d, 0x80, 0x74, + 0xca, 0xf6, 0xe2, 0x02, 0x6b, 0xd9, 0x5a, 0x30, 0x82, 0x03, 0x6d, + 0x30, 0x82, 0x02, 0x55, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, + 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x58, 0x31, 0x0b, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, 0x2b, + 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x22, 0x4a, 0x61, + 0x70, 0x61, 0x6e, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, + 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x53, + 0x65, 0x63, 0x75, 0x72, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, + 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x31, 0x31, 0x30, 0x1e, 0x17, 0x0d, + 0x30, 0x39, 0x30, 0x34, 0x30, 0x38, 0x30, 0x34, 0x35, 0x36, 0x34, + 0x37, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x30, 0x34, 0x30, 0x38, 0x30, + 0x34, 0x35, 0x36, 0x34, 0x37, 0x5a, 0x30, 0x58, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, + 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x22, 0x4a, + 0x61, 0x70, 0x61, 0x6e, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, + 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, + 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x20, + 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x31, 0x31, 0x30, 0x82, 0x01, + 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, + 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xfd, 0x77, 0xaa, + 0xa5, 0x1c, 0x90, 0x05, 0x3b, 0xcb, 0x4c, 0x9b, 0x33, 0x8b, 0x5a, + 0x14, 0x45, 0xa4, 0xe7, 0x90, 0x16, 0xd1, 0xdf, 0x57, 0xd2, 0x21, + 0x10, 0xa4, 0x17, 0xfd, 0xdf, 0xac, 0xd6, 0x1f, 0xa7, 0xe4, 0xdb, + 0x7c, 0xf7, 0xec, 0xdf, 0xb8, 0x03, 0xda, 0x94, 0x58, 0xfd, 0x5d, + 0x72, 0x7c, 0x8c, 0x3f, 0x5f, 0x01, 0x67, 0x74, 0x15, 0x96, 0xe3, + 0x02, 0x3c, 0x87, 0xdb, 0xae, 0xcb, 0x01, 0x8e, 0xc2, 0xf3, 0x66, + 0xc6, 0x85, 0x45, 0xf4, 0x02, 0xc6, 0x3a, 0xb5, 0x62, 0xb2, 0xaf, + 0xfa, 0x9c, 0xbf, 0xa4, 0xe6, 0xd4, 0x80, 0x30, 0x98, 0xf3, 0x0d, + 0xb6, 0x93, 0x8f, 0xa9, 0xd4, 0xd8, 0x36, 0xf2, 0xb0, 0xfc, 0x8a, + 0xca, 0x2c, 0xa1, 0x15, 0x33, 0x95, 0x31, 0xda, 0xc0, 0x1b, 0xf2, + 0xee, 0x62, 0x99, 0x86, 0x63, 0x3f, 0xbf, 0xdd, 0x93, 0x2a, 0x83, + 0xa8, 0x76, 0xb9, 0x13, 0x1f, 0xb7, 0xce, 0x4e, 0x42, 0x85, 0x8f, + 0x22, 0xe7, 0x2e, 0x1a, 0xf2, 0x95, 0x09, 0xb2, 0x05, 0xb5, 0x44, + 0x4e, 0x77, 0xa1, 0x20, 0xbd, 0xa9, 0xf2, 0x4e, 0x0a, 0x7d, 0x50, + 0xad, 0xf5, 0x05, 0x0d, 0x45, 0x4f, 0x46, 0x71, 0xfd, 0x28, 0x3e, + 0x53, 0xfb, 0x04, 0xd8, 0x2d, 0xd7, 0x65, 0x1d, 0x4a, 0x1b, 0xfa, + 0xcf, 0x3b, 0xb0, 0x31, 0x9a, 0x35, 0x6e, 0xc8, 0x8b, 0x06, 0xd3, + 0x00, 0x91, 0xf2, 0x94, 0x08, 0x65, 0x4c, 0xb1, 0x34, 0x06, 0x00, + 0x7a, 0x89, 0xe2, 0xf0, 0xc7, 0x03, 0x59, 0xcf, 0xd5, 0xd6, 0xe8, + 0xa7, 0x32, 0xb3, 0xe6, 0x98, 0x40, 0x86, 0xc5, 0xcd, 0x27, 0x12, + 0x8b, 0xcc, 0x7b, 0xce, 0xb7, 0x11, 0x3c, 0x62, 0x60, 0x07, 0x23, + 0x3e, 0x2b, 0x40, 0x6e, 0x94, 0x80, 0x09, 0x6d, 0xb6, 0xb3, 0x6f, + 0x77, 0x6f, 0x35, 0x08, 0x50, 0xfb, 0x02, 0x87, 0xc5, 0x3e, 0x89, + 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, + 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x5b, 0xf8, + 0x4d, 0x4f, 0xb2, 0xa5, 0x86, 0xd4, 0x3a, 0xd2, 0xf1, 0x63, 0x9a, + 0xa0, 0xbe, 0x09, 0xf6, 0x57, 0xb7, 0xde, 0x30, 0x0e, 0x06, 0x03, + 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, + 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, + 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x01, 0x00, 0xa0, 0xa1, 0x38, 0x16, 0x66, 0x2e, + 0xa7, 0x56, 0x1f, 0x21, 0x9c, 0x06, 0xfa, 0x1d, 0xed, 0xb9, 0x22, + 0xc5, 0x38, 0x26, 0xd8, 0x4e, 0x4f, 0xec, 0xa3, 0x7f, 0x79, 0xde, + 0x46, 0x21, 0xa1, 0x87, 0x77, 0x8f, 0x07, 0x08, 0x9a, 0xb2, 0xa4, + 0xc5, 0xaf, 0x0f, 0x32, 0x98, 0x0b, 0x7c, 0x66, 0x29, 0xb6, 0x9b, + 0x7d, 0x25, 0x52, 0x49, 0x43, 0xab, 0x4c, 0x2e, 0x2b, 0x6e, 0x7a, + 0x70, 0xaf, 0x16, 0x0e, 0xe3, 0x02, 0x6c, 0xfb, 0x42, 0xe6, 0x18, + 0x9d, 0x45, 0xd8, 0x55, 0xc8, 0xe8, 0x3b, 0xdd, 0xe7, 0xe1, 0xf4, + 0x2e, 0x0b, 0x1c, 0x34, 0x5c, 0x6c, 0x58, 0x4a, 0xfb, 0x8c, 0x88, + 0x50, 0x5f, 0x95, 0x1c, 0xbf, 0xed, 0xab, 0x22, 0xb5, 0x65, 0xb3, + 0x85, 0xba, 0x9e, 0x0f, 0xb8, 0xad, 0xe5, 0x7a, 0x1b, 0x8a, 0x50, + 0x3a, 0x1d, 0xbd, 0x0d, 0xbc, 0x7b, 0x54, 0x50, 0x0b, 0xb9, 0x42, + 0xaf, 0x55, 0xa0, 0x18, 0x81, 0xad, 0x65, 0x99, 0xef, 0xbe, 0xe4, + 0x9c, 0xbf, 0xc4, 0x85, 0xab, 0x41, 0xb2, 0x54, 0x6f, 0xdc, 0x25, + 0xcd, 0xed, 0x78, 0xe2, 0x8e, 0x0c, 0x8d, 0x09, 0x49, 0xdd, 0x63, + 0x7b, 0x5a, 0x69, 0x96, 0x02, 0x21, 0xa8, 0xbd, 0x52, 0x59, 0xe9, + 0x7d, 0x35, 0xcb, 0xc8, 0x52, 0xca, 0x7f, 0x81, 0xfe, 0xd9, 0x6b, + 0xd3, 0xf7, 0x11, 0xed, 0x25, 0xdf, 0xf8, 0xe7, 0xf9, 0xa4, 0xfa, + 0x72, 0x97, 0x84, 0x53, 0x0d, 0xa5, 0xd0, 0x32, 0x18, 0x51, 0x76, + 0x59, 0x14, 0x6c, 0x0f, 0xeb, 0xec, 0x5f, 0x80, 0x8c, 0x75, 0x43, + 0x83, 0xc3, 0x85, 0x98, 0xff, 0x4c, 0x9e, 0x2d, 0x0d, 0xe4, 0x77, + 0x83, 0x93, 0x4e, 0xb5, 0x96, 0x07, 0x8b, 0x28, 0x13, 0x9b, 0x8c, + 0x19, 0x8d, 0x41, 0x27, 0x49, 0x40, 0xee, 0xde, 0xe6, 0x23, 0x44, + 0x39, 0xdc, 0xa1, 0x22, 0xd6, 0xba, 0x03, 0xf2, 0x30, 0x82, 0x05, + 0xb5, 0x30, 0x82, 0x03, 0x9d, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, + 0x08, 0x61, 0x8d, 0xc7, 0x86, 0x3b, 0x01, 0x82, 0x05, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, + 0x05, 0x00, 0x30, 0x44, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x0c, 0x0d, 0x41, 0x43, 0x45, 0x44, 0x49, 0x43, 0x4f, + 0x4d, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x31, 0x0c, 0x30, 0x0a, 0x06, + 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x03, 0x50, 0x4b, 0x49, 0x31, 0x0f, + 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x06, 0x45, 0x44, + 0x49, 0x43, 0x4f, 0x4d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x30, 0x1e, 0x17, 0x0d, 0x30, + 0x38, 0x30, 0x34, 0x31, 0x38, 0x31, 0x36, 0x32, 0x34, 0x32, 0x32, + 0x5a, 0x17, 0x0d, 0x32, 0x38, 0x30, 0x34, 0x31, 0x33, 0x31, 0x36, + 0x32, 0x34, 0x32, 0x32, 0x5a, 0x30, 0x44, 0x31, 0x16, 0x30, 0x14, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0d, 0x41, 0x43, 0x45, 0x44, + 0x49, 0x43, 0x4f, 0x4d, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x31, 0x0c, + 0x30, 0x0a, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x03, 0x50, 0x4b, + 0x49, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, + 0x06, 0x45, 0x44, 0x49, 0x43, 0x4f, 0x4d, 0x31, 0x0b, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x30, 0x82, + 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, + 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xff, 0x92, + 0x95, 0xe1, 0x68, 0x06, 0x76, 0xb4, 0x2c, 0xc8, 0x58, 0x48, 0xca, + 0xfd, 0x80, 0x54, 0x29, 0x55, 0x63, 0x24, 0xff, 0x90, 0x65, 0x9b, + 0x10, 0x75, 0x7b, 0xc3, 0x6a, 0xdb, 0x62, 0x02, 0x01, 0xf2, 0x18, + 0x86, 0xb5, 0x7c, 0x5a, 0x38, 0xb1, 0xe4, 0x58, 0xb9, 0xfb, 0xd3, + 0xd8, 0x2d, 0x9f, 0xbd, 0x32, 0x37, 0xbf, 0x2c, 0x15, 0x6d, 0xbe, + 0xb5, 0xf4, 0x21, 0xd2, 0x13, 0x91, 0xd9, 0x07, 0xad, 0x01, 0x05, + 0xd6, 0xf3, 0xbd, 0x77, 0xce, 0x5f, 0x42, 0x81, 0x0a, 0xf9, 0x6a, + 0xe3, 0x83, 0x00, 0xa8, 0x2b, 0x2e, 0x55, 0x13, 0x63, 0x81, 0xca, + 0x47, 0x1c, 0x7b, 0x5c, 0x16, 0x57, 0x7a, 0x1b, 0x83, 0x60, 0x04, + 0x3a, 0x3e, 0x65, 0xc3, 0xcd, 0x01, 0xde, 0xde, 0xa4, 0xd6, 0x0c, + 0xba, 0x8e, 0xde, 0xd9, 0x04, 0xee, 0x17, 0x56, 0x22, 0x9b, 0x8f, + 0x63, 0xfd, 0x4d, 0x16, 0x0b, 0xb7, 0x7b, 0x77, 0x8c, 0xf9, 0x25, + 0xb5, 0xd1, 0x6d, 0x99, 0x12, 0x2e, 0x4f, 0x1a, 0xb8, 0xe6, 0xea, + 0x04, 0x92, 0xae, 0x3d, 0x11, 0xb9, 0x51, 0x42, 0x3d, 0x87, 0xb0, + 0x31, 0x85, 0xaf, 0x79, 0x5a, 0x9c, 0xfe, 0xe7, 0x4e, 0x5e, 0x92, + 0x4f, 0x43, 0xfc, 0xab, 0x3a, 0xad, 0xa5, 0x12, 0x26, 0x66, 0xb9, + 0xe2, 0x0c, 0xd7, 0x98, 0xce, 0xd4, 0x58, 0xa5, 0x95, 0x40, 0x0a, + 0xb7, 0x44, 0x9d, 0x13, 0x74, 0x2b, 0xc2, 0xa5, 0xeb, 0x22, 0x15, + 0x98, 0x10, 0xd8, 0x8b, 0xc5, 0x04, 0x9f, 0x1d, 0x8f, 0x60, 0xe5, + 0x06, 0x1b, 0x9b, 0xcf, 0xb9, 0x79, 0xa0, 0x3d, 0xa2, 0x23, 0x3f, + 0x42, 0x3f, 0x6b, 0xfa, 0x1c, 0x03, 0x7b, 0x30, 0x8d, 0xce, 0x6c, + 0xc0, 0xbf, 0xe6, 0x1b, 0x5f, 0xbf, 0x67, 0xb8, 0x84, 0x19, 0xd5, + 0x15, 0xef, 0x7b, 0xcb, 0x90, 0x36, 0x31, 0x62, 0xc9, 0xbc, 0x02, + 0xab, 0x46, 0x5f, 0x9b, 0xfe, 0x1a, 0x68, 0x94, 0x34, 0x3d, 0x90, + 0x8e, 0xad, 0xf6, 0xe4, 0x1d, 0x09, 0x7f, 0x4a, 0x88, 0x38, 0x3f, + 0xbe, 0x67, 0xfd, 0x34, 0x96, 0xf5, 0x1d, 0xbc, 0x30, 0x74, 0xcb, + 0x38, 0xee, 0xd5, 0x6c, 0xab, 0xd4, 0xfc, 0xf4, 0x00, 0xb7, 0x00, + 0x5b, 0x85, 0x32, 0x16, 0x76, 0x33, 0xe9, 0xd8, 0xa3, 0x99, 0x9d, + 0x05, 0x00, 0xaa, 0x16, 0xe6, 0xf3, 0x81, 0x7d, 0x6f, 0x7d, 0xaa, + 0x86, 0x6d, 0xad, 0x15, 0x74, 0xd3, 0xc4, 0xa2, 0x71, 0xaa, 0xf4, + 0x14, 0x7d, 0xe7, 0x32, 0xb8, 0x1f, 0xbc, 0xd5, 0xf1, 0x4e, 0xbd, + 0x6f, 0x17, 0x02, 0x39, 0xd7, 0x0e, 0x95, 0x42, 0x3a, 0xc7, 0x00, + 0x3e, 0xe9, 0x26, 0x63, 0x11, 0xea, 0x0b, 0xd1, 0x4a, 0xff, 0x18, + 0x9d, 0xb2, 0xd7, 0x7b, 0x2f, 0x3a, 0xd9, 0x96, 0xfb, 0xe8, 0x1e, + 0x92, 0xae, 0x13, 0x55, 0xc8, 0xd9, 0x27, 0xf6, 0xdc, 0x48, 0x1b, + 0xb0, 0x24, 0xc1, 0x85, 0xe3, 0x77, 0x9d, 0x9a, 0xa4, 0xf3, 0x0c, + 0x11, 0x1d, 0x0d, 0xc8, 0xb4, 0x14, 0xee, 0xb5, 0x82, 0x57, 0x09, + 0xbf, 0x20, 0x58, 0x7f, 0x2f, 0x22, 0x23, 0xd8, 0x70, 0xcb, 0x79, + 0x6c, 0xc9, 0x4b, 0xf2, 0xa9, 0x2a, 0xc8, 0xfc, 0x87, 0x2b, 0xd7, + 0x1a, 0x50, 0xf8, 0x27, 0xe8, 0x2f, 0x43, 0xe3, 0x3a, 0xbd, 0xd8, + 0x57, 0x71, 0xfd, 0xce, 0xa6, 0x52, 0x5b, 0xf9, 0xdd, 0x4d, 0xed, + 0xe5, 0xf6, 0x6f, 0x89, 0xed, 0xbb, 0x93, 0x9c, 0x76, 0x21, 0x75, + 0xf0, 0x92, 0x4c, 0x29, 0xf7, 0x2f, 0x9c, 0x01, 0x2e, 0xfe, 0x50, + 0x46, 0x9e, 0x64, 0x0c, 0x14, 0xb3, 0x07, 0x5b, 0xc5, 0xc2, 0x73, + 0x6c, 0xf1, 0x07, 0x5c, 0x45, 0x24, 0x14, 0x35, 0xae, 0x83, 0xf1, + 0x6a, 0x4d, 0x89, 0x7a, 0xfa, 0xb3, 0xd8, 0x2d, 0x66, 0xf0, 0x36, + 0x87, 0xf5, 0x2b, 0x53, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, + 0xaa, 0x30, 0x81, 0xa7, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, + 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, + 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, + 0x14, 0xa6, 0xb3, 0xe1, 0x2b, 0x2b, 0x49, 0xb6, 0xd7, 0x73, 0xa1, + 0xaa, 0x94, 0xf5, 0x01, 0xe7, 0x73, 0x65, 0x4c, 0xac, 0x50, 0x30, + 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, + 0x03, 0x02, 0x01, 0x86, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, + 0x04, 0x16, 0x04, 0x14, 0xa6, 0xb3, 0xe1, 0x2b, 0x2b, 0x49, 0xb6, + 0xd7, 0x73, 0xa1, 0xaa, 0x94, 0xf5, 0x01, 0xe7, 0x73, 0x65, 0x4c, + 0xac, 0x50, 0x30, 0x44, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x3d, + 0x30, 0x3b, 0x30, 0x39, 0x06, 0x04, 0x55, 0x1d, 0x20, 0x00, 0x30, + 0x31, 0x30, 0x2f, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, + 0x02, 0x01, 0x16, 0x23, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x61, 0x63, 0x65, 0x64, 0x69, 0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x64, + 0x69, 0x63, 0x6f, 0x6d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x64, 0x6f, 0x63, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, + 0x82, 0x02, 0x01, 0x00, 0xce, 0x2c, 0x0b, 0x52, 0x51, 0x62, 0x26, + 0x7d, 0x0c, 0x27, 0x83, 0x8f, 0xc5, 0xf6, 0xda, 0xa0, 0x68, 0x7b, + 0x4f, 0x92, 0x5e, 0xea, 0xa4, 0x73, 0x32, 0x11, 0x53, 0x44, 0xb2, + 0x44, 0xcb, 0x9d, 0xec, 0x0f, 0x79, 0x42, 0xb3, 0x10, 0xa6, 0xc7, + 0x0d, 0x9d, 0xcb, 0xb6, 0xfa, 0x3f, 0x3a, 0x7c, 0xea, 0xbf, 0x88, + 0x53, 0x1b, 0x3c, 0xf7, 0x82, 0xfa, 0x05, 0x35, 0x33, 0xe1, 0x35, + 0xa8, 0x57, 0xc0, 0xe7, 0xfd, 0x8d, 0x4f, 0x3f, 0x93, 0x32, 0x4f, + 0x78, 0x66, 0x03, 0x77, 0x07, 0x58, 0xe9, 0x95, 0xc8, 0x7e, 0x3e, + 0xd0, 0x79, 0x00, 0x8c, 0xf2, 0x1b, 0x51, 0x33, 0x9b, 0xbc, 0x94, + 0xe9, 0x3a, 0x7b, 0x6e, 0x52, 0x2d, 0x32, 0x9e, 0x23, 0xa4, 0x45, + 0xfb, 0xb6, 0x2e, 0x13, 0xb0, 0x8b, 0x18, 0xb1, 0xdd, 0xce, 0xd5, + 0x1d, 0xa7, 0x42, 0x7f, 0x55, 0xbe, 0xfb, 0x5b, 0xbb, 0x47, 0xd4, + 0xfc, 0x24, 0xcd, 0x04, 0xae, 0x96, 0x05, 0x15, 0xd6, 0xac, 0xce, + 0x30, 0xf3, 0xca, 0x0b, 0xc5, 0xba, 0xe2, 0x22, 0xe0, 0xa6, 0xad, + 0x22, 0xe4, 0x02, 0xee, 0x74, 0x11, 0x7f, 0x4c, 0xff, 0x78, 0x1d, + 0x35, 0xda, 0xe6, 0x02, 0x34, 0xeb, 0x18, 0x12, 0x61, 0x77, 0x06, + 0x09, 0x16, 0x63, 0xea, 0x18, 0xad, 0xa2, 0x87, 0x1f, 0xf2, 0xc7, + 0x80, 0x09, 0x09, 0x75, 0x4e, 0x10, 0xa8, 0x8f, 0x3d, 0x86, 0xb8, + 0x75, 0x11, 0xc0, 0x24, 0x62, 0x8a, 0x96, 0x7b, 0x4a, 0x45, 0xe9, + 0xec, 0x59, 0xc5, 0xbe, 0x6b, 0x83, 0xe6, 0xe1, 0xe8, 0xac, 0xb5, + 0x30, 0x1e, 0xfe, 0x05, 0x07, 0x80, 0xf9, 0xe1, 0x23, 0x0d, 0x50, + 0x8f, 0x05, 0x98, 0xff, 0x2c, 0x5f, 0xe8, 0x3b, 0xb6, 0xad, 0xcf, + 0x81, 0xb5, 0x21, 0x87, 0xca, 0x08, 0x2a, 0x23, 0x27, 0x30, 0x20, + 0x2b, 0xcf, 0xed, 0x94, 0x5b, 0xac, 0xb2, 0x7a, 0xd2, 0xc7, 0x28, + 0xa1, 0x8a, 0x0b, 0x9b, 0x4d, 0x4a, 0x2c, 0x6d, 0x85, 0x3f, 0x09, + 0x72, 0x3c, 0x67, 0xe2, 0xd9, 0xdc, 0x07, 0xba, 0xeb, 0x65, 0x7b, + 0x5a, 0x01, 0x63, 0xd6, 0x90, 0x5b, 0x4f, 0x17, 0x66, 0x3d, 0x7f, + 0x0b, 0x19, 0xa3, 0x93, 0x63, 0x10, 0x52, 0x2a, 0x9f, 0x14, 0x16, + 0x58, 0xe2, 0xdc, 0xa5, 0xf4, 0xa1, 0x16, 0x8b, 0x0e, 0x91, 0x8b, + 0x81, 0xca, 0x9b, 0x59, 0xfa, 0xd8, 0x6b, 0x91, 0x07, 0x65, 0x55, + 0x5f, 0x52, 0x1f, 0xaf, 0x3a, 0xfb, 0x90, 0xdd, 0x69, 0xa5, 0x5b, + 0x9c, 0x6d, 0x0e, 0x2c, 0xb6, 0xfa, 0xce, 0xac, 0xa5, 0x7c, 0x32, + 0x4a, 0x67, 0x40, 0xdc, 0x30, 0x34, 0x23, 0xdd, 0xd7, 0x04, 0x23, + 0x66, 0xf0, 0xfc, 0x55, 0x80, 0xa7, 0xfb, 0x66, 0x19, 0x82, 0x35, + 0x67, 0x62, 0x70, 0x39, 0x5e, 0x6f, 0xc7, 0xea, 0x90, 0x40, 0x44, + 0x08, 0x1e, 0xb8, 0xb2, 0xd6, 0xdb, 0xee, 0x59, 0xa7, 0x0d, 0x18, + 0x79, 0x34, 0xbc, 0x54, 0x18, 0x5e, 0x53, 0xca, 0x34, 0x51, 0xed, + 0x45, 0x0a, 0xe6, 0x8e, 0xc7, 0x82, 0x36, 0x3e, 0xa7, 0x38, 0x63, + 0xa9, 0x30, 0x2c, 0x17, 0x10, 0x60, 0x92, 0x9f, 0x55, 0x87, 0x12, + 0x59, 0x10, 0xc2, 0x0f, 0x67, 0x69, 0x11, 0xcc, 0x4e, 0x1e, 0x7e, + 0x4a, 0x9a, 0xad, 0xaf, 0x40, 0xa8, 0x75, 0xac, 0x56, 0x90, 0x74, + 0xb8, 0xa0, 0x9c, 0xa5, 0x79, 0x6f, 0xdc, 0xe9, 0x1a, 0xc8, 0x69, + 0x05, 0xe9, 0xba, 0xfa, 0x03, 0xb3, 0x7c, 0xe4, 0xe0, 0x4e, 0xc2, + 0xce, 0x9d, 0xe8, 0xb6, 0x46, 0x0d, 0x6e, 0x7e, 0x57, 0x3a, 0x67, + 0x94, 0xc2, 0xcb, 0x1f, 0x9c, 0x77, 0x4a, 0x67, 0x4e, 0x69, 0x86, + 0x43, 0x93, 0x38, 0xfb, 0xb6, 0xdb, 0x4f, 0x83, 0x91, 0xd4, 0x60, + 0x7e, 0x4b, 0x3e, 0x2b, 0x38, 0x07, 0x55, 0x98, 0x5e, 0xa4, 0x30, 0x82, 0x04, 0x0a, 0x30, 0x82, 0x02, 0xf2, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0xc2, 0x7e, 0x43, 0x04, 0x4e, 0x47, 0x3f, 0x19, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, @@ -11257,646 +9256,291 @@ static const unsigned char ca_bundle_data[] = { 0x55, 0x6f, 0xdf, 0x84, 0xee, 0x05, 0x09, 0x4d, 0xbd, 0x28, 0xd8, 0x72, 0xce, 0xd3, 0x62, 0x50, 0x65, 0x1e, 0xeb, 0x92, 0x97, 0x83, 0x31, 0xd9, 0xb3, 0xb5, 0xca, 0x47, 0x58, 0x3f, 0x5f, 0x30, 0x82, - 0x03, 0xe1, 0x30, 0x82, 0x02, 0xc9, 0xa0, 0x03, 0x02, 0x01, 0x02, - 0x02, 0x0e, 0x63, 0x25, 0x00, 0x01, 0x00, 0x02, 0x14, 0x8d, 0x33, - 0x15, 0x02, 0xe4, 0x6c, 0xf4, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x7b, - 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x44, 0x45, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x13, 0x13, 0x54, 0x43, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, - 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x47, 0x6d, 0x62, 0x48, 0x31, - 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1b, 0x54, - 0x43, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, - 0x6c, 0x20, 0x43, 0x41, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, - 0x04, 0x03, 0x13, 0x1f, 0x54, 0x43, 0x20, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x55, 0x6e, 0x69, - 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x20, 0x43, 0x41, 0x20, 0x49, - 0x49, 0x49, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, 0x30, 0x39, 0x30, - 0x39, 0x30, 0x38, 0x31, 0x35, 0x32, 0x37, 0x5a, 0x17, 0x0d, 0x32, - 0x39, 0x31, 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, - 0x5a, 0x30, 0x7b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x13, 0x54, 0x43, 0x20, 0x54, 0x72, 0x75, - 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x47, 0x6d, - 0x62, 0x48, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0b, - 0x13, 0x1b, 0x54, 0x43, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, - 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, - 0x72, 0x73, 0x61, 0x6c, 0x20, 0x43, 0x41, 0x31, 0x28, 0x30, 0x26, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1f, 0x54, 0x43, 0x20, 0x54, - 0x72, 0x75, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, - 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x20, 0x43, - 0x41, 0x20, 0x49, 0x49, 0x49, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, - 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, - 0x02, 0x82, 0x01, 0x01, 0x00, 0xc2, 0xda, 0x9c, 0x62, 0xb0, 0xb9, - 0x71, 0x12, 0xb0, 0x0b, 0xc8, 0x1a, 0x57, 0xb2, 0xae, 0x83, 0x14, - 0x99, 0xb3, 0x34, 0x4b, 0x9b, 0x90, 0xa2, 0xc5, 0xe7, 0xe7, 0x2f, - 0x02, 0xa0, 0x4d, 0x2d, 0xa4, 0xfa, 0x85, 0xda, 0x9b, 0x25, 0x85, - 0x2d, 0x40, 0x28, 0x20, 0x6d, 0xea, 0xe0, 0xbd, 0xb1, 0x48, 0x83, - 0x22, 0x29, 0x44, 0x9f, 0x4e, 0x83, 0xee, 0x35, 0x51, 0x13, 0x73, - 0x74, 0xd5, 0xbc, 0xf2, 0x30, 0x66, 0x94, 0x53, 0xc0, 0x40, 0x36, - 0x2f, 0x0c, 0x84, 0x65, 0xce, 0x0f, 0x6e, 0xc2, 0x58, 0x93, 0xe8, - 0x2c, 0x0b, 0x3a, 0xe9, 0xc1, 0x8e, 0xfb, 0xf2, 0x6b, 0xca, 0x3c, - 0xe2, 0x9c, 0x4e, 0x8e, 0xe4, 0xf9, 0x7d, 0xd3, 0x27, 0x9f, 0x1b, - 0xd5, 0x67, 0x78, 0x87, 0x2d, 0x7f, 0x0b, 0x47, 0xb3, 0xc7, 0xe8, - 0xc9, 0x48, 0x7c, 0xaf, 0x2f, 0xcc, 0x0a, 0xd9, 0x41, 0xef, 0x9f, - 0xfe, 0x9a, 0xe1, 0xb2, 0xae, 0xf9, 0x53, 0xb5, 0xe5, 0xe9, 0x46, - 0x9f, 0x60, 0xe3, 0xdf, 0x8d, 0xd3, 0x7f, 0xfb, 0x96, 0x7e, 0xb3, - 0xb5, 0x72, 0xf8, 0x4b, 0xad, 0x08, 0x79, 0xcd, 0x69, 0x89, 0x40, - 0x27, 0xf5, 0x2a, 0xc1, 0xad, 0x43, 0xec, 0xa4, 0x53, 0xc8, 0x61, - 0xb6, 0xf7, 0xd2, 0x79, 0x2a, 0x67, 0x18, 0x76, 0x48, 0x6d, 0x5b, - 0x25, 0x01, 0xd1, 0x26, 0xc5, 0xb7, 0x57, 0x69, 0x23, 0x15, 0x5b, - 0x61, 0x8a, 0xad, 0xf0, 0x1b, 0x2d, 0xd9, 0xaf, 0x5c, 0xf1, 0x26, - 0x90, 0x69, 0xa9, 0xd5, 0x0c, 0x40, 0xf5, 0x33, 0x80, 0x43, 0x8f, - 0x9c, 0xa3, 0x76, 0x2a, 0x45, 0xb4, 0xaf, 0xbf, 0x7f, 0x3e, 0x87, - 0x3f, 0x76, 0xc5, 0xcd, 0x2a, 0xde, 0x20, 0xc5, 0x16, 0x58, 0xcb, - 0xf9, 0x1b, 0xf5, 0x0f, 0xcb, 0x0d, 0x11, 0x52, 0x64, 0xb8, 0xd2, - 0x76, 0x62, 0x77, 0x83, 0xf1, 0x58, 0x9f, 0xff, 0x02, 0x03, 0x01, - 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x1f, 0x06, 0x03, 0x55, - 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x56, 0xe7, 0xe1, - 0x5b, 0x25, 0x43, 0x80, 0xe0, 0xf6, 0x8c, 0xe1, 0x71, 0xbc, 0x8e, - 0xe5, 0x80, 0x2f, 0xc4, 0x48, 0xe2, 0x30, 0x0f, 0x06, 0x03, 0x55, - 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, - 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, - 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, - 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x56, 0xe7, 0xe1, 0x5b, 0x25, - 0x43, 0x80, 0xe0, 0xf6, 0x8c, 0xe1, 0x71, 0xbc, 0x8e, 0xe5, 0x80, - 0x2f, 0xc4, 0x48, 0xe2, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, - 0x01, 0x00, 0x83, 0xc7, 0xaf, 0xea, 0x7f, 0x4d, 0x0a, 0x3c, 0x39, - 0xb1, 0x68, 0xbe, 0x7b, 0x6d, 0x89, 0x2e, 0xe9, 0xb3, 0x09, 0xe7, - 0x18, 0x57, 0x8d, 0x85, 0x9a, 0x17, 0xf3, 0x76, 0x42, 0x50, 0x13, - 0x0f, 0xc7, 0x90, 0x6f, 0x33, 0xad, 0xc5, 0x49, 0x60, 0x2b, 0x6c, - 0x49, 0x58, 0x19, 0xd4, 0xe2, 0xbe, 0xb7, 0xbf, 0xab, 0x49, 0xbc, - 0x94, 0xc8, 0xab, 0xbe, 0x28, 0x6c, 0x16, 0x68, 0xe0, 0xc8, 0x97, - 0x46, 0x20, 0xa0, 0x68, 0x67, 0x60, 0x88, 0x39, 0x20, 0x51, 0xd8, - 0x68, 0x01, 0x11, 0xce, 0xa7, 0xf6, 0x11, 0x07, 0xf6, 0xec, 0xec, - 0xac, 0x1a, 0x1f, 0xb2, 0x66, 0x6e, 0x56, 0x67, 0x60, 0x7a, 0x74, - 0x5e, 0xc0, 0x6d, 0x97, 0x36, 0xae, 0xb5, 0x0d, 0x5d, 0x66, 0x73, - 0xc0, 0x25, 0x32, 0x45, 0xd8, 0x4a, 0x06, 0x07, 0x8f, 0xc4, 0xb7, - 0x07, 0xb1, 0x4d, 0x06, 0x0d, 0xe1, 0xa5, 0xeb, 0xf4, 0x75, 0xca, - 0xba, 0x9c, 0xd0, 0xbd, 0xb3, 0xd3, 0x32, 0x24, 0x4c, 0xee, 0x7e, - 0xe2, 0x76, 0x04, 0x4b, 0x49, 0x53, 0xd8, 0xf2, 0xe9, 0x54, 0x33, - 0xfc, 0xe5, 0x71, 0x1f, 0x3d, 0x14, 0x5c, 0x96, 0x4b, 0xf1, 0x3a, - 0xf2, 0x00, 0xbb, 0x6c, 0xb4, 0xfa, 0x96, 0x55, 0x08, 0x88, 0x09, - 0xc1, 0xcc, 0x91, 0x19, 0x29, 0xb0, 0x20, 0x2d, 0xff, 0xcb, 0x38, - 0xa4, 0x40, 0xe1, 0x17, 0xbe, 0x79, 0x61, 0x80, 0xff, 0x07, 0x03, - 0x86, 0x4c, 0x4e, 0x7b, 0x06, 0x9f, 0x11, 0x86, 0x8d, 0x89, 0xee, - 0x27, 0xc4, 0xdb, 0xe2, 0xbc, 0x19, 0x8e, 0x0b, 0xc3, 0xc3, 0x13, - 0xc7, 0x2d, 0x03, 0x63, 0x3b, 0xd3, 0xe8, 0xe4, 0xa2, 0x2a, 0xc2, - 0x82, 0x08, 0x94, 0x16, 0x54, 0xf0, 0xef, 0x1f, 0x27, 0x90, 0x25, - 0xb8, 0x0d, 0x0e, 0x28, 0x1b, 0x47, 0x77, 0x47, 0xbd, 0x1c, 0xa8, - 0x25, 0xf1, 0x94, 0xb4, 0x66, 0x30, 0x82, 0x06, 0x14, 0x30, 0x82, - 0x03, 0xfc, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x53, 0xec, - 0x3b, 0xee, 0xfb, 0xb2, 0x48, 0x5f, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, - 0x51, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, - 0x02, 0x45, 0x53, 0x31, 0x42, 0x30, 0x40, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x0c, 0x39, 0x41, 0x75, 0x74, 0x6f, 0x72, 0x69, 0x64, 0x61, - 0x64, 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x20, 0x46, 0x69, 0x72, - 0x6d, 0x61, 0x70, 0x72, 0x6f, 0x66, 0x65, 0x73, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x20, 0x43, 0x49, 0x46, 0x20, 0x41, 0x36, 0x32, 0x36, - 0x33, 0x34, 0x30, 0x36, 0x38, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, - 0x30, 0x35, 0x32, 0x30, 0x30, 0x38, 0x33, 0x38, 0x31, 0x35, 0x5a, - 0x17, 0x0d, 0x33, 0x30, 0x31, 0x32, 0x33, 0x31, 0x30, 0x38, 0x33, - 0x38, 0x31, 0x35, 0x5a, 0x30, 0x51, 0x31, 0x0b, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x42, 0x30, - 0x40, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x39, 0x41, 0x75, 0x74, - 0x6f, 0x72, 0x69, 0x64, 0x61, 0x64, 0x20, 0x64, 0x65, 0x20, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, - 0x6e, 0x20, 0x46, 0x69, 0x72, 0x6d, 0x61, 0x70, 0x72, 0x6f, 0x66, - 0x65, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x43, 0x49, 0x46, - 0x20, 0x41, 0x36, 0x32, 0x36, 0x33, 0x34, 0x30, 0x36, 0x38, 0x30, - 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, - 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xca, - 0x96, 0x6b, 0x8e, 0xea, 0xf8, 0xfb, 0xf1, 0xa2, 0x35, 0xe0, 0x7f, - 0x4c, 0xda, 0xe0, 0xc3, 0x52, 0xd7, 0x7d, 0xb6, 0x10, 0xc8, 0x02, - 0x5e, 0xb3, 0x43, 0x2a, 0xc4, 0x4f, 0x6a, 0xb2, 0xca, 0x1c, 0x5d, - 0x28, 0x9a, 0x78, 0x11, 0x1a, 0x69, 0x59, 0x57, 0xaf, 0xb5, 0x20, - 0x42, 0xe4, 0x8b, 0x0f, 0xe6, 0xdf, 0x5b, 0xa6, 0x03, 0x92, 0x2f, - 0xf5, 0x11, 0xe4, 0x62, 0xd7, 0x32, 0x71, 0x38, 0xd9, 0x04, 0x0c, - 0x71, 0xab, 0x3d, 0x51, 0x7e, 0x0f, 0x07, 0xdf, 0x63, 0x05, 0x5c, - 0xe9, 0xbf, 0x94, 0x6f, 0xc1, 0x29, 0x82, 0xc0, 0xb4, 0xda, 0x51, - 0xb0, 0xc1, 0x3c, 0xbb, 0xad, 0x37, 0x4a, 0x5c, 0xca, 0xf1, 0x4b, - 0x36, 0x0e, 0x24, 0xab, 0xbf, 0xc3, 0x84, 0x77, 0xfd, 0xa8, 0x50, - 0xf4, 0xb1, 0xe7, 0xc6, 0x2f, 0xd2, 0x2d, 0x59, 0x8d, 0x7a, 0x0a, - 0x4e, 0x96, 0x69, 0x52, 0x02, 0xaa, 0x36, 0x98, 0xec, 0xfc, 0xfa, - 0x14, 0x83, 0x0c, 0x37, 0x1f, 0xc9, 0x92, 0x37, 0x7f, 0xd7, 0x81, - 0x2d, 0xe5, 0xc4, 0xb9, 0xe0, 0x3e, 0x34, 0xfe, 0x67, 0xf4, 0x3e, - 0x66, 0xd1, 0xd3, 0xf4, 0x40, 0xcf, 0x5e, 0x62, 0x34, 0x0f, 0x70, - 0x06, 0x3e, 0x20, 0x18, 0x5a, 0xce, 0xf7, 0x72, 0x1b, 0x25, 0x6c, - 0x93, 0x74, 0x14, 0x93, 0xa3, 0x73, 0xb1, 0x0e, 0xaa, 0x87, 0x10, - 0x23, 0x59, 0x5f, 0x20, 0x05, 0x19, 0x47, 0xed, 0x68, 0x8e, 0x92, - 0x12, 0xca, 0x5d, 0xfc, 0xd6, 0x2b, 0xb2, 0x92, 0x3c, 0x20, 0xcf, - 0xe1, 0x5f, 0xaf, 0x20, 0xbe, 0xa0, 0x76, 0x7f, 0x76, 0xe5, 0xec, - 0x1a, 0x86, 0x61, 0x33, 0x3e, 0xe7, 0x7b, 0xb4, 0x3f, 0xa0, 0x0f, - 0x8e, 0xa2, 0xb9, 0x6a, 0x6f, 0xb9, 0x87, 0x26, 0x6f, 0x41, 0x6c, - 0x88, 0xa6, 0x50, 0xfd, 0x6a, 0x63, 0x0b, 0xf5, 0x93, 0x16, 0x1b, - 0x19, 0x8f, 0xb2, 0xed, 0x9b, 0x9b, 0xc9, 0x90, 0xf5, 0x01, 0x0c, - 0xdf, 0x19, 0x3d, 0x0f, 0x3e, 0x38, 0x23, 0xc9, 0x2f, 0x8f, 0x0c, - 0xd1, 0x02, 0xfe, 0x1b, 0x55, 0xd6, 0x4e, 0xd0, 0x8d, 0x3c, 0xaf, - 0x4f, 0xa4, 0xf3, 0xfe, 0xaf, 0x2a, 0xd3, 0x05, 0x9d, 0x79, 0x08, - 0xa1, 0xcb, 0x57, 0x31, 0xb4, 0x9c, 0xc8, 0x90, 0xb2, 0x67, 0xf4, - 0x18, 0x16, 0x93, 0x3a, 0xfc, 0x47, 0xd8, 0xd1, 0x78, 0x96, 0x31, - 0x1f, 0xba, 0x2b, 0x0c, 0x5f, 0x5d, 0x99, 0xad, 0x63, 0x89, 0x5a, - 0x24, 0x20, 0x76, 0xd8, 0xdf, 0xfd, 0xab, 0x4e, 0xa6, 0x22, 0xaa, - 0x9d, 0x5e, 0xe6, 0x27, 0x8a, 0x7d, 0x68, 0x29, 0xa3, 0xe7, 0x8a, - 0xb8, 0xda, 0x11, 0xbb, 0x17, 0x2d, 0x99, 0x9d, 0x13, 0x24, 0x46, - 0xf7, 0xc5, 0xe2, 0xd8, 0x9f, 0x8e, 0x7f, 0xc7, 0x8f, 0x74, 0x6d, - 0x5a, 0xb2, 0xe8, 0x72, 0xf5, 0xac, 0xee, 0x24, 0x10, 0xad, 0x2f, - 0x14, 0xda, 0xff, 0x2d, 0x9a, 0x46, 0x71, 0x47, 0xbe, 0x42, 0xdf, - 0xbb, 0x01, 0xdb, 0xf4, 0x7f, 0xd3, 0x28, 0x8f, 0x31, 0x59, 0x5b, - 0xd3, 0xc9, 0x02, 0xa6, 0xb4, 0x52, 0xca, 0x6e, 0x97, 0xfb, 0x43, - 0xc5, 0x08, 0x26, 0x6f, 0x8a, 0xf4, 0xbb, 0xfd, 0x9f, 0x28, 0xaa, - 0x0d, 0xd5, 0x45, 0xf3, 0x13, 0x3a, 0x1d, 0xd8, 0xc0, 0x78, 0x8f, - 0x41, 0x67, 0x3c, 0x1e, 0x94, 0x64, 0xae, 0x7b, 0x0b, 0xc5, 0xe8, - 0xd9, 0x01, 0x88, 0x39, 0x1a, 0x97, 0x86, 0x64, 0x41, 0xd5, 0x3b, - 0x87, 0x0c, 0x6e, 0xfa, 0x0f, 0xc6, 0xbd, 0x48, 0x14, 0xbf, 0x39, - 0x4d, 0xd4, 0x9e, 0x41, 0xb6, 0x8f, 0x96, 0x1d, 0x63, 0x96, 0x93, - 0xd9, 0x95, 0x06, 0x78, 0x31, 0x68, 0x9e, 0x37, 0x06, 0x3b, 0x80, - 0x89, 0x45, 0x61, 0x39, 0x23, 0xc7, 0x1b, 0x44, 0xa3, 0x15, 0xe5, - 0x1c, 0xf8, 0x92, 0x30, 0xbb, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, - 0x81, 0xef, 0x30, 0x81, 0xec, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, - 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, - 0x02, 0x01, 0x01, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, - 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, - 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x65, 0xcd, 0xeb, - 0xab, 0x35, 0x1e, 0x00, 0x3e, 0x7e, 0xd5, 0x74, 0xc0, 0x1c, 0xb4, - 0x73, 0x47, 0x0e, 0x1a, 0x64, 0x2f, 0x30, 0x81, 0xa6, 0x06, 0x03, - 0x55, 0x1d, 0x20, 0x04, 0x81, 0x9e, 0x30, 0x81, 0x9b, 0x30, 0x81, - 0x98, 0x06, 0x04, 0x55, 0x1d, 0x20, 0x00, 0x30, 0x81, 0x8f, 0x30, - 0x2f, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, - 0x16, 0x23, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, - 0x77, 0x2e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x70, 0x72, 0x6f, 0x66, - 0x65, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x63, 0x70, 0x73, 0x30, 0x5c, 0x06, 0x08, 0x2b, 0x06, 0x01, - 0x05, 0x05, 0x07, 0x02, 0x02, 0x30, 0x50, 0x1e, 0x4e, 0x00, 0x50, - 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6f, 0x00, 0x20, 0x00, - 0x64, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x20, - 0x00, 0x42, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6e, 0x00, - 0x6f, 0x00, 0x76, 0x00, 0x61, 0x00, 0x20, 0x00, 0x34, 0x00, 0x37, - 0x00, 0x20, 0x00, 0x42, 0x00, 0x61, 0x00, 0x72, 0x00, 0x63, 0x00, - 0x65, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x20, - 0x00, 0x30, 0x00, 0x38, 0x00, 0x30, 0x00, 0x31, 0x00, 0x37, 0x30, + 0x06, 0x14, 0x30, 0x82, 0x03, 0xfc, 0xa0, 0x03, 0x02, 0x01, 0x02, + 0x02, 0x08, 0x53, 0xec, 0x3b, 0xee, 0xfb, 0xb2, 0x48, 0x5f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x17, 0x7d, 0xa0, - 0xf9, 0xb4, 0xdd, 0xc5, 0xc5, 0xeb, 0xad, 0x4b, 0x24, 0xb5, 0xa1, - 0x02, 0xab, 0xdd, 0xa5, 0x88, 0x4a, 0xb2, 0x0f, 0x55, 0x4b, 0x2b, - 0x57, 0x8c, 0x3b, 0xe5, 0x31, 0xdd, 0xfe, 0xc4, 0x32, 0xf1, 0xe7, - 0x5b, 0x64, 0x96, 0x36, 0x32, 0x18, 0xec, 0xa5, 0x32, 0x77, 0xd7, - 0xe3, 0x44, 0xb6, 0xc0, 0x11, 0x2a, 0x80, 0xb9, 0x3d, 0x6a, 0x6e, - 0x7c, 0x9b, 0xd3, 0xad, 0xfc, 0xc3, 0xd6, 0xa3, 0xe6, 0x64, 0x29, - 0x7c, 0xd1, 0xe1, 0x38, 0x1e, 0x82, 0x2b, 0xff, 0x27, 0x65, 0xaf, - 0xfb, 0x16, 0x15, 0xc4, 0x2e, 0x71, 0x84, 0xe5, 0xb5, 0xff, 0xfa, - 0xa4, 0x47, 0xbd, 0x64, 0x32, 0xbb, 0xf6, 0x25, 0x84, 0xa2, 0x27, - 0x42, 0xf5, 0x20, 0xb0, 0xc2, 0x13, 0x10, 0x11, 0xcd, 0x10, 0x15, - 0xba, 0x42, 0x90, 0x2a, 0xd2, 0x44, 0xe1, 0x96, 0x26, 0xeb, 0x31, - 0x48, 0x12, 0xfd, 0x2a, 0xda, 0xc9, 0x06, 0xcf, 0x74, 0x1e, 0xa9, - 0x4b, 0xd5, 0x87, 0x28, 0xf9, 0x79, 0x34, 0x92, 0x3e, 0x2e, 0x44, - 0xe8, 0xf6, 0x8f, 0x4f, 0x8f, 0x35, 0x3f, 0x25, 0xb3, 0x39, 0xdc, - 0x63, 0x2a, 0x90, 0x6b, 0x20, 0x5f, 0xc4, 0x52, 0x12, 0x4e, 0x97, - 0x2c, 0x2a, 0xac, 0x9d, 0x97, 0xde, 0x48, 0xf2, 0xa3, 0x66, 0xdb, - 0xc2, 0xd2, 0x83, 0x95, 0xa6, 0x66, 0xa7, 0x9e, 0x25, 0x0f, 0xe9, - 0x0b, 0x33, 0x91, 0x65, 0x0a, 0x5a, 0xc3, 0xd9, 0x54, 0x12, 0xdd, - 0xaf, 0xc3, 0x4e, 0x0e, 0x1f, 0x26, 0x5e, 0x0d, 0xdc, 0xb3, 0x8d, - 0xec, 0xd5, 0x81, 0x70, 0xde, 0xd2, 0x4f, 0x24, 0x05, 0xf3, 0x6c, - 0x4e, 0xf5, 0x4c, 0x49, 0x66, 0x8d, 0xd1, 0xff, 0xd2, 0x0b, 0x25, - 0x41, 0x48, 0xfe, 0x51, 0x84, 0xc6, 0x42, 0xaf, 0x80, 0x04, 0xcf, - 0xd0, 0x7e, 0x64, 0x49, 0xe4, 0xf2, 0xdf, 0xa2, 0xec, 0xb1, 0x4c, - 0xc0, 0x2a, 0x1d, 0xe7, 0xb4, 0xb1, 0x65, 0xa2, 0xc4, 0xbc, 0xf1, - 0x98, 0xf4, 0xaa, 0x70, 0x07, 0x63, 0xb4, 0xb8, 0xda, 0x3b, 0x4c, - 0xfa, 0x40, 0x22, 0x30, 0x5b, 0x11, 0xa6, 0xf0, 0x05, 0x0e, 0xc6, - 0x02, 0x03, 0x48, 0xab, 0x86, 0x9b, 0x85, 0xdd, 0xdb, 0xdd, 0xea, - 0xa2, 0x76, 0x80, 0x73, 0x7d, 0xf5, 0x9c, 0x04, 0xc4, 0x45, 0x8d, - 0xe7, 0xb9, 0x1c, 0x8b, 0x9e, 0xea, 0xd7, 0x75, 0xd1, 0x72, 0xb1, - 0xde, 0x75, 0x44, 0xe7, 0x42, 0x7d, 0xe2, 0x57, 0x6b, 0x7d, 0xdc, - 0x99, 0xbc, 0x3d, 0x83, 0x28, 0xea, 0x80, 0x93, 0x8d, 0xc5, 0x4c, - 0x65, 0xc1, 0x70, 0x81, 0xb8, 0x38, 0xfc, 0x43, 0x31, 0xb2, 0xf6, - 0x03, 0x34, 0x47, 0xb2, 0xac, 0xfb, 0x22, 0x06, 0xcb, 0x1e, 0xdd, - 0x17, 0x47, 0x1c, 0x5f, 0x66, 0xb9, 0xd3, 0x1a, 0xa2, 0xda, 0x11, - 0xb1, 0xa4, 0xbc, 0x23, 0xc9, 0xe4, 0xbe, 0x87, 0xff, 0xb9, 0x94, - 0xb6, 0xf8, 0x5d, 0x20, 0x4a, 0xd4, 0x5f, 0xe7, 0xbd, 0x68, 0x7b, - 0x65, 0xf2, 0x15, 0x1e, 0xd2, 0x3a, 0xa9, 0x2d, 0xe9, 0xd8, 0x6b, - 0x24, 0xac, 0x97, 0x58, 0x44, 0x47, 0xad, 0x59, 0x18, 0xf1, 0x21, - 0x65, 0x70, 0xde, 0xce, 0x34, 0x60, 0xa8, 0x40, 0xf1, 0xf3, 0x3c, - 0xa4, 0xc3, 0x28, 0x23, 0x8c, 0xfe, 0x27, 0x33, 0x43, 0x40, 0xa0, - 0x17, 0x3c, 0xeb, 0xea, 0x3b, 0xb0, 0x72, 0xa6, 0xa3, 0xb9, 0x4a, - 0x4b, 0x5e, 0x16, 0x48, 0xf4, 0xb2, 0xbc, 0xc8, 0x8c, 0x92, 0xc5, - 0x9d, 0x9f, 0xac, 0x72, 0x36, 0xbc, 0x34, 0x80, 0x34, 0x6b, 0xa9, - 0x8b, 0x92, 0xc0, 0xb8, 0x17, 0xed, 0xec, 0x76, 0x53, 0xf5, 0x24, - 0x01, 0x8c, 0xb3, 0x22, 0xe8, 0x4b, 0x7c, 0x55, 0xc6, 0x9d, 0xfa, - 0xa3, 0x14, 0xbb, 0x65, 0x85, 0x6e, 0x6e, 0x4f, 0x12, 0x7e, 0x0a, - 0x3c, 0x9d, 0x95, 0x30, 0x82, 0x05, 0xf1, 0x30, 0x82, 0x03, 0xd9, - 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x00, 0xb0, 0xb7, 0x5a, - 0x16, 0x48, 0x5f, 0xbf, 0xe1, 0xcb, 0xf5, 0x8b, 0xd7, 0x19, 0xe6, - 0x7d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x38, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x14, - 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x49, 0x5a, - 0x45, 0x4e, 0x50, 0x45, 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x31, 0x13, - 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0a, 0x49, 0x7a, - 0x65, 0x6e, 0x70, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x1e, 0x17, - 0x0d, 0x30, 0x37, 0x31, 0x32, 0x31, 0x33, 0x31, 0x33, 0x30, 0x38, - 0x32, 0x38, 0x5a, 0x17, 0x0d, 0x33, 0x37, 0x31, 0x32, 0x31, 0x33, - 0x30, 0x38, 0x32, 0x37, 0x32, 0x35, 0x5a, 0x30, 0x38, 0x31, 0x0b, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, - 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, - 0x49, 0x5a, 0x45, 0x4e, 0x50, 0x45, 0x20, 0x53, 0x2e, 0x41, 0x2e, - 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0a, - 0x49, 0x7a, 0x65, 0x6e, 0x70, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x30, - 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, - 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xc9, - 0xd3, 0x7a, 0xca, 0x0f, 0x1e, 0xac, 0xa7, 0x86, 0xe8, 0x16, 0x65, - 0x6a, 0xb1, 0xc2, 0x1b, 0x45, 0x32, 0x71, 0x95, 0xd9, 0xfe, 0x10, - 0x5b, 0xcc, 0xaf, 0xe7, 0xa5, 0x79, 0x01, 0x8f, 0x89, 0xc3, 0xca, - 0xf2, 0x55, 0x71, 0xf7, 0x77, 0xbe, 0x77, 0x94, 0xf3, 0x72, 0xa4, - 0x2c, 0x44, 0xd8, 0x9e, 0x92, 0x9b, 0x14, 0x3a, 0xa1, 0xe7, 0x24, - 0x90, 0x0a, 0x0a, 0x56, 0x8e, 0xc5, 0xd8, 0x26, 0x94, 0xe1, 0xd9, - 0x48, 0xe1, 0x2d, 0x3e, 0xda, 0x0a, 0x72, 0xdd, 0xa3, 0x99, 0x15, - 0xda, 0x81, 0xa2, 0x87, 0xf4, 0x7b, 0x6e, 0x26, 0x77, 0x89, 0x58, - 0xad, 0xd6, 0xeb, 0x0c, 0xb2, 0x41, 0x7a, 0x73, 0x6e, 0x6d, 0xdb, - 0x7a, 0x78, 0x41, 0xe9, 0x08, 0x88, 0x12, 0x7e, 0x87, 0x2e, 0x66, - 0x11, 0x63, 0x6c, 0x54, 0xfb, 0x3c, 0x9d, 0x72, 0xc0, 0xbc, 0x2e, - 0xff, 0xc2, 0xb7, 0xdd, 0x0d, 0x76, 0xe3, 0x3a, 0xd7, 0xf7, 0xb4, - 0x68, 0xbe, 0xa2, 0xf5, 0xe3, 0x81, 0x6e, 0xc1, 0x46, 0x6f, 0x5d, - 0x8d, 0xe0, 0x4d, 0xc6, 0x54, 0x55, 0x89, 0x1a, 0x33, 0x31, 0x0a, - 0xb1, 0x57, 0xb9, 0xa3, 0x8a, 0x98, 0xc3, 0xec, 0x3b, 0x34, 0xc5, - 0x95, 0x41, 0x69, 0x7e, 0x75, 0xc2, 0x3c, 0x20, 0xc5, 0x61, 0xba, - 0x51, 0x47, 0xa0, 0x20, 0x90, 0x93, 0xa1, 0x90, 0x4b, 0xf3, 0x4e, - 0x7c, 0x85, 0x45, 0x54, 0x9a, 0xd1, 0x05, 0x26, 0x41, 0xb0, 0xb5, - 0x4d, 0x1d, 0x33, 0xbe, 0xc4, 0x03, 0xc8, 0x25, 0x7c, 0xc1, 0x70, - 0xdb, 0x3b, 0xf4, 0x09, 0x2d, 0x54, 0x27, 0x48, 0xac, 0x2f, 0xe1, - 0xc4, 0xac, 0x3e, 0xc8, 0xcb, 0x92, 0x4c, 0x53, 0x39, 0x37, 0x23, - 0xec, 0xd3, 0x01, 0xf9, 0xe0, 0x09, 0x44, 0x4d, 0x4d, 0x64, 0xc0, - 0xe1, 0x0d, 0x5a, 0x87, 0x22, 0xbc, 0xad, 0x1b, 0xa3, 0xfe, 0x26, - 0xb5, 0x15, 0xf3, 0xa7, 0xfc, 0x84, 0x19, 0xe9, 0xec, 0xa1, 0x88, - 0xb4, 0x44, 0x69, 0x84, 0x83, 0xf3, 0x89, 0xd1, 0x74, 0x06, 0xa9, - 0xcc, 0x0b, 0xd6, 0xc2, 0xde, 0x27, 0x85, 0x50, 0x26, 0xca, 0x17, - 0xb8, 0xc9, 0x7a, 0x87, 0x56, 0x2c, 0x1a, 0x01, 0x1e, 0x6c, 0xbe, - 0x13, 0xad, 0x10, 0xac, 0xb5, 0x24, 0xf5, 0x38, 0x91, 0xa1, 0xd6, - 0x4b, 0xda, 0xf1, 0xbb, 0xd2, 0xde, 0x47, 0xb5, 0xf1, 0xbc, 0x81, - 0xf6, 0x59, 0x6b, 0xcf, 0x19, 0x53, 0xe9, 0x8d, 0x15, 0xcb, 0x4a, - 0xcb, 0xa9, 0x6f, 0x44, 0xe5, 0x1b, 0x41, 0xcf, 0xe1, 0x86, 0xa7, - 0xca, 0xd0, 0x6a, 0x9f, 0xbc, 0x4c, 0x8d, 0x06, 0x33, 0x5a, 0xa2, - 0x85, 0xe5, 0x90, 0x35, 0xa0, 0x62, 0x5c, 0x16, 0x4e, 0xf0, 0xe3, - 0xa2, 0xfa, 0x03, 0x1a, 0xb4, 0x2c, 0x71, 0xb3, 0x58, 0x2c, 0xde, - 0x7b, 0x0b, 0xdb, 0x1a, 0x0f, 0xeb, 0xde, 0x21, 0x1f, 0x06, 0x77, - 0x06, 0x03, 0xb0, 0xc9, 0xef, 0x99, 0xfc, 0xc0, 0xb9, 0x4f, 0x0b, - 0x86, 0x28, 0xfe, 0xd2, 0xb9, 0xea, 0xe3, 0xda, 0xa5, 0xc3, 0x47, - 0x69, 0x12, 0xe0, 0xdb, 0xf0, 0xf6, 0x19, 0x8b, 0xed, 0x7b, 0x70, - 0xd7, 0x02, 0xd6, 0xed, 0x87, 0x18, 0x28, 0x2c, 0x04, 0x24, 0x4c, - 0x77, 0xe4, 0x48, 0x8a, 0x1a, 0xc6, 0x3b, 0x9a, 0xd4, 0x0f, 0xca, - 0xfa, 0x75, 0xd2, 0x01, 0x40, 0x5a, 0x8d, 0x79, 0xbf, 0x8b, 0xcf, - 0x4b, 0xcf, 0xaa, 0x16, 0xc1, 0x95, 0xe4, 0xad, 0x4c, 0x8a, 0x3e, - 0x17, 0x91, 0xd4, 0xb1, 0x62, 0xe5, 0x82, 0xe5, 0x80, 0x04, 0xa4, - 0x03, 0x7e, 0x8d, 0xbf, 0xda, 0x7f, 0xa2, 0x0f, 0x97, 0x4f, 0x0c, - 0xd3, 0x0d, 0xfb, 0xd7, 0xd1, 0xe5, 0x72, 0x7e, 0x1c, 0xc8, 0x77, - 0xff, 0x5b, 0x9a, 0x0f, 0xb7, 0xae, 0x05, 0x46, 0xe5, 0xf1, 0xa8, - 0x16, 0xec, 0x47, 0xa4, 0x17, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, - 0x81, 0xf6, 0x30, 0x81, 0xf3, 0x30, 0x81, 0xb0, 0x06, 0x03, 0x55, - 0x1d, 0x11, 0x04, 0x81, 0xa8, 0x30, 0x81, 0xa5, 0x81, 0x0f, 0x69, - 0x6e, 0x66, 0x6f, 0x40, 0x69, 0x7a, 0x65, 0x6e, 0x70, 0x65, 0x2e, - 0x63, 0x6f, 0x6d, 0xa4, 0x81, 0x91, 0x30, 0x81, 0x8e, 0x31, 0x47, - 0x30, 0x45, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x3e, 0x49, 0x5a, - 0x45, 0x4e, 0x50, 0x45, 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x20, 0x2d, - 0x20, 0x43, 0x49, 0x46, 0x20, 0x41, 0x30, 0x31, 0x33, 0x33, 0x37, - 0x32, 0x36, 0x30, 0x2d, 0x52, 0x4d, 0x65, 0x72, 0x63, 0x2e, 0x56, - 0x69, 0x74, 0x6f, 0x72, 0x69, 0x61, 0x2d, 0x47, 0x61, 0x73, 0x74, - 0x65, 0x69, 0x7a, 0x20, 0x54, 0x31, 0x30, 0x35, 0x35, 0x20, 0x46, - 0x36, 0x32, 0x20, 0x53, 0x38, 0x31, 0x43, 0x30, 0x41, 0x06, 0x03, - 0x55, 0x04, 0x09, 0x0c, 0x3a, 0x41, 0x76, 0x64, 0x61, 0x20, 0x64, - 0x65, 0x6c, 0x20, 0x4d, 0x65, 0x64, 0x69, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x6e, 0x65, 0x6f, 0x20, 0x45, 0x74, 0x6f, 0x72, 0x62, 0x69, - 0x64, 0x65, 0x61, 0x20, 0x31, 0x34, 0x20, 0x2d, 0x20, 0x30, 0x31, - 0x30, 0x31, 0x30, 0x20, 0x56, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x61, - 0x2d, 0x47, 0x61, 0x73, 0x74, 0x65, 0x69, 0x7a, 0x30, 0x0f, 0x06, - 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, - 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, - 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, - 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x1d, 0x1c, 0x65, - 0x0e, 0xa8, 0xf2, 0x25, 0x7b, 0xb4, 0x91, 0xcf, 0xe4, 0xb1, 0xb1, - 0xe6, 0xbd, 0x55, 0x74, 0x6c, 0x05, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, - 0x82, 0x02, 0x01, 0x00, 0x78, 0xa6, 0x0c, 0x16, 0x4a, 0x9f, 0x4c, - 0x88, 0x3a, 0xc0, 0xcb, 0x0e, 0xa5, 0x16, 0x7d, 0x9f, 0xb9, 0x48, - 0x5f, 0x18, 0x8f, 0x0d, 0x62, 0x36, 0xf6, 0xcd, 0x19, 0x6b, 0xac, - 0xab, 0xd5, 0xf6, 0x91, 0x7d, 0xae, 0x71, 0xf3, 0x3f, 0xb3, 0x0e, - 0x78, 0x85, 0x9b, 0x95, 0xa4, 0x27, 0x21, 0x47, 0x42, 0x4a, 0x7c, - 0x48, 0x3a, 0xf5, 0x45, 0x7c, 0xb3, 0x0c, 0x8e, 0x51, 0x78, 0xac, - 0x95, 0x13, 0xde, 0xc6, 0xfd, 0x7d, 0xb8, 0x1a, 0x90, 0x4c, 0xab, - 0x92, 0x03, 0xc7, 0xed, 0x42, 0x01, 0xce, 0x0f, 0xd8, 0xb1, 0xfa, - 0xa2, 0x92, 0xe1, 0x60, 0x6d, 0xae, 0x7a, 0x6b, 0x09, 0xaa, 0xc6, - 0x29, 0xee, 0x68, 0x49, 0x67, 0x30, 0x80, 0x24, 0x7a, 0x31, 0x16, - 0x39, 0x5b, 0x7e, 0xf1, 0x1c, 0x2e, 0xdd, 0x6c, 0x09, 0xad, 0xf2, - 0x31, 0xc1, 0x82, 0x4e, 0xb9, 0xbb, 0xf9, 0xbe, 0xbf, 0x2a, 0x85, - 0x3f, 0xc0, 0x40, 0xa3, 0x3a, 0x59, 0xfc, 0x59, 0x4b, 0x3c, 0x28, - 0x24, 0xdb, 0xb4, 0x15, 0x75, 0xae, 0x0d, 0x88, 0xba, 0x2e, 0x73, - 0xc0, 0xbd, 0x58, 0x87, 0xe5, 0x42, 0xf2, 0xeb, 0x5e, 0xee, 0x1e, - 0x30, 0x22, 0x99, 0xcb, 0x37, 0xd1, 0xc4, 0x21, 0x6c, 0x81, 0xec, - 0xbe, 0x6d, 0x26, 0xe6, 0x1c, 0xe4, 0x42, 0x20, 0x9e, 0x47, 0xb0, - 0xac, 0x83, 0x59, 0x70, 0x2c, 0x35, 0xd6, 0xaf, 0x36, 0x34, 0xb4, - 0xcd, 0x3b, 0xf8, 0x32, 0xa8, 0xef, 0xe3, 0x78, 0x89, 0xfb, 0x8d, - 0x45, 0x2c, 0xda, 0x9c, 0xb8, 0x7e, 0x40, 0x1c, 0x61, 0xe7, 0x3e, - 0xa2, 0x92, 0x2c, 0x4b, 0xf2, 0xcd, 0xfa, 0x98, 0xb6, 0x29, 0xff, - 0xf3, 0xf2, 0x7b, 0xa9, 0x1f, 0x2e, 0xa0, 0x93, 0x57, 0x2b, 0xde, - 0x85, 0x03, 0xf9, 0x69, 0x37, 0xcb, 0x9e, 0x78, 0x6a, 0x05, 0xb4, - 0xc5, 0x31, 0x78, 0x89, 0xec, 0x7a, 0xa7, 0x85, 0xe1, 0xb9, 0x7b, - 0x3c, 0xde, 0xbe, 0x1e, 0x79, 0x84, 0xce, 0x9f, 0x70, 0x0e, 0x59, - 0xc2, 0x35, 0x2e, 0x90, 0x2a, 0x31, 0xd9, 0xe4, 0x45, 0x7a, 0x41, - 0xa4, 0x2e, 0x13, 0x9b, 0x34, 0x0e, 0x66, 0x7b, 0x49, 0xab, 0x64, - 0x97, 0xd0, 0x46, 0xc3, 0x79, 0x9d, 0x72, 0x50, 0x63, 0xa6, 0x98, - 0x5b, 0x06, 0xbd, 0x48, 0x6d, 0xd8, 0x39, 0x83, 0x70, 0xe8, 0x35, - 0xf0, 0x05, 0xd1, 0xaa, 0xbc, 0xe3, 0xdb, 0xc8, 0x02, 0xea, 0x7c, - 0xfd, 0x82, 0xda, 0xc2, 0x5b, 0x52, 0x35, 0xae, 0x98, 0x3a, 0xad, - 0xba, 0x35, 0x93, 0x23, 0xa7, 0x1f, 0x48, 0xdd, 0x35, 0x46, 0x98, - 0xb2, 0x10, 0x68, 0xe4, 0xa5, 0x31, 0xc2, 0x0a, 0x58, 0x2e, 0x19, - 0x81, 0x10, 0xc9, 0x50, 0x75, 0xfc, 0xea, 0x5a, 0x16, 0xce, 0x11, - 0xd7, 0xee, 0xef, 0x50, 0x88, 0x2d, 0x61, 0xff, 0x3f, 0x42, 0x73, - 0x05, 0x94, 0x43, 0xd5, 0x8e, 0x3c, 0x4e, 0x01, 0x3a, 0x19, 0xa5, - 0x1f, 0x46, 0x4e, 0x77, 0xd0, 0x5d, 0xe5, 0x81, 0x22, 0x21, 0x87, - 0xfe, 0x94, 0x7d, 0x84, 0xd8, 0x93, 0xad, 0xd6, 0x68, 0x43, 0x48, - 0xb2, 0xdb, 0xeb, 0x73, 0x24, 0xe7, 0x91, 0x7f, 0x54, 0xa4, 0xb6, - 0x80, 0x3e, 0x9d, 0xa3, 0x3c, 0x4c, 0x72, 0xc2, 0x57, 0xc4, 0xa0, - 0xd4, 0xcc, 0x38, 0x27, 0xce, 0xd5, 0x06, 0x9e, 0xa2, 0x48, 0xd9, - 0xe9, 0x9f, 0xce, 0x82, 0x70, 0x36, 0x93, 0x9a, 0x3b, 0xdf, 0x96, - 0x21, 0xe3, 0x59, 0xb7, 0x0c, 0xda, 0x91, 0x37, 0xf0, 0xfd, 0x59, - 0x5a, 0xb3, 0x99, 0xc8, 0x69, 0x6c, 0x43, 0x26, 0x01, 0x35, 0x63, - 0x60, 0x55, 0x89, 0x03, 0x3a, 0x75, 0xd8, 0xba, 0x4a, 0xd9, 0x54, - 0xff, 0xee, 0xde, 0x80, 0xd8, 0x2d, 0xd1, 0x38, 0xd5, 0x5e, 0x2d, - 0x0b, 0x98, 0x7d, 0x3e, 0x6c, 0xdb, 0xfc, 0x26, 0x88, 0xc7, 0x30, - 0x82, 0x07, 0x4f, 0x30, 0x82, 0x05, 0x37, 0xa0, 0x03, 0x02, 0x01, - 0x02, 0x02, 0x09, 0x00, 0xa3, 0xda, 0x42, 0x7e, 0xa4, 0xb1, 0xae, - 0xda, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0xae, 0x31, 0x0b, 0x30, - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x55, 0x31, - 0x43, 0x30, 0x41, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x3a, 0x4d, - 0x61, 0x64, 0x72, 0x69, 0x64, 0x20, 0x28, 0x73, 0x65, 0x65, 0x20, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x20, 0x61, 0x74, 0x20, 0x77, 0x77, 0x77, - 0x2e, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x66, 0x69, 0x72, 0x6d, 0x61, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x29, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x05, - 0x13, 0x09, 0x41, 0x38, 0x32, 0x37, 0x34, 0x33, 0x32, 0x38, 0x37, - 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x12, - 0x41, 0x43, 0x20, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x66, 0x69, 0x72, - 0x6d, 0x61, 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x31, 0x29, 0x30, 0x27, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x20, 0x43, 0x68, 0x61, 0x6d, - 0x62, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x43, 0x6f, 0x6d, - 0x6d, 0x65, 0x72, 0x63, 0x65, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, - 0x2d, 0x20, 0x32, 0x30, 0x30, 0x38, 0x30, 0x1e, 0x17, 0x0d, 0x30, - 0x38, 0x30, 0x38, 0x30, 0x31, 0x31, 0x32, 0x32, 0x39, 0x35, 0x30, - 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x37, 0x33, 0x31, 0x31, 0x32, - 0x32, 0x39, 0x35, 0x30, 0x5a, 0x30, 0x81, 0xae, 0x31, 0x0b, 0x30, - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x55, 0x31, - 0x43, 0x30, 0x41, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x3a, 0x4d, - 0x61, 0x64, 0x72, 0x69, 0x64, 0x20, 0x28, 0x73, 0x65, 0x65, 0x20, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x20, 0x61, 0x74, 0x20, 0x77, 0x77, 0x77, - 0x2e, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x66, 0x69, 0x72, 0x6d, 0x61, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x29, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x05, - 0x13, 0x09, 0x41, 0x38, 0x32, 0x37, 0x34, 0x33, 0x32, 0x38, 0x37, - 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x12, - 0x41, 0x43, 0x20, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x66, 0x69, 0x72, - 0x6d, 0x61, 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x31, 0x29, 0x30, 0x27, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x20, 0x43, 0x68, 0x61, 0x6d, - 0x62, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x43, 0x6f, 0x6d, - 0x6d, 0x65, 0x72, 0x63, 0x65, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, - 0x2d, 0x20, 0x32, 0x30, 0x30, 0x38, 0x30, 0x82, 0x02, 0x22, 0x30, + 0x05, 0x05, 0x00, 0x30, 0x51, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x42, 0x30, 0x40, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x39, 0x41, 0x75, 0x74, 0x6f, + 0x72, 0x69, 0x64, 0x61, 0x64, 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, 0x6e, + 0x20, 0x46, 0x69, 0x72, 0x6d, 0x61, 0x70, 0x72, 0x6f, 0x66, 0x65, + 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x43, 0x49, 0x46, 0x20, + 0x41, 0x36, 0x32, 0x36, 0x33, 0x34, 0x30, 0x36, 0x38, 0x30, 0x1e, + 0x17, 0x0d, 0x30, 0x39, 0x30, 0x35, 0x32, 0x30, 0x30, 0x38, 0x33, + 0x38, 0x31, 0x35, 0x5a, 0x17, 0x0d, 0x33, 0x30, 0x31, 0x32, 0x33, + 0x31, 0x30, 0x38, 0x33, 0x38, 0x31, 0x35, 0x5a, 0x30, 0x51, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, + 0x53, 0x31, 0x42, 0x30, 0x40, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, + 0x39, 0x41, 0x75, 0x74, 0x6f, 0x72, 0x69, 0x64, 0x61, 0x64, 0x20, + 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x20, 0x46, 0x69, 0x72, 0x6d, 0x61, + 0x70, 0x72, 0x6f, 0x66, 0x65, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x20, 0x43, 0x49, 0x46, 0x20, 0x41, 0x36, 0x32, 0x36, 0x33, 0x34, + 0x30, 0x36, 0x38, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, + 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, + 0x02, 0x01, 0x00, 0xca, 0x96, 0x6b, 0x8e, 0xea, 0xf8, 0xfb, 0xf1, + 0xa2, 0x35, 0xe0, 0x7f, 0x4c, 0xda, 0xe0, 0xc3, 0x52, 0xd7, 0x7d, + 0xb6, 0x10, 0xc8, 0x02, 0x5e, 0xb3, 0x43, 0x2a, 0xc4, 0x4f, 0x6a, + 0xb2, 0xca, 0x1c, 0x5d, 0x28, 0x9a, 0x78, 0x11, 0x1a, 0x69, 0x59, + 0x57, 0xaf, 0xb5, 0x20, 0x42, 0xe4, 0x8b, 0x0f, 0xe6, 0xdf, 0x5b, + 0xa6, 0x03, 0x92, 0x2f, 0xf5, 0x11, 0xe4, 0x62, 0xd7, 0x32, 0x71, + 0x38, 0xd9, 0x04, 0x0c, 0x71, 0xab, 0x3d, 0x51, 0x7e, 0x0f, 0x07, + 0xdf, 0x63, 0x05, 0x5c, 0xe9, 0xbf, 0x94, 0x6f, 0xc1, 0x29, 0x82, + 0xc0, 0xb4, 0xda, 0x51, 0xb0, 0xc1, 0x3c, 0xbb, 0xad, 0x37, 0x4a, + 0x5c, 0xca, 0xf1, 0x4b, 0x36, 0x0e, 0x24, 0xab, 0xbf, 0xc3, 0x84, + 0x77, 0xfd, 0xa8, 0x50, 0xf4, 0xb1, 0xe7, 0xc6, 0x2f, 0xd2, 0x2d, + 0x59, 0x8d, 0x7a, 0x0a, 0x4e, 0x96, 0x69, 0x52, 0x02, 0xaa, 0x36, + 0x98, 0xec, 0xfc, 0xfa, 0x14, 0x83, 0x0c, 0x37, 0x1f, 0xc9, 0x92, + 0x37, 0x7f, 0xd7, 0x81, 0x2d, 0xe5, 0xc4, 0xb9, 0xe0, 0x3e, 0x34, + 0xfe, 0x67, 0xf4, 0x3e, 0x66, 0xd1, 0xd3, 0xf4, 0x40, 0xcf, 0x5e, + 0x62, 0x34, 0x0f, 0x70, 0x06, 0x3e, 0x20, 0x18, 0x5a, 0xce, 0xf7, + 0x72, 0x1b, 0x25, 0x6c, 0x93, 0x74, 0x14, 0x93, 0xa3, 0x73, 0xb1, + 0x0e, 0xaa, 0x87, 0x10, 0x23, 0x59, 0x5f, 0x20, 0x05, 0x19, 0x47, + 0xed, 0x68, 0x8e, 0x92, 0x12, 0xca, 0x5d, 0xfc, 0xd6, 0x2b, 0xb2, + 0x92, 0x3c, 0x20, 0xcf, 0xe1, 0x5f, 0xaf, 0x20, 0xbe, 0xa0, 0x76, + 0x7f, 0x76, 0xe5, 0xec, 0x1a, 0x86, 0x61, 0x33, 0x3e, 0xe7, 0x7b, + 0xb4, 0x3f, 0xa0, 0x0f, 0x8e, 0xa2, 0xb9, 0x6a, 0x6f, 0xb9, 0x87, + 0x26, 0x6f, 0x41, 0x6c, 0x88, 0xa6, 0x50, 0xfd, 0x6a, 0x63, 0x0b, + 0xf5, 0x93, 0x16, 0x1b, 0x19, 0x8f, 0xb2, 0xed, 0x9b, 0x9b, 0xc9, + 0x90, 0xf5, 0x01, 0x0c, 0xdf, 0x19, 0x3d, 0x0f, 0x3e, 0x38, 0x23, + 0xc9, 0x2f, 0x8f, 0x0c, 0xd1, 0x02, 0xfe, 0x1b, 0x55, 0xd6, 0x4e, + 0xd0, 0x8d, 0x3c, 0xaf, 0x4f, 0xa4, 0xf3, 0xfe, 0xaf, 0x2a, 0xd3, + 0x05, 0x9d, 0x79, 0x08, 0xa1, 0xcb, 0x57, 0x31, 0xb4, 0x9c, 0xc8, + 0x90, 0xb2, 0x67, 0xf4, 0x18, 0x16, 0x93, 0x3a, 0xfc, 0x47, 0xd8, + 0xd1, 0x78, 0x96, 0x31, 0x1f, 0xba, 0x2b, 0x0c, 0x5f, 0x5d, 0x99, + 0xad, 0x63, 0x89, 0x5a, 0x24, 0x20, 0x76, 0xd8, 0xdf, 0xfd, 0xab, + 0x4e, 0xa6, 0x22, 0xaa, 0x9d, 0x5e, 0xe6, 0x27, 0x8a, 0x7d, 0x68, + 0x29, 0xa3, 0xe7, 0x8a, 0xb8, 0xda, 0x11, 0xbb, 0x17, 0x2d, 0x99, + 0x9d, 0x13, 0x24, 0x46, 0xf7, 0xc5, 0xe2, 0xd8, 0x9f, 0x8e, 0x7f, + 0xc7, 0x8f, 0x74, 0x6d, 0x5a, 0xb2, 0xe8, 0x72, 0xf5, 0xac, 0xee, + 0x24, 0x10, 0xad, 0x2f, 0x14, 0xda, 0xff, 0x2d, 0x9a, 0x46, 0x71, + 0x47, 0xbe, 0x42, 0xdf, 0xbb, 0x01, 0xdb, 0xf4, 0x7f, 0xd3, 0x28, + 0x8f, 0x31, 0x59, 0x5b, 0xd3, 0xc9, 0x02, 0xa6, 0xb4, 0x52, 0xca, + 0x6e, 0x97, 0xfb, 0x43, 0xc5, 0x08, 0x26, 0x6f, 0x8a, 0xf4, 0xbb, + 0xfd, 0x9f, 0x28, 0xaa, 0x0d, 0xd5, 0x45, 0xf3, 0x13, 0x3a, 0x1d, + 0xd8, 0xc0, 0x78, 0x8f, 0x41, 0x67, 0x3c, 0x1e, 0x94, 0x64, 0xae, + 0x7b, 0x0b, 0xc5, 0xe8, 0xd9, 0x01, 0x88, 0x39, 0x1a, 0x97, 0x86, + 0x64, 0x41, 0xd5, 0x3b, 0x87, 0x0c, 0x6e, 0xfa, 0x0f, 0xc6, 0xbd, + 0x48, 0x14, 0xbf, 0x39, 0x4d, 0xd4, 0x9e, 0x41, 0xb6, 0x8f, 0x96, + 0x1d, 0x63, 0x96, 0x93, 0xd9, 0x95, 0x06, 0x78, 0x31, 0x68, 0x9e, + 0x37, 0x06, 0x3b, 0x80, 0x89, 0x45, 0x61, 0x39, 0x23, 0xc7, 0x1b, + 0x44, 0xa3, 0x15, 0xe5, 0x1c, 0xf8, 0x92, 0x30, 0xbb, 0x02, 0x03, + 0x01, 0x00, 0x01, 0xa3, 0x81, 0xef, 0x30, 0x81, 0xec, 0x30, 0x12, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, + 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x01, 0x30, 0x0e, 0x06, 0x03, + 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, + 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, + 0x14, 0x65, 0xcd, 0xeb, 0xab, 0x35, 0x1e, 0x00, 0x3e, 0x7e, 0xd5, + 0x74, 0xc0, 0x1c, 0xb4, 0x73, 0x47, 0x0e, 0x1a, 0x64, 0x2f, 0x30, + 0x81, 0xa6, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x81, 0x9e, 0x30, + 0x81, 0x9b, 0x30, 0x81, 0x98, 0x06, 0x04, 0x55, 0x1d, 0x20, 0x00, + 0x30, 0x81, 0x8f, 0x30, 0x2f, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, + 0x05, 0x07, 0x02, 0x01, 0x16, 0x23, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x66, 0x69, 0x72, 0x6d, 0x61, + 0x70, 0x72, 0x6f, 0x66, 0x65, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x70, 0x73, 0x30, 0x5c, 0x06, + 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, 0x30, 0x50, + 0x1e, 0x4e, 0x00, 0x50, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, + 0x6f, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6c, + 0x00, 0x61, 0x00, 0x20, 0x00, 0x42, 0x00, 0x6f, 0x00, 0x6e, 0x00, + 0x61, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x76, 0x00, 0x61, 0x00, 0x20, + 0x00, 0x34, 0x00, 0x37, 0x00, 0x20, 0x00, 0x42, 0x00, 0x61, 0x00, + 0x72, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x6e, + 0x00, 0x61, 0x00, 0x20, 0x00, 0x30, 0x00, 0x38, 0x00, 0x30, 0x00, + 0x31, 0x00, 0x37, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, + 0x00, 0x17, 0x7d, 0xa0, 0xf9, 0xb4, 0xdd, 0xc5, 0xc5, 0xeb, 0xad, + 0x4b, 0x24, 0xb5, 0xa1, 0x02, 0xab, 0xdd, 0xa5, 0x88, 0x4a, 0xb2, + 0x0f, 0x55, 0x4b, 0x2b, 0x57, 0x8c, 0x3b, 0xe5, 0x31, 0xdd, 0xfe, + 0xc4, 0x32, 0xf1, 0xe7, 0x5b, 0x64, 0x96, 0x36, 0x32, 0x18, 0xec, + 0xa5, 0x32, 0x77, 0xd7, 0xe3, 0x44, 0xb6, 0xc0, 0x11, 0x2a, 0x80, + 0xb9, 0x3d, 0x6a, 0x6e, 0x7c, 0x9b, 0xd3, 0xad, 0xfc, 0xc3, 0xd6, + 0xa3, 0xe6, 0x64, 0x29, 0x7c, 0xd1, 0xe1, 0x38, 0x1e, 0x82, 0x2b, + 0xff, 0x27, 0x65, 0xaf, 0xfb, 0x16, 0x15, 0xc4, 0x2e, 0x71, 0x84, + 0xe5, 0xb5, 0xff, 0xfa, 0xa4, 0x47, 0xbd, 0x64, 0x32, 0xbb, 0xf6, + 0x25, 0x84, 0xa2, 0x27, 0x42, 0xf5, 0x20, 0xb0, 0xc2, 0x13, 0x10, + 0x11, 0xcd, 0x10, 0x15, 0xba, 0x42, 0x90, 0x2a, 0xd2, 0x44, 0xe1, + 0x96, 0x26, 0xeb, 0x31, 0x48, 0x12, 0xfd, 0x2a, 0xda, 0xc9, 0x06, + 0xcf, 0x74, 0x1e, 0xa9, 0x4b, 0xd5, 0x87, 0x28, 0xf9, 0x79, 0x34, + 0x92, 0x3e, 0x2e, 0x44, 0xe8, 0xf6, 0x8f, 0x4f, 0x8f, 0x35, 0x3f, + 0x25, 0xb3, 0x39, 0xdc, 0x63, 0x2a, 0x90, 0x6b, 0x20, 0x5f, 0xc4, + 0x52, 0x12, 0x4e, 0x97, 0x2c, 0x2a, 0xac, 0x9d, 0x97, 0xde, 0x48, + 0xf2, 0xa3, 0x66, 0xdb, 0xc2, 0xd2, 0x83, 0x95, 0xa6, 0x66, 0xa7, + 0x9e, 0x25, 0x0f, 0xe9, 0x0b, 0x33, 0x91, 0x65, 0x0a, 0x5a, 0xc3, + 0xd9, 0x54, 0x12, 0xdd, 0xaf, 0xc3, 0x4e, 0x0e, 0x1f, 0x26, 0x5e, + 0x0d, 0xdc, 0xb3, 0x8d, 0xec, 0xd5, 0x81, 0x70, 0xde, 0xd2, 0x4f, + 0x24, 0x05, 0xf3, 0x6c, 0x4e, 0xf5, 0x4c, 0x49, 0x66, 0x8d, 0xd1, + 0xff, 0xd2, 0x0b, 0x25, 0x41, 0x48, 0xfe, 0x51, 0x84, 0xc6, 0x42, + 0xaf, 0x80, 0x04, 0xcf, 0xd0, 0x7e, 0x64, 0x49, 0xe4, 0xf2, 0xdf, + 0xa2, 0xec, 0xb1, 0x4c, 0xc0, 0x2a, 0x1d, 0xe7, 0xb4, 0xb1, 0x65, + 0xa2, 0xc4, 0xbc, 0xf1, 0x98, 0xf4, 0xaa, 0x70, 0x07, 0x63, 0xb4, + 0xb8, 0xda, 0x3b, 0x4c, 0xfa, 0x40, 0x22, 0x30, 0x5b, 0x11, 0xa6, + 0xf0, 0x05, 0x0e, 0xc6, 0x02, 0x03, 0x48, 0xab, 0x86, 0x9b, 0x85, + 0xdd, 0xdb, 0xdd, 0xea, 0xa2, 0x76, 0x80, 0x73, 0x7d, 0xf5, 0x9c, + 0x04, 0xc4, 0x45, 0x8d, 0xe7, 0xb9, 0x1c, 0x8b, 0x9e, 0xea, 0xd7, + 0x75, 0xd1, 0x72, 0xb1, 0xde, 0x75, 0x44, 0xe7, 0x42, 0x7d, 0xe2, + 0x57, 0x6b, 0x7d, 0xdc, 0x99, 0xbc, 0x3d, 0x83, 0x28, 0xea, 0x80, + 0x93, 0x8d, 0xc5, 0x4c, 0x65, 0xc1, 0x70, 0x81, 0xb8, 0x38, 0xfc, + 0x43, 0x31, 0xb2, 0xf6, 0x03, 0x34, 0x47, 0xb2, 0xac, 0xfb, 0x22, + 0x06, 0xcb, 0x1e, 0xdd, 0x17, 0x47, 0x1c, 0x5f, 0x66, 0xb9, 0xd3, + 0x1a, 0xa2, 0xda, 0x11, 0xb1, 0xa4, 0xbc, 0x23, 0xc9, 0xe4, 0xbe, + 0x87, 0xff, 0xb9, 0x94, 0xb6, 0xf8, 0x5d, 0x20, 0x4a, 0xd4, 0x5f, + 0xe7, 0xbd, 0x68, 0x7b, 0x65, 0xf2, 0x15, 0x1e, 0xd2, 0x3a, 0xa9, + 0x2d, 0xe9, 0xd8, 0x6b, 0x24, 0xac, 0x97, 0x58, 0x44, 0x47, 0xad, + 0x59, 0x18, 0xf1, 0x21, 0x65, 0x70, 0xde, 0xce, 0x34, 0x60, 0xa8, + 0x40, 0xf1, 0xf3, 0x3c, 0xa4, 0xc3, 0x28, 0x23, 0x8c, 0xfe, 0x27, + 0x33, 0x43, 0x40, 0xa0, 0x17, 0x3c, 0xeb, 0xea, 0x3b, 0xb0, 0x72, + 0xa6, 0xa3, 0xb9, 0x4a, 0x4b, 0x5e, 0x16, 0x48, 0xf4, 0xb2, 0xbc, + 0xc8, 0x8c, 0x92, 0xc5, 0x9d, 0x9f, 0xac, 0x72, 0x36, 0xbc, 0x34, + 0x80, 0x34, 0x6b, 0xa9, 0x8b, 0x92, 0xc0, 0xb8, 0x17, 0xed, 0xec, + 0x76, 0x53, 0xf5, 0x24, 0x01, 0x8c, 0xb3, 0x22, 0xe8, 0x4b, 0x7c, + 0x55, 0xc6, 0x9d, 0xfa, 0xa3, 0x14, 0xbb, 0x65, 0x85, 0x6e, 0x6e, + 0x4f, 0x12, 0x7e, 0x0a, 0x3c, 0x9d, 0x95, 0x30, 0x82, 0x05, 0xf1, + 0x30, 0x82, 0x03, 0xd9, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, + 0x00, 0xb0, 0xb7, 0x5a, 0x16, 0x48, 0x5f, 0xbf, 0xe1, 0xcb, 0xf5, + 0x8b, 0xd7, 0x19, 0xe6, 0x7d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x38, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x45, 0x53, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x0c, 0x0b, 0x49, 0x5a, 0x45, 0x4e, 0x50, 0x45, 0x20, 0x53, 0x2e, + 0x41, 0x2e, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0c, 0x0a, 0x49, 0x7a, 0x65, 0x6e, 0x70, 0x65, 0x2e, 0x63, 0x6f, + 0x6d, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x37, 0x31, 0x32, 0x31, 0x33, + 0x31, 0x33, 0x30, 0x38, 0x32, 0x38, 0x5a, 0x17, 0x0d, 0x33, 0x37, + 0x31, 0x32, 0x31, 0x33, 0x30, 0x38, 0x32, 0x37, 0x32, 0x35, 0x5a, + 0x30, 0x38, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x45, 0x53, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x0c, 0x0b, 0x49, 0x5a, 0x45, 0x4e, 0x50, 0x45, 0x20, + 0x53, 0x2e, 0x41, 0x2e, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x0c, 0x0a, 0x49, 0x7a, 0x65, 0x6e, 0x70, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, + 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, + 0x02, 0x01, 0x00, 0xc9, 0xd3, 0x7a, 0xca, 0x0f, 0x1e, 0xac, 0xa7, + 0x86, 0xe8, 0x16, 0x65, 0x6a, 0xb1, 0xc2, 0x1b, 0x45, 0x32, 0x71, + 0x95, 0xd9, 0xfe, 0x10, 0x5b, 0xcc, 0xaf, 0xe7, 0xa5, 0x79, 0x01, + 0x8f, 0x89, 0xc3, 0xca, 0xf2, 0x55, 0x71, 0xf7, 0x77, 0xbe, 0x77, + 0x94, 0xf3, 0x72, 0xa4, 0x2c, 0x44, 0xd8, 0x9e, 0x92, 0x9b, 0x14, + 0x3a, 0xa1, 0xe7, 0x24, 0x90, 0x0a, 0x0a, 0x56, 0x8e, 0xc5, 0xd8, + 0x26, 0x94, 0xe1, 0xd9, 0x48, 0xe1, 0x2d, 0x3e, 0xda, 0x0a, 0x72, + 0xdd, 0xa3, 0x99, 0x15, 0xda, 0x81, 0xa2, 0x87, 0xf4, 0x7b, 0x6e, + 0x26, 0x77, 0x89, 0x58, 0xad, 0xd6, 0xeb, 0x0c, 0xb2, 0x41, 0x7a, + 0x73, 0x6e, 0x6d, 0xdb, 0x7a, 0x78, 0x41, 0xe9, 0x08, 0x88, 0x12, + 0x7e, 0x87, 0x2e, 0x66, 0x11, 0x63, 0x6c, 0x54, 0xfb, 0x3c, 0x9d, + 0x72, 0xc0, 0xbc, 0x2e, 0xff, 0xc2, 0xb7, 0xdd, 0x0d, 0x76, 0xe3, + 0x3a, 0xd7, 0xf7, 0xb4, 0x68, 0xbe, 0xa2, 0xf5, 0xe3, 0x81, 0x6e, + 0xc1, 0x46, 0x6f, 0x5d, 0x8d, 0xe0, 0x4d, 0xc6, 0x54, 0x55, 0x89, + 0x1a, 0x33, 0x31, 0x0a, 0xb1, 0x57, 0xb9, 0xa3, 0x8a, 0x98, 0xc3, + 0xec, 0x3b, 0x34, 0xc5, 0x95, 0x41, 0x69, 0x7e, 0x75, 0xc2, 0x3c, + 0x20, 0xc5, 0x61, 0xba, 0x51, 0x47, 0xa0, 0x20, 0x90, 0x93, 0xa1, + 0x90, 0x4b, 0xf3, 0x4e, 0x7c, 0x85, 0x45, 0x54, 0x9a, 0xd1, 0x05, + 0x26, 0x41, 0xb0, 0xb5, 0x4d, 0x1d, 0x33, 0xbe, 0xc4, 0x03, 0xc8, + 0x25, 0x7c, 0xc1, 0x70, 0xdb, 0x3b, 0xf4, 0x09, 0x2d, 0x54, 0x27, + 0x48, 0xac, 0x2f, 0xe1, 0xc4, 0xac, 0x3e, 0xc8, 0xcb, 0x92, 0x4c, + 0x53, 0x39, 0x37, 0x23, 0xec, 0xd3, 0x01, 0xf9, 0xe0, 0x09, 0x44, + 0x4d, 0x4d, 0x64, 0xc0, 0xe1, 0x0d, 0x5a, 0x87, 0x22, 0xbc, 0xad, + 0x1b, 0xa3, 0xfe, 0x26, 0xb5, 0x15, 0xf3, 0xa7, 0xfc, 0x84, 0x19, + 0xe9, 0xec, 0xa1, 0x88, 0xb4, 0x44, 0x69, 0x84, 0x83, 0xf3, 0x89, + 0xd1, 0x74, 0x06, 0xa9, 0xcc, 0x0b, 0xd6, 0xc2, 0xde, 0x27, 0x85, + 0x50, 0x26, 0xca, 0x17, 0xb8, 0xc9, 0x7a, 0x87, 0x56, 0x2c, 0x1a, + 0x01, 0x1e, 0x6c, 0xbe, 0x13, 0xad, 0x10, 0xac, 0xb5, 0x24, 0xf5, + 0x38, 0x91, 0xa1, 0xd6, 0x4b, 0xda, 0xf1, 0xbb, 0xd2, 0xde, 0x47, + 0xb5, 0xf1, 0xbc, 0x81, 0xf6, 0x59, 0x6b, 0xcf, 0x19, 0x53, 0xe9, + 0x8d, 0x15, 0xcb, 0x4a, 0xcb, 0xa9, 0x6f, 0x44, 0xe5, 0x1b, 0x41, + 0xcf, 0xe1, 0x86, 0xa7, 0xca, 0xd0, 0x6a, 0x9f, 0xbc, 0x4c, 0x8d, + 0x06, 0x33, 0x5a, 0xa2, 0x85, 0xe5, 0x90, 0x35, 0xa0, 0x62, 0x5c, + 0x16, 0x4e, 0xf0, 0xe3, 0xa2, 0xfa, 0x03, 0x1a, 0xb4, 0x2c, 0x71, + 0xb3, 0x58, 0x2c, 0xde, 0x7b, 0x0b, 0xdb, 0x1a, 0x0f, 0xeb, 0xde, + 0x21, 0x1f, 0x06, 0x77, 0x06, 0x03, 0xb0, 0xc9, 0xef, 0x99, 0xfc, + 0xc0, 0xb9, 0x4f, 0x0b, 0x86, 0x28, 0xfe, 0xd2, 0xb9, 0xea, 0xe3, + 0xda, 0xa5, 0xc3, 0x47, 0x69, 0x12, 0xe0, 0xdb, 0xf0, 0xf6, 0x19, + 0x8b, 0xed, 0x7b, 0x70, 0xd7, 0x02, 0xd6, 0xed, 0x87, 0x18, 0x28, + 0x2c, 0x04, 0x24, 0x4c, 0x77, 0xe4, 0x48, 0x8a, 0x1a, 0xc6, 0x3b, + 0x9a, 0xd4, 0x0f, 0xca, 0xfa, 0x75, 0xd2, 0x01, 0x40, 0x5a, 0x8d, + 0x79, 0xbf, 0x8b, 0xcf, 0x4b, 0xcf, 0xaa, 0x16, 0xc1, 0x95, 0xe4, + 0xad, 0x4c, 0x8a, 0x3e, 0x17, 0x91, 0xd4, 0xb1, 0x62, 0xe5, 0x82, + 0xe5, 0x80, 0x04, 0xa4, 0x03, 0x7e, 0x8d, 0xbf, 0xda, 0x7f, 0xa2, + 0x0f, 0x97, 0x4f, 0x0c, 0xd3, 0x0d, 0xfb, 0xd7, 0xd1, 0xe5, 0x72, + 0x7e, 0x1c, 0xc8, 0x77, 0xff, 0x5b, 0x9a, 0x0f, 0xb7, 0xae, 0x05, + 0x46, 0xe5, 0xf1, 0xa8, 0x16, 0xec, 0x47, 0xa4, 0x17, 0x02, 0x03, + 0x01, 0x00, 0x01, 0xa3, 0x81, 0xf6, 0x30, 0x81, 0xf3, 0x30, 0x81, + 0xb0, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x81, 0xa8, 0x30, 0x81, + 0xa5, 0x81, 0x0f, 0x69, 0x6e, 0x66, 0x6f, 0x40, 0x69, 0x7a, 0x65, + 0x6e, 0x70, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0xa4, 0x81, 0x91, 0x30, + 0x81, 0x8e, 0x31, 0x47, 0x30, 0x45, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x0c, 0x3e, 0x49, 0x5a, 0x45, 0x4e, 0x50, 0x45, 0x20, 0x53, 0x2e, + 0x41, 0x2e, 0x20, 0x2d, 0x20, 0x43, 0x49, 0x46, 0x20, 0x41, 0x30, + 0x31, 0x33, 0x33, 0x37, 0x32, 0x36, 0x30, 0x2d, 0x52, 0x4d, 0x65, + 0x72, 0x63, 0x2e, 0x56, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x61, 0x2d, + 0x47, 0x61, 0x73, 0x74, 0x65, 0x69, 0x7a, 0x20, 0x54, 0x31, 0x30, + 0x35, 0x35, 0x20, 0x46, 0x36, 0x32, 0x20, 0x53, 0x38, 0x31, 0x43, + 0x30, 0x41, 0x06, 0x03, 0x55, 0x04, 0x09, 0x0c, 0x3a, 0x41, 0x76, + 0x64, 0x61, 0x20, 0x64, 0x65, 0x6c, 0x20, 0x4d, 0x65, 0x64, 0x69, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x6e, 0x65, 0x6f, 0x20, 0x45, 0x74, + 0x6f, 0x72, 0x62, 0x69, 0x64, 0x65, 0x61, 0x20, 0x31, 0x34, 0x20, + 0x2d, 0x20, 0x30, 0x31, 0x30, 0x31, 0x30, 0x20, 0x56, 0x69, 0x74, + 0x6f, 0x72, 0x69, 0x61, 0x2d, 0x47, 0x61, 0x73, 0x74, 0x65, 0x69, + 0x7a, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, + 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, + 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, + 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, + 0x14, 0x1d, 0x1c, 0x65, 0x0e, 0xa8, 0xf2, 0x25, 0x7b, 0xb4, 0x91, + 0xcf, 0xe4, 0xb1, 0xb1, 0xe6, 0xbd, 0x55, 0x74, 0x6c, 0x05, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, - 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xaf, 0x00, 0xcb, 0x70, 0x37, - 0x2b, 0x80, 0x5a, 0x4a, 0x3a, 0x6c, 0x78, 0x94, 0x7d, 0xa3, 0x7f, - 0x1a, 0x1f, 0xf6, 0x35, 0xd5, 0xbd, 0xdb, 0xcb, 0x0d, 0x44, 0x72, - 0x3e, 0x26, 0xb2, 0x90, 0x52, 0xba, 0x63, 0x3b, 0x28, 0x58, 0x6f, - 0xa5, 0xb3, 0x6d, 0x94, 0xa6, 0xf3, 0xdd, 0x64, 0x0c, 0x55, 0xf6, - 0xf6, 0xe7, 0xf2, 0x22, 0x22, 0x80, 0x5e, 0xe1, 0x62, 0xc6, 0xb6, - 0x29, 0xe1, 0x81, 0x6c, 0xf2, 0xbf, 0xe5, 0x7d, 0x32, 0x6a, 0x54, - 0xa0, 0x32, 0x19, 0x59, 0xfe, 0x1f, 0x8b, 0xd7, 0x3d, 0x60, 0x86, - 0x85, 0x24, 0x6f, 0xe3, 0x11, 0xb3, 0x77, 0x3e, 0x20, 0x96, 0x35, - 0x21, 0x6b, 0xb3, 0x08, 0xd9, 0x70, 0x2e, 0x64, 0xf7, 0x84, 0x92, - 0x53, 0xd6, 0x0e, 0xb0, 0x90, 0x8a, 0x8a, 0xe3, 0x87, 0x8d, 0x06, - 0xd3, 0xbd, 0x90, 0x0e, 0xe2, 0x99, 0xa1, 0x1b, 0x86, 0x0e, 0xda, - 0x9a, 0x0a, 0xbb, 0x0b, 0x61, 0x50, 0x06, 0x52, 0xf1, 0x9e, 0x7f, - 0x76, 0xec, 0xcb, 0x0f, 0xd0, 0x1e, 0x0d, 0xcf, 0x99, 0x30, 0x3d, - 0x1c, 0xc4, 0x45, 0x10, 0x58, 0xac, 0xd6, 0xd3, 0xe8, 0xd7, 0xe5, - 0xea, 0xc5, 0x01, 0x07, 0x77, 0xd6, 0x51, 0xe6, 0x03, 0x7f, 0x8a, - 0x48, 0xa5, 0x4d, 0x68, 0x75, 0xb9, 0xe9, 0xbc, 0x9e, 0x4e, 0x19, - 0x71, 0xf5, 0x32, 0x4b, 0x9c, 0x6d, 0x60, 0x19, 0x0b, 0xfb, 0xcc, - 0x9d, 0x75, 0xdc, 0xbf, 0x26, 0xcd, 0x8f, 0x93, 0x78, 0x39, 0x79, - 0x73, 0x5e, 0x25, 0x0e, 0xca, 0x5c, 0xeb, 0x77, 0x12, 0x07, 0xcb, - 0x64, 0x41, 0x47, 0x72, 0x93, 0xab, 0x50, 0xc3, 0xeb, 0x09, 0x76, - 0x64, 0x34, 0xd2, 0x39, 0xb7, 0x76, 0x11, 0x09, 0x0d, 0x76, 0x45, - 0xc4, 0xa9, 0xae, 0x3d, 0x6a, 0xaf, 0xb5, 0x7d, 0x65, 0x2f, 0x94, - 0x58, 0x10, 0xec, 0x5c, 0x7c, 0xaf, 0x7e, 0xe2, 0xb6, 0x18, 0xd9, - 0xd0, 0x9b, 0x4e, 0x5a, 0x49, 0xdf, 0xa9, 0x66, 0x0b, 0xcc, 0x3c, - 0xc6, 0x78, 0x7c, 0xa7, 0x9c, 0x1d, 0xe3, 0xce, 0x8e, 0x53, 0xbe, - 0x05, 0xde, 0x60, 0x0f, 0x6b, 0xe5, 0x1a, 0xdb, 0x3f, 0xe3, 0xe1, - 0x21, 0xc9, 0x29, 0xc1, 0xf1, 0xeb, 0x07, 0x9c, 0x52, 0x1b, 0x01, - 0x44, 0x51, 0x3c, 0x7b, 0x25, 0xd7, 0xc4, 0xe5, 0x52, 0x54, 0x5d, - 0x25, 0x07, 0xca, 0x16, 0x20, 0xb8, 0xad, 0xe4, 0x41, 0xee, 0x7a, - 0x08, 0xfe, 0x99, 0x6f, 0x83, 0xa6, 0x91, 0x02, 0xb0, 0x6c, 0x36, - 0x55, 0x6a, 0xe7, 0x7d, 0xf5, 0x96, 0xe6, 0xca, 0x81, 0xd6, 0x97, - 0xf1, 0x94, 0x83, 0xe9, 0xed, 0xb0, 0xb1, 0x6b, 0x12, 0x69, 0x1e, - 0xac, 0xfb, 0x5d, 0xa9, 0xc5, 0x98, 0xe9, 0xb4, 0x5b, 0x58, 0x7a, - 0xbe, 0x3d, 0xa2, 0x44, 0x3a, 0x63, 0x59, 0xd4, 0x0b, 0x25, 0xde, - 0x1b, 0x4f, 0xbd, 0xe5, 0x01, 0x9e, 0xcd, 0xd2, 0x29, 0xd5, 0x9f, - 0x17, 0x19, 0x0a, 0x6f, 0xbf, 0x0c, 0x90, 0xd3, 0x09, 0x5f, 0xd9, - 0xe3, 0x8a, 0x35, 0xcc, 0x79, 0x5a, 0x4d, 0x19, 0x37, 0x92, 0xb7, - 0xc4, 0xc1, 0xad, 0xaf, 0xf4, 0x79, 0x24, 0x9a, 0xb2, 0x01, 0x0b, - 0xb1, 0xaf, 0x5c, 0x96, 0xf3, 0x80, 0x32, 0xfb, 0x5c, 0x3d, 0x98, - 0xf1, 0xa0, 0x3f, 0x4a, 0xde, 0xbe, 0xaf, 0x94, 0x2e, 0xd9, 0x55, - 0x9a, 0x17, 0x6e, 0x60, 0x9d, 0x63, 0x6c, 0xb8, 0x63, 0xc9, 0xae, - 0x81, 0x5c, 0x18, 0x35, 0xe0, 0x90, 0xbb, 0xbe, 0x3c, 0x4f, 0x37, - 0x22, 0xb9, 0x7e, 0xeb, 0xcf, 0x9e, 0x77, 0x21, 0xa6, 0x3d, 0x38, - 0x81, 0xfb, 0x48, 0xda, 0x31, 0x3d, 0x2b, 0xe3, 0x89, 0xf5, 0xd0, - 0xb5, 0xbd, 0x7e, 0xe0, 0x50, 0xc4, 0x12, 0x89, 0xb3, 0x23, 0x9a, - 0x10, 0x31, 0x85, 0xdb, 0xae, 0x6f, 0xef, 0x38, 0x33, 0x18, 0x76, - 0x11, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x6c, 0x30, - 0x82, 0x01, 0x68, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, - 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, - 0x0c, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, - 0x14, 0xf9, 0x24, 0xac, 0x0f, 0xb2, 0xb5, 0xf8, 0x79, 0xc0, 0xfa, - 0x60, 0x88, 0x1b, 0xc4, 0xd9, 0x4d, 0x02, 0x9e, 0x17, 0x19, 0x30, - 0x81, 0xe3, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x81, 0xdb, 0x30, - 0x81, 0xd8, 0x80, 0x14, 0xf9, 0x24, 0xac, 0x0f, 0xb2, 0xb5, 0xf8, - 0x79, 0xc0, 0xfa, 0x60, 0x88, 0x1b, 0xc4, 0xd9, 0x4d, 0x02, 0x9e, - 0x17, 0x19, 0xa1, 0x81, 0xb4, 0xa4, 0x81, 0xb1, 0x30, 0x81, 0xae, - 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x45, 0x55, 0x31, 0x43, 0x30, 0x41, 0x06, 0x03, 0x55, 0x04, 0x07, - 0x13, 0x3a, 0x4d, 0x61, 0x64, 0x72, 0x69, 0x64, 0x20, 0x28, 0x73, - 0x65, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x61, 0x74, 0x20, - 0x77, 0x77, 0x77, 0x2e, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x66, 0x69, - 0x72, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x29, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, - 0x55, 0x04, 0x05, 0x13, 0x09, 0x41, 0x38, 0x32, 0x37, 0x34, 0x33, - 0x32, 0x38, 0x37, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x12, 0x41, 0x43, 0x20, 0x43, 0x61, 0x6d, 0x65, 0x72, - 0x66, 0x69, 0x72, 0x6d, 0x61, 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x31, - 0x29, 0x30, 0x27, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x20, 0x43, - 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20, - 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x65, 0x20, 0x52, 0x6f, - 0x6f, 0x74, 0x20, 0x2d, 0x20, 0x32, 0x30, 0x30, 0x38, 0x82, 0x09, - 0x00, 0xa3, 0xda, 0x42, 0x7e, 0xa4, 0xb1, 0xae, 0xda, 0x30, 0x0e, - 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, - 0x02, 0x01, 0x06, 0x30, 0x3d, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, - 0x36, 0x30, 0x34, 0x30, 0x32, 0x06, 0x04, 0x55, 0x1d, 0x20, 0x00, - 0x30, 0x2a, 0x30, 0x28, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, - 0x07, 0x02, 0x01, 0x16, 0x1c, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, - 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x63, 0x61, 0x6d, - 0x65, 0x72, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6d, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x90, 0x12, - 0xaf, 0x22, 0x35, 0xc2, 0xa3, 0x39, 0xf0, 0x2e, 0xde, 0xe9, 0xb5, - 0xe9, 0x78, 0x7c, 0x48, 0xbe, 0x3f, 0x7d, 0x45, 0x92, 0x5e, 0xe9, - 0xda, 0xb1, 0x19, 0xfc, 0x16, 0x3c, 0x9f, 0xb4, 0x5b, 0x66, 0x9e, - 0x6a, 0xe7, 0xc3, 0xb9, 0x5d, 0x88, 0xe8, 0x0f, 0xad, 0xcf, 0x23, - 0x0f, 0xde, 0x25, 0x3a, 0x5e, 0xcc, 0x4f, 0xa5, 0xc1, 0xb5, 0x2d, - 0xac, 0x24, 0xd2, 0x58, 0x07, 0xde, 0xa2, 0xcf, 0x69, 0x84, 0x60, - 0x33, 0xe8, 0x10, 0x0d, 0x13, 0xa9, 0x23, 0xd0, 0x85, 0xe5, 0x8e, - 0x7b, 0xa6, 0x9e, 0x3d, 0x72, 0x13, 0x72, 0x33, 0xf5, 0xaa, 0x7d, - 0xc6, 0x63, 0x1f, 0x08, 0xf4, 0xfe, 0x01, 0x7f, 0x24, 0xcf, 0x2b, - 0x2c, 0x54, 0x09, 0xde, 0xe2, 0x2b, 0x6d, 0x92, 0xc6, 0x39, 0x4f, - 0x16, 0xea, 0x3c, 0x7e, 0x7a, 0x46, 0xd4, 0x45, 0x6a, 0x46, 0xa8, - 0xeb, 0x75, 0x82, 0x56, 0xa7, 0xab, 0xa0, 0x7c, 0x68, 0x13, 0x33, - 0xf6, 0x9d, 0x30, 0xf0, 0x6f, 0x27, 0x39, 0x24, 0x23, 0x2a, 0x90, - 0xfd, 0x90, 0x29, 0x35, 0xf2, 0x93, 0xdf, 0x34, 0xa5, 0xc6, 0xf7, - 0xf8, 0xef, 0x8c, 0x0f, 0x62, 0x4a, 0x7c, 0xae, 0xd3, 0xf5, 0x54, - 0xf8, 0x8d, 0xb6, 0x9a, 0x56, 0x87, 0x16, 0x82, 0x3a, 0x33, 0xab, - 0x5a, 0x22, 0x08, 0xf7, 0x82, 0xba, 0xea, 0x2e, 0xe0, 0x47, 0x9a, - 0xb4, 0xb5, 0x45, 0xa3, 0x05, 0x3b, 0xd9, 0xdc, 0x2e, 0x45, 0x40, - 0x3b, 0xea, 0xdc, 0x7f, 0xe8, 0x3b, 0xeb, 0xd1, 0xec, 0x26, 0xd8, - 0x35, 0xa4, 0x30, 0xc5, 0x3a, 0xac, 0x57, 0x9e, 0xb3, 0x76, 0xa5, - 0x20, 0x7b, 0xf9, 0x1e, 0x4a, 0x05, 0x62, 0x01, 0xa6, 0x28, 0x75, - 0x60, 0x97, 0x92, 0x0d, 0x6e, 0x3e, 0x4d, 0x37, 0x43, 0x0d, 0x92, - 0x15, 0x9c, 0x18, 0x22, 0xcd, 0x51, 0x99, 0xa0, 0x29, 0x1a, 0x3c, - 0x5f, 0x8a, 0x32, 0x33, 0x5b, 0x30, 0xc7, 0x89, 0x2f, 0x47, 0x98, - 0x0f, 0xa3, 0x03, 0xc6, 0xf6, 0xf1, 0xac, 0xdf, 0x32, 0xf0, 0xd9, - 0x81, 0x1a, 0xe4, 0x9c, 0xbd, 0xf6, 0x80, 0x14, 0xf0, 0xd1, 0x2c, - 0xb9, 0x85, 0xf5, 0xd8, 0xa3, 0xb1, 0xc8, 0xa5, 0x21, 0xe5, 0x1c, - 0x13, 0x97, 0xee, 0x0e, 0xbd, 0xdf, 0x29, 0xa9, 0xef, 0x34, 0x53, - 0x5b, 0xd3, 0xe4, 0x6a, 0x13, 0x84, 0x06, 0xb6, 0x32, 0x02, 0xc4, - 0x52, 0xae, 0x22, 0xd2, 0xdc, 0xb2, 0x21, 0x42, 0x1a, 0xda, 0x40, - 0xf0, 0x29, 0xc9, 0xec, 0x0a, 0x0c, 0x5c, 0xe2, 0xd0, 0xba, 0xcc, - 0x48, 0xd3, 0x37, 0x0a, 0xcc, 0x12, 0x0a, 0x8a, 0x79, 0xb0, 0x3d, - 0x03, 0x7f, 0x69, 0x4b, 0xf4, 0x34, 0x20, 0x7d, 0xb3, 0x34, 0xea, - 0x8e, 0x4b, 0x64, 0xf5, 0x3e, 0xfd, 0xb3, 0x23, 0x67, 0x15, 0x0d, - 0x04, 0xb8, 0xf0, 0x2d, 0xc1, 0x09, 0x51, 0x3c, 0xb2, 0x6c, 0x15, - 0xf0, 0xa5, 0x23, 0xd7, 0x83, 0x74, 0xe4, 0xe5, 0x2e, 0xc9, 0xfe, - 0x98, 0x27, 0x42, 0xc6, 0xab, 0xc6, 0x9e, 0xb0, 0xd0, 0x5b, 0x38, - 0xa5, 0x9b, 0x50, 0xde, 0x7e, 0x18, 0x98, 0xb5, 0x45, 0x3b, 0xf6, - 0x79, 0xb4, 0xe8, 0xf7, 0x1a, 0x7b, 0x06, 0x83, 0xfb, 0xd0, 0x8b, - 0xda, 0xbb, 0xc7, 0xbd, 0x18, 0xab, 0x08, 0x6f, 0x3c, 0x80, 0x6b, - 0x40, 0x3f, 0x19, 0x19, 0xba, 0x65, 0x8a, 0xe6, 0xbe, 0xd5, 0x5c, - 0xd3, 0x36, 0xd7, 0xef, 0x40, 0x52, 0x24, 0x60, 0x38, 0x67, 0x04, - 0x31, 0xec, 0x8f, 0xf3, 0x82, 0xc6, 0xde, 0xb9, 0x55, 0xf3, 0x3b, - 0x31, 0x91, 0x5a, 0xdc, 0xb5, 0x08, 0x15, 0xad, 0x76, 0x25, 0x0a, - 0x0d, 0x7b, 0x2e, 0x87, 0xe2, 0x0c, 0xa6, 0x06, 0xbc, 0x26, 0x10, - 0x6d, 0x37, 0x9d, 0xec, 0xdd, 0x78, 0x8c, 0x7c, 0x80, 0xc5, 0xf0, - 0xd9, 0x77, 0x48, 0xd0, 0x30, 0x82, 0x07, 0x49, 0x30, 0x82, 0x05, - 0x31, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0xc9, 0xcd, - 0xd3, 0xe9, 0xd5, 0x7d, 0x23, 0xce, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, - 0x81, 0xac, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x45, 0x55, 0x31, 0x43, 0x30, 0x41, 0x06, 0x03, 0x55, - 0x04, 0x07, 0x13, 0x3a, 0x4d, 0x61, 0x64, 0x72, 0x69, 0x64, 0x20, - 0x28, 0x73, 0x65, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x61, - 0x74, 0x20, 0x77, 0x77, 0x77, 0x2e, 0x63, 0x61, 0x6d, 0x65, 0x72, - 0x66, 0x69, 0x72, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x29, 0x31, 0x12, 0x30, 0x10, - 0x06, 0x03, 0x55, 0x04, 0x05, 0x13, 0x09, 0x41, 0x38, 0x32, 0x37, - 0x34, 0x33, 0x32, 0x38, 0x37, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x12, 0x41, 0x43, 0x20, 0x43, 0x61, 0x6d, - 0x65, 0x72, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x20, 0x53, 0x2e, 0x41, - 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, - 0x1e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x43, 0x68, 0x61, - 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, - 0x6f, 0x74, 0x20, 0x2d, 0x20, 0x32, 0x30, 0x30, 0x38, 0x30, 0x1e, - 0x17, 0x0d, 0x30, 0x38, 0x30, 0x38, 0x30, 0x31, 0x31, 0x32, 0x33, - 0x31, 0x34, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x37, 0x33, - 0x31, 0x31, 0x32, 0x33, 0x31, 0x34, 0x30, 0x5a, 0x30, 0x81, 0xac, - 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x45, 0x55, 0x31, 0x43, 0x30, 0x41, 0x06, 0x03, 0x55, 0x04, 0x07, - 0x13, 0x3a, 0x4d, 0x61, 0x64, 0x72, 0x69, 0x64, 0x20, 0x28, 0x73, - 0x65, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x61, 0x74, 0x20, - 0x77, 0x77, 0x77, 0x2e, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x66, 0x69, - 0x72, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x29, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, - 0x55, 0x04, 0x05, 0x13, 0x09, 0x41, 0x38, 0x32, 0x37, 0x34, 0x33, - 0x32, 0x38, 0x37, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x12, 0x41, 0x43, 0x20, 0x43, 0x61, 0x6d, 0x65, 0x72, - 0x66, 0x69, 0x72, 0x6d, 0x61, 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x31, - 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1e, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x43, 0x68, 0x61, 0x6d, 0x62, - 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, - 0x20, 0x2d, 0x20, 0x32, 0x30, 0x30, 0x38, 0x30, 0x82, 0x02, 0x22, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, - 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xc0, 0xdf, 0x56, 0xd3, - 0xe4, 0x3a, 0x9b, 0x76, 0x45, 0xb4, 0x13, 0xdb, 0xff, 0xc1, 0xb6, - 0x19, 0x8b, 0x37, 0x41, 0x18, 0x95, 0x52, 0x47, 0xeb, 0x17, 0x9d, - 0x29, 0x88, 0x8e, 0x35, 0x6c, 0x06, 0x32, 0x2e, 0x47, 0x62, 0xf3, - 0x49, 0x04, 0xbf, 0x7d, 0x44, 0x36, 0xb1, 0x71, 0xcc, 0xbd, 0x5a, - 0x09, 0x73, 0xd5, 0xd9, 0x85, 0x44, 0xff, 0x91, 0x57, 0x25, 0xdf, - 0x5e, 0x36, 0x8e, 0x70, 0xd1, 0x5c, 0x71, 0x43, 0x1d, 0xd9, 0xda, - 0xef, 0x5c, 0xd2, 0xfb, 0x1b, 0xbd, 0x3a, 0xb5, 0xcb, 0xad, 0xa3, - 0xcc, 0x44, 0xa7, 0x0d, 0xae, 0x21, 0x15, 0x3f, 0xb9, 0x7a, 0x5b, - 0x92, 0x75, 0xd8, 0xa4, 0x12, 0x38, 0x89, 0x19, 0x8a, 0xb7, 0x80, - 0xd2, 0xe2, 0x32, 0x6f, 0x56, 0x9c, 0x91, 0xd6, 0x88, 0x10, 0x0b, - 0xb3, 0x74, 0x64, 0x92, 0x74, 0x60, 0xf3, 0xf6, 0xcf, 0x18, 0x4f, - 0x60, 0xb2, 0x23, 0xd0, 0xc7, 0x3b, 0xce, 0x61, 0x4b, 0x99, 0x8f, - 0xc2, 0x0c, 0xd0, 0x40, 0xb2, 0x98, 0xdc, 0x0d, 0xa8, 0x4e, 0xa3, - 0xb9, 0x0a, 0xae, 0x60, 0xa0, 0xad, 0x45, 0x52, 0x63, 0xba, 0x66, - 0xbd, 0x68, 0xe0, 0xf9, 0xbe, 0x1a, 0xa8, 0x81, 0xbb, 0x1e, 0x41, - 0x78, 0x75, 0xd3, 0xc1, 0xfe, 0x00, 0x55, 0xb0, 0x87, 0x54, 0xe8, - 0x27, 0x90, 0x35, 0x1d, 0x4c, 0x33, 0xad, 0x97, 0xfc, 0x97, 0x2e, - 0x98, 0x84, 0xbf, 0x2c, 0xc9, 0xa3, 0xbf, 0xd1, 0x98, 0x11, 0x14, - 0xed, 0x63, 0xf8, 0xca, 0x98, 0x88, 0x58, 0x17, 0x99, 0xed, 0x45, - 0x03, 0x97, 0x7e, 0x3c, 0x86, 0x1e, 0x88, 0x8c, 0xbe, 0xf2, 0x91, - 0x84, 0x8f, 0x65, 0x34, 0xd8, 0x00, 0x4c, 0x7d, 0xb7, 0x31, 0x17, - 0x5a, 0x29, 0x7a, 0x0a, 0x18, 0x24, 0x30, 0xa3, 0x37, 0xb5, 0x7a, - 0xa9, 0x01, 0x7d, 0x26, 0xd6, 0xf9, 0x0e, 0x8e, 0x59, 0xf1, 0xfd, - 0x1b, 0x33, 0xb5, 0x29, 0x3b, 0x17, 0x3b, 0x41, 0xb6, 0x21, 0xdd, - 0xd4, 0xc0, 0x3d, 0xa5, 0x9f, 0x9f, 0x1f, 0x43, 0x50, 0xc9, 0xbb, - 0xbc, 0x6c, 0x7a, 0x97, 0x98, 0xee, 0xcd, 0x8c, 0x1f, 0xfb, 0x9c, - 0x51, 0xae, 0x8b, 0x70, 0xbd, 0x27, 0x9f, 0x71, 0xc0, 0x6b, 0xac, - 0x7d, 0x90, 0x66, 0xe8, 0xd7, 0x5d, 0x3a, 0x0d, 0xb0, 0xd5, 0xc2, - 0x8d, 0xd5, 0xc8, 0x9d, 0x9d, 0xc1, 0x6d, 0xd0, 0xd0, 0xbf, 0x51, - 0xe4, 0xe3, 0xf8, 0xc3, 0x38, 0x36, 0xae, 0xd6, 0xa7, 0x75, 0xe6, - 0xaf, 0x84, 0x43, 0x5d, 0x93, 0x92, 0x0c, 0x6a, 0x07, 0xde, 0x3b, - 0x1d, 0x98, 0x22, 0xd6, 0xac, 0xc1, 0x35, 0xdb, 0xa3, 0xa0, 0x25, - 0xff, 0x72, 0xb5, 0x76, 0x1d, 0xde, 0x6d, 0xe9, 0x2c, 0x66, 0x2c, - 0x52, 0x84, 0xd0, 0x45, 0x92, 0xce, 0x1c, 0xe5, 0xe5, 0x33, 0x1d, - 0xdc, 0x07, 0x53, 0x54, 0xa3, 0xaa, 0x82, 0x3b, 0x9a, 0x37, 0x2f, - 0xdc, 0xdd, 0xa0, 0x64, 0xe9, 0xe6, 0xdd, 0xbd, 0xae, 0xfc, 0x64, - 0x85, 0x1d, 0x3c, 0xa7, 0xc9, 0x06, 0xde, 0x84, 0xff, 0x6b, 0xe8, - 0x6b, 0x1a, 0x3c, 0xc5, 0xa2, 0xb3, 0x42, 0xfb, 0x8b, 0x09, 0x3e, - 0x5f, 0x08, 0x52, 0xc7, 0x62, 0xc4, 0xd4, 0x05, 0x71, 0xbf, 0xc4, - 0x64, 0xe4, 0xf8, 0xa1, 0x83, 0xe8, 0x3e, 0x12, 0x9b, 0xa8, 0x1e, - 0xd4, 0x36, 0x4d, 0x2f, 0x71, 0xf6, 0x8d, 0x28, 0xf6, 0x83, 0xa9, - 0x13, 0xd2, 0x61, 0xc1, 0x91, 0xbb, 0x48, 0xc0, 0x34, 0x8f, 0x41, - 0x8c, 0x4b, 0x4c, 0xdb, 0x69, 0x12, 0xff, 0x50, 0x94, 0x9c, 0x20, - 0x83, 0x59, 0x73, 0xed, 0x7c, 0xa1, 0xf2, 0xf1, 0xfd, 0xdd, 0xf7, - 0x49, 0xd3, 0x43, 0x58, 0xa0, 0x56, 0x63, 0xca, 0x3d, 0x3d, 0xe5, - 0x35, 0x56, 0x59, 0xe9, 0x0e, 0xca, 0x20, 0xcc, 0x2b, 0x4b, 0x93, - 0x29, 0x0f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x6a, - 0x30, 0x82, 0x01, 0x66, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, - 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, - 0x01, 0x0c, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, - 0x04, 0x14, 0xb9, 0x09, 0xca, 0x9c, 0x1e, 0xdb, 0xd3, 0x6c, 0x3a, - 0x6b, 0xae, 0xed, 0x54, 0xf1, 0x5b, 0x93, 0x06, 0x35, 0x2e, 0x5e, - 0x30, 0x81, 0xe1, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x81, 0xd9, - 0x30, 0x81, 0xd6, 0x80, 0x14, 0xb9, 0x09, 0xca, 0x9c, 0x1e, 0xdb, - 0xd3, 0x6c, 0x3a, 0x6b, 0xae, 0xed, 0x54, 0xf1, 0x5b, 0x93, 0x06, - 0x35, 0x2e, 0x5e, 0xa1, 0x81, 0xb2, 0xa4, 0x81, 0xaf, 0x30, 0x81, - 0xac, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x78, 0xa6, 0x0c, + 0x16, 0x4a, 0x9f, 0x4c, 0x88, 0x3a, 0xc0, 0xcb, 0x0e, 0xa5, 0x16, + 0x7d, 0x9f, 0xb9, 0x48, 0x5f, 0x18, 0x8f, 0x0d, 0x62, 0x36, 0xf6, + 0xcd, 0x19, 0x6b, 0xac, 0xab, 0xd5, 0xf6, 0x91, 0x7d, 0xae, 0x71, + 0xf3, 0x3f, 0xb3, 0x0e, 0x78, 0x85, 0x9b, 0x95, 0xa4, 0x27, 0x21, + 0x47, 0x42, 0x4a, 0x7c, 0x48, 0x3a, 0xf5, 0x45, 0x7c, 0xb3, 0x0c, + 0x8e, 0x51, 0x78, 0xac, 0x95, 0x13, 0xde, 0xc6, 0xfd, 0x7d, 0xb8, + 0x1a, 0x90, 0x4c, 0xab, 0x92, 0x03, 0xc7, 0xed, 0x42, 0x01, 0xce, + 0x0f, 0xd8, 0xb1, 0xfa, 0xa2, 0x92, 0xe1, 0x60, 0x6d, 0xae, 0x7a, + 0x6b, 0x09, 0xaa, 0xc6, 0x29, 0xee, 0x68, 0x49, 0x67, 0x30, 0x80, + 0x24, 0x7a, 0x31, 0x16, 0x39, 0x5b, 0x7e, 0xf1, 0x1c, 0x2e, 0xdd, + 0x6c, 0x09, 0xad, 0xf2, 0x31, 0xc1, 0x82, 0x4e, 0xb9, 0xbb, 0xf9, + 0xbe, 0xbf, 0x2a, 0x85, 0x3f, 0xc0, 0x40, 0xa3, 0x3a, 0x59, 0xfc, + 0x59, 0x4b, 0x3c, 0x28, 0x24, 0xdb, 0xb4, 0x15, 0x75, 0xae, 0x0d, + 0x88, 0xba, 0x2e, 0x73, 0xc0, 0xbd, 0x58, 0x87, 0xe5, 0x42, 0xf2, + 0xeb, 0x5e, 0xee, 0x1e, 0x30, 0x22, 0x99, 0xcb, 0x37, 0xd1, 0xc4, + 0x21, 0x6c, 0x81, 0xec, 0xbe, 0x6d, 0x26, 0xe6, 0x1c, 0xe4, 0x42, + 0x20, 0x9e, 0x47, 0xb0, 0xac, 0x83, 0x59, 0x70, 0x2c, 0x35, 0xd6, + 0xaf, 0x36, 0x34, 0xb4, 0xcd, 0x3b, 0xf8, 0x32, 0xa8, 0xef, 0xe3, + 0x78, 0x89, 0xfb, 0x8d, 0x45, 0x2c, 0xda, 0x9c, 0xb8, 0x7e, 0x40, + 0x1c, 0x61, 0xe7, 0x3e, 0xa2, 0x92, 0x2c, 0x4b, 0xf2, 0xcd, 0xfa, + 0x98, 0xb6, 0x29, 0xff, 0xf3, 0xf2, 0x7b, 0xa9, 0x1f, 0x2e, 0xa0, + 0x93, 0x57, 0x2b, 0xde, 0x85, 0x03, 0xf9, 0x69, 0x37, 0xcb, 0x9e, + 0x78, 0x6a, 0x05, 0xb4, 0xc5, 0x31, 0x78, 0x89, 0xec, 0x7a, 0xa7, + 0x85, 0xe1, 0xb9, 0x7b, 0x3c, 0xde, 0xbe, 0x1e, 0x79, 0x84, 0xce, + 0x9f, 0x70, 0x0e, 0x59, 0xc2, 0x35, 0x2e, 0x90, 0x2a, 0x31, 0xd9, + 0xe4, 0x45, 0x7a, 0x41, 0xa4, 0x2e, 0x13, 0x9b, 0x34, 0x0e, 0x66, + 0x7b, 0x49, 0xab, 0x64, 0x97, 0xd0, 0x46, 0xc3, 0x79, 0x9d, 0x72, + 0x50, 0x63, 0xa6, 0x98, 0x5b, 0x06, 0xbd, 0x48, 0x6d, 0xd8, 0x39, + 0x83, 0x70, 0xe8, 0x35, 0xf0, 0x05, 0xd1, 0xaa, 0xbc, 0xe3, 0xdb, + 0xc8, 0x02, 0xea, 0x7c, 0xfd, 0x82, 0xda, 0xc2, 0x5b, 0x52, 0x35, + 0xae, 0x98, 0x3a, 0xad, 0xba, 0x35, 0x93, 0x23, 0xa7, 0x1f, 0x48, + 0xdd, 0x35, 0x46, 0x98, 0xb2, 0x10, 0x68, 0xe4, 0xa5, 0x31, 0xc2, + 0x0a, 0x58, 0x2e, 0x19, 0x81, 0x10, 0xc9, 0x50, 0x75, 0xfc, 0xea, + 0x5a, 0x16, 0xce, 0x11, 0xd7, 0xee, 0xef, 0x50, 0x88, 0x2d, 0x61, + 0xff, 0x3f, 0x42, 0x73, 0x05, 0x94, 0x43, 0xd5, 0x8e, 0x3c, 0x4e, + 0x01, 0x3a, 0x19, 0xa5, 0x1f, 0x46, 0x4e, 0x77, 0xd0, 0x5d, 0xe5, + 0x81, 0x22, 0x21, 0x87, 0xfe, 0x94, 0x7d, 0x84, 0xd8, 0x93, 0xad, + 0xd6, 0x68, 0x43, 0x48, 0xb2, 0xdb, 0xeb, 0x73, 0x24, 0xe7, 0x91, + 0x7f, 0x54, 0xa4, 0xb6, 0x80, 0x3e, 0x9d, 0xa3, 0x3c, 0x4c, 0x72, + 0xc2, 0x57, 0xc4, 0xa0, 0xd4, 0xcc, 0x38, 0x27, 0xce, 0xd5, 0x06, + 0x9e, 0xa2, 0x48, 0xd9, 0xe9, 0x9f, 0xce, 0x82, 0x70, 0x36, 0x93, + 0x9a, 0x3b, 0xdf, 0x96, 0x21, 0xe3, 0x59, 0xb7, 0x0c, 0xda, 0x91, + 0x37, 0xf0, 0xfd, 0x59, 0x5a, 0xb3, 0x99, 0xc8, 0x69, 0x6c, 0x43, + 0x26, 0x01, 0x35, 0x63, 0x60, 0x55, 0x89, 0x03, 0x3a, 0x75, 0xd8, + 0xba, 0x4a, 0xd9, 0x54, 0xff, 0xee, 0xde, 0x80, 0xd8, 0x2d, 0xd1, + 0x38, 0xd5, 0x5e, 0x2d, 0x0b, 0x98, 0x7d, 0x3e, 0x6c, 0xdb, 0xfc, + 0x26, 0x88, 0xc7, 0x30, 0x82, 0x07, 0x4f, 0x30, 0x82, 0x05, 0x37, + 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0xa3, 0xda, 0x42, + 0x7e, 0xa4, 0xb1, 0xae, 0xda, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, + 0xae, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x55, 0x31, 0x43, 0x30, 0x41, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x3a, 0x4d, 0x61, 0x64, 0x72, 0x69, 0x64, 0x20, 0x28, 0x73, 0x65, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, @@ -11908,1507 +9552,6171 @@ static const unsigned char ca_bundle_data[] = { 0x33, 0x32, 0x38, 0x37, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x12, 0x41, 0x43, 0x20, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x20, 0x53, 0x2e, 0x41, 0x2e, - 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1e, - 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x43, 0x68, 0x61, 0x6d, - 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, - 0x74, 0x20, 0x2d, 0x20, 0x32, 0x30, 0x30, 0x38, 0x82, 0x09, 0x00, - 0xc9, 0xcd, 0xd3, 0xe9, 0xd5, 0x7d, 0x23, 0xce, 0x30, 0x0e, 0x06, - 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, - 0x01, 0x06, 0x30, 0x3d, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x36, - 0x30, 0x34, 0x30, 0x32, 0x06, 0x04, 0x55, 0x1d, 0x20, 0x00, 0x30, - 0x2a, 0x30, 0x28, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, - 0x02, 0x01, 0x16, 0x1c, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x63, 0x61, 0x6d, 0x65, - 0x72, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x30, + 0x31, 0x29, 0x30, 0x27, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x20, + 0x43, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x65, 0x20, 0x52, + 0x6f, 0x6f, 0x74, 0x20, 0x2d, 0x20, 0x32, 0x30, 0x30, 0x38, 0x30, + 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x30, 0x38, 0x30, 0x31, 0x31, 0x32, + 0x32, 0x39, 0x35, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x37, + 0x33, 0x31, 0x31, 0x32, 0x32, 0x39, 0x35, 0x30, 0x5a, 0x30, 0x81, + 0xae, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x45, 0x55, 0x31, 0x43, 0x30, 0x41, 0x06, 0x03, 0x55, 0x04, + 0x07, 0x13, 0x3a, 0x4d, 0x61, 0x64, 0x72, 0x69, 0x64, 0x20, 0x28, + 0x73, 0x65, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x61, 0x74, + 0x20, 0x77, 0x77, 0x77, 0x2e, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x66, + 0x69, 0x72, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x29, 0x31, 0x12, 0x30, 0x10, 0x06, + 0x03, 0x55, 0x04, 0x05, 0x13, 0x09, 0x41, 0x38, 0x32, 0x37, 0x34, + 0x33, 0x32, 0x38, 0x37, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x13, 0x12, 0x41, 0x43, 0x20, 0x43, 0x61, 0x6d, 0x65, + 0x72, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x20, 0x53, 0x2e, 0x41, 0x2e, + 0x31, 0x29, 0x30, 0x27, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x20, + 0x43, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x65, 0x20, 0x52, + 0x6f, 0x6f, 0x74, 0x20, 0x2d, 0x20, 0x32, 0x30, 0x30, 0x38, 0x30, + 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, + 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xaf, + 0x00, 0xcb, 0x70, 0x37, 0x2b, 0x80, 0x5a, 0x4a, 0x3a, 0x6c, 0x78, + 0x94, 0x7d, 0xa3, 0x7f, 0x1a, 0x1f, 0xf6, 0x35, 0xd5, 0xbd, 0xdb, + 0xcb, 0x0d, 0x44, 0x72, 0x3e, 0x26, 0xb2, 0x90, 0x52, 0xba, 0x63, + 0x3b, 0x28, 0x58, 0x6f, 0xa5, 0xb3, 0x6d, 0x94, 0xa6, 0xf3, 0xdd, + 0x64, 0x0c, 0x55, 0xf6, 0xf6, 0xe7, 0xf2, 0x22, 0x22, 0x80, 0x5e, + 0xe1, 0x62, 0xc6, 0xb6, 0x29, 0xe1, 0x81, 0x6c, 0xf2, 0xbf, 0xe5, + 0x7d, 0x32, 0x6a, 0x54, 0xa0, 0x32, 0x19, 0x59, 0xfe, 0x1f, 0x8b, + 0xd7, 0x3d, 0x60, 0x86, 0x85, 0x24, 0x6f, 0xe3, 0x11, 0xb3, 0x77, + 0x3e, 0x20, 0x96, 0x35, 0x21, 0x6b, 0xb3, 0x08, 0xd9, 0x70, 0x2e, + 0x64, 0xf7, 0x84, 0x92, 0x53, 0xd6, 0x0e, 0xb0, 0x90, 0x8a, 0x8a, + 0xe3, 0x87, 0x8d, 0x06, 0xd3, 0xbd, 0x90, 0x0e, 0xe2, 0x99, 0xa1, + 0x1b, 0x86, 0x0e, 0xda, 0x9a, 0x0a, 0xbb, 0x0b, 0x61, 0x50, 0x06, + 0x52, 0xf1, 0x9e, 0x7f, 0x76, 0xec, 0xcb, 0x0f, 0xd0, 0x1e, 0x0d, + 0xcf, 0x99, 0x30, 0x3d, 0x1c, 0xc4, 0x45, 0x10, 0x58, 0xac, 0xd6, + 0xd3, 0xe8, 0xd7, 0xe5, 0xea, 0xc5, 0x01, 0x07, 0x77, 0xd6, 0x51, + 0xe6, 0x03, 0x7f, 0x8a, 0x48, 0xa5, 0x4d, 0x68, 0x75, 0xb9, 0xe9, + 0xbc, 0x9e, 0x4e, 0x19, 0x71, 0xf5, 0x32, 0x4b, 0x9c, 0x6d, 0x60, + 0x19, 0x0b, 0xfb, 0xcc, 0x9d, 0x75, 0xdc, 0xbf, 0x26, 0xcd, 0x8f, + 0x93, 0x78, 0x39, 0x79, 0x73, 0x5e, 0x25, 0x0e, 0xca, 0x5c, 0xeb, + 0x77, 0x12, 0x07, 0xcb, 0x64, 0x41, 0x47, 0x72, 0x93, 0xab, 0x50, + 0xc3, 0xeb, 0x09, 0x76, 0x64, 0x34, 0xd2, 0x39, 0xb7, 0x76, 0x11, + 0x09, 0x0d, 0x76, 0x45, 0xc4, 0xa9, 0xae, 0x3d, 0x6a, 0xaf, 0xb5, + 0x7d, 0x65, 0x2f, 0x94, 0x58, 0x10, 0xec, 0x5c, 0x7c, 0xaf, 0x7e, + 0xe2, 0xb6, 0x18, 0xd9, 0xd0, 0x9b, 0x4e, 0x5a, 0x49, 0xdf, 0xa9, + 0x66, 0x0b, 0xcc, 0x3c, 0xc6, 0x78, 0x7c, 0xa7, 0x9c, 0x1d, 0xe3, + 0xce, 0x8e, 0x53, 0xbe, 0x05, 0xde, 0x60, 0x0f, 0x6b, 0xe5, 0x1a, + 0xdb, 0x3f, 0xe3, 0xe1, 0x21, 0xc9, 0x29, 0xc1, 0xf1, 0xeb, 0x07, + 0x9c, 0x52, 0x1b, 0x01, 0x44, 0x51, 0x3c, 0x7b, 0x25, 0xd7, 0xc4, + 0xe5, 0x52, 0x54, 0x5d, 0x25, 0x07, 0xca, 0x16, 0x20, 0xb8, 0xad, + 0xe4, 0x41, 0xee, 0x7a, 0x08, 0xfe, 0x99, 0x6f, 0x83, 0xa6, 0x91, + 0x02, 0xb0, 0x6c, 0x36, 0x55, 0x6a, 0xe7, 0x7d, 0xf5, 0x96, 0xe6, + 0xca, 0x81, 0xd6, 0x97, 0xf1, 0x94, 0x83, 0xe9, 0xed, 0xb0, 0xb1, + 0x6b, 0x12, 0x69, 0x1e, 0xac, 0xfb, 0x5d, 0xa9, 0xc5, 0x98, 0xe9, + 0xb4, 0x5b, 0x58, 0x7a, 0xbe, 0x3d, 0xa2, 0x44, 0x3a, 0x63, 0x59, + 0xd4, 0x0b, 0x25, 0xde, 0x1b, 0x4f, 0xbd, 0xe5, 0x01, 0x9e, 0xcd, + 0xd2, 0x29, 0xd5, 0x9f, 0x17, 0x19, 0x0a, 0x6f, 0xbf, 0x0c, 0x90, + 0xd3, 0x09, 0x5f, 0xd9, 0xe3, 0x8a, 0x35, 0xcc, 0x79, 0x5a, 0x4d, + 0x19, 0x37, 0x92, 0xb7, 0xc4, 0xc1, 0xad, 0xaf, 0xf4, 0x79, 0x24, + 0x9a, 0xb2, 0x01, 0x0b, 0xb1, 0xaf, 0x5c, 0x96, 0xf3, 0x80, 0x32, + 0xfb, 0x5c, 0x3d, 0x98, 0xf1, 0xa0, 0x3f, 0x4a, 0xde, 0xbe, 0xaf, + 0x94, 0x2e, 0xd9, 0x55, 0x9a, 0x17, 0x6e, 0x60, 0x9d, 0x63, 0x6c, + 0xb8, 0x63, 0xc9, 0xae, 0x81, 0x5c, 0x18, 0x35, 0xe0, 0x90, 0xbb, + 0xbe, 0x3c, 0x4f, 0x37, 0x22, 0xb9, 0x7e, 0xeb, 0xcf, 0x9e, 0x77, + 0x21, 0xa6, 0x3d, 0x38, 0x81, 0xfb, 0x48, 0xda, 0x31, 0x3d, 0x2b, + 0xe3, 0x89, 0xf5, 0xd0, 0xb5, 0xbd, 0x7e, 0xe0, 0x50, 0xc4, 0x12, + 0x89, 0xb3, 0x23, 0x9a, 0x10, 0x31, 0x85, 0xdb, 0xae, 0x6f, 0xef, + 0x38, 0x33, 0x18, 0x76, 0x11, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, + 0x82, 0x01, 0x6c, 0x30, 0x82, 0x01, 0x68, 0x30, 0x12, 0x06, 0x03, + 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, + 0x01, 0xff, 0x02, 0x01, 0x0c, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, + 0x0e, 0x04, 0x16, 0x04, 0x14, 0xf9, 0x24, 0xac, 0x0f, 0xb2, 0xb5, + 0xf8, 0x79, 0xc0, 0xfa, 0x60, 0x88, 0x1b, 0xc4, 0xd9, 0x4d, 0x02, + 0x9e, 0x17, 0x19, 0x30, 0x81, 0xe3, 0x06, 0x03, 0x55, 0x1d, 0x23, + 0x04, 0x81, 0xdb, 0x30, 0x81, 0xd8, 0x80, 0x14, 0xf9, 0x24, 0xac, + 0x0f, 0xb2, 0xb5, 0xf8, 0x79, 0xc0, 0xfa, 0x60, 0x88, 0x1b, 0xc4, + 0xd9, 0x4d, 0x02, 0x9e, 0x17, 0x19, 0xa1, 0x81, 0xb4, 0xa4, 0x81, + 0xb1, 0x30, 0x81, 0xae, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x45, 0x55, 0x31, 0x43, 0x30, 0x41, 0x06, + 0x03, 0x55, 0x04, 0x07, 0x13, 0x3a, 0x4d, 0x61, 0x64, 0x72, 0x69, + 0x64, 0x20, 0x28, 0x73, 0x65, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x20, 0x61, 0x74, 0x20, 0x77, 0x77, 0x77, 0x2e, 0x63, 0x61, 0x6d, + 0x65, 0x72, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x29, 0x31, 0x12, + 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x05, 0x13, 0x09, 0x41, 0x38, + 0x32, 0x37, 0x34, 0x33, 0x32, 0x38, 0x37, 0x31, 0x1b, 0x30, 0x19, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x12, 0x41, 0x43, 0x20, 0x43, + 0x61, 0x6d, 0x65, 0x72, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x20, 0x53, + 0x2e, 0x41, 0x2e, 0x31, 0x29, 0x30, 0x27, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x20, 0x43, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, + 0x65, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x2d, 0x20, 0x32, 0x30, + 0x30, 0x38, 0x82, 0x09, 0x00, 0xa3, 0xda, 0x42, 0x7e, 0xa4, 0xb1, + 0xae, 0xda, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, + 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x3d, 0x06, 0x03, + 0x55, 0x1d, 0x20, 0x04, 0x36, 0x30, 0x34, 0x30, 0x32, 0x06, 0x04, + 0x55, 0x1d, 0x20, 0x00, 0x30, 0x2a, 0x30, 0x28, 0x06, 0x08, 0x2b, + 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x1c, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x66, 0x69, 0x72, 0x6d, 0x61, + 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, + 0x01, 0x00, 0x90, 0x12, 0xaf, 0x22, 0x35, 0xc2, 0xa3, 0x39, 0xf0, + 0x2e, 0xde, 0xe9, 0xb5, 0xe9, 0x78, 0x7c, 0x48, 0xbe, 0x3f, 0x7d, + 0x45, 0x92, 0x5e, 0xe9, 0xda, 0xb1, 0x19, 0xfc, 0x16, 0x3c, 0x9f, + 0xb4, 0x5b, 0x66, 0x9e, 0x6a, 0xe7, 0xc3, 0xb9, 0x5d, 0x88, 0xe8, + 0x0f, 0xad, 0xcf, 0x23, 0x0f, 0xde, 0x25, 0x3a, 0x5e, 0xcc, 0x4f, + 0xa5, 0xc1, 0xb5, 0x2d, 0xac, 0x24, 0xd2, 0x58, 0x07, 0xde, 0xa2, + 0xcf, 0x69, 0x84, 0x60, 0x33, 0xe8, 0x10, 0x0d, 0x13, 0xa9, 0x23, + 0xd0, 0x85, 0xe5, 0x8e, 0x7b, 0xa6, 0x9e, 0x3d, 0x72, 0x13, 0x72, + 0x33, 0xf5, 0xaa, 0x7d, 0xc6, 0x63, 0x1f, 0x08, 0xf4, 0xfe, 0x01, + 0x7f, 0x24, 0xcf, 0x2b, 0x2c, 0x54, 0x09, 0xde, 0xe2, 0x2b, 0x6d, + 0x92, 0xc6, 0x39, 0x4f, 0x16, 0xea, 0x3c, 0x7e, 0x7a, 0x46, 0xd4, + 0x45, 0x6a, 0x46, 0xa8, 0xeb, 0x75, 0x82, 0x56, 0xa7, 0xab, 0xa0, + 0x7c, 0x68, 0x13, 0x33, 0xf6, 0x9d, 0x30, 0xf0, 0x6f, 0x27, 0x39, + 0x24, 0x23, 0x2a, 0x90, 0xfd, 0x90, 0x29, 0x35, 0xf2, 0x93, 0xdf, + 0x34, 0xa5, 0xc6, 0xf7, 0xf8, 0xef, 0x8c, 0x0f, 0x62, 0x4a, 0x7c, + 0xae, 0xd3, 0xf5, 0x54, 0xf8, 0x8d, 0xb6, 0x9a, 0x56, 0x87, 0x16, + 0x82, 0x3a, 0x33, 0xab, 0x5a, 0x22, 0x08, 0xf7, 0x82, 0xba, 0xea, + 0x2e, 0xe0, 0x47, 0x9a, 0xb4, 0xb5, 0x45, 0xa3, 0x05, 0x3b, 0xd9, + 0xdc, 0x2e, 0x45, 0x40, 0x3b, 0xea, 0xdc, 0x7f, 0xe8, 0x3b, 0xeb, + 0xd1, 0xec, 0x26, 0xd8, 0x35, 0xa4, 0x30, 0xc5, 0x3a, 0xac, 0x57, + 0x9e, 0xb3, 0x76, 0xa5, 0x20, 0x7b, 0xf9, 0x1e, 0x4a, 0x05, 0x62, + 0x01, 0xa6, 0x28, 0x75, 0x60, 0x97, 0x92, 0x0d, 0x6e, 0x3e, 0x4d, + 0x37, 0x43, 0x0d, 0x92, 0x15, 0x9c, 0x18, 0x22, 0xcd, 0x51, 0x99, + 0xa0, 0x29, 0x1a, 0x3c, 0x5f, 0x8a, 0x32, 0x33, 0x5b, 0x30, 0xc7, + 0x89, 0x2f, 0x47, 0x98, 0x0f, 0xa3, 0x03, 0xc6, 0xf6, 0xf1, 0xac, + 0xdf, 0x32, 0xf0, 0xd9, 0x81, 0x1a, 0xe4, 0x9c, 0xbd, 0xf6, 0x80, + 0x14, 0xf0, 0xd1, 0x2c, 0xb9, 0x85, 0xf5, 0xd8, 0xa3, 0xb1, 0xc8, + 0xa5, 0x21, 0xe5, 0x1c, 0x13, 0x97, 0xee, 0x0e, 0xbd, 0xdf, 0x29, + 0xa9, 0xef, 0x34, 0x53, 0x5b, 0xd3, 0xe4, 0x6a, 0x13, 0x84, 0x06, + 0xb6, 0x32, 0x02, 0xc4, 0x52, 0xae, 0x22, 0xd2, 0xdc, 0xb2, 0x21, + 0x42, 0x1a, 0xda, 0x40, 0xf0, 0x29, 0xc9, 0xec, 0x0a, 0x0c, 0x5c, + 0xe2, 0xd0, 0xba, 0xcc, 0x48, 0xd3, 0x37, 0x0a, 0xcc, 0x12, 0x0a, + 0x8a, 0x79, 0xb0, 0x3d, 0x03, 0x7f, 0x69, 0x4b, 0xf4, 0x34, 0x20, + 0x7d, 0xb3, 0x34, 0xea, 0x8e, 0x4b, 0x64, 0xf5, 0x3e, 0xfd, 0xb3, + 0x23, 0x67, 0x15, 0x0d, 0x04, 0xb8, 0xf0, 0x2d, 0xc1, 0x09, 0x51, + 0x3c, 0xb2, 0x6c, 0x15, 0xf0, 0xa5, 0x23, 0xd7, 0x83, 0x74, 0xe4, + 0xe5, 0x2e, 0xc9, 0xfe, 0x98, 0x27, 0x42, 0xc6, 0xab, 0xc6, 0x9e, + 0xb0, 0xd0, 0x5b, 0x38, 0xa5, 0x9b, 0x50, 0xde, 0x7e, 0x18, 0x98, + 0xb5, 0x45, 0x3b, 0xf6, 0x79, 0xb4, 0xe8, 0xf7, 0x1a, 0x7b, 0x06, + 0x83, 0xfb, 0xd0, 0x8b, 0xda, 0xbb, 0xc7, 0xbd, 0x18, 0xab, 0x08, + 0x6f, 0x3c, 0x80, 0x6b, 0x40, 0x3f, 0x19, 0x19, 0xba, 0x65, 0x8a, + 0xe6, 0xbe, 0xd5, 0x5c, 0xd3, 0x36, 0xd7, 0xef, 0x40, 0x52, 0x24, + 0x60, 0x38, 0x67, 0x04, 0x31, 0xec, 0x8f, 0xf3, 0x82, 0xc6, 0xde, + 0xb9, 0x55, 0xf3, 0x3b, 0x31, 0x91, 0x5a, 0xdc, 0xb5, 0x08, 0x15, + 0xad, 0x76, 0x25, 0x0a, 0x0d, 0x7b, 0x2e, 0x87, 0xe2, 0x0c, 0xa6, + 0x06, 0xbc, 0x26, 0x10, 0x6d, 0x37, 0x9d, 0xec, 0xdd, 0x78, 0x8c, + 0x7c, 0x80, 0xc5, 0xf0, 0xd9, 0x77, 0x48, 0xd0, 0x30, 0x82, 0x07, + 0x49, 0x30, 0x82, 0x05, 0x31, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, + 0x09, 0x00, 0xc9, 0xcd, 0xd3, 0xe9, 0xd5, 0x7d, 0x23, 0xce, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x80, 0x88, 0x7f, - 0x70, 0xde, 0x92, 0x28, 0xd9, 0x05, 0x94, 0x46, 0xff, 0x90, 0x57, - 0xa9, 0xf1, 0x2f, 0xdf, 0x1a, 0x0d, 0x6b, 0xfa, 0x7c, 0x0e, 0x1c, - 0x49, 0x24, 0x79, 0x27, 0xd8, 0x46, 0xaa, 0x6f, 0x29, 0x59, 0x52, - 0x88, 0x70, 0x12, 0xea, 0xdd, 0x3d, 0xf5, 0x9b, 0x53, 0x54, 0x6f, - 0xe1, 0x60, 0xa2, 0xa8, 0x09, 0xb9, 0xec, 0xeb, 0x59, 0x7c, 0xc6, - 0x35, 0xf1, 0xdc, 0x18, 0xe9, 0xf1, 0x67, 0xe5, 0xaf, 0xba, 0x45, - 0xe0, 0x09, 0xde, 0xca, 0x44, 0x0f, 0xc2, 0x17, 0x0e, 0x77, 0x91, - 0x45, 0x7a, 0x33, 0x5f, 0x5f, 0x96, 0x2c, 0x68, 0x8b, 0xc1, 0x47, - 0x8f, 0x98, 0x9b, 0x3d, 0xc0, 0xec, 0xcb, 0xf5, 0xd5, 0x82, 0x92, - 0x84, 0x35, 0xd1, 0xbe, 0x36, 0x38, 0x56, 0x72, 0x31, 0x5b, 0x47, - 0x2d, 0xaa, 0x17, 0xa4, 0x63, 0x51, 0xeb, 0x0a, 0x01, 0xad, 0x7f, - 0xec, 0x75, 0x9e, 0xcb, 0xa1, 0x1f, 0xf1, 0x7f, 0x12, 0xb1, 0xb9, - 0xe4, 0x64, 0x7f, 0x67, 0xd6, 0x23, 0x2a, 0xf4, 0xb8, 0x39, 0x5d, - 0x98, 0xe8, 0x21, 0xa7, 0xe1, 0xbd, 0x3d, 0x42, 0x1a, 0x74, 0x9a, - 0x70, 0xaf, 0x68, 0x6c, 0x50, 0x5d, 0x49, 0xcf, 0xff, 0xfb, 0x0e, - 0x5d, 0xe6, 0x2c, 0x47, 0xd7, 0x81, 0x3a, 0x59, 0x00, 0xb5, 0x73, - 0x6b, 0x63, 0x20, 0xf6, 0x31, 0x45, 0x08, 0x39, 0x0e, 0xf4, 0x70, - 0x7e, 0x40, 0x70, 0x5a, 0x3f, 0xd0, 0x6b, 0x42, 0xa9, 0x74, 0x3d, - 0x28, 0x2f, 0x02, 0x6d, 0x75, 0x72, 0x95, 0x09, 0x8d, 0x48, 0x63, - 0xc6, 0xc6, 0x23, 0x57, 0x92, 0x93, 0x5e, 0x35, 0xc1, 0x8d, 0xf9, - 0x0a, 0xf7, 0x2c, 0x9d, 0x62, 0x1c, 0xf6, 0xad, 0x7c, 0xdd, 0xa6, - 0x31, 0x1e, 0xb6, 0xb1, 0xc7, 0x7e, 0x85, 0x26, 0xfa, 0xa4, 0x6a, - 0xb5, 0xda, 0x63, 0x30, 0xd1, 0xef, 0x93, 0x37, 0xb2, 0x66, 0x2f, - 0x7d, 0x05, 0xf7, 0xe7, 0xb7, 0x4b, 0x98, 0x94, 0x35, 0xc0, 0xd9, - 0x3a, 0x29, 0xc1, 0x9d, 0xb2, 0x50, 0x33, 0x1d, 0x4a, 0xa9, 0x5a, - 0xa6, 0xc9, 0x03, 0xef, 0xed, 0xf4, 0xe7, 0xa8, 0x6e, 0x8a, 0xb4, - 0x57, 0x84, 0xeb, 0xa4, 0x3f, 0xd0, 0xee, 0xaa, 0xaa, 0x87, 0x5b, - 0x63, 0xe8, 0x93, 0xe2, 0x6b, 0xa8, 0xd4, 0xb8, 0x72, 0x78, 0x6b, - 0x1b, 0xed, 0x39, 0xe4, 0x5d, 0xcb, 0x9b, 0xaa, 0x87, 0xd5, 0x4f, - 0x4e, 0x00, 0xfe, 0xd9, 0x6a, 0x9f, 0x3c, 0x31, 0x0f, 0x28, 0x02, - 0x01, 0x7d, 0x98, 0xe8, 0xa7, 0xb0, 0xa2, 0x64, 0x9e, 0x79, 0xf8, - 0x48, 0xf2, 0x15, 0xa9, 0xcc, 0xe6, 0xc8, 0x44, 0xeb, 0x3f, 0x78, - 0x99, 0xf2, 0x7b, 0x71, 0x3e, 0x3c, 0xf1, 0x98, 0xa7, 0xc5, 0x18, - 0x12, 0x3f, 0xe6, 0xbb, 0x28, 0x33, 0x42, 0xe9, 0x45, 0x0a, 0x7c, - 0x6d, 0xf2, 0x86, 0x79, 0x2f, 0xc5, 0x82, 0x19, 0x7d, 0x09, 0x89, - 0x7c, 0xb2, 0x54, 0x76, 0x88, 0xae, 0xde, 0xc1, 0xf3, 0xcc, 0xe1, - 0x6e, 0xdb, 0x31, 0xd6, 0x93, 0xae, 0x99, 0xa0, 0xef, 0x25, 0x6a, - 0x73, 0x98, 0x89, 0x5b, 0x3a, 0x2e, 0x13, 0x88, 0x1e, 0xbf, 0xc0, - 0x92, 0x94, 0x34, 0x1b, 0xe3, 0x27, 0xb7, 0x8b, 0x1e, 0x6f, 0x42, - 0xff, 0xe7, 0xe9, 0x37, 0x9b, 0x50, 0x1d, 0x2d, 0xa2, 0xf9, 0x02, - 0xee, 0xcb, 0x58, 0x58, 0x3a, 0x71, 0xbc, 0x68, 0xe3, 0xaa, 0xc1, - 0xaf, 0x1c, 0x28, 0x1f, 0xa2, 0xdc, 0x23, 0x65, 0x3f, 0x81, 0xea, - 0xae, 0x99, 0xd3, 0xd8, 0x30, 0xcf, 0x13, 0x0d, 0x4f, 0x15, 0xc9, - 0x84, 0xbc, 0xa7, 0x48, 0x2d, 0xf8, 0x30, 0x23, 0x77, 0xd8, 0x46, - 0x4b, 0x79, 0x6d, 0xf6, 0x8c, 0xed, 0x3a, 0x7f, 0x60, 0x11, 0x78, - 0xf4, 0xe9, 0x9b, 0xae, 0xd5, 0x54, 0xc0, 0x74, 0x80, 0xd1, 0x0b, - 0x42, 0x9f, 0xc1, 0x30, 0x82, 0x03, 0xc5, 0x30, 0x82, 0x02, 0xad, - 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, - 0x00, 0x30, 0x81, 0x83, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, - 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x41, 0x72, 0x69, 0x7a, 0x6f, - 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, - 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, - 0x65, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, - 0x11, 0x47, 0x6f, 0x44, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, - 0x6d, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x31, 0x30, 0x2f, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x28, 0x47, 0x6f, 0x20, 0x44, - 0x61, 0x64, 0x64, 0x79, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, - 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, - 0x20, 0x47, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, 0x30, 0x39, - 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, - 0x33, 0x37, 0x31, 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, - 0x39, 0x5a, 0x30, 0x81, 0x83, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, - 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, - 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x41, 0x72, 0x69, 0x7a, - 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, - 0x07, 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, - 0x6c, 0x65, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x13, 0x11, 0x47, 0x6f, 0x44, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, - 0x6f, 0x6d, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x31, 0x30, - 0x2f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x28, 0x47, 0x6f, 0x20, - 0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, - 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, - 0x2d, 0x20, 0x47, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, - 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, - 0x82, 0x01, 0x01, 0x00, 0xbf, 0x71, 0x62, 0x08, 0xf1, 0xfa, 0x59, - 0x34, 0xf7, 0x1b, 0xc9, 0x18, 0xa3, 0xf7, 0x80, 0x49, 0x58, 0xe9, - 0x22, 0x83, 0x13, 0xa6, 0xc5, 0x20, 0x43, 0x01, 0x3b, 0x84, 0xf1, - 0xe6, 0x85, 0x49, 0x9f, 0x27, 0xea, 0xf6, 0x84, 0x1b, 0x4e, 0xa0, - 0xb4, 0xdb, 0x70, 0x98, 0xc7, 0x32, 0x01, 0xb1, 0x05, 0x3e, 0x07, - 0x4e, 0xee, 0xf4, 0xfa, 0x4f, 0x2f, 0x59, 0x30, 0x22, 0xe7, 0xab, - 0x19, 0x56, 0x6b, 0xe2, 0x80, 0x07, 0xfc, 0xf3, 0x16, 0x75, 0x80, - 0x39, 0x51, 0x7b, 0xe5, 0xf9, 0x35, 0xb6, 0x74, 0x4e, 0xa9, 0x8d, - 0x82, 0x13, 0xe4, 0xb6, 0x3f, 0xa9, 0x03, 0x83, 0xfa, 0xa2, 0xbe, - 0x8a, 0x15, 0x6a, 0x7f, 0xde, 0x0b, 0xc3, 0xb6, 0x19, 0x14, 0x05, - 0xca, 0xea, 0xc3, 0xa8, 0x04, 0x94, 0x3b, 0x46, 0x7c, 0x32, 0x0d, - 0xf3, 0x00, 0x66, 0x22, 0xc8, 0x8d, 0x69, 0x6d, 0x36, 0x8c, 0x11, - 0x18, 0xb7, 0xd3, 0xb2, 0x1c, 0x60, 0xb4, 0x38, 0xfa, 0x02, 0x8c, - 0xce, 0xd3, 0xdd, 0x46, 0x07, 0xde, 0x0a, 0x3e, 0xeb, 0x5d, 0x7c, - 0xc8, 0x7c, 0xfb, 0xb0, 0x2b, 0x53, 0xa4, 0x92, 0x62, 0x69, 0x51, - 0x25, 0x05, 0x61, 0x1a, 0x44, 0x81, 0x8c, 0x2c, 0xa9, 0x43, 0x96, - 0x23, 0xdf, 0xac, 0x3a, 0x81, 0x9a, 0x0e, 0x29, 0xc5, 0x1c, 0xa9, - 0xe9, 0x5d, 0x1e, 0xb6, 0x9e, 0x9e, 0x30, 0x0a, 0x39, 0xce, 0xf1, - 0x88, 0x80, 0xfb, 0x4b, 0x5d, 0xcc, 0x32, 0xec, 0x85, 0x62, 0x43, - 0x25, 0x34, 0x02, 0x56, 0x27, 0x01, 0x91, 0xb4, 0x3b, 0x70, 0x2a, - 0x3f, 0x6e, 0xb1, 0xe8, 0x9c, 0x88, 0x01, 0x7d, 0x9f, 0xd4, 0xf9, - 0xdb, 0x53, 0x6d, 0x60, 0x9d, 0xbf, 0x2c, 0xe7, 0x58, 0xab, 0xb8, - 0x5f, 0x46, 0xfc, 0xce, 0xc4, 0x1b, 0x03, 0x3c, 0x09, 0xeb, 0x49, - 0x31, 0x5c, 0x69, 0x46, 0xb3, 0xe0, 0x47, 0x02, 0x03, 0x01, 0x00, - 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, - 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, - 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, - 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, - 0x0e, 0x04, 0x16, 0x04, 0x14, 0x3a, 0x9a, 0x85, 0x07, 0x10, 0x67, - 0x28, 0xb6, 0xef, 0xf6, 0xbd, 0x05, 0x41, 0x6e, 0x20, 0xc1, 0x94, - 0xda, 0x0f, 0xde, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, - 0x00, 0x99, 0xdb, 0x5d, 0x79, 0xd5, 0xf9, 0x97, 0x59, 0x67, 0x03, - 0x61, 0xf1, 0x7e, 0x3b, 0x06, 0x31, 0x75, 0x2d, 0xa1, 0x20, 0x8e, - 0x4f, 0x65, 0x87, 0xb4, 0xf7, 0xa6, 0x9c, 0xbc, 0xd8, 0xe9, 0x2f, - 0xd0, 0xdb, 0x5a, 0xee, 0xcf, 0x74, 0x8c, 0x73, 0xb4, 0x38, 0x42, - 0xda, 0x05, 0x7b, 0xf8, 0x02, 0x75, 0xb8, 0xfd, 0xa5, 0xb1, 0xd7, - 0xae, 0xf6, 0xd7, 0xde, 0x13, 0xcb, 0x53, 0x10, 0x7e, 0x8a, 0x46, - 0xd1, 0x97, 0xfa, 0xb7, 0x2e, 0x2b, 0x11, 0xab, 0x90, 0xb0, 0x27, - 0x80, 0xf9, 0xe8, 0x9f, 0x5a, 0xe9, 0x37, 0x9f, 0xab, 0xe4, 0xdf, - 0x6c, 0xb3, 0x85, 0x17, 0x9d, 0x3d, 0xd9, 0x24, 0x4f, 0x79, 0x91, - 0x35, 0xd6, 0x5f, 0x04, 0xeb, 0x80, 0x83, 0xab, 0x9a, 0x02, 0x2d, - 0xb5, 0x10, 0xf4, 0xd8, 0x90, 0xc7, 0x04, 0x73, 0x40, 0xed, 0x72, - 0x25, 0xa0, 0xa9, 0x9f, 0xec, 0x9e, 0xab, 0x68, 0x12, 0x99, 0x57, - 0xc6, 0x8f, 0x12, 0x3a, 0x09, 0xa4, 0xbd, 0x44, 0xfd, 0x06, 0x15, - 0x37, 0xc1, 0x9b, 0xe4, 0x32, 0xa3, 0xed, 0x38, 0xe8, 0xd8, 0x64, - 0xf3, 0x2c, 0x7e, 0x14, 0xfc, 0x02, 0xea, 0x9f, 0xcd, 0xff, 0x07, - 0x68, 0x17, 0xdb, 0x22, 0x90, 0x38, 0x2d, 0x7a, 0x8d, 0xd1, 0x54, - 0xf1, 0x69, 0xe3, 0x5f, 0x33, 0xca, 0x7a, 0x3d, 0x7b, 0x0a, 0xe3, - 0xca, 0x7f, 0x5f, 0x39, 0xe5, 0xe2, 0x75, 0xba, 0xc5, 0x76, 0x18, - 0x33, 0xce, 0x2c, 0xf0, 0x2f, 0x4c, 0xad, 0xf7, 0xb1, 0xe7, 0xce, - 0x4f, 0xa8, 0xc4, 0x9b, 0x4a, 0x54, 0x06, 0xc5, 0x7f, 0x7d, 0xd5, - 0x08, 0x0f, 0xe2, 0x1c, 0xfe, 0x7e, 0x17, 0xb8, 0xac, 0x5e, 0xf6, - 0xd4, 0x16, 0xb2, 0x43, 0x09, 0x0c, 0x4d, 0xf6, 0xa7, 0x6b, 0xb4, - 0x99, 0x84, 0x65, 0xca, 0x7a, 0x88, 0xe2, 0xe2, 0x44, 0xbe, 0x5c, - 0xf7, 0xea, 0x1c, 0xf5, 0x30, 0x82, 0x03, 0xdd, 0x30, 0x82, 0x02, - 0xc5, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, - 0x05, 0x00, 0x30, 0x81, 0x8f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, - 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, - 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x41, 0x72, 0x69, 0x7a, - 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, - 0x07, 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, - 0x6c, 0x65, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, - 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x32, 0x30, - 0x30, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x29, 0x53, 0x74, 0x61, - 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x52, 0x6f, 0x6f, 0x74, - 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, - 0x30, 0x39, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, - 0x17, 0x0d, 0x33, 0x37, 0x31, 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, - 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0x8f, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, - 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x41, 0x72, - 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, - 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, 0x73, - 0x64, 0x61, 0x6c, 0x65, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, - 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, - 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x29, 0x53, - 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x52, 0x6f, + 0x05, 0x05, 0x00, 0x30, 0x81, 0xac, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x55, 0x31, 0x43, 0x30, + 0x41, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x3a, 0x4d, 0x61, 0x64, + 0x72, 0x69, 0x64, 0x20, 0x28, 0x73, 0x65, 0x65, 0x20, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x20, 0x61, 0x74, 0x20, 0x77, 0x77, 0x77, 0x2e, 0x63, + 0x61, 0x6d, 0x65, 0x72, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x29, + 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x05, 0x13, 0x09, + 0x41, 0x38, 0x32, 0x37, 0x34, 0x33, 0x32, 0x38, 0x37, 0x31, 0x1b, + 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x12, 0x41, 0x43, + 0x20, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x66, 0x69, 0x72, 0x6d, 0x61, + 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x13, 0x1e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x20, 0x43, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, + 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x2d, 0x20, 0x32, 0x30, + 0x30, 0x38, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x30, 0x38, 0x30, + 0x31, 0x31, 0x32, 0x33, 0x31, 0x34, 0x30, 0x5a, 0x17, 0x0d, 0x33, + 0x38, 0x30, 0x37, 0x33, 0x31, 0x31, 0x32, 0x33, 0x31, 0x34, 0x30, + 0x5a, 0x30, 0x81, 0xac, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x45, 0x55, 0x31, 0x43, 0x30, 0x41, 0x06, + 0x03, 0x55, 0x04, 0x07, 0x13, 0x3a, 0x4d, 0x61, 0x64, 0x72, 0x69, + 0x64, 0x20, 0x28, 0x73, 0x65, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x20, 0x61, 0x74, 0x20, 0x77, 0x77, 0x77, 0x2e, 0x63, 0x61, 0x6d, + 0x65, 0x72, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x29, 0x31, 0x12, + 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x05, 0x13, 0x09, 0x41, 0x38, + 0x32, 0x37, 0x34, 0x33, 0x32, 0x38, 0x37, 0x31, 0x1b, 0x30, 0x19, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x12, 0x41, 0x43, 0x20, 0x43, + 0x61, 0x6d, 0x65, 0x72, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x20, 0x53, + 0x2e, 0x41, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x1e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x43, + 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x20, + 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x2d, 0x20, 0x32, 0x30, 0x30, 0x38, + 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, + 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, + 0xc0, 0xdf, 0x56, 0xd3, 0xe4, 0x3a, 0x9b, 0x76, 0x45, 0xb4, 0x13, + 0xdb, 0xff, 0xc1, 0xb6, 0x19, 0x8b, 0x37, 0x41, 0x18, 0x95, 0x52, + 0x47, 0xeb, 0x17, 0x9d, 0x29, 0x88, 0x8e, 0x35, 0x6c, 0x06, 0x32, + 0x2e, 0x47, 0x62, 0xf3, 0x49, 0x04, 0xbf, 0x7d, 0x44, 0x36, 0xb1, + 0x71, 0xcc, 0xbd, 0x5a, 0x09, 0x73, 0xd5, 0xd9, 0x85, 0x44, 0xff, + 0x91, 0x57, 0x25, 0xdf, 0x5e, 0x36, 0x8e, 0x70, 0xd1, 0x5c, 0x71, + 0x43, 0x1d, 0xd9, 0xda, 0xef, 0x5c, 0xd2, 0xfb, 0x1b, 0xbd, 0x3a, + 0xb5, 0xcb, 0xad, 0xa3, 0xcc, 0x44, 0xa7, 0x0d, 0xae, 0x21, 0x15, + 0x3f, 0xb9, 0x7a, 0x5b, 0x92, 0x75, 0xd8, 0xa4, 0x12, 0x38, 0x89, + 0x19, 0x8a, 0xb7, 0x80, 0xd2, 0xe2, 0x32, 0x6f, 0x56, 0x9c, 0x91, + 0xd6, 0x88, 0x10, 0x0b, 0xb3, 0x74, 0x64, 0x92, 0x74, 0x60, 0xf3, + 0xf6, 0xcf, 0x18, 0x4f, 0x60, 0xb2, 0x23, 0xd0, 0xc7, 0x3b, 0xce, + 0x61, 0x4b, 0x99, 0x8f, 0xc2, 0x0c, 0xd0, 0x40, 0xb2, 0x98, 0xdc, + 0x0d, 0xa8, 0x4e, 0xa3, 0xb9, 0x0a, 0xae, 0x60, 0xa0, 0xad, 0x45, + 0x52, 0x63, 0xba, 0x66, 0xbd, 0x68, 0xe0, 0xf9, 0xbe, 0x1a, 0xa8, + 0x81, 0xbb, 0x1e, 0x41, 0x78, 0x75, 0xd3, 0xc1, 0xfe, 0x00, 0x55, + 0xb0, 0x87, 0x54, 0xe8, 0x27, 0x90, 0x35, 0x1d, 0x4c, 0x33, 0xad, + 0x97, 0xfc, 0x97, 0x2e, 0x98, 0x84, 0xbf, 0x2c, 0xc9, 0xa3, 0xbf, + 0xd1, 0x98, 0x11, 0x14, 0xed, 0x63, 0xf8, 0xca, 0x98, 0x88, 0x58, + 0x17, 0x99, 0xed, 0x45, 0x03, 0x97, 0x7e, 0x3c, 0x86, 0x1e, 0x88, + 0x8c, 0xbe, 0xf2, 0x91, 0x84, 0x8f, 0x65, 0x34, 0xd8, 0x00, 0x4c, + 0x7d, 0xb7, 0x31, 0x17, 0x5a, 0x29, 0x7a, 0x0a, 0x18, 0x24, 0x30, + 0xa3, 0x37, 0xb5, 0x7a, 0xa9, 0x01, 0x7d, 0x26, 0xd6, 0xf9, 0x0e, + 0x8e, 0x59, 0xf1, 0xfd, 0x1b, 0x33, 0xb5, 0x29, 0x3b, 0x17, 0x3b, + 0x41, 0xb6, 0x21, 0xdd, 0xd4, 0xc0, 0x3d, 0xa5, 0x9f, 0x9f, 0x1f, + 0x43, 0x50, 0xc9, 0xbb, 0xbc, 0x6c, 0x7a, 0x97, 0x98, 0xee, 0xcd, + 0x8c, 0x1f, 0xfb, 0x9c, 0x51, 0xae, 0x8b, 0x70, 0xbd, 0x27, 0x9f, + 0x71, 0xc0, 0x6b, 0xac, 0x7d, 0x90, 0x66, 0xe8, 0xd7, 0x5d, 0x3a, + 0x0d, 0xb0, 0xd5, 0xc2, 0x8d, 0xd5, 0xc8, 0x9d, 0x9d, 0xc1, 0x6d, + 0xd0, 0xd0, 0xbf, 0x51, 0xe4, 0xe3, 0xf8, 0xc3, 0x38, 0x36, 0xae, + 0xd6, 0xa7, 0x75, 0xe6, 0xaf, 0x84, 0x43, 0x5d, 0x93, 0x92, 0x0c, + 0x6a, 0x07, 0xde, 0x3b, 0x1d, 0x98, 0x22, 0xd6, 0xac, 0xc1, 0x35, + 0xdb, 0xa3, 0xa0, 0x25, 0xff, 0x72, 0xb5, 0x76, 0x1d, 0xde, 0x6d, + 0xe9, 0x2c, 0x66, 0x2c, 0x52, 0x84, 0xd0, 0x45, 0x92, 0xce, 0x1c, + 0xe5, 0xe5, 0x33, 0x1d, 0xdc, 0x07, 0x53, 0x54, 0xa3, 0xaa, 0x82, + 0x3b, 0x9a, 0x37, 0x2f, 0xdc, 0xdd, 0xa0, 0x64, 0xe9, 0xe6, 0xdd, + 0xbd, 0xae, 0xfc, 0x64, 0x85, 0x1d, 0x3c, 0xa7, 0xc9, 0x06, 0xde, + 0x84, 0xff, 0x6b, 0xe8, 0x6b, 0x1a, 0x3c, 0xc5, 0xa2, 0xb3, 0x42, + 0xfb, 0x8b, 0x09, 0x3e, 0x5f, 0x08, 0x52, 0xc7, 0x62, 0xc4, 0xd4, + 0x05, 0x71, 0xbf, 0xc4, 0x64, 0xe4, 0xf8, 0xa1, 0x83, 0xe8, 0x3e, + 0x12, 0x9b, 0xa8, 0x1e, 0xd4, 0x36, 0x4d, 0x2f, 0x71, 0xf6, 0x8d, + 0x28, 0xf6, 0x83, 0xa9, 0x13, 0xd2, 0x61, 0xc1, 0x91, 0xbb, 0x48, + 0xc0, 0x34, 0x8f, 0x41, 0x8c, 0x4b, 0x4c, 0xdb, 0x69, 0x12, 0xff, + 0x50, 0x94, 0x9c, 0x20, 0x83, 0x59, 0x73, 0xed, 0x7c, 0xa1, 0xf2, + 0xf1, 0xfd, 0xdd, 0xf7, 0x49, 0xd3, 0x43, 0x58, 0xa0, 0x56, 0x63, + 0xca, 0x3d, 0x3d, 0xe5, 0x35, 0x56, 0x59, 0xe9, 0x0e, 0xca, 0x20, + 0xcc, 0x2b, 0x4b, 0x93, 0x29, 0x0f, 0x02, 0x03, 0x01, 0x00, 0x01, + 0xa3, 0x82, 0x01, 0x6a, 0x30, 0x82, 0x01, 0x66, 0x30, 0x12, 0x06, + 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, + 0x01, 0x01, 0xff, 0x02, 0x01, 0x0c, 0x30, 0x1d, 0x06, 0x03, 0x55, + 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xb9, 0x09, 0xca, 0x9c, 0x1e, + 0xdb, 0xd3, 0x6c, 0x3a, 0x6b, 0xae, 0xed, 0x54, 0xf1, 0x5b, 0x93, + 0x06, 0x35, 0x2e, 0x5e, 0x30, 0x81, 0xe1, 0x06, 0x03, 0x55, 0x1d, + 0x23, 0x04, 0x81, 0xd9, 0x30, 0x81, 0xd6, 0x80, 0x14, 0xb9, 0x09, + 0xca, 0x9c, 0x1e, 0xdb, 0xd3, 0x6c, 0x3a, 0x6b, 0xae, 0xed, 0x54, + 0xf1, 0x5b, 0x93, 0x06, 0x35, 0x2e, 0x5e, 0xa1, 0x81, 0xb2, 0xa4, + 0x81, 0xaf, 0x30, 0x81, 0xac, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x55, 0x31, 0x43, 0x30, 0x41, + 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x3a, 0x4d, 0x61, 0x64, 0x72, + 0x69, 0x64, 0x20, 0x28, 0x73, 0x65, 0x65, 0x20, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x20, 0x61, 0x74, 0x20, 0x77, 0x77, 0x77, 0x2e, 0x63, 0x61, + 0x6d, 0x65, 0x72, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x29, 0x31, + 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x05, 0x13, 0x09, 0x41, + 0x38, 0x32, 0x37, 0x34, 0x33, 0x32, 0x38, 0x37, 0x31, 0x1b, 0x30, + 0x19, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x12, 0x41, 0x43, 0x20, + 0x43, 0x61, 0x6d, 0x65, 0x72, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x20, + 0x53, 0x2e, 0x41, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x1e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, + 0x43, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, + 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x2d, 0x20, 0x32, 0x30, 0x30, + 0x38, 0x82, 0x09, 0x00, 0xc9, 0xcd, 0xd3, 0xe9, 0xd5, 0x7d, 0x23, + 0xce, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, + 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x3d, 0x06, 0x03, 0x55, + 0x1d, 0x20, 0x04, 0x36, 0x30, 0x34, 0x30, 0x32, 0x06, 0x04, 0x55, + 0x1d, 0x20, 0x00, 0x30, 0x2a, 0x30, 0x28, 0x06, 0x08, 0x2b, 0x06, + 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x1c, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x63, 0x61, 0x6d, 0x65, 0x72, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x2e, + 0x63, 0x6f, 0x6d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, + 0x00, 0x80, 0x88, 0x7f, 0x70, 0xde, 0x92, 0x28, 0xd9, 0x05, 0x94, + 0x46, 0xff, 0x90, 0x57, 0xa9, 0xf1, 0x2f, 0xdf, 0x1a, 0x0d, 0x6b, + 0xfa, 0x7c, 0x0e, 0x1c, 0x49, 0x24, 0x79, 0x27, 0xd8, 0x46, 0xaa, + 0x6f, 0x29, 0x59, 0x52, 0x88, 0x70, 0x12, 0xea, 0xdd, 0x3d, 0xf5, + 0x9b, 0x53, 0x54, 0x6f, 0xe1, 0x60, 0xa2, 0xa8, 0x09, 0xb9, 0xec, + 0xeb, 0x59, 0x7c, 0xc6, 0x35, 0xf1, 0xdc, 0x18, 0xe9, 0xf1, 0x67, + 0xe5, 0xaf, 0xba, 0x45, 0xe0, 0x09, 0xde, 0xca, 0x44, 0x0f, 0xc2, + 0x17, 0x0e, 0x77, 0x91, 0x45, 0x7a, 0x33, 0x5f, 0x5f, 0x96, 0x2c, + 0x68, 0x8b, 0xc1, 0x47, 0x8f, 0x98, 0x9b, 0x3d, 0xc0, 0xec, 0xcb, + 0xf5, 0xd5, 0x82, 0x92, 0x84, 0x35, 0xd1, 0xbe, 0x36, 0x38, 0x56, + 0x72, 0x31, 0x5b, 0x47, 0x2d, 0xaa, 0x17, 0xa4, 0x63, 0x51, 0xeb, + 0x0a, 0x01, 0xad, 0x7f, 0xec, 0x75, 0x9e, 0xcb, 0xa1, 0x1f, 0xf1, + 0x7f, 0x12, 0xb1, 0xb9, 0xe4, 0x64, 0x7f, 0x67, 0xd6, 0x23, 0x2a, + 0xf4, 0xb8, 0x39, 0x5d, 0x98, 0xe8, 0x21, 0xa7, 0xe1, 0xbd, 0x3d, + 0x42, 0x1a, 0x74, 0x9a, 0x70, 0xaf, 0x68, 0x6c, 0x50, 0x5d, 0x49, + 0xcf, 0xff, 0xfb, 0x0e, 0x5d, 0xe6, 0x2c, 0x47, 0xd7, 0x81, 0x3a, + 0x59, 0x00, 0xb5, 0x73, 0x6b, 0x63, 0x20, 0xf6, 0x31, 0x45, 0x08, + 0x39, 0x0e, 0xf4, 0x70, 0x7e, 0x40, 0x70, 0x5a, 0x3f, 0xd0, 0x6b, + 0x42, 0xa9, 0x74, 0x3d, 0x28, 0x2f, 0x02, 0x6d, 0x75, 0x72, 0x95, + 0x09, 0x8d, 0x48, 0x63, 0xc6, 0xc6, 0x23, 0x57, 0x92, 0x93, 0x5e, + 0x35, 0xc1, 0x8d, 0xf9, 0x0a, 0xf7, 0x2c, 0x9d, 0x62, 0x1c, 0xf6, + 0xad, 0x7c, 0xdd, 0xa6, 0x31, 0x1e, 0xb6, 0xb1, 0xc7, 0x7e, 0x85, + 0x26, 0xfa, 0xa4, 0x6a, 0xb5, 0xda, 0x63, 0x30, 0xd1, 0xef, 0x93, + 0x37, 0xb2, 0x66, 0x2f, 0x7d, 0x05, 0xf7, 0xe7, 0xb7, 0x4b, 0x98, + 0x94, 0x35, 0xc0, 0xd9, 0x3a, 0x29, 0xc1, 0x9d, 0xb2, 0x50, 0x33, + 0x1d, 0x4a, 0xa9, 0x5a, 0xa6, 0xc9, 0x03, 0xef, 0xed, 0xf4, 0xe7, + 0xa8, 0x6e, 0x8a, 0xb4, 0x57, 0x84, 0xeb, 0xa4, 0x3f, 0xd0, 0xee, + 0xaa, 0xaa, 0x87, 0x5b, 0x63, 0xe8, 0x93, 0xe2, 0x6b, 0xa8, 0xd4, + 0xb8, 0x72, 0x78, 0x6b, 0x1b, 0xed, 0x39, 0xe4, 0x5d, 0xcb, 0x9b, + 0xaa, 0x87, 0xd5, 0x4f, 0x4e, 0x00, 0xfe, 0xd9, 0x6a, 0x9f, 0x3c, + 0x31, 0x0f, 0x28, 0x02, 0x01, 0x7d, 0x98, 0xe8, 0xa7, 0xb0, 0xa2, + 0x64, 0x9e, 0x79, 0xf8, 0x48, 0xf2, 0x15, 0xa9, 0xcc, 0xe6, 0xc8, + 0x44, 0xeb, 0x3f, 0x78, 0x99, 0xf2, 0x7b, 0x71, 0x3e, 0x3c, 0xf1, + 0x98, 0xa7, 0xc5, 0x18, 0x12, 0x3f, 0xe6, 0xbb, 0x28, 0x33, 0x42, + 0xe9, 0x45, 0x0a, 0x7c, 0x6d, 0xf2, 0x86, 0x79, 0x2f, 0xc5, 0x82, + 0x19, 0x7d, 0x09, 0x89, 0x7c, 0xb2, 0x54, 0x76, 0x88, 0xae, 0xde, + 0xc1, 0xf3, 0xcc, 0xe1, 0x6e, 0xdb, 0x31, 0xd6, 0x93, 0xae, 0x99, + 0xa0, 0xef, 0x25, 0x6a, 0x73, 0x98, 0x89, 0x5b, 0x3a, 0x2e, 0x13, + 0x88, 0x1e, 0xbf, 0xc0, 0x92, 0x94, 0x34, 0x1b, 0xe3, 0x27, 0xb7, + 0x8b, 0x1e, 0x6f, 0x42, 0xff, 0xe7, 0xe9, 0x37, 0x9b, 0x50, 0x1d, + 0x2d, 0xa2, 0xf9, 0x02, 0xee, 0xcb, 0x58, 0x58, 0x3a, 0x71, 0xbc, + 0x68, 0xe3, 0xaa, 0xc1, 0xaf, 0x1c, 0x28, 0x1f, 0xa2, 0xdc, 0x23, + 0x65, 0x3f, 0x81, 0xea, 0xae, 0x99, 0xd3, 0xd8, 0x30, 0xcf, 0x13, + 0x0d, 0x4f, 0x15, 0xc9, 0x84, 0xbc, 0xa7, 0x48, 0x2d, 0xf8, 0x30, + 0x23, 0x77, 0xd8, 0x46, 0x4b, 0x79, 0x6d, 0xf6, 0x8c, 0xed, 0x3a, + 0x7f, 0x60, 0x11, 0x78, 0xf4, 0xe9, 0x9b, 0xae, 0xd5, 0x54, 0xc0, + 0x74, 0x80, 0xd1, 0x0b, 0x42, 0x9f, 0xc1, 0x30, 0x82, 0x03, 0xc5, + 0x30, 0x82, 0x02, 0xad, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, + 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0x83, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, + 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x41, + 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, + 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, + 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, + 0x55, 0x04, 0x0a, 0x13, 0x11, 0x47, 0x6f, 0x44, 0x61, 0x64, 0x64, + 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, + 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x28, + 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x82, 0x01, 0x22, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, - 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbd, 0xed, 0xc1, 0x03, - 0xfc, 0xf6, 0x8f, 0xfc, 0x02, 0xb1, 0x6f, 0x5b, 0x9f, 0x48, 0xd9, - 0x9d, 0x79, 0xe2, 0xa2, 0xb7, 0x03, 0x61, 0x56, 0x18, 0xc3, 0x47, - 0xb6, 0xd7, 0xca, 0x3d, 0x35, 0x2e, 0x89, 0x43, 0xf7, 0xa1, 0x69, - 0x9b, 0xde, 0x8a, 0x1a, 0xfd, 0x13, 0x20, 0x9c, 0xb4, 0x49, 0x77, - 0x32, 0x29, 0x56, 0xfd, 0xb9, 0xec, 0x8c, 0xdd, 0x22, 0xfa, 0x72, - 0xdc, 0x27, 0x61, 0x97, 0xee, 0xf6, 0x5a, 0x84, 0xec, 0x6e, 0x19, - 0xb9, 0x89, 0x2c, 0xdc, 0x84, 0x5b, 0xd5, 0x74, 0xfb, 0x6b, 0x5f, - 0xc5, 0x89, 0xa5, 0x10, 0x52, 0x89, 0x46, 0x55, 0xf4, 0xb8, 0x75, - 0x1c, 0xe6, 0x7f, 0xe4, 0x54, 0xae, 0x4b, 0xf8, 0x55, 0x72, 0x57, - 0x02, 0x19, 0xf8, 0x17, 0x71, 0x59, 0xeb, 0x1e, 0x28, 0x07, 0x74, - 0xc5, 0x9d, 0x48, 0xbe, 0x6c, 0xb4, 0xf4, 0xa4, 0xb0, 0xf3, 0x64, - 0x37, 0x79, 0x92, 0xc0, 0xec, 0x46, 0x5e, 0x7f, 0xe1, 0x6d, 0x53, - 0x4c, 0x62, 0xaf, 0xcd, 0x1f, 0x0b, 0x63, 0xbb, 0x3a, 0x9d, 0xfb, - 0xfc, 0x79, 0x00, 0x98, 0x61, 0x74, 0xcf, 0x26, 0x82, 0x40, 0x63, - 0xf3, 0xb2, 0x72, 0x6a, 0x19, 0x0d, 0x99, 0xca, 0xd4, 0x0e, 0x75, - 0xcc, 0x37, 0xfb, 0x8b, 0x89, 0xc1, 0x59, 0xf1, 0x62, 0x7f, 0x5f, - 0xb3, 0x5f, 0x65, 0x30, 0xf8, 0xa7, 0xb7, 0x4d, 0x76, 0x5a, 0x1e, - 0x76, 0x5e, 0x34, 0xc0, 0xe8, 0x96, 0x56, 0x99, 0x8a, 0xb3, 0xf0, - 0x7f, 0xa4, 0xcd, 0xbd, 0xdc, 0x32, 0x31, 0x7c, 0x91, 0xcf, 0xe0, - 0x5f, 0x11, 0xf8, 0x6b, 0xaa, 0x49, 0x5c, 0xd1, 0x99, 0x94, 0xd1, - 0xa2, 0xe3, 0x63, 0x5b, 0x09, 0x76, 0xb5, 0x56, 0x62, 0xe1, 0x4b, - 0x74, 0x1d, 0x96, 0xd4, 0x26, 0xd4, 0x08, 0x04, 0x59, 0xd0, 0x98, - 0x0e, 0x0e, 0xe6, 0xde, 0xfc, 0xc3, 0xec, 0x1f, 0x90, 0xf1, 0x02, - 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, - 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, - 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, - 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, - 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x7c, 0x0c, 0x32, - 0x1f, 0xa7, 0xd9, 0x30, 0x7f, 0xc4, 0x7d, 0x68, 0xa3, 0x62, 0xa8, - 0xa1, 0xce, 0xab, 0x07, 0x5b, 0x27, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, - 0x82, 0x01, 0x01, 0x00, 0x11, 0x59, 0xfa, 0x25, 0x4f, 0x03, 0x6f, - 0x94, 0x99, 0x3b, 0x9a, 0x1f, 0x82, 0x85, 0x39, 0xd4, 0x76, 0x05, - 0x94, 0x5e, 0xe1, 0x28, 0x93, 0x6d, 0x62, 0x5d, 0x09, 0xc2, 0xa0, - 0xa8, 0xd4, 0xb0, 0x75, 0x38, 0xf1, 0x34, 0x6a, 0x9d, 0xe4, 0x9f, - 0x8a, 0x86, 0x26, 0x51, 0xe6, 0x2c, 0xd1, 0xc6, 0x2d, 0x6e, 0x95, - 0x20, 0x4a, 0x92, 0x01, 0xec, 0xb8, 0x8a, 0x67, 0x7b, 0x31, 0xe2, - 0x67, 0x2e, 0x8c, 0x95, 0x03, 0x26, 0x2e, 0x43, 0x9d, 0x4a, 0x31, - 0xf6, 0x0e, 0xb5, 0x0c, 0xbb, 0xb7, 0xe2, 0x37, 0x7f, 0x22, 0xba, - 0x00, 0xa3, 0x0e, 0x7b, 0x52, 0xfb, 0x6b, 0xbb, 0x3b, 0xc4, 0xd3, - 0x79, 0x51, 0x4e, 0xcd, 0x90, 0xf4, 0x67, 0x07, 0x19, 0xc8, 0x3c, - 0x46, 0x7a, 0x0d, 0x01, 0x7d, 0xc5, 0x58, 0xe7, 0x6d, 0xe6, 0x85, - 0x30, 0x17, 0x9a, 0x24, 0xc4, 0x10, 0xe0, 0x04, 0xf7, 0xe0, 0xf2, - 0x7f, 0xd4, 0xaa, 0x0a, 0xff, 0x42, 0x1d, 0x37, 0xed, 0x94, 0xe5, - 0x64, 0x59, 0x12, 0x20, 0x77, 0x38, 0xd3, 0x32, 0x3e, 0x38, 0x81, - 0x75, 0x96, 0x73, 0xfa, 0x68, 0x8f, 0xb1, 0xcb, 0xce, 0x1f, 0xc5, - 0xec, 0xfa, 0x9c, 0x7e, 0xcf, 0x7e, 0xb1, 0xf1, 0x07, 0x2d, 0xb6, - 0xfc, 0xbf, 0xca, 0xa4, 0xbf, 0xd0, 0x97, 0x05, 0x4a, 0xbc, 0xea, - 0x18, 0x28, 0x02, 0x90, 0xbd, 0x54, 0x78, 0x09, 0x21, 0x71, 0xd3, - 0xd1, 0x7d, 0x1d, 0xd9, 0x16, 0xb0, 0xa9, 0x61, 0x3d, 0xd0, 0x0a, - 0x00, 0x22, 0xfc, 0xc7, 0x7b, 0xcb, 0x09, 0x64, 0x45, 0x0b, 0x3b, - 0x40, 0x81, 0xf7, 0x7d, 0x7c, 0x32, 0xf5, 0x98, 0xca, 0x58, 0x8e, - 0x7d, 0x2a, 0xee, 0x90, 0x59, 0x73, 0x64, 0xf9, 0x36, 0x74, 0x5e, - 0x25, 0xa1, 0xf5, 0x66, 0x05, 0x2e, 0x7f, 0x39, 0x15, 0xa9, 0x2a, - 0xfb, 0x50, 0x8b, 0x8e, 0x85, 0x69, 0xf4, 0x30, 0x82, 0x03, 0xef, - 0x30, 0x82, 0x02, 0xd7, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, - 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0x98, 0x31, 0x0b, 0x30, - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, - 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x41, - 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, - 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, - 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, - 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, - 0x31, 0x3b, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x32, - 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x52, 0x6f, 0x6f, - 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x30, - 0x39, 0x30, 0x39, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x5a, 0x17, 0x0d, 0x33, 0x37, 0x31, 0x32, 0x33, 0x31, 0x32, 0x33, - 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0x98, 0x31, 0x0b, 0x30, - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, - 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x41, - 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, - 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, - 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, - 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, - 0x31, 0x3b, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x32, - 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x52, 0x6f, 0x6f, - 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, - 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xd5, 0x0c, 0x3a, 0xc4, 0x2a, - 0xf9, 0x4e, 0xe2, 0xf5, 0xbe, 0x19, 0x97, 0x5f, 0x8e, 0x88, 0x53, - 0xb1, 0x1f, 0x3f, 0xcb, 0xcf, 0x9f, 0x20, 0x13, 0x6d, 0x29, 0x3a, - 0xc8, 0x0f, 0x7d, 0x3c, 0xf7, 0x6b, 0x76, 0x38, 0x63, 0xd9, 0x36, - 0x60, 0xa8, 0x9b, 0x5e, 0x5c, 0x00, 0x80, 0xb2, 0x2f, 0x59, 0x7f, - 0xf6, 0x87, 0xf9, 0x25, 0x43, 0x86, 0xe7, 0x69, 0x1b, 0x52, 0x9a, - 0x90, 0xe1, 0x71, 0xe3, 0xd8, 0x2d, 0x0d, 0x4e, 0x6f, 0xf6, 0xc8, - 0x49, 0xd9, 0xb6, 0xf3, 0x1a, 0x56, 0xae, 0x2b, 0xb6, 0x74, 0x14, - 0xeb, 0xcf, 0xfb, 0x26, 0xe3, 0x1a, 0xba, 0x1d, 0x96, 0x2e, 0x6a, - 0x3b, 0x58, 0x94, 0x89, 0x47, 0x56, 0xff, 0x25, 0xa0, 0x93, 0x70, - 0x53, 0x83, 0xda, 0x84, 0x74, 0x14, 0xc3, 0x67, 0x9e, 0x04, 0x68, - 0x3a, 0xdf, 0x8e, 0x40, 0x5a, 0x1d, 0x4a, 0x4e, 0xcf, 0x43, 0x91, - 0x3b, 0xe7, 0x56, 0xd6, 0x00, 0x70, 0xcb, 0x52, 0xee, 0x7b, 0x7d, - 0xae, 0x3a, 0xe7, 0xbc, 0x31, 0xf9, 0x45, 0xf6, 0xc2, 0x60, 0xcf, - 0x13, 0x59, 0x02, 0x2b, 0x80, 0xcc, 0x34, 0x47, 0xdf, 0xb9, 0xde, - 0x90, 0x65, 0x6d, 0x02, 0xcf, 0x2c, 0x91, 0xa6, 0xa6, 0xe7, 0xde, - 0x85, 0x18, 0x49, 0x7c, 0x66, 0x4e, 0xa3, 0x3a, 0x6d, 0xa9, 0xb5, - 0xee, 0x34, 0x2e, 0xba, 0x0d, 0x03, 0xb8, 0x33, 0xdf, 0x47, 0xeb, - 0xb1, 0x6b, 0x8d, 0x25, 0xd9, 0x9b, 0xce, 0x81, 0xd1, 0x45, 0x46, - 0x32, 0x96, 0x70, 0x87, 0xde, 0x02, 0x0e, 0x49, 0x43, 0x85, 0xb6, - 0x6c, 0x73, 0xbb, 0x64, 0xea, 0x61, 0x41, 0xac, 0xc9, 0xd4, 0x54, - 0xdf, 0x87, 0x2f, 0xc7, 0x22, 0xb2, 0x26, 0xcc, 0x9f, 0x59, 0x54, - 0x68, 0x9f, 0xfc, 0xbe, 0x2a, 0x2f, 0xc4, 0x55, 0x1c, 0x75, 0x40, - 0x60, 0x17, 0x85, 0x02, 0x55, 0x39, 0x8b, 0x7f, 0x05, 0x02, 0x03, - 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, - 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, - 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, - 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, - 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9c, 0x5f, 0x00, 0xdf, - 0xaa, 0x01, 0xd7, 0x30, 0x2b, 0x38, 0x88, 0xa2, 0xb8, 0x6d, 0x4a, - 0x9c, 0xf2, 0x11, 0x91, 0x83, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, - 0x01, 0x01, 0x00, 0x4b, 0x36, 0xa6, 0x84, 0x77, 0x69, 0xdd, 0x3b, - 0x19, 0x9f, 0x67, 0x23, 0x08, 0x6f, 0x0e, 0x61, 0xc9, 0xfd, 0x84, - 0xdc, 0x5f, 0xd8, 0x36, 0x81, 0xcd, 0xd8, 0x1b, 0x41, 0x2d, 0x9f, - 0x60, 0xdd, 0xc7, 0x1a, 0x68, 0xd9, 0xd1, 0x6e, 0x86, 0xe1, 0x88, - 0x23, 0xcf, 0x13, 0xde, 0x43, 0xcf, 0xe2, 0x34, 0xb3, 0x04, 0x9d, - 0x1f, 0x29, 0xd5, 0xbf, 0xf8, 0x5e, 0xc8, 0xd5, 0xc1, 0xbd, 0xee, - 0x92, 0x6f, 0x32, 0x74, 0xf2, 0x91, 0x82, 0x2f, 0xbd, 0x82, 0x42, - 0x7a, 0xad, 0x2a, 0xb7, 0x20, 0x7d, 0x4d, 0xbc, 0x7a, 0x55, 0x12, - 0xc2, 0x15, 0xea, 0xbd, 0xf7, 0x6a, 0x95, 0x2e, 0x6c, 0x74, 0x9f, - 0xcf, 0x1c, 0xb4, 0xf2, 0xc5, 0x01, 0xa3, 0x85, 0xd0, 0x72, 0x3e, - 0xad, 0x73, 0xab, 0x0b, 0x9b, 0x75, 0x0c, 0x6d, 0x45, 0xb7, 0x8e, - 0x94, 0xac, 0x96, 0x37, 0xb5, 0xa0, 0xd0, 0x8f, 0x15, 0x47, 0x0e, - 0xe3, 0xe8, 0x83, 0xdd, 0x8f, 0xfd, 0xef, 0x41, 0x01, 0x77, 0xcc, - 0x27, 0xa9, 0x62, 0x85, 0x33, 0xf2, 0x37, 0x08, 0xef, 0x71, 0xcf, - 0x77, 0x06, 0xde, 0xc8, 0x19, 0x1d, 0x88, 0x40, 0xcf, 0x7d, 0x46, - 0x1d, 0xff, 0x1e, 0xc7, 0xe1, 0xce, 0xff, 0x23, 0xdb, 0xc6, 0xfa, - 0x8d, 0x55, 0x4e, 0xa9, 0x02, 0xe7, 0x47, 0x11, 0x46, 0x3e, 0xf4, - 0xfd, 0xbd, 0x7b, 0x29, 0x26, 0xbb, 0xa9, 0x61, 0x62, 0x37, 0x28, - 0xb6, 0x2d, 0x2a, 0xf6, 0x10, 0x86, 0x64, 0xc9, 0x70, 0xa7, 0xd2, - 0xad, 0xb7, 0x29, 0x70, 0x79, 0xea, 0x3c, 0xda, 0x63, 0x25, 0x9f, - 0xfd, 0x68, 0xb7, 0x30, 0xec, 0x70, 0xfb, 0x75, 0x8a, 0xb7, 0x6d, - 0x60, 0x67, 0xb2, 0x1e, 0xc8, 0xb9, 0xe9, 0xd8, 0xa8, 0x6f, 0x02, - 0x8b, 0x67, 0x0d, 0x4d, 0x26, 0x57, 0x71, 0xda, 0x20, 0xfc, 0xc1, - 0x4a, 0x50, 0x8d, 0xb1, 0x28, 0xba, 0x30, 0x82, 0x03, 0x4c, 0x30, - 0x82, 0x02, 0x34, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x77, - 0x77, 0x06, 0x27, 0x26, 0xa9, 0xb1, 0x7c, 0x30, 0x0d, 0x06, 0x09, + 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x1e, 0x17, 0x0d, + 0x30, 0x39, 0x30, 0x39, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x37, 0x31, 0x32, 0x33, 0x31, 0x32, + 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0x83, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, + 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, + 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, + 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, + 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x1a, 0x30, 0x18, 0x06, + 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x47, 0x6f, 0x44, 0x61, 0x64, + 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2c, 0x20, 0x49, 0x6e, 0x63, + 0x2e, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, + 0x28, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x52, + 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x82, 0x01, + 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, + 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbf, 0x71, 0x62, + 0x08, 0xf1, 0xfa, 0x59, 0x34, 0xf7, 0x1b, 0xc9, 0x18, 0xa3, 0xf7, + 0x80, 0x49, 0x58, 0xe9, 0x22, 0x83, 0x13, 0xa6, 0xc5, 0x20, 0x43, + 0x01, 0x3b, 0x84, 0xf1, 0xe6, 0x85, 0x49, 0x9f, 0x27, 0xea, 0xf6, + 0x84, 0x1b, 0x4e, 0xa0, 0xb4, 0xdb, 0x70, 0x98, 0xc7, 0x32, 0x01, + 0xb1, 0x05, 0x3e, 0x07, 0x4e, 0xee, 0xf4, 0xfa, 0x4f, 0x2f, 0x59, + 0x30, 0x22, 0xe7, 0xab, 0x19, 0x56, 0x6b, 0xe2, 0x80, 0x07, 0xfc, + 0xf3, 0x16, 0x75, 0x80, 0x39, 0x51, 0x7b, 0xe5, 0xf9, 0x35, 0xb6, + 0x74, 0x4e, 0xa9, 0x8d, 0x82, 0x13, 0xe4, 0xb6, 0x3f, 0xa9, 0x03, + 0x83, 0xfa, 0xa2, 0xbe, 0x8a, 0x15, 0x6a, 0x7f, 0xde, 0x0b, 0xc3, + 0xb6, 0x19, 0x14, 0x05, 0xca, 0xea, 0xc3, 0xa8, 0x04, 0x94, 0x3b, + 0x46, 0x7c, 0x32, 0x0d, 0xf3, 0x00, 0x66, 0x22, 0xc8, 0x8d, 0x69, + 0x6d, 0x36, 0x8c, 0x11, 0x18, 0xb7, 0xd3, 0xb2, 0x1c, 0x60, 0xb4, + 0x38, 0xfa, 0x02, 0x8c, 0xce, 0xd3, 0xdd, 0x46, 0x07, 0xde, 0x0a, + 0x3e, 0xeb, 0x5d, 0x7c, 0xc8, 0x7c, 0xfb, 0xb0, 0x2b, 0x53, 0xa4, + 0x92, 0x62, 0x69, 0x51, 0x25, 0x05, 0x61, 0x1a, 0x44, 0x81, 0x8c, + 0x2c, 0xa9, 0x43, 0x96, 0x23, 0xdf, 0xac, 0x3a, 0x81, 0x9a, 0x0e, + 0x29, 0xc5, 0x1c, 0xa9, 0xe9, 0x5d, 0x1e, 0xb6, 0x9e, 0x9e, 0x30, + 0x0a, 0x39, 0xce, 0xf1, 0x88, 0x80, 0xfb, 0x4b, 0x5d, 0xcc, 0x32, + 0xec, 0x85, 0x62, 0x43, 0x25, 0x34, 0x02, 0x56, 0x27, 0x01, 0x91, + 0xb4, 0x3b, 0x70, 0x2a, 0x3f, 0x6e, 0xb1, 0xe8, 0x9c, 0x88, 0x01, + 0x7d, 0x9f, 0xd4, 0xf9, 0xdb, 0x53, 0x6d, 0x60, 0x9d, 0xbf, 0x2c, + 0xe7, 0x58, 0xab, 0xb8, 0x5f, 0x46, 0xfc, 0xce, 0xc4, 0x1b, 0x03, + 0x3c, 0x09, 0xeb, 0x49, 0x31, 0x5c, 0x69, 0x46, 0xb3, 0xe0, 0x47, + 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, + 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, + 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, + 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x3a, 0x9a, + 0x85, 0x07, 0x10, 0x67, 0x28, 0xb6, 0xef, 0xf6, 0xbd, 0x05, 0x41, + 0x6e, 0x20, 0xc1, 0x94, 0xda, 0x0f, 0xde, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, - 0x30, 0x44, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x55, 0x53, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x0c, 0x0b, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, - 0x72, 0x75, 0x73, 0x74, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, - 0x04, 0x03, 0x0c, 0x16, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, - 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x72, - 0x63, 0x69, 0x61, 0x6c, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, 0x30, - 0x31, 0x32, 0x39, 0x31, 0x34, 0x30, 0x36, 0x30, 0x36, 0x5a, 0x17, - 0x0d, 0x33, 0x30, 0x31, 0x32, 0x33, 0x31, 0x31, 0x34, 0x30, 0x36, - 0x30, 0x36, 0x5a, 0x30, 0x44, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, - 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x14, 0x30, 0x12, - 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x41, 0x66, 0x66, 0x69, - 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x1f, 0x30, 0x1d, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x41, 0x66, 0x66, 0x69, - 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f, 0x6d, - 0x6d, 0x65, 0x72, 0x63, 0x69, 0x61, 0x6c, 0x30, 0x82, 0x01, 0x22, + 0x03, 0x82, 0x01, 0x01, 0x00, 0x99, 0xdb, 0x5d, 0x79, 0xd5, 0xf9, + 0x97, 0x59, 0x67, 0x03, 0x61, 0xf1, 0x7e, 0x3b, 0x06, 0x31, 0x75, + 0x2d, 0xa1, 0x20, 0x8e, 0x4f, 0x65, 0x87, 0xb4, 0xf7, 0xa6, 0x9c, + 0xbc, 0xd8, 0xe9, 0x2f, 0xd0, 0xdb, 0x5a, 0xee, 0xcf, 0x74, 0x8c, + 0x73, 0xb4, 0x38, 0x42, 0xda, 0x05, 0x7b, 0xf8, 0x02, 0x75, 0xb8, + 0xfd, 0xa5, 0xb1, 0xd7, 0xae, 0xf6, 0xd7, 0xde, 0x13, 0xcb, 0x53, + 0x10, 0x7e, 0x8a, 0x46, 0xd1, 0x97, 0xfa, 0xb7, 0x2e, 0x2b, 0x11, + 0xab, 0x90, 0xb0, 0x27, 0x80, 0xf9, 0xe8, 0x9f, 0x5a, 0xe9, 0x37, + 0x9f, 0xab, 0xe4, 0xdf, 0x6c, 0xb3, 0x85, 0x17, 0x9d, 0x3d, 0xd9, + 0x24, 0x4f, 0x79, 0x91, 0x35, 0xd6, 0x5f, 0x04, 0xeb, 0x80, 0x83, + 0xab, 0x9a, 0x02, 0x2d, 0xb5, 0x10, 0xf4, 0xd8, 0x90, 0xc7, 0x04, + 0x73, 0x40, 0xed, 0x72, 0x25, 0xa0, 0xa9, 0x9f, 0xec, 0x9e, 0xab, + 0x68, 0x12, 0x99, 0x57, 0xc6, 0x8f, 0x12, 0x3a, 0x09, 0xa4, 0xbd, + 0x44, 0xfd, 0x06, 0x15, 0x37, 0xc1, 0x9b, 0xe4, 0x32, 0xa3, 0xed, + 0x38, 0xe8, 0xd8, 0x64, 0xf3, 0x2c, 0x7e, 0x14, 0xfc, 0x02, 0xea, + 0x9f, 0xcd, 0xff, 0x07, 0x68, 0x17, 0xdb, 0x22, 0x90, 0x38, 0x2d, + 0x7a, 0x8d, 0xd1, 0x54, 0xf1, 0x69, 0xe3, 0x5f, 0x33, 0xca, 0x7a, + 0x3d, 0x7b, 0x0a, 0xe3, 0xca, 0x7f, 0x5f, 0x39, 0xe5, 0xe2, 0x75, + 0xba, 0xc5, 0x76, 0x18, 0x33, 0xce, 0x2c, 0xf0, 0x2f, 0x4c, 0xad, + 0xf7, 0xb1, 0xe7, 0xce, 0x4f, 0xa8, 0xc4, 0x9b, 0x4a, 0x54, 0x06, + 0xc5, 0x7f, 0x7d, 0xd5, 0x08, 0x0f, 0xe2, 0x1c, 0xfe, 0x7e, 0x17, + 0xb8, 0xac, 0x5e, 0xf6, 0xd4, 0x16, 0xb2, 0x43, 0x09, 0x0c, 0x4d, + 0xf6, 0xa7, 0x6b, 0xb4, 0x99, 0x84, 0x65, 0xca, 0x7a, 0x88, 0xe2, + 0xe2, 0x44, 0xbe, 0x5c, 0xf7, 0xea, 0x1c, 0xf5, 0x30, 0x82, 0x03, + 0xdd, 0x30, 0x82, 0x02, 0xc5, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, + 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0x8f, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, + 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, + 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, + 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, + 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x25, 0x30, 0x23, 0x06, + 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, + 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, + 0x2e, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, + 0x29, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, + 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x1e, + 0x17, 0x0d, 0x30, 0x39, 0x30, 0x39, 0x30, 0x31, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x37, 0x31, 0x32, 0x33, + 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0x8f, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, + 0x13, 0x07, 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, + 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, 0x63, + 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x25, 0x30, + 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, + 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x54, 0x65, 0x63, 0x68, + 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49, + 0x6e, 0x63, 0x2e, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x29, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, + 0xbd, 0xed, 0xc1, 0x03, 0xfc, 0xf6, 0x8f, 0xfc, 0x02, 0xb1, 0x6f, + 0x5b, 0x9f, 0x48, 0xd9, 0x9d, 0x79, 0xe2, 0xa2, 0xb7, 0x03, 0x61, + 0x56, 0x18, 0xc3, 0x47, 0xb6, 0xd7, 0xca, 0x3d, 0x35, 0x2e, 0x89, + 0x43, 0xf7, 0xa1, 0x69, 0x9b, 0xde, 0x8a, 0x1a, 0xfd, 0x13, 0x20, + 0x9c, 0xb4, 0x49, 0x77, 0x32, 0x29, 0x56, 0xfd, 0xb9, 0xec, 0x8c, + 0xdd, 0x22, 0xfa, 0x72, 0xdc, 0x27, 0x61, 0x97, 0xee, 0xf6, 0x5a, + 0x84, 0xec, 0x6e, 0x19, 0xb9, 0x89, 0x2c, 0xdc, 0x84, 0x5b, 0xd5, + 0x74, 0xfb, 0x6b, 0x5f, 0xc5, 0x89, 0xa5, 0x10, 0x52, 0x89, 0x46, + 0x55, 0xf4, 0xb8, 0x75, 0x1c, 0xe6, 0x7f, 0xe4, 0x54, 0xae, 0x4b, + 0xf8, 0x55, 0x72, 0x57, 0x02, 0x19, 0xf8, 0x17, 0x71, 0x59, 0xeb, + 0x1e, 0x28, 0x07, 0x74, 0xc5, 0x9d, 0x48, 0xbe, 0x6c, 0xb4, 0xf4, + 0xa4, 0xb0, 0xf3, 0x64, 0x37, 0x79, 0x92, 0xc0, 0xec, 0x46, 0x5e, + 0x7f, 0xe1, 0x6d, 0x53, 0x4c, 0x62, 0xaf, 0xcd, 0x1f, 0x0b, 0x63, + 0xbb, 0x3a, 0x9d, 0xfb, 0xfc, 0x79, 0x00, 0x98, 0x61, 0x74, 0xcf, + 0x26, 0x82, 0x40, 0x63, 0xf3, 0xb2, 0x72, 0x6a, 0x19, 0x0d, 0x99, + 0xca, 0xd4, 0x0e, 0x75, 0xcc, 0x37, 0xfb, 0x8b, 0x89, 0xc1, 0x59, + 0xf1, 0x62, 0x7f, 0x5f, 0xb3, 0x5f, 0x65, 0x30, 0xf8, 0xa7, 0xb7, + 0x4d, 0x76, 0x5a, 0x1e, 0x76, 0x5e, 0x34, 0xc0, 0xe8, 0x96, 0x56, + 0x99, 0x8a, 0xb3, 0xf0, 0x7f, 0xa4, 0xcd, 0xbd, 0xdc, 0x32, 0x31, + 0x7c, 0x91, 0xcf, 0xe0, 0x5f, 0x11, 0xf8, 0x6b, 0xaa, 0x49, 0x5c, + 0xd1, 0x99, 0x94, 0xd1, 0xa2, 0xe3, 0x63, 0x5b, 0x09, 0x76, 0xb5, + 0x56, 0x62, 0xe1, 0x4b, 0x74, 0x1d, 0x96, 0xd4, 0x26, 0xd4, 0x08, + 0x04, 0x59, 0xd0, 0x98, 0x0e, 0x0e, 0xe6, 0xde, 0xfc, 0xc3, 0xec, + 0x1f, 0x90, 0xf1, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, + 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, + 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, + 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, + 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, + 0x14, 0x7c, 0x0c, 0x32, 0x1f, 0xa7, 0xd9, 0x30, 0x7f, 0xc4, 0x7d, + 0x68, 0xa3, 0x62, 0xa8, 0xa1, 0xce, 0xab, 0x07, 0x5b, 0x27, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x11, 0x59, 0xfa, + 0x25, 0x4f, 0x03, 0x6f, 0x94, 0x99, 0x3b, 0x9a, 0x1f, 0x82, 0x85, + 0x39, 0xd4, 0x76, 0x05, 0x94, 0x5e, 0xe1, 0x28, 0x93, 0x6d, 0x62, + 0x5d, 0x09, 0xc2, 0xa0, 0xa8, 0xd4, 0xb0, 0x75, 0x38, 0xf1, 0x34, + 0x6a, 0x9d, 0xe4, 0x9f, 0x8a, 0x86, 0x26, 0x51, 0xe6, 0x2c, 0xd1, + 0xc6, 0x2d, 0x6e, 0x95, 0x20, 0x4a, 0x92, 0x01, 0xec, 0xb8, 0x8a, + 0x67, 0x7b, 0x31, 0xe2, 0x67, 0x2e, 0x8c, 0x95, 0x03, 0x26, 0x2e, + 0x43, 0x9d, 0x4a, 0x31, 0xf6, 0x0e, 0xb5, 0x0c, 0xbb, 0xb7, 0xe2, + 0x37, 0x7f, 0x22, 0xba, 0x00, 0xa3, 0x0e, 0x7b, 0x52, 0xfb, 0x6b, + 0xbb, 0x3b, 0xc4, 0xd3, 0x79, 0x51, 0x4e, 0xcd, 0x90, 0xf4, 0x67, + 0x07, 0x19, 0xc8, 0x3c, 0x46, 0x7a, 0x0d, 0x01, 0x7d, 0xc5, 0x58, + 0xe7, 0x6d, 0xe6, 0x85, 0x30, 0x17, 0x9a, 0x24, 0xc4, 0x10, 0xe0, + 0x04, 0xf7, 0xe0, 0xf2, 0x7f, 0xd4, 0xaa, 0x0a, 0xff, 0x42, 0x1d, + 0x37, 0xed, 0x94, 0xe5, 0x64, 0x59, 0x12, 0x20, 0x77, 0x38, 0xd3, + 0x32, 0x3e, 0x38, 0x81, 0x75, 0x96, 0x73, 0xfa, 0x68, 0x8f, 0xb1, + 0xcb, 0xce, 0x1f, 0xc5, 0xec, 0xfa, 0x9c, 0x7e, 0xcf, 0x7e, 0xb1, + 0xf1, 0x07, 0x2d, 0xb6, 0xfc, 0xbf, 0xca, 0xa4, 0xbf, 0xd0, 0x97, + 0x05, 0x4a, 0xbc, 0xea, 0x18, 0x28, 0x02, 0x90, 0xbd, 0x54, 0x78, + 0x09, 0x21, 0x71, 0xd3, 0xd1, 0x7d, 0x1d, 0xd9, 0x16, 0xb0, 0xa9, + 0x61, 0x3d, 0xd0, 0x0a, 0x00, 0x22, 0xfc, 0xc7, 0x7b, 0xcb, 0x09, + 0x64, 0x45, 0x0b, 0x3b, 0x40, 0x81, 0xf7, 0x7d, 0x7c, 0x32, 0xf5, + 0x98, 0xca, 0x58, 0x8e, 0x7d, 0x2a, 0xee, 0x90, 0x59, 0x73, 0x64, + 0xf9, 0x36, 0x74, 0x5e, 0x25, 0xa1, 0xf5, 0x66, 0x05, 0x2e, 0x7f, + 0x39, 0x15, 0xa9, 0x2a, 0xfb, 0x50, 0x8b, 0x8e, 0x85, 0x69, 0xf4, + 0x30, 0x82, 0x03, 0xef, 0x30, 0x82, 0x02, 0xd7, 0xa0, 0x03, 0x02, + 0x01, 0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, + 0x98, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, + 0x08, 0x13, 0x07, 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, + 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, + 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x25, + 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, + 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x54, 0x65, 0x63, + 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, + 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x3b, 0x30, 0x39, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x32, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, + 0x1e, 0x17, 0x0d, 0x30, 0x39, 0x30, 0x39, 0x30, 0x31, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x37, 0x31, 0x32, + 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, + 0x98, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, + 0x08, 0x13, 0x07, 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, + 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, + 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x25, + 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, + 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x54, 0x65, 0x63, + 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, + 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x3b, 0x30, 0x39, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x32, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, + 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, + 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xd5, + 0x0c, 0x3a, 0xc4, 0x2a, 0xf9, 0x4e, 0xe2, 0xf5, 0xbe, 0x19, 0x97, + 0x5f, 0x8e, 0x88, 0x53, 0xb1, 0x1f, 0x3f, 0xcb, 0xcf, 0x9f, 0x20, + 0x13, 0x6d, 0x29, 0x3a, 0xc8, 0x0f, 0x7d, 0x3c, 0xf7, 0x6b, 0x76, + 0x38, 0x63, 0xd9, 0x36, 0x60, 0xa8, 0x9b, 0x5e, 0x5c, 0x00, 0x80, + 0xb2, 0x2f, 0x59, 0x7f, 0xf6, 0x87, 0xf9, 0x25, 0x43, 0x86, 0xe7, + 0x69, 0x1b, 0x52, 0x9a, 0x90, 0xe1, 0x71, 0xe3, 0xd8, 0x2d, 0x0d, + 0x4e, 0x6f, 0xf6, 0xc8, 0x49, 0xd9, 0xb6, 0xf3, 0x1a, 0x56, 0xae, + 0x2b, 0xb6, 0x74, 0x14, 0xeb, 0xcf, 0xfb, 0x26, 0xe3, 0x1a, 0xba, + 0x1d, 0x96, 0x2e, 0x6a, 0x3b, 0x58, 0x94, 0x89, 0x47, 0x56, 0xff, + 0x25, 0xa0, 0x93, 0x70, 0x53, 0x83, 0xda, 0x84, 0x74, 0x14, 0xc3, + 0x67, 0x9e, 0x04, 0x68, 0x3a, 0xdf, 0x8e, 0x40, 0x5a, 0x1d, 0x4a, + 0x4e, 0xcf, 0x43, 0x91, 0x3b, 0xe7, 0x56, 0xd6, 0x00, 0x70, 0xcb, + 0x52, 0xee, 0x7b, 0x7d, 0xae, 0x3a, 0xe7, 0xbc, 0x31, 0xf9, 0x45, + 0xf6, 0xc2, 0x60, 0xcf, 0x13, 0x59, 0x02, 0x2b, 0x80, 0xcc, 0x34, + 0x47, 0xdf, 0xb9, 0xde, 0x90, 0x65, 0x6d, 0x02, 0xcf, 0x2c, 0x91, + 0xa6, 0xa6, 0xe7, 0xde, 0x85, 0x18, 0x49, 0x7c, 0x66, 0x4e, 0xa3, + 0x3a, 0x6d, 0xa9, 0xb5, 0xee, 0x34, 0x2e, 0xba, 0x0d, 0x03, 0xb8, + 0x33, 0xdf, 0x47, 0xeb, 0xb1, 0x6b, 0x8d, 0x25, 0xd9, 0x9b, 0xce, + 0x81, 0xd1, 0x45, 0x46, 0x32, 0x96, 0x70, 0x87, 0xde, 0x02, 0x0e, + 0x49, 0x43, 0x85, 0xb6, 0x6c, 0x73, 0xbb, 0x64, 0xea, 0x61, 0x41, + 0xac, 0xc9, 0xd4, 0x54, 0xdf, 0x87, 0x2f, 0xc7, 0x22, 0xb2, 0x26, + 0xcc, 0x9f, 0x59, 0x54, 0x68, 0x9f, 0xfc, 0xbe, 0x2a, 0x2f, 0xc4, + 0x55, 0x1c, 0x75, 0x40, 0x60, 0x17, 0x85, 0x02, 0x55, 0x39, 0x8b, + 0x7f, 0x05, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, + 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0x9c, 0x5f, 0x00, 0xdf, 0xaa, 0x01, 0xd7, 0x30, 0x2b, 0x38, 0x88, + 0xa2, 0xb8, 0x6d, 0x4a, 0x9c, 0xf2, 0x11, 0x91, 0x83, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x4b, 0x36, 0xa6, 0x84, + 0x77, 0x69, 0xdd, 0x3b, 0x19, 0x9f, 0x67, 0x23, 0x08, 0x6f, 0x0e, + 0x61, 0xc9, 0xfd, 0x84, 0xdc, 0x5f, 0xd8, 0x36, 0x81, 0xcd, 0xd8, + 0x1b, 0x41, 0x2d, 0x9f, 0x60, 0xdd, 0xc7, 0x1a, 0x68, 0xd9, 0xd1, + 0x6e, 0x86, 0xe1, 0x88, 0x23, 0xcf, 0x13, 0xde, 0x43, 0xcf, 0xe2, + 0x34, 0xb3, 0x04, 0x9d, 0x1f, 0x29, 0xd5, 0xbf, 0xf8, 0x5e, 0xc8, + 0xd5, 0xc1, 0xbd, 0xee, 0x92, 0x6f, 0x32, 0x74, 0xf2, 0x91, 0x82, + 0x2f, 0xbd, 0x82, 0x42, 0x7a, 0xad, 0x2a, 0xb7, 0x20, 0x7d, 0x4d, + 0xbc, 0x7a, 0x55, 0x12, 0xc2, 0x15, 0xea, 0xbd, 0xf7, 0x6a, 0x95, + 0x2e, 0x6c, 0x74, 0x9f, 0xcf, 0x1c, 0xb4, 0xf2, 0xc5, 0x01, 0xa3, + 0x85, 0xd0, 0x72, 0x3e, 0xad, 0x73, 0xab, 0x0b, 0x9b, 0x75, 0x0c, + 0x6d, 0x45, 0xb7, 0x8e, 0x94, 0xac, 0x96, 0x37, 0xb5, 0xa0, 0xd0, + 0x8f, 0x15, 0x47, 0x0e, 0xe3, 0xe8, 0x83, 0xdd, 0x8f, 0xfd, 0xef, + 0x41, 0x01, 0x77, 0xcc, 0x27, 0xa9, 0x62, 0x85, 0x33, 0xf2, 0x37, + 0x08, 0xef, 0x71, 0xcf, 0x77, 0x06, 0xde, 0xc8, 0x19, 0x1d, 0x88, + 0x40, 0xcf, 0x7d, 0x46, 0x1d, 0xff, 0x1e, 0xc7, 0xe1, 0xce, 0xff, + 0x23, 0xdb, 0xc6, 0xfa, 0x8d, 0x55, 0x4e, 0xa9, 0x02, 0xe7, 0x47, + 0x11, 0x46, 0x3e, 0xf4, 0xfd, 0xbd, 0x7b, 0x29, 0x26, 0xbb, 0xa9, + 0x61, 0x62, 0x37, 0x28, 0xb6, 0x2d, 0x2a, 0xf6, 0x10, 0x86, 0x64, + 0xc9, 0x70, 0xa7, 0xd2, 0xad, 0xb7, 0x29, 0x70, 0x79, 0xea, 0x3c, + 0xda, 0x63, 0x25, 0x9f, 0xfd, 0x68, 0xb7, 0x30, 0xec, 0x70, 0xfb, + 0x75, 0x8a, 0xb7, 0x6d, 0x60, 0x67, 0xb2, 0x1e, 0xc8, 0xb9, 0xe9, + 0xd8, 0xa8, 0x6f, 0x02, 0x8b, 0x67, 0x0d, 0x4d, 0x26, 0x57, 0x71, + 0xda, 0x20, 0xfc, 0xc1, 0x4a, 0x50, 0x8d, 0xb1, 0x28, 0xba, 0x30, + 0x82, 0x03, 0x4c, 0x30, 0x82, 0x02, 0x34, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x08, 0x77, 0x77, 0x06, 0x27, 0x26, 0xa9, 0xb1, 0x7c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, - 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xf6, 0x1b, 0x4f, 0x67, - 0x07, 0x2b, 0xa1, 0x15, 0xf5, 0x06, 0x22, 0xcb, 0x1f, 0x01, 0xb2, - 0xe3, 0x73, 0x45, 0x06, 0x44, 0x49, 0x2c, 0xbb, 0x49, 0x25, 0x14, - 0xd6, 0xce, 0xc3, 0xb7, 0xab, 0x2c, 0x4f, 0xc6, 0x41, 0x32, 0x94, - 0x57, 0xfa, 0x12, 0xa7, 0x5b, 0x0e, 0xe2, 0x8f, 0x1f, 0x1e, 0x86, - 0x19, 0xa7, 0xaa, 0xb5, 0x2d, 0xb9, 0x5f, 0x0d, 0x8a, 0xc2, 0xaf, - 0x85, 0x35, 0x79, 0x32, 0x2d, 0xbb, 0x1c, 0x62, 0x37, 0xf2, 0xb1, - 0x5b, 0x4a, 0x3d, 0xca, 0xcd, 0x71, 0x5f, 0xe9, 0x42, 0xbe, 0x94, - 0xe8, 0xc8, 0xde, 0xf9, 0x22, 0x48, 0x64, 0xc6, 0xe5, 0xab, 0xc6, - 0x2b, 0x6d, 0xad, 0x05, 0xf0, 0xfa, 0xd5, 0x0b, 0xcf, 0x9a, 0xe5, - 0xf0, 0x50, 0xa4, 0x8b, 0x3b, 0x47, 0xa5, 0x23, 0x5b, 0x7a, 0x7a, - 0xf8, 0x33, 0x3f, 0xb8, 0xef, 0x99, 0x97, 0xe3, 0x20, 0xc1, 0xd6, - 0x28, 0x89, 0xcf, 0x94, 0xfb, 0xb9, 0x45, 0xed, 0xe3, 0x40, 0x17, - 0x11, 0xd4, 0x74, 0xf0, 0x0b, 0x31, 0xe2, 0x2b, 0x26, 0x6a, 0x9b, - 0x4c, 0x57, 0xae, 0xac, 0x20, 0x3e, 0xba, 0x45, 0x7a, 0x05, 0xf3, - 0xbd, 0x9b, 0x69, 0x15, 0xae, 0x7d, 0x4e, 0x20, 0x63, 0xc4, 0x35, - 0x76, 0x3a, 0x07, 0x02, 0xc9, 0x37, 0xfd, 0xc7, 0x47, 0xee, 0xe8, - 0xf1, 0x76, 0x1d, 0x73, 0x15, 0xf2, 0x97, 0xa4, 0xb5, 0xc8, 0x7a, - 0x79, 0xd9, 0x42, 0xaa, 0x2b, 0x7f, 0x5c, 0xfe, 0xce, 0x26, 0x4f, - 0xa3, 0x66, 0x81, 0x35, 0xaf, 0x44, 0xba, 0x54, 0x1e, 0x1c, 0x30, - 0x32, 0x65, 0x9d, 0xe6, 0x3c, 0x93, 0x5e, 0x50, 0x4e, 0x7a, 0xe3, - 0x3a, 0xd4, 0x6e, 0xcc, 0x1a, 0xfb, 0xf9, 0xd2, 0x37, 0xae, 0x24, - 0x2a, 0xab, 0x57, 0x03, 0x22, 0x28, 0x0d, 0x49, 0x75, 0x7f, 0xb7, - 0x28, 0xda, 0x75, 0xbf, 0x8e, 0xe3, 0xdc, 0x0e, 0x79, 0x31, 0x02, - 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, - 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9d, 0x93, 0xc6, - 0x53, 0x8b, 0x5e, 0xca, 0xaf, 0x3f, 0x9f, 0x1e, 0x0f, 0xe5, 0x99, - 0x95, 0xbc, 0x24, 0xf6, 0x94, 0x8f, 0x30, 0x0f, 0x06, 0x03, 0x55, - 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, - 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, - 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, - 0x82, 0x01, 0x01, 0x00, 0x58, 0xac, 0xf4, 0x04, 0x0e, 0xcd, 0xc0, - 0x0d, 0xff, 0x0a, 0xfd, 0xd4, 0xba, 0x16, 0x5f, 0x29, 0xbd, 0x7b, - 0x68, 0x99, 0x58, 0x49, 0xd2, 0xb4, 0x1d, 0x37, 0x4d, 0x7f, 0x27, - 0x7d, 0x46, 0x06, 0x5d, 0x43, 0xc6, 0x86, 0x2e, 0x3e, 0x73, 0xb2, - 0x26, 0x7d, 0x4f, 0x93, 0xa9, 0xb6, 0xc4, 0x2a, 0x9a, 0xab, 0x21, - 0x97, 0x14, 0xb1, 0xde, 0x8c, 0xd3, 0xab, 0x89, 0x15, 0xd8, 0x6b, - 0x24, 0xd4, 0xf1, 0x16, 0xae, 0xd8, 0xa4, 0x5c, 0xd4, 0x7f, 0x51, - 0x8e, 0xed, 0x18, 0x01, 0xb1, 0x93, 0x63, 0xbd, 0xbc, 0xf8, 0x61, - 0x80, 0x9a, 0x9e, 0xb1, 0xce, 0x42, 0x70, 0xe2, 0xa9, 0x7d, 0x06, - 0x25, 0x7d, 0x27, 0xa1, 0xfe, 0x6f, 0xec, 0xb3, 0x1e, 0x24, 0xda, - 0xe3, 0x4b, 0x55, 0x1a, 0x00, 0x3b, 0x35, 0xb4, 0x3b, 0xd9, 0xd7, - 0x5d, 0x30, 0xfd, 0x81, 0x13, 0x89, 0xf2, 0xc2, 0x06, 0x2b, 0xed, - 0x67, 0xc4, 0x8e, 0xc9, 0x43, 0xb2, 0x5c, 0x6b, 0x15, 0x89, 0x02, - 0xbc, 0x62, 0xfc, 0x4e, 0xf2, 0xb5, 0x33, 0xaa, 0xb2, 0x6f, 0xd3, - 0x0a, 0xa2, 0x50, 0xe3, 0xf6, 0x3b, 0xe8, 0x2e, 0x44, 0xc2, 0xdb, - 0x66, 0x38, 0xa9, 0x33, 0x56, 0x48, 0xf1, 0x6d, 0x1b, 0x33, 0x8d, - 0x0d, 0x8c, 0x3f, 0x60, 0x37, 0x9d, 0xd3, 0xca, 0x6d, 0x7e, 0x34, - 0x7e, 0x0d, 0x9f, 0x72, 0x76, 0x8b, 0x1b, 0x9f, 0x72, 0xfd, 0x52, - 0x35, 0x41, 0x45, 0x02, 0x96, 0x2f, 0x1c, 0xb2, 0x9a, 0x73, 0x49, - 0x21, 0xb1, 0x49, 0x47, 0x45, 0x47, 0xb4, 0xef, 0x6a, 0x34, 0x11, - 0xc9, 0x4d, 0x9a, 0xcc, 0x59, 0xb7, 0xd6, 0x02, 0x9e, 0x5a, 0x4e, - 0x65, 0xb5, 0x94, 0xae, 0x1b, 0xdf, 0x29, 0xb0, 0x16, 0xf1, 0xbf, - 0x00, 0x9e, 0x07, 0x3a, 0x17, 0x64, 0xb5, 0x04, 0xb5, 0x23, 0x21, - 0x99, 0x0a, 0x95, 0x3b, 0x97, 0x7c, 0xef, 0x30, 0x82, 0x03, 0x4c, - 0x30, 0x82, 0x02, 0x34, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, - 0x7c, 0x4f, 0x04, 0x39, 0x1c, 0xd4, 0x99, 0x2d, 0x30, 0x0d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, - 0x00, 0x30, 0x44, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, - 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x0c, 0x16, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, - 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, - 0x30, 0x31, 0x32, 0x39, 0x31, 0x34, 0x30, 0x38, 0x32, 0x34, 0x5a, - 0x17, 0x0d, 0x33, 0x30, 0x31, 0x32, 0x33, 0x31, 0x31, 0x34, 0x30, - 0x38, 0x32, 0x34, 0x5a, 0x30, 0x44, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x01, 0x0b, 0x05, 0x00, 0x30, 0x44, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x41, 0x66, 0x66, - 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x30, 0x82, 0x01, - 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, - 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb4, 0x84, 0xcc, - 0x33, 0x17, 0x2e, 0x6b, 0x94, 0x6c, 0x6b, 0x61, 0x52, 0xa0, 0xeb, - 0xa3, 0xcf, 0x79, 0x94, 0x4c, 0xe5, 0x94, 0x80, 0x99, 0xcb, 0x55, - 0x64, 0x44, 0x65, 0x8f, 0x67, 0x64, 0xe2, 0x06, 0xe3, 0x5c, 0x37, - 0x49, 0xf6, 0x2f, 0x9b, 0x84, 0x84, 0x1e, 0x2d, 0xf2, 0x60, 0x9d, - 0x30, 0x4e, 0xcc, 0x84, 0x85, 0xe2, 0x2c, 0xcf, 0x1e, 0x9e, 0xfe, - 0x36, 0xab, 0x33, 0x77, 0x35, 0x44, 0xd8, 0x35, 0x96, 0x1a, 0x3d, - 0x36, 0xe8, 0x7a, 0x0e, 0xd8, 0xd5, 0x47, 0xa1, 0x6a, 0x69, 0x8b, - 0xd9, 0xfc, 0xbb, 0x3a, 0xae, 0x79, 0x5a, 0xd5, 0xf4, 0xd6, 0x71, - 0xbb, 0x9a, 0x90, 0x23, 0x6b, 0x9a, 0xb7, 0x88, 0x74, 0x87, 0x0c, - 0x1e, 0x5f, 0xb9, 0x9e, 0x2d, 0xfa, 0xab, 0x53, 0x2b, 0xdc, 0xbb, - 0x76, 0x3e, 0x93, 0x4c, 0x08, 0x08, 0x8c, 0x1e, 0xa2, 0x23, 0x1c, - 0xd4, 0x6a, 0xad, 0x22, 0xba, 0x99, 0x01, 0x2e, 0x6d, 0x65, 0xcb, - 0xbe, 0x24, 0x66, 0x55, 0x24, 0x4b, 0x40, 0x44, 0xb1, 0x1b, 0xd7, - 0xe1, 0xc2, 0x85, 0xc0, 0xde, 0x10, 0x3f, 0x3d, 0xed, 0xb8, 0xfc, - 0xf1, 0xf1, 0x23, 0x53, 0xdc, 0xbf, 0x65, 0x97, 0x6f, 0xd9, 0xf9, - 0x40, 0x71, 0x8d, 0x7d, 0xbd, 0x95, 0xd4, 0xce, 0xbe, 0xa0, 0x5e, - 0x27, 0x23, 0xde, 0xfd, 0xa6, 0xd0, 0x26, 0x0e, 0x00, 0x29, 0xeb, - 0x3c, 0x46, 0xf0, 0x3d, 0x60, 0xbf, 0x3f, 0x50, 0xd2, 0xdc, 0x26, - 0x41, 0x51, 0x9e, 0x14, 0x37, 0x42, 0x04, 0xa3, 0x70, 0x57, 0xa8, - 0x1b, 0x87, 0xed, 0x2d, 0xfa, 0x7b, 0xee, 0x8c, 0x0a, 0xe3, 0xa9, - 0x66, 0x89, 0x19, 0xcb, 0x41, 0xf9, 0xdd, 0x44, 0x36, 0x61, 0xcf, - 0xe2, 0x77, 0x46, 0xc8, 0x7d, 0xf6, 0xf4, 0x92, 0x81, 0x36, 0xfd, - 0xdb, 0x34, 0xf1, 0x72, 0x7e, 0xf3, 0x0c, 0x16, 0xbd, 0xb4, 0x15, - 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, - 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x07, 0x1f, - 0xd2, 0xe7, 0x9c, 0xda, 0xc2, 0x6e, 0xa2, 0x40, 0xb4, 0xb0, 0x7a, - 0x50, 0x10, 0x50, 0x74, 0xc4, 0xc8, 0xbd, 0x30, 0x0f, 0x06, 0x03, - 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, - 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, - 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, - 0x03, 0x82, 0x01, 0x01, 0x00, 0x89, 0x57, 0xb2, 0x16, 0x7a, 0xa8, - 0xc2, 0xfd, 0xd6, 0xd9, 0x9b, 0x9b, 0x34, 0xc2, 0x9c, 0xb4, 0x32, - 0x14, 0x4d, 0xa7, 0xa4, 0xdf, 0xec, 0xbe, 0xa7, 0xbe, 0xf8, 0x43, - 0xdb, 0x91, 0x37, 0xce, 0xb4, 0x32, 0x2e, 0x50, 0x55, 0x1a, 0x35, - 0x4e, 0x76, 0x43, 0x71, 0x20, 0xef, 0x93, 0x77, 0x4e, 0x15, 0x70, - 0x2e, 0x87, 0xc3, 0xc1, 0x1d, 0x6d, 0xdc, 0xcb, 0xb5, 0x27, 0xd4, - 0x2c, 0x56, 0xd1, 0x52, 0x53, 0x3a, 0x44, 0xd2, 0x73, 0xc8, 0xc4, - 0x1b, 0x05, 0x65, 0x5a, 0x62, 0x92, 0x9c, 0xee, 0x41, 0x8d, 0x31, - 0xdb, 0xe7, 0x34, 0xea, 0x59, 0x21, 0xd5, 0x01, 0x7a, 0xd7, 0x64, - 0xb8, 0x64, 0x39, 0xcd, 0xc9, 0xed, 0xaf, 0xed, 0x4b, 0x03, 0x48, - 0xa7, 0xa0, 0x99, 0x01, 0x80, 0xdc, 0x65, 0xa3, 0x36, 0xae, 0x65, - 0x59, 0x48, 0x4f, 0x82, 0x4b, 0xc8, 0x65, 0xf1, 0x57, 0x1d, 0xe5, - 0x59, 0x2e, 0x0a, 0x3f, 0x6c, 0xd8, 0xd1, 0xf5, 0xe5, 0x09, 0xb4, - 0x6c, 0x54, 0x00, 0x0a, 0xe0, 0x15, 0x4d, 0x87, 0x75, 0x6d, 0xb7, - 0x58, 0x96, 0x5a, 0xdd, 0x6d, 0xd2, 0x00, 0xa0, 0xf4, 0x9b, 0x48, - 0xbe, 0xc3, 0x37, 0xa4, 0xba, 0x36, 0xe0, 0x7c, 0x87, 0x85, 0x97, - 0x1a, 0x15, 0xa2, 0xde, 0x2e, 0xa2, 0x5b, 0xbd, 0xaf, 0x18, 0xf9, - 0x90, 0x50, 0xcd, 0x70, 0x59, 0xf8, 0x27, 0x67, 0x47, 0xcb, 0xc7, - 0xa0, 0x07, 0x3a, 0x7d, 0xd1, 0x2c, 0x5d, 0x6c, 0x19, 0x3a, 0x66, - 0xb5, 0x7d, 0xfd, 0x91, 0x6f, 0x82, 0xb1, 0xbe, 0x08, 0x93, 0xdb, - 0x14, 0x47, 0xf1, 0xa2, 0x37, 0xc7, 0x45, 0x9e, 0x3c, 0xc7, 0x77, - 0xaf, 0x64, 0xa8, 0x93, 0xdf, 0xf6, 0x69, 0x83, 0x82, 0x60, 0xf2, - 0x49, 0x42, 0x34, 0xed, 0x5a, 0x00, 0x54, 0x85, 0x1c, 0x16, 0x36, - 0x92, 0x0c, 0x5c, 0xfa, 0xa6, 0xad, 0xbf, 0xdb, 0x30, 0x82, 0x05, - 0x46, 0x30, 0x82, 0x03, 0x2e, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, - 0x08, 0x6d, 0x8c, 0x14, 0x46, 0xb1, 0xa6, 0x0a, 0xee, 0x30, 0x0d, + 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f, + 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x69, 0x61, 0x6c, 0x30, 0x1e, 0x17, + 0x0d, 0x31, 0x30, 0x30, 0x31, 0x32, 0x39, 0x31, 0x34, 0x30, 0x36, + 0x30, 0x36, 0x5a, 0x17, 0x0d, 0x33, 0x30, 0x31, 0x32, 0x33, 0x31, + 0x31, 0x34, 0x30, 0x36, 0x30, 0x36, 0x5a, 0x30, 0x44, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, + 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, + 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, + 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, + 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, + 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x69, 0x61, 0x6c, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, + 0xf6, 0x1b, 0x4f, 0x67, 0x07, 0x2b, 0xa1, 0x15, 0xf5, 0x06, 0x22, + 0xcb, 0x1f, 0x01, 0xb2, 0xe3, 0x73, 0x45, 0x06, 0x44, 0x49, 0x2c, + 0xbb, 0x49, 0x25, 0x14, 0xd6, 0xce, 0xc3, 0xb7, 0xab, 0x2c, 0x4f, + 0xc6, 0x41, 0x32, 0x94, 0x57, 0xfa, 0x12, 0xa7, 0x5b, 0x0e, 0xe2, + 0x8f, 0x1f, 0x1e, 0x86, 0x19, 0xa7, 0xaa, 0xb5, 0x2d, 0xb9, 0x5f, + 0x0d, 0x8a, 0xc2, 0xaf, 0x85, 0x35, 0x79, 0x32, 0x2d, 0xbb, 0x1c, + 0x62, 0x37, 0xf2, 0xb1, 0x5b, 0x4a, 0x3d, 0xca, 0xcd, 0x71, 0x5f, + 0xe9, 0x42, 0xbe, 0x94, 0xe8, 0xc8, 0xde, 0xf9, 0x22, 0x48, 0x64, + 0xc6, 0xe5, 0xab, 0xc6, 0x2b, 0x6d, 0xad, 0x05, 0xf0, 0xfa, 0xd5, + 0x0b, 0xcf, 0x9a, 0xe5, 0xf0, 0x50, 0xa4, 0x8b, 0x3b, 0x47, 0xa5, + 0x23, 0x5b, 0x7a, 0x7a, 0xf8, 0x33, 0x3f, 0xb8, 0xef, 0x99, 0x97, + 0xe3, 0x20, 0xc1, 0xd6, 0x28, 0x89, 0xcf, 0x94, 0xfb, 0xb9, 0x45, + 0xed, 0xe3, 0x40, 0x17, 0x11, 0xd4, 0x74, 0xf0, 0x0b, 0x31, 0xe2, + 0x2b, 0x26, 0x6a, 0x9b, 0x4c, 0x57, 0xae, 0xac, 0x20, 0x3e, 0xba, + 0x45, 0x7a, 0x05, 0xf3, 0xbd, 0x9b, 0x69, 0x15, 0xae, 0x7d, 0x4e, + 0x20, 0x63, 0xc4, 0x35, 0x76, 0x3a, 0x07, 0x02, 0xc9, 0x37, 0xfd, + 0xc7, 0x47, 0xee, 0xe8, 0xf1, 0x76, 0x1d, 0x73, 0x15, 0xf2, 0x97, + 0xa4, 0xb5, 0xc8, 0x7a, 0x79, 0xd9, 0x42, 0xaa, 0x2b, 0x7f, 0x5c, + 0xfe, 0xce, 0x26, 0x4f, 0xa3, 0x66, 0x81, 0x35, 0xaf, 0x44, 0xba, + 0x54, 0x1e, 0x1c, 0x30, 0x32, 0x65, 0x9d, 0xe6, 0x3c, 0x93, 0x5e, + 0x50, 0x4e, 0x7a, 0xe3, 0x3a, 0xd4, 0x6e, 0xcc, 0x1a, 0xfb, 0xf9, + 0xd2, 0x37, 0xae, 0x24, 0x2a, 0xab, 0x57, 0x03, 0x22, 0x28, 0x0d, + 0x49, 0x75, 0x7f, 0xb7, 0x28, 0xda, 0x75, 0xbf, 0x8e, 0xe3, 0xdc, + 0x0e, 0x79, 0x31, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, + 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, + 0x14, 0x9d, 0x93, 0xc6, 0x53, 0x8b, 0x5e, 0xca, 0xaf, 0x3f, 0x9f, + 0x1e, 0x0f, 0xe5, 0x99, 0x95, 0xbc, 0x24, 0xf6, 0x94, 0x8f, 0x30, + 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, + 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, + 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x58, 0xac, 0xf4, + 0x04, 0x0e, 0xcd, 0xc0, 0x0d, 0xff, 0x0a, 0xfd, 0xd4, 0xba, 0x16, + 0x5f, 0x29, 0xbd, 0x7b, 0x68, 0x99, 0x58, 0x49, 0xd2, 0xb4, 0x1d, + 0x37, 0x4d, 0x7f, 0x27, 0x7d, 0x46, 0x06, 0x5d, 0x43, 0xc6, 0x86, + 0x2e, 0x3e, 0x73, 0xb2, 0x26, 0x7d, 0x4f, 0x93, 0xa9, 0xb6, 0xc4, + 0x2a, 0x9a, 0xab, 0x21, 0x97, 0x14, 0xb1, 0xde, 0x8c, 0xd3, 0xab, + 0x89, 0x15, 0xd8, 0x6b, 0x24, 0xd4, 0xf1, 0x16, 0xae, 0xd8, 0xa4, + 0x5c, 0xd4, 0x7f, 0x51, 0x8e, 0xed, 0x18, 0x01, 0xb1, 0x93, 0x63, + 0xbd, 0xbc, 0xf8, 0x61, 0x80, 0x9a, 0x9e, 0xb1, 0xce, 0x42, 0x70, + 0xe2, 0xa9, 0x7d, 0x06, 0x25, 0x7d, 0x27, 0xa1, 0xfe, 0x6f, 0xec, + 0xb3, 0x1e, 0x24, 0xda, 0xe3, 0x4b, 0x55, 0x1a, 0x00, 0x3b, 0x35, + 0xb4, 0x3b, 0xd9, 0xd7, 0x5d, 0x30, 0xfd, 0x81, 0x13, 0x89, 0xf2, + 0xc2, 0x06, 0x2b, 0xed, 0x67, 0xc4, 0x8e, 0xc9, 0x43, 0xb2, 0x5c, + 0x6b, 0x15, 0x89, 0x02, 0xbc, 0x62, 0xfc, 0x4e, 0xf2, 0xb5, 0x33, + 0xaa, 0xb2, 0x6f, 0xd3, 0x0a, 0xa2, 0x50, 0xe3, 0xf6, 0x3b, 0xe8, + 0x2e, 0x44, 0xc2, 0xdb, 0x66, 0x38, 0xa9, 0x33, 0x56, 0x48, 0xf1, + 0x6d, 0x1b, 0x33, 0x8d, 0x0d, 0x8c, 0x3f, 0x60, 0x37, 0x9d, 0xd3, + 0xca, 0x6d, 0x7e, 0x34, 0x7e, 0x0d, 0x9f, 0x72, 0x76, 0x8b, 0x1b, + 0x9f, 0x72, 0xfd, 0x52, 0x35, 0x41, 0x45, 0x02, 0x96, 0x2f, 0x1c, + 0xb2, 0x9a, 0x73, 0x49, 0x21, 0xb1, 0x49, 0x47, 0x45, 0x47, 0xb4, + 0xef, 0x6a, 0x34, 0x11, 0xc9, 0x4d, 0x9a, 0xcc, 0x59, 0xb7, 0xd6, + 0x02, 0x9e, 0x5a, 0x4e, 0x65, 0xb5, 0x94, 0xae, 0x1b, 0xdf, 0x29, + 0xb0, 0x16, 0xf1, 0xbf, 0x00, 0x9e, 0x07, 0x3a, 0x17, 0x64, 0xb5, + 0x04, 0xb5, 0x23, 0x21, 0x99, 0x0a, 0x95, 0x3b, 0x97, 0x7c, 0xef, + 0x30, 0x82, 0x03, 0x4c, 0x30, 0x82, 0x02, 0x34, 0xa0, 0x03, 0x02, + 0x01, 0x02, 0x02, 0x08, 0x7c, 0x4f, 0x04, 0x39, 0x1c, 0xd4, 0x99, + 0x2d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x44, 0x31, 0x0b, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x14, + 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x41, 0x66, + 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x1f, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x41, 0x66, + 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x30, 0x1e, + 0x17, 0x0d, 0x31, 0x30, 0x30, 0x31, 0x32, 0x39, 0x31, 0x34, 0x30, + 0x38, 0x32, 0x34, 0x5a, 0x17, 0x0d, 0x33, 0x30, 0x31, 0x32, 0x33, + 0x31, 0x31, 0x34, 0x30, 0x38, 0x32, 0x34, 0x5a, 0x30, 0x44, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, + 0x53, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, + 0x0b, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, + 0x16, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, + 0x67, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, + 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, + 0x00, 0xb4, 0x84, 0xcc, 0x33, 0x17, 0x2e, 0x6b, 0x94, 0x6c, 0x6b, + 0x61, 0x52, 0xa0, 0xeb, 0xa3, 0xcf, 0x79, 0x94, 0x4c, 0xe5, 0x94, + 0x80, 0x99, 0xcb, 0x55, 0x64, 0x44, 0x65, 0x8f, 0x67, 0x64, 0xe2, + 0x06, 0xe3, 0x5c, 0x37, 0x49, 0xf6, 0x2f, 0x9b, 0x84, 0x84, 0x1e, + 0x2d, 0xf2, 0x60, 0x9d, 0x30, 0x4e, 0xcc, 0x84, 0x85, 0xe2, 0x2c, + 0xcf, 0x1e, 0x9e, 0xfe, 0x36, 0xab, 0x33, 0x77, 0x35, 0x44, 0xd8, + 0x35, 0x96, 0x1a, 0x3d, 0x36, 0xe8, 0x7a, 0x0e, 0xd8, 0xd5, 0x47, + 0xa1, 0x6a, 0x69, 0x8b, 0xd9, 0xfc, 0xbb, 0x3a, 0xae, 0x79, 0x5a, + 0xd5, 0xf4, 0xd6, 0x71, 0xbb, 0x9a, 0x90, 0x23, 0x6b, 0x9a, 0xb7, + 0x88, 0x74, 0x87, 0x0c, 0x1e, 0x5f, 0xb9, 0x9e, 0x2d, 0xfa, 0xab, + 0x53, 0x2b, 0xdc, 0xbb, 0x76, 0x3e, 0x93, 0x4c, 0x08, 0x08, 0x8c, + 0x1e, 0xa2, 0x23, 0x1c, 0xd4, 0x6a, 0xad, 0x22, 0xba, 0x99, 0x01, + 0x2e, 0x6d, 0x65, 0xcb, 0xbe, 0x24, 0x66, 0x55, 0x24, 0x4b, 0x40, + 0x44, 0xb1, 0x1b, 0xd7, 0xe1, 0xc2, 0x85, 0xc0, 0xde, 0x10, 0x3f, + 0x3d, 0xed, 0xb8, 0xfc, 0xf1, 0xf1, 0x23, 0x53, 0xdc, 0xbf, 0x65, + 0x97, 0x6f, 0xd9, 0xf9, 0x40, 0x71, 0x8d, 0x7d, 0xbd, 0x95, 0xd4, + 0xce, 0xbe, 0xa0, 0x5e, 0x27, 0x23, 0xde, 0xfd, 0xa6, 0xd0, 0x26, + 0x0e, 0x00, 0x29, 0xeb, 0x3c, 0x46, 0xf0, 0x3d, 0x60, 0xbf, 0x3f, + 0x50, 0xd2, 0xdc, 0x26, 0x41, 0x51, 0x9e, 0x14, 0x37, 0x42, 0x04, + 0xa3, 0x70, 0x57, 0xa8, 0x1b, 0x87, 0xed, 0x2d, 0xfa, 0x7b, 0xee, + 0x8c, 0x0a, 0xe3, 0xa9, 0x66, 0x89, 0x19, 0xcb, 0x41, 0xf9, 0xdd, + 0x44, 0x36, 0x61, 0xcf, 0xe2, 0x77, 0x46, 0xc8, 0x7d, 0xf6, 0xf4, + 0x92, 0x81, 0x36, 0xfd, 0xdb, 0x34, 0xf1, 0x72, 0x7e, 0xf3, 0x0c, + 0x16, 0xbd, 0xb4, 0x15, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, + 0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, + 0x04, 0x14, 0x07, 0x1f, 0xd2, 0xe7, 0x9c, 0xda, 0xc2, 0x6e, 0xa2, + 0x40, 0xb4, 0xb0, 0x7a, 0x50, 0x10, 0x50, 0x74, 0xc4, 0xc8, 0xbd, + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, + 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x89, 0x57, + 0xb2, 0x16, 0x7a, 0xa8, 0xc2, 0xfd, 0xd6, 0xd9, 0x9b, 0x9b, 0x34, + 0xc2, 0x9c, 0xb4, 0x32, 0x14, 0x4d, 0xa7, 0xa4, 0xdf, 0xec, 0xbe, + 0xa7, 0xbe, 0xf8, 0x43, 0xdb, 0x91, 0x37, 0xce, 0xb4, 0x32, 0x2e, + 0x50, 0x55, 0x1a, 0x35, 0x4e, 0x76, 0x43, 0x71, 0x20, 0xef, 0x93, + 0x77, 0x4e, 0x15, 0x70, 0x2e, 0x87, 0xc3, 0xc1, 0x1d, 0x6d, 0xdc, + 0xcb, 0xb5, 0x27, 0xd4, 0x2c, 0x56, 0xd1, 0x52, 0x53, 0x3a, 0x44, + 0xd2, 0x73, 0xc8, 0xc4, 0x1b, 0x05, 0x65, 0x5a, 0x62, 0x92, 0x9c, + 0xee, 0x41, 0x8d, 0x31, 0xdb, 0xe7, 0x34, 0xea, 0x59, 0x21, 0xd5, + 0x01, 0x7a, 0xd7, 0x64, 0xb8, 0x64, 0x39, 0xcd, 0xc9, 0xed, 0xaf, + 0xed, 0x4b, 0x03, 0x48, 0xa7, 0xa0, 0x99, 0x01, 0x80, 0xdc, 0x65, + 0xa3, 0x36, 0xae, 0x65, 0x59, 0x48, 0x4f, 0x82, 0x4b, 0xc8, 0x65, + 0xf1, 0x57, 0x1d, 0xe5, 0x59, 0x2e, 0x0a, 0x3f, 0x6c, 0xd8, 0xd1, + 0xf5, 0xe5, 0x09, 0xb4, 0x6c, 0x54, 0x00, 0x0a, 0xe0, 0x15, 0x4d, + 0x87, 0x75, 0x6d, 0xb7, 0x58, 0x96, 0x5a, 0xdd, 0x6d, 0xd2, 0x00, + 0xa0, 0xf4, 0x9b, 0x48, 0xbe, 0xc3, 0x37, 0xa4, 0xba, 0x36, 0xe0, + 0x7c, 0x87, 0x85, 0x97, 0x1a, 0x15, 0xa2, 0xde, 0x2e, 0xa2, 0x5b, + 0xbd, 0xaf, 0x18, 0xf9, 0x90, 0x50, 0xcd, 0x70, 0x59, 0xf8, 0x27, + 0x67, 0x47, 0xcb, 0xc7, 0xa0, 0x07, 0x3a, 0x7d, 0xd1, 0x2c, 0x5d, + 0x6c, 0x19, 0x3a, 0x66, 0xb5, 0x7d, 0xfd, 0x91, 0x6f, 0x82, 0xb1, + 0xbe, 0x08, 0x93, 0xdb, 0x14, 0x47, 0xf1, 0xa2, 0x37, 0xc7, 0x45, + 0x9e, 0x3c, 0xc7, 0x77, 0xaf, 0x64, 0xa8, 0x93, 0xdf, 0xf6, 0x69, + 0x83, 0x82, 0x60, 0xf2, 0x49, 0x42, 0x34, 0xed, 0x5a, 0x00, 0x54, + 0x85, 0x1c, 0x16, 0x36, 0x92, 0x0c, 0x5c, 0xfa, 0xa6, 0xad, 0xbf, + 0xdb, 0x30, 0x82, 0x05, 0x46, 0x30, 0x82, 0x03, 0x2e, 0xa0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x08, 0x6d, 0x8c, 0x14, 0x46, 0xb1, 0xa6, + 0x0a, 0xee, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x30, 0x41, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, + 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x41, + 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, + 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x13, 0x41, + 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, + 0x50, 0x72, 0x65, 0x6d, 0x69, 0x75, 0x6d, 0x30, 0x1e, 0x17, 0x0d, + 0x31, 0x30, 0x30, 0x31, 0x32, 0x39, 0x31, 0x34, 0x31, 0x30, 0x33, + 0x36, 0x5a, 0x17, 0x0d, 0x34, 0x30, 0x31, 0x32, 0x33, 0x31, 0x31, + 0x34, 0x31, 0x30, 0x33, 0x36, 0x5a, 0x30, 0x41, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, + 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x41, + 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, + 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x13, 0x41, + 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, + 0x50, 0x72, 0x65, 0x6d, 0x69, 0x75, 0x6d, 0x30, 0x82, 0x02, 0x22, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, + 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xc4, 0x12, 0xdf, 0xa9, + 0x5f, 0xfe, 0x41, 0xdd, 0xdd, 0xf5, 0x9f, 0x8a, 0xe3, 0xf6, 0xac, + 0xe1, 0x3c, 0x78, 0x9a, 0xbc, 0xd8, 0xf0, 0x7f, 0x7a, 0xa0, 0x33, + 0x2a, 0xdc, 0x8d, 0x20, 0x5b, 0xae, 0x2d, 0x6f, 0xe7, 0x93, 0xd9, + 0x36, 0x70, 0x6a, 0x68, 0xcf, 0x8e, 0x51, 0xa3, 0x85, 0x5b, 0x67, + 0x04, 0xa0, 0x10, 0x24, 0x6f, 0x5d, 0x28, 0x82, 0xc1, 0x97, 0x57, + 0xd8, 0x48, 0x29, 0x13, 0xb6, 0xe1, 0xbe, 0x91, 0x4d, 0xdf, 0x85, + 0x0c, 0x53, 0x18, 0x9a, 0x1e, 0x24, 0xa2, 0x4f, 0x8f, 0xf0, 0xa2, + 0x85, 0x0b, 0xcb, 0xf4, 0x29, 0x7f, 0xd2, 0xa4, 0x58, 0xee, 0x26, + 0x4d, 0xc9, 0xaa, 0xa8, 0x7b, 0x9a, 0xd9, 0xfa, 0x38, 0xde, 0x44, + 0x57, 0x15, 0xe5, 0xf8, 0x8c, 0xc8, 0xd9, 0x48, 0xe2, 0x0d, 0x16, + 0x27, 0x1d, 0x1e, 0xc8, 0x83, 0x85, 0x25, 0xb7, 0xba, 0xaa, 0x55, + 0x41, 0xcc, 0x03, 0x22, 0x4b, 0x2d, 0x91, 0x8d, 0x8b, 0xe6, 0x89, + 0xaf, 0x66, 0xc7, 0xe9, 0xff, 0x2b, 0xe9, 0x3c, 0xac, 0xda, 0xd2, + 0xb3, 0xc3, 0xe1, 0x68, 0x9c, 0x89, 0xf8, 0x7a, 0x00, 0x56, 0xde, + 0xf4, 0x55, 0x95, 0x6c, 0xfb, 0xba, 0x64, 0xdd, 0x62, 0x8b, 0xdf, + 0x0b, 0x77, 0x32, 0xeb, 0x62, 0xcc, 0x26, 0x9a, 0x9b, 0xbb, 0xaa, + 0x62, 0x83, 0x4c, 0xb4, 0x06, 0x7a, 0x30, 0xc8, 0x29, 0xbf, 0xed, + 0x06, 0x4d, 0x97, 0xb9, 0x1c, 0xc4, 0x31, 0x2b, 0xd5, 0x5f, 0xbc, + 0x53, 0x12, 0x17, 0x9c, 0x99, 0x57, 0x29, 0x66, 0x77, 0x61, 0x21, + 0x31, 0x07, 0x2e, 0x25, 0x49, 0x9d, 0x18, 0xf2, 0xee, 0xf3, 0x2b, + 0x71, 0x8c, 0xb5, 0xba, 0x39, 0x07, 0x49, 0x77, 0xfc, 0xef, 0x2e, + 0x92, 0x90, 0x05, 0x8d, 0x2d, 0x2f, 0x77, 0x7b, 0xef, 0x43, 0xbf, + 0x35, 0xbb, 0x9a, 0xd8, 0xf9, 0x73, 0xa7, 0x2c, 0xf2, 0xd0, 0x57, + 0xee, 0x28, 0x4e, 0x26, 0x5f, 0x8f, 0x90, 0x68, 0x09, 0x2f, 0xb8, + 0xf8, 0xdc, 0x06, 0xe9, 0x2e, 0x9a, 0x3e, 0x51, 0xa7, 0xd1, 0x22, + 0xc4, 0x0a, 0xa7, 0x38, 0x48, 0x6c, 0xb3, 0xf9, 0xff, 0x7d, 0xab, + 0x86, 0x57, 0xe3, 0xba, 0xd6, 0x85, 0x78, 0x77, 0xba, 0x43, 0xea, + 0x48, 0x7f, 0xf6, 0xd8, 0xbe, 0x23, 0x6d, 0x1e, 0xbf, 0xd1, 0x36, + 0x6c, 0x58, 0x5c, 0xf1, 0xee, 0xa4, 0x19, 0x54, 0x1a, 0xf5, 0x03, + 0xd2, 0x76, 0xe6, 0xe1, 0x8c, 0xbd, 0x3c, 0xb3, 0xd3, 0x48, 0x4b, + 0xe2, 0xc8, 0xf8, 0x7f, 0x92, 0xa8, 0x76, 0x46, 0x9c, 0x42, 0x65, + 0x3e, 0xa4, 0x1e, 0xc1, 0x07, 0x03, 0x5a, 0x46, 0x2d, 0xb8, 0x97, + 0xf3, 0xb7, 0xd5, 0xb2, 0x55, 0x21, 0xef, 0xba, 0xdc, 0x4c, 0x00, + 0x97, 0xfb, 0x14, 0x95, 0x27, 0x33, 0xbf, 0xe8, 0x43, 0x47, 0x46, + 0xd2, 0x08, 0x99, 0x16, 0x60, 0x3b, 0x9a, 0x7e, 0xd2, 0xe6, 0xed, + 0x38, 0xea, 0xec, 0x01, 0x1e, 0x3c, 0x48, 0x56, 0x49, 0x09, 0xc7, + 0x4c, 0x37, 0x00, 0x9e, 0x88, 0x0e, 0xc0, 0x73, 0xe1, 0x6f, 0x66, + 0xe9, 0x72, 0x47, 0x30, 0x3e, 0x10, 0xe5, 0x0b, 0x03, 0xc9, 0x9a, + 0x42, 0x00, 0x6c, 0xc5, 0x94, 0x7e, 0x61, 0xc4, 0x8a, 0xdf, 0x7f, + 0x82, 0x1a, 0x0b, 0x59, 0xc4, 0x59, 0x32, 0x77, 0xb3, 0xbc, 0x60, + 0x69, 0x56, 0x39, 0xfd, 0xb4, 0x06, 0x7b, 0x2c, 0xd6, 0x64, 0x36, + 0xd9, 0xbd, 0x48, 0xed, 0x84, 0x1f, 0x7e, 0xa5, 0x22, 0x8f, 0x2a, + 0xb8, 0x42, 0xf4, 0x82, 0xb7, 0xd4, 0x53, 0x90, 0x78, 0x4e, 0x2d, + 0x1a, 0xfd, 0x81, 0x6f, 0x44, 0xd7, 0x3b, 0x01, 0x74, 0x96, 0x42, + 0xe0, 0x00, 0xe2, 0x2e, 0x6b, 0xea, 0xc5, 0xee, 0x72, 0xac, 0xbb, + 0xbf, 0xfe, 0xea, 0xaa, 0xa8, 0xf8, 0xdc, 0xf6, 0xb2, 0x79, 0x8a, + 0xb6, 0x67, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0x9d, 0xc0, 0x67, 0xa6, 0x0c, 0x22, 0xd9, 0x26, 0xf5, 0x45, 0xab, + 0xa6, 0x65, 0x52, 0x11, 0x27, 0xd8, 0x45, 0xac, 0x63, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, + 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, + 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c, - 0x05, 0x00, 0x30, 0x41, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x14, 0x30, 0x12, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x41, 0x66, 0x66, 0x69, 0x72, - 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x1c, 0x30, 0x1a, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x0c, 0x13, 0x41, 0x66, 0x66, 0x69, 0x72, - 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x50, 0x72, 0x65, 0x6d, - 0x69, 0x75, 0x6d, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, 0x30, 0x31, - 0x32, 0x39, 0x31, 0x34, 0x31, 0x30, 0x33, 0x36, 0x5a, 0x17, 0x0d, - 0x34, 0x30, 0x31, 0x32, 0x33, 0x31, 0x31, 0x34, 0x31, 0x30, 0x33, - 0x36, 0x5a, 0x30, 0x41, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x14, 0x30, 0x12, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x41, 0x66, 0x66, 0x69, 0x72, - 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x1c, 0x30, 0x1a, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x0c, 0x13, 0x41, 0x66, 0x66, 0x69, 0x72, - 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x50, 0x72, 0x65, 0x6d, - 0x69, 0x75, 0x6d, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, - 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, - 0x02, 0x01, 0x00, 0xc4, 0x12, 0xdf, 0xa9, 0x5f, 0xfe, 0x41, 0xdd, - 0xdd, 0xf5, 0x9f, 0x8a, 0xe3, 0xf6, 0xac, 0xe1, 0x3c, 0x78, 0x9a, - 0xbc, 0xd8, 0xf0, 0x7f, 0x7a, 0xa0, 0x33, 0x2a, 0xdc, 0x8d, 0x20, - 0x5b, 0xae, 0x2d, 0x6f, 0xe7, 0x93, 0xd9, 0x36, 0x70, 0x6a, 0x68, - 0xcf, 0x8e, 0x51, 0xa3, 0x85, 0x5b, 0x67, 0x04, 0xa0, 0x10, 0x24, - 0x6f, 0x5d, 0x28, 0x82, 0xc1, 0x97, 0x57, 0xd8, 0x48, 0x29, 0x13, - 0xb6, 0xe1, 0xbe, 0x91, 0x4d, 0xdf, 0x85, 0x0c, 0x53, 0x18, 0x9a, - 0x1e, 0x24, 0xa2, 0x4f, 0x8f, 0xf0, 0xa2, 0x85, 0x0b, 0xcb, 0xf4, - 0x29, 0x7f, 0xd2, 0xa4, 0x58, 0xee, 0x26, 0x4d, 0xc9, 0xaa, 0xa8, - 0x7b, 0x9a, 0xd9, 0xfa, 0x38, 0xde, 0x44, 0x57, 0x15, 0xe5, 0xf8, - 0x8c, 0xc8, 0xd9, 0x48, 0xe2, 0x0d, 0x16, 0x27, 0x1d, 0x1e, 0xc8, - 0x83, 0x85, 0x25, 0xb7, 0xba, 0xaa, 0x55, 0x41, 0xcc, 0x03, 0x22, - 0x4b, 0x2d, 0x91, 0x8d, 0x8b, 0xe6, 0x89, 0xaf, 0x66, 0xc7, 0xe9, - 0xff, 0x2b, 0xe9, 0x3c, 0xac, 0xda, 0xd2, 0xb3, 0xc3, 0xe1, 0x68, - 0x9c, 0x89, 0xf8, 0x7a, 0x00, 0x56, 0xde, 0xf4, 0x55, 0x95, 0x6c, - 0xfb, 0xba, 0x64, 0xdd, 0x62, 0x8b, 0xdf, 0x0b, 0x77, 0x32, 0xeb, - 0x62, 0xcc, 0x26, 0x9a, 0x9b, 0xbb, 0xaa, 0x62, 0x83, 0x4c, 0xb4, - 0x06, 0x7a, 0x30, 0xc8, 0x29, 0xbf, 0xed, 0x06, 0x4d, 0x97, 0xb9, - 0x1c, 0xc4, 0x31, 0x2b, 0xd5, 0x5f, 0xbc, 0x53, 0x12, 0x17, 0x9c, - 0x99, 0x57, 0x29, 0x66, 0x77, 0x61, 0x21, 0x31, 0x07, 0x2e, 0x25, - 0x49, 0x9d, 0x18, 0xf2, 0xee, 0xf3, 0x2b, 0x71, 0x8c, 0xb5, 0xba, - 0x39, 0x07, 0x49, 0x77, 0xfc, 0xef, 0x2e, 0x92, 0x90, 0x05, 0x8d, - 0x2d, 0x2f, 0x77, 0x7b, 0xef, 0x43, 0xbf, 0x35, 0xbb, 0x9a, 0xd8, - 0xf9, 0x73, 0xa7, 0x2c, 0xf2, 0xd0, 0x57, 0xee, 0x28, 0x4e, 0x26, - 0x5f, 0x8f, 0x90, 0x68, 0x09, 0x2f, 0xb8, 0xf8, 0xdc, 0x06, 0xe9, - 0x2e, 0x9a, 0x3e, 0x51, 0xa7, 0xd1, 0x22, 0xc4, 0x0a, 0xa7, 0x38, - 0x48, 0x6c, 0xb3, 0xf9, 0xff, 0x7d, 0xab, 0x86, 0x57, 0xe3, 0xba, - 0xd6, 0x85, 0x78, 0x77, 0xba, 0x43, 0xea, 0x48, 0x7f, 0xf6, 0xd8, - 0xbe, 0x23, 0x6d, 0x1e, 0xbf, 0xd1, 0x36, 0x6c, 0x58, 0x5c, 0xf1, - 0xee, 0xa4, 0x19, 0x54, 0x1a, 0xf5, 0x03, 0xd2, 0x76, 0xe6, 0xe1, - 0x8c, 0xbd, 0x3c, 0xb3, 0xd3, 0x48, 0x4b, 0xe2, 0xc8, 0xf8, 0x7f, - 0x92, 0xa8, 0x76, 0x46, 0x9c, 0x42, 0x65, 0x3e, 0xa4, 0x1e, 0xc1, - 0x07, 0x03, 0x5a, 0x46, 0x2d, 0xb8, 0x97, 0xf3, 0xb7, 0xd5, 0xb2, - 0x55, 0x21, 0xef, 0xba, 0xdc, 0x4c, 0x00, 0x97, 0xfb, 0x14, 0x95, - 0x27, 0x33, 0xbf, 0xe8, 0x43, 0x47, 0x46, 0xd2, 0x08, 0x99, 0x16, - 0x60, 0x3b, 0x9a, 0x7e, 0xd2, 0xe6, 0xed, 0x38, 0xea, 0xec, 0x01, - 0x1e, 0x3c, 0x48, 0x56, 0x49, 0x09, 0xc7, 0x4c, 0x37, 0x00, 0x9e, - 0x88, 0x0e, 0xc0, 0x73, 0xe1, 0x6f, 0x66, 0xe9, 0x72, 0x47, 0x30, - 0x3e, 0x10, 0xe5, 0x0b, 0x03, 0xc9, 0x9a, 0x42, 0x00, 0x6c, 0xc5, - 0x94, 0x7e, 0x61, 0xc4, 0x8a, 0xdf, 0x7f, 0x82, 0x1a, 0x0b, 0x59, - 0xc4, 0x59, 0x32, 0x77, 0xb3, 0xbc, 0x60, 0x69, 0x56, 0x39, 0xfd, - 0xb4, 0x06, 0x7b, 0x2c, 0xd6, 0x64, 0x36, 0xd9, 0xbd, 0x48, 0xed, - 0x84, 0x1f, 0x7e, 0xa5, 0x22, 0x8f, 0x2a, 0xb8, 0x42, 0xf4, 0x82, - 0xb7, 0xd4, 0x53, 0x90, 0x78, 0x4e, 0x2d, 0x1a, 0xfd, 0x81, 0x6f, - 0x44, 0xd7, 0x3b, 0x01, 0x74, 0x96, 0x42, 0xe0, 0x00, 0xe2, 0x2e, - 0x6b, 0xea, 0xc5, 0xee, 0x72, 0xac, 0xbb, 0xbf, 0xfe, 0xea, 0xaa, - 0xa8, 0xf8, 0xdc, 0xf6, 0xb2, 0x79, 0x8a, 0xb6, 0x67, 0x02, 0x03, - 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, - 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9d, 0xc0, 0x67, 0xa6, - 0x0c, 0x22, 0xd9, 0x26, 0xf5, 0x45, 0xab, 0xa6, 0x65, 0x52, 0x11, - 0x27, 0xd8, 0x45, 0xac, 0x63, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, - 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, - 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, - 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x03, 0x82, - 0x02, 0x01, 0x00, 0xb3, 0x57, 0x4d, 0x10, 0x62, 0x4e, 0x3a, 0xe4, - 0xac, 0xea, 0xb8, 0x1c, 0xaf, 0x32, 0x23, 0xc8, 0xb3, 0x49, 0x5a, - 0x51, 0x9c, 0x76, 0x28, 0x8d, 0x79, 0xaa, 0x57, 0x46, 0x17, 0xd5, - 0xf5, 0x52, 0xf6, 0xb7, 0x44, 0xe8, 0x08, 0x44, 0xbf, 0x18, 0x84, - 0xd2, 0x0b, 0x80, 0xcd, 0xc5, 0x12, 0xfd, 0x00, 0x55, 0x05, 0x61, - 0x87, 0x41, 0xdc, 0xb5, 0x24, 0x9e, 0x3c, 0xc4, 0xd8, 0xc8, 0xfb, - 0x70, 0x9e, 0x2f, 0x78, 0x96, 0x83, 0x20, 0x36, 0xde, 0x7c, 0x0f, - 0x69, 0x13, 0x88, 0xa5, 0x75, 0x36, 0x98, 0x08, 0xa6, 0xc6, 0xdf, - 0xac, 0xce, 0xe3, 0x58, 0xd6, 0xb7, 0x3e, 0xde, 0xba, 0xf3, 0xeb, - 0x34, 0x40, 0xd8, 0xa2, 0x81, 0xf5, 0x78, 0x3f, 0x2f, 0xd5, 0xa5, - 0xfc, 0xd9, 0xa2, 0xd4, 0x5e, 0x04, 0x0e, 0x17, 0xad, 0xfe, 0x41, - 0xf0, 0xe5, 0xb2, 0x72, 0xfa, 0x44, 0x82, 0x33, 0x42, 0xe8, 0x2d, - 0x58, 0xf7, 0x56, 0x8c, 0x62, 0x3f, 0xba, 0x42, 0xb0, 0x9c, 0x0c, - 0x5c, 0x7e, 0x2e, 0x65, 0x26, 0x5c, 0x53, 0x4f, 0x00, 0xb2, 0x78, - 0x7e, 0xa1, 0x0d, 0x99, 0x2d, 0x8d, 0xb8, 0x1d, 0x8e, 0xa2, 0xc4, - 0xb0, 0xfd, 0x60, 0xd0, 0x30, 0xa4, 0x8e, 0xc8, 0x04, 0x62, 0xa9, - 0xc4, 0xed, 0x35, 0xde, 0x7a, 0x97, 0xed, 0x0e, 0x38, 0x5e, 0x92, - 0x2f, 0x93, 0x70, 0xa5, 0xa9, 0x9c, 0x6f, 0xa7, 0x7d, 0x13, 0x1d, - 0x7e, 0xc6, 0x08, 0x48, 0xb1, 0x5e, 0x67, 0xeb, 0x51, 0x08, 0x25, - 0xe9, 0xe6, 0x25, 0x6b, 0x52, 0x29, 0x91, 0x9c, 0xd2, 0x39, 0x73, - 0x08, 0x57, 0xde, 0x99, 0x06, 0xb4, 0x5b, 0x9d, 0x10, 0x06, 0xe1, - 0xc2, 0x00, 0xa8, 0xb8, 0x1c, 0x4a, 0x02, 0x0a, 0x14, 0xd0, 0xc1, - 0x41, 0xca, 0xfb, 0x8c, 0x35, 0x21, 0x7d, 0x82, 0x38, 0xf2, 0xa9, - 0x54, 0x91, 0x19, 0x35, 0x93, 0x94, 0x6d, 0x6a, 0x3a, 0xc5, 0xb2, - 0xd0, 0xbb, 0x89, 0x86, 0x93, 0xe8, 0x9b, 0xc9, 0x0f, 0x3a, 0xa7, - 0x7a, 0xb8, 0xa1, 0xf0, 0x78, 0x46, 0xfa, 0xfc, 0x37, 0x2f, 0xe5, - 0x8a, 0x84, 0xf3, 0xdf, 0xfe, 0x04, 0xd9, 0xa1, 0x68, 0xa0, 0x2f, - 0x24, 0xe2, 0x09, 0x95, 0x06, 0xd5, 0x95, 0xca, 0xe1, 0x24, 0x96, - 0xeb, 0x7c, 0xf6, 0x93, 0x05, 0xbb, 0xed, 0x73, 0xe9, 0x2d, 0xd1, - 0x75, 0x39, 0xd7, 0xe7, 0x24, 0xdb, 0xd8, 0x4e, 0x5f, 0x43, 0x8f, - 0x9e, 0xd0, 0x14, 0x39, 0xbf, 0x55, 0x70, 0x48, 0x99, 0x57, 0x31, - 0xb4, 0x9c, 0xee, 0x4a, 0x98, 0x03, 0x96, 0x30, 0x1f, 0x60, 0x06, - 0xee, 0x1b, 0x23, 0xfe, 0x81, 0x60, 0x23, 0x1a, 0x47, 0x62, 0x85, - 0xa5, 0xcc, 0x19, 0x34, 0x80, 0x6f, 0xb3, 0xac, 0x1a, 0xe3, 0x9f, - 0xf0, 0x7b, 0x48, 0xad, 0xd5, 0x01, 0xd9, 0x67, 0xb6, 0xa9, 0x72, - 0x93, 0xea, 0x2d, 0x66, 0xb5, 0xb2, 0xb8, 0xe4, 0x3d, 0x3c, 0xb2, - 0xef, 0x4c, 0x8c, 0xea, 0xeb, 0x07, 0xbf, 0xab, 0x35, 0x9a, 0x55, - 0x86, 0xbc, 0x18, 0xa6, 0xb5, 0xa8, 0x5e, 0xb4, 0x83, 0x6c, 0x6b, - 0x69, 0x40, 0xd3, 0x9f, 0xdc, 0xf1, 0xc3, 0x69, 0x6b, 0xb9, 0xe1, - 0x6d, 0x09, 0xf4, 0xf1, 0xaa, 0x50, 0x76, 0x0a, 0x7a, 0x7d, 0x7a, - 0x17, 0xa1, 0x55, 0x96, 0x42, 0x99, 0x31, 0x09, 0xdd, 0x60, 0x11, - 0x8d, 0x05, 0x30, 0x7e, 0xe6, 0x8e, 0x46, 0xd1, 0x9d, 0x14, 0xda, - 0xc7, 0x17, 0xe4, 0x05, 0x96, 0x8c, 0xc4, 0x24, 0xb5, 0x1b, 0xcf, - 0x14, 0x07, 0xb2, 0x40, 0xf8, 0xa3, 0x9e, 0x41, 0x86, 0xbc, 0x04, - 0xd0, 0x6b, 0x96, 0xc8, 0x2a, 0x80, 0x34, 0xfd, 0xbf, 0xef, 0x06, - 0xa3, 0xdd, 0x58, 0xc5, 0x85, 0x3d, 0x3e, 0x8f, 0xfe, 0x9e, 0x29, - 0xe0, 0xb6, 0xb8, 0x09, 0x68, 0x19, 0x1c, 0x18, 0x43, 0x30, 0x82, - 0x01, 0xfe, 0x30, 0x82, 0x01, 0x85, 0xa0, 0x03, 0x02, 0x01, 0x02, - 0x02, 0x08, 0x74, 0x97, 0x25, 0x8a, 0xc7, 0x3f, 0x7a, 0x54, 0x30, - 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, - 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x55, 0x53, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x0c, 0x0b, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, - 0x72, 0x75, 0x73, 0x74, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, - 0x04, 0x03, 0x0c, 0x17, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, - 0x72, 0x75, 0x73, 0x74, 0x20, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x75, - 0x6d, 0x20, 0x45, 0x43, 0x43, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, - 0x30, 0x31, 0x32, 0x39, 0x31, 0x34, 0x32, 0x30, 0x32, 0x34, 0x5a, - 0x17, 0x0d, 0x34, 0x30, 0x31, 0x32, 0x33, 0x31, 0x31, 0x34, 0x32, - 0x30, 0x32, 0x34, 0x5a, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0xb3, 0x57, 0x4d, 0x10, + 0x62, 0x4e, 0x3a, 0xe4, 0xac, 0xea, 0xb8, 0x1c, 0xaf, 0x32, 0x23, + 0xc8, 0xb3, 0x49, 0x5a, 0x51, 0x9c, 0x76, 0x28, 0x8d, 0x79, 0xaa, + 0x57, 0x46, 0x17, 0xd5, 0xf5, 0x52, 0xf6, 0xb7, 0x44, 0xe8, 0x08, + 0x44, 0xbf, 0x18, 0x84, 0xd2, 0x0b, 0x80, 0xcd, 0xc5, 0x12, 0xfd, + 0x00, 0x55, 0x05, 0x61, 0x87, 0x41, 0xdc, 0xb5, 0x24, 0x9e, 0x3c, + 0xc4, 0xd8, 0xc8, 0xfb, 0x70, 0x9e, 0x2f, 0x78, 0x96, 0x83, 0x20, + 0x36, 0xde, 0x7c, 0x0f, 0x69, 0x13, 0x88, 0xa5, 0x75, 0x36, 0x98, + 0x08, 0xa6, 0xc6, 0xdf, 0xac, 0xce, 0xe3, 0x58, 0xd6, 0xb7, 0x3e, + 0xde, 0xba, 0xf3, 0xeb, 0x34, 0x40, 0xd8, 0xa2, 0x81, 0xf5, 0x78, + 0x3f, 0x2f, 0xd5, 0xa5, 0xfc, 0xd9, 0xa2, 0xd4, 0x5e, 0x04, 0x0e, + 0x17, 0xad, 0xfe, 0x41, 0xf0, 0xe5, 0xb2, 0x72, 0xfa, 0x44, 0x82, + 0x33, 0x42, 0xe8, 0x2d, 0x58, 0xf7, 0x56, 0x8c, 0x62, 0x3f, 0xba, + 0x42, 0xb0, 0x9c, 0x0c, 0x5c, 0x7e, 0x2e, 0x65, 0x26, 0x5c, 0x53, + 0x4f, 0x00, 0xb2, 0x78, 0x7e, 0xa1, 0x0d, 0x99, 0x2d, 0x8d, 0xb8, + 0x1d, 0x8e, 0xa2, 0xc4, 0xb0, 0xfd, 0x60, 0xd0, 0x30, 0xa4, 0x8e, + 0xc8, 0x04, 0x62, 0xa9, 0xc4, 0xed, 0x35, 0xde, 0x7a, 0x97, 0xed, + 0x0e, 0x38, 0x5e, 0x92, 0x2f, 0x93, 0x70, 0xa5, 0xa9, 0x9c, 0x6f, + 0xa7, 0x7d, 0x13, 0x1d, 0x7e, 0xc6, 0x08, 0x48, 0xb1, 0x5e, 0x67, + 0xeb, 0x51, 0x08, 0x25, 0xe9, 0xe6, 0x25, 0x6b, 0x52, 0x29, 0x91, + 0x9c, 0xd2, 0x39, 0x73, 0x08, 0x57, 0xde, 0x99, 0x06, 0xb4, 0x5b, + 0x9d, 0x10, 0x06, 0xe1, 0xc2, 0x00, 0xa8, 0xb8, 0x1c, 0x4a, 0x02, + 0x0a, 0x14, 0xd0, 0xc1, 0x41, 0xca, 0xfb, 0x8c, 0x35, 0x21, 0x7d, + 0x82, 0x38, 0xf2, 0xa9, 0x54, 0x91, 0x19, 0x35, 0x93, 0x94, 0x6d, + 0x6a, 0x3a, 0xc5, 0xb2, 0xd0, 0xbb, 0x89, 0x86, 0x93, 0xe8, 0x9b, + 0xc9, 0x0f, 0x3a, 0xa7, 0x7a, 0xb8, 0xa1, 0xf0, 0x78, 0x46, 0xfa, + 0xfc, 0x37, 0x2f, 0xe5, 0x8a, 0x84, 0xf3, 0xdf, 0xfe, 0x04, 0xd9, + 0xa1, 0x68, 0xa0, 0x2f, 0x24, 0xe2, 0x09, 0x95, 0x06, 0xd5, 0x95, + 0xca, 0xe1, 0x24, 0x96, 0xeb, 0x7c, 0xf6, 0x93, 0x05, 0xbb, 0xed, + 0x73, 0xe9, 0x2d, 0xd1, 0x75, 0x39, 0xd7, 0xe7, 0x24, 0xdb, 0xd8, + 0x4e, 0x5f, 0x43, 0x8f, 0x9e, 0xd0, 0x14, 0x39, 0xbf, 0x55, 0x70, + 0x48, 0x99, 0x57, 0x31, 0xb4, 0x9c, 0xee, 0x4a, 0x98, 0x03, 0x96, + 0x30, 0x1f, 0x60, 0x06, 0xee, 0x1b, 0x23, 0xfe, 0x81, 0x60, 0x23, + 0x1a, 0x47, 0x62, 0x85, 0xa5, 0xcc, 0x19, 0x34, 0x80, 0x6f, 0xb3, + 0xac, 0x1a, 0xe3, 0x9f, 0xf0, 0x7b, 0x48, 0xad, 0xd5, 0x01, 0xd9, + 0x67, 0xb6, 0xa9, 0x72, 0x93, 0xea, 0x2d, 0x66, 0xb5, 0xb2, 0xb8, + 0xe4, 0x3d, 0x3c, 0xb2, 0xef, 0x4c, 0x8c, 0xea, 0xeb, 0x07, 0xbf, + 0xab, 0x35, 0x9a, 0x55, 0x86, 0xbc, 0x18, 0xa6, 0xb5, 0xa8, 0x5e, + 0xb4, 0x83, 0x6c, 0x6b, 0x69, 0x40, 0xd3, 0x9f, 0xdc, 0xf1, 0xc3, + 0x69, 0x6b, 0xb9, 0xe1, 0x6d, 0x09, 0xf4, 0xf1, 0xaa, 0x50, 0x76, + 0x0a, 0x7a, 0x7d, 0x7a, 0x17, 0xa1, 0x55, 0x96, 0x42, 0x99, 0x31, + 0x09, 0xdd, 0x60, 0x11, 0x8d, 0x05, 0x30, 0x7e, 0xe6, 0x8e, 0x46, + 0xd1, 0x9d, 0x14, 0xda, 0xc7, 0x17, 0xe4, 0x05, 0x96, 0x8c, 0xc4, + 0x24, 0xb5, 0x1b, 0xcf, 0x14, 0x07, 0xb2, 0x40, 0xf8, 0xa3, 0x9e, + 0x41, 0x86, 0xbc, 0x04, 0xd0, 0x6b, 0x96, 0xc8, 0x2a, 0x80, 0x34, + 0xfd, 0xbf, 0xef, 0x06, 0xa3, 0xdd, 0x58, 0xc5, 0x85, 0x3d, 0x3e, + 0x8f, 0xfe, 0x9e, 0x29, 0xe0, 0xb6, 0xb8, 0x09, 0x68, 0x19, 0x1c, + 0x18, 0x43, 0x30, 0x82, 0x01, 0xfe, 0x30, 0x82, 0x01, 0x85, 0xa0, + 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x74, 0x97, 0x25, 0x8a, 0xc7, + 0x3f, 0x7a, 0x54, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, + 0x3d, 0x04, 0x03, 0x03, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x17, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x50, 0x72, - 0x65, 0x6d, 0x69, 0x75, 0x6d, 0x20, 0x45, 0x43, 0x43, 0x30, 0x76, - 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, - 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, - 0x0d, 0x30, 0x5e, 0x1b, 0x15, 0x9d, 0x03, 0xd0, 0xa1, 0x79, 0x35, - 0xb7, 0x3a, 0x3c, 0x92, 0x7a, 0xca, 0x15, 0x1c, 0xcd, 0x62, 0xf3, - 0x9c, 0x26, 0x5c, 0x07, 0x3d, 0xe5, 0x54, 0xfa, 0xa3, 0xd6, 0xcc, - 0x12, 0xea, 0xf4, 0x14, 0x5f, 0xe8, 0x8e, 0x19, 0xab, 0x2f, 0x2e, - 0x48, 0xe6, 0xac, 0x18, 0x43, 0x78, 0xac, 0xd0, 0x37, 0xc3, 0xbd, - 0xb2, 0xcd, 0x2c, 0xe6, 0x47, 0xe2, 0x1a, 0xe6, 0x63, 0xb8, 0x3d, - 0x2e, 0x2f, 0x78, 0xc4, 0x4f, 0xdb, 0xf4, 0x0f, 0xa4, 0x68, 0x4c, - 0x55, 0x72, 0x6b, 0x95, 0x1d, 0x4e, 0x18, 0x42, 0x95, 0x78, 0xcc, - 0x37, 0x3c, 0x91, 0xe2, 0x9b, 0x65, 0x2b, 0x29, 0xa3, 0x42, 0x30, - 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, - 0x14, 0x9a, 0xaf, 0x29, 0x7a, 0xc0, 0x11, 0x35, 0x35, 0x26, 0x51, - 0x30, 0x00, 0xc3, 0x6a, 0xfe, 0x40, 0xd5, 0xae, 0xd6, 0x3c, 0x30, - 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, - 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, - 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, - 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, - 0x03, 0x67, 0x00, 0x30, 0x64, 0x02, 0x30, 0x17, 0x09, 0xf3, 0x87, - 0x88, 0x50, 0x5a, 0xaf, 0xc8, 0xc0, 0x42, 0xbf, 0x47, 0x5f, 0xf5, - 0x6c, 0x6a, 0x86, 0xe0, 0xc4, 0x27, 0x74, 0xe4, 0x38, 0x53, 0xd7, - 0x05, 0x7f, 0x1b, 0x34, 0xe3, 0xc6, 0x2f, 0xb3, 0xca, 0x09, 0x3c, - 0x37, 0x9d, 0xd7, 0xe7, 0xb8, 0x46, 0xf1, 0xfd, 0xa1, 0xe2, 0x71, - 0x02, 0x30, 0x42, 0x59, 0x87, 0x43, 0xd4, 0x51, 0xdf, 0xba, 0xd3, - 0x09, 0x32, 0x5a, 0xce, 0x88, 0x7e, 0x57, 0x3d, 0x9c, 0x5f, 0x42, - 0x6b, 0xf5, 0x07, 0x2d, 0xb5, 0xf0, 0x82, 0x93, 0xf9, 0x59, 0x6f, - 0xae, 0x64, 0xfa, 0x58, 0xe5, 0x8b, 0x1e, 0xe3, 0x63, 0xbe, 0xb5, - 0x81, 0xcd, 0x6f, 0x02, 0x8c, 0x79, 0x30, 0x82, 0x03, 0xbb, 0x30, - 0x82, 0x02, 0xa3, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x04, - 0x44, 0xc0, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x7e, 0x31, 0x0b, 0x30, - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x50, 0x4c, 0x31, - 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x19, 0x55, - 0x6e, 0x69, 0x7a, 0x65, 0x74, 0x6f, 0x20, 0x54, 0x65, 0x63, 0x68, - 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x20, 0x53, 0x2e, - 0x41, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, - 0x13, 0x1e, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, - 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x19, 0x43, - 0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, - 0x65, 0x64, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, - 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x31, 0x30, 0x32, - 0x32, 0x31, 0x32, 0x30, 0x37, 0x33, 0x37, 0x5a, 0x17, 0x0d, 0x32, - 0x39, 0x31, 0x32, 0x33, 0x31, 0x31, 0x32, 0x30, 0x37, 0x33, 0x37, - 0x5a, 0x30, 0x7e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x50, 0x4c, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x19, 0x55, 0x6e, 0x69, 0x7a, 0x65, 0x74, - 0x6f, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, - 0x69, 0x65, 0x73, 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x31, 0x27, 0x30, - 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1e, 0x43, 0x65, 0x72, - 0x74, 0x75, 0x6d, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x13, 0x19, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d, - 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x4e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, - 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, - 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xe3, 0xfb, 0x7d, - 0xa3, 0x72, 0xba, 0xc2, 0xf0, 0xc9, 0x14, 0x87, 0xf5, 0x6b, 0x01, - 0x4e, 0xe1, 0x6e, 0x40, 0x07, 0xba, 0x6d, 0x27, 0x5d, 0x7f, 0xf7, - 0x5b, 0x2d, 0xb3, 0x5a, 0xc7, 0x51, 0x5f, 0xab, 0xa4, 0x32, 0xa6, - 0x61, 0x87, 0xb6, 0x6e, 0x0f, 0x86, 0xd2, 0x30, 0x02, 0x97, 0xf8, - 0xd7, 0x69, 0x57, 0xa1, 0x18, 0x39, 0x5d, 0x6a, 0x64, 0x79, 0xc6, - 0x01, 0x59, 0xac, 0x3c, 0x31, 0x4a, 0x38, 0x7c, 0xd2, 0x04, 0xd2, - 0x4b, 0x28, 0xe8, 0x20, 0x5f, 0x3b, 0x07, 0xa2, 0xcc, 0x4d, 0x73, - 0xdb, 0xf3, 0xae, 0x4f, 0xc7, 0x56, 0xd5, 0x5a, 0xa7, 0x96, 0x89, - 0xfa, 0xf3, 0xab, 0x68, 0xd4, 0x23, 0x86, 0x59, 0x27, 0xcf, 0x09, - 0x27, 0xbc, 0xac, 0x6e, 0x72, 0x83, 0x1c, 0x30, 0x72, 0xdf, 0xe0, - 0xa2, 0xe9, 0xd2, 0xe1, 0x74, 0x75, 0x19, 0xbd, 0x2a, 0x9e, 0x7b, - 0x15, 0x54, 0x04, 0x1b, 0xd7, 0x43, 0x39, 0xad, 0x55, 0x28, 0xc5, - 0xe2, 0x1a, 0xbb, 0xf4, 0xc0, 0xe4, 0xae, 0x38, 0x49, 0x33, 0xcc, - 0x76, 0x85, 0x9f, 0x39, 0x45, 0xd2, 0xa4, 0x9e, 0xf2, 0x12, 0x8c, - 0x51, 0xf8, 0x7c, 0xe4, 0x2d, 0x7f, 0xf5, 0xac, 0x5f, 0xeb, 0x16, - 0x9f, 0xb1, 0x2d, 0xd1, 0xba, 0xcc, 0x91, 0x42, 0x77, 0x4c, 0x25, - 0xc9, 0x90, 0x38, 0x6f, 0xdb, 0xf0, 0xcc, 0xfb, 0x8e, 0x1e, 0x97, - 0x59, 0x3e, 0xd5, 0x60, 0x4e, 0xe6, 0x05, 0x28, 0xed, 0x49, 0x79, - 0x13, 0x4b, 0xba, 0x48, 0xdb, 0x2f, 0xf9, 0x72, 0xd3, 0x39, 0xca, - 0xfe, 0x1f, 0xd8, 0x34, 0x72, 0xf5, 0xb4, 0x40, 0xcf, 0x31, 0x01, - 0xc3, 0xec, 0xde, 0x11, 0x2d, 0x17, 0x5d, 0x1f, 0xb8, 0x50, 0xd1, - 0x5e, 0x19, 0xa7, 0x69, 0xde, 0x07, 0x33, 0x28, 0xca, 0x50, 0x95, - 0xf9, 0xa7, 0x54, 0xcb, 0x54, 0x86, 0x50, 0x45, 0xa9, 0xf9, 0x49, - 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, - 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, - 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, - 0x04, 0x16, 0x04, 0x14, 0x08, 0x76, 0xcd, 0xcb, 0x07, 0xff, 0x24, - 0xf6, 0xc5, 0xcd, 0xed, 0xbb, 0x90, 0xbc, 0xe2, 0x84, 0x37, 0x46, - 0x75, 0xf7, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, - 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, - 0x03, 0x82, 0x01, 0x01, 0x00, 0xa6, 0xa8, 0xad, 0x22, 0xce, 0x01, - 0x3d, 0xa6, 0xa3, 0xff, 0x62, 0xd0, 0x48, 0x9d, 0x8b, 0x5e, 0x72, - 0xb0, 0x78, 0x44, 0xe3, 0xdc, 0x1c, 0xaf, 0x09, 0xfd, 0x23, 0x48, - 0xfa, 0xbd, 0x2a, 0xc4, 0xb9, 0x55, 0x04, 0xb5, 0x10, 0xa3, 0x8d, - 0x27, 0xde, 0x0b, 0x82, 0x63, 0xd0, 0xee, 0xde, 0x0c, 0x37, 0x79, - 0x41, 0x5b, 0x22, 0xb2, 0xb0, 0x9a, 0x41, 0x5c, 0xa6, 0x70, 0xe0, - 0xd4, 0xd0, 0x77, 0xcb, 0x23, 0xd3, 0x00, 0xe0, 0x6c, 0x56, 0x2f, - 0xe1, 0x69, 0x0d, 0x0d, 0xd9, 0xaa, 0xbf, 0x21, 0x81, 0x50, 0xd9, - 0x06, 0xa5, 0xa8, 0xff, 0x95, 0x37, 0xd0, 0xaa, 0xfe, 0xe2, 0xb3, - 0xf5, 0x99, 0x2d, 0x45, 0x84, 0x8a, 0xe5, 0x42, 0x09, 0xd7, 0x74, - 0x02, 0x2f, 0xf7, 0x89, 0xd8, 0x99, 0xe9, 0xbc, 0x27, 0xd4, 0x47, - 0x8d, 0xba, 0x0d, 0x46, 0x1c, 0x77, 0xcf, 0x14, 0xa4, 0x1c, 0xb9, - 0xa4, 0x31, 0xc4, 0x9c, 0x28, 0x74, 0x03, 0x34, 0xff, 0x33, 0x19, - 0x26, 0xa5, 0xe9, 0x0d, 0x74, 0xb7, 0x3e, 0x97, 0xc6, 0x76, 0xe8, - 0x27, 0x96, 0xa3, 0x66, 0xdd, 0xe1, 0xae, 0xf2, 0x41, 0x5b, 0xca, - 0x98, 0x56, 0x83, 0x73, 0x70, 0xe4, 0x86, 0x1a, 0xd2, 0x31, 0x41, - 0xba, 0x2f, 0xbe, 0x2d, 0x13, 0x5a, 0x76, 0x6f, 0x4e, 0xe8, 0x4e, - 0x81, 0x0e, 0x3f, 0x5b, 0x03, 0x22, 0xa0, 0x12, 0xbe, 0x66, 0x58, - 0x11, 0x4a, 0xcb, 0x03, 0xc4, 0xb4, 0x2a, 0x2a, 0x2d, 0x96, 0x17, - 0xe0, 0x39, 0x54, 0xbc, 0x48, 0xd3, 0x76, 0x27, 0x9d, 0x9a, 0x2d, - 0x06, 0xa6, 0xc9, 0xec, 0x39, 0xd2, 0xab, 0xdb, 0x9f, 0x9a, 0x0b, - 0x27, 0x02, 0x35, 0x29, 0xb1, 0x40, 0x95, 0xe7, 0xf9, 0xe8, 0x9c, - 0x55, 0x88, 0x19, 0x46, 0xd6, 0xb7, 0x34, 0xf5, 0x7e, 0xce, 0x39, - 0x9a, 0xd9, 0x38, 0xf1, 0x51, 0xf7, 0x4f, 0x2c, 0x30, 0x82, 0x05, - 0x9c, 0x30, 0x82, 0x03, 0x84, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, - 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x63, 0x31, 0x0b, 0x30, - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x46, 0x52, 0x31, - 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x6e, 0x6f, 0x6d, 0x69, 0x73, 0x31, 0x17, - 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0e, 0x30, 0x30, - 0x30, 0x32, 0x20, 0x34, 0x33, 0x33, 0x39, 0x39, 0x38, 0x39, 0x30, - 0x33, 0x31, 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, - 0x1d, 0x43, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x6f, 0x6d, 0x69, 0x73, - 0x20, 0x2d, 0x20, 0x41, 0x75, 0x74, 0x6f, 0x72, 0x69, 0x74, 0xc3, - 0xa9, 0x20, 0x52, 0x61, 0x63, 0x69, 0x6e, 0x65, 0x30, 0x1e, 0x17, - 0x0d, 0x30, 0x38, 0x30, 0x39, 0x31, 0x37, 0x30, 0x38, 0x32, 0x38, - 0x35, 0x39, 0x5a, 0x17, 0x0d, 0x32, 0x38, 0x30, 0x39, 0x31, 0x37, - 0x30, 0x38, 0x32, 0x38, 0x35, 0x39, 0x5a, 0x30, 0x63, 0x31, 0x0b, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x46, 0x52, - 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, - 0x43, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x6f, 0x6d, 0x69, 0x73, 0x31, - 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0e, 0x30, - 0x30, 0x30, 0x32, 0x20, 0x34, 0x33, 0x33, 0x39, 0x39, 0x38, 0x39, - 0x30, 0x33, 0x31, 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x03, - 0x0c, 0x1d, 0x43, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x6f, 0x6d, 0x69, - 0x73, 0x20, 0x2d, 0x20, 0x41, 0x75, 0x74, 0x6f, 0x72, 0x69, 0x74, - 0xc3, 0xa9, 0x20, 0x52, 0x61, 0x63, 0x69, 0x6e, 0x65, 0x30, 0x82, - 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, - 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0x9d, 0x85, - 0x9f, 0x86, 0xd3, 0xe3, 0xaf, 0xc7, 0xb2, 0x6b, 0x6e, 0x33, 0xe0, - 0x9e, 0xb7, 0x42, 0x34, 0x55, 0x9d, 0xf9, 0x81, 0xbe, 0x63, 0xd8, - 0x23, 0x76, 0x0e, 0x97, 0x54, 0xcd, 0x99, 0x4c, 0x1a, 0xf1, 0x39, - 0xc7, 0x88, 0xd8, 0x17, 0x50, 0x0c, 0x9e, 0x61, 0xda, 0xc0, 0x4e, - 0x55, 0xde, 0xe7, 0x5a, 0xb8, 0x7a, 0x4e, 0x77, 0x87, 0x0d, 0xe5, - 0xb8, 0xeb, 0xfa, 0x9e, 0x5e, 0x7b, 0x1e, 0xc4, 0xcf, 0x28, 0x74, - 0xc7, 0x93, 0xf5, 0x14, 0xc6, 0x22, 0x28, 0x04, 0xf9, 0x91, 0xc3, - 0xab, 0x27, 0x73, 0x6a, 0x0e, 0x2e, 0x4d, 0xf3, 0x2e, 0x28, 0x1f, - 0x70, 0xdf, 0x55, 0x2f, 0x4e, 0xed, 0xc7, 0x71, 0x6f, 0x09, 0x72, - 0x2e, 0xed, 0xd5, 0x32, 0x97, 0xd0, 0xf1, 0x58, 0x77, 0xd1, 0x60, - 0xbc, 0x4e, 0x5e, 0xdb, 0x9a, 0x84, 0xf6, 0x47, 0x61, 0x45, 0x2b, - 0xf6, 0x50, 0xa6, 0x7f, 0x6a, 0x71, 0x27, 0x48, 0x84, 0x35, 0x9e, - 0xac, 0xfe, 0x69, 0xa9, 0x9e, 0x7a, 0x5e, 0x35, 0x25, 0xfa, 0xb4, - 0xa7, 0x49, 0x35, 0x77, 0x96, 0xa7, 0x36, 0x5b, 0xe1, 0xcd, 0xdf, - 0x23, 0x70, 0xd8, 0x5d, 0x4c, 0xa5, 0x08, 0x83, 0xf1, 0xa6, 0x24, - 0x38, 0x13, 0xa8, 0xec, 0x2f, 0xa8, 0xa1, 0x67, 0xc7, 0xa6, 0x2d, - 0x86, 0x47, 0xee, 0x8a, 0xfc, 0xec, 0x9b, 0x0e, 0x74, 0xf4, 0x2b, - 0x49, 0x02, 0x7b, 0x90, 0x75, 0x8c, 0xfc, 0x99, 0x39, 0x01, 0x39, - 0xd6, 0x4a, 0x89, 0xe5, 0x9e, 0x76, 0xab, 0x3e, 0x96, 0x28, 0x38, - 0x26, 0x8b, 0xdd, 0x8d, 0x8c, 0xc0, 0xf6, 0x01, 0x1e, 0x6f, 0xa5, - 0x31, 0x12, 0x38, 0x7d, 0x95, 0xc2, 0x71, 0xee, 0xed, 0x74, 0xae, - 0xe4, 0x36, 0xa2, 0x43, 0x75, 0xd5, 0xf1, 0x00, 0x9b, 0xe2, 0xe4, - 0xd7, 0xcc, 0x42, 0x03, 0x4b, 0x78, 0x7a, 0xe5, 0x7d, 0xbb, 0xb8, - 0xae, 0x2e, 0x20, 0x93, 0xd3, 0xe4, 0x61, 0xdf, 0x71, 0xe1, 0x76, - 0x67, 0x97, 0x3f, 0xb6, 0xdf, 0x6a, 0x73, 0x5a, 0x64, 0x22, 0xe5, - 0x42, 0xdb, 0xcf, 0x81, 0x03, 0x93, 0xd8, 0xf4, 0xe3, 0x10, 0xe0, - 0x72, 0xf6, 0x00, 0x70, 0xac, 0xf0, 0xc1, 0x7a, 0x0f, 0x05, 0x7f, - 0xcf, 0x34, 0x69, 0x45, 0xb5, 0x93, 0xe4, 0x19, 0xdb, 0x52, 0x16, - 0x23, 0x05, 0x89, 0x0e, 0x8d, 0x48, 0xe4, 0x25, 0x6f, 0xb3, 0x78, - 0xbf, 0x62, 0xf5, 0x07, 0xfa, 0x95, 0x24, 0xc2, 0x96, 0xb2, 0xe8, - 0xa3, 0x23, 0xc2, 0x5d, 0x03, 0xfc, 0xc3, 0xd3, 0xe5, 0x7c, 0xc9, - 0x75, 0x23, 0xd7, 0xf4, 0xf5, 0xbc, 0xde, 0xe4, 0xdf, 0xcd, 0x80, - 0xbf, 0x91, 0x88, 0x7d, 0xa7, 0x13, 0xb4, 0x39, 0xba, 0x2c, 0xba, - 0xbd, 0xd1, 0x6b, 0xcc, 0xf3, 0xa5, 0x28, 0xed, 0x44, 0x9e, 0x7d, - 0x52, 0xa3, 0x6f, 0x96, 0x2e, 0x19, 0x7e, 0x1c, 0xf3, 0x5b, 0xc7, - 0x16, 0x8e, 0xbb, 0x60, 0x7d, 0x77, 0x66, 0x47, 0x54, 0x82, 0x00, - 0x11, 0x60, 0x6c, 0x32, 0xc1, 0xa8, 0x38, 0x1b, 0xeb, 0x6e, 0x98, - 0x13, 0xd6, 0xee, 0x38, 0xf5, 0xf0, 0x9f, 0x0e, 0xef, 0xfe, 0x31, - 0x81, 0xc1, 0xd2, 0x24, 0x95, 0x2f, 0x53, 0x7a, 0x69, 0xa2, 0xf0, - 0x0f, 0x86, 0x45, 0x8e, 0x58, 0x82, 0x2b, 0x4c, 0x22, 0xd4, 0x5e, - 0xa0, 0xe7, 0x7d, 0x26, 0x27, 0x48, 0xdf, 0x25, 0x46, 0x8d, 0x4a, - 0x28, 0x7c, 0x86, 0x9e, 0xf9, 0x9b, 0x1a, 0x59, 0xb9, 0x65, 0xbf, - 0x05, 0xdd, 0xb6, 0x42, 0x5d, 0x3d, 0xe6, 0x00, 0x48, 0x82, 0x5e, - 0x20, 0xf7, 0x11, 0x82, 0xde, 0xca, 0xd8, 0x9f, 0xe6, 0x37, 0x47, - 0x26, 0x1e, 0xeb, 0x78, 0xf7, 0x61, 0xc3, 0x41, 0x64, 0x58, 0x02, - 0x41, 0xf9, 0xda, 0xe0, 0xd1, 0xf8, 0xf9, 0xe8, 0xfd, 0x52, 0x38, - 0xb6, 0xf5, 0x89, 0xdf, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x5b, - 0x30, 0x59, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, - 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, - 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, - 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, - 0x04, 0x14, 0x0d, 0x8c, 0xb6, 0x61, 0xda, 0x44, 0xb8, 0xd1, 0x14, - 0x7d, 0xc3, 0xbe, 0x7d, 0x5e, 0x48, 0xf0, 0xce, 0xca, 0x6a, 0xb0, - 0x30, 0x17, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x10, 0x30, 0x0e, - 0x30, 0x0c, 0x06, 0x0a, 0x2a, 0x81, 0x7a, 0x01, 0x56, 0x02, 0x02, - 0x00, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, - 0x00, 0x24, 0x3e, 0x60, 0x06, 0x7e, 0x1d, 0xef, 0x3a, 0x3e, 0xdb, - 0xea, 0xaf, 0x1c, 0x9a, 0x2c, 0x01, 0x0b, 0xf4, 0xc5, 0xb5, 0xd9, - 0x49, 0x31, 0xf4, 0x5d, 0x41, 0x8d, 0x89, 0x0c, 0x4e, 0xff, 0x6c, - 0xa2, 0xfd, 0xff, 0xe2, 0x06, 0xc8, 0x39, 0x9f, 0xf1, 0x5a, 0xa9, - 0xdd, 0x22, 0x58, 0x15, 0xa8, 0x8a, 0xd3, 0xb1, 0xe6, 0x32, 0x09, - 0x82, 0x03, 0x6c, 0xd7, 0x3f, 0x08, 0xc7, 0xf8, 0xb9, 0xba, 0x00, - 0x6d, 0xb9, 0xd6, 0xfc, 0x52, 0x32, 0x5d, 0xa4, 0x7f, 0xa4, 0x31, - 0x94, 0xbb, 0xb6, 0x4c, 0x38, 0x7f, 0x28, 0x30, 0x35, 0xff, 0x9f, - 0x23, 0x53, 0xb7, 0xb6, 0xee, 0x14, 0x70, 0x00, 0x40, 0x2b, 0xda, - 0x47, 0xab, 0x34, 0x7e, 0x5e, 0xa7, 0x56, 0x30, 0x61, 0x2b, 0x8b, - 0x43, 0xac, 0xfd, 0xb6, 0x88, 0x28, 0xf5, 0x6b, 0xb6, 0x3e, 0x60, - 0x4a, 0xba, 0x42, 0x90, 0x34, 0x67, 0x8d, 0xea, 0xeb, 0x5f, 0x45, - 0x54, 0x3b, 0x17, 0xac, 0x8b, 0xe4, 0xc6, 0x65, 0x0f, 0xee, 0xd0, - 0x8c, 0x5d, 0x66, 0x39, 0xce, 0x32, 0xa7, 0xd8, 0x10, 0x97, 0xc0, - 0x7e, 0x34, 0x9c, 0x9f, 0x94, 0xf3, 0xf6, 0x86, 0x1f, 0xcf, 0x1b, - 0x73, 0xad, 0x94, 0x79, 0x87, 0x68, 0x70, 0xc3, 0x33, 0xa5, 0x70, - 0xe7, 0xd8, 0xd5, 0x38, 0x94, 0x6f, 0x63, 0x79, 0xeb, 0xbf, 0x0a, - 0x0e, 0x08, 0xe7, 0xc5, 0x2f, 0x0f, 0x42, 0xa0, 0x2b, 0x14, 0x40, - 0xff, 0x21, 0xe0, 0x05, 0xc5, 0x27, 0xe1, 0x84, 0x11, 0x13, 0xba, - 0xd6, 0x86, 0x1d, 0x41, 0x0b, 0x13, 0x23, 0x89, 0xd3, 0xc9, 0x0b, - 0xe8, 0x8a, 0xba, 0x7a, 0xa3, 0xa3, 0x73, 0x37, 0x35, 0x80, 0x7d, - 0x12, 0xb8, 0x33, 0x77, 0x40, 0x38, 0xc0, 0xfa, 0x5e, 0x30, 0xd2, - 0xf2, 0xb6, 0xa3, 0xb1, 0xd6, 0xa2, 0x95, 0x97, 0x81, 0x9b, 0x52, - 0xed, 0x69, 0x4c, 0xff, 0x80, 0xe4, 0x53, 0xdb, 0x54, 0x5b, 0x03, - 0x6d, 0x54, 0x5f, 0xb1, 0xb8, 0xef, 0x24, 0xbd, 0x6f, 0x9f, 0x11, - 0xc3, 0xc7, 0x64, 0xc2, 0x0f, 0x28, 0x62, 0x85, 0x66, 0x5e, 0x1a, - 0x7b, 0xb2, 0xb7, 0xef, 0xae, 0x35, 0xc9, 0x19, 0x33, 0xa8, 0xb8, - 0x27, 0xdb, 0x33, 0x55, 0xbf, 0x68, 0xe1, 0x75, 0x48, 0x44, 0x56, - 0xfb, 0xcd, 0xd3, 0x48, 0xbb, 0x47, 0x89, 0x3a, 0xac, 0x69, 0xf5, - 0x80, 0xc6, 0xe4, 0x44, 0x50, 0x2f, 0x54, 0xc4, 0xaa, 0x43, 0xc5, - 0x31, 0x31, 0x58, 0xbd, 0x96, 0xc5, 0xea, 0x75, 0x6c, 0x9a, 0x75, - 0xb1, 0x4d, 0xf8, 0xf7, 0x97, 0xff, 0x96, 0x16, 0xf2, 0x97, 0x4d, - 0xe8, 0xf6, 0xf3, 0x11, 0xf9, 0x3a, 0x7d, 0x8a, 0x38, 0x6e, 0x04, - 0xcb, 0xe1, 0xd3, 0x45, 0x15, 0xaa, 0xa5, 0xd1, 0x1d, 0x9d, 0x5d, - 0x63, 0xe8, 0x24, 0xe6, 0x36, 0x14, 0xe2, 0x87, 0xad, 0x1b, 0x59, - 0xf5, 0x44, 0x9b, 0xfb, 0xd7, 0x77, 0x7c, 0x1f, 0x01, 0x70, 0x62, - 0xa1, 0x20, 0x1a, 0xa2, 0xc5, 0x1a, 0x28, 0xf4, 0x21, 0x03, 0xee, - 0x2e, 0xd9, 0xc1, 0x80, 0xea, 0xb9, 0xd9, 0x82, 0xd6, 0x5b, 0x76, - 0xc2, 0xcb, 0x3b, 0xb5, 0xd2, 0x00, 0xf0, 0xa3, 0x0e, 0xe1, 0xad, - 0x6e, 0x40, 0xf7, 0xdb, 0xa0, 0xb4, 0xd0, 0x46, 0xae, 0x15, 0xd7, - 0x44, 0xc2, 0x4d, 0x35, 0xf9, 0xd2, 0x0b, 0xf2, 0x17, 0xf6, 0xac, - 0x66, 0xd5, 0x24, 0xb2, 0x4f, 0xd1, 0x1c, 0x99, 0xc0, 0x6e, 0xf5, - 0x7d, 0xeb, 0x74, 0x04, 0xb8, 0xf9, 0x4d, 0x77, 0x09, 0xd7, 0xb4, - 0xcf, 0x07, 0x30, 0x09, 0xf1, 0xb8, 0x00, 0x56, 0xd9, 0x17, 0x16, - 0x16, 0x0a, 0x2b, 0x86, 0xdf, 0x8f, 0x01, 0x19, 0x1a, 0xe5, 0xbb, - 0x82, 0x63, 0xff, 0xbe, 0x0b, 0x76, 0x16, 0x5e, 0x37, 0x37, 0xe6, - 0xd8, 0x74, 0x97, 0xa2, 0x99, 0x45, 0x79, 0x30, 0x82, 0x06, 0x8b, - 0x30, 0x82, 0x05, 0x73, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04, - 0x3b, 0x45, 0xe5, 0x68, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x68, 0x31, - 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, - 0x53, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, - 0x16, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x69, 0x74, 0x61, - 0x74, 0x20, 0x56, 0x61, 0x6c, 0x65, 0x6e, 0x63, 0x69, 0x61, 0x6e, - 0x61, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, - 0x06, 0x50, 0x4b, 0x49, 0x47, 0x56, 0x41, 0x31, 0x27, 0x30, 0x25, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1e, 0x52, 0x6f, 0x6f, 0x74, - 0x20, 0x43, 0x41, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x69, 0x74, 0x61, 0x74, 0x20, 0x56, 0x61, 0x6c, 0x65, 0x6e, 0x63, - 0x69, 0x61, 0x6e, 0x61, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x31, 0x30, - 0x37, 0x30, 0x36, 0x31, 0x36, 0x32, 0x32, 0x34, 0x37, 0x5a, 0x17, - 0x0d, 0x32, 0x31, 0x30, 0x37, 0x30, 0x31, 0x31, 0x35, 0x32, 0x32, - 0x34, 0x37, 0x5a, 0x30, 0x68, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, - 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x1f, 0x30, 0x1d, - 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x16, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x6c, 0x69, 0x74, 0x61, 0x74, 0x20, 0x56, 0x61, 0x6c, - 0x65, 0x6e, 0x63, 0x69, 0x61, 0x6e, 0x61, 0x31, 0x0f, 0x30, 0x0d, - 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x06, 0x50, 0x4b, 0x49, 0x47, - 0x56, 0x41, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, - 0x13, 0x1e, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x69, 0x74, 0x61, 0x74, 0x20, - 0x56, 0x61, 0x6c, 0x65, 0x6e, 0x63, 0x69, 0x61, 0x6e, 0x61, 0x30, - 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, - 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xc6, - 0x2a, 0xab, 0x57, 0x11, 0x37, 0x2f, 0x22, 0x8a, 0xca, 0x03, 0x74, - 0x1d, 0xca, 0xed, 0x2d, 0xa2, 0x0b, 0xbc, 0x33, 0x52, 0x40, 0x26, - 0x47, 0xbe, 0x5a, 0x69, 0xa6, 0x3b, 0x72, 0x36, 0x17, 0x4c, 0xe8, - 0xdf, 0xb8, 0xbb, 0x2f, 0x76, 0xe1, 0x40, 0x46, 0x74, 0x65, 0x02, - 0x90, 0x52, 0x08, 0xb4, 0xff, 0xa8, 0x8c, 0xc1, 0xe0, 0xc7, 0x89, - 0x56, 0x10, 0x39, 0x33, 0xef, 0x68, 0xb4, 0x5f, 0x5f, 0xda, 0x6d, - 0x23, 0xa1, 0x89, 0x5e, 0x22, 0xa3, 0x4a, 0x06, 0xf0, 0x27, 0xf0, - 0x57, 0xb9, 0xf8, 0xe9, 0x4e, 0x32, 0x77, 0x0a, 0x3f, 0x41, 0x64, - 0xf3, 0xeb, 0x65, 0xee, 0x76, 0xfe, 0x54, 0xaa, 0x7d, 0x1d, 0x20, - 0xae, 0xf3, 0xd7, 0x74, 0xc2, 0x0a, 0x5f, 0xf5, 0x08, 0x28, 0x52, - 0x08, 0xcc, 0x55, 0x5d, 0xd2, 0x0f, 0xdb, 0x9a, 0x81, 0xa5, 0xbb, - 0xa1, 0xb3, 0xc1, 0x94, 0xcd, 0x54, 0xe0, 0x32, 0x75, 0x31, 0x91, - 0x1a, 0x62, 0xb2, 0xde, 0x75, 0xe2, 0xcf, 0x4f, 0x89, 0xd9, 0x91, - 0x90, 0x0f, 0x41, 0x1b, 0xb4, 0x5a, 0x4a, 0x77, 0xbd, 0x67, 0x83, - 0xe0, 0x93, 0xe7, 0x5e, 0xa7, 0x0c, 0xe7, 0x81, 0xd3, 0xf4, 0x52, - 0xac, 0x53, 0xb2, 0x03, 0xc7, 0x44, 0x26, 0xfb, 0x79, 0xe5, 0xcb, - 0x34, 0x60, 0x50, 0x10, 0x7b, 0x1b, 0xdb, 0x6b, 0xd7, 0x47, 0xab, - 0x5f, 0x7c, 0x68, 0xca, 0x6e, 0x9d, 0x41, 0x03, 0x10, 0xee, 0x6b, - 0x99, 0x7b, 0x5e, 0x25, 0xa8, 0xc2, 0xab, 0xe4, 0xc0, 0xf3, 0x5c, - 0x9c, 0xe3, 0xbe, 0xce, 0x31, 0x4c, 0x64, 0x1e, 0x5e, 0x80, 0xa2, - 0xf5, 0x83, 0x7e, 0x0c, 0xd6, 0xca, 0x8c, 0x55, 0x8e, 0xbe, 0xe0, - 0xbe, 0x49, 0x07, 0x0f, 0xa3, 0x24, 0x41, 0x7a, 0x58, 0x1d, 0x84, - 0xea, 0x58, 0x12, 0xc8, 0xe1, 0xb7, 0xed, 0xef, 0x93, 0xde, 0x94, - 0x08, 0x31, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x03, 0x3b, - 0x30, 0x82, 0x03, 0x37, 0x30, 0x32, 0x06, 0x08, 0x2b, 0x06, 0x01, - 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x26, 0x30, 0x24, 0x30, 0x22, - 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, - 0x16, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6f, 0x63, 0x73, - 0x70, 0x2e, 0x70, 0x6b, 0x69, 0x2e, 0x67, 0x76, 0x61, 0x2e, 0x65, - 0x73, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, - 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x02, 0x30, - 0x82, 0x02, 0x34, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x82, 0x02, - 0x2b, 0x30, 0x82, 0x02, 0x27, 0x30, 0x82, 0x02, 0x23, 0x06, 0x0a, - 0x2b, 0x06, 0x01, 0x04, 0x01, 0xbf, 0x55, 0x02, 0x01, 0x00, 0x30, - 0x82, 0x02, 0x13, 0x30, 0x82, 0x01, 0xe8, 0x06, 0x08, 0x2b, 0x06, - 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, 0x30, 0x82, 0x01, 0xda, 0x1e, - 0x82, 0x01, 0xd6, 0x00, 0x41, 0x00, 0x75, 0x00, 0x74, 0x00, 0x6f, - 0x00, 0x72, 0x00, 0x69, 0x00, 0x64, 0x00, 0x61, 0x00, 0x64, 0x00, - 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x00, 0x43, 0x00, 0x65, - 0x00, 0x72, 0x00, 0x74, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, - 0x63, 0x00, 0x61, 0x00, 0x63, 0x00, 0x69, 0x00, 0xf3, 0x00, 0x6e, - 0x00, 0x20, 0x00, 0x52, 0x00, 0x61, 0x00, 0xed, 0x00, 0x7a, 0x00, - 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x61, - 0x00, 0x20, 0x00, 0x47, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x65, 0x00, - 0x72, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x74, 0x00, 0x61, - 0x00, 0x74, 0x00, 0x20, 0x00, 0x56, 0x00, 0x61, 0x00, 0x6c, 0x00, - 0x65, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6e, - 0x00, 0x61, 0x00, 0x2e, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x4c, 0x00, - 0x61, 0x00, 0x20, 0x00, 0x44, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6c, - 0x00, 0x61, 0x00, 0x72, 0x00, 0x61, 0x00, 0x63, 0x00, 0x69, 0x00, - 0xf3, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, - 0x00, 0x50, 0x00, 0x72, 0x00, 0xe1, 0x00, 0x63, 0x00, 0x74, 0x00, - 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x73, 0x00, 0x20, 0x00, 0x64, - 0x00, 0x65, 0x00, 0x20, 0x00, 0x43, 0x00, 0x65, 0x00, 0x72, 0x00, - 0x74, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, - 0x00, 0x63, 0x00, 0x69, 0x00, 0xf3, 0x00, 0x6e, 0x00, 0x20, 0x00, - 0x71, 0x00, 0x75, 0x00, 0x65, 0x00, 0x20, 0x00, 0x72, 0x00, 0x69, - 0x00, 0x67, 0x00, 0x65, 0x00, 0x20, 0x00, 0x65, 0x00, 0x6c, 0x00, - 0x20, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x69, - 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x69, 0x00, - 0x65, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x64, - 0x00, 0x65, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x20, 0x00, - 0x70, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6e, - 0x00, 0x74, 0x00, 0x65, 0x00, 0x20, 0x00, 0x41, 0x00, 0x75, 0x00, - 0x74, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x69, 0x00, 0x64, 0x00, 0x61, - 0x00, 0x64, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x00, - 0x43, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x69, 0x00, 0x66, - 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x63, 0x00, 0x69, 0x00, - 0xf3, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x73, 0x00, 0x65, 0x00, 0x20, - 0x00, 0x65, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x75, 0x00, 0x65, 0x00, - 0x6e, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, 0x20, 0x00, 0x65, - 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x20, 0x00, - 0x64, 0x00, 0x69, 0x00, 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x63, - 0x00, 0x69, 0x00, 0xf3, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x77, 0x00, - 0x65, 0x00, 0x62, 0x00, 0x20, 0x00, 0x68, 0x00, 0x74, 0x00, 0x74, - 0x00, 0x70, 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x77, 0x00, - 0x77, 0x00, 0x77, 0x00, 0x2e, 0x00, 0x70, 0x00, 0x6b, 0x00, 0x69, - 0x00, 0x2e, 0x00, 0x67, 0x00, 0x76, 0x00, 0x61, 0x00, 0x2e, 0x00, - 0x65, 0x00, 0x73, 0x00, 0x2f, 0x00, 0x63, 0x00, 0x70, 0x00, 0x73, - 0x30, 0x25, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, - 0x01, 0x16, 0x19, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, - 0x77, 0x77, 0x2e, 0x70, 0x6b, 0x69, 0x2e, 0x67, 0x76, 0x61, 0x2e, - 0x65, 0x73, 0x2f, 0x63, 0x70, 0x73, 0x30, 0x1d, 0x06, 0x03, 0x55, - 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x7b, 0x35, 0xd3, 0x40, 0xd2, - 0x1c, 0x78, 0x19, 0x66, 0xef, 0x74, 0x10, 0x28, 0xdc, 0x3e, 0x4f, - 0xb2, 0x78, 0x04, 0xfc, 0x30, 0x81, 0x95, 0x06, 0x03, 0x55, 0x1d, - 0x23, 0x04, 0x81, 0x8d, 0x30, 0x81, 0x8a, 0x80, 0x14, 0x7b, 0x35, - 0xd3, 0x40, 0xd2, 0x1c, 0x78, 0x19, 0x66, 0xef, 0x74, 0x10, 0x28, - 0xdc, 0x3e, 0x4f, 0xb2, 0x78, 0x04, 0xfc, 0xa1, 0x6c, 0xa4, 0x6a, - 0x30, 0x68, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x45, 0x53, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x13, 0x16, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x69, 0x74, 0x61, 0x74, 0x20, 0x56, 0x61, 0x6c, 0x65, 0x6e, 0x63, - 0x69, 0x61, 0x6e, 0x61, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, - 0x04, 0x0b, 0x13, 0x06, 0x50, 0x4b, 0x49, 0x47, 0x56, 0x41, 0x31, - 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1e, 0x52, - 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x6c, 0x69, 0x74, 0x61, 0x74, 0x20, 0x56, 0x61, 0x6c, - 0x65, 0x6e, 0x63, 0x69, 0x61, 0x6e, 0x61, 0x82, 0x04, 0x3b, 0x45, - 0xe5, 0x68, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, - 0x24, 0x61, 0x4e, 0xf5, 0xb5, 0xc8, 0x42, 0x02, 0x2a, 0xb3, 0x5c, - 0x75, 0xad, 0xc5, 0x6d, 0xca, 0xe7, 0x94, 0x3f, 0xa5, 0x68, 0x95, - 0x88, 0xc1, 0x54, 0xc0, 0x10, 0x69, 0xa2, 0x12, 0x2f, 0x18, 0x3f, - 0x25, 0x50, 0xa8, 0x7c, 0x4a, 0xea, 0xc6, 0x09, 0xd9, 0xf4, 0x75, - 0xc6, 0x40, 0xda, 0xaf, 0x50, 0x9d, 0x3d, 0xa5, 0x16, 0xbb, 0x6d, - 0x31, 0xc6, 0xc7, 0x73, 0x0a, 0x48, 0xfe, 0x20, 0x72, 0xed, 0x6f, - 0xcc, 0xe8, 0x83, 0x61, 0x16, 0x46, 0x90, 0x01, 0x95, 0x4b, 0x7d, - 0x8e, 0x9a, 0x52, 0x09, 0x2f, 0xf6, 0x6f, 0x1c, 0xe4, 0xa1, 0x71, - 0xcf, 0x8c, 0x2a, 0x5a, 0x17, 0x73, 0x83, 0x47, 0x4d, 0x0f, 0x36, - 0xfb, 0x04, 0x4d, 0x49, 0x51, 0xe2, 0x14, 0xc9, 0x64, 0x61, 0xfb, - 0xd4, 0x14, 0xe0, 0xf4, 0x9e, 0xb7, 0x34, 0x8f, 0x0a, 0x26, 0xbd, - 0x97, 0x5c, 0xf4, 0x79, 0x3a, 0x4a, 0x30, 0x19, 0xcc, 0xad, 0x4f, - 0xa0, 0x98, 0x8a, 0xb4, 0x31, 0x97, 0x2a, 0xe2, 0x73, 0x6d, 0x7e, - 0x78, 0xb8, 0xf8, 0x88, 0x89, 0x4f, 0xb1, 0x22, 0x91, 0x64, 0x4b, - 0xf5, 0x50, 0xde, 0x03, 0xdb, 0xe5, 0xc5, 0x76, 0xe7, 0x13, 0x66, - 0x75, 0x7e, 0x65, 0xfb, 0x01, 0x9f, 0x93, 0x87, 0x88, 0x9d, 0xf9, - 0x46, 0x57, 0x7c, 0x4d, 0x60, 0xaf, 0x98, 0x73, 0x13, 0x23, 0xa4, - 0x20, 0x91, 0x81, 0xfa, 0xd0, 0x61, 0x66, 0xb8, 0x7d, 0xd1, 0xaf, - 0xd6, 0x6f, 0x1e, 0x6c, 0x3d, 0xe9, 0x11, 0xfd, 0xa9, 0xf9, 0x82, - 0x22, 0x86, 0x99, 0x33, 0x71, 0x5a, 0xea, 0x19, 0x57, 0x3d, 0x91, - 0xcd, 0xa9, 0xc0, 0xa3, 0x6e, 0x07, 0x13, 0xa6, 0xc9, 0xed, 0xf8, - 0x68, 0xa3, 0x9e, 0xc3, 0x5a, 0x72, 0x09, 0x87, 0x28, 0xd1, 0xc4, - 0x73, 0xc4, 0x73, 0x18, 0x5f, 0x50, 0x75, 0x16, 0x31, 0x9f, 0xb7, - 0xe8, 0x7c, 0xc3, 0x30, 0x82, 0x03, 0xcf, 0x30, 0x82, 0x02, 0xb7, - 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x01, 0x6c, 0x1e, 0x30, - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x05, 0x05, 0x00, 0x30, 0x81, 0x8d, 0x31, 0x0b, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x41, 0x54, 0x31, 0x48, 0x30, - 0x46, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x3f, 0x41, 0x2d, 0x54, - 0x72, 0x75, 0x73, 0x74, 0x20, 0x47, 0x65, 0x73, 0x2e, 0x20, 0x66, - 0x2e, 0x20, 0x53, 0x69, 0x63, 0x68, 0x65, 0x72, 0x68, 0x65, 0x69, - 0x74, 0x73, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x65, 0x20, 0x69, - 0x6d, 0x20, 0x65, 0x6c, 0x65, 0x6b, 0x74, 0x72, 0x2e, 0x20, 0x44, - 0x61, 0x74, 0x65, 0x6e, 0x76, 0x65, 0x72, 0x6b, 0x65, 0x68, 0x72, - 0x20, 0x47, 0x6d, 0x62, 0x48, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, - 0x55, 0x04, 0x0b, 0x0c, 0x10, 0x41, 0x2d, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x2d, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x2d, 0x30, 0x33, 0x31, - 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x10, 0x41, - 0x2d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x2d, 0x6e, 0x51, 0x75, 0x61, - 0x6c, 0x2d, 0x30, 0x33, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x35, 0x30, - 0x38, 0x31, 0x37, 0x32, 0x32, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, - 0x0d, 0x31, 0x35, 0x30, 0x38, 0x31, 0x37, 0x32, 0x32, 0x30, 0x30, - 0x30, 0x30, 0x5a, 0x30, 0x81, 0x8d, 0x31, 0x0b, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x41, 0x54, 0x31, 0x48, 0x30, - 0x46, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x3f, 0x41, 0x2d, 0x54, - 0x72, 0x75, 0x73, 0x74, 0x20, 0x47, 0x65, 0x73, 0x2e, 0x20, 0x66, - 0x2e, 0x20, 0x53, 0x69, 0x63, 0x68, 0x65, 0x72, 0x68, 0x65, 0x69, - 0x74, 0x73, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x65, 0x20, 0x69, - 0x6d, 0x20, 0x65, 0x6c, 0x65, 0x6b, 0x74, 0x72, 0x2e, 0x20, 0x44, - 0x61, 0x74, 0x65, 0x6e, 0x76, 0x65, 0x72, 0x6b, 0x65, 0x68, 0x72, - 0x20, 0x47, 0x6d, 0x62, 0x48, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, - 0x55, 0x04, 0x0b, 0x0c, 0x10, 0x41, 0x2d, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x2d, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x2d, 0x30, 0x33, 0x31, - 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x10, 0x41, - 0x2d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x2d, 0x6e, 0x51, 0x75, 0x61, - 0x6c, 0x2d, 0x30, 0x33, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, - 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, - 0x82, 0x01, 0x01, 0x00, 0xad, 0x3d, 0x61, 0x6e, 0x03, 0xf3, 0x90, - 0x3b, 0xc0, 0x41, 0x0b, 0x84, 0x80, 0xcd, 0xec, 0x2a, 0xa3, 0x9d, - 0x6b, 0xbb, 0x6e, 0xc2, 0x42, 0x84, 0xf7, 0x51, 0x14, 0xe1, 0xa0, - 0xa8, 0x2d, 0x51, 0xa3, 0x51, 0xf2, 0xde, 0x23, 0xf0, 0x34, 0x44, - 0xff, 0x94, 0xeb, 0xcc, 0x05, 0x23, 0x95, 0x40, 0xb9, 0x07, 0x78, - 0xa5, 0x25, 0xf6, 0x0a, 0xbd, 0x45, 0x86, 0xe8, 0xd9, 0xbd, 0xc0, - 0x04, 0x8e, 0x85, 0x44, 0x61, 0xef, 0x7f, 0xa7, 0xc9, 0xfa, 0xc1, - 0x25, 0xcc, 0x85, 0x2c, 0x63, 0x3f, 0x05, 0x60, 0x73, 0x49, 0x05, - 0xe0, 0x60, 0x78, 0x95, 0x10, 0x4b, 0xdc, 0xf9, 0x11, 0x59, 0xce, - 0x71, 0x7f, 0x40, 0x9b, 0x8a, 0xaa, 0x24, 0xdf, 0x0b, 0x42, 0xe2, - 0xdb, 0x56, 0xbc, 0x4a, 0xd2, 0xa5, 0x0c, 0x9b, 0xb7, 0x43, 0x3e, - 0xdd, 0x83, 0xd3, 0x26, 0x10, 0x02, 0xcf, 0xea, 0x23, 0xc4, 0x49, - 0x4e, 0xe5, 0xd3, 0xe9, 0xb4, 0x88, 0xab, 0x0c, 0xae, 0x62, 0x92, - 0xd4, 0x65, 0x87, 0xd9, 0x6a, 0xd7, 0xf4, 0x85, 0x9f, 0xe4, 0x33, - 0x22, 0x25, 0xa5, 0xe5, 0xc8, 0x33, 0xba, 0xc3, 0xc7, 0x41, 0xdc, - 0x5f, 0xc6, 0x6a, 0xcc, 0x00, 0x0e, 0x6d, 0x32, 0xa8, 0xb6, 0x87, - 0x36, 0x00, 0x62, 0x77, 0x9b, 0x1e, 0x1f, 0x34, 0xcb, 0x90, 0x3c, - 0x78, 0x88, 0x74, 0x05, 0xeb, 0x79, 0xf5, 0x93, 0x71, 0x65, 0xca, - 0x9d, 0xc7, 0x6b, 0x18, 0x2d, 0x3d, 0x5c, 0x4e, 0xe7, 0xd5, 0xf8, - 0x3f, 0x31, 0x7d, 0x8f, 0x87, 0xec, 0x0a, 0x22, 0x2f, 0x23, 0xe9, - 0xfe, 0xbb, 0x7d, 0xc9, 0xe0, 0xf4, 0xec, 0xeb, 0x7c, 0xc4, 0xb0, - 0xc3, 0x2d, 0x62, 0xb5, 0x9a, 0x71, 0xd6, 0xb1, 0x6a, 0xe8, 0xec, - 0xd9, 0xed, 0xd5, 0x72, 0xec, 0xbe, 0x57, 0x01, 0xce, 0x05, 0x55, - 0x9f, 0xde, 0xd1, 0x60, 0x88, 0x10, 0xb3, 0x02, 0x03, 0x01, 0x00, - 0x01, 0xa3, 0x36, 0x30, 0x34, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, - 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, - 0x30, 0x11, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x0a, 0x04, 0x08, - 0x44, 0x6a, 0x95, 0x67, 0x55, 0x79, 0x11, 0x4f, 0x30, 0x0e, 0x06, - 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, - 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, - 0x55, 0xd4, 0x54, 0xd1, 0x59, 0x48, 0x5c, 0xb3, 0x93, 0x85, 0xaa, - 0xbf, 0x63, 0x2f, 0xe4, 0x80, 0xce, 0x34, 0xa3, 0x34, 0x62, 0x3e, - 0xf6, 0xd8, 0xee, 0x67, 0x88, 0x31, 0x04, 0x03, 0x6f, 0x0b, 0xd4, - 0x07, 0xfb, 0x4e, 0x75, 0x0f, 0xd3, 0x2e, 0xd3, 0xc0, 0x17, 0xc7, - 0xc6, 0x28, 0xec, 0x06, 0x0d, 0x11, 0x24, 0x0e, 0x0e, 0xa5, 0x5d, - 0xbf, 0x8c, 0xb2, 0x13, 0x96, 0x71, 0xdc, 0xd4, 0xce, 0x0e, 0x0d, - 0x0a, 0x68, 0x32, 0x6c, 0xb9, 0x41, 0x31, 0x19, 0xab, 0xb1, 0x07, - 0x7b, 0x4d, 0x98, 0xd3, 0x5c, 0xb0, 0xd1, 0xf0, 0xa7, 0x42, 0xa0, - 0xb5, 0xc4, 0x8e, 0xaf, 0xfe, 0xf1, 0x3f, 0xf4, 0xef, 0x4f, 0x46, - 0x00, 0x76, 0xeb, 0x02, 0xfb, 0xf9, 0x9d, 0xd2, 0x40, 0x96, 0xc7, - 0x88, 0x3a, 0xb8, 0x9f, 0x11, 0x79, 0xf3, 0x80, 0x65, 0xa8, 0xbd, - 0x1f, 0xd3, 0x78, 0x81, 0xa0, 0x51, 0x4c, 0x37, 0xb4, 0xa6, 0x5d, - 0x25, 0x70, 0xd1, 0x66, 0xc9, 0x68, 0xf9, 0x2e, 0x11, 0x14, 0x68, - 0xf1, 0x54, 0x98, 0x08, 0xac, 0x26, 0x92, 0x0f, 0xde, 0x89, 0x9e, - 0xd4, 0xfa, 0xb3, 0x79, 0x2b, 0xd2, 0xa3, 0x79, 0xd4, 0xec, 0x8b, - 0xac, 0x87, 0x53, 0x68, 0x42, 0x4c, 0x51, 0x51, 0x74, 0x1e, 0x1b, - 0x27, 0x2e, 0xe3, 0xf5, 0x1f, 0x29, 0x74, 0x4d, 0xed, 0xaf, 0xf7, - 0xe1, 0x92, 0x99, 0x81, 0xe8, 0xbe, 0x3a, 0xc7, 0x17, 0x50, 0xf6, - 0xb7, 0xc6, 0xfc, 0x9b, 0xb0, 0x8a, 0x6b, 0xd6, 0x88, 0x03, 0x91, - 0x8f, 0x06, 0x77, 0x3a, 0x85, 0x02, 0xdd, 0x98, 0xd5, 0x43, 0x78, - 0x3f, 0xc6, 0x30, 0x15, 0xac, 0x9b, 0x6b, 0xcb, 0x57, 0xb7, 0x89, - 0x51, 0x8b, 0x3a, 0xe8, 0xc9, 0x84, 0x0c, 0xdb, 0xb1, 0x50, 0x20, - 0x0a, 0x1a, 0x4a, 0xba, 0x6a, 0x1a, 0xbd, 0xec, 0x1b, 0xc8, 0xc5, - 0x84, 0x9a, 0xcd, 0x30, 0x82, 0x03, 0x7b, 0x30, 0x82, 0x02, 0x63, - 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, - 0x00, 0x30, 0x5f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x54, 0x57, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x0c, 0x09, 0x54, 0x41, 0x49, 0x57, 0x41, 0x4e, - 0x2d, 0x43, 0x41, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, - 0x0b, 0x0c, 0x07, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x31, - 0x2a, 0x30, 0x28, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x21, 0x54, - 0x57, 0x43, 0x41, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, - 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x30, 0x38, 0x32, 0x38, 0x30, 0x37, - 0x32, 0x34, 0x33, 0x33, 0x5a, 0x17, 0x0d, 0x33, 0x30, 0x31, 0x32, - 0x33, 0x31, 0x31, 0x35, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x5f, - 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x54, 0x57, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x0c, 0x09, 0x54, 0x41, 0x49, 0x57, 0x41, 0x4e, 0x2d, 0x43, 0x41, - 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x07, - 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x31, 0x2a, 0x30, 0x28, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x21, 0x54, 0x57, 0x43, 0x41, - 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, 0x22, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, - 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb0, 0x7e, 0x72, 0xb8, - 0xa4, 0x03, 0x94, 0xe6, 0xa7, 0xde, 0x09, 0x38, 0x91, 0x4a, 0x11, - 0x40, 0x87, 0xa7, 0x7c, 0x59, 0x64, 0x14, 0x7b, 0xb5, 0x11, 0x10, - 0xdd, 0xfe, 0xbf, 0xd5, 0xc0, 0xbb, 0x56, 0xe2, 0x85, 0x25, 0xf4, - 0x35, 0x72, 0x0f, 0xf8, 0x53, 0xd0, 0x41, 0xe1, 0x44, 0x01, 0xc2, - 0xb4, 0x1c, 0xc3, 0x31, 0x42, 0x16, 0x47, 0x85, 0x33, 0x22, 0x76, - 0xb2, 0x0a, 0x6f, 0x0f, 0xe5, 0x25, 0x50, 0x4f, 0x85, 0x86, 0xbe, - 0xbf, 0x98, 0x2e, 0x10, 0x67, 0x1e, 0xbe, 0x11, 0x05, 0x86, 0x05, - 0x90, 0xc4, 0x59, 0xd0, 0x7c, 0x78, 0x10, 0xb0, 0x80, 0x5c, 0xb7, - 0xe1, 0xc7, 0x2b, 0x75, 0xcb, 0x7c, 0x9f, 0xae, 0xb5, 0xd1, 0x9d, - 0x23, 0x37, 0x63, 0xa7, 0xdc, 0x42, 0xa2, 0x2d, 0x92, 0x04, 0x1b, - 0x50, 0xc1, 0x7b, 0xb8, 0x3e, 0x1b, 0xc9, 0x56, 0x04, 0x8b, 0x2f, - 0x52, 0x9b, 0xad, 0xa9, 0x56, 0xe9, 0xc1, 0xff, 0xad, 0xa9, 0x58, - 0x87, 0x30, 0xb6, 0x81, 0xf7, 0x97, 0x45, 0xfc, 0x19, 0x57, 0x3b, - 0x2b, 0x6f, 0xe4, 0x47, 0xf4, 0x99, 0x45, 0xfe, 0x1d, 0xf1, 0xf8, - 0x97, 0xa3, 0x88, 0x1d, 0x37, 0x1c, 0x5c, 0x8f, 0xe0, 0x76, 0x25, - 0x9a, 0x50, 0xf8, 0xa0, 0x54, 0xff, 0x44, 0x90, 0x76, 0x23, 0xd2, - 0x32, 0xc6, 0xc3, 0xab, 0x06, 0xbf, 0xfc, 0xfb, 0xbf, 0xf3, 0xad, - 0x7d, 0x92, 0x62, 0x02, 0x5b, 0x29, 0xd3, 0x35, 0xa3, 0x93, 0x9a, - 0x43, 0x64, 0x60, 0x5d, 0xb2, 0xfa, 0x32, 0xff, 0x3b, 0x04, 0xaf, - 0x4d, 0x40, 0x6a, 0xf9, 0xc7, 0xe3, 0xef, 0x23, 0xfd, 0x6b, 0xcb, - 0xe5, 0x0f, 0x8b, 0x38, 0x0d, 0xee, 0x0a, 0xfc, 0xfe, 0x0f, 0x98, - 0x9f, 0x30, 0x31, 0xdd, 0x6c, 0x52, 0x65, 0xf9, 0x8b, 0x81, 0xbe, - 0x22, 0xe1, 0x1c, 0x58, 0x03, 0xba, 0x91, 0x1b, 0x89, 0x07, 0x02, - 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0e, 0x06, - 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, - 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, + 0x65, 0x6d, 0x69, 0x75, 0x6d, 0x20, 0x45, 0x43, 0x43, 0x30, 0x1e, + 0x17, 0x0d, 0x31, 0x30, 0x30, 0x31, 0x32, 0x39, 0x31, 0x34, 0x32, + 0x30, 0x32, 0x34, 0x5a, 0x17, 0x0d, 0x34, 0x30, 0x31, 0x32, 0x33, + 0x31, 0x31, 0x34, 0x32, 0x30, 0x32, 0x34, 0x5a, 0x30, 0x45, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, + 0x53, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, + 0x0b, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, + 0x17, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x20, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x75, 0x6d, 0x20, 0x45, + 0x43, 0x43, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, + 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, + 0x03, 0x62, 0x00, 0x04, 0x0d, 0x30, 0x5e, 0x1b, 0x15, 0x9d, 0x03, + 0xd0, 0xa1, 0x79, 0x35, 0xb7, 0x3a, 0x3c, 0x92, 0x7a, 0xca, 0x15, + 0x1c, 0xcd, 0x62, 0xf3, 0x9c, 0x26, 0x5c, 0x07, 0x3d, 0xe5, 0x54, + 0xfa, 0xa3, 0xd6, 0xcc, 0x12, 0xea, 0xf4, 0x14, 0x5f, 0xe8, 0x8e, + 0x19, 0xab, 0x2f, 0x2e, 0x48, 0xe6, 0xac, 0x18, 0x43, 0x78, 0xac, + 0xd0, 0x37, 0xc3, 0xbd, 0xb2, 0xcd, 0x2c, 0xe6, 0x47, 0xe2, 0x1a, + 0xe6, 0x63, 0xb8, 0x3d, 0x2e, 0x2f, 0x78, 0xc4, 0x4f, 0xdb, 0xf4, + 0x0f, 0xa4, 0x68, 0x4c, 0x55, 0x72, 0x6b, 0x95, 0x1d, 0x4e, 0x18, + 0x42, 0x95, 0x78, 0xcc, 0x37, 0x3c, 0x91, 0xe2, 0x9b, 0x65, 0x2b, + 0x29, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, + 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9a, 0xaf, 0x29, 0x7a, 0xc0, 0x11, + 0x35, 0x35, 0x26, 0x51, 0x30, 0x00, 0xc3, 0x6a, 0xfe, 0x40, 0xd5, + 0xae, 0xd6, 0x3c, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, + 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, + 0x02, 0x01, 0x06, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, + 0x3d, 0x04, 0x03, 0x03, 0x03, 0x67, 0x00, 0x30, 0x64, 0x02, 0x30, + 0x17, 0x09, 0xf3, 0x87, 0x88, 0x50, 0x5a, 0xaf, 0xc8, 0xc0, 0x42, + 0xbf, 0x47, 0x5f, 0xf5, 0x6c, 0x6a, 0x86, 0xe0, 0xc4, 0x27, 0x74, + 0xe4, 0x38, 0x53, 0xd7, 0x05, 0x7f, 0x1b, 0x34, 0xe3, 0xc6, 0x2f, + 0xb3, 0xca, 0x09, 0x3c, 0x37, 0x9d, 0xd7, 0xe7, 0xb8, 0x46, 0xf1, + 0xfd, 0xa1, 0xe2, 0x71, 0x02, 0x30, 0x42, 0x59, 0x87, 0x43, 0xd4, + 0x51, 0xdf, 0xba, 0xd3, 0x09, 0x32, 0x5a, 0xce, 0x88, 0x7e, 0x57, + 0x3d, 0x9c, 0x5f, 0x42, 0x6b, 0xf5, 0x07, 0x2d, 0xb5, 0xf0, 0x82, + 0x93, 0xf9, 0x59, 0x6f, 0xae, 0x64, 0xfa, 0x58, 0xe5, 0x8b, 0x1e, + 0xe3, 0x63, 0xbe, 0xb5, 0x81, 0xcd, 0x6f, 0x02, 0x8c, 0x79, 0x30, + 0x82, 0x03, 0xbb, 0x30, 0x82, 0x02, 0xa3, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x03, 0x04, 0x44, 0xc0, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, + 0x7e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x50, 0x4c, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x13, 0x19, 0x55, 0x6e, 0x69, 0x7a, 0x65, 0x74, 0x6f, 0x20, + 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, + 0x73, 0x20, 0x53, 0x2e, 0x41, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, + 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1e, 0x43, 0x65, 0x72, 0x74, 0x75, + 0x6d, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x19, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30, + 0x38, 0x31, 0x30, 0x32, 0x32, 0x31, 0x32, 0x30, 0x37, 0x33, 0x37, + 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x31, 0x32, 0x33, 0x31, 0x31, 0x32, + 0x30, 0x37, 0x33, 0x37, 0x5a, 0x30, 0x7e, 0x31, 0x0b, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x50, 0x4c, 0x31, 0x22, + 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x19, 0x55, 0x6e, + 0x69, 0x7a, 0x65, 0x74, 0x6f, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, + 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x20, 0x53, 0x2e, 0x41, + 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, + 0x1e, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6d, 0x20, 0x43, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x22, + 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x19, 0x43, 0x65, + 0x72, 0x74, 0x75, 0x6d, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, + 0x64, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x43, + 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, + 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, + 0x00, 0xe3, 0xfb, 0x7d, 0xa3, 0x72, 0xba, 0xc2, 0xf0, 0xc9, 0x14, + 0x87, 0xf5, 0x6b, 0x01, 0x4e, 0xe1, 0x6e, 0x40, 0x07, 0xba, 0x6d, + 0x27, 0x5d, 0x7f, 0xf7, 0x5b, 0x2d, 0xb3, 0x5a, 0xc7, 0x51, 0x5f, + 0xab, 0xa4, 0x32, 0xa6, 0x61, 0x87, 0xb6, 0x6e, 0x0f, 0x86, 0xd2, + 0x30, 0x02, 0x97, 0xf8, 0xd7, 0x69, 0x57, 0xa1, 0x18, 0x39, 0x5d, + 0x6a, 0x64, 0x79, 0xc6, 0x01, 0x59, 0xac, 0x3c, 0x31, 0x4a, 0x38, + 0x7c, 0xd2, 0x04, 0xd2, 0x4b, 0x28, 0xe8, 0x20, 0x5f, 0x3b, 0x07, + 0xa2, 0xcc, 0x4d, 0x73, 0xdb, 0xf3, 0xae, 0x4f, 0xc7, 0x56, 0xd5, + 0x5a, 0xa7, 0x96, 0x89, 0xfa, 0xf3, 0xab, 0x68, 0xd4, 0x23, 0x86, + 0x59, 0x27, 0xcf, 0x09, 0x27, 0xbc, 0xac, 0x6e, 0x72, 0x83, 0x1c, + 0x30, 0x72, 0xdf, 0xe0, 0xa2, 0xe9, 0xd2, 0xe1, 0x74, 0x75, 0x19, + 0xbd, 0x2a, 0x9e, 0x7b, 0x15, 0x54, 0x04, 0x1b, 0xd7, 0x43, 0x39, + 0xad, 0x55, 0x28, 0xc5, 0xe2, 0x1a, 0xbb, 0xf4, 0xc0, 0xe4, 0xae, + 0x38, 0x49, 0x33, 0xcc, 0x76, 0x85, 0x9f, 0x39, 0x45, 0xd2, 0xa4, + 0x9e, 0xf2, 0x12, 0x8c, 0x51, 0xf8, 0x7c, 0xe4, 0x2d, 0x7f, 0xf5, + 0xac, 0x5f, 0xeb, 0x16, 0x9f, 0xb1, 0x2d, 0xd1, 0xba, 0xcc, 0x91, + 0x42, 0x77, 0x4c, 0x25, 0xc9, 0x90, 0x38, 0x6f, 0xdb, 0xf0, 0xcc, + 0xfb, 0x8e, 0x1e, 0x97, 0x59, 0x3e, 0xd5, 0x60, 0x4e, 0xe6, 0x05, + 0x28, 0xed, 0x49, 0x79, 0x13, 0x4b, 0xba, 0x48, 0xdb, 0x2f, 0xf9, + 0x72, 0xd3, 0x39, 0xca, 0xfe, 0x1f, 0xd8, 0x34, 0x72, 0xf5, 0xb4, + 0x40, 0xcf, 0x31, 0x01, 0xc3, 0xec, 0xde, 0x11, 0x2d, 0x17, 0x5d, + 0x1f, 0xb8, 0x50, 0xd1, 0x5e, 0x19, 0xa7, 0x69, 0xde, 0x07, 0x33, + 0x28, 0xca, 0x50, 0x95, 0xf9, 0xa7, 0x54, 0xcb, 0x54, 0x86, 0x50, + 0x45, 0xa9, 0xf9, 0x49, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, + 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, - 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x6a, 0x38, 0x5b, - 0x26, 0x8d, 0xde, 0x8b, 0x5a, 0xf2, 0x4f, 0x7a, 0x54, 0x83, 0x19, - 0x18, 0xe3, 0x08, 0x35, 0xa6, 0xba, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, - 0x82, 0x01, 0x01, 0x00, 0x3c, 0xd5, 0x77, 0x3d, 0xda, 0xdf, 0x89, - 0xba, 0x87, 0x0c, 0x08, 0x54, 0x6a, 0x20, 0x50, 0x92, 0xbe, 0xb0, - 0x41, 0x3d, 0xb9, 0x26, 0x64, 0x83, 0x0a, 0x2f, 0xe8, 0x40, 0xc0, - 0x97, 0x28, 0x27, 0x82, 0x30, 0x4a, 0xc9, 0x93, 0xff, 0x6a, 0xe7, - 0xa6, 0x00, 0x7f, 0x89, 0x42, 0x9a, 0xd6, 0x11, 0xe5, 0x53, 0xce, - 0x2f, 0xcc, 0xf2, 0xda, 0x05, 0xc4, 0xfe, 0xe2, 0x50, 0xc4, 0x3a, - 0x86, 0x7d, 0xcc, 0xda, 0x7e, 0x10, 0x09, 0x3b, 0x92, 0x35, 0x2a, - 0x53, 0xb2, 0xfe, 0xeb, 0x2b, 0x05, 0xd9, 0x6c, 0x5d, 0xe6, 0xd0, - 0xef, 0xd3, 0x6a, 0x66, 0x9e, 0x15, 0x28, 0x85, 0x7a, 0xe8, 0x82, - 0x00, 0xac, 0x1e, 0xa7, 0x09, 0x69, 0x56, 0x42, 0xd3, 0x68, 0x51, - 0x18, 0xbe, 0x54, 0x9a, 0xbf, 0x44, 0x41, 0xba, 0x49, 0xbe, 0x20, - 0xba, 0x69, 0x5c, 0xee, 0xb8, 0x77, 0xcd, 0xce, 0x6c, 0x1f, 0xad, - 0x83, 0x96, 0x18, 0x7d, 0x0e, 0xb5, 0x14, 0x39, 0x84, 0xf1, 0x28, - 0xe9, 0x2d, 0xa3, 0x9e, 0x7b, 0x1e, 0x7a, 0x72, 0x5a, 0x83, 0xb3, - 0x79, 0x6f, 0xef, 0xb4, 0xfc, 0xd0, 0x0a, 0xa5, 0x58, 0x4f, 0x46, - 0xdf, 0xfb, 0x6d, 0x79, 0x59, 0xf2, 0x84, 0x22, 0x52, 0xae, 0x0f, - 0xcc, 0xfb, 0x7c, 0x3b, 0xe7, 0x6a, 0xca, 0x47, 0x61, 0xc3, 0x7a, - 0xf8, 0xd3, 0x92, 0x04, 0x1f, 0xb8, 0x20, 0x84, 0xe1, 0x36, 0x54, - 0x16, 0xc7, 0x40, 0xde, 0x3b, 0x8a, 0x73, 0xdc, 0xdf, 0xc6, 0x09, - 0x4c, 0xdf, 0xec, 0xda, 0xff, 0xd4, 0x53, 0x42, 0xa1, 0xc9, 0xf2, - 0x62, 0x1d, 0x22, 0x83, 0x3c, 0x97, 0xc5, 0xf9, 0x19, 0x62, 0x27, - 0xac, 0x65, 0x22, 0xd7, 0xd3, 0x3c, 0xc6, 0xe5, 0x8e, 0xb2, 0x53, - 0xcc, 0x49, 0xce, 0xbc, 0x30, 0xfe, 0x7b, 0x0e, 0x33, 0x90, 0xfb, - 0xed, 0xd2, 0x14, 0x91, 0x1f, 0x07, 0xaf, 0x30, 0x82, 0x03, 0x77, - 0x30, 0x82, 0x02, 0x5f, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, - 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x5d, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, 0x25, - 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x45, - 0x43, 0x4f, 0x4d, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x53, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x43, 0x4f, 0x2e, 0x2c, - 0x4c, 0x54, 0x44, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, - 0x04, 0x0b, 0x13, 0x1e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, - 0x79, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, - 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, 0x30, 0x35, 0x32, 0x39, - 0x30, 0x35, 0x30, 0x30, 0x33, 0x39, 0x5a, 0x17, 0x0d, 0x32, 0x39, - 0x30, 0x35, 0x32, 0x39, 0x30, 0x35, 0x30, 0x30, 0x33, 0x39, 0x5a, - 0x30, 0x5d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x4a, 0x50, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x45, 0x43, 0x4f, 0x4d, 0x20, 0x54, - 0x72, 0x75, 0x73, 0x74, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, - 0x73, 0x20, 0x43, 0x4f, 0x2e, 0x2c, 0x4c, 0x54, 0x44, 0x2e, 0x31, - 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1e, 0x53, - 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x43, 0x6f, 0x6d, - 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x32, 0x30, 0x82, 0x01, 0x22, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, - 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xd0, 0x15, 0x39, 0x52, - 0xb1, 0x52, 0xb3, 0xba, 0xc5, 0x59, 0x82, 0xc4, 0x5d, 0x52, 0xae, - 0x3a, 0x43, 0x65, 0x80, 0x4b, 0xc7, 0xf2, 0x96, 0xbc, 0xdb, 0x36, - 0x97, 0xd6, 0xa6, 0x64, 0x8c, 0xa8, 0x5e, 0xf0, 0xe3, 0x0a, 0x1c, - 0xf7, 0xdf, 0x97, 0x3d, 0x4b, 0xae, 0xf6, 0x5d, 0xec, 0x21, 0xb5, - 0x41, 0xab, 0xcd, 0xb9, 0x7e, 0x76, 0x9f, 0xbe, 0xf9, 0x3e, 0x36, - 0x34, 0xa0, 0x3b, 0xc1, 0xf6, 0x31, 0x11, 0x45, 0x74, 0x93, 0x3d, - 0x57, 0x80, 0xc5, 0xf9, 0x89, 0x99, 0xca, 0xe5, 0xab, 0x6a, 0xd4, - 0xb5, 0xda, 0x41, 0x90, 0x10, 0xc1, 0xd6, 0xd6, 0x42, 0x89, 0xc2, - 0xbf, 0xf4, 0x38, 0x12, 0x95, 0x4c, 0x54, 0x05, 0xf7, 0x36, 0xe4, - 0x45, 0x83, 0x7b, 0x14, 0x65, 0xd6, 0xdc, 0x0c, 0x4d, 0xd1, 0xde, - 0x7e, 0x0c, 0xab, 0x3b, 0xc4, 0x15, 0xbe, 0x3a, 0x56, 0xa6, 0x5a, - 0x6f, 0x76, 0x69, 0x52, 0xa9, 0x7a, 0xb9, 0xc8, 0xeb, 0x6a, 0x9a, - 0x5d, 0x52, 0xd0, 0x2d, 0x0a, 0x6b, 0x35, 0x16, 0x09, 0x10, 0x84, - 0xd0, 0x6a, 0xca, 0x3a, 0x06, 0x00, 0x37, 0x47, 0xe4, 0x7e, 0x57, - 0x4f, 0x3f, 0x8b, 0xeb, 0x67, 0xb8, 0x88, 0xaa, 0xc5, 0xbe, 0x53, - 0x55, 0xb2, 0x91, 0xc4, 0x7d, 0xb9, 0xb0, 0x85, 0x19, 0x06, 0x78, - 0x2e, 0xdb, 0x61, 0x1a, 0xfa, 0x85, 0xf5, 0x4a, 0x91, 0xa1, 0xe7, - 0x16, 0xd5, 0x8e, 0xa2, 0x39, 0xdf, 0x94, 0xb8, 0x70, 0x1f, 0x28, - 0x3f, 0x8b, 0xfc, 0x40, 0x5e, 0x63, 0x83, 0x3c, 0x83, 0x2a, 0x1a, - 0x99, 0x6b, 0xcf, 0xde, 0x59, 0x6a, 0x3b, 0xfc, 0x6f, 0x16, 0xd7, - 0x1f, 0xfd, 0x4a, 0x10, 0xeb, 0x4e, 0x82, 0x16, 0x3a, 0xac, 0x27, - 0x0c, 0x53, 0xf1, 0xad, 0xd5, 0x24, 0xb0, 0x6b, 0x03, 0x50, 0xc1, - 0x2d, 0x3c, 0x16, 0xdd, 0x44, 0x34, 0x27, 0x1a, 0x75, 0xfb, 0x02, - 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, - 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x0a, 0x85, 0xa9, - 0x77, 0x65, 0x05, 0x98, 0x7c, 0x40, 0x81, 0xf8, 0x0f, 0x97, 0x2c, - 0x38, 0xf1, 0x0a, 0xec, 0x3c, 0xcf, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x08, 0x76, 0xcd, + 0xcb, 0x07, 0xff, 0x24, 0xf6, 0xc5, 0xcd, 0xed, 0xbb, 0x90, 0xbc, + 0xe2, 0x84, 0x37, 0x46, 0x75, 0xf7, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, - 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, - 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, - 0x82, 0x01, 0x01, 0x00, 0x4c, 0x3a, 0xa3, 0x44, 0xac, 0xb9, 0x45, - 0xb1, 0xc7, 0x93, 0x7e, 0xc8, 0x0b, 0x0a, 0x42, 0xdf, 0x64, 0xea, - 0x1c, 0xee, 0x59, 0x6c, 0x08, 0xba, 0x89, 0x5f, 0x6a, 0xca, 0x4a, - 0x95, 0x9e, 0x7a, 0x8f, 0x07, 0xc5, 0xda, 0x45, 0x72, 0x82, 0x71, - 0x0e, 0x3a, 0xd2, 0xcc, 0x6f, 0xa7, 0xb4, 0xa1, 0x23, 0xbb, 0xf6, - 0x24, 0x9f, 0xcb, 0x17, 0xfe, 0x8c, 0xa6, 0xce, 0xc2, 0xd2, 0xdb, - 0xcc, 0x8d, 0xfc, 0x71, 0xfc, 0x03, 0x29, 0xc1, 0x6c, 0x5d, 0x33, - 0x5f, 0x64, 0xb6, 0x65, 0x3b, 0x89, 0x6f, 0x18, 0x76, 0x78, 0xf5, - 0xdc, 0xa2, 0x48, 0x1f, 0x19, 0x3f, 0x8e, 0x93, 0xeb, 0xf1, 0xfa, - 0x17, 0xee, 0xcd, 0x4e, 0xe3, 0x04, 0x12, 0x55, 0xd6, 0xe5, 0xe4, - 0xdd, 0xfb, 0x3e, 0x05, 0x7c, 0xe2, 0x1d, 0x5e, 0xc6, 0xa7, 0xbc, - 0x97, 0x4f, 0x68, 0x3a, 0xf5, 0xe9, 0x2e, 0x0a, 0x43, 0xb6, 0xaf, - 0x57, 0x5c, 0x62, 0x68, 0x7c, 0xb7, 0xfd, 0xa3, 0x8a, 0x84, 0xa0, - 0xac, 0x62, 0xbe, 0x2b, 0x09, 0x87, 0x34, 0xf0, 0x6a, 0x01, 0xbb, - 0x9b, 0x29, 0x56, 0x3c, 0xfe, 0x00, 0x37, 0xcf, 0x23, 0x6c, 0xf1, - 0x4e, 0xaa, 0xb6, 0x74, 0x46, 0x12, 0x6c, 0x91, 0xee, 0x34, 0xd5, - 0xec, 0x9a, 0x91, 0xe7, 0x44, 0xbe, 0x90, 0x31, 0x72, 0xd5, 0x49, - 0x02, 0xf6, 0x02, 0xe5, 0xf4, 0x1f, 0xeb, 0x7c, 0xd9, 0x96, 0x55, - 0xa9, 0xff, 0xec, 0x8a, 0xf9, 0x99, 0x47, 0xff, 0x35, 0x5a, 0x02, - 0xaa, 0x04, 0xcb, 0x8a, 0x5b, 0x87, 0x71, 0x29, 0x91, 0xbd, 0xa4, - 0xb4, 0x7a, 0x0d, 0xbd, 0x9a, 0xf5, 0x57, 0x23, 0x00, 0x07, 0x21, - 0x17, 0x3f, 0x4a, 0x39, 0xd1, 0x05, 0x49, 0x0b, 0xa7, 0xb6, 0x37, - 0x81, 0xa5, 0x5d, 0x8c, 0xaa, 0x33, 0x5e, 0x81, 0x28, 0x7c, 0xa7, - 0x7d, 0x27, 0xeb, 0x00, 0xae, 0x8d, 0x37, 0x30, 0x82, 0x05, 0x56, - 0x30, 0x82, 0x04, 0x3e, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, - 0xee, 0x2b, 0x3d, 0xeb, 0xd4, 0x21, 0xde, 0x14, 0xa8, 0x62, 0xac, - 0x04, 0xf3, 0xdd, 0xc4, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, - 0xf3, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, - 0x02, 0x45, 0x53, 0x31, 0x3b, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x13, 0x32, 0x41, 0x67, 0x65, 0x6e, 0x63, 0x69, 0x61, 0x20, - 0x43, 0x61, 0x74, 0x61, 0x6c, 0x61, 0x6e, 0x61, 0x20, 0x64, 0x65, - 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, - 0x69, 0x6f, 0x20, 0x28, 0x4e, 0x49, 0x46, 0x20, 0x51, 0x2d, 0x30, - 0x38, 0x30, 0x31, 0x31, 0x37, 0x36, 0x2d, 0x49, 0x29, 0x31, 0x28, - 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1f, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x69, 0x73, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x73, 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, 0x31, 0x35, 0x30, 0x33, - 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2c, 0x56, 0x65, 0x67, 0x65, - 0x75, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, - 0x77, 0x77, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x65, 0x72, 0x74, 0x2e, - 0x6e, 0x65, 0x74, 0x2f, 0x76, 0x65, 0x72, 0x61, 0x72, 0x72, 0x65, - 0x6c, 0x20, 0x28, 0x63, 0x29, 0x30, 0x33, 0x31, 0x35, 0x30, 0x33, - 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2c, 0x4a, 0x65, 0x72, 0x61, - 0x72, 0x71, 0x75, 0x69, 0x61, 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74, - 0x61, 0x74, 0x73, 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, 0x20, 0x43, 0x61, - 0x74, 0x61, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x31, 0x0f, 0x30, 0x0d, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x06, 0x45, 0x43, 0x2d, 0x41, - 0x43, 0x43, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x33, 0x30, 0x31, 0x30, - 0x37, 0x32, 0x33, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, - 0x31, 0x30, 0x31, 0x30, 0x37, 0x32, 0x32, 0x35, 0x39, 0x35, 0x39, - 0x5a, 0x30, 0x81, 0xf3, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x3b, 0x30, 0x39, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x13, 0x32, 0x41, 0x67, 0x65, 0x6e, 0x63, - 0x69, 0x61, 0x20, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x61, 0x6e, 0x61, - 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x63, 0x69, 0x6f, 0x20, 0x28, 0x4e, 0x49, 0x46, 0x20, - 0x51, 0x2d, 0x30, 0x38, 0x30, 0x31, 0x31, 0x37, 0x36, 0x2d, 0x49, - 0x29, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, - 0x1f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x69, 0x73, 0x20, 0x50, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x73, 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, 0x31, - 0x35, 0x30, 0x33, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2c, 0x56, - 0x65, 0x67, 0x65, 0x75, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, - 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x65, - 0x72, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x76, 0x65, 0x72, 0x61, - 0x72, 0x72, 0x65, 0x6c, 0x20, 0x28, 0x63, 0x29, 0x30, 0x33, 0x31, - 0x35, 0x30, 0x33, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2c, 0x4a, - 0x65, 0x72, 0x61, 0x72, 0x71, 0x75, 0x69, 0x61, 0x20, 0x45, 0x6e, - 0x74, 0x69, 0x74, 0x61, 0x74, 0x73, 0x20, 0x64, 0x65, 0x20, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, - 0x20, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x31, - 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x06, 0x45, - 0x43, 0x2d, 0x41, 0x43, 0x43, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, - 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, - 0x02, 0x82, 0x01, 0x01, 0x00, 0xb3, 0x22, 0xc7, 0x4f, 0xe2, 0x97, - 0x42, 0x95, 0x88, 0x47, 0x83, 0x40, 0xf6, 0x1d, 0x17, 0xf3, 0x83, - 0x73, 0x24, 0x1e, 0x51, 0xf3, 0x98, 0x8a, 0xc3, 0x92, 0xb8, 0xff, - 0x40, 0x90, 0x05, 0x70, 0x87, 0x60, 0xc9, 0x00, 0xa9, 0xb5, 0x94, - 0x65, 0x19, 0x22, 0x15, 0x17, 0xc2, 0x43, 0x6c, 0x66, 0x44, 0x9a, - 0x0d, 0x04, 0x3e, 0x39, 0x6f, 0xa5, 0x4b, 0x7a, 0xaa, 0x63, 0xb7, - 0x8a, 0x44, 0x9d, 0xd9, 0x63, 0x91, 0x84, 0x66, 0xe0, 0x28, 0x0f, - 0xba, 0x42, 0xe3, 0x6e, 0x8e, 0xf7, 0x14, 0x27, 0x93, 0x69, 0xee, - 0x91, 0x0e, 0xa3, 0x5f, 0x0e, 0xb1, 0xeb, 0x66, 0xa2, 0x72, 0x4f, - 0x12, 0x13, 0x86, 0x65, 0x7a, 0x3e, 0xdb, 0x4f, 0x07, 0xf4, 0xa7, - 0x09, 0x60, 0xda, 0x3a, 0x42, 0x99, 0xc7, 0xb2, 0x7f, 0xb3, 0x16, - 0x95, 0x1c, 0xc7, 0xf9, 0x34, 0xb5, 0x94, 0x85, 0xd5, 0x99, 0x5e, - 0xa0, 0x48, 0xa0, 0x7e, 0xe7, 0x17, 0x65, 0xb8, 0xa2, 0x75, 0xb8, - 0x1e, 0xf3, 0xe5, 0x42, 0x7d, 0xaf, 0xed, 0xf3, 0x8a, 0x48, 0x64, - 0x5d, 0x82, 0x14, 0x93, 0xd8, 0xc0, 0xe4, 0xff, 0xb3, 0x50, 0x72, - 0xf2, 0x76, 0xf6, 0xb3, 0x5d, 0x42, 0x50, 0x79, 0xd0, 0x94, 0x3e, - 0x6b, 0x0c, 0x00, 0xbe, 0xd8, 0x6b, 0x0e, 0x4e, 0x2a, 0xec, 0x3e, - 0xd2, 0xcc, 0x82, 0xa2, 0x18, 0x65, 0x33, 0x13, 0x77, 0x9e, 0x9a, - 0x5d, 0x1a, 0x13, 0xd8, 0xc3, 0xdb, 0x3d, 0xc8, 0x97, 0x7a, 0xee, - 0x70, 0xed, 0xa7, 0xe6, 0x7c, 0xdb, 0x71, 0xcf, 0x2d, 0x94, 0x62, - 0xdf, 0x6d, 0xd6, 0xf5, 0x38, 0xbe, 0x3f, 0xa5, 0x85, 0x0a, 0x19, - 0xb8, 0xa8, 0xd8, 0x09, 0x75, 0x42, 0x70, 0xc4, 0xea, 0xef, 0xcb, - 0x0e, 0xc8, 0x34, 0xa8, 0x12, 0x22, 0x98, 0x0c, 0xb8, 0x13, 0x94, - 0xb6, 0x4b, 0xec, 0xf0, 0xd0, 0x90, 0xe7, 0x27, 0x02, 0x03, 0x01, - 0x00, 0x01, 0xa3, 0x81, 0xe3, 0x30, 0x81, 0xe0, 0x30, 0x1d, 0x06, - 0x03, 0x55, 0x1d, 0x11, 0x04, 0x16, 0x30, 0x14, 0x81, 0x12, 0x65, - 0x63, 0x5f, 0x61, 0x63, 0x63, 0x40, 0x63, 0x61, 0x74, 0x63, 0x65, - 0x72, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x30, 0x0f, 0x06, 0x03, 0x55, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xa6, 0xa8, + 0xad, 0x22, 0xce, 0x01, 0x3d, 0xa6, 0xa3, 0xff, 0x62, 0xd0, 0x48, + 0x9d, 0x8b, 0x5e, 0x72, 0xb0, 0x78, 0x44, 0xe3, 0xdc, 0x1c, 0xaf, + 0x09, 0xfd, 0x23, 0x48, 0xfa, 0xbd, 0x2a, 0xc4, 0xb9, 0x55, 0x04, + 0xb5, 0x10, 0xa3, 0x8d, 0x27, 0xde, 0x0b, 0x82, 0x63, 0xd0, 0xee, + 0xde, 0x0c, 0x37, 0x79, 0x41, 0x5b, 0x22, 0xb2, 0xb0, 0x9a, 0x41, + 0x5c, 0xa6, 0x70, 0xe0, 0xd4, 0xd0, 0x77, 0xcb, 0x23, 0xd3, 0x00, + 0xe0, 0x6c, 0x56, 0x2f, 0xe1, 0x69, 0x0d, 0x0d, 0xd9, 0xaa, 0xbf, + 0x21, 0x81, 0x50, 0xd9, 0x06, 0xa5, 0xa8, 0xff, 0x95, 0x37, 0xd0, + 0xaa, 0xfe, 0xe2, 0xb3, 0xf5, 0x99, 0x2d, 0x45, 0x84, 0x8a, 0xe5, + 0x42, 0x09, 0xd7, 0x74, 0x02, 0x2f, 0xf7, 0x89, 0xd8, 0x99, 0xe9, + 0xbc, 0x27, 0xd4, 0x47, 0x8d, 0xba, 0x0d, 0x46, 0x1c, 0x77, 0xcf, + 0x14, 0xa4, 0x1c, 0xb9, 0xa4, 0x31, 0xc4, 0x9c, 0x28, 0x74, 0x03, + 0x34, 0xff, 0x33, 0x19, 0x26, 0xa5, 0xe9, 0x0d, 0x74, 0xb7, 0x3e, + 0x97, 0xc6, 0x76, 0xe8, 0x27, 0x96, 0xa3, 0x66, 0xdd, 0xe1, 0xae, + 0xf2, 0x41, 0x5b, 0xca, 0x98, 0x56, 0x83, 0x73, 0x70, 0xe4, 0x86, + 0x1a, 0xd2, 0x31, 0x41, 0xba, 0x2f, 0xbe, 0x2d, 0x13, 0x5a, 0x76, + 0x6f, 0x4e, 0xe8, 0x4e, 0x81, 0x0e, 0x3f, 0x5b, 0x03, 0x22, 0xa0, + 0x12, 0xbe, 0x66, 0x58, 0x11, 0x4a, 0xcb, 0x03, 0xc4, 0xb4, 0x2a, + 0x2a, 0x2d, 0x96, 0x17, 0xe0, 0x39, 0x54, 0xbc, 0x48, 0xd3, 0x76, + 0x27, 0x9d, 0x9a, 0x2d, 0x06, 0xa6, 0xc9, 0xec, 0x39, 0xd2, 0xab, + 0xdb, 0x9f, 0x9a, 0x0b, 0x27, 0x02, 0x35, 0x29, 0xb1, 0x40, 0x95, + 0xe7, 0xf9, 0xe8, 0x9c, 0x55, 0x88, 0x19, 0x46, 0xd6, 0xb7, 0x34, + 0xf5, 0x7e, 0xce, 0x39, 0x9a, 0xd9, 0x38, 0xf1, 0x51, 0xf7, 0x4f, + 0x2c, 0x30, 0x82, 0x05, 0x9c, 0x30, 0x82, 0x03, 0x84, 0xa0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, + 0x63, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x46, 0x52, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x13, 0x0a, 0x43, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x6f, 0x6d, + 0x69, 0x73, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0b, + 0x13, 0x0e, 0x30, 0x30, 0x30, 0x32, 0x20, 0x34, 0x33, 0x33, 0x39, + 0x39, 0x38, 0x39, 0x30, 0x33, 0x31, 0x26, 0x30, 0x24, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x0c, 0x1d, 0x43, 0x65, 0x72, 0x74, 0x69, 0x6e, + 0x6f, 0x6d, 0x69, 0x73, 0x20, 0x2d, 0x20, 0x41, 0x75, 0x74, 0x6f, + 0x72, 0x69, 0x74, 0xc3, 0xa9, 0x20, 0x52, 0x61, 0x63, 0x69, 0x6e, + 0x65, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x30, 0x39, 0x31, 0x37, + 0x30, 0x38, 0x32, 0x38, 0x35, 0x39, 0x5a, 0x17, 0x0d, 0x32, 0x38, + 0x30, 0x39, 0x31, 0x37, 0x30, 0x38, 0x32, 0x38, 0x35, 0x39, 0x5a, + 0x30, 0x63, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x46, 0x52, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x13, 0x0a, 0x43, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x6f, + 0x6d, 0x69, 0x73, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, + 0x0b, 0x13, 0x0e, 0x30, 0x30, 0x30, 0x32, 0x20, 0x34, 0x33, 0x33, + 0x39, 0x39, 0x38, 0x39, 0x30, 0x33, 0x31, 0x26, 0x30, 0x24, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1d, 0x43, 0x65, 0x72, 0x74, 0x69, + 0x6e, 0x6f, 0x6d, 0x69, 0x73, 0x20, 0x2d, 0x20, 0x41, 0x75, 0x74, + 0x6f, 0x72, 0x69, 0x74, 0xc3, 0xa9, 0x20, 0x52, 0x61, 0x63, 0x69, + 0x6e, 0x65, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, + 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, + 0x01, 0x00, 0x9d, 0x85, 0x9f, 0x86, 0xd3, 0xe3, 0xaf, 0xc7, 0xb2, + 0x6b, 0x6e, 0x33, 0xe0, 0x9e, 0xb7, 0x42, 0x34, 0x55, 0x9d, 0xf9, + 0x81, 0xbe, 0x63, 0xd8, 0x23, 0x76, 0x0e, 0x97, 0x54, 0xcd, 0x99, + 0x4c, 0x1a, 0xf1, 0x39, 0xc7, 0x88, 0xd8, 0x17, 0x50, 0x0c, 0x9e, + 0x61, 0xda, 0xc0, 0x4e, 0x55, 0xde, 0xe7, 0x5a, 0xb8, 0x7a, 0x4e, + 0x77, 0x87, 0x0d, 0xe5, 0xb8, 0xeb, 0xfa, 0x9e, 0x5e, 0x7b, 0x1e, + 0xc4, 0xcf, 0x28, 0x74, 0xc7, 0x93, 0xf5, 0x14, 0xc6, 0x22, 0x28, + 0x04, 0xf9, 0x91, 0xc3, 0xab, 0x27, 0x73, 0x6a, 0x0e, 0x2e, 0x4d, + 0xf3, 0x2e, 0x28, 0x1f, 0x70, 0xdf, 0x55, 0x2f, 0x4e, 0xed, 0xc7, + 0x71, 0x6f, 0x09, 0x72, 0x2e, 0xed, 0xd5, 0x32, 0x97, 0xd0, 0xf1, + 0x58, 0x77, 0xd1, 0x60, 0xbc, 0x4e, 0x5e, 0xdb, 0x9a, 0x84, 0xf6, + 0x47, 0x61, 0x45, 0x2b, 0xf6, 0x50, 0xa6, 0x7f, 0x6a, 0x71, 0x27, + 0x48, 0x84, 0x35, 0x9e, 0xac, 0xfe, 0x69, 0xa9, 0x9e, 0x7a, 0x5e, + 0x35, 0x25, 0xfa, 0xb4, 0xa7, 0x49, 0x35, 0x77, 0x96, 0xa7, 0x36, + 0x5b, 0xe1, 0xcd, 0xdf, 0x23, 0x70, 0xd8, 0x5d, 0x4c, 0xa5, 0x08, + 0x83, 0xf1, 0xa6, 0x24, 0x38, 0x13, 0xa8, 0xec, 0x2f, 0xa8, 0xa1, + 0x67, 0xc7, 0xa6, 0x2d, 0x86, 0x47, 0xee, 0x8a, 0xfc, 0xec, 0x9b, + 0x0e, 0x74, 0xf4, 0x2b, 0x49, 0x02, 0x7b, 0x90, 0x75, 0x8c, 0xfc, + 0x99, 0x39, 0x01, 0x39, 0xd6, 0x4a, 0x89, 0xe5, 0x9e, 0x76, 0xab, + 0x3e, 0x96, 0x28, 0x38, 0x26, 0x8b, 0xdd, 0x8d, 0x8c, 0xc0, 0xf6, + 0x01, 0x1e, 0x6f, 0xa5, 0x31, 0x12, 0x38, 0x7d, 0x95, 0xc2, 0x71, + 0xee, 0xed, 0x74, 0xae, 0xe4, 0x36, 0xa2, 0x43, 0x75, 0xd5, 0xf1, + 0x00, 0x9b, 0xe2, 0xe4, 0xd7, 0xcc, 0x42, 0x03, 0x4b, 0x78, 0x7a, + 0xe5, 0x7d, 0xbb, 0xb8, 0xae, 0x2e, 0x20, 0x93, 0xd3, 0xe4, 0x61, + 0xdf, 0x71, 0xe1, 0x76, 0x67, 0x97, 0x3f, 0xb6, 0xdf, 0x6a, 0x73, + 0x5a, 0x64, 0x22, 0xe5, 0x42, 0xdb, 0xcf, 0x81, 0x03, 0x93, 0xd8, + 0xf4, 0xe3, 0x10, 0xe0, 0x72, 0xf6, 0x00, 0x70, 0xac, 0xf0, 0xc1, + 0x7a, 0x0f, 0x05, 0x7f, 0xcf, 0x34, 0x69, 0x45, 0xb5, 0x93, 0xe4, + 0x19, 0xdb, 0x52, 0x16, 0x23, 0x05, 0x89, 0x0e, 0x8d, 0x48, 0xe4, + 0x25, 0x6f, 0xb3, 0x78, 0xbf, 0x62, 0xf5, 0x07, 0xfa, 0x95, 0x24, + 0xc2, 0x96, 0xb2, 0xe8, 0xa3, 0x23, 0xc2, 0x5d, 0x03, 0xfc, 0xc3, + 0xd3, 0xe5, 0x7c, 0xc9, 0x75, 0x23, 0xd7, 0xf4, 0xf5, 0xbc, 0xde, + 0xe4, 0xdf, 0xcd, 0x80, 0xbf, 0x91, 0x88, 0x7d, 0xa7, 0x13, 0xb4, + 0x39, 0xba, 0x2c, 0xba, 0xbd, 0xd1, 0x6b, 0xcc, 0xf3, 0xa5, 0x28, + 0xed, 0x44, 0x9e, 0x7d, 0x52, 0xa3, 0x6f, 0x96, 0x2e, 0x19, 0x7e, + 0x1c, 0xf3, 0x5b, 0xc7, 0x16, 0x8e, 0xbb, 0x60, 0x7d, 0x77, 0x66, + 0x47, 0x54, 0x82, 0x00, 0x11, 0x60, 0x6c, 0x32, 0xc1, 0xa8, 0x38, + 0x1b, 0xeb, 0x6e, 0x98, 0x13, 0xd6, 0xee, 0x38, 0xf5, 0xf0, 0x9f, + 0x0e, 0xef, 0xfe, 0x31, 0x81, 0xc1, 0xd2, 0x24, 0x95, 0x2f, 0x53, + 0x7a, 0x69, 0xa2, 0xf0, 0x0f, 0x86, 0x45, 0x8e, 0x58, 0x82, 0x2b, + 0x4c, 0x22, 0xd4, 0x5e, 0xa0, 0xe7, 0x7d, 0x26, 0x27, 0x48, 0xdf, + 0x25, 0x46, 0x8d, 0x4a, 0x28, 0x7c, 0x86, 0x9e, 0xf9, 0x9b, 0x1a, + 0x59, 0xb9, 0x65, 0xbf, 0x05, 0xdd, 0xb6, 0x42, 0x5d, 0x3d, 0xe6, + 0x00, 0x48, 0x82, 0x5e, 0x20, 0xf7, 0x11, 0x82, 0xde, 0xca, 0xd8, + 0x9f, 0xe6, 0x37, 0x47, 0x26, 0x1e, 0xeb, 0x78, 0xf7, 0x61, 0xc3, + 0x41, 0x64, 0x58, 0x02, 0x41, 0xf9, 0xda, 0xe0, 0xd1, 0xf8, 0xf9, + 0xe8, 0xfd, 0x52, 0x38, 0xb6, 0xf5, 0x89, 0xdf, 0x02, 0x03, 0x01, + 0x00, 0x01, 0xa3, 0x5b, 0x30, 0x59, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, - 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa0, 0xc3, 0x8b, 0x44, 0xaa, - 0x37, 0xa5, 0x45, 0xbf, 0x97, 0x80, 0x5a, 0xd1, 0xf1, 0x78, 0xa2, - 0x9b, 0xe9, 0x5d, 0x8d, 0x30, 0x7f, 0x06, 0x03, 0x55, 0x1d, 0x20, - 0x04, 0x78, 0x30, 0x76, 0x30, 0x74, 0x06, 0x0b, 0x2b, 0x06, 0x01, - 0x04, 0x01, 0xf5, 0x78, 0x01, 0x03, 0x01, 0x0a, 0x30, 0x65, 0x30, - 0x2c, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, - 0x16, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, - 0x77, 0x77, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x65, 0x72, 0x74, 0x2e, - 0x6e, 0x65, 0x74, 0x2f, 0x76, 0x65, 0x72, 0x61, 0x72, 0x72, 0x65, - 0x6c, 0x30, 0x35, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, - 0x02, 0x02, 0x30, 0x29, 0x1a, 0x27, 0x56, 0x65, 0x67, 0x65, 0x75, - 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, - 0x77, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x6e, - 0x65, 0x74, 0x2f, 0x76, 0x65, 0x72, 0x61, 0x72, 0x72, 0x65, 0x6c, - 0x20, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xa0, - 0x48, 0x5b, 0x82, 0x01, 0xf6, 0x4d, 0x48, 0xb8, 0x39, 0x55, 0x35, - 0x9c, 0x80, 0x7a, 0x53, 0x99, 0xd5, 0x5a, 0xff, 0xb1, 0x71, 0x3b, - 0xcc, 0x39, 0x09, 0x94, 0x5e, 0xd6, 0xda, 0xef, 0xbe, 0x01, 0x5b, - 0x5d, 0xd3, 0x1e, 0xd8, 0xfd, 0x7d, 0x4f, 0xcd, 0xa0, 0x41, 0xe0, - 0x34, 0x93, 0xbf, 0xcb, 0xe2, 0x86, 0x9c, 0x37, 0x92, 0x90, 0x56, - 0x1c, 0xdc, 0xeb, 0x29, 0x05, 0xe5, 0xc4, 0x9e, 0xc7, 0x35, 0xdf, - 0x8a, 0x0c, 0xcd, 0xc5, 0x21, 0x43, 0xe9, 0xaa, 0x88, 0xe5, 0x35, - 0xc0, 0x19, 0x42, 0x63, 0x5a, 0x02, 0x5e, 0xa4, 0x48, 0x18, 0x3a, - 0x85, 0x6f, 0xdc, 0x9d, 0xbc, 0x3f, 0x9d, 0x9c, 0xc1, 0x87, 0xb8, - 0x7a, 0x61, 0x08, 0xe9, 0x77, 0x0b, 0x7f, 0x70, 0xab, 0x7a, 0xdd, - 0xd9, 0x97, 0x2c, 0x64, 0x1e, 0x85, 0xbf, 0xbc, 0x74, 0x96, 0xa1, - 0xc3, 0x7a, 0x12, 0xec, 0x0c, 0x1a, 0x6e, 0x83, 0x0c, 0x3c, 0xe8, - 0x72, 0x46, 0x9f, 0xfb, 0x48, 0xd5, 0x5e, 0x97, 0xe6, 0xb1, 0xa1, - 0xf8, 0xe4, 0xef, 0x46, 0x25, 0x94, 0x9c, 0x89, 0xdb, 0x69, 0x38, - 0xbe, 0xec, 0x5c, 0x0e, 0x56, 0xc7, 0x65, 0x51, 0xe5, 0x50, 0x88, - 0x88, 0xbf, 0x42, 0xd5, 0x2b, 0x3d, 0xe5, 0xf9, 0xba, 0x9e, 0x2e, - 0xb3, 0xca, 0xf4, 0x73, 0x92, 0x02, 0x0b, 0xbe, 0x4c, 0x66, 0xeb, - 0x20, 0xfe, 0xb9, 0xcb, 0xb5, 0x99, 0x7f, 0xe6, 0xb6, 0x13, 0xfa, - 0xca, 0x4b, 0x4d, 0xd9, 0xee, 0x53, 0x46, 0x06, 0x3b, 0xc6, 0x4e, - 0xad, 0x93, 0x5a, 0x81, 0x7e, 0x6c, 0x2a, 0x4b, 0x6a, 0x05, 0x45, - 0x8c, 0xf2, 0x21, 0xa4, 0x31, 0x90, 0x87, 0x6c, 0x65, 0x9c, 0x9d, - 0xa5, 0x60, 0x95, 0x3a, 0x52, 0x7f, 0xf5, 0xd1, 0xab, 0x08, 0x6e, - 0xf3, 0xee, 0x5b, 0xf9, 0x88, 0x3d, 0x7e, 0xb8, 0x6f, 0x6e, 0x03, - 0xe4, 0x42, 0x30, 0x82, 0x04, 0x31, 0x30, 0x82, 0x03, 0x19, 0xa0, - 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, + 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x0d, 0x8c, 0xb6, 0x61, 0xda, + 0x44, 0xb8, 0xd1, 0x14, 0x7d, 0xc3, 0xbe, 0x7d, 0x5e, 0x48, 0xf0, + 0xce, 0xca, 0x6a, 0xb0, 0x30, 0x17, 0x06, 0x03, 0x55, 0x1d, 0x20, + 0x04, 0x10, 0x30, 0x0e, 0x30, 0x0c, 0x06, 0x0a, 0x2a, 0x81, 0x7a, + 0x01, 0x56, 0x02, 0x02, 0x00, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, - 0x30, 0x81, 0x95, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x47, 0x52, 0x31, 0x44, 0x30, 0x42, 0x06, 0x03, - 0x55, 0x04, 0x0a, 0x13, 0x3b, 0x48, 0x65, 0x6c, 0x6c, 0x65, 0x6e, - 0x69, 0x63, 0x20, 0x41, 0x63, 0x61, 0x64, 0x65, 0x6d, 0x69, 0x63, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x43, 0x65, 0x72, 0x74, 0x2e, 0x20, - 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x40, - 0x30, 0x3e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x37, 0x48, 0x65, + 0x03, 0x82, 0x02, 0x01, 0x00, 0x24, 0x3e, 0x60, 0x06, 0x7e, 0x1d, + 0xef, 0x3a, 0x3e, 0xdb, 0xea, 0xaf, 0x1c, 0x9a, 0x2c, 0x01, 0x0b, + 0xf4, 0xc5, 0xb5, 0xd9, 0x49, 0x31, 0xf4, 0x5d, 0x41, 0x8d, 0x89, + 0x0c, 0x4e, 0xff, 0x6c, 0xa2, 0xfd, 0xff, 0xe2, 0x06, 0xc8, 0x39, + 0x9f, 0xf1, 0x5a, 0xa9, 0xdd, 0x22, 0x58, 0x15, 0xa8, 0x8a, 0xd3, + 0xb1, 0xe6, 0x32, 0x09, 0x82, 0x03, 0x6c, 0xd7, 0x3f, 0x08, 0xc7, + 0xf8, 0xb9, 0xba, 0x00, 0x6d, 0xb9, 0xd6, 0xfc, 0x52, 0x32, 0x5d, + 0xa4, 0x7f, 0xa4, 0x31, 0x94, 0xbb, 0xb6, 0x4c, 0x38, 0x7f, 0x28, + 0x30, 0x35, 0xff, 0x9f, 0x23, 0x53, 0xb7, 0xb6, 0xee, 0x14, 0x70, + 0x00, 0x40, 0x2b, 0xda, 0x47, 0xab, 0x34, 0x7e, 0x5e, 0xa7, 0x56, + 0x30, 0x61, 0x2b, 0x8b, 0x43, 0xac, 0xfd, 0xb6, 0x88, 0x28, 0xf5, + 0x6b, 0xb6, 0x3e, 0x60, 0x4a, 0xba, 0x42, 0x90, 0x34, 0x67, 0x8d, + 0xea, 0xeb, 0x5f, 0x45, 0x54, 0x3b, 0x17, 0xac, 0x8b, 0xe4, 0xc6, + 0x65, 0x0f, 0xee, 0xd0, 0x8c, 0x5d, 0x66, 0x39, 0xce, 0x32, 0xa7, + 0xd8, 0x10, 0x97, 0xc0, 0x7e, 0x34, 0x9c, 0x9f, 0x94, 0xf3, 0xf6, + 0x86, 0x1f, 0xcf, 0x1b, 0x73, 0xad, 0x94, 0x79, 0x87, 0x68, 0x70, + 0xc3, 0x33, 0xa5, 0x70, 0xe7, 0xd8, 0xd5, 0x38, 0x94, 0x6f, 0x63, + 0x79, 0xeb, 0xbf, 0x0a, 0x0e, 0x08, 0xe7, 0xc5, 0x2f, 0x0f, 0x42, + 0xa0, 0x2b, 0x14, 0x40, 0xff, 0x21, 0xe0, 0x05, 0xc5, 0x27, 0xe1, + 0x84, 0x11, 0x13, 0xba, 0xd6, 0x86, 0x1d, 0x41, 0x0b, 0x13, 0x23, + 0x89, 0xd3, 0xc9, 0x0b, 0xe8, 0x8a, 0xba, 0x7a, 0xa3, 0xa3, 0x73, + 0x37, 0x35, 0x80, 0x7d, 0x12, 0xb8, 0x33, 0x77, 0x40, 0x38, 0xc0, + 0xfa, 0x5e, 0x30, 0xd2, 0xf2, 0xb6, 0xa3, 0xb1, 0xd6, 0xa2, 0x95, + 0x97, 0x81, 0x9b, 0x52, 0xed, 0x69, 0x4c, 0xff, 0x80, 0xe4, 0x53, + 0xdb, 0x54, 0x5b, 0x03, 0x6d, 0x54, 0x5f, 0xb1, 0xb8, 0xef, 0x24, + 0xbd, 0x6f, 0x9f, 0x11, 0xc3, 0xc7, 0x64, 0xc2, 0x0f, 0x28, 0x62, + 0x85, 0x66, 0x5e, 0x1a, 0x7b, 0xb2, 0xb7, 0xef, 0xae, 0x35, 0xc9, + 0x19, 0x33, 0xa8, 0xb8, 0x27, 0xdb, 0x33, 0x55, 0xbf, 0x68, 0xe1, + 0x75, 0x48, 0x44, 0x56, 0xfb, 0xcd, 0xd3, 0x48, 0xbb, 0x47, 0x89, + 0x3a, 0xac, 0x69, 0xf5, 0x80, 0xc6, 0xe4, 0x44, 0x50, 0x2f, 0x54, + 0xc4, 0xaa, 0x43, 0xc5, 0x31, 0x31, 0x58, 0xbd, 0x96, 0xc5, 0xea, + 0x75, 0x6c, 0x9a, 0x75, 0xb1, 0x4d, 0xf8, 0xf7, 0x97, 0xff, 0x96, + 0x16, 0xf2, 0x97, 0x4d, 0xe8, 0xf6, 0xf3, 0x11, 0xf9, 0x3a, 0x7d, + 0x8a, 0x38, 0x6e, 0x04, 0xcb, 0xe1, 0xd3, 0x45, 0x15, 0xaa, 0xa5, + 0xd1, 0x1d, 0x9d, 0x5d, 0x63, 0xe8, 0x24, 0xe6, 0x36, 0x14, 0xe2, + 0x87, 0xad, 0x1b, 0x59, 0xf5, 0x44, 0x9b, 0xfb, 0xd7, 0x77, 0x7c, + 0x1f, 0x01, 0x70, 0x62, 0xa1, 0x20, 0x1a, 0xa2, 0xc5, 0x1a, 0x28, + 0xf4, 0x21, 0x03, 0xee, 0x2e, 0xd9, 0xc1, 0x80, 0xea, 0xb9, 0xd9, + 0x82, 0xd6, 0x5b, 0x76, 0xc2, 0xcb, 0x3b, 0xb5, 0xd2, 0x00, 0xf0, + 0xa3, 0x0e, 0xe1, 0xad, 0x6e, 0x40, 0xf7, 0xdb, 0xa0, 0xb4, 0xd0, + 0x46, 0xae, 0x15, 0xd7, 0x44, 0xc2, 0x4d, 0x35, 0xf9, 0xd2, 0x0b, + 0xf2, 0x17, 0xf6, 0xac, 0x66, 0xd5, 0x24, 0xb2, 0x4f, 0xd1, 0x1c, + 0x99, 0xc0, 0x6e, 0xf5, 0x7d, 0xeb, 0x74, 0x04, 0xb8, 0xf9, 0x4d, + 0x77, 0x09, 0xd7, 0xb4, 0xcf, 0x07, 0x30, 0x09, 0xf1, 0xb8, 0x00, + 0x56, 0xd9, 0x17, 0x16, 0x16, 0x0a, 0x2b, 0x86, 0xdf, 0x8f, 0x01, + 0x19, 0x1a, 0xe5, 0xbb, 0x82, 0x63, 0xff, 0xbe, 0x0b, 0x76, 0x16, + 0x5e, 0x37, 0x37, 0xe6, 0xd8, 0x74, 0x97, 0xa2, 0x99, 0x45, 0x79, + 0x30, 0x82, 0x06, 0x8b, 0x30, 0x82, 0x05, 0x73, 0xa0, 0x03, 0x02, + 0x01, 0x02, 0x02, 0x04, 0x3b, 0x45, 0xe5, 0x68, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x30, 0x68, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, + 0x55, 0x04, 0x0a, 0x13, 0x16, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x6c, 0x69, 0x74, 0x61, 0x74, 0x20, 0x56, 0x61, 0x6c, 0x65, 0x6e, + 0x63, 0x69, 0x61, 0x6e, 0x61, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, + 0x55, 0x04, 0x0b, 0x13, 0x06, 0x50, 0x4b, 0x49, 0x47, 0x56, 0x41, + 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1e, + 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x6c, 0x69, 0x74, 0x61, 0x74, 0x20, 0x56, 0x61, + 0x6c, 0x65, 0x6e, 0x63, 0x69, 0x61, 0x6e, 0x61, 0x30, 0x1e, 0x17, + 0x0d, 0x30, 0x31, 0x30, 0x37, 0x30, 0x36, 0x31, 0x36, 0x32, 0x32, + 0x34, 0x37, 0x5a, 0x17, 0x0d, 0x32, 0x31, 0x30, 0x37, 0x30, 0x31, + 0x31, 0x35, 0x32, 0x32, 0x34, 0x37, 0x5a, 0x30, 0x68, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, + 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x16, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x69, 0x74, 0x61, 0x74, + 0x20, 0x56, 0x61, 0x6c, 0x65, 0x6e, 0x63, 0x69, 0x61, 0x6e, 0x61, + 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x06, + 0x50, 0x4b, 0x49, 0x47, 0x56, 0x41, 0x31, 0x27, 0x30, 0x25, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x13, 0x1e, 0x52, 0x6f, 0x6f, 0x74, 0x20, + 0x43, 0x41, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x69, + 0x74, 0x61, 0x74, 0x20, 0x56, 0x61, 0x6c, 0x65, 0x6e, 0x63, 0x69, + 0x61, 0x6e, 0x61, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, + 0x01, 0x01, 0x00, 0xc6, 0x2a, 0xab, 0x57, 0x11, 0x37, 0x2f, 0x22, + 0x8a, 0xca, 0x03, 0x74, 0x1d, 0xca, 0xed, 0x2d, 0xa2, 0x0b, 0xbc, + 0x33, 0x52, 0x40, 0x26, 0x47, 0xbe, 0x5a, 0x69, 0xa6, 0x3b, 0x72, + 0x36, 0x17, 0x4c, 0xe8, 0xdf, 0xb8, 0xbb, 0x2f, 0x76, 0xe1, 0x40, + 0x46, 0x74, 0x65, 0x02, 0x90, 0x52, 0x08, 0xb4, 0xff, 0xa8, 0x8c, + 0xc1, 0xe0, 0xc7, 0x89, 0x56, 0x10, 0x39, 0x33, 0xef, 0x68, 0xb4, + 0x5f, 0x5f, 0xda, 0x6d, 0x23, 0xa1, 0x89, 0x5e, 0x22, 0xa3, 0x4a, + 0x06, 0xf0, 0x27, 0xf0, 0x57, 0xb9, 0xf8, 0xe9, 0x4e, 0x32, 0x77, + 0x0a, 0x3f, 0x41, 0x64, 0xf3, 0xeb, 0x65, 0xee, 0x76, 0xfe, 0x54, + 0xaa, 0x7d, 0x1d, 0x20, 0xae, 0xf3, 0xd7, 0x74, 0xc2, 0x0a, 0x5f, + 0xf5, 0x08, 0x28, 0x52, 0x08, 0xcc, 0x55, 0x5d, 0xd2, 0x0f, 0xdb, + 0x9a, 0x81, 0xa5, 0xbb, 0xa1, 0xb3, 0xc1, 0x94, 0xcd, 0x54, 0xe0, + 0x32, 0x75, 0x31, 0x91, 0x1a, 0x62, 0xb2, 0xde, 0x75, 0xe2, 0xcf, + 0x4f, 0x89, 0xd9, 0x91, 0x90, 0x0f, 0x41, 0x1b, 0xb4, 0x5a, 0x4a, + 0x77, 0xbd, 0x67, 0x83, 0xe0, 0x93, 0xe7, 0x5e, 0xa7, 0x0c, 0xe7, + 0x81, 0xd3, 0xf4, 0x52, 0xac, 0x53, 0xb2, 0x03, 0xc7, 0x44, 0x26, + 0xfb, 0x79, 0xe5, 0xcb, 0x34, 0x60, 0x50, 0x10, 0x7b, 0x1b, 0xdb, + 0x6b, 0xd7, 0x47, 0xab, 0x5f, 0x7c, 0x68, 0xca, 0x6e, 0x9d, 0x41, + 0x03, 0x10, 0xee, 0x6b, 0x99, 0x7b, 0x5e, 0x25, 0xa8, 0xc2, 0xab, + 0xe4, 0xc0, 0xf3, 0x5c, 0x9c, 0xe3, 0xbe, 0xce, 0x31, 0x4c, 0x64, + 0x1e, 0x5e, 0x80, 0xa2, 0xf5, 0x83, 0x7e, 0x0c, 0xd6, 0xca, 0x8c, + 0x55, 0x8e, 0xbe, 0xe0, 0xbe, 0x49, 0x07, 0x0f, 0xa3, 0x24, 0x41, + 0x7a, 0x58, 0x1d, 0x84, 0xea, 0x58, 0x12, 0xc8, 0xe1, 0xb7, 0xed, + 0xef, 0x93, 0xde, 0x94, 0x08, 0x31, 0x02, 0x03, 0x01, 0x00, 0x01, + 0xa3, 0x82, 0x03, 0x3b, 0x30, 0x82, 0x03, 0x37, 0x30, 0x32, 0x06, + 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x26, + 0x30, 0x24, 0x30, 0x22, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, + 0x07, 0x30, 0x01, 0x86, 0x16, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x6f, 0x63, 0x73, 0x70, 0x2e, 0x70, 0x6b, 0x69, 0x2e, 0x67, + 0x76, 0x61, 0x2e, 0x65, 0x73, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, + 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, + 0x02, 0x01, 0x02, 0x30, 0x82, 0x02, 0x34, 0x06, 0x03, 0x55, 0x1d, + 0x20, 0x04, 0x82, 0x02, 0x2b, 0x30, 0x82, 0x02, 0x27, 0x30, 0x82, + 0x02, 0x23, 0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, 0x01, 0xbf, 0x55, + 0x02, 0x01, 0x00, 0x30, 0x82, 0x02, 0x13, 0x30, 0x82, 0x01, 0xe8, + 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, 0x30, + 0x82, 0x01, 0xda, 0x1e, 0x82, 0x01, 0xd6, 0x00, 0x41, 0x00, 0x75, + 0x00, 0x74, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x69, 0x00, 0x64, 0x00, + 0x61, 0x00, 0x64, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, + 0x00, 0x43, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x69, 0x00, + 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x63, 0x00, 0x69, + 0x00, 0xf3, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x52, 0x00, 0x61, 0x00, + 0xed, 0x00, 0x7a, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, + 0x00, 0x6c, 0x00, 0x61, 0x00, 0x20, 0x00, 0x47, 0x00, 0x65, 0x00, + 0x6e, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x69, + 0x00, 0x74, 0x00, 0x61, 0x00, 0x74, 0x00, 0x20, 0x00, 0x56, 0x00, + 0x61, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x69, + 0x00, 0x61, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x2e, 0x00, 0x0d, 0x00, + 0x0a, 0x00, 0x4c, 0x00, 0x61, 0x00, 0x20, 0x00, 0x44, 0x00, 0x65, + 0x00, 0x63, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x72, 0x00, 0x61, 0x00, + 0x63, 0x00, 0x69, 0x00, 0xf3, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x64, + 0x00, 0x65, 0x00, 0x20, 0x00, 0x50, 0x00, 0x72, 0x00, 0xe1, 0x00, + 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x73, + 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x00, 0x43, 0x00, + 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, + 0x00, 0x63, 0x00, 0x61, 0x00, 0x63, 0x00, 0x69, 0x00, 0xf3, 0x00, + 0x6e, 0x00, 0x20, 0x00, 0x71, 0x00, 0x75, 0x00, 0x65, 0x00, 0x20, + 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x65, 0x00, 0x20, 0x00, + 0x65, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6e, + 0x00, 0x63, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x61, 0x00, + 0x6d, 0x00, 0x69, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x6f, + 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6c, 0x00, + 0x61, 0x00, 0x20, 0x00, 0x70, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, + 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x20, 0x00, + 0x41, 0x00, 0x75, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x69, + 0x00, 0x64, 0x00, 0x61, 0x00, 0x64, 0x00, 0x20, 0x00, 0x64, 0x00, + 0x65, 0x00, 0x20, 0x00, 0x43, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, + 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, + 0x63, 0x00, 0x69, 0x00, 0xf3, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x73, + 0x00, 0x65, 0x00, 0x20, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x63, 0x00, + 0x75, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, + 0x00, 0x20, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6c, 0x00, + 0x61, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69, 0x00, 0x72, 0x00, 0x65, + 0x00, 0x63, 0x00, 0x63, 0x00, 0x69, 0x00, 0xf3, 0x00, 0x6e, 0x00, + 0x20, 0x00, 0x77, 0x00, 0x65, 0x00, 0x62, 0x00, 0x20, 0x00, 0x68, + 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x3a, 0x00, 0x2f, 0x00, + 0x2f, 0x00, 0x77, 0x00, 0x77, 0x00, 0x77, 0x00, 0x2e, 0x00, 0x70, + 0x00, 0x6b, 0x00, 0x69, 0x00, 0x2e, 0x00, 0x67, 0x00, 0x76, 0x00, + 0x61, 0x00, 0x2e, 0x00, 0x65, 0x00, 0x73, 0x00, 0x2f, 0x00, 0x63, + 0x00, 0x70, 0x00, 0x73, 0x30, 0x25, 0x06, 0x08, 0x2b, 0x06, 0x01, + 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x19, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x70, 0x6b, 0x69, 0x2e, + 0x67, 0x76, 0x61, 0x2e, 0x65, 0x73, 0x2f, 0x63, 0x70, 0x73, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x7b, + 0x35, 0xd3, 0x40, 0xd2, 0x1c, 0x78, 0x19, 0x66, 0xef, 0x74, 0x10, + 0x28, 0xdc, 0x3e, 0x4f, 0xb2, 0x78, 0x04, 0xfc, 0x30, 0x81, 0x95, + 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x81, 0x8d, 0x30, 0x81, 0x8a, + 0x80, 0x14, 0x7b, 0x35, 0xd3, 0x40, 0xd2, 0x1c, 0x78, 0x19, 0x66, + 0xef, 0x74, 0x10, 0x28, 0xdc, 0x3e, 0x4f, 0xb2, 0x78, 0x04, 0xfc, + 0xa1, 0x6c, 0xa4, 0x6a, 0x30, 0x68, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x1f, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x16, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x6c, 0x69, 0x74, 0x61, 0x74, 0x20, 0x56, 0x61, + 0x6c, 0x65, 0x6e, 0x63, 0x69, 0x61, 0x6e, 0x61, 0x31, 0x0f, 0x30, + 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x06, 0x50, 0x4b, 0x49, + 0x47, 0x56, 0x41, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x1e, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x69, 0x74, 0x61, 0x74, + 0x20, 0x56, 0x61, 0x6c, 0x65, 0x6e, 0x63, 0x69, 0x61, 0x6e, 0x61, + 0x82, 0x04, 0x3b, 0x45, 0xe5, 0x68, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x01, 0x00, 0x24, 0x61, 0x4e, 0xf5, 0xb5, 0xc8, 0x42, + 0x02, 0x2a, 0xb3, 0x5c, 0x75, 0xad, 0xc5, 0x6d, 0xca, 0xe7, 0x94, + 0x3f, 0xa5, 0x68, 0x95, 0x88, 0xc1, 0x54, 0xc0, 0x10, 0x69, 0xa2, + 0x12, 0x2f, 0x18, 0x3f, 0x25, 0x50, 0xa8, 0x7c, 0x4a, 0xea, 0xc6, + 0x09, 0xd9, 0xf4, 0x75, 0xc6, 0x40, 0xda, 0xaf, 0x50, 0x9d, 0x3d, + 0xa5, 0x16, 0xbb, 0x6d, 0x31, 0xc6, 0xc7, 0x73, 0x0a, 0x48, 0xfe, + 0x20, 0x72, 0xed, 0x6f, 0xcc, 0xe8, 0x83, 0x61, 0x16, 0x46, 0x90, + 0x01, 0x95, 0x4b, 0x7d, 0x8e, 0x9a, 0x52, 0x09, 0x2f, 0xf6, 0x6f, + 0x1c, 0xe4, 0xa1, 0x71, 0xcf, 0x8c, 0x2a, 0x5a, 0x17, 0x73, 0x83, + 0x47, 0x4d, 0x0f, 0x36, 0xfb, 0x04, 0x4d, 0x49, 0x51, 0xe2, 0x14, + 0xc9, 0x64, 0x61, 0xfb, 0xd4, 0x14, 0xe0, 0xf4, 0x9e, 0xb7, 0x34, + 0x8f, 0x0a, 0x26, 0xbd, 0x97, 0x5c, 0xf4, 0x79, 0x3a, 0x4a, 0x30, + 0x19, 0xcc, 0xad, 0x4f, 0xa0, 0x98, 0x8a, 0xb4, 0x31, 0x97, 0x2a, + 0xe2, 0x73, 0x6d, 0x7e, 0x78, 0xb8, 0xf8, 0x88, 0x89, 0x4f, 0xb1, + 0x22, 0x91, 0x64, 0x4b, 0xf5, 0x50, 0xde, 0x03, 0xdb, 0xe5, 0xc5, + 0x76, 0xe7, 0x13, 0x66, 0x75, 0x7e, 0x65, 0xfb, 0x01, 0x9f, 0x93, + 0x87, 0x88, 0x9d, 0xf9, 0x46, 0x57, 0x7c, 0x4d, 0x60, 0xaf, 0x98, + 0x73, 0x13, 0x23, 0xa4, 0x20, 0x91, 0x81, 0xfa, 0xd0, 0x61, 0x66, + 0xb8, 0x7d, 0xd1, 0xaf, 0xd6, 0x6f, 0x1e, 0x6c, 0x3d, 0xe9, 0x11, + 0xfd, 0xa9, 0xf9, 0x82, 0x22, 0x86, 0x99, 0x33, 0x71, 0x5a, 0xea, + 0x19, 0x57, 0x3d, 0x91, 0xcd, 0xa9, 0xc0, 0xa3, 0x6e, 0x07, 0x13, + 0xa6, 0xc9, 0xed, 0xf8, 0x68, 0xa3, 0x9e, 0xc3, 0x5a, 0x72, 0x09, + 0x87, 0x28, 0xd1, 0xc4, 0x73, 0xc4, 0x73, 0x18, 0x5f, 0x50, 0x75, + 0x16, 0x31, 0x9f, 0xb7, 0xe8, 0x7c, 0xc3, 0x30, 0x82, 0x03, 0xcf, + 0x30, 0x82, 0x02, 0xb7, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x03, + 0x01, 0x6c, 0x1e, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0x8d, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x41, + 0x54, 0x31, 0x48, 0x30, 0x46, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, + 0x3f, 0x41, 0x2d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x47, 0x65, + 0x73, 0x2e, 0x20, 0x66, 0x2e, 0x20, 0x53, 0x69, 0x63, 0x68, 0x65, + 0x72, 0x68, 0x65, 0x69, 0x74, 0x73, 0x73, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x65, 0x20, 0x69, 0x6d, 0x20, 0x65, 0x6c, 0x65, 0x6b, 0x74, + 0x72, 0x2e, 0x20, 0x44, 0x61, 0x74, 0x65, 0x6e, 0x76, 0x65, 0x72, + 0x6b, 0x65, 0x68, 0x72, 0x20, 0x47, 0x6d, 0x62, 0x48, 0x31, 0x19, + 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x10, 0x41, 0x2d, + 0x54, 0x72, 0x75, 0x73, 0x74, 0x2d, 0x6e, 0x51, 0x75, 0x61, 0x6c, + 0x2d, 0x30, 0x33, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x10, 0x41, 0x2d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x2d, + 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x2d, 0x30, 0x33, 0x30, 0x1e, 0x17, + 0x0d, 0x30, 0x35, 0x30, 0x38, 0x31, 0x37, 0x32, 0x32, 0x30, 0x30, + 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x31, 0x35, 0x30, 0x38, 0x31, 0x37, + 0x32, 0x32, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x81, 0x8d, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x41, + 0x54, 0x31, 0x48, 0x30, 0x46, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, + 0x3f, 0x41, 0x2d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x47, 0x65, + 0x73, 0x2e, 0x20, 0x66, 0x2e, 0x20, 0x53, 0x69, 0x63, 0x68, 0x65, + 0x72, 0x68, 0x65, 0x69, 0x74, 0x73, 0x73, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x65, 0x20, 0x69, 0x6d, 0x20, 0x65, 0x6c, 0x65, 0x6b, 0x74, + 0x72, 0x2e, 0x20, 0x44, 0x61, 0x74, 0x65, 0x6e, 0x76, 0x65, 0x72, + 0x6b, 0x65, 0x68, 0x72, 0x20, 0x47, 0x6d, 0x62, 0x48, 0x31, 0x19, + 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x10, 0x41, 0x2d, + 0x54, 0x72, 0x75, 0x73, 0x74, 0x2d, 0x6e, 0x51, 0x75, 0x61, 0x6c, + 0x2d, 0x30, 0x33, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x10, 0x41, 0x2d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x2d, + 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x2d, 0x30, 0x33, 0x30, 0x82, 0x01, + 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, + 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xad, 0x3d, 0x61, + 0x6e, 0x03, 0xf3, 0x90, 0x3b, 0xc0, 0x41, 0x0b, 0x84, 0x80, 0xcd, + 0xec, 0x2a, 0xa3, 0x9d, 0x6b, 0xbb, 0x6e, 0xc2, 0x42, 0x84, 0xf7, + 0x51, 0x14, 0xe1, 0xa0, 0xa8, 0x2d, 0x51, 0xa3, 0x51, 0xf2, 0xde, + 0x23, 0xf0, 0x34, 0x44, 0xff, 0x94, 0xeb, 0xcc, 0x05, 0x23, 0x95, + 0x40, 0xb9, 0x07, 0x78, 0xa5, 0x25, 0xf6, 0x0a, 0xbd, 0x45, 0x86, + 0xe8, 0xd9, 0xbd, 0xc0, 0x04, 0x8e, 0x85, 0x44, 0x61, 0xef, 0x7f, + 0xa7, 0xc9, 0xfa, 0xc1, 0x25, 0xcc, 0x85, 0x2c, 0x63, 0x3f, 0x05, + 0x60, 0x73, 0x49, 0x05, 0xe0, 0x60, 0x78, 0x95, 0x10, 0x4b, 0xdc, + 0xf9, 0x11, 0x59, 0xce, 0x71, 0x7f, 0x40, 0x9b, 0x8a, 0xaa, 0x24, + 0xdf, 0x0b, 0x42, 0xe2, 0xdb, 0x56, 0xbc, 0x4a, 0xd2, 0xa5, 0x0c, + 0x9b, 0xb7, 0x43, 0x3e, 0xdd, 0x83, 0xd3, 0x26, 0x10, 0x02, 0xcf, + 0xea, 0x23, 0xc4, 0x49, 0x4e, 0xe5, 0xd3, 0xe9, 0xb4, 0x88, 0xab, + 0x0c, 0xae, 0x62, 0x92, 0xd4, 0x65, 0x87, 0xd9, 0x6a, 0xd7, 0xf4, + 0x85, 0x9f, 0xe4, 0x33, 0x22, 0x25, 0xa5, 0xe5, 0xc8, 0x33, 0xba, + 0xc3, 0xc7, 0x41, 0xdc, 0x5f, 0xc6, 0x6a, 0xcc, 0x00, 0x0e, 0x6d, + 0x32, 0xa8, 0xb6, 0x87, 0x36, 0x00, 0x62, 0x77, 0x9b, 0x1e, 0x1f, + 0x34, 0xcb, 0x90, 0x3c, 0x78, 0x88, 0x74, 0x05, 0xeb, 0x79, 0xf5, + 0x93, 0x71, 0x65, 0xca, 0x9d, 0xc7, 0x6b, 0x18, 0x2d, 0x3d, 0x5c, + 0x4e, 0xe7, 0xd5, 0xf8, 0x3f, 0x31, 0x7d, 0x8f, 0x87, 0xec, 0x0a, + 0x22, 0x2f, 0x23, 0xe9, 0xfe, 0xbb, 0x7d, 0xc9, 0xe0, 0xf4, 0xec, + 0xeb, 0x7c, 0xc4, 0xb0, 0xc3, 0x2d, 0x62, 0xb5, 0x9a, 0x71, 0xd6, + 0xb1, 0x6a, 0xe8, 0xec, 0xd9, 0xed, 0xd5, 0x72, 0xec, 0xbe, 0x57, + 0x01, 0xce, 0x05, 0x55, 0x9f, 0xde, 0xd1, 0x60, 0x88, 0x10, 0xb3, + 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x36, 0x30, 0x34, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, + 0x03, 0x01, 0x01, 0xff, 0x30, 0x11, 0x06, 0x03, 0x55, 0x1d, 0x0e, + 0x04, 0x0a, 0x04, 0x08, 0x44, 0x6a, 0x95, 0x67, 0x55, 0x79, 0x11, + 0x4f, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, + 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x01, 0x00, 0x55, 0xd4, 0x54, 0xd1, 0x59, 0x48, 0x5c, + 0xb3, 0x93, 0x85, 0xaa, 0xbf, 0x63, 0x2f, 0xe4, 0x80, 0xce, 0x34, + 0xa3, 0x34, 0x62, 0x3e, 0xf6, 0xd8, 0xee, 0x67, 0x88, 0x31, 0x04, + 0x03, 0x6f, 0x0b, 0xd4, 0x07, 0xfb, 0x4e, 0x75, 0x0f, 0xd3, 0x2e, + 0xd3, 0xc0, 0x17, 0xc7, 0xc6, 0x28, 0xec, 0x06, 0x0d, 0x11, 0x24, + 0x0e, 0x0e, 0xa5, 0x5d, 0xbf, 0x8c, 0xb2, 0x13, 0x96, 0x71, 0xdc, + 0xd4, 0xce, 0x0e, 0x0d, 0x0a, 0x68, 0x32, 0x6c, 0xb9, 0x41, 0x31, + 0x19, 0xab, 0xb1, 0x07, 0x7b, 0x4d, 0x98, 0xd3, 0x5c, 0xb0, 0xd1, + 0xf0, 0xa7, 0x42, 0xa0, 0xb5, 0xc4, 0x8e, 0xaf, 0xfe, 0xf1, 0x3f, + 0xf4, 0xef, 0x4f, 0x46, 0x00, 0x76, 0xeb, 0x02, 0xfb, 0xf9, 0x9d, + 0xd2, 0x40, 0x96, 0xc7, 0x88, 0x3a, 0xb8, 0x9f, 0x11, 0x79, 0xf3, + 0x80, 0x65, 0xa8, 0xbd, 0x1f, 0xd3, 0x78, 0x81, 0xa0, 0x51, 0x4c, + 0x37, 0xb4, 0xa6, 0x5d, 0x25, 0x70, 0xd1, 0x66, 0xc9, 0x68, 0xf9, + 0x2e, 0x11, 0x14, 0x68, 0xf1, 0x54, 0x98, 0x08, 0xac, 0x26, 0x92, + 0x0f, 0xde, 0x89, 0x9e, 0xd4, 0xfa, 0xb3, 0x79, 0x2b, 0xd2, 0xa3, + 0x79, 0xd4, 0xec, 0x8b, 0xac, 0x87, 0x53, 0x68, 0x42, 0x4c, 0x51, + 0x51, 0x74, 0x1e, 0x1b, 0x27, 0x2e, 0xe3, 0xf5, 0x1f, 0x29, 0x74, + 0x4d, 0xed, 0xaf, 0xf7, 0xe1, 0x92, 0x99, 0x81, 0xe8, 0xbe, 0x3a, + 0xc7, 0x17, 0x50, 0xf6, 0xb7, 0xc6, 0xfc, 0x9b, 0xb0, 0x8a, 0x6b, + 0xd6, 0x88, 0x03, 0x91, 0x8f, 0x06, 0x77, 0x3a, 0x85, 0x02, 0xdd, + 0x98, 0xd5, 0x43, 0x78, 0x3f, 0xc6, 0x30, 0x15, 0xac, 0x9b, 0x6b, + 0xcb, 0x57, 0xb7, 0x89, 0x51, 0x8b, 0x3a, 0xe8, 0xc9, 0x84, 0x0c, + 0xdb, 0xb1, 0x50, 0x20, 0x0a, 0x1a, 0x4a, 0xba, 0x6a, 0x1a, 0xbd, + 0xec, 0x1b, 0xc8, 0xc5, 0x84, 0x9a, 0xcd, 0x30, 0x82, 0x03, 0x7b, + 0x30, 0x82, 0x02, 0x63, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, + 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x5f, 0x31, 0x0b, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x54, 0x57, 0x31, 0x12, + 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x09, 0x54, 0x41, + 0x49, 0x57, 0x41, 0x4e, 0x2d, 0x43, 0x41, 0x31, 0x10, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x07, 0x52, 0x6f, 0x6f, 0x74, + 0x20, 0x43, 0x41, 0x31, 0x2a, 0x30, 0x28, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x21, 0x54, 0x57, 0x43, 0x41, 0x20, 0x52, 0x6f, 0x6f, + 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x30, 0x38, + 0x32, 0x38, 0x30, 0x37, 0x32, 0x34, 0x33, 0x33, 0x5a, 0x17, 0x0d, + 0x33, 0x30, 0x31, 0x32, 0x33, 0x31, 0x31, 0x35, 0x35, 0x39, 0x35, + 0x39, 0x5a, 0x30, 0x5f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x54, 0x57, 0x31, 0x12, 0x30, 0x10, 0x06, + 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x09, 0x54, 0x41, 0x49, 0x57, 0x41, + 0x4e, 0x2d, 0x43, 0x41, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x04, 0x0b, 0x0c, 0x07, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, + 0x31, 0x2a, 0x30, 0x28, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x21, + 0x54, 0x57, 0x43, 0x41, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, + 0xb0, 0x7e, 0x72, 0xb8, 0xa4, 0x03, 0x94, 0xe6, 0xa7, 0xde, 0x09, + 0x38, 0x91, 0x4a, 0x11, 0x40, 0x87, 0xa7, 0x7c, 0x59, 0x64, 0x14, + 0x7b, 0xb5, 0x11, 0x10, 0xdd, 0xfe, 0xbf, 0xd5, 0xc0, 0xbb, 0x56, + 0xe2, 0x85, 0x25, 0xf4, 0x35, 0x72, 0x0f, 0xf8, 0x53, 0xd0, 0x41, + 0xe1, 0x44, 0x01, 0xc2, 0xb4, 0x1c, 0xc3, 0x31, 0x42, 0x16, 0x47, + 0x85, 0x33, 0x22, 0x76, 0xb2, 0x0a, 0x6f, 0x0f, 0xe5, 0x25, 0x50, + 0x4f, 0x85, 0x86, 0xbe, 0xbf, 0x98, 0x2e, 0x10, 0x67, 0x1e, 0xbe, + 0x11, 0x05, 0x86, 0x05, 0x90, 0xc4, 0x59, 0xd0, 0x7c, 0x78, 0x10, + 0xb0, 0x80, 0x5c, 0xb7, 0xe1, 0xc7, 0x2b, 0x75, 0xcb, 0x7c, 0x9f, + 0xae, 0xb5, 0xd1, 0x9d, 0x23, 0x37, 0x63, 0xa7, 0xdc, 0x42, 0xa2, + 0x2d, 0x92, 0x04, 0x1b, 0x50, 0xc1, 0x7b, 0xb8, 0x3e, 0x1b, 0xc9, + 0x56, 0x04, 0x8b, 0x2f, 0x52, 0x9b, 0xad, 0xa9, 0x56, 0xe9, 0xc1, + 0xff, 0xad, 0xa9, 0x58, 0x87, 0x30, 0xb6, 0x81, 0xf7, 0x97, 0x45, + 0xfc, 0x19, 0x57, 0x3b, 0x2b, 0x6f, 0xe4, 0x47, 0xf4, 0x99, 0x45, + 0xfe, 0x1d, 0xf1, 0xf8, 0x97, 0xa3, 0x88, 0x1d, 0x37, 0x1c, 0x5c, + 0x8f, 0xe0, 0x76, 0x25, 0x9a, 0x50, 0xf8, 0xa0, 0x54, 0xff, 0x44, + 0x90, 0x76, 0x23, 0xd2, 0x32, 0xc6, 0xc3, 0xab, 0x06, 0xbf, 0xfc, + 0xfb, 0xbf, 0xf3, 0xad, 0x7d, 0x92, 0x62, 0x02, 0x5b, 0x29, 0xd3, + 0x35, 0xa3, 0x93, 0x9a, 0x43, 0x64, 0x60, 0x5d, 0xb2, 0xfa, 0x32, + 0xff, 0x3b, 0x04, 0xaf, 0x4d, 0x40, 0x6a, 0xf9, 0xc7, 0xe3, 0xef, + 0x23, 0xfd, 0x6b, 0xcb, 0xe5, 0x0f, 0x8b, 0x38, 0x0d, 0xee, 0x0a, + 0xfc, 0xfe, 0x0f, 0x98, 0x9f, 0x30, 0x31, 0xdd, 0x6c, 0x52, 0x65, + 0xf9, 0x8b, 0x81, 0xbe, 0x22, 0xe1, 0x1c, 0x58, 0x03, 0xba, 0x91, + 0x1b, 0x89, 0x07, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, + 0x40, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, + 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, + 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, + 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, + 0x14, 0x6a, 0x38, 0x5b, 0x26, 0x8d, 0xde, 0x8b, 0x5a, 0xf2, 0x4f, + 0x7a, 0x54, 0x83, 0x19, 0x18, 0xe3, 0x08, 0x35, 0xa6, 0xba, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x3c, 0xd5, 0x77, + 0x3d, 0xda, 0xdf, 0x89, 0xba, 0x87, 0x0c, 0x08, 0x54, 0x6a, 0x20, + 0x50, 0x92, 0xbe, 0xb0, 0x41, 0x3d, 0xb9, 0x26, 0x64, 0x83, 0x0a, + 0x2f, 0xe8, 0x40, 0xc0, 0x97, 0x28, 0x27, 0x82, 0x30, 0x4a, 0xc9, + 0x93, 0xff, 0x6a, 0xe7, 0xa6, 0x00, 0x7f, 0x89, 0x42, 0x9a, 0xd6, + 0x11, 0xe5, 0x53, 0xce, 0x2f, 0xcc, 0xf2, 0xda, 0x05, 0xc4, 0xfe, + 0xe2, 0x50, 0xc4, 0x3a, 0x86, 0x7d, 0xcc, 0xda, 0x7e, 0x10, 0x09, + 0x3b, 0x92, 0x35, 0x2a, 0x53, 0xb2, 0xfe, 0xeb, 0x2b, 0x05, 0xd9, + 0x6c, 0x5d, 0xe6, 0xd0, 0xef, 0xd3, 0x6a, 0x66, 0x9e, 0x15, 0x28, + 0x85, 0x7a, 0xe8, 0x82, 0x00, 0xac, 0x1e, 0xa7, 0x09, 0x69, 0x56, + 0x42, 0xd3, 0x68, 0x51, 0x18, 0xbe, 0x54, 0x9a, 0xbf, 0x44, 0x41, + 0xba, 0x49, 0xbe, 0x20, 0xba, 0x69, 0x5c, 0xee, 0xb8, 0x77, 0xcd, + 0xce, 0x6c, 0x1f, 0xad, 0x83, 0x96, 0x18, 0x7d, 0x0e, 0xb5, 0x14, + 0x39, 0x84, 0xf1, 0x28, 0xe9, 0x2d, 0xa3, 0x9e, 0x7b, 0x1e, 0x7a, + 0x72, 0x5a, 0x83, 0xb3, 0x79, 0x6f, 0xef, 0xb4, 0xfc, 0xd0, 0x0a, + 0xa5, 0x58, 0x4f, 0x46, 0xdf, 0xfb, 0x6d, 0x79, 0x59, 0xf2, 0x84, + 0x22, 0x52, 0xae, 0x0f, 0xcc, 0xfb, 0x7c, 0x3b, 0xe7, 0x6a, 0xca, + 0x47, 0x61, 0xc3, 0x7a, 0xf8, 0xd3, 0x92, 0x04, 0x1f, 0xb8, 0x20, + 0x84, 0xe1, 0x36, 0x54, 0x16, 0xc7, 0x40, 0xde, 0x3b, 0x8a, 0x73, + 0xdc, 0xdf, 0xc6, 0x09, 0x4c, 0xdf, 0xec, 0xda, 0xff, 0xd4, 0x53, + 0x42, 0xa1, 0xc9, 0xf2, 0x62, 0x1d, 0x22, 0x83, 0x3c, 0x97, 0xc5, + 0xf9, 0x19, 0x62, 0x27, 0xac, 0x65, 0x22, 0xd7, 0xd3, 0x3c, 0xc6, + 0xe5, 0x8e, 0xb2, 0x53, 0xcc, 0x49, 0xce, 0xbc, 0x30, 0xfe, 0x7b, + 0x0e, 0x33, 0x90, 0xfb, 0xed, 0xd2, 0x14, 0x91, 0x1f, 0x07, 0xaf, + 0x30, 0x82, 0x03, 0x77, 0x30, 0x82, 0x02, 0x5f, 0xa0, 0x03, 0x02, + 0x01, 0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x5d, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x4a, 0x50, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x13, 0x1c, 0x53, 0x45, 0x43, 0x4f, 0x4d, 0x20, 0x54, 0x72, 0x75, + 0x73, 0x74, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, + 0x43, 0x4f, 0x2e, 0x2c, 0x4c, 0x54, 0x44, 0x2e, 0x31, 0x27, 0x30, + 0x25, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1e, 0x53, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x75, + 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x6f, + 0x6f, 0x74, 0x43, 0x41, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, + 0x30, 0x35, 0x32, 0x39, 0x30, 0x35, 0x30, 0x30, 0x33, 0x39, 0x5a, + 0x17, 0x0d, 0x32, 0x39, 0x30, 0x35, 0x32, 0x39, 0x30, 0x35, 0x30, + 0x30, 0x33, 0x39, 0x5a, 0x30, 0x5d, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4a, 0x50, 0x31, 0x25, 0x30, + 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x45, 0x43, + 0x4f, 0x4d, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x53, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x43, 0x4f, 0x2e, 0x2c, 0x4c, + 0x54, 0x44, 0x2e, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, + 0x0b, 0x13, 0x1e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x32, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, + 0xd0, 0x15, 0x39, 0x52, 0xb1, 0x52, 0xb3, 0xba, 0xc5, 0x59, 0x82, + 0xc4, 0x5d, 0x52, 0xae, 0x3a, 0x43, 0x65, 0x80, 0x4b, 0xc7, 0xf2, + 0x96, 0xbc, 0xdb, 0x36, 0x97, 0xd6, 0xa6, 0x64, 0x8c, 0xa8, 0x5e, + 0xf0, 0xe3, 0x0a, 0x1c, 0xf7, 0xdf, 0x97, 0x3d, 0x4b, 0xae, 0xf6, + 0x5d, 0xec, 0x21, 0xb5, 0x41, 0xab, 0xcd, 0xb9, 0x7e, 0x76, 0x9f, + 0xbe, 0xf9, 0x3e, 0x36, 0x34, 0xa0, 0x3b, 0xc1, 0xf6, 0x31, 0x11, + 0x45, 0x74, 0x93, 0x3d, 0x57, 0x80, 0xc5, 0xf9, 0x89, 0x99, 0xca, + 0xe5, 0xab, 0x6a, 0xd4, 0xb5, 0xda, 0x41, 0x90, 0x10, 0xc1, 0xd6, + 0xd6, 0x42, 0x89, 0xc2, 0xbf, 0xf4, 0x38, 0x12, 0x95, 0x4c, 0x54, + 0x05, 0xf7, 0x36, 0xe4, 0x45, 0x83, 0x7b, 0x14, 0x65, 0xd6, 0xdc, + 0x0c, 0x4d, 0xd1, 0xde, 0x7e, 0x0c, 0xab, 0x3b, 0xc4, 0x15, 0xbe, + 0x3a, 0x56, 0xa6, 0x5a, 0x6f, 0x76, 0x69, 0x52, 0xa9, 0x7a, 0xb9, + 0xc8, 0xeb, 0x6a, 0x9a, 0x5d, 0x52, 0xd0, 0x2d, 0x0a, 0x6b, 0x35, + 0x16, 0x09, 0x10, 0x84, 0xd0, 0x6a, 0xca, 0x3a, 0x06, 0x00, 0x37, + 0x47, 0xe4, 0x7e, 0x57, 0x4f, 0x3f, 0x8b, 0xeb, 0x67, 0xb8, 0x88, + 0xaa, 0xc5, 0xbe, 0x53, 0x55, 0xb2, 0x91, 0xc4, 0x7d, 0xb9, 0xb0, + 0x85, 0x19, 0x06, 0x78, 0x2e, 0xdb, 0x61, 0x1a, 0xfa, 0x85, 0xf5, + 0x4a, 0x91, 0xa1, 0xe7, 0x16, 0xd5, 0x8e, 0xa2, 0x39, 0xdf, 0x94, + 0xb8, 0x70, 0x1f, 0x28, 0x3f, 0x8b, 0xfc, 0x40, 0x5e, 0x63, 0x83, + 0x3c, 0x83, 0x2a, 0x1a, 0x99, 0x6b, 0xcf, 0xde, 0x59, 0x6a, 0x3b, + 0xfc, 0x6f, 0x16, 0xd7, 0x1f, 0xfd, 0x4a, 0x10, 0xeb, 0x4e, 0x82, + 0x16, 0x3a, 0xac, 0x27, 0x0c, 0x53, 0xf1, 0xad, 0xd5, 0x24, 0xb0, + 0x6b, 0x03, 0x50, 0xc1, 0x2d, 0x3c, 0x16, 0xdd, 0x44, 0x34, 0x27, + 0x1a, 0x75, 0xfb, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, + 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, + 0x14, 0x0a, 0x85, 0xa9, 0x77, 0x65, 0x05, 0x98, 0x7c, 0x40, 0x81, + 0xf8, 0x0f, 0x97, 0x2c, 0x38, 0xf1, 0x0a, 0xec, 0x3c, 0xcf, 0x30, + 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, + 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, + 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x4c, 0x3a, 0xa3, + 0x44, 0xac, 0xb9, 0x45, 0xb1, 0xc7, 0x93, 0x7e, 0xc8, 0x0b, 0x0a, + 0x42, 0xdf, 0x64, 0xea, 0x1c, 0xee, 0x59, 0x6c, 0x08, 0xba, 0x89, + 0x5f, 0x6a, 0xca, 0x4a, 0x95, 0x9e, 0x7a, 0x8f, 0x07, 0xc5, 0xda, + 0x45, 0x72, 0x82, 0x71, 0x0e, 0x3a, 0xd2, 0xcc, 0x6f, 0xa7, 0xb4, + 0xa1, 0x23, 0xbb, 0xf6, 0x24, 0x9f, 0xcb, 0x17, 0xfe, 0x8c, 0xa6, + 0xce, 0xc2, 0xd2, 0xdb, 0xcc, 0x8d, 0xfc, 0x71, 0xfc, 0x03, 0x29, + 0xc1, 0x6c, 0x5d, 0x33, 0x5f, 0x64, 0xb6, 0x65, 0x3b, 0x89, 0x6f, + 0x18, 0x76, 0x78, 0xf5, 0xdc, 0xa2, 0x48, 0x1f, 0x19, 0x3f, 0x8e, + 0x93, 0xeb, 0xf1, 0xfa, 0x17, 0xee, 0xcd, 0x4e, 0xe3, 0x04, 0x12, + 0x55, 0xd6, 0xe5, 0xe4, 0xdd, 0xfb, 0x3e, 0x05, 0x7c, 0xe2, 0x1d, + 0x5e, 0xc6, 0xa7, 0xbc, 0x97, 0x4f, 0x68, 0x3a, 0xf5, 0xe9, 0x2e, + 0x0a, 0x43, 0xb6, 0xaf, 0x57, 0x5c, 0x62, 0x68, 0x7c, 0xb7, 0xfd, + 0xa3, 0x8a, 0x84, 0xa0, 0xac, 0x62, 0xbe, 0x2b, 0x09, 0x87, 0x34, + 0xf0, 0x6a, 0x01, 0xbb, 0x9b, 0x29, 0x56, 0x3c, 0xfe, 0x00, 0x37, + 0xcf, 0x23, 0x6c, 0xf1, 0x4e, 0xaa, 0xb6, 0x74, 0x46, 0x12, 0x6c, + 0x91, 0xee, 0x34, 0xd5, 0xec, 0x9a, 0x91, 0xe7, 0x44, 0xbe, 0x90, + 0x31, 0x72, 0xd5, 0x49, 0x02, 0xf6, 0x02, 0xe5, 0xf4, 0x1f, 0xeb, + 0x7c, 0xd9, 0x96, 0x55, 0xa9, 0xff, 0xec, 0x8a, 0xf9, 0x99, 0x47, + 0xff, 0x35, 0x5a, 0x02, 0xaa, 0x04, 0xcb, 0x8a, 0x5b, 0x87, 0x71, + 0x29, 0x91, 0xbd, 0xa4, 0xb4, 0x7a, 0x0d, 0xbd, 0x9a, 0xf5, 0x57, + 0x23, 0x00, 0x07, 0x21, 0x17, 0x3f, 0x4a, 0x39, 0xd1, 0x05, 0x49, + 0x0b, 0xa7, 0xb6, 0x37, 0x81, 0xa5, 0x5d, 0x8c, 0xaa, 0x33, 0x5e, + 0x81, 0x28, 0x7c, 0xa7, 0x7d, 0x27, 0xeb, 0x00, 0xae, 0x8d, 0x37, + 0x30, 0x82, 0x05, 0x56, 0x30, 0x82, 0x04, 0x3e, 0xa0, 0x03, 0x02, + 0x01, 0x02, 0x02, 0x10, 0xee, 0x2b, 0x3d, 0xeb, 0xd4, 0x21, 0xde, + 0x14, 0xa8, 0x62, 0xac, 0x04, 0xf3, 0xdd, 0xc4, 0x01, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, + 0x05, 0x00, 0x30, 0x81, 0xf3, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x3b, 0x30, 0x39, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x32, 0x41, 0x67, 0x65, 0x6e, + 0x63, 0x69, 0x61, 0x20, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x61, 0x6e, + 0x61, 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, 0x20, 0x28, 0x4e, 0x49, 0x46, + 0x20, 0x51, 0x2d, 0x30, 0x38, 0x30, 0x31, 0x31, 0x37, 0x36, 0x2d, + 0x49, 0x29, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x0b, + 0x13, 0x1f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x69, 0x73, 0x20, 0x50, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x73, 0x20, 0x64, 0x65, 0x20, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, + 0x31, 0x35, 0x30, 0x33, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2c, + 0x56, 0x65, 0x67, 0x65, 0x75, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, + 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x63, 0x61, 0x74, 0x63, + 0x65, 0x72, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x76, 0x65, 0x72, + 0x61, 0x72, 0x72, 0x65, 0x6c, 0x20, 0x28, 0x63, 0x29, 0x30, 0x33, + 0x31, 0x35, 0x30, 0x33, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2c, + 0x4a, 0x65, 0x72, 0x61, 0x72, 0x71, 0x75, 0x69, 0x61, 0x20, 0x45, + 0x6e, 0x74, 0x69, 0x74, 0x61, 0x74, 0x73, 0x20, 0x64, 0x65, 0x20, + 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, + 0x6f, 0x20, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x61, 0x6e, 0x65, 0x73, + 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x06, + 0x45, 0x43, 0x2d, 0x41, 0x43, 0x43, 0x30, 0x1e, 0x17, 0x0d, 0x30, + 0x33, 0x30, 0x31, 0x30, 0x37, 0x32, 0x33, 0x30, 0x30, 0x30, 0x30, + 0x5a, 0x17, 0x0d, 0x33, 0x31, 0x30, 0x31, 0x30, 0x37, 0x32, 0x32, + 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0xf3, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, + 0x3b, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x32, 0x41, + 0x67, 0x65, 0x6e, 0x63, 0x69, 0x61, 0x20, 0x43, 0x61, 0x74, 0x61, + 0x6c, 0x61, 0x6e, 0x61, 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, 0x20, 0x28, + 0x4e, 0x49, 0x46, 0x20, 0x51, 0x2d, 0x30, 0x38, 0x30, 0x31, 0x31, + 0x37, 0x36, 0x2d, 0x49, 0x29, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, + 0x55, 0x04, 0x0b, 0x13, 0x1f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x69, + 0x73, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x73, 0x20, 0x64, + 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x63, 0x69, 0x6f, 0x31, 0x35, 0x30, 0x33, 0x06, 0x03, 0x55, 0x04, + 0x0b, 0x13, 0x2c, 0x56, 0x65, 0x67, 0x65, 0x75, 0x20, 0x68, 0x74, + 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x63, + 0x61, 0x74, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, + 0x76, 0x65, 0x72, 0x61, 0x72, 0x72, 0x65, 0x6c, 0x20, 0x28, 0x63, + 0x29, 0x30, 0x33, 0x31, 0x35, 0x30, 0x33, 0x06, 0x03, 0x55, 0x04, + 0x0b, 0x13, 0x2c, 0x4a, 0x65, 0x72, 0x61, 0x72, 0x71, 0x75, 0x69, + 0x61, 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x61, 0x74, 0x73, 0x20, + 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x63, 0x69, 0x6f, 0x20, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x61, + 0x6e, 0x65, 0x73, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x06, 0x45, 0x43, 0x2d, 0x41, 0x43, 0x43, 0x30, 0x82, + 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, + 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb3, 0x22, + 0xc7, 0x4f, 0xe2, 0x97, 0x42, 0x95, 0x88, 0x47, 0x83, 0x40, 0xf6, + 0x1d, 0x17, 0xf3, 0x83, 0x73, 0x24, 0x1e, 0x51, 0xf3, 0x98, 0x8a, + 0xc3, 0x92, 0xb8, 0xff, 0x40, 0x90, 0x05, 0x70, 0x87, 0x60, 0xc9, + 0x00, 0xa9, 0xb5, 0x94, 0x65, 0x19, 0x22, 0x15, 0x17, 0xc2, 0x43, + 0x6c, 0x66, 0x44, 0x9a, 0x0d, 0x04, 0x3e, 0x39, 0x6f, 0xa5, 0x4b, + 0x7a, 0xaa, 0x63, 0xb7, 0x8a, 0x44, 0x9d, 0xd9, 0x63, 0x91, 0x84, + 0x66, 0xe0, 0x28, 0x0f, 0xba, 0x42, 0xe3, 0x6e, 0x8e, 0xf7, 0x14, + 0x27, 0x93, 0x69, 0xee, 0x91, 0x0e, 0xa3, 0x5f, 0x0e, 0xb1, 0xeb, + 0x66, 0xa2, 0x72, 0x4f, 0x12, 0x13, 0x86, 0x65, 0x7a, 0x3e, 0xdb, + 0x4f, 0x07, 0xf4, 0xa7, 0x09, 0x60, 0xda, 0x3a, 0x42, 0x99, 0xc7, + 0xb2, 0x7f, 0xb3, 0x16, 0x95, 0x1c, 0xc7, 0xf9, 0x34, 0xb5, 0x94, + 0x85, 0xd5, 0x99, 0x5e, 0xa0, 0x48, 0xa0, 0x7e, 0xe7, 0x17, 0x65, + 0xb8, 0xa2, 0x75, 0xb8, 0x1e, 0xf3, 0xe5, 0x42, 0x7d, 0xaf, 0xed, + 0xf3, 0x8a, 0x48, 0x64, 0x5d, 0x82, 0x14, 0x93, 0xd8, 0xc0, 0xe4, + 0xff, 0xb3, 0x50, 0x72, 0xf2, 0x76, 0xf6, 0xb3, 0x5d, 0x42, 0x50, + 0x79, 0xd0, 0x94, 0x3e, 0x6b, 0x0c, 0x00, 0xbe, 0xd8, 0x6b, 0x0e, + 0x4e, 0x2a, 0xec, 0x3e, 0xd2, 0xcc, 0x82, 0xa2, 0x18, 0x65, 0x33, + 0x13, 0x77, 0x9e, 0x9a, 0x5d, 0x1a, 0x13, 0xd8, 0xc3, 0xdb, 0x3d, + 0xc8, 0x97, 0x7a, 0xee, 0x70, 0xed, 0xa7, 0xe6, 0x7c, 0xdb, 0x71, + 0xcf, 0x2d, 0x94, 0x62, 0xdf, 0x6d, 0xd6, 0xf5, 0x38, 0xbe, 0x3f, + 0xa5, 0x85, 0x0a, 0x19, 0xb8, 0xa8, 0xd8, 0x09, 0x75, 0x42, 0x70, + 0xc4, 0xea, 0xef, 0xcb, 0x0e, 0xc8, 0x34, 0xa8, 0x12, 0x22, 0x98, + 0x0c, 0xb8, 0x13, 0x94, 0xb6, 0x4b, 0xec, 0xf0, 0xd0, 0x90, 0xe7, + 0x27, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xe3, 0x30, 0x81, + 0xe0, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x16, 0x30, + 0x14, 0x81, 0x12, 0x65, 0x63, 0x5f, 0x61, 0x63, 0x63, 0x40, 0x63, + 0x61, 0x74, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x30, + 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, + 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, + 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa0, + 0xc3, 0x8b, 0x44, 0xaa, 0x37, 0xa5, 0x45, 0xbf, 0x97, 0x80, 0x5a, + 0xd1, 0xf1, 0x78, 0xa2, 0x9b, 0xe9, 0x5d, 0x8d, 0x30, 0x7f, 0x06, + 0x03, 0x55, 0x1d, 0x20, 0x04, 0x78, 0x30, 0x76, 0x30, 0x74, 0x06, + 0x0b, 0x2b, 0x06, 0x01, 0x04, 0x01, 0xf5, 0x78, 0x01, 0x03, 0x01, + 0x0a, 0x30, 0x65, 0x30, 0x2c, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, + 0x05, 0x07, 0x02, 0x01, 0x16, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, + 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x63, 0x61, 0x74, 0x63, + 0x65, 0x72, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x76, 0x65, 0x72, + 0x61, 0x72, 0x72, 0x65, 0x6c, 0x30, 0x35, 0x06, 0x08, 0x2b, 0x06, + 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, 0x30, 0x29, 0x1a, 0x27, 0x56, + 0x65, 0x67, 0x65, 0x75, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, + 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x65, + 0x72, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x76, 0x65, 0x72, 0x61, + 0x72, 0x72, 0x65, 0x6c, 0x20, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, + 0x01, 0x01, 0x00, 0xa0, 0x48, 0x5b, 0x82, 0x01, 0xf6, 0x4d, 0x48, + 0xb8, 0x39, 0x55, 0x35, 0x9c, 0x80, 0x7a, 0x53, 0x99, 0xd5, 0x5a, + 0xff, 0xb1, 0x71, 0x3b, 0xcc, 0x39, 0x09, 0x94, 0x5e, 0xd6, 0xda, + 0xef, 0xbe, 0x01, 0x5b, 0x5d, 0xd3, 0x1e, 0xd8, 0xfd, 0x7d, 0x4f, + 0xcd, 0xa0, 0x41, 0xe0, 0x34, 0x93, 0xbf, 0xcb, 0xe2, 0x86, 0x9c, + 0x37, 0x92, 0x90, 0x56, 0x1c, 0xdc, 0xeb, 0x29, 0x05, 0xe5, 0xc4, + 0x9e, 0xc7, 0x35, 0xdf, 0x8a, 0x0c, 0xcd, 0xc5, 0x21, 0x43, 0xe9, + 0xaa, 0x88, 0xe5, 0x35, 0xc0, 0x19, 0x42, 0x63, 0x5a, 0x02, 0x5e, + 0xa4, 0x48, 0x18, 0x3a, 0x85, 0x6f, 0xdc, 0x9d, 0xbc, 0x3f, 0x9d, + 0x9c, 0xc1, 0x87, 0xb8, 0x7a, 0x61, 0x08, 0xe9, 0x77, 0x0b, 0x7f, + 0x70, 0xab, 0x7a, 0xdd, 0xd9, 0x97, 0x2c, 0x64, 0x1e, 0x85, 0xbf, + 0xbc, 0x74, 0x96, 0xa1, 0xc3, 0x7a, 0x12, 0xec, 0x0c, 0x1a, 0x6e, + 0x83, 0x0c, 0x3c, 0xe8, 0x72, 0x46, 0x9f, 0xfb, 0x48, 0xd5, 0x5e, + 0x97, 0xe6, 0xb1, 0xa1, 0xf8, 0xe4, 0xef, 0x46, 0x25, 0x94, 0x9c, + 0x89, 0xdb, 0x69, 0x38, 0xbe, 0xec, 0x5c, 0x0e, 0x56, 0xc7, 0x65, + 0x51, 0xe5, 0x50, 0x88, 0x88, 0xbf, 0x42, 0xd5, 0x2b, 0x3d, 0xe5, + 0xf9, 0xba, 0x9e, 0x2e, 0xb3, 0xca, 0xf4, 0x73, 0x92, 0x02, 0x0b, + 0xbe, 0x4c, 0x66, 0xeb, 0x20, 0xfe, 0xb9, 0xcb, 0xb5, 0x99, 0x7f, + 0xe6, 0xb6, 0x13, 0xfa, 0xca, 0x4b, 0x4d, 0xd9, 0xee, 0x53, 0x46, + 0x06, 0x3b, 0xc6, 0x4e, 0xad, 0x93, 0x5a, 0x81, 0x7e, 0x6c, 0x2a, + 0x4b, 0x6a, 0x05, 0x45, 0x8c, 0xf2, 0x21, 0xa4, 0x31, 0x90, 0x87, + 0x6c, 0x65, 0x9c, 0x9d, 0xa5, 0x60, 0x95, 0x3a, 0x52, 0x7f, 0xf5, + 0xd1, 0xab, 0x08, 0x6e, 0xf3, 0xee, 0x5b, 0xf9, 0x88, 0x3d, 0x7e, + 0xb8, 0x6f, 0x6e, 0x03, 0xe4, 0x42, 0x30, 0x82, 0x04, 0x31, 0x30, + 0x82, 0x03, 0x19, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0x95, 0x31, 0x0b, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x52, 0x31, 0x44, + 0x30, 0x42, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x3b, 0x48, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x69, 0x63, 0x20, 0x41, 0x63, 0x61, 0x64, 0x65, 0x6d, 0x69, 0x63, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x49, 0x6e, 0x73, 0x74, - 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x52, 0x6f, - 0x6f, 0x74, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, 0x31, 0x30, 0x1e, - 0x17, 0x0d, 0x31, 0x31, 0x31, 0x32, 0x30, 0x36, 0x31, 0x33, 0x34, - 0x39, 0x35, 0x32, 0x5a, 0x17, 0x0d, 0x33, 0x31, 0x31, 0x32, 0x30, - 0x31, 0x31, 0x33, 0x34, 0x39, 0x35, 0x32, 0x5a, 0x30, 0x81, 0x95, - 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x47, 0x52, 0x31, 0x44, 0x30, 0x42, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x13, 0x3b, 0x48, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x69, 0x63, 0x20, + 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x43, 0x65, + 0x72, 0x74, 0x2e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x74, 0x79, 0x31, 0x40, 0x30, 0x3e, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x37, 0x48, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x69, 0x63, 0x20, 0x41, 0x63, 0x61, 0x64, 0x65, 0x6d, 0x69, 0x63, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x20, 0x43, 0x65, 0x72, 0x74, 0x2e, 0x20, 0x41, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x40, 0x30, 0x3e, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x13, 0x37, 0x48, 0x65, 0x6c, 0x6c, 0x65, + 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x20, 0x32, 0x30, + 0x31, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x31, 0x31, 0x32, 0x30, + 0x36, 0x31, 0x33, 0x34, 0x39, 0x35, 0x32, 0x5a, 0x17, 0x0d, 0x33, + 0x31, 0x31, 0x32, 0x30, 0x31, 0x31, 0x33, 0x34, 0x39, 0x35, 0x32, + 0x5a, 0x30, 0x81, 0x95, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x47, 0x52, 0x31, 0x44, 0x30, 0x42, 0x06, + 0x03, 0x55, 0x04, 0x0a, 0x13, 0x3b, 0x48, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x69, 0x63, 0x20, 0x41, 0x63, 0x61, 0x64, 0x65, 0x6d, 0x69, 0x63, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x43, - 0x41, 0x20, 0x32, 0x30, 0x31, 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x43, 0x65, 0x72, 0x74, 0x2e, + 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, + 0x40, 0x30, 0x3e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x37, 0x48, + 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x69, 0x63, 0x20, 0x41, 0x63, 0x61, + 0x64, 0x65, 0x6d, 0x69, 0x63, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x52, + 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x49, 0x6e, 0x73, + 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x52, + 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, 0x31, 0x30, + 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, + 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa9, + 0x53, 0x00, 0xe3, 0x2e, 0xa6, 0xf6, 0x8e, 0xfa, 0x60, 0xd8, 0x2d, + 0x95, 0x3e, 0xf8, 0x2c, 0x2a, 0x54, 0x4e, 0xcd, 0xb9, 0x84, 0x61, + 0x94, 0x58, 0x4f, 0x8f, 0x3d, 0x8b, 0xe4, 0x43, 0xf3, 0x75, 0x89, + 0x8d, 0x51, 0xe4, 0xc3, 0x37, 0xd2, 0x8a, 0x88, 0x4d, 0x79, 0x1e, + 0xb7, 0x12, 0xdd, 0x43, 0x78, 0x4a, 0x8a, 0x92, 0xe6, 0xd7, 0x48, + 0xd5, 0x0f, 0xa4, 0x3a, 0x29, 0x44, 0x35, 0xb8, 0x07, 0xf6, 0x68, + 0x1d, 0x55, 0xcd, 0x38, 0x51, 0xf0, 0x8c, 0x24, 0x31, 0x85, 0xaf, + 0x83, 0xc9, 0x7d, 0xe9, 0x77, 0xaf, 0xed, 0x1a, 0x7b, 0x9d, 0x17, + 0xf9, 0xb3, 0x9d, 0x38, 0x50, 0x0f, 0xa6, 0x5a, 0x79, 0x91, 0x80, + 0xaf, 0x37, 0xae, 0xa6, 0xd3, 0x31, 0xfb, 0xb5, 0x26, 0x09, 0x9d, + 0x3c, 0x5a, 0xef, 0x51, 0xc5, 0x2b, 0xdf, 0x96, 0x5d, 0xeb, 0x32, + 0x1e, 0x02, 0xda, 0x70, 0x49, 0xec, 0x6e, 0x0c, 0xc8, 0x9a, 0x37, + 0x8d, 0xf7, 0xf1, 0x36, 0x60, 0x4b, 0x26, 0x2c, 0x82, 0x9e, 0xd0, + 0x78, 0xf3, 0x0d, 0x0f, 0x63, 0xa4, 0x51, 0x30, 0xe1, 0xf9, 0x2b, + 0x27, 0x12, 0x07, 0xd8, 0xea, 0xbd, 0x18, 0x62, 0x98, 0xb0, 0x59, + 0x37, 0x7d, 0xbe, 0xee, 0xf3, 0x20, 0x51, 0x42, 0x5a, 0x83, 0xef, + 0x93, 0xba, 0x69, 0x15, 0xf1, 0x62, 0x9d, 0x9f, 0x99, 0x39, 0x82, + 0xa1, 0xb7, 0x74, 0x2e, 0x8b, 0xd4, 0xc5, 0x0b, 0x7b, 0x2f, 0xf0, + 0xc8, 0x0a, 0xda, 0x3d, 0x79, 0x0a, 0x9a, 0x93, 0x1c, 0xa5, 0x28, + 0x72, 0x73, 0x91, 0x43, 0x9a, 0xa7, 0xd1, 0x4d, 0x85, 0x84, 0xb9, + 0xa9, 0x74, 0x8f, 0x14, 0x40, 0xc7, 0xdc, 0xde, 0xac, 0x41, 0x64, + 0x6c, 0xb4, 0x19, 0x9b, 0x02, 0x63, 0x6d, 0x24, 0x64, 0x8f, 0x44, + 0xb2, 0x25, 0xea, 0xce, 0x5d, 0x74, 0x0c, 0x63, 0x32, 0x5c, 0x8d, + 0x87, 0xe5, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x89, 0x30, + 0x81, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, + 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0b, 0x06, + 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa6, + 0x91, 0x42, 0xfd, 0x13, 0x61, 0x4a, 0x23, 0x9e, 0x08, 0xa4, 0x29, + 0xe5, 0xd8, 0x13, 0x04, 0x23, 0xee, 0x41, 0x25, 0x30, 0x47, 0x06, + 0x03, 0x55, 0x1d, 0x1e, 0x04, 0x40, 0x30, 0x3e, 0xa0, 0x3c, 0x30, + 0x05, 0x82, 0x03, 0x2e, 0x67, 0x72, 0x30, 0x05, 0x82, 0x03, 0x2e, + 0x65, 0x75, 0x30, 0x06, 0x82, 0x04, 0x2e, 0x65, 0x64, 0x75, 0x30, + 0x06, 0x82, 0x04, 0x2e, 0x6f, 0x72, 0x67, 0x30, 0x05, 0x81, 0x03, + 0x2e, 0x67, 0x72, 0x30, 0x05, 0x81, 0x03, 0x2e, 0x65, 0x75, 0x30, + 0x06, 0x81, 0x04, 0x2e, 0x65, 0x64, 0x75, 0x30, 0x06, 0x81, 0x04, + 0x2e, 0x6f, 0x72, 0x67, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x01, 0x00, 0x1f, 0xef, 0x79, 0x41, 0xe1, 0x7b, 0x6e, 0x3f, 0xb2, + 0x8c, 0x86, 0x37, 0x42, 0x4a, 0x4e, 0x1c, 0x37, 0x1e, 0x8d, 0x66, + 0xba, 0x24, 0x81, 0xc9, 0x4f, 0x12, 0x0f, 0x21, 0xc0, 0x03, 0x97, + 0x86, 0x25, 0x6d, 0x5d, 0xd3, 0x22, 0x29, 0xa8, 0x6c, 0xa2, 0x0d, + 0xa9, 0xeb, 0x3d, 0x06, 0x5b, 0x99, 0x3a, 0xc7, 0xcc, 0xc3, 0x9a, + 0x34, 0x7f, 0xab, 0x0e, 0xc8, 0x4e, 0x1c, 0xe1, 0xfa, 0xe4, 0xdc, + 0xcd, 0x0d, 0xbe, 0xbf, 0x24, 0xfe, 0x6c, 0xe7, 0x6b, 0xc2, 0x0d, + 0xc8, 0x06, 0x9e, 0x4e, 0x8d, 0x61, 0x28, 0xa6, 0x6a, 0xfd, 0xe5, + 0xf6, 0x62, 0xea, 0x18, 0x3c, 0x4e, 0xa0, 0x53, 0x9d, 0xb2, 0x3a, + 0x9c, 0xeb, 0xa5, 0x9c, 0x91, 0x16, 0xb6, 0x4d, 0x82, 0xe0, 0x0c, + 0x05, 0x48, 0xa9, 0x6c, 0xf5, 0xcc, 0xf8, 0xcb, 0x9d, 0x49, 0xb4, + 0xf0, 0x02, 0xa5, 0xfd, 0x70, 0x03, 0xed, 0x8a, 0x21, 0xa5, 0xae, + 0x13, 0x86, 0x49, 0xc3, 0x33, 0x73, 0xbe, 0x87, 0x3b, 0x74, 0x8b, + 0x17, 0x45, 0x26, 0x4c, 0x16, 0x91, 0x83, 0xfe, 0x67, 0x7d, 0xcd, + 0x4d, 0x63, 0x67, 0xfa, 0xf3, 0x03, 0x12, 0x96, 0x78, 0x06, 0x8d, + 0xb1, 0x67, 0xed, 0x8e, 0x3f, 0xbe, 0x9f, 0x4f, 0x02, 0xf5, 0xb3, + 0x09, 0x2f, 0xf3, 0x4c, 0x87, 0xdf, 0x2a, 0xcb, 0x95, 0x7c, 0x01, + 0xcc, 0xac, 0x36, 0x7a, 0xbf, 0xa2, 0x73, 0x7a, 0xf7, 0x8f, 0xc1, + 0xb5, 0x9a, 0xa1, 0x14, 0xb2, 0x8f, 0x33, 0x9f, 0x0d, 0xef, 0x22, + 0xdc, 0x66, 0x7b, 0x84, 0xbd, 0x45, 0x17, 0x06, 0x3d, 0x3c, 0xca, + 0xb9, 0x77, 0x34, 0x8f, 0xca, 0xea, 0xcf, 0x3f, 0x31, 0x3e, 0xe3, + 0x88, 0xe3, 0x80, 0x49, 0x25, 0xc8, 0x97, 0xb5, 0x9d, 0x9a, 0x99, + 0x4d, 0xb0, 0x3c, 0xf8, 0x4a, 0x00, 0x9b, 0x64, 0xdd, 0x9f, 0x39, + 0x4b, 0xd1, 0x27, 0xd7, 0xb8, 0x30, 0x82, 0x05, 0xbb, 0x30, 0x82, + 0x03, 0xa3, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x57, 0x0a, + 0x11, 0x97, 0x42, 0xc4, 0xe3, 0xcc, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, + 0x6b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x49, 0x54, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, + 0x07, 0x0c, 0x05, 0x4d, 0x69, 0x6c, 0x61, 0x6e, 0x31, 0x23, 0x30, + 0x21, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1a, 0x41, 0x63, 0x74, + 0x61, 0x6c, 0x69, 0x73, 0x20, 0x53, 0x2e, 0x70, 0x2e, 0x41, 0x2e, + 0x2f, 0x30, 0x33, 0x33, 0x35, 0x38, 0x35, 0x32, 0x30, 0x39, 0x36, + 0x37, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, + 0x1e, 0x41, 0x63, 0x74, 0x61, 0x6c, 0x69, 0x73, 0x20, 0x41, 0x75, + 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, + 0x17, 0x0d, 0x31, 0x31, 0x30, 0x39, 0x32, 0x32, 0x31, 0x31, 0x32, + 0x32, 0x30, 0x32, 0x5a, 0x17, 0x0d, 0x33, 0x30, 0x30, 0x39, 0x32, + 0x32, 0x31, 0x31, 0x32, 0x32, 0x30, 0x32, 0x5a, 0x30, 0x6b, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49, + 0x54, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, + 0x05, 0x4d, 0x69, 0x6c, 0x61, 0x6e, 0x31, 0x23, 0x30, 0x21, 0x06, + 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x1a, 0x41, 0x63, 0x74, 0x61, 0x6c, + 0x69, 0x73, 0x20, 0x53, 0x2e, 0x70, 0x2e, 0x41, 0x2e, 0x2f, 0x30, + 0x33, 0x33, 0x35, 0x38, 0x35, 0x32, 0x30, 0x39, 0x36, 0x37, 0x31, + 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1e, 0x41, + 0x63, 0x74, 0x61, 0x6c, 0x69, 0x73, 0x20, 0x41, 0x75, 0x74, 0x68, + 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x02, 0x22, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, + 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xa7, 0xc6, 0xc4, 0xa5, + 0x29, 0xa4, 0x2c, 0xef, 0xe5, 0x18, 0xc5, 0xb0, 0x50, 0xa3, 0x6f, + 0x51, 0x3b, 0x9f, 0x0a, 0x5a, 0xc9, 0xc2, 0x48, 0x38, 0x0a, 0xc2, + 0x1c, 0xa0, 0x18, 0x7f, 0x91, 0xb5, 0x87, 0xb9, 0x40, 0x3f, 0xdd, + 0x1d, 0x68, 0x1f, 0x08, 0x83, 0xd5, 0x2d, 0x1e, 0x88, 0xa0, 0xf8, + 0x8f, 0x56, 0x8f, 0x6d, 0x99, 0x02, 0x92, 0x90, 0x16, 0xd5, 0x5f, + 0x08, 0x6c, 0x89, 0xd7, 0xe1, 0xac, 0xbc, 0x20, 0xc2, 0xb1, 0xe0, + 0x83, 0x51, 0x8a, 0x69, 0x4d, 0x00, 0x96, 0x5a, 0x6f, 0x2f, 0xc0, + 0x44, 0x7e, 0xa3, 0x0e, 0xe4, 0x91, 0xcd, 0x58, 0xee, 0xdc, 0xfb, + 0xc7, 0x1e, 0x45, 0x47, 0xdd, 0x27, 0xb9, 0x08, 0x01, 0x9f, 0xa6, + 0x21, 0x1d, 0xf5, 0x41, 0x2d, 0x2f, 0x4c, 0xfd, 0x28, 0xad, 0xe0, + 0x8a, 0xad, 0x22, 0xb4, 0x56, 0x65, 0x8e, 0x86, 0x54, 0x8f, 0x93, + 0x43, 0x29, 0xde, 0x39, 0x46, 0x78, 0xa3, 0x30, 0x23, 0xba, 0xcd, + 0xf0, 0x7d, 0x13, 0x57, 0xc0, 0x5d, 0xd2, 0x83, 0x6b, 0x48, 0x4c, + 0xc4, 0xab, 0x9f, 0x80, 0x5a, 0x5b, 0x3a, 0xbd, 0xc9, 0xa7, 0x22, + 0x3f, 0x80, 0x27, 0x33, 0x5b, 0x0e, 0xb7, 0x8a, 0x0c, 0x5d, 0x07, + 0x37, 0x08, 0xcb, 0x6c, 0xd2, 0x7a, 0x47, 0x22, 0x44, 0x35, 0xc5, + 0xcc, 0xcc, 0x2e, 0x8e, 0xdd, 0x2a, 0xed, 0xb7, 0x7d, 0x66, 0x0d, + 0x5f, 0x61, 0x51, 0x22, 0x55, 0x1b, 0xe3, 0x46, 0xe3, 0xe3, 0x3d, + 0xd0, 0x35, 0x62, 0x9a, 0xdb, 0xaf, 0x14, 0xc8, 0x5b, 0xa1, 0xcc, + 0x89, 0x1b, 0xe1, 0x30, 0x26, 0xfc, 0xa0, 0x9b, 0x1f, 0x81, 0xa7, + 0x47, 0x1f, 0x04, 0xeb, 0xa3, 0x39, 0x92, 0x06, 0x9f, 0x99, 0xd3, + 0xbf, 0xd3, 0xea, 0x4f, 0x50, 0x9c, 0x19, 0xfe, 0x96, 0x87, 0x1e, + 0x3c, 0x65, 0xf6, 0xa3, 0x18, 0x24, 0x83, 0x86, 0x10, 0xe7, 0x54, + 0x3e, 0xa8, 0x3a, 0x76, 0x24, 0x4f, 0x81, 0x21, 0xc5, 0xe3, 0x0f, + 0x02, 0xf8, 0x93, 0x94, 0x47, 0x20, 0xbb, 0xfe, 0xd4, 0x0e, 0xd3, + 0x68, 0xb9, 0xdd, 0xc4, 0x7a, 0x84, 0x82, 0xe3, 0x53, 0x54, 0x79, + 0xdd, 0xdb, 0x9c, 0xd2, 0xf2, 0x07, 0x9b, 0x2e, 0xb6, 0xbc, 0x3e, + 0xed, 0x85, 0x6d, 0xef, 0x25, 0x11, 0xf2, 0x97, 0x1a, 0x42, 0x61, + 0xf7, 0x4a, 0x97, 0xe8, 0x8b, 0xb1, 0x10, 0x07, 0xfa, 0x65, 0x81, + 0xb2, 0xa2, 0x39, 0xcf, 0xf7, 0x3c, 0xff, 0x18, 0xfb, 0xc6, 0xf1, + 0x5a, 0x8b, 0x59, 0xe2, 0x02, 0xac, 0x7b, 0x92, 0xd0, 0x4e, 0x14, + 0x4f, 0x59, 0x45, 0xf6, 0x0c, 0x5e, 0x28, 0x5f, 0xb0, 0xe8, 0x3f, + 0x45, 0xcf, 0xcf, 0xaf, 0x9b, 0x6f, 0xfb, 0x84, 0xd3, 0x77, 0x5a, + 0x95, 0x6f, 0xac, 0x94, 0x84, 0x9e, 0xee, 0xbc, 0xc0, 0x4a, 0x8f, + 0x4a, 0x93, 0xf8, 0x44, 0x21, 0xe2, 0x31, 0x45, 0x61, 0x50, 0x4e, + 0x10, 0xd8, 0xe3, 0x35, 0x7c, 0x4c, 0x19, 0xb4, 0xde, 0x05, 0xbf, + 0xa3, 0x06, 0x9f, 0xc8, 0xb5, 0xcd, 0xe4, 0x1f, 0xd7, 0x17, 0x06, + 0x0d, 0x7a, 0x95, 0x74, 0x55, 0x0d, 0x68, 0x1a, 0xfc, 0x10, 0x1b, + 0x62, 0x64, 0x9d, 0x6d, 0xe0, 0x95, 0xa0, 0xc3, 0x94, 0x07, 0x57, + 0x0d, 0x14, 0xe6, 0xbd, 0x05, 0xfb, 0xb8, 0x9f, 0xe6, 0xdf, 0x8b, + 0xe2, 0xc6, 0xe7, 0x7e, 0x96, 0xf6, 0x53, 0xc5, 0x80, 0x34, 0x50, + 0x28, 0x58, 0xf0, 0x12, 0x50, 0x71, 0x17, 0x30, 0xba, 0xe6, 0x78, + 0x63, 0xbc, 0xf4, 0xb2, 0xad, 0x9b, 0x2b, 0xb2, 0xfe, 0xe1, 0x39, + 0x8c, 0x5e, 0xba, 0x0b, 0x20, 0x94, 0xde, 0x7b, 0x83, 0xb8, 0xff, + 0xe3, 0x56, 0x8d, 0xb7, 0x11, 0xe9, 0x3b, 0x8c, 0xf2, 0xb1, 0xc1, + 0x5d, 0x9d, 0xa4, 0x0b, 0x4c, 0x2b, 0xd9, 0xb2, 0x18, 0xf5, 0xb5, + 0x9f, 0x4b, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0x52, 0xd8, 0x88, 0x3a, 0xc8, 0x9f, 0x78, 0x66, 0xed, 0x89, 0xf3, + 0x7b, 0x38, 0x70, 0x94, 0xc9, 0x02, 0x02, 0x36, 0xd0, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, + 0x03, 0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, + 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x52, 0xd8, 0x88, 0x3a, 0xc8, + 0x9f, 0x78, 0x66, 0xed, 0x89, 0xf3, 0x7b, 0x38, 0x70, 0x94, 0xc9, + 0x02, 0x02, 0x36, 0xd0, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, + 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x0b, 0x7b, 0x72, 0x87, + 0xc0, 0x60, 0xa6, 0x49, 0x4c, 0x88, 0x58, 0xe6, 0x1d, 0x88, 0xf7, + 0x14, 0x64, 0x48, 0xa6, 0xd8, 0x58, 0x0a, 0x0e, 0x4f, 0x13, 0x35, + 0xdf, 0x35, 0x1d, 0xd4, 0xed, 0x06, 0x31, 0xc8, 0x81, 0x3e, 0x6a, + 0xd5, 0xdd, 0x3b, 0x1a, 0x32, 0xee, 0x90, 0x3d, 0x11, 0xd2, 0x2e, + 0xf4, 0x8e, 0xc3, 0x63, 0x2e, 0x23, 0x66, 0xb0, 0x67, 0xbe, 0x6f, + 0xb6, 0xc0, 0x13, 0x39, 0x60, 0xaa, 0xa2, 0x34, 0x25, 0x93, 0x75, + 0x52, 0xde, 0xa7, 0x9d, 0xad, 0x0e, 0x87, 0x89, 0x52, 0x71, 0x6a, + 0x16, 0x3c, 0x19, 0x1d, 0x83, 0xf8, 0x9a, 0x29, 0x65, 0xbe, 0xf4, + 0x3f, 0x9a, 0xd9, 0xf0, 0xf3, 0x5a, 0x87, 0x21, 0x71, 0x80, 0x4d, + 0xcb, 0xe0, 0x38, 0x9b, 0x3f, 0xbb, 0xfa, 0xe0, 0x30, 0x4d, 0xcf, + 0x86, 0xd3, 0x65, 0x10, 0x19, 0x18, 0xd1, 0x97, 0x02, 0xb1, 0x2b, + 0x72, 0x42, 0x68, 0xac, 0xa0, 0xbd, 0x4e, 0x5a, 0xda, 0x18, 0xbf, + 0x6b, 0x98, 0x81, 0xd0, 0xfd, 0x9a, 0xbe, 0x5e, 0x15, 0x48, 0xcd, + 0x11, 0x15, 0xb9, 0xc0, 0x29, 0x5c, 0xb4, 0xe8, 0x88, 0xf7, 0x3e, + 0x36, 0xae, 0xb7, 0x62, 0xfd, 0x1e, 0x62, 0xde, 0x70, 0x78, 0x10, + 0x1c, 0x48, 0x5b, 0xda, 0xbc, 0xa4, 0x38, 0xba, 0x67, 0xed, 0x55, + 0x3e, 0x5e, 0x57, 0xdf, 0xd4, 0x03, 0x40, 0x4c, 0x81, 0xa4, 0xd2, + 0x4f, 0x63, 0xa7, 0x09, 0x42, 0x09, 0x14, 0xfc, 0x00, 0xa9, 0xc2, + 0x80, 0x73, 0x4f, 0x2e, 0xc0, 0x40, 0xd9, 0x11, 0x7b, 0x48, 0xea, + 0x7a, 0x02, 0xc0, 0xd3, 0xeb, 0x28, 0x01, 0x26, 0x58, 0x74, 0xc1, + 0xc0, 0x73, 0x22, 0x6d, 0x93, 0x95, 0xfd, 0x39, 0x7d, 0xbb, 0x2a, + 0xe3, 0xf6, 0x82, 0xe3, 0x2c, 0x97, 0x5f, 0x4e, 0x1f, 0x91, 0x94, + 0xfa, 0xfe, 0x2c, 0xa3, 0xd8, 0x76, 0x1a, 0xb8, 0x4d, 0xb2, 0x38, + 0x4f, 0x9b, 0xfa, 0x1d, 0x48, 0x60, 0x79, 0x26, 0xe2, 0xf3, 0xfd, + 0xa9, 0xd0, 0x9a, 0xe8, 0x70, 0x8f, 0x49, 0x7a, 0xd6, 0xe5, 0xbd, + 0x0a, 0x0e, 0xdb, 0x2d, 0xf3, 0x8d, 0xbf, 0xeb, 0xe3, 0xa4, 0x7d, + 0xcb, 0xc7, 0x95, 0x71, 0xe8, 0xda, 0xa3, 0x7c, 0xc5, 0xc2, 0xf8, + 0x74, 0x92, 0x04, 0x1b, 0x86, 0xac, 0xa4, 0x22, 0x53, 0x40, 0xb6, + 0xac, 0xfe, 0x4c, 0x76, 0xcf, 0xfb, 0x94, 0x32, 0xc0, 0x35, 0x9f, + 0x76, 0x3f, 0x6e, 0xe5, 0x90, 0x6e, 0xa0, 0xa6, 0x26, 0xa2, 0xb8, + 0x2c, 0xbe, 0xd1, 0x2b, 0x85, 0xfd, 0xa7, 0x68, 0xc8, 0xba, 0x01, + 0x2b, 0xb1, 0x6c, 0x74, 0x1d, 0xb8, 0x73, 0x95, 0xe7, 0xee, 0xb7, + 0xc7, 0x25, 0xf0, 0x00, 0x4c, 0x00, 0xb2, 0x7e, 0xb6, 0x0b, 0x8b, + 0x1c, 0xf3, 0xc0, 0x50, 0x9e, 0x25, 0xb9, 0xe0, 0x08, 0xde, 0x36, + 0x66, 0xff, 0x37, 0xa5, 0xd1, 0xbb, 0x54, 0x64, 0x2c, 0xc9, 0x27, + 0xb5, 0x4b, 0x92, 0x7e, 0x65, 0xff, 0xd3, 0x2d, 0xe1, 0xb9, 0x4e, + 0xbc, 0x7f, 0xa4, 0x41, 0x21, 0x90, 0x41, 0x77, 0xa6, 0x39, 0x1f, + 0xea, 0x9e, 0xe3, 0x9f, 0xd0, 0x66, 0x6f, 0x05, 0xec, 0xaa, 0x76, + 0x7e, 0xbf, 0x6b, 0x16, 0xa0, 0xeb, 0xb5, 0xc7, 0xfc, 0x92, 0x54, + 0x2f, 0x2b, 0x11, 0x27, 0x25, 0x37, 0x78, 0x4c, 0x51, 0x6a, 0xb0, + 0xf3, 0xcc, 0x58, 0x5d, 0x14, 0xf1, 0x6a, 0x48, 0x15, 0xff, 0xc2, + 0x07, 0xb6, 0xb1, 0x8d, 0x0f, 0x8e, 0x5c, 0x50, 0x46, 0xb3, 0x3d, + 0xbf, 0x01, 0x98, 0x4f, 0xb2, 0x59, 0x54, 0x47, 0x3e, 0x34, 0x7b, + 0x78, 0x6d, 0x56, 0x93, 0x2e, 0x73, 0xea, 0x66, 0x28, 0x78, 0xcd, + 0x1d, 0x14, 0xbf, 0xa0, 0x8f, 0x2f, 0x2e, 0xb8, 0x2e, 0x8e, 0xf2, + 0x14, 0x8a, 0xcc, 0xe9, 0xb5, 0x7c, 0xfb, 0x6c, 0x9d, 0x0c, 0xa5, + 0xe1, 0x96, 0x30, 0x82, 0x03, 0x67, 0x30, 0x82, 0x02, 0x4f, 0xa0, + 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x1b, 0x1f, 0xad, 0xb6, 0x20, + 0xf9, 0x24, 0xd3, 0x36, 0x6b, 0xf7, 0xc7, 0xf1, 0x8c, 0xa0, 0x59, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x05, 0x05, 0x00, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x18, 0x30, + 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0f, 0x54, 0x72, 0x75, + 0x73, 0x74, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, + 0x64, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, + 0x13, 0x54, 0x72, 0x75, 0x73, 0x74, 0x69, 0x73, 0x20, 0x46, 0x50, + 0x53, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, + 0x17, 0x0d, 0x30, 0x33, 0x31, 0x32, 0x32, 0x33, 0x31, 0x32, 0x31, + 0x34, 0x30, 0x36, 0x5a, 0x17, 0x0d, 0x32, 0x34, 0x30, 0x31, 0x32, + 0x31, 0x31, 0x31, 0x33, 0x36, 0x35, 0x34, 0x5a, 0x30, 0x45, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, + 0x42, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x0f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x69, 0x73, 0x20, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, + 0x55, 0x04, 0x0b, 0x13, 0x13, 0x54, 0x72, 0x75, 0x73, 0x74, 0x69, + 0x73, 0x20, 0x46, 0x50, 0x53, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, + 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, + 0x01, 0x00, 0xc5, 0x50, 0x7b, 0x9e, 0x3b, 0x35, 0xd0, 0xdf, 0xc4, + 0x8c, 0xcd, 0x8e, 0x9b, 0xed, 0xa3, 0xc0, 0x36, 0x99, 0xf4, 0x42, + 0xea, 0xa7, 0x3e, 0x80, 0x83, 0x0f, 0xa6, 0xa7, 0x59, 0x87, 0xc9, + 0x90, 0x45, 0x43, 0x7e, 0x00, 0xea, 0x86, 0x79, 0x2a, 0x03, 0xbd, + 0x3d, 0x37, 0x99, 0x89, 0x66, 0xb7, 0xe5, 0x8a, 0x56, 0x86, 0x93, + 0x9c, 0x68, 0x4b, 0x68, 0x04, 0x8c, 0x93, 0x93, 0x02, 0x3e, 0x30, + 0xd2, 0x37, 0x3a, 0x22, 0x61, 0x89, 0x1c, 0x85, 0x4e, 0x7d, 0x8f, + 0xd5, 0xaf, 0x7b, 0x35, 0xf6, 0x7e, 0x28, 0x47, 0x89, 0x31, 0xdc, + 0x0e, 0x79, 0x64, 0x1f, 0x99, 0xd2, 0x5b, 0xba, 0xfe, 0x7f, 0x60, + 0xbf, 0xad, 0xeb, 0xe7, 0x3c, 0x38, 0x29, 0x6a, 0x2f, 0xe5, 0x91, + 0x0b, 0x55, 0xff, 0xec, 0x6f, 0x58, 0xd5, 0x2d, 0xc9, 0xde, 0x4c, + 0x66, 0x71, 0x8f, 0x0c, 0xd7, 0x04, 0xda, 0x07, 0xe6, 0x1e, 0x18, + 0xe3, 0xbd, 0x29, 0x02, 0xa8, 0xfa, 0x1c, 0xe1, 0x5b, 0xb9, 0x83, + 0xa8, 0x41, 0x48, 0xbc, 0x1a, 0x71, 0x8d, 0xe7, 0x62, 0xe5, 0x2d, + 0xb2, 0xeb, 0xdf, 0x7c, 0xcf, 0xdb, 0xab, 0x5a, 0xca, 0x31, 0xf1, + 0x4c, 0x22, 0xf3, 0x05, 0x13, 0xf7, 0x82, 0xf9, 0x73, 0x79, 0x0c, + 0xbe, 0xd7, 0x4b, 0x1c, 0xc0, 0xd1, 0x15, 0x3c, 0x93, 0x41, 0x64, + 0xd1, 0xe6, 0xbe, 0x23, 0x17, 0x22, 0x00, 0x89, 0x5e, 0x1f, 0x6b, + 0xa5, 0xac, 0x6e, 0xa7, 0x4b, 0x8c, 0xed, 0xa3, 0x72, 0xe6, 0xaf, + 0x63, 0x4d, 0x2f, 0x85, 0xd2, 0x14, 0x35, 0x9a, 0x2e, 0x4e, 0x8c, + 0xea, 0x32, 0x98, 0x28, 0x86, 0xa1, 0x91, 0x09, 0x41, 0x3a, 0xb4, + 0xe1, 0xe3, 0xf2, 0xfa, 0xf0, 0xc9, 0x0a, 0xa2, 0x41, 0xdd, 0xa9, + 0xe3, 0x03, 0xc7, 0x88, 0x15, 0x3b, 0x1c, 0xd4, 0x1a, 0x94, 0xd7, + 0x9f, 0x64, 0x59, 0x12, 0x6d, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, + 0x53, 0x30, 0x51, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, + 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1f, + 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, + 0xba, 0xfa, 0x71, 0x25, 0x79, 0x8b, 0x57, 0x41, 0x25, 0x21, 0x86, + 0x0b, 0x71, 0xeb, 0xb2, 0x64, 0x0e, 0x8b, 0x21, 0x67, 0x30, 0x1d, + 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xba, 0xfa, + 0x71, 0x25, 0x79, 0x8b, 0x57, 0x41, 0x25, 0x21, 0x86, 0x0b, 0x71, + 0xeb, 0xb2, 0x64, 0x0e, 0x8b, 0x21, 0x67, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x01, 0x00, 0x7e, 0x58, 0xff, 0xfd, 0x35, 0x19, + 0x7d, 0x9c, 0x18, 0x4f, 0x9e, 0xb0, 0x2b, 0xbc, 0x8e, 0x8c, 0x14, + 0xff, 0x2c, 0xa0, 0xda, 0x47, 0x5b, 0xc3, 0xef, 0x81, 0x2d, 0xaf, + 0x05, 0xea, 0x74, 0x48, 0x5b, 0xf3, 0x3e, 0x4e, 0x07, 0xc7, 0x6d, + 0xc5, 0xb3, 0x93, 0xcf, 0x22, 0x35, 0x5c, 0xb6, 0x3f, 0x75, 0x27, + 0x5f, 0x09, 0x96, 0xcd, 0xa0, 0xfe, 0xbe, 0x40, 0x0c, 0x5c, 0x12, + 0x55, 0xf8, 0x93, 0x82, 0xca, 0x29, 0xe9, 0x5e, 0x3f, 0x56, 0x57, + 0x8b, 0x38, 0x36, 0xf7, 0x45, 0x1a, 0x4c, 0x28, 0xcd, 0x9e, 0x41, + 0xb8, 0xed, 0x56, 0x4c, 0x84, 0xa4, 0x40, 0xc8, 0xb8, 0xb0, 0xa5, + 0x2b, 0x69, 0x70, 0x04, 0x6a, 0xc3, 0xf8, 0xd4, 0x12, 0x32, 0xf9, + 0x0e, 0xc3, 0xb1, 0xdc, 0x32, 0x84, 0x44, 0x2c, 0x6f, 0xcb, 0x46, + 0x0f, 0xea, 0x66, 0x41, 0x0f, 0x4f, 0xf1, 0x58, 0xa5, 0xa6, 0x0d, + 0x0d, 0x0f, 0x61, 0xde, 0xa5, 0x9e, 0x5d, 0x7d, 0x65, 0xa1, 0x3c, + 0x17, 0xe7, 0xa8, 0x55, 0x4e, 0xef, 0xa0, 0xc7, 0xed, 0xc6, 0x44, + 0x7f, 0x54, 0xf5, 0xa3, 0xe0, 0x8f, 0xf0, 0x7c, 0x55, 0x22, 0x8f, + 0x29, 0xb6, 0x81, 0xa3, 0xe1, 0x6d, 0x4e, 0x2c, 0x1b, 0x80, 0x67, + 0xec, 0xad, 0x20, 0x9f, 0x0c, 0x62, 0x61, 0xd5, 0x97, 0xff, 0x43, + 0xed, 0x2d, 0xc1, 0xda, 0x5d, 0x29, 0x2a, 0x85, 0x3f, 0xac, 0x65, + 0xee, 0x86, 0x0f, 0x05, 0x8d, 0x90, 0x5f, 0xdf, 0xee, 0x9f, 0xf4, + 0xbf, 0xee, 0x1d, 0xfb, 0x98, 0xe4, 0x7f, 0x90, 0x2b, 0x84, 0x78, + 0x10, 0x0e, 0x6c, 0x49, 0x53, 0xef, 0x15, 0x5b, 0x65, 0x46, 0x4a, + 0x5d, 0xaf, 0xba, 0xfb, 0x3a, 0x72, 0x1d, 0xcd, 0xf6, 0x25, 0x88, + 0x1e, 0x97, 0xcc, 0x21, 0x9c, 0x29, 0x01, 0x0d, 0x65, 0xeb, 0x57, + 0xd9, 0xf3, 0x57, 0x96, 0xbb, 0x48, 0xcd, 0x81, 0x30, 0x82, 0x07, + 0x87, 0x30, 0x82, 0x05, 0x6f, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, + 0x01, 0x2d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x7d, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49, 0x4c, 0x31, + 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x20, 0x4c, 0x74, 0x64, + 0x2e, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, + 0x22, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x44, 0x69, 0x67, + 0x69, 0x74, 0x61, 0x6c, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x53, 0x69, 0x67, 0x6e, 0x69, + 0x6e, 0x67, 0x31, 0x29, 0x30, 0x27, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x20, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x20, + 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x30, 0x39, 0x31, 0x37, + 0x31, 0x39, 0x34, 0x36, 0x33, 0x37, 0x5a, 0x17, 0x0d, 0x33, 0x36, + 0x30, 0x39, 0x31, 0x37, 0x31, 0x39, 0x34, 0x36, 0x33, 0x36, 0x5a, + 0x30, 0x7d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x49, 0x4c, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x13, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, + 0x6d, 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x31, 0x2b, 0x30, 0x29, 0x06, + 0x03, 0x55, 0x04, 0x0b, 0x13, 0x22, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x65, 0x20, 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, + 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x31, 0x29, 0x30, 0x27, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x20, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x43, 0x6f, 0x6d, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x02, 0x22, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, + 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xc1, 0x88, 0xdb, 0x09, 0xbc, + 0x6c, 0x46, 0x7c, 0x78, 0x9f, 0x95, 0x7b, 0xb5, 0x33, 0x90, 0xf2, + 0x72, 0x62, 0xd6, 0xc1, 0x36, 0x20, 0x22, 0x24, 0x5e, 0xce, 0xe9, + 0x77, 0xf2, 0x43, 0x0a, 0xa2, 0x06, 0x64, 0xa4, 0xcc, 0x8e, 0x36, + 0xf8, 0x38, 0xe6, 0x23, 0xf0, 0x6e, 0x6d, 0xb1, 0x3c, 0xdd, 0x72, + 0xa3, 0x85, 0x1c, 0xa1, 0xd3, 0x3d, 0xb4, 0x33, 0x2b, 0xd3, 0x2f, + 0xaf, 0xfe, 0xea, 0xb0, 0x41, 0x59, 0x67, 0xb6, 0xc4, 0x06, 0x7d, + 0x0a, 0x9e, 0x74, 0x85, 0xd6, 0x79, 0x4c, 0x80, 0x37, 0x7a, 0xdf, + 0x39, 0x05, 0x52, 0x59, 0xf7, 0xf4, 0x1b, 0x46, 0x43, 0xa4, 0xd2, + 0x85, 0x85, 0xd2, 0xc3, 0x71, 0xf3, 0x75, 0x62, 0x34, 0xba, 0x2c, + 0x8a, 0x7f, 0x1e, 0x8f, 0xee, 0xed, 0x34, 0xd0, 0x11, 0xc7, 0x96, + 0xcd, 0x52, 0x3d, 0xba, 0x33, 0xd6, 0xdd, 0x4d, 0xde, 0x0b, 0x3b, + 0x4a, 0x4b, 0x9f, 0xc2, 0x26, 0x2f, 0xfa, 0xb5, 0x16, 0x1c, 0x72, + 0x35, 0x77, 0xca, 0x3c, 0x5d, 0xe6, 0xca, 0xe1, 0x26, 0x8b, 0x1a, + 0x36, 0x76, 0x5c, 0x01, 0xdb, 0x74, 0x14, 0x25, 0xfe, 0xed, 0xb5, + 0xa0, 0x88, 0x0f, 0xdd, 0x78, 0xca, 0x2d, 0x1f, 0x07, 0x97, 0x30, + 0x01, 0x2d, 0x72, 0x79, 0xfa, 0x46, 0xd6, 0x13, 0x2a, 0xa8, 0xb9, + 0xa6, 0xab, 0x83, 0x49, 0x1d, 0xe5, 0xf2, 0xef, 0xdd, 0xe4, 0x01, + 0x8e, 0x18, 0x0a, 0x8f, 0x63, 0x53, 0x16, 0x85, 0x62, 0xa9, 0x0e, + 0x19, 0x3a, 0xcc, 0xb5, 0x66, 0xa6, 0xc2, 0x6b, 0x74, 0x07, 0xe4, + 0x2b, 0xe1, 0x76, 0x3e, 0xb4, 0x6d, 0xd8, 0xf6, 0x44, 0xe1, 0x73, + 0x62, 0x1f, 0x3b, 0xc4, 0xbe, 0xa0, 0x53, 0x56, 0x25, 0x6c, 0x51, + 0x09, 0xf7, 0xaa, 0xab, 0xca, 0xbf, 0x76, 0xfd, 0x6d, 0x9b, 0xf3, + 0x9d, 0xdb, 0xbf, 0x3d, 0x66, 0xbc, 0x0c, 0x56, 0xaa, 0xaf, 0x98, + 0x48, 0x95, 0x3a, 0x4b, 0xdf, 0xa7, 0x58, 0x50, 0xd9, 0x38, 0x75, + 0xa9, 0x5b, 0xea, 0x43, 0x0c, 0x02, 0xff, 0x99, 0xeb, 0xe8, 0x6c, + 0x4d, 0x70, 0x5b, 0x29, 0x65, 0x9c, 0xdd, 0xaa, 0x5d, 0xcc, 0xaf, + 0x01, 0x31, 0xec, 0x0c, 0xeb, 0xd2, 0x8d, 0xe8, 0xea, 0x9c, 0x7b, + 0xe6, 0x6e, 0xf7, 0x27, 0x66, 0x0c, 0x1a, 0x48, 0xd7, 0x6e, 0x42, + 0xe3, 0x3f, 0xde, 0x21, 0x3e, 0x7b, 0xe1, 0x0d, 0x70, 0xfb, 0x63, + 0xaa, 0xa8, 0x6c, 0x1a, 0x54, 0xb4, 0x5c, 0x25, 0x7a, 0xc9, 0xa2, + 0xc9, 0x8b, 0x16, 0xa6, 0xbb, 0x2c, 0x7e, 0x17, 0x5e, 0x05, 0x4d, + 0x58, 0x6e, 0x12, 0x1d, 0x01, 0xee, 0x12, 0x10, 0x0d, 0xc6, 0x32, + 0x7f, 0x18, 0xff, 0xfc, 0xf4, 0xfa, 0xcd, 0x6e, 0x91, 0xe8, 0x36, + 0x49, 0xbe, 0x1a, 0x48, 0x69, 0x8b, 0xc2, 0x96, 0x4d, 0x1a, 0x12, + 0xb2, 0x69, 0x17, 0xc1, 0x0a, 0x90, 0xd6, 0xfa, 0x79, 0x22, 0x48, + 0xbf, 0xba, 0x7b, 0x69, 0xf8, 0x70, 0xc7, 0xfa, 0x7a, 0x37, 0xd8, + 0xd8, 0x0d, 0xd2, 0x76, 0x4f, 0x57, 0xff, 0x90, 0xb7, 0xe3, 0x91, + 0xd2, 0xdd, 0xef, 0xc2, 0x60, 0xb7, 0x67, 0x3a, 0xdd, 0xfe, 0xaa, + 0x9c, 0xf0, 0xd4, 0x8b, 0x7f, 0x72, 0x22, 0xce, 0xc6, 0x9f, 0x97, + 0xb6, 0xf8, 0xaf, 0x8a, 0xa0, 0x10, 0xa8, 0xd9, 0xfb, 0x18, 0xc6, + 0xb6, 0xb5, 0x5c, 0x52, 0x3c, 0x89, 0xb6, 0x19, 0x2a, 0x73, 0x01, + 0x0a, 0x0f, 0x03, 0xb3, 0x12, 0x60, 0xf2, 0x7a, 0x2f, 0x81, 0xdb, + 0xa3, 0x6e, 0xff, 0x26, 0x30, 0x97, 0xf5, 0x8b, 0xdd, 0x89, 0x57, + 0xb6, 0xad, 0x3d, 0xb3, 0xaf, 0x2b, 0xc5, 0xb7, 0x76, 0x02, 0xf0, + 0xa5, 0xd6, 0x2b, 0x9a, 0x86, 0x14, 0x2a, 0x72, 0xf6, 0xe3, 0x33, + 0x8c, 0x5d, 0x09, 0x4b, 0x13, 0xdf, 0xbb, 0x8c, 0x74, 0x13, 0x52, + 0x4b, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x02, 0x10, 0x30, + 0x82, 0x02, 0x0c, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, + 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, + 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, + 0x16, 0x04, 0x14, 0x4e, 0x0b, 0xef, 0x1a, 0xa4, 0x40, 0x5b, 0xa5, + 0x17, 0x69, 0x87, 0x30, 0xca, 0x34, 0x68, 0x43, 0xd0, 0x41, 0xae, + 0xf2, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, + 0x16, 0x80, 0x14, 0x4e, 0x0b, 0xef, 0x1a, 0xa4, 0x40, 0x5b, 0xa5, + 0x17, 0x69, 0x87, 0x30, 0xca, 0x34, 0x68, 0x43, 0xd0, 0x41, 0xae, + 0xf2, 0x30, 0x82, 0x01, 0x5a, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, + 0x82, 0x01, 0x51, 0x30, 0x82, 0x01, 0x4d, 0x30, 0x82, 0x01, 0x49, + 0x06, 0x0b, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x81, 0xb5, 0x37, 0x01, + 0x01, 0x01, 0x30, 0x82, 0x01, 0x38, 0x30, 0x2e, 0x06, 0x08, 0x2b, + 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x73, 0x73, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x70, 0x64, 0x66, 0x30, + 0x34, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, + 0x16, 0x28, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, + 0x77, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x73, 0x6c, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, + 0x64, 0x69, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x64, 0x66, 0x30, 0x81, + 0xcf, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, + 0x30, 0x81, 0xc2, 0x30, 0x27, 0x16, 0x20, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x69, 0x61, + 0x6c, 0x20, 0x28, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6d, + 0x29, 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x30, 0x03, 0x02, 0x01, 0x01, + 0x1a, 0x81, 0x96, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x20, + 0x4c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2c, 0x20, + 0x72, 0x65, 0x61, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x2a, 0x4c, 0x65, 0x67, 0x61, + 0x6c, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2a, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x20, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x61, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x74, 0x20, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x73, 0x73, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x70, 0x64, 0x66, 0x30, + 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, + 0x01, 0x04, 0x04, 0x03, 0x02, 0x00, 0x07, 0x30, 0x38, 0x06, 0x09, + 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x0d, 0x04, 0x2b, + 0x16, 0x29, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x20, + 0x46, 0x72, 0x65, 0x65, 0x20, 0x53, 0x53, 0x4c, 0x20, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x8e, 0x8f, 0xe7, + 0xdc, 0x94, 0x79, 0x7c, 0xf1, 0x85, 0x7f, 0x9f, 0x49, 0x6f, 0x6b, + 0xca, 0x5d, 0xfb, 0x8c, 0xfe, 0x04, 0xc5, 0xc1, 0x62, 0xd1, 0x7d, + 0x42, 0x8a, 0xbc, 0x53, 0xb7, 0x94, 0x03, 0x66, 0x30, 0x3f, 0xb1, + 0xe7, 0x0a, 0xa7, 0x50, 0x20, 0x55, 0x25, 0x7f, 0x76, 0x7a, 0x14, + 0x0d, 0xeb, 0x04, 0x0e, 0x40, 0xe6, 0x3e, 0xd8, 0x88, 0xab, 0x07, + 0x27, 0x83, 0xa9, 0x75, 0xa6, 0x37, 0x73, 0xc7, 0xfd, 0x4b, 0xd2, + 0x4d, 0xad, 0x17, 0x40, 0xc8, 0x46, 0xbe, 0x3b, 0x7f, 0x51, 0xfc, + 0xc3, 0xb6, 0x05, 0x31, 0xdc, 0xcd, 0x85, 0x22, 0x4e, 0x71, 0xb7, + 0xf2, 0x71, 0x5e, 0xb0, 0x1a, 0xc6, 0xba, 0x93, 0x8b, 0x78, 0x92, + 0x4a, 0x85, 0xf8, 0x78, 0x0f, 0x83, 0xfe, 0x2f, 0xad, 0x2c, 0xf7, + 0xe4, 0xa4, 0xbb, 0x2d, 0xd0, 0xe7, 0x0d, 0x3a, 0xb8, 0x3e, 0xce, + 0xf6, 0x78, 0xf6, 0xae, 0x47, 0x24, 0xca, 0xa3, 0x35, 0x36, 0xce, + 0xc7, 0xc6, 0x87, 0x98, 0xda, 0xec, 0xfb, 0xe9, 0xb2, 0xce, 0x27, + 0x9b, 0x88, 0xc3, 0x04, 0xa1, 0xf6, 0x0b, 0x59, 0x68, 0xaf, 0xc9, + 0xdb, 0x10, 0x0f, 0x4d, 0xf6, 0x64, 0x63, 0x5c, 0xa5, 0x12, 0x6f, + 0x92, 0xb2, 0x93, 0x94, 0xc7, 0x88, 0x17, 0x0e, 0x93, 0xb6, 0x7e, + 0x62, 0x8b, 0x90, 0x7f, 0xab, 0x4e, 0x9f, 0xfc, 0xe3, 0x75, 0x14, + 0x4f, 0x2a, 0x32, 0xdf, 0x5b, 0x0d, 0xe0, 0xf5, 0x7b, 0x93, 0x0d, + 0xab, 0xa1, 0xcf, 0x87, 0xe1, 0xa5, 0x04, 0x45, 0xe8, 0x3c, 0x12, + 0xa5, 0x09, 0xc5, 0xb0, 0xd1, 0xb7, 0x53, 0xf3, 0x60, 0x14, 0xba, + 0x85, 0x69, 0x6a, 0x21, 0x7c, 0x1f, 0x75, 0x61, 0x17, 0x20, 0x17, + 0x7b, 0x6c, 0x3b, 0x41, 0x29, 0x5c, 0xe1, 0xac, 0x5a, 0xd1, 0xcd, + 0x8c, 0x9b, 0xeb, 0x60, 0x1d, 0x19, 0xec, 0xf7, 0xe5, 0xb0, 0xda, + 0xf9, 0x79, 0x18, 0xa5, 0x45, 0x3f, 0x49, 0x43, 0x57, 0xd2, 0xdd, + 0x24, 0xd5, 0x2c, 0xa3, 0xfd, 0x91, 0x8d, 0x27, 0xb5, 0xe5, 0xeb, + 0x14, 0x06, 0x9a, 0x4c, 0x7b, 0x21, 0xbb, 0x3a, 0xad, 0x30, 0x06, + 0x18, 0xc0, 0xd8, 0xc1, 0x6b, 0x2c, 0x7f, 0x59, 0x5c, 0x5d, 0x91, + 0xb1, 0x70, 0x22, 0x57, 0xeb, 0x8a, 0x6b, 0x48, 0x4a, 0xd5, 0x0f, + 0x29, 0xec, 0xc6, 0x40, 0xc0, 0x2f, 0x88, 0x4c, 0x68, 0x01, 0x17, + 0x77, 0xf4, 0x24, 0x19, 0x4f, 0xbd, 0xfa, 0xe1, 0xb2, 0x20, 0x21, + 0x4b, 0xdd, 0x1a, 0xd8, 0x29, 0x7d, 0xaa, 0xb8, 0xde, 0x54, 0xec, + 0x21, 0x55, 0x80, 0x6c, 0x1e, 0xf5, 0x30, 0xc8, 0xa3, 0x10, 0xe5, + 0xb2, 0xe6, 0x2a, 0x14, 0x31, 0xc3, 0x85, 0x2d, 0x8c, 0x98, 0xb1, + 0x86, 0x5a, 0x4f, 0x89, 0x59, 0x2d, 0xb9, 0xc7, 0xf7, 0x1c, 0xc8, + 0x8a, 0x7f, 0xc0, 0x9d, 0x05, 0x4a, 0xe6, 0x42, 0x4f, 0x62, 0xa3, + 0x6d, 0x29, 0xa4, 0x1f, 0x85, 0xab, 0xdb, 0xe5, 0x81, 0xc8, 0xad, + 0x2a, 0x3d, 0x4c, 0x5d, 0x5b, 0x84, 0x26, 0x71, 0xc4, 0x85, 0x5e, + 0x71, 0x24, 0xca, 0xa5, 0x1b, 0x6c, 0xd8, 0x61, 0xd3, 0x1a, 0xe0, + 0x54, 0xdb, 0xce, 0xba, 0xa9, 0x32, 0xb5, 0x22, 0xf6, 0x73, 0x41, + 0x09, 0x5d, 0xb8, 0x17, 0x5d, 0x0e, 0x0f, 0x99, 0x90, 0xd6, 0x47, + 0xda, 0x6f, 0x0a, 0x3a, 0x62, 0x28, 0x14, 0x67, 0x82, 0xd9, 0xf1, + 0xd0, 0x80, 0x59, 0x9b, 0xcb, 0x31, 0xd8, 0x9b, 0x0f, 0x8c, 0x77, + 0x4e, 0xb5, 0x68, 0x8a, 0xf2, 0x6c, 0xf6, 0x24, 0x0e, 0x2d, 0x6c, + 0x70, 0xc5, 0x73, 0xd1, 0xde, 0x14, 0xd0, 0x71, 0x8f, 0xb6, 0xd3, + 0x7b, 0x02, 0xf6, 0xe3, 0xb8, 0xd4, 0x09, 0x6e, 0x6b, 0x9e, 0x75, + 0x84, 0x39, 0xe6, 0x7f, 0x25, 0xa5, 0xf2, 0x48, 0x00, 0xc0, 0xa4, + 0x01, 0xda, 0x3f, 0x30, 0x82, 0x05, 0x63, 0x30, 0x82, 0x03, 0x4b, + 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x3b, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, + 0x00, 0x30, 0x53, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x49, 0x4c, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, + 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, + 0x6f, 0x6d, 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x31, 0x2c, 0x30, 0x2a, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x23, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x43, 0x6f, 0x6d, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x47, 0x32, 0x30, 0x1e, + 0x17, 0x0d, 0x31, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x31, 0x30, + 0x30, 0x30, 0x31, 0x5a, 0x17, 0x0d, 0x33, 0x39, 0x31, 0x32, 0x33, + 0x31, 0x32, 0x33, 0x35, 0x39, 0x30, 0x31, 0x5a, 0x30, 0x53, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49, + 0x4c, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x0d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x20, 0x4c, + 0x74, 0x64, 0x2e, 0x31, 0x2c, 0x30, 0x2a, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x23, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6d, + 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x74, 0x79, 0x20, 0x47, 0x32, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, + 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, + 0x02, 0x82, 0x02, 0x01, 0x00, 0xb6, 0x89, 0x36, 0x5b, 0x07, 0xb7, + 0x20, 0x36, 0xbd, 0x82, 0xbb, 0xe1, 0x16, 0x20, 0x03, 0x95, 0x7a, + 0xaf, 0x0e, 0xa3, 0x55, 0xc9, 0x25, 0x99, 0x4a, 0xc5, 0xd0, 0x56, + 0x41, 0x87, 0x90, 0x4d, 0x21, 0x60, 0xa4, 0x14, 0x87, 0x3b, 0xcd, + 0xfd, 0xb2, 0x3e, 0xb4, 0x67, 0x03, 0x6a, 0xed, 0xe1, 0x0f, 0x4b, + 0xc0, 0x91, 0x85, 0x70, 0x45, 0xe0, 0x42, 0x9e, 0xde, 0x29, 0x23, + 0xd4, 0x01, 0x0d, 0xa0, 0x10, 0x79, 0xb8, 0xdb, 0x03, 0xbd, 0xf3, + 0xa9, 0x2f, 0xd1, 0xc6, 0xe0, 0x0f, 0xcb, 0x9e, 0x8a, 0x14, 0x0a, + 0xb8, 0xbd, 0xf6, 0x56, 0x62, 0xf1, 0xc5, 0x72, 0xb6, 0x32, 0x25, + 0xd9, 0xb2, 0xf3, 0xbd, 0x65, 0xc5, 0x0d, 0x2c, 0x6e, 0xd5, 0x92, + 0x6f, 0x18, 0x8b, 0x00, 0x41, 0x14, 0x82, 0x6f, 0x40, 0x20, 0x26, + 0x7a, 0x28, 0x0f, 0xf5, 0x1e, 0x7f, 0x27, 0xf7, 0x94, 0xb1, 0x37, + 0x3d, 0xb7, 0xc7, 0x91, 0xf7, 0xe2, 0x01, 0xec, 0xfd, 0x94, 0x89, + 0xe1, 0xcc, 0x6e, 0xd3, 0x36, 0xd6, 0x0a, 0x19, 0x79, 0xae, 0xd7, + 0x34, 0x82, 0x65, 0xff, 0x7c, 0x42, 0xbb, 0xb6, 0xdd, 0x0b, 0xa6, + 0x34, 0xaf, 0x4b, 0x60, 0xfe, 0x7f, 0x43, 0x49, 0x06, 0x8b, 0x8c, + 0x43, 0xb8, 0x56, 0xf2, 0xd9, 0x7f, 0x21, 0x43, 0x17, 0xea, 0xa7, + 0x48, 0x95, 0x01, 0x75, 0x75, 0xea, 0x2b, 0xa5, 0x43, 0x95, 0xea, + 0x15, 0x84, 0x9d, 0x08, 0x8d, 0x26, 0x6e, 0x55, 0x9b, 0xab, 0xdc, + 0xd2, 0x39, 0xd2, 0x31, 0x1d, 0x60, 0xe2, 0xac, 0xcc, 0x56, 0x45, + 0x24, 0xf5, 0x1c, 0x54, 0xab, 0xee, 0x86, 0xdd, 0x96, 0x32, 0x85, + 0xf8, 0x4c, 0x4f, 0xe8, 0x95, 0x76, 0xb6, 0x05, 0xdd, 0x36, 0x23, + 0x67, 0xbc, 0xff, 0x15, 0xe2, 0xca, 0x3b, 0xe6, 0xa6, 0xec, 0x3b, + 0xec, 0x26, 0x11, 0x34, 0x48, 0x8d, 0xf6, 0x80, 0x2b, 0x1a, 0x23, + 0x02, 0xeb, 0x8a, 0x1c, 0x3a, 0x76, 0x2a, 0x7b, 0x56, 0x16, 0x1c, + 0x72, 0x2a, 0xb3, 0xaa, 0xe3, 0x60, 0xa5, 0x00, 0x9f, 0x04, 0x9b, + 0xe2, 0x6f, 0x1e, 0x14, 0x58, 0x5b, 0xa5, 0x6c, 0x8b, 0x58, 0x3c, + 0xc3, 0xba, 0x4e, 0x3a, 0x5c, 0xf7, 0xe1, 0x96, 0x2b, 0x3e, 0xef, + 0x07, 0xbc, 0xa4, 0xe5, 0x5d, 0xcc, 0x4d, 0x9f, 0x0d, 0xe1, 0xdc, + 0xaa, 0xbb, 0xe1, 0x6e, 0x1a, 0xec, 0x8f, 0xe1, 0xb6, 0x4c, 0x4d, + 0x79, 0x72, 0x5d, 0x17, 0x35, 0x0b, 0x1d, 0xd7, 0xc1, 0x47, 0xda, + 0x96, 0x24, 0xe0, 0xd0, 0x72, 0xa8, 0x5a, 0x5f, 0x66, 0x2d, 0x10, + 0xdc, 0x2f, 0x2a, 0x13, 0xae, 0x26, 0xfe, 0x0a, 0x1c, 0x19, 0xcc, + 0xd0, 0x3e, 0x0b, 0x9c, 0xc8, 0x09, 0x2e, 0xf9, 0x5b, 0x96, 0x7a, + 0x47, 0x9c, 0xe9, 0x7a, 0xf3, 0x05, 0x50, 0x74, 0x95, 0x73, 0x9e, + 0x30, 0x09, 0xf3, 0x97, 0x82, 0x5e, 0xe6, 0x8f, 0x39, 0x08, 0x1e, + 0x59, 0xe5, 0x35, 0x14, 0x42, 0x13, 0xff, 0x00, 0x9c, 0xf7, 0xbe, + 0xaa, 0x50, 0xcf, 0xe2, 0x51, 0x48, 0xd7, 0xb8, 0x6f, 0xaf, 0xf8, + 0x4e, 0x7e, 0x33, 0x98, 0x92, 0x14, 0x62, 0x3a, 0x75, 0x63, 0xcf, + 0x7b, 0xfa, 0xde, 0x82, 0x3b, 0xa9, 0xbb, 0x39, 0xe2, 0xc4, 0xbd, + 0x2c, 0x00, 0x0e, 0xc8, 0x17, 0xac, 0x13, 0xef, 0x4d, 0x25, 0x8e, + 0xd8, 0xb3, 0x90, 0x2f, 0xa9, 0xda, 0x29, 0x7d, 0x1d, 0xaf, 0x74, + 0x3a, 0xb2, 0x27, 0xc0, 0xc1, 0x1e, 0x3e, 0x75, 0xa3, 0x16, 0xa9, + 0xaf, 0x7a, 0x22, 0x5d, 0x9f, 0x13, 0x1a, 0xcf, 0xa7, 0xa0, 0xeb, + 0xe3, 0x86, 0x0a, 0xd3, 0xfd, 0xe6, 0x96, 0x95, 0xd7, 0x23, 0xc8, + 0x37, 0xdd, 0xc4, 0x7c, 0xaa, 0x36, 0xac, 0x98, 0x1a, 0x12, 0xb1, + 0xe0, 0x4e, 0xe8, 0xb1, 0x3b, 0xf5, 0xd6, 0x6f, 0xf1, 0x30, 0xd7, + 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, + 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, + 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, + 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x4b, 0xc5, + 0xb4, 0x40, 0x6b, 0xad, 0x1c, 0xb3, 0xa5, 0x1c, 0x65, 0x6e, 0x46, + 0x36, 0x89, 0x87, 0x05, 0x0c, 0x0e, 0xb6, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, + 0x03, 0x82, 0x02, 0x01, 0x00, 0x73, 0x57, 0x3f, 0x2c, 0xd5, 0x95, + 0x32, 0x7e, 0x37, 0xdb, 0x96, 0x92, 0xeb, 0x19, 0x5e, 0x7e, 0x53, + 0xe7, 0x41, 0xec, 0x11, 0xb6, 0x47, 0xef, 0xb5, 0xde, 0xed, 0x74, + 0x5c, 0xc5, 0xf1, 0x8e, 0x49, 0xe0, 0xfc, 0x6e, 0x99, 0x13, 0xcd, + 0x9f, 0x8a, 0xda, 0xcd, 0x3a, 0x0a, 0xd8, 0x3a, 0x5a, 0x09, 0x3f, + 0x5f, 0x34, 0xd0, 0x2f, 0x03, 0xd2, 0x66, 0x1d, 0x1a, 0xbd, 0x9c, + 0x90, 0x37, 0xc8, 0x0c, 0x8e, 0x07, 0x5a, 0x94, 0x45, 0x46, 0x2a, + 0xe6, 0xbe, 0x7a, 0xda, 0xa1, 0xa9, 0xa4, 0x69, 0x12, 0x92, 0xb0, + 0x7d, 0x36, 0xd4, 0x44, 0x87, 0xd7, 0x51, 0xf1, 0x29, 0x63, 0xd6, + 0x75, 0xcd, 0x16, 0xe4, 0x27, 0x89, 0x1d, 0xf8, 0xc2, 0x32, 0x48, + 0xfd, 0xdb, 0x99, 0xd0, 0x8f, 0x5f, 0x54, 0x74, 0xcc, 0xac, 0x67, + 0x34, 0x11, 0x62, 0xd9, 0x0c, 0x0a, 0x37, 0x87, 0xd1, 0xa3, 0x17, + 0x48, 0x8e, 0xd2, 0x17, 0x1d, 0xf6, 0xd7, 0xfd, 0xdb, 0x65, 0xeb, + 0xfd, 0xa8, 0xd4, 0xf5, 0xd6, 0x4f, 0xa4, 0x5b, 0x75, 0xe8, 0xc5, + 0xd2, 0x60, 0xb2, 0xdb, 0x09, 0x7e, 0x25, 0x8b, 0x7b, 0xba, 0x52, + 0x92, 0x9e, 0x3e, 0xe8, 0xc5, 0x77, 0xa1, 0x3c, 0xe0, 0x4a, 0x73, + 0x6b, 0x61, 0xcf, 0x86, 0xdc, 0x43, 0xff, 0xff, 0x21, 0xfe, 0x23, + 0x5d, 0x24, 0x4a, 0xf5, 0xd3, 0x6d, 0x0f, 0x62, 0x04, 0x05, 0x57, + 0x82, 0xda, 0x6e, 0xa4, 0x33, 0x25, 0x79, 0x4b, 0x2e, 0x54, 0x19, + 0x8b, 0xcc, 0x2c, 0x3d, 0x30, 0xe9, 0xd1, 0x06, 0xff, 0xe8, 0x32, + 0x46, 0xbe, 0xb5, 0x33, 0x76, 0x77, 0xa8, 0x01, 0x5d, 0x96, 0xc1, + 0xc1, 0xd5, 0xbe, 0xae, 0x25, 0xc0, 0xc9, 0x1e, 0x0a, 0x09, 0x20, + 0x88, 0xa1, 0x0e, 0xc9, 0xf3, 0x6f, 0x4d, 0x82, 0x54, 0x00, 0x20, + 0xa7, 0xd2, 0x8f, 0xe4, 0x39, 0x54, 0x17, 0x2e, 0x8d, 0x1e, 0xb8, + 0x1b, 0xbb, 0x1b, 0xbd, 0x9a, 0x4e, 0x3b, 0x10, 0x34, 0xdc, 0x9c, + 0x88, 0x53, 0xef, 0xa2, 0x31, 0x5b, 0x58, 0x4f, 0x91, 0x62, 0xc8, + 0xc2, 0x9a, 0x9a, 0xcd, 0x15, 0x5d, 0x38, 0xa9, 0xd6, 0xbe, 0xf8, + 0x13, 0xb5, 0x9f, 0x12, 0x69, 0xf2, 0x50, 0x62, 0xac, 0xfb, 0x17, + 0x37, 0xf4, 0xee, 0xb8, 0x75, 0x67, 0x60, 0x10, 0xfb, 0x83, 0x50, + 0xf9, 0x44, 0xb5, 0x75, 0x9c, 0x40, 0x17, 0xb2, 0xfe, 0xfd, 0x79, + 0x5d, 0x6e, 0x58, 0x58, 0x5f, 0x30, 0xfc, 0x00, 0xae, 0xaf, 0x33, + 0xc1, 0x0e, 0x4e, 0x6c, 0xba, 0xa7, 0xa6, 0xa1, 0x7f, 0x32, 0xdb, + 0x38, 0xe0, 0xb1, 0x72, 0x17, 0x0a, 0x2b, 0x91, 0xec, 0x6a, 0x63, + 0x26, 0xed, 0x89, 0xd4, 0x78, 0xcc, 0x74, 0x1e, 0x05, 0xf8, 0x6b, + 0xfe, 0x8c, 0x6a, 0x76, 0x39, 0x29, 0xae, 0x65, 0x23, 0x12, 0x95, + 0x08, 0x22, 0x1c, 0x97, 0xce, 0x5b, 0x06, 0xee, 0x0c, 0xe2, 0xbb, + 0xbc, 0x1f, 0x44, 0x93, 0xf6, 0xd8, 0x38, 0x45, 0x05, 0x21, 0xed, + 0xe4, 0xad, 0xab, 0x12, 0xb6, 0x03, 0xa4, 0x42, 0x2e, 0x2d, 0xc4, + 0x09, 0x3a, 0x03, 0x67, 0x69, 0x84, 0x9a, 0xe1, 0x59, 0x90, 0x8a, + 0x28, 0x85, 0xd5, 0x5d, 0x74, 0xb1, 0xd1, 0x0e, 0x20, 0x58, 0x9b, + 0x13, 0xa5, 0xb0, 0x63, 0xa6, 0xed, 0x7b, 0x47, 0xfd, 0x45, 0x55, + 0x30, 0xa4, 0xee, 0x9a, 0xd4, 0xe6, 0xe2, 0x87, 0xef, 0x98, 0xc9, + 0x32, 0x82, 0x11, 0x29, 0x22, 0xbc, 0x00, 0x0a, 0x31, 0x5e, 0x2d, + 0x0f, 0xc0, 0x8e, 0xe9, 0x6b, 0xb2, 0x8f, 0x2e, 0x06, 0xd8, 0xd1, + 0x91, 0xc7, 0xc6, 0x12, 0xf4, 0x4c, 0xfd, 0x30, 0x17, 0xc3, 0xc1, + 0xda, 0x38, 0x5b, 0xe3, 0xa9, 0xea, 0xe6, 0xa1, 0xba, 0x79, 0xef, + 0x73, 0xd8, 0xb6, 0x53, 0x57, 0x2d, 0xf6, 0xd0, 0xe1, 0xd7, 0x48, + 0x30, 0x82, 0x05, 0x59, 0x30, 0x82, 0x03, 0x41, 0xa0, 0x03, 0x02, + 0x01, 0x02, 0x02, 0x01, 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x4e, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x4e, 0x4f, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x0c, 0x14, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x41, + 0x53, 0x2d, 0x39, 0x38, 0x33, 0x31, 0x36, 0x33, 0x33, 0x32, 0x37, + 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x17, + 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x20, 0x32, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, + 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, 0x31, 0x30, 0x32, 0x36, + 0x30, 0x38, 0x33, 0x38, 0x30, 0x33, 0x5a, 0x17, 0x0d, 0x34, 0x30, + 0x31, 0x30, 0x32, 0x36, 0x30, 0x38, 0x33, 0x38, 0x30, 0x33, 0x5a, + 0x30, 0x4e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x4e, 0x4f, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x0c, 0x14, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, + 0x20, 0x41, 0x53, 0x2d, 0x39, 0x38, 0x33, 0x31, 0x36, 0x33, 0x33, + 0x32, 0x37, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0c, 0x17, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x52, 0x6f, 0x6f, 0x74, + 0x20, 0x43, 0x41, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, + 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, + 0x02, 0x01, 0x00, 0xd7, 0xc7, 0x5e, 0xf7, 0xc1, 0x07, 0xd4, 0x77, + 0xfb, 0x43, 0x21, 0xf4, 0xf4, 0xf5, 0x69, 0xe4, 0xee, 0x32, 0x01, + 0xdb, 0xa3, 0x86, 0x1f, 0xe4, 0x59, 0x0d, 0xba, 0xe7, 0x75, 0x83, + 0x52, 0xeb, 0xea, 0x1c, 0x61, 0x15, 0x48, 0xbb, 0x1d, 0x07, 0xca, + 0x8c, 0xae, 0xb0, 0xdc, 0x96, 0x9d, 0xea, 0xc3, 0x60, 0x92, 0x86, + 0x82, 0x28, 0x73, 0x9c, 0x56, 0x06, 0xff, 0x4b, 0x64, 0xf0, 0x0c, + 0x2a, 0x37, 0x49, 0xb5, 0xe5, 0xcf, 0x0c, 0x7c, 0xee, 0xf1, 0x4a, + 0xbb, 0x73, 0x30, 0x65, 0xf3, 0xd5, 0x2f, 0x83, 0xb6, 0x7e, 0xe3, + 0xe7, 0xf5, 0x9e, 0xab, 0x60, 0xf9, 0xd3, 0xf1, 0x9d, 0x92, 0x74, + 0x8a, 0xe4, 0x1c, 0x96, 0xac, 0x5b, 0x80, 0xe9, 0xb5, 0xf4, 0x31, + 0x87, 0xa3, 0x51, 0xfc, 0xc7, 0x7e, 0xa1, 0x6f, 0x8e, 0x53, 0x77, + 0xd4, 0x97, 0xc1, 0x55, 0x33, 0x92, 0x3e, 0x18, 0x2f, 0x75, 0xd4, + 0xad, 0x86, 0x49, 0xcb, 0x95, 0xaf, 0x54, 0x06, 0x6c, 0xd8, 0x06, + 0x13, 0x8d, 0x5b, 0xff, 0xe1, 0x26, 0x19, 0x59, 0xc0, 0x24, 0xba, + 0x81, 0x71, 0x79, 0x90, 0x44, 0x50, 0x68, 0x24, 0x94, 0x5f, 0xb8, + 0xb3, 0x11, 0xf1, 0x29, 0x41, 0x61, 0xa3, 0x41, 0xcb, 0x23, 0x36, + 0xd5, 0xc1, 0xf1, 0x32, 0x50, 0x10, 0x4e, 0x7f, 0xf4, 0x86, 0x93, + 0xec, 0x84, 0xd3, 0x8e, 0xbc, 0x4b, 0xbf, 0x5c, 0x01, 0x4e, 0x07, + 0x3d, 0xdc, 0x14, 0x8a, 0x94, 0x0a, 0xa4, 0xea, 0x73, 0xfb, 0x0b, + 0x51, 0xe8, 0x13, 0x07, 0x18, 0xfa, 0x0e, 0xf1, 0x2b, 0xd1, 0x54, + 0x15, 0x7d, 0x3c, 0xe1, 0xf7, 0xb4, 0x19, 0x42, 0x67, 0x62, 0x5e, + 0x77, 0xe0, 0xa2, 0x55, 0xec, 0xb6, 0xd9, 0x69, 0x17, 0xd5, 0x3a, + 0xaf, 0x44, 0xed, 0x4a, 0xc5, 0x9e, 0xe4, 0x7a, 0x27, 0x7c, 0xe5, + 0x75, 0xd7, 0xaa, 0xcb, 0x25, 0xe7, 0xdf, 0x6b, 0x0a, 0xdb, 0x0f, + 0x4d, 0x93, 0x4e, 0xa8, 0xa0, 0xcd, 0x7b, 0x2e, 0xf2, 0x59, 0x01, + 0x6a, 0xb7, 0x0d, 0xb8, 0x07, 0x81, 0x7e, 0x8b, 0x38, 0x1b, 0x38, + 0xe6, 0x0a, 0x57, 0x99, 0x3d, 0xee, 0x21, 0xe8, 0xa3, 0xf5, 0x0c, + 0x16, 0xdd, 0x8b, 0xec, 0x34, 0x8e, 0x9c, 0x2a, 0x1c, 0x00, 0x15, + 0x17, 0x8d, 0x68, 0x83, 0xd2, 0x70, 0x9f, 0x18, 0x08, 0xcd, 0x11, + 0x68, 0xd5, 0xc9, 0x6b, 0x52, 0xcd, 0xc4, 0x46, 0x8f, 0xdc, 0xb5, + 0xf3, 0xd8, 0x57, 0x73, 0x1e, 0xe9, 0x94, 0x39, 0x04, 0xbf, 0xd3, + 0xde, 0x38, 0xde, 0xb4, 0x53, 0xec, 0x69, 0x1c, 0xa2, 0x7e, 0xc4, + 0x8f, 0xe4, 0x1b, 0x70, 0xad, 0xf2, 0xa2, 0xf9, 0xfb, 0xf7, 0x16, + 0x64, 0x66, 0x69, 0x9f, 0x49, 0x51, 0xa2, 0xe2, 0x15, 0x18, 0x67, + 0x06, 0x4a, 0x7f, 0xd5, 0x6c, 0xb5, 0x4d, 0xb3, 0x33, 0xe0, 0x61, + 0xeb, 0x5d, 0xbe, 0xe9, 0x98, 0x0f, 0x32, 0xd7, 0x1d, 0x4b, 0x3c, + 0x2e, 0x5a, 0x01, 0x52, 0x91, 0x09, 0xf2, 0xdf, 0xea, 0x8d, 0xd8, + 0x06, 0x40, 0x63, 0xaa, 0x11, 0xe4, 0xfe, 0xc3, 0x37, 0x9e, 0x14, + 0x52, 0x3f, 0xf4, 0xe2, 0xcc, 0xf2, 0x61, 0x93, 0xd1, 0xfd, 0x67, + 0x6b, 0xd7, 0x52, 0xae, 0xbf, 0x68, 0xab, 0x40, 0x43, 0xa0, 0x57, + 0x35, 0x53, 0x78, 0xf0, 0x53, 0xf8, 0x61, 0x42, 0x07, 0x64, 0xc6, + 0xd7, 0x6f, 0x9b, 0x4c, 0x38, 0x0d, 0x63, 0xac, 0x62, 0xaf, 0x36, + 0x8b, 0xa2, 0x73, 0x0a, 0x0d, 0xf5, 0x21, 0xbd, 0x74, 0xaa, 0x4d, + 0xea, 0x72, 0x03, 0x49, 0xdb, 0xc7, 0x5f, 0x1d, 0x62, 0x63, 0xc7, + 0xfd, 0xdd, 0x91, 0xec, 0x33, 0xee, 0xf5, 0x6d, 0xb4, 0x6e, 0x30, + 0x68, 0xde, 0xc8, 0xd6, 0x26, 0xb0, 0x75, 0x5e, 0x7b, 0xb4, 0x07, + 0x20, 0x98, 0xa1, 0x76, 0x32, 0xb8, 0x4d, 0x6c, 0x4f, 0x02, 0x03, + 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, + 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, + 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, + 0x04, 0x14, 0xc9, 0x80, 0x77, 0xe0, 0x62, 0x92, 0x82, 0xf5, 0x46, + 0x9c, 0xf3, 0xba, 0xf7, 0x4c, 0xc3, 0xde, 0xb8, 0xa3, 0xad, 0x39, + 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, + 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, + 0x02, 0x01, 0x00, 0x53, 0x5f, 0x21, 0xf5, 0xba, 0xb0, 0x3a, 0x52, + 0x39, 0x2c, 0x92, 0xb0, 0x6c, 0x00, 0xc9, 0xef, 0xce, 0x20, 0xef, + 0x06, 0xf2, 0x96, 0x9e, 0xe9, 0xa4, 0x74, 0x7f, 0x7a, 0x16, 0xfc, + 0xb7, 0xf5, 0xb6, 0xfb, 0x15, 0x1b, 0x3f, 0xab, 0xa6, 0xc0, 0x72, + 0x5d, 0x10, 0xb1, 0x71, 0xee, 0xbc, 0x4f, 0xe3, 0xad, 0xac, 0x03, + 0x6d, 0x2e, 0x71, 0x2e, 0xaf, 0xc4, 0xe3, 0xad, 0xa3, 0xbd, 0x0c, + 0x11, 0xa7, 0xb4, 0xff, 0x4a, 0xb2, 0x7b, 0x10, 0x10, 0x1f, 0xa7, + 0x57, 0x41, 0xb2, 0xc0, 0xae, 0xf4, 0x2c, 0x59, 0xd6, 0x47, 0x10, + 0x88, 0xf3, 0x21, 0x51, 0x29, 0x30, 0xca, 0x60, 0x86, 0xaf, 0x46, + 0xab, 0x1d, 0xed, 0x3a, 0x5b, 0xb0, 0x94, 0xde, 0x44, 0xe3, 0x41, + 0x08, 0xa2, 0xc1, 0xec, 0x1d, 0xd6, 0xfd, 0x4f, 0xb6, 0xd6, 0x47, + 0xd0, 0x14, 0x0b, 0xca, 0xe6, 0xca, 0xb5, 0x7b, 0x77, 0x7e, 0x41, + 0x1f, 0x5e, 0x83, 0xc7, 0xb6, 0x8c, 0x39, 0x96, 0xb0, 0x3f, 0x96, + 0x81, 0x41, 0x6f, 0x60, 0x90, 0xe2, 0xe8, 0xf9, 0xfb, 0x22, 0x71, + 0xd9, 0x7d, 0xb3, 0x3d, 0x46, 0xbf, 0xb4, 0x84, 0xaf, 0x90, 0x1c, + 0x0f, 0x8f, 0x12, 0x6a, 0xaf, 0xef, 0xee, 0x1e, 0x7a, 0xae, 0x02, + 0x4a, 0x8a, 0x17, 0x2b, 0x76, 0xfe, 0xac, 0x54, 0x89, 0x24, 0x2c, + 0x4f, 0x3f, 0xb6, 0xb2, 0xa7, 0x4e, 0x8c, 0xa8, 0x91, 0x97, 0xfb, + 0x29, 0xc6, 0x7b, 0x5c, 0x2d, 0xb9, 0xcb, 0x66, 0xb6, 0xb7, 0xa8, + 0x5b, 0x12, 0x51, 0x85, 0xb5, 0x09, 0x7e, 0x62, 0x78, 0x70, 0xfe, + 0xa9, 0x6a, 0x60, 0xb6, 0x1d, 0x0e, 0x79, 0x0c, 0xfd, 0xca, 0xea, + 0x24, 0x80, 0x72, 0xc3, 0x97, 0x3f, 0xf2, 0x77, 0xab, 0x43, 0x22, + 0x0a, 0xc7, 0xeb, 0xb6, 0x0c, 0x84, 0x82, 0x2c, 0x80, 0x6b, 0x41, + 0x8a, 0x08, 0xc0, 0xeb, 0xa5, 0x6b, 0xdf, 0x99, 0x12, 0xcb, 0x8a, + 0xd5, 0x5e, 0x80, 0x0c, 0x91, 0xe0, 0x26, 0x08, 0x36, 0x48, 0xc5, + 0xfa, 0x38, 0x11, 0x35, 0xff, 0x25, 0x83, 0x2d, 0xf2, 0x7a, 0xbf, + 0xda, 0xfd, 0x8e, 0xfe, 0xa5, 0xcb, 0x45, 0x2c, 0x1f, 0xc4, 0x88, + 0x53, 0xae, 0x77, 0x0e, 0xd9, 0x9a, 0x76, 0xc5, 0x8e, 0x2c, 0x1d, + 0xa3, 0xba, 0xd5, 0xec, 0x32, 0xae, 0xc0, 0xaa, 0xac, 0xf7, 0xd1, + 0x7a, 0x4d, 0xeb, 0xd4, 0x07, 0xe2, 0x48, 0xf7, 0x22, 0x8e, 0xb0, + 0xa4, 0x9f, 0x6a, 0xce, 0x8e, 0xb2, 0xb2, 0x60, 0xf4, 0xa3, 0x22, + 0xd0, 0x23, 0xeb, 0x94, 0x5a, 0x7a, 0x69, 0xdd, 0x0f, 0xbf, 0x40, + 0x57, 0xac, 0x6b, 0x59, 0x50, 0xd9, 0xa3, 0x99, 0xe1, 0x6e, 0xfe, + 0x8d, 0x01, 0x79, 0x27, 0x23, 0x15, 0xde, 0x92, 0x9d, 0x7b, 0x09, + 0x4d, 0x5a, 0xe7, 0x4b, 0x48, 0x30, 0x5a, 0x18, 0xe6, 0x0a, 0x6d, + 0xe6, 0x8f, 0xe0, 0xd2, 0xbb, 0xe6, 0xdf, 0x7c, 0x6e, 0x21, 0x82, + 0xc1, 0x68, 0x39, 0x4d, 0xb4, 0x98, 0x58, 0x66, 0x62, 0xcc, 0x4a, + 0x90, 0x5e, 0xc3, 0xfa, 0x27, 0x04, 0xb1, 0x79, 0x15, 0x74, 0x99, + 0xcc, 0xbe, 0xad, 0x20, 0xde, 0x26, 0x60, 0x1c, 0xeb, 0x56, 0x51, + 0xa6, 0xa3, 0xea, 0xe4, 0xa3, 0x3f, 0xa7, 0xff, 0x61, 0xdc, 0xf1, + 0x5a, 0x4d, 0x6c, 0x32, 0x23, 0x43, 0xee, 0xac, 0xa8, 0xee, 0xee, + 0x4a, 0x12, 0x09, 0x3c, 0x5d, 0x71, 0xc2, 0xbe, 0x79, 0xfa, 0xc2, + 0x87, 0x68, 0x1d, 0x0b, 0xfd, 0x5c, 0x69, 0xcc, 0x06, 0xd0, 0x9a, + 0x7d, 0x54, 0x99, 0x2a, 0xc9, 0x39, 0x1a, 0x19, 0xaf, 0x4b, 0x2a, + 0x43, 0xf3, 0x63, 0x5d, 0x5a, 0x58, 0xe2, 0x2f, 0xe3, 0x1d, 0xe4, + 0xa9, 0xd6, 0xd0, 0x0a, 0xd0, 0x9e, 0xbf, 0xd7, 0x81, 0x09, 0xf1, + 0xc9, 0xc7, 0x26, 0x0d, 0xac, 0x98, 0x16, 0x56, 0xa0, 0x30, 0x82, + 0x05, 0x59, 0x30, 0x82, 0x03, 0x41, 0xa0, 0x03, 0x02, 0x01, 0x02, + 0x02, 0x01, 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x4e, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4f, + 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x14, + 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x41, 0x53, 0x2d, + 0x39, 0x38, 0x33, 0x31, 0x36, 0x33, 0x33, 0x32, 0x37, 0x31, 0x20, + 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x17, 0x42, 0x75, + 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, + 0x20, 0x33, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, + 0x1e, 0x17, 0x0d, 0x31, 0x30, 0x31, 0x30, 0x32, 0x36, 0x30, 0x38, + 0x32, 0x38, 0x35, 0x38, 0x5a, 0x17, 0x0d, 0x34, 0x30, 0x31, 0x30, + 0x32, 0x36, 0x30, 0x38, 0x32, 0x38, 0x35, 0x38, 0x5a, 0x30, 0x4e, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x4e, 0x4f, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x0c, 0x14, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x41, + 0x53, 0x2d, 0x39, 0x38, 0x33, 0x31, 0x36, 0x33, 0x33, 0x32, 0x37, + 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x17, + 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x20, 0x33, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, + 0x41, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, + 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, + 0x00, 0xa5, 0xda, 0x0a, 0x95, 0x16, 0x50, 0xe3, 0x95, 0xf2, 0x5e, + 0x9d, 0x76, 0x31, 0x06, 0x32, 0x7a, 0x9b, 0xf1, 0x10, 0x76, 0xb8, + 0x00, 0x9a, 0xb5, 0x52, 0x36, 0xcd, 0x24, 0x47, 0xb0, 0x9f, 0x18, + 0x64, 0xbc, 0x9a, 0xf6, 0xfa, 0xd5, 0x79, 0xd8, 0x90, 0x62, 0x4c, + 0x22, 0x2f, 0xde, 0x38, 0x3d, 0xd6, 0xe0, 0xa8, 0xe9, 0x1c, 0x2c, + 0xdb, 0x78, 0x11, 0xe9, 0x8e, 0x68, 0x51, 0x15, 0x72, 0xc7, 0xf3, + 0x33, 0x87, 0xe4, 0xa0, 0x5d, 0x0b, 0x5c, 0xe0, 0x57, 0x07, 0x2a, + 0x30, 0xf5, 0xcd, 0xc4, 0x37, 0x77, 0x28, 0x4d, 0x18, 0x91, 0xe6, + 0xbf, 0xd5, 0x52, 0xfd, 0x71, 0x2d, 0x70, 0x3e, 0xe7, 0xc6, 0xc4, + 0x8a, 0xe3, 0xf0, 0x28, 0x0b, 0xf4, 0x76, 0x98, 0xa1, 0x8b, 0x87, + 0x55, 0xb2, 0x3a, 0x13, 0xfc, 0xb7, 0x3e, 0x27, 0x37, 0x8e, 0x22, + 0xe3, 0xa8, 0x4f, 0x2a, 0xef, 0x60, 0xbb, 0x3d, 0xb7, 0x39, 0xc3, + 0x0e, 0x01, 0x47, 0x99, 0x5d, 0x12, 0x4f, 0xdb, 0x43, 0xfa, 0x57, + 0xa1, 0xed, 0xf9, 0x9d, 0xbe, 0x11, 0x47, 0x26, 0x5b, 0x13, 0x98, + 0xab, 0x5d, 0x16, 0x8a, 0xb0, 0x37, 0x1c, 0x57, 0x9d, 0x45, 0xff, + 0x88, 0x96, 0x36, 0xbf, 0xbb, 0xca, 0x07, 0x7b, 0x6f, 0x87, 0x63, + 0xd7, 0xd0, 0x32, 0x6a, 0xd6, 0x5d, 0x6c, 0x0c, 0xf1, 0xb3, 0x6e, + 0x39, 0xe2, 0x6b, 0x31, 0x2e, 0x39, 0x00, 0x27, 0x14, 0xde, 0x38, + 0xc0, 0xec, 0x19, 0x66, 0x86, 0x12, 0xe8, 0x9d, 0x72, 0x16, 0x13, + 0x64, 0x52, 0xc7, 0xa9, 0x37, 0x1c, 0xfd, 0x82, 0x30, 0xed, 0x84, + 0x18, 0x1d, 0xf4, 0xae, 0x5c, 0xff, 0x70, 0x13, 0x00, 0xeb, 0xb1, + 0xf5, 0x33, 0x7a, 0x4b, 0xd6, 0x55, 0xf8, 0x05, 0x8d, 0x4b, 0x69, + 0xb0, 0xf5, 0xb3, 0x28, 0x36, 0x5c, 0x14, 0xc4, 0x51, 0x73, 0x4d, + 0x6b, 0x0b, 0xf1, 0x34, 0x07, 0xdb, 0x17, 0x39, 0xd7, 0xdc, 0x28, + 0x7b, 0x6b, 0xf5, 0x9f, 0xf3, 0x2e, 0xc1, 0x4f, 0x17, 0x2a, 0x10, + 0xf3, 0xcc, 0xca, 0xe8, 0xeb, 0xfd, 0x6b, 0xab, 0x2e, 0x9a, 0x9f, + 0x2d, 0x82, 0x6e, 0x04, 0xd4, 0x52, 0x01, 0x93, 0x2d, 0x3d, 0x86, + 0xfc, 0x7e, 0xfc, 0xdf, 0xef, 0x42, 0x1d, 0xa6, 0x6b, 0xef, 0xb9, + 0x20, 0xc6, 0xf7, 0xbd, 0xa0, 0xa7, 0x95, 0xfd, 0xa7, 0xe6, 0x89, + 0x24, 0xd8, 0xcc, 0x8c, 0x34, 0x6c, 0xe2, 0x23, 0x2f, 0xd9, 0x12, + 0x1a, 0x21, 0xb9, 0x55, 0x91, 0x6f, 0x0b, 0x91, 0x79, 0x19, 0x0c, + 0xad, 0x40, 0x88, 0x0b, 0x70, 0xe2, 0x7a, 0xd2, 0x0e, 0xd8, 0x68, + 0x48, 0xbb, 0x82, 0x13, 0x39, 0x10, 0x58, 0xe9, 0xd8, 0x2a, 0x07, + 0xc6, 0x12, 0xdb, 0x58, 0xdb, 0xd2, 0x3b, 0x55, 0x10, 0x47, 0x05, + 0x15, 0x67, 0x62, 0x7e, 0x18, 0x63, 0xa6, 0x46, 0x3f, 0x09, 0x0e, + 0x54, 0x32, 0x5e, 0xbf, 0x0d, 0x62, 0x7a, 0x27, 0xef, 0x80, 0xe8, + 0xdb, 0xd9, 0x4b, 0x06, 0x5a, 0x37, 0x5a, 0x25, 0xd0, 0x08, 0x12, + 0x77, 0xd4, 0x6f, 0x09, 0x50, 0x97, 0x3d, 0xc8, 0x1d, 0xc3, 0xdf, + 0x8c, 0x45, 0x30, 0x56, 0xc6, 0xd3, 0x64, 0xab, 0x66, 0xf3, 0xc0, + 0x5e, 0x96, 0x9c, 0xc3, 0xc4, 0xef, 0xc3, 0x7c, 0x6b, 0x8b, 0x3a, + 0x79, 0x7f, 0xb3, 0x49, 0xcf, 0x3d, 0xe2, 0x89, 0x9f, 0xa0, 0x30, + 0x4b, 0x85, 0xb9, 0x9c, 0x94, 0x24, 0x79, 0x8f, 0x7d, 0x6b, 0xa9, + 0x45, 0x68, 0x0f, 0x2b, 0xd0, 0xf1, 0xda, 0x1c, 0xcb, 0x69, 0xb8, + 0xca, 0x49, 0x62, 0x6d, 0xc8, 0xd0, 0x63, 0x62, 0xdd, 0x60, 0x0f, + 0x58, 0xaa, 0x8f, 0xa1, 0xbc, 0x05, 0xa5, 0x66, 0xa2, 0xcf, 0x1b, + 0x76, 0xb2, 0x84, 0x64, 0xb1, 0x4c, 0x39, 0x52, 0xc0, 0x30, 0xba, + 0xf0, 0x8c, 0x4b, 0x02, 0xb0, 0xb6, 0xb7, 0x02, 0x03, 0x01, 0x00, + 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, + 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0x47, 0xb8, 0xcd, 0xff, 0xe5, 0x6f, 0xee, 0xf8, 0xb2, 0xec, 0x2f, + 0x4e, 0x0e, 0xf9, 0x25, 0xb0, 0x8e, 0x3c, 0x6b, 0xc3, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, + 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, + 0x00, 0x00, 0x20, 0x23, 0x41, 0x35, 0x04, 0x90, 0xc2, 0x40, 0x62, + 0x60, 0xef, 0xe2, 0x35, 0x4c, 0xd7, 0x3f, 0xac, 0xe2, 0x34, 0x90, + 0xb8, 0xa1, 0x6f, 0x76, 0xfa, 0x16, 0x16, 0xa4, 0x48, 0x37, 0x2c, + 0xe9, 0x90, 0xc2, 0xf2, 0x3c, 0xf8, 0x0a, 0x9f, 0xd8, 0x81, 0xe5, + 0xbb, 0x5b, 0xda, 0x25, 0x2c, 0xa4, 0xa7, 0x55, 0x71, 0x24, 0x32, + 0xf6, 0xc8, 0x0b, 0xf2, 0xbc, 0x6a, 0xf8, 0x93, 0xac, 0xb2, 0x07, + 0xc2, 0x5f, 0x9f, 0xdb, 0xcc, 0xc8, 0x8a, 0xaa, 0xbe, 0x6a, 0x6f, + 0xe1, 0x49, 0x10, 0xcc, 0x31, 0xd7, 0x80, 0xbb, 0xbb, 0xc8, 0xd8, + 0xa2, 0x0e, 0x64, 0x57, 0xea, 0xa2, 0xf5, 0xc2, 0xa9, 0x31, 0x15, + 0xd2, 0x20, 0x6a, 0xec, 0xfc, 0x22, 0x01, 0x28, 0xcf, 0x86, 0xb8, + 0x80, 0x1e, 0xa9, 0xcc, 0x11, 0xa5, 0x3c, 0xf2, 0x16, 0xb3, 0x47, + 0x9d, 0xfc, 0xd2, 0x80, 0x21, 0xc4, 0xcb, 0xd0, 0x47, 0x70, 0x41, + 0xa1, 0xca, 0x83, 0x19, 0x08, 0x2c, 0x6d, 0xf2, 0x5d, 0x77, 0x9c, + 0x8a, 0x14, 0x13, 0xd4, 0x36, 0x1c, 0x92, 0xf0, 0xe5, 0x06, 0x37, + 0xdc, 0xa6, 0xe6, 0x90, 0x9b, 0x38, 0x8f, 0x5c, 0x6b, 0x1b, 0x46, + 0x86, 0x43, 0x42, 0x5f, 0x3e, 0x01, 0x07, 0x53, 0x54, 0x5d, 0x65, + 0x7d, 0xf7, 0x8a, 0x73, 0xa1, 0x9a, 0x54, 0x5a, 0x1f, 0x29, 0x43, + 0x14, 0x27, 0xc2, 0x85, 0x0f, 0xb5, 0x88, 0x7b, 0x1a, 0x3b, 0x94, + 0xb7, 0x1d, 0x60, 0xa7, 0xb5, 0x9c, 0xe7, 0x29, 0x69, 0x57, 0x5a, + 0x9b, 0x93, 0x7a, 0x43, 0x30, 0x1b, 0x03, 0xd7, 0x62, 0xc8, 0x40, + 0xa6, 0xaa, 0xfc, 0x64, 0xe4, 0x4a, 0xd7, 0x91, 0x53, 0x01, 0xa8, + 0x20, 0x88, 0x6e, 0x9c, 0x5f, 0x44, 0xb9, 0xcb, 0x60, 0x81, 0x34, + 0xec, 0x6f, 0xd3, 0x7d, 0xda, 0x48, 0x5f, 0xeb, 0xb4, 0x90, 0xbc, + 0x2d, 0xa9, 0x1c, 0x0b, 0xac, 0x1c, 0xd5, 0xa2, 0x68, 0x20, 0x80, + 0x04, 0xd6, 0xfc, 0xb1, 0x8f, 0x2f, 0xbb, 0x4a, 0x31, 0x0d, 0x4a, + 0x86, 0x1c, 0xeb, 0xe2, 0x36, 0x29, 0x26, 0xf5, 0xda, 0xd8, 0xc4, + 0xf2, 0x75, 0x61, 0xcf, 0x7e, 0xae, 0x76, 0x63, 0x4a, 0x7a, 0x40, + 0x65, 0x93, 0x87, 0xf8, 0x1e, 0x80, 0x8c, 0x86, 0xe5, 0x86, 0xd6, + 0x8f, 0x0e, 0xfc, 0x53, 0x2c, 0x60, 0xe8, 0x16, 0x61, 0x1a, 0xa2, + 0x3e, 0x43, 0x7b, 0xcd, 0x39, 0x60, 0x54, 0x6a, 0xf5, 0xf2, 0x89, + 0x26, 0x01, 0x68, 0x83, 0x48, 0xa2, 0x33, 0xe8, 0xc9, 0x04, 0x91, + 0xb2, 0x11, 0x34, 0x11, 0x3e, 0xea, 0xd0, 0x43, 0x19, 0x1f, 0x03, + 0x93, 0x90, 0x0c, 0xff, 0x51, 0x3d, 0x57, 0xf4, 0x41, 0x6e, 0xe1, + 0xcb, 0xa0, 0xbe, 0xeb, 0xc9, 0x63, 0xcd, 0x6d, 0xcc, 0xe4, 0xf8, + 0x36, 0xaa, 0x68, 0x9d, 0xed, 0xbd, 0x5d, 0x97, 0x70, 0x44, 0x0d, + 0xb6, 0x0e, 0x35, 0xdc, 0xe1, 0x0c, 0x5d, 0xbb, 0xa0, 0x51, 0x94, + 0xcb, 0x7e, 0x16, 0xeb, 0x11, 0x2f, 0xa3, 0x92, 0x45, 0xc8, 0x4c, + 0x71, 0xd9, 0xbc, 0xc9, 0x99, 0x52, 0x57, 0x46, 0x2f, 0x50, 0xcf, + 0xbd, 0x35, 0x69, 0xf4, 0x3d, 0x15, 0xce, 0x06, 0xa5, 0x2c, 0x0f, + 0x3e, 0xf6, 0x81, 0xba, 0x94, 0xbb, 0xc3, 0xbb, 0xbf, 0x65, 0x78, + 0xd2, 0x86, 0x79, 0xff, 0x49, 0x3b, 0x1a, 0x83, 0x0c, 0xf0, 0xde, + 0x78, 0xec, 0xc8, 0xf2, 0x4d, 0x4c, 0x1a, 0xde, 0x82, 0x29, 0xf8, + 0xc1, 0x5a, 0xda, 0xed, 0xee, 0xe6, 0x27, 0x5e, 0xe8, 0x45, 0xd0, + 0x9d, 0x1c, 0x51, 0xa8, 0x68, 0xab, 0x44, 0xe3, 0xd0, 0x8b, 0x6a, + 0xe3, 0xf8, 0x3b, 0xbb, 0xdc, 0x4d, 0xd7, 0x64, 0xf2, 0x51, 0xbe, + 0xe6, 0xaa, 0xab, 0x5a, 0xe9, 0x31, 0xee, 0x06, 0xbc, 0x73, 0xbf, + 0x13, 0x62, 0x0a, 0x9f, 0xc7, 0xb9, 0x97, 0x30, 0x82, 0x03, 0xc3, + 0x30, 0x82, 0x02, 0xab, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, + 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0x82, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, + 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x22, 0x54, + 0x2d, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x45, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x20, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x47, 0x6d, 0x62, 0x48, + 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x16, + 0x54, 0x2d, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1c, + 0x54, 0x2d, 0x54, 0x65, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x20, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x30, 0x1e, 0x17, 0x0d, 0x30, + 0x38, 0x31, 0x30, 0x30, 0x31, 0x31, 0x30, 0x32, 0x39, 0x35, 0x36, + 0x5a, 0x17, 0x0d, 0x33, 0x33, 0x31, 0x30, 0x30, 0x31, 0x32, 0x33, + 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0x82, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, + 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x22, 0x54, + 0x2d, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x45, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x20, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x47, 0x6d, 0x62, 0x48, + 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x16, + 0x54, 0x2d, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1c, + 0x54, 0x2d, 0x54, 0x65, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x20, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, - 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa9, 0x53, 0x00, 0xe3, 0x2e, - 0xa6, 0xf6, 0x8e, 0xfa, 0x60, 0xd8, 0x2d, 0x95, 0x3e, 0xf8, 0x2c, - 0x2a, 0x54, 0x4e, 0xcd, 0xb9, 0x84, 0x61, 0x94, 0x58, 0x4f, 0x8f, - 0x3d, 0x8b, 0xe4, 0x43, 0xf3, 0x75, 0x89, 0x8d, 0x51, 0xe4, 0xc3, - 0x37, 0xd2, 0x8a, 0x88, 0x4d, 0x79, 0x1e, 0xb7, 0x12, 0xdd, 0x43, - 0x78, 0x4a, 0x8a, 0x92, 0xe6, 0xd7, 0x48, 0xd5, 0x0f, 0xa4, 0x3a, - 0x29, 0x44, 0x35, 0xb8, 0x07, 0xf6, 0x68, 0x1d, 0x55, 0xcd, 0x38, - 0x51, 0xf0, 0x8c, 0x24, 0x31, 0x85, 0xaf, 0x83, 0xc9, 0x7d, 0xe9, - 0x77, 0xaf, 0xed, 0x1a, 0x7b, 0x9d, 0x17, 0xf9, 0xb3, 0x9d, 0x38, - 0x50, 0x0f, 0xa6, 0x5a, 0x79, 0x91, 0x80, 0xaf, 0x37, 0xae, 0xa6, - 0xd3, 0x31, 0xfb, 0xb5, 0x26, 0x09, 0x9d, 0x3c, 0x5a, 0xef, 0x51, - 0xc5, 0x2b, 0xdf, 0x96, 0x5d, 0xeb, 0x32, 0x1e, 0x02, 0xda, 0x70, - 0x49, 0xec, 0x6e, 0x0c, 0xc8, 0x9a, 0x37, 0x8d, 0xf7, 0xf1, 0x36, - 0x60, 0x4b, 0x26, 0x2c, 0x82, 0x9e, 0xd0, 0x78, 0xf3, 0x0d, 0x0f, - 0x63, 0xa4, 0x51, 0x30, 0xe1, 0xf9, 0x2b, 0x27, 0x12, 0x07, 0xd8, - 0xea, 0xbd, 0x18, 0x62, 0x98, 0xb0, 0x59, 0x37, 0x7d, 0xbe, 0xee, - 0xf3, 0x20, 0x51, 0x42, 0x5a, 0x83, 0xef, 0x93, 0xba, 0x69, 0x15, - 0xf1, 0x62, 0x9d, 0x9f, 0x99, 0x39, 0x82, 0xa1, 0xb7, 0x74, 0x2e, - 0x8b, 0xd4, 0xc5, 0x0b, 0x7b, 0x2f, 0xf0, 0xc8, 0x0a, 0xda, 0x3d, - 0x79, 0x0a, 0x9a, 0x93, 0x1c, 0xa5, 0x28, 0x72, 0x73, 0x91, 0x43, - 0x9a, 0xa7, 0xd1, 0x4d, 0x85, 0x84, 0xb9, 0xa9, 0x74, 0x8f, 0x14, - 0x40, 0xc7, 0xdc, 0xde, 0xac, 0x41, 0x64, 0x6c, 0xb4, 0x19, 0x9b, - 0x02, 0x63, 0x6d, 0x24, 0x64, 0x8f, 0x44, 0xb2, 0x25, 0xea, 0xce, - 0x5d, 0x74, 0x0c, 0x63, 0x32, 0x5c, 0x8d, 0x87, 0xe5, 0x02, 0x03, - 0x01, 0x00, 0x01, 0xa3, 0x81, 0x89, 0x30, 0x81, 0x86, 0x30, 0x0f, - 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, - 0x03, 0x01, 0x01, 0xff, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, - 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, - 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa6, 0x91, 0x42, 0xfd, 0x13, - 0x61, 0x4a, 0x23, 0x9e, 0x08, 0xa4, 0x29, 0xe5, 0xd8, 0x13, 0x04, - 0x23, 0xee, 0x41, 0x25, 0x30, 0x47, 0x06, 0x03, 0x55, 0x1d, 0x1e, - 0x04, 0x40, 0x30, 0x3e, 0xa0, 0x3c, 0x30, 0x05, 0x82, 0x03, 0x2e, - 0x67, 0x72, 0x30, 0x05, 0x82, 0x03, 0x2e, 0x65, 0x75, 0x30, 0x06, - 0x82, 0x04, 0x2e, 0x65, 0x64, 0x75, 0x30, 0x06, 0x82, 0x04, 0x2e, - 0x6f, 0x72, 0x67, 0x30, 0x05, 0x81, 0x03, 0x2e, 0x67, 0x72, 0x30, - 0x05, 0x81, 0x03, 0x2e, 0x65, 0x75, 0x30, 0x06, 0x81, 0x04, 0x2e, - 0x65, 0x64, 0x75, 0x30, 0x06, 0x81, 0x04, 0x2e, 0x6f, 0x72, 0x67, + 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbd, 0x75, 0x93, 0xf0, 0x62, + 0x22, 0x6f, 0x24, 0xae, 0xe0, 0x7a, 0x76, 0xac, 0x7d, 0xbd, 0xd9, + 0x24, 0xd5, 0xb8, 0xb7, 0xfc, 0xcd, 0xf0, 0x42, 0xe0, 0xeb, 0x78, + 0x88, 0x56, 0x5e, 0x9b, 0x9a, 0x54, 0x1d, 0x4d, 0x0c, 0x8a, 0xf6, + 0xd3, 0xcf, 0x70, 0xf4, 0x52, 0xb5, 0xd8, 0x93, 0x04, 0xe3, 0x46, + 0x86, 0x71, 0x41, 0x4a, 0x2b, 0xf0, 0x2a, 0x2c, 0x55, 0x03, 0xd6, + 0x48, 0xc3, 0xe0, 0x39, 0x38, 0xed, 0xf2, 0x5c, 0x3c, 0x3f, 0x44, + 0xbc, 0x93, 0x3d, 0x61, 0xab, 0x4e, 0xcd, 0x0d, 0xbe, 0xf0, 0x20, + 0x27, 0x58, 0x0e, 0x44, 0x7f, 0x04, 0x1a, 0x87, 0xa5, 0xd7, 0x96, + 0x14, 0x36, 0x90, 0xd0, 0x49, 0x7b, 0xa1, 0x75, 0xfb, 0x1a, 0x6b, + 0x73, 0xb1, 0xf8, 0xce, 0xa9, 0x09, 0x2c, 0xf2, 0x53, 0xd5, 0xc3, + 0x14, 0x44, 0xb8, 0x86, 0xa5, 0xf6, 0x8b, 0x2b, 0x39, 0xda, 0xa3, + 0x33, 0x54, 0xd9, 0xfa, 0x72, 0x1a, 0xf7, 0x22, 0x15, 0x1c, 0x88, + 0x91, 0x6b, 0x7f, 0x66, 0xe5, 0xc3, 0x6a, 0x80, 0xb0, 0x24, 0xf3, + 0xdf, 0x86, 0x45, 0x88, 0xfd, 0x19, 0x7f, 0x75, 0x87, 0x1f, 0x1f, + 0xb1, 0x1b, 0x0a, 0x73, 0x24, 0x5b, 0xb9, 0x65, 0xe0, 0x2c, 0x54, + 0xc8, 0x60, 0xd3, 0x66, 0x17, 0x3f, 0xe1, 0xcc, 0x54, 0x33, 0x73, + 0x91, 0x02, 0x3a, 0xa6, 0x7f, 0x7b, 0x76, 0x39, 0xa2, 0x1f, 0x96, + 0xb6, 0x38, 0xae, 0xb5, 0xc8, 0x93, 0x74, 0x1d, 0x9e, 0xb9, 0xb4, + 0xe5, 0x60, 0x9d, 0x2f, 0x56, 0xd1, 0xe0, 0xeb, 0x5e, 0x5b, 0x4c, + 0x12, 0x70, 0x0c, 0x6c, 0x44, 0x20, 0xab, 0x11, 0xd8, 0xf4, 0x19, + 0xf6, 0xd2, 0x9c, 0x52, 0x37, 0xe7, 0xfa, 0xb6, 0xc2, 0x31, 0x3b, + 0x4a, 0xd4, 0x14, 0x99, 0xad, 0xc7, 0x1a, 0xf5, 0x5d, 0x5f, 0xfa, + 0x07, 0xb8, 0x7c, 0x0d, 0x1f, 0xd6, 0x83, 0x1e, 0xb3, 0x02, 0x03, + 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, + 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, + 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, + 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, + 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xb5, 0x03, 0xf7, 0x76, + 0x3b, 0x61, 0x82, 0x6a, 0x12, 0xaa, 0x18, 0x53, 0xeb, 0x03, 0x21, + 0x94, 0xbf, 0xfe, 0xce, 0xca, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, + 0x01, 0x01, 0x00, 0x56, 0x3d, 0xef, 0x94, 0xd5, 0xbd, 0xda, 0x73, + 0xb2, 0x58, 0xbe, 0xae, 0x90, 0xad, 0x98, 0x27, 0x97, 0xfe, 0x01, + 0xb1, 0xb0, 0x52, 0x00, 0xb8, 0x4d, 0xe4, 0x1b, 0x21, 0x74, 0x1b, + 0x7e, 0xc0, 0xee, 0x5e, 0x69, 0x2a, 0x25, 0xaf, 0x5c, 0xd6, 0x1d, + 0xda, 0xd2, 0x79, 0xc9, 0xf3, 0x97, 0x29, 0xe0, 0x86, 0x87, 0xde, + 0x04, 0x59, 0x0f, 0xf1, 0x59, 0xd4, 0x64, 0x85, 0x4b, 0x99, 0xaf, + 0x25, 0x04, 0x1e, 0xc9, 0x46, 0xa9, 0x97, 0xde, 0x82, 0xb2, 0x1b, + 0x70, 0x9f, 0x9c, 0xf6, 0xaf, 0x71, 0x31, 0xdd, 0x7b, 0x05, 0xa5, + 0x2c, 0xd3, 0xb9, 0xca, 0x47, 0xf6, 0xca, 0xf2, 0xf6, 0xe7, 0xad, + 0xb9, 0x48, 0x3f, 0xbc, 0x16, 0xb7, 0xc1, 0x6d, 0xf4, 0xea, 0x09, + 0xaf, 0xec, 0xf3, 0xb5, 0xe7, 0x05, 0x9e, 0xa6, 0x1e, 0x8a, 0x53, + 0x51, 0xd6, 0x93, 0x81, 0xcc, 0x74, 0x93, 0xf6, 0xb9, 0xda, 0xa6, + 0x25, 0x05, 0x74, 0x79, 0x5a, 0x7e, 0x40, 0x3e, 0x82, 0x4b, 0x26, + 0x11, 0x30, 0x6e, 0xe1, 0x3f, 0x41, 0xc7, 0x47, 0x00, 0x35, 0xd5, + 0xf5, 0xd3, 0xf7, 0x54, 0x3e, 0x81, 0x3d, 0xda, 0x49, 0x6a, 0x9a, + 0xb3, 0xef, 0x10, 0x3d, 0xe6, 0xeb, 0x6f, 0xd1, 0xc8, 0x22, 0x47, + 0xcb, 0xcc, 0xcf, 0x01, 0x31, 0x92, 0xd9, 0x18, 0xe3, 0x22, 0xbe, + 0x09, 0x1e, 0x1a, 0x3e, 0x5a, 0xb2, 0xe4, 0x6b, 0x0c, 0x54, 0x7a, + 0x7d, 0x43, 0x4e, 0xb8, 0x89, 0xa5, 0x7b, 0xd7, 0xa2, 0x3d, 0x96, + 0x86, 0xcc, 0xf2, 0x26, 0x34, 0x2d, 0x6a, 0x92, 0x9d, 0x9a, 0x1a, + 0xd0, 0x30, 0xe2, 0x5d, 0x4e, 0x04, 0xb0, 0x5f, 0x8b, 0x20, 0x7e, + 0x77, 0xc1, 0x3d, 0x95, 0x82, 0xd1, 0x46, 0x9a, 0x3b, 0x3c, 0x78, + 0xb8, 0x6f, 0xa1, 0xd0, 0x0d, 0x64, 0xa2, 0x78, 0x1e, 0x29, 0x4e, + 0x93, 0xc3, 0xa4, 0x54, 0x14, 0x5b, 0x30, 0x82, 0x04, 0x03, 0x30, + 0x82, 0x02, 0xeb, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x54, + 0x80, 0xf9, 0xa0, 0x73, 0xed, 0x3f, 0x00, 0x4c, 0xca, 0x89, 0xd8, + 0xe3, 0x71, 0xe6, 0x4a, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x75, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x45, + 0x45, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, + 0x19, 0x41, 0x53, 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x74, 0x73, 0x65, 0x65, 0x72, 0x69, 0x6d, 0x69, 0x73, 0x6b, 0x65, + 0x73, 0x6b, 0x75, 0x73, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x0c, 0x1f, 0x45, 0x45, 0x20, 0x43, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x43, + 0x65, 0x6e, 0x74, 0x72, 0x65, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, + 0x43, 0x41, 0x31, 0x18, 0x30, 0x16, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x09, 0x70, 0x6b, 0x69, + 0x40, 0x73, 0x6b, 0x2e, 0x65, 0x65, 0x30, 0x22, 0x18, 0x0f, 0x32, + 0x30, 0x31, 0x30, 0x31, 0x30, 0x33, 0x30, 0x31, 0x30, 0x31, 0x30, + 0x33, 0x30, 0x5a, 0x18, 0x0f, 0x32, 0x30, 0x33, 0x30, 0x31, 0x32, + 0x31, 0x37, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x75, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x45, 0x45, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x0c, 0x19, 0x41, 0x53, 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x74, 0x73, 0x65, 0x65, 0x72, 0x69, 0x6d, 0x69, 0x73, 0x6b, + 0x65, 0x73, 0x6b, 0x75, 0x73, 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x0c, 0x1f, 0x45, 0x45, 0x20, 0x43, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x43, 0x65, 0x6e, 0x74, 0x72, 0x65, 0x20, 0x52, 0x6f, 0x6f, 0x74, + 0x20, 0x43, 0x41, 0x31, 0x18, 0x30, 0x16, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x09, 0x70, 0x6b, + 0x69, 0x40, 0x73, 0x6b, 0x2e, 0x65, 0x65, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x1f, 0xef, - 0x79, 0x41, 0xe1, 0x7b, 0x6e, 0x3f, 0xb2, 0x8c, 0x86, 0x37, 0x42, - 0x4a, 0x4e, 0x1c, 0x37, 0x1e, 0x8d, 0x66, 0xba, 0x24, 0x81, 0xc9, - 0x4f, 0x12, 0x0f, 0x21, 0xc0, 0x03, 0x97, 0x86, 0x25, 0x6d, 0x5d, - 0xd3, 0x22, 0x29, 0xa8, 0x6c, 0xa2, 0x0d, 0xa9, 0xeb, 0x3d, 0x06, - 0x5b, 0x99, 0x3a, 0xc7, 0xcc, 0xc3, 0x9a, 0x34, 0x7f, 0xab, 0x0e, - 0xc8, 0x4e, 0x1c, 0xe1, 0xfa, 0xe4, 0xdc, 0xcd, 0x0d, 0xbe, 0xbf, - 0x24, 0xfe, 0x6c, 0xe7, 0x6b, 0xc2, 0x0d, 0xc8, 0x06, 0x9e, 0x4e, - 0x8d, 0x61, 0x28, 0xa6, 0x6a, 0xfd, 0xe5, 0xf6, 0x62, 0xea, 0x18, - 0x3c, 0x4e, 0xa0, 0x53, 0x9d, 0xb2, 0x3a, 0x9c, 0xeb, 0xa5, 0x9c, - 0x91, 0x16, 0xb6, 0x4d, 0x82, 0xe0, 0x0c, 0x05, 0x48, 0xa9, 0x6c, - 0xf5, 0xcc, 0xf8, 0xcb, 0x9d, 0x49, 0xb4, 0xf0, 0x02, 0xa5, 0xfd, - 0x70, 0x03, 0xed, 0x8a, 0x21, 0xa5, 0xae, 0x13, 0x86, 0x49, 0xc3, - 0x33, 0x73, 0xbe, 0x87, 0x3b, 0x74, 0x8b, 0x17, 0x45, 0x26, 0x4c, - 0x16, 0x91, 0x83, 0xfe, 0x67, 0x7d, 0xcd, 0x4d, 0x63, 0x67, 0xfa, - 0xf3, 0x03, 0x12, 0x96, 0x78, 0x06, 0x8d, 0xb1, 0x67, 0xed, 0x8e, - 0x3f, 0xbe, 0x9f, 0x4f, 0x02, 0xf5, 0xb3, 0x09, 0x2f, 0xf3, 0x4c, - 0x87, 0xdf, 0x2a, 0xcb, 0x95, 0x7c, 0x01, 0xcc, 0xac, 0x36, 0x7a, - 0xbf, 0xa2, 0x73, 0x7a, 0xf7, 0x8f, 0xc1, 0xb5, 0x9a, 0xa1, 0x14, - 0xb2, 0x8f, 0x33, 0x9f, 0x0d, 0xef, 0x22, 0xdc, 0x66, 0x7b, 0x84, - 0xbd, 0x45, 0x17, 0x06, 0x3d, 0x3c, 0xca, 0xb9, 0x77, 0x34, 0x8f, - 0xca, 0xea, 0xcf, 0x3f, 0x31, 0x3e, 0xe3, 0x88, 0xe3, 0x80, 0x49, - 0x25, 0xc8, 0x97, 0xb5, 0x9d, 0x9a, 0x99, 0x4d, 0xb0, 0x3c, 0xf8, - 0x4a, 0x00, 0x9b, 0x64, 0xdd, 0x9f, 0x39, 0x4b, 0xd1, 0x27, 0xd7, - 0xb8 + 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, + 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xc8, 0x20, 0xc0, 0xec, + 0xe0, 0xc5, 0x4b, 0xab, 0x07, 0x78, 0x95, 0xf3, 0x44, 0xee, 0xfb, + 0x0b, 0x0c, 0xff, 0x74, 0x8e, 0x61, 0xbb, 0xb1, 0x62, 0xea, 0x23, + 0xd8, 0xab, 0xa1, 0x65, 0x32, 0x7a, 0xeb, 0x8e, 0x17, 0x4f, 0x96, + 0xd8, 0x0a, 0x7b, 0x91, 0xa2, 0x63, 0x6c, 0xc7, 0x8c, 0x4c, 0x2e, + 0x79, 0xbf, 0xa9, 0x05, 0xfc, 0x69, 0x5c, 0x95, 0x8d, 0x62, 0xf9, + 0xb9, 0x70, 0xed, 0xc3, 0x51, 0x7d, 0xd0, 0x93, 0xe6, 0x6c, 0xeb, + 0x30, 0x4b, 0xe1, 0xbc, 0x7d, 0xbf, 0x52, 0x9b, 0xce, 0x6e, 0x7b, + 0x65, 0xf2, 0x38, 0xb1, 0xc0, 0xa2, 0x32, 0xef, 0x62, 0xb2, 0x68, + 0xe0, 0x61, 0x53, 0xc1, 0x36, 0x95, 0xff, 0xec, 0x94, 0xba, 0x36, + 0xae, 0x9c, 0x1c, 0xa7, 0x32, 0x0f, 0xe5, 0x7c, 0xb4, 0xc6, 0x6f, + 0x74, 0xfd, 0x7b, 0x18, 0xe8, 0xac, 0x57, 0xed, 0x06, 0x20, 0x4b, + 0x32, 0x30, 0x58, 0x5b, 0xfd, 0xcd, 0xa8, 0xe6, 0xa1, 0xfc, 0x70, + 0xbc, 0x8e, 0x92, 0x73, 0xdb, 0x97, 0xa7, 0x7c, 0x21, 0xae, 0x3d, + 0xc1, 0xf5, 0x48, 0x87, 0x6c, 0x27, 0xbd, 0x9f, 0x25, 0x74, 0x81, + 0x55, 0xb0, 0xf7, 0x75, 0xf6, 0x3d, 0xa4, 0x64, 0x6b, 0xd6, 0x4f, + 0xe7, 0xce, 0x40, 0xad, 0x0f, 0xdd, 0x32, 0xd3, 0xbc, 0x8a, 0x12, + 0x53, 0x98, 0xc9, 0x89, 0xfb, 0x10, 0x1d, 0x4d, 0x7e, 0xcd, 0x7e, + 0x1f, 0x56, 0x0d, 0x21, 0x70, 0x85, 0xf6, 0x20, 0x83, 0x1f, 0xf6, + 0xba, 0x1f, 0x04, 0x8f, 0xea, 0x77, 0x88, 0x35, 0xc4, 0xff, 0xea, + 0x4e, 0xa1, 0x8b, 0x4d, 0x3f, 0x63, 0x1b, 0x44, 0xc3, 0x44, 0xd4, + 0x25, 0x76, 0xca, 0xb7, 0x8d, 0xd7, 0x1e, 0x4a, 0x66, 0x64, 0xcd, + 0x5c, 0xc5, 0x9c, 0x83, 0xe1, 0xc2, 0x08, 0x88, 0x9a, 0xec, 0x4e, + 0xa3, 0xf1, 0x3e, 0x1c, 0x2c, 0xd9, 0x6c, 0x1d, 0xa1, 0x4b, 0x02, + 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0x8a, 0x30, 0x81, 0x87, 0x30, + 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, + 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, + 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x12, + 0xf2, 0x5a, 0x3e, 0xea, 0x56, 0x1c, 0xbf, 0xcd, 0x06, 0xac, 0xf1, + 0xf1, 0x25, 0xc9, 0xa9, 0x4b, 0xd4, 0x14, 0x99, 0x30, 0x45, 0x06, + 0x03, 0x55, 0x1d, 0x25, 0x04, 0x3e, 0x30, 0x3c, 0x06, 0x08, 0x2b, + 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x06, 0x08, 0x2b, 0x06, + 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x06, 0x08, 0x2b, 0x06, 0x01, + 0x05, 0x05, 0x07, 0x03, 0x03, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, + 0x05, 0x07, 0x03, 0x04, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, + 0x07, 0x03, 0x08, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, + 0x03, 0x09, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, + 0x7b, 0xf6, 0xe4, 0xc0, 0x0d, 0xaa, 0x19, 0x47, 0xb7, 0x4d, 0x57, + 0xa3, 0xfe, 0xad, 0xbb, 0xb1, 0x6a, 0xd5, 0x0f, 0x9e, 0xdb, 0xe4, + 0x63, 0xc5, 0x8e, 0xa1, 0x50, 0x56, 0x93, 0x96, 0xb8, 0x38, 0xc0, + 0x24, 0x22, 0x66, 0xbc, 0x53, 0x14, 0x61, 0x95, 0xbf, 0xd0, 0xc7, + 0x2a, 0x96, 0x39, 0x3f, 0x7d, 0x28, 0xb3, 0x10, 0x40, 0x21, 0x6a, + 0xc4, 0xaf, 0xb0, 0x52, 0x77, 0x18, 0xe1, 0x96, 0xd8, 0x56, 0x5d, + 0xe3, 0xdd, 0x36, 0x5e, 0x1d, 0xa7, 0x50, 0x54, 0xa0, 0xc5, 0x2a, + 0xe4, 0xaa, 0x8c, 0x94, 0x8a, 0x4f, 0x9d, 0x35, 0xff, 0x76, 0xa4, + 0x06, 0x13, 0x91, 0xa2, 0xa2, 0x7d, 0x00, 0x44, 0x3f, 0x55, 0xd3, + 0x82, 0x3c, 0x1a, 0xd5, 0x5b, 0xbc, 0x56, 0x4c, 0x22, 0x2e, 0x46, + 0x43, 0x8a, 0x24, 0x40, 0x2d, 0xf3, 0x12, 0xb8, 0x3b, 0x70, 0x1a, + 0xa4, 0x96, 0xb9, 0x1a, 0xaf, 0x87, 0x41, 0x1a, 0x6a, 0x18, 0x0d, + 0x06, 0x4f, 0xc7, 0x3e, 0x6e, 0xb9, 0x29, 0x4d, 0x0d, 0x49, 0x89, + 0x11, 0x87, 0x32, 0x5b, 0xe6, 0x4b, 0x04, 0xc8, 0xe4, 0x5c, 0xe6, + 0x74, 0x73, 0x94, 0x5d, 0x16, 0x98, 0x13, 0x95, 0xfe, 0xfb, 0xdb, + 0xb1, 0x44, 0xe5, 0x3a, 0x70, 0xac, 0x37, 0x6b, 0xe6, 0xb3, 0x33, + 0x72, 0x28, 0xc9, 0xb3, 0x57, 0xa0, 0xf6, 0x02, 0x16, 0x88, 0x06, + 0x0b, 0xb6, 0xa6, 0x4b, 0x20, 0x28, 0xd4, 0xde, 0x3d, 0x8b, 0xad, + 0x37, 0x05, 0x53, 0x74, 0xfe, 0x6e, 0xcc, 0xbc, 0x43, 0x17, 0x71, + 0x5e, 0xf9, 0xc5, 0xcc, 0x1a, 0xa9, 0x61, 0xee, 0xf7, 0x76, 0x0c, + 0xf3, 0x72, 0xf4, 0x72, 0xad, 0xcf, 0x72, 0x02, 0x36, 0x07, 0x47, + 0xcf, 0xef, 0x19, 0x50, 0x89, 0x60, 0xcc, 0xe9, 0x24, 0x95, 0x0f, + 0xc2, 0xcb, 0x1d, 0xf2, 0x6f, 0x76, 0x90, 0xc7, 0xcc, 0x75, 0xc1, + 0x96, 0xc5, 0x9d, 0x30, 0x82, 0x04, 0x3d, 0x30, 0x82, 0x03, 0x25, + 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x30, 0x81, 0xbf, 0x31, 0x3f, 0x30, 0x3d, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x0c, 0x36, 0x54, 0xc3, 0x9c, 0x52, 0x4b, 0x54, 0x52, + 0x55, 0x53, 0x54, 0x20, 0x45, 0x6c, 0x65, 0x6b, 0x74, 0x72, 0x6f, + 0x6e, 0x69, 0x6b, 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x6b, 0x61, 0x20, 0x48, 0x69, 0x7a, 0x6d, 0x65, 0x74, 0x20, 0x53, + 0x61, 0xc4, 0x9f, 0x6c, 0x61, 0x79, 0xc4, 0xb1, 0x63, 0xc4, 0xb1, + 0x73, 0xc4, 0xb1, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x54, 0x52, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, + 0x55, 0x04, 0x07, 0x0c, 0x06, 0x41, 0x6e, 0x6b, 0x61, 0x72, 0x61, + 0x31, 0x5e, 0x30, 0x5c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x55, + 0x54, 0xc3, 0x9c, 0x52, 0x4b, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, + 0x42, 0x69, 0x6c, 0x67, 0x69, 0x20, 0xc4, 0xb0, 0x6c, 0x65, 0x74, + 0x69, 0xc5, 0x9f, 0x69, 0x6d, 0x20, 0x76, 0x65, 0x20, 0x42, 0x69, + 0x6c, 0x69, 0xc5, 0x9f, 0x69, 0x6d, 0x20, 0x47, 0xc3, 0xbc, 0x76, + 0x65, 0x6e, 0x6c, 0x69, 0xc4, 0x9f, 0x69, 0x20, 0x48, 0x69, 0x7a, + 0x6d, 0x65, 0x74, 0x6c, 0x65, 0x72, 0x69, 0x20, 0x41, 0x2e, 0xc5, + 0x9e, 0x2e, 0x20, 0x28, 0x63, 0x29, 0x20, 0x41, 0x72, 0x61, 0x6c, + 0xc4, 0xb1, 0x6b, 0x20, 0x32, 0x30, 0x30, 0x37, 0x30, 0x1e, 0x17, + 0x0d, 0x30, 0x37, 0x31, 0x32, 0x32, 0x35, 0x31, 0x38, 0x33, 0x37, + 0x31, 0x39, 0x5a, 0x17, 0x0d, 0x31, 0x37, 0x31, 0x32, 0x32, 0x32, + 0x31, 0x38, 0x33, 0x37, 0x31, 0x39, 0x5a, 0x30, 0x81, 0xbf, 0x31, + 0x3f, 0x30, 0x3d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x36, 0x54, + 0xc3, 0x9c, 0x52, 0x4b, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x45, + 0x6c, 0x65, 0x6b, 0x74, 0x72, 0x6f, 0x6e, 0x69, 0x6b, 0x20, 0x53, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x6b, 0x61, 0x20, 0x48, 0x69, + 0x7a, 0x6d, 0x65, 0x74, 0x20, 0x53, 0x61, 0xc4, 0x9f, 0x6c, 0x61, + 0x79, 0xc4, 0xb1, 0x63, 0xc4, 0xb1, 0x73, 0xc4, 0xb1, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x54, 0x52, + 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x06, + 0x41, 0x6e, 0x6b, 0x61, 0x72, 0x61, 0x31, 0x5e, 0x30, 0x5c, 0x06, + 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x55, 0x54, 0xc3, 0x9c, 0x52, 0x4b, + 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x42, 0x69, 0x6c, 0x67, 0x69, + 0x20, 0xc4, 0xb0, 0x6c, 0x65, 0x74, 0x69, 0xc5, 0x9f, 0x69, 0x6d, + 0x20, 0x76, 0x65, 0x20, 0x42, 0x69, 0x6c, 0x69, 0xc5, 0x9f, 0x69, + 0x6d, 0x20, 0x47, 0xc3, 0xbc, 0x76, 0x65, 0x6e, 0x6c, 0x69, 0xc4, + 0x9f, 0x69, 0x20, 0x48, 0x69, 0x7a, 0x6d, 0x65, 0x74, 0x6c, 0x65, + 0x72, 0x69, 0x20, 0x41, 0x2e, 0xc5, 0x9e, 0x2e, 0x20, 0x28, 0x63, + 0x29, 0x20, 0x41, 0x72, 0x61, 0x6c, 0xc4, 0xb1, 0x6b, 0x20, 0x32, + 0x30, 0x30, 0x37, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, + 0x01, 0x01, 0x00, 0xab, 0xb7, 0x3e, 0x0a, 0x8c, 0xc8, 0xa5, 0x58, + 0x15, 0xe6, 0x8a, 0xef, 0x27, 0x3d, 0x4a, 0xb4, 0xe8, 0x25, 0xd3, + 0xcd, 0x33, 0xc2, 0x20, 0xdc, 0x19, 0xee, 0x88, 0x3f, 0x4d, 0x62, + 0xf0, 0xdd, 0x13, 0x77, 0x8f, 0x61, 0xa9, 0x2a, 0xb5, 0xd4, 0xf2, + 0xb9, 0x31, 0x58, 0x29, 0x3b, 0x2f, 0x3f, 0x6a, 0x9c, 0x6f, 0x73, + 0x76, 0x25, 0xee, 0x34, 0x20, 0x80, 0xee, 0xea, 0xb7, 0xf0, 0xc4, + 0x0a, 0xcd, 0x2b, 0x86, 0x94, 0xc9, 0xe3, 0x60, 0xb1, 0x44, 0x52, + 0xb2, 0x5a, 0x29, 0xb4, 0x91, 0x97, 0x83, 0xd8, 0xb7, 0xa6, 0x14, + 0x2f, 0x29, 0x49, 0xa2, 0xf3, 0x05, 0x06, 0xfb, 0xb4, 0x4f, 0xda, + 0xa1, 0x6c, 0x9a, 0x66, 0x9f, 0xf0, 0x43, 0x09, 0xca, 0xea, 0x72, + 0x8f, 0xeb, 0x00, 0xd7, 0x35, 0x39, 0xd7, 0x56, 0x17, 0x47, 0x17, + 0x30, 0xf4, 0xbe, 0xbf, 0x3f, 0xc2, 0x68, 0xaf, 0x36, 0x40, 0xc1, + 0xa9, 0xf4, 0xa9, 0xa7, 0xe8, 0x10, 0x6b, 0x08, 0x8a, 0xf7, 0x86, + 0x1e, 0xdc, 0x9a, 0x2a, 0x15, 0x06, 0xf6, 0xa3, 0xf0, 0xf4, 0xe0, + 0xc7, 0x14, 0xd4, 0x51, 0x7f, 0xcf, 0xb4, 0xdb, 0x6d, 0xaf, 0x47, + 0x96, 0x17, 0x9b, 0x77, 0x71, 0xd8, 0xa7, 0x71, 0x9d, 0x24, 0x0c, + 0xf6, 0x94, 0x3f, 0x85, 0x31, 0x12, 0x4f, 0xba, 0xee, 0x4e, 0x82, + 0xb8, 0xb9, 0x3e, 0x8f, 0x23, 0x37, 0x5e, 0xcc, 0xa2, 0xaa, 0x75, + 0xf7, 0x18, 0x6f, 0x09, 0xd3, 0xae, 0xa7, 0x54, 0x28, 0x34, 0xfb, + 0xe1, 0xe0, 0x3b, 0x60, 0x7d, 0xa0, 0xbe, 0x79, 0x89, 0x86, 0xc8, + 0x9f, 0x2d, 0xf9, 0x0a, 0x4b, 0xc4, 0x50, 0xa2, 0xe7, 0xfd, 0x79, + 0x16, 0xc7, 0x7a, 0x0b, 0x18, 0xcf, 0xce, 0x4c, 0xef, 0x7d, 0xd6, + 0x07, 0x6f, 0x98, 0xf1, 0xaf, 0xb1, 0xc1, 0x7a, 0xd7, 0x81, 0x35, + 0xb8, 0xaa, 0x17, 0xb4, 0xe0, 0xcb, 0x02, 0x03, 0x01, 0x00, 0x01, + 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, + 0x04, 0x16, 0x04, 0x14, 0x29, 0xc5, 0x90, 0xab, 0x25, 0xaf, 0x11, + 0xe4, 0x61, 0xbf, 0xa3, 0xff, 0x88, 0x61, 0x91, 0xe6, 0x0e, 0xfe, + 0x9c, 0x81, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, + 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, + 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, + 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, + 0x10, 0x0d, 0xda, 0xf8, 0x3a, 0xec, 0x28, 0xd1, 0x14, 0x95, 0x82, + 0xb1, 0x12, 0x2c, 0x51, 0x7a, 0x41, 0x25, 0x36, 0x4c, 0x9f, 0xec, + 0x3f, 0x1f, 0x84, 0x9d, 0x65, 0x54, 0x5c, 0xa8, 0x16, 0x02, 0x40, + 0xfa, 0x6e, 0x1a, 0x37, 0x84, 0xef, 0x72, 0x9d, 0x86, 0x0a, 0x55, + 0x9d, 0x56, 0x28, 0xac, 0x66, 0x2c, 0xd0, 0x3a, 0x56, 0x93, 0x34, + 0x07, 0x25, 0xad, 0x08, 0xb0, 0x8f, 0xc8, 0x0f, 0x09, 0x59, 0xca, + 0x9d, 0x98, 0x1c, 0xe5, 0x54, 0xf8, 0xb9, 0x45, 0x7f, 0x6a, 0x97, + 0x6f, 0x88, 0x68, 0x4d, 0x4a, 0x06, 0x26, 0x37, 0x88, 0x02, 0x0e, + 0xb6, 0xc6, 0xd6, 0x72, 0x99, 0xce, 0x6b, 0x77, 0xda, 0x62, 0x31, + 0xa4, 0x56, 0x1f, 0xae, 0x5f, 0x8d, 0x77, 0xda, 0x5d, 0xf6, 0x88, + 0xfc, 0x1a, 0xd9, 0x9e, 0xb5, 0x81, 0xf0, 0x32, 0xb8, 0xe3, 0x88, + 0xd0, 0x9c, 0xf3, 0x6a, 0xa0, 0xb9, 0x9b, 0x14, 0x59, 0x35, 0x36, + 0x4f, 0xcf, 0xf3, 0x8e, 0x5e, 0x5d, 0x17, 0xad, 0x15, 0x95, 0xd8, + 0xdd, 0xb2, 0xd5, 0x15, 0x6e, 0x00, 0x4e, 0xb3, 0x4b, 0xcf, 0x66, + 0x94, 0xe4, 0xe0, 0xcd, 0xb5, 0x05, 0xda, 0x63, 0x57, 0x8b, 0xe5, + 0xb3, 0xaa, 0xdb, 0xc0, 0x2e, 0x1c, 0x90, 0x44, 0xdb, 0x1a, 0x5d, + 0x18, 0xa4, 0xee, 0xbe, 0x04, 0x5b, 0x99, 0xd5, 0x71, 0x5f, 0x55, + 0x65, 0x64, 0x62, 0xd5, 0xa2, 0x9b, 0x04, 0x59, 0x86, 0xc8, 0x62, + 0x77, 0xe7, 0x7c, 0x82, 0x45, 0x6a, 0x3d, 0x17, 0xbf, 0xec, 0x9d, + 0x75, 0x0c, 0xae, 0xa3, 0x6f, 0x5a, 0xd3, 0x2f, 0x98, 0x36, 0xf4, + 0xf0, 0xf5, 0x19, 0xab, 0x11, 0x5d, 0xc8, 0xa6, 0xe3, 0x2a, 0x58, + 0x6a, 0x42, 0x09, 0xc3, 0xbd, 0x92, 0x26, 0x66, 0x32, 0x0d, 0x5d, + 0x08, 0x55, 0x74, 0xff, 0x8c, 0x98, 0xd0, 0x0a, 0xa6, 0x84, 0x6a, + 0xd1, 0x39, 0x7d, 0x30, 0x82, 0x04, 0x33, 0x30, 0x82, 0x03, 0x1b, + 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x09, 0x83, 0xf3, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x0b, 0x05, 0x00, 0x30, 0x4d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, 0x15, 0x30, 0x13, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0c, 0x44, 0x2d, 0x54, 0x72, + 0x75, 0x73, 0x74, 0x20, 0x47, 0x6d, 0x62, 0x48, 0x31, 0x27, 0x30, + 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1e, 0x44, 0x2d, 0x54, + 0x52, 0x55, 0x53, 0x54, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x43, 0x41, 0x20, 0x32, + 0x20, 0x32, 0x30, 0x30, 0x39, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, + 0x31, 0x31, 0x30, 0x35, 0x30, 0x38, 0x33, 0x35, 0x35, 0x38, 0x5a, + 0x17, 0x0d, 0x32, 0x39, 0x31, 0x31, 0x30, 0x35, 0x30, 0x38, 0x33, + 0x35, 0x35, 0x38, 0x5a, 0x30, 0x4d, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, 0x15, 0x30, + 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0c, 0x44, 0x2d, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x20, 0x47, 0x6d, 0x62, 0x48, 0x31, 0x27, + 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1e, 0x44, 0x2d, + 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x43, 0x41, 0x20, + 0x32, 0x20, 0x32, 0x30, 0x30, 0x39, 0x30, 0x82, 0x01, 0x22, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, + 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xd3, 0xb2, 0x4a, 0xcf, 0x7a, + 0x47, 0xef, 0x75, 0x9b, 0x23, 0xfa, 0x3a, 0x2f, 0xd6, 0x50, 0x45, + 0x89, 0x35, 0x3a, 0xc6, 0x6b, 0xdb, 0xfe, 0xdb, 0x00, 0x68, 0xa8, + 0xe0, 0x03, 0x11, 0x1d, 0x37, 0x50, 0x08, 0x9f, 0x4d, 0x4a, 0x68, + 0x94, 0x35, 0xb3, 0x53, 0xd1, 0x94, 0x63, 0xa7, 0x20, 0x56, 0xaf, + 0xde, 0x51, 0x78, 0xec, 0x2a, 0x3d, 0xf3, 0x48, 0x48, 0x50, 0x3e, + 0x0a, 0xdf, 0x46, 0x55, 0x8b, 0x27, 0x6d, 0xc3, 0x10, 0x4d, 0x0d, + 0x91, 0x52, 0x43, 0xd8, 0x87, 0xe0, 0x5d, 0x4e, 0x36, 0xb5, 0x21, + 0xca, 0x5f, 0x39, 0x40, 0x04, 0x5f, 0x5b, 0x7e, 0xcc, 0xa3, 0xc6, + 0x2b, 0xa9, 0x40, 0x1e, 0xd9, 0x36, 0x84, 0xd6, 0x48, 0xf3, 0x92, + 0x1e, 0x34, 0x46, 0x20, 0x24, 0xc1, 0xa4, 0x51, 0x8e, 0x4a, 0x1a, + 0xef, 0x50, 0x3f, 0x69, 0x5d, 0x19, 0x7f, 0x45, 0xc3, 0xc7, 0x01, + 0x8f, 0x51, 0xc9, 0x23, 0xe8, 0x72, 0xae, 0xb4, 0xbc, 0x56, 0x09, + 0x7f, 0x12, 0xcb, 0x1c, 0xb1, 0xaf, 0x29, 0x90, 0x0a, 0xc9, 0x55, + 0xcc, 0x0f, 0xd3, 0xb4, 0x1a, 0xed, 0x47, 0x35, 0x5a, 0x4a, 0xed, + 0x9c, 0x73, 0x04, 0x21, 0xd0, 0xaa, 0xbd, 0x0c, 0x13, 0xb5, 0x00, + 0xca, 0x26, 0x6c, 0xc4, 0x6b, 0x0c, 0x94, 0x5a, 0x95, 0x94, 0xda, + 0x50, 0x9a, 0xf1, 0xff, 0xa5, 0x2b, 0x66, 0x31, 0xa4, 0xc9, 0x38, + 0xa0, 0xdf, 0x1d, 0x1f, 0xb8, 0x09, 0x2e, 0xf3, 0xa7, 0xe8, 0x67, + 0x52, 0xab, 0x95, 0x1f, 0xe0, 0x46, 0x3e, 0xd8, 0xa4, 0xc3, 0xca, + 0x5a, 0xc5, 0x31, 0x80, 0xe8, 0x48, 0x9a, 0x9f, 0x94, 0x69, 0xfe, + 0x19, 0xdd, 0xd8, 0x73, 0x7c, 0x81, 0xca, 0x96, 0xde, 0x8e, 0xed, + 0xb3, 0x32, 0x05, 0x65, 0x84, 0x34, 0xe6, 0xe6, 0xfd, 0x57, 0x10, + 0xb5, 0x5f, 0x76, 0xbf, 0x2f, 0xb0, 0x10, 0x0d, 0xc5, 0x02, 0x03, + 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x1a, 0x30, 0x82, 0x01, 0x16, + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, + 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, + 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xfd, 0xda, 0x14, 0xc4, 0x9f, + 0x30, 0xde, 0x21, 0xbd, 0x1e, 0x42, 0x39, 0xfc, 0xab, 0x63, 0x23, + 0x49, 0xe0, 0xf1, 0x84, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, + 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x81, + 0xd3, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x81, 0xcb, 0x30, 0x81, + 0xc8, 0x30, 0x81, 0x80, 0xa0, 0x7e, 0xa0, 0x7c, 0x86, 0x7a, 0x6c, + 0x64, 0x61, 0x70, 0x3a, 0x2f, 0x2f, 0x64, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x64, 0x2d, 0x74, 0x72, 0x75, 0x73, + 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x43, 0x4e, 0x3d, 0x44, 0x2d, + 0x54, 0x52, 0x55, 0x53, 0x54, 0x25, 0x32, 0x30, 0x52, 0x6f, 0x6f, + 0x74, 0x25, 0x32, 0x30, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x25, 0x32, + 0x30, 0x33, 0x25, 0x32, 0x30, 0x43, 0x41, 0x25, 0x32, 0x30, 0x32, + 0x25, 0x32, 0x30, 0x32, 0x30, 0x30, 0x39, 0x2c, 0x4f, 0x3d, 0x44, + 0x2d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x25, 0x32, 0x30, 0x47, 0x6d, + 0x62, 0x48, 0x2c, 0x43, 0x3d, 0x44, 0x45, 0x3f, 0x63, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x72, 0x65, 0x76, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6c, 0x69, 0x73, 0x74, + 0x30, 0x43, 0xa0, 0x41, 0xa0, 0x3f, 0x86, 0x3d, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x2d, 0x74, + 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x63, 0x72, + 0x6c, 0x2f, 0x64, 0x2d, 0x74, 0x72, 0x75, 0x73, 0x74, 0x5f, 0x72, + 0x6f, 0x6f, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x33, + 0x5f, 0x63, 0x61, 0x5f, 0x32, 0x5f, 0x32, 0x30, 0x30, 0x39, 0x2e, + 0x63, 0x72, 0x6c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, + 0x00, 0x7f, 0x97, 0xdb, 0x30, 0xc8, 0xdf, 0xa4, 0x9c, 0x7d, 0x21, + 0x7a, 0x80, 0x70, 0xce, 0x14, 0x12, 0x69, 0x88, 0x14, 0x95, 0x60, + 0x44, 0x01, 0xac, 0xb2, 0xe9, 0x30, 0x4f, 0x9b, 0x50, 0xc2, 0x66, + 0xd8, 0x7e, 0x8d, 0x30, 0xb5, 0x70, 0x31, 0xe9, 0xe2, 0x69, 0xc7, + 0xf3, 0x70, 0xdb, 0x20, 0x15, 0x86, 0xd0, 0x0d, 0xf0, 0xbe, 0xac, + 0x01, 0x75, 0x84, 0xce, 0x7e, 0x9f, 0x4d, 0xbf, 0xb7, 0x60, 0x3b, + 0x9c, 0xf3, 0xca, 0x1d, 0xe2, 0x5e, 0x68, 0xd8, 0xa3, 0x9d, 0x97, + 0xe5, 0x40, 0x60, 0xd2, 0x36, 0x21, 0xfe, 0xd0, 0xb4, 0xb8, 0x17, + 0xda, 0x74, 0xa3, 0x7f, 0xd4, 0xdf, 0xb0, 0x98, 0x02, 0xac, 0x6f, + 0x6b, 0x6b, 0x2c, 0x25, 0x24, 0x72, 0xa1, 0x65, 0xee, 0x25, 0x5a, + 0xe5, 0xe6, 0x32, 0xe7, 0xf2, 0xdf, 0xab, 0x49, 0xfa, 0xf3, 0x90, + 0x69, 0x23, 0xdb, 0x04, 0xd9, 0xe7, 0x5c, 0x58, 0xfc, 0x65, 0xd4, + 0x97, 0xbe, 0xcc, 0xfc, 0x2e, 0x0a, 0xcc, 0x25, 0x2a, 0x35, 0x04, + 0xf8, 0x60, 0x91, 0x15, 0x75, 0x3d, 0x41, 0xff, 0x23, 0x1f, 0x19, + 0xc8, 0x6c, 0xeb, 0x82, 0x53, 0x04, 0xa6, 0xe4, 0x4c, 0x22, 0x4d, + 0x8d, 0x8c, 0xba, 0xce, 0x5b, 0x73, 0xec, 0x64, 0x54, 0x50, 0x6d, + 0xd1, 0x9c, 0x55, 0xfb, 0x69, 0xc3, 0x36, 0xc3, 0x8c, 0xbc, 0x3c, + 0x85, 0xa6, 0x6b, 0x0a, 0x26, 0x0d, 0xe0, 0x93, 0x98, 0x60, 0xae, + 0x7e, 0xc6, 0x24, 0x97, 0x8a, 0x61, 0x5f, 0x91, 0x8e, 0x66, 0x92, + 0x09, 0x87, 0x36, 0xcd, 0x8b, 0x9b, 0x2d, 0x3e, 0xf6, 0x51, 0xd4, + 0x50, 0xd4, 0x59, 0x28, 0xbd, 0x83, 0xf2, 0xcc, 0x28, 0x7b, 0x53, + 0x86, 0x6d, 0xd8, 0x26, 0x88, 0x70, 0xd7, 0xea, 0x91, 0xcd, 0x3e, + 0xb9, 0xca, 0xc0, 0x90, 0x6e, 0x5a, 0xc6, 0x5e, 0x74, 0x65, 0xd7, + 0x5c, 0xfe, 0xa3, 0xe2, 0x30, 0x82, 0x04, 0x43, 0x30, 0x82, 0x03, + 0x2b, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x09, 0x83, 0xf4, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x0b, 0x05, 0x00, 0x30, 0x50, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, 0x15, 0x30, + 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0c, 0x44, 0x2d, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x20, 0x47, 0x6d, 0x62, 0x48, 0x31, 0x2a, + 0x30, 0x28, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x21, 0x44, 0x2d, + 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x43, 0x41, 0x20, + 0x32, 0x20, 0x45, 0x56, 0x20, 0x32, 0x30, 0x30, 0x39, 0x30, 0x1e, + 0x17, 0x0d, 0x30, 0x39, 0x31, 0x31, 0x30, 0x35, 0x30, 0x38, 0x35, + 0x30, 0x34, 0x36, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x31, 0x31, 0x30, + 0x35, 0x30, 0x38, 0x35, 0x30, 0x34, 0x36, 0x5a, 0x30, 0x50, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, + 0x45, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, + 0x0c, 0x44, 0x2d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x47, 0x6d, + 0x62, 0x48, 0x31, 0x2a, 0x30, 0x28, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0c, 0x21, 0x44, 0x2d, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x52, + 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, + 0x20, 0x43, 0x41, 0x20, 0x32, 0x20, 0x45, 0x56, 0x20, 0x32, 0x30, + 0x30, 0x39, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, + 0x01, 0x00, 0x99, 0xf1, 0x84, 0x34, 0x70, 0xba, 0x2f, 0xb7, 0x30, + 0xa0, 0x8e, 0xbd, 0x7c, 0x04, 0xcf, 0xbe, 0x62, 0xbc, 0x99, 0xfd, + 0x82, 0x97, 0xd2, 0x7a, 0x0a, 0x67, 0x96, 0x38, 0x09, 0xf6, 0x10, + 0x4e, 0x95, 0x22, 0x73, 0x99, 0x8d, 0xda, 0x15, 0x2d, 0xe7, 0x05, + 0xfc, 0x19, 0x73, 0x22, 0xb7, 0x8e, 0x98, 0x00, 0xbc, 0x3c, 0x3d, + 0xac, 0xa1, 0x6c, 0xfb, 0xd6, 0x79, 0x25, 0x4b, 0xad, 0xf0, 0xcc, + 0x64, 0xda, 0x88, 0x3e, 0x29, 0xb8, 0x0f, 0x09, 0xd3, 0x34, 0xdd, + 0x33, 0xf5, 0x62, 0xd1, 0xe1, 0xcd, 0x19, 0xe9, 0xee, 0x18, 0x4f, + 0x4c, 0x58, 0xae, 0xe2, 0x1e, 0xd6, 0x0c, 0x5b, 0x15, 0x5a, 0xd8, + 0x3a, 0xb8, 0xc4, 0x18, 0x64, 0x1e, 0xe3, 0x33, 0xb2, 0xb5, 0x89, + 0x77, 0x4e, 0x0c, 0xbf, 0xd9, 0x94, 0x6b, 0x13, 0x97, 0x6f, 0x12, + 0xa3, 0xfe, 0x99, 0xa9, 0x04, 0xcc, 0x15, 0xec, 0x60, 0x68, 0x36, + 0xed, 0x08, 0x7b, 0xb7, 0xf5, 0xbf, 0x93, 0xed, 0x66, 0x31, 0x83, + 0x8c, 0xc6, 0x71, 0x34, 0x87, 0x4e, 0x17, 0xea, 0xaf, 0x8b, 0x91, + 0x8d, 0x1c, 0x56, 0x41, 0xae, 0x22, 0x37, 0x5e, 0x37, 0xf2, 0x1d, + 0xd9, 0xd1, 0x2d, 0x0d, 0x2f, 0x69, 0x51, 0xa7, 0xbe, 0x66, 0xa6, + 0x8a, 0x3a, 0x2a, 0xbd, 0xc7, 0x1a, 0xb1, 0xe1, 0x14, 0xf0, 0xbe, + 0x3a, 0x1d, 0xb9, 0xcf, 0x5b, 0xb1, 0x6a, 0xfe, 0xb4, 0xb1, 0x46, + 0x20, 0xa2, 0xfb, 0x1e, 0x3b, 0x70, 0xef, 0x93, 0x98, 0x7d, 0x8c, + 0x73, 0x96, 0xf2, 0xc5, 0xef, 0x85, 0x70, 0xad, 0x29, 0x26, 0xfc, + 0x1e, 0x04, 0x3e, 0x1c, 0xa0, 0xd8, 0x0f, 0xcb, 0x52, 0x83, 0x62, + 0x7c, 0xee, 0x8b, 0x53, 0x95, 0x90, 0xa9, 0x57, 0xa2, 0xea, 0x61, + 0x05, 0xd8, 0xf9, 0x4d, 0xc4, 0x27, 0xfa, 0x6e, 0xad, 0xed, 0xf9, + 0xd7, 0x51, 0xf7, 0x6b, 0xa5, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, + 0x82, 0x01, 0x24, 0x30, 0x82, 0x01, 0x20, 0x30, 0x0f, 0x06, 0x03, + 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, + 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, + 0x04, 0x14, 0xd3, 0x94, 0x8a, 0x4c, 0x62, 0x13, 0x2a, 0x19, 0x2e, + 0xcc, 0xaf, 0x72, 0x8a, 0x7d, 0x36, 0xd7, 0x9a, 0x1c, 0xdc, 0x67, + 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, + 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x81, 0xdd, 0x06, 0x03, 0x55, + 0x1d, 0x1f, 0x04, 0x81, 0xd5, 0x30, 0x81, 0xd2, 0x30, 0x81, 0x87, + 0xa0, 0x81, 0x84, 0xa0, 0x81, 0x81, 0x86, 0x7f, 0x6c, 0x64, 0x61, + 0x70, 0x3a, 0x2f, 0x2f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x64, 0x2d, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, + 0x6e, 0x65, 0x74, 0x2f, 0x43, 0x4e, 0x3d, 0x44, 0x2d, 0x54, 0x52, + 0x55, 0x53, 0x54, 0x25, 0x32, 0x30, 0x52, 0x6f, 0x6f, 0x74, 0x25, + 0x32, 0x30, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x25, 0x32, 0x30, 0x33, + 0x25, 0x32, 0x30, 0x43, 0x41, 0x25, 0x32, 0x30, 0x32, 0x25, 0x32, + 0x30, 0x45, 0x56, 0x25, 0x32, 0x30, 0x32, 0x30, 0x30, 0x39, 0x2c, + 0x4f, 0x3d, 0x44, 0x2d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x25, 0x32, + 0x30, 0x47, 0x6d, 0x62, 0x48, 0x2c, 0x43, 0x3d, 0x44, 0x45, 0x3f, + 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x72, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6c, + 0x69, 0x73, 0x74, 0x30, 0x46, 0xa0, 0x44, 0xa0, 0x42, 0x86, 0x40, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, + 0x64, 0x2d, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x6e, 0x65, 0x74, + 0x2f, 0x63, 0x72, 0x6c, 0x2f, 0x64, 0x2d, 0x74, 0x72, 0x75, 0x73, + 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x5f, 0x33, 0x5f, 0x63, 0x61, 0x5f, 0x32, 0x5f, 0x65, 0x76, + 0x5f, 0x32, 0x30, 0x30, 0x39, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x34, 0xed, 0x7b, 0x5a, + 0x3c, 0xa4, 0x94, 0x88, 0xef, 0x1a, 0x11, 0x75, 0x07, 0x2f, 0xb3, + 0xfe, 0x3c, 0xfa, 0x1e, 0x51, 0x26, 0xeb, 0x87, 0xf6, 0x29, 0xde, + 0xe0, 0xf1, 0xd4, 0xc6, 0x24, 0x09, 0xe9, 0xc1, 0xcf, 0x55, 0x1b, + 0xb4, 0x30, 0xd9, 0xce, 0x1a, 0xfe, 0x06, 0x51, 0xa6, 0x15, 0xa4, + 0x2d, 0xef, 0xb2, 0x4b, 0xbf, 0x20, 0x28, 0x25, 0x49, 0xd1, 0xa6, + 0x36, 0x77, 0x34, 0xe8, 0x64, 0xdf, 0x52, 0xb1, 0x11, 0xc7, 0x73, + 0x7a, 0xcd, 0x39, 0x9e, 0xc2, 0xad, 0x8c, 0x71, 0x21, 0xf2, 0x5a, + 0x6b, 0xaf, 0xdf, 0x3c, 0x4e, 0x55, 0xaf, 0xb2, 0x84, 0x65, 0x14, + 0x89, 0xb9, 0x77, 0xcb, 0x2a, 0x31, 0xbe, 0xcf, 0xa3, 0x6d, 0xcf, + 0x6f, 0x48, 0x94, 0x32, 0x46, 0x6f, 0xe7, 0x71, 0x8c, 0xa0, 0xa6, + 0x84, 0x19, 0x37, 0x07, 0xf2, 0x03, 0x45, 0x09, 0x2b, 0x86, 0x75, + 0x7c, 0xdf, 0x5f, 0x69, 0x57, 0x00, 0xdb, 0x6e, 0xd8, 0xa6, 0x72, + 0x22, 0x4b, 0x50, 0xd4, 0x75, 0x98, 0x56, 0xdf, 0xb7, 0x18, 0xff, + 0x43, 0x43, 0x50, 0xae, 0x7a, 0x44, 0x7b, 0xf0, 0x79, 0x51, 0xd7, + 0x43, 0x3d, 0xa7, 0xd3, 0x81, 0xd3, 0xf0, 0xc9, 0x4f, 0xb9, 0xda, + 0xc6, 0x97, 0x86, 0xd0, 0x82, 0xc3, 0xe4, 0x42, 0x6d, 0xfe, 0xb0, + 0xe2, 0x64, 0x4e, 0x0e, 0x26, 0xe7, 0x40, 0x34, 0x26, 0xb5, 0x08, + 0x89, 0xd7, 0x08, 0x63, 0x63, 0x38, 0x27, 0x75, 0x1e, 0x33, 0xea, + 0x6e, 0xa8, 0xdd, 0x9f, 0x99, 0x4f, 0x74, 0x4d, 0x81, 0x89, 0x80, + 0x4b, 0xdd, 0x9a, 0x97, 0x29, 0x5c, 0x2f, 0xbe, 0x81, 0x41, 0xb9, + 0x8c, 0xff, 0xea, 0x7d, 0x60, 0x06, 0x9e, 0xcd, 0xd7, 0x3d, 0xd3, + 0x2e, 0xa3, 0x15, 0xbc, 0xa8, 0xe6, 0x26, 0xe5, 0x6f, 0xc3, 0xdc, + 0xb8, 0x03, 0x21, 0xea, 0x9f, 0x16, 0xf1, 0x2c, 0x54, 0xb5, 0x30, + 0x82, 0x09, 0x86, 0x30, 0x82, 0x07, 0x6e, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x01, 0x0b, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x82, 0x01, + 0x1e, 0x31, 0x3e, 0x30, 0x3c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, + 0x35, 0x41, 0x75, 0x74, 0x6f, 0x72, 0x69, 0x64, 0x61, 0x64, 0x20, + 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x61, 0x69, 0x7a, 0x20, + 0x64, 0x65, 0x6c, 0x20, 0x45, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x20, + 0x56, 0x65, 0x6e, 0x65, 0x7a, 0x6f, 0x6c, 0x61, 0x6e, 0x6f, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x56, + 0x45, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, + 0x07, 0x43, 0x61, 0x72, 0x61, 0x63, 0x61, 0x73, 0x31, 0x19, 0x30, + 0x17, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x10, 0x44, 0x69, 0x73, + 0x74, 0x72, 0x69, 0x74, 0x6f, 0x20, 0x43, 0x61, 0x70, 0x69, 0x74, + 0x61, 0x6c, 0x31, 0x36, 0x30, 0x34, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x13, 0x2d, 0x53, 0x69, 0x73, 0x74, 0x65, 0x6d, 0x61, 0x20, 0x4e, + 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x20, + 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, + 0x6f, 0x6e, 0x20, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x6f, 0x6e, + 0x69, 0x63, 0x61, 0x31, 0x43, 0x30, 0x41, 0x06, 0x03, 0x55, 0x04, + 0x0b, 0x13, 0x3a, 0x53, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6e, 0x74, + 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x61, 0x20, 0x64, 0x65, + 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x69, 0x6f, 0x73, 0x20, + 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x20, 0x45, 0x6c, 0x65, 0x63, 0x74, + 0x72, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x31, 0x25, 0x30, 0x23, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, + 0x16, 0x61, 0x63, 0x72, 0x61, 0x69, 0x7a, 0x40, 0x73, 0x75, 0x73, + 0x63, 0x65, 0x72, 0x74, 0x65, 0x2e, 0x67, 0x6f, 0x62, 0x2e, 0x76, + 0x65, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, 0x31, 0x32, 0x32, 0x38, + 0x31, 0x36, 0x35, 0x31, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x30, + 0x31, 0x32, 0x32, 0x35, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, + 0x30, 0x81, 0xd1, 0x31, 0x26, 0x30, 0x24, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x17, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x63, 0x74, 0x6f, 0x40, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x72, 0x74, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x65, 0x31, + 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x06, 0x43, + 0x68, 0x61, 0x63, 0x61, 0x6f, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, + 0x55, 0x04, 0x08, 0x13, 0x07, 0x4d, 0x69, 0x72, 0x61, 0x6e, 0x64, + 0x61, 0x31, 0x2a, 0x30, 0x28, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, + 0x21, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x65, 0x64, 0x6f, 0x72, 0x20, + 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x64, 0x6f, 0x73, 0x20, 0x50, 0x52, 0x4f, 0x43, 0x45, 0x52, + 0x54, 0x31, 0x36, 0x30, 0x34, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x2d, 0x53, 0x69, 0x73, 0x74, 0x65, 0x6d, 0x61, 0x20, 0x4e, 0x61, + 0x63, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x20, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, + 0x6e, 0x20, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x6f, 0x6e, 0x69, + 0x63, 0x61, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x56, 0x45, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x0a, 0x50, 0x53, 0x43, 0x50, 0x72, 0x6f, 0x63, + 0x65, 0x72, 0x74, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, + 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, + 0x02, 0x01, 0x00, 0xd5, 0xb7, 0xf4, 0xa3, 0x94, 0x33, 0xa1, 0x46, + 0xa9, 0x55, 0x61, 0x49, 0x0d, 0xa8, 0x87, 0x73, 0x5e, 0x91, 0x2d, + 0x70, 0xc1, 0x06, 0x1a, 0x94, 0xda, 0x3d, 0xec, 0x15, 0x42, 0xc1, + 0xf5, 0x8c, 0xae, 0x6a, 0x17, 0xf1, 0x8a, 0xad, 0xfc, 0x80, 0x95, + 0xea, 0x83, 0x44, 0xa2, 0x5b, 0x7a, 0x55, 0xce, 0x4f, 0xa7, 0xa5, + 0xd5, 0xba, 0xb8, 0x1f, 0xa0, 0x27, 0xc0, 0x50, 0x53, 0x3e, 0x8d, + 0xb9, 0xc0, 0x0e, 0xb8, 0x15, 0xdc, 0xd6, 0x6c, 0xf8, 0x9e, 0xf8, + 0x04, 0x25, 0xdf, 0x80, 0x8f, 0x10, 0x85, 0xdd, 0x7d, 0x2f, 0x7b, + 0x80, 0xdd, 0x57, 0x00, 0x64, 0x23, 0xf8, 0x6e, 0xc9, 0xbe, 0x95, + 0x4f, 0xe1, 0x75, 0xec, 0xe0, 0x7e, 0x5e, 0x95, 0xcd, 0xb1, 0xef, + 0xbe, 0x7a, 0x42, 0xd8, 0xc9, 0x2c, 0xd3, 0xeb, 0x1a, 0x1a, 0x22, + 0x8b, 0xb7, 0x7f, 0x06, 0x89, 0xe5, 0x3c, 0xf5, 0x12, 0xc0, 0xbb, + 0xd3, 0x0b, 0x99, 0x5f, 0x90, 0x7c, 0x8e, 0x2d, 0x2f, 0x77, 0x33, + 0x92, 0x4a, 0x21, 0x46, 0xa8, 0xa9, 0x08, 0xac, 0xf1, 0xf6, 0x11, + 0x02, 0xd9, 0x95, 0x16, 0x9e, 0x8d, 0x2f, 0x96, 0xe6, 0x02, 0xdd, + 0x75, 0xc2, 0x14, 0x2a, 0x5a, 0xd6, 0xc9, 0x7d, 0x25, 0xc2, 0xc1, + 0xfc, 0xaa, 0x67, 0x85, 0xe2, 0xec, 0xbe, 0xd1, 0x7c, 0x3c, 0xfa, + 0xaf, 0xd5, 0x6e, 0xff, 0x53, 0x41, 0xd4, 0xf5, 0x32, 0x38, 0xb1, + 0xe2, 0x5f, 0xc4, 0xf9, 0x8e, 0x10, 0xef, 0x06, 0xa9, 0x02, 0x89, + 0xff, 0xe3, 0x0c, 0x6e, 0x97, 0xe0, 0xdf, 0x9d, 0xdb, 0x21, 0xd0, + 0xf4, 0x3e, 0x08, 0x69, 0x6c, 0xd8, 0xd4, 0xe4, 0x36, 0xf8, 0x83, + 0xb6, 0xb2, 0x36, 0x8f, 0x9c, 0xef, 0x3a, 0x37, 0x16, 0x7d, 0xbf, + 0xa2, 0x69, 0xd7, 0x3b, 0x5b, 0x72, 0xd0, 0xaf, 0xaa, 0x3f, 0x5c, + 0x66, 0x93, 0xac, 0x0a, 0x22, 0x61, 0xb6, 0xd2, 0xa0, 0x99, 0xc8, + 0x54, 0x93, 0x5d, 0xa8, 0xb6, 0xd1, 0xbd, 0x5d, 0x0a, 0x5e, 0x77, + 0x94, 0xa2, 0x2d, 0xc0, 0x82, 0x8e, 0xbc, 0xca, 0x03, 0x2a, 0x34, + 0xae, 0x73, 0xf1, 0xd4, 0xb5, 0x0c, 0xbd, 0xbe, 0x67, 0x9b, 0x54, + 0xeb, 0xe1, 0xfa, 0xa0, 0x5a, 0xec, 0x38, 0x7e, 0x3e, 0xc1, 0xcc, + 0xa2, 0xc7, 0x44, 0x31, 0x75, 0xea, 0x3f, 0xe5, 0x07, 0xd2, 0xab, + 0xa1, 0x25, 0x96, 0xf6, 0xe6, 0xe4, 0xa0, 0x5d, 0x37, 0x18, 0x39, + 0x61, 0x00, 0x33, 0x5d, 0x46, 0xd4, 0x00, 0xc4, 0xb4, 0xca, 0x3c, + 0xf1, 0xa2, 0xa3, 0x3e, 0xf3, 0x3a, 0xff, 0x69, 0x30, 0x2e, 0x40, + 0xdd, 0xf6, 0x9f, 0x9c, 0x26, 0xc9, 0x96, 0x37, 0xad, 0xe7, 0x39, + 0xa2, 0xbf, 0xea, 0x69, 0xdb, 0x55, 0x22, 0x95, 0x53, 0x2a, 0x94, + 0xb5, 0xdf, 0xad, 0x16, 0x38, 0x81, 0x75, 0x66, 0xe3, 0xc7, 0x2c, + 0x1b, 0x93, 0x9c, 0xaa, 0x8c, 0xa3, 0xca, 0xd9, 0x6c, 0x3c, 0x17, + 0x6d, 0x9c, 0xdc, 0x7c, 0x53, 0xe0, 0x20, 0x27, 0x43, 0x36, 0xf9, + 0x12, 0xe1, 0x3c, 0x5c, 0xbd, 0x66, 0xbf, 0xa2, 0x69, 0x23, 0x38, + 0xb8, 0x99, 0x60, 0x99, 0x0e, 0x56, 0x53, 0x3a, 0x9c, 0x7e, 0x14, + 0x8c, 0xb0, 0x06, 0x6f, 0xf1, 0x86, 0x76, 0x90, 0xaf, 0xfd, 0xaf, + 0xfe, 0x90, 0xc6, 0x8f, 0x9f, 0x7f, 0x8b, 0x92, 0x23, 0x9c, 0xe7, + 0x15, 0x76, 0x8f, 0xd5, 0x8b, 0x94, 0x13, 0x72, 0x69, 0xfb, 0x2b, + 0x61, 0x63, 0x88, 0xef, 0xe6, 0xa4, 0x5e, 0xe6, 0xa3, 0x17, 0x6a, + 0x58, 0x47, 0xcb, 0x71, 0x4f, 0x14, 0x0b, 0x5e, 0xc8, 0x02, 0x08, + 0x26, 0xa2, 0xcb, 0xe9, 0xaf, 0x6b, 0x8a, 0x19, 0xc7, 0xcb, 0x14, + 0x56, 0xf5, 0xe1, 0xda, 0xb5, 0xd9, 0xfc, 0xbf, 0x73, 0x38, 0xda, + 0xf9, 0xe7, 0xaf, 0x6e, 0xa4, 0x37, 0xe2, 0x07, 0x27, 0x02, 0x03, + 0x01, 0x00, 0x01, 0xa3, 0x82, 0x03, 0x17, 0x30, 0x82, 0x03, 0x13, + 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, + 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x01, 0x30, 0x37, + 0x06, 0x03, 0x55, 0x1d, 0x12, 0x04, 0x30, 0x30, 0x2e, 0x82, 0x0f, + 0x73, 0x75, 0x73, 0x63, 0x65, 0x72, 0x74, 0x65, 0x2e, 0x67, 0x6f, + 0x62, 0x2e, 0x76, 0x65, 0xa0, 0x1b, 0x06, 0x05, 0x60, 0x86, 0x5e, + 0x02, 0x02, 0xa0, 0x12, 0x0c, 0x10, 0x52, 0x49, 0x46, 0x2d, 0x47, + 0x2d, 0x32, 0x30, 0x30, 0x30, 0x34, 0x30, 0x33, 0x36, 0x2d, 0x30, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0x41, 0x0f, 0x19, 0x38, 0xaa, 0x99, 0x7f, 0x42, 0x0b, 0xa4, 0xd7, + 0x27, 0x98, 0x54, 0xa2, 0x17, 0x4c, 0x2d, 0x51, 0x54, 0x30, 0x82, + 0x01, 0x50, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x82, 0x01, 0x47, + 0x30, 0x82, 0x01, 0x43, 0x80, 0x14, 0xad, 0xbb, 0x22, 0x1d, 0xc6, + 0xe0, 0xd2, 0x01, 0xa8, 0xfd, 0x76, 0x50, 0x52, 0x93, 0xed, 0x98, + 0xc1, 0x4d, 0xae, 0xd3, 0xa1, 0x82, 0x01, 0x26, 0xa4, 0x82, 0x01, + 0x22, 0x30, 0x82, 0x01, 0x1e, 0x31, 0x3e, 0x30, 0x3c, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x13, 0x35, 0x41, 0x75, 0x74, 0x6f, 0x72, 0x69, + 0x64, 0x61, 0x64, 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x20, 0x52, + 0x61, 0x69, 0x7a, 0x20, 0x64, 0x65, 0x6c, 0x20, 0x45, 0x73, 0x74, + 0x61, 0x64, 0x6f, 0x20, 0x56, 0x65, 0x6e, 0x65, 0x7a, 0x6f, 0x6c, + 0x61, 0x6e, 0x6f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x56, 0x45, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, + 0x55, 0x04, 0x07, 0x13, 0x07, 0x43, 0x61, 0x72, 0x61, 0x63, 0x61, + 0x73, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, + 0x10, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x74, 0x6f, 0x20, 0x43, + 0x61, 0x70, 0x69, 0x74, 0x61, 0x6c, 0x31, 0x36, 0x30, 0x34, 0x06, + 0x03, 0x55, 0x04, 0x0a, 0x13, 0x2d, 0x53, 0x69, 0x73, 0x74, 0x65, + 0x6d, 0x61, 0x20, 0x4e, 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x20, 0x45, 0x6c, 0x65, 0x63, + 0x74, 0x72, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x31, 0x43, 0x30, 0x41, + 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x3a, 0x53, 0x75, 0x70, 0x65, + 0x72, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, + 0x61, 0x20, 0x64, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x69, 0x6f, 0x73, 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x20, 0x45, + 0x6c, 0x65, 0x63, 0x74, 0x72, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x31, + 0x25, 0x30, 0x23, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x09, 0x01, 0x16, 0x16, 0x61, 0x63, 0x72, 0x61, 0x69, 0x7a, + 0x40, 0x73, 0x75, 0x73, 0x63, 0x65, 0x72, 0x74, 0x65, 0x2e, 0x67, + 0x6f, 0x62, 0x2e, 0x76, 0x65, 0x82, 0x01, 0x0a, 0x30, 0x0e, 0x06, + 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, + 0x01, 0x06, 0x30, 0x4d, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x46, + 0x30, 0x44, 0x82, 0x0e, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x72, 0x74, + 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x65, 0xa0, 0x15, 0x06, 0x05, + 0x60, 0x86, 0x5e, 0x02, 0x01, 0xa0, 0x0c, 0x0c, 0x0a, 0x50, 0x53, + 0x43, 0x2d, 0x30, 0x30, 0x30, 0x30, 0x30, 0x32, 0xa0, 0x1b, 0x06, + 0x05, 0x60, 0x86, 0x5e, 0x02, 0x02, 0xa0, 0x12, 0x0c, 0x10, 0x52, + 0x49, 0x46, 0x2d, 0x4a, 0x2d, 0x33, 0x31, 0x36, 0x33, 0x35, 0x33, + 0x37, 0x33, 0x2d, 0x37, 0x30, 0x76, 0x06, 0x03, 0x55, 0x1d, 0x1f, + 0x04, 0x6f, 0x30, 0x6d, 0x30, 0x46, 0xa0, 0x44, 0xa0, 0x42, 0x86, + 0x40, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, + 0x2e, 0x73, 0x75, 0x73, 0x63, 0x65, 0x72, 0x74, 0x65, 0x2e, 0x67, + 0x6f, 0x62, 0x2e, 0x76, 0x65, 0x2f, 0x6c, 0x63, 0x72, 0x2f, 0x43, + 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x44, 0x4f, 0x2d, + 0x52, 0x41, 0x49, 0x5a, 0x2d, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, + 0x43, 0x52, 0x4c, 0x44, 0x45, 0x52, 0x2e, 0x63, 0x72, 0x6c, 0x30, + 0x23, 0xa0, 0x21, 0xa0, 0x1f, 0x86, 0x1d, 0x6c, 0x64, 0x61, 0x70, + 0x3a, 0x2f, 0x2f, 0x61, 0x63, 0x72, 0x61, 0x69, 0x7a, 0x2e, 0x73, + 0x75, 0x73, 0x63, 0x65, 0x72, 0x74, 0x65, 0x2e, 0x67, 0x6f, 0x62, + 0x2e, 0x76, 0x65, 0x30, 0x37, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, + 0x05, 0x07, 0x01, 0x01, 0x04, 0x2b, 0x30, 0x29, 0x30, 0x27, 0x06, + 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x1b, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6f, 0x63, 0x73, 0x70, + 0x2e, 0x73, 0x75, 0x73, 0x63, 0x65, 0x72, 0x74, 0x65, 0x2e, 0x67, + 0x6f, 0x62, 0x2e, 0x76, 0x65, 0x30, 0x41, 0x06, 0x03, 0x55, 0x1d, + 0x20, 0x04, 0x3a, 0x30, 0x38, 0x30, 0x36, 0x06, 0x06, 0x60, 0x86, + 0x5e, 0x03, 0x01, 0x02, 0x30, 0x2c, 0x30, 0x2a, 0x06, 0x08, 0x2b, + 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x1e, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x75, + 0x73, 0x63, 0x65, 0x72, 0x74, 0x65, 0x2e, 0x67, 0x6f, 0x62, 0x2e, + 0x76, 0x65, 0x2f, 0x64, 0x70, 0x63, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, + 0x82, 0x02, 0x01, 0x00, 0x2b, 0x59, 0xeb, 0x22, 0x99, 0xbb, 0x84, + 0xaa, 0x4f, 0xde, 0x90, 0xc6, 0xd1, 0x86, 0x71, 0x23, 0x9e, 0x4b, + 0x03, 0x91, 0x47, 0x70, 0xbb, 0xc0, 0x92, 0x60, 0xec, 0xe0, 0xd4, + 0xe7, 0x6d, 0xc6, 0xd3, 0xed, 0x67, 0x83, 0x77, 0x52, 0xd5, 0xf2, + 0xe5, 0x77, 0xa7, 0x36, 0xb2, 0xe3, 0x54, 0xbe, 0xd9, 0xbb, 0x0a, + 0x9b, 0x11, 0xef, 0x61, 0xf4, 0xc6, 0x99, 0x33, 0x99, 0xf5, 0xaf, + 0x00, 0x39, 0x8d, 0x83, 0xbf, 0xa6, 0xbd, 0x35, 0x7e, 0x2c, 0x5c, + 0x31, 0x34, 0x6f, 0x6c, 0xdb, 0xf3, 0x64, 0x01, 0x98, 0xaa, 0x94, + 0x2c, 0x41, 0xdd, 0x15, 0x86, 0xca, 0x6b, 0x29, 0x4e, 0x16, 0xc0, + 0x49, 0xfc, 0xd7, 0x83, 0x48, 0x13, 0x07, 0x51, 0x84, 0x31, 0x52, + 0x88, 0xbb, 0x86, 0x17, 0xc7, 0x6b, 0x2f, 0x8a, 0x20, 0xad, 0xc5, + 0x0b, 0x8f, 0x70, 0x3e, 0x2a, 0xbb, 0x1b, 0x71, 0x8f, 0xb9, 0xa4, + 0xa0, 0xfd, 0xd8, 0x95, 0xd9, 0xaf, 0x59, 0xbf, 0x25, 0x2b, 0x98, + 0xe9, 0x63, 0x93, 0x2f, 0x60, 0x1e, 0xc4, 0xaa, 0xf8, 0x77, 0xf5, + 0x8b, 0x6c, 0x2f, 0xed, 0x7e, 0x2e, 0xb5, 0x4f, 0x40, 0x0d, 0xee, + 0xbc, 0x57, 0x77, 0xe7, 0xd9, 0xb6, 0xd4, 0x3f, 0x95, 0x27, 0x3a, + 0x20, 0xd5, 0xe5, 0xae, 0xab, 0x6c, 0x35, 0x9f, 0xc1, 0xa1, 0x1d, + 0x59, 0xdc, 0x84, 0x81, 0xee, 0x4d, 0x07, 0xe2, 0x48, 0xb6, 0x9e, + 0x4b, 0x95, 0x2d, 0x41, 0xb1, 0xe1, 0xe8, 0xde, 0x7e, 0x2f, 0x05, + 0x1e, 0x68, 0xee, 0xbf, 0xbb, 0x90, 0x65, 0x3a, 0xc8, 0xee, 0xea, + 0xb1, 0x18, 0x37, 0x1c, 0x62, 0x93, 0xa4, 0xa0, 0x31, 0xec, 0x71, + 0x6c, 0x91, 0xe6, 0xa4, 0x79, 0x89, 0x5a, 0x14, 0xa7, 0x14, 0x50, + 0x05, 0x4c, 0xa4, 0x00, 0x57, 0x30, 0x2c, 0xc1, 0xb5, 0x61, 0x96, + 0xdc, 0x3e, 0x1e, 0x84, 0xaf, 0x39, 0x42, 0xcf, 0xe5, 0xd0, 0x2c, + 0xb1, 0x24, 0xbc, 0xdf, 0x40, 0xc3, 0xed, 0x7f, 0x63, 0x4a, 0xbd, + 0xe1, 0x4f, 0x12, 0x64, 0x86, 0x95, 0xf3, 0xb0, 0xe7, 0xc8, 0xb7, + 0xe1, 0x53, 0xbd, 0x92, 0xe6, 0xf3, 0x0c, 0x96, 0xb9, 0xeb, 0xe8, + 0xe6, 0x92, 0xed, 0xa7, 0x81, 0x09, 0x14, 0x0b, 0xfc, 0x95, 0x7a, + 0xcf, 0x8f, 0xd6, 0x34, 0x4f, 0x36, 0x12, 0xdc, 0x5e, 0xd1, 0x34, + 0x75, 0xc6, 0x46, 0x80, 0x2f, 0x95, 0x04, 0x8c, 0xc7, 0x86, 0xc4, + 0xa8, 0x26, 0x89, 0xa8, 0x3f, 0x19, 0x9b, 0x81, 0xbb, 0x51, 0xa4, + 0x4a, 0x86, 0xab, 0x0b, 0x11, 0x0f, 0xb1, 0xae, 0x63, 0x53, 0x6d, + 0x28, 0xea, 0xdd, 0x33, 0x56, 0x38, 0x1c, 0xb2, 0xad, 0x80, 0xd3, + 0xd7, 0x72, 0xbd, 0x9a, 0x6c, 0x99, 0x63, 0xe8, 0x00, 0xbb, 0x41, + 0x76, 0x05, 0xb7, 0x5b, 0x99, 0x18, 0x8a, 0xc3, 0xb8, 0x12, 0x5c, + 0x56, 0xcf, 0x56, 0x0c, 0x7d, 0xe8, 0xe2, 0xcf, 0xed, 0xbc, 0x74, + 0x47, 0xfb, 0xee, 0xd3, 0x17, 0x4e, 0x22, 0x4f, 0x56, 0xff, 0x50, + 0xf3, 0x2e, 0xe6, 0x39, 0xa6, 0x82, 0xd6, 0x71, 0xca, 0xde, 0xb7, + 0xd5, 0xba, 0x68, 0x08, 0xed, 0x99, 0xcc, 0xfd, 0xa2, 0x92, 0xcb, + 0x69, 0xb8, 0x9d, 0xf9, 0x0a, 0xa4, 0xa6, 0x3e, 0x4f, 0x93, 0x28, + 0x2a, 0x61, 0x6c, 0x07, 0x26, 0x00, 0xff, 0x96, 0x5f, 0x68, 0x86, + 0xb8, 0xb8, 0xce, 0xca, 0x55, 0xe0, 0xab, 0xb1, 0x3d, 0x7f, 0x98, + 0xd7, 0x33, 0x0e, 0x5a, 0x3d, 0xd8, 0x78, 0xc2, 0xc4, 0x60, 0x2f, + 0xc7, 0x62, 0xf0, 0x61, 0x91, 0xd2, 0x38, 0xb0, 0xf6, 0x9e, 0x55, + 0xdb, 0x40, 0x80, 0x05, 0x12, 0x33, 0xce, 0x1d, 0x92, 0x9b, 0xd1, + 0x69, 0xb3, 0xff, 0xbf, 0xf1, 0x92, 0x0a, 0x61, 0x35, 0x3f, 0xdd, + 0xfe, 0x86, 0xf4, 0xbc, 0xe0, 0x1a, 0x71, 0xb3, 0x62, 0xa6, 0x30, + 0x82, 0x03, 0xf7, 0x30, 0x82, 0x02, 0xdf, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x04, 0x48, 0x9f, 0x00, 0x01, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, + 0x30, 0x81, 0x8a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x43, 0x4e, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, + 0x55, 0x04, 0x0a, 0x0c, 0x29, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x20, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x43, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x31, 0x47, 0x30, 0x45, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0c, 0x3e, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x20, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, + 0x45, 0x56, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x1e, + 0x17, 0x0d, 0x31, 0x30, 0x30, 0x38, 0x33, 0x31, 0x30, 0x37, 0x31, + 0x31, 0x32, 0x35, 0x5a, 0x17, 0x0d, 0x33, 0x30, 0x30, 0x38, 0x33, + 0x31, 0x30, 0x37, 0x31, 0x31, 0x32, 0x35, 0x5a, 0x30, 0x81, 0x8a, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x43, 0x4e, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x0c, 0x29, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x20, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x31, + 0x47, 0x30, 0x45, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x3e, 0x43, + 0x68, 0x69, 0x6e, 0x61, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x65, 0x74, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, + 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x45, 0x56, 0x20, + 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x82, 0x01, 0x22, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, + 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0x9b, 0x7e, 0x73, 0xee, 0xbd, + 0x3b, 0x78, 0xaa, 0x64, 0x43, 0x41, 0xf5, 0x50, 0xdf, 0x94, 0xf2, + 0x2e, 0xb2, 0x8d, 0x4a, 0x8e, 0x46, 0x54, 0xd2, 0x21, 0x12, 0xc8, + 0x39, 0x32, 0x42, 0x06, 0xe9, 0x83, 0xd5, 0x9f, 0x52, 0xed, 0xe5, + 0x67, 0x03, 0x3b, 0x54, 0xc1, 0x8c, 0x99, 0x99, 0xcc, 0xe9, 0xc0, + 0x0f, 0xff, 0x0d, 0xd9, 0x84, 0x11, 0xb2, 0xb8, 0xd1, 0xcb, 0x5b, + 0xdc, 0x1e, 0xf9, 0x68, 0x31, 0x64, 0xe1, 0x9b, 0xfa, 0x74, 0xeb, + 0x68, 0xb9, 0x20, 0x95, 0xf7, 0xc6, 0x0f, 0x8d, 0x47, 0xac, 0x5a, + 0x06, 0xdd, 0x61, 0xab, 0xe2, 0xec, 0xd8, 0x9f, 0x17, 0x2d, 0x9c, + 0xca, 0x3c, 0x35, 0x97, 0x55, 0x71, 0xcd, 0x43, 0x85, 0xb1, 0x47, + 0x16, 0xf5, 0x2c, 0x53, 0x80, 0x76, 0xcf, 0xd3, 0x00, 0x64, 0xbd, + 0x40, 0x99, 0xdd, 0xcc, 0xd8, 0xdb, 0xc4, 0x9f, 0xd6, 0x13, 0x5f, + 0x41, 0x83, 0x8b, 0xf9, 0x0d, 0x87, 0x92, 0x56, 0x34, 0x6c, 0x1a, + 0x10, 0x0b, 0x17, 0xd5, 0x5a, 0x1c, 0x97, 0x58, 0x84, 0x3c, 0x84, + 0x1a, 0x2e, 0x5c, 0x91, 0x34, 0x6e, 0x19, 0x5f, 0x7f, 0x17, 0x69, + 0xc5, 0x65, 0xef, 0x6b, 0x21, 0xc6, 0xd5, 0x50, 0x3a, 0xbf, 0x61, + 0xb9, 0x05, 0x8d, 0xef, 0x6f, 0x34, 0x3a, 0xb2, 0x6f, 0x14, 0x63, + 0xbf, 0x16, 0x3b, 0x9b, 0xa9, 0x2a, 0xfd, 0xb7, 0x2b, 0x38, 0x66, + 0x06, 0xc5, 0x2c, 0xe2, 0xaa, 0x67, 0x1e, 0x45, 0xa7, 0x8d, 0x04, + 0x66, 0x42, 0xf6, 0x8f, 0x2b, 0xef, 0x88, 0x20, 0x69, 0x8f, 0x32, + 0x8c, 0x14, 0x73, 0xda, 0x2b, 0x86, 0x91, 0x63, 0x22, 0x9a, 0xf2, + 0xa7, 0xdb, 0xce, 0x89, 0x8b, 0xab, 0x5d, 0xc7, 0x14, 0xc1, 0x5b, + 0x30, 0x6a, 0x1f, 0xb1, 0xb7, 0x9e, 0x2e, 0x81, 0x01, 0x02, 0xed, + 0xcf, 0x96, 0x5e, 0x63, 0xdb, 0xa8, 0xe6, 0x38, 0xb7, 0x02, 0x03, + 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x1f, 0x06, 0x03, + 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x7c, 0x72, + 0x4b, 0x39, 0xc7, 0xc0, 0xdb, 0x62, 0xa5, 0x4f, 0x9b, 0xaa, 0x18, + 0x34, 0x92, 0xa2, 0xca, 0x83, 0x82, 0x59, 0x30, 0x0f, 0x06, 0x03, + 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, + 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, + 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, + 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x7c, 0x72, 0x4b, 0x39, + 0xc7, 0xc0, 0xdb, 0x62, 0xa5, 0x4f, 0x9b, 0xaa, 0x18, 0x34, 0x92, + 0xa2, 0xca, 0x83, 0x82, 0x59, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, + 0x01, 0x01, 0x00, 0x2a, 0xc3, 0xc7, 0x43, 0x37, 0x8f, 0xdd, 0xad, + 0xa4, 0xb2, 0x0c, 0xee, 0xdc, 0x14, 0x6d, 0x8f, 0x28, 0xa4, 0x98, + 0x49, 0xcb, 0x0c, 0x80, 0xea, 0xf3, 0xed, 0x23, 0x66, 0x75, 0x7d, + 0xc5, 0xd3, 0x21, 0x67, 0x79, 0xd1, 0x73, 0xc5, 0xb5, 0x03, 0xb7, + 0x58, 0xac, 0x0c, 0x54, 0x2f, 0xc6, 0x56, 0x13, 0x0f, 0x31, 0xda, + 0x06, 0xe7, 0x65, 0x3b, 0x1d, 0x6f, 0x36, 0xdb, 0xc8, 0x1d, 0xf9, + 0xfd, 0x80, 0x06, 0xca, 0xa3, 0x3d, 0x66, 0x16, 0xa8, 0x9d, 0x4c, + 0x16, 0x7d, 0xc0, 0x95, 0x46, 0xb5, 0x51, 0xe4, 0xe2, 0x1f, 0xd7, + 0xea, 0x06, 0x4d, 0x63, 0x8d, 0x96, 0x8c, 0xef, 0xe7, 0x33, 0x57, + 0x42, 0x3a, 0xeb, 0x8c, 0xc1, 0x79, 0xc8, 0x4d, 0x76, 0x7d, 0xde, + 0xf6, 0xb1, 0xb7, 0x81, 0xe0, 0xa0, 0xf9, 0xa1, 0x78, 0x46, 0x17, + 0x1a, 0x56, 0x98, 0xf0, 0x4e, 0x3d, 0xab, 0x1c, 0xed, 0xec, 0x39, + 0xdc, 0x07, 0x48, 0xf7, 0x63, 0xfe, 0x06, 0xae, 0xc2, 0xa4, 0x5c, + 0x6a, 0x5b, 0x32, 0x88, 0xc5, 0xc7, 0x33, 0x85, 0xac, 0x66, 0x42, + 0x47, 0xc2, 0x58, 0x24, 0x99, 0xe1, 0xe5, 0x3e, 0xe5, 0x75, 0x2c, + 0x8e, 0x43, 0xd6, 0x5d, 0x3c, 0x78, 0x1e, 0xa8, 0x95, 0x82, 0x29, + 0x50, 0xd1, 0xd1, 0x16, 0xba, 0xef, 0xc1, 0xbe, 0x7a, 0xd9, 0xb4, + 0xd8, 0xcc, 0x1e, 0x4c, 0x46, 0xe1, 0x77, 0xb1, 0x31, 0xab, 0xbd, + 0x2a, 0xc8, 0xce, 0x8f, 0x6e, 0xa1, 0x5d, 0x7f, 0x03, 0x75, 0x34, + 0xe4, 0xad, 0x89, 0x45, 0x54, 0x5e, 0xbe, 0xae, 0x28, 0xa5, 0xbb, + 0x3f, 0x78, 0x79, 0xeb, 0x73, 0xb3, 0x0a, 0x0d, 0xfd, 0xbe, 0xc9, + 0xf7, 0x56, 0xac, 0xf6, 0xb7, 0xed, 0x2f, 0x9b, 0x21, 0x29, 0xc7, + 0x38, 0xb6, 0x95, 0xc4, 0x04, 0xf2, 0xc3, 0x2d, 0xfd, 0x14, 0x2a, + 0x90, 0x99, 0xb9, 0x07, 0xcc, 0x9f, 0x30, 0x82, 0x05, 0xd9, 0x30, + 0x82, 0x03, 0xc1, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x1e, + 0x9e, 0x28, 0xe8, 0x48, 0xf2, 0xe5, 0xef, 0xc3, 0x7c, 0x4a, 0x1e, + 0x5a, 0x18, 0x67, 0xb6, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x64, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x63, + 0x68, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x08, 0x53, 0x77, 0x69, 0x73, 0x73, 0x63, 0x6f, 0x6d, 0x31, 0x25, + 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1c, 0x44, 0x69, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x12, 0x53, 0x77, 0x69, 0x73, 0x73, 0x63, 0x6f, + 0x6d, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, + 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x31, 0x30, 0x36, 0x32, 0x34, 0x30, + 0x38, 0x33, 0x38, 0x31, 0x34, 0x5a, 0x17, 0x0d, 0x33, 0x31, 0x30, + 0x36, 0x32, 0x35, 0x30, 0x37, 0x33, 0x38, 0x31, 0x34, 0x5a, 0x30, + 0x64, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x63, 0x68, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x13, 0x08, 0x53, 0x77, 0x69, 0x73, 0x73, 0x63, 0x6f, 0x6d, + 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1c, + 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x43, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x31, 0x1b, 0x30, 0x19, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x53, 0x77, 0x69, 0x73, 0x73, + 0x63, 0x6f, 0x6d, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, + 0x20, 0x32, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, + 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, + 0x01, 0x00, 0x95, 0x42, 0x4e, 0x84, 0x9d, 0x51, 0xe6, 0xd3, 0x09, + 0xe8, 0x72, 0x5a, 0x23, 0x69, 0xdb, 0x78, 0x70, 0x8e, 0x16, 0xf1, + 0x2b, 0x8f, 0x0d, 0x03, 0xce, 0x93, 0xcc, 0x2e, 0x00, 0x08, 0x7b, + 0xab, 0x33, 0x8c, 0xf4, 0xe9, 0x40, 0xe6, 0x17, 0x4c, 0xab, 0x9e, + 0xb8, 0x47, 0x14, 0x32, 0x77, 0x32, 0xdd, 0x28, 0x0c, 0xde, 0x18, + 0x4b, 0x5f, 0x76, 0x9f, 0xf8, 0x39, 0x3b, 0xfc, 0x4e, 0x89, 0xd8, + 0x7c, 0xc5, 0x67, 0xef, 0xab, 0xd2, 0xb9, 0x34, 0x5f, 0x6b, 0x3a, + 0xf3, 0x64, 0x36, 0xce, 0xc2, 0xb0, 0xcf, 0x13, 0x68, 0xca, 0xc8, + 0xcb, 0xeb, 0xb5, 0xe2, 0x3d, 0x2e, 0x21, 0xdf, 0xea, 0x2c, 0xd4, + 0xe0, 0xf9, 0x70, 0x96, 0x4c, 0xff, 0x6a, 0x58, 0x98, 0xb7, 0x17, + 0xe4, 0x1b, 0x52, 0xe5, 0x7e, 0x07, 0x00, 0x1d, 0x5f, 0xda, 0xe6, + 0x3e, 0x95, 0x04, 0xb7, 0x69, 0x88, 0x39, 0xa1, 0x41, 0x60, 0x25, + 0x61, 0x4b, 0x95, 0x39, 0x68, 0x62, 0x1c, 0xb1, 0x0b, 0x05, 0x89, + 0xc0, 0x36, 0x82, 0x14, 0x21, 0x3f, 0xae, 0xdb, 0xa1, 0xfd, 0xbc, + 0x6f, 0x1c, 0x60, 0x86, 0xb6, 0x53, 0x94, 0x49, 0xb9, 0x2b, 0x46, + 0xc5, 0x4f, 0x00, 0x2b, 0xbf, 0xa1, 0xbb, 0xcb, 0x3f, 0xe0, 0xc7, + 0x57, 0x1c, 0x57, 0xe8, 0xd6, 0x69, 0xf8, 0xc1, 0x24, 0x52, 0x9d, + 0x88, 0x55, 0xdd, 0xc2, 0x87, 0x2e, 0x74, 0x23, 0xd0, 0x14, 0xfd, + 0x2a, 0x47, 0x5a, 0xbb, 0xa6, 0x9d, 0xfd, 0x94, 0xe4, 0xd1, 0x8a, + 0xa5, 0x5f, 0x86, 0x63, 0x76, 0x85, 0xcb, 0xaf, 0xff, 0x49, 0x28, + 0xfc, 0x80, 0xed, 0x4c, 0x79, 0xd2, 0xbb, 0xe4, 0xc0, 0xef, 0x01, + 0xee, 0x50, 0x41, 0x08, 0x35, 0x23, 0x70, 0x2b, 0xa9, 0x16, 0xb4, + 0x8c, 0x6e, 0x85, 0xe9, 0xb6, 0x11, 0xcf, 0x31, 0xdd, 0x53, 0x26, + 0x1b, 0xdf, 0x2d, 0x5a, 0x4a, 0x02, 0x40, 0xfc, 0xc4, 0xc0, 0xb6, + 0xe9, 0x31, 0x1a, 0x08, 0x28, 0xe5, 0x60, 0xc3, 0x1f, 0xc4, 0x90, + 0x8e, 0x10, 0x62, 0x60, 0x44, 0x0d, 0xec, 0x0a, 0xbe, 0x55, 0x18, + 0x71, 0x2c, 0xa5, 0xf4, 0xb2, 0xbc, 0x15, 0x62, 0xff, 0x1c, 0xe3, + 0xbe, 0x1d, 0xda, 0x1e, 0x57, 0xb3, 0x3c, 0x7e, 0xcd, 0x82, 0x1d, + 0x91, 0xe3, 0x4b, 0xeb, 0x2c, 0x52, 0x34, 0xb0, 0x8a, 0xfd, 0x12, + 0x4e, 0x96, 0xb0, 0xeb, 0x70, 0x7f, 0x9e, 0x39, 0xf7, 0x66, 0x42, + 0xb1, 0xab, 0xac, 0x52, 0xda, 0x76, 0x40, 0x57, 0x7b, 0x2a, 0xbd, + 0xe8, 0x6e, 0x03, 0xb2, 0x0b, 0x80, 0x85, 0x88, 0x9d, 0x0c, 0xc7, + 0xc2, 0x77, 0xb0, 0x9a, 0x9a, 0x57, 0xf4, 0xb8, 0xfa, 0x13, 0x5c, + 0x68, 0x93, 0x3a, 0x67, 0xa4, 0x97, 0xd0, 0x1b, 0x99, 0xb7, 0x86, + 0x32, 0x4b, 0x60, 0xd8, 0xce, 0xef, 0xd0, 0x0c, 0x7f, 0x95, 0x9f, + 0x6f, 0x87, 0x4f, 0x87, 0x8a, 0x8e, 0x5f, 0x08, 0x7c, 0xaa, 0x5b, + 0xfc, 0x5a, 0xbe, 0xa1, 0x91, 0x9f, 0x55, 0x7d, 0x4e, 0xb0, 0x0b, + 0x69, 0xcc, 0xb0, 0x94, 0xa8, 0xa7, 0x87, 0xf2, 0xd3, 0x4a, 0x50, + 0xdc, 0x5f, 0x72, 0xb0, 0x16, 0x75, 0x1e, 0xcb, 0xb4, 0x18, 0x62, + 0x9a, 0xb0, 0xa7, 0x39, 0xaa, 0x9b, 0x9f, 0x66, 0xd8, 0x8d, 0xa6, + 0x6c, 0x96, 0x15, 0xe3, 0xe6, 0xf2, 0xf8, 0xf1, 0x83, 0x62, 0x6c, + 0xbb, 0x55, 0xe9, 0x61, 0x93, 0xa3, 0x3d, 0xf5, 0xb1, 0x57, 0x8b, + 0x4f, 0x23, 0xb0, 0x9b, 0xe5, 0x94, 0x6a, 0x2f, 0xdf, 0x8c, 0xdf, + 0x95, 0x51, 0x29, 0x60, 0xa1, 0x0b, 0x29, 0xe4, 0x5c, 0x55, 0x58, + 0xb7, 0xa8, 0xfc, 0x99, 0xee, 0x25, 0x4d, 0x4c, 0x0e, 0xb3, 0xd3, + 0x4c, 0x8f, 0x84, 0xe8, 0x29, 0x0f, 0xfd, 0x10, 0x54, 0x02, 0x85, + 0xc8, 0xf9, 0xe5, 0xc3, 0x8b, 0xcf, 0xe7, 0x0f, 0x02, 0x03, 0x01, + 0x00, 0x01, 0xa3, 0x81, 0x86, 0x30, 0x81, 0x83, 0x30, 0x0e, 0x06, + 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, + 0x01, 0x86, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x21, 0x04, 0x16, + 0x30, 0x14, 0x30, 0x12, 0x06, 0x07, 0x60, 0x85, 0x74, 0x01, 0x53, + 0x02, 0x01, 0x06, 0x07, 0x60, 0x85, 0x74, 0x01, 0x53, 0x02, 0x01, + 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, + 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x07, 0x30, 0x1d, + 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x4d, 0x26, + 0x20, 0x22, 0x89, 0x4b, 0xd3, 0xd5, 0xa4, 0x0a, 0xa1, 0x6f, 0xde, + 0xe2, 0x12, 0x81, 0xc5, 0xf1, 0x3c, 0x2e, 0x30, 0x1f, 0x06, 0x03, + 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x4d, 0x26, + 0x20, 0x22, 0x89, 0x4b, 0xd3, 0xd5, 0xa4, 0x0a, 0xa1, 0x6f, 0xde, + 0xe2, 0x12, 0x81, 0xc5, 0xf1, 0x3c, 0x2e, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, + 0x03, 0x82, 0x02, 0x01, 0x00, 0x32, 0x0a, 0xb2, 0xa4, 0x1b, 0xcb, + 0x7d, 0xbe, 0x82, 0x57, 0x89, 0xb9, 0x6a, 0x7f, 0xf3, 0xf4, 0xc1, + 0x2e, 0x11, 0x7d, 0xb8, 0x19, 0x3e, 0x79, 0xb7, 0xa8, 0xa8, 0x72, + 0x37, 0x66, 0x9b, 0x1a, 0xed, 0xac, 0x13, 0x3b, 0x0e, 0xbf, 0x62, + 0xf0, 0x9c, 0xdf, 0x9e, 0x7b, 0xa1, 0x53, 0x48, 0x0e, 0x41, 0x7a, + 0xca, 0x20, 0xa7, 0x17, 0x1b, 0xb6, 0x78, 0xec, 0x40, 0x91, 0xf3, + 0x42, 0xad, 0x10, 0xc3, 0x5c, 0xef, 0xff, 0x60, 0x59, 0x7f, 0xcd, + 0x85, 0xa3, 0x8b, 0x3d, 0x48, 0x1c, 0x25, 0x02, 0x3c, 0x67, 0x7d, + 0xf5, 0x32, 0xe9, 0x2f, 0x30, 0xe5, 0x7d, 0xa5, 0x7a, 0x38, 0xd0, + 0xf3, 0x66, 0x2a, 0x66, 0x1e, 0x8d, 0x33, 0x83, 0x8a, 0x6f, 0x7c, + 0x6e, 0xa8, 0x5a, 0x75, 0x9a, 0xb8, 0xd7, 0xda, 0x58, 0x48, 0x44, + 0x47, 0xa8, 0x4c, 0xfa, 0x4c, 0x49, 0x0a, 0x4a, 0xc2, 0x12, 0x37, + 0xa8, 0x40, 0x0c, 0xc3, 0xc8, 0xe1, 0xd0, 0x57, 0x0d, 0x97, 0x32, + 0x95, 0xc7, 0x3a, 0x9f, 0x97, 0xd3, 0x57, 0xf8, 0x0b, 0xde, 0xe5, + 0x72, 0xf3, 0xa3, 0xdb, 0xff, 0xb5, 0xd8, 0x59, 0xb2, 0x73, 0xdd, + 0x4d, 0x2a, 0x71, 0xb2, 0xba, 0x49, 0xf5, 0xcb, 0x1c, 0xd5, 0xf5, + 0x79, 0xc8, 0x99, 0xb3, 0xfc, 0xc1, 0x4c, 0x74, 0xe3, 0xb4, 0xbd, + 0x29, 0x37, 0x15, 0x04, 0x28, 0x1e, 0xde, 0x45, 0x46, 0x70, 0xec, + 0xaf, 0xba, 0x78, 0x0e, 0x8a, 0x2a, 0xce, 0x00, 0x79, 0xdc, 0xc0, + 0x5f, 0x19, 0x67, 0x2c, 0x6b, 0x4b, 0xef, 0x68, 0x68, 0x0b, 0x43, + 0xe3, 0xac, 0xc1, 0x62, 0x09, 0xef, 0xa6, 0xdd, 0x65, 0x61, 0xa0, + 0xaf, 0x84, 0x55, 0x48, 0x91, 0x52, 0x1c, 0xc6, 0x25, 0x91, 0x2a, + 0xd0, 0xc1, 0x22, 0x23, 0x61, 0x59, 0xaf, 0x45, 0x11, 0x85, 0x1d, + 0x01, 0x24, 0x34, 0x8f, 0xcf, 0xb3, 0xff, 0x17, 0x72, 0x20, 0x13, + 0xc2, 0x80, 0xaa, 0x21, 0x2c, 0x71, 0x39, 0x0e, 0xd0, 0x8f, 0x5c, + 0xc1, 0xd3, 0xd1, 0x8e, 0x22, 0x72, 0x46, 0x4c, 0x1d, 0x96, 0xae, + 0x4f, 0x71, 0xb1, 0xe1, 0x05, 0x29, 0x96, 0x59, 0xf4, 0xbb, 0x9e, + 0x75, 0x3d, 0xcf, 0x0d, 0x37, 0x0d, 0x62, 0xdb, 0x26, 0x8c, 0x63, + 0xa9, 0x23, 0xdf, 0x67, 0x06, 0x3c, 0x7c, 0x3a, 0xda, 0x34, 0x42, + 0xe1, 0x66, 0xb4, 0x46, 0x04, 0xde, 0xc6, 0x96, 0x98, 0x0f, 0x4b, + 0x48, 0x7a, 0x24, 0x32, 0x75, 0x91, 0x9f, 0xac, 0xf7, 0x68, 0xe9, + 0x2a, 0xb9, 0x55, 0x65, 0xce, 0x5d, 0x61, 0xd3, 0x27, 0x70, 0xd8, + 0x37, 0xfe, 0x9f, 0xb9, 0xaf, 0xa0, 0x2e, 0x56, 0xb7, 0xa3, 0x65, + 0x51, 0xed, 0x3b, 0xab, 0x14, 0xbf, 0x4c, 0x51, 0x03, 0xe8, 0x5f, + 0x8a, 0x05, 0x9b, 0xee, 0x8a, 0x6e, 0x9c, 0xef, 0xbf, 0x68, 0xfa, + 0xc8, 0xda, 0x0b, 0xe3, 0x42, 0xc9, 0xd0, 0x17, 0x14, 0x9c, 0xb7, + 0x4a, 0xe0, 0xaf, 0x93, 0x27, 0x21, 0x55, 0x26, 0xb5, 0x64, 0x2f, + 0x8d, 0xf1, 0xff, 0xa6, 0x40, 0x05, 0x85, 0x05, 0x5c, 0xca, 0x07, + 0x19, 0x5c, 0x0b, 0x13, 0x28, 0x4c, 0x58, 0x7f, 0xc2, 0xa5, 0xef, + 0x45, 0xda, 0x60, 0xd3, 0xae, 0x65, 0x61, 0x9d, 0x53, 0x83, 0x74, + 0xc2, 0xae, 0xf2, 0x5c, 0xc2, 0x16, 0xed, 0x92, 0x3e, 0x84, 0x3e, + 0x73, 0x60, 0x88, 0xbc, 0x76, 0xf4, 0x2c, 0xcf, 0xd0, 0x7d, 0x7d, + 0xd3, 0xb8, 0x5e, 0xd1, 0x91, 0x12, 0x10, 0xe9, 0xcd, 0xdd, 0xca, + 0x25, 0xe3, 0xd5, 0xed, 0x99, 0x2f, 0xbe, 0x75, 0x81, 0x4b, 0x24, + 0xf9, 0x45, 0x46, 0x94, 0xc9, 0x29, 0x21, 0x53, 0x9c, 0x26, 0x45, + 0xaa, 0x13, 0x17, 0xe4, 0xe7, 0xcd, 0x78, 0xe2, 0x39, 0xc1, 0x2b, + 0x12, 0x9e, 0xa6, 0x9e, 0x1b, 0xc5, 0xe6, 0x0e, 0xd9, 0x31, 0xd9, + 0x30, 0x82, 0x05, 0xe0, 0x30, 0x82, 0x03, 0xc8, 0xa0, 0x03, 0x02, + 0x01, 0x02, 0x02, 0x11, 0x00, 0xf2, 0xfa, 0x64, 0xe2, 0x74, 0x63, + 0xd3, 0x8d, 0xfd, 0x10, 0x1d, 0x04, 0x1f, 0x76, 0xca, 0x58, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x0b, 0x05, 0x00, 0x30, 0x67, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x63, 0x68, 0x31, 0x11, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x53, 0x77, 0x69, 0x73, + 0x73, 0x63, 0x6f, 0x6d, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, + 0x04, 0x0b, 0x13, 0x1c, 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, + 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x31, + 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x15, 0x53, + 0x77, 0x69, 0x73, 0x73, 0x63, 0x6f, 0x6d, 0x20, 0x52, 0x6f, 0x6f, + 0x74, 0x20, 0x45, 0x56, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x1e, + 0x17, 0x0d, 0x31, 0x31, 0x30, 0x36, 0x32, 0x34, 0x30, 0x39, 0x34, + 0x35, 0x30, 0x38, 0x5a, 0x17, 0x0d, 0x33, 0x31, 0x30, 0x36, 0x32, + 0x35, 0x30, 0x38, 0x34, 0x35, 0x30, 0x38, 0x5a, 0x30, 0x67, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x63, + 0x68, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x08, 0x53, 0x77, 0x69, 0x73, 0x73, 0x63, 0x6f, 0x6d, 0x31, 0x25, + 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1c, 0x44, 0x69, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x15, 0x53, 0x77, 0x69, 0x73, 0x73, 0x63, 0x6f, + 0x6d, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x45, 0x56, 0x20, 0x43, + 0x41, 0x20, 0x32, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, + 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, + 0x02, 0x01, 0x00, 0xc4, 0xf7, 0x1d, 0x2f, 0x57, 0xea, 0x57, 0x6c, + 0xf7, 0x70, 0x5d, 0x63, 0xb0, 0x71, 0x52, 0x09, 0x60, 0x44, 0x28, + 0x33, 0xa3, 0x7a, 0x4e, 0x0a, 0xfa, 0xd8, 0xea, 0x6c, 0x8b, 0x51, + 0x16, 0x1a, 0x55, 0xae, 0x54, 0x26, 0xc4, 0xcc, 0x45, 0x07, 0x41, + 0x4f, 0x10, 0x79, 0x7f, 0x71, 0xd2, 0x7a, 0x4e, 0x3f, 0x38, 0x4e, + 0xb3, 0x00, 0xc6, 0x95, 0xca, 0x5b, 0xcd, 0xc1, 0x2a, 0x83, 0xd7, + 0x27, 0x1f, 0x31, 0x0e, 0x23, 0x16, 0xb7, 0x25, 0xcb, 0x1c, 0xb4, + 0xb9, 0x80, 0x32, 0x5e, 0x1a, 0x9d, 0x93, 0xf1, 0xe8, 0x3c, 0x60, + 0x2c, 0xa7, 0x5e, 0x57, 0x19, 0x58, 0x51, 0x5e, 0xbc, 0x2c, 0x56, + 0x0b, 0xb8, 0xd8, 0xef, 0x8b, 0x82, 0xb4, 0x3c, 0xb8, 0xc2, 0x24, + 0xa8, 0x13, 0xc7, 0xa0, 0x21, 0x36, 0x1b, 0x7a, 0x57, 0x29, 0x28, + 0xa7, 0x2e, 0xbf, 0x71, 0x25, 0x90, 0xf3, 0x44, 0x83, 0x69, 0x50, + 0xa4, 0xe4, 0xe1, 0x1b, 0x62, 0x19, 0x94, 0x09, 0xa3, 0xf3, 0xc3, + 0xbc, 0xef, 0xf4, 0xbd, 0xec, 0xdb, 0x13, 0x9d, 0xcf, 0x9d, 0x48, + 0x09, 0x52, 0x67, 0xc0, 0x37, 0x29, 0x11, 0x1e, 0xfb, 0xd2, 0x11, + 0xa7, 0x85, 0x18, 0x74, 0x79, 0xe4, 0x4f, 0x85, 0x14, 0xeb, 0x52, + 0x37, 0xe2, 0xb1, 0x45, 0xd8, 0xcc, 0x0d, 0x43, 0x7f, 0xae, 0x13, + 0xd2, 0x6b, 0x2b, 0x3f, 0xa7, 0xc2, 0xe2, 0xa8, 0x6d, 0x76, 0x5b, + 0x43, 0x9f, 0xbe, 0xb4, 0x9d, 0xb3, 0x26, 0x86, 0x3b, 0x1f, 0x7f, + 0xe5, 0xf2, 0xe8, 0x66, 0x28, 0x16, 0x25, 0xd0, 0x4b, 0x97, 0x38, + 0xa7, 0xe4, 0xcf, 0x09, 0xd1, 0x36, 0xc3, 0x0b, 0xbe, 0xda, 0x3b, + 0x44, 0x58, 0x8d, 0xbe, 0xf1, 0x9e, 0x09, 0x6b, 0x3e, 0xf3, 0x32, + 0xc7, 0x2b, 0x87, 0xc6, 0xec, 0x5e, 0x9c, 0xf6, 0x87, 0x65, 0xad, + 0x33, 0x29, 0xc4, 0x2f, 0x89, 0xd9, 0xb9, 0xcb, 0xc9, 0x03, 0x9d, + 0xfb, 0x6c, 0x94, 0x51, 0x97, 0x10, 0x1b, 0x86, 0x0b, 0x1a, 0x1b, + 0x3f, 0xf6, 0x02, 0x7e, 0x7b, 0xd4, 0xc5, 0x51, 0x64, 0x28, 0x9d, + 0xf5, 0xd3, 0xac, 0x83, 0x81, 0x88, 0xd3, 0x74, 0xb4, 0x59, 0x9d, + 0xc1, 0xeb, 0x61, 0x33, 0x5a, 0x45, 0xd1, 0xcb, 0x39, 0xd0, 0x06, + 0x6a, 0x53, 0x60, 0x1d, 0xaf, 0xf6, 0xfb, 0x69, 0xbc, 0x6a, 0xdc, + 0x01, 0xcf, 0xbd, 0xf9, 0x8f, 0xd9, 0xbd, 0x5b, 0xc1, 0x3a, 0x5f, + 0x8e, 0xda, 0x0f, 0x4b, 0xa9, 0x9b, 0x9d, 0x2a, 0x28, 0x6b, 0x1a, + 0x0a, 0x7c, 0x3c, 0xab, 0x22, 0x0b, 0xe5, 0x77, 0x2d, 0x71, 0xf6, + 0x82, 0x35, 0x81, 0xae, 0xf8, 0x7b, 0x81, 0xe6, 0xea, 0xfe, 0xac, + 0xf4, 0x1a, 0x9b, 0x74, 0x5c, 0xe8, 0x8f, 0x24, 0xf6, 0x5d, 0x9d, + 0x46, 0xc4, 0x2c, 0xd2, 0x1e, 0x2b, 0x21, 0x6a, 0x83, 0x27, 0x67, + 0x55, 0x4a, 0xa4, 0xe3, 0xc8, 0x32, 0x97, 0x66, 0x90, 0x72, 0xda, + 0xe3, 0xd4, 0x64, 0x2e, 0x5f, 0xe3, 0xa1, 0x6a, 0xf6, 0x60, 0xd4, + 0xe7, 0x35, 0xcd, 0xca, 0xc4, 0x68, 0x8d, 0xd7, 0x71, 0xc8, 0xd3, + 0x24, 0x33, 0x73, 0xb1, 0x6c, 0xf9, 0x6a, 0xe1, 0x28, 0xdb, 0x5f, + 0xc6, 0x3d, 0xe8, 0xbe, 0x55, 0xe6, 0x37, 0x1b, 0xed, 0x24, 0xd9, + 0x0f, 0x19, 0x8f, 0x5f, 0x63, 0x18, 0x58, 0x50, 0x81, 0x51, 0x65, + 0x6f, 0xf2, 0x9f, 0x7e, 0x6a, 0x04, 0xe7, 0x34, 0x24, 0x71, 0xba, + 0x76, 0x4b, 0x58, 0x1e, 0x19, 0xbd, 0x15, 0x60, 0x45, 0xaa, 0x0c, + 0x12, 0x40, 0x01, 0x9d, 0x10, 0xe2, 0xc7, 0x38, 0x07, 0x72, 0x0a, + 0x65, 0xc0, 0xb6, 0xbb, 0x25, 0x29, 0xda, 0x16, 0x9e, 0x8b, 0x35, + 0x8b, 0x61, 0xed, 0xe5, 0x71, 0x57, 0x83, 0xb5, 0x3c, 0x71, 0x9f, + 0xe3, 0x4f, 0xbf, 0x7e, 0x1e, 0x81, 0x9f, 0x41, 0x97, 0x02, 0x03, + 0x01, 0x00, 0x01, 0xa3, 0x81, 0x86, 0x30, 0x81, 0x83, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, + 0x02, 0x01, 0x86, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x21, 0x04, + 0x16, 0x30, 0x14, 0x30, 0x12, 0x06, 0x07, 0x60, 0x85, 0x74, 0x01, + 0x53, 0x02, 0x02, 0x06, 0x07, 0x60, 0x85, 0x74, 0x01, 0x53, 0x02, + 0x02, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, + 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x03, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x45, + 0xd9, 0xa5, 0x81, 0x6e, 0x3d, 0x88, 0x4d, 0x8d, 0x71, 0xd2, 0x46, + 0xc1, 0x6e, 0x45, 0x1e, 0xf3, 0xc4, 0x80, 0x9d, 0x30, 0x1f, 0x06, + 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x45, + 0xd9, 0xa5, 0x81, 0x6e, 0x3d, 0x88, 0x4d, 0x8d, 0x71, 0xd2, 0x46, + 0xc1, 0x6e, 0x45, 0x1e, 0xf3, 0xc4, 0x80, 0x9d, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, + 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x94, 0x3a, 0x73, 0x06, 0x9f, + 0x52, 0x4b, 0x30, 0x5c, 0xd4, 0xfe, 0xb1, 0x5c, 0x25, 0xf9, 0xd7, + 0x8e, 0x6f, 0xf5, 0x87, 0x64, 0x9f, 0xed, 0x14, 0x8e, 0xb8, 0x04, + 0x8e, 0x28, 0x4b, 0x8f, 0xaa, 0x7b, 0x8e, 0x39, 0xb4, 0xd9, 0x58, + 0xf6, 0x7b, 0xa1, 0x35, 0x0a, 0xa1, 0x9d, 0x8a, 0xf7, 0x63, 0xe5, + 0xeb, 0xbd, 0x39, 0x82, 0xd4, 0xe3, 0x7a, 0x2d, 0x6f, 0xdf, 0x13, + 0x3c, 0xba, 0xfe, 0x7e, 0x56, 0x98, 0x0b, 0xf3, 0x54, 0x9f, 0xcd, + 0x44, 0x4e, 0x6e, 0x3c, 0xe1, 0x3e, 0x15, 0xbf, 0x06, 0x26, 0x9d, + 0xe4, 0xf0, 0x90, 0xb6, 0xd4, 0xc2, 0x9e, 0x30, 0x2e, 0x1f, 0xef, + 0xc7, 0x7a, 0xc4, 0x50, 0xc7, 0xea, 0x7b, 0xda, 0x50, 0xcb, 0x7a, + 0x26, 0xcb, 0x00, 0xb4, 0x5a, 0xab, 0xb5, 0x93, 0x1f, 0x80, 0x89, + 0x84, 0x04, 0x95, 0x8d, 0x8d, 0x7f, 0x09, 0x93, 0xbf, 0xd4, 0xa8, + 0xa8, 0xe4, 0x63, 0x6d, 0xd9, 0x64, 0xe4, 0xb8, 0x29, 0x5a, 0x08, + 0xbf, 0x50, 0xe1, 0x84, 0x0f, 0x55, 0x7b, 0x5f, 0x08, 0x22, 0x1b, + 0xf5, 0xbd, 0x99, 0x1e, 0x14, 0xf6, 0xce, 0xf4, 0x58, 0x10, 0x82, + 0xb3, 0x0a, 0x3d, 0x19, 0xc1, 0xbf, 0x5b, 0xab, 0xaa, 0x99, 0xd8, + 0xf2, 0x31, 0xbd, 0xe5, 0x38, 0x66, 0xdc, 0x58, 0x05, 0xc7, 0xed, + 0x63, 0x1a, 0x2e, 0x0a, 0x97, 0x7c, 0x87, 0x93, 0x2b, 0xb2, 0x8a, + 0xe3, 0xf1, 0xec, 0x18, 0xe5, 0x75, 0xb6, 0x29, 0x87, 0xe7, 0xdc, + 0x8b, 0x1a, 0x7e, 0xb4, 0xd8, 0xc9, 0xd3, 0x8a, 0x17, 0x6c, 0x7d, + 0x29, 0x44, 0xbe, 0x8a, 0xaa, 0xf5, 0x7e, 0x3a, 0x2e, 0x68, 0x31, + 0x93, 0xb9, 0x6a, 0xda, 0x9a, 0xe0, 0xdb, 0xe9, 0x2e, 0xa5, 0x84, + 0xcd, 0x1c, 0x0a, 0xb8, 0x4a, 0x08, 0xf9, 0x9c, 0xf1, 0x61, 0x26, + 0x98, 0x93, 0xb7, 0x7b, 0x66, 0xec, 0x91, 0x5e, 0xdd, 0x51, 0x3f, + 0xdb, 0x73, 0x0f, 0xad, 0x04, 0x58, 0x09, 0xdd, 0x04, 0x02, 0x95, + 0x0a, 0x3e, 0xd3, 0x76, 0xdf, 0xa6, 0x10, 0x1e, 0x80, 0x3d, 0xe8, + 0xcd, 0xa4, 0x64, 0xd1, 0x33, 0xc7, 0x92, 0xc7, 0xe2, 0x4e, 0x44, + 0xe3, 0x09, 0xc9, 0x4e, 0xc2, 0x5d, 0x87, 0x0e, 0x12, 0x9e, 0xbf, + 0x0f, 0xc9, 0x05, 0x10, 0xde, 0x7a, 0xa3, 0xb1, 0x3c, 0xf2, 0x3f, + 0xa5, 0xaa, 0x27, 0x79, 0xad, 0x31, 0x7d, 0x1f, 0xfd, 0xfc, 0x19, + 0x69, 0xc5, 0xdd, 0xb9, 0x3f, 0x7c, 0xcd, 0xc6, 0xb4, 0xc2, 0x30, + 0x1e, 0x7e, 0x6e, 0x92, 0xd7, 0x7f, 0x61, 0x76, 0x5a, 0x8f, 0xeb, + 0x95, 0x4d, 0xbc, 0x11, 0x6e, 0x21, 0x7c, 0x59, 0x37, 0x99, 0xd0, + 0x06, 0xbc, 0xf9, 0x06, 0x6d, 0x32, 0x16, 0xa5, 0xd9, 0x69, 0xa8, + 0xe1, 0xdc, 0x3c, 0x80, 0x1e, 0x60, 0x51, 0xdc, 0xd7, 0x54, 0x21, + 0x1e, 0xca, 0x62, 0x77, 0x4f, 0xfa, 0xd8, 0x8f, 0xb3, 0x2b, 0x3a, + 0x0d, 0x78, 0x72, 0xc9, 0x68, 0x41, 0x5a, 0x47, 0x4a, 0xc2, 0xa3, + 0xeb, 0x1a, 0xd7, 0x0a, 0xab, 0x3c, 0x32, 0x55, 0xc8, 0x0a, 0x11, + 0x9c, 0xdf, 0x74, 0xd6, 0xf0, 0x40, 0x15, 0x1d, 0xc8, 0xb9, 0x8f, + 0xb5, 0x36, 0xc5, 0xaf, 0xf8, 0x22, 0xb8, 0xca, 0x1d, 0xf3, 0xd6, + 0xb6, 0x19, 0x0f, 0x9f, 0x61, 0x65, 0x6a, 0xea, 0x74, 0xc8, 0x7c, + 0x8f, 0xc3, 0x4f, 0x5d, 0x65, 0x82, 0x1f, 0xd9, 0x0d, 0x89, 0xda, + 0x75, 0x72, 0xfb, 0xef, 0xf1, 0x47, 0x67, 0x13, 0xb3, 0xc8, 0xd1, + 0x19, 0x88, 0x27, 0x26, 0x9a, 0x99, 0x79, 0x7f, 0x1e, 0xe4, 0x2c, + 0x3f, 0x7b, 0xee, 0xf1, 0xde, 0x4d, 0x8b, 0x96, 0x97, 0xc3, 0xd5, + 0x3f, 0x7c, 0x1b, 0x23, 0xed, 0xa4, 0xb3, 0x1d, 0x16, 0x72, 0x43, + 0x4b, 0x20, 0xe1, 0x59, 0x7e, 0xc2, 0xe8, 0xad, 0x26, 0xbf, 0xa2, + 0xf7, 0x30, 0x82, 0x05, 0x69, 0x30, 0x82, 0x03, 0x51, 0xa0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0xc3, 0x03, 0x9a, 0xee, 0x50, + 0x90, 0x6e, 0x28, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x52, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x53, 0x4b, + 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, + 0x42, 0x72, 0x61, 0x74, 0x69, 0x73, 0x6c, 0x61, 0x76, 0x61, 0x31, + 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x44, + 0x69, 0x73, 0x69, 0x67, 0x20, 0x61, 0x2e, 0x73, 0x2e, 0x31, 0x19, + 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x43, 0x41, + 0x20, 0x44, 0x69, 0x73, 0x69, 0x67, 0x20, 0x52, 0x6f, 0x6f, 0x74, + 0x20, 0x52, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32, 0x30, 0x37, + 0x31, 0x39, 0x30, 0x39, 0x30, 0x36, 0x35, 0x36, 0x5a, 0x17, 0x0d, + 0x34, 0x32, 0x30, 0x37, 0x31, 0x39, 0x30, 0x39, 0x30, 0x36, 0x35, + 0x36, 0x5a, 0x30, 0x52, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x53, 0x4b, 0x31, 0x13, 0x30, 0x11, 0x06, + 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x42, 0x72, 0x61, 0x74, 0x69, + 0x73, 0x6c, 0x61, 0x76, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, + 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x44, 0x69, 0x73, 0x69, 0x67, 0x20, + 0x61, 0x2e, 0x73, 0x2e, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x10, 0x43, 0x41, 0x20, 0x44, 0x69, 0x73, 0x69, + 0x67, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x52, 0x31, 0x30, 0x82, + 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, + 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xaa, 0xc3, + 0x78, 0xf7, 0xdc, 0x98, 0xa3, 0xa7, 0x5a, 0x5e, 0x77, 0x18, 0xb2, + 0xdd, 0x04, 0x64, 0x0f, 0x63, 0xfd, 0x9b, 0x96, 0x09, 0x80, 0xd5, + 0xe8, 0xaa, 0xa5, 0xe2, 0x9c, 0x26, 0x94, 0x3a, 0xe8, 0x99, 0x73, + 0x8c, 0x9d, 0xdf, 0xd7, 0xdf, 0x83, 0xf3, 0x78, 0x4f, 0x40, 0xe1, + 0x7f, 0xd2, 0xa7, 0xd2, 0xe5, 0xca, 0x13, 0x93, 0xe7, 0xed, 0xc6, + 0x77, 0x5f, 0x36, 0xb5, 0x94, 0xaf, 0xe8, 0x38, 0x8e, 0xdb, 0x9b, + 0xe5, 0x7c, 0xbb, 0xcc, 0x8d, 0xeb, 0x75, 0x73, 0xe1, 0x24, 0xcd, + 0xe6, 0xa7, 0x2d, 0x19, 0x2e, 0xd8, 0xd6, 0x8a, 0x6b, 0x14, 0xeb, + 0x08, 0x62, 0x0a, 0xd8, 0xdc, 0xb3, 0x00, 0x4d, 0xc3, 0x23, 0x7c, + 0x5f, 0x43, 0x08, 0x23, 0x32, 0x12, 0xdc, 0xed, 0x0c, 0xad, 0xc0, + 0x7d, 0x0f, 0xa5, 0x7a, 0x42, 0xd9, 0x5a, 0x70, 0xd9, 0xbf, 0xa7, + 0xd7, 0x01, 0x1c, 0xf6, 0x9b, 0xab, 0x8e, 0xb7, 0x4a, 0x86, 0x78, + 0xa0, 0x1e, 0x56, 0x31, 0xae, 0xef, 0x82, 0x0a, 0x80, 0x41, 0xf7, + 0x1b, 0xc9, 0xae, 0xab, 0x32, 0x26, 0xd4, 0x2c, 0x6b, 0xed, 0x7d, + 0x6b, 0xe4, 0xe2, 0x5e, 0x22, 0x0a, 0x45, 0xcb, 0x84, 0x31, 0x4d, + 0xac, 0xfe, 0xdb, 0xd1, 0x47, 0xba, 0xf9, 0x60, 0x97, 0x39, 0xb1, + 0x65, 0xc7, 0xde, 0xfb, 0x99, 0xe4, 0x0a, 0x22, 0xb1, 0x2d, 0x4d, + 0xe5, 0x48, 0x26, 0x69, 0xab, 0xe2, 0xaa, 0xf3, 0xfb, 0xfc, 0x92, + 0x29, 0x32, 0xe9, 0xb3, 0x3e, 0x4d, 0x1f, 0x27, 0xa1, 0xcd, 0x8e, + 0xb9, 0x17, 0xfb, 0x25, 0x3e, 0xc9, 0x6e, 0xf3, 0x77, 0xda, 0x0d, + 0x12, 0xf6, 0x5d, 0xc7, 0xbb, 0x36, 0x10, 0xd5, 0x54, 0xd6, 0xf3, + 0xe0, 0xe2, 0x47, 0x48, 0xe6, 0xde, 0x14, 0xda, 0x61, 0x52, 0xaf, + 0x26, 0xb4, 0xf5, 0x71, 0x4f, 0xc9, 0xd7, 0xd2, 0x06, 0xdf, 0x63, + 0xca, 0xff, 0x21, 0xe8, 0x59, 0x06, 0xe0, 0x08, 0xd5, 0x84, 0x15, + 0x53, 0xf7, 0x43, 0xe5, 0x7c, 0xc5, 0xa0, 0x89, 0x98, 0x6b, 0x73, + 0xc6, 0x68, 0xce, 0x65, 0xde, 0xbd, 0x7f, 0x05, 0xf7, 0xb1, 0xee, + 0xf6, 0x57, 0xa1, 0x60, 0x95, 0xc5, 0xcc, 0xea, 0x93, 0x3a, 0xbe, + 0x99, 0xae, 0x9b, 0x02, 0xa3, 0xad, 0xc9, 0x16, 0xb5, 0xce, 0xdd, + 0x5e, 0x99, 0x78, 0x7e, 0x1a, 0x39, 0x7e, 0xb2, 0xc0, 0x05, 0xa4, + 0xc0, 0x82, 0xa5, 0xa3, 0x47, 0x9e, 0x8c, 0xea, 0x5c, 0xb6, 0xbc, + 0x67, 0xdb, 0xe6, 0x2a, 0x4d, 0xd2, 0x04, 0xdc, 0xa3, 0xae, 0x45, + 0xf7, 0xbc, 0x8b, 0x9c, 0x1c, 0xa7, 0xd6, 0xd5, 0x03, 0xdc, 0x08, + 0xcb, 0x2e, 0x16, 0xca, 0x5c, 0x40, 0x33, 0xe8, 0x67, 0xc3, 0x2e, + 0xe7, 0xa6, 0x44, 0xea, 0x11, 0x45, 0x1c, 0x35, 0x65, 0x2d, 0x1e, + 0x45, 0x61, 0x24, 0x1b, 0x82, 0x2e, 0xa5, 0x9d, 0x33, 0x5d, 0x65, + 0xf8, 0x41, 0xf9, 0x2e, 0xcb, 0x94, 0x3f, 0x1f, 0xa3, 0x0c, 0x31, + 0x24, 0x44, 0xed, 0xc7, 0x5e, 0xad, 0x50, 0xba, 0xc6, 0x41, 0x9b, + 0xac, 0xf0, 0x17, 0x65, 0xc0, 0xf8, 0x5d, 0x6f, 0x5b, 0xa0, 0x0a, + 0x34, 0x3c, 0xee, 0xd7, 0xea, 0x88, 0x9f, 0x98, 0xf9, 0xaf, 0x4e, + 0x24, 0xfa, 0x97, 0xb2, 0x64, 0x76, 0xda, 0xab, 0xf4, 0xed, 0xe3, + 0xc3, 0x60, 0xef, 0xd5, 0xf9, 0x02, 0xc8, 0x2d, 0x9f, 0x83, 0xaf, + 0x67, 0x69, 0x06, 0xa7, 0x31, 0x55, 0xd5, 0xcf, 0x4b, 0x6f, 0xff, + 0x04, 0x05, 0xc7, 0x58, 0xac, 0x5f, 0x16, 0x1b, 0xe5, 0xd2, 0xa3, + 0xeb, 0x31, 0xdb, 0x1f, 0x33, 0x15, 0x4d, 0xd0, 0xf2, 0xa5, 0x53, + 0xf5, 0xcb, 0xe1, 0x3d, 0x4e, 0x68, 0x2d, 0xd8, 0x12, 0xdd, 0xaa, + 0xf2, 0xe6, 0x4d, 0x9b, 0x49, 0xe5, 0xc5, 0x28, 0xa1, 0xba, 0xb0, + 0x5a, 0xc6, 0xa0, 0xb5, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, + 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, + 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, + 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, + 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, + 0x04, 0x14, 0x89, 0x0a, 0xb4, 0x38, 0x93, 0x1a, 0xe6, 0xab, 0xee, + 0x9b, 0x91, 0x18, 0xf9, 0xf5, 0x3c, 0x3e, 0x35, 0xd0, 0xd3, 0x82, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x32, 0x8b, + 0xf6, 0x9d, 0x4a, 0xc9, 0xbe, 0x14, 0xe5, 0x8c, 0xac, 0x38, 0xca, + 0x3a, 0x09, 0xd4, 0x1b, 0xce, 0x86, 0xb3, 0xdd, 0xeb, 0xd4, 0xba, + 0x28, 0xbe, 0x12, 0xae, 0x45, 0x2c, 0x04, 0x74, 0xac, 0x13, 0x51, + 0xc5, 0x58, 0x18, 0x66, 0x4d, 0x82, 0xda, 0xd5, 0xdc, 0x93, 0xc0, + 0x27, 0xe1, 0xbe, 0x7c, 0x9f, 0x52, 0x9e, 0x12, 0x56, 0xf6, 0xd5, + 0x9c, 0xa9, 0xf4, 0x75, 0x9c, 0xfa, 0x37, 0x12, 0x8f, 0x1c, 0x93, + 0xec, 0x57, 0xfe, 0x07, 0x0f, 0xab, 0xd5, 0x12, 0xf7, 0x0f, 0xae, + 0x61, 0x5e, 0x56, 0x80, 0x49, 0xf5, 0xfc, 0x30, 0xf5, 0x9b, 0x4f, + 0x1f, 0x41, 0x2f, 0x1c, 0x84, 0xd3, 0x89, 0xc7, 0xe2, 0xda, 0x02, + 0x76, 0xed, 0x09, 0xcf, 0x6c, 0xc1, 0xb8, 0x1c, 0x83, 0x1c, 0x16, + 0xfa, 0x94, 0xcd, 0x7d, 0xa0, 0xc8, 0x18, 0xd2, 0xc8, 0x9d, 0x6e, + 0xf5, 0xbd, 0x69, 0xd4, 0x6d, 0x3d, 0x35, 0xe8, 0x1e, 0xa2, 0x4f, + 0x60, 0xd7, 0x07, 0x29, 0xfc, 0xb2, 0xa3, 0xa4, 0x9d, 0x6e, 0x15, + 0x92, 0x56, 0x19, 0x4c, 0x0a, 0xb0, 0xe9, 0x7c, 0xd2, 0x19, 0x4d, + 0x42, 0x46, 0xec, 0xbd, 0xfd, 0xf6, 0x57, 0x5b, 0xdd, 0x98, 0x7e, + 0xa4, 0x4d, 0xcc, 0x72, 0x03, 0x83, 0x58, 0x5d, 0xef, 0x93, 0x3a, + 0x41, 0x7a, 0x63, 0xaa, 0x7c, 0x3a, 0xa8, 0xf5, 0xac, 0xa4, 0xd1, + 0xdd, 0xa2, 0x2d, 0xb6, 0x2a, 0xfc, 0x9f, 0x01, 0x8e, 0xe2, 0x10, + 0xb1, 0xc4, 0xca, 0xe4, 0x67, 0xdb, 0x55, 0x25, 0x19, 0x3f, 0xfd, + 0xe8, 0x36, 0x7e, 0xb3, 0xe1, 0xe1, 0x81, 0xaf, 0x11, 0x16, 0x8b, + 0x50, 0x97, 0x60, 0x19, 0x82, 0x00, 0xc0, 0x6b, 0x4d, 0x73, 0xb8, + 0xd1, 0x13, 0x07, 0x3e, 0xea, 0xb6, 0x31, 0x4f, 0xf0, 0x42, 0x9a, + 0x6d, 0xe2, 0x11, 0x74, 0xe5, 0x94, 0xac, 0x8d, 0x84, 0x95, 0x3c, + 0x21, 0xaf, 0xc5, 0xda, 0x47, 0xc8, 0xdf, 0x39, 0x62, 0x62, 0xcb, + 0x5b, 0x50, 0x0b, 0xd7, 0x81, 0x40, 0x05, 0x9c, 0x9b, 0xed, 0xba, + 0xb6, 0x8b, 0x1e, 0x04, 0x6f, 0x96, 0x20, 0x39, 0xed, 0xa4, 0x7d, + 0x29, 0xdb, 0x48, 0xce, 0x82, 0xdc, 0xd4, 0x02, 0x8d, 0x1d, 0x04, + 0x31, 0x5a, 0xc7, 0x4b, 0xf0, 0x6c, 0x61, 0x52, 0xd7, 0xb4, 0x51, + 0xc2, 0x81, 0x6c, 0xcd, 0xe1, 0xfb, 0xa7, 0xa1, 0xd2, 0x92, 0x76, + 0xcf, 0xb1, 0x0f, 0x37, 0x58, 0xa4, 0xf2, 0x52, 0x71, 0x67, 0x3f, + 0x0c, 0x88, 0x78, 0x80, 0x89, 0xc1, 0xc8, 0xb5, 0x1f, 0x92, 0x63, + 0xbe, 0xa7, 0x7a, 0x8a, 0x56, 0x2c, 0x1a, 0xa8, 0xa6, 0x9c, 0xb5, + 0x5d, 0xb3, 0x63, 0xd0, 0x13, 0x20, 0xa1, 0xeb, 0x91, 0x6c, 0xd0, + 0x8d, 0x7d, 0xaf, 0xdf, 0x0b, 0xe4, 0x17, 0xb9, 0x86, 0x9e, 0x38, + 0xb1, 0x94, 0x0c, 0x58, 0x8c, 0xe0, 0x55, 0xaa, 0x3b, 0x63, 0x6d, + 0x9a, 0x89, 0x60, 0xb8, 0x64, 0x2a, 0x92, 0xc6, 0x37, 0xf4, 0x7e, + 0x43, 0x43, 0xb7, 0x73, 0xe8, 0x01, 0xe7, 0x7f, 0x97, 0x0f, 0xd7, + 0xf2, 0x7b, 0x19, 0xfd, 0x1a, 0xd7, 0x8f, 0xc9, 0xfa, 0x85, 0x6b, + 0x7a, 0x9d, 0x9e, 0x89, 0xb6, 0xa6, 0x28, 0x99, 0x93, 0x88, 0x40, + 0xf7, 0x3e, 0xcd, 0x51, 0xa3, 0xca, 0xea, 0xef, 0x79, 0x47, 0x21, + 0xb5, 0xfe, 0x32, 0xe2, 0xc7, 0xc3, 0x51, 0x6f, 0xbe, 0x80, 0x74, + 0xf0, 0xa4, 0xc3, 0x3a, 0xf2, 0x4f, 0xe9, 0x5f, 0xdf, 0x19, 0x0a, + 0xf2, 0x3b, 0x13, 0x43, 0xac, 0x31, 0xa4, 0xb3, 0xe7, 0xeb, 0xfc, + 0x18, 0xd6, 0x01, 0xa9, 0xf3, 0x2a, 0x8f, 0x36, 0x0e, 0xeb, 0xb4, + 0xb1, 0xbc, 0xb7, 0x4c, 0xc9, 0x6b, 0xbf, 0xa1, 0xf3, 0xd9, 0xf4, + 0xed, 0xe2, 0xf0, 0xe3, 0xed, 0x64, 0x9e, 0x3d, 0x2f, 0x96, 0x52, + 0x4f, 0x80, 0x53, 0x8b, 0x30, 0x82, 0x05, 0x69, 0x30, 0x82, 0x03, + 0x51, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0x92, 0xb8, + 0x88, 0xdb, 0xb0, 0x8a, 0xc1, 0x63, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, + 0x52, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x53, 0x4b, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, + 0x07, 0x13, 0x0a, 0x42, 0x72, 0x61, 0x74, 0x69, 0x73, 0x6c, 0x61, + 0x76, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x13, 0x0a, 0x44, 0x69, 0x73, 0x69, 0x67, 0x20, 0x61, 0x2e, 0x73, + 0x2e, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, + 0x10, 0x43, 0x41, 0x20, 0x44, 0x69, 0x73, 0x69, 0x67, 0x20, 0x52, + 0x6f, 0x6f, 0x74, 0x20, 0x52, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x31, + 0x32, 0x30, 0x37, 0x31, 0x39, 0x30, 0x39, 0x31, 0x35, 0x33, 0x30, + 0x5a, 0x17, 0x0d, 0x34, 0x32, 0x30, 0x37, 0x31, 0x39, 0x30, 0x39, + 0x31, 0x35, 0x33, 0x30, 0x5a, 0x30, 0x52, 0x31, 0x0b, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x53, 0x4b, 0x31, 0x13, + 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x42, 0x72, + 0x61, 0x74, 0x69, 0x73, 0x6c, 0x61, 0x76, 0x61, 0x31, 0x13, 0x30, + 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x44, 0x69, 0x73, + 0x69, 0x67, 0x20, 0x61, 0x2e, 0x73, 0x2e, 0x31, 0x19, 0x30, 0x17, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x43, 0x41, 0x20, 0x44, + 0x69, 0x73, 0x69, 0x67, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x52, + 0x32, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, + 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, + 0x00, 0xa2, 0xa3, 0xc4, 0x00, 0x09, 0xd6, 0x85, 0x5d, 0x2d, 0x6d, + 0x14, 0xf6, 0xc2, 0xc3, 0x73, 0x9e, 0x35, 0xc2, 0x71, 0x55, 0x7e, + 0x81, 0xfb, 0xab, 0x46, 0x50, 0xe0, 0xc1, 0x7c, 0x49, 0x78, 0xe6, + 0xab, 0x79, 0x58, 0x3c, 0xda, 0xff, 0x7c, 0x1c, 0x9f, 0xd8, 0x97, + 0x02, 0x78, 0x3e, 0x6b, 0x41, 0x04, 0xe9, 0x41, 0xbd, 0xbe, 0x03, + 0x2c, 0x45, 0xf6, 0x2f, 0x64, 0xd4, 0xab, 0x5d, 0xa3, 0x47, 0x3d, + 0x64, 0x9b, 0xe9, 0x68, 0x9a, 0xc6, 0xcc, 0x1b, 0x3f, 0xba, 0xbe, + 0xb2, 0x8b, 0x34, 0x02, 0x2e, 0x98, 0x55, 0x19, 0xfc, 0x8c, 0x6f, + 0xaa, 0x5f, 0xda, 0x4c, 0xce, 0x4d, 0x03, 0x21, 0xa3, 0xd8, 0xd2, + 0x34, 0x93, 0x56, 0x96, 0xcb, 0x4c, 0x0c, 0x00, 0x16, 0x3c, 0x5f, + 0x1a, 0xcd, 0xc8, 0xc7, 0x6c, 0xa6, 0xad, 0xd3, 0x31, 0xa7, 0xbc, + 0xe8, 0xe5, 0xe1, 0x66, 0xd6, 0xd2, 0xfb, 0x03, 0xb4, 0x41, 0x65, + 0xc9, 0x10, 0xae, 0x0e, 0x05, 0x63, 0xc6, 0x80, 0x6a, 0x69, 0x30, + 0xfd, 0xd2, 0xee, 0x90, 0xef, 0x0d, 0x27, 0xdf, 0x9f, 0x95, 0x73, + 0xf4, 0xe1, 0x25, 0xda, 0x6c, 0x16, 0xde, 0x41, 0x38, 0x34, 0xea, + 0x8b, 0xfc, 0xd1, 0xe8, 0x04, 0x14, 0x61, 0x2d, 0x41, 0x7e, 0xac, + 0xc7, 0x77, 0x4e, 0xcb, 0x51, 0x54, 0xfb, 0x5e, 0x92, 0x18, 0x1b, + 0x04, 0x5a, 0x68, 0xc6, 0xc9, 0xc4, 0xfa, 0xb7, 0x13, 0xa0, 0x98, + 0xb7, 0x11, 0x2b, 0xb7, 0xd6, 0x57, 0xcc, 0x7c, 0x9e, 0x17, 0xd1, + 0xcb, 0x25, 0xfe, 0x86, 0x4e, 0x24, 0x2e, 0x56, 0x0c, 0x78, 0x4d, + 0x9e, 0x01, 0x12, 0xa6, 0x2b, 0xa7, 0x01, 0x65, 0x6e, 0x7c, 0x62, + 0x1d, 0x84, 0x84, 0xdf, 0xea, 0xc0, 0x6b, 0xb5, 0xa5, 0x2a, 0x95, + 0x83, 0xc3, 0x53, 0x11, 0x0c, 0x73, 0x1d, 0x0b, 0xb2, 0x46, 0x90, + 0xd1, 0x42, 0x3a, 0xce, 0x40, 0x6e, 0x95, 0xad, 0xff, 0xc6, 0x94, + 0xad, 0x6e, 0x97, 0x84, 0x8e, 0x7d, 0x6f, 0x9e, 0x8a, 0x80, 0x0d, + 0x49, 0x6d, 0x73, 0xe2, 0x7b, 0x92, 0x1e, 0xc3, 0xf3, 0xc1, 0xf3, + 0xeb, 0x2e, 0x05, 0x6f, 0xd9, 0x1b, 0xcf, 0x37, 0x76, 0x04, 0xc8, + 0xb4, 0x5a, 0xe4, 0x17, 0xa7, 0xcb, 0xdd, 0x76, 0x1f, 0xd0, 0x19, + 0x76, 0xe8, 0x2c, 0x05, 0xb3, 0xd6, 0x9c, 0x34, 0xd8, 0x96, 0xdc, + 0x61, 0x87, 0x91, 0x05, 0xe4, 0x44, 0x08, 0x33, 0xc1, 0xda, 0xb9, + 0x08, 0x65, 0xd4, 0xae, 0xb2, 0x36, 0x0d, 0xeb, 0xba, 0x38, 0xba, + 0x0c, 0xe5, 0x9b, 0x9e, 0xeb, 0x8d, 0x66, 0xdd, 0x99, 0xcf, 0xd6, + 0x89, 0x41, 0xf6, 0x04, 0x92, 0x8a, 0x29, 0x29, 0x6d, 0x6b, 0x3a, + 0x1c, 0xe7, 0x75, 0x7d, 0x02, 0x71, 0x0e, 0xf3, 0xc0, 0xe7, 0xbd, + 0xcb, 0x19, 0xdd, 0x9d, 0x60, 0xb2, 0xc2, 0x66, 0x60, 0xb6, 0xb1, + 0x04, 0xee, 0xc9, 0xe6, 0x86, 0xb9, 0x9a, 0x66, 0x40, 0xa8, 0xe7, + 0x11, 0xed, 0x81, 0x45, 0x03, 0x8b, 0xf6, 0x67, 0x59, 0xe8, 0xc1, + 0x06, 0x11, 0xbd, 0xdd, 0xcf, 0x80, 0x02, 0x4f, 0x65, 0x40, 0x78, + 0x5c, 0x47, 0x50, 0xc8, 0x9b, 0xe6, 0x1f, 0x81, 0x7b, 0xe4, 0x44, + 0xa8, 0x5b, 0x85, 0x9a, 0xe2, 0xde, 0x5a, 0xd5, 0xc7, 0xf9, 0x3a, + 0x44, 0x66, 0x4b, 0xe4, 0x32, 0x54, 0x7c, 0xe4, 0x6c, 0x9c, 0xb3, + 0x0e, 0x3d, 0x17, 0xa2, 0xb2, 0x34, 0x12, 0xd6, 0x7e, 0xb2, 0xa8, + 0x49, 0xbb, 0xd1, 0x7a, 0x28, 0x40, 0xbe, 0xa2, 0x16, 0x1f, 0xdf, + 0xe4, 0x37, 0x1f, 0x11, 0x73, 0xfb, 0x90, 0x0a, 0x65, 0x43, 0xa2, + 0x0d, 0x7c, 0xf8, 0x06, 0x01, 0x55, 0x33, 0x7d, 0xb0, 0x0d, 0xb8, + 0xf4, 0xf5, 0xae, 0xa5, 0x42, 0x57, 0x7c, 0x36, 0x11, 0x8c, 0x7b, + 0x5e, 0xc4, 0x03, 0x9d, 0x8c, 0x79, 0x9d, 0x02, 0x03, 0x01, 0x00, + 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, + 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, + 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, + 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, + 0x0e, 0x04, 0x16, 0x04, 0x14, 0xb5, 0x99, 0xf8, 0xaf, 0xb0, 0x94, + 0xf5, 0xe3, 0x20, 0xd6, 0x0a, 0xad, 0xce, 0x4e, 0x56, 0xa4, 0x2e, + 0x6e, 0x42, 0xed, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, + 0x00, 0x26, 0x06, 0x5e, 0x70, 0xe7, 0x65, 0x33, 0xc8, 0x82, 0x6e, + 0xd9, 0x9c, 0x17, 0x3a, 0x1b, 0x7a, 0x66, 0xb2, 0x01, 0xf6, 0x78, + 0x3b, 0x69, 0x5e, 0x2f, 0xea, 0xff, 0x4e, 0xf9, 0x28, 0xc3, 0x98, + 0x2a, 0x61, 0x4c, 0xb4, 0x24, 0x12, 0x8a, 0x7d, 0x6d, 0x11, 0x14, + 0xf7, 0x9c, 0xb5, 0xca, 0xe6, 0xbc, 0x9e, 0x27, 0x8e, 0x4c, 0x19, + 0xc8, 0xa9, 0xbd, 0x7a, 0xc0, 0xd7, 0x36, 0x0e, 0x6d, 0x85, 0x72, + 0x6e, 0xa8, 0xc6, 0xa2, 0x6d, 0xf6, 0xfa, 0x73, 0x63, 0x7f, 0xbc, + 0x6e, 0x79, 0x08, 0x1c, 0x9d, 0x8a, 0x9f, 0x1a, 0x8a, 0x53, 0xa6, + 0xd8, 0xbb, 0xd9, 0x35, 0x55, 0xb1, 0x11, 0xc5, 0xa9, 0x03, 0xb3, + 0x56, 0x3b, 0xb9, 0x84, 0x93, 0x22, 0x5e, 0x7e, 0xc1, 0xf6, 0x12, + 0x52, 0x8b, 0xea, 0x2c, 0x67, 0xbc, 0xfe, 0x36, 0x4c, 0xf5, 0xb8, + 0xcf, 0xd1, 0xb3, 0x49, 0x92, 0x3b, 0xd3, 0x29, 0x0e, 0x99, 0x1b, + 0x96, 0xf7, 0x61, 0xb8, 0x3b, 0xc4, 0x2b, 0xb6, 0x78, 0x6c, 0xb4, + 0x23, 0x6f, 0xf0, 0xfd, 0xd3, 0xb2, 0x5e, 0x75, 0x1f, 0x99, 0x95, + 0xa8, 0xac, 0xf6, 0xda, 0xe1, 0xc5, 0x31, 0x7b, 0xfb, 0xd1, 0x46, + 0xb3, 0xd2, 0xbc, 0x67, 0xb4, 0x62, 0x54, 0xba, 0x09, 0xf7, 0x63, + 0xb0, 0x93, 0xa2, 0x9a, 0xf9, 0xe9, 0x52, 0x2e, 0x8b, 0x60, 0x12, + 0xab, 0xfc, 0xf5, 0x60, 0x56, 0xef, 0x10, 0x5c, 0x8b, 0xc4, 0x1a, + 0x42, 0xdc, 0x83, 0x5b, 0x64, 0x0e, 0xcb, 0xb5, 0xbc, 0xd6, 0x4f, + 0xc1, 0x7c, 0x3c, 0x6e, 0x8d, 0x13, 0x6d, 0xfb, 0x7b, 0xeb, 0x30, + 0xd0, 0xdc, 0x4d, 0xaf, 0xc5, 0xd5, 0xb6, 0xa5, 0x4c, 0x5b, 0x71, + 0xc9, 0xe8, 0x31, 0xbe, 0xe8, 0x38, 0x06, 0x48, 0xa1, 0x1a, 0xe2, + 0xea, 0xd2, 0xde, 0x12, 0x39, 0x58, 0x1a, 0xff, 0x80, 0x0e, 0x82, + 0x75, 0xe6, 0xb7, 0xc9, 0x07, 0x6c, 0x0e, 0xef, 0xff, 0x38, 0xf1, + 0x98, 0x71, 0xc4, 0xb7, 0x7f, 0x0e, 0x15, 0xd0, 0x25, 0x69, 0xbd, + 0x22, 0x9d, 0x2b, 0xed, 0x05, 0xf6, 0x46, 0x47, 0xac, 0xed, 0xc0, + 0xf0, 0xd4, 0x3b, 0xe2, 0xec, 0xee, 0x96, 0x5b, 0x90, 0x13, 0x4e, + 0x1e, 0x56, 0x3a, 0xeb, 0xb0, 0xef, 0x96, 0xbb, 0x96, 0x23, 0x11, + 0xba, 0xf2, 0x43, 0x86, 0x74, 0x64, 0x95, 0xc8, 0x28, 0x75, 0xdf, + 0x1d, 0x35, 0xba, 0xd2, 0x37, 0x83, 0x38, 0x53, 0x38, 0x36, 0x3b, + 0xcf, 0x6c, 0xe9, 0xf9, 0x6b, 0x0e, 0xd0, 0xfb, 0x04, 0xe8, 0x4f, + 0x77, 0xd7, 0x65, 0x01, 0x78, 0x86, 0x0c, 0x7a, 0x3e, 0x21, 0x62, + 0xf1, 0x7f, 0x63, 0x71, 0x0c, 0xc9, 0x9f, 0x44, 0xdb, 0xa8, 0x27, + 0xa2, 0x75, 0xbe, 0x6e, 0x81, 0x3e, 0xd7, 0xc0, 0xeb, 0x1b, 0x98, + 0x0f, 0x70, 0x5c, 0x34, 0xb2, 0x8a, 0xcc, 0xc0, 0x85, 0x18, 0xeb, + 0x6e, 0x7a, 0xb3, 0xf7, 0x5a, 0xa1, 0x07, 0xbf, 0xa9, 0x42, 0x92, + 0xf3, 0x60, 0x22, 0x97, 0xe4, 0x14, 0xa1, 0x07, 0x9b, 0x4e, 0x76, + 0xc0, 0x8e, 0x7d, 0xfd, 0xa4, 0x25, 0xc7, 0x47, 0xed, 0xff, 0x1f, + 0x73, 0xac, 0xcc, 0xc3, 0xa5, 0xe9, 0x6f, 0x0a, 0x8e, 0x9b, 0x65, + 0xc2, 0x50, 0x85, 0xb5, 0xa3, 0xa0, 0x53, 0x12, 0xcc, 0x55, 0x87, + 0x61, 0xf3, 0x81, 0xae, 0x10, 0x46, 0x61, 0xbd, 0x44, 0x21, 0xb8, + 0xc2, 0x3d, 0x74, 0xcf, 0x7e, 0x24, 0x35, 0xfa, 0x1c, 0x07, 0x0e, + 0x9b, 0x3d, 0x22, 0xca, 0xef, 0x31, 0x2f, 0x8c, 0xac, 0x12, 0xbd, + 0xef, 0x40, 0x28, 0xfc, 0x29, 0x67, 0x9f, 0xb2, 0x13, 0x4f, 0x66, + 0x24, 0xc4, 0x53, 0x19, 0xe9, 0x1e, 0x29, 0x15, 0xef, 0xe6, 0x6d, + 0xb0, 0x7f, 0x2d, 0x67, 0xfd, 0xf3, 0x6c, 0x1b, 0x75, 0x46, 0xa3, + 0xe5, 0x4a, 0x17, 0xe9, 0xa4, 0xd7, 0x0b, 0x30, 0x82, 0x07, 0xd3, + 0x30, 0x82, 0x05, 0xbb, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, + 0x5e, 0xc3, 0xb7, 0xa6, 0x43, 0x7f, 0xa4, 0xe0, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x30, 0x42, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x09, 0x41, 0x43, 0x43, 0x56, 0x52, 0x41, 0x49, 0x5a, + 0x31, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, + 0x07, 0x50, 0x4b, 0x49, 0x41, 0x43, 0x43, 0x56, 0x31, 0x0d, 0x30, + 0x0b, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x04, 0x41, 0x43, 0x43, + 0x56, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x45, 0x53, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x31, 0x30, 0x35, + 0x30, 0x35, 0x30, 0x39, 0x33, 0x37, 0x33, 0x37, 0x5a, 0x17, 0x0d, + 0x33, 0x30, 0x31, 0x32, 0x33, 0x31, 0x30, 0x39, 0x33, 0x37, 0x33, + 0x37, 0x5a, 0x30, 0x42, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x0c, 0x09, 0x41, 0x43, 0x43, 0x56, 0x52, 0x41, 0x49, + 0x5a, 0x31, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0b, + 0x0c, 0x07, 0x50, 0x4b, 0x49, 0x41, 0x43, 0x43, 0x56, 0x31, 0x0d, + 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x04, 0x41, 0x43, + 0x43, 0x56, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x45, 0x53, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, + 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, + 0x82, 0x02, 0x01, 0x00, 0x9b, 0xa9, 0xab, 0xbf, 0x61, 0x4a, 0x97, + 0xaf, 0x2f, 0x97, 0x66, 0x9a, 0x74, 0x5f, 0xd0, 0xd9, 0x96, 0xfd, + 0xcf, 0xe2, 0xe4, 0x66, 0xef, 0x1f, 0x1f, 0x47, 0x33, 0xc2, 0x44, + 0xa3, 0xdf, 0x9a, 0xde, 0x1f, 0xb5, 0x54, 0xdd, 0x15, 0x7c, 0x69, + 0x35, 0x11, 0x6f, 0xbb, 0xc8, 0x0c, 0x8e, 0x6a, 0x18, 0x1e, 0xd8, + 0x8f, 0xd9, 0x16, 0xbc, 0x10, 0x48, 0x36, 0x5c, 0xf0, 0x63, 0xb3, + 0x90, 0x5a, 0x5c, 0x24, 0x37, 0xd7, 0xa3, 0xd6, 0xcb, 0x09, 0x71, + 0xb9, 0xf1, 0x01, 0x72, 0x84, 0xb0, 0x7d, 0xdb, 0x4d, 0x80, 0xcd, + 0xfc, 0xd3, 0x6f, 0xc9, 0xf8, 0xda, 0xb6, 0x0e, 0x82, 0xd2, 0x45, + 0x85, 0xa8, 0x1b, 0x68, 0xa8, 0x3d, 0xe8, 0xf4, 0x44, 0x6c, 0xbd, + 0xa1, 0xc2, 0xcb, 0x03, 0xbe, 0x8c, 0x3e, 0x13, 0x00, 0x84, 0xdf, + 0x4a, 0x48, 0xc0, 0xe3, 0x22, 0x0a, 0xe8, 0xe9, 0x37, 0xa7, 0x18, + 0x4c, 0xb1, 0x09, 0x0d, 0x23, 0x56, 0x7f, 0x04, 0x4d, 0xd9, 0x17, + 0x84, 0x18, 0xa5, 0xc8, 0xda, 0x40, 0x94, 0x73, 0xeb, 0xce, 0x0e, + 0x57, 0x3c, 0x03, 0x81, 0x3a, 0x9d, 0x0a, 0xa1, 0x57, 0x43, 0x69, + 0xac, 0x57, 0x6d, 0x79, 0x90, 0x78, 0xe5, 0xb5, 0xb4, 0x3b, 0xd8, + 0xbc, 0x4c, 0x8d, 0x28, 0xa1, 0xa7, 0xa3, 0xa7, 0xba, 0x02, 0x4e, + 0x25, 0xd1, 0x2a, 0xae, 0xed, 0xae, 0x03, 0x22, 0xb8, 0x6b, 0x20, + 0x0f, 0x30, 0x28, 0x54, 0x95, 0x7f, 0xe0, 0xee, 0xce, 0x0a, 0x66, + 0x9d, 0xd1, 0x40, 0x2d, 0x6e, 0x22, 0xaf, 0x9d, 0x1a, 0xc1, 0x05, + 0x19, 0xd2, 0x6f, 0xc0, 0xf2, 0x9f, 0xf8, 0x7b, 0xb3, 0x02, 0x42, + 0xfb, 0x50, 0xa9, 0x1d, 0x2d, 0x93, 0x0f, 0x23, 0xab, 0xc6, 0xc1, + 0x0f, 0x92, 0xff, 0xd0, 0xa2, 0x15, 0xf5, 0x53, 0x09, 0x71, 0x1c, + 0xff, 0x45, 0x13, 0x84, 0xe6, 0x26, 0x5e, 0xf8, 0xe0, 0x88, 0x1c, + 0x0a, 0xfc, 0x16, 0xb6, 0xa8, 0x73, 0x06, 0xb8, 0xf0, 0x63, 0x84, + 0x02, 0xa0, 0xc6, 0x5a, 0xec, 0xe7, 0x74, 0xdf, 0x70, 0xae, 0xa3, + 0x83, 0x25, 0xea, 0xd6, 0xc7, 0x97, 0x87, 0x93, 0xa7, 0xc6, 0x8a, + 0x8a, 0x33, 0x97, 0x60, 0x37, 0x10, 0x3e, 0x97, 0x3e, 0x6e, 0x29, + 0x15, 0xd6, 0xa1, 0x0f, 0xd1, 0x88, 0x2c, 0x12, 0x9f, 0x6f, 0xaa, + 0xa4, 0xc6, 0x42, 0xeb, 0x41, 0xa2, 0xe3, 0x95, 0x43, 0xd3, 0x01, + 0x85, 0x6d, 0x8e, 0xbb, 0x3b, 0xf3, 0x23, 0x36, 0xc7, 0xfe, 0x3b, + 0xe0, 0xa1, 0x25, 0x07, 0x48, 0xab, 0xc9, 0x89, 0x74, 0xff, 0x08, + 0x8f, 0x80, 0xbf, 0xc0, 0x96, 0x65, 0xf3, 0xee, 0xec, 0x4b, 0x68, + 0xbd, 0x9d, 0x88, 0xc3, 0x31, 0xb3, 0x40, 0xf1, 0xe8, 0xcf, 0xf6, + 0x38, 0xbb, 0x9c, 0xe4, 0xd1, 0x7f, 0xd4, 0xe5, 0x58, 0x9b, 0x7c, + 0xfa, 0xd4, 0xf3, 0x0e, 0x9b, 0x75, 0x91, 0xe4, 0xba, 0x52, 0x2e, + 0x19, 0x7e, 0xd1, 0xf5, 0xcd, 0x5a, 0x19, 0xfc, 0xba, 0x06, 0xf6, + 0xfb, 0x52, 0xa8, 0x4b, 0x99, 0x04, 0xdd, 0xf8, 0xf9, 0xb4, 0x8b, + 0x50, 0xa3, 0x4e, 0x62, 0x89, 0xf0, 0x87, 0x24, 0xfa, 0x83, 0x42, + 0xc1, 0x87, 0xfa, 0xd5, 0x2d, 0x29, 0x2a, 0x5a, 0x71, 0x7a, 0x64, + 0x6a, 0xd7, 0x27, 0x60, 0x63, 0x0d, 0xdb, 0xce, 0x49, 0xf5, 0x8d, + 0x1f, 0x90, 0x89, 0x32, 0x17, 0xf8, 0x73, 0x43, 0xb8, 0xd2, 0x5a, + 0x93, 0x86, 0x61, 0xd6, 0xe1, 0x75, 0x0a, 0xea, 0x79, 0x66, 0x76, + 0x88, 0x4f, 0x71, 0xeb, 0x04, 0x25, 0xd6, 0x0a, 0x5a, 0x7a, 0x93, + 0xe5, 0xb9, 0x4b, 0x17, 0x40, 0x0f, 0xb1, 0xb6, 0xb9, 0xf5, 0xde, + 0x4f, 0xdc, 0xe0, 0xb3, 0xac, 0x3b, 0x11, 0x70, 0x60, 0x84, 0x4a, + 0x43, 0x6e, 0x99, 0x20, 0xc0, 0x29, 0x71, 0x0a, 0xc0, 0x65, 0x02, + 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x02, 0xcb, 0x30, 0x82, 0x02, + 0xc7, 0x30, 0x7d, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, + 0x01, 0x01, 0x04, 0x71, 0x30, 0x6f, 0x30, 0x4c, 0x06, 0x08, 0x2b, + 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x40, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x61, 0x63, + 0x63, 0x76, 0x2e, 0x65, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2f, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, + 0x6f, 0x73, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x64, 0x6f, 0x73, 0x2f, 0x72, 0x61, 0x69, 0x7a, 0x61, 0x63, + 0x63, 0x76, 0x31, 0x2e, 0x63, 0x72, 0x74, 0x30, 0x1f, 0x06, 0x08, + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x13, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6f, 0x63, 0x73, 0x70, 0x2e, + 0x61, 0x63, 0x63, 0x76, 0x2e, 0x65, 0x73, 0x30, 0x1d, 0x06, 0x03, + 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xd2, 0x87, 0xb4, 0xe3, + 0xdf, 0x37, 0x27, 0x93, 0x55, 0xf6, 0x56, 0xea, 0x81, 0xe5, 0x36, + 0xcc, 0x8c, 0x1e, 0x3f, 0xbd, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, + 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, + 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, + 0x80, 0x14, 0xd2, 0x87, 0xb4, 0xe3, 0xdf, 0x37, 0x27, 0x93, 0x55, + 0xf6, 0x56, 0xea, 0x81, 0xe5, 0x36, 0xcc, 0x8c, 0x1e, 0x3f, 0xbd, + 0x30, 0x82, 0x01, 0x73, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x82, + 0x01, 0x6a, 0x30, 0x82, 0x01, 0x66, 0x30, 0x82, 0x01, 0x62, 0x06, + 0x04, 0x55, 0x1d, 0x20, 0x00, 0x30, 0x82, 0x01, 0x58, 0x30, 0x82, + 0x01, 0x22, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, + 0x02, 0x30, 0x82, 0x01, 0x14, 0x1e, 0x82, 0x01, 0x10, 0x00, 0x41, + 0x00, 0x75, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x69, 0x00, + 0x64, 0x00, 0x61, 0x00, 0x64, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, + 0x00, 0x20, 0x00, 0x43, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, + 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x63, + 0x00, 0x69, 0x00, 0xf3, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x52, 0x00, + 0x61, 0x00, 0xed, 0x00, 0x7a, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, + 0x00, 0x20, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x20, 0x00, 0x41, 0x00, + 0x43, 0x00, 0x43, 0x00, 0x56, 0x00, 0x20, 0x00, 0x28, 0x00, 0x41, + 0x00, 0x67, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x69, 0x00, + 0x61, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x00, 0x54, + 0x00, 0x65, 0x00, 0x63, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x6c, 0x00, + 0x6f, 0x00, 0x67, 0x00, 0xed, 0x00, 0x61, 0x00, 0x20, 0x00, 0x79, + 0x00, 0x20, 0x00, 0x43, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, + 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x63, + 0x00, 0x69, 0x00, 0xf3, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x45, 0x00, + 0x6c, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x72, 0x00, 0xf3, + 0x00, 0x6e, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x2c, 0x00, + 0x20, 0x00, 0x43, 0x00, 0x49, 0x00, 0x46, 0x00, 0x20, 0x00, 0x51, + 0x00, 0x34, 0x00, 0x36, 0x00, 0x30, 0x00, 0x31, 0x00, 0x31, 0x00, + 0x35, 0x00, 0x36, 0x00, 0x45, 0x00, 0x29, 0x00, 0x2e, 0x00, 0x20, + 0x00, 0x43, 0x00, 0x50, 0x00, 0x53, 0x00, 0x20, 0x00, 0x65, 0x00, + 0x6e, 0x00, 0x20, 0x00, 0x68, 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, + 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x77, 0x00, 0x77, 0x00, + 0x77, 0x00, 0x2e, 0x00, 0x61, 0x00, 0x63, 0x00, 0x63, 0x00, 0x76, + 0x00, 0x2e, 0x00, 0x65, 0x00, 0x73, 0x30, 0x30, 0x06, 0x08, 0x2b, + 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x24, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x61, 0x63, + 0x63, 0x76, 0x2e, 0x65, 0x73, 0x2f, 0x6c, 0x65, 0x67, 0x69, 0x73, + 0x6c, 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x2e, 0x68, 0x74, + 0x6d, 0x30, 0x55, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x4e, 0x30, + 0x4c, 0x30, 0x4a, 0xa0, 0x48, 0xa0, 0x46, 0x86, 0x44, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x61, 0x63, + 0x63, 0x76, 0x2e, 0x65, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2f, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, + 0x6f, 0x73, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x64, 0x6f, 0x73, 0x2f, 0x72, 0x61, 0x69, 0x7a, 0x61, 0x63, + 0x63, 0x76, 0x31, 0x5f, 0x64, 0x65, 0x72, 0x2e, 0x63, 0x72, 0x6c, + 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, + 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x17, 0x06, 0x03, 0x55, 0x1d, + 0x11, 0x04, 0x10, 0x30, 0x0e, 0x81, 0x0c, 0x61, 0x63, 0x63, 0x76, + 0x40, 0x61, 0x63, 0x63, 0x76, 0x2e, 0x65, 0x73, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, + 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x97, 0x31, 0x02, 0x9f, 0xe7, + 0xfd, 0x43, 0x67, 0x48, 0x44, 0x14, 0xe4, 0x29, 0x87, 0xed, 0x4c, + 0x28, 0x66, 0xd0, 0x8f, 0x35, 0xda, 0x4d, 0x61, 0xb7, 0x4a, 0x97, + 0x4d, 0xb5, 0xdb, 0x90, 0xe0, 0x05, 0x2e, 0x0e, 0xc6, 0x79, 0xd0, + 0xf2, 0x97, 0x69, 0x0f, 0xbd, 0x04, 0x47, 0xd9, 0xbe, 0xdb, 0xb5, + 0x29, 0xda, 0x9b, 0xd9, 0xae, 0xa9, 0x99, 0xd5, 0xd3, 0x3c, 0x30, + 0x93, 0xf5, 0x8d, 0xa1, 0xa8, 0xfc, 0x06, 0x8d, 0x44, 0xf4, 0xca, + 0x16, 0x95, 0x7c, 0x33, 0xdc, 0x62, 0x8b, 0xa8, 0x37, 0xf8, 0x27, + 0xd8, 0x09, 0x2d, 0x1b, 0xef, 0xc8, 0x14, 0x27, 0x20, 0xa9, 0x64, + 0x44, 0xff, 0x2e, 0xd6, 0x75, 0xaa, 0x6c, 0x4d, 0x60, 0x40, 0x19, + 0x49, 0x43, 0x54, 0x63, 0xda, 0xe2, 0xcc, 0xba, 0x66, 0xe5, 0x4f, + 0x44, 0x7a, 0x5b, 0xd9, 0x6a, 0x81, 0x2b, 0x40, 0xd5, 0x7f, 0xf9, + 0x01, 0x27, 0x58, 0x2c, 0xc8, 0xed, 0x48, 0x91, 0x7c, 0x3f, 0xa6, + 0x00, 0xcf, 0xc4, 0x29, 0x73, 0x11, 0x36, 0xde, 0x86, 0x19, 0x3e, + 0x9d, 0xee, 0x19, 0x8a, 0x1b, 0xd5, 0xb0, 0xed, 0x8e, 0x3d, 0x9c, + 0x2a, 0xc0, 0x0d, 0xd8, 0x3d, 0x66, 0xe3, 0x3c, 0x0d, 0xbd, 0xd5, + 0x94, 0x5c, 0xe2, 0xe2, 0xa7, 0x35, 0x1b, 0x04, 0x00, 0xf6, 0x3f, + 0x5a, 0x8d, 0xea, 0x43, 0xbd, 0x5f, 0x89, 0x1d, 0xa9, 0xc1, 0xb0, + 0xcc, 0x99, 0xe2, 0x4d, 0x00, 0x0a, 0xda, 0xc9, 0x27, 0x5b, 0xe7, + 0x13, 0x90, 0x5c, 0xe4, 0xf5, 0x33, 0xa2, 0x55, 0x6d, 0xdc, 0xe0, + 0x09, 0x4d, 0x2f, 0xb1, 0x26, 0x5b, 0x27, 0x75, 0x00, 0x09, 0xc4, + 0x62, 0x77, 0x29, 0x08, 0x5f, 0x9e, 0x59, 0xac, 0xb6, 0x7e, 0xad, + 0x9f, 0x54, 0x30, 0x22, 0x03, 0xc1, 0x1e, 0x71, 0x64, 0xfe, 0xf9, + 0x38, 0x0a, 0x96, 0x18, 0xdd, 0x02, 0x14, 0xac, 0x23, 0xcb, 0x06, + 0x1c, 0x1e, 0xa4, 0x7d, 0x8d, 0x0d, 0xde, 0x27, 0x41, 0xe8, 0xad, + 0xda, 0x15, 0xb7, 0xb0, 0x23, 0xdd, 0x2b, 0xa8, 0xd3, 0xda, 0x25, + 0x87, 0xed, 0xe8, 0x55, 0x44, 0x4d, 0x88, 0xf4, 0x36, 0x7e, 0x84, + 0x9a, 0x78, 0xac, 0xf7, 0x0e, 0x56, 0x49, 0x0e, 0xd6, 0x33, 0x25, + 0xd6, 0x84, 0x50, 0x42, 0x6c, 0x20, 0x12, 0x1d, 0x2a, 0xd5, 0xbe, + 0xbc, 0xf2, 0x70, 0x81, 0xa4, 0x70, 0x60, 0xbe, 0x05, 0xb5, 0x9b, + 0x9e, 0x04, 0x44, 0xbe, 0x61, 0x23, 0xac, 0xe9, 0xa5, 0x24, 0x8c, + 0x11, 0x80, 0x94, 0x5a, 0xa2, 0xa2, 0xb9, 0x49, 0xd2, 0xc1, 0xdc, + 0xd1, 0xa7, 0xed, 0x31, 0x11, 0x2c, 0x9e, 0x19, 0xa6, 0xee, 0xe1, + 0x55, 0xe1, 0xc0, 0xea, 0xcf, 0x0d, 0x84, 0xe4, 0x17, 0xb7, 0xa2, + 0x7c, 0xa5, 0xde, 0x55, 0x25, 0x06, 0xee, 0xcc, 0xc0, 0x87, 0x5c, + 0x40, 0xda, 0xcc, 0x95, 0x3f, 0x55, 0xe0, 0x35, 0xc7, 0xb8, 0x84, + 0xbe, 0xb4, 0x5d, 0xcd, 0x7a, 0x83, 0x01, 0x72, 0xee, 0x87, 0xe6, + 0x5f, 0x1d, 0xae, 0xb5, 0x85, 0xc6, 0x26, 0xdf, 0xe6, 0xc1, 0x9a, + 0xe9, 0x1e, 0x02, 0x47, 0x9f, 0x2a, 0xa8, 0x6d, 0xa9, 0x5b, 0xcf, + 0xec, 0x45, 0x77, 0x7f, 0x98, 0x27, 0x9a, 0x32, 0x5d, 0x2a, 0xe3, + 0x84, 0xee, 0xc5, 0x98, 0x66, 0x2f, 0x96, 0x20, 0x1d, 0xdd, 0xd8, + 0xc3, 0x27, 0xd7, 0xb0, 0xf9, 0xfe, 0xd9, 0x7d, 0xcd, 0xd0, 0x9f, + 0x8f, 0x0b, 0x14, 0x58, 0x51, 0x9f, 0x2f, 0x8b, 0xc3, 0x38, 0x2d, + 0xde, 0xe8, 0x8f, 0xd6, 0x8d, 0x87, 0xa4, 0xf5, 0x56, 0x43, 0x16, + 0x99, 0x2c, 0xf4, 0xa4, 0x56, 0xb4, 0x34, 0xb8, 0x61, 0x37, 0xc9, + 0xc2, 0x58, 0x80, 0x1b, 0xa0, 0x97, 0xa1, 0xfc, 0x59, 0x8d, 0xe9, + 0x11, 0xf6, 0xd1, 0x0f, 0x4b, 0x55, 0x34, 0x46, 0x2a, 0x8b, 0x86, + 0x3b, 0x30, 0x82, 0x05, 0x41, 0x30, 0x82, 0x03, 0x29, 0xa0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x02, 0x0c, 0xbe, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, + 0x30, 0x51, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x54, 0x57, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x13, 0x09, 0x54, 0x41, 0x49, 0x57, 0x41, 0x4e, 0x2d, + 0x43, 0x41, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0b, + 0x13, 0x07, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x31, 0x1c, + 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x54, 0x57, + 0x43, 0x41, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, + 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, + 0x32, 0x30, 0x36, 0x32, 0x37, 0x30, 0x36, 0x32, 0x38, 0x33, 0x33, + 0x5a, 0x17, 0x0d, 0x33, 0x30, 0x31, 0x32, 0x33, 0x31, 0x31, 0x35, + 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x51, 0x31, 0x0b, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x54, 0x57, 0x31, 0x12, + 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x09, 0x54, 0x41, + 0x49, 0x57, 0x41, 0x4e, 0x2d, 0x43, 0x41, 0x31, 0x10, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x07, 0x52, 0x6f, 0x6f, 0x74, + 0x20, 0x43, 0x41, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x13, 0x54, 0x57, 0x43, 0x41, 0x20, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, + 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, + 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, + 0xb0, 0x05, 0xdb, 0xc8, 0xeb, 0x8c, 0xc4, 0x6e, 0x8a, 0x21, 0xef, + 0x8e, 0x4d, 0x9c, 0x71, 0x0a, 0x1f, 0x52, 0x70, 0xed, 0x6d, 0x82, + 0x9c, 0x97, 0xc5, 0xd7, 0x4c, 0x4e, 0x45, 0x49, 0xcb, 0x40, 0x42, + 0xb5, 0x12, 0x34, 0x6c, 0x19, 0xc2, 0x74, 0xa4, 0x31, 0x5f, 0x85, + 0x02, 0x97, 0xec, 0x43, 0x33, 0x0a, 0x53, 0xd2, 0x9c, 0x8c, 0x8e, + 0xb7, 0xb8, 0x79, 0xdb, 0x2b, 0xd5, 0x6a, 0xf2, 0x8e, 0x66, 0xc4, + 0xee, 0x2b, 0x01, 0x07, 0x92, 0xd4, 0xb3, 0xd0, 0x02, 0xdf, 0x50, + 0xf6, 0x55, 0xaf, 0x66, 0x0e, 0xcb, 0xe0, 0x47, 0x60, 0x2f, 0x2b, + 0x32, 0x39, 0x35, 0x52, 0x3a, 0x28, 0x83, 0xf8, 0x7b, 0x16, 0xc6, + 0x18, 0xb8, 0x62, 0xd6, 0x47, 0x25, 0x91, 0xce, 0xf0, 0x19, 0x12, + 0x4d, 0xad, 0x63, 0xf5, 0xd3, 0x3f, 0x75, 0x5f, 0x29, 0xf0, 0xa1, + 0x30, 0x1c, 0x2a, 0xa0, 0x98, 0xa6, 0x15, 0xbd, 0xee, 0xfd, 0x19, + 0x36, 0xf0, 0xe2, 0x91, 0x43, 0x8f, 0xfa, 0xca, 0xd6, 0x10, 0x27, + 0x49, 0x4c, 0xef, 0xdd, 0xc1, 0xf1, 0x85, 0x70, 0x9b, 0xca, 0xea, + 0xa8, 0x5a, 0x43, 0xfc, 0x6d, 0x86, 0x6f, 0x73, 0xe9, 0x37, 0x45, + 0xa9, 0xf0, 0x36, 0xc7, 0xcc, 0x88, 0x75, 0x1e, 0xbb, 0x6c, 0x06, + 0xff, 0x9b, 0x6b, 0x3e, 0x17, 0xec, 0x61, 0xaa, 0x71, 0x7c, 0xc6, + 0x1d, 0xa2, 0xf7, 0x49, 0xe9, 0x15, 0xb5, 0x3c, 0xd6, 0xa1, 0x61, + 0xf5, 0x11, 0xf7, 0x05, 0x6f, 0x1d, 0xfd, 0x11, 0xbe, 0xd0, 0x30, + 0x07, 0xc2, 0x29, 0xb0, 0x09, 0x4e, 0x26, 0xdc, 0xe3, 0xa2, 0xa8, + 0x91, 0x6a, 0x1f, 0xc2, 0x91, 0x45, 0x88, 0x5c, 0xe5, 0x98, 0xb8, + 0x71, 0xa5, 0x15, 0x19, 0xc9, 0x7c, 0x75, 0x11, 0xcc, 0x70, 0x74, + 0x4f, 0x2d, 0x9b, 0x1d, 0x91, 0x44, 0xfd, 0x56, 0x28, 0xa0, 0xfe, + 0xbb, 0x86, 0x6a, 0xc8, 0xfa, 0x5c, 0x0b, 0x58, 0xdc, 0xc6, 0x4b, + 0x76, 0xc8, 0xab, 0x22, 0xd9, 0x73, 0x0f, 0xa5, 0xf4, 0x5a, 0x02, + 0x89, 0x3f, 0x4f, 0x9e, 0x22, 0x82, 0xee, 0xa2, 0x74, 0x53, 0x2a, + 0x3d, 0x53, 0x27, 0x69, 0x1d, 0x6c, 0x8e, 0x32, 0x2c, 0x64, 0x00, + 0x26, 0x63, 0x61, 0x36, 0x4e, 0xa3, 0x46, 0xb7, 0x3f, 0x7d, 0xb3, + 0x2d, 0xac, 0x6d, 0x90, 0xa2, 0x95, 0xa2, 0xce, 0xcf, 0xda, 0x82, + 0xe7, 0x07, 0x34, 0x19, 0x96, 0xe9, 0xb8, 0x21, 0xaa, 0x29, 0x7e, + 0xa6, 0x38, 0xbe, 0x8e, 0x29, 0x4a, 0x21, 0x66, 0x79, 0x1f, 0xb3, + 0xc3, 0xb5, 0x09, 0x67, 0xde, 0xd6, 0xd4, 0x07, 0x46, 0xf3, 0x2a, + 0xda, 0xe6, 0x22, 0x37, 0x60, 0xcb, 0x81, 0xb6, 0x0f, 0xa0, 0x0f, + 0xe9, 0xc8, 0x95, 0x7f, 0xbf, 0x55, 0x91, 0x05, 0x7a, 0xcf, 0x3d, + 0x15, 0xc0, 0x6f, 0xde, 0x09, 0x94, 0x01, 0x83, 0xd7, 0x34, 0x1b, + 0xcc, 0x40, 0xa5, 0xf0, 0xb8, 0x9b, 0x67, 0xd5, 0x98, 0x91, 0x3b, + 0xa7, 0x84, 0x78, 0x95, 0x26, 0xa4, 0x5a, 0x08, 0xf8, 0x2b, 0x74, + 0xb4, 0x00, 0x04, 0x3c, 0xdf, 0xb8, 0x14, 0x8e, 0xe8, 0xdf, 0xa9, + 0x8d, 0x6c, 0x67, 0x92, 0x33, 0x1d, 0xc0, 0xb7, 0xd2, 0xec, 0x92, + 0xc8, 0xbe, 0x09, 0xbf, 0x2c, 0x29, 0x05, 0x6f, 0x02, 0x6b, 0x9e, + 0xef, 0xbc, 0xbf, 0x2a, 0xbc, 0x5b, 0xc0, 0x50, 0x8f, 0x41, 0x70, + 0x71, 0x87, 0xb2, 0x4d, 0xb7, 0x04, 0xa9, 0x84, 0xa3, 0x32, 0xaf, + 0xae, 0xee, 0x6b, 0x17, 0x8b, 0xb2, 0xb1, 0xfe, 0x6c, 0xe1, 0x90, + 0x8c, 0x88, 0xa8, 0x97, 0x48, 0xce, 0xc8, 0x4d, 0xcb, 0xf3, 0x06, + 0xcf, 0x5f, 0x6a, 0x0a, 0x42, 0xb1, 0x1e, 0x1e, 0x77, 0x2f, 0x8e, + 0xa0, 0xe6, 0x92, 0x0e, 0x06, 0xfc, 0x05, 0x22, 0xd2, 0x26, 0xe1, + 0x31, 0x51, 0x7d, 0x32, 0xdc, 0x0f, 0x02, 0x03, 0x01, 0x00, 0x01, + 0xa3, 0x23, 0x30, 0x21, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, + 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, + 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, + 0x01, 0x00, 0x5f, 0x34, 0x81, 0x76, 0xef, 0x96, 0x1d, 0xd5, 0xe5, + 0xb5, 0xd9, 0x02, 0x63, 0x84, 0x16, 0xc1, 0xae, 0xa0, 0x70, 0x51, + 0xa7, 0xf7, 0x4c, 0x47, 0x35, 0xc8, 0x0b, 0xd7, 0x28, 0x3d, 0x89, + 0x71, 0xd9, 0xaa, 0x33, 0x41, 0xea, 0x14, 0x1b, 0x6c, 0x21, 0x00, + 0xc0, 0x6c, 0x42, 0x19, 0x7e, 0x9f, 0x69, 0x5b, 0x20, 0x42, 0xdf, + 0xa2, 0xd2, 0xda, 0xc4, 0x7c, 0x97, 0x4b, 0x8d, 0xb0, 0xe8, 0xac, + 0xc8, 0xee, 0xa5, 0x69, 0x04, 0x99, 0x0a, 0x92, 0xa6, 0xab, 0x27, + 0x2e, 0x1a, 0x4d, 0x81, 0xbf, 0x84, 0xd4, 0x70, 0x1e, 0xad, 0x47, + 0xfe, 0xfd, 0x4a, 0x9d, 0x33, 0xe0, 0xf2, 0xb9, 0xc4, 0x45, 0x08, + 0x21, 0x0a, 0xda, 0x69, 0x69, 0x73, 0x72, 0x0d, 0xbe, 0x34, 0xfe, + 0x94, 0x8b, 0xad, 0xc3, 0x1e, 0x35, 0xd7, 0xa2, 0x83, 0xef, 0xe5, + 0x38, 0xc7, 0xa5, 0x85, 0x1f, 0xab, 0xcf, 0x34, 0xec, 0x3f, 0x28, + 0xfe, 0x0c, 0xf1, 0x57, 0x86, 0x4e, 0xc9, 0x55, 0xf7, 0x1c, 0xd4, + 0xd8, 0xa5, 0x7d, 0x06, 0x7a, 0x6f, 0xd5, 0xdf, 0x10, 0xdf, 0x81, + 0x4e, 0x21, 0x65, 0xb1, 0xb6, 0xe1, 0x17, 0x79, 0x95, 0x45, 0x06, + 0xce, 0x5f, 0xcc, 0xdc, 0x46, 0x89, 0x63, 0x68, 0x44, 0x8d, 0x93, + 0xf4, 0x64, 0x70, 0xa0, 0x3d, 0x9d, 0x28, 0x05, 0xc3, 0x39, 0x70, + 0xb8, 0x62, 0x7b, 0x20, 0xfd, 0xe4, 0xdb, 0xe9, 0x08, 0xa1, 0xb8, + 0x9e, 0x3d, 0x09, 0xc7, 0x4f, 0xfb, 0x2c, 0xf8, 0x93, 0x76, 0x41, + 0xde, 0x52, 0xe0, 0xe1, 0x57, 0xd2, 0x9d, 0x03, 0xbc, 0x77, 0x9e, + 0xfe, 0x9e, 0x29, 0x5e, 0xf7, 0xc1, 0x51, 0x60, 0x1f, 0xde, 0xda, + 0x0b, 0xb2, 0x2d, 0x75, 0xb7, 0x43, 0x48, 0x93, 0xe7, 0xf6, 0x79, + 0xc6, 0x84, 0x5d, 0x80, 0x59, 0x60, 0x94, 0xfc, 0x78, 0x98, 0x8f, + 0x3c, 0x93, 0x51, 0xed, 0x40, 0x90, 0x07, 0xdf, 0x64, 0x63, 0x24, + 0xcb, 0x4e, 0x71, 0x05, 0xa1, 0xd7, 0x94, 0x1a, 0x88, 0x32, 0xf1, + 0x22, 0x74, 0x22, 0xae, 0xa5, 0xa6, 0xd8, 0x12, 0x69, 0x4c, 0x60, + 0xa3, 0x02, 0xee, 0x2b, 0xec, 0xd4, 0x63, 0x92, 0x0b, 0x5e, 0xbe, + 0x2f, 0x76, 0x6b, 0xa3, 0xb6, 0x26, 0xbc, 0x8f, 0x03, 0xd8, 0x0a, + 0xf2, 0x4c, 0x64, 0x46, 0xbd, 0x39, 0x62, 0xe5, 0x96, 0xeb, 0x34, + 0x63, 0x11, 0x28, 0xcc, 0x95, 0xf1, 0xad, 0xef, 0xef, 0xdc, 0x80, + 0x58, 0x48, 0xe9, 0x4b, 0xb8, 0xea, 0x65, 0xac, 0xe9, 0xfc, 0x80, + 0xb5, 0xb5, 0xc8, 0x45, 0xf9, 0xac, 0xc1, 0x9f, 0xd9, 0xb9, 0xea, + 0x62, 0x88, 0x8e, 0xc4, 0xf1, 0x4b, 0x83, 0x12, 0xad, 0xe6, 0x8b, + 0x84, 0xd6, 0x9e, 0xc2, 0xeb, 0x83, 0x18, 0x9f, 0x6a, 0xbb, 0x1b, + 0x24, 0x60, 0x33, 0x70, 0xcc, 0xec, 0xf7, 0x32, 0xf3, 0x5c, 0xd9, + 0x79, 0x7d, 0xef, 0x9e, 0xa4, 0xfe, 0xc9, 0x23, 0xc3, 0x24, 0xee, + 0x15, 0x92, 0xb1, 0x3d, 0x91, 0x4f, 0x26, 0x86, 0xbd, 0x66, 0x73, + 0x24, 0x13, 0xea, 0xa4, 0xae, 0x63, 0xc1, 0xad, 0x7d, 0x84, 0x03, + 0x3c, 0x10, 0x78, 0x86, 0x1b, 0x79, 0xe3, 0xc4, 0xf3, 0xf2, 0x04, + 0x95, 0x20, 0xae, 0x23, 0x82, 0xc4, 0xb3, 0x3a, 0x00, 0x62, 0xbf, + 0xe6, 0x36, 0x24, 0xe1, 0x57, 0xba, 0xc7, 0x1e, 0x90, 0x75, 0xd5, + 0x5f, 0x3f, 0x95, 0x61, 0x2b, 0xc1, 0x3b, 0xcd, 0xe5, 0xb3, 0x68, + 0x61, 0xd0, 0x46, 0x26, 0xa9, 0x21, 0x52, 0x69, 0x2d, 0xeb, 0x2e, + 0xc7, 0xeb, 0x77, 0xce, 0xa6, 0x3a, 0xb5, 0x03, 0x33, 0x4f, 0x76, + 0xd1, 0xe7, 0x5c, 0x54, 0x01, 0x5d, 0xcb, 0x78, 0xf4, 0xc9, 0x0c, + 0xbf, 0xcf, 0x12, 0x8e, 0x17, 0x2d, 0x23, 0x68, 0x94, 0xe7, 0xab, + 0xfe, 0xa9, 0xb2, 0x2b, 0x06, 0xd0, 0x04, 0xcd, 0x30, 0x82, 0x05, + 0x38, 0x30, 0x82, 0x03, 0x20, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, + 0x11, 0x00, 0x95, 0xbe, 0x16, 0xa0, 0xf7, 0x2e, 0x46, 0xf1, 0x7b, + 0x39, 0x82, 0x72, 0xfa, 0x8b, 0xcd, 0x96, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, + 0x30, 0x37, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x0c, 0x0b, 0x54, 0x65, 0x6c, 0x69, 0x61, 0x53, 0x6f, 0x6e, 0x65, + 0x72, 0x61, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0c, 0x16, 0x54, 0x65, 0x6c, 0x69, 0x61, 0x53, 0x6f, 0x6e, 0x65, + 0x72, 0x61, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, + 0x76, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x37, 0x31, 0x30, 0x31, + 0x38, 0x31, 0x32, 0x30, 0x30, 0x35, 0x30, 0x5a, 0x17, 0x0d, 0x33, + 0x32, 0x31, 0x30, 0x31, 0x38, 0x31, 0x32, 0x30, 0x30, 0x35, 0x30, + 0x5a, 0x30, 0x37, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x0c, 0x0b, 0x54, 0x65, 0x6c, 0x69, 0x61, 0x53, 0x6f, 0x6e, + 0x65, 0x72, 0x61, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x16, 0x54, 0x65, 0x6c, 0x69, 0x61, 0x53, 0x6f, 0x6e, + 0x65, 0x72, 0x61, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, + 0x20, 0x76, 0x31, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, + 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, + 0x02, 0x01, 0x00, 0xc2, 0xbe, 0xeb, 0x27, 0xf0, 0x21, 0xa3, 0xf3, + 0x69, 0x26, 0x55, 0x7e, 0x9d, 0xc5, 0x55, 0x16, 0x91, 0x5c, 0xfd, + 0xef, 0x21, 0xbf, 0x53, 0x80, 0x7a, 0x2d, 0xd2, 0x91, 0x8c, 0x63, + 0x31, 0xf0, 0xec, 0x24, 0xf0, 0xc3, 0xa5, 0xd2, 0x72, 0x7c, 0x10, + 0x6d, 0xf4, 0x37, 0xb7, 0xe5, 0xe6, 0x7c, 0x79, 0xea, 0x8c, 0xb5, + 0x82, 0x8b, 0xae, 0x48, 0xb6, 0xac, 0x00, 0xdc, 0x65, 0x75, 0xec, + 0x2a, 0x4d, 0x5f, 0xc1, 0x87, 0xf5, 0x20, 0x65, 0x2b, 0x81, 0xa8, + 0x47, 0x3e, 0x89, 0x23, 0x95, 0x30, 0x16, 0x90, 0x7f, 0xe8, 0x57, + 0x07, 0x48, 0xe7, 0x19, 0xae, 0xbf, 0x45, 0x67, 0xb1, 0x37, 0x1b, + 0x06, 0x2a, 0xfe, 0xde, 0xf9, 0xac, 0x7d, 0x83, 0xfb, 0x5e, 0xba, + 0xe4, 0x8f, 0x97, 0x67, 0xbe, 0x4b, 0x8e, 0x8d, 0x64, 0x07, 0x57, + 0x38, 0x55, 0x69, 0x34, 0x36, 0x3d, 0x13, 0x48, 0xef, 0x4f, 0xe2, + 0xd3, 0x66, 0x1e, 0xa4, 0xcf, 0x1a, 0xb7, 0x5e, 0x36, 0x33, 0xd4, + 0xb4, 0x06, 0xbd, 0x18, 0x01, 0xfd, 0x77, 0x84, 0x50, 0x00, 0x45, + 0xf5, 0x8c, 0x5d, 0xe8, 0x23, 0xbc, 0x7e, 0xfe, 0x35, 0xe1, 0xed, + 0x50, 0x7b, 0xa9, 0x30, 0x8d, 0x19, 0xd3, 0x09, 0x8e, 0x68, 0x67, + 0x5d, 0xbf, 0x3c, 0x97, 0x18, 0x53, 0xbb, 0x29, 0x62, 0xc5, 0xca, + 0x5e, 0x72, 0xc1, 0xc7, 0x96, 0xd4, 0xdb, 0x2d, 0xa0, 0xb4, 0x1f, + 0x69, 0x03, 0xec, 0xea, 0xe2, 0x50, 0xf1, 0x0c, 0x3c, 0xf0, 0xac, + 0xf3, 0x53, 0x2d, 0xf0, 0x1c, 0xf5, 0xed, 0x6c, 0x39, 0x39, 0x73, + 0x80, 0x16, 0xc8, 0x52, 0xb0, 0x23, 0xcd, 0xe0, 0x3e, 0xdc, 0xdd, + 0x3c, 0x47, 0xa0, 0xbb, 0x35, 0x8a, 0xe2, 0x98, 0x68, 0x8b, 0xbe, + 0xe5, 0xbf, 0x72, 0xee, 0xd2, 0xfa, 0xa5, 0xed, 0x12, 0xed, 0xfc, + 0x98, 0x18, 0xa9, 0x26, 0x76, 0xdc, 0x28, 0x4b, 0x10, 0x20, 0x1c, + 0xd3, 0x7f, 0x16, 0x77, 0x2d, 0xed, 0x6f, 0x80, 0xf7, 0x49, 0xbb, + 0x53, 0x05, 0xbb, 0x5d, 0x68, 0xc7, 0xd4, 0xc8, 0x75, 0x16, 0x3f, + 0x89, 0x5a, 0x8b, 0xf7, 0x17, 0x47, 0xd4, 0x4c, 0xf1, 0xd2, 0x89, + 0x79, 0x3e, 0x4d, 0x3d, 0x98, 0xa8, 0x61, 0xde, 0x3a, 0x1e, 0xd2, + 0xf8, 0x5e, 0x03, 0xe0, 0xc1, 0xc9, 0x1c, 0x8c, 0xd3, 0x8d, 0x4d, + 0xd3, 0x95, 0x36, 0xb3, 0x37, 0x5f, 0x63, 0x63, 0x9b, 0x33, 0x14, + 0xf0, 0x2d, 0x26, 0x6b, 0x53, 0x7c, 0x89, 0x8c, 0x32, 0xc2, 0x6e, + 0xec, 0x3d, 0x21, 0x00, 0x39, 0xc9, 0xa1, 0x68, 0xe2, 0x50, 0x83, + 0x2e, 0xb0, 0x3a, 0x2b, 0xf3, 0x36, 0xa0, 0xac, 0x2f, 0xe4, 0x6f, + 0x61, 0xc2, 0x51, 0x09, 0x39, 0x3e, 0x8b, 0x53, 0xb9, 0xbb, 0x67, + 0xda, 0xdc, 0x53, 0xb9, 0x76, 0x59, 0x36, 0x9d, 0x43, 0xe5, 0x20, + 0xe0, 0x3d, 0x32, 0x60, 0x85, 0x22, 0x51, 0xb7, 0xc7, 0x33, 0xbb, + 0xdd, 0x15, 0x2f, 0xa4, 0x78, 0xa6, 0x07, 0x7b, 0x81, 0x46, 0x36, + 0x04, 0x86, 0xdd, 0x79, 0x35, 0xc7, 0x95, 0x2c, 0x3b, 0xb0, 0xa3, + 0x17, 0x35, 0xe5, 0x73, 0x1f, 0xb4, 0x5c, 0x59, 0xef, 0xda, 0xea, + 0x10, 0x65, 0x7b, 0x7a, 0xd0, 0x7f, 0x9f, 0xb3, 0xb4, 0x2a, 0x37, + 0x3b, 0x70, 0x8b, 0x9b, 0x5b, 0xb9, 0x2b, 0xb7, 0xec, 0xb2, 0x51, + 0x12, 0x97, 0x53, 0x29, 0x5a, 0xd4, 0xf0, 0x12, 0x10, 0xdc, 0x4f, + 0x02, 0xbb, 0x12, 0x92, 0x2f, 0x62, 0xd4, 0x3f, 0x69, 0x43, 0x7c, + 0x0d, 0xd6, 0xfc, 0x58, 0x75, 0x01, 0x88, 0x9d, 0x58, 0x16, 0x4b, + 0xde, 0xba, 0x90, 0xff, 0x47, 0x01, 0x89, 0x06, 0x6a, 0xf6, 0x5f, + 0xb2, 0x90, 0x6a, 0xb3, 0x02, 0xa6, 0x02, 0x88, 0xbf, 0xb3, 0x47, + 0x7e, 0x2a, 0xd9, 0xd5, 0xfa, 0x68, 0x78, 0x35, 0x4d, 0x02, 0x03, + 0x01, 0x00, 0x01, 0xa3, 0x3f, 0x30, 0x3d, 0x30, 0x0f, 0x06, 0x03, + 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, + 0x01, 0xff, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, + 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, + 0x04, 0x16, 0x04, 0x14, 0xf0, 0x8f, 0x59, 0x38, 0x00, 0xb3, 0xf5, + 0x8f, 0x9a, 0x96, 0x0c, 0xd5, 0xeb, 0xfa, 0x7b, 0xaa, 0x17, 0xe8, + 0x13, 0x12, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, + 0xbe, 0xe4, 0x5c, 0x62, 0x4e, 0x24, 0xf4, 0x0c, 0x08, 0xff, 0xf0, + 0xd3, 0x0c, 0x68, 0xe4, 0x93, 0x49, 0x22, 0x3f, 0x44, 0x27, 0x6f, + 0xbb, 0x6d, 0xde, 0x83, 0x66, 0xce, 0xa8, 0xcc, 0x0d, 0xfc, 0xf5, + 0x9a, 0x06, 0xe5, 0x77, 0x14, 0x91, 0xeb, 0x9d, 0x41, 0x7b, 0x99, + 0x2a, 0x84, 0xe5, 0xff, 0xfc, 0x21, 0xc1, 0x5d, 0xf0, 0xe4, 0x1f, + 0x57, 0xb7, 0x75, 0xa9, 0xa1, 0x5f, 0x02, 0x26, 0xff, 0xd7, 0xc7, + 0xf7, 0x4e, 0xde, 0x4f, 0xf8, 0xf7, 0x1c, 0x46, 0xc0, 0x7a, 0x4f, + 0x40, 0x2c, 0x22, 0x35, 0xf0, 0x19, 0xb1, 0xd0, 0x6b, 0x67, 0x2c, + 0xb0, 0xa8, 0xe0, 0xc0, 0x40, 0x37, 0x35, 0xf6, 0x84, 0x5c, 0x5c, + 0xe3, 0xaf, 0x42, 0x78, 0xfe, 0xa7, 0xc9, 0x0d, 0x50, 0xea, 0x0d, + 0x84, 0x76, 0xf6, 0x51, 0xef, 0x83, 0x53, 0xc6, 0x7a, 0xff, 0x0e, + 0x56, 0x49, 0x2e, 0x8f, 0x7a, 0xd6, 0x0c, 0xe6, 0x27, 0x54, 0xe3, + 0x4d, 0x0a, 0x60, 0x72, 0x62, 0xcd, 0x91, 0x07, 0xd6, 0xa5, 0xbf, + 0xc8, 0x99, 0x6b, 0xed, 0xc4, 0x19, 0xe6, 0xab, 0x4c, 0x11, 0x38, + 0xc5, 0x6f, 0x31, 0xe2, 0x6e, 0x49, 0xc8, 0x3f, 0x76, 0x80, 0x26, + 0x03, 0x26, 0x29, 0xe0, 0x36, 0xf6, 0xf6, 0x20, 0x53, 0xe3, 0x17, + 0x70, 0x34, 0x17, 0x9d, 0x63, 0x68, 0x1e, 0x6b, 0xec, 0xc3, 0x4d, + 0x86, 0xb8, 0x13, 0x30, 0x2f, 0x5d, 0x46, 0x0d, 0x47, 0x43, 0xd5, + 0x1b, 0xaa, 0x59, 0x0e, 0xb9, 0x5c, 0x8d, 0x06, 0x48, 0xad, 0x74, + 0x87, 0x5f, 0xc7, 0xfc, 0x31, 0x54, 0x41, 0x13, 0xe2, 0xc7, 0x21, + 0x0e, 0x9e, 0xe0, 0x1e, 0x0d, 0xe1, 0xc0, 0x7b, 0x43, 0x85, 0x90, + 0xc5, 0x8a, 0x58, 0xc6, 0x65, 0x0a, 0x78, 0x57, 0xf2, 0xc6, 0x23, + 0x0f, 0x01, 0xd9, 0x20, 0x4b, 0xde, 0x0f, 0xfb, 0x92, 0x85, 0x75, + 0x2a, 0x5c, 0x73, 0x8d, 0x6d, 0x7b, 0x25, 0x91, 0xca, 0xee, 0x45, + 0xae, 0x06, 0x4b, 0x00, 0xcc, 0xd3, 0xb1, 0x59, 0x50, 0xda, 0x3a, + 0x88, 0x3b, 0x29, 0x43, 0x46, 0x5e, 0x97, 0x2b, 0x54, 0xce, 0x53, + 0x6f, 0x8d, 0x4a, 0xe7, 0x96, 0xfa, 0xbf, 0x71, 0x0e, 0x42, 0x8b, + 0x7c, 0xfd, 0x28, 0xa0, 0xd0, 0x48, 0xca, 0xda, 0xc4, 0x81, 0x4c, + 0xbb, 0xa2, 0x73, 0x93, 0x26, 0xc8, 0xeb, 0x0c, 0xd6, 0x26, 0x88, + 0xb6, 0xc0, 0x24, 0xcf, 0xbb, 0xbd, 0x5b, 0xeb, 0x75, 0x7d, 0xe9, + 0x08, 0x8e, 0x86, 0x33, 0x2c, 0x79, 0x77, 0x09, 0x69, 0xa5, 0x89, + 0xfc, 0xb3, 0x70, 0x90, 0x87, 0x76, 0x8f, 0xd3, 0x22, 0xbb, 0x42, + 0xce, 0xbd, 0x73, 0x0b, 0x20, 0x26, 0x2a, 0xd0, 0x9b, 0x3d, 0x70, + 0x1e, 0x24, 0x6c, 0xcd, 0x87, 0x76, 0xa9, 0x17, 0x96, 0xb7, 0xcf, + 0x0d, 0x92, 0xfb, 0x8e, 0x18, 0xa9, 0x98, 0x49, 0xd1, 0x9e, 0xfe, + 0x60, 0x44, 0x72, 0x21, 0xb9, 0x19, 0xed, 0xc2, 0xf5, 0x31, 0xf1, + 0x39, 0x48, 0x88, 0x90, 0x24, 0x75, 0x54, 0x16, 0xad, 0xce, 0xf4, + 0xf8, 0x69, 0x14, 0x64, 0x39, 0xfb, 0xa3, 0xb8, 0xba, 0x70, 0x40, + 0xc7, 0x27, 0x1c, 0xbf, 0xc4, 0x56, 0x53, 0xfa, 0x63, 0x65, 0xd0, + 0xf3, 0x1c, 0x0e, 0x16, 0xf5, 0x6b, 0x86, 0x58, 0x4d, 0x18, 0xd4, + 0xe4, 0x0d, 0x8e, 0xa5, 0x9d, 0x5b, 0x91, 0xdc, 0x76, 0x24, 0x50, + 0x3f, 0xc6, 0x2a, 0xfb, 0xd9, 0xb7, 0x9c, 0xb5, 0xd6, 0xe6, 0xd0, + 0xd9, 0xe8, 0x19, 0x8b, 0x15, 0x71, 0x48, 0xad, 0xb7, 0xea, 0xd8, + 0x59, 0x88, 0xd4, 0x90, 0xbf, 0x16, 0xb3, 0xd9, 0xe9, 0xac, 0x59, + 0x61, 0x54, 0xc8, 0x1c, 0xba, 0xca, 0xc1, 0xca, 0xe1, 0xb9, 0x20, + 0x4c, 0x8f, 0x3a, 0x93, 0x89, 0xa5, 0xa0, 0xcc, 0xbf, 0xd3, 0xf6, + 0x75, 0xa4, 0x75, 0x96, 0x6d, 0x56, 0x30, 0x82, 0x06, 0x4b, 0x30, + 0x82, 0x04, 0x33, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x6a, + 0x68, 0x3e, 0x9c, 0x51, 0x9b, 0xcb, 0x53, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, + 0x30, 0x81, 0xb2, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x54, 0x52, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, + 0x55, 0x04, 0x07, 0x0c, 0x06, 0x41, 0x6e, 0x6b, 0x61, 0x72, 0x61, + 0x31, 0x40, 0x30, 0x3e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x37, + 0x45, 0x2d, 0x54, 0x75, 0xc4, 0x9f, 0x72, 0x61, 0x20, 0x45, 0x42, + 0x47, 0x20, 0x42, 0x69, 0x6c, 0x69, 0xc5, 0x9f, 0x69, 0x6d, 0x20, + 0x54, 0x65, 0x6b, 0x6e, 0x6f, 0x6c, 0x6f, 0x6a, 0x69, 0x6c, 0x65, + 0x72, 0x69, 0x20, 0x76, 0x65, 0x20, 0x48, 0x69, 0x7a, 0x6d, 0x65, + 0x74, 0x6c, 0x65, 0x72, 0x69, 0x20, 0x41, 0x2e, 0xc5, 0x9e, 0x2e, + 0x31, 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x1d, + 0x45, 0x2d, 0x54, 0x75, 0x67, 0x72, 0x61, 0x20, 0x53, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x6b, 0x61, 0x73, 0x79, 0x6f, 0x6e, 0x20, + 0x4d, 0x65, 0x72, 0x6b, 0x65, 0x7a, 0x69, 0x31, 0x28, 0x30, 0x26, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1f, 0x45, 0x2d, 0x54, 0x75, + 0x67, 0x72, 0x61, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x33, + 0x30, 0x33, 0x30, 0x35, 0x31, 0x32, 0x30, 0x39, 0x34, 0x38, 0x5a, + 0x17, 0x0d, 0x32, 0x33, 0x30, 0x33, 0x30, 0x33, 0x31, 0x32, 0x30, + 0x39, 0x34, 0x38, 0x5a, 0x30, 0x81, 0xb2, 0x31, 0x0b, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x54, 0x52, 0x31, 0x0f, + 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x06, 0x41, 0x6e, + 0x6b, 0x61, 0x72, 0x61, 0x31, 0x40, 0x30, 0x3e, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x0c, 0x37, 0x45, 0x2d, 0x54, 0x75, 0xc4, 0x9f, 0x72, + 0x61, 0x20, 0x45, 0x42, 0x47, 0x20, 0x42, 0x69, 0x6c, 0x69, 0xc5, + 0x9f, 0x69, 0x6d, 0x20, 0x54, 0x65, 0x6b, 0x6e, 0x6f, 0x6c, 0x6f, + 0x6a, 0x69, 0x6c, 0x65, 0x72, 0x69, 0x20, 0x76, 0x65, 0x20, 0x48, + 0x69, 0x7a, 0x6d, 0x65, 0x74, 0x6c, 0x65, 0x72, 0x69, 0x20, 0x41, + 0x2e, 0xc5, 0x9e, 0x2e, 0x31, 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, + 0x04, 0x0b, 0x0c, 0x1d, 0x45, 0x2d, 0x54, 0x75, 0x67, 0x72, 0x61, + 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x6b, 0x61, 0x73, + 0x79, 0x6f, 0x6e, 0x20, 0x4d, 0x65, 0x72, 0x6b, 0x65, 0x7a, 0x69, + 0x31, 0x28, 0x30, 0x26, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1f, + 0x45, 0x2d, 0x54, 0x75, 0x67, 0x72, 0x61, 0x20, 0x43, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, + 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, + 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xe2, 0xf5, + 0x3f, 0x93, 0x05, 0x51, 0x1e, 0x85, 0x62, 0x54, 0x5e, 0x7a, 0x0b, + 0xf5, 0x18, 0x07, 0x83, 0xae, 0x7e, 0xaf, 0x7c, 0xf7, 0xd4, 0x8a, + 0x6b, 0xa5, 0x63, 0x43, 0x39, 0xb9, 0x4b, 0xf7, 0xc3, 0xc6, 0x64, + 0x89, 0x3d, 0x94, 0x2e, 0x54, 0x80, 0x52, 0x39, 0x39, 0x07, 0x4b, + 0x4b, 0xdd, 0x85, 0x07, 0x76, 0x87, 0xcc, 0xbf, 0x2f, 0x95, 0x4c, + 0xcc, 0x7d, 0xa7, 0x3d, 0xbc, 0x47, 0x0f, 0x98, 0x70, 0xf8, 0x8c, + 0x85, 0x1e, 0x74, 0x8e, 0x92, 0x6d, 0x1b, 0x40, 0xd1, 0x99, 0x0d, + 0xbb, 0x75, 0x6e, 0xc8, 0xa9, 0x6b, 0x9a, 0xc0, 0x84, 0x31, 0xaf, + 0xca, 0x43, 0xcb, 0xeb, 0x2b, 0x34, 0xe8, 0x8f, 0x97, 0x6b, 0x01, + 0x9b, 0xd5, 0x0e, 0x4a, 0x08, 0xaa, 0x5b, 0x92, 0x74, 0x85, 0x43, + 0xd3, 0x80, 0xae, 0xa1, 0x88, 0x5b, 0xae, 0xb3, 0xea, 0x5e, 0xcb, + 0x16, 0x9a, 0x77, 0x44, 0xc8, 0xa1, 0xf6, 0x54, 0x68, 0xce, 0xde, + 0x8f, 0x97, 0x2b, 0xba, 0x5b, 0x40, 0x02, 0x0c, 0x64, 0x17, 0xc0, + 0xb5, 0x93, 0xcd, 0xe1, 0xf1, 0x13, 0x66, 0xce, 0x0c, 0x79, 0xef, + 0xd1, 0x91, 0x28, 0xab, 0x5f, 0xa0, 0x12, 0x52, 0x30, 0x73, 0x19, + 0x8e, 0x8f, 0xe1, 0x8c, 0x07, 0xa2, 0xc3, 0xbb, 0x4a, 0xf0, 0xea, + 0x1f, 0x15, 0xa8, 0xee, 0x25, 0xcc, 0xa4, 0x46, 0xf8, 0x1b, 0x22, + 0xef, 0xb3, 0x0e, 0x43, 0xba, 0x2c, 0x24, 0xb8, 0xc5, 0x2c, 0x5c, + 0xd4, 0x1c, 0xf8, 0x5d, 0x64, 0xbd, 0xc3, 0x93, 0x5e, 0x28, 0xa7, + 0x3f, 0x27, 0xf1, 0x8e, 0x1e, 0xd3, 0x2a, 0x50, 0x05, 0xa3, 0x55, + 0xd9, 0xcb, 0xe7, 0x39, 0x53, 0xc0, 0x98, 0x9e, 0x8c, 0x54, 0x62, + 0x8b, 0x26, 0xb0, 0xf7, 0x7d, 0x8d, 0x7c, 0xe4, 0xc6, 0x9e, 0x66, + 0x42, 0x55, 0x82, 0x47, 0xe7, 0xb2, 0x58, 0x8d, 0x66, 0xf7, 0x07, + 0x7c, 0x2e, 0x36, 0xe6, 0x50, 0x1c, 0x3f, 0xdb, 0x43, 0x24, 0xc5, + 0xbf, 0x86, 0x47, 0x79, 0xb3, 0x79, 0x1c, 0xf7, 0x5a, 0xf4, 0x13, + 0xec, 0x6c, 0xf8, 0x3f, 0xe2, 0x59, 0x1f, 0x95, 0xee, 0x42, 0x3e, + 0xb9, 0xad, 0xa8, 0x32, 0x85, 0x49, 0x97, 0x46, 0xfe, 0x4b, 0x31, + 0x8f, 0x5a, 0xcb, 0xad, 0x74, 0x47, 0x1f, 0xe9, 0x91, 0xb7, 0xdf, + 0x28, 0x04, 0x22, 0xa0, 0xd4, 0x0f, 0x5d, 0xe2, 0x79, 0x4f, 0xea, + 0x6c, 0x85, 0x86, 0xbd, 0xa8, 0xa6, 0xce, 0xe4, 0xfa, 0xc3, 0xe1, + 0xb3, 0xae, 0xde, 0x3c, 0x51, 0xee, 0xcb, 0x13, 0x7c, 0x01, 0x7f, + 0x84, 0x0e, 0x5d, 0x51, 0x94, 0x9e, 0x13, 0x0c, 0xb6, 0x2e, 0xa5, + 0x4c, 0xf9, 0x39, 0x70, 0x36, 0x6f, 0x96, 0xca, 0x2e, 0x0c, 0x44, + 0x55, 0xc5, 0xca, 0xfa, 0x5d, 0x02, 0xa3, 0xdf, 0xd6, 0x64, 0x8c, + 0x5a, 0xb3, 0x01, 0x0a, 0xa9, 0xb5, 0x0a, 0x47, 0x17, 0xff, 0xef, + 0x91, 0x40, 0x2a, 0x8e, 0xa1, 0x46, 0x3a, 0x31, 0x98, 0xe5, 0x11, + 0xfc, 0xcc, 0xbb, 0x49, 0x56, 0x8a, 0xfc, 0xb9, 0xd0, 0x61, 0x9a, + 0x6f, 0x65, 0x6c, 0xe6, 0xc3, 0xcb, 0x3e, 0x75, 0x49, 0xfe, 0x8f, + 0xa7, 0xe2, 0x89, 0xc5, 0x67, 0xd7, 0x9d, 0x46, 0x13, 0x4e, 0x31, + 0x76, 0x3b, 0x24, 0xb3, 0x9e, 0x11, 0x65, 0x86, 0xab, 0x7f, 0xef, + 0x1d, 0xd4, 0xf8, 0xbc, 0xe7, 0xac, 0x5a, 0x5c, 0xb7, 0x5a, 0x47, + 0x5c, 0x55, 0xce, 0x55, 0xb4, 0x22, 0x71, 0x5b, 0x5b, 0x0b, 0xf0, + 0xcf, 0xdc, 0xa0, 0x61, 0x64, 0xea, 0xa9, 0xd7, 0x68, 0x0a, 0x63, + 0xa7, 0xe0, 0x0d, 0x3f, 0xa0, 0xaf, 0xd3, 0xaa, 0xd2, 0x7e, 0xef, + 0x51, 0xa0, 0xe6, 0x51, 0x2b, 0x55, 0x92, 0x15, 0x17, 0x53, 0xcb, + 0xb7, 0x66, 0x0e, 0x66, 0x4c, 0xf8, 0xf9, 0x75, 0x4c, 0x90, 0xe7, + 0x12, 0x70, 0xc7, 0x45, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, + 0x30, 0x61, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, + 0x04, 0x14, 0x2e, 0xe3, 0xdb, 0xb2, 0x49, 0xd0, 0x9c, 0x54, 0x79, + 0x5c, 0xfa, 0x27, 0x2a, 0xfe, 0xcc, 0x4e, 0xd2, 0xe8, 0x4e, 0x54, + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, + 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, + 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x2e, 0xe3, 0xdb, + 0xb2, 0x49, 0xd0, 0x9c, 0x54, 0x79, 0x5c, 0xfa, 0x27, 0x2a, 0xfe, + 0xcc, 0x4e, 0xd2, 0xe8, 0x4e, 0x54, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x05, 0x37, + 0x3a, 0xf4, 0x4d, 0xb7, 0x45, 0xe2, 0x45, 0x75, 0x24, 0x8f, 0xb6, + 0x77, 0x52, 0xe8, 0x1c, 0xd8, 0x10, 0x93, 0x65, 0xf3, 0xf2, 0x59, + 0x06, 0xa4, 0x3e, 0x1e, 0x29, 0xec, 0x5d, 0xd1, 0xd0, 0xab, 0x7c, + 0xe0, 0x0a, 0x90, 0x48, 0x78, 0xed, 0x4e, 0x98, 0x03, 0x99, 0xfe, + 0x28, 0x60, 0x91, 0x1d, 0x30, 0x1d, 0xb8, 0x63, 0x7c, 0xa8, 0xe6, + 0x35, 0xb5, 0xfa, 0xd3, 0x61, 0x76, 0xe6, 0xd6, 0x07, 0x4b, 0xca, + 0x69, 0x9a, 0xb2, 0x84, 0x7a, 0x77, 0x93, 0x45, 0x17, 0x15, 0x9f, + 0x24, 0xd0, 0x98, 0x13, 0x12, 0xff, 0xbb, 0xa0, 0x2e, 0xfd, 0x4e, + 0x4c, 0x87, 0xf8, 0xce, 0x5c, 0xaa, 0x98, 0x1b, 0x05, 0xe0, 0x00, + 0x46, 0x4a, 0x82, 0x80, 0xa5, 0x33, 0x8b, 0x28, 0xdc, 0xed, 0x38, + 0xd3, 0xdf, 0xe5, 0x3e, 0xe9, 0xfe, 0xfb, 0x59, 0xdd, 0x61, 0x84, + 0x4f, 0xd2, 0x54, 0x96, 0x13, 0x61, 0x13, 0x3e, 0x8f, 0x80, 0x69, + 0xbe, 0x93, 0x47, 0xb5, 0x35, 0x43, 0xd2, 0x5a, 0xbb, 0x3d, 0x5c, + 0xef, 0xb3, 0x42, 0x47, 0xcd, 0x3b, 0x55, 0x13, 0x06, 0xb0, 0x09, + 0xdb, 0xfd, 0x63, 0xf6, 0x3a, 0x88, 0x0a, 0x99, 0x6f, 0x7e, 0xe1, + 0xce, 0x1b, 0x53, 0x6a, 0x44, 0x66, 0x23, 0x51, 0x08, 0x7b, 0xbc, + 0x5b, 0x52, 0xa2, 0xfd, 0x06, 0x37, 0x38, 0x40, 0x61, 0x8f, 0x4a, + 0x96, 0xb8, 0x90, 0x37, 0xf8, 0x66, 0xc7, 0x78, 0x90, 0x00, 0x15, + 0x2e, 0x8b, 0xad, 0x51, 0x35, 0x53, 0x07, 0xa8, 0x6b, 0x68, 0xae, + 0xf9, 0x4e, 0x3c, 0x07, 0x26, 0xcd, 0x08, 0x05, 0x70, 0xcc, 0x39, + 0x3f, 0x76, 0xbd, 0xa5, 0xd3, 0x67, 0x26, 0x01, 0x86, 0xa6, 0x53, + 0xd2, 0x60, 0x3b, 0x7c, 0x43, 0x7f, 0x55, 0x8a, 0xbc, 0x95, 0x1a, + 0xc1, 0x28, 0x39, 0x4c, 0x1f, 0x43, 0xd2, 0x91, 0xf4, 0x72, 0x59, + 0x8a, 0xb9, 0x56, 0xfc, 0x3f, 0xb4, 0x9d, 0xda, 0x70, 0x9c, 0x76, + 0x5a, 0x8c, 0x43, 0x50, 0xee, 0x8e, 0x30, 0x72, 0x4d, 0xdf, 0xff, + 0x49, 0xf7, 0xc6, 0xa9, 0x67, 0xd9, 0x6d, 0xac, 0x02, 0x11, 0xe2, + 0x3a, 0x16, 0x25, 0xa7, 0x58, 0x08, 0xcb, 0x6f, 0x53, 0x41, 0x9c, + 0x48, 0x38, 0x47, 0x68, 0x33, 0xd1, 0xd7, 0xc7, 0x8f, 0xd4, 0x74, + 0x21, 0xd4, 0xc3, 0x05, 0x90, 0x7a, 0xff, 0xce, 0x96, 0x88, 0xb1, + 0x15, 0x29, 0x5d, 0x23, 0xab, 0xd0, 0x60, 0xa1, 0x12, 0x4f, 0xde, + 0xf4, 0x17, 0xcd, 0x32, 0xe5, 0xc9, 0xbf, 0xc8, 0x43, 0xad, 0xfd, + 0x2e, 0x8e, 0xf1, 0xaf, 0xe2, 0xf4, 0x98, 0xfa, 0x12, 0x1f, 0x20, + 0xd8, 0xc0, 0xa7, 0x0c, 0x85, 0xc5, 0x90, 0xf4, 0x3b, 0x2d, 0x96, + 0x26, 0xb1, 0x2c, 0xbe, 0x4c, 0xab, 0xeb, 0xb1, 0xd2, 0x8a, 0xc9, + 0xdb, 0x78, 0x13, 0x0f, 0x1e, 0x09, 0x9d, 0x6d, 0x8f, 0x00, 0x9f, + 0x02, 0xda, 0xc1, 0xfa, 0x1f, 0x7a, 0x7a, 0x09, 0xc4, 0x4a, 0xe6, + 0x88, 0x2a, 0x97, 0x9f, 0x89, 0x8b, 0xfd, 0x37, 0x5f, 0x5f, 0x3a, + 0xce, 0x38, 0x59, 0x86, 0x4b, 0xaf, 0x71, 0x0b, 0xb4, 0xd8, 0xf2, + 0x70, 0x4f, 0x9f, 0x32, 0x13, 0xe3, 0xb0, 0xa7, 0x57, 0xe5, 0xda, + 0xda, 0x43, 0xcb, 0x84, 0x34, 0xf2, 0x28, 0xc4, 0xea, 0x6d, 0xf4, + 0x2a, 0xef, 0xc1, 0x6b, 0x76, 0xda, 0xfb, 0x7e, 0xbb, 0x85, 0x3c, + 0xd2, 0x53, 0xc2, 0x4d, 0xbe, 0x71, 0xe1, 0x45, 0xd1, 0xfd, 0x23, + 0x67, 0x0d, 0x13, 0x75, 0xfb, 0xcf, 0x65, 0x67, 0x22, 0x9d, 0xae, + 0xb0, 0x09, 0xd1, 0x09, 0xff, 0x1d, 0x34, 0xbf, 0xfe, 0x23, 0x97, + 0x37, 0xd2, 0x39, 0xfa, 0x3d, 0x0d, 0x06, 0x0b, 0xb4, 0xdb, 0x3b, + 0xa3, 0xab, 0x6f, 0x5c, 0x1d, 0xb6, 0x7e, 0xe8, 0xb3, 0x82, 0x34, + 0xed, 0x06, 0x5c, 0x24, 0x30, 0x82, 0x03, 0xc3, 0x30, 0x82, 0x02, + 0xab, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x30, 0x81, 0x82, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, 0x2b, 0x30, 0x29, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x22, 0x54, 0x2d, 0x53, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x45, 0x6e, 0x74, 0x65, 0x72, + 0x70, 0x72, 0x69, 0x73, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x20, 0x47, 0x6d, 0x62, 0x48, 0x31, 0x1f, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x16, 0x54, 0x2d, 0x53, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x31, 0x25, 0x30, + 0x23, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1c, 0x54, 0x2d, 0x54, + 0x65, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x20, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x20, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x31, 0x30, + 0x30, 0x31, 0x31, 0x30, 0x34, 0x30, 0x31, 0x34, 0x5a, 0x17, 0x0d, + 0x33, 0x33, 0x31, 0x30, 0x30, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, + 0x39, 0x5a, 0x30, 0x81, 0x82, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, 0x2b, 0x30, 0x29, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x22, 0x54, 0x2d, 0x53, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x45, 0x6e, 0x74, 0x65, 0x72, + 0x70, 0x72, 0x69, 0x73, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x20, 0x47, 0x6d, 0x62, 0x48, 0x31, 0x1f, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x16, 0x54, 0x2d, 0x53, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x31, 0x25, 0x30, + 0x23, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1c, 0x54, 0x2d, 0x54, + 0x65, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x20, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x20, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, + 0x01, 0x01, 0x00, 0xaa, 0x5f, 0xda, 0x1b, 0x5f, 0xe8, 0x73, 0x91, + 0xe5, 0xda, 0x5c, 0xf4, 0xa2, 0xe6, 0x47, 0xe5, 0xf3, 0x68, 0x55, + 0x60, 0x05, 0x1d, 0x02, 0xa4, 0xb3, 0x9b, 0x59, 0xf3, 0x1e, 0x8a, + 0xaf, 0x34, 0xad, 0xfc, 0x0d, 0xc2, 0xd9, 0x48, 0x19, 0xee, 0x69, + 0x8f, 0xc9, 0x20, 0xfc, 0x21, 0xaa, 0x07, 0x19, 0xed, 0xb0, 0x5c, + 0xac, 0x65, 0xc7, 0x5f, 0xed, 0x02, 0x7c, 0x7b, 0x7c, 0x2d, 0x1b, + 0xd6, 0xba, 0xb9, 0x80, 0xc2, 0x18, 0x82, 0x16, 0x84, 0xfa, 0x66, + 0xb0, 0x08, 0xc6, 0x54, 0x23, 0x81, 0xe4, 0xcd, 0xb9, 0x49, 0x3f, + 0xf6, 0x4f, 0x6e, 0x37, 0x48, 0x28, 0x38, 0x0f, 0xc5, 0xbe, 0xe7, + 0x68, 0x70, 0xfd, 0x39, 0x97, 0x4d, 0xd2, 0xc7, 0x98, 0x91, 0x50, + 0xaa, 0xc4, 0x44, 0xb3, 0x23, 0x7d, 0x39, 0x47, 0xe9, 0x52, 0x62, + 0xd6, 0x12, 0x93, 0x5e, 0xb7, 0x31, 0x96, 0x42, 0x05, 0xfb, 0x76, + 0xa7, 0x1e, 0xa3, 0xf5, 0xc2, 0xfc, 0xe9, 0x7a, 0xc5, 0x6c, 0xa9, + 0x71, 0x4f, 0xea, 0xcb, 0x78, 0xbc, 0x60, 0xaf, 0xc7, 0xde, 0xf4, + 0xd9, 0xcb, 0xbe, 0x7e, 0x33, 0xa5, 0x6e, 0x94, 0x83, 0xf0, 0x34, + 0xfa, 0x21, 0xab, 0xea, 0x8e, 0x72, 0xa0, 0x3f, 0xa4, 0xde, 0x30, + 0x5b, 0xef, 0x86, 0x4d, 0x6a, 0x95, 0x5b, 0x43, 0x44, 0xa8, 0x10, + 0x15, 0x1c, 0xe5, 0x01, 0x57, 0xc5, 0x98, 0xf1, 0xe6, 0x06, 0x28, + 0x91, 0xaa, 0x20, 0xc5, 0xb7, 0x53, 0x26, 0x51, 0x43, 0xb2, 0x0b, + 0x11, 0x95, 0x58, 0xe1, 0xc0, 0x0f, 0x76, 0xd9, 0xc0, 0x8d, 0x7c, + 0x81, 0xf3, 0x72, 0x70, 0x9e, 0x6f, 0xfe, 0x1a, 0x8e, 0xd9, 0x5f, + 0x35, 0xc6, 0xb2, 0x6f, 0x34, 0x7c, 0xbe, 0x48, 0x4f, 0xe2, 0x5a, + 0x39, 0xd7, 0xd8, 0x9d, 0x78, 0x9e, 0x9f, 0x86, 0x3e, 0x03, 0x5e, + 0x19, 0x8b, 0x44, 0xa2, 0xd5, 0xc7, 0x02, 0x03, 0x01, 0x00, 0x01, + 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, + 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, + 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, + 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, + 0x04, 0x16, 0x04, 0x14, 0xbf, 0x59, 0x20, 0x36, 0x00, 0x79, 0xa0, + 0xa0, 0x22, 0x6b, 0x8c, 0xd5, 0xf2, 0x61, 0xd2, 0xb8, 0x2c, 0xcb, + 0x82, 0x4a, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, + 0x31, 0x03, 0xa2, 0x61, 0x0b, 0x1f, 0x74, 0xe8, 0x72, 0x36, 0xc6, + 0x6d, 0xf9, 0x4d, 0x9e, 0xfa, 0x22, 0xa8, 0xe1, 0x81, 0x56, 0xcf, + 0xcd, 0xbb, 0x9f, 0xea, 0xab, 0x91, 0x19, 0x38, 0xaf, 0xaa, 0x7c, + 0x15, 0x4d, 0xf3, 0xb6, 0xa3, 0x8d, 0xa5, 0xf4, 0x8e, 0xf6, 0x44, + 0xa9, 0xa7, 0xe8, 0x21, 0x95, 0xad, 0x3e, 0x00, 0x62, 0x16, 0x88, + 0xf0, 0x02, 0xba, 0xfc, 0x61, 0x23, 0xe6, 0x33, 0x9b, 0x30, 0x7a, + 0x6b, 0x36, 0x62, 0x7b, 0xad, 0x04, 0x23, 0x84, 0x58, 0x65, 0xe2, + 0xdb, 0x2b, 0x8a, 0xe7, 0x25, 0x53, 0x37, 0x62, 0x53, 0x5f, 0xbc, + 0xda, 0x01, 0x62, 0x29, 0xa2, 0xa6, 0x27, 0x71, 0xe6, 0x3a, 0x22, + 0x7e, 0xc1, 0x6f, 0x1d, 0x95, 0x70, 0x20, 0x4a, 0x07, 0x34, 0xdf, + 0xea, 0xff, 0x15, 0x80, 0xe5, 0xba, 0xd7, 0x7a, 0xd8, 0x5b, 0x75, + 0x7c, 0x05, 0x7a, 0x29, 0x47, 0x7e, 0x40, 0xa8, 0x31, 0x13, 0x77, + 0xcd, 0x40, 0x3b, 0xb4, 0x51, 0x47, 0x7a, 0x2e, 0x11, 0xe3, 0x47, + 0x11, 0xde, 0x9d, 0x66, 0xd0, 0x8b, 0xd5, 0x54, 0x66, 0xfa, 0x83, + 0x55, 0xea, 0x7c, 0xc2, 0x29, 0x89, 0x1b, 0xe9, 0x6f, 0xb3, 0xce, + 0xe2, 0x05, 0x84, 0xc9, 0x2f, 0x3e, 0x78, 0x85, 0x62, 0x6e, 0xc9, + 0x5f, 0xc1, 0x78, 0x63, 0x74, 0x58, 0xc0, 0x48, 0x18, 0x0c, 0x99, + 0x39, 0xeb, 0xa4, 0xcc, 0x1a, 0xb5, 0x79, 0x5a, 0x8d, 0x15, 0x9c, + 0xd8, 0x14, 0x0d, 0xf6, 0x7a, 0x07, 0x57, 0xc7, 0x22, 0x83, 0x05, + 0x2d, 0x3c, 0x9b, 0x25, 0x26, 0x3d, 0x18, 0xb3, 0xa9, 0x43, 0x7c, + 0xc8, 0xc8, 0xab, 0x64, 0x8f, 0x0e, 0xa3, 0xbf, 0x9c, 0x1b, 0x9d, + 0x30, 0xdb, 0xda, 0xd0, 0x19, 0x2e, 0xaa, 0x3c, 0xf1, 0xfb, 0x33, + 0x80, 0x76, 0xe4, 0xcd, 0xad, 0x19, 0x4f, 0x05, 0x27, 0x8e, 0x13, + 0xa1, 0x6e, 0xc2, 0x30, 0x82, 0x03, 0x77, 0x30, 0x82, 0x02, 0x5f, + 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x08, 0x5c, 0x33, 0xcb, 0x62, + 0x2c, 0x5f, 0xb3, 0x32, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x3c, 0x31, + 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x15, 0x41, + 0x74, 0x6f, 0x73, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, + 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x32, 0x30, 0x31, 0x31, 0x31, 0x0d, + 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x04, 0x41, 0x74, + 0x6f, 0x73, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x44, 0x45, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x31, 0x30, + 0x37, 0x30, 0x37, 0x31, 0x34, 0x35, 0x38, 0x33, 0x30, 0x5a, 0x17, + 0x0d, 0x33, 0x30, 0x31, 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, + 0x35, 0x39, 0x5a, 0x30, 0x3c, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x0c, 0x15, 0x41, 0x74, 0x6f, 0x73, 0x20, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x20, + 0x32, 0x30, 0x31, 0x31, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x0c, 0x04, 0x41, 0x74, 0x6f, 0x73, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 0x45, 0x30, + 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, + 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0x95, + 0x85, 0x3b, 0x97, 0x6f, 0x2a, 0x3b, 0x2e, 0x3b, 0xcf, 0xa6, 0xf3, + 0x29, 0x35, 0xbe, 0xcf, 0x18, 0xac, 0x3e, 0xaa, 0xd9, 0xf8, 0x4d, + 0xa0, 0x3e, 0x1a, 0x47, 0xb9, 0xbc, 0x9a, 0xdf, 0xf2, 0xfe, 0xcc, + 0x3e, 0x47, 0xe8, 0x7a, 0x96, 0xc2, 0x24, 0x8e, 0x35, 0xf4, 0xa9, + 0x0c, 0xfc, 0x82, 0xfd, 0x6d, 0xc1, 0x72, 0x62, 0x27, 0xbd, 0xea, + 0x6b, 0xeb, 0xe7, 0x8a, 0xcc, 0x54, 0x3e, 0x90, 0x50, 0xcf, 0x80, + 0xd4, 0x95, 0xfb, 0xe8, 0xb5, 0x82, 0xd4, 0x14, 0xc5, 0xb6, 0xa9, + 0x55, 0x25, 0x57, 0xdb, 0xb1, 0x50, 0xf6, 0xb0, 0x60, 0x64, 0x59, + 0x7a, 0x69, 0xcf, 0x03, 0xb7, 0x6f, 0x0d, 0xbe, 0xca, 0x3e, 0x6f, + 0x74, 0x72, 0xea, 0xaa, 0x30, 0x2a, 0x73, 0x62, 0xbe, 0x49, 0x91, + 0x61, 0xc8, 0x11, 0xfe, 0x0e, 0x03, 0x2a, 0xf7, 0x6a, 0x20, 0xdc, + 0x02, 0x15, 0x0d, 0x5e, 0x15, 0x6a, 0xfc, 0xe3, 0x82, 0xc1, 0xb5, + 0xc5, 0x9d, 0x64, 0x09, 0x6c, 0xa3, 0x59, 0x98, 0x07, 0x27, 0xc7, + 0x1b, 0x96, 0x2b, 0x61, 0x74, 0x71, 0x6c, 0x43, 0xf1, 0xf7, 0x35, + 0x89, 0x10, 0xe0, 0x9e, 0xec, 0x55, 0xa1, 0x37, 0x22, 0xa2, 0x87, + 0x04, 0x05, 0x2c, 0x47, 0x7d, 0xb4, 0x1c, 0xb9, 0x62, 0x29, 0x66, + 0x28, 0xca, 0xb7, 0xe1, 0x93, 0xf5, 0xa4, 0x94, 0x03, 0x99, 0xb9, + 0x70, 0x85, 0xb5, 0xe6, 0x48, 0xea, 0x8d, 0x50, 0xfc, 0xd9, 0xde, + 0xcc, 0x6f, 0x07, 0x0e, 0xdd, 0x0b, 0x72, 0x9d, 0x80, 0x30, 0x16, + 0x07, 0x95, 0x3f, 0x28, 0x0e, 0xfd, 0xc5, 0x75, 0x4f, 0x53, 0xd6, + 0x74, 0x9a, 0xb4, 0x24, 0x2e, 0x8e, 0x02, 0x91, 0xcf, 0x76, 0xc5, + 0x9b, 0x1e, 0x55, 0x74, 0x9c, 0x78, 0x21, 0xb1, 0xf0, 0x2d, 0xf1, + 0x0b, 0x9f, 0xc2, 0xd5, 0x96, 0x18, 0x1f, 0xf0, 0x54, 0x22, 0x7a, + 0x8c, 0x07, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x7d, 0x30, 0x7b, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0xa7, 0xa5, 0x06, 0xb1, 0x2c, 0xa6, 0x09, 0x60, 0xee, 0xd1, 0x97, + 0xe9, 0x70, 0xae, 0xbc, 0x3b, 0x19, 0x6c, 0xdb, 0x21, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, + 0x03, 0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, + 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xa7, 0xa5, 0x06, 0xb1, 0x2c, + 0xa6, 0x09, 0x60, 0xee, 0xd1, 0x97, 0xe9, 0x70, 0xae, 0xbc, 0x3b, + 0x19, 0x6c, 0xdb, 0x21, 0x30, 0x18, 0x06, 0x03, 0x55, 0x1d, 0x20, + 0x04, 0x11, 0x30, 0x0f, 0x30, 0x0d, 0x06, 0x0b, 0x2b, 0x06, 0x01, + 0x04, 0x01, 0xb0, 0x2d, 0x03, 0x04, 0x01, 0x01, 0x30, 0x0e, 0x06, + 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, + 0x01, 0x86, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, + 0x26, 0x77, 0x34, 0xdb, 0x94, 0x48, 0x86, 0x2a, 0x41, 0x9d, 0x2c, + 0x3e, 0x06, 0x90, 0x60, 0xc4, 0x8c, 0xac, 0x0b, 0x54, 0xb8, 0x1f, + 0xb9, 0x7b, 0xd3, 0x07, 0x39, 0xe4, 0xfa, 0x3e, 0x7b, 0xb2, 0x3d, + 0x4e, 0xed, 0x9f, 0x23, 0xbd, 0x97, 0xf3, 0x6b, 0x5c, 0xef, 0xee, + 0xfd, 0x40, 0xa6, 0xdf, 0xa1, 0x93, 0xa1, 0x0a, 0x86, 0xac, 0xef, + 0x20, 0xd0, 0x79, 0x01, 0xbd, 0x78, 0xf7, 0x19, 0xd8, 0x24, 0x31, + 0x34, 0x04, 0x01, 0xa6, 0xba, 0x15, 0x9a, 0xc3, 0x27, 0xdc, 0xd8, + 0x4f, 0x0f, 0xcc, 0x18, 0x63, 0xff, 0x99, 0x0f, 0x0e, 0x91, 0x6b, + 0x75, 0x16, 0xe1, 0x21, 0xfc, 0xd8, 0x26, 0xc7, 0x47, 0xb7, 0xa6, + 0xcf, 0x58, 0x72, 0x71, 0x7e, 0xba, 0xe1, 0x4d, 0x95, 0x47, 0x3b, + 0xc9, 0xaf, 0x6d, 0xa1, 0xb4, 0xc1, 0xec, 0x89, 0xf6, 0xb4, 0x0f, + 0x38, 0xb5, 0xe2, 0x64, 0xdc, 0x25, 0xcf, 0xa6, 0xdb, 0xeb, 0x9a, + 0x5c, 0x99, 0xa1, 0xc5, 0x08, 0xde, 0xfd, 0xe6, 0xda, 0xd5, 0xd6, + 0x5a, 0x45, 0x0c, 0xc4, 0xb7, 0xc2, 0xb5, 0x14, 0xef, 0xb4, 0x11, + 0xff, 0x0e, 0x15, 0xb5, 0xf5, 0xf5, 0xdb, 0xc6, 0xbd, 0xeb, 0x5a, + 0xa7, 0xf0, 0x56, 0x22, 0xa9, 0x3c, 0x65, 0x54, 0xc6, 0x15, 0xa8, + 0xbd, 0x86, 0x9e, 0xcd, 0x83, 0x96, 0x68, 0x7a, 0x71, 0x81, 0x89, + 0xe1, 0x0b, 0xe1, 0xea, 0x11, 0x1b, 0x68, 0x08, 0xcc, 0x69, 0x9e, + 0xec, 0x9e, 0x41, 0x9e, 0x44, 0x32, 0x26, 0x7a, 0xe2, 0x87, 0x0a, + 0x71, 0x3d, 0xeb, 0xe4, 0x5a, 0xa4, 0xd2, 0xdb, 0xc5, 0xcd, 0xc6, + 0xde, 0x60, 0x7f, 0xb9, 0xf3, 0x4f, 0x44, 0x92, 0xef, 0x2a, 0xb7, + 0x18, 0x3e, 0xa7, 0x19, 0xd9, 0x0b, 0x7d, 0xb1, 0x37, 0x41, 0x42, + 0xb0, 0xba, 0x60, 0x1d, 0xf2, 0xfe, 0x09, 0x11, 0xb0, 0xf0, 0x87, + 0x7b, 0xa7, 0x9d, 0x30, 0x82, 0x05, 0x60, 0x30, 0x82, 0x03, 0x48, + 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x14, 0x78, 0x58, 0x5f, 0x2e, + 0xad, 0x2c, 0x19, 0x4b, 0xe3, 0x37, 0x07, 0x35, 0x34, 0x13, 0x28, + 0xb5, 0x96, 0xd4, 0x65, 0x93, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x48, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1e, 0x30, 0x1c, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x15, 0x51, 0x75, 0x6f, 0x56, + 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, + 0x41, 0x20, 0x31, 0x20, 0x47, 0x33, 0x30, 0x1e, 0x17, 0x0d, 0x31, + 0x32, 0x30, 0x31, 0x31, 0x32, 0x31, 0x37, 0x32, 0x37, 0x34, 0x34, + 0x5a, 0x17, 0x0d, 0x34, 0x32, 0x30, 0x31, 0x31, 0x32, 0x31, 0x37, + 0x32, 0x37, 0x34, 0x34, 0x5a, 0x30, 0x48, 0x31, 0x0b, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, + 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, + 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x65, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x15, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, + 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x20, + 0x47, 0x33, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, + 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, + 0x01, 0x00, 0xa0, 0xbe, 0x50, 0x10, 0x8e, 0xe9, 0xf2, 0x6c, 0x40, + 0xb4, 0x04, 0x9c, 0x85, 0xb9, 0x31, 0xca, 0xdc, 0x2d, 0xe4, 0x11, + 0xa9, 0x04, 0x3c, 0x1b, 0x55, 0xc1, 0xe7, 0x58, 0x30, 0x1d, 0x24, + 0xb4, 0xc3, 0xef, 0x85, 0xde, 0x8c, 0x2c, 0xe1, 0xc1, 0x3d, 0xdf, + 0x82, 0xe6, 0x4f, 0xad, 0x47, 0x87, 0x6c, 0xec, 0x5b, 0x49, 0xc1, + 0x4a, 0xd5, 0xbb, 0x8f, 0xec, 0x87, 0xac, 0x7f, 0x82, 0x9a, 0x86, + 0xec, 0x3d, 0x03, 0x99, 0x52, 0x01, 0xd2, 0x35, 0x9e, 0xac, 0xda, + 0xf0, 0x53, 0xc9, 0x66, 0x3c, 0xd4, 0xac, 0x02, 0x01, 0xda, 0x24, + 0xd3, 0x3b, 0xa8, 0x02, 0x46, 0xaf, 0xa4, 0x1c, 0xe3, 0xf8, 0x73, + 0x58, 0x76, 0xb7, 0xf6, 0x0e, 0x90, 0x0d, 0xb5, 0xf0, 0xcf, 0xcc, + 0xfa, 0xf9, 0xc6, 0x4c, 0xe5, 0xc3, 0x86, 0x30, 0x0a, 0x8d, 0x17, + 0x7e, 0x35, 0xeb, 0xc5, 0xdf, 0xbb, 0x0e, 0x9c, 0xc0, 0x8d, 0x87, + 0xe3, 0x88, 0x38, 0x85, 0x67, 0xfa, 0x3e, 0xc7, 0xab, 0xe0, 0x13, + 0x9c, 0x05, 0x18, 0x98, 0xcf, 0x93, 0xf5, 0xb1, 0x92, 0xb4, 0xfc, + 0x23, 0xd3, 0xcf, 0xd5, 0xc4, 0x27, 0x49, 0xe0, 0x9e, 0x3c, 0x9b, + 0x08, 0xa3, 0x8b, 0x5d, 0x2a, 0x21, 0xe0, 0xfc, 0x39, 0xaa, 0x53, + 0xda, 0x7d, 0x7e, 0xcf, 0x1a, 0x09, 0x53, 0xbc, 0x5d, 0x05, 0x04, + 0xcf, 0xa1, 0x4a, 0x8f, 0x8b, 0x76, 0x82, 0x0d, 0xa1, 0xf8, 0xd2, + 0xc7, 0x14, 0x77, 0x5b, 0x90, 0x36, 0x07, 0x81, 0x9b, 0x3e, 0x06, + 0xfa, 0x52, 0x5e, 0x63, 0xc5, 0xa6, 0x00, 0xfe, 0xa5, 0xe9, 0x52, + 0x1b, 0x52, 0xb5, 0x92, 0x39, 0x72, 0x03, 0x09, 0x62, 0xbd, 0xb0, + 0x60, 0x16, 0x6e, 0xa6, 0xdd, 0x25, 0xc2, 0x03, 0x66, 0xdd, 0xf3, + 0x04, 0xd1, 0x40, 0xe2, 0x4e, 0x8b, 0x86, 0xf4, 0x6f, 0xe5, 0x83, + 0xa0, 0x27, 0x84, 0x5e, 0x04, 0xc1, 0xf5, 0x90, 0xbd, 0x30, 0x3d, + 0xc4, 0xef, 0xa8, 0x69, 0xbc, 0x38, 0x9b, 0xa4, 0xa4, 0x96, 0xd1, + 0x62, 0xda, 0x69, 0xc0, 0x01, 0x96, 0xae, 0xcb, 0xc4, 0x51, 0x34, + 0xea, 0x0c, 0xaa, 0xff, 0x21, 0x8e, 0x59, 0x8f, 0x4a, 0x5c, 0xe4, + 0x61, 0x9a, 0xa7, 0xd2, 0xe9, 0x2a, 0x78, 0x8d, 0x51, 0x3d, 0x3a, + 0x15, 0xee, 0xa2, 0x59, 0x8e, 0xa9, 0x5c, 0xde, 0xc5, 0xf9, 0x90, + 0x22, 0xe5, 0x88, 0x45, 0x71, 0xdd, 0x91, 0x99, 0x6c, 0x7a, 0x9f, + 0x3d, 0x3d, 0x98, 0x7c, 0x5e, 0xf6, 0xbe, 0x16, 0x68, 0xa0, 0x5e, + 0xae, 0x0b, 0x23, 0xfc, 0x5a, 0x0f, 0xaa, 0x22, 0x76, 0x2d, 0xc9, + 0xa1, 0x10, 0x1d, 0xe4, 0xd3, 0x44, 0x23, 0x90, 0x88, 0x9f, 0xc6, + 0x2a, 0xe6, 0xd7, 0xf5, 0x9a, 0xb3, 0x58, 0x1e, 0x2f, 0x30, 0x89, + 0x08, 0x1b, 0x54, 0xa2, 0xb5, 0x98, 0x23, 0xec, 0x08, 0x77, 0x1c, + 0x95, 0x5d, 0x61, 0xd1, 0xcb, 0x89, 0x9c, 0x5f, 0xa2, 0x4a, 0x91, + 0x9a, 0xef, 0x21, 0xaa, 0x49, 0x16, 0x08, 0xa8, 0xbd, 0x61, 0x28, + 0x31, 0xc9, 0x74, 0xad, 0x85, 0xf6, 0xd9, 0xc5, 0xb1, 0x8b, 0xd1, + 0xe5, 0x10, 0x32, 0x4d, 0x5f, 0x8b, 0x20, 0x3a, 0x3c, 0x49, 0x1f, + 0x33, 0x85, 0x59, 0x0d, 0xdb, 0xcb, 0x09, 0x75, 0x43, 0x69, 0x73, + 0xfb, 0x6b, 0x71, 0x7d, 0xf0, 0xdf, 0xc4, 0x4c, 0x7d, 0xc6, 0xa3, + 0x2e, 0xc8, 0x95, 0x79, 0xcb, 0x73, 0xa2, 0x8e, 0x4e, 0x4d, 0x24, + 0xfb, 0x5e, 0xe4, 0x04, 0xbe, 0x72, 0x1b, 0xa6, 0x27, 0x2d, 0x49, + 0x5a, 0x99, 0x7a, 0xd7, 0x5c, 0x09, 0x20, 0xb7, 0x7f, 0x94, 0xb9, + 0x4f, 0xf1, 0x0d, 0x1c, 0x5e, 0x88, 0x42, 0x1b, 0x11, 0xb7, 0xe7, + 0x91, 0xdb, 0x9e, 0x6c, 0xf4, 0x6a, 0xdf, 0x8c, 0x06, 0x98, 0x03, + 0xad, 0xcc, 0x28, 0xef, 0xa5, 0x47, 0xf3, 0x53, 0x02, 0x03, 0x01, + 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, + 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, + 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, + 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, + 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa3, 0x97, 0xd6, 0xf3, 0x5e, + 0xa2, 0x10, 0xe1, 0xab, 0x45, 0x9f, 0x3c, 0x17, 0x64, 0x3c, 0xee, + 0x01, 0x70, 0x9c, 0xcc, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, + 0x01, 0x00, 0x18, 0xfa, 0x5b, 0x75, 0xfc, 0x3e, 0x7a, 0xc7, 0x5f, + 0x77, 0xc7, 0xca, 0xdf, 0xcf, 0x5f, 0xc3, 0x12, 0xc4, 0x40, 0x5d, + 0xd4, 0x32, 0xaa, 0xb8, 0x6a, 0xd7, 0xd5, 0x15, 0x15, 0x46, 0x98, + 0x23, 0xa5, 0xe6, 0x90, 0x5b, 0x18, 0x99, 0x4c, 0xe3, 0xad, 0x42, + 0xa3, 0x82, 0x31, 0x36, 0x88, 0xcd, 0xe9, 0xfb, 0xc4, 0x04, 0x96, + 0x48, 0x8b, 0x01, 0xc7, 0x8d, 0x01, 0xcf, 0x5b, 0x33, 0x06, 0x96, + 0x46, 0x66, 0x74, 0x1d, 0x4f, 0xed, 0xc1, 0xb6, 0xb9, 0xb4, 0x0d, + 0x61, 0xcc, 0x63, 0x7e, 0xd7, 0x2e, 0x77, 0x8c, 0x96, 0x1c, 0x2a, + 0x23, 0x68, 0x6b, 0x85, 0x57, 0x76, 0x70, 0x33, 0x13, 0xfe, 0xe1, + 0x4f, 0xa6, 0x23, 0x77, 0x18, 0xfa, 0x1a, 0x8c, 0xe8, 0xbd, 0x65, + 0xc9, 0xcf, 0x3f, 0xf4, 0xc9, 0x17, 0xdc, 0xeb, 0xc7, 0xbc, 0xc0, + 0x04, 0x2e, 0x2d, 0x46, 0x2f, 0x69, 0x66, 0xc3, 0x1b, 0x8f, 0xfe, + 0xec, 0x3e, 0xd3, 0xca, 0x94, 0xbf, 0x76, 0x0a, 0x25, 0x0d, 0xa9, + 0x7b, 0x02, 0x1c, 0xa9, 0xd0, 0x3b, 0x5f, 0x0b, 0xc0, 0x81, 0x3a, + 0x3d, 0x64, 0xe1, 0xbf, 0xa7, 0x2d, 0x4e, 0xbd, 0x4d, 0xc4, 0xd8, + 0x29, 0xc6, 0x22, 0x18, 0xd0, 0xc5, 0xac, 0x72, 0x02, 0x82, 0x3f, + 0xaa, 0x3a, 0xa2, 0x3a, 0x22, 0x97, 0x31, 0xdd, 0x08, 0x63, 0xc3, + 0x75, 0x14, 0xb9, 0x60, 0x28, 0x2d, 0x5b, 0x68, 0xe0, 0x16, 0xa9, + 0x66, 0x82, 0x23, 0x51, 0xf5, 0xeb, 0x53, 0xd8, 0x31, 0x9b, 0x7b, + 0xe9, 0xb7, 0x9d, 0x4b, 0xeb, 0x88, 0x16, 0xcf, 0xf9, 0x5d, 0x38, + 0x8a, 0x49, 0x30, 0x8f, 0xed, 0xf1, 0xeb, 0x19, 0xf4, 0x77, 0x1a, + 0x31, 0x18, 0x4d, 0x67, 0x54, 0x6c, 0x2f, 0x6f, 0x65, 0xf9, 0xdb, + 0x3d, 0xec, 0x21, 0xec, 0x5e, 0xf4, 0xf4, 0x8b, 0xca, 0x60, 0x65, + 0x54, 0xd1, 0x71, 0x64, 0xf4, 0xf9, 0xa6, 0xa3, 0x81, 0x33, 0x36, + 0x33, 0x71, 0xf0, 0xa4, 0x78, 0x5f, 0x4e, 0xad, 0x83, 0x21, 0xde, + 0x34, 0x49, 0x8d, 0xe8, 0x59, 0xac, 0x9d, 0xf2, 0x76, 0x5a, 0x36, + 0xf2, 0x13, 0xf4, 0xaf, 0xe0, 0x09, 0xc7, 0x61, 0x2a, 0x6c, 0xf7, + 0xe0, 0x9d, 0xae, 0xbb, 0x86, 0x4a, 0x28, 0x6f, 0x2e, 0xee, 0xb4, + 0x79, 0xcd, 0x90, 0x33, 0xc3, 0xb3, 0x76, 0xfa, 0xf5, 0xf0, 0x6c, + 0x9d, 0x01, 0x90, 0xfa, 0x9e, 0x90, 0xf6, 0x9c, 0x72, 0xcf, 0x47, + 0xda, 0xc3, 0x1f, 0xe4, 0x35, 0x20, 0x53, 0xf2, 0x54, 0xd1, 0xdf, + 0x61, 0x83, 0xa6, 0x02, 0xe2, 0x25, 0x38, 0xde, 0x85, 0x32, 0x2d, + 0x5e, 0x73, 0x90, 0x52, 0x5d, 0x42, 0xc4, 0xce, 0x3d, 0x4b, 0xe1, + 0xf9, 0x19, 0x84, 0x1d, 0xd5, 0xa2, 0x50, 0xcc, 0x41, 0xfb, 0x41, + 0x14, 0xc3, 0xbd, 0xd6, 0xc9, 0x5a, 0xa3, 0x63, 0x66, 0x02, 0x80, + 0xbd, 0x05, 0x3a, 0x3b, 0x47, 0x9c, 0xec, 0x00, 0x26, 0x4c, 0xf5, + 0x88, 0x51, 0xbf, 0xa8, 0x23, 0x7f, 0x18, 0x07, 0xb0, 0x0b, 0xed, + 0x8b, 0x26, 0xa1, 0x64, 0xd3, 0x61, 0x4a, 0xeb, 0x5c, 0x9f, 0xde, + 0xb3, 0xaf, 0x67, 0x03, 0xb3, 0x1f, 0xdd, 0x6d, 0x5d, 0x69, 0x68, + 0x69, 0xab, 0x5e, 0x3a, 0xec, 0x7c, 0x69, 0xbc, 0xc7, 0x3b, 0x85, + 0x4e, 0x9e, 0x15, 0xb9, 0xb4, 0x15, 0x4f, 0xc3, 0x95, 0x7a, 0x58, + 0xd7, 0xc9, 0x6c, 0xe9, 0x6c, 0xb9, 0xf3, 0x29, 0x63, 0x5e, 0xb4, + 0x2c, 0xf0, 0x2d, 0x3d, 0xed, 0x5a, 0x65, 0xe0, 0xa9, 0x5b, 0x40, + 0xc2, 0x48, 0x99, 0x81, 0x6d, 0x9e, 0x1f, 0x06, 0x2a, 0x3c, 0x12, + 0xb4, 0x8b, 0x0f, 0x9b, 0xa2, 0x24, 0xf0, 0xa6, 0x8d, 0xd6, 0x7a, + 0xe0, 0x4b, 0xb6, 0x64, 0x96, 0x63, 0x95, 0x84, 0xc2, 0x4a, 0xcd, + 0x1c, 0x2e, 0x24, 0x87, 0x33, 0x60, 0xe5, 0xc3, 0x30, 0x82, 0x05, + 0x60, 0x30, 0x82, 0x03, 0x48, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, + 0x14, 0x44, 0x57, 0x34, 0x24, 0x5b, 0x81, 0x89, 0x9b, 0x35, 0xf2, + 0xce, 0xb8, 0x2b, 0x3b, 0x5b, 0xa7, 0x26, 0xf0, 0x75, 0x28, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x0b, 0x05, 0x00, 0x30, 0x48, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, + 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, + 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, + 0x15, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, + 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x20, 0x47, 0x33, + 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32, 0x30, 0x31, 0x31, 0x32, 0x31, + 0x38, 0x35, 0x39, 0x33, 0x32, 0x5a, 0x17, 0x0d, 0x34, 0x32, 0x30, + 0x31, 0x31, 0x32, 0x31, 0x38, 0x35, 0x39, 0x33, 0x32, 0x5a, 0x30, + 0x48, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, + 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1e, 0x30, + 0x1c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x15, 0x51, 0x75, 0x6f, + 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, + 0x43, 0x41, 0x20, 0x32, 0x20, 0x47, 0x33, 0x30, 0x82, 0x02, 0x22, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, + 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xa1, 0xae, 0x25, 0xb2, + 0x01, 0x18, 0xdc, 0x57, 0x88, 0x3f, 0x46, 0xeb, 0xf9, 0xaf, 0xe2, + 0xeb, 0x23, 0x71, 0xe2, 0x9a, 0xd1, 0x61, 0x66, 0x21, 0x5f, 0xaa, + 0xaf, 0x27, 0x51, 0xe5, 0x6e, 0x1b, 0x16, 0xd4, 0x2d, 0x7d, 0x50, + 0xb0, 0x53, 0x77, 0xbd, 0x78, 0x3a, 0x60, 0xe2, 0x64, 0x02, 0x9b, + 0x7c, 0x86, 0x9b, 0xd6, 0x1a, 0x8e, 0xad, 0xff, 0x1f, 0x15, 0x7f, + 0xd5, 0x95, 0x1e, 0x12, 0xcb, 0xe6, 0x14, 0x84, 0x04, 0xc1, 0xdf, + 0x36, 0xb3, 0x16, 0x9f, 0x8a, 0xe3, 0xc9, 0xdb, 0x98, 0x34, 0xce, + 0xd8, 0x33, 0x17, 0x28, 0x46, 0xfc, 0xa7, 0xc9, 0xf0, 0xd2, 0xb4, + 0xd5, 0x4d, 0x09, 0x72, 0x49, 0xf9, 0xf2, 0x87, 0xe3, 0xa9, 0xda, + 0x7d, 0xa1, 0x7d, 0x6b, 0xb2, 0x3a, 0x25, 0xa9, 0x6d, 0x52, 0x44, + 0xac, 0xf8, 0xbe, 0x6e, 0xfb, 0xdc, 0xa6, 0x73, 0x91, 0x90, 0x61, + 0xa6, 0x03, 0x14, 0x20, 0xf2, 0xe7, 0x87, 0xa3, 0x88, 0xad, 0xad, + 0xa0, 0x8c, 0xff, 0xa6, 0x0b, 0x25, 0x52, 0x25, 0xe7, 0x16, 0x01, + 0xd5, 0xcb, 0xb8, 0x35, 0x81, 0x0c, 0xa3, 0x3b, 0xf0, 0xe1, 0xe1, + 0xfc, 0x5a, 0x5d, 0xce, 0x80, 0x71, 0x6d, 0xf8, 0x49, 0xab, 0x3e, + 0x3b, 0xba, 0xb8, 0xd7, 0x80, 0x01, 0xfb, 0xa5, 0xeb, 0x5b, 0xb3, + 0xc5, 0x5e, 0x60, 0x2a, 0x31, 0xa0, 0xaf, 0x37, 0xe8, 0x20, 0x3a, + 0x9f, 0xa8, 0x32, 0x2c, 0x0c, 0xcc, 0x09, 0x1d, 0xd3, 0x9e, 0x8e, + 0x5d, 0xbc, 0x4c, 0x98, 0xee, 0xc5, 0x1a, 0x68, 0x7b, 0xec, 0x53, + 0xa6, 0xe9, 0x14, 0x35, 0xa3, 0xdf, 0xcd, 0x80, 0x9f, 0x0c, 0x48, + 0xfb, 0x1c, 0xf4, 0xf1, 0xbf, 0x4a, 0xb8, 0xfa, 0xd5, 0x8c, 0x71, + 0x4a, 0xc7, 0x1f, 0xad, 0xfe, 0x41, 0x9a, 0xb3, 0x83, 0x5d, 0xf2, + 0x84, 0x56, 0xef, 0xa5, 0x57, 0x43, 0xce, 0x29, 0xad, 0x8c, 0xab, + 0x55, 0xbf, 0xc4, 0xfb, 0x5b, 0x01, 0xdd, 0x23, 0x21, 0xa1, 0x58, + 0x00, 0x8e, 0xc3, 0xd0, 0x6a, 0x13, 0xed, 0x13, 0xe3, 0x12, 0x2b, + 0x80, 0xdc, 0x67, 0xe6, 0x95, 0xb2, 0xcd, 0x1e, 0x22, 0x6e, 0x2a, + 0xf8, 0x41, 0xd4, 0xf2, 0xca, 0x14, 0x07, 0x8d, 0x8a, 0x55, 0x12, + 0xc6, 0x69, 0xf5, 0xb8, 0x86, 0x68, 0x2f, 0x53, 0x5e, 0xb0, 0xd2, + 0xaa, 0x21, 0xc1, 0x98, 0xe6, 0x30, 0xe3, 0x67, 0x55, 0xc7, 0x9b, + 0x6e, 0xac, 0x19, 0xa8, 0x55, 0xa6, 0x45, 0x06, 0xd0, 0x23, 0x3a, + 0xdb, 0xeb, 0x65, 0x5d, 0x2a, 0x11, 0x11, 0xf0, 0x3b, 0x4f, 0xca, + 0x6d, 0xf4, 0x34, 0xc4, 0x71, 0xe4, 0xff, 0x00, 0x5a, 0xf6, 0x5c, + 0xae, 0x23, 0x60, 0x85, 0x73, 0xf1, 0xe4, 0x10, 0xb1, 0x25, 0xae, + 0xd5, 0x92, 0xbb, 0x13, 0xc1, 0x0c, 0xe0, 0x39, 0xda, 0xb4, 0x39, + 0x57, 0xb5, 0xab, 0x35, 0xaa, 0x72, 0x21, 0x3b, 0x83, 0x35, 0xe7, + 0x31, 0xdf, 0x7a, 0x21, 0x6e, 0xb8, 0x32, 0x08, 0x7d, 0x1d, 0x32, + 0x91, 0x15, 0x4a, 0x62, 0x72, 0xcf, 0xe3, 0x77, 0xa1, 0xbc, 0xd5, + 0x11, 0x1b, 0x76, 0x01, 0x67, 0x08, 0xe0, 0x41, 0x0b, 0xc3, 0xeb, + 0x15, 0x6e, 0xf8, 0xa4, 0x19, 0xd9, 0xa2, 0xab, 0xaf, 0xe2, 0x27, + 0x52, 0x56, 0x2b, 0x02, 0x8a, 0x2c, 0x14, 0x24, 0xf9, 0xbf, 0x42, + 0x02, 0xbf, 0x26, 0xc8, 0xc6, 0x8f, 0xe0, 0x6e, 0x38, 0x7d, 0x53, + 0x2d, 0xe5, 0xed, 0x98, 0xb3, 0x95, 0x63, 0x68, 0x7f, 0xf9, 0x35, + 0xf4, 0xdf, 0x88, 0xc5, 0x60, 0x35, 0x92, 0xc0, 0x7c, 0x69, 0x1c, + 0x61, 0x95, 0x16, 0xd0, 0xeb, 0xde, 0x0b, 0xaf, 0x3e, 0x04, 0x10, + 0x45, 0x65, 0x58, 0x50, 0x38, 0xaf, 0x48, 0xf2, 0x59, 0xb6, 0x16, + 0xf2, 0x3c, 0x0d, 0x90, 0x02, 0xc6, 0x70, 0x2e, 0x01, 0xad, 0x3c, + 0x15, 0xd7, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, + 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0xed, 0xe7, 0x6f, 0x76, 0x5a, 0xbf, 0x60, 0xec, 0x49, 0x5b, 0xc6, + 0xa5, 0x77, 0xbb, 0x72, 0x16, 0x71, 0x9b, 0xc4, 0x3d, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x91, 0xdf, 0x80, 0x3f, + 0x43, 0x09, 0x7e, 0x71, 0xc2, 0xf7, 0xeb, 0xb3, 0x88, 0x8f, 0xe1, + 0x51, 0xb2, 0xbc, 0x3d, 0x75, 0xf9, 0x28, 0x5d, 0xc8, 0xbc, 0x99, + 0x9b, 0x7b, 0x5d, 0xaa, 0xe5, 0xca, 0xe1, 0x0a, 0xf7, 0xe8, 0xb2, + 0xd3, 0x9f, 0xdd, 0x67, 0x31, 0x7e, 0xba, 0x01, 0xaa, 0xc7, 0x6a, + 0x41, 0x3b, 0x90, 0xd4, 0x08, 0x5c, 0xb2, 0x60, 0x6a, 0x90, 0xf0, + 0xc8, 0xce, 0x03, 0x62, 0xf9, 0x8b, 0xed, 0xfb, 0x6e, 0x2a, 0xdc, + 0x06, 0x4d, 0x3c, 0x29, 0x0f, 0x89, 0x16, 0x8a, 0x58, 0x4c, 0x48, + 0x0f, 0xe8, 0x84, 0x61, 0xea, 0x3c, 0x72, 0xa6, 0x77, 0xe4, 0x42, + 0xae, 0x88, 0xa3, 0x43, 0x58, 0x79, 0x7e, 0xae, 0xca, 0xa5, 0x53, + 0x0d, 0xa9, 0x3d, 0x70, 0xbd, 0x20, 0x19, 0x61, 0xa4, 0x6c, 0x38, + 0xfc, 0x43, 0x32, 0xe1, 0xc1, 0x47, 0xff, 0xf8, 0xec, 0xf1, 0x11, + 0x22, 0x32, 0x96, 0x9c, 0xc2, 0xf6, 0x5b, 0x69, 0x96, 0x7b, 0x20, + 0x0c, 0x43, 0x41, 0x9a, 0x5b, 0xf6, 0x59, 0x19, 0x88, 0xde, 0x55, + 0x88, 0x37, 0x51, 0x0b, 0x78, 0x5c, 0x0a, 0x1e, 0xa3, 0x42, 0xfd, + 0xc7, 0x9d, 0x88, 0x0f, 0xc0, 0xf2, 0x78, 0x02, 0x24, 0x54, 0x93, + 0xaf, 0x89, 0x87, 0x88, 0xc9, 0x4a, 0x80, 0x1d, 0xea, 0xd0, 0x6e, + 0x3e, 0x61, 0x2e, 0x36, 0xbb, 0x35, 0x0e, 0x27, 0x96, 0xfd, 0x66, + 0x34, 0x3b, 0x61, 0x72, 0x73, 0xf1, 0x16, 0x5c, 0x47, 0x06, 0x54, + 0x49, 0x00, 0x7a, 0x58, 0x12, 0xb0, 0x0a, 0xef, 0x85, 0xfd, 0xb1, + 0xb8, 0x33, 0x75, 0x6a, 0x93, 0x1c, 0x12, 0xe6, 0x60, 0x5e, 0x6f, + 0x1d, 0x7f, 0xc9, 0x1f, 0x23, 0xcb, 0x84, 0x61, 0x9f, 0x1e, 0x82, + 0x44, 0xf9, 0x5f, 0xad, 0x62, 0x55, 0x24, 0x9a, 0x52, 0x98, 0xed, + 0x51, 0xe7, 0xa1, 0x7e, 0x97, 0x3a, 0xe6, 0x2f, 0x1f, 0x11, 0xda, + 0x53, 0x80, 0x2c, 0x85, 0x9e, 0xab, 0x35, 0x10, 0xdb, 0x22, 0x5f, + 0x6a, 0xc5, 0x5e, 0x97, 0x53, 0xf2, 0x32, 0x02, 0x09, 0x30, 0xa3, + 0x58, 0xf0, 0x0d, 0x01, 0xd5, 0x72, 0xc6, 0xb1, 0x7c, 0x69, 0x7b, + 0xc3, 0xf5, 0x36, 0x45, 0xcc, 0x61, 0x6e, 0x5e, 0x4c, 0x94, 0xc5, + 0x5e, 0xae, 0xe8, 0x0e, 0x5e, 0x8b, 0xbf, 0xf7, 0xcd, 0xe0, 0xed, + 0xa1, 0x0e, 0x1b, 0x33, 0xee, 0x54, 0x18, 0xfe, 0x0f, 0xbe, 0xef, + 0x7e, 0x84, 0x6b, 0x43, 0xe3, 0x70, 0x98, 0xdb, 0x5d, 0x75, 0xb2, + 0x0d, 0x59, 0x07, 0x85, 0x15, 0x23, 0x39, 0xd6, 0xf1, 0xdf, 0xa9, + 0x26, 0x0f, 0xd6, 0x48, 0xc7, 0xb3, 0xa6, 0x22, 0xf5, 0x33, 0x37, + 0x5a, 0x95, 0x47, 0x9f, 0x7b, 0xba, 0x18, 0x15, 0x6f, 0xff, 0xd6, + 0x14, 0x64, 0x83, 0x49, 0xd2, 0x0a, 0x67, 0x21, 0xdb, 0x0f, 0x35, + 0x63, 0x60, 0x28, 0x22, 0xe3, 0xb1, 0x95, 0x83, 0xcd, 0x85, 0xa6, + 0xdd, 0x2f, 0x0f, 0xe7, 0x67, 0x52, 0x6e, 0xbb, 0x2f, 0x85, 0x7c, + 0xf5, 0x4a, 0x73, 0xe7, 0xc5, 0x3e, 0xc0, 0xbd, 0x21, 0x12, 0x05, + 0x3f, 0xfc, 0xb7, 0x03, 0x49, 0x02, 0x5b, 0xc8, 0x25, 0xe6, 0xe2, + 0x54, 0x38, 0xf5, 0x79, 0x87, 0x8c, 0x1d, 0x53, 0xb2, 0x4e, 0x85, + 0x7b, 0x06, 0x38, 0xc7, 0x2c, 0xf8, 0xf8, 0xb0, 0x72, 0x8d, 0x25, + 0xe5, 0x77, 0x52, 0xf4, 0x03, 0x1c, 0x48, 0xa6, 0x50, 0x5f, 0x88, + 0x20, 0x30, 0x6e, 0xf2, 0x82, 0x43, 0xab, 0x3d, 0x97, 0x84, 0xe7, + 0x53, 0xfb, 0x21, 0xc1, 0x4f, 0x0f, 0x22, 0x9a, 0x86, 0xb8, 0x59, + 0x2a, 0xf6, 0x47, 0x3d, 0x19, 0x88, 0x2d, 0xe8, 0x85, 0xe1, 0x9e, + 0xec, 0x85, 0x08, 0x6a, 0xb1, 0x6c, 0x34, 0xc9, 0x1d, 0xec, 0x48, + 0x2b, 0x3b, 0x78, 0xed, 0x66, 0xc4, 0x8e, 0x79, 0x69, 0x83, 0xde, + 0x7f, 0x8c, 0x30, 0x82, 0x05, 0x60, 0x30, 0x82, 0x03, 0x48, 0xa0, + 0x03, 0x02, 0x01, 0x02, 0x02, 0x14, 0x2e, 0xf5, 0x9b, 0x02, 0x28, + 0xa7, 0xdb, 0x7a, 0xff, 0xd5, 0xa3, 0xa9, 0xee, 0xbd, 0x03, 0xa0, + 0xcf, 0x12, 0x6a, 0x1d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x48, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, + 0x4d, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x10, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x13, 0x15, 0x51, 0x75, 0x6f, 0x56, 0x61, + 0x64, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, + 0x20, 0x33, 0x20, 0x47, 0x33, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32, + 0x30, 0x31, 0x31, 0x32, 0x32, 0x30, 0x32, 0x36, 0x33, 0x32, 0x5a, + 0x17, 0x0d, 0x34, 0x32, 0x30, 0x31, 0x31, 0x32, 0x32, 0x30, 0x32, + 0x36, 0x33, 0x32, 0x5a, 0x30, 0x48, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x4d, 0x31, 0x19, 0x30, + 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x51, 0x75, 0x6f, + 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x65, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x15, 0x51, 0x75, 0x6f, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, + 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x20, 0x47, + 0x33, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, + 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, + 0x00, 0xb3, 0xcb, 0x0e, 0x10, 0x67, 0x8e, 0xea, 0x14, 0x97, 0xa7, + 0x32, 0x2a, 0x0a, 0x56, 0x36, 0x7f, 0x68, 0x4c, 0xc7, 0xb3, 0x6f, + 0x3a, 0x23, 0x14, 0x91, 0xff, 0x19, 0x7f, 0xa5, 0xca, 0xac, 0xee, + 0xb3, 0x76, 0x9d, 0x7a, 0xe9, 0x8b, 0x1b, 0xab, 0x6b, 0x31, 0xdb, + 0xfa, 0x0b, 0x53, 0x4c, 0xaf, 0xc5, 0xa5, 0x1a, 0x79, 0x3c, 0x8a, + 0x4c, 0xff, 0xac, 0xdf, 0x25, 0xde, 0x4e, 0xd9, 0x82, 0x32, 0x0b, + 0x44, 0xde, 0xca, 0xdb, 0x8c, 0xac, 0xa3, 0x6e, 0x16, 0x83, 0x3b, + 0xa6, 0x64, 0x4b, 0x32, 0x89, 0xfb, 0x16, 0x16, 0x38, 0x7e, 0xeb, + 0x43, 0xe2, 0xd3, 0x74, 0x4a, 0xc2, 0x62, 0x0a, 0x73, 0x0a, 0xdd, + 0x49, 0xb3, 0x57, 0xd2, 0xb0, 0x0a, 0x85, 0x9d, 0x71, 0x3c, 0xde, + 0xa3, 0xcb, 0xc0, 0x32, 0xf3, 0x01, 0x39, 0x20, 0x43, 0x1b, 0x35, + 0xd1, 0x53, 0xb3, 0xb1, 0xee, 0xc5, 0x93, 0x69, 0x82, 0x3e, 0x16, + 0xb5, 0x28, 0x46, 0xa1, 0xde, 0xea, 0x89, 0x09, 0xed, 0x43, 0xb8, + 0x05, 0x46, 0x8a, 0x86, 0xf5, 0x59, 0x47, 0xbe, 0x1b, 0x6f, 0x01, + 0x21, 0x10, 0xb9, 0xfd, 0xa9, 0xd2, 0x28, 0xca, 0x10, 0x39, 0x09, + 0xca, 0x13, 0x36, 0xcf, 0x9c, 0xad, 0xad, 0x40, 0x74, 0x79, 0x2b, + 0x02, 0x3f, 0x34, 0xff, 0xfa, 0x20, 0x69, 0x7d, 0xd3, 0xee, 0x61, + 0xf5, 0xba, 0xb3, 0xe7, 0x30, 0xd0, 0x37, 0x23, 0x86, 0x72, 0x61, + 0x45, 0x29, 0x48, 0x59, 0x68, 0x6f, 0x77, 0xa6, 0x2e, 0x81, 0xbe, + 0x07, 0x4d, 0x6f, 0xaf, 0xce, 0xc4, 0x45, 0x13, 0x91, 0x14, 0x70, + 0x06, 0x8f, 0x1f, 0x9f, 0xf8, 0x87, 0x69, 0xb1, 0x0e, 0xef, 0xc3, + 0x89, 0x19, 0xeb, 0xea, 0x1c, 0x61, 0xfc, 0x7a, 0x6c, 0x8a, 0xdc, + 0xd6, 0x03, 0x0b, 0x9e, 0x26, 0xba, 0x12, 0xdd, 0xd4, 0x54, 0x39, + 0xab, 0x26, 0xa3, 0x33, 0xea, 0x75, 0x81, 0xda, 0x2d, 0xcd, 0x0f, + 0x4f, 0xe4, 0x03, 0xd1, 0xef, 0x15, 0x97, 0x1b, 0x6b, 0x90, 0xc5, + 0x02, 0x90, 0x93, 0x66, 0x02, 0x21, 0xb1, 0x47, 0xde, 0x8b, 0x9a, + 0x4a, 0x80, 0xb9, 0x55, 0x8f, 0xb5, 0xa2, 0x2f, 0xc0, 0xd6, 0x33, + 0x67, 0xda, 0x7e, 0xc4, 0xa7, 0xb4, 0x04, 0x44, 0xeb, 0x47, 0xfb, + 0xe6, 0x58, 0xb9, 0xf7, 0x0c, 0xf0, 0x7b, 0x2b, 0xb1, 0xc0, 0x70, + 0x29, 0xc3, 0x40, 0x62, 0x2d, 0x3b, 0x48, 0x69, 0xdc, 0x23, 0x3c, + 0x48, 0xeb, 0x7b, 0x09, 0x79, 0xa9, 0x6d, 0xda, 0xa8, 0x30, 0x98, + 0xcf, 0x80, 0x72, 0x03, 0x88, 0xa6, 0x5b, 0x46, 0xae, 0x72, 0x79, + 0x7c, 0x08, 0x03, 0x21, 0x65, 0xae, 0xb7, 0xe1, 0x1c, 0xa5, 0xb1, + 0x2a, 0xa2, 0x31, 0xde, 0x66, 0x04, 0xf7, 0xc0, 0x74, 0xe8, 0x71, + 0xde, 0xff, 0x3d, 0x59, 0xcc, 0x96, 0x26, 0x12, 0x8b, 0x85, 0x95, + 0x57, 0x1a, 0xab, 0x6b, 0x75, 0x0b, 0x44, 0x3d, 0x11, 0x28, 0x3c, + 0x7b, 0x61, 0xb7, 0xe2, 0x8f, 0x67, 0x4f, 0xe5, 0xec, 0x3c, 0x4c, + 0x60, 0x80, 0x69, 0x57, 0x38, 0x1e, 0x01, 0x5b, 0x8d, 0x55, 0xe8, + 0xc7, 0xdf, 0xc0, 0xcc, 0x77, 0x23, 0x34, 0x49, 0x75, 0x7c, 0xf6, + 0x98, 0x11, 0xeb, 0x2d, 0xde, 0xed, 0x41, 0x2e, 0x14, 0x05, 0x02, + 0x7f, 0xe0, 0xfe, 0x20, 0xeb, 0x35, 0xe7, 0x11, 0xac, 0x22, 0xce, + 0x57, 0x3d, 0xde, 0xc9, 0x30, 0x6d, 0x10, 0x03, 0x85, 0xcd, 0xf1, + 0xff, 0x8c, 0x16, 0xb5, 0xc1, 0xb2, 0x3e, 0x88, 0x6c, 0x60, 0x7f, + 0x90, 0x4f, 0x95, 0xf7, 0xf6, 0x2d, 0xad, 0x01, 0x39, 0x07, 0x04, + 0xfa, 0x75, 0x80, 0x7d, 0xbf, 0x49, 0x50, 0xed, 0xef, 0xc9, 0xc4, + 0x7c, 0x1c, 0xeb, 0x80, 0x7e, 0xdb, 0xb6, 0xd0, 0xdd, 0x13, 0xfe, + 0xc9, 0xd3, 0x9c, 0xd7, 0xb2, 0x97, 0xa9, 0x02, 0x03, 0x01, 0x00, + 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, + 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, + 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, + 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, + 0x0e, 0x04, 0x16, 0x04, 0x14, 0xc6, 0x17, 0xd0, 0xbc, 0xa8, 0xea, + 0x02, 0x43, 0xf2, 0x1b, 0x06, 0x99, 0x5d, 0x2b, 0x90, 0x20, 0xb9, + 0xd7, 0x9c, 0xe4, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, + 0x00, 0x34, 0x61, 0xd9, 0x56, 0xb5, 0x12, 0x87, 0x55, 0x4d, 0xdd, + 0xa3, 0x35, 0x31, 0x46, 0xbb, 0xa4, 0x07, 0x72, 0xbc, 0x5f, 0x61, + 0x62, 0xe8, 0xa5, 0xfb, 0x0b, 0x37, 0xb1, 0x3c, 0xb6, 0xb3, 0xfa, + 0x29, 0x9d, 0x7f, 0x02, 0xf5, 0xa4, 0xc9, 0xa8, 0x93, 0xb7, 0x7a, + 0x71, 0x28, 0x69, 0x8f, 0x73, 0xe1, 0x52, 0x90, 0xda, 0xd5, 0xbe, + 0x3a, 0xe5, 0xb7, 0x76, 0x6a, 0x56, 0x80, 0x21, 0xdf, 0x5d, 0xe6, + 0xe9, 0x3a, 0x9e, 0xe5, 0x3e, 0xf6, 0xa2, 0x69, 0xc7, 0x2a, 0x0a, + 0xb0, 0x18, 0x47, 0xdc, 0x20, 0x70, 0x7d, 0x52, 0xa3, 0x3e, 0x59, + 0x7c, 0xc1, 0xba, 0xc9, 0xc8, 0x15, 0x40, 0x61, 0xca, 0x72, 0xd6, + 0x70, 0xac, 0xd2, 0xb7, 0xf0, 0x1c, 0xe4, 0x86, 0x29, 0xf0, 0xce, + 0xef, 0x68, 0x63, 0xd0, 0xb5, 0x20, 0x8a, 0x15, 0x61, 0x9a, 0x7e, + 0x86, 0x98, 0xb4, 0xc9, 0xc2, 0x76, 0xfb, 0xcc, 0xba, 0x30, 0x16, + 0xcc, 0xa3, 0x61, 0xc6, 0x74, 0x13, 0xe5, 0x6b, 0xef, 0xa3, 0x15, + 0xea, 0x03, 0xfe, 0x13, 0x8b, 0x64, 0xe4, 0xd3, 0xc1, 0xd2, 0xe8, + 0x84, 0xfb, 0x49, 0xd1, 0x10, 0x4d, 0x79, 0x66, 0xeb, 0xaa, 0xfd, + 0xf4, 0x8d, 0x31, 0x1e, 0x70, 0x14, 0xad, 0xdc, 0xde, 0x67, 0x13, + 0x4c, 0x81, 0x15, 0x61, 0xbc, 0xb7, 0xd9, 0x91, 0x77, 0x71, 0x19, + 0x81, 0x60, 0xbb, 0xf0, 0x58, 0xa5, 0xb5, 0x9c, 0x0b, 0xf7, 0x8f, + 0x22, 0x55, 0x27, 0xc0, 0x4b, 0x01, 0x6d, 0x3b, 0x99, 0x0d, 0xd4, + 0x1d, 0x9b, 0x63, 0x67, 0x2f, 0xd0, 0xee, 0x0d, 0xca, 0x66, 0xbc, + 0x94, 0x4f, 0xa6, 0xad, 0xed, 0xfc, 0xee, 0x63, 0xac, 0x57, 0x3f, + 0x65, 0x25, 0xcf, 0xb2, 0x86, 0x8f, 0xd0, 0x08, 0xff, 0xb8, 0x76, + 0x14, 0x6e, 0xde, 0xe5, 0x27, 0xec, 0xab, 0x78, 0xb5, 0x53, 0xb9, + 0xb6, 0x3f, 0xe8, 0x20, 0xf9, 0xd2, 0xa8, 0xbe, 0x61, 0x46, 0xca, + 0x87, 0x8c, 0x84, 0xf3, 0xf9, 0xf1, 0xa0, 0x68, 0x9b, 0x22, 0x1e, + 0x81, 0x26, 0x9b, 0x10, 0x04, 0x91, 0x71, 0xc0, 0x06, 0x1f, 0xdc, + 0xa0, 0xd3, 0xb9, 0x56, 0xa7, 0xe3, 0x98, 0x2d, 0x7f, 0x83, 0x9d, + 0xdf, 0x8c, 0x2b, 0x9c, 0x32, 0x8e, 0x32, 0x94, 0xf0, 0x01, 0x3c, + 0x22, 0x2a, 0x9f, 0x43, 0xc2, 0x2e, 0xc3, 0x98, 0x39, 0x07, 0x38, + 0x7b, 0xfc, 0x5e, 0x00, 0x42, 0x1f, 0xf3, 0x32, 0x26, 0x79, 0x83, + 0x84, 0xf6, 0xe5, 0xf0, 0xc1, 0x51, 0x12, 0xc0, 0x0b, 0x1e, 0x04, + 0x23, 0x0c, 0x54, 0xa5, 0x4c, 0x2f, 0x49, 0xc5, 0x4a, 0xd1, 0xb6, + 0x6e, 0x60, 0x0d, 0x6b, 0xfc, 0x6b, 0x8b, 0x85, 0x24, 0x64, 0xb7, + 0x89, 0x0e, 0xab, 0x25, 0x47, 0x5b, 0x3c, 0xcf, 0x7e, 0x49, 0xbd, + 0xc7, 0xe9, 0x0a, 0xc6, 0xda, 0xf7, 0x7e, 0x0e, 0x17, 0x08, 0xd3, + 0x48, 0x97, 0xd0, 0x71, 0x92, 0xf0, 0x0f, 0x39, 0x3e, 0x34, 0x6a, + 0x1c, 0x7d, 0xd8, 0xf2, 0x22, 0xae, 0xbb, 0x69, 0xf4, 0x33, 0xb4, + 0xa6, 0x48, 0x55, 0xd1, 0x0f, 0x0e, 0x26, 0xe8, 0xec, 0xb6, 0x0b, + 0x2d, 0xa7, 0x85, 0x35, 0xcd, 0xfd, 0x59, 0xc8, 0x9f, 0xd1, 0xcd, + 0x3e, 0x5a, 0x29, 0x34, 0xb9, 0x3d, 0x84, 0xce, 0xb1, 0x65, 0xd4, + 0x59, 0x91, 0x91, 0x56, 0x75, 0x21, 0xc1, 0x77, 0x9e, 0xf9, 0x7a, + 0xe1, 0x60, 0x9d, 0xd3, 0xad, 0x04, 0x18, 0xf4, 0x7c, 0xeb, 0x5e, + 0x93, 0x8f, 0x53, 0x4a, 0x22, 0x29, 0xf8, 0x48, 0x2b, 0x3e, 0x4d, + 0x86, 0xac, 0x5b, 0x7f, 0xcb, 0x06, 0x99, 0x59, 0x60, 0xd8, 0x58, + 0x65, 0x95, 0x8d, 0x44, 0xd1, 0xf7, 0x7f, 0x7e, 0x27, 0x7f, 0x7d, + 0xae, 0x80, 0xf5, 0x07, 0x4c, 0xb6, 0x3e, 0x9c, 0x71, 0x54, 0x99, + 0x04, 0x4b, 0xfd, 0x58, 0xf9, 0x98, 0xf4, 0x30, 0x82, 0x03, 0x96, + 0x30, 0x82, 0x02, 0x7e, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, + 0x0b, 0x93, 0x1c, 0x3a, 0xd6, 0x39, 0x67, 0xea, 0x67, 0x23, 0xbf, + 0xc3, 0xaf, 0x9a, 0xf4, 0x4b, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x65, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, + 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, + 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, + 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x24, 0x30, + 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1b, 0x44, 0x69, 0x67, + 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, + 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, + 0x47, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x33, 0x30, 0x38, 0x30, + 0x31, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, + 0x38, 0x30, 0x31, 0x31, 0x35, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, + 0x5a, 0x30, 0x65, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, + 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, + 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, + 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, + 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, + 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1b, + 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x41, 0x73, + 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52, 0x6f, + 0x6f, 0x74, 0x20, 0x47, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, + 0x02, 0x82, 0x01, 0x01, 0x00, 0xd9, 0xe7, 0x28, 0x2f, 0x52, 0x3f, + 0x36, 0x72, 0x49, 0x88, 0x93, 0x34, 0xf3, 0xf8, 0x6a, 0x1e, 0x31, + 0x54, 0x80, 0x9f, 0xad, 0x54, 0x41, 0xb5, 0x47, 0xdf, 0x96, 0xa8, + 0xd4, 0xaf, 0x80, 0x2d, 0xb9, 0x0a, 0xcf, 0x75, 0xfd, 0x89, 0xa5, + 0x7d, 0x24, 0xfa, 0xe3, 0x22, 0x0c, 0x2b, 0xbc, 0x95, 0x17, 0x0b, + 0x33, 0xbf, 0x19, 0x4d, 0x41, 0x06, 0x90, 0x00, 0xbd, 0x0c, 0x4d, + 0x10, 0xfe, 0x07, 0xb5, 0xe7, 0x1c, 0x6e, 0x22, 0x55, 0x31, 0x65, + 0x97, 0xbd, 0xd3, 0x17, 0xd2, 0x1e, 0x62, 0xf3, 0xdb, 0xea, 0x6c, + 0x50, 0x8c, 0x3f, 0x84, 0x0c, 0x96, 0xcf, 0xb7, 0xcb, 0x03, 0xe0, + 0xca, 0x6d, 0xa1, 0x14, 0x4c, 0x1b, 0x89, 0xdd, 0xed, 0x00, 0xb0, + 0x52, 0x7c, 0xaf, 0x91, 0x6c, 0xb1, 0x38, 0x13, 0xd1, 0xe9, 0x12, + 0x08, 0xc0, 0x00, 0xb0, 0x1c, 0x2b, 0x11, 0xda, 0x77, 0x70, 0x36, + 0x9b, 0xae, 0xce, 0x79, 0x87, 0xdc, 0x82, 0x70, 0xe6, 0x09, 0x74, + 0x70, 0x55, 0x69, 0xaf, 0xa3, 0x68, 0x9f, 0xbf, 0xdd, 0xb6, 0x79, + 0xb3, 0xf2, 0x9d, 0x70, 0x29, 0x55, 0xf4, 0xab, 0xff, 0x95, 0x61, + 0xf3, 0xc9, 0x40, 0x6f, 0x1d, 0xd1, 0xbe, 0x93, 0xbb, 0xd3, 0x88, + 0x2a, 0xbb, 0x9d, 0xbf, 0x72, 0x5a, 0x56, 0x71, 0x3b, 0x3f, 0xd4, + 0xf3, 0xd1, 0x0a, 0xfe, 0x28, 0xef, 0xa3, 0xee, 0xd9, 0x99, 0xaf, + 0x03, 0xd3, 0x8f, 0x60, 0xb7, 0xf2, 0x92, 0xa1, 0xb1, 0xbd, 0x89, + 0x89, 0x1f, 0x30, 0xcd, 0xc3, 0xa6, 0x2e, 0x62, 0x33, 0xae, 0x16, + 0x02, 0x77, 0x44, 0x5a, 0xe7, 0x81, 0x0a, 0x3c, 0xa7, 0x44, 0x2e, + 0x79, 0xb8, 0x3f, 0x04, 0xbc, 0x5c, 0xa0, 0x87, 0xe1, 0x1b, 0xaf, + 0x51, 0x8e, 0xcd, 0xec, 0x2c, 0xfa, 0xf8, 0xfe, 0x6d, 0xf0, 0x3a, + 0x7c, 0xaa, 0x8b, 0xe4, 0x67, 0x95, 0x31, 0x8d, 0x02, 0x03, 0x01, + 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, + 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, + 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, + 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x1d, 0x06, 0x03, 0x55, + 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xce, 0xc3, 0x4a, 0xb9, 0x99, + 0x55, 0xf2, 0xb8, 0xdb, 0x60, 0xbf, 0xa9, 0x7e, 0xbd, 0x56, 0xb5, + 0x97, 0x36, 0xa7, 0xd6, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x01, 0x00, 0xca, 0xa5, 0x55, 0x8c, 0xe3, 0xc8, 0x41, 0x6e, 0x69, + 0x27, 0xa7, 0x75, 0x11, 0xef, 0x3c, 0x86, 0x36, 0x6f, 0xd2, 0x9d, + 0xc6, 0x78, 0x38, 0x1d, 0x69, 0x96, 0xa2, 0x92, 0x69, 0x2e, 0x38, + 0x6c, 0x9b, 0x7d, 0x04, 0xd4, 0x89, 0xa5, 0xb1, 0x31, 0x37, 0x8a, + 0xc9, 0x21, 0xcc, 0xab, 0x6c, 0xcd, 0x8b, 0x1c, 0x9a, 0xd6, 0xbf, + 0x48, 0xd2, 0x32, 0x66, 0xc1, 0x8a, 0xc0, 0xf3, 0x2f, 0x3a, 0xef, + 0xc0, 0xe3, 0xd4, 0x91, 0x86, 0xd1, 0x50, 0xe3, 0x03, 0xdb, 0x73, + 0x77, 0x6f, 0x4a, 0x39, 0x53, 0xed, 0xde, 0x26, 0xc7, 0xb5, 0x7d, + 0xaf, 0x2b, 0x42, 0xd1, 0x75, 0x62, 0xe3, 0x4a, 0x2b, 0x02, 0xc7, + 0x50, 0x4b, 0xe0, 0x69, 0xe2, 0x96, 0x6c, 0x0e, 0x44, 0x66, 0x10, + 0x44, 0x8f, 0xad, 0x05, 0xeb, 0xf8, 0x79, 0xac, 0xa6, 0x1b, 0xe8, + 0x37, 0x34, 0x9d, 0x53, 0xc9, 0x61, 0xaa, 0xa2, 0x52, 0xaf, 0x4a, + 0x70, 0x16, 0x86, 0xc2, 0x3a, 0xc8, 0xb1, 0x13, 0x70, 0x36, 0xd8, + 0xcf, 0xee, 0xf4, 0x0a, 0x34, 0xd5, 0x5b, 0x4c, 0xfd, 0x07, 0x9c, + 0xa2, 0xba, 0xd9, 0x01, 0x72, 0x5c, 0xf3, 0x4d, 0xc1, 0xdd, 0x0e, + 0xb1, 0x1c, 0x0d, 0xc4, 0x63, 0xbe, 0xad, 0xf4, 0x14, 0xfb, 0x89, + 0xec, 0xa2, 0x41, 0x0e, 0x4c, 0xcc, 0xc8, 0x57, 0x40, 0xd0, 0x6e, + 0x03, 0xaa, 0xcd, 0x0c, 0x8e, 0x89, 0x99, 0x99, 0x6c, 0xf0, 0x3c, + 0x30, 0xaf, 0x38, 0xdf, 0x6f, 0xbc, 0xa3, 0xbe, 0x29, 0x20, 0x27, + 0xab, 0x74, 0xff, 0x13, 0x22, 0x78, 0xde, 0x97, 0x52, 0x55, 0x1e, + 0x83, 0xb5, 0x54, 0x20, 0x03, 0xee, 0xae, 0xc0, 0x4f, 0x56, 0xde, + 0x37, 0xcc, 0xc3, 0x7f, 0xaa, 0x04, 0x27, 0xbb, 0xd3, 0x77, 0xb8, + 0x62, 0xdb, 0x17, 0x7c, 0x9c, 0x28, 0x22, 0x13, 0x73, 0x6c, 0xcf, + 0x26, 0xf5, 0x8a, 0x29, 0xe7, 0x30, 0x82, 0x02, 0x46, 0x30, 0x82, + 0x01, 0xcd, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x0b, 0xa1, + 0x5a, 0xfa, 0x1d, 0xdf, 0xa0, 0xb5, 0x49, 0x44, 0xaf, 0xcd, 0x24, + 0xa0, 0x6c, 0xec, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, + 0x3d, 0x04, 0x03, 0x03, 0x30, 0x65, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, + 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, + 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, + 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, + 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, + 0x63, 0x6f, 0x6d, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, + 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, + 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x33, 0x30, 0x1e, 0x17, + 0x0d, 0x31, 0x33, 0x30, 0x38, 0x30, 0x31, 0x31, 0x32, 0x30, 0x30, + 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x31, 0x31, 0x35, + 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x65, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, + 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, + 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, + 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, + 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, + 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x24, 0x30, 0x22, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69, 0x43, + 0x65, 0x72, 0x74, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, + 0x20, 0x49, 0x44, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x33, + 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, + 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, + 0x00, 0x04, 0x19, 0xe7, 0xbc, 0xac, 0x44, 0x65, 0xed, 0xcd, 0xb8, + 0x3f, 0x58, 0xfb, 0x8d, 0xb1, 0x57, 0xa9, 0x44, 0x2d, 0x05, 0x15, + 0xf2, 0xef, 0x0b, 0xff, 0x10, 0x74, 0x9f, 0xb5, 0x62, 0x52, 0x5f, + 0x66, 0x7e, 0x1f, 0xe5, 0xdc, 0x1b, 0x45, 0x79, 0x0b, 0xcc, 0xc6, + 0x53, 0x0a, 0x9d, 0x8d, 0x5d, 0x02, 0xd9, 0xa9, 0x59, 0xde, 0x02, + 0x5a, 0xf6, 0x95, 0x2a, 0x0e, 0x8d, 0x38, 0x4a, 0x8a, 0x49, 0xc6, + 0xbc, 0xc6, 0x03, 0x38, 0x07, 0x5f, 0x55, 0xda, 0x7e, 0x09, 0x6e, + 0xe2, 0x7f, 0x5e, 0xd0, 0x45, 0x20, 0x0f, 0x59, 0x76, 0x10, 0xd6, + 0xa0, 0x24, 0xf0, 0x2d, 0xde, 0x36, 0xf2, 0x6c, 0x29, 0x39, 0xa3, + 0x42, 0x30, 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, + 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, + 0x02, 0x01, 0x86, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, + 0x16, 0x04, 0x14, 0xcb, 0xd0, 0xbd, 0xa9, 0xe1, 0x98, 0x05, 0x51, + 0xa1, 0x4d, 0x37, 0xa2, 0x83, 0x79, 0xce, 0x8d, 0x1d, 0x2a, 0xe4, + 0x84, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, + 0x03, 0x03, 0x03, 0x67, 0x00, 0x30, 0x64, 0x02, 0x30, 0x25, 0xa4, + 0x81, 0x45, 0x02, 0x6b, 0x12, 0x4b, 0x75, 0x74, 0x4f, 0xc8, 0x23, + 0xe3, 0x70, 0xf2, 0x75, 0x72, 0xde, 0x7c, 0x89, 0xf0, 0xcf, 0x91, + 0x72, 0x61, 0x9e, 0x5e, 0x10, 0x92, 0x59, 0x56, 0xb9, 0x83, 0xc7, + 0x10, 0xe7, 0x38, 0xe9, 0x58, 0x26, 0x36, 0x7d, 0xd5, 0xe4, 0x34, + 0x86, 0x39, 0x02, 0x30, 0x7c, 0x36, 0x53, 0xf0, 0x30, 0xe5, 0x62, + 0x63, 0x3a, 0x99, 0xe2, 0xb6, 0xa3, 0x3b, 0x9b, 0x34, 0xfa, 0x1e, + 0xda, 0x10, 0x92, 0x71, 0x5e, 0x91, 0x13, 0xa7, 0xdd, 0xa4, 0x6e, + 0x92, 0xcc, 0x32, 0xd6, 0xf5, 0x21, 0x66, 0xc7, 0x2f, 0xea, 0x96, + 0x63, 0x6a, 0x65, 0x45, 0x92, 0x95, 0x01, 0xb4, 0x30, 0x82, 0x03, + 0x8e, 0x30, 0x82, 0x02, 0x76, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, + 0x10, 0x03, 0x3a, 0xf1, 0xe6, 0xa7, 0x11, 0xa9, 0xa0, 0xbb, 0x28, + 0x64, 0xb1, 0x1d, 0x09, 0xfa, 0xe5, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, + 0x61, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, + 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, + 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, + 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x20, + 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x44, 0x69, + 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x32, 0x30, + 0x1e, 0x17, 0x0d, 0x31, 0x33, 0x30, 0x38, 0x30, 0x31, 0x31, 0x32, + 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x31, + 0x31, 0x35, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x61, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, + 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, + 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, + 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x20, 0x30, + 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x44, 0x69, 0x67, + 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x32, 0x30, 0x82, + 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, + 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbb, 0x37, + 0xcd, 0x34, 0xdc, 0x7b, 0x6b, 0xc9, 0xb2, 0x68, 0x90, 0xad, 0x4a, + 0x75, 0xff, 0x46, 0xba, 0x21, 0x0a, 0x08, 0x8d, 0xf5, 0x19, 0x54, + 0xc9, 0xfb, 0x88, 0xdb, 0xf3, 0xae, 0xf2, 0x3a, 0x89, 0x91, 0x3c, + 0x7a, 0xe6, 0xab, 0x06, 0x1a, 0x6b, 0xcf, 0xac, 0x2d, 0xe8, 0x5e, + 0x09, 0x24, 0x44, 0xba, 0x62, 0x9a, 0x7e, 0xd6, 0xa3, 0xa8, 0x7e, + 0xe0, 0x54, 0x75, 0x20, 0x05, 0xac, 0x50, 0xb7, 0x9c, 0x63, 0x1a, + 0x6c, 0x30, 0xdc, 0xda, 0x1f, 0x19, 0xb1, 0xd7, 0x1e, 0xde, 0xfd, + 0xd7, 0xe0, 0xcb, 0x94, 0x83, 0x37, 0xae, 0xec, 0x1f, 0x43, 0x4e, + 0xdd, 0x7b, 0x2c, 0xd2, 0xbd, 0x2e, 0xa5, 0x2f, 0xe4, 0xa9, 0xb8, + 0xad, 0x3a, 0xd4, 0x99, 0xa4, 0xb6, 0x25, 0xe9, 0x9b, 0x6b, 0x00, + 0x60, 0x92, 0x60, 0xff, 0x4f, 0x21, 0x49, 0x18, 0xf7, 0x67, 0x90, + 0xab, 0x61, 0x06, 0x9c, 0x8f, 0xf2, 0xba, 0xe9, 0xb4, 0xe9, 0x92, + 0x32, 0x6b, 0xb5, 0xf3, 0x57, 0xe8, 0x5d, 0x1b, 0xcd, 0x8c, 0x1d, + 0xab, 0x95, 0x04, 0x95, 0x49, 0xf3, 0x35, 0x2d, 0x96, 0xe3, 0x49, + 0x6d, 0xdd, 0x77, 0xe3, 0xfb, 0x49, 0x4b, 0xb4, 0xac, 0x55, 0x07, + 0xa9, 0x8f, 0x95, 0xb3, 0xb4, 0x23, 0xbb, 0x4c, 0x6d, 0x45, 0xf0, + 0xf6, 0xa9, 0xb2, 0x95, 0x30, 0xb4, 0xfd, 0x4c, 0x55, 0x8c, 0x27, + 0x4a, 0x57, 0x14, 0x7c, 0x82, 0x9d, 0xcd, 0x73, 0x92, 0xd3, 0x16, + 0x4a, 0x06, 0x0c, 0x8c, 0x50, 0xd1, 0x8f, 0x1e, 0x09, 0xbe, 0x17, + 0xa1, 0xe6, 0x21, 0xca, 0xfd, 0x83, 0xe5, 0x10, 0xbc, 0x83, 0xa5, + 0x0a, 0xc4, 0x67, 0x28, 0xf6, 0x73, 0x14, 0x14, 0x3d, 0x46, 0x76, + 0xc3, 0x87, 0x14, 0x89, 0x21, 0x34, 0x4d, 0xaf, 0x0f, 0x45, 0x0c, + 0xa6, 0x49, 0xa1, 0xba, 0xbb, 0x9c, 0xc5, 0xb1, 0x33, 0x83, 0x29, + 0x85, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, + 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, + 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, + 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x4e, + 0x22, 0x54, 0x20, 0x18, 0x95, 0xe6, 0xe3, 0x6e, 0xe6, 0x0f, 0xfa, + 0xfa, 0xb9, 0x12, 0xed, 0x06, 0x17, 0x8f, 0x39, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x60, 0x67, 0x28, 0x94, 0x6f, + 0x0e, 0x48, 0x63, 0xeb, 0x31, 0xdd, 0xea, 0x67, 0x18, 0xd5, 0x89, + 0x7d, 0x3c, 0xc5, 0x8b, 0x4a, 0x7f, 0xe9, 0xbe, 0xdb, 0x2b, 0x17, + 0xdf, 0xb0, 0x5f, 0x73, 0x77, 0x2a, 0x32, 0x13, 0x39, 0x81, 0x67, + 0x42, 0x84, 0x23, 0xf2, 0x45, 0x67, 0x35, 0xec, 0x88, 0xbf, 0xf8, + 0x8f, 0xb0, 0x61, 0x0c, 0x34, 0xa4, 0xae, 0x20, 0x4c, 0x84, 0xc6, + 0xdb, 0xf8, 0x35, 0xe1, 0x76, 0xd9, 0xdf, 0xa6, 0x42, 0xbb, 0xc7, + 0x44, 0x08, 0x86, 0x7f, 0x36, 0x74, 0x24, 0x5a, 0xda, 0x6c, 0x0d, + 0x14, 0x59, 0x35, 0xbd, 0xf2, 0x49, 0xdd, 0xb6, 0x1f, 0xc9, 0xb3, + 0x0d, 0x47, 0x2a, 0x3d, 0x99, 0x2f, 0xbb, 0x5c, 0xbb, 0xb5, 0xd4, + 0x20, 0xe1, 0x99, 0x5f, 0x53, 0x46, 0x15, 0xdb, 0x68, 0x9b, 0xf0, + 0xf3, 0x30, 0xd5, 0x3e, 0x31, 0xe2, 0x8d, 0x84, 0x9e, 0xe3, 0x8a, + 0xda, 0xda, 0x96, 0x3e, 0x35, 0x13, 0xa5, 0x5f, 0xf0, 0xf9, 0x70, + 0x50, 0x70, 0x47, 0x41, 0x11, 0x57, 0x19, 0x4e, 0xc0, 0x8f, 0xae, + 0x06, 0xc4, 0x95, 0x13, 0x17, 0x2f, 0x1b, 0x25, 0x9f, 0x75, 0xf2, + 0xb1, 0x8e, 0x99, 0xa1, 0x6f, 0x13, 0xb1, 0x41, 0x71, 0xfe, 0x88, + 0x2a, 0xc8, 0x4f, 0x10, 0x20, 0x55, 0xd7, 0xf3, 0x14, 0x45, 0xe5, + 0xe0, 0x44, 0xf4, 0xea, 0x87, 0x95, 0x32, 0x93, 0x0e, 0xfe, 0x53, + 0x46, 0xfa, 0x2c, 0x9d, 0xff, 0x8b, 0x22, 0xb9, 0x4b, 0xd9, 0x09, + 0x45, 0xa4, 0xde, 0xa4, 0xb8, 0x9a, 0x58, 0xdd, 0x1b, 0x7d, 0x52, + 0x9f, 0x8e, 0x59, 0x43, 0x88, 0x81, 0xa4, 0x9e, 0x26, 0xd5, 0x6f, + 0xad, 0xdd, 0x0d, 0xc6, 0x37, 0x7d, 0xed, 0x03, 0x92, 0x1b, 0xe5, + 0x77, 0x5f, 0x76, 0xee, 0x3c, 0x8d, 0xc4, 0x5d, 0x56, 0x5b, 0xa2, + 0xd9, 0x66, 0x6e, 0xb3, 0x35, 0x37, 0xe5, 0x32, 0xb6, 0x30, 0x82, + 0x02, 0x3f, 0x30, 0x82, 0x01, 0xc5, 0xa0, 0x03, 0x02, 0x01, 0x02, + 0x02, 0x10, 0x05, 0x55, 0x56, 0xbc, 0xf2, 0x5e, 0xa4, 0x35, 0x35, + 0xc3, 0xa4, 0x0f, 0xd5, 0xab, 0x45, 0x72, 0x30, 0x0a, 0x06, 0x08, + 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x61, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, + 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, + 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, + 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, + 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x20, 0x30, 0x1e, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x44, 0x69, 0x67, 0x69, + 0x43, 0x65, 0x72, 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x33, 0x30, 0x1e, 0x17, + 0x0d, 0x31, 0x33, 0x30, 0x38, 0x30, 0x31, 0x31, 0x32, 0x30, 0x30, + 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x31, 0x31, 0x35, + 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x61, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, + 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, + 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, + 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, + 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, + 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x20, 0x30, 0x1e, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x44, 0x69, 0x67, 0x69, 0x43, + 0x65, 0x72, 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, + 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x33, 0x30, 0x76, 0x30, 0x10, + 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, + 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0xdd, 0xa7, + 0xd9, 0xbb, 0x8a, 0xb8, 0x0b, 0xfb, 0x0b, 0x7f, 0x21, 0xd2, 0xf0, + 0xbe, 0xbe, 0x73, 0xf3, 0x33, 0x5d, 0x1a, 0xbc, 0x34, 0xea, 0xde, + 0xc6, 0x9b, 0xbc, 0xd0, 0x95, 0xf6, 0xf0, 0xcc, 0xd0, 0x0b, 0xba, + 0x61, 0x5b, 0x51, 0x46, 0x7e, 0x9e, 0x2d, 0x9f, 0xee, 0x8e, 0x63, + 0x0c, 0x17, 0xec, 0x07, 0x70, 0xf5, 0xcf, 0x84, 0x2e, 0x40, 0x83, + 0x9c, 0xe8, 0x3f, 0x41, 0x6d, 0x3b, 0xad, 0xd3, 0xa4, 0x14, 0x59, + 0x36, 0x78, 0x9d, 0x03, 0x43, 0xee, 0x10, 0x13, 0x6c, 0x72, 0xde, + 0xae, 0x88, 0xa7, 0xa1, 0x6b, 0xb5, 0x43, 0xce, 0x67, 0xdc, 0x23, + 0xff, 0x03, 0x1c, 0xa3, 0xe2, 0x3e, 0xa3, 0x42, 0x30, 0x40, 0x30, + 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, + 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, + 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xb3, + 0xdb, 0x48, 0xa4, 0xf9, 0xa1, 0xc5, 0xd8, 0xae, 0x36, 0x41, 0xcc, + 0x11, 0x63, 0x69, 0x62, 0x29, 0xbc, 0x4b, 0xc6, 0x30, 0x0a, 0x06, + 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x68, + 0x00, 0x30, 0x65, 0x02, 0x31, 0x00, 0xad, 0xbc, 0xf2, 0x6c, 0x3f, + 0x12, 0x4a, 0xd1, 0x2d, 0x39, 0xc3, 0x0a, 0x09, 0x97, 0x73, 0xf4, + 0x88, 0x36, 0x8c, 0x88, 0x27, 0xbb, 0xe6, 0x88, 0x8d, 0x50, 0x85, + 0xa7, 0x63, 0xf9, 0x9e, 0x32, 0xde, 0x66, 0x93, 0x0f, 0xf1, 0xcc, + 0xb1, 0x09, 0x8f, 0xdd, 0x6c, 0xab, 0xfa, 0x6b, 0x7f, 0xa0, 0x02, + 0x30, 0x39, 0x66, 0x5b, 0xc2, 0x64, 0x8d, 0xb8, 0x9e, 0x50, 0xdc, + 0xa8, 0xd5, 0x49, 0xa2, 0xed, 0xc7, 0xdc, 0xd1, 0x49, 0x7f, 0x17, + 0x01, 0xb8, 0xc8, 0x86, 0x8f, 0x4e, 0x8c, 0x88, 0x2b, 0xa8, 0x9a, + 0xa9, 0x8a, 0xc5, 0xd1, 0x00, 0xbd, 0xf8, 0x54, 0xe2, 0x9a, 0xe5, + 0x5b, 0x7c, 0xb3, 0x27, 0x17, 0x30, 0x82, 0x05, 0x90, 0x30, 0x82, + 0x03, 0x78, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x05, 0x9b, + 0x1b, 0x57, 0x9e, 0x8e, 0x21, 0x32, 0xe2, 0x39, 0x07, 0xbd, 0xa7, + 0x77, 0x75, 0x5c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x30, 0x62, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, + 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, + 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, + 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, + 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, + 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x21, 0x30, 0x1f, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x44, 0x69, 0x67, 0x69, 0x43, + 0x65, 0x72, 0x74, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, + 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x34, 0x30, 0x1e, 0x17, + 0x0d, 0x31, 0x33, 0x30, 0x38, 0x30, 0x31, 0x31, 0x32, 0x30, 0x30, + 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x31, 0x31, 0x35, + 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x62, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, + 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, + 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, + 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, + 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, + 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x21, 0x30, 0x1f, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x44, 0x69, 0x67, 0x69, 0x43, + 0x65, 0x72, 0x74, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, + 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x34, 0x30, 0x82, 0x02, + 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, + 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xbf, 0xe6, 0x90, + 0x73, 0x68, 0xde, 0xbb, 0xe4, 0x5d, 0x4a, 0x3c, 0x30, 0x22, 0x30, + 0x69, 0x33, 0xec, 0xc2, 0xa7, 0x25, 0x2e, 0xc9, 0x21, 0x3d, 0xf2, + 0x8a, 0xd8, 0x59, 0xc2, 0xe1, 0x29, 0xa7, 0x3d, 0x58, 0xab, 0x76, + 0x9a, 0xcd, 0xae, 0x7b, 0x1b, 0x84, 0x0d, 0xc4, 0x30, 0x1f, 0xf3, + 0x1b, 0xa4, 0x38, 0x16, 0xeb, 0x56, 0xc6, 0x97, 0x6d, 0x1d, 0xab, + 0xb2, 0x79, 0xf2, 0xca, 0x11, 0xd2, 0xe4, 0x5f, 0xd6, 0x05, 0x3c, + 0x52, 0x0f, 0x52, 0x1f, 0xc6, 0x9e, 0x15, 0xa5, 0x7e, 0xbe, 0x9f, + 0xa9, 0x57, 0x16, 0x59, 0x55, 0x72, 0xaf, 0x68, 0x93, 0x70, 0xc2, + 0xb2, 0xba, 0x75, 0x99, 0x6a, 0x73, 0x32, 0x94, 0xd1, 0x10, 0x44, + 0x10, 0x2e, 0xdf, 0x82, 0xf3, 0x07, 0x84, 0xe6, 0x74, 0x3b, 0x6d, + 0x71, 0xe2, 0x2d, 0x0c, 0x1b, 0xee, 0x20, 0xd5, 0xc9, 0x20, 0x1d, + 0x63, 0x29, 0x2d, 0xce, 0xec, 0x5e, 0x4e, 0xc8, 0x93, 0xf8, 0x21, + 0x61, 0x9b, 0x34, 0xeb, 0x05, 0xc6, 0x5e, 0xec, 0x5b, 0x1a, 0xbc, + 0xeb, 0xc9, 0xcf, 0xcd, 0xac, 0x34, 0x40, 0x5f, 0xb1, 0x7a, 0x66, + 0xee, 0x77, 0xc8, 0x48, 0xa8, 0x66, 0x57, 0x57, 0x9f, 0x54, 0x58, + 0x8e, 0x0c, 0x2b, 0xb7, 0x4f, 0xa7, 0x30, 0xd9, 0x56, 0xee, 0xca, + 0x7b, 0x5d, 0xe3, 0xad, 0xc9, 0x4f, 0x5e, 0xe5, 0x35, 0xe7, 0x31, + 0xcb, 0xda, 0x93, 0x5e, 0xdc, 0x8e, 0x8f, 0x80, 0xda, 0xb6, 0x91, + 0x98, 0x40, 0x90, 0x79, 0xc3, 0x78, 0xc7, 0xb6, 0xb1, 0xc4, 0xb5, + 0x6a, 0x18, 0x38, 0x03, 0x10, 0x8d, 0xd8, 0xd4, 0x37, 0xa4, 0x2e, + 0x05, 0x7d, 0x88, 0xf5, 0x82, 0x3e, 0x10, 0x91, 0x70, 0xab, 0x55, + 0x82, 0x41, 0x32, 0xd7, 0xdb, 0x04, 0x73, 0x2a, 0x6e, 0x91, 0x01, + 0x7c, 0x21, 0x4c, 0xd4, 0xbc, 0xae, 0x1b, 0x03, 0x75, 0x5d, 0x78, + 0x66, 0xd9, 0x3a, 0x31, 0x44, 0x9a, 0x33, 0x40, 0xbf, 0x08, 0xd7, + 0x5a, 0x49, 0xa4, 0xc2, 0xe6, 0xa9, 0xa0, 0x67, 0xdd, 0xa4, 0x27, + 0xbc, 0xa1, 0x4f, 0x39, 0xb5, 0x11, 0x58, 0x17, 0xf7, 0x24, 0x5c, + 0x46, 0x8f, 0x64, 0xf7, 0xc1, 0x69, 0x88, 0x76, 0x98, 0x76, 0x3d, + 0x59, 0x5d, 0x42, 0x76, 0x87, 0x89, 0x97, 0x69, 0x7a, 0x48, 0xf0, + 0xe0, 0xa2, 0x12, 0x1b, 0x66, 0x9a, 0x74, 0xca, 0xde, 0x4b, 0x1e, + 0xe7, 0x0e, 0x63, 0xae, 0xe6, 0xd4, 0xef, 0x92, 0x92, 0x3a, 0x9e, + 0x3d, 0xdc, 0x00, 0xe4, 0x45, 0x25, 0x89, 0xb6, 0x9a, 0x44, 0x19, + 0x2b, 0x7e, 0xc0, 0x94, 0xb4, 0xd2, 0x61, 0x6d, 0xeb, 0x33, 0xd9, + 0xc5, 0xdf, 0x4b, 0x04, 0x00, 0xcc, 0x7d, 0x1c, 0x95, 0xc3, 0x8f, + 0xf7, 0x21, 0xb2, 0xb2, 0x11, 0xb7, 0xbb, 0x7f, 0xf2, 0xd5, 0x8c, + 0x70, 0x2c, 0x41, 0x60, 0xaa, 0xb1, 0x63, 0x18, 0x44, 0x95, 0x1a, + 0x76, 0x62, 0x7e, 0xf6, 0x80, 0xb0, 0xfb, 0xe8, 0x64, 0xa6, 0x33, + 0xd1, 0x89, 0x07, 0xe1, 0xbd, 0xb7, 0xe6, 0x43, 0xa4, 0x18, 0xb8, + 0xa6, 0x77, 0x01, 0xe1, 0x0f, 0x94, 0x0c, 0x21, 0x1d, 0xb2, 0x54, + 0x29, 0x25, 0x89, 0x6c, 0xe5, 0x0e, 0x52, 0x51, 0x47, 0x74, 0xbe, + 0x26, 0xac, 0xb6, 0x41, 0x75, 0xde, 0x7a, 0xac, 0x5f, 0x8d, 0x3f, + 0xc9, 0xbc, 0xd3, 0x41, 0x11, 0x12, 0x5b, 0xe5, 0x10, 0x50, 0xeb, + 0x31, 0xc5, 0xca, 0x72, 0x16, 0x22, 0x09, 0xdf, 0x7c, 0x4c, 0x75, + 0x3f, 0x63, 0xec, 0x21, 0x5f, 0xc4, 0x20, 0x51, 0x6b, 0x6f, 0xb1, + 0xab, 0x86, 0x8b, 0x4f, 0xc2, 0xd6, 0x45, 0x5f, 0x9d, 0x20, 0xfc, + 0xa1, 0x1e, 0xc5, 0xc0, 0x8f, 0xa2, 0xb1, 0x7e, 0x0a, 0x26, 0x99, + 0xf5, 0xe4, 0x69, 0x2f, 0x98, 0x1d, 0x2d, 0xf5, 0xd9, 0xa9, 0xb2, + 0x1d, 0xe5, 0x1b, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, + 0x40, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, + 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, + 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, + 0x86, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, + 0x14, 0xec, 0xd7, 0xe3, 0x82, 0xd2, 0x71, 0x5d, 0x64, 0x4c, 0xdf, + 0x2e, 0x67, 0x3f, 0xe7, 0xba, 0x98, 0xae, 0x1c, 0x0f, 0x4f, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x0c, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0xbb, 0x61, 0xd9, + 0x7d, 0xa9, 0x6c, 0xbe, 0x17, 0xc4, 0x91, 0x1b, 0xc3, 0xa1, 0xa2, + 0x00, 0x8d, 0xe3, 0x64, 0x68, 0x0f, 0x56, 0xcf, 0x77, 0xae, 0x70, + 0xf9, 0xfd, 0x9a, 0x4a, 0x99, 0xb9, 0xc9, 0x78, 0x5c, 0x0c, 0x0c, + 0x5f, 0xe4, 0xe6, 0x14, 0x29, 0x56, 0x0b, 0x36, 0x49, 0x5d, 0x44, + 0x63, 0xe0, 0xad, 0x9c, 0x96, 0x18, 0x66, 0x1b, 0x23, 0x0d, 0x3d, + 0x79, 0xe9, 0x6d, 0x6b, 0xd6, 0x54, 0xf8, 0xd2, 0x3c, 0xc1, 0x43, + 0x40, 0xae, 0x1d, 0x50, 0xf5, 0x52, 0xfc, 0x90, 0x3b, 0xbb, 0x98, + 0x99, 0x69, 0x6b, 0xc7, 0xc1, 0xa7, 0xa8, 0x68, 0xa4, 0x27, 0xdc, + 0x9d, 0xf9, 0x27, 0xae, 0x30, 0x85, 0xb9, 0xf6, 0x67, 0x4d, 0x3a, + 0x3e, 0x8f, 0x59, 0x39, 0x22, 0x53, 0x44, 0xeb, 0xc8, 0x5d, 0x03, + 0xca, 0xed, 0x50, 0x7a, 0x7d, 0x62, 0x21, 0x0a, 0x80, 0xc8, 0x73, + 0x66, 0xd1, 0xa0, 0x05, 0x60, 0x5f, 0xe8, 0xa5, 0xb4, 0xa7, 0xaf, + 0xa8, 0xf7, 0x6d, 0x35, 0x9c, 0x7c, 0x5a, 0x8a, 0xd6, 0xa2, 0x38, + 0x99, 0xf3, 0x78, 0x8b, 0xf4, 0x4d, 0xd2, 0x20, 0x0b, 0xde, 0x04, + 0xee, 0x8c, 0x9b, 0x47, 0x81, 0x72, 0x0d, 0xc0, 0x14, 0x32, 0xef, + 0x30, 0x59, 0x2e, 0xae, 0xe0, 0x71, 0xf2, 0x56, 0xe4, 0x6a, 0x97, + 0x6f, 0x92, 0x50, 0x6d, 0x96, 0x8d, 0x68, 0x7a, 0x9a, 0xb2, 0x36, + 0x14, 0x7a, 0x06, 0xf2, 0x24, 0xb9, 0x09, 0x11, 0x50, 0xd7, 0x08, + 0xb1, 0xb8, 0x89, 0x7a, 0x84, 0x23, 0x61, 0x42, 0x29, 0xe5, 0xa3, + 0xcd, 0xa2, 0x20, 0x41, 0xd7, 0xd1, 0x9c, 0x64, 0xd9, 0xea, 0x26, + 0xa1, 0x8b, 0x14, 0xd7, 0x4c, 0x19, 0xb2, 0x50, 0x41, 0x71, 0x3d, + 0x3f, 0x4d, 0x70, 0x23, 0x86, 0x0c, 0x4a, 0xdc, 0x81, 0xd2, 0xcc, + 0x32, 0x94, 0x84, 0x0d, 0x08, 0x09, 0x97, 0x1c, 0x4f, 0xc0, 0xee, + 0x6b, 0x20, 0x74, 0x30, 0xd2, 0xe0, 0x39, 0x34, 0x10, 0x85, 0x21, + 0x15, 0x01, 0x08, 0xe8, 0x55, 0x32, 0xde, 0x71, 0x49, 0xd9, 0x28, + 0x17, 0x50, 0x4d, 0xe6, 0xbe, 0x4d, 0xd1, 0x75, 0xac, 0xd0, 0xca, + 0xfb, 0x41, 0xb8, 0x43, 0xa5, 0xaa, 0xd3, 0xc3, 0x05, 0x44, 0x4f, + 0x2c, 0x36, 0x9b, 0xe2, 0xfa, 0xe2, 0x45, 0xb8, 0x23, 0x53, 0x6c, + 0x06, 0x6f, 0x67, 0x55, 0x7f, 0x46, 0xb5, 0x4c, 0x3f, 0x6e, 0x28, + 0x5a, 0x79, 0x26, 0xd2, 0xa4, 0xa8, 0x62, 0x97, 0xd2, 0x1e, 0xe2, + 0xed, 0x4a, 0x8b, 0xbc, 0x1b, 0xfd, 0x47, 0x4a, 0x0d, 0xdf, 0x67, + 0x66, 0x7e, 0xb2, 0x5b, 0x41, 0xd0, 0x3b, 0xe4, 0xf4, 0x3b, 0xf4, + 0x04, 0x63, 0xe9, 0xef, 0xc2, 0x54, 0x00, 0x51, 0xa0, 0x8a, 0x2a, + 0xc9, 0xce, 0x78, 0xcc, 0xd5, 0xea, 0x87, 0x04, 0x18, 0xb3, 0xce, + 0xaf, 0x49, 0x88, 0xaf, 0xf3, 0x92, 0x99, 0xb6, 0xb3, 0xe6, 0x61, + 0x0f, 0xd2, 0x85, 0x00, 0xe7, 0x50, 0x1a, 0xe4, 0x1b, 0x95, 0x9d, + 0x19, 0xa1, 0xb9, 0x9c, 0xb1, 0x9b, 0xb1, 0x00, 0x1e, 0xef, 0xd0, + 0x0f, 0x4f, 0x42, 0x6c, 0xc9, 0x0a, 0xbc, 0xee, 0x43, 0xfa, 0x3a, + 0x71, 0xa5, 0xc8, 0x4d, 0x26, 0xa5, 0x35, 0xfd, 0x89, 0x5d, 0xbc, + 0x85, 0x62, 0x1d, 0x32, 0xd2, 0xa0, 0x2b, 0x54, 0xed, 0x9a, 0x57, + 0xc1, 0xdb, 0xfa, 0x10, 0xcf, 0x19, 0xb7, 0x8b, 0x4a, 0x1b, 0x8f, + 0x01, 0xb6, 0x27, 0x95, 0x53, 0xe8, 0xb6, 0x89, 0x6d, 0x5b, 0xbc, + 0x68, 0xd4, 0x23, 0xe8, 0x8b, 0x51, 0xa2, 0x56, 0xf9, 0xf0, 0xa6, + 0x80, 0xa0, 0xd6, 0x1e, 0xb3, 0xbc, 0x0f, 0x0f, 0x53, 0x75, 0x29, + 0xaa, 0xea, 0x13, 0x77, 0xe4, 0xde, 0x8c, 0x81, 0x21, 0xad, 0x07, + 0x10, 0x47, 0x11, 0xad, 0x87, 0x3d, 0x07, 0xd1, 0x75, 0xbc, 0xcf, + 0xf3, 0x66, 0x7e, 0x30, 0x82, 0x05, 0x76, 0x30, 0x82, 0x03, 0x5e, + 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x5e, 0x68, 0xd6, 0x11, + 0x71, 0x94, 0x63, 0x50, 0x56, 0x00, 0x68, 0xf3, 0x3e, 0xc9, 0xc5, + 0x91, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x55, 0x31, 0x0b, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x43, 0x4e, 0x31, 0x1a, + 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x57, 0x6f, + 0x53, 0x69, 0x67, 0x6e, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x65, 0x64, 0x31, 0x2a, 0x30, 0x28, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x21, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x57, 0x6f, + 0x53, 0x69, 0x67, 0x6e, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, 0x30, + 0x38, 0x30, 0x38, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31, 0x5a, 0x17, + 0x0d, 0x33, 0x39, 0x30, 0x38, 0x30, 0x38, 0x30, 0x31, 0x30, 0x30, + 0x30, 0x31, 0x5a, 0x30, 0x55, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x43, 0x4e, 0x31, 0x1a, 0x30, 0x18, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x57, 0x6f, 0x53, 0x69, + 0x67, 0x6e, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x65, 0x64, 0x31, 0x2a, 0x30, 0x28, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x21, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x57, 0x6f, 0x53, 0x69, + 0x67, 0x6e, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, + 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, + 0x01, 0x00, 0xbd, 0xca, 0x8d, 0xac, 0xb8, 0x91, 0x15, 0x56, 0x97, + 0x7b, 0x6b, 0x5c, 0x7a, 0xc2, 0xde, 0x6b, 0xd9, 0xa1, 0xb0, 0xc3, + 0x10, 0x23, 0xfa, 0xa7, 0xa1, 0xb2, 0xcc, 0x31, 0xfa, 0x3e, 0xd9, + 0xa6, 0x29, 0x6f, 0x16, 0x3d, 0xe0, 0x6b, 0xf8, 0xb8, 0x40, 0x5f, + 0xdb, 0x39, 0xa8, 0x00, 0x7a, 0x8b, 0xa0, 0x4d, 0x54, 0x7d, 0xc2, + 0x22, 0x78, 0xfc, 0x8e, 0x09, 0xb8, 0xa8, 0x85, 0xd7, 0xcc, 0x95, + 0x97, 0x4b, 0x74, 0xd8, 0x9e, 0x7e, 0xf0, 0x00, 0xe4, 0x0e, 0x89, + 0xae, 0x49, 0x28, 0x44, 0x1a, 0x10, 0x99, 0x32, 0x0f, 0x25, 0x88, + 0x53, 0xa4, 0x0d, 0xb3, 0x0f, 0x12, 0x08, 0x16, 0x0b, 0x03, 0x71, + 0x27, 0x1c, 0x7f, 0xe1, 0xdb, 0xd2, 0xfd, 0x67, 0x68, 0xc4, 0x05, + 0x5d, 0x0a, 0x0e, 0x5d, 0x70, 0xd7, 0xd8, 0x97, 0xa0, 0xbc, 0x53, + 0x41, 0x9a, 0x91, 0x8d, 0xf4, 0x9e, 0x36, 0x66, 0x7a, 0x7e, 0x56, + 0xc1, 0x90, 0x5f, 0xe6, 0xb1, 0x68, 0x20, 0x36, 0xa4, 0x8c, 0x24, + 0x2c, 0x2c, 0x47, 0x0b, 0x59, 0x76, 0x66, 0x30, 0xb5, 0xbe, 0xde, + 0xed, 0x8f, 0xf8, 0x9d, 0xd3, 0xbb, 0x01, 0x30, 0xe6, 0xf2, 0xf3, + 0x0e, 0xe0, 0x2c, 0x92, 0x80, 0xf3, 0x85, 0xf9, 0x28, 0x8a, 0xb4, + 0x54, 0x2e, 0x9a, 0xed, 0xf7, 0x76, 0xfc, 0x15, 0x68, 0x16, 0xeb, + 0x4a, 0x6c, 0xeb, 0x2e, 0x12, 0x8f, 0xd4, 0xcf, 0xfe, 0x0c, 0xc7, + 0x5c, 0x1d, 0x0b, 0x7e, 0x05, 0x32, 0xbe, 0x5e, 0xb0, 0x09, 0x2a, + 0x42, 0xd5, 0xc9, 0x4e, 0x90, 0xb3, 0x59, 0x0d, 0xbb, 0x7a, 0x7e, + 0xcd, 0xd5, 0x08, 0x5a, 0xb4, 0x7f, 0xd8, 0x1c, 0x69, 0x11, 0xf9, + 0x27, 0x0f, 0x7b, 0x06, 0xaf, 0x54, 0x83, 0x18, 0x7b, 0xe1, 0xdd, + 0x54, 0x7a, 0x51, 0x68, 0x6e, 0x77, 0xfc, 0xc6, 0xbf, 0x52, 0x4a, + 0x66, 0x46, 0xa1, 0xb2, 0x67, 0x1a, 0xbb, 0xa3, 0x4f, 0x77, 0xa0, + 0xbe, 0x5d, 0xff, 0xfc, 0x56, 0x0b, 0x43, 0x72, 0x77, 0x90, 0xca, + 0x9e, 0xf9, 0xf2, 0x39, 0xf5, 0x0d, 0xa9, 0xf4, 0xea, 0xd7, 0xe7, + 0xb3, 0x10, 0x2f, 0x30, 0x42, 0x37, 0x21, 0xcc, 0x30, 0x70, 0xc9, + 0x86, 0x98, 0x0f, 0xcc, 0x58, 0x4d, 0x83, 0xbb, 0x7d, 0xe5, 0x1a, + 0xa5, 0x37, 0x8d, 0xb6, 0xac, 0x32, 0x97, 0x00, 0x3a, 0x63, 0x71, + 0x24, 0x1e, 0x9e, 0x37, 0xc4, 0xff, 0x74, 0xd4, 0x37, 0xc0, 0xe2, + 0xfe, 0x88, 0x46, 0x60, 0x11, 0xdd, 0x08, 0x3f, 0x50, 0x36, 0xab, + 0xb8, 0x7a, 0xa4, 0x95, 0x62, 0x6a, 0x6e, 0xb0, 0xca, 0x6a, 0x21, + 0x5a, 0x69, 0xf3, 0xf3, 0xfb, 0x1d, 0x70, 0x39, 0x95, 0xf3, 0xa7, + 0x6e, 0xa6, 0x81, 0x89, 0xa1, 0x88, 0xc5, 0x3b, 0x71, 0xca, 0xa3, + 0x52, 0xee, 0x83, 0xbb, 0xfd, 0xa0, 0x77, 0xf4, 0xe4, 0x6f, 0xe7, + 0x42, 0xdb, 0x6d, 0x4a, 0x99, 0x8a, 0x34, 0x48, 0xbc, 0x17, 0xdc, + 0xe4, 0x80, 0x08, 0x22, 0xb6, 0xf2, 0x31, 0xc0, 0x3f, 0x04, 0x3e, + 0xeb, 0x9f, 0x20, 0x79, 0xd6, 0xb8, 0x06, 0x64, 0x64, 0x02, 0x31, + 0xd7, 0xa9, 0xcd, 0x52, 0xfb, 0x84, 0x45, 0x69, 0x09, 0x00, 0x2a, + 0xdc, 0x55, 0x8b, 0xc4, 0x06, 0x46, 0x4b, 0xc0, 0x4a, 0x1d, 0x09, + 0x5b, 0x39, 0x28, 0xfd, 0xa9, 0xab, 0xce, 0x00, 0xf9, 0x2e, 0x48, + 0x4b, 0x26, 0xe6, 0x30, 0x4c, 0xa5, 0x58, 0xca, 0xb4, 0x44, 0x82, + 0x4f, 0xe7, 0x91, 0x1e, 0x33, 0xc3, 0xb0, 0x93, 0xff, 0x11, 0xfc, + 0x81, 0xd2, 0xca, 0x1f, 0x71, 0x29, 0xdd, 0x76, 0x4f, 0x92, 0x25, + 0xaf, 0x1d, 0x81, 0xb7, 0x0f, 0x2f, 0x8c, 0xc3, 0x06, 0xcc, 0x2f, + 0x27, 0xa3, 0x4a, 0xe4, 0x0e, 0x99, 0xba, 0x7c, 0x1e, 0x45, 0x1f, + 0x7f, 0xaa, 0x19, 0x45, 0x96, 0xfd, 0xfc, 0x3d, 0x02, 0x03, 0x01, + 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, + 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, + 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xe1, 0x66, 0xcf, 0x0e, 0xd1, + 0xf1, 0xb3, 0x4b, 0xb7, 0x06, 0x20, 0x14, 0xfe, 0x87, 0x12, 0xd5, + 0xf6, 0xfe, 0xfb, 0x3e, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, + 0x01, 0x00, 0xa8, 0xcb, 0x72, 0x40, 0xb2, 0x76, 0xc1, 0x7e, 0x7b, + 0xfc, 0xad, 0x64, 0xe3, 0x32, 0x7b, 0xcc, 0x3c, 0xb6, 0x5d, 0x46, + 0xd3, 0xf5, 0x2c, 0xe2, 0x70, 0x5d, 0xc8, 0x2e, 0xd8, 0x06, 0x7d, + 0x98, 0xd1, 0x0b, 0x21, 0xa0, 0x89, 0x59, 0x24, 0x01, 0x9d, 0xf9, + 0xaf, 0x09, 0x7d, 0x0a, 0x23, 0x82, 0x34, 0xd5, 0xfc, 0x7c, 0x72, + 0x99, 0xb9, 0xa3, 0xd7, 0x54, 0xf4, 0xea, 0x52, 0x70, 0x0e, 0xc5, + 0xf5, 0xd6, 0x3b, 0xe1, 0x3a, 0x09, 0x32, 0xe6, 0x21, 0x39, 0x93, + 0xbd, 0xb3, 0x15, 0xea, 0x4f, 0x6a, 0xf4, 0xf5, 0x8b, 0x3f, 0x2f, + 0x7c, 0x8d, 0x58, 0x2e, 0xc5, 0xe1, 0x39, 0xa0, 0x3e, 0xc7, 0x3d, + 0x4a, 0x73, 0x9e, 0x40, 0x7a, 0xc0, 0x2b, 0x61, 0xa9, 0x67, 0xc9, + 0xf3, 0x24, 0xb9, 0xb3, 0x6d, 0x55, 0x2c, 0x5a, 0x1d, 0x9e, 0x25, + 0x72, 0xce, 0x0b, 0xad, 0xaa, 0xc7, 0x55, 0x62, 0x0b, 0xbe, 0xfb, + 0x63, 0xb3, 0x61, 0x44, 0x23, 0xa3, 0xcb, 0xe1, 0x1a, 0x0e, 0xf7, + 0x9a, 0x06, 0x4d, 0xde, 0xd4, 0x23, 0x4e, 0x21, 0x96, 0x5b, 0x39, + 0x5b, 0x57, 0x1d, 0x2f, 0x5d, 0x08, 0x5e, 0x09, 0x79, 0xff, 0x7c, + 0x97, 0xb5, 0x4d, 0x83, 0xae, 0x0d, 0xd6, 0xe6, 0xa3, 0x79, 0xe0, + 0x33, 0xd0, 0x99, 0x96, 0x02, 0x30, 0xa7, 0x3e, 0xff, 0xd2, 0xa3, + 0x43, 0x3f, 0x05, 0x5a, 0x06, 0xea, 0x44, 0x02, 0xda, 0x7c, 0xf8, + 0x48, 0xd0, 0x33, 0xa9, 0xf9, 0x07, 0xc7, 0x95, 0xe1, 0xf5, 0x3e, + 0xf5, 0x5d, 0x71, 0xba, 0xf2, 0x95, 0xa9, 0x74, 0x88, 0x61, 0x59, + 0xe3, 0xbf, 0xca, 0x5a, 0x13, 0xba, 0x72, 0xb4, 0x8c, 0x5d, 0x36, + 0x87, 0xe9, 0xa6, 0xc5, 0x3c, 0x13, 0xbf, 0xde, 0xd0, 0x44, 0x26, + 0xee, 0xb7, 0xec, 0x2e, 0x70, 0xfa, 0xd7, 0x9d, 0xb7, 0xac, 0xe5, + 0xc5, 0x40, 0x5a, 0xe6, 0xd7, 0x6c, 0x7b, 0x2c, 0xc3, 0x56, 0x9b, + 0x47, 0xcd, 0x0b, 0xce, 0xfa, 0x1b, 0xb4, 0x21, 0xd7, 0xb7, 0x66, + 0xb8, 0xf4, 0x25, 0x30, 0x8b, 0x5c, 0x0d, 0xb9, 0xea, 0x67, 0xb2, + 0xf4, 0x6d, 0xae, 0xd5, 0xa1, 0x9e, 0x4f, 0xd8, 0x9f, 0xe9, 0x27, + 0x02, 0xb0, 0x1d, 0x06, 0xd6, 0x8f, 0xe3, 0xfb, 0x48, 0x12, 0x9f, + 0x7f, 0x11, 0xa1, 0x10, 0x3e, 0x4c, 0x51, 0x3a, 0x96, 0xb0, 0xd1, + 0x13, 0xf1, 0xc7, 0xd8, 0x26, 0xae, 0x3a, 0xca, 0x91, 0xc4, 0x69, + 0x9d, 0xdf, 0x01, 0x29, 0x64, 0x51, 0x6f, 0x68, 0xda, 0x14, 0xec, + 0x08, 0x41, 0x97, 0x90, 0x8d, 0xd0, 0xb2, 0x80, 0xf2, 0xcf, 0xc2, + 0x3d, 0xbf, 0x91, 0x68, 0xc5, 0x80, 0x67, 0x1e, 0xc4, 0x60, 0x13, + 0x55, 0xd5, 0x61, 0x99, 0x57, 0x7c, 0xba, 0x95, 0x0f, 0x61, 0x49, + 0x3a, 0xca, 0x75, 0xbc, 0xc9, 0x0a, 0x93, 0x3f, 0x67, 0x0e, 0x12, + 0xf2, 0x28, 0xe2, 0x31, 0x1b, 0xc0, 0x57, 0x16, 0xdf, 0x08, 0x7c, + 0x19, 0xc1, 0x7e, 0x0f, 0x1f, 0x85, 0x1e, 0x0a, 0x36, 0x7c, 0x5b, + 0x7e, 0x27, 0xbc, 0x7a, 0xbf, 0xe0, 0xdb, 0xf4, 0xda, 0x52, 0xbd, + 0xde, 0x0c, 0x54, 0x70, 0x31, 0x91, 0x43, 0x95, 0xc8, 0xbc, 0xf0, + 0x3e, 0xdd, 0x09, 0x7e, 0x30, 0x64, 0x50, 0xed, 0x7f, 0x01, 0xa4, + 0x33, 0x67, 0x4d, 0x68, 0x4f, 0xbe, 0x15, 0xef, 0xb0, 0xf6, 0x02, + 0x11, 0xa2, 0x1b, 0x13, 0x25, 0x3a, 0xdc, 0xc2, 0x59, 0xf1, 0xe3, + 0x5c, 0x46, 0xbb, 0x67, 0x2c, 0x02, 0x46, 0xea, 0x1e, 0x48, 0xa6, + 0xe6, 0x5b, 0xd9, 0xb5, 0xbc, 0x51, 0xa2, 0x92, 0x96, 0xdb, 0xaa, + 0xc6, 0x37, 0x22, 0xa6, 0xfe, 0xcc, 0x20, 0x74, 0xa3, 0x2d, 0xa9, + 0x2e, 0x6b, 0xcb, 0xc0, 0x82, 0x11, 0x21, 0xb5, 0x93, 0x79, 0xee, + 0x44, 0x86, 0xbe, 0xd7, 0x1e, 0xe4, 0x1e, 0xfb, 0x30, 0x82, 0x05, + 0x58, 0x30, 0x82, 0x03, 0x40, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, + 0x10, 0x50, 0x70, 0x6b, 0xcd, 0xd8, 0x13, 0xfc, 0x1b, 0x4e, 0x3b, + 0x33, 0x72, 0xd2, 0x11, 0x48, 0x8d, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, + 0x46, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x43, 0x4e, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x13, 0x11, 0x57, 0x6f, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x43, + 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x1b, + 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x12, 0x43, 0x41, + 0x20, 0xe6, 0xb2, 0x83, 0xe9, 0x80, 0x9a, 0xe6, 0xa0, 0xb9, 0xe8, + 0xaf, 0x81, 0xe4, 0xb9, 0xa6, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, + 0x30, 0x38, 0x30, 0x38, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31, 0x5a, + 0x17, 0x0d, 0x33, 0x39, 0x30, 0x38, 0x30, 0x38, 0x30, 0x31, 0x30, + 0x30, 0x30, 0x31, 0x5a, 0x30, 0x46, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x43, 0x4e, 0x31, 0x1a, 0x30, + 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x57, 0x6f, 0x53, + 0x69, 0x67, 0x6e, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x65, 0x64, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x12, 0x43, 0x41, 0x20, 0xe6, 0xb2, 0x83, 0xe9, 0x80, + 0x9a, 0xe6, 0xa0, 0xb9, 0xe8, 0xaf, 0x81, 0xe4, 0xb9, 0xa6, 0x30, + 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, + 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xd0, + 0x49, 0x21, 0x1e, 0x25, 0xfc, 0x87, 0xc1, 0x2a, 0xc2, 0xac, 0xdb, + 0x76, 0x86, 0x06, 0x4e, 0xe7, 0xd0, 0x74, 0x34, 0xdc, 0xed, 0x65, + 0x35, 0xfc, 0x50, 0xd6, 0x88, 0x3f, 0xa4, 0xf0, 0x7f, 0xeb, 0x0f, + 0x5f, 0x79, 0x2f, 0x89, 0xb1, 0xfd, 0xbc, 0x63, 0x58, 0x37, 0x93, + 0x9b, 0x38, 0xf8, 0xb7, 0x5b, 0xa9, 0xfa, 0xd8, 0x71, 0xc7, 0xb4, + 0xbc, 0x80, 0x97, 0x8d, 0x6c, 0x4b, 0xf1, 0x50, 0xd5, 0x2a, 0x29, + 0xaa, 0xa8, 0x19, 0x7a, 0x96, 0xe6, 0x95, 0x8e, 0x74, 0xed, 0x97, + 0x0a, 0x57, 0x75, 0xf4, 0x05, 0xdb, 0x6d, 0x0b, 0x39, 0xb9, 0x01, + 0x7f, 0xaa, 0xf6, 0xd6, 0xda, 0x6c, 0xe6, 0x05, 0xe0, 0xa4, 0x4d, + 0x52, 0xfc, 0xdb, 0xd0, 0x74, 0xb7, 0x11, 0x8c, 0x7b, 0x8d, 0x4f, + 0xff, 0x87, 0x83, 0xae, 0xff, 0x05, 0x03, 0x13, 0x57, 0x50, 0x37, + 0xfe, 0x8c, 0x96, 0x52, 0x10, 0x4c, 0x5f, 0xbf, 0x94, 0x71, 0x69, + 0xd9, 0x96, 0x3e, 0x0c, 0x43, 0x4f, 0xbe, 0x30, 0xc0, 0x9f, 0x39, + 0x74, 0x4f, 0x06, 0x45, 0x5d, 0xa3, 0xd6, 0x56, 0x39, 0x68, 0x07, + 0xcc, 0x87, 0x4f, 0x50, 0x77, 0x93, 0x71, 0xd9, 0x44, 0x08, 0xb1, + 0x8a, 0x34, 0xe9, 0x89, 0xac, 0xdb, 0x9b, 0x4e, 0xe1, 0xd9, 0xe4, + 0x52, 0x45, 0x8c, 0x2e, 0x14, 0x1f, 0x91, 0x6b, 0x19, 0x1d, 0x68, + 0x29, 0x2c, 0x56, 0xc4, 0xe2, 0x1e, 0x13, 0x57, 0x64, 0xf0, 0x61, + 0xe3, 0xb9, 0x11, 0xdf, 0xb0, 0xe1, 0x57, 0xa0, 0x1b, 0xad, 0xd7, + 0x5f, 0xd1, 0xaf, 0xdb, 0x2b, 0x2d, 0x3f, 0xd0, 0x68, 0x8e, 0x0f, + 0xea, 0x9f, 0x0f, 0x8b, 0x35, 0x58, 0x1b, 0x13, 0x1c, 0xf4, 0xde, + 0x35, 0xa1, 0x0a, 0x5d, 0xd6, 0xea, 0xdf, 0x12, 0x6f, 0xc0, 0xfb, + 0x69, 0x07, 0x46, 0x72, 0xdc, 0x81, 0xf6, 0x04, 0x23, 0x17, 0xe0, + 0x4d, 0x75, 0xe1, 0x72, 0x6f, 0xb0, 0x28, 0xeb, 0x9b, 0xe1, 0xe1, + 0x83, 0xa1, 0x9f, 0x4a, 0x5d, 0xaf, 0xcc, 0x9b, 0xfa, 0x02, 0x20, + 0xb6, 0x18, 0x62, 0x77, 0x91, 0x3b, 0xa3, 0xd5, 0x65, 0xad, 0xdc, + 0x7c, 0x90, 0x77, 0x1c, 0x44, 0x41, 0xa4, 0x4a, 0x8b, 0xeb, 0x95, + 0x72, 0xe9, 0xf6, 0x09, 0x64, 0xdc, 0xa8, 0x2d, 0x9f, 0x74, 0x78, + 0xe8, 0xc1, 0xa2, 0x09, 0x63, 0x9c, 0xef, 0xa0, 0xdb, 0x4f, 0x9d, + 0x95, 0xab, 0x20, 0x4f, 0xb7, 0xb0, 0xf7, 0x87, 0x5c, 0xa6, 0xa0, + 0xe4, 0x37, 0x38, 0xc7, 0x5c, 0xe3, 0x35, 0x0f, 0x2c, 0xad, 0xa3, + 0x80, 0xa2, 0xec, 0x2e, 0x5d, 0xc0, 0xcf, 0xed, 0x8b, 0x05, 0xc2, + 0xe6, 0x73, 0x6e, 0xf6, 0x89, 0xd5, 0xf5, 0xd2, 0x46, 0x8e, 0xea, + 0x6d, 0x63, 0x1b, 0x1e, 0x8a, 0xc9, 0x7d, 0xa6, 0xf8, 0x9c, 0xeb, + 0xe5, 0xd5, 0x63, 0x85, 0x4d, 0x73, 0x66, 0x69, 0x11, 0xfe, 0xc8, + 0x0e, 0xf4, 0xc1, 0xc7, 0x66, 0x49, 0x53, 0x7e, 0xe4, 0x19, 0x6b, + 0xf1, 0xe9, 0x7a, 0x59, 0xa3, 0x6d, 0x7e, 0xc5, 0x17, 0xe6, 0x27, + 0xc6, 0xef, 0x1b, 0xdb, 0x6f, 0xfc, 0x0d, 0x4d, 0x06, 0x01, 0xb4, + 0x0e, 0x5c, 0x30, 0x46, 0x55, 0x60, 0xaf, 0x38, 0x65, 0x3a, 0xca, + 0x47, 0xba, 0xac, 0x2c, 0xcc, 0x46, 0x1f, 0xb2, 0x46, 0x96, 0x3f, + 0xf3, 0xed, 0x26, 0x05, 0xee, 0x77, 0xa1, 0x6a, 0x6b, 0x7e, 0x2d, + 0x6d, 0x58, 0x5c, 0x4a, 0xd4, 0x8e, 0x67, 0xb8, 0xf1, 0xda, 0xd5, + 0x46, 0x8a, 0x27, 0xf9, 0x11, 0xf2, 0xc9, 0x42, 0xfe, 0x4e, 0xde, + 0xdf, 0x1f, 0x5c, 0xc4, 0xa4, 0x86, 0x87, 0x16, 0x33, 0xa1, 0xa7, + 0x17, 0x18, 0xa5, 0x0d, 0xe4, 0x05, 0xe5, 0x2b, 0xc2, 0x2b, 0x0b, + 0xa2, 0x95, 0x90, 0xb9, 0xfd, 0x60, 0x3c, 0x4e, 0x89, 0x3e, 0xe7, + 0x9c, 0xee, 0x1f, 0xbb, 0x01, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, + 0x42, 0x30, 0x40, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, + 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, + 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, + 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, + 0x16, 0x04, 0x14, 0xe0, 0x4d, 0xbf, 0xdc, 0x9b, 0x41, 0x5d, 0x13, + 0xe8, 0x64, 0xf0, 0xa7, 0xe9, 0x15, 0xa4, 0xe1, 0x81, 0xc1, 0xba, + 0x31, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x6a, + 0x8a, 0x70, 0x38, 0x59, 0xb6, 0xda, 0x8b, 0x18, 0xc8, 0xbe, 0x2a, + 0xd3, 0xb6, 0x19, 0xd5, 0x66, 0x29, 0x7a, 0x5d, 0xcd, 0x5b, 0x2f, + 0x73, 0x1c, 0x26, 0x4e, 0xa3, 0x7d, 0x6f, 0xab, 0xb7, 0x29, 0x4d, + 0xa6, 0xe9, 0xa5, 0x11, 0x83, 0xa7, 0x39, 0x73, 0xaf, 0x10, 0x44, + 0x92, 0xe6, 0x25, 0x5d, 0x4f, 0x61, 0xfa, 0xc8, 0x06, 0xbe, 0x4e, + 0x4b, 0xef, 0xfe, 0xf3, 0x31, 0xfe, 0xc6, 0x7c, 0x70, 0x0a, 0x41, + 0x58, 0xda, 0xe8, 0x99, 0x4b, 0x96, 0xc9, 0x78, 0xbc, 0x98, 0x7c, + 0x02, 0x29, 0xed, 0x09, 0x80, 0xe6, 0x0a, 0x3a, 0x82, 0x02, 0x2a, + 0xe2, 0xc9, 0x2f, 0xc8, 0x56, 0x19, 0x26, 0xee, 0x78, 0x1c, 0x23, + 0xfd, 0xf7, 0x93, 0x65, 0x4e, 0xe7, 0xf3, 0x98, 0x98, 0xaf, 0xcd, + 0xdd, 0xd9, 0x9e, 0x40, 0x88, 0x31, 0x28, 0x3a, 0xab, 0x2e, 0x0b, + 0xb0, 0xac, 0x0c, 0x24, 0xfa, 0x7a, 0x26, 0x98, 0xf3, 0x12, 0x61, + 0x10, 0xf4, 0x5d, 0x17, 0xf7, 0x7e, 0xe2, 0x78, 0x97, 0x54, 0xe2, + 0x8c, 0xe8, 0x29, 0xba, 0x8c, 0x10, 0x32, 0xbd, 0xdd, 0x33, 0x6b, + 0x38, 0x86, 0x7e, 0x39, 0x3d, 0x0e, 0x03, 0x72, 0xa7, 0x5d, 0x79, + 0x8f, 0x45, 0x8a, 0x59, 0xae, 0x5b, 0x21, 0x6e, 0x31, 0x46, 0xd5, + 0x59, 0x8d, 0xcf, 0x15, 0x5f, 0xdd, 0x31, 0x25, 0xcf, 0xdb, 0x60, + 0xd6, 0x81, 0x44, 0x72, 0x29, 0x02, 0x57, 0xf6, 0x96, 0xd4, 0xd6, + 0xff, 0xea, 0x29, 0xdb, 0x39, 0xc5, 0xb8, 0x2c, 0x8a, 0x1a, 0x8d, + 0xce, 0xcb, 0xe7, 0x42, 0x31, 0x86, 0x05, 0x68, 0x0e, 0x9e, 0x14, + 0xdd, 0x00, 0x90, 0xba, 0x69, 0x45, 0x08, 0xdb, 0x6e, 0x90, 0x81, + 0x86, 0xa7, 0x2a, 0x05, 0x3f, 0xe6, 0x84, 0x39, 0xf8, 0xb7, 0xf9, + 0x57, 0x5f, 0x4c, 0xa4, 0x79, 0x5a, 0x10, 0x0c, 0x5e, 0xd5, 0x6b, + 0xff, 0x35, 0x5f, 0x05, 0x51, 0x1e, 0x6c, 0xa3, 0x75, 0xa9, 0xcf, + 0x50, 0x83, 0xd3, 0x7c, 0xf4, 0x66, 0xf7, 0x82, 0x8d, 0x3d, 0x0c, + 0x7d, 0xe8, 0xdf, 0x7b, 0xa8, 0x0e, 0x1b, 0x2c, 0x9c, 0xae, 0x40, + 0x70, 0x87, 0xda, 0xed, 0xa7, 0x16, 0x82, 0x5a, 0xbe, 0x35, 0x6c, + 0x20, 0x4e, 0x22, 0x61, 0xd9, 0xbc, 0x51, 0x7a, 0xcd, 0x7a, 0x61, + 0xdc, 0x4b, 0x11, 0xf9, 0xfe, 0x67, 0x34, 0xcf, 0x2e, 0x04, 0x66, + 0x61, 0x5c, 0x57, 0x97, 0x23, 0x8c, 0xf3, 0x86, 0x1b, 0x48, 0xdf, + 0x2a, 0xaf, 0xa7, 0xc1, 0xff, 0xd8, 0x8e, 0x3e, 0x03, 0xbb, 0xd8, + 0x2a, 0xb0, 0xfa, 0x14, 0x25, 0xb2, 0x51, 0x6b, 0x86, 0x43, 0x85, + 0x2e, 0x07, 0x23, 0x16, 0x80, 0x8d, 0x4c, 0xfb, 0xb4, 0x63, 0x3b, + 0xcc, 0xc3, 0x74, 0xed, 0x1b, 0xa3, 0x1e, 0xfe, 0x35, 0x0f, 0x5f, + 0x7c, 0x1d, 0x16, 0x86, 0xf5, 0x0e, 0xc3, 0x95, 0xf1, 0x2f, 0xaf, + 0x5d, 0x25, 0x3b, 0x51, 0xe6, 0xd7, 0x76, 0x41, 0x38, 0xd1, 0x4b, + 0x03, 0x39, 0x28, 0xa5, 0x1e, 0x91, 0x72, 0xd4, 0x7d, 0xab, 0x97, + 0x33, 0xc4, 0xd3, 0x3e, 0xe0, 0x69, 0xb6, 0x28, 0x79, 0xa0, 0x09, + 0x8d, 0x1c, 0xd1, 0xff, 0x41, 0x72, 0x48, 0x06, 0xfc, 0x9a, 0x2e, + 0xe7, 0x20, 0xf9, 0x9b, 0xa2, 0xde, 0x89, 0xed, 0xae, 0x3c, 0x09, + 0xaf, 0xca, 0x57, 0xb3, 0x92, 0x89, 0x70, 0x40, 0xe4, 0x2f, 0x4f, + 0xc2, 0x70, 0x83, 0x40, 0xd7, 0x24, 0x2c, 0x6b, 0xe7, 0x09, 0x1f, + 0xd3, 0xd5, 0xc7, 0xc1, 0x08, 0xf4, 0xdb, 0x0e, 0x3b, 0x1c, 0x07, + 0x0b, 0x43, 0x11, 0x84, 0x21, 0x86, 0xe9, 0x80, 0xd4, 0x75, 0xd8, + 0xab, 0xf1, 0x02, 0x62, 0xc1, 0xb1, 0x7e, 0x55, 0x61, 0xcf, 0x13, + 0xd7, 0x26, 0xb0, 0xd7, 0x9c, 0xcb, 0x29, 0x8b, 0x38, 0x4a, 0x0b, + 0x0e, 0x90, 0x8d, 0xba, 0xa1, 0x30, 0x82, 0x05, 0xd8, 0x30, 0x82, + 0x03, 0xc0, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x4c, 0xaa, + 0xf9, 0xca, 0xdb, 0x63, 0x6f, 0xe0, 0x1f, 0xf7, 0x4e, 0xd8, 0x5b, + 0x03, 0x86, 0x9d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x30, 0x81, 0x85, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, + 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, + 0x12, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, + 0x6e, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, + 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x53, 0x61, 0x6c, + 0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x13, 0x11, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, + 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, + 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x43, + 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x52, 0x53, 0x41, 0x20, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, 0x30, 0x31, 0x31, 0x39, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, + 0x31, 0x31, 0x38, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, + 0x81, 0x85, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, + 0x04, 0x08, 0x13, 0x12, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, + 0x20, 0x4d, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, + 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, + 0x53, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x43, 0x4f, 0x4d, 0x4f, + 0x44, 0x4f, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x65, 0x64, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x22, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x52, 0x53, + 0x41, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, + 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, + 0x02, 0x01, 0x00, 0x91, 0xe8, 0x54, 0x92, 0xd2, 0x0a, 0x56, 0xb1, + 0xac, 0x0d, 0x24, 0xdd, 0xc5, 0xcf, 0x44, 0x67, 0x74, 0x99, 0x2b, + 0x37, 0xa3, 0x7d, 0x23, 0x70, 0x00, 0x71, 0xbc, 0x53, 0xdf, 0xc4, + 0xfa, 0x2a, 0x12, 0x8f, 0x4b, 0x7f, 0x10, 0x56, 0xbd, 0x9f, 0x70, + 0x72, 0xb7, 0x61, 0x7f, 0xc9, 0x4b, 0x0f, 0x17, 0xa7, 0x3d, 0xe3, + 0xb0, 0x04, 0x61, 0xee, 0xff, 0x11, 0x97, 0xc7, 0xf4, 0x86, 0x3e, + 0x0a, 0xfa, 0x3e, 0x5c, 0xf9, 0x93, 0xe6, 0x34, 0x7a, 0xd9, 0x14, + 0x6b, 0xe7, 0x9c, 0xb3, 0x85, 0xa0, 0x82, 0x7a, 0x76, 0xaf, 0x71, + 0x90, 0xd7, 0xec, 0xfd, 0x0d, 0xfa, 0x9c, 0x6c, 0xfa, 0xdf, 0xb0, + 0x82, 0xf4, 0x14, 0x7e, 0xf9, 0xbe, 0xc4, 0xa6, 0x2f, 0x4f, 0x7f, + 0x99, 0x7f, 0xb5, 0xfc, 0x67, 0x43, 0x72, 0xbd, 0x0c, 0x00, 0xd6, + 0x89, 0xeb, 0x6b, 0x2c, 0xd3, 0xed, 0x8f, 0x98, 0x1c, 0x14, 0xab, + 0x7e, 0xe5, 0xe3, 0x6e, 0xfc, 0xd8, 0xa8, 0xe4, 0x92, 0x24, 0xda, + 0x43, 0x6b, 0x62, 0xb8, 0x55, 0xfd, 0xea, 0xc1, 0xbc, 0x6c, 0xb6, + 0x8b, 0xf3, 0x0e, 0x8d, 0x9a, 0xe4, 0x9b, 0x6c, 0x69, 0x99, 0xf8, + 0x78, 0x48, 0x30, 0x45, 0xd5, 0xad, 0xe1, 0x0d, 0x3c, 0x45, 0x60, + 0xfc, 0x32, 0x96, 0x51, 0x27, 0xbc, 0x67, 0xc3, 0xca, 0x2e, 0xb6, + 0x6b, 0xea, 0x46, 0xc7, 0xc7, 0x20, 0xa0, 0xb1, 0x1f, 0x65, 0xde, + 0x48, 0x08, 0xba, 0xa4, 0x4e, 0xa9, 0xf2, 0x83, 0x46, 0x37, 0x84, + 0xeb, 0xe8, 0xcc, 0x81, 0x48, 0x43, 0x67, 0x4e, 0x72, 0x2a, 0x9b, + 0x5c, 0xbd, 0x4c, 0x1b, 0x28, 0x8a, 0x5c, 0x22, 0x7b, 0xb4, 0xab, + 0x98, 0xd9, 0xee, 0xe0, 0x51, 0x83, 0xc3, 0x09, 0x46, 0x4e, 0x6d, + 0x3e, 0x99, 0xfa, 0x95, 0x17, 0xda, 0x7c, 0x33, 0x57, 0x41, 0x3c, + 0x8d, 0x51, 0xed, 0x0b, 0xb6, 0x5c, 0xaf, 0x2c, 0x63, 0x1a, 0xdf, + 0x57, 0xc8, 0x3f, 0xbc, 0xe9, 0x5d, 0xc4, 0x9b, 0xaf, 0x45, 0x99, + 0xe2, 0xa3, 0x5a, 0x24, 0xb4, 0xba, 0xa9, 0x56, 0x3d, 0xcf, 0x6f, + 0xaa, 0xff, 0x49, 0x58, 0xbe, 0xf0, 0xa8, 0xff, 0xf4, 0xb8, 0xad, + 0xe9, 0x37, 0xfb, 0xba, 0xb8, 0xf4, 0x0b, 0x3a, 0xf9, 0xe8, 0x43, + 0x42, 0x1e, 0x89, 0xd8, 0x84, 0xcb, 0x13, 0xf1, 0xd9, 0xbb, 0xe1, + 0x89, 0x60, 0xb8, 0x8c, 0x28, 0x56, 0xac, 0x14, 0x1d, 0x9c, 0x0a, + 0xe7, 0x71, 0xeb, 0xcf, 0x0e, 0xdd, 0x3d, 0xa9, 0x96, 0xa1, 0x48, + 0xbd, 0x3c, 0xf7, 0xaf, 0xb5, 0x0d, 0x22, 0x4c, 0xc0, 0x11, 0x81, + 0xec, 0x56, 0x3b, 0xf6, 0xd3, 0xa2, 0xe2, 0x5b, 0xb7, 0xb2, 0x04, + 0x22, 0x52, 0x95, 0x80, 0x93, 0x69, 0xe8, 0x8e, 0x4c, 0x65, 0xf1, + 0x91, 0x03, 0x2d, 0x70, 0x74, 0x02, 0xea, 0x8b, 0x67, 0x15, 0x29, + 0x69, 0x52, 0x02, 0xbb, 0xd7, 0xdf, 0x50, 0x6a, 0x55, 0x46, 0xbf, + 0xa0, 0xa3, 0x28, 0x61, 0x7f, 0x70, 0xd0, 0xc3, 0xa2, 0xaa, 0x2c, + 0x21, 0xaa, 0x47, 0xce, 0x28, 0x9c, 0x06, 0x45, 0x76, 0xbf, 0x82, + 0x18, 0x27, 0xb4, 0xd5, 0xae, 0xb4, 0xcb, 0x50, 0xe6, 0x6b, 0xf4, + 0x4c, 0x86, 0x71, 0x30, 0xe9, 0xa6, 0xdf, 0x16, 0x86, 0xe0, 0xd8, + 0xff, 0x40, 0xdd, 0xfb, 0xd0, 0x42, 0x88, 0x7f, 0xa3, 0x33, 0x3a, + 0x2e, 0x5c, 0x1e, 0x41, 0x11, 0x81, 0x63, 0xce, 0x18, 0x71, 0x6b, + 0x2b, 0xec, 0xa6, 0x8a, 0xb7, 0x31, 0x5c, 0x3a, 0x6a, 0x47, 0xe0, + 0xc3, 0x79, 0x59, 0xd6, 0x20, 0x1a, 0xaf, 0xf2, 0x6a, 0x98, 0xaa, + 0x72, 0xbc, 0x57, 0x4a, 0xd2, 0x4b, 0x9d, 0xbb, 0x10, 0xfc, 0xb0, + 0x4c, 0x41, 0xe5, 0xed, 0x1d, 0x3d, 0x5e, 0x28, 0x9d, 0x9c, 0xcc, + 0xbf, 0xb3, 0x51, 0xda, 0xa7, 0x47, 0xe5, 0x84, 0x53, 0x02, 0x03, + 0x01, 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, + 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xbb, 0xaf, 0x7e, 0x02, + 0x3d, 0xfa, 0xa6, 0xf1, 0x3c, 0x84, 0x8e, 0xad, 0xee, 0x38, 0x98, + 0xec, 0xd9, 0x32, 0x32, 0xd4, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, + 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, + 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, + 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x03, 0x82, + 0x02, 0x01, 0x00, 0x0a, 0xf1, 0xd5, 0x46, 0x84, 0xb7, 0xae, 0x51, + 0xbb, 0x6c, 0xb2, 0x4d, 0x41, 0x14, 0x00, 0x93, 0x4c, 0x9c, 0xcb, + 0xe5, 0xc0, 0x54, 0xcf, 0xa0, 0x25, 0x8e, 0x02, 0xf9, 0xfd, 0xb0, + 0xa2, 0x0d, 0xf5, 0x20, 0x98, 0x3c, 0x13, 0x2d, 0xac, 0x56, 0xa2, + 0xb0, 0xd6, 0x7e, 0x11, 0x92, 0xe9, 0x2e, 0xba, 0x9e, 0x2e, 0x9a, + 0x72, 0xb1, 0xbd, 0x19, 0x44, 0x6c, 0x61, 0x35, 0xa2, 0x9a, 0xb4, + 0x16, 0x12, 0x69, 0x5a, 0x8c, 0xe1, 0xd7, 0x3e, 0xa4, 0x1a, 0xe8, + 0x2f, 0x03, 0xf4, 0xae, 0x61, 0x1d, 0x10, 0x1b, 0x2a, 0xa4, 0x8b, + 0x7a, 0xc5, 0xfe, 0x05, 0xa6, 0xe1, 0xc0, 0xd6, 0xc8, 0xfe, 0x9e, + 0xae, 0x8f, 0x2b, 0xba, 0x3d, 0x99, 0xf8, 0xd8, 0x73, 0x09, 0x58, + 0x46, 0x6e, 0xa6, 0x9c, 0xf4, 0xd7, 0x27, 0xd3, 0x95, 0xda, 0x37, + 0x83, 0x72, 0x1c, 0xd3, 0x73, 0xe0, 0xa2, 0x47, 0x99, 0x03, 0x38, + 0x5d, 0xd5, 0x49, 0x79, 0x00, 0x29, 0x1c, 0xc7, 0xec, 0x9b, 0x20, + 0x1c, 0x07, 0x24, 0x69, 0x57, 0x78, 0xb2, 0x39, 0xfc, 0x3a, 0x84, + 0xa0, 0xb5, 0x9c, 0x7c, 0x8d, 0xbf, 0x2e, 0x93, 0x62, 0x27, 0xb7, + 0x39, 0xda, 0x17, 0x18, 0xae, 0xbd, 0x3c, 0x09, 0x68, 0xff, 0x84, + 0x9b, 0x3c, 0xd5, 0xd6, 0x0b, 0x03, 0xe3, 0x57, 0x9e, 0x14, 0xf7, + 0xd1, 0xeb, 0x4f, 0xc8, 0xbd, 0x87, 0x23, 0xb7, 0xb6, 0x49, 0x43, + 0x79, 0x85, 0x5c, 0xba, 0xeb, 0x92, 0x0b, 0xa1, 0xc6, 0xe8, 0x68, + 0xa8, 0x4c, 0x16, 0xb1, 0x1a, 0x99, 0x0a, 0xe8, 0x53, 0x2c, 0x92, + 0xbb, 0xa1, 0x09, 0x18, 0x75, 0x0c, 0x65, 0xa8, 0x7b, 0xcb, 0x23, + 0xb7, 0x1a, 0xc2, 0x28, 0x85, 0xc3, 0x1b, 0xff, 0xd0, 0x2b, 0x62, + 0xef, 0xa4, 0x7b, 0x09, 0x91, 0x98, 0x67, 0x8c, 0x14, 0x01, 0xcd, + 0x68, 0x06, 0x6a, 0x63, 0x21, 0x75, 0x03, 0x80, 0x88, 0x8a, 0x6e, + 0x81, 0xc6, 0x85, 0xf2, 0xa9, 0xa4, 0x2d, 0xe7, 0xf4, 0xa5, 0x24, + 0x10, 0x47, 0x83, 0xca, 0xcd, 0xf4, 0x8d, 0x79, 0x58, 0xb1, 0x06, + 0x9b, 0xe7, 0x1a, 0x2a, 0xd9, 0x9d, 0x01, 0xd7, 0x94, 0x7d, 0xed, + 0x03, 0x4a, 0xca, 0xf0, 0xdb, 0xe8, 0xa9, 0x01, 0x3e, 0xf5, 0x56, + 0x99, 0xc9, 0x1e, 0x8e, 0x49, 0x3d, 0xbb, 0xe5, 0x09, 0xb9, 0xe0, + 0x4f, 0x49, 0x92, 0x3d, 0x16, 0x82, 0x40, 0xcc, 0xcc, 0x59, 0xc6, + 0xe6, 0x3a, 0xed, 0x12, 0x2e, 0x69, 0x3c, 0x6c, 0x95, 0xb1, 0xfd, + 0xaa, 0x1d, 0x7b, 0x7f, 0x86, 0xbe, 0x1e, 0x0e, 0x32, 0x46, 0xfb, + 0xfb, 0x13, 0x8f, 0x75, 0x7f, 0x4c, 0x8b, 0x4b, 0x46, 0x63, 0xfe, + 0x00, 0x34, 0x40, 0x70, 0xc1, 0xc3, 0xb9, 0xa1, 0xdd, 0xa6, 0x70, + 0xe2, 0x04, 0xb3, 0x41, 0xbc, 0xe9, 0x80, 0x91, 0xea, 0x64, 0x9c, + 0x7a, 0xe1, 0x22, 0x03, 0xa9, 0x9c, 0x6e, 0x6f, 0x0e, 0x65, 0x4f, + 0x6c, 0x87, 0x87, 0x5e, 0xf3, 0x6e, 0xa0, 0xf9, 0x75, 0xa5, 0x9b, + 0x40, 0xe8, 0x53, 0xb2, 0x27, 0x9d, 0x4a, 0xb9, 0xc0, 0x77, 0x21, + 0x8d, 0xff, 0x87, 0xf2, 0xde, 0xbc, 0x8c, 0xef, 0x17, 0xdf, 0xb7, + 0x49, 0x0b, 0xd1, 0xf2, 0x6e, 0x30, 0x0b, 0x1a, 0x0e, 0x4e, 0x76, + 0xed, 0x11, 0xfc, 0xf5, 0xe9, 0x56, 0xb2, 0x7d, 0xbf, 0xc7, 0x6d, + 0x0a, 0x93, 0x8c, 0xa5, 0xd0, 0xc0, 0xb6, 0x1d, 0xbe, 0x3a, 0x4e, + 0x94, 0xa2, 0xd7, 0x6e, 0x6c, 0x0b, 0xc2, 0x8a, 0x7c, 0xfa, 0x20, + 0xf3, 0xc4, 0xe4, 0xe5, 0xcd, 0x0d, 0xa8, 0xcb, 0x91, 0x92, 0xb1, + 0x7c, 0x85, 0xec, 0xb5, 0x14, 0x69, 0x66, 0x0e, 0x82, 0xe7, 0xcd, + 0xce, 0xc8, 0x2d, 0xa6, 0x51, 0x7f, 0x21, 0xc1, 0x35, 0x53, 0x85, + 0x06, 0x4a, 0x5d, 0x9f, 0xad, 0xbb, 0x1b, 0x5f, 0x74, 0x30, 0x82, + 0x05, 0xde, 0x30, 0x82, 0x03, 0xc6, 0xa0, 0x03, 0x02, 0x01, 0x02, + 0x02, 0x10, 0x01, 0xfd, 0x6d, 0x30, 0xfc, 0xa3, 0xca, 0x51, 0xa8, + 0x1b, 0xbc, 0x64, 0x0e, 0x35, 0x03, 0x2d, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, + 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, + 0x55, 0x04, 0x08, 0x13, 0x0a, 0x4e, 0x65, 0x77, 0x20, 0x4a, 0x65, + 0x72, 0x73, 0x65, 0x79, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, + 0x04, 0x07, 0x13, 0x0b, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x20, + 0x43, 0x69, 0x74, 0x79, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x13, 0x15, 0x54, 0x68, 0x65, 0x20, 0x55, 0x53, 0x45, + 0x52, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x25, 0x55, 0x53, 0x45, 0x52, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x20, 0x52, 0x53, 0x41, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, + 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, + 0x31, 0x30, 0x30, 0x32, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x31, 0x31, 0x38, 0x32, + 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x81, 0x88, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, + 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a, + 0x4e, 0x65, 0x77, 0x20, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x31, + 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0b, 0x4a, + 0x65, 0x72, 0x73, 0x65, 0x79, 0x20, 0x43, 0x69, 0x74, 0x79, 0x31, + 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x54, + 0x68, 0x65, 0x20, 0x55, 0x53, 0x45, 0x52, 0x54, 0x52, 0x55, 0x53, + 0x54, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x2e, + 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x55, 0x53, + 0x45, 0x52, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, 0x53, 0x41, + 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x74, 0x79, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, + 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, + 0x01, 0x00, 0x80, 0x12, 0x65, 0x17, 0x36, 0x0e, 0xc3, 0xdb, 0x08, + 0xb3, 0xd0, 0xac, 0x57, 0x0d, 0x76, 0xed, 0xcd, 0x27, 0xd3, 0x4c, + 0xad, 0x50, 0x83, 0x61, 0xe2, 0xaa, 0x20, 0x4d, 0x09, 0x2d, 0x64, + 0x09, 0xdc, 0xce, 0x89, 0x9f, 0xcc, 0x3d, 0xa9, 0xec, 0xf6, 0xcf, + 0xc1, 0xdc, 0xf1, 0xd3, 0xb1, 0xd6, 0x7b, 0x37, 0x28, 0x11, 0x2b, + 0x47, 0xda, 0x39, 0xc6, 0xbc, 0x3a, 0x19, 0xb4, 0x5f, 0xa6, 0xbd, + 0x7d, 0x9d, 0xa3, 0x63, 0x42, 0xb6, 0x76, 0xf2, 0xa9, 0x3b, 0x2b, + 0x91, 0xf8, 0xe2, 0x6f, 0xd0, 0xec, 0x16, 0x20, 0x90, 0x09, 0x3e, + 0xe2, 0xe8, 0x74, 0xc9, 0x18, 0xb4, 0x91, 0xd4, 0x62, 0x64, 0xdb, + 0x7f, 0xa3, 0x06, 0xf1, 0x88, 0x18, 0x6a, 0x90, 0x22, 0x3c, 0xbc, + 0xfe, 0x13, 0xf0, 0x87, 0x14, 0x7b, 0xf6, 0xe4, 0x1f, 0x8e, 0xd4, + 0xe4, 0x51, 0xc6, 0x11, 0x67, 0x46, 0x08, 0x51, 0xcb, 0x86, 0x14, + 0x54, 0x3f, 0xbc, 0x33, 0xfe, 0x7e, 0x6c, 0x9c, 0xff, 0x16, 0x9d, + 0x18, 0xbd, 0x51, 0x8e, 0x35, 0xa6, 0xa7, 0x66, 0xc8, 0x72, 0x67, + 0xdb, 0x21, 0x66, 0xb1, 0xd4, 0x9b, 0x78, 0x03, 0xc0, 0x50, 0x3a, + 0xe8, 0xcc, 0xf0, 0xdc, 0xbc, 0x9e, 0x4c, 0xfe, 0xaf, 0x05, 0x96, + 0x35, 0x1f, 0x57, 0x5a, 0xb7, 0xff, 0xce, 0xf9, 0x3d, 0xb7, 0x2c, + 0xb6, 0xf6, 0x54, 0xdd, 0xc8, 0xe7, 0x12, 0x3a, 0x4d, 0xae, 0x4c, + 0x8a, 0xb7, 0x5c, 0x9a, 0xb4, 0xb7, 0x20, 0x3d, 0xca, 0x7f, 0x22, + 0x34, 0xae, 0x7e, 0x3b, 0x68, 0x66, 0x01, 0x44, 0xe7, 0x01, 0x4e, + 0x46, 0x53, 0x9b, 0x33, 0x60, 0xf7, 0x94, 0xbe, 0x53, 0x37, 0x90, + 0x73, 0x43, 0xf3, 0x32, 0xc3, 0x53, 0xef, 0xdb, 0xaa, 0xfe, 0x74, + 0x4e, 0x69, 0xc7, 0x6b, 0x8c, 0x60, 0x93, 0xde, 0xc4, 0xc7, 0x0c, + 0xdf, 0xe1, 0x32, 0xae, 0xcc, 0x93, 0x3b, 0x51, 0x78, 0x95, 0x67, + 0x8b, 0xee, 0x3d, 0x56, 0xfe, 0x0c, 0xd0, 0x69, 0x0f, 0x1b, 0x0f, + 0xf3, 0x25, 0x26, 0x6b, 0x33, 0x6d, 0xf7, 0x6e, 0x47, 0xfa, 0x73, + 0x43, 0xe5, 0x7e, 0x0e, 0xa5, 0x66, 0xb1, 0x29, 0x7c, 0x32, 0x84, + 0x63, 0x55, 0x89, 0xc4, 0x0d, 0xc1, 0x93, 0x54, 0x30, 0x19, 0x13, + 0xac, 0xd3, 0x7d, 0x37, 0xa7, 0xeb, 0x5d, 0x3a, 0x6c, 0x35, 0x5c, + 0xdb, 0x41, 0xd7, 0x12, 0xda, 0xa9, 0x49, 0x0b, 0xdf, 0xd8, 0x80, + 0x8a, 0x09, 0x93, 0x62, 0x8e, 0xb5, 0x66, 0xcf, 0x25, 0x88, 0xcd, + 0x84, 0xb8, 0xb1, 0x3f, 0xa4, 0x39, 0x0f, 0xd9, 0x02, 0x9e, 0xeb, + 0x12, 0x4c, 0x95, 0x7c, 0xf3, 0x6b, 0x05, 0xa9, 0x5e, 0x16, 0x83, + 0xcc, 0xb8, 0x67, 0xe2, 0xe8, 0x13, 0x9d, 0xcc, 0x5b, 0x82, 0xd3, + 0x4c, 0xb3, 0xed, 0x5b, 0xff, 0xde, 0xe5, 0x73, 0xac, 0x23, 0x3b, + 0x2d, 0x00, 0xbf, 0x35, 0x55, 0x74, 0x09, 0x49, 0xd8, 0x49, 0x58, + 0x1a, 0x7f, 0x92, 0x36, 0xe6, 0x51, 0x92, 0x0e, 0xf3, 0x26, 0x7d, + 0x1c, 0x4d, 0x17, 0xbc, 0xc9, 0xec, 0x43, 0x26, 0xd0, 0xbf, 0x41, + 0x5f, 0x40, 0xa9, 0x44, 0x44, 0xf4, 0x99, 0xe7, 0x57, 0x87, 0x9e, + 0x50, 0x1f, 0x57, 0x54, 0xa8, 0x3e, 0xfd, 0x74, 0x63, 0x2f, 0xb1, + 0x50, 0x65, 0x09, 0xe6, 0x58, 0x42, 0x2e, 0x43, 0x1a, 0x4c, 0xb4, + 0xf0, 0x25, 0x47, 0x59, 0xfa, 0x04, 0x1e, 0x93, 0xd4, 0x26, 0x46, + 0x4a, 0x50, 0x81, 0xb2, 0xde, 0xbe, 0x78, 0xb7, 0xfc, 0x67, 0x15, + 0xe1, 0xc9, 0x57, 0x84, 0x1e, 0x0f, 0x63, 0xd6, 0xe9, 0x62, 0xba, + 0xd6, 0x5f, 0x55, 0x2e, 0xea, 0x5c, 0xc6, 0x28, 0x08, 0x04, 0x25, + 0x39, 0xb8, 0x0e, 0x2b, 0xa9, 0xf2, 0x4c, 0x97, 0x1c, 0x07, 0x3f, + 0x0d, 0x52, 0xf5, 0xed, 0xef, 0x2f, 0x82, 0x0f, 0x02, 0x03, 0x01, + 0x00, 0x01, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, + 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x53, 0x79, 0xbf, 0x5a, 0xaa, + 0x2b, 0x4a, 0xcf, 0x54, 0x80, 0xe1, 0xd8, 0x9b, 0xc0, 0x9d, 0xf2, + 0xb2, 0x03, 0x66, 0xcb, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, + 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, + 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00, 0x03, 0x82, 0x02, + 0x01, 0x00, 0x5c, 0xd4, 0x7c, 0x0d, 0xcf, 0xf7, 0x01, 0x7d, 0x41, + 0x99, 0x65, 0x0c, 0x73, 0xc5, 0x52, 0x9f, 0xcb, 0xf8, 0xcf, 0x99, + 0x06, 0x7f, 0x1b, 0xda, 0x43, 0x15, 0x9f, 0x9e, 0x02, 0x55, 0x57, + 0x96, 0x14, 0xf1, 0x52, 0x3c, 0x27, 0x87, 0x94, 0x28, 0xed, 0x1f, + 0x3a, 0x01, 0x37, 0xa2, 0x76, 0xfc, 0x53, 0x50, 0xc0, 0x84, 0x9b, + 0xc6, 0x6b, 0x4e, 0xba, 0x8c, 0x21, 0x4f, 0xa2, 0x8e, 0x55, 0x62, + 0x91, 0xf3, 0x69, 0x15, 0xd8, 0xbc, 0x88, 0xe3, 0xc4, 0xaa, 0x0b, + 0xfd, 0xef, 0xa8, 0xe9, 0x4b, 0x55, 0x2a, 0x06, 0x20, 0x6d, 0x55, + 0x78, 0x29, 0x19, 0xee, 0x5f, 0x30, 0x5c, 0x4b, 0x24, 0x11, 0x55, + 0xff, 0x24, 0x9a, 0x6e, 0x5e, 0x2a, 0x2b, 0xee, 0x0b, 0x4d, 0x9f, + 0x7f, 0xf7, 0x01, 0x38, 0x94, 0x14, 0x95, 0x43, 0x07, 0x09, 0xfb, + 0x60, 0xa9, 0xee, 0x1c, 0xab, 0x12, 0x8c, 0xa0, 0x9a, 0x5e, 0xa7, + 0x98, 0x6a, 0x59, 0x6d, 0x8b, 0x3f, 0x08, 0xfb, 0xc8, 0xd1, 0x45, + 0xaf, 0x18, 0x15, 0x64, 0x90, 0x12, 0x0f, 0x73, 0x28, 0x2e, 0xc5, + 0xe2, 0x24, 0x4e, 0xfc, 0x58, 0xec, 0xf0, 0xf4, 0x45, 0xfe, 0x22, + 0xb3, 0xeb, 0x2f, 0x8e, 0xd2, 0xd9, 0x45, 0x61, 0x05, 0xc1, 0x97, + 0x6f, 0xa8, 0x76, 0x72, 0x8f, 0x8b, 0x8c, 0x36, 0xaf, 0xbf, 0x0d, + 0x05, 0xce, 0x71, 0x8d, 0xe6, 0xa6, 0x6f, 0x1f, 0x6c, 0xa6, 0x71, + 0x62, 0xc5, 0xd8, 0xd0, 0x83, 0x72, 0x0c, 0xf1, 0x67, 0x11, 0x89, + 0x0c, 0x9c, 0x13, 0x4c, 0x72, 0x34, 0xdf, 0xbc, 0xd5, 0x71, 0xdf, + 0xaa, 0x71, 0xdd, 0xe1, 0xb9, 0x6c, 0x8c, 0x3c, 0x12, 0x5d, 0x65, + 0xda, 0xbd, 0x57, 0x12, 0xb6, 0x43, 0x6b, 0xff, 0xe5, 0xde, 0x4d, + 0x66, 0x11, 0x51, 0xcf, 0x99, 0xae, 0xec, 0x17, 0xb6, 0xe8, 0x71, + 0x91, 0x8c, 0xde, 0x49, 0xfe, 0xdd, 0x35, 0x71, 0xa2, 0x15, 0x27, + 0x94, 0x1c, 0xcf, 0x61, 0xe3, 0x26, 0xbb, 0x6f, 0xa3, 0x67, 0x25, + 0x21, 0x5d, 0xe6, 0xdd, 0x1d, 0x0b, 0x2e, 0x68, 0x1b, 0x3b, 0x82, + 0xaf, 0xec, 0x83, 0x67, 0x85, 0xd4, 0x98, 0x51, 0x74, 0xb1, 0xb9, + 0x99, 0x80, 0x89, 0xff, 0x7f, 0x78, 0x19, 0x5c, 0x79, 0x4a, 0x60, + 0x2e, 0x92, 0x40, 0xae, 0x4c, 0x37, 0x2a, 0x2c, 0xc9, 0xc7, 0x62, + 0xc8, 0x0e, 0x5d, 0xf7, 0x36, 0x5b, 0xca, 0xe0, 0x25, 0x25, 0x01, + 0xb4, 0xdd, 0x1a, 0x07, 0x9c, 0x77, 0x00, 0x3f, 0xd0, 0xdc, 0xd5, + 0xec, 0x3d, 0xd4, 0xfa, 0xbb, 0x3f, 0xcc, 0x85, 0xd6, 0x6f, 0x7f, + 0xa9, 0x2d, 0xdf, 0xb9, 0x02, 0xf7, 0xf5, 0x97, 0x9a, 0xb5, 0x35, + 0xda, 0xc3, 0x67, 0xb0, 0x87, 0x4a, 0xa9, 0x28, 0x9e, 0x23, 0x8e, + 0xff, 0x5c, 0x27, 0x6b, 0xe1, 0xb0, 0x4f, 0xf3, 0x07, 0xee, 0x00, + 0x2e, 0xd4, 0x59, 0x87, 0xcb, 0x52, 0x41, 0x95, 0xea, 0xf4, 0x47, + 0xd7, 0xee, 0x64, 0x41, 0x55, 0x7c, 0x8d, 0x59, 0x02, 0x95, 0xdd, + 0x62, 0x9d, 0xc2, 0xb9, 0xee, 0x5a, 0x28, 0x74, 0x84, 0xa5, 0x9b, + 0xb7, 0x90, 0xc7, 0x0c, 0x07, 0xdf, 0xf5, 0x89, 0x36, 0x74, 0x32, + 0xd6, 0x28, 0xc1, 0xb0, 0xb0, 0x0b, 0xe0, 0x9c, 0x4c, 0xc3, 0x1c, + 0xd6, 0xfc, 0xe3, 0x69, 0xb5, 0x47, 0x46, 0x81, 0x2f, 0xa2, 0x82, + 0xab, 0xd3, 0x63, 0x44, 0x70, 0xc4, 0x8d, 0xff, 0x2d, 0x33, 0xba, + 0xad, 0x8f, 0x7b, 0xb5, 0x70, 0x88, 0xae, 0x3e, 0x19, 0xcf, 0x40, + 0x28, 0xd8, 0xfc, 0xc8, 0x90, 0xbb, 0x5d, 0x99, 0x22, 0xf5, 0x52, + 0xe6, 0x58, 0xc5, 0x1f, 0x88, 0x31, 0x43, 0xee, 0x88, 0x1d, 0xd7, + 0xc6, 0x8e, 0x3c, 0x43, 0x6a, 0x1d, 0xa7, 0x18, 0xde, 0x7d, 0x3d, + 0x16, 0xf1, 0x62, 0xf9, 0xca, 0x90, 0xa8, 0xfd, 0x30, 0x82, 0x02, + 0x8f, 0x30, 0x82, 0x02, 0x15, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, + 0x10, 0x5c, 0x8b, 0x99, 0xc5, 0x5a, 0x94, 0xc5, 0xd2, 0x71, 0x56, + 0xde, 0xcd, 0x89, 0x80, 0xcc, 0x26, 0x30, 0x0a, 0x06, 0x08, 0x2a, + 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x81, 0x88, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, + 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, + 0x0a, 0x4e, 0x65, 0x77, 0x20, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, + 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0b, + 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x20, 0x43, 0x69, 0x74, 0x79, + 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, + 0x54, 0x68, 0x65, 0x20, 0x55, 0x53, 0x45, 0x52, 0x54, 0x52, 0x55, + 0x53, 0x54, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, + 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x55, + 0x53, 0x45, 0x52, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x45, 0x43, + 0x43, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, 0x30, 0x32, + 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, + 0x33, 0x38, 0x30, 0x31, 0x31, 0x38, 0x32, 0x33, 0x35, 0x39, 0x35, + 0x39, 0x5a, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, + 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a, 0x4e, 0x65, 0x77, 0x20, + 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x31, 0x14, 0x30, 0x12, 0x06, + 0x03, 0x55, 0x04, 0x07, 0x13, 0x0b, 0x4a, 0x65, 0x72, 0x73, 0x65, + 0x79, 0x20, 0x43, 0x69, 0x74, 0x79, 0x31, 0x1e, 0x30, 0x1c, 0x06, + 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x54, 0x68, 0x65, 0x20, 0x55, + 0x53, 0x45, 0x52, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x13, 0x25, 0x55, 0x53, 0x45, 0x52, 0x54, 0x72, + 0x75, 0x73, 0x74, 0x20, 0x45, 0x43, 0x43, 0x20, 0x43, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x76, + 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, + 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, + 0x1a, 0xac, 0x54, 0x5a, 0xa9, 0xf9, 0x68, 0x23, 0xe7, 0x7a, 0xd5, + 0x24, 0x6f, 0x53, 0xc6, 0x5a, 0xd8, 0x4b, 0xab, 0xc6, 0xd5, 0xb6, + 0xd1, 0xe6, 0x73, 0x71, 0xae, 0xdd, 0x9c, 0xd6, 0x0c, 0x61, 0xfd, + 0xdb, 0xa0, 0x89, 0x03, 0xb8, 0x05, 0x14, 0xec, 0x57, 0xce, 0xee, + 0x5d, 0x3f, 0xe2, 0x21, 0xb3, 0xce, 0xf7, 0xd4, 0x8a, 0x79, 0xe0, + 0xa3, 0x83, 0x7e, 0x2d, 0x97, 0xd0, 0x61, 0xc4, 0xf1, 0x99, 0xdc, + 0x25, 0x91, 0x63, 0xab, 0x7f, 0x30, 0xa3, 0xb4, 0x70, 0xe2, 0xc7, + 0xa1, 0x33, 0x9c, 0xf3, 0xbf, 0x2e, 0x5c, 0x53, 0xb1, 0x5f, 0xb3, + 0x7d, 0x32, 0x7f, 0x8a, 0x34, 0xe3, 0x79, 0x79, 0xa3, 0x42, 0x30, + 0x40, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, + 0x14, 0x3a, 0xe1, 0x09, 0x86, 0xd4, 0xcf, 0x19, 0xc2, 0x96, 0x76, + 0x74, 0x49, 0x76, 0xdc, 0xe0, 0x35, 0xc6, 0x63, 0x63, 0x9a, 0x30, + 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, + 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, + 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, + 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, + 0x03, 0x68, 0x00, 0x30, 0x65, 0x02, 0x30, 0x36, 0x67, 0xa1, 0x16, + 0x08, 0xdc, 0xe4, 0x97, 0x00, 0x41, 0x1d, 0x4e, 0xbe, 0xe1, 0x63, + 0x01, 0xcf, 0x3b, 0xaa, 0x42, 0x11, 0x64, 0xa0, 0x9d, 0x94, 0x39, + 0x02, 0x11, 0x79, 0x5c, 0x7b, 0x1d, 0xfa, 0x64, 0xb9, 0xee, 0x16, + 0x42, 0xb3, 0xbf, 0x8a, 0xc2, 0x09, 0xc4, 0xec, 0xe4, 0xb1, 0x4d, + 0x02, 0x31, 0x00, 0xe9, 0x2a, 0x61, 0x47, 0x8c, 0x52, 0x4a, 0x4b, + 0x4e, 0x18, 0x70, 0xf6, 0xd6, 0x44, 0xd6, 0x6e, 0xf5, 0x83, 0xba, + 0x6d, 0x58, 0xbd, 0x24, 0xd9, 0x56, 0x48, 0xea, 0xef, 0xc4, 0xa2, + 0x46, 0x81, 0x88, 0x6a, 0x3a, 0x46, 0xd1, 0xa9, 0x9b, 0x4d, 0xc9, + 0x61, 0xda, 0xd1, 0x5d, 0x57, 0x6a, 0x18, 0x30, 0x82, 0x01, 0xe1, + 0x30, 0x82, 0x01, 0x87, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x11, + 0x2a, 0x38, 0xa4, 0x1c, 0x96, 0x0a, 0x04, 0xde, 0x42, 0xb2, 0x28, + 0xa5, 0x0b, 0xe8, 0x34, 0x98, 0x02, 0x30, 0x0a, 0x06, 0x08, 0x2a, + 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x30, 0x50, 0x31, 0x24, + 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1b, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x45, 0x43, + 0x43, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, + 0x20, 0x52, 0x34, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, + 0x67, 0x6e, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, + 0x6e, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32, 0x31, 0x31, 0x31, 0x33, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38, + 0x30, 0x31, 0x31, 0x39, 0x30, 0x33, 0x31, 0x34, 0x30, 0x37, 0x5a, + 0x30, 0x50, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0b, + 0x13, 0x1b, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, + 0x6e, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, + 0x43, 0x41, 0x20, 0x2d, 0x20, 0x52, 0x34, 0x31, 0x13, 0x30, 0x11, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x31, 0x13, 0x30, 0x11, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, + 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86, + 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00, 0x04, 0xb8, + 0xc6, 0x79, 0xd3, 0x8f, 0x6c, 0x25, 0x0e, 0x9f, 0x2e, 0x39, 0x19, + 0x1c, 0x03, 0xa4, 0xae, 0x9a, 0xe5, 0x39, 0x07, 0x09, 0x16, 0xca, + 0x63, 0xb1, 0xb9, 0x86, 0xf8, 0x8a, 0x57, 0xc1, 0x57, 0xce, 0x42, + 0xfa, 0x73, 0xa1, 0xf7, 0x65, 0x42, 0xff, 0x1e, 0xc1, 0x00, 0xb2, + 0x6e, 0x73, 0x0e, 0xff, 0xc7, 0x21, 0xe5, 0x18, 0xa4, 0xaa, 0xd9, + 0x71, 0x3f, 0xa8, 0xd4, 0xb9, 0xce, 0x8c, 0x1d, 0xa3, 0x42, 0x30, + 0x40, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, + 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, + 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, + 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, + 0x14, 0x54, 0xb0, 0x7b, 0xad, 0x45, 0xb8, 0xe2, 0x40, 0x7f, 0xfb, + 0x0a, 0x6e, 0xfb, 0xbe, 0x33, 0xc9, 0x3c, 0xa3, 0x84, 0xd5, 0x30, + 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, + 0x03, 0x48, 0x00, 0x30, 0x45, 0x02, 0x21, 0x00, 0xdc, 0x92, 0xa1, + 0xa0, 0x13, 0xa6, 0xcf, 0x03, 0xb0, 0xe6, 0xc4, 0x21, 0x97, 0x90, + 0xfa, 0x14, 0x57, 0x2d, 0x03, 0xec, 0xee, 0x3c, 0xd3, 0x6e, 0xca, + 0xa8, 0x6c, 0x76, 0xbc, 0xa2, 0xde, 0xbb, 0x02, 0x20, 0x27, 0xa8, + 0x85, 0x27, 0x35, 0x9b, 0x56, 0xc6, 0xa3, 0xf2, 0x47, 0xd2, 0xb7, + 0x6e, 0x1b, 0x02, 0x00, 0x17, 0xaa, 0x67, 0xa6, 0x15, 0x91, 0xde, + 0xfa, 0x94, 0xec, 0x7b, 0x0b, 0xf8, 0x9f, 0x84, 0x30, 0x82, 0x02, + 0x1e, 0x30, 0x82, 0x01, 0xa4, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, + 0x11, 0x60, 0x59, 0x49, 0xe0, 0x26, 0x2e, 0xbb, 0x55, 0xf9, 0x0a, + 0x77, 0x8a, 0x71, 0xf9, 0x4a, 0xd8, 0x6c, 0x30, 0x0a, 0x06, 0x08, + 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x30, 0x50, 0x31, + 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1b, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x45, + 0x43, 0x43, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, + 0x2d, 0x20, 0x52, 0x35, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, + 0x69, 0x67, 0x6e, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, + 0x67, 0x6e, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32, 0x31, 0x31, 0x31, + 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, + 0x38, 0x30, 0x31, 0x31, 0x39, 0x30, 0x33, 0x31, 0x34, 0x30, 0x37, + 0x5a, 0x30, 0x50, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, + 0x0b, 0x13, 0x1b, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, + 0x67, 0x6e, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6f, 0x6f, 0x74, + 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x52, 0x35, 0x31, 0x13, 0x30, + 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x31, 0x13, 0x30, 0x11, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x30, 0x76, 0x30, 0x10, 0x06, + 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, + 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x47, 0x45, 0x0e, + 0x96, 0xfb, 0x7d, 0x5d, 0xbf, 0xe9, 0x39, 0xd1, 0x21, 0xf8, 0x9f, + 0x0b, 0xb6, 0xd5, 0x7b, 0x1e, 0x92, 0x3a, 0x48, 0x59, 0x1c, 0xf0, + 0x62, 0x31, 0x2d, 0xc0, 0x7a, 0x28, 0xfe, 0x1a, 0xa7, 0x5c, 0xb3, + 0xb6, 0xcc, 0x97, 0xe7, 0x45, 0xd4, 0x58, 0xfa, 0xd1, 0x77, 0x6d, + 0x43, 0xa2, 0xc0, 0x87, 0x65, 0x34, 0x0a, 0x1f, 0x7a, 0xdd, 0xeb, + 0x3c, 0x33, 0xa1, 0xc5, 0x9d, 0x4d, 0xa4, 0x6f, 0x41, 0x95, 0x38, + 0x7f, 0xc9, 0x1e, 0x84, 0xeb, 0xd1, 0x9e, 0x49, 0x92, 0x87, 0x94, + 0x87, 0x0c, 0x3a, 0x85, 0x4a, 0x66, 0x9f, 0x9d, 0x59, 0x93, 0x4d, + 0x97, 0x61, 0x06, 0x86, 0x4a, 0xa3, 0x42, 0x30, 0x40, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, + 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, + 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, + 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x3d, 0xe6, + 0x29, 0x48, 0x9b, 0xea, 0x07, 0xca, 0x21, 0x44, 0x4a, 0x26, 0xde, + 0x6e, 0xde, 0xd2, 0x83, 0xd0, 0x9f, 0x59, 0x30, 0x0a, 0x06, 0x08, + 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03, 0x03, 0x68, 0x00, + 0x30, 0x65, 0x02, 0x31, 0x00, 0xe5, 0x69, 0x12, 0xc9, 0x6e, 0xdb, + 0xc6, 0x31, 0xba, 0x09, 0x41, 0xe1, 0x97, 0xf8, 0xfb, 0xfd, 0x9a, + 0xe2, 0x7d, 0x12, 0xc9, 0xed, 0x7c, 0x64, 0xd3, 0xcb, 0x05, 0x25, + 0x8b, 0x56, 0xd9, 0xa0, 0xe7, 0x5e, 0x5d, 0x4e, 0x0b, 0x83, 0x9c, + 0x5b, 0x76, 0x29, 0xa0, 0x09, 0x26, 0x21, 0x6a, 0x62, 0x02, 0x30, + 0x71, 0xd2, 0xb5, 0x8f, 0x5c, 0xea, 0x3b, 0xe1, 0x78, 0x09, 0x85, + 0xa8, 0x75, 0x92, 0x3b, 0xc8, 0x5c, 0xfd, 0x48, 0xef, 0x0d, 0x74, + 0x22, 0xa8, 0x08, 0xe2, 0x6e, 0xc5, 0x49, 0xce, 0xc7, 0x0c, 0xbc, + 0xa7, 0x61, 0x69, 0xf1, 0xf7, 0x3b, 0xe1, 0x2a, 0xcb, 0xf9, 0x2b, + 0xf3, 0x66, 0x90, 0x37, 0x30, 0x82, 0x04, 0xfc, 0x30, 0x82, 0x03, + 0xe4, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x16, 0x90, 0xc3, + 0x29, 0xb6, 0x78, 0x06, 0x07, 0x51, 0x1f, 0x05, 0xb0, 0x34, 0x48, + 0x46, 0xcb, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x6f, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x53, 0x45, 0x31, + 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x41, + 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x41, 0x42, 0x31, + 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1d, 0x41, + 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x54, 0x54, 0x50, 0x20, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x22, 0x30, 0x20, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x13, 0x19, 0x41, 0x64, 0x64, 0x54, 0x72, + 0x75, 0x73, 0x74, 0x20, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x20, 0x43, 0x41, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x1e, + 0x17, 0x0d, 0x31, 0x30, 0x30, 0x34, 0x31, 0x36, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x30, 0x30, 0x35, 0x33, + 0x30, 0x31, 0x30, 0x34, 0x38, 0x33, 0x38, 0x5a, 0x30, 0x81, 0x89, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x08, + 0x13, 0x12, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, + 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, + 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x53, 0x61, + 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, + 0x55, 0x04, 0x0a, 0x13, 0x11, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, + 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, + 0x31, 0x2f, 0x30, 0x2d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x26, + 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x48, 0x69, 0x67, 0x68, + 0x2d, 0x41, 0x73, 0x73, 0x75, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x20, + 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, + 0x02, 0x82, 0x01, 0x01, 0x00, 0xe7, 0x87, 0xda, 0xc0, 0x77, 0xe4, + 0xbb, 0x3a, 0xfa, 0x6a, 0x24, 0xc8, 0x80, 0x41, 0xac, 0xd2, 0x16, + 0x13, 0x15, 0x3d, 0xfa, 0xf7, 0xf8, 0x2a, 0x76, 0xdc, 0xa8, 0x2d, + 0x39, 0x08, 0xce, 0x48, 0x4a, 0xbe, 0x0f, 0x7d, 0xf0, 0xde, 0xba, + 0xbb, 0x47, 0xd5, 0xbd, 0x2d, 0xd7, 0x1b, 0xab, 0x0f, 0x20, 0x81, + 0x23, 0x08, 0x72, 0xb1, 0xc0, 0x11, 0x95, 0x0d, 0xe6, 0xea, 0xa9, + 0x87, 0xff, 0xc7, 0x6e, 0x1e, 0x4f, 0x66, 0x32, 0xba, 0x53, 0xbc, + 0x05, 0xaa, 0x1c, 0x2c, 0x0c, 0xef, 0x4d, 0x37, 0x47, 0x6b, 0x10, + 0x0c, 0xdb, 0xc5, 0xa0, 0x98, 0x7e, 0x58, 0xdb, 0x37, 0xd6, 0xae, + 0xe9, 0x06, 0xbd, 0xd7, 0xa8, 0x65, 0xf3, 0x37, 0xb9, 0xc7, 0x6d, + 0xce, 0x77, 0xc7, 0x26, 0xe0, 0xd7, 0x74, 0x1f, 0xa6, 0x98, 0x16, + 0xbb, 0x0c, 0x6b, 0xc8, 0xbe, 0x77, 0xd0, 0xef, 0x58, 0xa7, 0x29, + 0xa0, 0xb9, 0xb8, 0x69, 0x05, 0x36, 0xcb, 0xb2, 0xda, 0x58, 0xa3, + 0x0b, 0x75, 0xad, 0x3d, 0x8b, 0x22, 0x82, 0x20, 0x3e, 0x70, 0x86, + 0x99, 0x1c, 0xb9, 0x4f, 0xcf, 0x77, 0xa4, 0x07, 0x1a, 0x23, 0x63, + 0xd1, 0x38, 0x56, 0x84, 0xec, 0xbf, 0x8f, 0xc5, 0x4e, 0xf4, 0x18, + 0x96, 0x9b, 0x1a, 0xe8, 0x93, 0xec, 0x8d, 0xaf, 0x15, 0x9c, 0x24, + 0xf0, 0x5a, 0x3b, 0xe8, 0x0f, 0xb9, 0xa8, 0x5a, 0x01, 0xd3, 0xb2, + 0x1c, 0x60, 0xc9, 0x9c, 0x52, 0x04, 0xdd, 0x92, 0xa7, 0xfe, 0x0c, + 0xac, 0xe2, 0x45, 0x8d, 0x03, 0x61, 0xbc, 0x79, 0xe0, 0x77, 0x2e, + 0x87, 0x41, 0x3c, 0x58, 0x5f, 0xcb, 0xf5, 0xc5, 0x77, 0xf2, 0x58, + 0xc8, 0x4d, 0x28, 0xd0, 0x9a, 0xfa, 0xf3, 0x73, 0x09, 0x24, 0x68, + 0x74, 0xbc, 0x20, 0x4c, 0xd8, 0x2c, 0xb0, 0xaa, 0xe8, 0xd9, 0x4e, + 0x6d, 0xf2, 0x8c, 0x24, 0xd3, 0x93, 0x5d, 0x91, 0x02, 0x03, 0x01, + 0x00, 0x01, 0xa3, 0x82, 0x01, 0x77, 0x30, 0x82, 0x01, 0x73, 0x30, + 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, + 0x14, 0xad, 0xbd, 0x98, 0x7a, 0x34, 0xb4, 0x26, 0xf7, 0xfa, 0xc4, + 0x26, 0x54, 0xef, 0x03, 0xbd, 0xe0, 0x24, 0xcb, 0x54, 0x1a, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x3f, + 0xd5, 0xb5, 0xd0, 0xd6, 0x44, 0x79, 0x50, 0x4a, 0x17, 0xa3, 0x9b, + 0x8c, 0x4a, 0xdc, 0xb8, 0xb0, 0x22, 0x64, 0x6b, 0x30, 0x0e, 0x06, + 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, + 0x01, 0x06, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, + 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x00, + 0x30, 0x11, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x0a, 0x30, 0x08, + 0x30, 0x06, 0x06, 0x04, 0x55, 0x1d, 0x20, 0x00, 0x30, 0x44, 0x06, + 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x3d, 0x30, 0x3b, 0x30, 0x39, 0xa0, + 0x37, 0xa0, 0x35, 0x86, 0x33, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x72, + 0x75, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x64, 0x64, + 0x54, 0x72, 0x75, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x43, 0x41, 0x52, 0x6f, 0x6f, 0x74, 0x2e, 0x63, 0x72, + 0x6c, 0x30, 0x81, 0xb3, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, + 0x07, 0x01, 0x01, 0x04, 0x81, 0xa6, 0x30, 0x81, 0xa3, 0x30, 0x3f, + 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, + 0x33, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x74, + 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x41, + 0x52, 0x6f, 0x6f, 0x74, 0x2e, 0x70, 0x37, 0x63, 0x30, 0x39, 0x06, + 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x2d, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x74, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, + 0x55, 0x54, 0x4e, 0x53, 0x47, 0x43, 0x43, 0x41, 0x2e, 0x63, 0x72, + 0x74, 0x30, 0x25, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, + 0x30, 0x01, 0x86, 0x19, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x6f, 0x63, 0x73, 0x70, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x72, + 0x75, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x01, 0x00, 0x13, 0x85, 0x1f, 0x52, 0x80, 0x18, + 0xc9, 0x53, 0xf7, 0xfe, 0x2e, 0x1a, 0xaf, 0xcc, 0xd9, 0x0b, 0x3c, + 0xc2, 0xd3, 0x85, 0x81, 0x10, 0xf0, 0x28, 0x8d, 0xb9, 0x40, 0x7e, + 0x2c, 0x9e, 0x8f, 0xd6, 0x36, 0x86, 0x0a, 0x4c, 0x14, 0x2d, 0xd6, + 0x97, 0x43, 0x92, 0x41, 0x19, 0x37, 0x4b, 0x96, 0x9e, 0xeb, 0xa9, + 0x30, 0x79, 0x12, 0x95, 0xb3, 0x02, 0x36, 0x57, 0xed, 0x2b, 0xb9, + 0x1d, 0x98, 0x1a, 0xa3, 0x18, 0x0a, 0x3f, 0x9b, 0x39, 0x8b, 0xcd, + 0xa1, 0x49, 0x29, 0x4c, 0x2f, 0xf9, 0xd0, 0x95, 0x8c, 0xc8, 0x4d, + 0x95, 0xba, 0xa8, 0x43, 0xcf, 0x33, 0xaa, 0x25, 0x2a, 0x5a, 0x0e, + 0xaa, 0x27, 0xc9, 0x4e, 0x6b, 0xb1, 0xe6, 0x73, 0x1f, 0xb3, 0x74, + 0x04, 0xc3, 0xf3, 0x4c, 0xe2, 0xa8, 0xeb, 0x67, 0xb7, 0x5d, 0xb8, + 0x08, 0x05, 0x1a, 0x56, 0x9a, 0x54, 0x29, 0x85, 0xf5, 0x29, 0x4e, + 0x80, 0x3b, 0x95, 0xd0, 0x7b, 0x53, 0x96, 0x11, 0x56, 0xc1, 0x02, + 0xd3, 0xea, 0xb2, 0x7f, 0xca, 0x8f, 0x9c, 0x70, 0x4a, 0x14, 0x8d, + 0x5a, 0xb9, 0x16, 0x60, 0x75, 0xd6, 0xcd, 0x27, 0x1e, 0x16, 0xcd, + 0x5b, 0x33, 0x8e, 0x79, 0x40, 0xcf, 0x28, 0x48, 0xe7, 0xdc, 0x71, + 0x16, 0x4e, 0x74, 0x91, 0x75, 0xb9, 0x2a, 0x8c, 0xf1, 0x70, 0xac, + 0x26, 0xdd, 0x04, 0xb9, 0x40, 0xc2, 0x85, 0xde, 0x1c, 0x93, 0x40, + 0xd0, 0xcc, 0x6e, 0xc3, 0x9b, 0xaa, 0xef, 0x60, 0x65, 0xdf, 0x60, + 0x22, 0xf0, 0x5a, 0xa5, 0x7a, 0xa2, 0x2f, 0xe4, 0x70, 0x73, 0xee, + 0x3c, 0xd4, 0x26, 0x2b, 0x68, 0x07, 0xc1, 0x20, 0x7a, 0xe8, 0x98, + 0x5a, 0x3e, 0x7b, 0x9f, 0x02, 0x8b, 0x62, 0xc0, 0x85, 0x81, 0x80, + 0x60, 0x35, 0x7e, 0xa5, 0x1d, 0x0c, 0xd2, 0x9c, 0xdf, 0x62, 0x45, + 0x0d, 0xdb, 0xfc, 0x37, 0xfb, 0xf5, 0x25, 0x22 }; -static const int ca_bundle_data_len = 147324; +static const int ca_bundle_data_len = 172741; diff --git a/panda/src/express/filename_ext.cxx b/panda/src/express/filename_ext.cxx new file mode 100644 index 0000000000..70d5bfba2c --- /dev/null +++ b/panda/src/express/filename_ext.cxx @@ -0,0 +1,101 @@ +// Filename: filename_ext.cxx +// Created by: rdb (17Sep14) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + +#include "filename_ext.h" + +#ifdef HAVE_PYTHON +//////////////////////////////////////////////////////////////////// +// Function: Extension::__reduce__ +// Access: Published +// Description: This special Python method is implement to provide +// support for the pickle module. +//////////////////////////////////////////////////////////////////// +PyObject *Extension:: +__reduce__(PyObject *self) const { + // We should return at least a 2-tuple, (Class, (args)): the + // necessary class object whose constructor we should call + // (e.g. this), and the arguments necessary to reconstruct this + // object. + PyTypeObject *this_class = Py_TYPE(self); + if (this_class == NULL) { + return NULL; + } + + PyObject *result = Py_BuildValue("(O(s))", this_class, _this->c_str()); + return result; +} + +//////////////////////////////////////////////////////////////////// +// Function: Extension::__repr__ +// Access: Published +// Description: Returns a string representation of the filename that +// communicates both its type and value. +//////////////////////////////////////////////////////////////////// +PyObject *Extension:: +__repr__() const { +#if PY_MAJOR_VERSION >= 3 + // Python 3 case: return a unicode object. + wstring filename = _this->get_fullpath_w(); + PyObject *str = PyUnicode_FromWideChar(filename.data(), (Py_ssize_t)filename.size()); + +#if PY_VERSION_HEX >= 0x03040000 + PyObject *result = PyUnicode_FromFormat("Filename(%R)", str); +#else + static PyObject *format = PyUnicode_FromString("Filename(%r)"); + PyObject *result = PyUnicode_Format(format, str); +#endif + +#else + // Python 2 case: return a regular string. + string filename = _this->get_fullpath(); + PyObject *str = PyString_FromStringAndSize(filename.data(), (Py_ssize_t)filename.size()); + static PyObject *format = PyString_FromString("Filename(%r)"); + PyObject *result = PyString_Format(format, str); +#endif + + Py_DECREF(str); + return result; +} + +//////////////////////////////////////////////////////////////////// +// Function: Extension::scan_directory +// Access: Published +// Description: This variant on scan_directory returns a Python list +// of strings on success, or None on failure. +//////////////////////////////////////////////////////////////////// +PyObject *Extension:: +scan_directory() const { + vector_string contents; + if (!_this->scan_directory(contents)) { + Py_INCREF(Py_None); + return Py_None; + } + + PyObject *result = PyList_New(contents.size()); + for (size_t i = 0; i < contents.size(); ++i) { + const string &filename = contents[i]; +#if PY_MAJOR_VERSION >= 3 + // This function expects UTF-8. + PyObject *str = PyUnicode_FromStringAndSize(filename.data(), filename.size()); +#else + PyObject *str = PyString_FromStringAndSize(filename.data(), filename.size()); +#endif + PyList_SET_ITEM(result, i, str); + } + + return result; +} +#endif // HAVE_PYTHON + + diff --git a/panda/src/express/filename_ext.h b/panda/src/express/filename_ext.h new file mode 100644 index 0000000000..866f8f41a4 --- /dev/null +++ b/panda/src/express/filename_ext.h @@ -0,0 +1,42 @@ +// Filename: filename_ext.h +// Created by: rdb (17Sep14) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + +#ifndef FILENAME_EXT_H +#define FILENAME_EXT_H + +#include "dtoolbase.h" + +#ifdef HAVE_PYTHON + +#include "extension.h" +#include "filename.h" +#include "py_panda.h" + +//////////////////////////////////////////////////////////////////// +// Class : Extension +// Description : This class defines the extension methods for +// Filename, which are called instead of +// any C++ methods with the same prototype. +//////////////////////////////////////////////////////////////////// +template<> +class Extension : public ExtensionBase { +public: + PyObject *__reduce__(PyObject *self) const; + PyObject *__repr__() const; + PyObject *scan_directory() const; +}; + +#endif // HAVE_PYTHON + +#endif // FILENAME_EXT_H diff --git a/panda/src/express/globPattern_ext.cxx b/panda/src/express/globPattern_ext.cxx new file mode 100644 index 0000000000..41c4773bd1 --- /dev/null +++ b/panda/src/express/globPattern_ext.cxx @@ -0,0 +1,45 @@ +// Filename: globPattern_ext.cxx +// Created by: rdb (17Sep14) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + +#include "globPattern_ext.h" + +#ifdef HAVE_PYTHON + +//////////////////////////////////////////////////////////////////// +// Function: Extension::match_files +// Access: Published +// Description: This variant on match_files returns a Python list +// of strings. +//////////////////////////////////////////////////////////////////// +PyObject *Extension:: +match_files(const Filename &cwd) const { + vector_string contents; + _this->match_files(contents, cwd); + + PyObject *result = PyList_New(contents.size()); + for (size_t i = 0; i < contents.size(); ++i) { + const string &filename = contents[i]; +#if PY_MAJOR_VERSION >= 3 + // This function expects UTF-8. + PyObject *str = PyUnicode_FromStringAndSize(filename.data(), filename.size()); +#else + PyObject *str = PyString_FromStringAndSize(filename.data(), filename.size()); +#endif + PyList_SET_ITEM(result, i, str); + } + + return result; +} + +#endif // HAVE_PYTHON diff --git a/panda/src/express/globPattern_ext.h b/panda/src/express/globPattern_ext.h new file mode 100644 index 0000000000..fe9d7ca6ed --- /dev/null +++ b/panda/src/express/globPattern_ext.h @@ -0,0 +1,40 @@ +// Filename: globPattern_ext.h +// Created by: rdb (17Sep14) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + +#ifndef GLOBPATTERN_EXT_H +#define GLOBPATTERN_EXT_H + +#include "dtoolbase.h" + +#ifdef HAVE_PYTHON + +#include "extension.h" +#include "globPattern.h" +#include "py_panda.h" + +//////////////////////////////////////////////////////////////////// +// Class : Extension +// Description : This class defines the extension methods for +// GlobPattern, which are called instead of +// any C++ methods with the same prototype. +//////////////////////////////////////////////////////////////////// +template<> +class Extension : public ExtensionBase { +public: + PyObject *match_files(const Filename &cwd = Filename()) const; +}; + +#endif // HAVE_PYTHON + +#endif // GLOBPATTERN_EXT_H diff --git a/panda/src/express/multifile.h b/panda/src/express/multifile.h index b52fc6b825..d9842e07c6 100644 --- a/panda/src/express/multifile.h +++ b/panda/src/express/multifile.h @@ -84,27 +84,14 @@ PUBLISHED: int compression_level); #ifdef HAVE_OPENSSL - class EXPCL_PANDAEXPRESS CertRecord { - public: - CertRecord(X509 *cert); - CertRecord(const CertRecord ©); - ~CertRecord(); - void operator = (const CertRecord &other); - X509 *_cert; - }; - typedef pvector CertChain; - - bool add_signature(const Filename &certificate, + bool add_signature(const Filename &certificate, const Filename &chain, const Filename &pkey, const string &password = ""); - bool add_signature(const Filename &composite, + bool add_signature(const Filename &composite, const string &password = ""); - bool add_signature(X509 *certificate, STACK_OF(X509) *chain, EVP_PKEY *pkey); - bool add_signature(const CertChain &chain, EVP_PKEY *pkey); int get_num_signatures() const; - const CertChain &get_signature(int n) const; string get_signature_subject_name(int n) const; string get_signature_friendly_name(int n) const; string get_signature_public_key(int n) const; @@ -152,6 +139,23 @@ PUBLISHED: INLINE const string &get_header_prefix() const; public: +#ifdef HAVE_OPENSSL + class CertRecord { + public: + INLINE CertRecord(X509 *cert); + INLINE CertRecord(const CertRecord ©); + INLINE ~CertRecord(); + INLINE void operator = (const CertRecord &other); + X509 *_cert; + }; + typedef pvector CertChain; + + bool add_signature(X509 *certificate, STACK_OF(X509) *chain, EVP_PKEY *pkey); + bool add_signature(const CertChain &chain, EVP_PKEY *pkey); + + const CertChain &get_signature(int n) const; +#endif // HAVE_OPENSSL + bool read_subfile(int index, string &result); bool read_subfile(int index, pvector &result); diff --git a/panda/src/express/p3express_ext_composite.cxx b/panda/src/express/p3express_ext_composite.cxx index 88dd271158..7956bce4de 100644 --- a/panda/src/express/p3express_ext_composite.cxx +++ b/panda/src/express/p3express_ext_composite.cxx @@ -1,4 +1,7 @@ +#include "filename_ext.cxx" +#include "globPattern_ext.cxx" #include "memoryUsagePointers_ext.cxx" #include "ramfile_ext.cxx" #include "streamReader_ext.cxx" +#include "typeHandle_ext.cxx" #include "virtualFileSystem_ext.cxx" diff --git a/panda/src/express/pointerTo.I b/panda/src/express/pointerTo.I index caaccbcd42..bce23ad027 100644 --- a/panda/src/express/pointerTo.I +++ b/panda/src/express/pointerTo.I @@ -109,6 +109,22 @@ operator T * () const { return (To *)(this->_void_ptr); } +//////////////////////////////////////////////////////////////////// +// Function: PointerTo::cheat +// Access: Public +// Description: Returns a reference to the underlying pointer. This +// is a very unsafe method. It's only used by some +// interrogate code. If you think this method might be +// useful to you, you're probably wrong. +// +// Promise me you won't use this, okay? +//////////////////////////////////////////////////////////////////// +template +INLINE T *&PointerTo:: +cheat() { + return (To *&)(this->_void_ptr); +} + //////////////////////////////////////////////////////////////////// // Function: PointerTo::p // Access: Published @@ -274,13 +290,28 @@ operator -> () const { // don't care which way it goes because either will be // correct. //////////////////////////////////////////////////////////////////// - template INLINE ConstPointerTo:: operator const T * () const { return (To *)(this->_void_ptr); } +//////////////////////////////////////////////////////////////////// +// Function: ConstPointerTo::cheat +// Access: Public +// Description: Returns a reference to the underlying pointer. This +// is a very unsafe method. It's only used by some +// interrogate code. If you think this method might be +// useful to you, you're probably wrong. +// +// Promise me you won't use this, okay? +//////////////////////////////////////////////////////////////////// +template +INLINE const T *&ConstPointerTo:: +cheat() { + return (const To *&)(this->_void_ptr); +} + //////////////////////////////////////////////////////////////////// // Function: ConstPointerTo::p // Access: Published diff --git a/panda/src/express/pointerTo.h b/panda/src/express/pointerTo.h index 1597b94d41..e1775b6d8e 100644 --- a/panda/src/express/pointerTo.h +++ b/panda/src/express/pointerTo.h @@ -95,6 +95,8 @@ public: // MSVC.NET 2005 insists that we use T *, and not To *, here. INLINE operator T *() const; + INLINE T *&cheat(); + PUBLISHED: // When downcasting to a derived class from a PointerTo, // C++ would normally require you to cast twice: once to an actual @@ -160,6 +162,8 @@ public: INLINE const To *operator -> () const; INLINE operator const T *() const; + INLINE const T *&cheat(); + PUBLISHED: INLINE const To *p() const; diff --git a/panda/src/express/referenceCount.I b/panda/src/express/referenceCount.I index ff6d29ef1b..c71886f46d 100644 --- a/panda/src/express/referenceCount.I +++ b/panda/src/express/referenceCount.I @@ -89,7 +89,7 @@ operator = (const ReferenceCount &) { //////////////////////////////////////////////////////////////////// // Function: ReferenceCount::Destructor // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// ReferenceCount:: ~ReferenceCount() { @@ -182,7 +182,7 @@ ref() const { nassertv(test_ref_count_integrity()); #endif - AtomicAdjust::inc(((ReferenceCount *)this)->_ref_count); + AtomicAdjust::inc(_ref_count); } //////////////////////////////////////////////////////////////////// @@ -221,10 +221,9 @@ unref() const { // directly? Are you sure you can't use PointerTo's? nassertr(_ref_count > 0, 0); #endif - return AtomicAdjust::dec(((ReferenceCount *)this)->_ref_count); + return AtomicAdjust::dec(_ref_count); } - //////////////////////////////////////////////////////////////////// // Function: ReferenceCount::test_ref_count_integrity // Access: Published @@ -360,7 +359,7 @@ unref_delete(RefCountType *ptr) { if (!ptr->unref()) { // If the reference count has gone to zero, delete the object. delete ptr; - } + } } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/express/referenceCount.h b/panda/src/express/referenceCount.h index 16beb2b0b4..bb3526e2fa 100644 --- a/panda/src/express/referenceCount.h +++ b/panda/src/express/referenceCount.h @@ -71,7 +71,7 @@ private: void create_weak_list(); private: - enum { + enum { // We use this value as a flag to indicate an object has been // indicated as a local object, and should not be deleted except // by its own destructor. Really, any nonzero value would do, but @@ -87,7 +87,7 @@ private: deleted_ref_count = -100, }; - AtomicAdjust::Integer _ref_count; + mutable AtomicAdjust::Integer _ref_count; AtomicAdjust::Pointer _weak_list; // WeakReferenceList * public: diff --git a/panda/src/express/typeHandle_ext.cxx b/panda/src/express/typeHandle_ext.cxx new file mode 100644 index 0000000000..14ca0fa402 --- /dev/null +++ b/panda/src/express/typeHandle_ext.cxx @@ -0,0 +1,38 @@ +// Filename: typeHandle_ext.cxx +// Created by: rdb (17Sep14) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + +#include "typeHandle_ext.h" + +#ifdef HAVE_PYTHON + +//////////////////////////////////////////////////////////////////// +// Function: TypeHandle::make +// Access: Published, Static +// Description: Constructs a TypeHandle from a Python class object. +// Useful for automatic coercion, to allow a class +// object to be passed wherever a TypeHandle is +// expected. +//////////////////////////////////////////////////////////////////// +TypeHandle Extension:: +make(PyTypeObject *tp) { + if (!PyType_IsSubtype(tp, &Dtool_DTOOL_SUPER_BASE._PyType)) { + PyErr_SetString(PyExc_TypeError, "a Panda type is required"); + return TypeHandle::none(); + } + + Dtool_PyTypedObject *dtool_tp = (Dtool_PyTypedObject *) tp; + return dtool_tp->_type; +} + +#endif diff --git a/panda/src/express/typeHandle_ext.h b/panda/src/express/typeHandle_ext.h new file mode 100644 index 0000000000..edfae0efa0 --- /dev/null +++ b/panda/src/express/typeHandle_ext.h @@ -0,0 +1,40 @@ +// Filename: typeHandle_ext.h +// Created by: rdb (17Sep14) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + +#ifndef TYPEHANDLE_EXT_H +#define TYPEHANDLE_EXT_H + +#include "dtoolbase.h" + +#ifdef HAVE_PYTHON + +#include "extension.h" +#include "typeHandle.h" +#include "py_panda.h" + +//////////////////////////////////////////////////////////////////// +// Class : Extension +// Description : This class defines the extension methods for +// TypeHandle, which are called instead of +// any C++ methods with the same prototype. +//////////////////////////////////////////////////////////////////// +template<> +class Extension : public ExtensionBase { +public: + static TypeHandle make(PyTypeObject *tp); +}; + +#endif // HAVE_PYTHON + +#endif // TYPEHANDLE_EXT_H diff --git a/panda/src/express/zStreamBuf.cxx b/panda/src/express/zStreamBuf.cxx index 8a27ab5a0d..1ea01fe889 100644 --- a/panda/src/express/zStreamBuf.cxx +++ b/panda/src/express/zStreamBuf.cxx @@ -19,13 +19,13 @@ #include "pnotify.h" #include "config_express.h" -#if !defined(USE_MEMORY_NOWRAPPERS) +#if !defined(USE_MEMORY_NOWRAPPERS) && !defined(CPPPARSER) // Define functions that hook zlib into panda's memory allocation system. static void * do_zlib_alloc(voidpf opaque, uInt items, uInt size) { return PANDA_MALLOC_ARRAY(items * size); } -static void +static void do_zlib_free(voidpf opaque, voidpf address) { PANDA_FREE_ARRAY(address); } diff --git a/panda/src/framework/windowFramework.cxx b/panda/src/framework/windowFramework.cxx index becd06ee18..85d78be52b 100644 --- a/panda/src/framework/windowFramework.cxx +++ b/panda/src/framework/windowFramework.cxx @@ -79,8 +79,6 @@ WindowFramework:: WindowFramework(PandaFramework *panda_framework) : _panda_framework(panda_framework) { - _alight = (AmbientLight *)NULL; - _dlight = (DirectionalLight *)NULL; _got_keyboard = false; _got_trackball = false; _got_lights = false; @@ -107,8 +105,6 @@ WindowFramework(const WindowFramework ©, DisplayRegion *display_region) : _window(copy._window), _display_region_3d(display_region) { - _alight = (AmbientLight *)NULL; - _dlight = (DirectionalLight *)NULL; _got_keyboard = false; _got_trackball = false; _got_lights = false; @@ -206,8 +202,8 @@ close_window() { _render_2d.remove_node(); _mouse.remove_node(); - _alight = (AmbientLight *)NULL; - _dlight = (DirectionalLight *)NULL; + _alight.clear(); + _dlight.clear(); _got_keyboard = false; _got_trackball = false; _got_lights = false; diff --git a/panda/src/glstuff/glCgShaderContext_src.cxx b/panda/src/glstuff/glCgShaderContext_src.cxx index 0b05426529..4afda4b921 100755 --- a/panda/src/glstuff/glCgShaderContext_src.cxx +++ b/panda/src/glstuff/glCgShaderContext_src.cxx @@ -346,14 +346,7 @@ issue_parameters(int altered) { if (altered & (_shader->_mat_spec[i]._dep[0] | _shader->_mat_spec[i]._dep[1])) { const LMatrix4 *val = _glgsg->fetch_specified_value(_shader->_mat_spec[i], altered); if (!val) continue; -#ifndef STDFLOAT_DOUBLE - // In this case, the data is already single-precision. - const PN_float32 *data = val->get_data(); -#else - // In this case, we have to convert it. - LMatrix4f valf = LCAST(PN_float32, *val); - const PN_float32 *data = valf.get_data(); -#endif + const PN_stdfloat *data = val->get_data(); CGparameter p = _cg_parameter_map[_shader->_mat_spec[i]._id._seqno]; switch (_shader->_mat_spec[i]._piece) { @@ -372,13 +365,13 @@ issue_parameters(int altered) { case Shader::SMP_row3x3: GLfv(cgGLSetParameter3)(p, data+12); continue; case Shader::SMP_upper3x3: { - LMatrix3f upper3 = val->get_upper_3(); + LMatrix3 upper3 = val->get_upper_3(); GLfc(cgGLSetMatrixParameter)(p, upper3.get_data()); continue; } case Shader::SMP_transpose3x3: { - LMatrix3f upper3 = val->get_upper_3(); + LMatrix3 upper3 = val->get_upper_3(); GLfr(cgGLSetMatrixParameter)(p, upper3.get_data()); continue; } diff --git a/panda/src/glstuff/glGraphicsBuffer_src.cxx b/panda/src/glstuff/glGraphicsBuffer_src.cxx index 245fedb579..ced71cdddd 100644 --- a/panda/src/glstuff/glGraphicsBuffer_src.cxx +++ b/panda/src/glstuff/glGraphicsBuffer_src.cxx @@ -30,10 +30,10 @@ CLP(GraphicsBuffer)(GraphicsEngine *engine, GraphicsPipe *pipe, GraphicsBuffer(engine, pipe, name, fb_prop, win_prop, flags, gsg, host), _bind_texture_pcollector(_draw_window_pcollector, "Bind textures"), _generate_mipmap_pcollector(_draw_window_pcollector, "Generate mipmaps"), - _resolve_multisample_pcollector(_draw_window_pcollector, "Resolve multisamples") + _resolve_multisample_pcollector(_draw_window_pcollector, "Resolve multisamples"), + _requested_multisamples(0), + _requested_coverage_samples(0) { - CLP(GraphicsStateGuardian) *glgsg; - // A FBO doesn't have a back buffer. _draw_buffer_type = RenderBuffer::T_front; _screenshot_buffer_type = RenderBuffer::T_front; @@ -42,36 +42,6 @@ CLP(GraphicsBuffer)(GraphicsEngine *engine, GraphicsPipe *pipe, _fbo_multisample = 0; _initial_clear = true; _needs_rebuild = true; - DCAST_INTO_V(glgsg, _gsg); - - if (glgsg->get_supports_framebuffer_multisample() && glgsg->get_supports_framebuffer_blit()) { - _requested_multisamples = fb_prop.get_multisamples(); - } else { - _requested_multisamples = 0; - } - - if (glgsg->get_supports_framebuffer_multisample_coverage_nv() && glgsg->get_supports_framebuffer_blit()) { - _requested_coverage_samples = fb_prop.get_coverage_samples(); - // Note: Only 4 and 8 actual samples are supported by the extension, with 8 or 16 coverage samples. - if ((_requested_coverage_samples <= 8) && (_requested_coverage_samples > 0)) { - _requested_multisamples = 4; - _requested_coverage_samples = 8; - } else if (_requested_coverage_samples > 8) { - if (_requested_multisamples < 8) { - _requested_multisamples = 4; - } else { - _requested_multisamples = 8; - } - _requested_coverage_samples = 16; - } - - } else { - _requested_coverage_samples = 0; - } - - if (_requested_multisamples > glgsg->_max_fb_samples) { - _requested_multisamples = glgsg->_max_fb_samples; - } _rb_size_x = 0; _rb_size_y = 0; @@ -382,9 +352,9 @@ rebuild_bitplanes() { } } - // Decide whether we should use a depth stencil or just a regular depth attachment. - // If nothing was attached to either RTP_depth_stencil or RTP_depth, we use a - // depth-stencil renderbuffer. + // Decide whether we should use a depth stencil or just a regular depth + // attachment. If nothing was attached to either RTP_depth_stencil or + // RTP_depth, we use a depth-stencil renderbuffer. _use_depth_stencil = false; if (_gsg->get_supports_depth_stencil()) { if (attach[RTP_depth_stencil]) { @@ -396,19 +366,16 @@ rebuild_bitplanes() { // explicitly bound something to RTP_depth. _use_depth_stencil = false; - } else if (_fb_properties.get_float_depth()) { - // Let's not bother with a depth-stencil buffer - // if a float buffer was requested. - _use_depth_stencil = false; - - } else if (_fb_properties.get_depth_bits() > 24) { - // We can't give more than 24 depth bits with a depth-stencil buffer. - _use_depth_stencil = false; - } else if (_fb_properties.get_stencil_bits() > 0) { // The user requested stencil bits. Let's take the hint. _use_depth_stencil = true; + } else if (_fb_properties.get_depth_bits() > 24 || + _fb_properties.get_float_depth()) { + // 32-bit float depth is supported in conjunction with depth stencil, + // but it's a waste. Let's not do it unless the user requested stencil. + _use_depth_stencil = false; + } else if (_fb_properties.get_depth_bits() > 0) { // Let's use a depth stencil buffer by default, if a depth // buffer was requested. @@ -416,10 +383,9 @@ rebuild_bitplanes() { } } - // Knowing this, we can already be a tiny bit - // more accurate about the framebuffer properties. + // Knowing this, we can already be a tiny bit more accurate about the + // framebuffer properties. if (_use_depth_stencil) { - _fb_properties.set_depth_bits(24); _fb_properties.set_stencil_bits(8); } else { _fb_properties.set_stencil_bits(0); @@ -553,8 +519,7 @@ rebuild_bitplanes() { #endif // OPENGLES if (!_have_any_color) { - _fb_properties.set_color_bits(0); - _fb_properties.set_alpha_bits(0); + _fb_properties.set_rgba_bits(0, 0, 0, 0); } _initial_clear = false; @@ -699,8 +664,7 @@ bind_slot(int layer, bool rb_resize, Texture **attach, RenderTexturePlane slot, glGetTexLevelParameteriv(target, 0, GL_TEXTURE_BLUE_SIZE, &blue_size); glGetTexLevelParameteriv(target, 0, GL_TEXTURE_ALPHA_SIZE, &alpha_size); - _fb_properties.set_color_bits(red_size + green_size + blue_size); - _fb_properties.set_alpha_bits(alpha_size); + _fb_properties.set_rgba_bits(red_size, green_size, blue_size, alpha_size); } #endif } @@ -717,6 +681,7 @@ bind_slot(int layer, bool rb_resize, Texture **attach, RenderTexturePlane slot, // No texture to bind. Instead, create a renderbuffer. // Choose a suitable renderbuffer format based on the requirements. #ifdef OPENGLES + // OpenGL ES case. GLuint gl_format = GL_RGBA4; switch (slot) { case RTP_depth_stencil: @@ -731,6 +696,7 @@ bind_slot(int layer, bool rb_resize, Texture **attach, RenderTexturePlane slot, gl_format = GL_DEPTH_COMPONENT16; } break; + //NB: we currently use RTP_stencil to store the right eye for stereo. //case RTP_stencil: // gl_format = GL_STENCIL_INDEX8; // break @@ -762,7 +728,8 @@ bind_slot(int layer, bool rb_resize, Texture **attach, RenderTexturePlane slot, GLuint gl_format = GL_RGBA; switch (slot) { case RTP_depth_stencil: - if (_fb_properties.get_float_depth()) { + if (_fb_properties.get_depth_bits() > 24 || + _fb_properties.get_float_depth()) { gl_format = GL_DEPTH32F_STENCIL8; } else { gl_format = GL_DEPTH24_STENCIL8; @@ -775,7 +742,7 @@ bind_slot(int layer, bool rb_resize, Texture **attach, RenderTexturePlane slot, gl_format = GL_DEPTH_COMPONENT32; } else if (_fb_properties.get_depth_bits() > 16) { gl_format = GL_DEPTH_COMPONENT24; - } else if (_fb_properties.get_depth_bits() > 8) { + } else if (_fb_properties.get_depth_bits() > 1) { gl_format = GL_DEPTH_COMPONENT16; } else { gl_format = GL_DEPTH_COMPONENT; @@ -903,8 +870,7 @@ bind_slot(int layer, bool rb_resize, Texture **attach, RenderTexturePlane slot, glgsg->_glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_GREEN_SIZE_EXT, &green_size); glgsg->_glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_BLUE_SIZE_EXT, &blue_size); glgsg->_glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_ALPHA_SIZE_EXT, &alpha_size); - _fb_properties.set_color_bits(red_size + green_size + blue_size); - _fb_properties.set_alpha_bits(alpha_size); + _fb_properties.set_rgba_bits(red_size, green_size, blue_size, alpha_size); } glgsg->_glBindRenderbuffer(GL_RENDERBUFFER_EXT, 0); glgsg->_glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, attachpoint, @@ -976,7 +942,6 @@ bind_slot_multisample(bool rb_resize, Texture **attach, RenderTexturePlane slot, format = GL_DEPTH_COMPONENT32; break; default: - format = GL_DEPTH_COMPONENT; break; } } @@ -1269,14 +1234,12 @@ open_buffer() { // Describe the framebuffer properties of the FBO. // - // Unfortunately, we can't possibly predict which formats + // Unfortunately, we can't currently predict which formats // the implementation will allow us to use at this point, so // we'll just have to make some guesses and parrot the rest // of the properties back to the user. // When we actually attach the textures, we'll update the // properties more appropriately. - // This is probably safe, as we can usually bind just about - // any supported texture format to the FBO. // Rounding the depth bits is not spectacular, but at least we're // telling the user *something* about what we're going to get. @@ -1286,6 +1249,9 @@ open_buffer() { if (_fb_properties.get_color_bits() == 0 && _fb_properties.get_rgb_color()) { _fb_properties.set_color_bits(1); + _fb_properties.set_red_bits(1); + _fb_properties.set_green_bits(1); + _fb_properties.set_blue_bits(1); } // Actually, let's always get a colour buffer for now until we @@ -1294,18 +1260,28 @@ open_buffer() { _fb_properties.set_color_bits(1); } - if (_fb_properties.get_depth_bits() >= 32) { + if (_fb_properties.get_depth_bits() > 24) { _fb_properties.set_depth_bits(32); } else if (_fb_properties.get_depth_bits() > 16) { _fb_properties.set_depth_bits(24); - } else if (_fb_properties.get_depth_bits() > 8) { + } else { _fb_properties.set_depth_bits(16); } - // We're not going to get more than this, ever. + // We're not going to get more than this, ever. At least not until OpenGL + // introduces 64-bit texture formats. if (_fb_properties.get_color_bits() > 96) { _fb_properties.set_color_bits(96); } + if (_fb_properties.get_red_bits() > 32) { + _fb_properties.set_red_bits(32); + } + if (_fb_properties.get_green_bits() > 32) { + _fb_properties.set_green_bits(32); + } + if (_fb_properties.get_blue_bits() > 32) { + _fb_properties.set_blue_bits(32); + } if (_fb_properties.get_alpha_bits() > 32) { _fb_properties.set_alpha_bits(32); } @@ -1317,30 +1293,63 @@ open_buffer() { // We currently only support color formats this big as float. if (_fb_properties.get_color_bits() > 16 * 3) { - _fb_properties.set_color_bits(32 * 3); _fb_properties.set_float_color(true); - - if (_fb_properties.get_alpha_bits() > 0) { - _fb_properties.set_alpha_bits(32); - } } if (_fb_properties.get_srgb_color()) { - _fb_properties.set_color_bits(24); + // This is the only sRGB color format OpenGL supports. + _fb_properties.set_rgba_bits(8, 8, 8, + (_fb_properties.get_alpha_bits() > 0) ? 8 : 0); _fb_properties.set_float_color(false); - - if (_fb_properties.get_alpha_bits() > 0) { - _fb_properties.set_alpha_bits(32); - } } if (!_gsg->get_supports_depth_stencil()) { // At least we know we won't be getting stencil bits. _fb_properties.set_stencil_bits(0); + + } else if (_fb_properties.get_stencil_bits() > 0) { + // We don't currently support stencil-only targets. + _fb_properties.set_stencil_bits(8); + if (_fb_properties.get_depth_bits() < 24) { + _fb_properties.set_depth_bits(24); + } } + + // Accumulation buffers aren't supported for FBOs. _fb_properties.set_accum_bits(0); + if (glgsg->get_supports_framebuffer_multisample() && glgsg->get_supports_framebuffer_blit()) { + _requested_multisamples = _fb_properties.get_multisamples(); + } else { + _requested_multisamples = 0; + } + +#ifndef OPENGLES + if (glgsg->get_supports_framebuffer_multisample_coverage_nv() && glgsg->get_supports_framebuffer_blit()) { + _requested_coverage_samples = _fb_properties.get_coverage_samples(); + // Note: Only 4 and 8 actual samples are supported by the extension, with 8 or 16 coverage samples. + if ((_requested_coverage_samples <= 8) && (_requested_coverage_samples > 0)) { + _requested_multisamples = 4; + _requested_coverage_samples = 8; + } else if (_requested_coverage_samples > 8) { + if (_requested_multisamples < 8) { + _requested_multisamples = 4; + } else { + _requested_multisamples = 8; + } + _requested_coverage_samples = 16; + } + + } else { + _requested_coverage_samples = 0; + } +#endif + + if (_requested_multisamples > glgsg->_max_fb_samples) { + _requested_multisamples = glgsg->_max_fb_samples; + } _fb_properties.set_multisamples(_requested_multisamples); + _fb_properties.set_coverage_samples(_requested_coverage_samples); // Update aux settings to reflect the GL_MAX_DRAW_BUFFERS limit, // if we exceed it, that is. diff --git a/panda/src/glstuff/glShaderContext_src.cxx b/panda/src/glstuff/glShaderContext_src.cxx index 33b48f1298..eb67ce51d5 100755 --- a/panda/src/glstuff/glShaderContext_src.cxx +++ b/panda/src/glstuff/glShaderContext_src.cxx @@ -689,6 +689,26 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext case GL_FLOAT_MAT3: bind._dim[1] = 9; break; case GL_FLOAT_MAT4: bind._dim[1] = 16; break; } + switch (param_type) { + case GL_BOOL: + case GL_BOOL_VEC2: + case GL_BOOL_VEC3: + case GL_BOOL_VEC4: + case GL_INT: + case GL_INT_VEC2: + case GL_INT_VEC3: + case GL_INT_VEC4: + bind._type = Shader::SPT_int; + break; + case GL_FLOAT: + case GL_FLOAT_VEC2: + case GL_FLOAT_VEC3: + case GL_FLOAT_VEC4: + case GL_FLOAT_MAT3: + case GL_FLOAT_MAT4: + bind._type = Shader::SPT_float; + break; + } bind._arg = InternalName::make(param_name); bind._dim[0] = 1; bind._dep[0] = Shader::SSD_general | Shader::SSD_shaderinputs; @@ -767,6 +787,26 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext case GL_FLOAT_MAT3: bind._dim[1] = 9; break; case GL_FLOAT_MAT4: bind._dim[1] = 16; break; } + switch (param_type) { + case GL_BOOL: + case GL_BOOL_VEC2: + case GL_BOOL_VEC3: + case GL_BOOL_VEC4: + case GL_INT: + case GL_INT_VEC2: + case GL_INT_VEC3: + case GL_INT_VEC4: + bind._type = Shader::SPT_int; + break; + case GL_FLOAT: + case GL_FLOAT_VEC2: + case GL_FLOAT_VEC3: + case GL_FLOAT_VEC4: + case GL_FLOAT_MAT3: + case GL_FLOAT_MAT4: + bind._type = Shader::SPT_float; + break; + } bind._arg = InternalName::make(param_name); bind._dim[0] = param_size; bind._dep[0] = Shader::SSD_general | Shader::SSD_shaderinputs; @@ -1002,46 +1042,97 @@ issue_parameters(int altered) { } // Iterate through _ptr parameters - for (int i=0; i<(int)_shader->_ptr_spec.size(); i++) { - const Shader::ShaderPtrSpec& spec = _shader->_ptr_spec[i]; + for (int i = 0; i < (int)_shader->_ptr_spec.size(); ++i) { + Shader::ShaderPtrSpec &spec = _shader->_ptr_spec[i]; if (altered & (spec._dep[0] | spec._dep[1])) { - Shader::ShaderPtrData* ptr_data = - const_cast< Shader::ShaderPtrData*>(_glgsg->fetch_ptr_parameter(spec)); + const Shader::ShaderPtrData* ptr_data = _glgsg->fetch_ptr_parameter(spec); if (ptr_data == NULL) { //the input is not contained in ShaderPtrData release_resources(); return; } GLint p = _glsl_parameter_map[spec._id._seqno]; - switch (ptr_data->_type) { + switch (spec._type) { case Shader::SPT_float: - switch (spec._dim[1]) { + { + float *data = NULL; + + switch (ptr_data->_type) { + case Shader::SPT_int: + // Convert int data to float data. + data = (float*) alloca(sizeof(float) * spec._dim[0] * spec._dim[1]); + for (int i = 0; i < (spec._dim[0] * spec._dim[1]); ++i) { + data[i] = (int)(((float*)ptr_data->_ptr)[i]); + } + break; + + case Shader::SPT_double: + // Downgrade double data to float data. + data = (float*) alloca(sizeof(float) * spec._dim[0] * spec._dim[1]); + for (int i = 0; i < (spec._dim[0] * spec._dim[1]); ++i) { + data[i] = (float)(((double*)ptr_data->_ptr)[i]); + } + break; + + case Shader::SPT_float: + data = (float*)ptr_data->_ptr; + break; + + default: + nassertd(false) continue; + } + + switch (spec._dim[1]) { case 1: _glgsg->_glUniform1fv(p, spec._dim[0], (float*)ptr_data->_ptr); continue; case 2: _glgsg->_glUniform2fv(p, spec._dim[0], (float*)ptr_data->_ptr); continue; case 3: _glgsg->_glUniform3fv(p, spec._dim[0], (float*)ptr_data->_ptr); continue; case 4: _glgsg->_glUniform4fv(p, spec._dim[0], (float*)ptr_data->_ptr); continue; case 9: _glgsg->_glUniformMatrix3fv(p, spec._dim[0], GL_FALSE, (float*)ptr_data->_ptr); continue; case 16: _glgsg->_glUniformMatrix4fv(p, spec._dim[0], GL_FALSE, (float*)ptr_data->_ptr); continue; + } + nassertd(false) continue; } + break; + case Shader::SPT_int: - switch (spec._dim[1]) { + if (ptr_data->_type != Shader::SPT_int) { + GLCAT.error() + << "Cannot pass floating-point data to integer shader input '" << spec._id._name << "'\n"; + + // Deactivate it to make sure the user doesn't get flooded with this error. + spec._dep[0] = 0; + spec._dep[1] = 0; + + } else { + switch (spec._dim[1]) { case 1: _glgsg->_glUniform1iv(p, spec._dim[0], (int*)ptr_data->_ptr); continue; case 2: _glgsg->_glUniform2iv(p, spec._dim[0], (int*)ptr_data->_ptr); continue; case 3: _glgsg->_glUniform3iv(p, spec._dim[0], (int*)ptr_data->_ptr); continue; case 4: _glgsg->_glUniform4iv(p, spec._dim[0], (int*)ptr_data->_ptr); continue; + } + nassertd(false) continue; } + break; + case Shader::SPT_double: GLCAT.error() << "Passing double-precision shader inputs to GLSL shaders is not currently supported\n"; + + // Deactivate it to make sure the user doesn't get flooded with this error. + spec._dep[0] = 0; + spec._dep[1] = 0; + default: continue; } } } - for (int i=0; i<(int)_shader->_mat_spec.size(); i++) { - if (altered & (_shader->_mat_spec[i]._dep[0] | _shader->_mat_spec[i]._dep[1])) { - const LMatrix4 *val = _glgsg->fetch_specified_value(_shader->_mat_spec[i], altered); + for (int i = 0; i < (int)_shader->_mat_spec.size(); ++i) { + Shader::ShaderMatSpec &spec = _shader->_mat_spec[i]; + + if (altered & (spec._dep[0] | spec._dep[1])) { + const LMatrix4 *val = _glgsg->fetch_specified_value(spec, altered); if (!val) continue; #ifndef STDFLOAT_DOUBLE // In this case, the data is already single-precision. @@ -1052,8 +1143,8 @@ issue_parameters(int altered) { const PN_float32 *data = valf.get_data(); #endif - GLint p = _glsl_parameter_map[_shader->_mat_spec[i]._id._seqno]; - switch (_shader->_mat_spec[i]._piece) { + GLint p = _glsl_parameter_map[spec._id._seqno]; + switch (spec._piece) { case Shader::SMP_whole: _glgsg->_glUniformMatrix4fv(p, 1, GL_FALSE, data); continue; case Shader::SMP_transpose: _glgsg->_glUniformMatrix4fv(p, 1, GL_TRUE, data); continue; case Shader::SMP_col0: _glgsg->_glUniform4f(p, data[0], data[4], data[ 8], data[12]); continue; @@ -1069,13 +1160,21 @@ issue_parameters(int altered) { case Shader::SMP_row3x3: _glgsg->_glUniform3fv(p, 1, data+12); continue; case Shader::SMP_upper3x3: { +#ifndef STDFLOAT_DOUBLE LMatrix3f upper3 = val->get_upper_3(); +#else + LMatrix3f upper3 = valf.get_upper_3(); +#endif _glgsg->_glUniformMatrix3fv(p, 1, false, upper3.get_data()); continue; } case Shader::SMP_transpose3x3: { +#ifndef STDFLOAT_DOUBLE LMatrix3f upper3 = val->get_upper_3(); +#else + LMatrix3f upper3 = valf.get_upper_3(); +#endif _glgsg->_glUniformMatrix3fv(p, 1, true, upper3.get_data()); continue; } @@ -1392,8 +1491,9 @@ update_shader_texture_bindings(ShaderContext *prev) { nassertv(texattrib != (TextureAttrib *)NULL); for (int i = 0; i < (int)_shader->_tex_spec.size(); ++i) { - const InternalName *id = _shader->_tex_spec[i]._name; - int texunit = _shader->_tex_spec[i]._stage; + const Shader::ShaderTexSpec &spec = _shader->_tex_spec[i]; + const InternalName *id = spec._name; + int texunit = spec._stage; Texture *tex = NULL; int view = _glgsg->get_current_tex_view_offset(); @@ -1414,16 +1514,23 @@ update_shader_texture_bindings(ShaderContext *prev) { view += stage->get_tex_view_offset(); } - if (tex == NULL || tex->get_texture_type() != _shader->_tex_spec[i]._desired_type) { + if (tex == NULL) { continue; } + if (tex->get_texture_type() != spec._desired_type) { + GLCAT.error() + << "Sampler type of GLSL shader input '" << *id << "' does not " + "match type of texture " << *tex << ".\n"; + //TODO: also check whether shadow sampler textures have shadow filter enabled. + } + CLP(TextureContext) *gtc = DCAST(CLP(TextureContext), tex->prepare_now(view, _glgsg->_prepared_objects, _glgsg)); if (gtc == NULL) { continue; } - GLint p = _glsl_parameter_map[_shader->_tex_spec[i]._id._seqno]; + GLint p = _glsl_parameter_map[spec._id._seqno]; #ifndef OPENGLES // If it was recently written to, we will have to issue a memory barrier soon. diff --git a/panda/src/glstuff/glmisc_src.cxx b/panda/src/glstuff/glmisc_src.cxx index b4e1430ac1..23e9c700ad 100644 --- a/panda/src/glstuff/glmisc_src.cxx +++ b/panda/src/glstuff/glmisc_src.cxx @@ -14,6 +14,12 @@ #include "pandaSystem.h" +ConfigVariableBool gl_support_fbo + ("gl-support-fbo", true, + PRC_DESC("Configure this false if your GL's implementation of " + "EXT_framebuffer_object is broken. The system might still be " + "able to create buffers using pbuffers or the like.")); + ConfigVariableBool gl_cheap_textures ("gl-cheap-textures", false, PRC_DESC("Configure this true to glHint the textures into the cheapest " diff --git a/panda/src/glstuff/glmisc_src.h b/panda/src/glstuff/glmisc_src.h index 02f093a6c5..98e5bc8121 100644 --- a/panda/src/glstuff/glmisc_src.h +++ b/panda/src/glstuff/glmisc_src.h @@ -40,6 +40,7 @@ //#define GSG_VERBOSE 1 +extern EXPCL_PANDAGL ConfigVariableBool gl_support_fbo; extern ConfigVariableBool gl_cheap_textures; extern ConfigVariableBool gl_ignore_clamp; extern ConfigVariableBool gl_support_clamp_to_border; diff --git a/panda/src/glxdisplay/config_glxdisplay.cxx b/panda/src/glxdisplay/config_glxdisplay.cxx index 33028d2e9d..d3b7d97a5b 100644 --- a/panda/src/glxdisplay/config_glxdisplay.cxx +++ b/panda/src/glxdisplay/config_glxdisplay.cxx @@ -45,12 +45,6 @@ ConfigVariableBool glx_get_os_address "addresses of extension functions. This will be done only " "if glxGetProcAddress() cannot be used for some reason.")); -ConfigVariableBool gl_support_fbo -("gl-support-fbo", true, - PRC_DESC("Configure this false if your GL's implementation of " - "EXT_framebuffer_object is broken. The system might still be " - "able to create buffers using pbuffers or the like.")); - ConfigVariableBool glx_support_fbconfig ("glx-support-fbconfig", true, PRC_DESC("Set this true to enable the use of the advanced FBConfig " diff --git a/panda/src/glxdisplay/config_glxdisplay.h b/panda/src/glxdisplay/config_glxdisplay.h index 7f55210381..d14001d31d 100644 --- a/panda/src/glxdisplay/config_glxdisplay.h +++ b/panda/src/glxdisplay/config_glxdisplay.h @@ -28,7 +28,6 @@ extern EXPCL_PANDAGL void init_libglxdisplay(); extern ConfigVariableBool glx_get_proc_address; extern ConfigVariableBool glx_get_os_address; -extern ConfigVariableBool gl_support_fbo; extern ConfigVariableBool glx_support_fbconfig; extern ConfigVariableBool glx_support_pbuffer; extern ConfigVariableBool glx_support_pixmap; diff --git a/panda/src/glxdisplay/glxGraphicsPipe.cxx b/panda/src/glxdisplay/glxGraphicsPipe.cxx index a4ec5b5409..508ca1a445 100644 --- a/panda/src/glxdisplay/glxGraphicsPipe.cxx +++ b/panda/src/glxdisplay/glxGraphicsPipe.cxx @@ -136,35 +136,28 @@ make_output(const string &name, // Second thing to try: a GLGraphicsBuffer if (retry == 1) { - if ((host==0)|| - (!gl_support_fbo)|| - ((flags&BF_require_parasite)!=0)|| - ((flags&BF_require_window)!=0)) { + if (!gl_support_fbo || host == NULL || + (flags & (BF_require_parasite | BF_require_window)) != 0) { return NULL; } // Early failure - if we are sure that this buffer WONT // meet specs, we can bail out early. - int _fbo_multisample = 0; - if (!ConfigVariableBool("framebuffer-object-multisample", false, PRC_DESC("Enabled Multisample."))) { - _fbo_multisample = 16; - } - if ((flags & BF_fb_props_optional)==0) { - if ((fb_prop.get_indexed_color() > 0)|| - (fb_prop.get_back_buffers() > 0)|| - (fb_prop.get_accum_bits() > 0)|| - (fb_prop.get_multisamples() > _fbo_multisample)) { + if ((flags & BF_fb_props_optional) == 0) { + if (fb_prop.get_indexed_color() || + fb_prop.get_back_buffers() > 0 || + fb_prop.get_accum_bits() > 0) { return NULL; } } - // Early success - if we are sure that this buffer WILL - // meet specs, we can precertify it. - if ((posixgsg != 0) && - (posixgsg->is_valid()) && - (!posixgsg->needs_reset()) && - (posixgsg->_supports_framebuffer_object) && - (posixgsg->_glDrawBuffers != 0)&& - (fb_prop.is_basic())) { - precertify = true; + if (posixgsg != NULL && posixgsg->is_valid() && !posixgsg->needs_reset()) { + if (!posixgsg->_supports_framebuffer_object || + posixgsg->_glDrawBuffers == NULL) { + return NULL; + } else { + // Early success - if we are sure that this buffer WILL + // meet specs, we can precertify it. + precertify = true; + } } return new GLGraphicsBuffer(engine, this, name, fb_prop, win_prop, flags, gsg, host); diff --git a/panda/src/gobj/internalName.h b/panda/src/gobj/internalName.h index 079f7a29da..a8fde6729f 100644 --- a/panda/src/gobj/internalName.h +++ b/panda/src/gobj/internalName.h @@ -191,8 +191,8 @@ INLINE ostream &operator << (ostream &out, const InternalName &tcn); // by the compiler when passed to such a function. //////////////////////////////////////////////////////////////////// #ifdef CPPPARSER -// This construct confuses interrogate, so we give it a typedef. -typedef const InternalName *CPT_InternalName; +// The construct below confuses interrogate, so we give it a typedef. +typedef ConstPointerTo CPT_InternalName; #else class CPT_InternalName : public ConstPointerTo { public: diff --git a/panda/src/gobj/material.h b/panda/src/gobj/material.h index 7fe26b0e82..a34eac6a34 100644 --- a/panda/src/gobj/material.h +++ b/panda/src/gobj/material.h @@ -33,13 +33,13 @@ class FactoryParams; //////////////////////////////////////////////////////////////////// class EXPCL_PANDA_GOBJ Material : public TypedWritableReferenceCount, public Namable { PUBLISHED: - INLINE Material(const string &name = ""); + INLINE explicit Material(const string &name = ""); INLINE Material(const Material ©); void operator = (const Material ©); INLINE ~Material(); INLINE static Material *get_default(); - + INLINE bool has_ambient() const; INLINE const LColor &get_ambient() const; void set_ambient(const LColor &color); @@ -88,7 +88,7 @@ private: PN_stdfloat _shininess; static PT(Material) _default; - + enum Flags { F_ambient = 0x001, F_diffuse = 0x002, diff --git a/panda/src/gobj/texture.cxx b/panda/src/gobj/texture.cxx index 08474cc445..eedf79cc1e 100644 --- a/panda/src/gobj/texture.cxx +++ b/panda/src/gobj/texture.cxx @@ -1893,7 +1893,8 @@ consider_rescale(PNMImage &pnmimage, const string &name, AutoTextureScale auto_t if (pnmimage.is_valid()) { // The image is already loaded. Rescale on the spot. PNMImage new_image(new_x_size, new_y_size, pnmimage.get_num_channels(), - pnmimage.get_maxval()); + pnmimage.get_maxval(), pnmimage.get_type(), + pnmimage.get_color_space()); new_image.quick_filter_from(pnmimage); pnmimage.take_from(new_image); } else { @@ -2928,7 +2929,8 @@ do_read_one(CData *cdata, const Filename &fullpath, const Filename &alpha_fullpa pfm.clear(x_size, y_size, image.get_num_channels()); } else { image = PNMImage(x_size, y_size, image.get_num_channels(), - image.get_maxval(), image.get_type()); + image.get_maxval(), image.get_type(), + image.get_color_space()); image.fill(0.2, 0.3, 1.0); if (image.has_alpha()) { image.alpha_fill(1.0); @@ -2988,7 +2990,8 @@ do_read_one(CData *cdata, const Filename &fullpath, const Filename &alpha_fullpa int x_size = image.get_x_size(); int y_size = image.get_y_size(); alpha_image = PNMImage(x_size, y_size, alpha_image.get_num_channels(), - alpha_image.get_maxval(), alpha_image.get_type()); + alpha_image.get_maxval(), alpha_image.get_type(), + alpha_image.get_color_space()); alpha_image.fill(1.0); if (alpha_image.has_alpha()) { alpha_image.alpha_fill(1.0); @@ -3047,7 +3050,8 @@ do_read_one(CData *cdata, const Filename &fullpath, const Filename &alpha_fullpa PNMImage scaled(image.get_x_size(), image.get_y_size(), alpha_image.get_num_channels(), - alpha_image.get_maxval(), alpha_image.get_type()); + alpha_image.get_maxval(), alpha_image.get_type(), + alpha_image.get_color_space()); scaled.quick_filter_from(alpha_image); Thread::consider_yield(); alpha_image = scaled; @@ -3063,21 +3067,14 @@ do_read_one(CData *cdata, const Filename &fullpath, const Filename &alpha_fullpa if (!alpha_fullpath.empty()) { // Make the original image a 4-component image by taking the // grayscale value from the second image. - image.add_alpha(); if (alpha_file_channel == 4 || (alpha_file_channel == 2 && alpha_image.get_num_channels() == 2)) { - - if (!alpha_image.has_alpha()) { - gobj_cat.error() - << alpha_fullpath.get_basename() << " has no channel " << alpha_file_channel << ".\n"; - } else { - // Use the alpha channel. - for (int x = 0; x < image.get_x_size(); x++) { - for (int y = 0; y < image.get_y_size(); y++) { - image.set_alpha(x, y, alpha_image.get_alpha(x, y)); - } + // Use the alpha channel. + for (int x = 0; x < image.get_x_size(); x++) { + for (int y = 0; y < image.get_y_size(); y++) { + image.set_alpha(x, y, alpha_image.get_alpha(x, y)); } } cdata->_alpha_file_channel = alpha_image.get_num_channels(); @@ -3119,7 +3116,8 @@ do_read_one(CData *cdata, const Filename &fullpath, const Filename &alpha_fullpa pad_x_size = new_x_size - image.get_x_size(); pad_y_size = new_y_size - image.get_y_size(); PNMImage new_image(new_x_size, new_y_size, image.get_num_channels(), - image.get_maxval()); + image.get_maxval(), image.get_type(), + image.get_color_space()); new_image.copy_sub_image(image, 0, new_y_size - image.get_y_size()); image.take_from(new_image); } @@ -3189,7 +3187,8 @@ do_load_one(CData *cdata, const PNMImage &pnmimage, const string &name, int z, i << y_size << "\n"; PNMImage scaled(x_size, y_size, pnmimage.get_num_channels(), - pnmimage.get_maxval(), pnmimage.get_type()); + pnmimage.get_maxval(), pnmimage.get_type(), + pnmimage.get_color_space()); scaled.quick_filter_from(pnmimage); Thread::consider_yield(); @@ -3580,7 +3579,6 @@ do_read_dds(CData *cdata, istream &in, const string &filename, bool header_only) format = F_luminance; } } - } do_setup_texture(cdata, texture_type, header.width, header.height, header.depth, @@ -4397,7 +4395,7 @@ do_get_clear_data(const CData *cdata, unsigned char *into) const { switch (cdata->_component_type) { case T_unsigned_byte: { - LColorf scaled = cdata->_clear_color.fmin(LColorf(1)).fmax(LColorf::zero()); + LColor scaled = cdata->_clear_color.fmin(LColor(1)).fmax(LColor::zero()); scaled *= 255; switch (cdata->_num_components) { case 2: @@ -4418,7 +4416,7 @@ do_get_clear_data(const CData *cdata, unsigned char *into) const { case T_unsigned_short: { - LColorf scaled = cdata->_clear_color.fmin(LColorf(1)).fmax(LColorf::zero()); + LColor scaled = cdata->_clear_color.fmin(LColor(1)).fmax(LColor::zero()); scaled *= 65535; switch (cdata->_num_components) { case 2: @@ -4912,7 +4910,8 @@ do_rescale_texture(CData *cdata) { << "Resizing " << get_name() << " to " << new_x_size << " x " << new_y_size << "\n"; PNMImage new_image(new_x_size, new_y_size, orig_image.get_num_channels(), - orig_image.get_maxval()); + orig_image.get_maxval(), orig_image.get_type(), + orig_image.get_color_space()); new_image.quick_filter_from(orig_image); do_clear_ram_image(cdata); @@ -4943,7 +4942,8 @@ do_rescale_texture(CData *cdata) { return false; } PNMImage new_image(new_x_size, new_y_size, orig_image.get_num_channels(), - orig_image.get_maxval()); + orig_image.get_maxval(), orig_image.get_type(), + orig_image.get_color_space()); new_image.copy_sub_image(orig_image, 0, new_y_size - orig_image.get_y_size()); do_clear_ram_image(cdata); @@ -5021,8 +5021,9 @@ do_clear(CData *cdata) { // Description: //////////////////////////////////////////////////////////////////// void Texture:: -do_setup_texture(CData *cdata, Texture::TextureType texture_type, int x_size, int y_size, - int z_size, Texture::ComponentType component_type, +do_setup_texture(CData *cdata, Texture::TextureType texture_type, + int x_size, int y_size, int z_size, + Texture::ComponentType component_type, Texture::Format format) { switch (texture_type) { case TT_1d_texture: diff --git a/panda/src/gobj/texture.h b/panda/src/gobj/texture.h index 66e52ed7da..1320935860 100644 --- a/panda/src/gobj/texture.h +++ b/panda/src/gobj/texture.h @@ -40,6 +40,8 @@ #include "cycleDataStageWriter.h" #include "pipelineCycler.h" #include "samplerState.h" +#include "pnmImage.h" +#include "colorSpace.h" class PNMImage; class PfmFile; @@ -208,10 +210,12 @@ PUBLISHED: }; PUBLISHED: - Texture(const string &name = string()); + explicit Texture(const string &name = string()); + protected: Texture(const Texture ©); void operator = (const Texture ©); + PUBLISHED: virtual ~Texture(); diff --git a/panda/src/grutil/geoMipTerrain.cxx b/panda/src/grutil/geoMipTerrain.cxx index 964d13e295..f5ff072fca 100644 --- a/panda/src/grutil/geoMipTerrain.cxx +++ b/panda/src/grutil/geoMipTerrain.cxx @@ -113,11 +113,11 @@ generate_block(unsigned short mx, for (int y = 0; y <= _block_size; y++) { if ((x % level) == 0 && (y % level) == 0) { if (_has_color_map) { - LVecBase4d color = _color_map.get_xel_a(int((mx * _block_size + x) + LVecBase4f color = _color_map.get_xel_a(int((mx * _block_size + x) / double(_xsize) * _color_map.get_x_size()), int((my * _block_size + y) / double(_ysize) * _color_map.get_y_size())); - cwriter.add_data4(LCAST(PN_stdfloat, color)); + cwriter.add_data4f(color); } vwriter.add_data3(x - 0.5 * _block_size, y - 0.5 * _block_size, get_pixel_value(mx, my, x, y)); twriter.add_data2((mx * _block_size + x) / double(_xsize - 1), diff --git a/panda/src/grutil/meshDrawer.cxx b/panda/src/grutil/meshDrawer.cxx index e270a43786..631a6a8e79 100644 --- a/panda/src/grutil/meshDrawer.cxx +++ b/panda/src/grutil/meshDrawer.cxx @@ -369,8 +369,9 @@ void MeshDrawer::stream(const LVector3 &start, const LVector3 &stop, const LVect LVector3 relative_pos = stop; LVector3 vec = stop - start; PN_stdfloat distance = vec.length(); + vec.normalize(); for(int i = 0; i < number; i++) { - relative_pos = stop + vec * ((i-offset)*(distance/PN_stdfloat(number))); + relative_pos = start + vec * ((i+offset)*(distance/PN_stdfloat(number))); billboard(relative_pos,frame,size,_color); } } diff --git a/panda/src/grutil/pfmVizzer.cxx b/panda/src/grutil/pfmVizzer.cxx index 475d9d8fb5..1304d59bea 100644 --- a/panda/src/grutil/pfmVizzer.cxx +++ b/panda/src/grutil/pfmVizzer.cxx @@ -57,11 +57,11 @@ void PfmVizzer:: project(const Lens *lens, const PfmFile *undist_lut) { nassertv(_pfm.is_valid()); - static LMatrix4f to_uv(0.5f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.5f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.5f, 0.0f, - 0.5f, 0.5f, 0.5f, 1.0f); - + static LMatrix4 to_uv(0.5f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.5f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.5f, 0.0f, + 0.5f, 0.5f, 0.5f, 1.0f); + for (int yi = 0; yi < _pfm.get_y_size(); ++yi) { for (int xi = 0; xi < _pfm.get_x_size(); ++xi) { if (!_pfm.has_point(xi, yi)) { @@ -79,8 +79,8 @@ project(const Lens *lens, const PfmFile *undist_lut) { } else { // Now the lens gives us coordinates in the range [-1, 1]. // Rescale these to [0, 1]. - LPoint3f uvw = film * to_uv; - + LPoint3f uvw = LCAST(float, film * to_uv); + if (undist_lut != NULL) { // Apply the undistortion map, if given. LPoint3f p2; @@ -88,7 +88,7 @@ project(const Lens *lens, const PfmFile *undist_lut) { uvw = p2; uvw[1] = 1.0 - uvw[1]; } - + p = uvw; } } diff --git a/panda/src/linmath/aa_luse.h b/panda/src/linmath/aa_luse.h index 68f77d9636..4c809fba0e 100644 --- a/panda/src/linmath/aa_luse.h +++ b/panda/src/linmath/aa_luse.h @@ -45,6 +45,7 @@ #define LCAST(numeric_type, object) lcast_to((numeric_type *)0, object) +BEGIN_PUBLISH // Now we define some handy typedefs for these classes. typedef LPoint3f LVertexf; @@ -185,4 +186,6 @@ typedef LQuaterniond Quat; #endif // STDFLOAT_DOUBLE +END_PUBLISH + #endif diff --git a/panda/src/linmath/compose_matrix_src.h b/panda/src/linmath/compose_matrix_src.h index 5c77c9aa74..807c13956e 100644 --- a/panda/src/linmath/compose_matrix_src.h +++ b/panda/src/linmath/compose_matrix_src.h @@ -30,7 +30,7 @@ compose_matrix(FLOATNAME(LMatrix4) &mat, CoordinateSystem cs = CS_default); INLINE_LINMATH void -compose_matrix(FLOATNAME(LMatrix4) &mat, +compose_matrix(FLOATNAME(LMatrix4) &mat, const FLOATTYPE components[num_matrix_components], CoordinateSystem cs = CS_default); @@ -50,7 +50,8 @@ decompose_matrix(const FLOATNAME(LMatrix4) &mat, CoordinateSystem cs = CS_default); INLINE_LINMATH bool -decompose_matrix(const FLOATNAME(LMatrix4) &mat, FLOATTYPE components[num_matrix_components], +decompose_matrix(const FLOATNAME(LMatrix4) &mat, + FLOATTYPE components[num_matrix_components], CoordinateSystem CS = CS_default); @@ -106,7 +107,8 @@ compose_matrix_old_hpr(FLOATNAME(LMatrix4) &mat, CoordinateSystem cs = CS_default); INLINE_LINMATH void -compose_matrix_old_hpr(FLOATNAME(LMatrix4) &mat, const FLOATTYPE components[num_matrix_components], +compose_matrix_old_hpr(FLOATNAME(LMatrix4) &mat, + const FLOATTYPE components[num_matrix_components], CoordinateSystem cs = CS_default); EXPCL_PANDA_LINMATH bool @@ -125,7 +127,8 @@ decompose_matrix_old_hpr(const FLOATNAME(LMatrix4) &mat, CoordinateSystem cs = CS_default); INLINE_LINMATH bool -decompose_matrix_old_hpr(const FLOATNAME(LMatrix4) &mat, FLOATTYPE components[num_matrix_components], +decompose_matrix_old_hpr(const FLOATNAME(LMatrix4) &mat, + FLOATTYPE components[num_matrix_components], CoordinateSystem CS = CS_default); @@ -145,7 +148,8 @@ compose_matrix_new_hpr(FLOATNAME(LMatrix4) &mat, CoordinateSystem cs = CS_default); INLINE_LINMATH void -compose_matrix_new_hpr(FLOATNAME(LMatrix4) &mat, const FLOATTYPE components[num_matrix_components], +compose_matrix_new_hpr(FLOATNAME(LMatrix4) &mat, + const FLOATTYPE components[num_matrix_components], CoordinateSystem cs = CS_default); EXPCL_PANDA_LINMATH bool @@ -164,7 +168,8 @@ decompose_matrix_new_hpr(const FLOATNAME(LMatrix4) &mat, CoordinateSystem cs = CS_default); INLINE_LINMATH bool -decompose_matrix_new_hpr(const FLOATNAME(LMatrix4) &mat, FLOATTYPE components[num_matrix_components], +decompose_matrix_new_hpr(const FLOATNAME(LMatrix4) &mat, + FLOATTYPE components[num_matrix_components], CoordinateSystem CS = CS_default); diff --git a/panda/src/linmath/lmatrix3_ext_src.I b/panda/src/linmath/lmatrix3_ext_src.I index ec359f6c40..f6aa52a247 100644 --- a/panda/src/linmath/lmatrix3_ext_src.I +++ b/panda/src/linmath/lmatrix3_ext_src.I @@ -13,17 +13,6 @@ //////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////// -// Function: LMatrix3::Row::__setitem__ -// Access: Public -// Description: -//////////////////////////////////////////////////////////////////// -INLINE_LINMATH void Extension:: -__setitem__(int i, FLOATTYPE v) { - nassertv(i >= 0 && i < 3); - _this->_row[i] = v; -} - //////////////////////////////////////////////////////////////////// // Function: LMatrix3::__reduce__ // Access: Published @@ -41,7 +30,7 @@ __reduce__(PyObject *self) const { return NULL; } - PyObject *result = Py_BuildValue("(O(fffffffff))", this_class, + PyObject *result = Py_BuildValue("(O(fffffffff))", this_class, _this->_m(0, 0), _this->_m(0, 1), _this->_m(0, 2), _this->_m(1, 0), _this->_m(1, 1), _this->_m(1, 2), _this->_m(2, 0), _this->_m(2, 1), _this->_m(2, 2)); @@ -51,13 +40,14 @@ __reduce__(PyObject *self) const { } //////////////////////////////////////////////////////////////////// -// Function: LMatrix3::python_repr +// Function: LMatrix3::__repr__ // Access: Published // Description: //////////////////////////////////////////////////////////////////// -INLINE_LINMATH void Extension:: -python_repr(ostream &out, const string &class_name) const { - out << class_name << "(" +INLINE_LINMATH string Extension:: +__repr__() const { + ostringstream out; + out << "LMatrix3" << FLOATTOKEN << "(" << MAYBE_ZERO(_this->_m(0, 0)) << ", " << MAYBE_ZERO(_this->_m(0, 1)) << ", " << MAYBE_ZERO(_this->_m(0, 2)) << ", " @@ -69,5 +59,5 @@ python_repr(ostream &out, const string &class_name) const { << MAYBE_ZERO(_this->_m(2, 0)) << ", " << MAYBE_ZERO(_this->_m(2, 1)) << ", " << MAYBE_ZERO(_this->_m(2, 2)) << ")"; + return out.str(); } - diff --git a/panda/src/linmath/lmatrix3_ext_src.h b/panda/src/linmath/lmatrix3_ext_src.h index ca05d20322..99583af4bb 100644 --- a/panda/src/linmath/lmatrix3_ext_src.h +++ b/panda/src/linmath/lmatrix3_ext_src.h @@ -13,18 +13,6 @@ //////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////// -// Class : Extension -// Description : This class defines the extension methods for -// LMatrix3::Row, which are called instead of -// any C++ methods with the same prototype. -//////////////////////////////////////////////////////////////////// -template<> -class Extension : public ExtensionBase { -public: - INLINE_LINMATH void __setitem__(int i, FLOATTYPE v); -}; - //////////////////////////////////////////////////////////////////// // Class : Extension // Description : This class defines the extension methods for @@ -35,7 +23,7 @@ template<> class Extension : public ExtensionBase { public: INLINE_LINMATH PyObject *__reduce__(PyObject *self) const; - INLINE_LINMATH void python_repr(ostream &out, const string &class_name) const; + INLINE_LINMATH string __repr__() const; }; #include "lmatrix3_ext_src.I" diff --git a/panda/src/linmath/lmatrix3_src.I b/panda/src/linmath/lmatrix3_src.I index 402dbbaba4..1fd8c74fa9 100644 --- a/panda/src/linmath/lmatrix3_src.I +++ b/panda/src/linmath/lmatrix3_src.I @@ -459,7 +459,7 @@ begin() { //////////////////////////////////////////////////////////////////// INLINE_LINMATH FLOATNAME(LMatrix3)::iterator FLOATNAME(LMatrix3):: end() { - return begin() + get_num_components(); + return begin() + num_components; } //////////////////////////////////////////////////////////////////// @@ -481,7 +481,7 @@ begin() const { //////////////////////////////////////////////////////////////////// INLINE_LINMATH FLOATNAME(LMatrix3)::const_iterator FLOATNAME(LMatrix3):: end() const { - return begin() + get_num_components(); + return begin() + num_components; } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/linmath/lmatrix3_src.h b/panda/src/linmath/lmatrix3_src.h index c132a58e1e..8bcae35c6c 100644 --- a/panda/src/linmath/lmatrix3_src.h +++ b/panda/src/linmath/lmatrix3_src.h @@ -24,10 +24,16 @@ class FLOATNAME(LMatrix4); //////////////////////////////////////////////////////////////////// class EXPCL_PANDA_LINMATH FLOATNAME(LMatrix3) { public: + typedef FLOATTYPE numeric_type; typedef const FLOATTYPE *iterator; typedef const FLOATTYPE *const_iterator; PUBLISHED: + enum { + num_components = 9, + is_int = 0 + }; + // These helper classes are used to support two-level operator []. class Row { private: @@ -35,7 +41,6 @@ PUBLISHED: PUBLISHED: INLINE_LINMATH FLOATTYPE operator [](int i) const; INLINE_LINMATH FLOATTYPE &operator [](int i); - EXTENSION(INLINE_LINMATH void __setitem__(int i, FLOATTYPE v)); INLINE_LINMATH static int size(); public: FLOATTYPE *_row; @@ -286,7 +291,7 @@ PUBLISHED: void output(ostream &out) const; void write(ostream &out, int indent_level = 0) const; - EXTENSION(INLINE_LINMATH void python_repr(ostream &out, const string &class_name) const); + EXTENSION(INLINE_LINMATH string __repr__() const); INLINE_LINMATH void generate_hash(ChecksumHashGenerator &hashgen) const; void generate_hash( diff --git a/panda/src/linmath/lmatrix4_ext_src.I b/panda/src/linmath/lmatrix4_ext_src.I index 91a8122426..4cc50e89a8 100644 --- a/panda/src/linmath/lmatrix4_ext_src.I +++ b/panda/src/linmath/lmatrix4_ext_src.I @@ -13,17 +13,6 @@ //////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////// -// Function: LMatrix4::Row::__setitem__ -// Access: Public -// Description: -//////////////////////////////////////////////////////////////////// -INLINE_LINMATH void Extension:: -__setitem__(int i, FLOATTYPE v) { - nassertv(i >= 0 && i < 4); - _this->_row[i] = v; -} - //////////////////////////////////////////////////////////////////// // Function: LMatrix4::__reduce__ // Access: Published @@ -52,13 +41,14 @@ __reduce__(PyObject *self) const { } //////////////////////////////////////////////////////////////////// -// Function: LMatrix4::python_repr +// Function: LMatrix4::__repr__ // Access: Published // Description: //////////////////////////////////////////////////////////////////// -INLINE_LINMATH void Extension:: -python_repr(ostream &out, const string &class_name) const { - out << class_name << "(" +INLINE_LINMATH string Extension:: +__repr__() const { + ostringstream out; + out << "LMatrix4" << FLOATTOKEN << "(" << MAYBE_ZERO(_this->_m(0, 0)) << ", " << MAYBE_ZERO(_this->_m(0, 1)) << ", " << MAYBE_ZERO(_this->_m(0, 2)) << ", " @@ -78,5 +68,5 @@ python_repr(ostream &out, const string &class_name) const { << MAYBE_ZERO(_this->_m(3, 1)) << ", " << MAYBE_ZERO(_this->_m(3, 2)) << ", " << MAYBE_ZERO(_this->_m(3, 3)) << ")"; + return out.str(); } - diff --git a/panda/src/linmath/lmatrix4_ext_src.h b/panda/src/linmath/lmatrix4_ext_src.h index fc03cc29dc..268d9b615e 100644 --- a/panda/src/linmath/lmatrix4_ext_src.h +++ b/panda/src/linmath/lmatrix4_ext_src.h @@ -13,18 +13,6 @@ //////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////// -// Class : Extension -// Description : This class defines the extension methods for -// LMatrix4::Row, which are called instead of -// any C++ methods with the same prototype. -//////////////////////////////////////////////////////////////////// -template<> -class Extension : public ExtensionBase { -public: - INLINE_LINMATH void __setitem__(int i, FLOATTYPE v); -}; - //////////////////////////////////////////////////////////////////// // Class : Extension // Description : This class defines the extension methods for @@ -35,7 +23,7 @@ template<> class Extension : public ExtensionBase { public: INLINE_LINMATH PyObject *__reduce__(PyObject *self) const; - INLINE_LINMATH void python_repr(ostream &out, const string &class_name) const; + INLINE_LINMATH string __repr__() const; }; #include "lmatrix4_ext_src.I" diff --git a/panda/src/linmath/lmatrix4_src.I b/panda/src/linmath/lmatrix4_src.I index 9dc886c22b..be772cab48 100644 --- a/panda/src/linmath/lmatrix4_src.I +++ b/panda/src/linmath/lmatrix4_src.I @@ -166,7 +166,7 @@ INLINE_LINMATH FLOATNAME(LMatrix4) &FLOATNAME(LMatrix4):: operator = (const FLOATNAME(UnalignedLMatrix4) ©) { TAU_PROFILE("void LMatrix4::operator = (const UnalignedLMatrix4 &)", " ", TAU_USER); - memcpy(&_m(0, 0), copy.get_data(), sizeof(FLOATTYPE) * get_num_components()); + memcpy(&_m(0, 0), copy.get_data(), sizeof(FLOATTYPE) * num_components); return *this; } @@ -1848,7 +1848,7 @@ FLOATNAME(UnalignedLMatrix4)(const FLOATNAME(UnalignedLMatrix4) ©) : _m(copy //////////////////////////////////////////////////////////////////// INLINE_LINMATH FLOATNAME(UnalignedLMatrix4) &FLOATNAME(UnalignedLMatrix4):: operator = (const FLOATNAME(LMatrix4) ©) { - memcpy(&_m(0, 0), copy.get_data(), sizeof(FLOATTYPE) * get_num_components()); + memcpy(&_m(0, 0), copy.get_data(), sizeof(FLOATTYPE) * num_components); return *this; } diff --git a/panda/src/linmath/lmatrix4_src.h b/panda/src/linmath/lmatrix4_src.h index 370b82d6c0..14fe9fe869 100644 --- a/panda/src/linmath/lmatrix4_src.h +++ b/panda/src/linmath/lmatrix4_src.h @@ -20,10 +20,16 @@ class FLOATNAME(UnalignedLMatrix4); //////////////////////////////////////////////////////////////////// class EXPCL_PANDA_LINMATH ALIGN_LINMATH FLOATNAME(LMatrix4) { public: + typedef FLOATTYPE numeric_type; typedef const FLOATTYPE *iterator; typedef const FLOATTYPE *const_iterator; PUBLISHED: + enum { + num_components = 16, + is_int = 0 + }; + // These helper classes are used to support two-level operator []. class Row { private: @@ -31,7 +37,6 @@ PUBLISHED: PUBLISHED: INLINE_LINMATH FLOATTYPE operator [](int i) const; INLINE_LINMATH FLOATTYPE &operator [](int i); - EXTENSION(INLINE_LINMATH void __setitem__(int i, FLOATTYPE v)); INLINE_LINMATH static int size(); public: FLOATTYPE *_row; @@ -260,7 +265,7 @@ PUBLISHED: void output(ostream &out) const; void write(ostream &out, int indent_level = 0) const; - EXTENSION(INLINE_LINMATH void python_repr(ostream &out, const string &class_name) const); + EXTENSION(INLINE_LINMATH string __repr__() const); INLINE_LINMATH void generate_hash(ChecksumHashGenerator &hashgen) const; void generate_hash(ChecksumHashGenerator &hashgen, FLOATTYPE scale) const; @@ -320,6 +325,10 @@ private: //////////////////////////////////////////////////////////////////// class EXPCL_PANDA_LINMATH FLOATNAME(UnalignedLMatrix4) { PUBLISHED: + enum { + num_components = 16 + }; + INLINE_LINMATH FLOATNAME(UnalignedLMatrix4)(); INLINE_LINMATH FLOATNAME(UnalignedLMatrix4)(const FLOATNAME(LMatrix4) ©); INLINE_LINMATH FLOATNAME(UnalignedLMatrix4)(const FLOATNAME(UnalignedLMatrix4) ©); diff --git a/panda/src/linmath/lpoint2_ext_src.I b/panda/src/linmath/lpoint2_ext_src.I index 3b66477d6d..ba9eb8e1ca 100644 --- a/panda/src/linmath/lpoint2_ext_src.I +++ b/panda/src/linmath/lpoint2_ext_src.I @@ -23,15 +23,17 @@ #endif //////////////////////////////////////////////////////////////////// -// Function: LPoint2::python_repr +// Function: LPoint2::__repr__ // Access: Published // Description: //////////////////////////////////////////////////////////////////// -INLINE_LINMATH void Extension:: -python_repr(ostream &out, const string &class_name) const { - out << class_name << "(" +INLINE_LINMATH string Extension:: +__repr__() const { + ostringstream out; + out << "LPoint2" << FLOATTOKEN << "(" << MAYBE_ZERO(_this->_v(0)) << ", " << MAYBE_ZERO(_this->_v(1)) << ")"; + return out.str(); } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/linmath/lpoint2_ext_src.h b/panda/src/linmath/lpoint2_ext_src.h index 83620bbf48..2bf9a6c8f9 100644 --- a/panda/src/linmath/lpoint2_ext_src.h +++ b/panda/src/linmath/lpoint2_ext_src.h @@ -24,7 +24,7 @@ class Extension : public ExtensionBase { public: INLINE_LINMATH PyObject *__getattr__(const string &attr_name) const; INLINE_LINMATH int __setattr__(PyObject *self, const string &attr_name, PyObject *assign); - INLINE_LINMATH void python_repr(ostream &out, const string &class_name) const; + INLINE_LINMATH string __repr__() const; }; #include "lpoint2_ext_src.I" diff --git a/panda/src/linmath/lpoint2_src.h b/panda/src/linmath/lpoint2_src.h index 5218cfc483..03b264ffdc 100644 --- a/panda/src/linmath/lpoint2_src.h +++ b/panda/src/linmath/lpoint2_src.h @@ -54,7 +54,7 @@ PUBLISHED: INLINE_LINMATH FLOATNAME(LPoint2) project(const FLOATNAME(LVecBase2) &onto) const; #endif - EXTENSION(INLINE_LINMATH void python_repr(ostream &out, const string &class_name) const); + EXTENSION(INLINE_LINMATH string __repr__() const); public: static TypeHandle get_class_type() { diff --git a/panda/src/linmath/lpoint3_ext_src.I b/panda/src/linmath/lpoint3_ext_src.I index 2eaca34737..79215517a5 100644 --- a/panda/src/linmath/lpoint3_ext_src.I +++ b/panda/src/linmath/lpoint3_ext_src.I @@ -23,16 +23,18 @@ #endif //////////////////////////////////////////////////////////////////// -// Function: LPoint3::python_repr +// Function: LPoint3::__repr__ // Access: Published // Description: //////////////////////////////////////////////////////////////////// -INLINE_LINMATH void Extension:: -python_repr(ostream &out, const string &class_name) const { - out << class_name << "(" +INLINE_LINMATH string Extension:: +__repr__() const { + ostringstream out; + out << "LPoint3" << FLOATTOKEN << "(" << MAYBE_ZERO(_this->_v(0)) << ", " << MAYBE_ZERO(_this->_v(1)) << ", " << MAYBE_ZERO(_this->_v(2)) << ")"; + return out.str(); } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/linmath/lpoint3_ext_src.h b/panda/src/linmath/lpoint3_ext_src.h index 2e4c38f3e1..e9131b891d 100644 --- a/panda/src/linmath/lpoint3_ext_src.h +++ b/panda/src/linmath/lpoint3_ext_src.h @@ -24,7 +24,7 @@ class Extension : public ExtensionBase { public: INLINE_LINMATH PyObject *__getattr__(const string &attr_name) const; INLINE_LINMATH int __setattr__(PyObject *self, const string &attr_name, PyObject *assign); - INLINE_LINMATH void python_repr(ostream &out, const string &class_name) const; + INLINE_LINMATH string __repr__() const; }; #include "lpoint3_ext_src.I" diff --git a/panda/src/linmath/lpoint3_src.h b/panda/src/linmath/lpoint3_src.h index 11c1ccc29d..76e06982d4 100644 --- a/panda/src/linmath/lpoint3_src.h +++ b/panda/src/linmath/lpoint3_src.h @@ -75,7 +75,7 @@ PUBLISHED: FLOATTYPE up, CoordinateSystem cs = CS_default); - EXTENSION(INLINE_LINMATH void python_repr(ostream &out, const string &class_name) const); + EXTENSION(INLINE_LINMATH string __repr__() const); public: static TypeHandle get_class_type() { diff --git a/panda/src/linmath/lpoint4_ext_src.I b/panda/src/linmath/lpoint4_ext_src.I index 9a89e56a0a..88a83d20d5 100644 --- a/panda/src/linmath/lpoint4_ext_src.I +++ b/panda/src/linmath/lpoint4_ext_src.I @@ -23,17 +23,19 @@ #endif //////////////////////////////////////////////////////////////////// -// Function: LPoint4::python_repr +// Function: LPoint4::__repr__ // Access: Published // Description: //////////////////////////////////////////////////////////////////// -INLINE_LINMATH void Extension:: -python_repr(ostream &out, const string &class_name) const { - out << class_name << "(" +INLINE_LINMATH string Extension:: +__repr__() const { + ostringstream out; + out << "LPoint4" << FLOATTOKEN << "(" << MAYBE_ZERO(_this->_v(0)) << ", " << MAYBE_ZERO(_this->_v(1)) << ", " << MAYBE_ZERO(_this->_v(2)) << ", " << MAYBE_ZERO(_this->_v(3)) << ")"; + return out.str(); } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/linmath/lpoint4_ext_src.h b/panda/src/linmath/lpoint4_ext_src.h index 93c59ca58c..05d1e4b3c2 100644 --- a/panda/src/linmath/lpoint4_ext_src.h +++ b/panda/src/linmath/lpoint4_ext_src.h @@ -24,7 +24,7 @@ class Extension : public ExtensionBase { public: INLINE_LINMATH PyObject *__getattr__(const string &attr_name) const; INLINE_LINMATH int __setattr__(PyObject *self, const string &attr_name, PyObject *assign); - INLINE_LINMATH void python_repr(ostream &out, const string &class_name) const; + INLINE_LINMATH string __repr__() const; }; #include "lpoint4_ext_src.I" diff --git a/panda/src/linmath/lpoint4_src.h b/panda/src/linmath/lpoint4_src.h index 877c3fe766..b71e328c62 100644 --- a/panda/src/linmath/lpoint4_src.h +++ b/panda/src/linmath/lpoint4_src.h @@ -56,7 +56,7 @@ PUBLISHED: INLINE_LINMATH FLOATNAME(LPoint4) project(const FLOATNAME(LVecBase4) &onto) const; #endif - EXTENSION(INLINE_LINMATH void python_repr(ostream &out, const string &class_name) const); + EXTENSION(INLINE_LINMATH string __repr__() const); public: static TypeHandle get_class_type() { diff --git a/panda/src/linmath/lvecBase2_ext_src.I b/panda/src/linmath/lvecBase2_ext_src.I index 2d771a9d0a..8a2c8221b4 100644 --- a/panda/src/linmath/lvecBase2_ext_src.I +++ b/panda/src/linmath/lvecBase2_ext_src.I @@ -29,26 +29,17 @@ #endif //////////////////////////////////////////////////////////////////// -// Function: LVecBase2::__setitem__ -// Access: Public -// Description: -//////////////////////////////////////////////////////////////////// -INLINE_LINMATH void Extension:: -__setitem__(int i, FLOATTYPE v) { - nassertv(i >= 0 && i < 2); - _this->_v(i) = v; -} - -//////////////////////////////////////////////////////////////////// -// Function: LVecBase2::python_repr +// Function: LVecBase2::__repr__ // Access: Published // Description: //////////////////////////////////////////////////////////////////// -INLINE_LINMATH void Extension:: -python_repr(ostream &out, const string &class_name) const { - out << class_name << "(" +INLINE_LINMATH string Extension:: +__repr__() const { + ostringstream out; + out << "LVecBase2" << FLOATTOKEN << "(" << MAYBE_ZERO(_this->_v(0)) << ", " << MAYBE_ZERO(_this->_v(1)) << ")"; + return out.str(); } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/linmath/lvecBase2_ext_src.h b/panda/src/linmath/lvecBase2_ext_src.h index 0e7cba9a4f..c19c8a49d4 100644 --- a/panda/src/linmath/lvecBase2_ext_src.h +++ b/panda/src/linmath/lvecBase2_ext_src.h @@ -25,8 +25,7 @@ public: INLINE_LINMATH PyObject *__reduce__(PyObject *self) const; INLINE_LINMATH PyObject *__getattr__(const string &attr_name) const; INLINE_LINMATH int __setattr__(PyObject *self, const string &attr_name, PyObject *assign); - INLINE_LINMATH void __setitem__(int i, FLOATTYPE v); - INLINE_LINMATH void python_repr(ostream &out, const string &class_name) const; + INLINE_LINMATH string __repr__() const; INLINE_LINMATH FLOATNAME(LVecBase2) __pow__(FLOATTYPE exponent) const; INLINE_LINMATH PyObject *__ipow__(PyObject *self, FLOATTYPE exponent); diff --git a/panda/src/linmath/lvecBase2_src.I b/panda/src/linmath/lvecBase2_src.I index 9b453102a1..14057fbd50 100644 --- a/panda/src/linmath/lvecBase2_src.I +++ b/panda/src/linmath/lvecBase2_src.I @@ -298,7 +298,7 @@ begin() { //////////////////////////////////////////////////////////////////// INLINE_LINMATH FLOATNAME(LVecBase2)::iterator FLOATNAME(LVecBase2):: end() { - return begin() + get_num_components(); + return begin() + num_components; } //////////////////////////////////////////////////////////////////// @@ -320,7 +320,7 @@ begin() const { //////////////////////////////////////////////////////////////////// INLINE_LINMATH FLOATNAME(LVecBase2)::const_iterator FLOATNAME(LVecBase2):: end() const { - return begin() + get_num_components(); + return begin() + num_components; } //////////////////////////////////////////////////////////////////// @@ -756,8 +756,12 @@ componentwise_mult(const FLOATNAME(LVecBase2) &other) { INLINE_LINMATH FLOATNAME(LVecBase2) FLOATNAME(LVecBase2):: fmax(const FLOATNAME(LVecBase2) &other) const { TAU_PROFILE("LVecBase2::fmax()", " ", TAU_USER); +#ifdef HAVE_EIGEN + return FLOATNAME(LVecBase2)(_v.cwiseMax(other._v)); +#else return FLOATNAME(LVecBase2)(_v(0) > other._v(0) ? _v(0) : other._v(0), _v(1) > other._v(1) ? _v(1) : other._v(1)); +#endif } //////////////////////////////////////////////////////////////////// @@ -768,8 +772,12 @@ fmax(const FLOATNAME(LVecBase2) &other) const { INLINE_LINMATH FLOATNAME(LVecBase2) FLOATNAME(LVecBase2):: fmin(const FLOATNAME(LVecBase2) &other) const { TAU_PROFILE("LVecBase2::fmin()", " ", TAU_USER); +#ifdef HAVE_EIGEN + return FLOATNAME(LVecBase2)(_v.cwiseMin(other._v)); +#else return FLOATNAME(LVecBase2)(_v(0) < other._v(0) ? _v(0) : other._v(0), _v(1) < other._v(1) ? _v(1) : other._v(1)); +#endif } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/linmath/lvecBase2_src.h b/panda/src/linmath/lvecBase2_src.h index 6cba9eea6e..5cb049429e 100644 --- a/panda/src/linmath/lvecBase2_src.h +++ b/panda/src/linmath/lvecBase2_src.h @@ -20,9 +20,20 @@ //////////////////////////////////////////////////////////////////// class EXPCL_PANDA_LINMATH FLOATNAME(LVecBase2) { PUBLISHED: + typedef FLOATTYPE numeric_type; typedef const FLOATTYPE *iterator; typedef const FLOATTYPE *const_iterator; + enum { + num_components = 2, + +#ifdef FLOATTYPE_IS_INT + is_int = 1 +#else + is_int = 0 +#endif + }; + INLINE_LINMATH FLOATNAME(LVecBase2)(); INLINE_LINMATH FLOATNAME(LVecBase2)(const FLOATNAME(LVecBase2) ©); INLINE_LINMATH FLOATNAME(LVecBase2) &operator = (const FLOATNAME(LVecBase2) ©); @@ -43,7 +54,6 @@ PUBLISHED: INLINE_LINMATH FLOATTYPE operator [](int i) const; INLINE_LINMATH FLOATTYPE &operator [](int i); - EXTENSION(INLINE_LINMATH void __setitem__(int i, FLOATTYPE v)); INLINE_LINMATH static int size(); INLINE_LINMATH bool is_nan() const; @@ -130,11 +140,11 @@ PUBLISHED: INLINE_LINMATH FLOATNAME(LVecBase2) fmin(const FLOATNAME(LVecBase2) &other) const; INLINE_LINMATH bool almost_equal(const FLOATNAME(LVecBase2) &other, - FLOATTYPE threshold) const; + FLOATTYPE threshold) const; INLINE_LINMATH bool almost_equal(const FLOATNAME(LVecBase2) &other) const; INLINE_LINMATH void output(ostream &out) const; - EXTENSION(INLINE_LINMATH void python_repr(ostream &out, const string &class_name) const); + EXTENSION(INLINE_LINMATH string __repr__() const); INLINE_LINMATH void write_datagram_fixed(Datagram &destination) const; INLINE_LINMATH void read_datagram_fixed(DatagramIterator &source); diff --git a/panda/src/linmath/lvecBase3_ext_src.I b/panda/src/linmath/lvecBase3_ext_src.I index 438e8ca4ec..6ecd5eefe0 100644 --- a/panda/src/linmath/lvecBase3_ext_src.I +++ b/panda/src/linmath/lvecBase3_ext_src.I @@ -29,27 +29,18 @@ #endif //////////////////////////////////////////////////////////////////// -// Function: LVecBase3::__setitem__ -// Access: Public -// Description: -//////////////////////////////////////////////////////////////////// -INLINE_LINMATH void Extension:: -__setitem__(int i, FLOATTYPE v) { - nassertv(i >= 0 && i < 3); - _this->_v(i) = v; -} - -//////////////////////////////////////////////////////////////////// -// Function: LVecBase3::python_repr +// Function: LVecBase3::__repr__ // Access: Published // Description: //////////////////////////////////////////////////////////////////// -INLINE_LINMATH void Extension:: -python_repr(ostream &out, const string &class_name) const { - out << class_name << "(" +INLINE_LINMATH string Extension:: +__repr__() const { + ostringstream out; + out << "LVecBase3" << FLOATTOKEN << "(" << MAYBE_ZERO(_this->_v(0)) << ", " << MAYBE_ZERO(_this->_v(1)) << ", " << MAYBE_ZERO(_this->_v(2)) << ")"; + return out.str(); } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/linmath/lvecBase3_ext_src.h b/panda/src/linmath/lvecBase3_ext_src.h index cc86087833..cf9f60a0d7 100644 --- a/panda/src/linmath/lvecBase3_ext_src.h +++ b/panda/src/linmath/lvecBase3_ext_src.h @@ -25,8 +25,7 @@ public: INLINE_LINMATH PyObject *__reduce__(PyObject *self) const; INLINE_LINMATH PyObject *__getattr__(const string &attr_name) const; INLINE_LINMATH int __setattr__(PyObject *self, const string &attr_name, PyObject *assign); - INLINE_LINMATH void __setitem__(int i, FLOATTYPE v); - INLINE_LINMATH void python_repr(ostream &out, const string &class_name) const; + INLINE_LINMATH string __repr__() const; INLINE_LINMATH FLOATNAME(LVecBase3) __pow__(FLOATTYPE exponent) const; INLINE_LINMATH PyObject *__ipow__(PyObject *self, FLOATTYPE exponent); diff --git a/panda/src/linmath/lvecBase3_src.I b/panda/src/linmath/lvecBase3_src.I index 31e24b2801..41a0d9ccce 100644 --- a/panda/src/linmath/lvecBase3_src.I +++ b/panda/src/linmath/lvecBase3_src.I @@ -12,6 +12,7 @@ // //////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////// // Function: LVecBase3::Default Constructor // Access: Public @@ -381,7 +382,7 @@ begin() { //////////////////////////////////////////////////////////////////// INLINE_LINMATH FLOATNAME(LVecBase3)::iterator FLOATNAME(LVecBase3):: end() { - return begin() + get_num_components(); + return begin() + num_components; } //////////////////////////////////////////////////////////////////// @@ -403,7 +404,7 @@ begin() const { //////////////////////////////////////////////////////////////////// INLINE_LINMATH FLOATNAME(LVecBase3)::const_iterator FLOATNAME(LVecBase3):: end() const { - return begin() + get_num_components(); + return begin() + num_components; } //////////////////////////////////////////////////////////////////// @@ -933,9 +934,13 @@ componentwise_mult(const FLOATNAME(LVecBase3) &other) { INLINE_LINMATH FLOATNAME(LVecBase3) FLOATNAME(LVecBase3):: fmax(const FLOATNAME(LVecBase3) &other) const { TAU_PROFILE("LVecBase3::fmax()", " ", TAU_USER); +#ifdef HAVE_EIGEN + return FLOATNAME(LVecBase3)(_v.cwiseMax(other._v)); +#else return FLOATNAME(LVecBase3)(_v(0) > other._v(0) ? _v(0) : other._v(0), _v(1) > other._v(1) ? _v(1) : other._v(1), _v(2) > other._v(2) ? _v(2) : other._v(2)); +#endif } //////////////////////////////////////////////////////////////////// @@ -946,9 +951,13 @@ fmax(const FLOATNAME(LVecBase3) &other) const { INLINE_LINMATH FLOATNAME(LVecBase3) FLOATNAME(LVecBase3):: fmin(const FLOATNAME(LVecBase3) &other) const { TAU_PROFILE("LVecBase3::fmin()", " ", TAU_USER); +#ifdef HAVE_EIGEN + return FLOATNAME(LVecBase3)(_v.cwiseMin(other._v)); +#else return FLOATNAME(LVecBase3)(_v(0) < other._v(0) ? _v(0) : other._v(0), _v(1) < other._v(1) ? _v(1) : other._v(1), _v(2) < other._v(2) ? _v(2) : other._v(2)); +#endif } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/linmath/lvecBase3_src.h b/panda/src/linmath/lvecBase3_src.h index ce7c09c011..c126e0fb6c 100644 --- a/panda/src/linmath/lvecBase3_src.h +++ b/panda/src/linmath/lvecBase3_src.h @@ -20,9 +20,20 @@ //////////////////////////////////////////////////////////////////// class EXPCL_PANDA_LINMATH FLOATNAME(LVecBase3) { PUBLISHED: + typedef FLOATTYPE numeric_type; typedef const FLOATTYPE *iterator; typedef const FLOATTYPE *const_iterator; + enum { + num_components = 3, + +#ifdef FLOATTYPE_IS_INT + is_int = 1 +#else + is_int = 0 +#endif + }; + INLINE_LINMATH FLOATNAME(LVecBase3)(); INLINE_LINMATH FLOATNAME(LVecBase3)(const FLOATNAME(LVecBase3) ©); INLINE_LINMATH FLOATNAME(LVecBase3) &operator = (const FLOATNAME(LVecBase3) ©); @@ -45,7 +56,6 @@ PUBLISHED: INLINE_LINMATH FLOATTYPE operator [](int i) const; INLINE_LINMATH FLOATTYPE &operator [](int i); - EXTENSION(INLINE_LINMATH void __setitem__(int i, FLOATTYPE v)); INLINE_LINMATH static int size(); INLINE_LINMATH bool is_nan() const; @@ -145,11 +155,11 @@ PUBLISHED: INLINE_LINMATH void cross_into(const FLOATNAME(LVecBase3) &other); INLINE_LINMATH bool almost_equal(const FLOATNAME(LVecBase3) &other, - FLOATTYPE threshold) const; + FLOATTYPE threshold) const; INLINE_LINMATH bool almost_equal(const FLOATNAME(LVecBase3) &other) const; INLINE_LINMATH void output(ostream &out) const; - EXTENSION(INLINE_LINMATH void python_repr(ostream &out, const string &class_name) const); + EXTENSION(INLINE_LINMATH string __repr__() const); INLINE_LINMATH void write_datagram_fixed(Datagram &destination) const; INLINE_LINMATH void read_datagram_fixed(DatagramIterator &source); diff --git a/panda/src/linmath/lvecBase4.h b/panda/src/linmath/lvecBase4.h index 0e144630e4..268da58c60 100644 --- a/panda/src/linmath/lvecBase4.h +++ b/panda/src/linmath/lvecBase4.h @@ -24,6 +24,8 @@ #include "checksumHashGenerator.h" #include "lvecBase2.h" #include "lvecBase3.h" +#include "lpoint3.h" +#include "lvector3.h" #include "cmath.h" #include "nearly_zero.h" diff --git a/panda/src/linmath/lvecBase4_ext_src.I b/panda/src/linmath/lvecBase4_ext_src.I index 444ce5f7a2..a0400690a5 100644 --- a/panda/src/linmath/lvecBase4_ext_src.I +++ b/panda/src/linmath/lvecBase4_ext_src.I @@ -29,28 +29,19 @@ #endif //////////////////////////////////////////////////////////////////// -// Function: LVecBase4::__setitem__ -// Access: Public -// Description: -//////////////////////////////////////////////////////////////////// -INLINE_LINMATH void Extension:: -__setitem__(int i, FLOATTYPE v) { - nassertv(i >= 0 && i < 4); - _this->_v(i) = v; -} - -//////////////////////////////////////////////////////////////////// -// Function: LVecBase4::python_repr +// Function: LVecBase4::__repr__ // Access: Published // Description: //////////////////////////////////////////////////////////////////// -INLINE_LINMATH void Extension:: -python_repr(ostream &out, const string &class_name) const { - out << class_name << "(" +INLINE_LINMATH string Extension:: +__repr__() const { + ostringstream out; + out << "LVecBase4" << FLOATTOKEN << "(" << MAYBE_ZERO(_this->_v(0)) << ", " << MAYBE_ZERO(_this->_v(1)) << ", " << MAYBE_ZERO(_this->_v(2)) << ", " << MAYBE_ZERO(_this->_v(3)) << ")"; + return out.str(); } //////////////////////////////////////////////////////////////////// @@ -258,17 +249,6 @@ __ipow__(PyObject *self, FLOATTYPE exponent) { return self; } -//////////////////////////////////////////////////////////////////// -// Function: UnalignedLVecBase4::__setitem__ -// Access: Public -// Description: -//////////////////////////////////////////////////////////////////// -INLINE_LINMATH void Extension:: -__setitem__(int i, FLOATTYPE v) { - nassertv(i >= 0 && i < 4); - _this->_v(i) = v; -} - #undef PYNUMBER_FLOATTYPE #undef PY_FROM_FLOATTYPE #undef PY_AS_FLOATTYPE diff --git a/panda/src/linmath/lvecBase4_ext_src.h b/panda/src/linmath/lvecBase4_ext_src.h index edcecb4dbf..97924376ba 100644 --- a/panda/src/linmath/lvecBase4_ext_src.h +++ b/panda/src/linmath/lvecBase4_ext_src.h @@ -25,23 +25,10 @@ public: INLINE_LINMATH PyObject *__reduce__(PyObject *self) const; INLINE_LINMATH PyObject *__getattr__(const string &attr_name) const; INLINE_LINMATH int __setattr__(PyObject *self, const string &attr_name, PyObject *assign); - INLINE_LINMATH void __setitem__(int i, FLOATTYPE v); - INLINE_LINMATH void python_repr(ostream &out, const string &class_name) const; + INLINE_LINMATH string __repr__() const; INLINE_LINMATH FLOATNAME(LVecBase4) __pow__(FLOATTYPE exponent) const; INLINE_LINMATH PyObject *__ipow__(PyObject *self, FLOATTYPE exponent); }; -//////////////////////////////////////////////////////////////////// -// Class : Extension -// Description : This class defines the extension methods for -// UnalignedLVecBase4, which are called instead of -// any C++ methods with the same prototype. -//////////////////////////////////////////////////////////////////// -template<> -class Extension : public ExtensionBase { -public: - INLINE_LINMATH void __setitem__(int i, FLOATTYPE v); -}; - #include "lvecBase4_ext_src.I" diff --git a/panda/src/linmath/lvecBase4_src.I b/panda/src/linmath/lvecBase4_src.I index db5923295e..f8c8422c58 100644 --- a/panda/src/linmath/lvecBase4_src.I +++ b/panda/src/linmath/lvecBase4_src.I @@ -106,6 +106,28 @@ FLOATNAME(LVecBase4)(const FLOATNAME(LVecBase3) ©, FLOATTYPE w) { set(copy[0], copy[1], copy[2], w); } +//////////////////////////////////////////////////////////////////// +// Function: LVecBase4::Constructor +// Access: Published +// Description: Constructs an LVecBase4 from an LPoint3. The w +// coordinate is set to 1.0. +//////////////////////////////////////////////////////////////////// +INLINE_LINMATH FLOATNAME(LVecBase4):: +FLOATNAME(LVecBase4)(const FLOATNAME(LPoint3) &point) { + set(point[0], point[1], point[2], 1); +} + +//////////////////////////////////////////////////////////////////// +// Function: LVecBase4::Constructor +// Access: Published +// Description: Constructs an LVecBase4 from an LVector3. The w +// coordinate is set to 0.0. +//////////////////////////////////////////////////////////////////// +INLINE_LINMATH FLOATNAME(LVecBase4):: +FLOATNAME(LVecBase4)(const FLOATNAME(LVector3) &vector) { + set(vector[0], vector[1], vector[2], 0); +} + //////////////////////////////////////////////////////////////////// // Function: LVecBase4::Destructor // Access: Published @@ -407,7 +429,7 @@ begin() { //////////////////////////////////////////////////////////////////// INLINE_LINMATH FLOATNAME(LVecBase4)::iterator FLOATNAME(LVecBase4):: end() { - return begin() + get_num_components(); + return begin() + num_components; } //////////////////////////////////////////////////////////////////// @@ -429,7 +451,7 @@ begin() const { //////////////////////////////////////////////////////////////////// INLINE_LINMATH FLOATNAME(LVecBase4)::const_iterator FLOATNAME(LVecBase4):: end() const { - return begin() + get_num_components(); + return begin() + num_components; } //////////////////////////////////////////////////////////////////// @@ -917,10 +939,14 @@ componentwise_mult(const FLOATNAME(LVecBase4) &other) { INLINE_LINMATH FLOATNAME(LVecBase4) FLOATNAME(LVecBase4):: fmax(const FLOATNAME(LVecBase4) &other) const { TAU_PROFILE("LVecBase4::fmax()", " ", TAU_USER); +#ifdef HAVE_EIGEN + return FLOATNAME(LVecBase4)(_v.cwiseMax(other._v)); +#else return FLOATNAME(LVecBase4)(_v(0) > other._v(0) ? _v(0) : other._v(0), _v(1) > other._v(1) ? _v(1) : other._v(1), _v(2) > other._v(2) ? _v(2) : other._v(2), _v(3) > other._v(3) ? _v(3) : other._v(3)); +#endif } //////////////////////////////////////////////////////////////////// @@ -931,10 +957,14 @@ fmax(const FLOATNAME(LVecBase4) &other) const { INLINE_LINMATH FLOATNAME(LVecBase4) FLOATNAME(LVecBase4):: fmin(const FLOATNAME(LVecBase4) &other) const { TAU_PROFILE("LVecBase4::fmin()", " ", TAU_USER); +#ifdef HAVE_EIGEN + return FLOATNAME(LVecBase4)(_v.cwiseMin(other._v)); +#else return FLOATNAME(LVecBase4)(_v(0) < other._v(0) ? _v(0) : other._v(0), _v(1) < other._v(1) ? _v(1) : other._v(1), _v(2) < other._v(2) ? _v(2) : other._v(2), _v(3) < other._v(3) ? _v(3) : other._v(3)); +#endif } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/linmath/lvecBase4_src.h b/panda/src/linmath/lvecBase4_src.h index e8b48ede7e..4abd48ed98 100644 --- a/panda/src/linmath/lvecBase4_src.h +++ b/panda/src/linmath/lvecBase4_src.h @@ -14,6 +14,8 @@ class FLOATNAME(LVecBase2); class FLOATNAME(LVecBase3); +class FLOATNAME(LPoint3); +class FLOATNAME(LVector3); class FLOATNAME(UnalignedLVecBase4); //////////////////////////////////////////////////////////////////// @@ -23,9 +25,20 @@ class FLOATNAME(UnalignedLVecBase4); //////////////////////////////////////////////////////////////////// class EXPCL_PANDA_LINMATH ALIGN_LINMATH FLOATNAME(LVecBase4) { PUBLISHED: + typedef FLOATTYPE numeric_type; typedef const FLOATTYPE *iterator; typedef const FLOATTYPE *const_iterator; + enum { + num_components = 4, + +#ifdef FLOATTYPE_IS_INT + is_int = 1 +#else + is_int = 0 +#endif + }; + INLINE_LINMATH FLOATNAME(LVecBase4)(); INLINE_LINMATH FLOATNAME(LVecBase4)(const FLOATNAME(LVecBase4) ©); INLINE_LINMATH FLOATNAME(LVecBase4)(const FLOATNAME(UnalignedLVecBase4) ©); @@ -35,6 +48,8 @@ PUBLISHED: INLINE_LINMATH FLOATNAME(LVecBase4)(FLOATTYPE fill_value); INLINE_LINMATH FLOATNAME(LVecBase4)(FLOATTYPE x, FLOATTYPE y, FLOATTYPE z, FLOATTYPE w); INLINE_LINMATH FLOATNAME(LVecBase4)(const FLOATNAME(LVecBase3) ©, FLOATTYPE w); + INLINE_LINMATH FLOATNAME(LVecBase4)(const FLOATNAME(LPoint3) &point); + INLINE_LINMATH FLOATNAME(LVecBase4)(const FLOATNAME(LVector3) &vector); ALLOC_DELETED_CHAIN(FLOATNAME(LVecBase4)); INLINE_LINMATH static const FLOATNAME(LVecBase4) &zero(); @@ -51,7 +66,6 @@ PUBLISHED: INLINE_LINMATH FLOATTYPE operator [](int i) const; INLINE_LINMATH FLOATTYPE &operator [](int i); - EXTENSION(INLINE_LINMATH void __setitem__(int i, FLOATTYPE v)); INLINE_LINMATH static int size(); INLINE_LINMATH bool is_nan() const; @@ -80,6 +94,7 @@ PUBLISHED: INLINE_LINMATH const FLOATTYPE *get_data() const; INLINE_LINMATH int get_num_components() const; + INLINE_LINMATH void extract_data(float*){}; public: INLINE_LINMATH iterator begin(); @@ -144,11 +159,11 @@ PUBLISHED: INLINE_LINMATH FLOATNAME(LVecBase4) fmin(const FLOATNAME(LVecBase4) &other) const; INLINE_LINMATH bool almost_equal(const FLOATNAME(LVecBase4) &other, - FLOATTYPE threshold) const; + FLOATTYPE threshold) const; INLINE_LINMATH bool almost_equal(const FLOATNAME(LVecBase4) &other) const; INLINE_LINMATH void output(ostream &out) const; - EXTENSION(INLINE_LINMATH void python_repr(ostream &out, const string &class_name) const); + EXTENSION(INLINE_LINMATH string __repr__() const); INLINE_LINMATH void write_datagram_fixed(Datagram &destination) const; INLINE_LINMATH void read_datagram_fixed(DatagramIterator &source); @@ -198,6 +213,16 @@ private: //////////////////////////////////////////////////////////////////// class EXPCL_PANDA_LINMATH FLOATNAME(UnalignedLVecBase4) { PUBLISHED: + enum { + num_components = 4, + +#ifdef FLOATTYPE_IS_INT + is_int = 1 +#else + is_int = 0 +#endif + }; + INLINE_LINMATH FLOATNAME(UnalignedLVecBase4)(); INLINE_LINMATH FLOATNAME(UnalignedLVecBase4)(const FLOATNAME(LVecBase4) ©); INLINE_LINMATH FLOATNAME(UnalignedLVecBase4)(const FLOATNAME(UnalignedLVecBase4) ©); @@ -209,14 +234,13 @@ PUBLISHED: INLINE_LINMATH FLOATTYPE operator [](int i) const; INLINE_LINMATH FLOATTYPE &operator [](int i); - - EXTENSION(INLINE_LINMATH void __setitem__(int i, FLOATTYPE v)); INLINE_LINMATH static int size(); INLINE_LINMATH const FLOATTYPE *get_data() const; INLINE_LINMATH int get_num_components() const; public: + typedef FLOATTYPE numeric_type; typedef UNALIGNED_LINMATH_MATRIX(FLOATTYPE, 1, 4) UVector4; UVector4 _v; diff --git a/panda/src/linmath/lvector2_ext_src.I b/panda/src/linmath/lvector2_ext_src.I index 42db030bce..e0ae2bea6d 100644 --- a/panda/src/linmath/lvector2_ext_src.I +++ b/panda/src/linmath/lvector2_ext_src.I @@ -23,15 +23,17 @@ #endif //////////////////////////////////////////////////////////////////// -// Function: LVector2::python_repr +// Function: LVector2::__repr__ // Access: Published // Description: //////////////////////////////////////////////////////////////////// -INLINE_LINMATH void Extension:: -python_repr(ostream &out, const string &class_name) const { - out << class_name << "(" +INLINE_LINMATH string Extension:: +__repr__() const { + ostringstream out; + out << "LVector2" << FLOATTOKEN << "(" << MAYBE_ZERO(_this->_v(0)) << ", " << MAYBE_ZERO(_this->_v(1)) << ")"; + return out.str(); } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/linmath/lvector2_ext_src.h b/panda/src/linmath/lvector2_ext_src.h index 00c410d96b..56a48aeaa3 100644 --- a/panda/src/linmath/lvector2_ext_src.h +++ b/panda/src/linmath/lvector2_ext_src.h @@ -24,7 +24,7 @@ class Extension : public ExtensionBase public: INLINE_LINMATH PyObject *__getattr__(const string &attr_name) const; INLINE_LINMATH int __setattr__(PyObject *self, const string &attr_name, PyObject *assign); - INLINE_LINMATH void python_repr(ostream &out, const string &class_name) const; + INLINE_LINMATH string __repr__() const; }; #include "lvector2_ext_src.I" diff --git a/panda/src/linmath/lvector2_src.h b/panda/src/linmath/lvector2_src.h index 417379b37f..81b2475af6 100644 --- a/panda/src/linmath/lvector2_src.h +++ b/panda/src/linmath/lvector2_src.h @@ -49,7 +49,7 @@ PUBLISHED: INLINE_LINMATH FLOATTYPE signed_angle_deg(const FLOATNAME(LVector2) &other) const; #endif - EXTENSION(INLINE_LINMATH void python_repr(ostream &out, const string &class_name) const); + EXTENSION(INLINE_LINMATH string __repr__() const); public: static TypeHandle get_class_type() { diff --git a/panda/src/linmath/lvector3_ext_src.I b/panda/src/linmath/lvector3_ext_src.I index 6aa0897546..451b713dee 100644 --- a/panda/src/linmath/lvector3_ext_src.I +++ b/panda/src/linmath/lvector3_ext_src.I @@ -23,16 +23,18 @@ #endif //////////////////////////////////////////////////////////////////// -// Function: LVector3::python_repr +// Function: LVector3::__repr__ // Access: Published // Description: //////////////////////////////////////////////////////////////////// -INLINE_LINMATH void Extension:: -python_repr(ostream &out, const string &class_name) const { - out << class_name << "(" +INLINE_LINMATH string Extension:: +__repr__() const { + ostringstream out; + out << "LVector3" << FLOATTOKEN << "(" << MAYBE_ZERO(_this->_v(0)) << ", " << MAYBE_ZERO(_this->_v(1)) << ", " << MAYBE_ZERO(_this->_v(2)) << ")"; + return out.str(); } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/linmath/lvector3_ext_src.h b/panda/src/linmath/lvector3_ext_src.h index 11e496e8b6..33ab4ab140 100644 --- a/panda/src/linmath/lvector3_ext_src.h +++ b/panda/src/linmath/lvector3_ext_src.h @@ -24,7 +24,7 @@ class Extension : public ExtensionBase public: INLINE_LINMATH PyObject *__getattr__(const string &attr_name) const; INLINE_LINMATH int __setattr__(PyObject *self, const string &attr_name, PyObject *assign); - INLINE_LINMATH void python_repr(ostream &out, const string &class_name) const; + INLINE_LINMATH string __repr__() const; }; #include "lvector3_ext_src.I" diff --git a/panda/src/linmath/lvector3_src.h b/panda/src/linmath/lvector3_src.h index bac80207a4..7fc0316b06 100644 --- a/panda/src/linmath/lvector3_src.h +++ b/panda/src/linmath/lvector3_src.h @@ -85,7 +85,7 @@ PUBLISHED: INLINE_LINMATH static FLOATNAME(LVector3) rfu(FLOATTYPE right, FLOATTYPE fwd,FLOATTYPE up, CoordinateSystem cs = CS_default); - EXTENSION(INLINE_LINMATH void python_repr(ostream &out, const string &class_name) const); + EXTENSION(INLINE_LINMATH string __repr__() const); public: static TypeHandle get_class_type() { diff --git a/panda/src/linmath/lvector4_ext_src.I b/panda/src/linmath/lvector4_ext_src.I index fa96998001..04edba6a06 100644 --- a/panda/src/linmath/lvector4_ext_src.I +++ b/panda/src/linmath/lvector4_ext_src.I @@ -23,17 +23,19 @@ #endif //////////////////////////////////////////////////////////////////// -// Function: LVector4::python_repr +// Function: LVector4::__repr__ // Access: Published // Description: //////////////////////////////////////////////////////////////////// -INLINE_LINMATH void Extension:: -python_repr(ostream &out, const string &class_name) const { - out << class_name << "(" +INLINE_LINMATH string Extension:: +__repr__() const { + ostringstream out; + out << "LVector4" << FLOATTOKEN << "(" << MAYBE_ZERO(_this->_v(0)) << ", " << MAYBE_ZERO(_this->_v(1)) << ", " << MAYBE_ZERO(_this->_v(2)) << ", " << MAYBE_ZERO(_this->_v(3)) << ")"; + return out.str(); } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/linmath/lvector4_ext_src.h b/panda/src/linmath/lvector4_ext_src.h index 9eb1bc2a92..5bc319ad13 100644 --- a/panda/src/linmath/lvector4_ext_src.h +++ b/panda/src/linmath/lvector4_ext_src.h @@ -24,7 +24,7 @@ class Extension : public ExtensionBase public: INLINE_LINMATH PyObject *__getattr__(const string &attr_name) const; INLINE_LINMATH int __setattr__(PyObject *self, const string &attr_name, PyObject *assign); - INLINE_LINMATH void python_repr(ostream &out, const string &class_name) const; + INLINE_LINMATH string __repr__() const; }; #include "lvector4_ext_src.I" diff --git a/panda/src/linmath/lvector4_src.h b/panda/src/linmath/lvector4_src.h index 179ccfdbfd..1cce8f0db5 100644 --- a/panda/src/linmath/lvector4_src.h +++ b/panda/src/linmath/lvector4_src.h @@ -50,7 +50,7 @@ PUBLISHED: INLINE_LINMATH FLOATNAME(LVector4) project(const FLOATNAME(LVecBase4) &onto) const; #endif - EXTENSION(INLINE_LINMATH void python_repr(ostream &out, const string &class_name) const); + EXTENSION(INLINE_LINMATH string __repr__() const); public: static TypeHandle get_class_type() { diff --git a/panda/src/mathutil/config_mathutil.N b/panda/src/mathutil/config_mathutil.N index 1c3ec9e9a6..94c5de0123 100644 --- a/panda/src/mathutil/config_mathutil.N +++ b/panda/src/mathutil/config_mathutil.N @@ -4,67 +4,67 @@ noinclude plane_src.h forcetype PointerToBase > forcetype PointerToArrayBase -forcetype PTA_LMatrix4f -forcetype CPTA_LMatrix4f +forcetype PointerToArray +forcetype ConstPointerToArray forcetype PointerToBase > forcetype PointerToArrayBase -forcetype PTA_LMatrix3f -forcetype CPTA_LMatrix3f +forcetype PointerToArray +forcetype ConstPointerToArray forcetype PointerToBase > forcetype PointerToArrayBase -forcetype PTA_LVecBase4f -forcetype CPTA_LVecBase4f +forcetype PointerToArray +forcetype ConstPointerToArray forcetype PointerToBase > forcetype PointerToArrayBase -forcetype PTA_LVecBase3f -forcetype CPTA_LVecBase3f +forcetype PointerToArray +forcetype ConstPointerToArray forcetype PointerToBase > forcetype PointerToArrayBase -forcetype PTA_LVecBase2f -forcetype CPTA_LVecBase2f +forcetype PointerToArray +forcetype ConstPointerToArray forcetype PointerToBase > forcetype PointerToArrayBase -forcetype PTA_LMatrix4d -forcetype CPTA_LMatrix4d +forcetype PointerToArray +forcetype ConstPointerToArray forcetype PointerToBase > forcetype PointerToArrayBase -forcetype PTA_LMatrix3d -forcetype CPTA_LMatrix3d +forcetype PointerToArray +forcetype ConstPointerToArray forcetype PointerToBase > forcetype PointerToArrayBase -forcetype PTA_LVecBase4d -forcetype CPTA_LVecBase4d +forcetype PointerToArray +forcetype ConstPointerToArray forcetype PointerToBase > forcetype PointerToArrayBase -forcetype PTA_LVecBase3d -forcetype CPTA_LVecBase3d +forcetype PointerToArray +forcetype ConstPointerToArray forcetype PointerToBase > forcetype PointerToArrayBase -forcetype PTA_LVecBase2d -forcetype CPTA_LVecBase2d +forcetype PointerToArray +forcetype ConstPointerToArray forcetype PointerToBase > forcetype PointerToArrayBase -forcetype PTA_LVecBase4i -forcetype CPTA_LVecBase4i +forcetype PointerToArray +forcetype ConstPointerToArray forcetype PointerToBase > forcetype PointerToArrayBase -forcetype PTA_LVecBase3i -forcetype CPTA_LVecBase3i +forcetype PointerToArray +forcetype ConstPointerToArray forcetype PointerToBase > forcetype PointerToArrayBase -forcetype PTA_LVecBase2i -forcetype CPTA_LVecBase2i +forcetype PointerToArray +forcetype ConstPointerToArray forceinclude "pointerToArray_ext.h" diff --git a/panda/src/ode/odeRayGeom.I b/panda/src/ode/odeRayGeom.I index 314a7631e1..ef5ceb1760 100755 --- a/panda/src/ode/odeRayGeom.I +++ b/panda/src/ode/odeRayGeom.I @@ -11,6 +11,8 @@ // with this source code in a file named "LICENSE." // //////////////////////////////////////////////////////////////////// + + INLINE void OdeRayGeom:: set_length(dReal length) { dGeomRaySetLength(_id, length); diff --git a/panda/src/ode/odeTriMeshData.h b/panda/src/ode/odeTriMeshData.h index e126fcb8c5..4b9e6e03eb 100755 --- a/panda/src/ode/odeTriMeshData.h +++ b/panda/src/ode/odeTriMeshData.h @@ -62,6 +62,7 @@ PUBLISHED: // INLINE void get_buffer(unsigned char** buf, int* buf_len) const; // INLINE void set_buffer(unsigned char* buf); // INLINE void update(); + virtual void write(ostream &out = cout, unsigned int indent=0) const; void write_faces(ostream &out) const; @@ -90,6 +91,7 @@ public: const int* indices, int index_count, \ const int* normals); */ + INLINE void preprocess(); INLINE dTriMeshDataID get_id() const; diff --git a/panda/src/osxdisplay/osxGraphicsBuffer.cxx b/panda/src/osxdisplay/osxGraphicsBuffer.cxx index 2f7752274c..b99d8af4d4 100644 --- a/panda/src/osxdisplay/osxGraphicsBuffer.cxx +++ b/panda/src/osxdisplay/osxGraphicsBuffer.cxx @@ -163,14 +163,14 @@ open_buffer() { if (_pbuffer == NULL) { GLenum target = GL_TEXTURE_RECTANGLE_ARB; - if (_x_size == Texture::up_to_power_2(_x_size) && - _y_size == Texture::up_to_power_2(_x_size)) { + if (_size[0] == Texture::up_to_power_2(_size[0]) && + _size[1] == Texture::up_to_power_2(_size[1])) { // It's a power-of-two size, so we can use GL_TEXTURE_2D as the // target. Dunno, but maybe this will be more likely to work on // some hardware. target = GL_TEXTURE_2D; } - if (!aglCreatePBuffer(_x_size, _y_size, target, GL_RGBA, 0, &_pbuffer)) { + if (!aglCreatePBuffer(_size.get_x(), _size.get_y(), target, GL_RGBA, 0, &_pbuffer)) { report_agl_error("aglCreatePBuffer"); close_buffer(); return false; diff --git a/panda/src/osxdisplay/osxGraphicsPipe.cxx b/panda/src/osxdisplay/osxGraphicsPipe.cxx index 594aed22a5..79e4d9c3c3 100644 --- a/panda/src/osxdisplay/osxGraphicsPipe.cxx +++ b/panda/src/osxdisplay/osxGraphicsPipe.cxx @@ -412,37 +412,32 @@ make_output(const string &name, return new osxGraphicsWindow(engine, this, name, fb_prop, win_prop, flags, gsg, host); } - + // Second thing to try: a GLGraphicsBuffer - + if (retry == 1) { - if (!osx_support_gl_buffer) { - return NULL; - } - if ((host==0)|| - ((flags&BF_require_parasite)!=0)|| - ((flags&BF_require_window)!=0)) { + if (!osx_support_gl_buffer || !gl_support_fbo || host == NULL || + (flags & (BF_require_parasite | BF_require_window)) != 0) { return NULL; } // Early failure - if we are sure that this buffer WONT // meet specs, we can bail out early. - if ((flags & BF_fb_props_optional)==0) { - if ((fb_prop.get_indexed_color() > 0)|| - (fb_prop.get_back_buffers() > 0)|| - (fb_prop.get_accum_bits() > 0)|| - (fb_prop.get_multisamples() > 0)) { + if ((flags & BF_fb_props_optional) == 0) { + if (fb_prop.get_indexed_color() || + fb_prop.get_back_buffers() > 0 || + fb_prop.get_accum_bits() > 0) { return NULL; } } - // Early success - if we are sure that this buffer WILL - // meet specs, we can precertify it. - if ((osxgsg != 0) && - (osxgsg->is_valid()) && - (!osxgsg->needs_reset()) && - (osxgsg->_supports_framebuffer_object) && - (osxgsg->_glDrawBuffers != 0)&& - (fb_prop.is_basic())) { - precertify = true; + if (osxgsg != NULL && osxgsg->is_valid() && !osxgsg->needs_reset()) { + if (!osxgsg->_supports_framebuffer_object || + osxgsg->_glDrawBuffers == NULL) { + return NULL; + } else if (fb_prop.is_basic()) { + // Early success - if we are sure that this buffer WILL + // meet specs, we can precertify it. + precertify = true; + } } return new GLGraphicsBuffer(engine, this, name, fb_prop, win_prop, flags, gsg, host); } diff --git a/panda/src/pgraph/cullBinManager.h b/panda/src/pgraph/cullBinManager.h index 6d29d9e1f4..3957359b50 100644 --- a/panda/src/pgraph/cullBinManager.h +++ b/panda/src/pgraph/cullBinManager.h @@ -99,7 +99,7 @@ private: class EXPCL_PANDA_PGRAPH BinDefinition { public: #ifndef NDEBUG - LColorf _flash_color; + LColor _flash_color; bool _flash_active; #endif bool _in_use; diff --git a/panda/src/pgraph/nodePath.I b/panda/src/pgraph/nodePath.I index ea347495cf..ce0228174a 100644 --- a/panda/src/pgraph/nodePath.I +++ b/panda/src/pgraph/nodePath.I @@ -136,6 +136,19 @@ operator = (NodePath &&from) NOEXCEPT { } #endif // USE_MOVE_SEMANTICS +//////////////////////////////////////////////////////////////////// +// Function: NodePath::clear +// Access: Published +// Description: Sets this NodePath to the empty NodePath. It will +// no longer point to any node. +//////////////////////////////////////////////////////////////////// +INLINE void NodePath:: +clear() { + _head.clear(); + _backup_key = 0; + _error_type = ET_ok; +} + //////////////////////////////////////////////////////////////////// // Function: NodePath::not_found named constructor // Access: Published, Static diff --git a/panda/src/pgraph/nodePath.h b/panda/src/pgraph/nodePath.h index 8163e78767..74ce52c3a8 100644 --- a/panda/src/pgraph/nodePath.h +++ b/panda/src/pgraph/nodePath.h @@ -174,14 +174,15 @@ PUBLISHED: }; INLINE NodePath(); - INLINE NodePath(const string &top_node_name, Thread *current_thread = Thread::get_current_thread()); - INLINE NodePath(PandaNode *node, Thread *current_thread = Thread::get_current_thread()); + INLINE explicit NodePath(const string &top_node_name, Thread *current_thread = Thread::get_current_thread()); + INLINE explicit NodePath(PandaNode *node, Thread *current_thread = Thread::get_current_thread()); INLINE static NodePath any_path(PandaNode *node, Thread *current_thread = Thread::get_current_thread()); NodePath(const NodePath &parent, PandaNode *child_node, Thread *current_thread = Thread::get_current_thread()); INLINE NodePath(const NodePath ©); INLINE void operator = (const NodePath ©); + INLINE void clear(); #ifdef USE_MOVE_SEMANTICS INLINE NodePath(NodePath &&from) NOEXCEPT; diff --git a/panda/src/pgraphnodes/spotlight.cxx b/panda/src/pgraphnodes/spotlight.cxx index 28548f919e..15ce5a7d98 100644 --- a/panda/src/pgraphnodes/spotlight.cxx +++ b/panda/src/pgraphnodes/spotlight.cxx @@ -194,7 +194,7 @@ make_spot(int pixel_width, PN_stdfloat full_radius, LColor &fg, LColor &bg) { ++num_channels; } PNMImage image(pixel_width, pixel_width, num_channels); - image.render_spot(LCAST(double, fg), LCAST(double, bg), full_radius, 1.0); + image.render_spot(LCAST(float, fg), LCAST(float, bg), full_radius, 1.0); PT(Texture) tex = new Texture("spot"); tex->load(image); diff --git a/panda/src/physx/physx_includes.h b/panda/src/physx/physx_includes.h index 91e16eb67e..0f8c4f2e79 100644 --- a/panda/src/physx/physx_includes.h +++ b/panda/src/physx/physx_includes.h @@ -50,6 +50,7 @@ // PhysX headers +#include "Nxp.h" #include "NxPhysics.h" #include "NxExtended.h" #include "NxStream.h" diff --git a/panda/src/pnmimage/convert_srgb.cxx b/panda/src/pnmimage/convert_srgb.cxx index ef27735d06..ac46aa50f4 100644 --- a/panda/src/pnmimage/convert_srgb.cxx +++ b/panda/src/pnmimage/convert_srgb.cxx @@ -14,17 +14,6 @@ #include "convert_srgb.h" -#ifdef __GNUC__ -#include -#endif - -#ifdef _WIN32 -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN 1 -#endif -#include -#endif - // Lookup tables for converting from unsigned char formats. ALIGN_64BYTE const unsigned char to_srgb8_table[256] = { 0x00, 0x0d, 0x16, 0x1c, 0x22, 0x26, 0x2a, @@ -119,9 +108,20 @@ has_sse2_sRGB_encode() { return true; } -#else +#elif defined(__i386__) || defined(_M_IX86) // SSE2 support not guaranteed. Use a runtime detection mechanism. +#ifdef __GNUC__ +#include +#endif + +#ifdef _WIN32 +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif +#include +#endif + bool has_sse2_sRGB_encode() { #if defined(__GNUC__) @@ -162,4 +162,12 @@ has_sse2_sRGB_encode() { return has_support; } +#else +// Other architectures don't support SSE2 at all. + +bool +has_sse2_sRGB_encode() { + return false; +} + #endif // __SSE2__ diff --git a/panda/src/pnmimage/convert_srgb.h b/panda/src/pnmimage/convert_srgb.h index 6d59019d84..a28c126402 100644 --- a/panda/src/pnmimage/convert_srgb.h +++ b/panda/src/pnmimage/convert_srgb.h @@ -22,9 +22,9 @@ // The below functions can encode and decode sRGB colors in various // representations. Some of them are implemented using look-up tables, // some others using SSE2 intrinsics. -extern EXPCL_PANDA_PNMIMAGE const unsigned char to_srgb8_table[256]; -extern EXPCL_PANDA_PNMIMAGE const unsigned char to_linear_uchar_table[256]; -extern EXPCL_PANDA_PNMIMAGE const float to_linear_float_table[256]; +extern EXPCL_PANDA_PNMIMAGE ALIGN_64BYTE const unsigned char to_srgb8_table[256]; +extern EXPCL_PANDA_PNMIMAGE ALIGN_64BYTE const unsigned char to_linear_uchar_table[256]; +extern EXPCL_PANDA_PNMIMAGE ALIGN_64BYTE const float to_linear_float_table[256]; EXPCL_PANDA_PNMIMAGE CONSTEXPR float decode_sRGB_float(unsigned char val); EXPCL_PANDA_PNMIMAGE INLINE float decode_sRGB_float(float val); diff --git a/panda/src/pnmimage/pfmFile.cxx b/panda/src/pnmimage/pfmFile.cxx index 2a756faaff..071985a4d6 100644 --- a/panda/src/pnmimage/pfmFile.cxx +++ b/panda/src/pnmimage/pfmFile.cxx @@ -346,7 +346,7 @@ load(const PNMImage &pnmimage) { for (int yi = 0; yi < pnmimage.get_y_size(); ++yi) { for (int xi = 0; xi < pnmimage.get_x_size(); ++xi) { PN_float32 *point = &_table[(yi * _x_size + xi) * _num_channels]; - LRGBColord xel = pnmimage.get_xel(xi, yi); + LRGBColorf xel = pnmimage.get_xel(xi, yi); point[0] = xel[0]; point[1] = xel[1]; point[2] = xel[2]; @@ -360,11 +360,11 @@ load(const PNMImage &pnmimage) { for (int yi = 0; yi < pnmimage.get_y_size(); ++yi) { for (int xi = 0; xi < pnmimage.get_x_size(); ++xi) { PN_float32 *point = &_table[(yi * _x_size + xi) * _num_channels]; - LRGBColord xel = pnmimage.get_xel(xi, yi); + LColorf xel = pnmimage.get_xel_a(xi, yi); point[0] = xel[0]; point[1] = xel[1]; point[2] = xel[2]; - point[3] = pnmimage.get_alpha(xi, yi); + point[3] = xel[3]; } } } @@ -431,8 +431,7 @@ store(PNMImage &pnmimage) const { for (int yi = 0; yi < get_y_size(); ++yi) { for (int xi = 0; xi < get_x_size(); ++xi) { const LPoint4f &point = get_point4(xi, yi); - pnmimage.set_xel(xi, yi, point[0], point[1], point[2]); - pnmimage.set_alpha(xi, yi, point[3]); + pnmimage.set_xel_a(xi, yi, point[0], point[1], point[2], point[3]); } } } @@ -1584,8 +1583,8 @@ clear_to_texcoords(int x_size, int y_size) { // the number of points affected. //////////////////////////////////////////////////////////////////// int PfmFile:: -pull_spot(const LPoint4f &delta, double xc, double yc, - double xr, double yr, double exponent) { +pull_spot(const LPoint4f &delta, float xc, float yc, + float xr, float yr, float exponent) { int minx = max((int)cceil(xc - xr), 0); int maxx = min((int)cfloor(xc + xr), _x_size - 1); int miny = max((int)cceil(yc - yr), 0); @@ -1594,13 +1593,13 @@ pull_spot(const LPoint4f &delta, double xc, double yc, int count = 0; for (int yi = miny; yi <= maxy; ++yi) { for (int xi = minx; xi <= maxx; ++xi) { - double xd = ((double)xi - xc) / xr; - double yd = ((double)yi - yc) / yr; - double r2 = xd * xd + yd * yd; - if (r2 >= 1.0) { + float xd = ((float)xi - xc) / xr; + float yd = ((float)yi - yc) / yr; + float r2 = xd * xd + yd * yd; + if (r2 >= 1.0f) { continue; } - PN_float32 t = (PN_float32)pow(1.0 - sqrt(r2), exponent); + PN_float32 t = (PN_float32)cpow(1.0f - csqrt(r2), exponent); PN_float32 *f = &_table[(yi * _x_size + xi) * _num_channels]; for (int ci = 0; ci < _num_channels; ++ci) { @@ -1612,7 +1611,7 @@ pull_spot(const LPoint4f &delta, double xc, double yc, return count; } - + //////////////////////////////////////////////////////////////////// // Function: PfmFile::calc_tight_bounds // Access: Published @@ -1634,7 +1633,7 @@ calc_tight_bounds(LPoint3f &min_point, LPoint3f &max_point) const { if (!has_point(xi, yi)) { continue; } - + const LPoint3f &point = get_point(xi, yi); if (!found_any) { min_point = point; @@ -1955,7 +1954,7 @@ copy_sub_image(const PfmFile ©, int xto, int yto, void PfmFile:: add_sub_image(const PfmFile ©, int xto, int yto, int xfrom, int yfrom, int x_size, int y_size, - double pixel_scale) { + float pixel_scale) { int xmin, ymin, xmax, ymax; setup_sub_image(copy, xto, yto, xfrom, yfrom, x_size, y_size, xmin, ymin, xmax, ymax); @@ -2022,7 +2021,7 @@ add_sub_image(const PfmFile ©, int xto, int yto, void PfmFile:: mult_sub_image(const PfmFile ©, int xto, int yto, int xfrom, int yfrom, int x_size, int y_size, - double pixel_scale) { + float pixel_scale) { int xmin, ymin, xmax, ymax; setup_sub_image(copy, xto, yto, xfrom, yfrom, x_size, y_size, xmin, ymin, xmax, ymax); @@ -2076,7 +2075,7 @@ mult_sub_image(const PfmFile ©, int xto, int yto, } } break; - } + } } //////////////////////////////////////////////////////////////////// @@ -2084,13 +2083,13 @@ mult_sub_image(const PfmFile ©, int xto, int yto, // Access: Published // Description: Behaves like copy_sub_image(), except the copy pixels // are divided into the pixels of the destination, after -// scaling by the specified pixel_scale. +// scaling by the specified pixel_scale. // dest(x, y) = dest(x, y) / (copy(x, y) * pixel_scale). //////////////////////////////////////////////////////////////////// void PfmFile:: divide_sub_image(const PfmFile ©, int xto, int yto, int xfrom, int yfrom, int x_size, int y_size, - double pixel_scale) { + float pixel_scale) { int xmin, ymin, xmax, ymax; setup_sub_image(copy, xto, yto, xfrom, yfrom, x_size, y_size, xmin, ymin, xmax, ymax); @@ -2156,7 +2155,7 @@ divide_sub_image(const PfmFile ©, int xto, int yto, } } break; - } + } } //////////////////////////////////////////////////////////////////// @@ -2166,7 +2165,7 @@ divide_sub_image(const PfmFile ©, int xto, int yto, // a constant floating-point multiplier value. //////////////////////////////////////////////////////////////////// void PfmFile:: -operator *= (double multiplier) { +operator *= (float multiplier) { nassertv(is_valid()); switch (_num_channels) { diff --git a/panda/src/pnmimage/pfmFile.h b/panda/src/pnmimage/pfmFile.h index d08ebaf17e..0249b71331 100644 --- a/panda/src/pnmimage/pfmFile.h +++ b/panda/src/pnmimage/pfmFile.h @@ -112,8 +112,8 @@ PUBLISHED: INLINE const LPoint4f &get_no_data_value() const; BLOCKING void resize(int new_x_size, int new_y_size); - BLOCKING void box_filter_from(double radius, const PfmFile ©); - BLOCKING void gaussian_filter_from(double radius, const PfmFile ©); + BLOCKING void box_filter_from(float radius, const PfmFile ©); + BLOCKING void gaussian_filter_from(float radius, const PfmFile ©); BLOCKING void quick_filter_from(const PfmFile ©); BLOCKING void reverse_rows(); @@ -128,8 +128,8 @@ PUBLISHED: BLOCKING void apply_crop(int x_begin, int x_end, int y_begin, int y_end); BLOCKING void clear_to_texcoords(int x_size, int y_size); - BLOCKING int pull_spot(const LPoint4f &delta, double xc, double yc, - double xr, double yr, double exponent); + BLOCKING int pull_spot(const LPoint4f &delta, float xc, float yc, + float xr, float yr, float exponent); bool calc_tight_bounds(LPoint3f &min_point, LPoint3f &max_point) const; BLOCKING PT(BoundingHexahedron) compute_planar_bounds(const LPoint2f ¢er, PN_float32 point_dist, PN_float32 sample_radius, bool points_only) const; @@ -143,17 +143,17 @@ PUBLISHED: void add_sub_image(const PfmFile ©, int xto, int yto, int xfrom = 0, int yfrom = 0, int x_size = -1, int y_size = -1, - double pixel_scale = 1.0); + float pixel_scale = 1.0); void mult_sub_image(const PfmFile ©, int xto, int yto, int xfrom = 0, int yfrom = 0, int x_size = -1, int y_size = -1, - double pixel_scale = 1.0); + float pixel_scale = 1.0); void divide_sub_image(const PfmFile ©, int xto, int yto, int xfrom = 0, int yfrom = 0, int x_size = -1, int y_size = -1, - double pixel_scale = 1.0); + float pixel_scale = 1.0); - void operator *= (double multiplier); + void operator *= (float multiplier); void output(ostream &out) const; diff --git a/panda/src/pnmimage/pnm-image-filter-core.cxx b/panda/src/pnmimage/pnm-image-filter-core.cxx index c9817da095..af918a8c2c 100644 --- a/panda/src/pnmimage/pnm-image-filter-core.cxx +++ b/panda/src/pnmimage/pnm-image-filter-core.cxx @@ -19,7 +19,7 @@ static void FUNCTION_NAME(IMAGETYPE &dest, const IMAGETYPE &source, - double width, FilterFunction *make_filter, int channel) { + float width, FilterFunction *make_filter, int channel) { if (!dest.is_valid() || !source.is_valid()) { return; } @@ -38,15 +38,15 @@ FUNCTION_NAME(IMAGETYPE &dest, const IMAGETYPE &source, } // First, scale the image in the A direction. - double scale; + float scale; StoreType *temp_source, *temp_dest; - scale = (double)dest.ASIZE() / (double)source.ASIZE(); + scale = (float)dest.ASIZE() / (float)source.ASIZE(); temp_source = (StoreType *)PANDA_MALLOC_ARRAY(source.ASIZE() * sizeof(StoreType)); temp_dest = (StoreType *)PANDA_MALLOC_ARRAY(dest.ASIZE() * sizeof(StoreType)); WorkType *filter; - double filter_width; + float filter_width; make_filter(scale, width, filter, filter_width); @@ -70,7 +70,7 @@ FUNCTION_NAME(IMAGETYPE &dest, const IMAGETYPE &source, PANDA_FREE_ARRAY(filter); // Now, scale the image in the B direction. - scale = (double)dest.BSIZE() / (double)source.BSIZE(); + scale = (float)dest.BSIZE() / (float)source.BSIZE(); temp_dest = (StoreType *)PANDA_MALLOC_ARRAY(dest.BSIZE() * sizeof(StoreType)); make_filter(scale, width, filter, filter_width); @@ -82,7 +82,7 @@ FUNCTION_NAME(IMAGETYPE &dest, const IMAGETYPE &source, filter, filter_width); for (b = 0; b < dest.BSIZE(); b++) { - dest.SETVAL(a, b, channel, (double)temp_dest[b]/(double)source_max); + dest.SETVAL(a, b, channel, (float)temp_dest[b]/(float)source_max); } } diff --git a/panda/src/pnmimage/pnm-image-filter-sparse-core.cxx b/panda/src/pnmimage/pnm-image-filter-sparse-core.cxx index 9201ca9ee7..70e1514c07 100755 --- a/panda/src/pnmimage/pnm-image-filter-sparse-core.cxx +++ b/panda/src/pnmimage/pnm-image-filter-sparse-core.cxx @@ -19,7 +19,7 @@ static void FUNCTION_NAME(IMAGETYPE &dest, const IMAGETYPE &source, - double width, FilterFunction *make_filter, int channel) { + float width, FilterFunction *make_filter, int channel) { if (!dest.is_valid() || !source.is_valid()) { return; } @@ -40,17 +40,17 @@ FUNCTION_NAME(IMAGETYPE &dest, const IMAGETYPE &source, } // First, scale the image in the A direction. - double scale; + float scale; StoreType *temp_source, *temp_source_weight, *temp_dest, *temp_dest_weight; - scale = (double)dest.ASIZE() / (double)source.ASIZE(); + scale = (float)dest.ASIZE() / (float)source.ASIZE(); temp_source = (StoreType *)PANDA_MALLOC_ARRAY(source.ASIZE() * sizeof(StoreType)); temp_source_weight = (StoreType *)PANDA_MALLOC_ARRAY(source.ASIZE() * sizeof(StoreType)); temp_dest = (StoreType *)PANDA_MALLOC_ARRAY(dest.ASIZE() * sizeof(StoreType)); temp_dest_weight = (StoreType *)PANDA_MALLOC_ARRAY(dest.ASIZE() * sizeof(StoreType)); WorkType *filter; - double filter_width; + float filter_width; make_filter(scale, width, filter, filter_width); @@ -81,7 +81,7 @@ FUNCTION_NAME(IMAGETYPE &dest, const IMAGETYPE &source, PANDA_FREE_ARRAY(filter); // Now, scale the image in the B direction. - scale = (double)dest.BSIZE() / (double)source.BSIZE(); + scale = (float)dest.BSIZE() / (float)source.BSIZE(); temp_dest = (StoreType *)PANDA_MALLOC_ARRAY(dest.BSIZE() * sizeof(StoreType)); temp_dest_weight = (StoreType *)PANDA_MALLOC_ARRAY(dest.BSIZE() * sizeof(StoreType)); @@ -95,7 +95,7 @@ FUNCTION_NAME(IMAGETYPE &dest, const IMAGETYPE &source, for (b = 0; b < dest.BSIZE(); b++) { if (temp_dest_weight[b] != 0) { - dest.SETVAL(a, b, channel, (double)temp_dest[b]/(double)source_max); + dest.SETVAL(a, b, channel, (float)temp_dest[b]/(float)source_max); } } } diff --git a/panda/src/pnmimage/pnm-image-filter.cxx b/panda/src/pnmimage/pnm-image-filter.cxx index 0de628050a..0e304e33f8 100644 --- a/panda/src/pnmimage/pnm-image-filter.cxx +++ b/panda/src/pnmimage/pnm-image-filter.cxx @@ -65,19 +65,19 @@ // use shorts, and not very much to use chars. // To use double-precision floating point, 8 bytes: (strictly for the neurotic) +/* typedef double WorkType; typedef double StoreType; static const WorkType source_max = 1.0; static const WorkType filter_max = 1.0; - -/* -// To use single-precision floating point, 4 bytes: -typedef double WorkType; -typedef float StoreType; -static const WorkType source_max = 1.0; -static const WorkType filter_max = 1.0; */ +// To use single-precision floating point, 4 bytes: +typedef float WorkType; +typedef float StoreType; +static const WorkType source_max = 1.0f; +static const WorkType filter_max = 1.0f; + /* // To use 16-bit integer arithmetic, 2 bytes: typedef unsigned long WorkType; @@ -94,8 +94,6 @@ static const WorkType source_max = 255; static const WorkType filter_max = 255; */ - - // filter_row() filters a single row by convolving with a one-dimensional // kernel filter. The kernel is defined by an array of weights in filter[], // where the ith element of filter corresponds to abs(d * scale), if scale>1.0, @@ -109,17 +107,17 @@ static const WorkType filter_max = 255; static void filter_row(StoreType dest[], int dest_len, const StoreType source[], int source_len, - double scale, // == dest_len / source_len + float scale, // == dest_len / source_len const WorkType filter[], - double filter_width) { + float filter_width) { // If we are expanding the row (scale > 1.0), we need to look at a // fractional granularity. Hence, we scale our filter index by // scale. If we are compressing (scale < 1.0), we don't need to // fiddle with the filter index, so we leave it at one. - double iscale; - if (scale < 1.0) { - iscale = 1.0; + float iscale; + if (scale < 1.0f) { + iscale = 1.0f; filter_width /= scale; } else { iscale = scale; @@ -127,7 +125,7 @@ filter_row(StoreType dest[], int dest_len, for (int dest_x = 0; dest_x < dest_len; dest_x++) { // The additional offset of 0.5 keeps the pixel centered. - double center = (dest_x + 0.5) / scale - 0.5; + float center = (dest_x + 0.5f) / scale - 0.5f; // left and right are the starting and ending ranges of the radius of // interest of the filter function. We need to apply the filter to each @@ -148,13 +146,13 @@ filter_row(StoreType dest[], int dest_len, // of center--so we don't have to incur the overhead of calling fabs() // each time through the loop. for (source_x = left; source_x < right_center; source_x++) { - index = (int)(iscale * (center - source_x) + 0.5); + index = (int)(iscale * (center - source_x) + 0.5f); net_value += filter[index] * source[source_x]; net_weight += filter[index]; } for (; source_x <= right; source_x++) { - index = (int)(iscale * (source_x - center) + 0.5); + index = (int)(iscale * (source_x - center) + 0.5f); net_value += filter[index] * source[source_x]; net_weight += filter[index]; } @@ -173,15 +171,15 @@ filter_row(StoreType dest[], int dest_len, static void filter_sparse_row(StoreType dest[], StoreType dest_weight[], int dest_len, const StoreType source[], const StoreType source_weight[], int source_len, - double scale, // == dest_len / source_len + float scale, // == dest_len / source_len const WorkType filter[], - double filter_width) { + float filter_width) { // If we are expanding the row (scale > 1.0), we need to look at a // fractional granularity. Hence, we scale our filter index by // scale. If we are compressing (scale < 1.0), we don't need to // fiddle with the filter index, so we leave it at one. - double iscale; + float iscale; if (scale < 1.0) { iscale = 1.0; filter_width /= scale; @@ -191,7 +189,7 @@ filter_sparse_row(StoreType dest[], StoreType dest_weight[], int dest_len, for (int dest_x = 0; dest_x < dest_len; dest_x++) { // The additional offset of 0.5 keeps the pixel centered. - double center = (dest_x + 0.5) / scale - 0.5; + float center = (dest_x + 0.5f) / scale - 0.5f; // left and right are the starting and ending ranges of the radius of // interest of the filter function. We need to apply the filter to each @@ -212,13 +210,13 @@ filter_sparse_row(StoreType dest[], StoreType dest_weight[], int dest_len, // of center--so we don't have to incur the overhead of calling fabs() // each time through the loop. for (source_x = left; source_x < right_center; source_x++) { - index = (int)(iscale * (center - source_x) + 0.5); + index = (int)(iscale * (center - source_x) + 0.5f); net_value += filter[index] * source[source_x] * source_weight[source_x]; net_weight += filter[index] * source_weight[source_x]; } for (; source_x <= right; source_x++) { - index = (int)(iscale * (source_x - center) + 0.5); + index = (int)(iscale * (source_x - center) + 0.5f); net_value += filter[index] * source[source_x] * source_weight[source_x]; net_weight += filter[index] * source_weight[source_x]; } @@ -244,13 +242,13 @@ filter_sparse_row(StoreType dest[], StoreType dest_weight[], int dest_len, // 0..filter_max; the array must have enough elements to include all indices // corresponding to values in the range -filter_width to filter_width. -typedef void FilterFunction(double scale, double width, - WorkType *&filter, double &filter_width); +typedef void FilterFunction(float scale, float width, + WorkType *&filter, float &filter_width); static void -box_filter_impl(double scale, double width, - WorkType *&filter, double &filter_width) { - double fscale; +box_filter_impl(float scale, float width, + WorkType *&filter, float &filter_width) { + float fscale; if (scale < 1.0) { // If we are compressing the image, we want to expand the range of // the filter function to prevent dropping below the Nyquist rate. @@ -274,9 +272,9 @@ box_filter_impl(double scale, double width, } static void -gaussian_filter_impl(double scale, double width, - WorkType *&filter, double &filter_width) { - double fscale; +gaussian_filter_impl(float scale, float width, + WorkType *&filter, float &filter_width) { + float fscale; if (scale < 1.0) { // If we are compressing the image, we want to expand the range of // the filter function to prevent dropping below the Nyquist rate. @@ -290,7 +288,7 @@ gaussian_filter_impl(double scale, double width, fscale = scale; } - double sigma = width/2; + float sigma = width/2; filter_width = 3.0 * sigma; int actual_width = (int)cceil((filter_width + 1) * fscale); @@ -301,10 +299,10 @@ gaussian_filter_impl(double scale, double width, // so we can ignore the y^2.) filter = (WorkType *)PANDA_MALLOC_ARRAY(actual_width * sizeof(WorkType)); - double div = 2 * sigma * sigma; + float div = 2 * sigma * sigma; for (int i = 0; i < actual_width; i++) { - double x = i / fscale; + float x = i / fscale; filter[i] = (WorkType)(filter_max * exp(-x*x / div)); // The highest value of the exp function in this range is always 1.0, // at index value 0. Thus, we scale the whole range by filter_max, @@ -485,7 +483,7 @@ gaussian_filter_impl(double scale, double width, // another. Both images can be the same with no ill effects. static void filter_image(PNMImage &dest, const PNMImage &source, - double width, FilterFunction *make_filter) { + float width, FilterFunction *make_filter) { // We want to scale by the smallest destination axis first, for a // slight performance gain. @@ -523,8 +521,6 @@ filter_image(PNMImage &dest, const PNMImage &source, } } - - //////////////////////////////////////////////////////////////////// // Function: PNMImage::box_filter_from // Access: Public @@ -535,7 +531,7 @@ filter_image(PNMImage &dest, const PNMImage &source, // appropriate filter to perform the stretching. //////////////////////////////////////////////////////////////////// void PNMImage:: -box_filter_from(double width, const PNMImage ©) { +box_filter_from(float width, const PNMImage ©) { filter_image(*this, copy, width, &box_filter_impl); } @@ -549,7 +545,7 @@ box_filter_from(double width, const PNMImage ©) { // appropriate filter to perform the stretching. //////////////////////////////////////////////////////////////////// void PNMImage:: -gaussian_filter_from(double width, const PNMImage ©) { +gaussian_filter_from(float width, const PNMImage ©) { filter_image(*this, copy, width, &gaussian_filter_impl); } @@ -624,7 +620,7 @@ gaussian_filter_from(double width, const PNMImage ©) { // another. Both images can be the same with no ill effects. static void filter_image(PfmFile &dest, const PfmFile &source, - double width, FilterFunction *make_filter) { + float width, FilterFunction *make_filter) { int num_channels = min(dest.get_num_channels(), source.get_num_channels()); if (source.has_no_data_value()) { @@ -654,8 +650,6 @@ filter_image(PfmFile &dest, const PfmFile &source, } } - - //////////////////////////////////////////////////////////////////// // Function: PfmFile::box_filter_from // Access: Public @@ -666,7 +660,7 @@ filter_image(PfmFile &dest, const PfmFile &source, // appropriate filter to perform the stretching. //////////////////////////////////////////////////////////////////// void PfmFile:: -box_filter_from(double width, const PfmFile ©) { +box_filter_from(float width, const PfmFile ©) { filter_image(*this, copy, width, &box_filter_impl); } @@ -680,99 +674,86 @@ box_filter_from(double width, const PfmFile ©) { // appropriate filter to perform the stretching. //////////////////////////////////////////////////////////////////// void PfmFile:: -gaussian_filter_from(double width, const PfmFile ©) { +gaussian_filter_from(float width, const PfmFile ©) { filter_image(*this, copy, width, &gaussian_filter_impl); } - // // The following functions are support for quick_box_filter(). // -INLINE void -box_filter_xel(const PNMImage &image, - int x, int y, double x_contrib, double y_contrib, - double &red, double &grn, double &blu, double &alpha, - double &pixel_count) { - double contrib = x_contrib * y_contrib; - red += image.get_red_val(x, y) * contrib; - grn += image.get_green_val(x, y) * contrib; - blu += image.get_blue_val(x, y) * contrib; - if (image.has_alpha()) { - alpha += image.get_alpha_val(x, y) * contrib; - } +static INLINE void +box_filter_xel(const PNMImage &img, + int x, int y, float x_contrib, float y_contrib, + LColorf &color, float &pixel_count) { + float contrib = x_contrib * y_contrib; + color += img.get_xel_a(x, y) * contrib; pixel_count += contrib; } - -INLINE void +static INLINE void box_filter_line(const PNMImage &image, - double x0, int y, double x1, double y_contrib, - double &red, double &grn, double &blu, double &alpha, - double &pixel_count) { + float x0, int y, float x1, float y_contrib, + LColorf &color, float &pixel_count) { int x = (int)x0; // Get the first (partial) xel - box_filter_xel(image, x, y, (double)(x+1)-x0, y_contrib, - red, grn, blu, alpha, pixel_count); + box_filter_xel(image, x, y, (float)(x+1)-x0, y_contrib, + color, pixel_count); int x_last = (int)x1; if (x < x_last) { x++; while (x < x_last) { // Get each consecutive (complete) xel - box_filter_xel(image, x, y, 1.0, y_contrib, - red, grn, blu, alpha, pixel_count); + box_filter_xel(image, x, y, 1.0f, y_contrib, + color, pixel_count); x++; } // Get the final (partial) xel - double x_contrib = x1 - (double)x_last; - if (x_contrib > 0.0001) { + float x_contrib = x1 - (float)x_last; + if (x_contrib > 0.0001f) { box_filter_xel(image, x, y, x_contrib, y_contrib, - red, grn, blu, alpha, pixel_count); + color, pixel_count); } } } -static void +static LColorf box_filter_region(const PNMImage &image, - double x0, double y0, double x1, double y1, - xel &result, xelval &alpha_result) { - double red = 0.0, grn = 0.0, blu = 0.0, alpha = 0.0; - double pixel_count = 0.0; + float x0, float y0, float x1, float y1) { + LColorf color = LColorf::zero(); + float pixel_count = 0.0f; - assert(y0 >=0 && y1 >=0); + assert(y0 >= 0 && y1 >= 0); int y = (int)y0; // Get the first (partial) row - box_filter_line(image, x0, y, x1, (double)(y+1)-y0, - red, grn, blu, alpha, pixel_count); + box_filter_line(image, x0, y, x1, (float)(y+1)-y0, + color, pixel_count); int y_last = (int)y1; if (y < y_last) { y++; while (y < y_last) { // Get each consecutive (complete) row - box_filter_line(image, x0, y, x1, 1.0, - red, grn, blu, alpha, pixel_count); + box_filter_line(image, x0, y, x1, 1.0f, + color, pixel_count); y++; } // Get the final (partial) row - double y_contrib = y1 - (double)y_last; - if (y_contrib > 0.0001) { + float y_contrib = y1 - (float)y_last; + if (y_contrib > 0.0001f) { box_filter_line(image, x0, y, x1, y_contrib, - red, grn, blu, alpha, pixel_count); + color, pixel_count); } } - PPM_ASSIGN(result, - (xelval)(red / pixel_count + 0.5), - (xelval)(grn / pixel_count + 0.5), - (xelval)(blu / pixel_count + 0.5)); - - alpha_result = (xelval)(alpha / pixel_count + 0.5); + //cerr << pixel_count << "\n"; + color /= pixel_count; + return color; } //////////////////////////////////////////////////////////////////// @@ -798,11 +779,13 @@ quick_filter_from(const PNMImage &from, int xborder, int yborder) { int to_xoff = xborder / 2; int to_yoff = yborder / 2; - double from_x0, from_x1, from_y0, from_y1; + float from_x0, from_x1, from_y0, from_y1; int to_x, to_y; - double x_scale = (double)from_xs / (double)to_xs; - double y_scale = (double)from_ys / (double)to_ys; + float x_scale = (float)from_xs / (float)to_xs; + float y_scale = (float)from_ys / (float)to_ys; + + LColorf color; from_y0 = max(0, -to_yoff) * y_scale; for (to_y = max(0, -to_yoff); @@ -818,14 +801,10 @@ quick_filter_from(const PNMImage &from, int xborder, int yborder) { // Now the box from (from_x0, from_y0) - (from_x1, from_y1) // but not including (from_x1, from_y1) maps to the pixel (to_x, to_y). - xelval alpha_result; - box_filter_region(from, - from_x0, from_y0, from_x1, from_y1, - (*this)[to_yoff + to_y][to_xoff + to_x], - alpha_result); - if (has_alpha()) { - set_alpha_val(to_xoff+to_x, to_yoff+to_y, alpha_result); - } + color = box_filter_region(from, + from_x0, from_y0, from_x1, from_y1); + + set_xel_a(to_xoff + to_x, to_yoff + to_y, color); from_x0 = from_x1; } diff --git a/panda/src/pnmimage/pnmBrush.I b/panda/src/pnmimage/pnmBrush.I index af74b64151..0bc457d58e 100644 --- a/panda/src/pnmimage/pnmBrush.I +++ b/panda/src/pnmimage/pnmBrush.I @@ -19,7 +19,7 @@ // Description: //////////////////////////////////////////////////////////////////// INLINE PNMBrush:: -PNMBrush(double xc, double yc) : _xc(xc), _yc(yc) { +PNMBrush(float xc, float yc) : _xc(xc), _yc(yc) { } //////////////////////////////////////////////////////////////////// @@ -31,7 +31,7 @@ PNMBrush(double xc, double yc) : _xc(xc), _yc(yc) { // (1.0, 1.0); for a centered three-pixel brush, this // will be (1.5, 1.5); and so on. //////////////////////////////////////////////////////////////////// -INLINE double PNMBrush:: +INLINE float PNMBrush:: get_xc() const { return _xc; } @@ -45,7 +45,7 @@ get_xc() const { // (1.0, 1.0); for a centered three-pixel brush, this // will be (1.5, 1.5); and so on. //////////////////////////////////////////////////////////////////// -INLINE double PNMBrush:: +INLINE float PNMBrush:: get_yc() const { return _yc; } diff --git a/panda/src/pnmimage/pnmBrush.cxx b/panda/src/pnmimage/pnmBrush.cxx index d6105c030f..cc9d41aeae 100644 --- a/panda/src/pnmimage/pnmBrush.cxx +++ b/panda/src/pnmimage/pnmBrush.cxx @@ -20,10 +20,10 @@ // A PNMTransparentBrush doesn't draw or fill anything. class EXPCL_PANDA_PNMIMAGE PNMTransparentBrush : public PNMBrush { public: - PNMTransparentBrush() : + PNMTransparentBrush() : PNMBrush(0.0, 0.0) { } - virtual void draw(PNMImage &, int, int, double) { + virtual void draw(PNMImage &, int, int, float) { } virtual void fill(PNMImage &, int, int, int, int, int) { @@ -33,26 +33,22 @@ public: // A PNMPixelBrush is a family of brushes that draw one pixel at a time. class EXPCL_PANDA_PNMIMAGE PNMPixelBrush : public PNMBrush { protected: - PNMPixelBrush(const LColord &color) : - PNMBrush(0.5, 0.5), _rgb(color[0], color[1], color[2]), _a(color[3]) { } + PNMPixelBrush(const LColorf &color) : + PNMBrush(0.5, 0.5), _color(color) { } - LRGBColord _rgb; - double _a; + LColorf _color; }; // Arbitrarily sets the pixel to a particular color, with no antialiasing. class EXPCL_PANDA_PNMIMAGE PNMSetPixelBrush : public PNMPixelBrush { public: - PNMSetPixelBrush(const LColord &color) : PNMPixelBrush(color) { } + PNMSetPixelBrush(const LColorf &color) : PNMPixelBrush(color) { } - virtual void draw(PNMImage &image, int x, int y, double pixel_scale) { - if (x >= 0 && x < image.get_x_size() && + virtual void draw(PNMImage &image, int x, int y, float pixel_scale) { + if (x >= 0 && x < image.get_x_size() && y >= 0 && y < image.get_y_size() && pixel_scale >= 0.5) { - image.set_xel(x, y, _rgb); - if (image.has_alpha()) { - image.set_alpha(x, y, _a); - } + image.set_xel_a(x, y, _color); } } @@ -62,12 +58,7 @@ public: xfrom = max(xfrom, 0); xto = min(xto, image.get_x_size() - 1); for (int x = xfrom; x <= xto; ++x) { - image.set_xel(x, y, _rgb); - } - if (image.has_alpha()) { - for (int x = xfrom; x <= xto; ++x) { - image.set_alpha(x, y, _a); - } + image.set_xel_a(x, y, _color); } } } @@ -76,12 +67,12 @@ public: // Blends the pixel in to the existing background. class EXPCL_PANDA_PNMIMAGE PNMBlendPixelBrush : public PNMPixelBrush { public: - PNMBlendPixelBrush(const LColord &color) : PNMPixelBrush(color) { } + PNMBlendPixelBrush(const LColorf &color) : PNMPixelBrush(color) { } - virtual void draw(PNMImage &image, int x, int y, double pixel_scale) { + virtual void draw(PNMImage &image, int x, int y, float pixel_scale) { if (x >= 0 && x < image.get_x_size() && y >= 0 && y < image.get_y_size()) { - image.blend(x, y, _rgb, _a * pixel_scale); + image.blend(x, y, _color[0], _color[1], _color[2], _color[3] * pixel_scale); } } @@ -91,7 +82,7 @@ public: xfrom = max(xfrom, 0); xto = min(xto, image.get_x_size() - 1); for (int x = xfrom; x <= xto; ++x) { - image.blend(x, y, _rgb, _a); + image.blend(x, y, _color[0], _color[1], _color[2], _color[3]); } } } @@ -100,22 +91,14 @@ public: // Darkens the pixel in the existing background. class EXPCL_PANDA_PNMIMAGE PNMDarkenPixelBrush : public PNMPixelBrush { public: - PNMDarkenPixelBrush(const LColord &color) : PNMPixelBrush(color) { } + PNMDarkenPixelBrush(const LColorf &color) : PNMPixelBrush(color) { } - virtual void draw(PNMImage &image, int x, int y, double pixel_scale) { - if (x >= 0 && x < image.get_x_size() && + virtual void draw(PNMImage &image, int x, int y, float pixel_scale) { + if (x >= 0 && x < image.get_x_size() && y >= 0 && y < image.get_y_size()) { - LRGBColord rgb = image.get_xel(x, y); - LRGBColord p; - p.set(min(1.0 - (1.0 - _rgb[0]) * pixel_scale, rgb[0]), - min(1.0 - (1.0 - _rgb[1]) * pixel_scale, rgb[1]), - min(1.0 - (1.0 - _rgb[2]) * pixel_scale, rgb[2])); - image.set_xel(x, y, p); - if (image.has_alpha()) { - double a = image.get_alpha(x, y); - image.set_alpha(x, y, min(1.0 - (1.0 - _a) * pixel_scale, a)); - } + LColorf p = (_color - 1.0f) * pixel_scale + 1.0f; + image.set_xel_a(x, y, p.fmin(image.get_xel_a(x, y))); } } @@ -125,18 +108,7 @@ public: xfrom = max(xfrom, 0); xto = min(xto, image.get_x_size() - 1); for (int x = xfrom; x <= xto; ++x) { - LRGBColord rgb = image.get_xel(x, y); - LRGBColord p; - p.set(min(_rgb[0], rgb[0]), - min(_rgb[1], rgb[1]), - min(_rgb[2], rgb[2])); - image.set_xel(x, y, p); - } - if (image.has_alpha()) { - for (int x = xfrom; x <= xto; ++x) { - double a = image.get_alpha(x, y); - image.set_alpha(x, y, min(_a, a)); - } + image.set_xel_a(x, y, _color.fmin(image.get_xel_a(x, y))); } } } @@ -145,22 +117,13 @@ public: // Lightens the pixel in the existing background. class EXPCL_PANDA_PNMIMAGE PNMLightenPixelBrush : public PNMPixelBrush { public: - PNMLightenPixelBrush(const LColord &color) : PNMPixelBrush(color) { } + PNMLightenPixelBrush(const LColorf &color) : PNMPixelBrush(color) { } - virtual void draw(PNMImage &image, int x, int y, double pixel_scale) { - if (x >= 0 && x < image.get_x_size() && + virtual void draw(PNMImage &image, int x, int y, float pixel_scale) { + if (x >= 0 && x < image.get_x_size() && y >= 0 && y < image.get_y_size()) { - LRGBColord rgb = image.get_xel(x, y); - LRGBColord p; - p.set(max(_rgb[0] * pixel_scale, rgb[0]), - max(_rgb[1] * pixel_scale, rgb[1]), - max(_rgb[2] * pixel_scale, rgb[2])); - image.set_xel(x, y, p); - - if (image.has_alpha()) { - double a = image.get_alpha(x, y); - image.set_alpha(x, y, max(_a * pixel_scale, a)); - } + image.set_xel_a(x, y, + image.get_xel_a(x, y).fmax(_color * pixel_scale)); } } @@ -170,18 +133,8 @@ public: xfrom = max(xfrom, 0); xto = max(xto, image.get_x_size() - 1); for (int x = xfrom; x <= xto; ++x) { - LRGBColord rgb = image.get_xel(x, y); - LRGBColord p; - p.set(max(_rgb[0], rgb[0]), - max(_rgb[1], rgb[1]), - max(_rgb[2], rgb[2])); - image.set_xel(x, y, p); - } - if (image.has_alpha()) { - for (int x = xfrom; x <= xto; ++x) { - double a = image.get_alpha(x, y); - image.set_alpha(x, y, max(_a, a)); - } + image.set_xel_a(x, y, + image.get_xel_a(x, y).fmax(_color)); } } } @@ -190,9 +143,9 @@ public: // A PNMImageBrush is a family of brushes that draw an image at a time. class EXPCL_PANDA_PNMIMAGE PNMImageBrush : public PNMBrush { protected: - PNMImageBrush(const PNMImage &image, double xc, double yc) : + PNMImageBrush(const PNMImage &image, float xc, float yc) : PNMBrush(xc, yc), - _image(image) + _image(image) { } @@ -226,16 +179,16 @@ protected: // Sets the pixels from the rectangular image, with no antialiasing. class EXPCL_PANDA_PNMIMAGE PNMSetImageBrush : public PNMImageBrush { public: - PNMSetImageBrush(const PNMImage &image, double xc, double yc) : + PNMSetImageBrush(const PNMImage &image, float xc, float yc) : PNMImageBrush(image, xc, yc) { } - virtual void draw(PNMImage &image, int x, int y, double pixel_scale) { + virtual void draw(PNMImage &image, int x, int y, float pixel_scale) { if (pixel_scale >= 0.5) { image.copy_sub_image(_image, x, y); } } - virtual void do_scanline(PNMImage &image, int xto, int yto, + virtual void do_scanline(PNMImage &image, int xto, int yto, int xfrom, int yfrom, int x_size, int y_size) { image.copy_sub_image(_image, xto, yto, xfrom, yfrom, x_size, y_size); } @@ -244,14 +197,14 @@ public: // Blends the pixels in using alpha. class EXPCL_PANDA_PNMIMAGE PNMBlendImageBrush : public PNMImageBrush { public: - PNMBlendImageBrush(const PNMImage &image, double xc, double yc) : + PNMBlendImageBrush(const PNMImage &image, float xc, float yc) : PNMImageBrush(image, xc, yc) { } - virtual void draw(PNMImage &image, int x, int y, double pixel_scale) { + virtual void draw(PNMImage &image, int x, int y, float pixel_scale) { image.blend_sub_image(_image, x, y, 0, 0, -1, -1, pixel_scale); } - virtual void do_scanline(PNMImage &image, int xto, int yto, + virtual void do_scanline(PNMImage &image, int xto, int yto, int xfrom, int yfrom, int x_size, int y_size) { image.blend_sub_image(_image, xto, yto, xfrom, yfrom, x_size, y_size); } @@ -260,14 +213,14 @@ public: // Darkens the pixels class EXPCL_PANDA_PNMIMAGE PNMDarkenImageBrush : public PNMImageBrush { public: - PNMDarkenImageBrush(const PNMImage &image, double xc, double yc) : + PNMDarkenImageBrush(const PNMImage &image, float xc, float yc) : PNMImageBrush(image, xc, yc) { } - virtual void draw(PNMImage &image, int x, int y, double pixel_scale) { + virtual void draw(PNMImage &image, int x, int y, float pixel_scale) { image.darken_sub_image(_image, x, y, 0, 0, -1, -1, pixel_scale); } - virtual void do_scanline(PNMImage &image, int xto, int yto, + virtual void do_scanline(PNMImage &image, int xto, int yto, int xfrom, int yfrom, int x_size, int y_size) { image.darken_sub_image(_image, xto, yto, xfrom, yfrom, x_size, y_size); } @@ -276,14 +229,14 @@ public: // Lightens the pixels class EXPCL_PANDA_PNMIMAGE PNMLightenImageBrush : public PNMImageBrush { public: - PNMLightenImageBrush(const PNMImage &image, double xc, double yc) : + PNMLightenImageBrush(const PNMImage &image, float xc, float yc) : PNMImageBrush(image, xc, yc) { } - virtual void draw(PNMImage &image, int x, int y, double pixel_scale) { + virtual void draw(PNMImage &image, int x, int y, float pixel_scale) { image.lighten_sub_image(_image, x, y, 0, 0, -1, -1, pixel_scale); } - virtual void do_scanline(PNMImage &image, int xto, int yto, + virtual void do_scanline(PNMImage &image, int xto, int yto, int xfrom, int yfrom, int x_size, int y_size) { image.lighten_sub_image(_image, xto, yto, xfrom, yfrom, x_size, y_size); } @@ -292,7 +245,7 @@ public: //////////////////////////////////////////////////////////////////// // Function: PNMBrush::Destructor // Access: Published, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// PNMBrush:: ~PNMBrush() { @@ -309,7 +262,7 @@ PT(PNMBrush) PNMBrush:: make_transparent() { return new PNMTransparentBrush(); } - + //////////////////////////////////////////////////////////////////// // Function: PNMBrush::make_pixel // Access: Published, Static @@ -318,7 +271,7 @@ make_transparent() { // in an interior. //////////////////////////////////////////////////////////////////// PT(PNMBrush) PNMBrush:: -make_pixel(const LColord &color, PNMBrush::BrushEffect effect) { +make_pixel(const LColorf &color, PNMBrush::BrushEffect effect) { switch (effect) { case BE_set: return new PNMSetPixelBrush(color); @@ -346,9 +299,9 @@ make_pixel(const LColord &color, PNMBrush::BrushEffect effect) { // spot is fuzzy; otherwise, it is hard-edged. //////////////////////////////////////////////////////////////////// PT(PNMBrush) PNMBrush:: -make_spot(const LColord &color, double radius, bool fuzzy, +make_spot(const LColorf &color, float radius, bool fuzzy, BrushEffect effect) { - LColord bg; + LColorf bg; switch (effect) { case BE_set: @@ -356,7 +309,7 @@ make_spot(const LColord &color, double radius, bool fuzzy, break; case BE_blend: - bg.set(color[0], color[1], color[2], 0.0); + bg.set(color[0], color[1], color[2], 0.0f); break; case BE_darken: @@ -372,19 +325,19 @@ make_spot(const LColord &color, double radius, bool fuzzy, << "**Invalid BrushEffect (" << (int)effect << ")**\n"; } - int size = (int)cceil(radius * 2.0); - double half_size = (double)size * 0.5; + int size = (int)cceil(radius * 2.0f); + float half_size = (float)size * 0.5f; PNMImage spot(size, size, 4); - double r = half_size / radius; + float r = half_size / radius; if (fuzzy) { - spot.render_spot(color, bg, 0.0, r); + spot.render_spot(color, bg, 0.0f, r); } else { spot.render_spot(color, bg, r, r); } return make_image(spot, half_size, half_size, effect); } - + //////////////////////////////////////////////////////////////////// // Function: PNMBrush::make_image // Access: Published, Static @@ -397,7 +350,7 @@ make_spot(const LColord &color, double radius, bool fuzzy, // call. //////////////////////////////////////////////////////////////////// PT(PNMBrush) PNMBrush:: -make_image(const PNMImage &image, double xc, double yc, +make_image(const PNMImage &image, float xc, float yc, PNMBrush::BrushEffect effect) { switch (effect) { case BE_set: diff --git a/panda/src/pnmimage/pnmBrush.h b/panda/src/pnmimage/pnmBrush.h index 376ec544ae..82f816e190 100644 --- a/panda/src/pnmimage/pnmBrush.h +++ b/panda/src/pnmimage/pnmBrush.h @@ -40,7 +40,7 @@ class PNMImage; //////////////////////////////////////////////////////////////////// class EXPCL_PANDA_PNMIMAGE PNMBrush : public ReferenceCount { protected: - INLINE PNMBrush(double xc, double yc); + INLINE PNMBrush(float xc, float yc); PUBLISHED: virtual ~PNMBrush(); @@ -53,22 +53,22 @@ PUBLISHED: }; static PT(PNMBrush) make_transparent(); - static PT(PNMBrush) make_pixel(const LColord &color, BrushEffect effect = BE_blend); - static PT(PNMBrush) make_spot(const LColord &color, double radius, bool fuzzy, + static PT(PNMBrush) make_pixel(const LColorf &color, BrushEffect effect = BE_blend); + static PT(PNMBrush) make_spot(const LColorf &color, float radius, bool fuzzy, BrushEffect effect = BE_blend); - static PT(PNMBrush) make_image(const PNMImage &image, double xc, double yc, + static PT(PNMBrush) make_image(const PNMImage &image, float xc, float yc, BrushEffect effect = BE_blend); public: - INLINE double get_xc() const; - INLINE double get_yc() const; + INLINE float get_xc() const; + INLINE float get_yc() const; - virtual void draw(PNMImage &image, int x, int y, double pixel_scale)=0; + virtual void draw(PNMImage &image, int x, int y, float pixel_scale)=0; virtual void fill(PNMImage &image, int xfrom, int xto, int y, int xo, int yo)=0; protected: - double _xc, _yc; + float _xc, _yc; }; #include "pnmBrush.I" diff --git a/panda/src/pnmimage/pnmImage.I b/panda/src/pnmimage/pnmImage.I index 6c8b3e28ba..0213df23aa 100644 --- a/panda/src/pnmimage/pnmImage.I +++ b/panda/src/pnmimage/pnmImage.I @@ -32,11 +32,11 @@ PNMImage() { //////////////////////////////////////////////////////////////////// INLINE PNMImage:: PNMImage(int x_size, int y_size, int num_channels, xelval maxval, - PNMFileType *type) { + PNMFileType *type, ColorSpace color_space) { _array = NULL; _alpha = NULL; - clear(x_size, y_size, num_channels, maxval, type); + clear(x_size, y_size, num_channels, maxval, type, color_space); } //////////////////////////////////////////////////////////////////// @@ -74,7 +74,6 @@ INLINE PNMImage:: clear(); } - //////////////////////////////////////////////////////////////////// // Function: PNMImage::clamp_val // Access: Published @@ -89,23 +88,92 @@ clamp_val(int input_value) const { //////////////////////////////////////////////////////////////////// // Function: PNMImage::to_val // Access: Published -// Description: A handy function to scale values from [0..1] to -// [0..get_maxval()]. +// Description: A handy function to scale non-alpha values from +// [0..1] to [0..get_maxval()]. Do not use this for +// alpha values, see to_alpha_val. //////////////////////////////////////////////////////////////////// INLINE xelval PNMImage:: -to_val(double input_value) const { +to_val(float input_value) const { + switch (_xel_encoding) { + case XE_generic: + case XE_generic_alpha: + return clamp_val((int)(input_value * get_maxval() + 0.5f)); + + case XE_generic_sRGB: + case XE_generic_sRGB_alpha: + return clamp_val((int) + (encode_sRGB_float(input_value) * get_maxval() + 0.5f)); + + case XE_uchar_sRGB: + case XE_uchar_sRGB_alpha: + return encode_sRGB_uchar(input_value); + + case XE_uchar_sRGB_sse2: + case XE_uchar_sRGB_alpha_sse2: + return encode_sRGB_uchar_sse2(input_value); + + case XE_scRGB: + case XE_scRGB_alpha: + return min(max(0, (int)((8192 * input_value) + 4096.5f)), 65535); + + default: + return 0; + } +} + +//////////////////////////////////////////////////////////////////// +// Function: PNMImage::to_alpha_val +// Access: Published +// Description: A handy function to scale alpha values from [0..1] +// to [0..get_maxval()]. +//////////////////////////////////////////////////////////////////// +INLINE xelval PNMImage:: +to_alpha_val(float input_value) const { return clamp_val((int)(input_value * get_maxval() + 0.5)); } //////////////////////////////////////////////////////////////////// // Function: PNMImage::from_val // Access: Published -// Description: A handy function to scale values from +// Description: A handy function to scale non-alpha values from +// [0..get_maxval()] to [0..1]. Do not use this for +// alpha values, see from_alpha_val. +//////////////////////////////////////////////////////////////////// +INLINE float PNMImage:: +from_val(xelval input_value) const { + switch (_xel_encoding) { + case XE_generic: + case XE_generic_alpha: + return (float)input_value * _inv_maxval; + + case XE_generic_sRGB: + case XE_generic_sRGB_alpha: + return decode_sRGB_float((float)input_value * _inv_maxval); + + case XE_uchar_sRGB: + case XE_uchar_sRGB_alpha: + case XE_uchar_sRGB_sse2: + case XE_uchar_sRGB_alpha_sse2: + return decode_sRGB_float((unsigned char)input_value); + + case XE_scRGB: + case XE_scRGB_alpha: + return (input_value - 4096) * (1.f / 8192.f); + + default: + return 0.0f; + } +} + +//////////////////////////////////////////////////////////////////// +// Function: PNMImage::from_alpha_val +// Access: Published +// Description: A handy function to scale alpha values from // [0..get_maxval()] to [0..1]. //////////////////////////////////////////////////////////////////// -INLINE double PNMImage:: -from_val(xelval input_value) const { - return (double)input_value / (double)get_maxval(); +INLINE float PNMImage:: +from_alpha_val(xelval input_value) const { + return (float)input_value * _inv_maxval; } //////////////////////////////////////////////////////////////////// @@ -115,7 +183,7 @@ from_val(xelval input_value) const { // the given color. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: -fill(double red, double green, double blue) { +fill(float red, float green, float blue) { fill_val(to_val(red), to_val(green), to_val(blue)); } @@ -126,7 +194,7 @@ fill(double red, double green, double blue) { // the given grayscale level. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: -fill(double gray) { +fill(float gray) { fill(gray, gray, gray); } @@ -147,8 +215,8 @@ fill_val(xelval gray) { // Description: Sets the entire alpha channel to the given level. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: -alpha_fill(double alpha) { - alpha_fill_val(to_val(alpha)); +alpha_fill(float alpha) { + alpha_fill_val(to_alpha_val(alpha)); } //////////////////////////////////////////////////////////////////// @@ -218,6 +286,17 @@ get_read_y_size() const { return _has_read_size ? _read_y_size : get_y_size(); } +//////////////////////////////////////////////////////////////////// +// Function: PNMImage::get_color_space +// Access: Published +// Description: Returns the color space in which the image is +// encoded. +//////////////////////////////////////////////////////////////////// +INLINE ColorSpace PNMImage:: +get_color_space() const { + return _color_space; +} + //////////////////////////////////////////////////////////////////// // Function: PNMImage::is_valid // Access: Published @@ -296,7 +375,19 @@ make_rgb() { // Description: Returns the RGB color at the indicated pixel. Each // component is in the range 0..maxval. //////////////////////////////////////////////////////////////////// -INLINE const xel &PNMImage:: +INLINE xel &PNMImage:: +get_xel_val(int x, int y) { + nassertr(x >= 0 && x < _x_size && y >= 0 && y < _y_size, _array[0]); + return row(y)[x]; +} + +//////////////////////////////////////////////////////////////////// +// Function: PNMImage::get_xel_val +// Access: Published +// Description: Returns the RGB color at the indicated pixel. Each +// component is in the range 0..maxval. +//////////////////////////////////////////////////////////////////// +INLINE xel PNMImage:: get_xel_val(int x, int y) const { nassertr(x >= 0 && x < _x_size && y >= 0 && y < _y_size, _array[0]); return row(y)[x]; @@ -306,7 +397,10 @@ get_xel_val(int x, int y) const { // Function: PNMImage::set_xel_val // Access: Published // Description: Changes the RGB color at the indicated pixel. Each -// component is in the range 0..maxval. +// component is in the range 0..maxval, encoded in +// the configured color space. See set_xel if you +// instead have a linearized and normalized +// floating-point value. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: set_xel_val(int x, int y, const xel &value) { @@ -318,7 +412,10 @@ set_xel_val(int x, int y, const xel &value) { // Function: PNMImage::set_xel_val // Access: Published // Description: Changes the RGB color at the indicated pixel. Each -// component is in the range 0..maxval. +// component is in the range 0..maxval, encoded in +// the configured color space. See set_xel if you +// instead have a linearized and normalized +// floating-point value. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: set_xel_val(int x, int y, xelval r, xelval g, xelval b) { @@ -331,7 +428,10 @@ set_xel_val(int x, int y, xelval r, xelval g, xelval b) { // Access: Published // Description: Changes all three color components at the indicated // pixel to the same value. The value is in the range -// 0..maxval. +// component is in the range 0..maxval, encoded in +// the configured color space. See set_xel if you +// instead have a linearized and normalized +// floating-point value. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: set_xel_val(int x, int y, xelval gray) { @@ -343,7 +443,8 @@ set_xel_val(int x, int y, xelval gray) { // Function: PNMImage::get_red_val // Access: Published // Description: Returns the red component color at the indicated -// pixel. The value returned is in the range 0..maxval. +// pixel. The value returned is in the range 0..maxval +// and encoded in the configured color space. //////////////////////////////////////////////////////////////////// INLINE xelval PNMImage:: get_red_val(int x, int y) const { @@ -354,7 +455,8 @@ get_red_val(int x, int y) const { // Function: PNMImage::get_green_val // Access: Published // Description: Returns the green component color at the indicated -// pixel. The value returned is in the range 0..maxval. +// pixel. The value returned is in the range 0..maxval +// and encoded in the configured color space. //////////////////////////////////////////////////////////////////// INLINE xelval PNMImage:: get_green_val(int x, int y) const { @@ -365,7 +467,8 @@ get_green_val(int x, int y) const { // Function: PNMImage::get_blue_val // Access: Published // Description: Returns the blue component color at the indicated -// pixel. The value returned is in the range 0..maxval. +// pixel. The value returned is in the range 0..maxval +// and encoded in the configured color space. //////////////////////////////////////////////////////////////////// INLINE xelval PNMImage:: get_blue_val(int x, int y) const { @@ -379,8 +482,9 @@ get_blue_val(int x, int y) const { // pixel. This only has a meaningful value for // grayscale images; for other image types, this returns // the value of the blue channel only. However, also -// see the get_bright() function. The value returned is -// in the range 0..maxval. +// see the get_bright() function. +// The value returned is in the range 0..maxval and +// encoded in the configured color space. //////////////////////////////////////////////////////////////////// INLINE xelval PNMImage:: get_gray_val(int x, int y) const { @@ -393,7 +497,7 @@ get_gray_val(int x, int y) const { // Description: Returns the alpha component color at the indicated // pixel. It is an error to call this unless // has_alpha() is true. The value returned is in the -// range 0..maxval. +// range 0..maxval and always linear. //////////////////////////////////////////////////////////////////// INLINE xelval PNMImage:: get_alpha_val(int x, int y) const { @@ -406,7 +510,9 @@ get_alpha_val(int x, int y) const { // Access: Published // Description: Sets the red component color only at the indicated // pixel. The value given should be in the range -// 0..maxval. +// 0..maxval, encoded in the configured color space. +// See set_red if you instead have a linearized and +// normalized floating-point value. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: set_red_val(int x, int y, xelval r) { @@ -419,7 +525,9 @@ set_red_val(int x, int y, xelval r) { // Access: Published // Description: Sets the green component color only at the indicated // pixel. The value given should be in the range -// 0..maxval. +// 0..maxval, encoded in the configured color space. +// See set_green if you instead have a linearized and +// normalized floating-point value. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: set_green_val(int x, int y, xelval g) { @@ -432,7 +540,9 @@ set_green_val(int x, int y, xelval g) { // Access: Published // Description: Sets the blue component color only at the indicated // pixel. The value given should be in the range -// 0..maxval. +// 0..maxval, encoded in the configured color space. +// See set_blue if you instead have a linearized and +// normalized floating-point value. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: set_blue_val(int x, int y, xelval b) { @@ -450,7 +560,9 @@ set_blue_val(int x, int y, xelval b) { // which can set all the component colors to the same // grayscale level, and hence works correctly both for // grayscale and color images. The value given should -// be in the range 0..maxval. +// be in the range 0..maxval, encoded in the configured +// color space. See set_gray if you instead have a +// linearized normalized floating-point value. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: set_gray_val(int x, int y, xelval gray) { @@ -465,6 +577,9 @@ set_gray_val(int x, int y, xelval gray) { // pixel. It is an error to call this unless // has_alpha() is true. The value given should be in // the range 0..maxval. +// +// This value is always linearly encoded, even if the +// image is set to the sRGB color space. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: set_alpha_val(int x, int y, xelval a) { @@ -476,67 +591,191 @@ set_alpha_val(int x, int y, xelval a) { // Function: PNMImage::get_xel // Access: Published // Description: Returns the RGB color at the indicated pixel. Each -// component is a double in the range 0..1. +// component is a linearized float in the range 0..1. //////////////////////////////////////////////////////////////////// -INLINE LRGBColord PNMImage:: +INLINE LRGBColorf PNMImage:: get_xel(int x, int y) const { - return LRGBColord(from_val(get_red_val(x, y)), - from_val(get_green_val(x, y)), - from_val(get_blue_val(x, y))); + nassertr(x >= 0 && x < _x_size && y >= 0 && y < _y_size, LRGBColorf::zero()); + + const xel &col = row(y)[x]; + + switch (_xel_encoding) { + case XE_generic: + case XE_generic_alpha: + return LRGBColorf(col.r, col.g, col.b) * _inv_maxval; + + case XE_generic_sRGB: + case XE_generic_sRGB_alpha: + return LRGBColorf( + decode_sRGB_float(col.r * _inv_maxval), + decode_sRGB_float(col.g * _inv_maxval), + decode_sRGB_float(col.b * _inv_maxval)); + + case XE_uchar_sRGB: + case XE_uchar_sRGB_alpha: + case XE_uchar_sRGB_sse2: + case XE_uchar_sRGB_alpha_sse2: + return LRGBColorf( + decode_sRGB_float((unsigned char)col.r), + decode_sRGB_float((unsigned char)col.g), + decode_sRGB_float((unsigned char)col.b)); + + case XE_scRGB: + case XE_scRGB_alpha: + return LRGBColorf((int)col.r - 4096, + (int)col.g - 4096, + (int)col.b - 4096) * (1.f / 8192.f); + + default: + return LRGBColorf(0); + } } //////////////////////////////////////////////////////////////////// // Function: PNMImage::set_xel // Access: Published // Description: Changes the RGB color at the indicated pixel. Each -// component is a double in the range 0..1. +// component is a linearized float in the range 0..1. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: -set_xel(int x, int y, const LRGBColord &value) { - set_xel_val(x, y, to_val(value[0]), to_val(value[1]), to_val(value[2])); +set_xel(int x, int y, const LRGBColorf &value) { + nassertv(x >= 0 && x < _x_size && y >= 0 && y < _y_size); + + xel &col = row(y)[x]; + + switch (_xel_encoding) { + case XE_generic: + case XE_generic_alpha: + { + LRGBColorf scaled = value * get_maxval() + 0.5f; + col.r = clamp_val((int)scaled[0]); + col.g = clamp_val((int)scaled[1]); + col.b = clamp_val((int)scaled[2]); + } + break; + + case XE_generic_sRGB: + case XE_generic_sRGB_alpha: + col.r = clamp_val((int) + (encode_sRGB_float(value[0]) * get_maxval() + 0.5f)); + col.g = clamp_val((int) + (encode_sRGB_float(value[1]) * get_maxval() + 0.5f)); + col.b = clamp_val((int) + (encode_sRGB_float(value[2]) * get_maxval() + 0.5f)); + break; + + case XE_uchar_sRGB: + case XE_uchar_sRGB_alpha: + encode_sRGB_uchar(LColorf(value, 0.0f), col); + break; + + case XE_uchar_sRGB_sse2: + case XE_uchar_sRGB_alpha_sse2: + encode_sRGB_uchar_sse2(LColorf(value, 0.0f), col); + break; + + case XE_scRGB: + case XE_scRGB_alpha: + { + LRGBColorf scaled = value * 8192.f + 4096.5f; + col.r = min(max(0, (int)scaled[0]), 65535); + col.g = min(max(0, (int)scaled[1]), 65535); + col.b = min(max(0, (int)scaled[2]), 65535); + } + break; + } } //////////////////////////////////////////////////////////////////// // Function: PNMImage::set_xel // Access: Published // Description: Changes the RGB color at the indicated pixel. Each -// component is a double in the range 0..1. +// component is a linearized float in the range 0..1. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: -set_xel(int x, int y, double r, double g, double b) { - set_xel_val(x, y, to_val(r), to_val(g), to_val(b)); +set_xel(int x, int y, float r, float g, float b) { + set_xel(x, y, LRGBColorf(r, g, b)); } //////////////////////////////////////////////////////////////////// // Function: PNMImage::set_xel // Access: Published // Description: Changes all three color components at the indicated -// pixel to the same value. The value is a double in -// the range 0..1. +// pixel to the same value. The value is a linearized +// float in the range 0..1. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: -set_xel(int x, int y, double gray) { - set_xel_val(x, y, to_val(gray), to_val(gray), to_val(gray)); +set_xel(int x, int y, float gray) { + xelval val = to_val(gray); + set_xel_val(x, y, val); } //////////////////////////////////////////////////////////////////// // Function: PNMImage::get_xel_a // Access: Published // Description: Returns the RGBA color at the indicated pixel. Each -// component is a double in the range 0..1. +// component is a linearized float in the range 0..1. //////////////////////////////////////////////////////////////////// -INLINE LColord PNMImage:: +INLINE LColorf PNMImage:: get_xel_a(int x, int y) const { - if (has_alpha()) { - return LColord(from_val(get_red_val(x, y)), - from_val(get_green_val(x, y)), - from_val(get_blue_val(x, y)), - from_val(get_alpha_val(x, y))); - } else { - return LColord(from_val(get_red_val(x, y)), - from_val(get_green_val(x, y)), - from_val(get_blue_val(x, y)), - 0.0); + const xel &col = row(y)[x]; + + switch (_xel_encoding) { + case XE_generic: + return LColorf(col.r, col.g, col.b, 0.0f) * _inv_maxval; + + case XE_generic_alpha: + return LColorf(col.r, col.g, col.b, alpha_row(y)[x]) * _inv_maxval; + + case XE_generic_sRGB: + return LColorf( + decode_sRGB_float(col.r * _inv_maxval), + decode_sRGB_float(col.g * _inv_maxval), + decode_sRGB_float(col.b * _inv_maxval), + 0.0f); + + case XE_generic_sRGB_alpha: + return LColorf( + decode_sRGB_float(col.r * _inv_maxval), + decode_sRGB_float(col.g * _inv_maxval), + decode_sRGB_float(col.b * _inv_maxval), + alpha_row(y)[x] * _inv_maxval); + + case XE_uchar_sRGB: + case XE_uchar_sRGB_sse2: + return LColorf( + decode_sRGB_float((unsigned char)col.r), + decode_sRGB_float((unsigned char)col.g), + decode_sRGB_float((unsigned char)col.b), + 0.0f); + + case XE_uchar_sRGB_alpha: + case XE_uchar_sRGB_alpha_sse2: + return LColorf( + decode_sRGB_float((unsigned char)col.r), + decode_sRGB_float((unsigned char)col.g), + decode_sRGB_float((unsigned char)col.b), + alpha_row(y)[x] * (1.f / 255.f)); + + case XE_scRGB: + return LColorf((int)col.r - 4096, + (int)col.g - 4096, + (int)col.b - 4096, + 0) * (1.f / 8192.f); + + case XE_scRGB_alpha: + { + static const LColorf scale(1.f / 8192.f, 1.f / 8192.f, 1.f / 8192.f, 1.f / 65535.f); + LColorf color((int)col.r - 4096, + (int)col.g - 4096, + (int)col.b - 4096, + alpha_row(y)[x]); + color.componentwise_mult(scale); + return color; + } + + default: + return LColorf(0); } } @@ -544,13 +783,87 @@ get_xel_a(int x, int y) const { // Function: PNMImage::set_xel_a // Access: Published // Description: Changes the RGBA color at the indicated pixel. Each -// component is a double in the range 0..1. +// component is a linearized float in the range 0..1. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: -set_xel_a(int x, int y, const LColord &value) { - set_xel_val(x, y, to_val(value[0]), to_val(value[1]), to_val(value[2])); - if (has_alpha()) { - set_alpha_val(x, y, to_val(value[3])); +set_xel_a(int x, int y, const LColorf &value) { + nassertv(x >= 0 && x < _x_size && y >= 0 && y < _y_size); + + xel &col = row(y)[x]; + + switch (_xel_encoding) { + case XE_generic: + { + LColorf scaled = value * get_maxval() + 0.5f; + col.r = clamp_val((int)scaled[0]); + col.g = clamp_val((int)scaled[1]); + col.b = clamp_val((int)scaled[2]); + } + break; + + case XE_generic_alpha: + { + LColorf scaled = value * get_maxval() + 0.5f; + col.r = clamp_val((int)scaled[0]); + col.g = clamp_val((int)scaled[1]); + col.b = clamp_val((int)scaled[2]); + alpha_row(y)[x] = clamp_val((int)scaled[3]); + } + break; + + case XE_generic_sRGB: + col.r = clamp_val((int) + (encode_sRGB_float(value[0]) * get_maxval() + 0.5f)); + col.g = clamp_val((int) + (encode_sRGB_float(value[1]) * get_maxval() + 0.5f)); + col.b = clamp_val((int) + (encode_sRGB_float(value[2]) * get_maxval() + 0.5f)); + break; + + case XE_generic_sRGB_alpha: + col.r = clamp_val((int) + (encode_sRGB_float(value[0]) * get_maxval() + 0.5f)); + col.g = clamp_val((int) + (encode_sRGB_float(value[1]) * get_maxval() + 0.5f)); + col.b = clamp_val((int) + (encode_sRGB_float(value[2]) * get_maxval() + 0.5f)); + alpha_row(y)[x] = clamp_val((int)(value[3] * get_maxval() + 0.5f)); + break; + + case XE_uchar_sRGB: + encode_sRGB_uchar(value, col); + break; + + case XE_uchar_sRGB_alpha: + encode_sRGB_uchar(value, col, alpha_row(y)[x]); + break; + + case XE_uchar_sRGB_sse2: + encode_sRGB_uchar_sse2(value, col); + break; + + case XE_uchar_sRGB_alpha_sse2: + encode_sRGB_uchar_sse2(value, col, alpha_row(y)[x]); + break; + + case XE_scRGB: + { + LColorf scaled = value * 8192.0f + 4096.5f; + col.r = min(max(0, (int)scaled[0]), 65535); + col.g = min(max(0, (int)scaled[1]), 65535); + col.b = min(max(0, (int)scaled[2]), 65535); + } + break; + + case XE_scRGB_alpha: + { + LColorf scaled = value * 8192.0f + 4096.5f; + col.r = min(max(0, (int)scaled[0]), 65535); + col.g = min(max(0, (int)scaled[1]), 65535); + col.b = min(max(0, (int)scaled[2]), 65535); + alpha_row(y)[x] = min(max(0, (int)(value[3] * 65535 + 0.5f)), 65535); + } + break; } } @@ -558,24 +871,21 @@ set_xel_a(int x, int y, const LColord &value) { // Function: PNMImage::set_xel_a // Access: Published // Description: Changes the RGBA color at the indicated pixel. Each -// component is a double in the range 0..1. +// component is a linearized float in the range 0..1. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: -set_xel_a(int x, int y, double r, double g, double b, double a) { - set_xel_val(x, y, to_val(r), to_val(g), to_val(b)); - if (has_alpha()) { - set_alpha_val(x, y, to_val(a)); - } +set_xel_a(int x, int y, float r, float g, float b, float a) { + set_xel_a(x, y, LColorf(r, g, b, a)); } //////////////////////////////////////////////////////////////////// // Function: PNMImage::get_red // Access: Published // Description: Returns the red component color at the indicated -// pixel. The value returned is a double in the range -// 0..1. +// pixel. The value returned is a linearized float +// in the range 0..1. //////////////////////////////////////////////////////////////////// -INLINE double PNMImage:: +INLINE float PNMImage:: get_red(int x, int y) const { return from_val(get_red_val(x, y)); } @@ -584,10 +894,10 @@ get_red(int x, int y) const { // Function: PNMImage::get_green // Access: Published // Description: Returns the green component color at the indicated -// pixel. The value returned is a double in the range -// 0..1. +// pixel. The value returned is a linearized float +// in the range 0..1. //////////////////////////////////////////////////////////////////// -INLINE double PNMImage:: +INLINE float PNMImage:: get_green(int x, int y) const { return from_val(get_green_val(x, y)); } @@ -596,10 +906,10 @@ get_green(int x, int y) const { // Function: PNMImage::get_blue // Access: Published // Description: Returns the blue component color at the indicated -// pixel. The value returned is a double in the range -// 0..1. +// pixel. The value returned is a linearized float +// in the range 0..1. //////////////////////////////////////////////////////////////////// -INLINE double PNMImage:: +INLINE float PNMImage:: get_blue(int x, int y) const { return from_val(get_blue_val(x, y)); } @@ -611,10 +921,10 @@ get_blue(int x, int y) const { // pixel. This only has a meaningful value for // grayscale images; for other image types, this returns // the value of the blue channel only. However, also -// see the get_bright() function. The value returned is -// a double in the range 0..1. +// see the get_bright() function. The value returned +// is a linearized float in the range 0..1. //////////////////////////////////////////////////////////////////// -INLINE double PNMImage:: +INLINE float PNMImage:: get_gray(int x, int y) const { return from_val(get_gray_val(x, y)); } @@ -624,23 +934,23 @@ get_gray(int x, int y) const { // Access: Published // Description: Returns the alpha component color at the indicated // pixel. It is an error to call this unless -// has_alpha() is true. The value returned is a double +// has_alpha() is true. The value returned is a float // in the range 0..1. //////////////////////////////////////////////////////////////////// -INLINE double PNMImage:: +INLINE float PNMImage:: get_alpha(int x, int y) const { - return from_val(get_alpha_val(x, y)); + return from_alpha_val(get_alpha_val(x, y)); } //////////////////////////////////////////////////////////////////// // Function: PNMImage::set_red // Access: Published // Description: Sets the red component color only at the indicated -// pixel. The value given should be a double in the -// range 0..1. +// pixel. The value given should be a linearized +// float in the range 0..1. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: -set_red(int x, int y, double r) { +set_red(int x, int y, float r) { set_red_val(x, y, to_val(r)); } @@ -648,24 +958,24 @@ set_red(int x, int y, double r) { // Function: PNMImage::set_green // Access: Published // Description: Sets the green component color only at the indicated -// pixel. The value given should be a double in the -// range 0..1. +// pixel. The value given should be a linearized +// float in the range 0..1. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: -set_green(int x, int y, double r) { - set_green_val(x, y, to_val(r)); +set_green(int x, int y, float g) { + set_green_val(x, y, to_val(g)); } //////////////////////////////////////////////////////////////////// // Function: PNMImage::set_blue // Access: Published // Description: Sets the blue component color only at the indicated -// pixel. The value given should be a double in the -// range 0..1. +// pixel. The value given should be a linearized +// float in the range 0..1. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: -set_blue(int x, int y, double r) { - set_blue_val(x, y, to_val(r)); +set_blue(int x, int y, float b) { + set_blue_val(x, y, to_val(b)); } //////////////////////////////////////////////////////////////////// @@ -678,11 +988,11 @@ set_blue(int x, int y, double r) { // can set all the component colors to the same // grayscale level, and hence works correctly both for // grayscale and color images. The value given should -// be a double in the range 0..1. +// be a linearized float in the range 0..1. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: -set_gray(int x, int y, double r) { - set_gray_val(x, y, to_val(r)); +set_gray(int x, int y, float gray) { + set_gray_val(x, y, to_val(gray)); } //////////////////////////////////////////////////////////////////// @@ -694,51 +1004,19 @@ set_gray(int x, int y, double r) { // the range 0..1. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: -set_alpha(int x, int y, double r) { - set_alpha_val(x, y, to_val(r)); -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMImage::get_channel -// Access: Published -// Description: Returns the nth component color at the indicated -// pixel. The channel index should be in the range -// 0..(get_num_channels()-1). The channels are ordered B, -// G, R, A. This is slightly less optimal than -// accessing the component values directly by named -// methods. The value returned is a double in the range -// 0..1. -//////////////////////////////////////////////////////////////////// -INLINE double PNMImage:: -get_channel(int x, int y, int channel) const { - return from_val(get_channel_val(x, y, channel)); -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMImage::set_channel_val -// Access: Published -// Description: Sets the nth component color at the indicated -// pixel. The channel index should be in the range -// 0..(get_num_channels()-1). The channels are ordered B, -// G, R, A. This is slightly less optimal than -// setting the component values directly by named -// methods. The value given should be a double in the -// range 0..1. -//////////////////////////////////////////////////////////////////// -INLINE void PNMImage:: -set_channel(int x, int y, int channel, double value) { - set_channel_val(x, y, channel, to_val(value)); +set_alpha(int x, int y, float a) { + set_alpha_val(x, y, to_alpha_val(a)); } //////////////////////////////////////////////////////////////////// // Function: PNMImage::get_bright // Access: Published // Description: Returns the linear brightness of the given xel, as a -// double in the range 0..1. This flavor of +// linearized float in the range 0..1. This flavor of // get_bright() returns the correct grayscale brightness // level for both full-color and grayscale images. //////////////////////////////////////////////////////////////////// -INLINE double PNMImage:: +INLINE float PNMImage:: get_bright(int x, int y) const { return get_bright(x, y, _default_rc, _default_gc, _default_bc); } @@ -751,11 +1029,9 @@ get_bright(int x, int y) const { // for the RGB color at the indicated pixel, based on // the supplied weights for each component. //////////////////////////////////////////////////////////////////// -INLINE double PNMImage:: -get_bright(int x, int y, double rc, double gc, double bc) const { - return from_val((int)(rc * get_red_val(x, y) + - gc * get_green_val(x, y) + - bc * get_blue_val(x, y))); +INLINE float PNMImage:: +get_bright(int x, int y, float rc, float gc, float bc) const { + return get_xel(x, y).dot(LVecBase3f(rc, gc, bc)); } //////////////////////////////////////////////////////////////////// @@ -766,12 +1042,9 @@ get_bright(int x, int y, double rc, double gc, double bc) const { // value for the RGBA color at the indicated pixel, // based on the supplied weights for each component. //////////////////////////////////////////////////////////////////// -INLINE double PNMImage:: -get_bright(int x, int y, double rc, double gc, double bc, double ac) const { - return from_val((int)(rc * get_red_val(x, y) + - gc * get_green_val(x, y) + - bc * get_blue_val(x, y) + - ac * get_alpha_val(x, y))); +INLINE float PNMImage:: +get_bright(int x, int y, float rc, float gc, float bc, float ac) const { + return get_xel_a(x, y).dot(LVecBase4f(rc, gc, bc, ac)); } //////////////////////////////////////////////////////////////////// @@ -784,32 +1057,10 @@ get_bright(int x, int y, double rc, double gc, double bc, double ac) const { // alpha of 0.0 is fully transparent and does nothing. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: -blend(int x, int y, const LRGBColord &val, double alpha) { +blend(int x, int y, const LRGBColorf &val, float alpha) { blend(x, y, val[0], val[1], val[2], alpha); } -//////////////////////////////////////////////////////////////////// -// Function: PNMImage::Array Operator -// Access: Published -// Description: Allows the PNMImage to appear to be a 2-d array of -// xels. -//////////////////////////////////////////////////////////////////// -INLINE xel *PNMImage:: -operator [] (int y) { - return row(y); -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMImage::Array Operator -// Access: Published -// Description: Allows the PNMImage to appear to be a 2-d array of -// xels. -//////////////////////////////////////////////////////////////////// -INLINE const xel *PNMImage:: -operator [] (int y) const { - return row(y); -} - //////////////////////////////////////////////////////////////////// // Function: PNMImage::box_filter // Access: Published @@ -818,7 +1069,7 @@ operator [] (int y) const { // the effect is that of a blur operation. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: -box_filter(double radius) { +box_filter(float radius) { box_filter_from(radius, *this); } @@ -830,7 +1081,7 @@ box_filter(double radius) { // the effect is that of a blur operation. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: -gaussian_filter(double radius) { +gaussian_filter(float radius) { gaussian_filter_from(radius, *this); } @@ -843,7 +1094,7 @@ gaussian_filter(double radius) { // channels. Does not affect the alpha channel. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: -gamma_correct(double from_gamma, double to_gamma) { +gamma_correct(float from_gamma, float to_gamma) { apply_exponent(from_gamma / to_gamma); } @@ -856,7 +1107,7 @@ gamma_correct(double from_gamma, double to_gamma) { // channel. Does not affect the RGB channels. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: -gamma_correct_alpha(double from_gamma, double to_gamma) { +gamma_correct_alpha(float from_gamma, float to_gamma) { apply_exponent(1.0, from_gamma / to_gamma); } @@ -868,7 +1119,7 @@ gamma_correct_alpha(double from_gamma, double to_gamma) { // exponent, such that L' = L ^ exponent. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: -apply_exponent(double gray_exponent) { +apply_exponent(float gray_exponent) { apply_exponent(gray_exponent, gray_exponent, gray_exponent, 1.0); } @@ -880,7 +1131,7 @@ apply_exponent(double gray_exponent) { // exponent, such that L' = L ^ exponent. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: -apply_exponent(double gray_exponent, double alpha_exponent) { +apply_exponent(float gray_exponent, float alpha_exponent) { apply_exponent(gray_exponent, gray_exponent, gray_exponent, alpha_exponent); } @@ -895,10 +1146,161 @@ apply_exponent(double gray_exponent, double alpha_exponent) { // green_exponent are unused. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: -apply_exponent(double red_exponent, double green_exponent, double blue_exponent) { +apply_exponent(float red_exponent, float green_exponent, float blue_exponent) { apply_exponent(red_exponent, green_exponent, blue_exponent, 1.0); } +//////////////////////////////////////////////////////////////////// +// Function: PNMImage::Row Constructor +//////////////////////////////////////////////////////////////////// +INLINE PNMImage::Row:: +Row(PNMImage &image, int y) : _image(image), _y(y) { + nassertv(y >= 0 && y < _image._y_size); +} + +//////////////////////////////////////////////////////////////////// +// Function: PNMImage::Row::size +// Access: Published +// Description: Get the number of pixels in the row. +//////////////////////////////////////////////////////////////////// +INLINE size_t PNMImage::Row:: +size() const { + return _image.get_x_size(); +} + +//////////////////////////////////////////////////////////////////// +// Function: PNMImage::Row::Array Operator +// Access: Published +// Description: Fetch the RGB value at the given column in the row. +//////////////////////////////////////////////////////////////////// +INLINE LColorf PNMImage::Row:: +operator[](int x) const { + return _image.get_xel_a(x, _y); +} + +#ifdef HAVE_PYTHON +//////////////////////////////////////////////////////////////////// +// Function: PNMImage::Row::Array Operator +// Access: Published +// Description: Set the pixel at the given column in the row. If +// the image has no alpha channel, the alpha component +// is ignored. +//////////////////////////////////////////////////////////////////// +INLINE void PNMImage::Row:: +__setitem__(int x, const LColorf &v) { + _image.set_xel_a(x, _y, v); +} +#endif + +//////////////////////////////////////////////////////////////////// +// Function: PNMImage::Row::Array Operator +// Access: Published +// Description: Fetch the pixel at the given column in the row. +//////////////////////////////////////////////////////////////////// +INLINE xel &PNMImage::Row:: +get_xel_val(int x) { + return _image.get_xel_val(x, _y); +} + +//////////////////////////////////////////////////////////////////// +// Function: PNMImage::Row::Array Operator +// Access: Published +// Description: Set the pixel at the given column in the row. +//////////////////////////////////////////////////////////////////// +INLINE void PNMImage::Row:: +set_xel_val(int x, const xel &v) { + _image.set_xel_val(x, _y, v); +} + +//////////////////////////////////////////////////////////////////// +// Function: PNMImage::Row::Array Operator +// Access: Published +// Description: Fetch the alpha value at the given column in the row. +//////////////////////////////////////////////////////////////////// +INLINE xelval PNMImage::Row:: +get_alpha_val(int x) const { + return _image.get_alpha_val(x, _y); +} + +//////////////////////////////////////////////////////////////////// +// Function: PNMImage::Row::Array Operator +// Access: Published +// Description: Set the alpha value at the given column in the row. +//////////////////////////////////////////////////////////////////// +INLINE void PNMImage::Row:: +set_alpha_val(int x, xelval v) { + _image.set_alpha_val(x, _y, v); +} + +//////////////////////////////////////////////////////////////////// +// Function: PNMImage::CRow Constructor +//////////////////////////////////////////////////////////////////// +INLINE PNMImage::CRow:: +CRow(const PNMImage &image, int y) : _image(image), _y(y) { + nassertv(y >= 0 && y < _image._y_size); +} + +//////////////////////////////////////////////////////////////////// +// Function: PNMImage::CRow::size +// Access: Published +// Description: Get the number of pixels in the row. +//////////////////////////////////////////////////////////////////// +INLINE size_t PNMImage::CRow:: +size() const { + return _image.get_x_size(); +} + +//////////////////////////////////////////////////////////////////// +// Function: PNMImage::CRow::Array Operator +// Access: Published +// Description: Fetch the RGB value at the given column in the row. +//////////////////////////////////////////////////////////////////// +INLINE LColorf PNMImage::CRow:: +operator[](int x) const { + return _image.get_xel_a(x, _y); +} + +//////////////////////////////////////////////////////////////////// +// Function: PNMImage::CRow::Array Operator +// Access: Published +// Description: Fetch the pixel at the given column in the row. +//////////////////////////////////////////////////////////////////// +INLINE xel PNMImage::CRow:: +get_xel_val(int x) const { + return _image.get_xel_val(x, _y); +} + +//////////////////////////////////////////////////////////////////// +// Function: PNMImage::CRow::Array Operator +// Access: Published +// Description: Fetch the alpha value at the given column in the row. +//////////////////////////////////////////////////////////////////// +INLINE xelval PNMImage::CRow:: +get_alpha_val(int x) const { + return _image.get_alpha_val(x, _y); +} + +//////////////////////////////////////////////////////////////////// +// Function: PNMImage::Array Operator +// Access: Published +// Description: Allows the PNMImage to appear to be a 2-d array of +// xels. +//////////////////////////////////////////////////////////////////// +INLINE PNMImage::Row PNMImage:: +operator [] (int y) { + return Row(*this, y); +} + +//////////////////////////////////////////////////////////////////// +// Function: PNMImage::Array Operator +// Access: Published +// Description: Allows the PNMImage to appear to be a 2-d array of +// xels. +//////////////////////////////////////////////////////////////////// +INLINE PNMImage::CRow PNMImage:: +operator [] (int y) const { + return CRow(*this, y); +} //////////////////////////////////////////////////////////////////// // Function: PNMImage::get_array @@ -1080,16 +1482,16 @@ setup_sub_image(const PNMImage ©, int &xto, int &yto, // from the center. //////////////////////////////////////////////////////////////////// INLINE void PNMImage:: -compute_spot_pixel(LColord &c, double d2, - double min_radius, double max_radius, - const LColord &fg, const LColord &bg) { - double d = sqrt(d2); +compute_spot_pixel(LColorf &c, float d2, + float min_radius, float max_radius, + const LColorf &fg, const LColorf &bg) { + float d = sqrt(d2); if (d > max_radius) { c = bg; } else if (d > min_radius) { d = (d - min_radius) / (max_radius - min_radius); - double d2 = d * d; - double t = (3.0 * d2) - (2.0 * d * d2); + float d2 = d * d; + float t = (3.0 * d2) - (2.0 * d * d2); c = fg + t * (bg - fg); } else { c = fg; @@ -1118,7 +1520,7 @@ operator + (const PNMImage &other) const { // is added to each pixel in the provided image. //////////////////////////////////////////////////////////////////// INLINE PNMImage PNMImage:: -operator + (const LColord &other) const { +operator + (const LColorf &other) const { PNMImage target (*this); target += other; return target; @@ -1146,7 +1548,7 @@ operator - (const PNMImage &other) const { // is subtracted from each pixel in the provided image. //////////////////////////////////////////////////////////////////// INLINE PNMImage PNMImage:: -operator - (const LColord &other) const { +operator - (const LColorf &other) const { PNMImage target (*this); target -= other; return target; @@ -1176,7 +1578,7 @@ operator * (const PNMImage &other) const { // a constant floating-point multiplier value. //////////////////////////////////////////////////////////////////// INLINE PNMImage PNMImage:: -operator * (double multiplier) const { +operator * (float multiplier) const { PNMImage target (*this); target *= multiplier; return target; @@ -1189,7 +1591,7 @@ operator * (double multiplier) const { // is multiplied to each pixel in the provided image. //////////////////////////////////////////////////////////////////// INLINE PNMImage PNMImage:: -operator * (const LColord &other) const { +operator * (const LColorf &other) const { PNMImage target (*this); target *= other; return target; diff --git a/panda/src/pnmimage/pnmImage.cxx b/panda/src/pnmimage/pnmImage.cxx index cb969f473e..692e26b11d 100644 --- a/panda/src/pnmimage/pnmImage.cxx +++ b/panda/src/pnmimage/pnmImage.cxx @@ -60,9 +60,12 @@ clear() { _y_size = 0; _num_channels = 0; _maxval = 255; + _inv_maxval = 1.0 / 255.0; + _color_space = CS_linear; _comment.clear(); _type = (PNMFileType *)NULL; _has_read_size = false; + _xel_encoding = XE_generic; } //////////////////////////////////////////////////////////////////// @@ -73,14 +76,16 @@ clear() { //////////////////////////////////////////////////////////////////// void PNMImage:: clear(int x_size, int y_size, int num_channels, - xelval maxval, PNMFileType *type) { + xelval maxval, PNMFileType *type, ColorSpace color_space) { clear(); nassertv(num_channels >= 1 && num_channels <= 4); + nassertv(color_space != CS_unspecified); _x_size = x_size; _y_size = y_size; _num_channels = num_channels; _maxval = maxval; + _color_space = color_space; _comment.clear(); _type = type; _has_read_size = false; @@ -93,6 +98,7 @@ clear(int x_size, int y_size, int num_channels, allocate_array(); memset(_array, 0, sizeof(xel) * _y_size * _x_size); + setup_encoding(); setup_rc(); } @@ -138,15 +144,14 @@ copy_channel(const PNMImage ©, int src_channel, int dest_channel) { // Do the actual copying for (int x = 0; x < _x_size; x++) { for (int y = 0; y < _y_size; y++) { - LVecBase4d t = get_xel_a(x, y); - LVecBase4d o = copy.get_xel_a(x, y); - t.set_cell(dest_channel,o.get_cell(src_channel)); + LColorf t = get_xel_a(x, y); + LColorf o = copy.get_xel_a(x, y); + t.set_cell(dest_channel, o.get_cell(src_channel)); set_xel_a(x, y, t); } } } - //////////////////////////////////////////////////////////////////// // Function: PNMImage::copy_header_from // Access: Published @@ -165,6 +170,7 @@ copy_header_from(const PNMImageHeader &header) { } allocate_array(); + setup_encoding(); setup_rc(); } @@ -178,6 +184,7 @@ void PNMImage:: take_from(PNMImage &orig) { clear(); PNMImageHeader::operator = (orig); + setup_encoding(); setup_rc(); if (has_alpha()) { @@ -329,13 +336,14 @@ read(PNMReader *reader) { return false; } + setup_encoding(); setup_rc(); if (has_read_size && (_x_size != read_x_size || _y_size != read_y_size)) { // The Reader didn't comply with our size request. Do the sizing // explicitly, then. PNMImage new_image(read_x_size, read_y_size, get_num_channels(), - get_maxval(), get_type()); + get_maxval(), get_type(), get_color_space()); new_image.quick_filter_from(*this); take_from(new_image); } @@ -441,8 +449,6 @@ write(PNMWriter *writer) const { return (result == _y_size); } - - //////////////////////////////////////////////////////////////////// // Function: PNMImage::set_color_type // Access: Published @@ -461,7 +467,7 @@ set_color_type(PNMImage::ColorType color_type) { } if (!is_grayscale() && is_grayscale(color_type)) { - // convert to grayscale from color + // Convert to grayscale from color for (int y = 0; y < get_y_size(); y++) { for (int x = 0; x < get_x_size(); x++) { set_gray(x, y, get_bright(x, y)); @@ -469,31 +475,127 @@ set_color_type(PNMImage::ColorType color_type) { } } else if (is_grayscale() && !is_grayscale(color_type)) { - // convert to color from grayscale + // Convert to color from grayscale for (int y = 0; y < get_y_size(); y++) { - for (int x = 0; x 0); if (maxval != _maxval) { - double ratio = (double)maxval / (double)_maxval; + float ratio = (float)maxval / (float)_maxval; if (is_grayscale()) { for (int y = 0; y < get_y_size(); y++) { @@ -671,6 +774,7 @@ set_maxval(xelval maxval) { } } _maxval = maxval; + setup_encoding(); } } @@ -748,6 +852,80 @@ set_channel_val(int x, int y, int channel, xelval value) { } } +//////////////////////////////////////////////////////////////////// +// Function: PNMImage::get_channel +// Access: Published +// Description: Returns the nth component color at the indicated +// pixel. The channel index should be in the range +// 0..(get_num_channels()-1). The channels are ordered B, +// G, R, A. This is slightly less optimal than +// accessing the component values directly by named +// methods. The value returned is a float in the range +// 0..1. +//////////////////////////////////////////////////////////////////// +float PNMImage:: +get_channel(int x, int y, int channel) const { + switch (channel) { + case 0: + return get_blue(x, y); + + case 1: + return (_num_channels == 2) ? get_alpha(x, y) : get_green(x, y); + + case 2: + return get_red(x, y); + + case 3: + return get_alpha(x, y); + + default: + pnmimage_cat.error() + << "Invalid request for channel " << channel << " in " + << get_num_channels() << "-channel image.\n"; + nassertr(false, 0); + return 0; + } +} + +//////////////////////////////////////////////////////////////////// +// Function: PNMImage::set_channel +// Access: Published +// Description: Sets the nth component color at the indicated +// pixel. The channel index should be in the range +// 0..(get_num_channels()-1). The channels are ordered B, +// G, R, A. This is slightly less optimal than +// setting the component values directly by named +// methods. The value given should be a float in the +// range 0..1. +//////////////////////////////////////////////////////////////////// +void PNMImage:: +set_channel(int x, int y, int channel, float value) { + switch (channel) { + case 0: + set_blue(x, y, value); + break; + + case 1: + if (_num_channels == 2) { + set_alpha(x, y, value); + } else { + set_green(x, y, value); + } + break; + + case 2: + set_red(x, y, value); + break; + + case 3: + set_alpha(x, y, value); + break; + + default: + nassertv(false); + } +} + //////////////////////////////////////////////////////////////////// // Function: PNMImage::get_pixel // Access: Published @@ -796,7 +974,7 @@ set_pixel(int x, int y, const PixelSpec &pixel) { // alpha of 0.0 is fully transparent and does nothing. //////////////////////////////////////////////////////////////////// void PNMImage:: -blend(int x, int y, double r, double g, double b, double alpha) { +blend(int x, int y, float r, float g, float b, float alpha) { if (alpha >= 1.0) { // Completely replace the previous color. if (has_alpha()) { @@ -804,22 +982,22 @@ blend(int x, int y, double r, double g, double b, double alpha) { } set_xel(x, y, r, g, b); - } else if (alpha > 0.0) { + } else if (alpha > 0.0f) { // Blend with the previous color. - double prev_alpha = has_alpha() ? get_alpha(x, y) : 1.0; + float prev_alpha = has_alpha() ? get_alpha(x, y) : 1.0f; - if (prev_alpha == 0.0) { + if (prev_alpha == 0.0f) { // Nothing there previously; replace with this new color. set_alpha(x, y, alpha); set_xel(x, y, r, g, b); } else { // Blend the color with the previous color. - LRGBColord prev_rgb = get_xel(x, y); - r = r + (1.0 - alpha) * (get_red(x, y) - r); - g = g + (1.0 - alpha) * (get_green(x, y) - g); - b = b + (1.0 - alpha) * (get_blue(x, y) - b); - alpha = prev_alpha + alpha * (1.0 - prev_alpha); + LRGBColorf prev_rgb = get_xel(x, y); + r = r + (1.0f - alpha) * (get_red(x, y) - r); + g = g + (1.0f - alpha) * (get_green(x, y) - g); + b = b + (1.0f - alpha) * (get_blue(x, y) - b); + alpha = prev_alpha + alpha * (1.0f - prev_alpha); if (has_alpha()) { set_alpha(x, y, alpha); @@ -887,7 +1065,8 @@ copy_sub_image(const PNMImage ©, int xto, int yto, setup_sub_image(copy, xto, yto, xfrom, yfrom, x_size, y_size, xmin, ymin, xmax, ymax); - if (get_maxval() == copy.get_maxval()) { + if (get_maxval() == copy.get_maxval() && + get_color_space() == copy.get_color_space()) { // The simple case: no pixel value rescaling is required. int x, y; for (y = ymin; y < ymax; y++) { @@ -941,7 +1120,7 @@ copy_sub_image(const PNMImage ©, int xto, int yto, void PNMImage:: blend_sub_image(const PNMImage ©, int xto, int yto, int xfrom, int yfrom, int x_size, int y_size, - double pixel_scale) { + float pixel_scale) { if (!copy.has_alpha() && pixel_scale == 1.0) { copy_sub_image(copy, xto, yto, xfrom, yfrom, x_size, y_size); return; @@ -981,7 +1160,7 @@ blend_sub_image(const PNMImage ©, int xto, int yto, void PNMImage:: add_sub_image(const PNMImage ©, int xto, int yto, int xfrom, int yfrom, int x_size, int y_size, - double pixel_scale) { + float pixel_scale) { int xmin, ymin, xmax, ymax; setup_sub_image(copy, xto, yto, xfrom, yfrom, x_size, y_size, xmin, ymin, xmax, ymax); @@ -997,9 +1176,9 @@ add_sub_image(const PNMImage ©, int xto, int yto, for (y = ymin; y < ymax; y++) { for (x = xmin; x < xmax; x++) { - LRGBColord rgb1 = get_xel(x, y); - LRGBColord rgb2 = copy.get_xel(x, y); - set_xel(x, y, + LRGBColorf rgb1 = get_xel(x, y); + LRGBColorf rgb2 = copy.get_xel(x, y); + set_xel(x, y, rgb1[0] + rgb2[0] * pixel_scale, rgb1[1] + rgb2[1] * pixel_scale, rgb1[2] + rgb2[2] * pixel_scale); @@ -1019,7 +1198,7 @@ add_sub_image(const PNMImage ©, int xto, int yto, void PNMImage:: mult_sub_image(const PNMImage ©, int xto, int yto, int xfrom, int yfrom, int x_size, int y_size, - double pixel_scale) { + float pixel_scale) { int xmin, ymin, xmax, ymax; setup_sub_image(copy, xto, yto, xfrom, yfrom, x_size, y_size, xmin, ymin, xmax, ymax); @@ -1035,9 +1214,9 @@ mult_sub_image(const PNMImage ©, int xto, int yto, for (y = ymin; y < ymax; y++) { for (x = xmin; x < xmax; x++) { - LRGBColord rgb1 = get_xel(x, y); - LRGBColord rgb2 = copy.get_xel(x, y); - set_xel(x, y, + LRGBColorf rgb1 = get_xel(x, y); + LRGBColorf rgb2 = copy.get_xel(x, y); + set_xel(x, y, rgb1[0] * rgb2[0] * pixel_scale, rgb1[1] * rgb2[1] * pixel_scale, rgb1[2] * rgb2[2] * pixel_scale); @@ -1062,12 +1241,13 @@ mult_sub_image(const PNMImage ©, int xto, int yto, void PNMImage:: darken_sub_image(const PNMImage ©, int xto, int yto, int xfrom, int yfrom, int x_size, int y_size, - double pixel_scale) { + float pixel_scale) { int xmin, ymin, xmax, ymax; setup_sub_image(copy, xto, yto, xfrom, yfrom, x_size, y_size, xmin, ymin, xmax, ymax); - if (get_maxval() == copy.get_maxval() && pixel_scale == 1.0) { + if (get_maxval() == copy.get_maxval() && pixel_scale == 1.0f && + get_color_space() == CS_linear && copy.get_color_space() == CS_linear) { // The simple case: no pixel value rescaling is required. int x, y; for (y = ymin; y < ymax; y++) { @@ -1095,12 +1275,12 @@ darken_sub_image(const PNMImage ©, int xto, int yto, int x, y; for (y = ymin; y < ymax; y++) { for (x = xmin; x < xmax; x++) { - LRGBColord c = copy.get_xel(x - xmin + xfrom, y - ymin + yfrom); - LRGBColord o = get_xel(x, y); - LRGBColord p; - p.set(min(1.0 - ((1.0 - c[0]) * pixel_scale), o[0]), - min(1.0 - ((1.0 - c[1]) * pixel_scale), o[1]), - min(1.0 - ((1.0 - c[2]) * pixel_scale), o[2])); + LRGBColorf c = copy.get_xel(x - xmin + xfrom, y - ymin + yfrom); + LRGBColorf o = get_xel(x, y); + LRGBColorf p; + p.set(min(1.0f - ((1.0f - c[0]) * pixel_scale), o[0]), + min(1.0f - ((1.0f - c[1]) * pixel_scale), o[1]), + min(1.0f - ((1.0f - c[2]) * pixel_scale), o[2])); set_xel(x, y, p); } } @@ -1108,9 +1288,9 @@ darken_sub_image(const PNMImage ©, int xto, int yto, if (has_alpha() && copy.has_alpha()) { for (y = ymin; y < ymax; y++) { for (x = xmin; x < xmax; x++) { - double c = copy.get_alpha(x - xmin + xfrom, y - ymin + yfrom); - double o = get_alpha(x, y); - set_alpha(x, y, min(1.0 - ((1.0 - c) * pixel_scale), o)); + float c = copy.get_alpha(x - xmin + xfrom, y - ymin + yfrom); + float o = get_alpha(x, y); + set_alpha(x, y, min(1.0f - ((1.0f - c) * pixel_scale), o)); } } } @@ -1132,12 +1312,13 @@ darken_sub_image(const PNMImage ©, int xto, int yto, void PNMImage:: lighten_sub_image(const PNMImage ©, int xto, int yto, int xfrom, int yfrom, int x_size, int y_size, - double pixel_scale) { + float pixel_scale) { int xmin, ymin, xmax, ymax; setup_sub_image(copy, xto, yto, xfrom, yfrom, x_size, y_size, xmin, ymin, xmax, ymax); - if (get_maxval() == copy.get_maxval() && pixel_scale == 1.0) { + if (get_maxval() == copy.get_maxval() && pixel_scale == 1.0f && + get_color_space() == CS_linear && copy.get_color_space() == CS_linear) { // The simple case: no pixel value rescaling is required. int x, y; for (y = ymin; y < ymax; y++) { @@ -1165,9 +1346,9 @@ lighten_sub_image(const PNMImage ©, int xto, int yto, int x, y; for (y = ymin; y < ymax; y++) { for (x = xmin; x < xmax; x++) { - LRGBColord c = copy.get_xel(x - xmin + xfrom, y - ymin + yfrom); - LRGBColord o = get_xel(x, y); - LRGBColord p; + LRGBColorf c = copy.get_xel(x - xmin + xfrom, y - ymin + yfrom); + LRGBColorf o = get_xel(x, y); + LRGBColorf p; p.set(max(c[0] * pixel_scale, o[0]), max(c[1] * pixel_scale, o[1]), max(c[2] * pixel_scale, o[2])); @@ -1178,8 +1359,8 @@ lighten_sub_image(const PNMImage ©, int xto, int yto, if (has_alpha() && copy.has_alpha()) { for (y = ymin; y < ymax; y++) { for (x = xmin; x < xmax; x++) { - double c = copy.get_alpha(x - xmin + xfrom, y - ymin + yfrom); - double o = get_alpha(x, y); + float c = copy.get_alpha(x - xmin + xfrom, y - ymin + yfrom); + float o = get_alpha(x, y); set_alpha(x, y, max(c * pixel_scale, o)); } } @@ -1210,15 +1391,16 @@ lighten_sub_image(const PNMImage ©, int xto, int yto, // both be 1x1 images instead of the source image size. //////////////////////////////////////////////////////////////////// void PNMImage:: -threshold(const PNMImage &select_image, int channel, double threshold, +threshold(const PNMImage &select_image, int channel, float threshold, const PNMImage <, const PNMImage &ge) { nassertv(get_x_size() <= select_image.get_x_size() && get_y_size() <= select_image.get_y_size()); nassertv(channel >= 0 && channel < select_image.get_num_channels()); - xelval threshold_val = (xelval)(select_image.get_maxval() * threshold + 0.5); + xelval threshold_val = select_image.to_val(threshold); - if (lt.get_x_size() == 1 && lt.get_y_size() == 1 && + if (lt.get_x_size() == 1 && lt.get_y_size() == 1 && ge.get_x_size() == 1 && ge.get_y_size() == 1) { + // FIXME: what if select_image has different color space? // 1x1 source images. xel lt_val = lt.get_xel_val(0, 0); xelval lt_alpha = 0; @@ -1226,10 +1408,10 @@ threshold(const PNMImage &select_image, int channel, double threshold, lt_alpha = lt.get_alpha_val(0, 0); } if (lt.get_maxval() != get_maxval()) { - double scale = (double)get_maxval() / (double)lt.get_maxval(); - PPM_ASSIGN(lt_val, - (xelval)(PPM_GETR(lt_val) * scale + 0.5), - (xelval)(PPM_GETG(lt_val) * scale + 0.5), + float scale = (float)get_maxval() / (float)lt.get_maxval(); + PPM_ASSIGN(lt_val, + (xelval)(PPM_GETR(lt_val) * scale + 0.5), + (xelval)(PPM_GETG(lt_val) * scale + 0.5), (xelval)(PPM_GETB(lt_val) * scale + 0.5)); lt_alpha = (xelval)(lt_alpha * scale + 0.5); } @@ -1240,16 +1422,16 @@ threshold(const PNMImage &select_image, int channel, double threshold, ge_alpha = ge.get_alpha_val(0, 0); } if (ge.get_maxval() != get_maxval()) { - double scale = (double)get_maxval() / (double)ge.get_maxval(); - PPM_ASSIGN(ge_val, - (xelval)(PPM_GETR(ge_val) * scale + 0.5), - (xelval)(PPM_GETG(ge_val) * scale + 0.5), + float scale = (float)get_maxval() / (float)ge.get_maxval(); + PPM_ASSIGN(ge_val, + (xelval)(PPM_GETR(ge_val) * scale + 0.5), + (xelval)(PPM_GETG(ge_val) * scale + 0.5), (xelval)(PPM_GETB(ge_val) * scale + 0.5)); ge_alpha = (xelval)(ge_alpha * scale + 0.5); } int x, y; - + if (channel == 3) { // Further special case: the alpha channel. if (has_alpha() && lt.has_alpha() && ge.has_alpha()) { @@ -1265,7 +1447,7 @@ threshold(const PNMImage &select_image, int channel, double threshold, } } } - + } else { // Don't copy alpha channel. for (y = 0; y < get_y_size(); y++) { @@ -1293,7 +1475,7 @@ threshold(const PNMImage &select_image, int channel, double threshold, } } } - + } else { // Don't copy alpha channel. for (y = 0; y < get_y_size(); y++) { @@ -1307,13 +1489,15 @@ threshold(const PNMImage &select_image, int channel, double threshold, } } } - + } else { // Same-sized source images. nassertv(get_x_size() <= lt.get_x_size() && get_y_size() <= lt.get_y_size()); nassertv(get_x_size() <= ge.get_x_size() && get_y_size() <= ge.get_y_size()); - if (get_maxval() == lt.get_maxval() && get_maxval() == ge.get_maxval()) { + if (get_maxval() == lt.get_maxval() && get_maxval() == ge.get_maxval() && + get_color_space() == lt.get_color_space() && + get_color_space() == ge.get_color_space()) { // Simple case: the maxvals are all equal. Copy by integer value. int x, y; @@ -1430,12 +1614,12 @@ threshold(const PNMImage &select_image, int channel, double threshold, // process. //////////////////////////////////////////////////////////////////// void PNMImage:: -fill_distance_inside(const PNMImage &mask, double threshold, int radius, bool shrink_from_border) { +fill_distance_inside(const PNMImage &mask, float threshold, int radius, bool shrink_from_border) { nassertv(radius <= PNM_MAXMAXVAL); - PNMImage dist(mask.get_x_size(), mask.get_y_size(), 1, radius); + PNMImage dist(mask.get_x_size(), mask.get_y_size(), 1, radius, NULL, CS_linear); dist.fill_val(radius); - xelval threshold_val = (xelval)(mask.get_maxval() * threshold + 0.5); + xelval threshold_val = mask.to_val(threshold); for (int yi = 0; yi < mask.get_y_size(); ++yi) { for (int xi = 0; xi < mask.get_x_size(); ++xi) { @@ -1480,12 +1664,12 @@ fill_distance_inside(const PNMImage &mask, double threshold, int radius, bool sh // process. //////////////////////////////////////////////////////////////////// void PNMImage:: -fill_distance_outside(const PNMImage &mask, double threshold, int radius) { +fill_distance_outside(const PNMImage &mask, float threshold, int radius) { nassertv(radius <= PNM_MAXMAXVAL); - PNMImage dist(mask.get_x_size(), mask.get_y_size(), 1, radius); + PNMImage dist(mask.get_x_size(), mask.get_y_size(), 1, radius, NULL, CS_linear); dist.fill_val(radius); - xelval threshold_val = (xelval)(mask.get_maxval() * threshold + 0.5); + xelval threshold_val = mask.to_val(threshold); for (int yi = 0; yi < mask.get_y_size(); ++yi) { for (int xi = 0; xi < mask.get_x_size(); ++xi) { @@ -1508,14 +1692,14 @@ fill_distance_outside(const PNMImage &mask, double threshold, int radius) { // Does not affect the alpha channel, if any. //////////////////////////////////////////////////////////////////// void PNMImage:: -rescale(double min_val, double max_val) { - double scale = max_val - min_val; +rescale(float min_val, float max_val) { + float scale = max_val - min_val; if (_num_channels <= 2) { // Grayscale. for (int y = 0; y < get_y_size(); y++) { for (int x = 0; x < get_x_size(); x++) { - double val = get_gray(x, y); + float val = get_gray(x, y); set_gray(x, y, (val - min_val) / scale); } } @@ -1523,7 +1707,7 @@ rescale(double min_val, double max_val) { // RGB(A). for (int y = 0; y < get_y_size(); y++) { for (int x = 0; x < get_x_size(); x++) { - LRGBColord xel = get_xel(x, y); + LRGBColorf xel = get_xel(x, y); set_xel(x, y, (xel[0] - min_val) / scale, (xel[1] - min_val) / scale, @@ -1548,7 +1732,8 @@ copy_channel(const PNMImage ©, int xto, int yto, int cto, setup_sub_image(copy, xto, yto, xfrom, yfrom, x_size, y_size, xmin, ymin, xmax, ymax); - if (get_maxval() == copy.get_maxval()) { + if (get_maxval() == copy.get_maxval() && + get_color_space() == copy.get_color_space()) { // The simple case: no pixel value rescaling is required. int x, y; for (y = ymin; y < ymax; y++) { @@ -1601,14 +1786,14 @@ copy_channel(const PNMImage ©, int xto, int yto, int cto, // between fg and bg colors. //////////////////////////////////////////////////////////////////// void PNMImage:: -render_spot(const LColord &fg, const LColord &bg, - double min_radius, double max_radius) { +render_spot(const LColorf &fg, const LColorf &bg, + float min_radius, float max_radius) { if (_x_size == 0 || _y_size == 0) { return; } - double x_scale = 2.0 / _x_size; - double y_scale = 2.0 / _y_size; + float x_scale = 2.0 / _x_size; + float y_scale = 2.0 / _y_size; // If the width is even, x_center1 == x_center0. If the width is // odd, x_center1 == x_center0 + 1. @@ -1617,19 +1802,19 @@ render_spot(const LColord &fg, const LColord &bg, int x_center1 = (_x_size + 1) / 2; int y_center1 = (_y_size + 1) / 2; - double min_r2 = min_radius * min_radius; - double max_r2 = max_radius * max_radius; + float min_r2 = min_radius * min_radius; + float max_r2 = max_radius * max_radius; for (int yi = 0; yi < y_center1; ++yi) { - double y = yi * y_scale; - double y2_inner = y * y; - double y2_outer = (y + y_scale) * (y + y_scale); + float y = yi * y_scale; + float y2_inner = y * y; + float y2_outer = (y + y_scale) * (y + y_scale); for (int xi = 0; xi < x_center1; ++xi) { - double x = xi * x_scale; - double d2_inner = (x * x + y2_inner); - double d2_outer = ((x + x_scale) * (x + x_scale) + y2_outer); - double d2_a = ((x + x_scale) * (x + x_scale) + y2_inner); - double d2_b = (x * x + y2_outer); + float x = xi * x_scale; + float d2_inner = (x * x + y2_inner); + float d2_outer = ((x + x_scale) * (x + x_scale) + y2_outer); + float d2_a = ((x + x_scale) * (x + x_scale) + y2_inner); + float d2_b = (x * x + y2_outer); if ((d2_inner <= min_r2) && (d2_outer <= min_r2) && @@ -1653,14 +1838,14 @@ render_spot(const LColord &fg, const LColord &bg, } else { // This pixel is in a feathered area or along the antialiased edge. - LColord c_outer, c_inner, c_a, c_b; + LColorf c_outer, c_inner, c_a, c_b; compute_spot_pixel(c_outer, d2_outer, min_radius, max_radius, fg, bg); compute_spot_pixel(c_inner, d2_inner, min_radius, max_radius, fg, bg); compute_spot_pixel(c_a, d2_a, min_radius, max_radius, fg, bg); compute_spot_pixel(c_b, d2_b, min_radius, max_radius, fg, bg); // Now average all four pixels for the antialiased result. - LColord c; + LColorf c; c = (c_outer + c_inner + c_a + c_b) * 0.25; set_xel_a(x_center1 - 1 - xi, y_center1 - 1 - yi, c); @@ -1684,10 +1869,11 @@ render_spot(const LColord &fg, const LColord &bg, //////////////////////////////////////////////////////////////////// void PNMImage:: expand_border(int left, int right, int bottom, int top, - const LColord &color) { + const LColorf &color) { PNMImage new_image(get_x_size() + left + right, get_y_size() + bottom + top, - get_num_channels(), get_maxval(), get_type()); + get_num_channels(), get_maxval(), + get_type(), get_color_space()); new_image.fill(color[0], color[1], color[2]); if (has_alpha()) { new_image.alpha_fill(color[3]); @@ -1762,9 +1948,9 @@ make_histogram(PNMImage::Histogram &histogram) { // See also the PerlinNoise2 class in mathutil. //////////////////////////////////////////////////////////////////// void PNMImage:: -perlin_noise_fill(double sx, double sy, int table_size, unsigned long seed) { - double x, y; - double noise; +perlin_noise_fill(float sx, float sy, int table_size, unsigned long seed) { + float x, y; + float noise; PerlinNoise2 perlin (sx * _x_size, sy * _y_size, table_size, seed); for (x = 0; x < _x_size; ++x) { for (y = 0; y < _y_size; ++y) { @@ -1782,11 +1968,11 @@ perlin_noise_fill(double sx, double sy, int table_size, unsigned long seed) { //////////////////////////////////////////////////////////////////// void PNMImage:: perlin_noise_fill(StackedPerlinNoise2 &perlin) { - double x, y; - double noise; + float x, y; + float noise; for (x = 0; x < _x_size; ++x) { for (y = 0; y < _y_size; ++y) { - noise = perlin.noise(x / (double) _x_size, y / (double) _y_size); + noise = perlin.noise(x / (float) _x_size, y / (float) _y_size); set_xel(x, y, 0.5 * (noise + 1.0)); } } @@ -1823,17 +2009,17 @@ remix_channels(const LMatrix4 &conv) { // green_exponent are unused. //////////////////////////////////////////////////////////////////// void PNMImage:: -apply_exponent(double red_exponent, double green_exponent, double blue_exponent, - double alpha_exponent) { +apply_exponent(float red_exponent, float green_exponent, float blue_exponent, + float alpha_exponent) { int num_channels = _num_channels; - if (has_alpha() && alpha_exponent == 1.0) { + if (has_alpha() && alpha_exponent == 1.0f) { // If the alpha_exponent is 1, don't bother to apply it. --num_channels; } int x, y; - if (red_exponent == 1.0 && green_exponent == 1.0 && blue_exponent == 1.0) { + if (red_exponent == 1.0f && green_exponent == 1.0f && blue_exponent == 1.0f) { // If the RGB components are all 1, apply only to the alpha channel. switch (num_channels) { case 1: @@ -1844,7 +2030,7 @@ apply_exponent(double red_exponent, double green_exponent, double blue_exponent, case 4: for (y = 0; y < _y_size; ++y) { for (x = 0; x < _x_size; ++x) { - double alpha = get_alpha(x, y); + float alpha = get_alpha(x, y); alpha = cpow(alpha, blue_exponent); set_alpha(x, y, alpha); } @@ -1859,7 +2045,7 @@ apply_exponent(double red_exponent, double green_exponent, double blue_exponent, case 1: for (y = 0; y < _y_size; ++y) { for (x = 0; x < _x_size; ++x) { - double gray = get_gray(x, y); + float gray = get_gray(x, y); gray = cpow(gray, blue_exponent); set_gray(x, y, gray); } @@ -1869,11 +2055,11 @@ apply_exponent(double red_exponent, double green_exponent, double blue_exponent, case 2: for (y = 0; y < _y_size; ++y) { for (x = 0; x < _x_size; ++x) { - double gray = get_gray(x, y); + float gray = get_gray(x, y); gray = cpow(gray, blue_exponent); set_gray(x, y, gray); - double alpha = get_alpha(x, y); + float alpha = get_alpha(x, y); alpha = cpow(alpha, blue_exponent); set_alpha(x, y, alpha); } @@ -1883,7 +2069,7 @@ apply_exponent(double red_exponent, double green_exponent, double blue_exponent, case 3: for (y = 0; y < _y_size; ++y) { for (x = 0; x < _x_size; ++x) { - LRGBColord color = get_xel(x, y); + LRGBColorf color = get_xel(x, y); color[0] = cpow(color[0], red_exponent); color[1] = cpow(color[1], green_exponent); color[2] = cpow(color[2], blue_exponent); @@ -1895,7 +2081,7 @@ apply_exponent(double red_exponent, double green_exponent, double blue_exponent, case 4: for (y = 0; y < _y_size; ++y) { for (x = 0; x < _x_size; ++x) { - LColord color = get_xel_a(x, y); + LColorf color = get_xel_a(x, y); color[0] = cpow(color[0], red_exponent); color[1] = cpow(color[1], green_exponent); color[2] = cpow(color[2], blue_exponent); @@ -1929,6 +2115,81 @@ setup_rc() { } } +//////////////////////////////////////////////////////////////////// +// Function: PNMImage::setup_encoding +// Access: Private +// Description: Sets the _xel_encoding value apppropriately +// according to the color space, maxval and whether +// the image has an alpha channel, so that to_val and +// from_val will work correctly (and possibly more +// efficiently). +// Should be called after any call to set_maxval. +//////////////////////////////////////////////////////////////////// +void PNMImage:: +setup_encoding() { + if (_maxval == 0) { + _inv_maxval = 0.0f; + } else { + _inv_maxval = 1.0f / (float)_maxval; + } + + if (has_alpha()) { + switch (_color_space) { + case CS_linear: + _xel_encoding = XE_generic_alpha; + break; + + case CS_sRGB: + if (get_maxval() == 255) { + if (has_sse2_sRGB_encode()) { + _xel_encoding = XE_uchar_sRGB_alpha_sse2; + } else { + _xel_encoding = XE_uchar_sRGB_alpha; + } + } else { + _xel_encoding = XE_generic_sRGB_alpha; + } + break; + + case CS_scRGB: + _xel_encoding = XE_scRGB_alpha; + nassertv(get_maxval() == 65535); + break; + + default: + nassertv(false); + break; + } + } else { + switch (_color_space) { + case CS_linear: + _xel_encoding = XE_generic; + break; + + case CS_sRGB: + if (get_maxval() == 255) { + if (has_sse2_sRGB_encode()) { + _xel_encoding = XE_uchar_sRGB_sse2; + } else { + _xel_encoding = XE_uchar_sRGB; + } + } else { + _xel_encoding = XE_generic_sRGB; + } + break; + + case CS_scRGB: + _xel_encoding = XE_scRGB; + nassertv(get_maxval() == 65535); + break; + + default: + nassertv(false); + break; + } + } +} + //////////////////////////////////////////////////////////////////// // Function: PNMImage::do_fill_distance // Access: Private @@ -1937,7 +2198,7 @@ setup_rc() { //////////////////////////////////////////////////////////////////// void PNMImage:: do_fill_distance(int xi, int yi, int d) { - if (xi < 0 || xi >= get_x_size() || + if (xi < 0 || xi >= get_x_size() || yi < 0 || yi >= get_y_size()) { return; } @@ -1958,21 +2219,22 @@ do_fill_distance(int xi, int yi, int d) { // Description: Returns the average color of all of the pixels // in the image. //////////////////////////////////////////////////////////////////// -LRGBColord PNMImage:: +LRGBColorf PNMImage:: get_average_xel() const { - LRGBColord color (LRGBColord::zero()); + LRGBColorf color (LRGBColorf::zero()); if (_x_size == 0 || _y_size == 0) { return color; } + float factor = 1.0f / (float)(_x_size * _y_size); + int x, y; for (x = 0; x < _x_size; ++x) { for (y = 0; y < _y_size; ++y) { - color += get_xel(x, y); + color += get_xel(x, y) * factor; } } - color *= 1.0 / (_x_size * _y_size); return color; } @@ -1982,21 +2244,22 @@ get_average_xel() const { // Description: Returns the average color of all of the pixels // in the image, including the alpha channel. //////////////////////////////////////////////////////////////////// -LColord PNMImage:: +LColorf PNMImage:: get_average_xel_a() const { - LColord color (LColord::zero()); + LColorf color (LColorf::zero()); if (_x_size == 0 || _y_size == 0) { return color; } + float factor = 1.0f / (float)(_x_size * _y_size); + int x, y; for (x = 0; x < _x_size; ++x) { for (y = 0; y < _y_size; ++y) { - color += get_xel_a(x, y); + color += get_xel_a(x, y) * factor; } } - color *= 1.0 / (_x_size * _y_size); return color; } @@ -2006,29 +2269,30 @@ get_average_xel_a() const { // Description: Returns the average grayscale component of all of // the pixels in the image. //////////////////////////////////////////////////////////////////// -double PNMImage:: +float PNMImage:: get_average_gray() const { - double color = 0.0; + float gray = 0.0; if (_x_size == 0 || _y_size == 0) { - return color; + return gray; } int x, y; for (x = 0; x < _x_size; ++x) { for (y = 0; y < _y_size; ++y) { - color += get_gray(x, y); + gray += get_gray(x, y); } } - color *= 1.0 / (_x_size * _y_size); - return color; + gray /= (float)(_x_size * _y_size); + return gray; } //////////////////////////////////////////////////////////////////// // Function: PNMImage::operator ~ // Access: Published -// Description: Returns a new PNMImage that is the -// complement of the current PNMImage. +// Description: Returns a new PNMImage that is the complement of +// this PNMImage. This operation is not color-space +// correct. //////////////////////////////////////////////////////////////////// PNMImage PNMImage:: operator ~ () const { @@ -2065,26 +2329,36 @@ operator ~ () const { //////////////////////////////////////////////////////////////////// void PNMImage:: operator += (const PNMImage &other) { + nassertv(is_valid() && other.is_valid()); nassertv(_x_size == other._x_size && _y_size == other._y_size); - nassertv(_maxval == other._maxval && _maxval == other._maxval); - size_t array_size = _x_size * _y_size; - if (_array != NULL && _alpha != NULL) { - for (size_t i = 0; i < array_size; ++i) { - _array[i].r = clamp_val(_array[i].r + other._array[i].r); - _array[i].g = clamp_val(_array[i].g + other._array[i].g); - _array[i].b = clamp_val(_array[i].b + other._array[i].b); - _alpha[i] = clamp_val(_alpha[i] + other._alpha[i]); + if (get_maxval() == other.get_maxval() && + get_color_space() == CS_linear && + other.get_color_space() == CS_linear) { + size_t array_size = _x_size * _y_size; + + // Simple case: add vals directly. + if (_alpha != NULL && other._alpha != NULL) { + for (size_t i = 0; i < array_size; ++i) { + _array[i].r = clamp_val((int)_array[i].r + (int)other._array[i].r); + _array[i].g = clamp_val((int)_array[i].g + (int)other._array[i].g); + _array[i].b = clamp_val((int)_array[i].b + (int)other._array[i].b); + _alpha[i] = clamp_val((int)_alpha[i] + (int)other._alpha[i]); + } + } else { + for (size_t i = 0; i < array_size; ++i) { + _array[i].r = clamp_val((int)_array[i].r + (int)other._array[i].r); + _array[i].g = clamp_val((int)_array[i].g + (int)other._array[i].g); + _array[i].b = clamp_val((int)_array[i].b + (int)other._array[i].b); + } } - } else if (_array != NULL) { - for (size_t i = 0; i < array_size; ++i) { - _array[i].r = clamp_val(_array[i].r + other._array[i].r); - _array[i].g = clamp_val(_array[i].g + other._array[i].g); - _array[i].b = clamp_val(_array[i].b + other._array[i].b); - } - } else if (_alpha != NULL) { - for (size_t i = 0; i < array_size; ++i) { - _alpha[i] = clamp_val(_alpha[i] + other._alpha[i]); + } else { + // Not a linear color space: convert back and forth. + int x, y; + for (x = 0; x < _x_size; ++x) { + for (y = 0; y < _y_size; ++y) { + set_xel_a(x, y, get_xel_a(x, y) + other.get_xel_a(x, y)); + } } } } @@ -2095,30 +2369,40 @@ operator += (const PNMImage &other) { // Description: Adds the provided color to each pixel in this image. //////////////////////////////////////////////////////////////////// void PNMImage:: -operator += (const LColord &other) { - size_t array_size = _x_size * _y_size; - // Note: don't use to_val here because it clamps values below 0 - int add_r = (int)(other.get_x() * get_maxval() + 0.5); - int add_g = (int)(other.get_y() * get_maxval() + 0.5); - int add_b = (int)(other.get_z() * get_maxval() + 0.5); - int add_a = (int)(other.get_w() * get_maxval() + 0.5); +operator += (const LColorf &other) { + nassertv(is_valid()); - if (_array != NULL && _alpha != NULL) { - for (size_t i = 0; i < array_size; ++i) { - _array[i].r = clamp_val(_array[i].r + add_r); - _array[i].g = clamp_val(_array[i].g + add_g); - _array[i].b = clamp_val(_array[i].b + add_b); - _alpha[i] = clamp_val(_alpha[i] + add_a); + if (get_color_space() == CS_linear) { + size_t array_size = _x_size * _y_size; + + // Note: don't use to_val here because it clamps values below 0 + int add_r = (int)(other.get_x() * get_maxval() + 0.5); + int add_g = (int)(other.get_y() * get_maxval() + 0.5); + int add_b = (int)(other.get_z() * get_maxval() + 0.5); + int add_a = (int)(other.get_w() * get_maxval() + 0.5); + + if (_alpha != NULL) { + for (size_t i = 0; i < array_size; ++i) { + _array[i].r = clamp_val((int)_array[i].r + add_r); + _array[i].g = clamp_val((int)_array[i].g + add_g); + _array[i].b = clamp_val((int)_array[i].b + add_b); + _alpha[i] = clamp_val((int)_alpha[i] + add_a); + } + + } else { + for (size_t i = 0; i < array_size; ++i) { + _array[i].r = clamp_val((int)_array[i].r + add_r); + _array[i].g = clamp_val((int)_array[i].g + add_g); + _array[i].b = clamp_val((int)_array[i].b + add_b); + } } - } else if (_array != NULL) { - for (size_t i = 0; i < array_size; ++i) { - _array[i].r = clamp_val(_array[i].r + add_r); - _array[i].g = clamp_val(_array[i].g + add_g); - _array[i].b = clamp_val(_array[i].b + add_b); - } - } else if (_alpha != NULL) { - for (size_t i = 0; i < array_size; ++i) { - _alpha[i] = clamp_val(_alpha[i] + add_a); + } else { + // Not a linear color space: convert back and forth. + int x, y; + for (x = 0; x < _x_size; ++x) { + for (y = 0; y < _y_size; ++y) { + set_xel_a(x, y, get_xel_a(x, y) + other); + } } } } @@ -2132,26 +2416,36 @@ operator += (const LColord &other) { //////////////////////////////////////////////////////////////////// void PNMImage:: operator -= (const PNMImage &other) { + nassertv(is_valid() && other.is_valid()); nassertv(_x_size == other._x_size && _y_size == other._y_size); - nassertv(_maxval == other._maxval && _maxval == other._maxval); - size_t array_size = _x_size * _y_size; - if (_array != NULL && _alpha != NULL) { - for (size_t i = 0; i < array_size; ++i) { - _array[i].r = clamp_val(_array[i].r - other._array[i].r); - _array[i].g = clamp_val(_array[i].g - other._array[i].g); - _array[i].b = clamp_val(_array[i].b - other._array[i].b); - _alpha[i] = clamp_val(_alpha[i] - other._alpha[i]); + if (get_maxval() == other.get_maxval() && + get_color_space() == CS_linear && + other.get_color_space() == CS_linear) { + size_t array_size = _x_size * _y_size; + + // Simple case: subtract vals directly. + if (_alpha != NULL && other._alpha != NULL) { + for (size_t i = 0; i < array_size; ++i) { + _array[i].r = clamp_val((int)_array[i].r - (int)other._array[i].r); + _array[i].g = clamp_val((int)_array[i].g - (int)other._array[i].g); + _array[i].b = clamp_val((int)_array[i].b - (int)other._array[i].b); + _alpha[i] = clamp_val((int)_alpha[i] - (int)other._alpha[i]); + } + } else { + for (size_t i = 0; i < array_size; ++i) { + _array[i].r = clamp_val((int)_array[i].r - (int)other._array[i].r); + _array[i].g = clamp_val((int)_array[i].g - (int)other._array[i].g); + _array[i].b = clamp_val((int)_array[i].b - (int)other._array[i].b); + } } - } else if (_array != NULL) { - for (size_t i = 0; i < array_size; ++i) { - _array[i].r = clamp_val(_array[i].r - other._array[i].r); - _array[i].g = clamp_val(_array[i].g - other._array[i].g); - _array[i].b = clamp_val(_array[i].b - other._array[i].b); - } - } else if (_alpha != NULL) { - for (size_t i = 0; i < array_size; ++i) { - _alpha[i] = clamp_val(_alpha[i] - other._alpha[i]); + } else { + // Not a linear color space: convert back and forth. + int x, y; + for (x = 0; x < _x_size; ++x) { + for (y = 0; y < _y_size; ++y) { + set_xel_a(x, y, get_xel_a(x, y) - other.get_xel_a(x, y)); + } } } } @@ -2163,8 +2457,8 @@ operator -= (const PNMImage &other) { // image. //////////////////////////////////////////////////////////////////// void PNMImage:: -operator -= (const LColord &other) { - (*this) += (-other); +operator -= (const LColorf &other) { + (*this) += -other; } //////////////////////////////////////////////////////////////////// @@ -2178,25 +2472,13 @@ operator -= (const LColord &other) { //////////////////////////////////////////////////////////////////// void PNMImage:: operator *= (const PNMImage &other) { + nassertv(is_valid() && other.is_valid()); nassertv(_x_size == other._x_size && _y_size == other._y_size); - size_t array_size = _x_size * _y_size; - if (_array != NULL && _alpha != NULL) { - for (size_t i = 0; i < array_size; ++i) { - _array[i].r = to_val(from_val(_array[i].r) * other.from_val(other._array[i].r)); - _array[i].g = to_val(from_val(_array[i].g) * other.from_val(other._array[i].g)); - _array[i].b = to_val(from_val(_array[i].b) * other.from_val(other._array[i].b)); - _alpha[i] = to_val(from_val(_alpha[i]) * other.from_val(other._alpha[i])); - } - } else if (_array != NULL) { - for (size_t i = 0; i < array_size; ++i) { - _array[i].r = to_val(from_val(_array[i].r) * other.from_val(other._array[i].r)); - _array[i].g = to_val(from_val(_array[i].g) * other.from_val(other._array[i].g)); - _array[i].b = to_val(from_val(_array[i].b) * other.from_val(other._array[i].b)); - } - } else if (_alpha != NULL) { - for (size_t i = 0; i < array_size; ++i) { - _alpha[i] = to_val(from_val(_alpha[i]) * other.from_val(other._alpha[i])); + int x, y; + for (x = 0; x < _x_size; ++x) { + for (y = 0; y < _y_size; ++y) { + set_xel_a(x, y, get_xel_a(x, y) - other.get_xel_a(x, y)); } } } @@ -2205,28 +2487,38 @@ operator *= (const PNMImage &other) { // Function: PNMImage::operator *= // Access: Published // Description: Multiplies every pixel value in the image by -// a constant floating-point multiplier value. +// a constant floating-point multiplier value. This +// affects all channels. //////////////////////////////////////////////////////////////////// void PNMImage:: -operator *= (double multiplier) { - size_t array_size = _x_size * _y_size; +operator *= (float multiplier) { + nassertv(is_valid()); - if (_array != NULL && _alpha != NULL) { - for (size_t i = 0; i < array_size; ++i) { - _array[i].r = clamp_val(_array[i].r * multiplier); - _array[i].g = clamp_val(_array[i].g * multiplier); - _array[i].b = clamp_val(_array[i].b * multiplier); - _alpha[i] = clamp_val(_alpha[i] * multiplier); + if (get_color_space() == CS_linear) { + size_t array_size = _x_size * _y_size; + + if (_alpha != NULL) { + for (size_t i = 0; i < array_size; ++i) { + _array[i].r = clamp_val((int)(_array[i].r * multiplier + 0.5f)); + _array[i].g = clamp_val((int)(_array[i].g * multiplier + 0.5f)); + _array[i].b = clamp_val((int)(_array[i].b * multiplier + 0.5f)); + _alpha[i] = clamp_val((int)(_alpha[i] * multiplier + 0.5f)); + } + + } else { + for (size_t i = 0; i < array_size; ++i) { + _array[i].r = clamp_val((int)(_array[i].r * multiplier + 0.5f)); + _array[i].g = clamp_val((int)(_array[i].g * multiplier + 0.5f)); + _array[i].b = clamp_val((int)(_array[i].b * multiplier + 0.5f)); + } } - } else if (_array != NULL) { - for (size_t i = 0; i < array_size; ++i) { - _array[i].r = clamp_val(_array[i].r * multiplier); - _array[i].g = clamp_val(_array[i].g * multiplier); - _array[i].b = clamp_val(_array[i].b * multiplier); - } - } else if (_alpha != NULL) { - for (size_t i = 0; i < array_size; ++i) { - _alpha[i] = clamp_val(_alpha[i] * multiplier); + } else { + // Not a linear color space: convert back and forth. + int x, y; + for (x = 0; x < _x_size; ++x) { + for (y = 0; y < _y_size; ++y) { + set_xel_a(x, y, get_xel_a(x, y) * multiplier); + } } } } @@ -2234,30 +2526,40 @@ operator *= (double multiplier) { //////////////////////////////////////////////////////////////////// // Function: PNMImage::operator *= // Access: Published -// Description: Multiples the provided color to each pixel in this -// image. +// Description: Multiplies the provided color to each pixel in this +// image. This is a component-wise multiplication. //////////////////////////////////////////////////////////////////// void PNMImage:: -operator *= (const LColord &other) { - size_t array_size = _x_size * _y_size; +operator *= (const LColorf &other) { + nassertv(is_valid()); - if (_array != NULL && _alpha != NULL) { - for (size_t i = 0; i < array_size; ++i) { - _array[i].r = clamp_val(_array[i].r * other[0]); - _array[i].g = clamp_val(_array[i].g * other[1]); - _array[i].b = clamp_val(_array[i].b * other[2]); - _alpha[i] = clamp_val(_alpha[i] * other[3]); + if (get_color_space() == CS_linear) { + size_t array_size = _x_size * _y_size; + + if (_alpha != NULL) { + for (size_t i = 0; i < array_size; ++i) { + _array[i].r = clamp_val((int)(_array[i].r * other[0] + 0.5f)); + _array[i].g = clamp_val((int)(_array[i].g * other[1] + 0.5f)); + _array[i].b = clamp_val((int)(_array[i].b * other[2] + 0.5f)); + _alpha[i] = clamp_val((int)(_alpha[i] * other[3] + 0.5f)); + } + + } else { + for (size_t i = 0; i < array_size; ++i) { + _array[i].r = clamp_val((int)(_array[i].r * other[0] + 0.5f)); + _array[i].g = clamp_val((int)(_array[i].g * other[1] + 0.5f)); + _array[i].b = clamp_val((int)(_array[i].b * other[2] + 0.5f)); + } } - } else if (_array != NULL) { - for (size_t i = 0; i < array_size; ++i) { - _array[i].r = clamp_val(_array[i].r * other[0]); - _array[i].g = clamp_val(_array[i].g * other[1]); - _array[i].b = clamp_val(_array[i].b * other[2]); - } - } else if (_alpha != NULL) { - for (size_t i = 0; i < array_size; ++i) { - _alpha[i] = clamp_val(_alpha[i] * other[3]); + } else { + // Not a linear color space: convert back and forth. + int x, y; + for (x = 0; x < _x_size; ++x) { + for (y = 0; y < _y_size; ++y) { + LColorf color = get_xel_a(x, y); + color.componentwise_mult(other); + set_xel_a(x, y, color); + } } } } - diff --git a/panda/src/pnmimage/pnmImage.h b/panda/src/pnmimage/pnmImage.h index 59188050d1..b01d5ec974 100644 --- a/panda/src/pnmimage/pnmImage.h +++ b/panda/src/pnmimage/pnmImage.h @@ -19,13 +19,13 @@ #include "pnmImageHeader.h" #include "pnmBrush.h" - +#include "stackedPerlinNoise2.h" +#include "convert_srgb.h" #include "luse.h" class PNMReader; class PNMWriter; class PNMFileType; -class StackedPerlinNoise2; //////////////////////////////////////////////////////////////////// // Class : PNMImage @@ -47,44 +47,59 @@ class StackedPerlinNoise2; // xels manipulated, and written out again, or a black // image may be constructed from scratch. // +// A PNMImage has a color space and a maxval, the +// combination of which defines how a floating-point +// linear color value is encoded as an integer value in +// memory. The functions ending in _val operate on +// encoded colors, whereas the regular ones work with +// linear floating-point values. All operations are +// color space correct unless otherwise specified. +// // The image is of size XSize() by YSize() xels, // numbered from top to bottom, left to right, beginning // at zero. // // Files can be specified by filename, or by an iostream // pointer. The filename "-" refers to stdin or stdout. +// +// This class is not inherently thread-safe; use it +// from a single thread or protect access using a mutex. //////////////////////////////////////////////////////////////////// class EXPCL_PANDA_PNMIMAGE PNMImage : public PNMImageHeader { PUBLISHED: INLINE PNMImage(); PNMImage(const Filename &filename, PNMFileType *type = NULL); INLINE PNMImage(int x_size, int y_size, int num_channels = 3, - xelval maxval = 255, PNMFileType *type = NULL); + xelval maxval = 255, PNMFileType *type = NULL, + ColorSpace color_space = CS_linear); INLINE PNMImage(const PNMImage ©); INLINE void operator = (const PNMImage ©); INLINE ~PNMImage(); INLINE xelval clamp_val(int input_value) const; - INLINE xelval to_val(double input_value) const; - INLINE double from_val(xelval input_value) const; + INLINE xelval to_val(float input_value) const; + INLINE xelval to_alpha_val(float input_value) const; + INLINE float from_val(xelval input_value) const; + INLINE float from_alpha_val(xelval input_value) const; void clear(); void clear(int x_size, int y_size, int num_channels = 3, - xelval maxval = 255, PNMFileType *type = NULL); + xelval maxval = 255, PNMFileType *type = NULL, + ColorSpace color_space = CS_linear); void copy_from(const PNMImage ©); void copy_channel(const PNMImage ©, int src_channel, int dest_channel); void copy_header_from(const PNMImageHeader &header); void take_from(PNMImage &orig); - INLINE void fill(double red, double green, double blue); - INLINE void fill(double gray = 0.0); + INLINE void fill(float red, float green, float blue); + INLINE void fill(float gray = 0.0); void fill_val(xelval red, xelval green, xelval blue); INLINE void fill_val(xelval gray = 0); - INLINE void alpha_fill(double alpha = 0.0); + INLINE void alpha_fill(float alpha = 0.0); void alpha_fill_val(xelval alpha = 0); INLINE void set_read_size(int x_size, int y_size); @@ -92,6 +107,7 @@ PUBLISHED: INLINE bool has_read_size() const; INLINE int get_read_x_size() const; INLINE int get_read_y_size() const; + INLINE ColorSpace get_color_space() const; BLOCKING bool read(const Filename &filename, PNMFileType *type = NULL, bool report_unknown_type = true); @@ -109,11 +125,12 @@ PUBLISHED: INLINE void set_num_channels(int num_channels); void set_color_type(ColorType color_type); + void set_color_space(ColorSpace color_space); INLINE void add_alpha(); INLINE void remove_alpha(); INLINE void make_grayscale(); - void make_grayscale(double rc, double gc, double bc); + void make_grayscale(float rc, float gc, float bc); INLINE void make_rgb(); BLOCKING void reverse_rows(); @@ -124,9 +141,11 @@ PUBLISHED: // The *_val() functions return or set the color values in the range // [0..get_maxval()]. This range may be different for different // images! Use the corresponding functions (without _val()) to work - // in the normalized range [0..1]. + // in the normalized range [0..1]. These return values in the + // image's stored color space. - INLINE const xel &get_xel_val(int x, int y) const; + INLINE xel &get_xel_val(int x, int y); + INLINE xel get_xel_val(int x, int y) const; INLINE void set_xel_val(int x, int y, const xel &value); INLINE void set_xel_val(int x, int y, xelval r, xelval g, xelval b); INLINE void set_xel_val(int x, int y, xelval gray); @@ -145,53 +164,45 @@ PUBLISHED: xelval get_channel_val(int x, int y, int channel) const; void set_channel_val(int x, int y, int channel, xelval value); + float get_channel(int x, int y, int channel) const; + void set_channel(int x, int y, int channel, float value); PixelSpec get_pixel(int x, int y) const; void set_pixel(int x, int y, const PixelSpec &pixel); // The corresponding get_xel(), set_xel(), get_red(), etc. functions // automatically scale their values by get_maxval() into the range - // [0..1]. + // [0..1], and into the linear color space. - INLINE LRGBColord get_xel(int x, int y) const; - INLINE void set_xel(int x, int y, const LRGBColord &value); - INLINE void set_xel(int x, int y, double r, double g, double b); - INLINE void set_xel(int x, int y, double gray); + INLINE LRGBColorf get_xel(int x, int y) const; + INLINE void set_xel(int x, int y, const LRGBColorf &value); + INLINE void set_xel(int x, int y, float r, float g, float b); + INLINE void set_xel(int x, int y, float gray); - INLINE LColord get_xel_a(int x, int y) const; - INLINE void set_xel_a(int x, int y, const LColord &value); - INLINE void set_xel_a(int x, int y, double r, double g, double b, double a); + INLINE LColorf get_xel_a(int x, int y) const; + INLINE void set_xel_a(int x, int y, const LColorf &value); + INLINE void set_xel_a(int x, int y, float r, float g, float b, float a); - INLINE double get_red(int x, int y) const; - INLINE double get_green(int x, int y) const; - INLINE double get_blue(int x, int y) const; - INLINE double get_gray(int x, int y) const; - INLINE double get_alpha(int x, int y) const; + INLINE float get_red(int x, int y) const; + INLINE float get_green(int x, int y) const; + INLINE float get_blue(int x, int y) const; + INLINE float get_gray(int x, int y) const; + INLINE float get_alpha(int x, int y) const; - INLINE void set_red(int x, int y, double r); - INLINE void set_green(int x, int y, double g); - INLINE void set_blue(int x, int y, double b); - INLINE void set_gray(int x, int y, double gray); - INLINE void set_alpha(int x, int y, double a); + INLINE void set_red(int x, int y, float r); + INLINE void set_green(int x, int y, float g); + INLINE void set_blue(int x, int y, float b); + INLINE void set_gray(int x, int y, float gray); + INLINE void set_alpha(int x, int y, float a); - INLINE double get_channel(int x, int y, int channel) const; - INLINE void set_channel(int x, int y, int channel, double value); + INLINE float get_bright(int x, int y) const; + INLINE float get_bright(int x, int y, float rc, float gc, + float bc) const; + INLINE float get_bright(int x, int y, float rc, float gc, + float bc, float ac) const; - INLINE double get_bright(int x, int y) const; - INLINE double get_bright(int x, int y, double rc, double gc, - double bc) const; - INLINE double get_bright(int x, int y, double rc, double gc, - double bc, double ac) const; - - INLINE void blend(int x, int y, const LRGBColord &val, double alpha); - void blend(int x, int y, double r, double g, double b, double alpha); - - // If you're used to the NetPBM library and like working with a 2-d - // array of xels, and using the PNM macros to access their components, - // you may treat the PNMImage as such directly. - - INLINE xel *operator [] (int y); - INLINE const xel *operator [] (int y) const; + INLINE void blend(int x, int y, const LRGBColorf &val, float alpha); + void blend(int x, int y, float r, float g, float b, float alpha); void copy_sub_image(const PNMImage ©, int xto, int yto, int xfrom = 0, int yfrom = 0, @@ -199,71 +210,114 @@ PUBLISHED: void blend_sub_image(const PNMImage ©, int xto, int yto, int xfrom = 0, int yfrom = 0, int x_size = -1, int y_size = -1, - double pixel_scale = 1.0); + float pixel_scale = 1.0); void add_sub_image(const PNMImage ©, int xto, int yto, int xfrom = 0, int yfrom = 0, int x_size = -1, int y_size = -1, - double pixel_scale = 1.0); + float pixel_scale = 1.0); void mult_sub_image(const PNMImage ©, int xto, int yto, int xfrom = 0, int yfrom = 0, int x_size = -1, int y_size = -1, - double pixel_scale = 1.0); + float pixel_scale = 1.0); void darken_sub_image(const PNMImage ©, int xto, int yto, int xfrom = 0, int yfrom = 0, int x_size = -1, int y_size = -1, - double pixel_scale = 1.0); + float pixel_scale = 1.0); void lighten_sub_image(const PNMImage ©, int xto, int yto, int xfrom = 0, int yfrom = 0, int x_size = -1, int y_size = -1, - double pixel_scale = 1.0); - void threshold(const PNMImage &select_image, int channel, double threshold, + float pixel_scale = 1.0); + void threshold(const PNMImage &select_image, int channel, float threshold, const PNMImage <, const PNMImage &ge); - BLOCKING void fill_distance_inside(const PNMImage &mask, double threshold, int radius, bool shrink_from_border); - BLOCKING void fill_distance_outside(const PNMImage &mask, double threshold, int radius); + BLOCKING void fill_distance_inside(const PNMImage &mask, float threshold, int radius, bool shrink_from_border); + BLOCKING void fill_distance_outside(const PNMImage &mask, float threshold, int radius); - void rescale(double min_val, double max_val); + void rescale(float min_val, float max_val); void copy_channel(const PNMImage ©, int xto, int yto, int cto, int xfrom = 0, int yfrom = 0, int cfrom = 0, int x_size = -1, int y_size = -1); - void render_spot(const LColord &fg, const LColord &bg, - double min_radius, double max_radius); + void render_spot(const LColorf &fg, const LColorf &bg, + float min_radius, float max_radius); void expand_border(int left, int right, int bottom, int top, - const LColord &color); + const LColorf &color); // The bodies for the non-inline *_filter() functions can be found // in the file pnm-image-filter.cxx. - INLINE void box_filter(double radius = 1.0); - INLINE void gaussian_filter(double radius = 1.0); + INLINE void box_filter(float radius = 1.0); + INLINE void gaussian_filter(float radius = 1.0); void unfiltered_stretch_from(const PNMImage ©); - void box_filter_from(double radius, const PNMImage ©); - void gaussian_filter_from(double radius, const PNMImage ©); + void box_filter_from(float radius, const PNMImage ©); + void gaussian_filter_from(float radius, const PNMImage ©); void quick_filter_from(const PNMImage ©, int xborder = 0, int yborder = 0); void make_histogram(Histogram &hist); - void perlin_noise_fill(double sx, double sy, int table_size = 256, + void perlin_noise_fill(float sx, float sy, int table_size = 256, unsigned long seed = 0); void perlin_noise_fill(StackedPerlinNoise2 &perlin); void remix_channels(const LMatrix4 &conv); - INLINE void gamma_correct(double from_gamma, double to_gamma); - INLINE void gamma_correct_alpha(double from_gamma, double to_gamma); - INLINE void apply_exponent(double gray_exponent); - INLINE void apply_exponent(double gray_exponent, double alpha_exponent); - INLINE void apply_exponent(double red_exponent, double green_exponent, double blue_exponent); - void apply_exponent(double red_exponent, double green_exponent, double blue_exponent, double alpha_exponent); + INLINE void gamma_correct(float from_gamma, float to_gamma); + INLINE void gamma_correct_alpha(float from_gamma, float to_gamma); + INLINE void apply_exponent(float gray_exponent); + INLINE void apply_exponent(float gray_exponent, float alpha_exponent); + INLINE void apply_exponent(float red_exponent, float green_exponent, float blue_exponent); + void apply_exponent(float red_exponent, float green_exponent, float blue_exponent, float alpha_exponent); - LRGBColord get_average_xel() const; - LColord get_average_xel_a() const; - double get_average_gray() const; + LRGBColorf get_average_xel() const; + LColorf get_average_xel_a() const; + float get_average_gray() const; void do_fill_distance(int xi, int yi, int d); +PUBLISHED: + // Provides an accessor for reading or writing the contents of one row + // of the image in-place. + class EXPCL_PANDA_PNMIMAGE Row { + PUBLISHED: + INLINE size_t size() const; + INLINE LColorf operator[](int x) const; +#ifdef HAVE_PYTHON + INLINE void __setitem__(int x, const LColorf &v); +#endif + INLINE xel &get_xel_val(int x); + INLINE void set_xel_val(int x, const xel &v); + INLINE xelval get_alpha_val(int x) const; + INLINE void set_alpha_val(int x, xelval v); + + public: + INLINE Row(PNMImage &image, int y); + + private: + PNMImage &_image; + int _y; + }; + + // Provides an accessor for reading the contents of one row of the + // image in-place. + class EXPCL_PANDA_PNMIMAGE CRow { + PUBLISHED: + INLINE size_t size() const; + INLINE LColorf operator[](int x) const; + INLINE xel get_xel_val(int x) const; + INLINE xelval get_alpha_val(int x) const; + + public: + INLINE CRow(const PNMImage &image, int y); + + private: + const PNMImage &_image; + int _y; + }; + + INLINE Row operator [] (int y); + INLINE CRow operator [] (int y) const; + public: // Know what you are doing if you access the underlying data arrays // directly. @@ -288,37 +342,62 @@ private: int &xfrom, int &yfrom, int &x_size, int &y_size, int &xmin, int &ymin, int &xmax, int &ymax); - INLINE static void compute_spot_pixel(LColord &c, double d2, - double min_radius, double max_radius, - const LColord &fg, const LColord &bg); + INLINE static void compute_spot_pixel(LColorf &c, float d2, + float min_radius, float max_radius, + const LColorf &fg, const LColorf &bg); void setup_rc(); + void setup_encoding(); PUBLISHED: PNMImage operator ~() const; INLINE PNMImage operator + (const PNMImage &other) const; - INLINE PNMImage operator + (const LColord &other) const; + INLINE PNMImage operator + (const LColorf &other) const; INLINE PNMImage operator - (const PNMImage &other) const; - INLINE PNMImage operator - (const LColord &other) const; + INLINE PNMImage operator - (const LColorf &other) const; INLINE PNMImage operator * (const PNMImage &other) const; - INLINE PNMImage operator * (double multiplier) const; - INLINE PNMImage operator * (const LColord &other) const; + INLINE PNMImage operator * (float multiplier) const; + INLINE PNMImage operator * (const LColorf &other) const; void operator += (const PNMImage &other); - void operator += (const LColord &other); + void operator += (const LColorf &other); void operator -= (const PNMImage &other); - void operator -= (const LColord &other); + void operator -= (const LColorf &other); void operator *= (const PNMImage &other); - void operator *= (double multiplier); - void operator *= (const LColord &other); + void operator *= (float multiplier); + void operator *= (const LColorf &other); private: + friend class Row; + xel *_array; xelval *_alpha; - double _default_rc, _default_gc, _default_bc; + float _default_rc, _default_gc, _default_bc; int _read_x_size, _read_y_size; bool _has_read_size; + + // The reciprocal of _maxval, as an optimization for from_val. + float _inv_maxval; + + // These method pointers contain the implementation for to_val and + // from_val, respectively, dependent on the maxval and color space. + ColorSpace _color_space; + + // The following enum determines which code path we should take in + // the set_xel and get_xel methods. + enum XelEncoding { + XE_generic, + XE_generic_alpha, + XE_generic_sRGB, + XE_generic_sRGB_alpha, + XE_uchar_sRGB, + XE_uchar_sRGB_alpha, + XE_uchar_sRGB_sse2, + XE_uchar_sRGB_alpha_sse2, + XE_scRGB, + XE_scRGB_alpha + } _xel_encoding; }; #include "pnmImage.I" diff --git a/panda/src/pnmimage/pnmImageHeader.I b/panda/src/pnmimage/pnmImageHeader.I index 357ff0e198..0e22848fdd 100644 --- a/panda/src/pnmimage/pnmImageHeader.I +++ b/panda/src/pnmimage/pnmImageHeader.I @@ -23,6 +23,7 @@ PNMImageHeader() { _y_size = 0; _num_channels = 0; _maxval = 255; + _color_space = CS_unspecified; _type = (PNMFileType *)NULL; } @@ -37,6 +38,7 @@ PNMImageHeader(const PNMImageHeader ©) : _y_size(copy._y_size), _num_channels(copy._num_channels), _maxval(copy._maxval), + _color_space(copy._color_space), _type(copy._type) { } @@ -52,6 +54,7 @@ operator = (const PNMImageHeader ©) { _y_size = copy._y_size; _num_channels = copy._num_channels; _maxval = copy._maxval; + _color_space = copy._color_space; _comment = copy._comment; _type = copy._type; } @@ -153,6 +156,17 @@ get_maxval() const { return _maxval; } +//////////////////////////////////////////////////////////////////// +// Function: PNMImageHeader::get_color_space +// Access: Published +// Description: Returns the color space that the image is encoded +// in, or CS_unspecified if unknown. +//////////////////////////////////////////////////////////////////// +INLINE ColorSpace PNMImageHeader:: +get_color_space() const { + return _color_space; +} + //////////////////////////////////////////////////////////////////// // Function: PNMImageHeader::get_x_size // Access: Published diff --git a/panda/src/pnmimage/pnmImageHeader.h b/panda/src/pnmimage/pnmImageHeader.h index d5e6db3b9c..a70bce197c 100644 --- a/panda/src/pnmimage/pnmImageHeader.h +++ b/panda/src/pnmimage/pnmImageHeader.h @@ -24,6 +24,7 @@ #include "pnotify.h" #include "pmap.h" #include "pvector.h" +#include "colorSpace.h" class PNMFileType; class PNMReader; @@ -67,6 +68,7 @@ PUBLISHED: INLINE bool has_alpha() const; INLINE xelval get_maxval() const; + INLINE ColorSpace get_color_space() const; INLINE int get_x_size() const; INLINE int get_y_size() const; @@ -134,7 +136,7 @@ PUBLISHED: INLINE xelval operator [](int n) const; INLINE static int size(); - + void output(ostream &out) const; public: @@ -175,7 +177,7 @@ PUBLISHED: private: PixelCount _pixels; HistMap _hist_map; - }; + }; protected: bool compute_histogram(HistMap &hist, xel *array, xelval *alpha, @@ -187,6 +189,7 @@ protected: int _x_size, _y_size; int _num_channels; xelval _maxval; + ColorSpace _color_space; string _comment; PNMFileType *_type; }; diff --git a/panda/src/pnmimage/pnmPainter.I b/panda/src/pnmimage/pnmPainter.I index ec8dfb7cdd..f0353129d0 100644 --- a/panda/src/pnmimage/pnmPainter.I +++ b/panda/src/pnmimage/pnmPainter.I @@ -82,7 +82,7 @@ get_fill() const { // current pen. //////////////////////////////////////////////////////////////////// INLINE void PNMPainter:: -draw_point(double x, double y) { +draw_point(float x, float y) { draw_line(x, y, x, y); } @@ -93,9 +93,9 @@ draw_point(double x, double y) { // mostly-horizontal line. //////////////////////////////////////////////////////////////////// INLINE void PNMPainter:: -draw_hline_point(int x, double xa, double ya, double xd, double yd, - double pixel_scale) { - double y = (yd * (x - xa) / xd) + ya; +draw_hline_point(int x, float xa, float ya, float xd, float yd, + float pixel_scale) { + float y = (yd * (x - xa) / xd) + ya; int ymax = (int)cceil(y); int ymin = (int)cfloor(y); if (ymax == ymin) { @@ -113,9 +113,9 @@ draw_hline_point(int x, double xa, double ya, double xd, double yd, // mostly-vertical line. //////////////////////////////////////////////////////////////////// INLINE void PNMPainter:: -draw_vline_point(int y, double xa, double ya, double xd, double yd, - double pixel_scale) { - double x = (xd * (y - ya) / yd) + xa; +draw_vline_point(int y, float xa, float ya, float xd, float yd, + float pixel_scale) { + float x = (xd * (y - ya) / yd) + xa; int xmax = (int)cceil(x); int xmin = (int)cfloor(x); if (xmax == xmin) { diff --git a/panda/src/pnmimage/pnmPainter.cxx b/panda/src/pnmimage/pnmPainter.cxx index 60bd988498..8583b0e3f5 100644 --- a/panda/src/pnmimage/pnmPainter.cxx +++ b/panda/src/pnmimage/pnmPainter.cxx @@ -35,8 +35,8 @@ PNMPainter(PNMImage &image, int xo, int yo) : _image(image), _xo(xo), _yo(yo) { - _pen = PNMBrush::make_pixel(LColord(0, 0, 0, 1)); - _fill = PNMBrush::make_pixel(LColord(1, 1, 1, 1)); + _pen = PNMBrush::make_pixel(LColorf(0, 0, 0, 1)); + _fill = PNMBrush::make_pixel(LColorf(1, 1, 1, 1)); } //////////////////////////////////////////////////////////////////// @@ -46,7 +46,7 @@ PNMPainter(PNMImage &image, int xo, int yo) : // current pen. //////////////////////////////////////////////////////////////////// void PNMPainter:: -draw_line(double xa, double ya, double xb, double yb) { +draw_line(float xa, float ya, float xb, float yb) { // Shift the line coordinates to position the center of the pen on // the line. xa -= (_pen->get_xc() - 0.5); @@ -55,8 +55,8 @@ draw_line(double xa, double ya, double xb, double yb) { yb -= (_pen->get_yc() - 0.5); // Compute the line delta. - double xd = xb - xa; - double yd = yb - ya; + float xd = xb - xa; + float yd = yb - ya; if (xa == xb && ya == yb) { // Just a single point. Treat it as a very short horizontal line. @@ -154,16 +154,16 @@ draw_line(double xa, double ya, double xb, double yb) { // opposite corners. //////////////////////////////////////////////////////////////////// void PNMPainter:: -draw_rectangle(double xa, double ya, double xb, double yb) { +draw_rectangle(float xa, float ya, float xb, float yb) { // Make (xa, ya) be the upper-left corner, and (xb, yb) the // lower-right. if (xa > xb) { - double t = xa; + float t = xa; xa = xb; xb = t; } if (ya > yb) { - double t = ya; + float t = ya; ya = yb; yb = t; } diff --git a/panda/src/pnmimage/pnmPainter.h b/panda/src/pnmimage/pnmPainter.h index edc50cc9ae..29d8be1883 100644 --- a/panda/src/pnmimage/pnmPainter.h +++ b/panda/src/pnmimage/pnmPainter.h @@ -41,17 +41,17 @@ PUBLISHED: INLINE void set_fill(PNMBrush *fill); INLINE PNMBrush *get_fill() const; - INLINE void draw_point(double x, double y); - void draw_line(double xa, double ya, double xb, double yb); - void draw_rectangle(double xa, double ya, double xb, double yb); + INLINE void draw_point(float x, float y); + void draw_line(float xa, float ya, float xb, float yb); + void draw_rectangle(float xa, float ya, float xb, float yb); private: - INLINE void draw_hline_point(int x, double xa, double ya, - double xd, double yd, - double pixel_scale); - INLINE void draw_vline_point(int y, double xa, double ya, - double xd, double yd, - double pixel_scale); + INLINE void draw_hline_point(int x, float xa, float ya, + float xd, float yd, + float pixel_scale); + INLINE void draw_vline_point(int y, float xa, float ya, + float xd, float yd, + float pixel_scale); private: PNMImage &_image; diff --git a/panda/src/pnmimage/pnmimage_base.h b/panda/src/pnmimage/pnmimage_base.h index 8d649e8358..b75e6b0b74 100644 --- a/panda/src/pnmimage/pnmimage_base.h +++ b/panda/src/pnmimage/pnmimage_base.h @@ -46,9 +46,6 @@ PUBLISHED: static int size() { return 3; } gray operator [](int i) const { nassertr(i >= 0 && i < 3, 0); return *(&r + i); } gray &operator [](int i) { nassertr(i >= 0 && i < 3, r); return *(&r + i); } -#ifdef HAVE_PYTHON - void __setitem__(int i, gray v) { operator[](i) = v; } -#endif pixel operator + (const pixel &other) const { return pixel(r + other.r, g + other.g, b + other.b); } pixel operator - (const pixel &other) const @@ -62,6 +59,12 @@ PUBLISHED: void operator *= (const double mult) { r *= mult; g *= mult; b *= mult; } +#ifdef HAVE_PYTHON + void output(ostream &out) { + out << "pixel(r=" << r << ", g=" << g << ", b=" << b << ")"; + } +#endif + gray r, g, b; }; @@ -113,9 +116,9 @@ EXPCL_PANDA_PNMIMAGE int pm_writelittlelong(ostream *out, long l); // These ratios are used to compute the brightness of a colored pixel; they // define the relative contributions of each of the components. -static const double lumin_red = 0.299; -static const double lumin_grn = 0.587; -static const double lumin_blu = 0.114; +static const float lumin_red = 0.299f; +static const float lumin_grn = 0.587f; +static const float lumin_blu = 0.114f; #endif diff --git a/panda/src/pnmimagetypes/pnmFileTypePNG.cxx b/panda/src/pnmimagetypes/pnmFileTypePNG.cxx index 153220a0b5..e1e92d46a6 100755 --- a/panda/src/pnmimagetypes/pnmFileTypePNG.cxx +++ b/panda/src/pnmimagetypes/pnmFileTypePNG.cxx @@ -227,17 +227,40 @@ Reader(PNMFileType *type, istream *file, bool owns_file, string magic_number) : png_uint_32 height; int bit_depth; int color_type; + int srgb_intent; + double gamma; png_get_IHDR(_png, _info, &width, &height, &bit_depth, &color_type, NULL, NULL, NULL); + // Look for an sRGB chunk. + if (png_get_sRGB(_png, _info, &srgb_intent) == PNG_INFO_sRGB) { + _color_space = CS_sRGB; + + } else if (png_get_gAMA(_png, _info, &gamma) == PNG_INFO_gAMA) { + // File specifies a gamma. + if (gamma >= 0.99 && gamma <= 1.01) { + _color_space = CS_linear; + + } else if (gamma >= 0.44999 && gamma <= 0.455001) { + // It's probably close enough to sRGB. + _color_space = CS_sRGB; + + } else { + pnmimage_png_cat.warning() + << "Unsupported image gamma " << gamma << ", " + << "please re-export image as sRGB or linear.\n"; + } + } + pnmimage_png_cat.debug() << "width = " << width << " height = " << height << " bit_depth = " - << bit_depth << " color_type = " << color_type << "\n"; + << bit_depth << " color_type = " << color_type + << " color_space = " << _color_space << "\n"; _x_size = width; _y_size = height; - _maxval = ( 1 << bit_depth ) - 1; + _maxval = (1 << bit_depth) - 1; if (bit_depth < 8) { png_set_packing(_png); @@ -342,7 +365,7 @@ read_data(xel *array, xelval *alpha_data) { << "Allocating " << num_rows << " rows of " << row_byte_length << " bytes each.\n"; } - + // We need to read a full copy of the image in first, in libpng's // 2-d array format, mainly because we keep array and alpha data // separately, and there doesn't appear to be good support to get @@ -384,7 +407,7 @@ read_data(xel *array, xelval *alpha_data) { alpha = (source[0] << 8) | source[1]; source += 2; } - + } else { if (get_color) { red = *source; @@ -402,7 +425,7 @@ read_data(xel *array, xelval *alpha_data) { source++; } } - + PPM_ASSIGN(array[pi], red, green, blue); if (get_alpha) { alpha_data[pi] = alpha; @@ -593,9 +616,9 @@ write_data(xel *array, xelval *alpha_data) { if (compute_palette(palette, array, alpha_data, png_max_palette)) { pnmimage_png_cat.debug() << palette.size() << " colors found.\n"; - + int palette_bit_depth = make_png_bit_depth(pm_maxvaltobits(palette.size() - 1)); - + int total_bits = png_bit_depth; if (!is_grayscale()) { total_bits *= 3; @@ -603,7 +626,7 @@ write_data(xel *array, xelval *alpha_data) { if (has_alpha()) { total_bits += png_bit_depth; } - + if (palette_bit_depth < total_bits || _maxval != (1 << true_bit_depth) - 1) { pnmimage_png_cat.debug() @@ -616,7 +639,7 @@ write_data(xel *array, xelval *alpha_data) { // Re-sort the palette to put the semitransparent pixels at the // beginning. sort(palette.begin(), palette.end(), LowAlphaCompare()); - + double palette_scale = 255.0 / _maxval; int num_alpha = 0; @@ -628,7 +651,7 @@ write_data(xel *array, xelval *alpha_data) { if (palette[i]._alpha != _maxval) { num_alpha = i + 1; } - + // Also build a reverse-lookup from color to palette index in // the "histogram" structure. palette_lookup[palette[i]] = i; @@ -664,7 +687,8 @@ write_data(xel *array, xelval *alpha_data) { pnmimage_png_cat.debug() << "width = " << _x_size << " height = " << _y_size << " maxval = " << _maxval << " bit_depth = " - << png_bit_depth << " color_type = " << color_type << "\n"; + << png_bit_depth << " color_type = " << color_type + << " color_space = " << _color_space << "\n"; png_set_IHDR(_png, _info, _x_size, _y_size, png_bit_depth, color_type, PNG_INTERLACE_NONE, @@ -675,6 +699,21 @@ write_data(xel *array, xelval *alpha_data) { png_set_sBIT(_png, _info, &sig_bit); } + // Set the color space, if we know it. + switch (_color_space) { + case CS_linear: + png_set_gAMA(_png, _info, 1.0); + // Not sure if we should set cHRM to anything. + break; + + case CS_sRGB: + png_set_sRGB_gAMA_and_cHRM(_png, _info, PNG_sRGB_INTENT_RELATIVE); + break; + + default: + break; + } + png_write_info(_png, _info); diff --git a/panda/src/pnmtext/config_pnmtext.cxx b/panda/src/pnmtext/config_pnmtext.cxx index 418fc1113a..aa0cab7c93 100644 --- a/panda/src/pnmtext/config_pnmtext.cxx +++ b/panda/src/pnmtext/config_pnmtext.cxx @@ -25,11 +25,11 @@ ConfigureFn(config_pnmtext) { } ConfigVariableDouble text_point_size -("text-point-size", 10.0f); +("text-point-size", 10.0); ConfigVariableDouble text_pixels_per_unit -("text-pixels-per-unit", 40.0f); +("text-pixels-per-unit", 40.0); ConfigVariableDouble text_scale_factor -("text-scale-factor", 2.0f); +("text-scale-factor", 2.0); ConfigVariableBool text_native_antialias ("text-native-antialias", true); diff --git a/panda/src/pnmtext/pnmTextGlyph.cxx b/panda/src/pnmtext/pnmTextGlyph.cxx index 58ae6848a6..91cbcddfc6 100644 --- a/panda/src/pnmtext/pnmTextGlyph.cxx +++ b/panda/src/pnmtext/pnmTextGlyph.cxx @@ -54,8 +54,6 @@ place(PNMImage &dest_image, int xp, int yp, const LColor &fg) { // If we have no image, do nothing. return; } - LRGBColord fg_rgb(fg[0], fg[1], fg[2]); - double fg_alpha = fg[3]; int left = xp + _left; int top = yp - _top; @@ -72,18 +70,11 @@ place(PNMImage &dest_image, int xp, int yp, const LColor &fg) { for (int x = cleft; x < cright; x++) { double gval = get_value(x - left, y - top); if (gval == 1.0) { - dest_image.set_xel(x, y, fg_rgb); - if (dest_image.has_alpha()) { - dest_image.set_alpha(x, y, fg_alpha); - } + dest_image.set_xel_a(x, y, fg); } else if (gval > 0.0) { - LRGBColord bg_rgb = dest_image.get_xel(x, y); - dest_image.set_xel(x, y, fg_rgb * gval + bg_rgb * (1.0 - gval)); - if (dest_image.has_alpha()) { - double bg_alpha = dest_image.get_alpha(x, y); - dest_image.set_alpha(x, y, fg_alpha * gval + bg_alpha * (1.0 - gval)); - } + LColorf bg = dest_image.get_xel_a(x, y); + dest_image.set_xel_a(x, y, fg * gval + bg * (1.0 - gval)); } } } @@ -97,16 +88,12 @@ place(PNMImage &dest_image, int xp, int yp, const LColor &fg) { // called earlier. //////////////////////////////////////////////////////////////////// void PNMTextGlyph:: -place(PNMImage &dest_image, int xp, int yp, const LColor &fg, +place(PNMImage &dest_image, int xp, int yp, const LColor &fg, const LColor &interior) { if (!_image.is_valid()) { // If we have no image, do nothing. return; } - LRGBColord fg_rgb(fg[0], fg[1], fg[2]); - double fg_alpha = fg[3]; - LRGBColord interior_rgb(interior[0], interior[1], interior[2]); - double interior_alpha = interior[3]; int left = xp + _left; int top = yp - _top; @@ -123,38 +110,22 @@ place(PNMImage &dest_image, int xp, int yp, const LColor &fg, for (int x = cleft; x < cright; x++) { double gval = get_value(x - left, y - top); if (gval == 1.0) { - dest_image.set_xel(x, y, fg_rgb); - if (dest_image.has_alpha()) { - dest_image.set_alpha(x, y, fg_alpha); - } + dest_image.set_xel_a(x, y, fg); } else if (gval > 0.0) { bool is_interior = get_interior_flag(x - left, y - top); - LRGBColord bg_rgb; + LColorf bg; if (is_interior) { - bg_rgb = interior_rgb; + bg = interior; } else { - bg_rgb = dest_image.get_xel(x, y); + bg = dest_image.get_xel_a(x, y); } - dest_image.set_xel(x, y, fg_rgb * gval + bg_rgb * (1.0 - gval)); - if (dest_image.has_alpha()) { - double bg_alpha; - - if (is_interior) { - bg_alpha = interior_alpha; - } else { - bg_alpha = dest_image.get_alpha(x, y); - } - dest_image.set_alpha(x, y, fg_alpha * gval + bg_alpha * (1.0 - gval)); - } + dest_image.set_xel_a(x, y, fg * gval + bg * (1.0 - gval)); } else { // gval == 0.0 bool is_interior = get_interior_flag(x - left, y - top); if (is_interior) { - dest_image.set_xel(x, y, interior_rgb); - if (dest_image.has_alpha()) { - dest_image.set_alpha(x, y, interior_alpha); - } + dest_image.set_xel_a(x, y, interior); } } } diff --git a/panda/src/putil/Sources.pp b/panda/src/putil/Sources.pp index 8c72159364..9092bb4292 100644 --- a/panda/src/putil/Sources.pp +++ b/panda/src/putil/Sources.pp @@ -50,8 +50,7 @@ indirectCompareSort.I indirectCompareSort.h \ indirectCompareTo.I indirectCompareTo.h \ ioPtaDatagramFloat.h ioPtaDatagramInt.h \ - ioPtaDatagramShort.h keyboardButton.h lineStream.I \ - lineStream.h lineStreamBuf.I lineStreamBuf.h \ + ioPtaDatagramShort.h keyboardButton.h \ linkedListNode.I linkedListNode.h \ load_prc_file.h \ loaderOptions.I loaderOptions.h \ @@ -103,7 +102,7 @@ globalPointerRegistry.cxx \ ioPtaDatagramFloat.cxx \ ioPtaDatagramInt.cxx ioPtaDatagramShort.cxx \ - keyboardButton.cxx lineStream.cxx lineStreamBuf.cxx \ + keyboardButton.cxx \ linkedListNode.cxx \ load_prc_file.cxx \ loaderOptions.cxx \ @@ -162,8 +161,7 @@ indirectCompareSort.I indirectCompareSort.h \ indirectCompareTo.I indirectCompareTo.h \ ioPtaDatagramFloat.h ioPtaDatagramInt.h \ - ioPtaDatagramShort.h iterator_types.h keyboardButton.h lineStream.I \ - lineStream.h lineStreamBuf.I lineStreamBuf.h \ + ioPtaDatagramShort.h iterator_types.h keyboardButton.h \ linkedListNode.I linkedListNode.h \ load_prc_file.h \ loaderOptions.I loaderOptions.h \ diff --git a/panda/src/putil/bitArray.I b/panda/src/putil/bitArray.I index 2389b39406..151277e6cf 100755 --- a/panda/src/putil/bitArray.I +++ b/panda/src/putil/bitArray.I @@ -142,7 +142,7 @@ INLINE BitArray:: // generic programming algorithms can use BitMask or // BitArray interchangeably. //////////////////////////////////////////////////////////////////// -INLINE bool BitArray:: +CONSTEXPR bool BitArray:: has_max_num_bits() { return false; } @@ -160,10 +160,9 @@ has_max_num_bits() { // is defined so generic programming algorithms can use // BitMask or BitArray interchangeably. //////////////////////////////////////////////////////////////////// -INLINE int BitArray:: +CONSTEXPR int BitArray:: get_max_num_bits() { - nassertr(false, 0); - return 0; + return INT_MAX; } //////////////////////////////////////////////////////////////////// @@ -174,7 +173,7 @@ get_max_num_bits() { // limits the maximum number of bits that may be queried // or set at once by extract() and store(). //////////////////////////////////////////////////////////////////// -INLINE int BitArray:: +CONSTEXPR int BitArray:: get_num_bits_per_word() { return num_bits_per_word; } @@ -393,7 +392,7 @@ get_word(int n) const { // array. //////////////////////////////////////////////////////////////////// INLINE void BitArray:: -set_word(int n, MaskType value) { +set_word(int n, WordType value) { nassertv(n >= 0); ensure_has_word(n); _array[n] = value; diff --git a/panda/src/putil/bitArray.h b/panda/src/putil/bitArray.h index 3a1a85f187..9019f2a6f5 100755 --- a/panda/src/putil/bitArray.h +++ b/panda/src/putil/bitArray.h @@ -43,9 +43,10 @@ class EXPCL_PANDA_PUTIL BitArray { public: typedef BitMaskNative MaskType; typedef MaskType::WordType WordType; - enum { num_bits_per_word = MaskType::num_bits }; PUBLISHED: + enum { num_bits_per_word = MaskType::num_bits }; + INLINE BitArray(); INLINE BitArray(WordType init_value); INLINE BitArray(const BitArray ©); @@ -60,10 +61,10 @@ PUBLISHED: INLINE ~BitArray(); - INLINE static bool has_max_num_bits(); - INLINE static int get_max_num_bits(); + CONSTEXPR static bool has_max_num_bits(); + CONSTEXPR static int get_max_num_bits(); - INLINE static int get_num_bits_per_word(); + CONSTEXPR static int get_num_bits_per_word(); INLINE int get_num_bits() const; INLINE bool get_bit(int index) const; INLINE void set_bit(int index); @@ -91,7 +92,7 @@ PUBLISHED: INLINE int get_num_words() const; INLINE MaskType get_word(int n) const; - INLINE void set_word(int n, MaskType value); + INLINE void set_word(int n, WordType value); void invert_in_place(); bool has_bits_in_common(const BitArray &other) const; diff --git a/panda/src/putil/bitMask.I b/panda/src/putil/bitMask.I index 89a2ca37e6..19a603e7e8 100644 --- a/panda/src/putil/bitMask.I +++ b/panda/src/putil/bitMask.I @@ -164,7 +164,7 @@ INLINE BitMask:: // BitMask or BitArray interchangeably. //////////////////////////////////////////////////////////////////// template -INLINE bool BitMask:: +CONSTEXPR bool BitMask:: has_max_num_bits() { return true; } @@ -183,7 +183,7 @@ has_max_num_bits() { // can use BitMask or BitArray interchangeably. //////////////////////////////////////////////////////////////////// template -INLINE int BitMask:: +CONSTEXPR int BitMask:: get_max_num_bits() { return num_bits; } @@ -195,7 +195,7 @@ get_max_num_bits() { // bitmask. //////////////////////////////////////////////////////////////////// template -INLINE int BitMask:: +CONSTEXPR int BitMask:: get_num_bits() { return num_bits; } diff --git a/panda/src/putil/bitMask.h b/panda/src/putil/bitMask.h index 95c8ea0a6e..64fcdedff0 100644 --- a/panda/src/putil/bitMask.h +++ b/panda/src/putil/bitMask.h @@ -35,9 +35,10 @@ template class BitMask { public: typedef WType WordType; - enum { num_bits = nbits }; PUBLISHED: + enum { num_bits = nbits }; + INLINE BitMask(); INLINE BitMask(WordType init_value); INLINE BitMask(const BitMask ©); @@ -51,10 +52,10 @@ PUBLISHED: INLINE ~BitMask(); - INLINE static bool has_max_num_bits(); - INLINE static int get_max_num_bits(); + CONSTEXPR static bool has_max_num_bits(); + CONSTEXPR static int get_max_num_bits(); - INLINE static int get_num_bits(); + CONSTEXPR static int get_num_bits(); INLINE bool get_bit(int index) const; INLINE void set_bit(int index); INLINE void clear_bit(int index); diff --git a/panda/src/putil/callbackObject_ext.h b/panda/src/putil/callbackObject_ext.h index 1e0ceac72f..d72713da19 100644 --- a/panda/src/putil/callbackObject_ext.h +++ b/panda/src/putil/callbackObject_ext.h @@ -21,6 +21,7 @@ #include "extension.h" #include "pythonCallbackObject.h" +#include "pointerTo.h" #include "py_panda.h" //////////////////////////////////////////////////////////////////// diff --git a/panda/src/putil/colorSpace.cxx b/panda/src/putil/colorSpace.cxx new file mode 100644 index 0000000000..90906fe97e --- /dev/null +++ b/panda/src/putil/colorSpace.cxx @@ -0,0 +1,86 @@ +// Filename: colorSpace.cxx +// Created by: rdb (02Jun14) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + +#include "colorSpace.h" +#include "config_util.h" +#include "configVariableEnum.h" +#include "string_utils.h" + +#include "dconfig.h" +#include "pnotify.h" + +#include + +ColorSpace +parse_color_space_string(const string &str) { + if (cmp_nocase_uh(str, "linear") == 0 || + cmp_nocase_uh(str, "linear-rgb") == 0 || + cmp_nocase_uh(str, "lrgb") == 0) { + return CS_linear; + + } else if (cmp_nocase_uh(str, "srgb") == 0) { + return CS_sRGB; + + } else if (cmp_nocase_uh(str, "scrgb") == 0) { + return CS_scRGB; + + } else if (cmp_nocase_uh(str, "unspecified") == 0) { + return CS_unspecified; + + } else if (cmp_nocase_uh(str, "non-color") == 0) { + // In case we want to add this as an enum value in the future. + return CS_linear; + } + + util_cat->error() + << "Invalid color_space string: " << str << "\n"; + return CS_linear; +} + +string +format_color_space(ColorSpace cs) { + ostringstream strm; + strm << cs; + return strm.str(); +} + +ostream & +operator << (ostream &out, ColorSpace cs) { + switch (cs) { + case CS_linear: + return out << "linear"; + + case CS_sRGB: + return out << "sRGB"; + + case CS_scRGB: + return out << "scRGB"; + + case CS_unspecified: + return out << "unspecified"; + } + + util_cat->error() + << "Invalid color_space value: " << (int)cs << "\n"; + nassertr(false, out); + return out; +} + +istream & +operator >> (istream &in, ColorSpace &cs) { + string word; + in >> word; + cs = parse_color_space_string(word); + return in; +} diff --git a/panda/src/putil/colorSpace.h b/panda/src/putil/colorSpace.h new file mode 100644 index 0000000000..86049c0863 --- /dev/null +++ b/panda/src/putil/colorSpace.h @@ -0,0 +1,54 @@ +// Filename: colorSpace.h +// Created by: rdb (02Jun14) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + +#ifndef COLORSPACE_H +#define COLORSPACE_H + +#include "pandabase.h" + +#include "typedef.h" + +BEGIN_PUBLISH + +enum ColorSpace { + // This value is not a color space, but is used to indicate that + // a color space has not been specified. + CS_unspecified = 0, + + // CS_linear is not a color space per se, but represents the + // working color space of graphics APIs, which is linearized. Since + // the conversion from sRGB to linear is defined, one could posit + // that it has the ITU-R BT.709 primaries, but this isn't meaningful + // as modern graphics APIs do not perform color management. + // All colors in Panda3D are linear unless otherwise specified. + CS_linear, + + // This is the standard, gamma-2.2-corrected sRGB color space, as + // used by the majority of image formats. + CS_sRGB, + + // This is a 16-bit encoded linear color space capable of encoding + // color values in the -0.5...7.4999 range. + CS_scRGB, +}; + +EXPCL_PANDA_PUTIL ColorSpace parse_color_space_string(const string &str); +EXPCL_PANDA_PUTIL string format_color_space(ColorSpace cs); + +END_PUBLISH + +EXPCL_PANDA_PUTIL ostream &operator << (ostream &out, ColorSpace cs); +EXPCL_PANDA_PUTIL istream &operator >> (istream &in, ColorSpace &cs); + +#endif diff --git a/panda/src/putil/config_util.N b/panda/src/putil/config_util.N index eb48a5c511..4bcc299b1e 100644 --- a/panda/src/putil/config_util.N +++ b/panda/src/putil/config_util.N @@ -1,19 +1,22 @@ +defconstruct ButtonHandle new ButtonHandle(0) + ignoremember _factory ignoremember get_factory ignoretype FactoryBase ignoretype Factory -forcetype string -renametype string CString +# We want to keep our bindings consistent for both 32-bit and 64-bit +# builds (to support multi-arch builds), so we don't export this. +ignoretype BitMaskNative -forcetype DoubleBitMaskNative -forcetype QuadBitMaskNative +forcetype basic_string +renametype basic_string CString forcetype PointerToBase > forcetype PointerToArrayBase -forcetype PTA_ushort -forcetype CPTA_ushort +forcetype PointerToArray +forcetype ConstPointerToArray # This is so the extensions for PTA_ushort are made available. forceinclude "pointerToArray_ext.h" diff --git a/panda/src/putil/doubleBitMask.I b/panda/src/putil/doubleBitMask.I index 05febb27e2..790fb1c744 100644 --- a/panda/src/putil/doubleBitMask.I +++ b/panda/src/putil/doubleBitMask.I @@ -152,7 +152,7 @@ INLINE DoubleBitMask:: // DoubleBitMask or BitArray interchangeably. //////////////////////////////////////////////////////////////////// template -INLINE bool DoubleBitMask:: +CONSTEXPR bool DoubleBitMask:: has_max_num_bits() { return true; } @@ -171,7 +171,7 @@ has_max_num_bits() { // can use DoubleBitMask or BitArray interchangeably. //////////////////////////////////////////////////////////////////// template -INLINE int DoubleBitMask:: +CONSTEXPR int DoubleBitMask:: get_max_num_bits() { return num_bits; } @@ -183,7 +183,7 @@ get_max_num_bits() { // doubleBitMask. //////////////////////////////////////////////////////////////////// template -INLINE int DoubleBitMask:: +CONSTEXPR int DoubleBitMask:: get_num_bits() { return num_bits; } diff --git a/panda/src/putil/doubleBitMask.h b/panda/src/putil/doubleBitMask.h index 2e9b768428..4d4dfcf3b8 100644 --- a/panda/src/putil/doubleBitMask.h +++ b/panda/src/putil/doubleBitMask.h @@ -31,16 +31,16 @@ template class DoubleBitMask { public: - typedef BMType BitMaskType; typedef TYPENAME BMType::WordType WordType; -#ifndef CPPPARSER // interrogate has a problem with these lines. + +PUBLISHED: + typedef BMType BitMaskType; + enum { half_bits = BitMaskType::num_bits, num_bits = BitMaskType::num_bits * 2, }; -#endif // CPPPARSER -PUBLISHED: INLINE DoubleBitMask(); INLINE DoubleBitMask(const DoubleBitMask ©); INLINE DoubleBitMask &operator = (const DoubleBitMask ©); @@ -53,10 +53,10 @@ PUBLISHED: INLINE ~DoubleBitMask(); - INLINE static bool has_max_num_bits(); - INLINE static int get_max_num_bits(); + CONSTEXPR static bool has_max_num_bits(); + CONSTEXPR static int get_max_num_bits(); - INLINE static int get_num_bits(); + CONSTEXPR static int get_num_bits(); INLINE bool get_bit(int index) const; INLINE void set_bit(int index); INLINE void clear_bit(int index); diff --git a/panda/src/putil/keyboardButton.cxx b/panda/src/putil/keyboardButton.cxx index 6b728096da..e683e37d0a 100644 --- a/panda/src/putil/keyboardButton.cxx +++ b/panda/src/putil/keyboardButton.cxx @@ -29,23 +29,6 @@ ascii_key(char ascii_equivalent) { return ButtonRegistry::ptr()->find_ascii_button(ascii_equivalent); } -//////////////////////////////////////////////////////////////////// -// Function: KeyboardButton::ascii_key -// Access: Public, Static -// Description: Returns the ButtonHandle associated with the -// particular ASCII character (taken from the first -// character of the indicated string), if there is one, -// or ButtonHandle::none() if there is not. -//////////////////////////////////////////////////////////////////// -ButtonHandle KeyboardButton:: -ascii_key(const string &ascii_equivalent) { - if (ascii_equivalent.empty()) { - return ButtonHandle::none(); - } else { - return ButtonRegistry::ptr()->find_ascii_button(ascii_equivalent[0]); - } -} - #define DEFINE_KEYBD_BUTTON_HANDLE(KeyName) \ static ButtonHandle _##KeyName; \ ButtonHandle KeyboardButton::KeyName() { return _##KeyName; } diff --git a/panda/src/putil/keyboardButton.h b/panda/src/putil/keyboardButton.h index cd74d7d023..499a087e0e 100644 --- a/panda/src/putil/keyboardButton.h +++ b/panda/src/putil/keyboardButton.h @@ -28,7 +28,6 @@ class EXPCL_PANDA_PUTIL KeyboardButton { PUBLISHED: static ButtonHandle ascii_key(char ascii_equivalent); - static ButtonHandle ascii_key(const string &ascii_equivalent); static ButtonHandle space(); static ButtonHandle backspace(); diff --git a/panda/src/putil/p3putil_composite1.cxx b/panda/src/putil/p3putil_composite1.cxx index 8c68adf9c1..3fd7673773 100644 --- a/panda/src/putil/p3putil_composite1.cxx +++ b/panda/src/putil/p3putil_composite1.cxx @@ -16,6 +16,7 @@ #include "callbackData.cxx" #include "callbackObject.cxx" #include "clockObject.cxx" +#include "colorSpace.cxx" #include "config_util.cxx" #include "configurable.cxx" #include "copyOnWriteObject.cxx" diff --git a/panda/src/putil/p3putil_composite2.cxx b/panda/src/putil/p3putil_composite2.cxx index 36c9062c16..1f3b46718d 100644 --- a/panda/src/putil/p3putil_composite2.cxx +++ b/panda/src/putil/p3putil_composite2.cxx @@ -2,8 +2,6 @@ #include "ioPtaDatagramInt.cxx" #include "ioPtaDatagramShort.cxx" #include "keyboardButton.cxx" -#include "lineStream.cxx" -#include "lineStreamBuf.cxx" #include "linkedListNode.cxx" #include "load_prc_file.cxx" #include "loaderOptions.cxx" diff --git a/panda/src/rocket/rocketRegion.cxx b/panda/src/rocket/rocketRegion.cxx index 433de05a92..6f6bac761e 100644 --- a/panda/src/rocket/rocketRegion.cxx +++ b/panda/src/rocket/rocketRegion.cxx @@ -55,7 +55,9 @@ RocketRegion(GraphicsOutput *window, const LVecBase4 &dr_dimensions, _lens->set_film_size(dimensions.x, -dimensions.y); _lens->set_film_offset(dimensions.x * 0.5, dimensions.y * 0.5); _lens->set_near_far(-1, 1); - set_camera(new Camera(context_name, _lens)); + + PT(Camera) cam = new Camera(context_name, _lens); + set_camera(NodePath(cam)); } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/rocket/rocketRenderInterface.h b/panda/src/rocket/rocketRenderInterface.h index 8f02fe4b23..bc1e64647e 100644 --- a/panda/src/rocket/rocketRenderInterface.h +++ b/panda/src/rocket/rocketRenderInterface.h @@ -63,7 +63,7 @@ private: // Hold the scissor settings and whether or not to enable scissoring. bool _enable_scissor; - LVecBase4f _scissor; + LVecBase4 _scissor; // These are temporarily filled in by render(). CullTraverser *_trav; diff --git a/panda/src/tinydisplay/tinyOsxGraphicsWindow.mm b/panda/src/tinydisplay/tinyOsxGraphicsWindow.mm index 37822be9d3..baf237dab9 100644 --- a/panda/src/tinydisplay/tinyOsxGraphicsWindow.mm +++ b/panda/src/tinydisplay/tinyOsxGraphicsWindow.mm @@ -1192,7 +1192,7 @@ OSStatus TinyOsxGraphicsWindow::handleKeyInput (EventHandlerCallRef myHandler, E if (keyDown) { if ((newModifiers & cmdKey) != 0) { - if (button == KeyboardButton::ascii_key("q") || button == KeyboardButton::ascii_key("w")) { + if (button == KeyboardButton::ascii_key('q') || button == KeyboardButton::ascii_key('w')) { // Command-Q or Command-W: quit the application or close the // window, respectively. For now, we treat them both the // same: close the window. diff --git a/panda/src/wgldisplay/config_wgldisplay.cxx b/panda/src/wgldisplay/config_wgldisplay.cxx index a45c696921..b3c04dc1ba 100644 --- a/panda/src/wgldisplay/config_wgldisplay.cxx +++ b/panda/src/wgldisplay/config_wgldisplay.cxx @@ -42,13 +42,6 @@ ConfigVariableBool gl_do_vidmemsize_check "fullscreen windows, no matter what resolution of window was " "requested. It only affects fullscreen windows.")); -ConfigVariableBool gl_support_fbo - ("gl-support-fbo", true, - PRC_DESC("Configure this false if your GL's implementation of " - "EXT_framebuffer_object is broken. The system might still be " - "able to create buffers using pbuffers or the like.")); - - //////////////////////////////////////////////////////////////////// // Function: init_libwgldisplay // Description: Initializes the library. This must be called at diff --git a/panda/src/wgldisplay/config_wgldisplay.h b/panda/src/wgldisplay/config_wgldisplay.h index 32b04005b9..ecacc851f1 100644 --- a/panda/src/wgldisplay/config_wgldisplay.h +++ b/panda/src/wgldisplay/config_wgldisplay.h @@ -25,7 +25,6 @@ NotifyCategoryDecl(wgldisplay, EXPCL_PANDAGL, EXPTP_PANDAGL); extern ConfigVariableInt gl_force_pixfmt; extern ConfigVariableBool gl_force_invalid; extern ConfigVariableBool gl_do_vidmemsize_check; -extern ConfigVariableBool gl_support_fbo; extern EXPCL_PANDAGL void init_libwgldisplay(); diff --git a/panda/src/wgldisplay/wglGraphicsPipe.cxx b/panda/src/wgldisplay/wglGraphicsPipe.cxx index f4695c3f16..fbfa17a339 100644 --- a/panda/src/wgldisplay/wglGraphicsPipe.cxx +++ b/panda/src/wgldisplay/wglGraphicsPipe.cxx @@ -153,46 +153,32 @@ make_output(const string &name, return new wglGraphicsWindow(engine, this, name, fb_prop, win_prop, flags, gsg, host); } - + // Second thing to try: a GLGraphicsBuffer - + if (retry == 1) { - if ((!gl_support_fbo)|| - (host==0)|| - ((flags&BF_require_parasite)!=0)|| - ((flags&BF_require_window)!=0)) { + if (!gl_support_fbo || host == NULL || + (flags & (BF_require_parasite | BF_require_window)) != 0) { return NULL; } // Early failure - if we are sure that this buffer WONT // meet specs, we can bail out early. - int _fbo_multisample = 0; - if (!ConfigVariableBool("framebuffer-object-multisample", false, PRC_DESC("Enabled Multisample."))) { - _fbo_multisample = 16; - } - if ((flags & BF_fb_props_optional)==0) { + if ((flags & BF_fb_props_optional) == 0) { if (fb_prop.get_indexed_color() || - (fb_prop.get_back_buffers() > 0)|| - (fb_prop.get_accum_bits() > 0)|| - (fb_prop.get_multisamples() > _fbo_multisample)) { + fb_prop.get_back_buffers() > 0 || + fb_prop.get_accum_bits() > 0) { return NULL; } } - if ((wglgsg != 0) && - (wglgsg->is_valid()) && - (!wglgsg->needs_reset()) && - !wglgsg->_supports_framebuffer_object) { - return NULL; - } - - // Early success - if we are sure that this buffer WILL - // meet specs, we can precertify it. - if ((wglgsg != 0) && - (wglgsg->is_valid()) && - (!wglgsg->needs_reset()) && - (wglgsg->_supports_framebuffer_object) && - (wglgsg->_glDrawBuffers != 0)&& - (fb_prop.is_basic())) { - precertify = true; + if (wglgsg != NULL && wglgsg->is_valid() && !wglgsg->needs_reset()) { + if (!wglgsg->_supports_framebuffer_object || + wglgsg->_glDrawBuffers == NULL) { + return NULL; + } else { + // Early success - if we are sure that this buffer WILL + // meet specs, we can precertify it. + precertify = true; + } } return new GLGraphicsBuffer(engine, this, name, fb_prop, win_prop, flags, gsg, host); diff --git a/pandatool/src/imageprogs/imageTrans.cxx b/pandatool/src/imageprogs/imageTrans.cxx index 94b8bcf4d3..b9889f0bbb 100644 --- a/pandatool/src/imageprogs/imageTrans.cxx +++ b/pandatool/src/imageprogs/imageTrans.cxx @@ -85,7 +85,7 @@ run() { case C_rgba: _image.set_num_channels((int)_channels); break; - + case C_r: _image.make_grayscale(1.0, 0.0, 0.0); _image.remove_alpha(); @@ -112,8 +112,8 @@ run() { _color_scale[2] != 1.0f) { for (int yi = 0; yi < _image.get_y_size(); ++yi) { for (int xi = 0; xi < _image.get_x_size(); ++xi) { - LRGBColord rgb = _image.get_xel(xi, yi); - _image.set_xel(xi, yi, + LRGBColorf rgb = _image.get_xel(xi, yi); + _image.set_xel(xi, yi, rgb[0] * _color_scale[0], rgb[1] * _color_scale[1], rgb[2] * _color_scale[2]); diff --git a/pandatool/src/palettizer/paletteImage.cxx b/pandatool/src/palettizer/paletteImage.cxx index 247948c947..8e0edb34d8 100644 --- a/pandatool/src/palettizer/paletteImage.cxx +++ b/pandatool/src/palettizer/paletteImage.cxx @@ -93,8 +93,8 @@ operator = (const PaletteImage::ClearedRegion ©) { //////////////////////////////////////////////////////////////////// void PaletteImage::ClearedRegion:: clear(PNMImage &image) { - LRGBColord rgb(pal->_background[0], pal->_background[1], pal->_background[2]); - double alpha = pal->_background[3]; + LRGBColorf rgb(pal->_background[0], pal->_background[1], pal->_background[2]); + float alpha = pal->_background[3]; for (int y = _y; y < _y + _y_size; y++) { for (int x = _x; x < _x + _x_size; x++) { diff --git a/samples/asteroids/main.py b/samples/asteroids/main.py new file mode 100755 index 0000000000..bf7e7a68c5 --- /dev/null +++ b/samples/asteroids/main.py @@ -0,0 +1,399 @@ +#!/usr/bin/env python + +# Author: Shao Zhang, Phil Saltzman, and Greg Lindley +# Last Updated: 2015-03-13 +# +# This tutorial demonstrates the use of tasks. A task is a function that +# gets called once every frame. They are good for things that need to be +# updated very often. In the case of asteroids, we use tasks to update +# the positions of all the objects, and to check if the bullets or the +# ship have hit the asteroids. +# +# Note: This definitely a complicated example. Tasks are the cores of +# most games so it seemed appropriate to show what a full game in Panda +# could look like. + +from direct.showbase.ShowBase import ShowBase +from panda3d.core import TextNode, TransparencyAttrib +from panda3d.core import LPoint3, LVector3 +from direct.gui.OnscreenText import OnscreenText +from direct.task.Task import Task +from math import sin, cos, pi +from random import randint, choice, random +from direct.interval.MetaInterval import Sequence +from direct.interval.FunctionInterval import Wait, Func +import sys + +# Constants that will control the behavior of the game. It is good to +# group constants like this so that they can be changed once without +# having to find everywhere they are used in code +SPRITE_POS = 55 # At default field of view and a depth of 55, the screen +# dimensions is 40x30 units +SCREEN_X = 20 # Screen goes from -20 to 20 on X +SCREEN_Y = 15 # Screen goes from -15 to 15 on Y +TURN_RATE = 360 # Degrees ship can turn in 1 second +ACCELERATION = 10 # Ship acceleration in units/sec/sec +MAX_VEL = 6 # Maximum ship velocity in units/sec +MAX_VEL_SQ = MAX_VEL ** 2 # Square of the ship velocity +DEG_TO_RAD = pi / 180 # translates degrees to radians for sin and cos +BULLET_LIFE = 2 # How long bullets stay on screen before removed +BULLET_REPEAT = .2 # How often bullets can be fired +BULLET_SPEED = 10 # Speed bullets move +AST_INIT_VEL = 1 # Velocity of the largest asteroids +AST_INIT_SCALE = 3 # Initial asteroid scale +AST_VEL_SCALE = 2.2 # How much asteroid speed multiplies when broken up +AST_SIZE_SCALE = .6 # How much asteroid scale changes when broken up +AST_MIN_SCALE = 1.1 # If and asteroid is smaller than this and is hit, +# it disapears instead of splitting up + + +# This helps reduce the amount of code used by loading objects, since all of +# the objects are pretty much the same. +def loadObject(tex=None, pos=LPoint3(0, 0), depth=SPRITE_POS, scale=1, + transparency=True): + # Every object uses the plane model and is parented to the camera + # so that it faces the screen. + obj = loader.loadModel("models/plane") + obj.reparentTo(camera) + + # Set the initial position and scale. + obj.setPos(pos.getX(), depth, pos.getY()) + obj.setScale(scale) + + # This tells Panda not to worry about the order that things are drawn in + # (ie. disable Z-testing). This prevents an effect known as Z-fighting. + obj.setBin("unsorted", 0) + obj.setDepthTest(False) + + if transparency: + # Enable transparency blending. + obj.setTransparency(TransparencyAttrib.MAlpha) + + if tex: + # Load and set the requested texture. + tex = loader.loadTexture("textures/" + tex) + obj.setTexture(tex, 1) + + return obj + + +# Macro-like function used to reduce the amount to code needed to create the +# on screen instructions +def genLabelText(text, i): + return OnscreenText(text=text, parent=base.a2dTopLeft, pos=(0.07, -.06 * i - 0.1), + fg=(1, 1, 1, 1), align=TextNode.ALeft, shadow=(0, 0, 0, 0.5), scale=.05) + + +class AsteroidsDemo(ShowBase): + + def __init__(self): + # Initialize the ShowBase class from which we inherit, which will + # create a window and set up everything we need for rendering into it. + ShowBase.__init__(self) + + # This code puts the standard title and instruction text on screen + self.title = OnscreenText(text="Panda3D: Tutorial - Tasks", + parent=base.a2dBottomRight, scale=.07, + align=TextNode.ARight, pos=(-0.1, 0.1), + fg=(1, 1, 1, 1), shadow=(0, 0, 0, 0.5)) + self.escapeText = genLabelText("ESC: Quit", 0) + self.leftkeyText = genLabelText("[Left Arrow]: Turn Left (CCW)", 1) + self.rightkeyText = genLabelText("[Right Arrow]: Turn Right (CW)", 2) + self.upkeyText = genLabelText("[Up Arrow]: Accelerate", 3) + self.spacekeyText = genLabelText("[Space Bar]: Fire", 4) + + # Disable default mouse-based camera control. This is a method on the + # ShowBase class from which we inherit. + self.disableMouse() + + # Load the background starfield. + self.setBackgroundColor((0, 0, 0, 1)) + self.bg = loadObject("stars.jpg", scale=146, depth=200, + transparency=False) + + # Load the ship and set its initial velocity. + self.ship = loadObject("ship.png") + self.setVelocity(self.ship, LVector3.zero()) + + # A dictionary of what keys are currently being pressed + # The key events update this list, and our task will query it as input + self.keys = {"turnLeft": 0, "turnRight": 0, + "accel": 0, "fire": 0} + + self.accept("escape", sys.exit) # Escape quits + # Other keys events set the appropriate value in our key dictionary + self.accept("arrow_left", self.setKey, ["turnLeft", 1]) + self.accept("arrow_left-up", self.setKey, ["turnLeft", 0]) + self.accept("arrow_right", self.setKey, ["turnRight", 1]) + self.accept("arrow_right-up", self.setKey, ["turnRight", 0]) + self.accept("arrow_up", self.setKey, ["accel", 1]) + self.accept("arrow_up-up", self.setKey, ["accel", 0]) + self.accept("space", self.setKey, ["fire", 1]) + + # Now we create the task. taskMgr is the task manager that actually + # calls the function each frame. The add method creates a new task. + # The first argument is the function to be called, and the second + # argument is the name for the task. It returns a task object which + # is passed to the function each frame. + self.gameTask = taskMgr.add(self.gameLoop, "gameLoop") + + # Stores the time at which the next bullet may be fired. + self.nextBullet = 0.0 + + # This list will stored fired bullets. + self.bullets = [] + + # Complete initialization by spawning the asteroids. + self.spawnAsteroids() + + # As described earlier, this simply sets a key in the self.keys dictionary + # to the given value. + def setKey(self, key, val): + self.keys[key] = val + + def setVelocity(self, obj, val): + obj.setPythonTag("velocity", val) + + def getVelocity(self, obj): + return obj.getPythonTag("velocity") + + def setExpires(self, obj, val): + obj.setPythonTag("expires", val) + + def getExpires(self, obj): + return obj.getPythonTag("expires") + + def spawnAsteroids(self): + # Control variable for if the ship is alive + self.alive = True + self.asteroids = [] # List that will contain our asteroids + + for i in range(10): + # This loads an asteroid. The texture chosen is random + # from "asteroid1.png" to "asteroid3.png". + asteroid = loadObject("asteroid%d.png" % (randint(1, 3)), + scale=AST_INIT_SCALE) + self.asteroids.append(asteroid) + + # This is kind of a hack, but it keeps the asteroids from spawning + # near the player. It creates the list (-20, -19 ... -5, 5, 6, 7, + # ... 20) and chooses a value from it. Since the player starts at 0 + # and this list doesn't contain anything from -4 to 4, it won't be + # close to the player. + asteroid.setX(choice(tuple(range(-SCREEN_X, -5)) + tuple(range(5, SCREEN_X)))) + # Same thing for Y + asteroid.setZ(choice(tuple(range(-SCREEN_Y, -5)) + tuple(range(5, SCREEN_Y)))) + + # Heading is a random angle in radians + heading = random() * 2 * pi + + # Converts the heading to a vector and multiplies it by speed to + # get a velocity vector + v = LVector3(sin(heading), 0, cos(heading)) * AST_INIT_VEL + self.setVelocity(self.asteroids[i], v) + + # This is our main task function, which does all of the per-frame + # processing. It takes in self like all functions in a class, and task, + # the task object returned by taskMgr. + def gameLoop(self, task): + # Get the time elapsed since the next frame. We need this for our + # distance and velocity calculations. + dt = globalClock.getDt() + + # If the ship is not alive, do nothing. Tasks return Task.cont to + # signify that the task should continue running. If Task.done were + # returned instead, the task would be removed and would no longer be + # called every frame. + if not self.alive: + return Task.cont + + # update ship position + self.updateShip(dt) + + # check to see if the ship can fire + if self.keys["fire"] and task.time > self.nextBullet: + self.fire(task.time) # If so, call the fire function + # And disable firing for a bit + self.nextBullet = task.time + BULLET_REPEAT + # Remove the fire flag until the next spacebar press + self.keys["fire"] = 0 + + # update asteroids + for obj in self.asteroids: + self.updatePos(obj, dt) + + # update bullets + newBulletArray = [] + for obj in self.bullets: + self.updatePos(obj, dt) # Update the bullet + # Bullets have an experation time (see definition of fire) + # If a bullet has not expired, add it to the new bullet list so + # that it will continue to exist. + if self.getExpires(obj) > task.time: + newBulletArray.append(obj) + else: + obj.removeNode() # Otherwise, remove it from the scene. + # Set the bullet array to be the newly updated array + self.bullets = newBulletArray + + # Check bullet collision with asteroids + # In short, it checks every bullet against every asteroid. This is + # quite slow. A big optimization would be to sort the objects left to + # right and check only if they overlap. Framerate can go way down if + # there are many bullets on screen, but for the most part it's okay. + for bullet in self.bullets: + # This range statement makes it step though the asteroid list + # backwards. This is because if an asteroid is removed, the + # elements after it will change position in the list. If you go + # backwards, the length stays constant. + for i in range(len(self.asteroids) - 1, -1, -1): + asteroid = self.asteroids[i] + # Panda's collision detection is more complicated than we need + # here. This is the basic sphere collision check. If the + # distance between the object centers is less than sum of the + # radii of the two objects, then we have a collision. We use + # lengthSquared() since it is faster than length(). + if ((bullet.getPos() - asteroid.getPos()).lengthSquared() < + (((bullet.getScale().getX() + asteroid.getScale().getX()) + * .5) ** 2)): + # Schedule the bullet for removal + self.setExpires(bullet, 0) + self.asteroidHit(i) # Handle the hit + + # Now we do the same collision pass for the ship + shipSize = self.ship.getScale().getX() + for ast in self.asteroids: + # Same sphere collision check for the ship vs. the asteroid + if ((self.ship.getPos() - ast.getPos()).lengthSquared() < + (((shipSize + ast.getScale().getX()) * .5) ** 2)): + # If there is a hit, clear the screen and schedule a restart + self.alive = False # Ship is no longer alive + # Remove every object in asteroids and bullets from the scene + for i in self.asteroids + self.bullets: + i.removeNode() + self.bullets = [] # Clear the bullet list + self.ship.hide() # Hide the ship + # Reset the velocity + self.setVelocity(self.ship, LVector3(0, 0, 0)) + Sequence(Wait(2), # Wait 2 seconds + Func(self.ship.setR, 0), # Reset heading + Func(self.ship.setX, 0), # Reset position X + # Reset position Y (Z for Panda) + Func(self.ship.setZ, 0), + Func(self.ship.show), # Show the ship + Func(self.spawnAsteroids)).start() # Remake asteroids + return Task.cont + + # If the player has successfully destroyed all asteroids, respawn them + if len(self.asteroids) == 0: + self.spawnAsteroids() + + return Task.cont # Since every return is Task.cont, the task will + # continue indefinitely + + # Updates the positions of objects + def updatePos(self, obj, dt): + vel = self.getVelocity(obj) + newPos = obj.getPos() + (vel * dt) + + # Check if the object is out of bounds. If so, wrap it + radius = .5 * obj.getScale().getX() + if newPos.getX() - radius > SCREEN_X: + newPos.setX(-SCREEN_X) + elif newPos.getX() + radius < -SCREEN_X: + newPos.setX(SCREEN_X) + if newPos.getZ() - radius > SCREEN_Y: + newPos.setZ(-SCREEN_Y) + elif newPos.getZ() + radius < -SCREEN_Y: + newPos.setZ(SCREEN_Y) + + obj.setPos(newPos) + + # The handler when an asteroid is hit by a bullet + def asteroidHit(self, index): + # If the asteroid is small it is simply removed + if self.asteroids[index].getScale().getX() <= AST_MIN_SCALE: + self.asteroids[index].removeNode() + # Remove the asteroid from the list of asteroids. + del self.asteroids[index] + else: + # If it is big enough, divide it up into little asteroids. + # First we update the current asteroid. + asteroid = self.asteroids[index] + newScale = asteroid.getScale().getX() * AST_SIZE_SCALE + asteroid.setScale(newScale) # Rescale it + + # The new direction is chosen as perpendicular to the old direction + # This is determined using the cross product, which returns a + # vector perpendicular to the two input vectors. By crossing + # velocity with a vector that goes into the screen, we get a vector + # that is orthagonal to the original velocity in the screen plane. + vel = self.getVelocity(asteroid) + speed = vel.length() * AST_VEL_SCALE + vel.normalize() + vel = LVector3(0, 1, 0).cross(vel) + vel *= speed + self.setVelocity(asteroid, vel) + + # Now we create a new asteroid identical to the current one + newAst = loadObject(scale=newScale) + self.setVelocity(newAst, vel * -1) + newAst.setPos(asteroid.getPos()) + newAst.setTexture(asteroid.getTexture(), 1) + self.asteroids.append(newAst) + + # This updates the ship's position. This is similar to the general update + # but takes into account turn and thrust + def updateShip(self, dt): + heading = self.ship.getR() # Heading is the roll value for this model + # Change heading if left or right is being pressed + if self.keys["turnRight"]: + heading += dt * TURN_RATE + self.ship.setR(heading % 360) + elif self.keys["turnLeft"]: + heading -= dt * TURN_RATE + self.ship.setR(heading % 360) + + # Thrust causes acceleration in the direction the ship is currently + # facing + if self.keys["accel"]: + heading_rad = DEG_TO_RAD * heading + # This builds a new velocity vector and adds it to the current one + # relative to the camera, the screen in Panda is the XZ plane. + # Therefore all of our Y values in our velocities are 0 to signify + # no change in that direction. + newVel = \ + LVector3(sin(heading_rad), 0, cos(heading_rad)) * ACCELERATION * dt + newVel += self.getVelocity(self.ship) + # Clamps the new velocity to the maximum speed. lengthSquared() is + # used again since it is faster than length() + if newVel.lengthSquared() > MAX_VEL_SQ: + newVel.normalize() + newVel *= MAX_VEL + self.setVelocity(self.ship, newVel) + + # Finally, update the position as with any other object + self.updatePos(self.ship, dt) + + # Creates a bullet and adds it to the bullet list + def fire(self, time): + direction = DEG_TO_RAD * self.ship.getR() + pos = self.ship.getPos() + bullet = loadObject("bullet.png", scale=.2) # Create the object + bullet.setPos(pos) + # Velocity is in relation to the ship + vel = (self.getVelocity(self.ship) + + (LVector3(sin(direction), 0, cos(direction)) * + BULLET_SPEED)) + self.setVelocity(bullet, vel) + # Set the bullet expiration time to be a certain amount past the + # current time + self.setExpires(bullet, time + BULLET_LIFE) + + # Finally, add the new bullet to the list + self.bullets.append(bullet) + +# We now have everything we need. Make an instance of the class and start +# 3D rendering +demo = AsteroidsDemo() +demo.run() diff --git a/samples/asteroids/models/plane.egg b/samples/asteroids/models/plane.egg new file mode 100644 index 0000000000..b82f1c0a74 --- /dev/null +++ b/samples/asteroids/models/plane.egg @@ -0,0 +1,39 @@ + { Y-Up } + + { + "maya2egg plane.mb plane.egg" +} + groundPlane_transform { +} + pPlane1 { + pPlaneShape1.verts { + 1 { + -0.5 -0.5 0 + { 0 0 -1 } + { 0 0 } + { 1 1 1 1 } + } + 2 { + -0.5 0.5 0 + { 0 0 -1 } + { 0 1 } + { 1 1 1 1 } + } + 3 { + 0.5 -0.5 0 + { 0 0 -1 } + { 1 0 } + { 1 1 1 1 } + } + 4 { + 0.5 0.5 0 + { 0 0 -1 } + { 1 1 } + { 1 1 1 1 } + } + } + { + { 0 0 -1 } + { 3 4 2 1 { pPlaneShape1.verts } } + } +} diff --git a/samples/asteroids/textures/asteroid1.png b/samples/asteroids/textures/asteroid1.png new file mode 100644 index 0000000000..f5b127e096 Binary files /dev/null and b/samples/asteroids/textures/asteroid1.png differ diff --git a/samples/asteroids/textures/asteroid2.png b/samples/asteroids/textures/asteroid2.png new file mode 100644 index 0000000000..6f61c89657 Binary files /dev/null and b/samples/asteroids/textures/asteroid2.png differ diff --git a/samples/asteroids/textures/asteroid3.png b/samples/asteroids/textures/asteroid3.png new file mode 100644 index 0000000000..0ad15afd2e Binary files /dev/null and b/samples/asteroids/textures/asteroid3.png differ diff --git a/samples/asteroids/textures/bullet.png b/samples/asteroids/textures/bullet.png new file mode 100644 index 0000000000..5af5129c62 Binary files /dev/null and b/samples/asteroids/textures/bullet.png differ diff --git a/samples/asteroids/textures/ship.png b/samples/asteroids/textures/ship.png new file mode 100644 index 0000000000..d7ee706447 Binary files /dev/null and b/samples/asteroids/textures/ship.png differ diff --git a/samples/asteroids/textures/stars.jpg b/samples/asteroids/textures/stars.jpg new file mode 100644 index 0000000000..b56c143569 Binary files /dev/null and b/samples/asteroids/textures/stars.jpg differ diff --git a/samples/ball-in-maze/main.py b/samples/ball-in-maze/main.py new file mode 100755 index 0000000000..1ea47aeb05 --- /dev/null +++ b/samples/ball-in-maze/main.py @@ -0,0 +1,338 @@ +#!/usr/bin/env python + +# Author: Shao Zhang, Phil Saltzman +# Last Updated: 2015-03-13 +# +# This tutorial shows how to detect and respond to collisions. It uses solids +# create in code and the egg files, how to set up collision masks, a traverser, +# and a handler, how to detect collisions, and how to dispatch function based +# on the collisions. All of this is put together to simulate a labyrinth-style +# game + +from direct.showbase.ShowBase import ShowBase +from panda3d.core import CollisionTraverser, CollisionNode +from panda3d.core import CollisionHandlerQueue, CollisionRay +from panda3d.core import Material, LRotationf, NodePath +from panda3d.core import AmbientLight, DirectionalLight +from panda3d.core import TextNode +from panda3d.core import LVector3, BitMask32 +from direct.gui.OnscreenText import OnscreenText +from direct.interval.MetaInterval import Sequence, Parallel +from direct.interval.LerpInterval import LerpFunc +from direct.interval.FunctionInterval import Func, Wait +from direct.task.Task import Task +import sys + +# Some constants for the program +ACCEL = 70 # Acceleration in ft/sec/sec +MAX_SPEED = 5 # Max speed in ft/sec +MAX_SPEED_SQ = MAX_SPEED ** 2 # Squared to make it easier to use lengthSquared +# Instead of length + + +class BallInMazeDemo(ShowBase): + + def __init__(self): + # Initialize the ShowBase class from which we inherit, which will + # create a window and set up everything we need for rendering into it. + ShowBase.__init__(self) + + # This code puts the standard title and instruction text on screen + self.title = \ + OnscreenText(text="Panda3D: Tutorial - Collision Detection", + parent=base.a2dBottomRight, align=TextNode.ARight, + fg=(1, 1, 1, 1), pos=(-0.1, 0.1), scale=.08, + shadow=(0, 0, 0, 0.5)) + self.instructions = \ + OnscreenText(text="Mouse pointer tilts the board", + parent=base.a2dTopLeft, align=TextNode.ALeft, + pos=(0.05, -0.08), fg=(1, 1, 1, 1), scale=.06, + shadow=(0, 0, 0, 0.5)) + + self.accept("escape", sys.exit) # Escape quits + + # Disable default mouse-based camera control. This is a method on the + # ShowBase class from which we inherit. + self.disableMouse() + camera.setPosHpr(0, 0, 25, 0, -90, 0) # Place the camera + + # Load the maze and place it in the scene + self.maze = loader.loadModel("models/maze") + self.maze.reparentTo(render) + + # Most times, you want collisions to be tested against invisible geometry + # rather than every polygon. This is because testing against every polygon + # in the scene is usually too slow. You can have simplified or approximate + # geometry for the solids and still get good results. + # + # Sometimes you'll want to create and position your own collision solids in + # code, but it's often easier to have them built automatically. This can be + # done by adding special tags into an egg file. Check maze.egg and ball.egg + # and look for lines starting with . The part is brackets tells + # Panda exactly what to do. Polyset means to use the polygons in that group + # as solids, while Sphere tells panda to make a collision sphere around them + # Keep means to keep the polygons in the group as visable geometry (good + # for the ball, not for the triggers), and descend means to make sure that + # the settings are applied to any subgroups. + # + # Once we have the collision tags in the models, we can get to them using + # NodePath's find command + + # Find the collision node named wall_collide + self.walls = self.maze.find("**/wall_collide") + + # Collision objects are sorted using BitMasks. BitMasks are ordinary numbers + # with extra methods for working with them as binary bits. Every collision + # solid has both a from mask and an into mask. Before Panda tests two + # objects, it checks to make sure that the from and into collision masks + # have at least one bit in common. That way things that shouldn't interact + # won't. Normal model nodes have collision masks as well. By default they + # are set to bit 20. If you want to collide against actual visable polygons, + # set a from collide mask to include bit 20 + # + # For this example, we will make everything we want the ball to collide with + # include bit 0 + self.walls.node().setIntoCollideMask(BitMask32.bit(0)) + # CollisionNodes are usually invisible but can be shown. Uncomment the next + # line to see the collision walls + #self.walls.show() + + # We will now find the triggers for the holes and set their masks to 0 as + # well. We also set their names to make them easier to identify during + # collisions + self.loseTriggers = [] + for i in range(6): + trigger = self.maze.find("**/hole_collide" + str(i)) + trigger.node().setIntoCollideMask(BitMask32.bit(0)) + trigger.node().setName("loseTrigger") + self.loseTriggers.append(trigger) + # Uncomment this line to see the triggers + # trigger.show() + + # Ground_collide is a single polygon on the same plane as the ground in the + # maze. We will use a ray to collide with it so that we will know exactly + # what height to put the ball at every frame. Since this is not something + # that we want the ball itself to collide with, it has a different + # bitmask. + self.mazeGround = self.maze.find("**/ground_collide") + self.mazeGround.node().setIntoCollideMask(BitMask32.bit(1)) + + # Load the ball and attach it to the scene + # It is on a root dummy node so that we can rotate the ball itself without + # rotating the ray that will be attached to it + self.ballRoot = render.attachNewNode("ballRoot") + self.ball = loader.loadModel("models/ball") + self.ball.reparentTo(self.ballRoot) + + # Find the collison sphere for the ball which was created in the egg file + # Notice that it has a from collision mask of bit 0, and an into collison + # mask of no bits. This means that the ball can only cause collisions, not + # be collided into + self.ballSphere = self.ball.find("**/ball") + self.ballSphere.node().setFromCollideMask(BitMask32.bit(0)) + self.ballSphere.node().setIntoCollideMask(BitMask32.allOff()) + + # No we create a ray to start above the ball and cast down. This is to + # Determine the height the ball should be at and the angle the floor is + # tilting. We could have used the sphere around the ball itself, but it + # would not be as reliable + self.ballGroundRay = CollisionRay() # Create the ray + self.ballGroundRay.setOrigin(0, 0, 10) # Set its origin + self.ballGroundRay.setDirection(0, 0, -1) # And its direction + # Collision solids go in CollisionNode + # Create and name the node + self.ballGroundCol = CollisionNode('groundRay') + self.ballGroundCol.addSolid(self.ballGroundRay) # Add the ray + self.ballGroundCol.setFromCollideMask( + BitMask32.bit(1)) # Set its bitmasks + self.ballGroundCol.setIntoCollideMask(BitMask32.allOff()) + # Attach the node to the ballRoot so that the ray is relative to the ball + # (it will always be 10 feet over the ball and point down) + self.ballGroundColNp = self.ballRoot.attachNewNode(self.ballGroundCol) + # Uncomment this line to see the ray + #self.ballGroundColNp.show() + + # Finally, we create a CollisionTraverser. CollisionTraversers are what + # do the job of walking the scene graph and calculating collisions. + # For a traverser to actually do collisions, you need to call + # traverser.traverse() on a part of the scene. Fortunately, ShowBase + # has a task that does this for the entire scene once a frame. By + # assigning it to self.cTrav, we designate that this is the one that + # it should call traverse() on each frame. + self.cTrav = CollisionTraverser() + + # Collision traversers tell collision handlers about collisions, and then + # the handler decides what to do with the information. We are using a + # CollisionHandlerQueue, which simply creates a list of all of the + # collisions in a given pass. There are more sophisticated handlers like + # one that sends events and another that tries to keep collided objects + # apart, but the results are often better with a simple queue + self.cHandler = CollisionHandlerQueue() + # Now we add the collision nodes that can create a collision to the + # traverser. The traverser will compare these to all others nodes in the + # scene. There is a limit of 32 CollisionNodes per traverser + # We add the collider, and the handler to use as a pair + self.cTrav.addCollider(self.ballSphere, self.cHandler) + self.cTrav.addCollider(self.ballGroundColNp, self.cHandler) + + # Collision traversers have a built in tool to help visualize collisions. + # Uncomment the next line to see it. + #self.cTrav.showCollisions(render) + + # This section deals with lighting for the ball. Only the ball was lit + # because the maze has static lighting pregenerated by the modeler + ambientLight = AmbientLight("ambientLight") + ambientLight.setColor((.55, .55, .55, 1)) + directionalLight = DirectionalLight("directionalLight") + directionalLight.setDirection(LVector3(0, 0, -1)) + directionalLight.setColor((0.375, 0.375, 0.375, 1)) + directionalLight.setSpecularColor((1, 1, 1, 1)) + self.ballRoot.setLight(render.attachNewNode(ambientLight)) + self.ballRoot.setLight(render.attachNewNode(directionalLight)) + + # This section deals with adding a specular highlight to the ball to make + # it look shiny. Normally, this is specified in the .egg file. + m = Material() + m.setSpecular((1, 1, 1, 1)) + m.setShininess(96) + self.ball.setMaterial(m, 1) + + # Finally, we call start for more initialization + self.start() + + def start(self): + # The maze model also has a locator in it for where to start the ball + # To access it we use the find command + startPos = self.maze.find("**/start").getPos() + # Set the ball in the starting position + self.ballRoot.setPos(startPos) + self.ballV = LVector3(0, 0, 0) # Initial velocity is 0 + self.accelV = LVector3(0, 0, 0) # Initial acceleration is 0 + + # Create the movement task, but first make sure it is not already + # running + taskMgr.remove("rollTask") + self.mainLoop = taskMgr.add(self.rollTask, "rollTask") + + # This function handles the collision between the ray and the ground + # Information about the interaction is passed in colEntry + def groundCollideHandler(self, colEntry): + # Set the ball to the appropriate Z value for it to be exactly on the + # ground + newZ = colEntry.getSurfacePoint(render).getZ() + self.ballRoot.setZ(newZ + .4) + + # Find the acceleration direction. First the surface normal is crossed with + # the up vector to get a vector perpendicular to the slope + norm = colEntry.getSurfaceNormal(render) + accelSide = norm.cross(LVector3.up()) + # Then that vector is crossed with the surface normal to get a vector that + # points down the slope. By getting the acceleration in 3D like this rather + # than in 2D, we reduce the amount of error per-frame, reducing jitter + self.accelV = norm.cross(accelSide) + + # This function handles the collision between the ball and a wall + def wallCollideHandler(self, colEntry): + # First we calculate some numbers we need to do a reflection + norm = colEntry.getSurfaceNormal(render) * -1 # The normal of the wall + curSpeed = self.ballV.length() # The current speed + inVec = self.ballV / curSpeed # The direction of travel + velAngle = norm.dot(inVec) # Angle of incidance + hitDir = colEntry.getSurfacePoint(render) - self.ballRoot.getPos() + hitDir.normalize() + # The angle between the ball and the normal + hitAngle = norm.dot(hitDir) + + # Ignore the collision if the ball is either moving away from the wall + # already (so that we don't accidentally send it back into the wall) + # and ignore it if the collision isn't dead-on (to avoid getting caught on + # corners) + if velAngle > 0 and hitAngle > .995: + # Standard reflection equation + reflectVec = (norm * norm.dot(inVec * -1) * 2) + inVec + + # This makes the velocity half of what it was if the hit was dead-on + # and nearly exactly what it was if this is a glancing blow + self.ballV = reflectVec * (curSpeed * (((1 - velAngle) * .5) + .5)) + # Since we have a collision, the ball is already a little bit buried in + # the wall. This calculates a vector needed to move it so that it is + # exactly touching the wall + disp = (colEntry.getSurfacePoint(render) - + colEntry.getInteriorPoint(render)) + newPos = self.ballRoot.getPos() + disp + self.ballRoot.setPos(newPos) + + # This is the task that deals with making everything interactive + def rollTask(self, task): + # Standard technique for finding the amount of time since the last + # frame + dt = globalClock.getDt() + + # If dt is large, then there has been a # hiccup that could cause the ball + # to leave the field if this functions runs, so ignore the frame + if dt > .2: + return Task.cont + + # The collision handler collects the collisions. We dispatch which function + # to handle the collision based on the name of what was collided into + for i in range(self.cHandler.getNumEntries()): + entry = self.cHandler.getEntry(i) + name = entry.getIntoNode().getName() + if name == "wall_collide": + self.wallCollideHandler(entry) + elif name == "ground_collide": + self.groundCollideHandler(entry) + elif name == "loseTrigger": + self.loseGame(entry) + + # Read the mouse position and tilt the maze accordingly + if base.mouseWatcherNode.hasMouse(): + mpos = base.mouseWatcherNode.getMouse() # get the mouse position + self.maze.setP(mpos.getY() * -10) + self.maze.setR(mpos.getX() * 10) + + # Finally, we move the ball + # Update the velocity based on acceleration + self.ballV += self.accelV * dt * ACCEL + # Clamp the velocity to the maximum speed + if self.ballV.lengthSquared() > MAX_SPEED_SQ: + self.ballV.normalize() + self.ballV *= MAX_SPEED + # Update the position based on the velocity + self.ballRoot.setPos(self.ballRoot.getPos() + (self.ballV * dt)) + + # This block of code rotates the ball. It uses something called a quaternion + # to rotate the ball around an arbitrary axis. That axis perpendicular to + # the balls rotation, and the amount has to do with the size of the ball + # This is multiplied on the previous rotation to incrimentally turn it. + prevRot = LRotationf(self.ball.getQuat()) + axis = LVector3.up().cross(self.ballV) + newRot = LRotationf(axis, 45.5 * dt * self.ballV.length()) + self.ball.setQuat(prevRot * newRot) + + return Task.cont # Continue the task indefinitely + + # If the ball hits a hole trigger, then it should fall in the hole. + # This is faked rather than dealing with the actual physics of it. + def loseGame(self, entry): + # The triggers are set up so that the center of the ball should move to the + # collision point to be in the hole + toPos = entry.getInteriorPoint(render) + taskMgr.remove('rollTask') # Stop the maze task + + # Move the ball into the hole over a short sequence of time. Then wait a + # second and call start to reset the game + Sequence( + Parallel( + LerpFunc(self.ballRoot.setX, fromData=self.ballRoot.getX(), + toData=toPos.getX(), duration=.1), + LerpFunc(self.ballRoot.setY, fromData=self.ballRoot.getY(), + toData=toPos.getY(), duration=.1), + LerpFunc(self.ballRoot.setZ, fromData=self.ballRoot.getZ(), + toData=self.ballRoot.getZ() - .9, duration=.2)), + Wait(1), + Func(self.start)).start() + +# Finally, create an instance of our class and start 3d rendering +demo = BallInMazeDemo() +demo.run() diff --git a/samples/ball-in-maze/models/ball.egg.pz b/samples/ball-in-maze/models/ball.egg.pz new file mode 100644 index 0000000000..b2433a951a Binary files /dev/null and b/samples/ball-in-maze/models/ball.egg.pz differ diff --git a/samples/ball-in-maze/models/iron05.jpg b/samples/ball-in-maze/models/iron05.jpg new file mode 100644 index 0000000000..78d53bc163 Binary files /dev/null and b/samples/ball-in-maze/models/iron05.jpg differ diff --git a/samples/ball-in-maze/models/limba.jpg b/samples/ball-in-maze/models/limba.jpg new file mode 100644 index 0000000000..0725b7c1b8 Binary files /dev/null and b/samples/ball-in-maze/models/limba.jpg differ diff --git a/samples/ball-in-maze/models/maze.egg.pz b/samples/ball-in-maze/models/maze.egg.pz new file mode 100644 index 0000000000..a2be4a1287 Binary files /dev/null and b/samples/ball-in-maze/models/maze.egg.pz differ diff --git a/samples/boxing-robots/main.py b/samples/boxing-robots/main.py new file mode 100755 index 0000000000..20d59b02a3 --- /dev/null +++ b/samples/boxing-robots/main.py @@ -0,0 +1,199 @@ +#!/usr/bin/env python + +# Author: Shao Zhang, Phil Saltzman, and Eddie Caanan +# Last Updated: 2015-03-13 +# +# This tutorial shows how to play animations on models aka "actors". +# It is based on the popular game of "Rock 'em Sock 'em Robots". + +from direct.showbase.ShowBase import ShowBase +from panda3d.core import AmbientLight, DirectionalLight +from panda3d.core import TextNode +from panda3d.core import LVector3 +from direct.gui.OnscreenText import OnscreenText +from direct.interval.MetaInterval import Sequence +from direct.interval.FunctionInterval import Func, Wait +from direct.actor import Actor +from random import random +import sys + + +class BoxingRobotDemo(ShowBase): + # Macro-like function used to reduce the amount to code needed to create the + # on screen instructions + + def genLabelText(self, text, i): + return OnscreenText(text=text, parent=base.a2dTopLeft, scale=.05, + pos=(0.1, - 0.1 -.07 * i), fg=(1, 1, 1, 1), + align=TextNode.ALeft) + + def __init__(self): + # Initialize the ShowBase class from which we inherit, which will + # create a window and set up everything we need for rendering into it. + ShowBase.__init__(self) + + # This code puts the standard title and instruction text on screen + self.title = OnscreenText(text="Panda3D: Tutorial - Actors", + parent=base.a2dBottomRight, style=1, + fg=(0, 0, 0, 1), pos=(-0.2, 0.1), + align=TextNode.ARight, scale=.09) + + self.escapeEventText = self.genLabelText("ESC: Quit", 0) + self.akeyEventText = self.genLabelText("[A]: Robot 1 Left Punch", 1) + self.skeyEventText = self.genLabelText("[S]: Robot 1 Right Punch", 2) + self.kkeyEventText = self.genLabelText("[K]: Robot 2 Left Punch", 3) + self.lkeyEventText = self.genLabelText("[L]: Robot 2 Right Punch", 4) + + # Set the camera in a fixed position + self.disableMouse() + camera.setPosHpr(14.5, -15.4, 14, 45, -14, 0) + self.setBackgroundColor(0, 0, 0) + + # Add lighting so that the objects are not drawn flat + self.setupLights() + + # Load the ring + self.ring = loader.loadModel('models/ring') + self.ring.reparentTo(render) + + # Models that use skeletal animation are known as Actors instead of models + # Instead of just one file, the have one file for the main model, and an + # additional file for each playable animation. + # They are loaded using Actor.Actor instead of loader.LoadModel. + # The constructor takes the location of the main object as with a normal model + # and a dictionary (A fancy python structure that is like a lookup table) + # that contains names for animations, and paths to the appropriate + # files + self.robot1 = Actor.Actor('models/robot', + {'leftPunch': 'models/robot_left_punch', + 'rightPunch': 'models/robot_right_punch', + 'headUp': 'models/robot_head_up', + 'headDown': 'models/robot_head_down'}) + + # Actors need to be positioned and parented like normal objects + self.robot1.setPosHprScale(-1, -2.5, 4, 45, 0, 0, 1.25, 1.25, 1.25) + self.robot1.reparentTo(render) + + # We'll repeat the process for the second robot. The only thing that changes + # here is the robot's color and position + self.robot2 = Actor.Actor('models/robot', + {'leftPunch': 'models/robot_left_punch', + 'rightPunch': 'models/robot_right_punch', + 'headUp': 'models/robot_head_up', + 'headDown': 'models/robot_head_down'}) + + # Set the properties of this robot + self.robot2.setPosHprScale(1, 1.5, 4, 225, 0, 0, 1.25, 1.25, 1.25) + self.robot2.setColor((.7, 0, 0, 1)) + self.robot2.reparentTo(render) + + # Now we define how the animated models will move. Animations are played + # through special intervals. In this case we use actor intervals in a + # sequence to play the part of the punch animation where the arm extends, + # call a function to check if the punch landed, and then play the part of the + # animation where the arm retracts + + # Punch sequence for robot 1's left arm + self.robot1.punchLeft = Sequence( + # Interval for the outstreched animation + self.robot1.actorInterval('leftPunch', startFrame=1, endFrame=10), + # Function to check if the punch was successful + Func(self.checkPunch, 2), + # Interval for the retract animation + self.robot1.actorInterval('leftPunch', startFrame=11, endFrame=32)) + + # Punch sequence for robot 1's right arm + self.robot1.punchRight = Sequence( + self.robot1.actorInterval('rightPunch', startFrame=1, endFrame=10), + Func(self.checkPunch, 2), + self.robot1.actorInterval('rightPunch', startFrame=11, endFrame=32)) + + # Punch sequence for robot 2's left arm + self.robot2.punchLeft = Sequence( + self.robot2.actorInterval('leftPunch', startFrame=1, endFrame=10), + Func(self.checkPunch, 1), + self.robot2.actorInterval('leftPunch', startFrame=11, endFrame=32)) + + # Punch sequence for robot 2's right arm + self.robot2.punchRight = Sequence( + self.robot2.actorInterval('rightPunch', startFrame=1, endFrame=10), + Func(self.checkPunch, 1), + self.robot2.actorInterval('rightPunch', startFrame=11, endFrame=32)) + + # We use the same techinique to create a sequence for when a robot is knocked + # out where the head pops up, waits a while, and then resets + + # Head animation for robot 1 + self.robot1.resetHead = Sequence( + # Interval for the head going up. Since no start or end frames were given, + # the entire animation is played. + self.robot1.actorInterval('headUp'), + Wait(1.5), + # The head down animation was animated a little too quickly, so this will + # play it at 75% of it's normal speed + self.robot1.actorInterval('headDown', playRate=.75)) + + # Head animation for robot 2 + self.robot2.resetHead = Sequence( + self.robot2.actorInterval('headUp'), + Wait(1.5), + self.robot2.actorInterval('headDown', playRate=.75)) + + # Now that we have defined the motion, we can define our key input. + # Each fist is bound to a key. When a key is pressed, self.tryPunch checks to + # make sure that the both robots have their heads down, and if they do it + # plays the given interval + self.accept('escape', sys.exit) + self.accept('a', self.tryPunch, [self.robot1.punchLeft]) + self.accept('s', self.tryPunch, [self.robot1.punchRight]) + self.accept('k', self.tryPunch, [self.robot2.punchLeft]) + self.accept('l', self.tryPunch, [self.robot2.punchRight]) + + # tryPunch will play the interval passed to it only if + # neither robot has 'resetHead' playing (a head is up) AND + # the punch interval passed to it is not already playing + def tryPunch(self, interval): + if (not self.robot1.resetHead.isPlaying() and + not self.robot2.resetHead.isPlaying() and + not interval.isPlaying()): + interval.start() + + # checkPunch will determine if a successful punch has been thrown + def checkPunch(self, robot): + if robot == 1: + # punch is directed to robot 1 + # if robot 1 is playing'resetHead', do nothing + if self.robot1.resetHead.isPlaying(): + return + # if robot 1 is not punching... + if (not self.robot1.punchLeft.isPlaying() and + not self.robot1.punchRight.isPlaying()): + # ...15% chance of successful hit + if random() > .85: + self.robot1.resetHead.start() + # Otherwise, only 5% chance of sucessful hit + elif random() > .95: + self.robot1.resetHead.start() + else: + # punch is directed to robot 2, same as above + if self.robot2.resetHead.isPlaying(): + return + if (not self.robot2.punchLeft.isPlaying() and + not self.robot2.punchRight.isPlaying()): + if random() > .85: + self.robot2.resetHead.start() + elif random() > .95: + self.robot2.resetHead.start() + + # This function sets up the lighting + def setupLights(self): + ambientLight = AmbientLight("ambientLight") + ambientLight.setColor((.8, .8, .75, 1)) + directionalLight = DirectionalLight("directionalLight") + directionalLight.setDirection(LVector3(0, 0, -2.5)) + directionalLight.setColor((0.9, 0.8, 0.9, 1)) + render.setLight(render.attachNewNode(ambientLight)) + render.setLight(render.attachNewNode(directionalLight)) + +demo = BoxingRobotDemo() +demo.run() diff --git a/samples/boxing-robots/models/ring.egg.pz b/samples/boxing-robots/models/ring.egg.pz new file mode 100644 index 0000000000..81ca6ca8dd Binary files /dev/null and b/samples/boxing-robots/models/ring.egg.pz differ diff --git a/samples/boxing-robots/models/robot.egg.pz b/samples/boxing-robots/models/robot.egg.pz new file mode 100644 index 0000000000..268c2cbb63 Binary files /dev/null and b/samples/boxing-robots/models/robot.egg.pz differ diff --git a/samples/boxing-robots/models/robot_head_down.egg.pz b/samples/boxing-robots/models/robot_head_down.egg.pz new file mode 100644 index 0000000000..ea9529a1d2 Binary files /dev/null and b/samples/boxing-robots/models/robot_head_down.egg.pz differ diff --git a/samples/boxing-robots/models/robot_head_up.egg.pz b/samples/boxing-robots/models/robot_head_up.egg.pz new file mode 100644 index 0000000000..c2678c835f Binary files /dev/null and b/samples/boxing-robots/models/robot_head_up.egg.pz differ diff --git a/samples/boxing-robots/models/robot_left_punch.egg.pz b/samples/boxing-robots/models/robot_left_punch.egg.pz new file mode 100644 index 0000000000..d7dc06405e Binary files /dev/null and b/samples/boxing-robots/models/robot_left_punch.egg.pz differ diff --git a/samples/boxing-robots/models/robot_right_punch.egg.pz b/samples/boxing-robots/models/robot_right_punch.egg.pz new file mode 100644 index 0000000000..372f3bbd4e Binary files /dev/null and b/samples/boxing-robots/models/robot_right_punch.egg.pz differ diff --git a/samples/bump-mapping/main.py b/samples/bump-mapping/main.py new file mode 100755 index 0000000000..f399dfd909 --- /dev/null +++ b/samples/bump-mapping/main.py @@ -0,0 +1,188 @@ +#!/usr/bin/env python +# +# Bump mapping is a way of making polygonal surfaces look +# less flat. This sample uses normal mapping for all +# surfaces, and also parallax mapping for the column. +# +# This is a tutorial to show how to do normal mapping +# in panda3d using the Shader Generator. + +from direct.showbase.ShowBase import ShowBase +from panda3d.core import loadPrcFileData +from panda3d.core import WindowProperties +from panda3d.core import Filename, Shader +from panda3d.core import AmbientLight, PointLight +from panda3d.core import TextNode +from panda3d.core import LPoint3, LVector3 +from direct.task.Task import Task +from direct.actor.Actor import Actor +from direct.gui.OnscreenText import OnscreenText +from direct.showbase.DirectObject import DirectObject +from direct.filter.CommonFilters import * +import sys +import os + + +# Function to put instructions on the screen. +def addInstructions(pos, msg): + return OnscreenText(text=msg, style=1, fg=(1, 1, 1, 1), scale=.05, + shadow=(0, 0, 0, 1), parent=base.a2dTopLeft, + pos=(0.08, -pos - 0.04), align=TextNode.ALeft) + +# Function to put title on the screen. +def addTitle(text): + return OnscreenText(text=text, style=1, fg=(1, 1, 1, 1), scale=.08, + parent=base.a2dBottomRight, align=TextNode.ARight, + pos=(-0.1, 0.09), shadow=(0, 0, 0, 1)) + + +class BumpMapDemo(ShowBase): + + def __init__(self): + # Configure the parallax mapping settings (these are just the defaults) + loadPrcFileData("", "parallax-mapping-samples 3\n" + "parallax-mapping-scale 0.1") + + # Initialize the ShowBase class from which we inherit, which will + # create a window and set up everything we need for rendering into it. + ShowBase.__init__(self) + + # Check video card capabilities. + if not self.win.getGsg().getSupportsBasicShaders(): + addTitle("Bump Mapping: " + "Video driver reports that Cg shaders are not supported.") + return + + # Post the instructions + self.title = addTitle("Panda3D: Tutorial - Bump Mapping") + self.inst1 = addInstructions(0.06, "Press ESC to exit") + self.inst2 = addInstructions(0.12, "Move mouse to rotate camera") + self.inst3 = addInstructions(0.18, "Left mouse button: Move forwards") + self.inst4 = addInstructions(0.24, "Right mouse button: Move backwards") + self.inst5 = addInstructions(0.30, "Enter: Turn bump maps Off") + + # Load the 'abstract room' model. This is a model of an + # empty room containing a pillar, a pyramid, and a bunch + # of exaggeratedly bumpy textures. + + self.room = loader.loadModel("models/abstractroom") + self.room.reparentTo(render) + + # Make the mouse invisible, turn off normal mouse controls + self.disableMouse() + props = WindowProperties() + props.setCursorHidden(True) + self.win.requestProperties(props) + self.camLens.setFov(60) + + # Set the current viewing target + self.focus = LVector3(55, -55, 20) + self.heading = 180 + self.pitch = 0 + self.mousex = 0 + self.mousey = 0 + self.last = 0 + self.mousebtn = [0, 0, 0] + + # Start the camera control task: + taskMgr.add(self.controlCamera, "camera-task") + self.accept("escape", sys.exit, [0]) + self.accept("mouse1", self.setMouseBtn, [0, 1]) + self.accept("mouse1-up", self.setMouseBtn, [0, 0]) + self.accept("mouse2", self.setMouseBtn, [1, 1]) + self.accept("mouse2-up", self.setMouseBtn, [1, 0]) + self.accept("mouse3", self.setMouseBtn, [2, 1]) + self.accept("mouse3-up", self.setMouseBtn, [2, 0]) + self.accept("enter", self.toggleShader) + self.accept("j", self.rotateLight, [-1]) + self.accept("k", self.rotateLight, [1]) + self.accept("arrow_left", self.rotateCam, [-1]) + self.accept("arrow_right", self.rotateCam, [1]) + + # Add a light to the scene. + self.lightpivot = render.attachNewNode("lightpivot") + self.lightpivot.setPos(0, 0, 25) + self.lightpivot.hprInterval(10, LPoint3(360, 0, 0)).loop() + plight = PointLight('plight') + plight.setColor((1, 1, 1, 1)) + plight.setAttenuation(LVector3(0.7, 0.05, 0)) + plnp = self.lightpivot.attachNewNode(plight) + plnp.setPos(45, 0, 0) + self.room.setLight(plnp) + + # Add an ambient light + alight = AmbientLight('alight') + alight.setColor((0.2, 0.2, 0.2, 1)) + alnp = render.attachNewNode(alight) + self.room.setLight(alnp) + + # Create a sphere to denote the light + sphere = loader.loadModel("models/icosphere") + sphere.reparentTo(plnp) + + # Tell Panda that it should generate shaders performing per-pixel + # lighting for the room. + self.room.setShaderAuto() + + self.shaderenable = 1 + + def setMouseBtn(self, btn, value): + self.mousebtn[btn] = value + + def rotateLight(self, offset): + self.lightpivot.setH(self.lightpivot.getH() + offset * 20) + + def rotateCam(self, offset): + self.heading = self.heading - offset * 10 + + def toggleShader(self): + self.inst5.destroy() + if (self.shaderenable): + self.inst5 = addInstructions(0.30, "Enter: Turn bump maps On") + self.shaderenable = 0 + self.room.setShaderOff() + else: + self.inst5 = addInstructions(0.30, "Enter: Turn bump maps Off") + self.shaderenable = 1 + self.room.setShaderAuto() + + def controlCamera(self, task): + # figure out how much the mouse has moved (in pixels) + md = self.win.getPointer(0) + x = md.getX() + y = md.getY() + if self.win.movePointer(0, 100, 100): + self.heading = self.heading - (x - 100) * 0.2 + self.pitch = self.pitch - (y - 100) * 0.2 + if self.pitch < -45: + self.pitch = -45 + if self.pitch > 45: + self.pitch = 45 + self.camera.setHpr(self.heading, self.pitch, 0) + dir = self.camera.getMat().getRow3(1) + elapsed = task.time - self.last + if self.last == 0: + elapsed = 0 + if self.mousebtn[0]: + self.focus = self.focus + dir * elapsed * 30 + if self.mousebtn[1] or self.mousebtn[2]: + self.focus = self.focus - dir * elapsed * 30 + self.camera.setPos(self.focus - (dir * 5)) + if self.camera.getX() < -59.0: + self.camera.setX(-59) + if self.camera.getX() > 59.0: + self.camera.setX(59) + if self.camera.getY() < -59.0: + self.camera.setY(-59) + if self.camera.getY() > 59.0: + self.camera.setY(59) + if self.camera.getZ() < 5.0: + self.camera.setZ(5) + if self.camera.getZ() > 45.0: + self.camera.setZ(45) + self.focus = self.camera.getPos() + (dir * 5) + self.last = task.time + return Task.cont + +demo = BumpMapDemo() +demo.run() diff --git a/samples/bump-mapping/models/abstractroom.egg b/samples/bump-mapping/models/abstractroom.egg new file mode 100644 index 0000000000..b3f4d5179a --- /dev/null +++ b/samples/bump-mapping/models/abstractroom.egg @@ -0,0 +1,1671 @@ + { Y-Up } + + { + "maya2egg85 -o room.egg room.mb" +} + phong3SG.tref3 { + layingrock-n.jpg + format { rgba } + alpha-file { layingrock-h.jpg } + wrapu { repeat } + wrapv { repeat } + minfilter { linear_mipmap_linear } + magfilter { linear } + envtype { normal_height } +} + phong3SG { + layingrock-c.jpg + format { rgb } + wrapu { repeat } + wrapv { repeat } + minfilter { linear_mipmap_linear } + magfilter { linear } +} + phong2SG.tref1 { + brick-n.jpg + format { rgb } + wrapu { repeat } + wrapv { repeat } + minfilter { linear_mipmap_linear } + magfilter { linear } + envtype { normal } +} + phong2SG { + brick-c.jpg + format { rgb } + wrapu { repeat } + wrapv { repeat } + minfilter { linear_mipmap_linear } + magfilter { linear } +} + phong1SG.tref2 { + fieldstone-n.jpg + format { rgb } + wrapu { repeat } + wrapv { repeat } + minfilter { linear_mipmap_linear } + magfilter { linear } + envtype { normal } +} + phong1SG { + fieldstone-c.jpg + format { rgb } + wrapu { repeat } + wrapv { repeat } + minfilter { linear_mipmap_linear } + magfilter { linear } +} + groundPlane_transform { +} + polySurface2 { + polySurfaceShape2.verts { + 0 { + -60 0 -60 + { + 3 3 + { 0 -3.83044e-009 -1 } + { -1 -3.83044e-009 0 } + } + { -3.83044e-009 1 -3.83044e-009 } + { 1 1 1 1 } + } + 1 { + -60 0 -60 + { + -0.5 -0.5 + { 1 0 0 } + { 0 1 0 } + } + { 0 0 1 } + { 1 1 1 1 } + } + 2 { + -60 0 -60 + { + 1.5 -0.5 + { 0 0 -1 } + { 0 1 0 } + } + { 1 0 0 } + { 1 1 1 1 } + } + 3 { + -60 0 60 + { + 1.5 -0.5 + { -1 0 0 } + { 0 1 0 } + } + { 0 0 -1 } + { 1 1 1 1 } + } + 4 { + -60 0 60 + { + -2 3 + { -5.15653e-008 4.13254e-011 -1 } + { -1 4.13254e-011 5.15653e-008 } + } + { 4.13254e-011 1 4.13254e-011 } + { 1 1 1 1 } + } + 5 { + -60 0 60 + { + -0.5 -0.5 + { 0 0 -1 } + { 0 1 0 } + } + { 1 0 0 } + { 1 1 1 1 } + } + 6 { + -60 50 -60 + { + -0.5 1.5 + { 1 0 0 } + { 0 1 0 } + } + { 0 0 1 } + { 1 1 1 1 } + } + 7 { + -60 50 -60 + { + 1.5 1.5 + { 0 0 -1 } + { 0 1 0 } + } + { 1 0 0 } + { 1 1 1 1 } + } + 8 { + -60 50 60 + { + 1.5 1.5 + { -1 0 0 } + { 0 1 0 } + } + { 0 0 -1 } + { 1 1 1 1 } + } + 9 { + -60 50 60 + { + -0.5 1.5 + { 0 0 -1 } + { 0 1 0 } + } + { 1 0 0 } + { 1 1 1 1 } + } + 10 { + -37.5 0 25 + { + -1.49994 -1 + { 0 0 1 } + { 0 1 0 } + } + { -1 0 0 } + { 1 1 1 1 } + } + 11 { + -37.5 0 25 + { + 2.50006 -1 + { 0 0 1 } + { 0 1 0 } + } + { -1 0 0 } + { 1 1 1 1 } + } + 12 { + -37.5 50 25 + { + -1.49994 2 + { 0 0 1 } + { 0 1 0 } + } + { -1 0 0 } + { 1 1 1 1 } + } + 13 { + -37.5 50 25 + { + 2.50006 2 + { 0 0 1 } + { 0 1 0 } + } + { -1 0 0 } + { 1 1 1 1 } + } + 14 { + -37.5 50 25 + { + -0.541667 2.0625 + { 0 0 -1 } + { -1 0 0 } + } + { 0 -1 0 } + { 1 1 1 1 } + } + 15 { + -36.8882 0 21.1373 + { + 2.30006 -1 + { -0.309017 0 0.951057 } + { 0 1 0 } + } + { -0.951057 0 -0.309017 } + { 1 1 1 1 } + } + 16 { + -36.8882 0 28.8627 + { + -1.29994 -1 + { 0.309017 0 0.951057 } + { 0 1 0 } + } + { -0.951057 0 0.309017 } + { 1 1 1 1 } + } + 17 { + -36.8882 50 21.1373 + { + 2.30006 2 + { -0.309017 0 0.951057 } + { 0 1 0 } + } + { -0.951057 0 -0.309017 } + { 1 1 1 1 } + } + 18 { + -36.8882 50 21.1373 + { + -0.38072 2.03701 + { 6.17012e-006 0 -1 } + { -1 0 -6.17012e-006 } + } + { 0 -1 0 } + { 1 1 1 1 } + } + 19 { + -36.8882 50 28.8627 + { + -1.29994 2 + { 0.309017 0 0.951057 } + { 0 1 0 } + } + { -0.951057 0 0.309017 } + { 1 1 1 1 } + } + 20 { + -36.8882 50 28.8627 + { + -0.702613 2.03701 + { -6.17012e-006 0 -1 } + { -1 0 6.17012e-006 } + } + { 0 -1 0 } + { 1 1 1 1 } + } + 21 { + -35.1127 0 17.6527 + { + 2.10006 -1 + { -0.587785 0 0.809017 } + { 0 1 0 } + } + { -0.809017 0 -0.587785 } + { 1 1 1 1 } + } + 22 { + -35.1127 0 32.3473 + { + -1.09994 -1 + { 0.587785 0 0.809017 } + { 0 1 0 } + } + { -0.809017 0 0.587785 } + { 1 1 1 1 } + } + 23 { + -35.1127 50 17.6527 + { + 2.10006 2 + { -0.587785 0 0.809017 } + { 0 1 0 } + } + { -0.809017 0 -0.587785 } + { 1 1 1 1 } + } + 24 { + -35.1127 50 17.6527 + { + -0.235528 1.96303 + { -1.03074e-007 0 -1 } + { -1 0 1.03074e-007 } + } + { 0 -1 0 } + { 1 1 1 1 } + } + 25 { + -35.1127 50 32.3473 + { + -1.09994 2 + { 0.587785 0 0.809017 } + { 0 1 0 } + } + { -0.809017 0 0.587785 } + { 1 1 1 1 } + } + 26 { + -35.1127 50 32.3473 + { + -0.847805 1.96303 + { 1.03075e-007 0 -1 } + { -1 0 -1.03075e-007 } + } + { 0 -1 0 } + { 1 1 1 1 } + } + 27 { + -32.3473 0 14.8873 + { + 1.90006 -1 + { -0.809017 0 0.587786 } + { 0 1 0 } + } + { -0.587786 0 -0.809017 } + { 1 1 1 1 } + } + 28 { + -32.3473 0 35.1127 + { + -0.899936 -1 + { 0.809017 0 0.587785 } + { 0 1 0 } + } + { -0.587785 0 0.809017 } + { 1 1 1 1 } + } + 29 { + -32.3473 0 35.1127 + { + -0.96303 1.84781 + { 1.52608e-007 4.13254e-011 -1 } + { -1 4.13254e-011 -1.52608e-007 } + } + { 4.13254e-011 1 4.13254e-011 } + { 1 1 1 1 } + } + 30 { + -32.3473 50 14.8873 + { + 1.90006 2 + { -0.809017 0 0.587786 } + { 0 1 0 } + } + { -0.587786 0 -0.809017 } + { 1 1 1 1 } + } + 31 { + -32.3473 50 14.8873 + { + -0.120303 1.84781 + { -8.0634e-006 0 -1 } + { -1 0 8.0634e-006 } + } + { 0 -1 0 } + { 1 1 1 1 } + } + 32 { + -32.3473 50 35.1127 + { + -0.899936 2 + { 0.809017 0 0.587785 } + { 0 1 0 } + } + { -0.587785 0 0.809017 } + { 1 1 1 1 } + } + 33 { + -28.8627 0 13.1118 + { + 1.70006 -1 + { -0.951057 0 0.309017 } + { 0 1 0 } + } + { -0.309017 0 -0.951057 } + { 1 1 1 1 } + } + 34 { + -28.8627 0 36.8882 + { + -0.699936 -1 + { 0.951057 0 0.309016 } + { 0 1 0 } + } + { -0.309016 0 0.951057 } + { 1 1 1 1 } + } + 35 { + -28.8627 50 13.1118 + { + 1.70006 2 + { -0.951057 0 0.309017 } + { 0 1 0 } + } + { -0.309017 0 -0.951057 } + { 1 1 1 1 } + } + 36 { + -28.8627 50 13.1118 + { + -0.0463246 1.70261 + { 3.81471e-007 0 -1 } + { -1 0 -3.81471e-007 } + } + { 0 -1 0 } + { 1 1 1 1 } + } + 37 { + -28.8627 50 36.8882 + { + -0.699936 2 + { 0.951057 0 0.309016 } + { 0 1 0 } + } + { -0.309016 0 0.951057 } + { 1 1 1 1 } + } + 38 { + -28.8627 50 36.8882 + { + -1.03701 1.70261 + { -3.81475e-007 0 -1 } + { -1 -4.89652e-008 3.81475e-007 } + } + { 4.89652e-008 -1 0 } + { 1 1 1 1 } + } + 39 { + -25 0 12.5 + { + 1.50006 -1 + { -1 0 -6.03476e-007 } + { 0 1 0 } + } + { 6.03476e-007 0 -1 } + { 1 1 1 1 } + } + 40 { + -25 0 37.5 + { + -0.499936 -1 + { 1 0 0 } + { 0 1 0 } + } + { 0 0 1 } + { 1 1 1 1 } + } + 41 { + -25 50 12.5 + { + -0.0208334 1.54167 + { 1.16912e-005 0 -1 } + { -1 0 -1.16912e-005 } + } + { 0 -1 0 } + { 1 1 1 1 } + } + 42 { + -25 50 12.5 + { + 1.50006 2 + { -1 0 -6.03476e-007 } + { 0 1 0 } + } + { 6.03476e-007 0 -1 } + { 1 1 1 1 } + } + 43 { + -25 50 37.5 + { + -0.499936 2 + { 1 0 0 } + { 0 1 0 } + } + { 0 0 1 } + { 1 1 1 1 } + } + 44 { + -25 50 37.5 + { + -1.0625 1.54167 + { -1.16911e-005 0 -1 } + { -1 -4.89652e-008 1.16911e-005 } + } + { 4.89652e-008 -1 0 } + { 1 1 1 1 } + } + 45 { + -21.1373 0 13.1118 + { + 1.30006 -1 + { -0.951057 0 -0.309017 } + { 0 1 0 } + } + { 0.309017 0 -0.951057 } + { 1 1 1 1 } + } + 46 { + -21.1373 0 36.8882 + { + -0.299936 -1 + { 0.951057 0 -0.309016 } + { 0 1 0 } + } + { 0.309016 0 0.951057 } + { 1 1 1 1 } + } + 47 { + -21.1373 50 13.1118 + { + -0.0463246 1.38072 + { -1.09281e-005 0 -1 } + { -1 0 1.09281e-005 } + } + { 0 -1 0 } + { 1 1 1 1 } + } + 48 { + -21.1373 50 13.1118 + { + 1.30006 2 + { -0.951057 0 -0.309017 } + { 0 1 0 } + } + { 0.309017 0 -0.951057 } + { 1 1 1 1 } + } + 49 { + -21.1373 50 36.8882 + { + -1.03701 1.38072 + { 1.09282e-005 0 -1 } + { -1 -4.89652e-008 -1.09282e-005 } + } + { 4.89652e-008 -1 0 } + { 1 1 1 1 } + } + 50 { + -21.1373 50 36.8882 + { + -0.299936 2 + { 0.951057 0 -0.309016 } + { 0 1 0 } + } + { 0.309016 0 0.951057 } + { 1 1 1 1 } + } + 51 { + -17.6527 0 14.8873 + { + 1.10006 -1 + { -0.809017 0 -0.587785 } + { 0 1 0 } + } + { 0.587785 0 -0.809017 } + { 1 1 1 1 } + } + 52 { + -17.6527 0 35.1127 + { + -0.0999364 -1 + { 0.809017 0 -0.587785 } + { 0 1 0 } + } + { 0.587785 0 0.809017 } + { 1 1 1 1 } + } + 53 { + -17.6527 50 14.8873 + { + -0.120304 1.23553 + { -7.25597e-007 0 -1 } + { -1 0 7.25597e-007 } + } + { 0 -1 0 } + { 1 1 1 1 } + } + 54 { + -17.6527 50 14.8873 + { + 1.10006 2 + { -0.809017 0 -0.587785 } + { 0 1 0 } + } + { 0.587785 0 -0.809017 } + { 1 1 1 1 } + } + 55 { + -17.6527 50 35.1127 + { + -0.96303 1.23553 + { 7.25593e-007 0 -1 } + { -1 -4.89652e-008 -7.25593e-007 } + } + { 4.89652e-008 -1 0 } + { 1 1 1 1 } + } + 56 { + -17.6527 50 35.1127 + { + -0.0999364 2 + { 0.809017 0 -0.587785 } + { 0 1 0 } + } + { 0.587785 0 0.809017 } + { 1 1 1 1 } + } + 57 { + -14.8873 0 17.6527 + { + -0.235528 1.1203 + { -5.45099e-007 4.13254e-011 -1 } + { -1 4.13254e-011 5.45099e-007 } + } + { 4.13254e-011 1 4.13254e-011 } + { 1 1 1 1 } + } + 58 { + -14.8873 0 17.6527 + { + 0.900064 -1 + { -0.587785 0 -0.809017 } + { 0 1 0 } + } + { 0.809017 0 -0.587785 } + { 1 1 1 1 } + } + 59 { + -14.8873 0 32.3473 + { + 0.100064 -1 + { 0.587785 0 -0.809017 } + { 0 1 0 } + } + { 0.809017 0 0.587785 } + { 1 1 1 1 } + } + 60 { + -14.8873 50 17.6527 + { + 0.900064 2 + { -0.587785 0 -0.809017 } + { 0 1 0 } + } + { 0.809017 0 -0.587785 } + { 1 1 1 1 } + } + 61 { + -14.8873 50 32.3473 + { + -0.847805 1.1203 + { -1.79128e-006 0 -1 } + { -1 -4.89652e-008 1.79128e-006 } + } + { 4.89652e-008 -1 0 } + { 1 1 1 1 } + } + 62 { + -14.8873 50 32.3473 + { + 0.100064 2 + { 0.587785 0 -0.809017 } + { 0 1 0 } + } + { 0.809017 0 0.587785 } + { 1 1 1 1 } + } + 63 { + -13.1118 0 21.1373 + { + 0.700064 -1 + { -0.309017 0 -0.951057 } + { 0 1 0 } + } + { 0.951057 0 -0.309017 } + { 1 1 1 1 } + } + 64 { + -13.1118 0 28.8627 + { + 0.300064 -1 + { 0.309017 0 -0.951057 } + { 0 1 0 } + } + { 0.951057 0 0.309017 } + { 1 1 1 1 } + } + 65 { + -13.1118 50 21.1373 + { + -0.38072 1.04633 + { 3.58256e-006 0 -1 } + { -1 -4.89652e-008 -3.58256e-006 } + } + { 4.89652e-008 -1 0 } + { 1 1 1 1 } + } + 66 { + -13.1118 50 21.1373 + { + 0.700064 2 + { -0.309017 0 -0.951057 } + { 0 1 0 } + } + { 0.951057 0 -0.309017 } + { 1 1 1 1 } + } + 67 { + -13.1118 50 28.8627 + { + -0.702613 1.04633 + { -3.58256e-006 0 -1 } + { -1 -4.89652e-008 3.58256e-006 } + } + { 4.89652e-008 -1 0 } + { 1 1 1 1 } + } + 68 { + -13.1118 50 28.8627 + { + 0.300064 2 + { 0.309017 0 -0.951057 } + { 0 1 0 } + } + { 0.951057 0 0.309017 } + { 1 1 1 1 } + } + 69 { + -12.5 0 25 + { + 0.500064 -1 + { 0 0 -1 } + { 0 1 0 } + } + { 1 0 0 } + { 1 1 1 1 } + } + 70 { + -12.5 50 25 + { + -0.541667 1.02083 + { 0 0 -1 } + { -1 -4.89652e-008 0 } + } + { 4.89652e-008 -1 0 } + { 1 1 1 1 } + } + 71 { + -12.5 50 25 + { + 0.500064 2 + { 0 0 -1 } + { 0 1 0 } + } + { 1 0 0 } + { 1 1 1 1 } + } + 72 { + 5 0 -5 + { + 0.708333 0.291667 + { -1.84039e-007 4.13254e-011 -1 } + { -1 4.13254e-011 1.84039e-007 } + } + { 4.13254e-011 1 4.13254e-011 } + { 1 1 1 1 } + } + 73 { + 5 1.19209e-006 -45 + { + 1.5 -0.5 + { -1 -1.49012e-008 0 } + { -1.49012e-008 1 0 } + } + { 0 0 -1 } + { 1 1 1 1 } + } + 74 { + 5 10 -45 + { + 1.5 0.166667 + { -1 0 0 } + { 0 1 0 } + } + { 0 0 -1 } + { 1 1 1 1 } + } + 75 { + 5 10 -45 + { + 1.5 0.166667 + { -1 0 0 } + { 0 0.707107 0.707107 } + } + { 0 0.707107 -0.707107 } + { 1 1 1 1 } + } + 76 { + 25 30 -25 + { + 0.5 1.5 + { -1 0 0 } + { 0 0.707107 0.707107 } + } + { 0 0.707107 -0.707107 } + { 1 1 1 1 } + } + 77 { + 25 30 -25 + { + 0.5 1.5 + { 0 0 -1 } + { -0.707107 0.707107 0 } + } + { 0.707107 0.707107 0 } + { 1 1 1 1 } + } + 78 { + 45 0 -45 + { + -0.5 -0.5 + { -1 -1.49012e-008 0 } + { -1.49012e-008 1 0 } + } + { 0 0 -1 } + { 1 1 1 1 } + } + 79 { + 45 0 -45 + { + 2.375 -1.375 + { -2.98023e-008 4.13254e-011 -1 } + { -1 4.13254e-011 2.98023e-008 } + } + { 4.13254e-011 1 4.13254e-011 } + { 1 1 1 1 } + } + 80 { + 45 0 -45 + { + 1.5 -0.5 + { 0 1.49012e-008 -1 } + { 0 1 1.49012e-008 } + } + { 1 0 0 } + { 1 1 1 1 } + } + 81 { + 45 1.19209e-006 -5 + { + -0.5 -0.5 + { 0 1.49012e-008 -1 } + { 0 1 1.49012e-008 } + } + { 1 0 0 } + { 1 1 1 1 } + } + 82 { + 45 10 -45 + { + -0.5 0.166667 + { -1 0 0 } + { 0 1 0 } + } + { 0 0 -1 } + { 1 1 1 1 } + } + 83 { + 45 10 -45 + { + -0.5 0.166667 + { -1 0 0 } + { 0 0.707107 0.707107 } + } + { 0 0.707107 -0.707107 } + { 1 1 1 1 } + } + 84 { + 45 10 -45 + { + 1.5 0.166667 + { 0 0 -1 } + { -0.707107 0.707107 0 } + } + { 0.707107 0.707107 0 } + { 1 1 1 1 } + } + 85 { + 45 10 -45 + { + 1.5 0.166667 + { 0 0 -1 } + { 0 1 0 } + } + { 1 0 0 } + { 1 1 1 1 } + } + 86 { + 45 10 -5 + { + -0.5 0.166667 + { 0 0 -1 } + { -0.707107 0.707107 0 } + } + { 0.707107 0.707107 0 } + { 1 1 1 1 } + } + 87 { + 45 10 -5 + { + -0.5 0.166667 + { 0 0 -1 } + { 0 1 0 } + } + { 1 0 0 } + { 1 1 1 1 } + } + 88 { + 60 0 -60 + { + 1.5 1.5 + { 0 0 -1 } + { 0 -1 0 } + } + { -1 0 0 } + { 1 1 1 1 } + } + 89 { + 60 0 -60 + { + 1.5 -0.5 + { 1 0 0 } + { 0 1 0 } + } + { 0 0 1 } + { 1 1 1 1 } + } + 90 { + 60 0 -60 + { + 3 -2 + { -1.19209e-008 4.13254e-011 -1 } + { -1 4.13254e-011 1.19209e-008 } + } + { 4.13254e-011 1 4.13254e-011 } + { 1 1 1 1 } + } + 91 { + 60 0 60 + { + -0.5 1.5 + { 0 0 -1 } + { 0 -1 0 } + } + { -1 0 0 } + { 1 1 1 1 } + } + 92 { + 60 0 60 + { + -0.5 -0.5 + { -1 0 0 } + { 0 1 0 } + } + { 0 0 -1 } + { 1 1 1 1 } + } + 93 { + 60 0 60 + { + -2 -2 + { 0 3.91309e-009 -1 } + { -1 3.91309e-009 0 } + } + { 3.91309e-009 1 3.91309e-009 } + { 1 1 1 1 } + } + 94 { + 60 50 -60 + { + 1.5 -0.5 + { 0 0 -1 } + { 0 -1 0 } + } + { -1 0 0 } + { 1 1 1 1 } + } + 95 { + 60 50 -60 + { + 1.5 1.5 + { 1 0 0 } + { 0 1 0 } + } + { 0 0 1 } + { 1 1 1 1 } + } + 96 { + 60 50 60 + { + -0.5 -0.5 + { 0 0 -1 } + { 0 -1 0 } + } + { -1 0 0 } + { 1 1 1 1 } + } + 97 { + 60 50 60 + { + -0.5 1.5 + { -1 0 0 } + { 0 1 0 } + } + { 0 0 -1 } + { 1 1 1 1 } + } + 98 { + -60 50 -60 + { + 3 3 + { 0 0 -1 } + { -1 0 0 } + } + { 0 -1 0 } + { 1 1 1 1 } + } + 99 { + -60 50 60 + { + -2 3 + { -1.18287e-008 0 -1 } + { -1 -2.44826e-008 1.18287e-008 } + } + { 2.44826e-008 -1 0 } + { 1 1 1 1 } + } + 100 { + -37.5 0 25 + { + -0.541667 2.0625 + { 0 -3.83044e-009 -1 } + { -1 -3.83044e-009 0 } + } + { -3.83044e-009 1 -3.83044e-009 } + { 1 1 1 1 } + } + 101 { + -36.8882 0 21.1373 + { + -0.38072 2.03701 + { -2.784e-007 -3.83044e-009 -1 } + { -1 -3.83044e-009 2.784e-007 } + } + { -3.83044e-009 1 -3.83044e-009 } + { 1 1 1 1 } + } + 102 { + -36.8882 0 28.8627 + { + -0.702613 2.03701 + { 2.784e-007 -3.83044e-009 -1 } + { -1 -3.83044e-009 -2.784e-007 } + } + { -3.83044e-009 1 -3.83044e-009 } + { 1 1 1 1 } + } + 103 { + -35.1127 0 17.6527 + { + -0.235528 1.96303 + { -1.03074e-007 -3.83044e-009 -1 } + { -1 -3.83044e-009 1.03074e-007 } + } + { -3.83044e-009 1 -3.83044e-009 } + { 1 1 1 1 } + } + 104 { + -35.1127 0 32.3473 + { + -0.847805 1.96303 + { 1.03075e-007 -3.83044e-009 -1 } + { -1 -3.83044e-009 -1.03075e-007 } + } + { -3.83044e-009 1 -3.83044e-009 } + { 1 1 1 1 } + } + 105 { + -32.3473 0 14.8873 + { + -0.120303 1.84781 + { -8.0634e-006 -3.83047e-009 -1 } + { -1 -3.83041e-009 8.0634e-006 } + } + { -3.83044e-009 1 -3.83044e-009 } + { 1 1 1 1 } + } + 106 { + -32.3473 50 35.1127 + { + -0.96303 1.84781 + { 1.52608e-007 0 -1 } + { -1 -2.44826e-008 -1.52608e-007 } + } + { 2.44826e-008 -1 0 } + { 1 1 1 1 } + } + 107 { + -28.8627 0 13.1118 + { + -0.0463246 1.70261 + { 3.81471e-007 -3.83044e-009 -1 } + { -1 -3.83044e-009 -3.81471e-007 } + } + { -3.83044e-009 1 -3.83044e-009 } + { 1 1 1 1 } + } + 108 { + -28.8627 0 36.8882 + { + -1.03701 1.70261 + { -3.81475e-007 3.91309e-009 -1 } + { -1 3.91309e-009 3.81475e-007 } + } + { 3.91309e-009 1 3.91309e-009 } + { 1 1 1 1 } + } + 109 { + -25 0 12.5 + { + -0.0208334 1.54167 + { 1.16912e-005 -3.83039e-009 -1 } + { -1 -3.83048e-009 -1.16912e-005 } + } + { -3.83044e-009 1 -3.83044e-009 } + { 1 1 1 1 } + } + 110 { + -25 0 37.5 + { + -1.0625 1.54167 + { -1.16911e-005 3.91314e-009 -1 } + { -1 3.91304e-009 1.16911e-005 } + } + { 3.91309e-009 1 3.91309e-009 } + { 1 1 1 1 } + } + 111 { + -21.1373 0 13.1118 + { + -0.0463246 1.38072 + { -1.09281e-005 -3.83048e-009 -1 } + { -1 -3.8304e-009 1.09281e-005 } + } + { -3.83044e-009 1 -3.83044e-009 } + { 1 1 1 1 } + } + 112 { + -21.1373 0 36.8882 + { + -1.03701 1.38072 + { 1.09282e-005 3.91305e-009 -1 } + { -1 3.91313e-009 -1.09282e-005 } + } + { 3.91309e-009 1 3.91309e-009 } + { 1 1 1 1 } + } + 113 { + -17.6527 0 14.8873 + { + -0.120304 1.23553 + { -7.25597e-007 -3.83044e-009 -1 } + { -1 -3.83044e-009 7.25597e-007 } + } + { -3.83044e-009 1 -3.83044e-009 } + { 1 1 1 1 } + } + 114 { + -17.6527 0 35.1127 + { + -0.96303 1.23553 + { 7.25593e-007 3.91309e-009 -1 } + { -1 3.91309e-009 -7.25593e-007 } + } + { 3.91309e-009 1 3.91309e-009 } + { 1 1 1 1 } + } + 115 { + -14.8873 0 32.3473 + { + -0.847805 1.1203 + { -1.79128e-006 3.9131e-009 -1 } + { -1 3.91308e-009 1.79128e-006 } + } + { 3.91309e-009 1 3.91309e-009 } + { 1 1 1 1 } + } + 116 { + -14.8873 50 17.6527 + { + -0.235528 1.1203 + { -4.96743e-007 0 -1 } + { -1 -2.44826e-008 4.96743e-007 } + } + { 2.44826e-008 -1 0 } + { 1 1 1 1 } + } + 117 { + -13.1118 0 21.1373 + { + -0.38072 1.04633 + { 3.58256e-006 3.91308e-009 -1 } + { -1 3.9131e-009 -3.58256e-006 } + } + { 3.91309e-009 1 3.91309e-009 } + { 1 1 1 1 } + } + 118 { + -13.1118 0 28.8627 + { + -0.702613 1.04633 + { -3.58256e-006 3.9131e-009 -1 } + { -1 3.91308e-009 3.58256e-006 } + } + { 3.91309e-009 1 3.91309e-009 } + { 1 1 1 1 } + } + 119 { + -12.5 0 25 + { + -0.541667 1.02083 + { 0 3.91309e-009 -1 } + { -1 3.91309e-009 0 } + } + { 3.91309e-009 1 3.91309e-009 } + { 1 1 1 1 } + } + 120 { + 5 0 -5 + { + -0.5 -0.5 + { 0 -1.49012e-008 -1 } + { 0 1 -1.49012e-008 } + } + { -1 0 0 } + { 1 1 1 1 } + } + 121 { + 5 0 -5 + { + 1.5 -0.5 + { -1 1.49012e-008 0 } + { 1.49012e-008 1 0 } + } + { 0 0 1 } + { 1 1 1 1 } + } + 122 { + 5 1.19209e-006 -45 + { + 1.5 -0.5 + { 0 -1.49012e-008 -1 } + { 0 1 -1.49012e-008 } + } + { -1 0 0 } + { 1 1 1 1 } + } + 123 { + 5 1.19209e-006 -45 + { + 2.375 0.291667 + { 0 -3.83044e-009 -1 } + { -1 -3.83044e-009 0 } + } + { -3.83044e-009 1 -3.83044e-009 } + { 1 1 1 1 } + } + 124 { + 5 10 -45 + { + 1.5 0.166667 + { 0 0 -1 } + { 0 1 0 } + } + { -1 0 0 } + { 1 1 1 1 } + } + 125 { + 5 10 -45 + { + 1.5 0.166667 + { 0 0 -1 } + { 0.707107 0.707107 0 } + } + { -0.707107 0.707107 0 } + { 1 1 1 1 } + } + 126 { + 5 10 -5 + { + -0.5 0.166667 + { 0 0 -1 } + { 0 1 0 } + } + { -1 0 0 } + { 1 1 1 1 } + } + 127 { + 5 10 -5 + { + -0.5 0.166667 + { 0 0 -1 } + { 0.707107 0.707107 0 } + } + { -0.707107 0.707107 0 } + { 1 1 1 1 } + } + 128 { + 5 10 -5 + { + 1.5 0.166667 + { -1 0 0 } + { 0 1 0 } + } + { 0 0 1 } + { 1 1 1 1 } + } + 129 { + 5 10 -5 + { + 1.5 0.166667 + { -1 0 0 } + { 0 0.707107 -0.707107 } + } + { 0 0.707107 0.707107 } + { 1 1 1 1 } + } + 130 { + 25 30 -25 + { + 0.5 1.5 + { 0 0 -1 } + { 0.707107 0.707107 0 } + } + { -0.707107 0.707107 0 } + { 1 1 1 1 } + } + 131 { + 25 30 -25 + { + 0.5 1.5 + { -1 0 0 } + { 0 0.707107 -0.707107 } + } + { 0 0.707107 0.707107 } + { 1 1 1 1 } + } + 132 { + 45 1.19209e-006 -5 + { + -0.5 -0.5 + { -1 1.49012e-008 0 } + { 1.49012e-008 1 0 } + } + { 0 0 1 } + { 1 1 1 1 } + } + 133 { + 45 1.19209e-006 -5 + { + 0.708333 -1.375 + { 0 3.91309e-009 -1 } + { -1 3.91309e-009 0 } + } + { 3.91309e-009 1 3.91309e-009 } + { 1 1 1 1 } + } + 134 { + 45 10 -5 + { + -0.5 0.166667 + { -1 0 0 } + { 0 1 0 } + } + { 0 0 1 } + { 1 1 1 1 } + } + 135 { + 45 10 -5 + { + -0.5 0.166667 + { -1 0 0 } + { 0 0.707107 -0.707107 } + } + { 0 0.707107 0.707107 } + { 1 1 1 1 } + } + 136 { + 60 50 -60 + { + 3 -2 + { -6.29762e-008 0 -1 } + { -1 -2.44826e-008 6.29762e-008 } + } + { 2.44826e-008 -1 0 } + { 1 1 1 1 } + } + 137 { + 60 50 60 + { + -2 -2 + { 0 0 -1 } + { -1 -4.89652e-008 0 } + } + { 4.89652e-008 -1 0 } + { 1 1 1 1 } + } + } + { + { 0 0.707107 -0.707107 } + { phong2SG } + { phong2SG.tref1 } + { 75 76 83 { polySurfaceShape2.verts } } + } + { + { -0.707107 0.707107 0 } + { phong2SG } + { phong2SG.tref1 } + { 127 130 125 { polySurfaceShape2.verts } } + } + { + { 0 0.707107 0.707107 } + { phong2SG } + { phong2SG.tref1 } + { 135 131 129 { polySurfaceShape2.verts } } + } + { + { 0.707107 0.707107 0 } + { phong2SG } + { phong2SG.tref1 } + { 84 77 86 { polySurfaceShape2.verts } } + } + { + { 0 0 -1 } + { phong2SG } + { phong2SG.tref1 } + { 78 73 74 82 { polySurfaceShape2.verts } } + } + { + { -1 0 0 } + { phong2SG } + { phong2SG.tref1 } + { 122 120 126 124 { polySurfaceShape2.verts } } + } + { + { 0 0 1 } + { phong2SG } + { phong2SG.tref1 } + { 121 132 134 128 { polySurfaceShape2.verts } } + } + { + { 1 0 0 } + { phong2SG } + { phong2SG.tref1 } + { 81 80 85 87 { polySurfaceShape2.verts } } + } + { + { -1 0 0 } + { phong1SG } + { phong1SG.tref2 } + { 91 96 94 88 { polySurfaceShape2.verts } } + } + { + { 4.89652e-008 -1 0 } + { phong1SG } + { phong1SG.tref2 } + { + 49 55 61 67 70 65 116 136 137 99 106 38 44 + { polySurfaceShape2.verts } + } + } + { + { 0 -1 0 } + { phong1SG } + { phong1SG.tref2 } + { + 99 98 136 116 53 47 41 36 31 24 18 14 20 26 106 + { polySurfaceShape2.verts } + } + } + { + { 1 0 0 } + { phong1SG } + { phong1SG.tref2 } + { 9 5 2 7 { polySurfaceShape2.verts } } + } + { + { 3.91309e-009 1 3.91309e-009 } + { phong1SG } + { phong1SG.tref2 } + { + 93 90 79 133 72 57 117 119 118 115 114 112 110 108 29 4 + { polySurfaceShape2.verts } + } + } + { + { -3.83044e-009 1 -3.83044e-009 } + { phong1SG } + { phong1SG.tref2 } + { + 123 79 90 0 4 29 104 102 100 101 103 105 107 109 111 113 57 72 + { polySurfaceShape2.verts } + } + } + { + { 0 0 1 } + { phong1SG } + { phong1SG.tref2 } + { 89 95 6 1 { polySurfaceShape2.verts } } + } + { + { 0 0 -1 } + { phong1SG } + { phong1SG.tref2 } + { 3 8 97 92 { polySurfaceShape2.verts } } + } + { + { -0.987688 0 0.156435 } + { phong3SG } + { phong3SG.tref3 } + { 10 16 19 12 { polySurfaceShape2.verts } } + } + { + { -0.987688 0 -0.156435 } + { phong3SG } + { phong3SG.tref3 } + { 15 11 13 17 { polySurfaceShape2.verts } } + } + { + { -0.891007 0 -0.45399 } + { phong3SG } + { phong3SG.tref3 } + { 21 15 17 23 { polySurfaceShape2.verts } } + } + { + { -0.707107 0 -0.707107 } + { phong3SG } + { phong3SG.tref3 } + { 27 21 23 30 { polySurfaceShape2.verts } } + } + { + { -0.453991 0 -0.891006 } + { phong3SG } + { phong3SG.tref3 } + { 33 27 30 35 { polySurfaceShape2.verts } } + } + { + { -0.156433 0 -0.987689 } + { phong3SG } + { phong3SG.tref3 } + { 39 33 35 42 { polySurfaceShape2.verts } } + } + { + { 0.156434 0 -0.987688 } + { phong3SG } + { phong3SG.tref3 } + { 45 39 42 48 { polySurfaceShape2.verts } } + } + { + { 0.453991 0 -0.891007 } + { phong3SG } + { phong3SG.tref3 } + { 51 45 48 54 { polySurfaceShape2.verts } } + } + { + { 0.707107 0 -0.707107 } + { phong3SG } + { phong3SG.tref3 } + { 58 51 54 60 { polySurfaceShape2.verts } } + } + { + { 0.891007 0 -0.453991 } + { phong3SG } + { phong3SG.tref3 } + { 63 58 60 66 { polySurfaceShape2.verts } } + } + { + { 0.987688 0 -0.156434 } + { phong3SG } + { phong3SG.tref3 } + { 69 63 66 71 { polySurfaceShape2.verts } } + } + { + { 0.987688 0 0.156434 } + { phong3SG } + { phong3SG.tref3 } + { 64 69 71 68 { polySurfaceShape2.verts } } + } + { + { 0.891007 0 0.453991 } + { phong3SG } + { phong3SG.tref3 } + { 59 64 68 62 { polySurfaceShape2.verts } } + } + { + { 0.707107 0 0.707106 } + { phong3SG } + { phong3SG.tref3 } + { 52 59 62 56 { polySurfaceShape2.verts } } + } + { + { 0.45399 0 0.891007 } + { phong3SG } + { phong3SG.tref3 } + { 46 52 56 50 { polySurfaceShape2.verts } } + } + { + { 0.156434 0 0.987688 } + { phong3SG } + { phong3SG.tref3 } + { 40 46 50 43 { polySurfaceShape2.verts } } + } + { + { -0.156434 0 0.987688 } + { phong3SG } + { phong3SG.tref3 } + { 34 40 43 37 { polySurfaceShape2.verts } } + } + { + { -0.45399 0 0.891007 } + { phong3SG } + { phong3SG.tref3 } + { 28 34 37 32 { polySurfaceShape2.verts } } + } + { + { -0.707107 0 0.707107 } + { phong3SG } + { phong3SG.tref3 } + { 22 28 32 25 { polySurfaceShape2.verts } } + } + { + { -0.891007 0 0.45399 } + { phong3SG } + { phong3SG.tref3 } + { 16 22 25 19 { polySurfaceShape2.verts } } + } +} diff --git a/samples/bump-mapping/models/abstractroom.mb b/samples/bump-mapping/models/abstractroom.mb new file mode 100644 index 0000000000..2d64cca3d4 Binary files /dev/null and b/samples/bump-mapping/models/abstractroom.mb differ diff --git a/samples/bump-mapping/models/brick-c.jpg b/samples/bump-mapping/models/brick-c.jpg new file mode 100644 index 0000000000..71c802f937 Binary files /dev/null and b/samples/bump-mapping/models/brick-c.jpg differ diff --git a/samples/bump-mapping/models/brick-n.jpg b/samples/bump-mapping/models/brick-n.jpg new file mode 100644 index 0000000000..e17ec5d941 Binary files /dev/null and b/samples/bump-mapping/models/brick-n.jpg differ diff --git a/samples/bump-mapping/models/fieldstone-c.jpg b/samples/bump-mapping/models/fieldstone-c.jpg new file mode 100644 index 0000000000..a5d8dc9874 Binary files /dev/null and b/samples/bump-mapping/models/fieldstone-c.jpg differ diff --git a/samples/bump-mapping/models/fieldstone-n.jpg b/samples/bump-mapping/models/fieldstone-n.jpg new file mode 100644 index 0000000000..493683ce57 Binary files /dev/null and b/samples/bump-mapping/models/fieldstone-n.jpg differ diff --git a/samples/bump-mapping/models/icosphere.egg b/samples/bump-mapping/models/icosphere.egg new file mode 100644 index 0000000000..474e8740b2 --- /dev/null +++ b/samples/bump-mapping/models/icosphere.egg @@ -0,0 +1,497 @@ + { Z-Up } + + { + "egg-trans -F icosphere.egg -o icosphere.egg" +} + Icosphere { + Icosphere { + 0 { + 0 0 -1 + { 0 0 -1 } + } + 1 { + 0.425323 -0.309011 -0.850654 + { 0.425306 -0.309 -0.850642 } + } + 2 { + -0.162456 -0.499995 -0.850654 + { -0.16245 -0.499985 -0.850642 } + } + 3 { + 0.723607 -0.525725 -0.44722 + { 0.723594 -0.525712 -0.447188 } + } + 4 { + 0.850648 0 -0.525736 + { 0.850642 0 -0.525712 } + } + 5 { + -0.52573 0 -0.850652 + { -0.525712 0 -0.850642 } + } + 6 { + -0.162456 0.499995 -0.850654 + { -0.16245 0.499985 -0.850642 } + } + 7 { + 0.425323 0.309011 -0.850654 + { 0.425306 0.309 -0.850642 } + } + 8 { + 0.951058 -0.309013 0 + { 0.951048 -0.309 0 } + } + 9 { + -0.276388 -0.850649 -0.44722 + { -0.276376 -0.850642 -0.447218 } + } + 10 { + 0.262869 -0.809012 -0.525738 + { 0.262856 -0.808985 -0.525712 } + } + 11 { + 0 -1 0 + { 0 -1 0 } + } + 12 { + -0.894426 0 -0.447216 + { -0.894406 0 -0.447188 } + } + 13 { + -0.688189 -0.499997 -0.525736 + { -0.688162 -0.499985 -0.525712 } + } + 14 { + -0.951058 -0.309013 0 + { -0.951048 -0.309 0 } + } + 15 { + -0.276388 0.850649 -0.44722 + { -0.276376 0.850642 -0.447218 } + } + 16 { + -0.688189 0.499997 -0.525736 + { -0.688162 0.499985 -0.525712 } + } + 17 { + -0.587786 0.809017 0 + { -0.587756 0.809015 0 } + } + 18 { + 0.723607 0.525725 -0.44722 + { 0.723594 0.525712 -0.447188 } + } + 19 { + 0.262869 0.809012 -0.525738 + { 0.262856 0.808985 -0.525712 } + } + 20 { + 0.587786 0.809017 0 + { 0.587756 0.809015 0 } + } + 21 { + 0.587786 -0.809017 0 + { 0.587756 -0.809015 0 } + } + 22 { + -0.587786 -0.809017 0 + { -0.587756 -0.809015 0 } + } + 23 { + -0.951058 0.309013 0 + { -0.951048 0.309 0 } + } + 24 { + 0 1 0 + { 0 1 0 } + } + 25 { + 0.951058 0.309013 0 + { 0.951048 0.309 0 } + } + 26 { + 0.276388 -0.850649 0.44722 + { 0.276376 -0.850642 0.447218 } + } + 27 { + 0.688189 -0.499997 0.525736 + { 0.688162 -0.499985 0.525712 } + } + 28 { + 0.162456 -0.499995 0.850654 + { 0.16245 -0.499985 0.850642 } + } + 29 { + -0.723607 -0.525725 0.44722 + { -0.723594 -0.525712 0.447188 } + } + 30 { + -0.262869 -0.809012 0.525738 + { -0.262856 -0.808985 0.525712 } + } + 31 { + -0.425323 -0.309011 0.850654 + { -0.425306 -0.309 0.850642 } + } + 32 { + -0.723607 0.525725 0.44722 + { -0.723594 0.525712 0.447188 } + } + 33 { + -0.850648 0 0.525736 + { -0.850642 0 0.525712 } + } + 34 { + -0.425323 0.309011 0.850654 + { -0.425306 0.309 0.850642 } + } + 35 { + 0.276388 0.850649 0.44722 + { 0.276376 0.850642 0.447218 } + } + 36 { + -0.262869 0.809012 0.525738 + { -0.262856 0.808985 0.525712 } + } + 37 { + 0.162456 0.499995 0.850654 + { 0.16245 0.499985 0.850642 } + } + 38 { + 0.894426 0 0.447216 + { 0.894406 0 0.447188 } + } + 39 { + 0.688189 0.499997 0.525736 + { 0.688162 0.499985 0.525712 } + } + 40 { + 0.52573 0 0.850652 + { 0.525712 0 0.850642 } + } + 41 { + 0 0 1 + { 0 0 1 } + } + } + { + { 0.102381 -0.31509 -0.943523 } + { 0 1 2 { Icosphere } } + } + { + { 0.700224 -0.268032 -0.661699 } + { 3 1 4 { Icosphere } } + } + { + { -0.268034 -0.194736 -0.943523 } + { 0 2 5 { Icosphere } } + } + { + { -0.268034 0.194737 -0.943523 } + { 0 5 6 { Icosphere } } + } + { + { 0.102381 0.31509 -0.943523 } + { 0 6 7 { Icosphere } } + } + { + { 0.904989 -0.268032 -0.330385 } + { 3 4 8 { Icosphere } } + } + { + { 0.024747 -0.943521 -0.330386 } + { 9 10 11 { Icosphere } } + } + { + { -0.889697 -0.315095 -0.330385 } + { 12 13 14 { Icosphere } } + } + { + { -0.574602 0.748784 -0.330388 } + { 15 16 17 { Icosphere } } + } + { + { 0.534576 0.777865 -0.330387 } + { 18 19 20 { Icosphere } } + } + { + { 0.802609 -0.583126 -0.125627 } + { 3 8 21 { Icosphere } } + } + { + { -0.306569 -0.943522 -0.125629 } + { 9 11 22 { Icosphere } } + } + { + { -0.992077 0 -0.125628 } + { 12 14 23 { Icosphere } } + } + { + { -0.306569 0.943522 -0.125629 } + { 15 17 24 { Icosphere } } + } + { + { 0.802609 0.583126 -0.125627 } + { 18 20 25 { Icosphere } } + } + { + { 0.408946 -0.628425 0.661698 } + { 26 27 28 { Icosphere } } + } + { + { -0.4713 -0.583122 0.661699 } + { 29 30 31 { Icosphere } } + } + { + { -0.700224 0.268032 0.661699 } + { 32 33 34 { Icosphere } } + } + { + { 0.03853 0.748779 0.661699 } + { 35 36 37 { Icosphere } } + } + { + { 0.724042 0.194736 0.661695 } + { 38 39 40 { Icosphere } } + } + { + { 0.268034 0.194737 0.943523 } + { 40 37 41 { Icosphere } } + } + { + { 0.491119 0.356821 0.794657 } + { 40 39 37 { Icosphere } } + } + { + { 0.408946 0.628425 0.661699 } + { 39 35 37 { Icosphere } } + } + { + { -0.102381 0.31509 0.943523 } + { 37 34 41 { Icosphere } } + } + { + { -0.187594 0.577345 0.794658 } + { 37 36 34 { Icosphere } } + } + { + { -0.4713 0.583122 0.661699 } + { 36 32 34 { Icosphere } } + } + { + { -0.331305 0 0.943524 } + { 34 31 41 { Icosphere } } + } + { + { -0.60706 0 0.794656 } + { 34 33 31 { Icosphere } } + } + { + { -0.700224 -0.268032 0.661699 } + { 33 29 31 { Icosphere } } + } + { + { -0.102381 -0.31509 0.943523 } + { 31 28 41 { Icosphere } } + } + { + { -0.187594 -0.577345 0.794658 } + { 31 30 28 { Icosphere } } + } + { + { 0.03853 -0.748779 0.661699 } + { 30 26 28 { Icosphere } } + } + { + { 0.268034 -0.194737 0.943523 } + { 28 40 41 { Icosphere } } + } + { + { 0.491119 -0.356821 0.794657 } + { 28 27 40 { Icosphere } } + } + { + { 0.724042 -0.194736 0.661695 } + { 27 38 40 { Icosphere } } + } + { + { 0.889697 0.315095 0.330385 } + { 25 39 38 { Icosphere } } + } + { + { 0.794656 0.577348 0.187595 } + { 25 20 39 { Icosphere } } + } + { + { 0.574602 0.748784 0.330388 } + { 20 35 39 { Icosphere } } + } + { + { -0.024747 0.943521 0.330386 } + { 24 36 35 { Icosphere } } + } + { + { -0.303531 0.934171 0.187597 } + { 24 17 36 { Icosphere } } + } + { + { -0.534576 0.777865 0.330387 } + { 17 32 36 { Icosphere } } + } + { + { -0.904989 0.268032 0.330385 } + { 23 33 32 { Icosphere } } + } + { + { -0.982246 0 0.187599 } + { 23 14 33 { Icosphere } } + } + { + { -0.904989 -0.268031 0.330385 } + { 14 29 33 { Icosphere } } + } + { + { -0.534576 -0.777865 0.330387 } + { 22 30 29 { Icosphere } } + } + { + { -0.303531 -0.934171 0.187597 } + { 22 11 30 { Icosphere } } + } + { + { -0.024747 -0.943521 0.330386 } + { 11 26 30 { Icosphere } } + } + { + { 0.574602 -0.748784 0.330388 } + { 21 27 26 { Icosphere } } + } + { + { 0.794656 -0.577348 0.187595 } + { 21 8 27 { Icosphere } } + } + { + { 0.889697 -0.315095 0.330385 } + { 8 38 27 { Icosphere } } + } + { + { 0.306569 0.943522 0.125629 } + { 20 24 35 { Icosphere } } + } + { + { 0.303531 0.934171 -0.187597 } + { 20 19 24 { Icosphere } } + } + { + { 0.024747 0.943521 -0.330386 } + { 19 15 24 { Icosphere } } + } + { + { -0.802609 0.583126 0.125627 } + { 17 23 32 { Icosphere } } + } + { + { -0.794656 0.577348 -0.187595 } + { 17 16 23 { Icosphere } } + } + { + { -0.889697 0.315095 -0.330385 } + { 16 12 23 { Icosphere } } + } + { + { -0.802609 -0.583126 0.125627 } + { 14 22 29 { Icosphere } } + } + { + { -0.794656 -0.577348 -0.187595 } + { 14 13 22 { Icosphere } } + } + { + { -0.574602 -0.748784 -0.330388 } + { 13 9 22 { Icosphere } } + } + { + { 0.306569 -0.943522 0.125629 } + { 11 21 26 { Icosphere } } + } + { + { 0.303531 -0.934171 -0.187597 } + { 11 10 21 { Icosphere } } + } + { + { 0.534576 -0.777865 -0.330387 } + { 10 3 21 { Icosphere } } + } + { + { 0.992077 0 0.125628 } + { 8 25 38 { Icosphere } } + } + { + { 0.982246 0 -0.187599 } + { 8 4 25 { Icosphere } } + } + { + { 0.904989 0.268031 -0.330385 } + { 4 18 25 { Icosphere } } + } + { + { 0.4713 0.583122 -0.661699 } + { 7 19 18 { Icosphere } } + } + { + { 0.187594 0.577345 -0.794658 } + { 7 6 19 { Icosphere } } + } + { + { -0.03853 0.748779 -0.661699 } + { 6 15 19 { Icosphere } } + } + { + { -0.408946 0.628425 -0.661698 } + { 6 16 15 { Icosphere } } + } + { + { -0.491119 0.356821 -0.794657 } + { 6 5 16 { Icosphere } } + } + { + { -0.724042 0.194736 -0.661695 } + { 5 12 16 { Icosphere } } + } + { + { -0.724042 -0.194736 -0.661695 } + { 5 13 12 { Icosphere } } + } + { + { -0.491119 -0.356821 -0.794657 } + { 5 2 13 { Icosphere } } + } + { + { -0.408946 -0.628425 -0.661698 } + { 2 9 13 { Icosphere } } + } + { + { 0.700224 0.268032 -0.661699 } + { 4 7 18 { Icosphere } } + } + { + { 0.60706 0 -0.794656 } + { 4 1 7 { Icosphere } } + } + { + { 0.331305 0 -0.943524 } + { 1 0 7 { Icosphere } } + } + { + { -0.03853 -0.748779 -0.661699 } + { 2 10 9 { Icosphere } } + } + { + { 0.187594 -0.577345 -0.794658 } + { 2 1 10 { Icosphere } } + } + { + { 0.4713 -0.583122 -0.661699 } + { 1 3 10 { Icosphere } } + } +} diff --git a/samples/bump-mapping/models/layingrock-c.jpg b/samples/bump-mapping/models/layingrock-c.jpg new file mode 100644 index 0000000000..f89da981ca Binary files /dev/null and b/samples/bump-mapping/models/layingrock-c.jpg differ diff --git a/samples/bump-mapping/models/layingrock-h.jpg b/samples/bump-mapping/models/layingrock-h.jpg new file mode 100644 index 0000000000..af6598d057 Binary files /dev/null and b/samples/bump-mapping/models/layingrock-h.jpg differ diff --git a/samples/bump-mapping/models/layingrock-n.jpg b/samples/bump-mapping/models/layingrock-n.jpg new file mode 100644 index 0000000000..81ec2b090e Binary files /dev/null and b/samples/bump-mapping/models/layingrock-n.jpg differ diff --git a/samples/carousel/main.py b/samples/carousel/main.py new file mode 100755 index 0000000000..a6ae51fea8 --- /dev/null +++ b/samples/carousel/main.py @@ -0,0 +1,196 @@ +#!/usr/bin/env python + +# Author: Shao Zhang, Phil Saltzman, and Eddie Canaan +# Last Updated: 2015-03-13 +# +# This tutorial will demonstrate some uses for intervals in Panda +# to move objects in your panda world. +# Intervals are tools that change a value of something, like position, +# rotation or anything else, linearly, over a set period of time. They can be +# also be combined to work in sequence or in Parallel +# +# In this lesson, we will simulate a carousel in motion using intervals. +# The carousel will spin using an hprInterval while 4 pandas will represent +# the horses on a traditional carousel. The 4 pandas will rotate with the +# carousel and also move up and down on their poles using a LerpFunc interval. +# Finally there will also be lights on the outer edge of the carousel that +# will turn on and off by switching their texture with intervals in Sequence +# and Parallel + +from direct.showbase.ShowBase import ShowBase +from panda3d.core import AmbientLight, DirectionalLight, LightAttrib +from panda3d.core import NodePath +from panda3d.core import LVector3 +from direct.interval.IntervalGlobal import * # Needed to use Intervals +from direct.gui.DirectGui import * + +# Importing math constants and functions +from math import pi, sin + + +class CarouselDemo(ShowBase): + + def __init__(self): + # Initialize the ShowBase class from which we inherit, which will + # create a window and set up everything we need for rendering into it. + ShowBase.__init__(self) + + # This creates the on screen title that is in every tutorial + self.title = OnscreenText(text="Panda3D: Tutorial - Carousel", + parent=base.a2dBottomCenter, + fg=(1, 1, 1, 1), shadow=(0, 0, 0, .5), + pos=(0, .1), scale=.1) + + base.disableMouse() # Allow manual positioning of the camera + camera.setPosHpr(0, -8, 2.5, 0, -9, 0) # Set the cameras' position + # and orientation + + self.loadModels() # Load and position our models + self.setupLights() # Add some basic lighting + self.startCarousel() # Create the needed intervals and put the + # carousel into motion + + def loadModels(self): + # Load the carousel base + self.carousel = loader.loadModel("models/carousel_base") + self.carousel.reparentTo(render) # Attach it to render + + # Load the modeled lights that are on the outer rim of the carousel + # (not Panda lights) + # There are 2 groups of lights. At any given time, one group will have + # the "on" texture and the other will have the "off" texture. + self.lights1 = loader.loadModel("models/carousel_lights") + self.lights1.reparentTo(self.carousel) + + # Load the 2nd set of lights + self.lights2 = loader.loadModel("models/carousel_lights") + # We need to rotate the 2nd so it doesn't overlap with the 1st set. + self.lights2.setH(36) + self.lights2.reparentTo(self.carousel) + + # Load the textures for the lights. One texture is for the "on" state, + # the other is for the "off" state. + self.lightOffTex = loader.loadTexture("models/carousel_lights_off.jpg") + self.lightOnTex = loader.loadTexture("models/carousel_lights_on.jpg") + + # Create an list (self.pandas) with filled with 4 dummy nodes attached + # to the carousel. + # This uses a python concept called "Array Comprehensions." Check the + # Python manual for more information on how they work + self.pandas = [self.carousel.attachNewNode("panda" + str(i)) + for i in range(4)] + self.models = [loader.loadModel("models/carousel_panda") + for i in range(4)] + self.moves = [0] * 4 + + for i in range(4): + # set the position and orientation of the ith panda node we just created + # The Z value of the position will be the base height of the pandas. + # The headings are multiplied by i to put each panda in its own position + # around the carousel + self.pandas[i].setPosHpr(0, 0, 1.3, i * 90, 0, 0) + + # Load the actual panda model, and parent it to its dummy node + self.models[i].reparentTo(self.pandas[i]) + # Set the distance from the center. This distance is based on the way the + # carousel was modeled in Maya + self.models[i].setY(.85) + + # Load the environment (Sky sphere and ground plane) + self.env = loader.loadModel("models/env") + self.env.reparentTo(render) + self.env.setScale(7) + + # Panda Lighting + def setupLights(self): + # Create some lights and add them to the scene. By setting the lights on + # render they affect the entire scene + # Check out the lighting tutorial for more information on lights + ambientLight = AmbientLight("ambientLight") + ambientLight.setColor((.4, .4, .35, 1)) + directionalLight = DirectionalLight("directionalLight") + directionalLight.setDirection(LVector3(0, 8, -2.5)) + directionalLight.setColor((0.9, 0.8, 0.9, 1)) + render.setLight(render.attachNewNode(directionalLight)) + render.setLight(render.attachNewNode(ambientLight)) + + # Explicitly set the environment to not be lit + self.env.setLightOff() + + def startCarousel(self): + # Here's where we actually create the intervals to move the carousel + # The first type of interval we use is one created directly from a NodePath + # This interval tells the NodePath to vary its orientation (hpr) from its + # current value (0,0,0) to (360,0,0) over 20 seconds. Intervals created from + # NodePaths also exist for position, scale, color, and shear + + self.carouselSpin = self.carousel.hprInterval(20, LVector3(360, 0, 0)) + # Once an interval is created, we need to tell it to actually move. + # start() will cause an interval to play once. loop() will tell an interval + # to repeat once it finished. To keep the carousel turning, we use + # loop() + self.carouselSpin.loop() + + # The next type of interval we use is called a LerpFunc interval. It is + # called that becuase it linearly interpolates (aka Lerp) values passed to + # a function over a given amount of time. + + # In this specific case, horses on a carousel don't move contantly up, + # suddenly stop, and then contantly move down again. Instead, they start + # slowly, get fast in the middle, and slow down at the top. This motion is + # close to a sine wave. This LerpFunc calls the function oscillatePanda + # (which we will create below), which changes the height of the panda based + # on the sin of the value passed in. In this way we achieve non-linear + # motion by linearly changing the input to a function + for i in range(4): + self.moves[i] = LerpFunc( + self.oscillatePanda, # function to call + duration=3, # 3 second duration + fromData=0, # starting value (in radians) + toData=2 * pi, # ending value (2pi radians = 360 degrees) + # Additional information to pass to + # self.oscialtePanda + extraArgs=[self.models[i], pi * (i % 2)] + ) + # again, we want these to play continuously so we start them with + # loop() + self.moves[i].loop() + + # Finally, we combine Sequence, Parallel, Func, and Wait intervals, + # to schedule texture swapping on the lights to simulate the lights turning + # on and off. + # Sequence intervals play other intervals in a sequence. In other words, + # it waits for the current interval to finish before playing the next + # one. + # Parallel intervals play a group of intervals at the same time + # Wait intervals simply do nothing for a given amount of time + # Func intervals simply make a single function call. This is helpful because + # it allows us to schedule functions to be called in a larger sequence. They + # take virtually no time so they don't cause a Sequence to wait. + + self.lightBlink = Sequence( + # For the first step in our sequence we will set the on texture on one + # light and set the off texture on the other light at the same time + Parallel( + Func(self.lights1.setTexture, self.lightOnTex, 1), + Func(self.lights2.setTexture, self.lightOffTex, 1)), + Wait(1), # Then we will wait 1 second + # Then we will switch the textures at the same time + Parallel( + Func(self.lights1.setTexture, self.lightOffTex, 1), + Func(self.lights2.setTexture, self.lightOnTex, 1)), + Wait(1) # Then we will wait another second + ) + + self.lightBlink.loop() # Loop this sequence continuously + + def oscillatePanda(self, rad, panda, offset): + # This is the oscillation function mentioned earlier. It takes in a + # degree value, a NodePath to set the height on, and an offset. The + # offset is there so that the different pandas can move opposite to + # each other. The .2 is the amplitude, so the height of the panda will + # vary from -.2 to .2 + panda.setZ(sin(rad + offset) * .2) + +demo = CarouselDemo() +demo.run() diff --git a/samples/carousel/models/carousel_base.egg.pz b/samples/carousel/models/carousel_base.egg.pz new file mode 100644 index 0000000000..4f4de1f11b Binary files /dev/null and b/samples/carousel/models/carousel_base.egg.pz differ diff --git a/samples/carousel/models/carousel_base.jpg b/samples/carousel/models/carousel_base.jpg new file mode 100644 index 0000000000..3e1298a55f Binary files /dev/null and b/samples/carousel/models/carousel_base.jpg differ diff --git a/samples/carousel/models/carousel_lights.egg.pz b/samples/carousel/models/carousel_lights.egg.pz new file mode 100644 index 0000000000..6b712ce708 Binary files /dev/null and b/samples/carousel/models/carousel_lights.egg.pz differ diff --git a/samples/carousel/models/carousel_lights_off.jpg b/samples/carousel/models/carousel_lights_off.jpg new file mode 100644 index 0000000000..4d528ce747 Binary files /dev/null and b/samples/carousel/models/carousel_lights_off.jpg differ diff --git a/samples/carousel/models/carousel_lights_on.jpg b/samples/carousel/models/carousel_lights_on.jpg new file mode 100644 index 0000000000..5688bca94d Binary files /dev/null and b/samples/carousel/models/carousel_lights_on.jpg differ diff --git a/samples/carousel/models/carousel_panda.egg.pz b/samples/carousel/models/carousel_panda.egg.pz new file mode 100644 index 0000000000..a0f74c621f Binary files /dev/null and b/samples/carousel/models/carousel_panda.egg.pz differ diff --git a/samples/carousel/models/carousel_panda.jpg b/samples/carousel/models/carousel_panda.jpg new file mode 100644 index 0000000000..efe0c85981 Binary files /dev/null and b/samples/carousel/models/carousel_panda.jpg differ diff --git a/samples/carousel/models/env.egg.pz b/samples/carousel/models/env.egg.pz new file mode 100644 index 0000000000..abce5df2e9 Binary files /dev/null and b/samples/carousel/models/env.egg.pz differ diff --git a/samples/carousel/models/env_ground.jpg b/samples/carousel/models/env_ground.jpg new file mode 100644 index 0000000000..d563a603c2 Binary files /dev/null and b/samples/carousel/models/env_ground.jpg differ diff --git a/samples/carousel/models/env_sky.jpg b/samples/carousel/models/env_sky.jpg new file mode 100644 index 0000000000..b339776222 Binary files /dev/null and b/samples/carousel/models/env_sky.jpg differ diff --git a/samples/cartoon-shader/advanced.py b/samples/cartoon-shader/advanced.py new file mode 100755 index 0000000000..49f6a2adca --- /dev/null +++ b/samples/cartoon-shader/advanced.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python + +# Author: Kwasi Mensah +# Date: 7/11/2005 +# +# This is a tutorial to show some of the more advanced things +# you can do with Cg. Specifically, with Non Photo Realistic +# effects like Toon Shading. It also shows how to implement +# multiple buffers in Panda. + +from direct.showbase.ShowBase import ShowBase +from panda3d.core import PandaNode, LightNode, TextNode +from panda3d.core import Filename +from panda3d.core import NodePath +from panda3d.core import Shader +from panda3d.core import LVecBase4 +from direct.task.Task import Task +from direct.actor.Actor import Actor +from direct.gui.OnscreenText import OnscreenText +from direct.showbase.DirectObject import DirectObject +from direct.showbase.BufferViewer import BufferViewer +import sys +import os + + +# Function to put instructions on the screen. +def addInstructions(pos, msg): + return OnscreenText(text=msg, style=1, fg=(1, 1, 1, 1), + parent=base.a2dTopLeft, align=TextNode.ALeft, + pos=(0.08, -pos - 0.04), scale=.05) + +# Function to put title on the screen. +def addTitle(text): + return OnscreenText(text=text, style=1, pos=(-0.1, 0.09), scale=.08, + parent=base.a2dBottomRight, align=TextNode.ARight, + fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1)) + + +class ToonMaker(ShowBase): + + def __init__(self): + # Initialize the ShowBase class from which we inherit, which will + # create a window and set up everything we need for rendering into it. + ShowBase.__init__(self) + + self.disableMouse() + camera.setPos(0, -50, 0) + + # Check video card capabilities. + if not self.win.getGsg().getSupportsBasicShaders(): + addTitle("Toon Shader: Video driver reports that Cg shaders are not supported.") + return + + # Show instructions in the corner of the window. + self.title = addTitle( + "Panda3D: Tutorial - Toon Shading with Normals-Based Inking") + self.inst1 = addInstructions(0.06, "ESC: Quit") + self.inst2 = addInstructions(0.12, "Up/Down: Increase/Decrease Line Thickness") + self.inst3 = addInstructions(0.18, "Left/Right: Decrease/Increase Line Darkness") + self.inst4 = addInstructions(0.24, "V: View the render-to-texture results") + + # This shader's job is to render the model with discrete lighting + # levels. The lighting calculations built into the shader assume + # a single nonattenuating point light. + + tempnode = NodePath(PandaNode("temp node")) + tempnode.setShader(loader.loadShader("lightingGen.sha")) + self.cam.node().setInitialState(tempnode.getState()) + + # This is the object that represents the single "light", as far + # the shader is concerned. It's not a real Panda3D LightNode, but + # the shader doesn't care about that. + + light = render.attachNewNode("light") + light.setPos(30, -50, 0) + + # this call puts the light's nodepath into the render state. + # this enables the shader to access this light by name. + + render.setShaderInput("light", light) + + # The "normals buffer" will contain a picture of the model colorized + # so that the color of the model is a representation of the model's + # normal at that point. + + normalsBuffer = self.win.makeTextureBuffer("normalsBuffer", 0, 0) + normalsBuffer.setClearColor(LVecBase4(0.5, 0.5, 0.5, 1)) + self.normalsBuffer = normalsBuffer + normalsCamera = self.makeCamera( + normalsBuffer, lens=self.cam.node().getLens()) + normalsCamera.node().setScene(render) + tempnode = NodePath(PandaNode("temp node")) + tempnode.setShader(loader.loadShader("normalGen.sha")) + normalsCamera.node().setInitialState(tempnode.getState()) + + # what we actually do to put edges on screen is apply them as a texture to + # a transparent screen-fitted card + + drawnScene = normalsBuffer.getTextureCard() + drawnScene.setTransparency(1) + drawnScene.setColor(1, 1, 1, 0) + drawnScene.reparentTo(render2d) + self.drawnScene = drawnScene + + # this shader accepts, as input, the picture from the normals buffer. + # it compares each adjacent pixel, looking for discontinuities. + # wherever a discontinuity exists, it emits black ink. + + self.separation = 0.001 + self.cutoff = 0.3 + inkGen = loader.loadShader("inkGen.sha") + drawnScene.setShader(inkGen) + drawnScene.setShaderInput("separation", LVecBase4(self.separation, 0, self.separation, 0)) + drawnScene.setShaderInput("cutoff", LVecBase4(self.cutoff)) + + # Panda contains a built-in viewer that lets you view the results of + # your render-to-texture operations. This code configures the viewer. + + self.accept("v", self.bufferViewer.toggleEnable) + self.accept("V", self.bufferViewer.toggleEnable) + self.bufferViewer.setPosition("llcorner") + + # Load a dragon model and start its animation. + self.character = Actor() + self.character.loadModel('models/nik-dragon') + self.character.reparentTo(render) + self.character.loop('win') + self.character.hprInterval(15, (360, 0, 0)).loop() + + # These allow you to change cartooning parameters in realtime + self.accept("escape", sys.exit, [0]) + self.accept("arrow_up", self.increaseSeparation) + self.accept("arrow_down", self.decreaseSeparation) + self.accept("arrow_left", self.increaseCutoff) + self.accept("arrow_right", self.decreaseCutoff) + + def increaseSeparation(self): + self.separation = self.separation * 1.11111111 + print("separation: %f" % (self.separation)) + self.drawnScene.setShaderInput( + "separation", LVecBase4(self.separation, 0, self.separation, 0)) + + def decreaseSeparation(self): + self.separation = self.separation * 0.90000000 + print("separation: %f" % (self.separation)) + self.drawnScene.setShaderInput( + "separation", LVecBase4(self.separation, 0, self.separation, 0)) + + def increaseCutoff(self): + self.cutoff = self.cutoff * 1.11111111 + print("cutoff: %f" % (self.cutoff)) + self.drawnScene.setShaderInput("cutoff", LVecBase4(self.cutoff)) + + def decreaseCutoff(self): + self.cutoff = self.cutoff * 0.90000000 + print("cutoff: %f" % (self.cutoff)) + self.drawnScene.setShaderInput("cutoff", LVecBase4(self.cutoff)) + +t = ToonMaker() +t.run() diff --git a/samples/cartoon-shader/basic.py b/samples/cartoon-shader/basic.py new file mode 100755 index 0000000000..2861fc9300 --- /dev/null +++ b/samples/cartoon-shader/basic.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python + +from direct.showbase.ShowBase import ShowBase +from panda3d.core import PandaNode, LightNode, TextNode +from panda3d.core import Filename, NodePath +from panda3d.core import PointLight, AmbientLight +from panda3d.core import LightRampAttrib, AuxBitplaneAttrib +from panda3d.core import CardMaker +from panda3d.core import Shader, Texture +from direct.task.Task import Task +from direct.actor.Actor import Actor +from direct.gui.OnscreenText import OnscreenText +from direct.showbase.DirectObject import DirectObject +from direct.showbase.BufferViewer import BufferViewer +from direct.filter.CommonFilters import CommonFilters +import sys +import os + + +# Function to put instructions on the screen. +def addInstructions(pos, msg): + return OnscreenText(text=msg, style=1, fg=(1, 1, 1, 1), + parent=base.a2dTopLeft, align=TextNode.ALeft, + pos=(0.08, -pos - 0.04), scale=.05) + +# Function to put title on the screen. +def addTitle(text): + return OnscreenText(text=text, style=1, pos=(-0.1, 0.09), scale=.08, + parent=base.a2dBottomRight, align=TextNode.ARight, + fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1)) + + +class ToonMaker(ShowBase): + + def __init__(self): + # Initialize the ShowBase class from which we inherit, which will + # create a window and set up everything we need for rendering into it. + ShowBase.__init__(self) + + self.disableMouse() + self.cam.node().getLens().setNear(10.0) + self.cam.node().getLens().setFar(200.0) + camera.setPos(0, -50, 0) + + # Check video card capabilities. + if not self.win.getGsg().getSupportsBasicShaders(): + addTitle("Toon Shader: Video driver reports that Cg shaders are not supported.") + return + + # Enable a 'light ramp' - this discretizes the lighting, + # which is half of what makes a model look like a cartoon. + # Light ramps only work if shader generation is enabled, + # so we call 'setShaderAuto'. + + tempnode = NodePath(PandaNode("temp node")) + tempnode.setAttrib(LightRampAttrib.makeSingleThreshold(0.5, 0.4)) + tempnode.setShaderAuto() + self.cam.node().setInitialState(tempnode.getState()) + + # Use class 'CommonFilters' to enable a cartoon inking filter. + # This can fail if the video card is not powerful enough, if so, + # display an error and exit. + + self.separation = 1 # Pixels + self.filters = CommonFilters(self.win, self.cam) + filterok = self.filters.setCartoonInk(separation=self.separation) + if (filterok == False): + addTitle( + "Toon Shader: Video card not powerful enough to do image postprocessing") + return + + # Show instructions in the corner of the window. + self.title = addTitle( + "Panda3D: Tutorial - Toon Shading with Normals-Based Inking") + self.inst1 = addInstructions(0.06, "ESC: Quit") + self.inst2 = addInstructions(0.12, "Up/Down: Increase/Decrease Line Thickness") + self.inst3 = addInstructions(0.18, "V: View the render-to-texture results") + + # Load a dragon model and animate it. + self.character = Actor() + self.character.loadModel('models/nik-dragon') + self.character.reparentTo(render) + self.character.loadAnims({'win': 'models/nik-dragon'}) + self.character.loop('win') + self.character.hprInterval(15, (360, 0, 0)).loop() + + # Create a non-attenuating point light and an ambient light. + plightnode = PointLight("point light") + plightnode.setAttenuation((1, 0, 0)) + plight = render.attachNewNode(plightnode) + plight.setPos(30, -50, 0) + alightnode = AmbientLight("ambient light") + alightnode.setColor((0.8, 0.8, 0.8, 1)) + alight = render.attachNewNode(alightnode) + render.setLight(alight) + render.setLight(plight) + + # Panda contains a built-in viewer that lets you view the + # results of all render-to-texture operations. This lets you + # see what class CommonFilters is doing behind the scenes. + self.accept("v", self.bufferViewer.toggleEnable) + self.accept("V", self.bufferViewer.toggleEnable) + self.bufferViewer.setPosition("llcorner") + self.accept("s", self.filters.manager.resizeBuffers) + + # These allow you to change cartooning parameters in realtime + self.accept("escape", sys.exit, [0]) + self.accept("arrow_up", self.increaseSeparation) + self.accept("arrow_down", self.decreaseSeparation) + + def increaseSeparation(self): + self.separation = self.separation * 1.11111111 + print("separation: %f" % (self.separation)) + self.filters.setCartoonInk(separation=self.separation) + + def decreaseSeparation(self): + self.separation = self.separation * 0.90000000 + print("separation: %f" % (self.separation)) + self.filters.setCartoonInk(separation=self.separation) + +t = ToonMaker() +t.run() diff --git a/samples/cartoon-shader/inkGen.sha b/samples/cartoon-shader/inkGen.sha new file mode 100644 index 0000000000..930bc00764 --- /dev/null +++ b/samples/cartoon-shader/inkGen.sha @@ -0,0 +1,35 @@ +//Cg +// +//Cg profile arbvp1 arbfp1 + +void vshader(float4 vtx_position : POSITION, + float4 vtx_texcoord0 : TEXCOORD0, + out float4 l_position : POSITION, + out float4 l_texcoord0 : TEXCOORD0, + uniform float4x4 mat_modelproj) +{ + l_position=mul(mat_modelproj, vtx_position); + l_texcoord0 = vtx_texcoord0; +} + +void fshader(float4 l_texcoord0 : TEXCOORD0, + uniform sampler2D tex_0 : TEXUNIT0, + uniform float4 k_cutoff : C6, + uniform float4 k_separation : C7, + out float4 o_color : COLOR) +{ + float4 texcoord0 = l_texcoord0 + k_separation.xyzw; + float4 color0=tex2D(tex_0, float2(texcoord0.x, texcoord0.y)); + float4 texcoord1 = l_texcoord0 - k_separation.xyzw; + float4 color1=tex2D(tex_0, float2(texcoord1.x, texcoord1.y)); + float4 texcoord2 = l_texcoord0 + k_separation.wzyx; + float4 color2=tex2D(tex_0, float2(texcoord2.x, texcoord2.y)); + float4 texcoord3 = l_texcoord0 - k_separation.wzyx; + float4 color3=tex2D(tex_0, float2(texcoord3.x, texcoord3.y)); + float4 mx = max(color0,max(color1,max(color2,color3))); + float4 mn = min(color0,min(color1,min(color2,color3))); + float4 trigger = saturate(((mx-mn) * 3) - k_cutoff.x); + float thresh = dot(float3(trigger.x, trigger.y, trigger.z),float3(1,1,1)); + float4 output_color = float4 (0, 0, 0, thresh); + o_color = output_color; +} diff --git a/samples/cartoon-shader/lightingGen.sha b/samples/cartoon-shader/lightingGen.sha new file mode 100644 index 0000000000..c7cac59943 --- /dev/null +++ b/samples/cartoon-shader/lightingGen.sha @@ -0,0 +1,29 @@ +//Cg +// +//Cg profile arbvp1 arbfp1 + +void vshader(float4 vtx_position : POSITION, + float3 vtx_normal : NORMAL, + float4 vtx_color : COLOR, + out float4 l_position : POSITION, + out float4 l_brite : TEXCOORD0, + out float4 l_color : COLOR, + uniform float4 mspos_light, + uniform float4x4 mat_modelproj) +{ + l_position = mul(mat_modelproj, vtx_position); + float3 N = normalize(vtx_normal); + float3 lightVector = normalize(mspos_light - vtx_position); + l_brite = max(dot(N,lightVector), 0); + l_color = vtx_color; +} + + +void fshader(float4 l_brite : TEXCOORD0, + float4 l_color : COLOR, + out float4 o_color : COLOR) +{ + if (l_brite.x<0.5) l_brite=0.8; + else l_brite=1.2; + o_color=l_brite * l_color; +} diff --git a/samples/cartoon-shader/models/nik-dragon.egg.pz b/samples/cartoon-shader/models/nik-dragon.egg.pz new file mode 100644 index 0000000000..7c089ca705 Binary files /dev/null and b/samples/cartoon-shader/models/nik-dragon.egg.pz differ diff --git a/samples/cartoon-shader/normalGen.sha b/samples/cartoon-shader/normalGen.sha new file mode 100644 index 0000000000..a3642b0630 --- /dev/null +++ b/samples/cartoon-shader/normalGen.sha @@ -0,0 +1,25 @@ +//Cg +// +//Cg profile arbvp1 arbfp1 + +void vshader(float4 vtx_position : POSITION, + float4 vtx_normal : NORMAL, + out float4 l_position : POSITION, + out float3 l_color : TEXCOORD0, + uniform float4x4 mat_modelproj, + uniform float4x4 itp_modelview) +{ + l_position=mul(mat_modelproj, vtx_position); + l_color=(float3)mul(itp_modelview, vtx_normal); +} + +void fshader(float3 l_color: TEXCOORD0, + out float4 o_color: COLOR) +{ + l_color = normalize(l_color); + l_color = l_color/2; + o_color.rgb = l_color + float4(0.5, 0.5, 0.5, 0.5); + o_color.a = 1; +} + + diff --git a/samples/chessboard/main.py b/samples/chessboard/main.py new file mode 100755 index 0000000000..7da1d97a14 --- /dev/null +++ b/samples/chessboard/main.py @@ -0,0 +1,278 @@ +#!/usr/bin/env python + +# Author: Shao Zhang and Phil Saltzman +# Models: Eddie Canaan +# Last Updated: 2015-03-13 +# +# This tutorial shows how to determine what objects the mouse is pointing to +# We do this using a collision ray that extends from the mouse position +# and points straight into the scene, and see what it collides with. We pick +# the object with the closest collision + +from direct.showbase.ShowBase import ShowBase +from panda3d.core import CollisionTraverser, CollisionNode +from panda3d.core import CollisionHandlerQueue, CollisionRay +from panda3d.core import AmbientLight, DirectionalLight, LightAttrib +from panda3d.core import TextNode +from panda3d.core import LPoint3, LVector3, BitMask32 +from direct.gui.OnscreenText import OnscreenText +from direct.showbase.DirectObject import DirectObject +from direct.task.Task import Task +import sys + +# First we define some contants for the colors +BLACK = (0, 0, 0, 1) +WHITE = (1, 1, 1, 1) +HIGHLIGHT = (0, 1, 1, 1) +PIECEBLACK = (.15, .15, .15, 1) + +# Now we define some helper functions that we will need later + +# This function, given a line (vector plus origin point) and a desired z value, +# will give us the point on the line where the desired z value is what we want. +# This is how we know where to position an object in 3D space based on a 2D mouse +# position. It also assumes that we are dragging in the XY plane. +# +# This is derived from the mathmatical of a plane, solved for a given point +def PointAtZ(z, point, vec): + return point + vec * ((z - point.getZ()) / vec.getZ()) + +# A handy little function for getting the proper position for a given square1 +def SquarePos(i): + return LPoint3((i % 8) - 3.5, int(i // 8) - 3.5, 0) + +# Helper function for determining wheter a square should be white or black +# The modulo operations (%) generate the every-other pattern of a chess-board +def SquareColor(i): + if (i + ((i // 8) % 2)) % 2: + return BLACK + else: + return WHITE + + +class ChessboardDemo(ShowBase): + def __init__(self): + # Initialize the ShowBase class from which we inherit, which will + # create a window and set up everything we need for rendering into it. + ShowBase.__init__(self) + + # This code puts the standard title and instruction text on screen + self.title = OnscreenText(text="Panda3D: Tutorial - Mouse Picking", + style=1, fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1), + pos=(0.8, -0.95), scale = .07) + self.escapeEvent = OnscreenText( + text="ESC: Quit", parent=base.a2dTopLeft, + style=1, fg=(1, 1, 1, 1), pos=(0.06, -0.1), + align=TextNode.ALeft, scale = .05) + self.mouse1Event = OnscreenText( + text="Left-click and drag: Pick up and drag piece", + parent=base.a2dTopLeft, align=TextNode.ALeft, + style=1, fg=(1, 1, 1, 1), pos=(0.06, -0.16), scale=.05) + + self.accept('escape', sys.exit) # Escape quits + self.disableMouse() # Disble mouse camera control + camera.setPosHpr(0, -12, 8, 0, -35, 0) # Set the camera + self.setupLights() # Setup default lighting + + # Since we are using collision detection to do picking, we set it up like + # any other collision detection system with a traverser and a handler + self.picker = CollisionTraverser() # Make a traverser + self.pq = CollisionHandlerQueue() # Make a handler + # Make a collision node for our picker ray + self.pickerNode = CollisionNode('mouseRay') + # Attach that node to the camera since the ray will need to be positioned + # relative to it + self.pickerNP = camera.attachNewNode(self.pickerNode) + # Everything to be picked will use bit 1. This way if we were doing other + # collision we could seperate it + self.pickerNode.setFromCollideMask(BitMask32.bit(1)) + self.pickerRay = CollisionRay() # Make our ray + # Add it to the collision node + self.pickerNode.addSolid(self.pickerRay) + # Register the ray as something that can cause collisions + self.picker.addCollider(self.pickerNP, self.pq) + # self.picker.showCollisions(render) + + # Now we create the chess board and its pieces + + # We will attach all of the squares to their own root. This way we can do the + # collision pass just on the sqaures and save the time of checking the rest + # of the scene + self.squareRoot = render.attachNewNode("squareRoot") + + # For each square + self.squares = [None for i in range(64)] + self.pieces = [None for i in range(64)] + for i in range(64): + # Load, parent, color, and position the model (a single square + # polygon) + self.squares[i] = loader.loadModel("models/square") + self.squares[i].reparentTo(self.squareRoot) + self.squares[i].setPos(SquarePos(i)) + self.squares[i].setColor(SquareColor(i)) + # Set the model itself to be collideable with the ray. If this model was + # any more complex than a single polygon, you should set up a collision + # sphere around it instead. But for single polygons this works + # fine. + self.squares[i].find("**/polygon").node().setIntoCollideMask( + BitMask32.bit(1)) + # Set a tag on the square's node so we can look up what square this is + # later during the collision pass + self.squares[i].find("**/polygon").node().setTag('square', str(i)) + + # We will use this variable as a pointer to whatever piece is currently + # in this square + + # The order of pieces on a chessboard from white's perspective. This list + # contains the constructor functions for the piece classes defined + # below + pieceOrder = (Rook, Knight, Bishop, Queen, King, Bishop, Knight, Rook) + + for i in range(8, 16): + # Load the white pawns + self.pieces[i] = Pawn(i, WHITE) + for i in range(48, 56): + # load the black pawns + self.pieces[i] = Pawn(i, PIECEBLACK) + for i in range(8): + # Load the special pieces for the front row and color them white + self.pieces[i] = pieceOrder[i](i, WHITE) + # Load the special pieces for the back row and color them black + self.pieces[i + 56] = pieceOrder[i](i + 56, PIECEBLACK) + + # This will represent the index of the currently highlited square + self.hiSq = False + # This wil represent the index of the square where currently dragged piece + # was grabbed from + self.dragging = False + + # Start the task that handles the picking + self.mouseTask = taskMgr.add(self.mouseTask, 'mouseTask') + self.accept("mouse1", self.grabPiece) # left-click grabs a piece + self.accept("mouse1-up", self.releasePiece) # releasing places it + + # This function swaps the positions of two pieces + def swapPieces(self, fr, to): + temp = self.pieces[fr] + self.pieces[fr] = self.pieces[to] + self.pieces[to] = temp + if self.pieces[fr]: + self.pieces[fr].square = fr + self.pieces[fr].obj.setPos(SquarePos(fr)) + if self.pieces[to]: + self.pieces[to].square = to + self.pieces[to].obj.setPos(SquarePos(to)) + + def mouseTask(self, task): + # This task deals with the highlighting and dragging based on the mouse + + # First, clear the current highlight + if self.hiSq is not False: + self.squares[self.hiSq].setColor(SquareColor(self.hiSq)) + self.hiSq = False + + # Check to see if we can access the mouse. We need it to do anything + # else + if self.mouseWatcherNode.hasMouse(): + # get the mouse position + mpos = self.mouseWatcherNode.getMouse() + + # Set the position of the ray based on the mouse position + self.pickerRay.setFromLens(self.camNode, mpos.getX(), mpos.getY()) + + # If we are dragging something, set the position of the object + # to be at the appropriate point over the plane of the board + if self.dragging is not False: + # Gets the point described by pickerRay.getOrigin(), which is relative to + # camera, relative instead to render + nearPoint = render.getRelativePoint( + camera, self.pickerRay.getOrigin()) + # Same thing with the direction of the ray + nearVec = render.getRelativeVector( + camera, self.pickerRay.getDirection()) + self.pieces[self.dragging].obj.setPos( + PointAtZ(.5, nearPoint, nearVec)) + + # Do the actual collision pass (Do it only on the squares for + # efficiency purposes) + self.picker.traverse(self.squareRoot) + if self.pq.getNumEntries() > 0: + # if we have hit something, sort the hits so that the closest + # is first, and highlight that node + self.pq.sortEntries() + i = int(self.pq.getEntry(0).getIntoNode().getTag('square')) + # Set the highlight on the picked square + self.squares[i].setColor(HIGHLIGHT) + self.hiSq = i + + return Task.cont + + def grabPiece(self): + # If a square is highlighted and it has a piece, set it to dragging + # mode + if self.hiSq is not False and self.pieces[self.hiSq]: + self.dragging = self.hiSq + self.hiSq = False + + def releasePiece(self): + # Letting go of a piece. If we are not on a square, return it to its original + # position. Otherwise, swap it with the piece in the new square + # Make sure we really are dragging something + if self.dragging is not False: + # We have let go of the piece, but we are not on a square + if self.hiSq is False: + self.pieces[self.dragging].obj.setPos( + SquarePos(self.dragging)) + else: + # Otherwise, swap the pieces + self.swapPieces(self.dragging, self.hiSq) + + # We are no longer dragging anything + self.dragging = False + + def setupLights(self): # This function sets up some default lighting + ambientLight = AmbientLight("ambientLight") + ambientLight.setColor((.8, .8, .8, 1)) + directionalLight = DirectionalLight("directionalLight") + directionalLight.setDirection(LVector3(0, 45, -45)) + directionalLight.setColor((0.2, 0.2, 0.2, 1)) + render.setLight(render.attachNewNode(directionalLight)) + render.setLight(render.attachNewNode(ambientLight)) + + +# Class for a piece. This just handels loading the model and setting initial +# position and color +class Piece(object): + def __init__(self, square, color): + self.obj = loader.loadModel(self.model) + self.obj.reparentTo(render) + self.obj.setColor(color) + self.obj.setPos(SquarePos(square)) + + +# Classes for each type of chess piece +# Obviously, we could have done this by just passing a string to Piece's init. +# But if you wanted to make rules for how the pieces move, a good place to start +# would be to make an isValidMove(toSquare) method for each piece type +# and then check if the destination square is acceptible during ReleasePiece +class Pawn(Piece): + model = "models/pawn" + +class King(Piece): + model = "models/king" + +class Queen(Piece): + model = "models/queen" + +class Bishop(Piece): + model = "models/bishop" + +class Knight(Piece): + model = "models/knight" + +class Rook(Piece): + model = "models/rook" + +# Do the main initialization and start 3D rendering +demo = ChessboardDemo() +demo.run() diff --git a/samples/chessboard/models/bishop.egg.pz b/samples/chessboard/models/bishop.egg.pz new file mode 100644 index 0000000000..40260c2bd1 Binary files /dev/null and b/samples/chessboard/models/bishop.egg.pz differ diff --git a/samples/chessboard/models/king.egg.pz b/samples/chessboard/models/king.egg.pz new file mode 100644 index 0000000000..8ba7a57f39 Binary files /dev/null and b/samples/chessboard/models/king.egg.pz differ diff --git a/samples/chessboard/models/knight.egg.pz b/samples/chessboard/models/knight.egg.pz new file mode 100644 index 0000000000..b7cabaa5eb Binary files /dev/null and b/samples/chessboard/models/knight.egg.pz differ diff --git a/samples/chessboard/models/pawn.egg.pz b/samples/chessboard/models/pawn.egg.pz new file mode 100644 index 0000000000..42d7e21113 Binary files /dev/null and b/samples/chessboard/models/pawn.egg.pz differ diff --git a/samples/chessboard/models/queen.egg.pz b/samples/chessboard/models/queen.egg.pz new file mode 100644 index 0000000000..0db73ebbf1 Binary files /dev/null and b/samples/chessboard/models/queen.egg.pz differ diff --git a/samples/chessboard/models/rook.egg.pz b/samples/chessboard/models/rook.egg.pz new file mode 100644 index 0000000000..e7886caf42 Binary files /dev/null and b/samples/chessboard/models/rook.egg.pz differ diff --git a/samples/chessboard/models/square.egg.pz b/samples/chessboard/models/square.egg.pz new file mode 100644 index 0000000000..f2e0a15812 Binary files /dev/null and b/samples/chessboard/models/square.egg.pz differ diff --git a/samples/culling/models/cells.egg b/samples/culling/models/cells.egg new file mode 100644 index 0000000000..50560b6041 --- /dev/null +++ b/samples/culling/models/cells.egg @@ -0,0 +1,586 @@ + { Y-Up } + + cell1 { + cell1-ORG { + 0 { + -4 0 -4 + { 0 1 0 } + { 0.999 0.999 0.999 1 } + } + 1 { + 11.5789 0 -11.5789 + { 0 1 0 } + { 1 1 1 1 } + } + 2 { + -11.5789 0 -11.5789 + { 0 1 0 } + { 1 1 1 1 } + } + 3 { + -4 0 4 + { 0 1 0 } + { 1 1 1 1 } + } + 4 { + 4 0 -4 + { 0 1 0 } + { 1 1 1 1 } + } + 5 { + 11.5789 0 11.5789 + { 0 1 0 } + { 1 1 1 1 } + } + 6 { + 4 0 4 + { 0 1 0 } + { 1 1 1 1 } + } + 7 { + -11.5789 0 11.5789 + { 0 1 0 } + { 1 1 1 1 } + } + } + { + { 0 1 2 { cell1-ORG } } + } + { + { 2 3 0 { cell1-ORG } } + } + { + { 4 5 1 { cell1-ORG } } + } + { + { 6 7 5 { cell1-ORG } } + } + { + { 4 1 0 { cell1-ORG } } + } + { + { 7 3 2 { cell1-ORG } } + } + { + { 6 5 4 { cell1-ORG } } + } + { + { 3 7 6 { cell1-ORG } } + } +} + cell2 { + cell2-ORG { + 0 { + -4 0 -0.838305 + { 0 1 0 } + { 0.999 0.999 0.999 1 } + } + 1 { + 4 0 0.527741 + { 0 1 0 } + { 1 1 1 1 } + } + 2 { + 4 0 -0.838305 + { 0 1 0 } + { 1 1 1 1 } + } + 3 { + -4 0 0.527741 + { 0 1 0 } + { 1 1 1 1 } + } + } + { + { 0 1 2 { cell2-ORG } } + } + { + { 3 1 0 { cell2-ORG } } + } +} + cell3 { + cell3-ORG { + 0 { + -1.02178 0 -0.838305 + { 0 1 0 } + { 0.999 0.999 0.999 1 } + } + 1 { + 0.243417 0 -1.36315 + { 0 1 0 } + { 1 1 1 1 } + } + 2 { + -1.02178 0 -1.36315 + { 0 1 0 } + { 1 1 1 1 } + } + 3 { + -3.36172 0 -3.42013 + { 0 1 0 } + { 1 1 1 1 } + } + 4 { + 2.99397 0 -1.36315 + { 0 1 0 } + { 1 1 1 1 } + } + 5 { + 2.99397 0 -3.42013 + { 0 1 0 } + { 1 1 1 1 } + } + 6 { + -3.36172 0 -1.36315 + { 0 1 0 } + { 1 1 1 1 } + } + 7 { + 0.243417 0 -0.838305 + { 0 1 0 } + { 1 1 1 1 } + } + } + { + { 0 1 2 { cell3-ORG } } + } + { + { 1 3 2 { cell3-ORG } } + } + { + { 4 5 1 { cell3-ORG } } + } + { + { 6 2 3 { cell3-ORG } } + } + { + { 7 1 0 { cell3-ORG } } + } + { + { 5 3 1 { cell3-ORG } } + } +} + cell4 { + cell4-ORG { + 0 { + 2.99397 0 0.527741 + { 0 0.854764 -0.519017 } + { 0.999 0.999 0.999 1 } + } + 1 { + 2.04443 1.03879 2.23852 + { 0.158619 0.946967 -0.279453 } + { 1 1 1 1 } + } + 2 { + 2.99397 1.03879 2.23852 + { 0 0.983872 -0.178875 } + { 1 1 1 1 } + } + 3 { + 2.04443 1.03879 3.18072 + { 0.309844 0.950787 0 } + { 1 1 1 1 } + } + 4 { + 2.99397 1.03879 3.18072 + { 0 1 0 } + { 1 1 1 1 } + } + 5 { + 0.519489 2.15079 2.23852 + { 0.320561 0.934229 0.156384 } + { 1 1 1 1 } + } + 6 { + 0.519489 2.15079 3.18072 + { 0.205355 0.978688 0 } + { 1 1 1 1 } + } + 7 { + -0.423812 2.15079 2.23852 + { 0 0.95348 0.301457 } + { 1 1 1 1 } + } + 8 { + -0.423812 2.15079 3.18072 + { 0 1 0 } + { 1 1 1 1 } + } + 9 { + 0.519489 3.3704 0.502572 + { 0 0.916633 0.399729 } + { 1 1 1 1 } + } + 10 { + -0.423812 3.3704 0.502572 + { 0 0.979823 0.199865 } + { 1 1 1 1 } + } + 11 { + 0.519489 3.3704 0.115602 + { 0 1 0 } + { 1 1 1 1 } + } + 12 { + -0.423812 3.3704 0.115602 + { 0 1 0 } + { 1 1 1 1 } + } + 13 { + 2.04443 0 0.527741 + { 0 0.854764 -0.519017 } + { 1 1 1 1 } + } + } + { + { 0 1 2 { cell4-ORG } } + } + { + { 2 3 4 { cell4-ORG } } + } + { + { 3 5 6 { cell4-ORG } } + } + { + { 6 7 8 { cell4-ORG } } + } + { + { 7 9 10 { cell4-ORG } } + } + { + { 10 11 12 { cell4-ORG } } + } + { + { 13 1 0 { cell4-ORG } } + } + { + { 1 3 2 { cell4-ORG } } + } + { + { 1 5 3 { cell4-ORG } } + } + { + { 5 7 6 { cell4-ORG } } + } + { + { 5 9 7 { cell4-ORG } } + } + { + { 9 11 10 { cell4-ORG } } + } +} + cell5 { + cell5-ORG { + 0 { + 2.99397 3.3704 0.115602 + { 0 1 0 } + { 1 1 1 1 } + } + 1 { + -3.36172 3.3704 -3.42013 + { 0 1 0 } + { 1 1 1 1 } + } + 2 { + -3.36172 3.3704 0.115602 + { 0 1 0 } + { 0.999 0.999 0.999 1 } + } + 3 { + 2.99397 3.3704 -3.42013 + { 0 1 0 } + { 1 1 1 1 } + } + } + { + { 0 1 2 { cell5-ORG } } + } + { + { 3 1 0 { cell5-ORG } } + } +} + cell6 { + cell6-ORG { + 0 { + 2.99397 3.3704 0.115602 + { 0 1 0 } + { 0.999 0.999 0.999 1 } + } + 1 { + 0.997627 3.3704 3.18072 + { 0 1 0 } + { 1 1 1 1 } + } + 2 { + 2.99397 3.3704 3.18072 + { 0 1 0 } + { 1 1 1 1 } + } + 3 { + 0.997627 3.3704 0.115602 + { 0 1 0 } + { 1 1 1 1 } + } + } + { + { 0 1 2 { cell6-ORG } } + } + { + { 3 1 0 { cell6-ORG } } + } +} + cell7 { + cell7-ORG { + 0 { + -3.36172 3.3704 0.115602 + { 0 1 0 } + { 0.999 0.999 0.999 1 } + } + 1 { + -0.900963 3.3704 2.04979 + { 0 1 0 } + { 1 1 1 1 } + } + 2 { + -0.900963 3.3704 0.115602 + { 0 1 0 } + { 1 1 1 1 } + } + 3 { + -2.30748 3.3704 3.18072 + { 0 1 0 } + { 1 1 1 1 } + } + 4 { + -2.30748 3.3704 2.05045 + { 0 1 0 } + { 1 1 1 1 } + } + 5 { + -3.36172 3.3704 3.18072 + { 0 1 0 } + { 1 1 1 1 } + } + } + { + { 0 1 2 { cell7-ORG } } + } + { + { 0 3 4 { cell7-ORG } } + } + { + { 4 1 0 { cell7-ORG } } + } + { + { 5 3 0 { cell7-ORG } } + } +} + cell8 { + cell8-ORG { + 0 { + -2.30748 3.3704 2.23852 + { -0.430354 0.90266 0 } + { 0.999 0.999 0.999 1 } + } + 1 { + 1.82483 5.34053 3.18072 + { -0.430354 0.90266 0 } + { 1 1 1 1 } + } + 2 { + 1.82483 5.34053 2.23852 + { -0.430354 0.90266 0 } + { 1 1 1 1 } + } + 3 { + -2.30748 3.3704 3.18072 + { -0.430354 0.90266 0 } + { 1 1 1 1 } + } + } + { + { 0 1 2 { cell8-ORG } } + } + { + { 3 1 0 { cell8-ORG } } + } +} + cell9 { + cell9-ORG { + 0 { + 1.82483 5.34053 3.18072 + { 0 1 0 } + { 1 1 1 1 } + } + 1 { + 2.99397 5.34053 -3.42013 + { 0 1 0 } + { 1 1 1 1 } + } + 2 { + 1.82483 5.34053 -2.49425 + { 0 1 0 } + { 1 1 1 1 } + } + 3 { + -0.485624 5.34053 -3.42013 + { 0 1 0 } + { 1 1 1 1 } + } + 4 { + -0.485624 5.34053 -2.49425 + { 0 1 0 } + { 0.999 0.999 0.999 1 } + } + 5 { + 2.99397 5.34053 3.18072 + { 0 1 0 } + { 1 1 1 1 } + } + } + { + { 0 1 2 { cell9-ORG } } + } + { + { 2 3 4 { cell9-ORG } } + } + { + { 5 1 0 { cell9-ORG } } + } + { + { 1 3 2 { cell9-ORG } } + } +} + cell10 { + cell10-ORG { + 0 { + -3.36172 5.34053 -3.42013 + { 0 1 0 } + { 0.999 0.999 0.999 1 } + } + 1 { + -0.485624 5.34053 -2.49425 + { 0 1 0 } + { 1 1 1 1 } + } + 2 { + -0.485624 5.34053 -3.42013 + { 0 1 0 } + { 1 1 1 1 } + } + 3 { + -2.36149 5.34053 2.04979 + { 0 1 0 } + { 1 1 1 1 } + } + 4 { + -2.36149 5.34053 -2.49425 + { 0 1 0 } + { 1 1 1 1 } + } + 5 { + -3.36172 5.34053 2.04979 + { 0 1 0 } + { 1 1 1 1 } + } + } + { + { 0 1 2 { cell10-ORG } } + } + { + { 0 3 4 { cell10-ORG } } + } + { + { 4 1 0 { cell10-ORG } } + } + { + { 5 3 0 { cell10-ORG } } + } +} + cell11 { + cell11-ORG { + 0 { + -2.36149 5.34053 1.0558 + { 0 1 0 } + { 0.999 0.999 0.999 1 } + } + 1 { + -1.90136 5.34053 2.04979 + { 0 1 0 } + { 1 1 1 1 } + } + 2 { + -1.90136 5.34053 1.0558 + { 0 1 0 } + { 1 1 1 1 } + } + 3 { + 1.31869 5.34053 0.350091 + { 0 1 0 } + { 1 1 1 1 } + } + 4 { + 1.31869 5.34053 -2.1928 + { 0 1 0 } + { 1 1 1 1 } + } + 5 { + -1.90136 5.34053 -2.16895 + { 0 1 0 } + { 1 1 1 1 } + } + 6 { + 1.31869 5.34053 -0.718624 + { 0 1 0 } + { 1 1 1 1 } + } + 7 { + 1.82483 5.34053 0.350091 + { 0 1 0 } + { 1 1 1 1 } + } + 8 { + -2.36149 5.34053 2.04979 + { 0 1 0 } + { 1 1 1 1 } + } + 9 { + 1.31869 5.34053 2.04979 + { 0 1 0 } + { 1 1 1 1 } + } + 10 { + 1.82483 5.34053 -0.718624 + { 0 1 0 } + { 1 1 1 1 } + } + } + { + { 0 1 2 { cell11-ORG } } + } + { + { 1 3 2 { cell11-ORG } } + } + { + { 4 5 6 { cell11-ORG } } + } + { + { 6 2 3 { cell11-ORG } } + } + { + { 7 6 3 { cell11-ORG } } + } + { + { 8 1 0 { cell11-ORG } } + } + { + { 9 3 1 { cell11-ORG } } + } + { + { 5 2 6 { cell11-ORG } } + } + { + { 10 6 7 { cell11-ORG } } + } +} diff --git a/samples/culling/models/level.egg b/samples/culling/models/level.egg new file mode 100644 index 0000000000..873fae9ff1 --- /dev/null +++ b/samples/culling/models/level.egg @@ -0,0 +1,2435 @@ + { Y-Up } + + levelgeo { + levelgeo-ORG { + 0 { + -4 0 -4 + { 0 0 -1 } + { 0.551941 0.559784 0.544098 1 } + } + 1 { + -4 7.57015 -4 + { 0 0 -1 } + { 0.482353 0.560784 0.611765 1 } + } + 2 { + 4 7.57015 -4 + { 0 0 -1 } + { 0.482353 0.560784 0.611765 1 } + } + 3 { + 4 0 -4 + { 0 0 -1 } + { 0.552941 0.560784 0.545098 1 } + } + 4 { + -4 0 4 + { 0 0 1 } + { 0.552941 0.560784 0.545098 1 } + } + 5 { + 4 0 4 + { 0 0 1 } + { 0.552941 0.560784 0.545098 1 } + } + 6 { + 4 7.57015 4 + { 0 0 1 } + { 0.482353 0.560784 0.611765 1 } + } + 7 { + -4 7.57015 4 + { 0 0 1 } + { 0.482353 0.560784 0.611765 1 } + } + 8 { + -4 0 -4 + { -1 0 0 } + { 0.551941 0.559784 0.544098 1 } + } + 9 { + -4 0 -0.838305 + { -1 0 0 } + { 0.552941 0.560784 0.545098 1 } + } + 10 { + -4 1.48611 -0.838305 + { -1 0 0 } + { 0.552941 0.560784 0.545098 1 } + } + 11 { + -4 7.57015 -4 + { -1 0 0 } + { 0.482353 0.560784 0.611765 1 } + } + 12 { + 4 7.57015 -4 + { 1 0 0 } + { 0.482353 0.560784 0.611765 1 } + } + 13 { + 4 1.48611 -0.838305 + { 1 0 0 } + { 0.552941 0.560784 0.545098 1 } + } + 14 { + 4 0 -0.838305 + { 1 0 0 } + { 0.552941 0.560784 0.545098 1 } + } + 15 { + 4 0 -4 + { 1 0 0 } + { 0.552941 0.560784 0.545098 1 } + } + 16 { + -4 7.57015 -4 + { 0 1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 17 { + -4 7.57015 4 + { 0 1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 18 { + 4 7.57015 4 + { 0 1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 19 { + 4 7.57015 -4 + { 0 1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 20 { + -4 0 -4 + { 0 1 0 } + { 0.375471 0.497039 0.001 1 } + } + 21 { + 4 0 -4 + { 0 1 0 } + { 0.376471 0.498039 0 1 } + } + 22 { + 11.5789 0 -11.5789 + { 0 1 0 } + { 0.462745 0.713726 0.192157 1 } + } + 23 { + -11.5789 0 -11.5789 + { 0 1 0 } + { 0.462745 0.713726 0.192157 1 } + } + 24 { + 4 0 -0.838305 + { 0 1 0 } + { 0.376471 0.498039 0 1 } + } + 25 { + -4 0 4 + { 0 1 0 } + { 0.376471 0.498039 0 1 } + } + 26 { + -4 0 0.527741 + { 0 1 0 } + { 0.376471 0.498039 0 1 } + } + 27 { + -11.5789 0 11.5789 + { 0 1 0 } + { 0.462745 0.713726 0.192157 1 } + } + 28 { + 4 0 4 + { 0 1 0 } + { 0.376471 0.498039 0 1 } + } + 29 { + 11.5789 0 11.5789 + { 0 1 0 } + { 0.462745 0.713726 0.192157 1 } + } + 30 { + -4 0 4 + { -1 0 0 } + { 0.552941 0.560784 0.545098 1 } + } + 31 { + -4 7.57015 4 + { -1 0 0 } + { 0.482353 0.560784 0.611765 1 } + } + 32 { + -4 1.48611 0.527741 + { -1 0 0 } + { 0.552941 0.560784 0.545098 1 } + } + 33 { + -4 0 0.527741 + { -1 0 0 } + { 0.552941 0.560784 0.545098 1 } + } + 34 { + 4 0 4 + { 1 0 0 } + { 0.552941 0.560784 0.545098 1 } + } + 35 { + 4 0 0.527741 + { 1 0 0 } + { 0.552941 0.560784 0.545098 1 } + } + 36 { + 4 1.48611 0.527741 + { 1 0 0 } + { 0.552941 0.560784 0.545098 1 } + } + 37 { + 4 7.57015 4 + { 1 0 0 } + { 0.482353 0.560784 0.611765 1 } + } + 38 { + -4 1.48611 -0.838305 + { 0 -5.3759e-011 1 } + { 0.729412 0.513726 0.341176 1 } + } + 39 { + -4 0 -0.838305 + { 0 -5.3759e-011 1 } + { 0.729412 0.513726 0.341176 1 } + } + 40 { + -1.02178 0 -0.838305 + { 0 -5.3759e-011 1 } + { 0.729412 0.513726 0.341176 1 } + } + 41 { + -1.03253 1.48611 -0.838305 + { 0 -5.3759e-011 1 } + { 0.729412 0.513726 0.341176 1 } + } + 42 { + -4 0 -0.838305 + { 0 1 0 } + { 0.729412 0.192157 0.247059 1 } + } + 43 { + -4 0 0.527741 + { 0 1 0 } + { 0.729412 0.192157 0.247059 1 } + } + 44 { + -1.02178 0 -0.838305 + { 0 1 0 } + { 0.729412 0.192157 0.247059 1 } + } + 45 { + -4 0 0.527741 + { 0 1.40115e-009 -1 } + { 0.729412 0.513726 0.341176 1 } + } + 46 { + -4 1.48611 0.527741 + { 0 1.40115e-009 -1 } + { 0.729412 0.513726 0.341176 1 } + } + 47 { + 2.04443 1.48611 0.527741 + { 0 1.40115e-009 -1 } + { 0.729412 0.513726 0.341176 1 } + } + 48 { + 2.04443 0 0.527741 + { 0 1.40115e-009 -1 } + { 0.729412 0.513726 0.341176 1 } + } + 49 { + -4 1.48611 0.527741 + { 0 -1 0 } + { 0.729412 0.396078 0.341176 1 } + } + 50 { + -1.03253 1.48611 -0.838305 + { 0 -1 0 } + { 0.729412 0.396078 0.341176 1 } + } + 51 { + 0.243412 1.48611 -0.838305 + { 0 -1 0 } + { 0.729412 0.396078 0.341176 1 } + } + 52 { + 2.04443 1.48611 0.527741 + { 0 -0.983257 0.182222 } + { 0.729412 0.396078 0.341176 1 } + } + 53 { + 2.99397 0 -0.838305 + { 1.47369e-009 -2.57304e-010 1 } + { 0.729412 0.513726 0.341176 1 } + } + 54 { + 2.99397 1.48611 -0.838305 + { 1.47369e-009 -2.57304e-010 1 } + { 0.729412 0.513726 0.341176 1 } + } + 55 { + 0.243412 1.48611 -0.838305 + { 0 -5.3759e-011 1 } + { 0.729412 0.513726 0.341176 1 } + } + 56 { + 0.243417 0 -0.838305 + { 0 -5.3759e-011 1 } + { 0.729412 0.513726 0.341176 1 } + } + 57 { + -1.02178 0 -0.838305 + { 0 1 0 } + { 0.458824 0.666667 0.729412 1 } + } + 58 { + 0.243417 0 -0.838305 + { 0 1 0 } + { 0.458824 0.666667 0.729412 1 } + } + 59 { + 0.243417 0 -1.36315 + { 0 1 0 } + { 0.713726 0.721569 0.788235 1 } + } + 60 { + -1.02178 0 -1.36315 + { 0 1 0 } + { 0.713726 0.721569 0.788235 1 } + } + 61 { + 0.243417 0 -0.838305 + { -1 -3.33861e-006 0 } + { 0.458824 0.666667 0.729412 1 } + } + 62 { + 0.243412 1.48611 -0.838305 + { -1 -3.33861e-006 0 } + { 0.458824 0.666667 0.729412 1 } + } + 63 { + 0.243412 1.48611 -1.3609 + { -1 -3.33861e-006 0 } + { 0.458824 0.666667 0.729412 1 } + } + 64 { + 0.243417 0 -1.36315 + { -1 -3.33861e-006 0 } + { 0.713726 0.721569 0.788235 1 } + } + 65 { + 0.243412 1.48611 -0.838305 + { 0 -1 0 } + { 0.458824 0.666667 0.729412 1 } + } + 66 { + -1.03253 1.48611 -0.838305 + { 0 -1 0 } + { 0.458824 0.666667 0.729412 1 } + } + 67 { + -1.03253 1.48611 -1.3609 + { 0 -1 0 } + { 0.458824 0.666667 0.729412 1 } + } + 68 { + 0.243412 1.48611 -1.3609 + { 0 -1 0 } + { 0.458824 0.666667 0.729412 1 } + } + 69 { + -1.03253 1.48611 -0.838305 + { 0.999974 0.00723416 0 } + { 0.458824 0.666667 0.729412 1 } + } + 70 { + -1.02178 0 -0.838305 + { 0.999974 0.00723416 0 } + { 0.458824 0.666667 0.729412 1 } + } + 71 { + -1.02178 0 -1.36315 + { 0.999974 0.00723416 0 } + { 0.713726 0.721569 0.788235 1 } + } + 72 { + -1.03253 1.48611 -1.3609 + { 0.999974 0.00723416 0 } + { 0.458824 0.666667 0.729412 1 } + } + 73 { + 0.243412 1.48611 -1.3609 + { -0.00013873 0.000502693 -1 } + { 0.458824 0.776471 0.796078 1 } + } + 74 { + 2.99397 3.00428 -1.3609 + { -0.00013873 0.000502693 -1 } + { 0.686275 0.890196 0.796078 1 } + } + 75 { + 2.99397 0 -1.36315 + { -0.00027746 0.00100539 -0.999999 } + { 0.458824 0.776471 0.796078 1 } + } + 76 { + 0.243417 0 -1.36315 + { -0.00027746 0.00100539 -0.999999 } + { 0.713726 0.721569 0.788235 1 } + } + 77 { + -1.02178 0 -1.36315 + { 0.000327154 0.00100617 -0.999999 } + { 0.713726 0.721569 0.788235 1 } + } + 78 { + -3.36172 0 -1.36315 + { 0.000327154 0.00100617 -0.999999 } + { 0.458824 0.776471 0.796078 1 } + } + 79 { + -3.36172 3.00428 -1.3609 + { 0.000163577 0.000503084 -1 } + { 0.686275 0.890196 0.796078 1 } + } + 80 { + -1.03253 1.48611 -1.3609 + { 0.000163577 0.000503084 -1 } + { 0.458824 0.776471 0.796078 1 } + } + 81 { + 2.99397 0 -3.42013 + { 0 -1.77621e-006 1 } + { 0.458824 0.776471 0.796078 1 } + } + 82 { + 2.99397 3.00428 -3.42012 + { 0 -1.77621e-006 1 } + { 0.686275 0.890196 0.796078 1 } + } + 83 { + -3.36172 3.00428 -3.42012 + { 0 -1.77621e-006 1 } + { 0.686275 0.890196 0.796078 1 } + } + 84 { + -3.36172 0 -3.42013 + { 0 -1.77621e-006 1 } + { 0.458824 0.776471 0.796078 1 } + } + 85 { + -3.36172 3.00428 -1.3609 + { 0 -1 0 } + { 0.686275 0.890196 0.796078 1 } + } + 86 { + -3.36172 3.00428 -3.42012 + { 0 -1 0 } + { 0.686275 0.890196 0.796078 1 } + } + 87 { + 2.99397 3.00428 -3.42012 + { 0 -1 0 } + { 0.686275 0.890196 0.796078 1 } + } + 88 { + 2.99397 3.00428 -1.3609 + { 0 -1 0 } + { 0.686275 0.890196 0.796078 1 } + } + 89 { + 2.99397 0 -3.42013 + { 0 1 0 } + { 0.505882 0.721569 0.788235 1 } + } + 90 { + -3.36172 0 -3.42013 + { 0 1 0 } + { 0.505882 0.721569 0.788235 1 } + } + 91 { + 0.519489 4.88145 0.507012 + { 0 -0.953298 -0.302032 } + { 0.733333 0.462745 0.294118 1 } + } + 92 { + -0.423826 4.88145 0.507012 + { 0 -0.953298 -0.302032 } + { 0.733333 0.462745 0.294118 1 } + } + 93 { + -0.423826 4.88145 0.120042 + { 0 -1 0 } + { 0.733333 0.462745 0.294118 1 } + } + 94 { + 0.519489 4.88145 0.120042 + { 0 -1 0 } + { 0.733333 0.462745 0.294118 1 } + } + 95 { + 0.519489 3.3704 0.502572 + { -1 3.06469e-012 1.07738e-012 } + { 0.733333 0.654902 0.294118 1 } + } + 96 { + 0.519489 4.88145 0.507012 + { -1 3.06469e-012 1.07738e-012 } + { 0.733333 0.654902 0.294118 1 } + } + 97 { + 0.519489 4.88145 0.120042 + { -1 3.06627e-012 0 } + { 0.733333 0.654902 0.294118 1 } + } + 98 { + 0.519489 3.3704 0.115602 + { -1 3.06627e-012 0 } + { 0.733333 0.654902 0.294118 1 } + } + 99 { + 2.99397 1.48611 -0.838305 + { 8.64537e-011 -1 7.27066e-011 } + { 0.729412 0.396078 0.341176 1 } + } + 100 { + 2.99397 1.48611 0.527741 + { 5.96697e-011 -0.983257 0.182222 } + { 0.729412 0.396078 0.341176 1 } + } + 101 { + -4 1.48611 -0.838305 + { 0 -1 0 } + { 0.729412 0.396078 0.341176 1 } + } + 102 { + -2.30748 3.3704 3.18072 + { -0.220612 0.975362 0 } + { 1 1 1 1 } + } + 103 { + -2.30748 3.3704 2.23852 + { -0.146659 0.989187 0 } + { 1 1 1 1 } + } + 104 { + -3.36172 3.3704 3.18072 + { 0 1 0 } + { 0.733333 0.658824 0.760784 1 } + } + 105 { + -0.900963 3.3704 0.115602 + { 0 1 0 } + { 0.733333 0.462745 0.760784 1 } + } + 106 { + -0.423812 3.3704 0.115602 + { 0 1 0 } + { 0.733333 0.462745 0.760784 1 } + } + 107 { + -3.36172 3.3704 -3.42013 + { 0 1 0 } + { 0.733333 0.658824 0.760784 1 } + } + 108 { + 0.997627 3.3704 0.115602 + { 0 1 0 } + { 0.733333 0.462745 0.760784 1 } + } + 109 { + 2.99397 3.3704 -3.42013 + { 0 1 0 } + { 0.733333 0.658824 0.760784 1 } + } + 110 { + 0.519489 3.3704 0.115602 + { 0 1 0 } + { 0.733333 0.462745 0.760784 1 } + } + 111 { + 2.99397 5.12958 0.115606 + { 3.51998e-009 -1 -1.29401e-009 } + { 0.376471 0.498039 0.760784 1 } + } + 112 { + 0.997627 5.12958 0.115602 + { 3.53529e-009 -1 -1.28696e-009 } + { 0.376471 0.498039 0.760784 1 } + } + 113 { + 2.99397 5.12958 -3.42013 + { 3.54741e-009 -1 -1.28263e-009 } + { 0.376471 0.498039 0.760784 1 } + } + 114 { + 2.99397 0 -3.42013 + { -1 -1.07371e-007 0 } + { 0.458824 0.776471 0.796078 1 } + } + 115 { + 2.99397 0 -1.36315 + { -1 -1.07371e-007 0 } + { 0.458824 0.776471 0.796078 1 } + } + 116 { + 2.99397 3.00428 -1.3609 + { -1 -1.07371e-007 0 } + { 0.686275 0.890196 0.796078 1 } + } + 117 { + 2.99397 3.00428 -3.42012 + { -1 -1.07371e-007 0 } + { 0.686275 0.890196 0.796078 1 } + } + 118 { + -0.423826 4.88145 0.507012 + { 1 9.25347e-006 3.25304e-006 } + { 0.733333 0.654902 0.294118 1 } + } + 119 { + -0.423812 3.3704 0.502572 + { 1 9.25347e-006 3.25304e-006 } + { 0.733333 0.654902 0.294118 1 } + } + 120 { + -0.423812 3.3704 0.115602 + { 1 9.25824e-006 0 } + { 0.733333 0.654902 0.294118 1 } + } + 121 { + -0.423826 4.88145 0.120042 + { 1 9.25824e-006 0 } + { 0.733333 0.654902 0.294118 1 } + } + 122 { + 2.99397 2.54985 3.18072 + { 0 7.83887e-008 -1 } + { 0.733333 0.654902 0.294118 1 } + } + 123 { + 2.99397 1.03879 3.18072 + { 0 7.83887e-008 -1 } + { 0.733333 0.654902 0.294118 1 } + } + 124 { + 2.04443 1.03879 3.18072 + { 2.85806e-008 7.83886e-008 -1 } + { 0.733333 0.654902 0.294118 1 } + } + 125 { + 2.04443 2.54985 3.18072 + { 2.85806e-008 7.83886e-008 -1 } + { 0.733333 0.654902 0.294118 1 } + } + 126 { + 2.99397 1.48611 0.527741 + { -1 0 0 } + { 0.733333 0.654902 0.294118 1 } + } + 127 { + 2.99397 0 0.527741 + { -1 0 0 } + { 0.733333 0.654902 0.294118 1 } + } + 128 { + 2.99397 1.03879 2.23852 + { -1 0 0 } + { 0.733333 0.654902 0.294118 1 } + } + 129 { + 2.99397 2.54985 2.23852 + { -1 0 0 } + { 0.733333 0.654902 0.294118 1 } + } + 130 { + 2.99397 0 0.527741 + { 0 0.983872 -0.178875 } + { 0.901961 0.654902 0.152941 1 } + } + 131 { + 2.04443 0 0.527741 + { 0 0.983872 -0.178875 } + { 0.901961 0.654902 0.152941 1 } + } + 132 { + 2.04443 1.03879 2.23852 + { 0.212236 0.959168 -0.186958 } + { 0.901961 0.654902 0.152941 1 } + } + 133 { + 2.99397 1.03879 2.23852 + { 0 0.963007 -0.269477 } + { 0.901961 0.654902 0.152941 1 } + } + 134 { + 2.04443 0 0.527741 + { 1 -1.48049e-006 9.09752e-007 } + { 0.733333 0.654902 0.294118 1 } + } + 135 { + 2.04443 1.48611 0.527741 + { 1 -1.48049e-006 9.09752e-007 } + { 0.733333 0.654902 0.294118 1 } + } + 136 { + 2.04443 2.54985 2.23852 + { 1 -1.48049e-006 9.09752e-007 } + { 0.733333 0.654902 0.294118 1 } + } + 137 { + 2.04443 1.03879 2.23852 + { 1 -1.48049e-006 9.09752e-007 } + { 0.733333 0.654902 0.294118 1 } + } + 138 { + 2.04443 1.48611 0.527741 + { 0 -0.983257 0.182222 } + { 0.733333 0.462745 0.294118 1 } + } + 139 { + 2.99397 1.48611 0.527741 + { 5.96697e-011 -0.983257 0.182222 } + { 0.733333 0.462745 0.294118 1 } + } + 140 { + 2.99397 2.54985 2.23852 + { 0 -0.961568 0.274569 } + { 0.733333 0.462745 0.294118 1 } + } + 141 { + 2.04443 2.54985 2.23852 + { -0.212513 -0.958418 0.190453 } + { 0.733333 0.462745 0.294118 1 } + } + 142 { + 2.99397 1.03879 3.18072 + { -1 0 0 } + { 0.733333 0.654902 0.294118 1 } + } + 143 { + 2.99397 2.54985 3.18072 + { -1 0 0 } + { 0.733333 0.654902 0.294118 1 } + } + 144 { + 2.04443 1.03879 3.18072 + { 0.309844 0.950787 0 } + { 0.901961 0.654902 0.152941 1 } + } + 145 { + 2.99397 1.03879 3.18072 + { 0 1 0 } + { 0.901961 0.654902 0.152941 1 } + } + 146 { + -0.423812 2.15079 2.23852 + { 1 9.25347e-006 3.25304e-006 } + { 0.733333 0.654902 0.294118 1 } + } + 147 { + -0.423826 3.66184 2.23852 + { 1 9.25347e-006 3.25304e-006 } + { 0.733333 0.654902 0.294118 1 } + } + 148 { + -0.423826 3.66184 3.18072 + { 1 9.25824e-006 0 } + { 0.733333 0.654902 0.294118 1 } + } + 149 { + -0.423812 2.15079 3.18072 + { 1 9.25824e-006 0 } + { 0.733333 0.654902 0.294118 1 } + } + 150 { + 2.99397 2.54985 3.18072 + { 0 -1 0 } + { 0.733333 0.462745 0.294118 1 } + } + 151 { + 2.04443 2.54985 3.18072 + { -0.309844 -0.950787 0 } + { 0.733333 0.462745 0.294118 1 } + } + 152 { + 2.04443 1.03879 2.23852 + { 7.18913e-009 9.85887e-009 1 } + { 0.733333 0.654902 0.294118 1 } + } + 153 { + 2.04443 2.54985 2.23852 + { 7.18913e-009 9.85887e-009 1 } + { 0.733333 0.654902 0.294118 1 } + } + 154 { + 0.519489 3.66184 2.23852 + { 7.18913e-009 9.85887e-009 1 } + { 0.733333 0.654902 0.294118 1 } + } + 155 { + 0.519489 2.15079 2.23852 + { 7.18913e-009 9.85887e-009 1 } + { 0.733333 0.654902 0.294118 1 } + } + 156 { + 0.519489 3.66184 3.18072 + { -0.309844 -0.950787 0 } + { 0.733333 0.462745 0.294118 1 } + } + 157 { + 0.519489 3.66184 2.23852 + { -0.214114 -0.95413 -0.209266 } + { 0.733333 0.462745 0.294118 1 } + } + 158 { + 0.519489 2.15079 3.18072 + { 2.85806e-008 7.83886e-008 -1 } + { 0.733333 0.654902 0.294118 1 } + } + 159 { + 0.519489 3.66184 3.18072 + { 2.85806e-008 7.83886e-008 -1 } + { 0.733333 0.654902 0.294118 1 } + } + 160 { + 0.519489 2.15079 2.23852 + { 0.214078 0.954223 0.208873 } + { 0.901961 0.654902 0.152941 1 } + } + 161 { + 0.519489 2.15079 3.18072 + { 0.309844 0.950787 0 } + { 0.901961 0.654902 0.152941 1 } + } + 162 { + -0.423812 3.3704 0.502572 + { 0 0.95348 0.301457 } + { 0.901961 0.654902 0.152941 1 } + } + 163 { + 0.519489 3.3704 0.502572 + { 0 0.95348 0.301457 } + { 0.901961 0.654902 0.152941 1 } + } + 164 { + 0.519489 3.3704 0.115602 + { 0 1 0 } + { 0.901961 0.654902 0.152941 1 } + } + 165 { + -0.423812 3.3704 0.115602 + { 0 1 0 } + { 0.901961 0.654902 0.152941 1 } + } + 166 { + -0.423826 3.66184 3.18072 + { 0 -1 0 } + { 0.733333 0.462745 0.294118 1 } + } + 167 { + -0.423826 3.66184 2.23852 + { 0 -0.953298 -0.302032 } + { 0.733333 0.462745 0.294118 1 } + } + 168 { + -0.423812 2.15079 3.18072 + { 0 7.83887e-008 -1 } + { 0.733333 0.654902 0.294118 1 } + } + 169 { + -0.423826 3.66184 3.18072 + { 0 7.83887e-008 -1 } + { 0.733333 0.654902 0.294118 1 } + } + 170 { + -0.423812 2.15079 2.23852 + { 0 0.95348 0.301457 } + { 0.901961 0.654902 0.152941 1 } + } + 171 { + -0.423812 2.15079 3.18072 + { 0 1 0 } + { 0.901961 0.654902 0.152941 1 } + } + 172 { + 0.519489 2.15079 2.23852 + { -1 3.06311e-012 2.15477e-012 } + { 0.733333 0.654902 0.294118 1 } + } + 173 { + 0.519489 3.66184 2.23852 + { -1 3.06311e-012 2.15477e-012 } + { 0.733333 0.654902 0.294118 1 } + } + 174 { + -3.36172 3.00428 -3.42012 + { 1 -6.80267e-009 0 } + { 0.686275 0.890196 0.796078 1 } + } + 175 { + -3.36172 3.00428 -1.3609 + { 1 -6.80267e-009 0 } + { 0.686275 0.890196 0.796078 1 } + } + 176 { + -3.36172 0 -1.36315 + { 1 -6.80267e-009 0 } + { 0.458824 0.776471 0.796078 1 } + } + 177 { + -3.36172 0 -3.42013 + { 1 -6.80267e-009 0 } + { 0.458824 0.776471 0.796078 1 } + } + 178 { + -2.36149 7.09573 -2.49425 + { 0 -1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 179 { + -3.36172 7.09573 -3.42013 + { 0 -1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 180 { + -0.485624 7.09573 -3.42013 + { 0 -1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 181 { + -0.485624 7.09573 -2.49425 + { 0 -1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 182 { + 2.99397 3.3704 0.115602 + { 0 1 0 } + { 0.733333 0.658824 0.760784 1 } + } + 183 { + 0.997627 3.3704 3.18072 + { 0 1 0 } + { 0.733333 0.462745 0.760784 1 } + } + 184 { + 2.99397 3.3704 3.18072 + { 0 1 0 } + { 0.733333 0.658824 0.760784 1 } + } + 185 { + -1.90136 7.09573 -2.16895 + { 0 -1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 186 { + 1.31869 7.09573 -0.718624 + { 0 -1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 187 { + 1.31869 7.09573 0.350091 + { 0 -1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 188 { + -1.90136 7.09573 1.0558 + { 0 -1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 189 { + -3.36172 3.3704 0.115602 + { 0 1 0 } + { 0.733333 0.658824 0.760784 1 } + } + 190 { + -2.30748 3.3704 2.05045 + { 0 1 0 } + { 0.733333 0.462745 0.760784 1 } + } + 191 { + -0.900963 3.3704 2.04979 + { 0 1 0 } + { 0.733333 0.462745 0.760784 1 } + } + 192 { + 1.82483 5.34053 3.18072 + { -0.220612 0.975362 0 } + { 0.752941 0.752941 0.752941 1 } + } + 193 { + 1.82483 5.34053 2.23852 + { -0.146659 0.989187 0 } + { 0.752941 0.752941 0.752941 1 } + } + 194 { + 2.99397 5.34053 3.18072 + { 0 1 0 } + { 0.752941 0.752941 0.752941 1 } + } + 195 { + 2.99397 5.34053 2.23852 + { 0 1 0 } + { 0.752941 0.752941 0.752941 1 } + } + 196 { + 1.82483 5.34053 0.350091 + { 0 1 0 } + { 0.752941 0.752941 0.752941 1 } + } + 197 { + 2.99397 7.09573 -3.42013 + { 0 -1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 198 { + 1.82483 7.09573 -2.49425 + { 0 -1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 199 { + -2.36149 7.09573 1.0558 + { 0 -1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 200 { + -3.36172 7.09573 2.04979 + { 0 -1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 201 { + 1.82483 5.34053 -0.718624 + { 0 1 0 } + { 0.752941 0.752941 0.752941 1 } + } + 202 { + 1.31869 5.34053 -0.718624 + { 0 1 0 } + { 0.752941 0.752941 0.752941 1 } + } + 203 { + 1.31869 5.34053 0.350091 + { 0 1 0 } + { 0.752941 0.752941 0.752941 1 } + } + 204 { + -2.36149 5.34053 1.0558 + { 0 1 0 } + { 0.752941 0.752941 0.752941 1 } + } + 205 { + -2.36149 5.34053 2.04979 + { 0 1 0 } + { 0.752941 0.752941 0.752941 1 } + } + 206 { + -1.90136 5.34053 2.04979 + { 0 1 0 } + { 0.752941 0.752941 0.752941 1 } + } + 207 { + -1.90136 5.34053 1.0558 + { 0 1 0 } + { 0.752941 0.752941 0.752941 1 } + } + 208 { + 2.99397 3.3704 -3.42013 + { -4.07833e-010 -6.17821e-011 1 } + { 0.733333 0.658824 0.760784 1 } + } + 209 { + 2.99397 5.12958 -3.42013 + { -4.07833e-010 -6.17821e-011 1 } + { 0.376471 0.498039 0.760784 1 } + } + 210 { + -3.36172 5.12958 -3.42013 + { -4.07833e-010 -6.17821e-011 1 } + { 0.376471 0.498039 0.760784 1 } + } + 211 { + -3.36172 3.3704 -3.42013 + { -4.07833e-010 -6.17821e-011 1 } + { 0.733333 0.658824 0.760784 1 } + } + 212 { + 2.99397 5.12958 1.67403 + { 3.51106e-009 -1 -1.29564e-009 } + { 0.376471 0.498039 0.760784 1 } + } + 213 { + 0.997673 5.12958 1.67402 + { 3.51106e-009 -1 -1.29564e-009 } + { 0.376471 0.498039 0.760784 1 } + } + 214 { + 2.99397 3.3704 -3.42013 + { -1 -8.366e-011 9.98999e-012 } + { 0.733333 0.658824 0.760784 1 } + } + 215 { + 2.99397 3.3704 0.115602 + { -1 6.51735e-011 6.38546e-011 } + { 0.733333 0.658824 0.760784 1 } + } + 216 { + 2.99397 5.12958 0.115606 + { -1 9.77602e-011 9.57819e-011 } + { 0.376471 0.498039 0.760784 1 } + } + 217 { + 2.99397 5.12958 -3.42013 + { -1 -8.366e-011 9.98999e-012 } + { 0.376471 0.498039 0.760784 1 } + } + 218 { + -3.36172 3.3704 0.115602 + { 1 2.60413e-011 1.94624e-012 } + { 0.733333 0.658824 0.760784 1 } + } + 219 { + -3.36172 3.3704 -3.42013 + { 1 2.23911e-011 1.9372e-012 } + { 0.733333 0.658824 0.760784 1 } + } + 220 { + -3.36172 5.12958 -3.42013 + { 1 2.23911e-011 1.9372e-012 } + { 0.376471 0.498039 0.760784 1 } + } + 221 { + -3.36172 5.12958 0.115593 + { 1 2.60413e-011 1.94624e-012 } + { 0.376471 0.498039 0.760784 1 } + } + 222 { + 2.99397 4.51665 1.67402 + { -1 1.3959e-010 9.07869e-011 } + { 0.733333 0.462745 0.760784 1 } + } + 223 { + 2.99397 5.12958 1.67403 + { -1 2.7918e-010 1.81574e-010 } + { 0.376471 0.498039 0.760784 1 } + } + 224 { + -3.36172 5.12958 0.115593 + { 3.60372e-009 -1 -1.29603e-009 } + { 0.376471 0.498039 0.760784 1 } + } + 225 { + -2.30746 5.12958 2.05044 + { 3.60957e-009 -1 -1.29785e-009 } + { 0.376471 0.498039 0.760784 1 } + } + 226 { + -2.30746 5.12958 2.23852 + { 0.146407 -0.989224 -1.50609e-007 } + { 0.376471 0.498039 0.760784 1 } + } + 227 { + -3.36172 5.12958 3.18072 + { 3.62962e-009 -1 -1.30501e-009 } + { 0.376471 0.498039 0.760784 1 } + } + 228 { + 2.99397 3.3704 3.18072 + { 0 0 -1 } + { 0.733333 0.658824 0.760784 1 } + } + 229 { + 0.997627 3.3704 3.18072 + { 0 0 -1 } + { 0.733333 0.462745 0.760784 1 } + } + 230 { + 0.997627 4.51665 3.18072 + { 0 0 -1 } + { 0.733333 0.462745 0.760784 1 } + } + 231 { + 2.99397 4.51665 3.18072 + { 0 0 -1 } + { 0.733333 0.462745 0.760784 1 } + } + 232 { + -3.36172 5.12958 3.18072 + { 1 2.96915e-011 1.95529e-012 } + { 0.376471 0.498039 0.760784 1 } + } + 233 { + -3.36172 3.3704 3.18072 + { 1 2.96915e-011 1.95529e-012 } + { 0.733333 0.658824 0.760784 1 } + } + 234 { + 0.997627 3.3704 3.18072 + { 1 0 0 } + { 0.733333 0.462745 0.760784 1 } + } + 235 { + 0.997627 3.3704 0.115602 + { 1 -9.56319e-006 -3.85741e-006 } + { 0.733333 0.462745 0.760784 1 } + } + 236 { + 0.997627 4.51665 1.67402 + { 1 -9.56319e-006 -3.85741e-006 } + { 0.733333 0.462745 0.760784 1 } + } + 237 { + 0.997627 4.51665 3.18072 + { 1 0 0 } + { 0.733333 0.462745 0.760784 1 } + } + 238 { + -2.30748 3.3704 3.18072 + { 4.42741e-011 -1.09614e-010 -1 } + { 1 1 1 1 } + } + 239 { + -3.36172 3.3704 3.18072 + { 2.75919e-011 -1.51613e-010 -1 } + { 0.733333 0.658824 0.760784 1 } + } + 240 { + -3.36172 5.12958 3.18072 + { 2.75919e-011 -1.51613e-010 -1 } + { 0.376471 0.498039 0.760784 1 } + } + 241 { + -2.30746 5.12958 3.18072 + { 4.42741e-011 -1.09614e-010 -1 } + { 0.376471 0.498039 0.760784 1 } + } + 242 { + 1.82483 5.34053 3.18072 + { 3.04782e-011 -3.38078e-011 -1 } + { 0.752941 0.752941 0.752941 1 } + } + 243 { + 1.82483 7.09573 3.18072 + { 3.04782e-011 -3.38078e-011 -1 } + { 0.482353 0.560784 0.611765 1 } + } + 244 { + 2.99397 5.34053 3.18072 + { 0 0 -1 } + { 0.752941 0.752941 0.752941 1 } + } + 245 { + 2.99397 7.09573 3.18072 + { 0 0 -1 } + { 0.482353 0.560784 0.611765 1 } + } + 246 { + 2.99397 5.34053 2.23852 + { -1 0 0 } + { 0.752941 0.752941 0.752941 1 } + } + 247 { + 2.99397 5.34053 3.18072 + { -1 0 0 } + { 0.752941 0.752941 0.752941 1 } + } + 248 { + 2.99397 7.09573 3.18072 + { -1 0 0 } + { 0.482353 0.560784 0.611765 1 } + } + 249 { + 2.99397 7.09573 2.23852 + { -1 0 0 } + { 0.482353 0.560784 0.611765 1 } + } + 250 { + 2.99397 5.34053 -3.42013 + { -1 0 0 } + { 0.752941 0.752941 0.752941 1 } + } + 251 { + 2.99397 7.09573 -3.42013 + { -1 0 0 } + { 0.482353 0.560784 0.611765 1 } + } + 252 { + 2.99397 5.34053 -3.42013 + { 0 0 1 } + { 0.752941 0.752941 0.752941 1 } + } + 253 { + 2.99397 7.09573 -3.42013 + { 0 0 1 } + { 0.482353 0.560784 0.611765 1 } + } + 254 { + -0.485624 7.09573 -3.42013 + { 0 0 1 } + { 0.482353 0.560784 0.611765 1 } + } + 255 { + -0.485624 5.34053 -3.42013 + { 0 0 1 } + { 0.752941 0.752941 0.752941 1 } + } + 256 { + -3.36172 5.34053 -3.42013 + { 0 1 0 } + { 0.752941 0.752941 0.752941 1 } + } + 257 { + -2.36149 5.34053 -2.49425 + { 0 1 0 } + { 0.752941 0.752941 0.752941 1 } + } + 258 { + -0.485624 5.34053 -2.49425 + { 0 1 0 } + { 0.752941 0.752941 0.752941 1 } + } + 259 { + -0.485624 5.34053 -3.42013 + { 0 1 0 } + { 0.752941 0.752941 0.752941 1 } + } + 260 { + -3.36172 5.34053 -3.42013 + { 1 0 0 } + { 0.752941 0.752941 0.752941 1 } + } + 261 { + -3.36172 7.09573 -3.42013 + { 1 0 0 } + { 0.482353 0.560784 0.611765 1 } + } + 262 { + -3.36172 7.09573 2.04979 + { 1 0 0 } + { 0.482353 0.560784 0.611765 1 } + } + 263 { + -3.36172 5.34053 2.04979 + { 1 0 0 } + { 0.752941 0.752941 0.752941 1 } + } + 264 { + -3.36172 5.34053 2.04979 + { 0 1 0 } + { 0.752941 0.752941 0.752941 1 } + } + 265 { + -2.36149 5.34053 2.04979 + { 0 0 -1 } + { 0.752941 0.752941 0.752941 1 } + } + 266 { + -3.36172 5.34053 2.04979 + { 0 0 -1 } + { 0.752941 0.752941 0.752941 1 } + } + 267 { + -3.36172 7.09573 2.04979 + { 0 0 -1 } + { 0.482353 0.560784 0.611765 1 } + } + 268 { + -2.36149 7.09573 2.04979 + { 0 0 -1 } + { 0.482353 0.560784 0.611765 1 } + } + 269 { + -1.90136 5.34053 2.04979 + { 0 0 -1 } + { 0.752941 0.752941 0.752941 1 } + } + 270 { + -1.90136 7.09573 2.04979 + { 0 0 -1 } + { 0.482353 0.560784 0.611765 1 } + } + 271 { + -0.900963 3.3704 0.115602 + { -1 7.02332e-006 1.01878e-006 } + { 0.733333 0.462745 0.760784 1 } + } + 272 { + -0.900963 3.3704 2.04979 + { -1 7.02332e-006 1.01878e-006 } + { 0.733333 0.462745 0.760784 1 } + } + 273 { + -0.900949 5.12958 2.04979 + { -1 7.02332e-006 1.01878e-006 } + { 0.376471 0.498039 0.760784 1 } + } + 274 { + -0.900953 5.12958 0.115599 + { -1 7.02332e-006 1.01878e-006 } + { 0.376471 0.498039 0.760784 1 } + } + 275 { + -0.900963 3.3704 2.04979 + { -0.000468015 -2.28319e-006 -1 } + { 0.733333 0.462745 0.760784 1 } + } + 276 { + -2.30748 3.3704 2.05045 + { -0.000468015 -2.28319e-006 -1 } + { 0.733333 0.462745 0.760784 1 } + } + 277 { + -2.30746 5.12958 2.05044 + { -0.000468015 -2.28319e-006 -1 } + { 0.376471 0.498039 0.760784 1 } + } + 278 { + -0.900949 5.12958 2.04979 + { -0.000468015 -2.28319e-006 -1 } + { 0.376471 0.498039 0.760784 1 } + } + 279 { + -2.30748 3.3704 2.05045 + { -1 1.2768e-005 1.17008e-006 } + { 0.733333 0.462745 0.760784 1 } + } + 280 { + -2.30748 3.3704 2.23852 + { -1 1.2768e-005 1.17008e-006 } + { 1 1 1 1 } + } + 281 { + -2.30746 5.12958 2.23852 + { -1 1.2768e-005 1.17008e-006 } + { 0.376471 0.498039 0.760784 1 } + } + 282 { + -2.30746 5.12958 2.05044 + { -1 1.2768e-005 1.17008e-006 } + { 0.376471 0.498039 0.760784 1 } + } + 283 { + -2.30748 3.3704 2.23852 + { 7.06683e-012 -7.83886e-012 1 } + { 1 1 1 1 } + } + 284 { + 1.82483 5.34053 2.23852 + { 7.06683e-012 -7.83886e-012 1 } + { 0.752941 0.752941 0.752941 1 } + } + 285 { + 1.82483 7.09573 2.23852 + { 7.06683e-012 -7.83886e-012 1 } + { 0.482353 0.560784 0.611765 1 } + } + 286 { + -2.30746 5.12958 2.23852 + { 7.06683e-012 -7.83886e-012 1 } + { 0.376471 0.498039 0.760784 1 } + } + 287 { + 1.82483 5.34053 2.23852 + { 1 0 0 } + { 0.752941 0.752941 0.752941 1 } + } + 288 { + 1.82483 5.34053 0.350091 + { 1 0 0 } + { 0.752941 0.752941 0.752941 1 } + } + 289 { + 1.82483 7.09573 0.350091 + { 1 0 0 } + { 0.482353 0.560784 0.611765 1 } + } + 290 { + 1.82483 7.09573 2.23852 + { 1 0 0 } + { 0.482353 0.560784 0.611765 1 } + } + 291 { + -0.423826 4.88145 0.120042 + { 0.00250514 -0.00827025 -0.999963 } + { 0.733333 0.462745 0.760784 1 } + } + 292 { + -0.900953 5.12958 0.115599 + { 0.00250514 -0.00827025 -0.999963 } + { 0.376471 0.498039 0.760784 1 } + } + 293 { + 0.997627 5.12958 0.115602 + { -0.00249668 -0.00826966 -0.999963 } + { 0.376471 0.498039 0.760784 1 } + } + 294 { + 0.519489 4.88145 0.120042 + { -0.00249668 -0.00826966 -0.999963 } + { 0.733333 0.462745 0.760784 1 } + } + 295 { + 0.997627 3.3704 0.115602 + { -0.00499447 0.00135754 -0.999987 } + { 0.733333 0.462745 0.760784 1 } + } + 296 { + 0.519489 3.3704 0.115602 + { -0.00499447 0.00135754 -0.999987 } + { 0.733333 0.462745 0.760784 1 } + } + 297 { + -0.423812 3.3704 0.115602 + { 0.00500867 0.00135636 -0.999987 } + { 0.733333 0.462745 0.760784 1 } + } + 298 { + -0.900963 3.3704 0.115602 + { 0.00500867 0.00135636 -0.999987 } + { 0.733333 0.462745 0.760784 1 } + } + 299 { + 2.99397 3.3704 3.18072 + { -1 0 0 } + { 0.733333 0.658824 0.760784 1 } + } + 300 { + 2.99397 4.51665 3.18072 + { -1 0 0 } + { 0.733333 0.462745 0.760784 1 } + } + 301 { + 0.997627 4.51665 3.18072 + { 0 -1 0 } + { 0.733333 0.462745 0.760784 1 } + } + 302 { + 0.997627 4.51665 1.67402 + { 0 -1 0 } + { 0.733333 0.462745 0.760784 1 } + } + 303 { + 2.99397 4.51665 1.67402 + { 0 -1 0 } + { 0.733333 0.462745 0.760784 1 } + } + 304 { + 2.99397 4.51665 3.18072 + { 0 -1 0 } + { 0.733333 0.462745 0.760784 1 } + } + 305 { + -0.900953 5.12958 0.115599 + { 3.58039e-009 -1 -1.28204e-009 } + { 0.376471 0.498039 0.760784 1 } + } + 306 { + -3.36172 5.12958 -3.42013 + { 3.57897e-009 -1 -1.28263e-009 } + { 0.376471 0.498039 0.760784 1 } + } + 307 { + -2.36149 5.34053 -2.49425 + { 0 0 -1 } + { 0.752941 0.752941 0.752941 1 } + } + 308 { + -2.36149 7.09573 -2.49425 + { 0 0 -1 } + { 0.482353 0.560784 0.611765 1 } + } + 309 { + -0.485624 7.09573 -2.49425 + { 0 0 -1 } + { 0.482353 0.560784 0.611765 1 } + } + 310 { + -0.485624 5.34053 -2.49425 + { 0 0 -1 } + { 0.752941 0.752941 0.752941 1 } + } + 311 { + 0.997627 5.12958 0.115602 + { 1 -1.91264e-005 -7.71482e-006 } + { 0.376471 0.498039 0.760784 1 } + } + 312 { + 0.997673 5.12958 1.67402 + { 1 -1.91264e-005 -7.71482e-006 } + { 0.376471 0.498039 0.760784 1 } + } + 313 { + 2.99397 4.51665 1.67402 + { 3.17248e-006 2.8011e-006 -1 } + { 0.733333 0.462745 0.760784 1 } + } + 314 { + 0.997627 4.51665 1.67402 + { 3.17248e-006 2.8011e-006 -1 } + { 0.733333 0.462745 0.760784 1 } + } + 315 { + 0.997673 5.12958 1.67402 + { 3.17248e-006 2.8011e-006 -1 } + { 0.376471 0.498039 0.760784 1 } + } + 316 { + 2.99397 5.12958 1.67403 + { 3.17248e-006 2.8011e-006 -1 } + { 0.376471 0.498039 0.760784 1 } + } + 317 { + -0.900949 5.12958 2.04979 + { 3.58324e-009 -1 -1.28086e-009 } + { 0.376471 0.498039 0.760784 1 } + } + 318 { + -3.36172 0 -1.36315 + { 0 1 0 } + { 0.505882 0.721569 0.788235 1 } + } + 319 { + 2.99397 0 -1.36315 + { 0 1 0 } + { 0.505882 0.721569 0.788235 1 } + } + 320 { + 1.82483 7.09573 2.23852 + { 0.146407 -0.989224 -1.4972e-007 } + { 0.482353 0.560784 0.611765 1 } + } + 321 { + 1.82483 7.09573 3.18072 + { 0.220231 -0.975448 -2.25215e-007 } + { 0.482353 0.560784 0.611765 1 } + } + 322 { + -2.30746 5.12958 3.18072 + { 0.220231 -0.975448 -2.25879e-007 } + { 0.376471 0.498039 0.760784 1 } + } + 323 { + 2.99397 7.09573 2.23852 + { 0 -1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 324 { + 2.99397 7.09573 3.18072 + { 0 -1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 325 { + 1.82483 7.09573 0.350091 + { 0 -1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 326 { + 1.82483 7.09573 -0.718624 + { 0 -1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 327 { + -1.90136 5.34053 -2.16895 + { 0 1 0 } + { 0.752941 0.752941 0.752941 1 } + } + 328 { + 1.82483 5.34053 -0.718624 + { 1 0 0 } + { 0.752941 0.752941 0.752941 1 } + } + 329 { + 1.82483 5.34053 -2.49425 + { 1 0 0 } + { 0.752941 0.752941 0.752941 1 } + } + 330 { + 1.82483 7.09573 -2.49425 + { 1 0 0 } + { 0.482353 0.560784 0.611765 1 } + } + 331 { + 1.82483 7.09573 -0.718624 + { 1 0 0 } + { 0.482353 0.560784 0.611765 1 } + } + 332 { + 1.82483 5.34053 -2.49425 + { 0 0 -1 } + { 0.752941 0.752941 0.752941 1 } + } + 333 { + 1.82483 7.09573 -2.49425 + { 0 0 -1 } + { 0.482353 0.560784 0.611765 1 } + } + 334 { + -2.36149 5.34053 -2.49425 + { -1 0 0 } + { 0.752941 0.752941 0.752941 1 } + } + 335 { + -2.36149 5.34053 1.0558 + { -1 0 0 } + { 0.752941 0.752941 0.752941 1 } + } + 336 { + -2.36149 7.09573 1.0558 + { -1 0 0 } + { 0.482353 0.560784 0.611765 1 } + } + 337 { + -2.36149 7.09573 -2.49425 + { -1 0 0 } + { 0.482353 0.560784 0.611765 1 } + } + 338 { + 1.31869 5.34053 -2.1928 + { 0 1 0 } + { 0.752941 0.752941 0.752941 1 } + } + 339 { + 1.31869 5.34053 2.04979 + { 0 1 0 } + { 0.752941 0.752941 0.752941 1 } + } + 340 { + 1.31869 5.34053 0.350091 + { -1 0 0 } + { 0.752941 0.752941 0.752941 1 } + } + 341 { + 1.31869 5.34053 2.04979 + { -1 0 0 } + { 0.752941 0.752941 0.752941 1 } + } + 342 { + 1.31869 7.09573 2.04979 + { -1 0 0 } + { 0.482353 0.560784 0.611765 1 } + } + 343 { + 1.31869 7.09573 0.350091 + { -1 0 0 } + { 0.482353 0.560784 0.611765 1 } + } + 344 { + 1.31869 5.34053 0.350091 + { 0 0 -1 } + { 0.752941 0.752941 0.752941 1 } + } + 345 { + 1.31869 7.09573 0.350091 + { 0 0 -1 } + { 0.482353 0.560784 0.611765 1 } + } + 346 { + 1.82483 7.09573 0.350091 + { 0 0 -1 } + { 0.482353 0.560784 0.611765 1 } + } + 347 { + 1.82483 5.34053 0.350091 + { 0 0 -1 } + { 0.752941 0.752941 0.752941 1 } + } + 348 { + 1.31869 7.09573 2.04979 + { 0 0 -1 } + { 0.482353 0.560784 0.611765 1 } + } + 349 { + 1.31869 5.34053 2.04979 + { 0 0 -1 } + { 0.752941 0.752941 0.752941 1 } + } + 350 { + 1.31869 5.34053 -2.1928 + { -1 0 0 } + { 0.752941 0.752941 0.752941 1 } + } + 351 { + 1.31869 5.34053 -0.718624 + { -1 0 0 } + { 0.752941 0.752941 0.752941 1 } + } + 352 { + 1.31869 7.09573 -0.718624 + { -1 0 0 } + { 0.482353 0.560784 0.611765 1 } + } + 353 { + 1.31869 7.09573 -2.1928 + { -1 0 0 } + { 0.482353 0.560784 0.611765 1 } + } + 354 { + -1.90136 5.34053 -2.16895 + { 0.00740377 0 0.999973 } + { 0.752941 0.752941 0.752941 1 } + } + 355 { + 1.31869 5.34053 -2.1928 + { 0.00740377 0 0.999973 } + { 0.752941 0.752941 0.752941 1 } + } + 356 { + 1.31869 7.09573 -2.1928 + { 0.00740377 0 0.999973 } + { 0.482353 0.560784 0.611765 1 } + } + 357 { + -1.90136 7.09573 -2.16895 + { 0.00740377 0 0.999973 } + { 0.482353 0.560784 0.611765 1 } + } + 358 { + -1.90136 5.34053 1.0558 + { 1 0 0 } + { 0.752941 0.752941 0.752941 1 } + } + 359 { + -1.90136 5.34053 -2.16895 + { 1 0 0 } + { 0.752941 0.752941 0.752941 1 } + } + 360 { + -1.90136 7.09573 -2.16895 + { 1 0 0 } + { 0.482353 0.560784 0.611765 1 } + } + 361 { + -1.90136 7.09573 1.0558 + { 1 0 0 } + { 0.482353 0.560784 0.611765 1 } + } + 362 { + -1.90136 5.34053 1.0558 + { 0 0 1 } + { 0.752941 0.752941 0.752941 1 } + } + 363 { + -1.90136 7.09573 1.0558 + { 0 0 1 } + { 0.482353 0.560784 0.611765 1 } + } + 364 { + -2.36149 7.09573 1.0558 + { 0 0 1 } + { 0.482353 0.560784 0.611765 1 } + } + 365 { + -2.36149 5.34053 1.0558 + { 0 0 1 } + { 0.752941 0.752941 0.752941 1 } + } + 366 { + 1.31869 7.09573 -0.718624 + { 0 0 1 } + { 0.482353 0.560784 0.611765 1 } + } + 367 { + 1.31869 5.34053 -0.718624 + { 0 0 1 } + { 0.752941 0.752941 0.752941 1 } + } + 368 { + 1.82483 5.34053 -0.718624 + { 0 0 1 } + { 0.752941 0.752941 0.752941 1 } + } + 369 { + 1.82483 7.09573 -0.718624 + { 0 0 1 } + { 0.482353 0.560784 0.611765 1 } + } + 370 { + -3.36172 7.09573 -3.42013 + { 0 0 1 } + { 0.482353 0.560784 0.611765 1 } + } + 371 { + -3.36172 5.34053 -3.42013 + { 0 0 1 } + { 0.752941 0.752941 0.752941 1 } + } + 372 { + 1.31869 7.09573 -2.1928 + { 0 -1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 373 { + -1.90136 7.09573 2.04979 + { 0 -1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 374 { + 1.31869 7.09573 2.04979 + { 0 -1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 375 { + -2.36149 7.09573 2.04979 + { 0 -1 0 } + { 0.482353 0.560784 0.611765 1 } + } + 376 { + 2.99397 5.34053 -3.42013 + { 0 1 0 } + { 0.752941 0.752941 0.752941 1 } + } + 377 { + 1.82483 5.34053 -2.49425 + { 0 1 0 } + { 0.752941 0.752941 0.752941 1 } + } + 378 { + 4 0 -0.838305 + { 2.94739e-009 -4.60849e-010 1 } + { 0.729412 0.513726 0.341176 1 } + } + 379 { + 4 1.48611 -0.838305 + { 2.94739e-009 -4.60849e-010 1 } + { 0.729412 0.513726 0.341176 1 } + } + 380 { + 2.99397 0 -0.838305 + { 0 1 0 } + { 0.729412 0.192157 0.247059 1 } + } + 381 { + 2.99397 0 0.527741 + { 0 0.983872 -0.178875 } + { 0.729412 0.192157 0.247059 1 } + } + 382 { + 4 0 0.527741 + { 0 1 0 } + { 0.729412 0.192157 0.247059 1 } + } + 383 { + 4 0 -0.838305 + { 0 1 0 } + { 0.729412 0.192157 0.247059 1 } + } + 384 { + 4 1.48611 0.527741 + { -1.20596e-007 -9.54098e-009 -1 } + { 0.729412 0.513726 0.341176 1 } + } + 385 { + 4 0 0.527741 + { -1.20596e-007 -9.54098e-009 -1 } + { 0.729412 0.513726 0.341176 1 } + } + 386 { + 2.99397 0 0.527741 + { -1.20596e-007 -9.54098e-009 -1 } + { 0.729412 0.513726 0.341176 1 } + } + 387 { + 2.99397 1.48611 0.527741 + { -1.20596e-007 -9.54098e-009 -1 } + { 0.729412 0.513726 0.341176 1 } + } + 388 { + 4 1.48611 -0.838305 + { 1.72907e-010 -1 1.45424e-010 } + { 0.729412 0.396078 0.341176 1 } + } + 389 { + 4 1.48611 0.527741 + { 1.72907e-010 -1 1.45424e-010 } + { 0.729412 0.396078 0.341176 1 } + } + 390 { + -4 0 -0.838305 + { 0 1 0 } + { 0.376471 0.498039 0 1 } + } + 391 { + 4 0 0.527741 + { 0 1 0 } + { 0.376471 0.498039 0 1 } + } + 392 { + 0.243417 0 -0.838305 + { 0 1 0 } + { 0.729412 0.192157 0.247059 1 } + } + 393 { + 2.04443 0 0.527741 + { 0 0.983872 -0.178875 } + { 0.729412 0.192157 0.247059 1 } + } + } + { + { 0 1 2 3 { levelgeo-ORG } } + } + { + { 4 5 6 7 { levelgeo-ORG } } + } + { + { 8 9 10 11 { levelgeo-ORG } } + } + { + { 12 13 14 15 { levelgeo-ORG } } + } + { + { 16 17 18 19 { levelgeo-ORG } } + } + { + { 20 21 22 23 { levelgeo-ORG } } + } + { + { 21 24 22 { levelgeo-ORG } } + } + { + { 25 26 27 { levelgeo-ORG } } + } + { + { 28 25 27 29 { levelgeo-ORG } } + } + { + { 30 31 32 33 { levelgeo-ORG } } + } + { + { 11 10 32 31 { levelgeo-ORG } } + } + { + { 34 35 36 37 { levelgeo-ORG } } + } + { + { 38 39 40 41 { levelgeo-ORG } } + } + { + { 42 43 44 { levelgeo-ORG } } + } + { + { 45 46 47 48 { levelgeo-ORG } } + } + { + { 49 50 51 52 { levelgeo-ORG } } + } + { + { 53 54 55 56 { levelgeo-ORG } } + } + { + { 57 58 59 60 { levelgeo-ORG } } + } + { + { 61 62 63 64 { levelgeo-ORG } } + } + { + { 65 66 67 68 { levelgeo-ORG } } + } + { + { 69 70 71 72 { levelgeo-ORG } } + } + { + { 73 74 75 76 { levelgeo-ORG } } + } + { + { 77 78 79 80 { levelgeo-ORG } } + } + { + { 81 82 83 84 { levelgeo-ORG } } + } + { + { 85 86 87 88 { levelgeo-ORG } } + } + { + { 80 79 74 73 { levelgeo-ORG } } + } + { + { 59 89 90 60 { levelgeo-ORG } } + } + { + { 91 92 93 94 { levelgeo-ORG } } + } + { + { 95 96 97 98 { levelgeo-ORG } } + } + { + { 99 100 52 51 { levelgeo-ORG } } + } + { + { 101 50 49 { levelgeo-ORG } } + } + { + { 102 103 104 { levelgeo-ORG } } + } + { + { 105 106 107 { levelgeo-ORG } } + } + { + { 108 109 110 { levelgeo-ORG } } + } + { + { 111 112 113 { levelgeo-ORG } } + } + { + { 114 115 116 117 { levelgeo-ORG } } + } + { + { 118 119 120 121 { levelgeo-ORG } } + } + { + { 122 123 124 125 { levelgeo-ORG } } + } + { + { 126 127 128 129 { levelgeo-ORG } } + } + { + { 130 131 132 133 { levelgeo-ORG } } + } + { + { 134 135 136 137 { levelgeo-ORG } } + } + { + { 138 139 140 141 { levelgeo-ORG } } + } + { + { 129 128 142 143 { levelgeo-ORG } } + } + { + { 133 132 144 145 { levelgeo-ORG } } + } + { + { 146 147 148 149 { levelgeo-ORG } } + } + { + { 141 140 150 151 { levelgeo-ORG } } + } + { + { 152 153 154 155 { levelgeo-ORG } } + } + { + { 141 151 156 157 { levelgeo-ORG } } + } + { + { 125 124 158 159 { levelgeo-ORG } } + } + { + { 144 132 160 161 { levelgeo-ORG } } + } + { + { 162 163 164 165 { levelgeo-ORG } } + } + { + { 157 156 166 167 { levelgeo-ORG } } + } + { + { 159 158 168 169 { levelgeo-ORG } } + } + { + { 161 160 170 171 { levelgeo-ORG } } + } + { + { 172 173 96 95 { levelgeo-ORG } } + } + { + { 157 167 92 91 { levelgeo-ORG } } + } + { + { 147 146 119 118 { levelgeo-ORG } } + } + { + { 170 160 163 162 { levelgeo-ORG } } + } + { + { 174 175 176 177 { levelgeo-ORG } } + } + { + { 110 109 107 106 { levelgeo-ORG } } + } + { + { 178 179 180 181 { levelgeo-ORG } } + } + { + { 182 108 183 184 { levelgeo-ORG } } + } + { + { 185 186 187 188 { levelgeo-ORG } } + } + { + { 189 190 191 105 { levelgeo-ORG } } + } + { + { 103 190 189 104 { levelgeo-ORG } } + } + { + { 103 102 192 193 { levelgeo-ORG } } + } + { + { 193 192 194 195 { levelgeo-ORG } } + } + { + { 193 195 196 { levelgeo-ORG } } + } + { + { 197 198 181 180 { levelgeo-ORG } } + } + { + { 179 178 199 200 { levelgeo-ORG } } + } + { + { 196 201 202 203 { levelgeo-ORG } } + } + { + { 204 205 206 207 { levelgeo-ORG } } + } + { + { 208 209 210 211 { levelgeo-ORG } } + } + { + { 182 109 108 { levelgeo-ORG } } + } + { + { 112 111 212 213 { levelgeo-ORG } } + } + { + { 214 215 216 217 { levelgeo-ORG } } + } + { + { 218 219 220 221 { levelgeo-ORG } } + } + { + { 215 222 223 216 { levelgeo-ORG } } + } + { + { 224 225 226 227 { levelgeo-ORG } } + } + { + { 228 229 230 231 { levelgeo-ORG } } + } + { + { 218 221 232 233 { levelgeo-ORG } } + } + { + { 234 235 236 237 { levelgeo-ORG } } + } + { + { 238 239 240 241 { levelgeo-ORG } } + } + { + { 242 238 241 243 { levelgeo-ORG } } + } + { + { 244 242 243 245 { levelgeo-ORG } } + } + { + { 246 247 248 249 { levelgeo-ORG } } + } + { + { 250 246 249 251 { levelgeo-ORG } } + } + { + { 252 253 254 255 { levelgeo-ORG } } + } + { + { 256 257 258 259 { levelgeo-ORG } } + } + { + { 260 261 262 263 { levelgeo-ORG } } + } + { + { 264 204 257 256 { levelgeo-ORG } } + } + { + { 265 266 267 268 { levelgeo-ORG } } + } + { + { 269 265 268 270 { levelgeo-ORG } } + } + { + { 271 272 273 274 { levelgeo-ORG } } + } + { + { 275 276 277 278 { levelgeo-ORG } } + } + { + { 279 280 281 282 { levelgeo-ORG } } + } + { + { 283 284 285 286 { levelgeo-ORG } } + } + { + { 287 288 289 290 { levelgeo-ORG } } + } + { + { 291 292 293 294 { levelgeo-ORG } } + } + { + { 293 295 296 294 { levelgeo-ORG } } + } + { + { 291 297 298 292 { levelgeo-ORG } } + } + { + { 205 204 264 { levelgeo-ORG } } + } + { + { 299 300 222 215 { levelgeo-ORG } } + } + { + { 301 302 303 304 { levelgeo-ORG } } + } + { + { 113 112 305 306 { levelgeo-ORG } } + } + { + { 307 308 309 310 { levelgeo-ORG } } + } + { + { 311 312 236 235 { levelgeo-ORG } } + } + { + { 313 314 315 316 { levelgeo-ORG } } + } + { + { 306 305 224 { levelgeo-ORG } } + } + { + { 224 305 317 225 { levelgeo-ORG } } + } + { + { 318 60 90 { levelgeo-ORG } } + } + { + { 319 89 59 { levelgeo-ORG } } + } + { + { 226 320 321 322 { levelgeo-ORG } } + } + { + { 323 324 321 320 { levelgeo-ORG } } + } + { + { 323 325 326 197 { levelgeo-ORG } } + } + { + { 202 327 207 203 { levelgeo-ORG } } + } + { + { 328 329 330 331 { levelgeo-ORG } } + } + { + { 332 310 309 333 { levelgeo-ORG } } + } + { + { 334 335 336 337 { levelgeo-ORG } } + } + { + { 338 327 202 { levelgeo-ORG } } + } + { + { 206 339 203 207 { levelgeo-ORG } } + } + { + { 340 341 342 343 { levelgeo-ORG } } + } + { + { 344 345 346 347 { levelgeo-ORG } } + } + { + { 348 349 269 270 { levelgeo-ORG } } + } + { + { 350 351 352 353 { levelgeo-ORG } } + } + { + { 354 355 356 357 { levelgeo-ORG } } + } + { + { 358 359 360 361 { levelgeo-ORG } } + } + { + { 362 363 364 365 { levelgeo-ORG } } + } + { + { 366 367 368 369 { levelgeo-ORG } } + } + { + { 325 187 186 326 { levelgeo-ORG } } + } + { + { 189 105 107 { levelgeo-ORG } } + } + { + { 370 371 255 254 { levelgeo-ORG } } + } + { + { 197 326 198 { levelgeo-ORG } } + } + { + { 372 186 185 { levelgeo-ORG } } + } + { + { 373 188 187 374 { levelgeo-ORG } } + } + { + { 320 325 323 { levelgeo-ORG } } + } + { + { 199 188 373 375 { levelgeo-ORG } } + } + { + { 200 199 375 { levelgeo-ORG } } + } + { + { 376 201 196 195 { levelgeo-ORG } } + } + { + { 377 201 376 { levelgeo-ORG } } + } + { + { 37 36 13 12 { levelgeo-ORG } } + } + { + { 378 379 54 53 { levelgeo-ORG } } + } + { + { 380 381 382 383 { levelgeo-ORG } } + } + { + { 384 385 386 387 { levelgeo-ORG } } + } + { + { 100 99 388 389 { levelgeo-ORG } } + } + { + { 390 23 27 26 { levelgeo-ORG } } + } + { + { 20 23 390 { levelgeo-ORG } } + } + { + { 391 29 22 24 { levelgeo-ORG } } + } + { + { 28 29 391 { levelgeo-ORG } } + } + { + { 381 380 392 393 { levelgeo-ORG } } + } + { + { 393 392 44 43 { levelgeo-ORG } } + } + { + { 377 376 259 258 { levelgeo-ORG } } + } + { + { 322 227 226 { levelgeo-ORG } } + } +} diff --git a/samples/culling/models/occluders.egg b/samples/culling/models/occluders.egg new file mode 100644 index 0000000000..e50e82550c --- /dev/null +++ b/samples/culling/models/occluders.egg @@ -0,0 +1,562 @@ + { Y-Up } + + occluder1 { + occluder { 1 } + occluder1-ORG { + 0 { + 4 7.57015 4 + } + 1 { + 4 7.57015 -4 + } + 2 { + -4 7.57015 -4 + } + 3 { + -4 7.57015 4 + } + } + { + { 0 1 2 3 { occluder1-ORG } } + } +} + occluder4 { + occluder { 1 } + occluder4-ORG { + 0 { + 4 2.96946e-016 -0.84965 + } + 1 { + 4 7.57015 -0.84965 + } + 2 { + 4 7.57015 -4 + } + 3 { + 4 0 -4 + } + } + { + { 0 1 2 3 { occluder4-ORG } } + } +} + occluder2 { + occluder { 1 } + occluder2-ORG { + 0 { + 4 0 -4 + } + 1 { + 4 7.57015 -4 + } + 2 { + -4 7.57015 -4 + } + 3 { + -4 0 -4 + } + } + { + { 0 1 2 3 { occluder2-ORG } } + } +} + occluder3 { + occluder { 1 } + occluder3-ORG { + 0 { + 4 0 4 + } + 1 { + 4 7.57015 4 + } + 2 { + -4 7.57015 4 + } + 3 { + -4 0 4 + } + } + { + { 0 1 2 3 { occluder3-ORG } } + } +} + occluder5 { + occluder { 1 } + occluder5-ORG { + 0 { + 4 0 4 + } + 1 { + 4 7.57015 4 + } + 2 { + 4 7.57015 0.551412 + } + 3 { + 4 -2.78684e-016 0.551412 + } + } + { + { 0 1 2 3 { occluder5-ORG } } + } +} + occluder6 { + occluder { 1 } + occluder6-ORG { + 0 { + 4 1.49418 4 + } + 1 { + 4 7.57015 4 + } + 2 { + 4 7.57015 -4 + } + 3 { + 4 1.49418 -4 + } + } + { + { 0 1 2 3 { occluder6-ORG } } + } +} + occluder7 { + occluder { 1 } + occluder7-ORG { + 0 { + -3.99576 2.96946e-016 -0.84965 + } + 1 { + -3.99576 7.57015 -0.84965 + } + 2 { + -3.99576 7.57015 -4 + } + 3 { + -3.99576 0 -4 + } + } + { + { 0 1 2 3 { occluder7-ORG } } + } +} + occluder8 { + occluder { 1 } + occluder8-ORG { + 0 { + -3.99576 0 4 + } + 1 { + -3.99576 7.57015 4 + } + 2 { + -3.99576 7.57015 0.551412 + } + 3 { + -3.99576 -2.78684e-016 0.551412 + } + } + { + { 0 1 2 3 { occluder8-ORG } } + } +} + occluder9 { + occluder { 1 } + occluder9-ORG { + 0 { + -3.99576 1.49418 4 + } + 1 { + -3.99576 7.57015 4 + } + 2 { + -3.99576 7.57015 -4 + } + 3 { + -3.99576 1.49418 -4 + } + } + { + { 0 1 2 3 { occluder9-ORG } } + } +} + occluder10 { + occluder { 1 } + occluder10-ORG { + 0 { + -4 1.49418 -1.13843 + } + 1 { + -4 3.24289 -1.13843 + } + 2 { + 4 3.24289 -1.13843 + } + 3 { + 4 1.49418 -1.13843 + } + } + { + { 0 1 2 3 { occluder10-ORG } } + } +} + occluder11 { + occluder { 1 } + occluder11-ORG { + 0 { + -4 0 -1.13843 + } + 1 { + -4 3.24289 -1.13843 + } + 2 { + -1.01962 3.24289 -1.13843 + } + 3 { + -1.01962 -2.78684e-016 -1.13843 + } + } + { + { 0 1 2 3 { occluder11-ORG } } + } +} + occluder12 { + occluder { 1 } + occluder12-ORG { + 0 { + 0.242712 2.96946e-016 -1.13843 + } + 1 { + 0.242712 3.24289 -1.13843 + } + 2 { + 4 3.24289 -1.13843 + } + 3 { + 4 0 -1.13843 + } + } + { + { 0 1 2 3 { occluder12-ORG } } + } +} + occluder13 { + occluder { 1 } + occluder13-ORG { + 0 { + -4 3.19567 0.643347 + } + 1 { + -4 3.19567 -3.99828 + } + 2 { + 4 3.19567 -3.99828 + } + 3 { + 4 3.19567 0.643347 + } + } + { + { 0 1 2 3 { occluder13-ORG } } + } +} + occluder14 { + occluder { 1 } + occluder14-ORG { + 0 { + -4 3.19567 4.00073 + } + 1 { + -4 3.19567 -3.99828 + } + 2 { + -0.508583 3.19567 -3.99828 + } + 3 { + -0.508583 3.19567 4.00073 + } + } + { + { 0 1 2 3 { occluder14-ORG } } + } +} + occluder15 { + occluder { 1 } + occluder15-ORG { + 0 { + 1.25869 3.19567 3.98826 + } + 1 { + 1.25869 3.19567 -3.99828 + } + 2 { + 4 3.19567 -3.99828 + } + 3 { + 4 3.19567 3.98826 + } + } + { + { 0 1 2 3 { occluder15-ORG } } + } +} + occluder16 { + occluder { 1 } + occluder16-ORG { + 0 { + -4 5.26173 2.21946 + } + 1 { + -4 5.26173 -3.99828 + } + 2 { + 4 5.26173 -3.99828 + } + 3 { + 4 5.26173 2.21946 + } + } + { + { 0 1 2 3 { occluder16-ORG } } + } +} + occluder17 { + occluder { 1 } + occluder17-ORG { + 0 { + 1.78343 5.26173 3.98826 + } + 1 { + 1.78343 5.26173 -3.99828 + } + 2 { + 4 5.26173 -3.99828 + } + 3 { + 4 5.26173 3.98826 + } + } + { + { 0 1 2 3 { occluder17-ORG } } + } +} + occluder18 { + occluder { 1 } + occluder18-ORG { + 0 { + -3.99383 5.23279 2.0951 + } + 1 { + 1.8032 5.23279 2.0951 + } + 2 { + 1.8032 7.56072 2.0951 + } + 3 { + -3.99383 7.56072 2.0951 + } + } + { + { 0 1 2 3 { occluder18-ORG } } + } +} + occluder19 { + occluder { 1 } + occluder19-ORG { + 0 { + -3.93576 0.0379318 0.6175 + } + 1 { + 1.94837 0.0379318 0.6175 + } + 2 { + 1.94837 3.21608 0.6175 + } + 3 { + -3.93576 3.21608 0.6175 + } + } + { + { 0 1 2 3 { occluder19-ORG } } + } +} + occluder20 { + occluder { 1 } + occluder20-ORG { + 0 { + 11.5843 -0.215275 11.5843 + } + 1 { + 11.5843 -0.215275 -11.5843 + } + 2 { + -11.5843 -0.215275 -11.5843 + } + 3 { + -11.5843 -0.215275 11.5843 + } + } + { + { 0 1 2 3 { occluder20-ORG } } + } +} + occluder21 { + occluder { 1 } + occluder21-ORG { + 0 { + -3.93576 1.56418 0.5914 + } + 1 { + 3.94341 1.56418 0.5914 + } + 2 { + 3.94341 3.26834 0.5914 + } + 3 { + -3.93576 3.26834 0.5914 + } + } + { + { 0 1 2 3 { occluder21-ORG } } + } +} + occluder22 { + occluder { 1 } + occluder22-ORG { + 0 { + -0.694875 1.49418 2.11153 + } + 1 { + -0.694875 5.26968 2.11153 + } + 2 { + -0.694875 5.26968 0.21275 + } + 3 { + -0.694875 1.49418 0.21275 + } + } + { + { 0 1 2 3 { occluder22-ORG } } + } +} + occluder23 { + occluder { 1 } + occluder23-ORG { + 0 { + 0.756062 1.49418 2.11153 + } + 1 { + 0.756062 5.26968 2.11153 + } + 2 { + 0.756062 5.26968 0.21275 + } + 3 { + 0.756062 1.49418 0.21275 + } + } + { + { 0 1 2 3 { occluder23-ORG } } + } +} + occluder24 { + occluder { 1 } + occluder24-ORG { + 0 { + 1.60244 5.2309 2.14179 + } + 1 { + 1.60244 7.52263 2.14179 + } + 2 { + 1.60244 7.52263 0.394334 + } + 3 { + 1.60244 5.2309 0.394334 + } + } + { + { 0 1 2 3 { occluder24-ORG } } + } +} + occluder25 { + occluder { 1 } + occluder25-ORG { + 0 { + 1.60244 5.2309 -0.763555 + } + 1 { + 1.60244 7.52263 -0.763555 + } + 2 { + 1.60244 7.52263 -2.42694 + } + 3 { + 1.60244 5.2309 -2.42694 + } + } + { + { 0 1 2 3 { occluder25-ORG } } + } +} + occluder26 { + occluder { 1 } + occluder26-ORG { + 0 { + 1.78944 5.2309 -2.34074 + } + 1 { + 1.78944 7.52263 -2.34074 + } + 2 { + -2.28798 7.52263 -2.34074 + } + 3 { + -2.28798 5.2309 -2.34074 + } + } + { + { 0 1 2 3 { occluder26-ORG } } + } +} + occluder27 { + occluder { 1 } + occluder27-ORG { + 0 { + -2.15855 5.2309 1.03841 + } + 1 { + -2.15855 7.52263 1.03841 + } + 2 { + -2.15855 7.52263 -2.44292 + } + 3 { + -2.15855 5.2309 -2.44292 + } + } + { + { 0 1 2 3 { occluder27-ORG } } + } +} + occluder28 { + occluder { 1 } + occluder28-ORG { + 0 { + -3.98717 1.54945 3.90197 + } + 1 { + -3.98717 1.54945 -1.30625 + } + 2 { + 1.28595 1.54945 -1.30625 + } + 3 { + 1.28595 1.54945 3.90197 + } + } + { + { 0 1 2 3 { occluder28-ORG } } + } +} diff --git a/samples/culling/models/portals.egg b/samples/culling/models/portals.egg new file mode 100644 index 0000000000..c7536d79dc --- /dev/null +++ b/samples/culling/models/portals.egg @@ -0,0 +1,674 @@ + { Y-Up } + + portal_10to11_1 { + portal { 1 } + portal_10to11_1-ORG { + 0 { + -2.36149 5.34053 2.04979 + { -1 0 0 } + { 0 0 1 1 } + } + 1 { + -2.36149 7.09573 2.04979 + { -1 0 0 } + { 0.001 0.001 0.999 1 } + } + 2 { + -2.36149 7.09573 1.0558 + { -1 0 0 } + { 0 0 1 1 } + } + 3 { + -2.36149 5.34053 1.0558 + { -1 0 0 } + { 0 0 1 1 } + } + } + { + { 0 1 2 3 { portal_10to11_1-ORG } } + } +} + portal_1to2_1 { + portal { 1 } + portal_1to2_1-ORG { + 0 { + 4 4.44089e-016 -0.838305 + { 1 0 0 } + { 0 0 1 1 } + } + 1 { + 4 1.48611 -0.838305 + { 1 0 0 } + { 0 0 1 1 } + } + 2 { + 4 1.48611 0.527741 + { 1 0 0 } + { 0.001 0.001 0.999 1 } + } + 3 { + 4 4.44089e-016 0.527741 + { 1 0 0 } + { 0 0 1 1 } + } + } + { + { 0 1 2 3 { portal_1to2_1-ORG } } + } +} + portal_1to2_2 { + portal { 1 } + portal_1to2_2-ORG { + 0 { + -4 0 0.527741 + { -1 0 0 } + { 0 0 1 1 } + } + 1 { + -4 1.48611 0.527741 + { -1 0 0 } + { 0.001 0.001 0.999 1 } + } + 2 { + -4 1.48611 -0.838305 + { -1 0 0 } + { 0 0 1 1 } + } + 3 { + -4 0 -0.838305 + { -1 0 0 } + { 0 0 1 1 } + } + } + { + { 0 1 2 3 { portal_1to2_2-ORG } } + } +} + portal_2to3_1 { + portal { 1 } + portal_2to3_1-ORG { + 0 { + 0.243417 0 -0.838305 + { 0 -5.37589e-011 1 } + { 0 0 1 1 } + } + 1 { + 0.243412 1.48611 -0.838305 + { 0 -5.37589e-011 1 } + { 0 0 1 1 } + } + 2 { + -1.03253 1.48611 -0.838305 + { 0 -5.37589e-011 1 } + { 0.001 0.001 0.999 1 } + } + 3 { + -1.02178 0 -0.838305 + { 0 -5.37589e-011 1 } + { 0 0 1 1 } + } + } + { + { 0 1 2 3 { portal_2to3_1-ORG } } + } +} + portal_2to4_1 { + portal { 1 } + portal_2to4_1-ORG { + 0 { + 2.04443 0 0.527741 + { 0 1.40115e-009 -1 } + { 0 0 1 1 } + } + 1 { + 2.04443 1.48611 0.527741 + { 0 1.40115e-009 -1 } + { 0.001 0.001 0.999 1 } + } + 2 { + 2.99397 1.48611 0.527741 + { 0 1.40115e-009 -1 } + { 0 0 1 1 } + } + 3 { + 2.99397 0 0.527741 + { 0 1.40115e-009 -1 } + { 0 0 1 1 } + } + } + { + { 0 1 2 3 { portal_2to4_1-ORG } } + } +} + portal_4to5_1 { + portal { 1 } + portal_4to5_1-ORG { + 0 { + 0.519489 3.3704 0.115602 + { 0 -0.00293795 0.999996 } + { 0 0 1 1 } + } + 1 { + 0.519489 4.88145 0.120042 + { 0 -0.00293795 0.999996 } + { 0 0 1 1 } + } + 2 { + -0.423826 4.88145 0.120042 + { 0 -0.00293795 0.999996 } + { 0.001 0.001 0.999 1 } + } + 3 { + -0.423812 3.3704 0.115602 + { 0 -0.00293795 0.999996 } + { 0 0 1 1 } + } + } + { + { 0 1 2 3 { portal_4to5_1-ORG } } + } +} + portal_5to6_1 { + portal { 1 } + portal_5to6_1-ORG { + 0 { + 0.997627 3.3704 0.115602 + { 1.00717e-006 1.20465e-006 -1 } + { 0 0 1 1 } + } + 1 { + 0.997627 5.12958 0.115602 + { 1.00717e-006 1.20465e-006 -1 } + { 0.001 0.001 0.999 1 } + } + 2 { + 2.99397 5.12958 0.115606 + { 1.00717e-006 1.20465e-006 -1 } + { 0 0 1 1 } + } + 3 { + 2.99397 3.3704 0.115602 + { 1.00717e-006 1.20465e-006 -1 } + { 0 0 1 1 } + } + } + { + { 0 1 2 3 { portal_5to6_1-ORG } } + } +} + portal_5to7_1 { + portal { 1 } + portal_5to7_1-ORG { + 0 { + -3.36172 3.3704 0.115602 + { 1.02518e-006 -3.5707e-006 -1 } + { 0 0 1 1 } + } + 1 { + -3.36172 5.12958 0.115593 + { 1.02518e-006 -3.5707e-006 -1 } + { 0.001 0.001 0.999 1 } + } + 2 { + -0.900953 5.12958 0.115599 + { 1.02518e-006 -3.5707e-006 -1 } + { 0 0 1 1 } + } + 3 { + -0.900963 3.3704 0.115602 + { 1.02518e-006 -3.5707e-006 -1 } + { 0 0 1 1 } + } + } + { + { 0 1 2 3 { portal_5to7_1-ORG } } + } +} + portal_7to8_1 { + portal { 1 } + portal_7to8_1-ORG { + 0 { + -2.30748 3.3704 3.18072 + { -1 1.34401e-005 1.02127e-006 } + { 0 0 1 1 } + } + 1 { + -2.30746 5.12958 3.18072 + { -1 1.34401e-005 1.02127e-006 } + { 0.001 0.001 0.999 1 } + } + 2 { + -2.30746 5.12958 2.23852 + { -1 1.34401e-005 1.02127e-006 } + { 0 0 1 1 } + } + 3 { + -2.30748 3.3704 2.23852 + { -1 1.34401e-005 1.02127e-006 } + { 0 0 1 1 } + } + } + { + { 0 1 2 3 { portal_7to8_1-ORG } } + } +} + portal_8to9_1 { + portal { 1 } + portal_8to9_1-ORG { + 0 { + 1.82483 5.34053 3.18072 + { -1 0 0 } + { 0 0 1 1 } + } + 1 { + 1.82483 7.09573 3.18072 + { -1 0 0 } + { 0.001 0.001 0.999 1 } + } + 2 { + 1.82483 7.09573 2.23852 + { -1 0 0 } + { 0 0 1 1 } + } + 3 { + 1.82483 5.34053 2.23852 + { -1 0 0 } + { 0 0 1 1 } + } + } + { + { 0 1 2 3 { portal_8to9_1-ORG } } + } +} + portal_9to10_1 { + portal { 1 } + portal_9to10_1-ORG { + 0 { + -0.485624 5.34053 -3.42013 + { 1 0 0 } + { 0 0 1 1 } + } + 1 { + -0.485624 7.09573 -3.42013 + { 1 0 0 } + { 0 0 1 1 } + } + 2 { + -0.485624 7.09573 -2.49425 + { 1 0 0 } + { 0.001 0.001 0.999 1 } + } + 3 { + -0.485624 5.34053 -2.49425 + { 1 0 0 } + { 0 0 1 1 } + } + } + { + { 0 1 2 3 { portal_9to10_1-ORG } } + } +} + portal_9to11_1 { + portal { 1 } + portal_9to11_1-ORG { + 0 { + 1.82483 5.34053 -0.718624 + { 1 0 0 } + { 0 0 1 1 } + } + 1 { + 1.82483 7.09573 -0.718624 + { 1 0 0 } + { 0 0 1 1 } + } + 2 { + 1.82483 7.09573 0.350091 + { 1 0 0 } + { 0.001 0.001 0.999 1 } + } + 3 { + 1.82483 5.34053 0.350091 + { 1 0 0 } + { 0 0 1 1 } + } + } + { + { 0 1 2 3 { portal_9to11_1-ORG } } + } +} + portal_11to9_1 { + portal { 1 } + portal_11to9_1-ORG { + 0 { + 1.82483 5.34053 0.350091 + { -1 0 0 } + { 1 0 0 1 } + } + 1 { + 1.82483 7.09573 0.350091 + { -1 0 0 } + { 0.999 0.001 0.001 1 } + } + 2 { + 1.82483 7.09573 -0.718624 + { -1 0 0 } + { 1 0 0 1 } + } + 3 { + 1.82483 5.34053 -0.718624 + { -1 0 0 } + { 1 0 0 1 } + } + } + { + { 0 1 2 3 { portal_11to9_1-ORG } } + } +} + portal_10to9_1 { + portal { 1 } + portal_10to9_1-ORG { + 0 { + -0.485624 5.34053 -2.49425 + { -1 0 0 } + { 1 0 0 1 } + } + 1 { + -0.485624 7.09573 -2.49425 + { -1 0 0 } + { 0.999 0.001 0.001 1 } + } + 2 { + -0.485624 7.09573 -3.42013 + { -1 0 0 } + { 1 0 0 1 } + } + 3 { + -0.485624 5.34053 -3.42013 + { -1 0 0 } + { 1 0 0 1 } + } + } + { + { 0 1 2 3 { portal_10to9_1-ORG } } + } +} + portal_9to8_1 { + portal { 1 } + portal_9to8_1-ORG { + 0 { + 1.82483 5.34053 2.23852 + { 1 0 0 } + { 1 0 0 1 } + } + 1 { + 1.82483 7.09573 2.23852 + { 1 0 0 } + { 1 0 0 1 } + } + 2 { + 1.82483 7.09573 3.18072 + { 1 0 0 } + { 0.999 0.001 0.001 1 } + } + 3 { + 1.82483 5.34053 3.18072 + { 1 0 0 } + { 1 0 0 1 } + } + } + { + { 0 1 2 3 { portal_9to8_1-ORG } } + } +} + portal_8to7_1 { + portal { 1 } + portal_8to7_1-ORG { + 0 { + -2.30748 3.3704 2.23852 + { 1 -1.34401e-005 -1.02127e-006 } + { 1 0 0 1 } + } + 1 { + -2.30746 5.12958 2.23852 + { 1 -1.34401e-005 -1.02127e-006 } + { 1 0 0 1 } + } + 2 { + -2.30746 5.12958 3.18072 + { 1 -1.34401e-005 -1.02127e-006 } + { 0.999 0.001 0.001 1 } + } + 3 { + -2.30748 3.3704 3.18072 + { 1 -1.34401e-005 -1.02127e-006 } + { 1 0 0 1 } + } + } + { + { 0 1 2 3 { portal_8to7_1-ORG } } + } +} + portal_7to5_1 { + portal { 1 } + portal_7to5_1-ORG { + 0 { + -0.900963 3.3704 0.115602 + { -1.02518e-006 3.5707e-006 1 } + { 1 0 0 1 } + } + 1 { + -0.900953 5.12958 0.115599 + { -1.02518e-006 3.5707e-006 1 } + { 1 0 0 1 } + } + 2 { + -3.36172 5.12958 0.115593 + { -1.02518e-006 3.5707e-006 1 } + { 0.999 0.001 0.001 1 } + } + 3 { + -3.36172 3.3704 0.115602 + { -1.02518e-006 3.5707e-006 1 } + { 1 0 0 1 } + } + } + { + { 0 1 2 3 { portal_7to5_1-ORG } } + } +} + portal_6to5_1 { + portal { 1 } + portal_6to5_1-ORG { + 0 { + 2.99397 3.3704 0.115602 + { -1.00717e-006 -1.20465e-006 1 } + { 1 0 0 1 } + } + 1 { + 2.99397 5.12958 0.115606 + { -1.00717e-006 -1.20465e-006 1 } + { 1 0 0 1 } + } + 2 { + 0.997627 5.12958 0.115602 + { -1.00717e-006 -1.20465e-006 1 } + { 0.999 0.001 0.001 1 } + } + 3 { + 0.997627 3.3704 0.115602 + { -1.00717e-006 -1.20465e-006 1 } + { 1 0 0 1 } + } + } + { + { 0 1 2 3 { portal_6to5_1-ORG } } + } +} + portal_5to4_1 { + portal { 1 } + portal_5to4_1-ORG { + 0 { + -0.423812 3.3704 0.115602 + { 0 0.00293795 -0.999996 } + { 1 0 0 1 } + } + 1 { + -0.423826 4.88145 0.120042 + { 0 0.00293795 -0.999996 } + { 0.999 0.001 0.001 1 } + } + 2 { + 0.519489 4.88145 0.120042 + { 0 0.00293795 -0.999996 } + { 1 0 0 1 } + } + 3 { + 0.519489 3.3704 0.115602 + { 0 0.00293795 -0.999996 } + { 1 0 0 1 } + } + } + { + { 0 1 2 3 { portal_5to4_1-ORG } } + } +} + portal_4to2_1 { + portal { 1 } + portal_4to2_1-ORG { + 0 { + 2.99397 0 0.527741 + { 0 -1.40115e-009 1 } + { 1 0 0 1 } + } + 1 { + 2.99397 1.48611 0.527741 + { 0 -1.40115e-009 1 } + { 1 0 0 1 } + } + 2 { + 2.04443 1.48611 0.527741 + { 0 -1.40115e-009 1 } + { 0.999 0.001 0.001 1 } + } + 3 { + 2.04443 0 0.527741 + { 0 -1.40115e-009 1 } + { 1 0 0 1 } + } + } + { + { 0 1 2 3 { portal_4to2_1-ORG } } + } +} + portal_3to2_1 { + portal { 1 } + portal_3to2_1-ORG { + 0 { + -1.02178 0 -0.838305 + { 0 5.37589e-011 -1 } + { 1 0 0 1 } + } + 1 { + -1.03253 1.48611 -0.838305 + { 0 5.37589e-011 -1 } + { 0.999 0.001 0.001 1 } + } + 2 { + 0.243412 1.48611 -0.838305 + { 0 5.37589e-011 -1 } + { 1 0 0 1 } + } + 3 { + 0.243417 0 -0.838305 + { 0 5.37589e-011 -1 } + { 1 0 0 1 } + } + } + { + { 0 1 2 3 { portal_3to2_1-ORG } } + } +} + portal_2to1_2 { + portal { 1 } + portal_2to1_2-ORG { + 0 { + -4 0 -0.838305 + { 1 0 0 } + { 1 0 0 1 } + } + 1 { + -4 1.48611 -0.838305 + { 1 0 0 } + { 1 0 0 1 } + } + 2 { + -4 1.48611 0.527741 + { 1 0 0 } + { 0.999 0.001 0.001 1 } + } + 3 { + -4 0 0.527741 + { 1 0 0 } + { 1 0 0 1 } + } + } + { + { 0 1 2 3 { portal_2to1_2-ORG } } + } +} + portal_2to1_1 { + portal { 1 } + portal_2to1_1-ORG { + 0 { + 4 4.44089e-016 0.527741 + { -1 0 0 } + { 1 0 0 1 } + } + 1 { + 4 1.48611 0.527741 + { -1 0 0 } + { 0.999 0.001 0.001 1 } + } + 2 { + 4 1.48611 -0.838305 + { -1 0 0 } + { 1 0 0 1 } + } + 3 { + 4 4.44089e-016 -0.838305 + { -1 0 0 } + { 1 0 0 1 } + } + } + { + { 0 1 2 3 { portal_2to1_1-ORG } } + } +} + portal_11to10_1 { + portal { 1 } + portal_11to10_1-ORG { + 0 { + -2.36149 5.34053 1.0558 + { 1 0 0 } + { 1 0 0 1 } + } + 1 { + -2.36149 7.09573 1.0558 + { 1 0 0 } + { 1 0 0 1 } + } + 2 { + -2.36149 7.09573 2.04979 + { 1 0 0 } + { 0.999 0.001 0.001 1 } + } + 3 { + -2.36149 5.34053 2.04979 + { 1 0 0 } + { 1 0 0 1 } + } + } + { + { 0 1 2 3 { portal_11to10_1-ORG } } + } +} diff --git a/samples/culling/models/tex_0.png b/samples/culling/models/tex_0.png new file mode 100644 index 0000000000..48239f4784 Binary files /dev/null and b/samples/culling/models/tex_0.png differ diff --git a/samples/culling/models/tex_1.png b/samples/culling/models/tex_1.png new file mode 100644 index 0000000000..4f8ca64d38 Binary files /dev/null and b/samples/culling/models/tex_1.png differ diff --git a/samples/culling/models/tex_2.png b/samples/culling/models/tex_2.png new file mode 100644 index 0000000000..a628c0c563 Binary files /dev/null and b/samples/culling/models/tex_2.png differ diff --git a/samples/culling/models/tex_3.png b/samples/culling/models/tex_3.png new file mode 100644 index 0000000000..58b46129b6 Binary files /dev/null and b/samples/culling/models/tex_3.png differ diff --git a/samples/culling/models/tex_4.png b/samples/culling/models/tex_4.png new file mode 100644 index 0000000000..58b46129b6 Binary files /dev/null and b/samples/culling/models/tex_4.png differ diff --git a/samples/culling/models/tex_5.png b/samples/culling/models/tex_5.png new file mode 100644 index 0000000000..a628c0c563 Binary files /dev/null and b/samples/culling/models/tex_5.png differ diff --git a/samples/culling/models/tex_6.png b/samples/culling/models/tex_6.png new file mode 100644 index 0000000000..4f8ca64d38 Binary files /dev/null and b/samples/culling/models/tex_6.png differ diff --git a/samples/culling/models/tex_7.png b/samples/culling/models/tex_7.png new file mode 100644 index 0000000000..48239f4784 Binary files /dev/null and b/samples/culling/models/tex_7.png differ diff --git a/samples/culling/occluder_culling.py b/samples/culling/occluder_culling.py new file mode 100755 index 0000000000..80d1687d43 --- /dev/null +++ b/samples/culling/occluder_culling.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python + +""" +Author: Josh Enes +Last Updated: 2015-03-13 + +This is a demo of Panda's occluder-culling system. It demonstrates loading +occluder from an EGG file and adding them to a CullTraverser. +""" + +# Load PRC data +from panda3d.core import loadPrcFileData +loadPrcFileData('', 'window-title Occluder Demo') +loadPrcFileData('', 'sync-video false') +loadPrcFileData('', 'show-frame-rate-meter true') +loadPrcFileData('', 'texture-minfilter linear-mipmap-linear') +#loadPrcFileData('', 'fake-view-frustum-cull true') # show culled nodes in red + +# Import needed modules +import random +from direct.showbase.ShowBase import ShowBase +from direct.gui.OnscreenText import OnscreenText +from panda3d.core import PerspectiveLens, TextNode, \ +TexGenAttrib, TextureStage, TransparencyAttrib, LPoint3, Texture + + +def add_instructions(pos, msg): + """Function to put instructions on the screen.""" + return OnscreenText(text=msg, style=1, fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1), + parent=base.a2dTopLeft, align=TextNode.ALeft, + pos=(0.08, -pos - 0.04), scale=.05) + +def add_title(text): + """Function to put title on the screen.""" + return OnscreenText(text=text, style=1, pos=(-0.1, 0.09), scale=.08, + parent=base.a2dBottomRight, align=TextNode.ARight, + fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1)) + + +class Game(ShowBase): + """Sets up the game, camera, controls, and loads models.""" + def __init__(self): + ShowBase.__init__(self) + self.xray_mode = False + self.show_model_bounds = False + + # Display instructions + add_title("Panda3D Tutorial: Occluder Culling") + add_instructions(0.06, "[Esc]: Quit") + add_instructions(0.12, "[W]: Move Forward") + add_instructions(0.18, "[A]: Move Left") + add_instructions(0.24, "[S]: Move Right") + add_instructions(0.30, "[D]: Move Back") + add_instructions(0.36, "Arrow Keys: Look Around") + add_instructions(0.42, "[F]: Toggle Wireframe") + add_instructions(0.48, "[X]: Toggle X-Ray Mode") + add_instructions(0.54, "[B]: Toggle Bounding Volumes") + + # Setup controls + self.keys = {} + for key in ['arrow_left', 'arrow_right', 'arrow_up', 'arrow_down', + 'a', 'd', 'w', 's']: + self.keys[key] = 0 + self.accept(key, self.push_key, [key, 1]) + self.accept('shift-%s' % key, self.push_key, [key, 1]) + self.accept('%s-up' % key, self.push_key, [key, 0]) + self.accept('f', self.toggleWireframe) + self.accept('x', self.toggle_xray_mode) + self.accept('b', self.toggle_model_bounds) + self.accept('escape', __import__('sys').exit, [0]) + self.disableMouse() + + # Setup camera + self.lens = PerspectiveLens() + self.lens.setFov(60) + self.lens.setNear(0.01) + self.lens.setFar(1000.0) + self.cam.node().setLens(self.lens) + self.camera.setPos(-9, -0.5, 1) + self.heading = -95.0 + self.pitch = 0.0 + + # Load level geometry + self.level_model = self.loader.loadModel('models/level') + self.level_model.reparentTo(self.render) + self.level_model.setTexGen(TextureStage.getDefault(), + TexGenAttrib.MWorldPosition) + self.level_model.setTexProjector(TextureStage.getDefault(), + self.render, self.level_model) + self.level_model.setTexScale(TextureStage.getDefault(), 4) + tex = self.loader.load3DTexture('models/tex_#.png') + self.level_model.setTexture(tex) + + # Load occluders + occluder_model = self.loader.loadModel('models/occluders') + occluder_nodepaths = occluder_model.findAllMatches('**/+OccluderNode') + for occluder_nodepath in occluder_nodepaths: + self.render.setOccluder(occluder_nodepath) + occluder_nodepath.node().setDoubleSided(True) + + # Randomly spawn some models to test the occluders + self.models = [] + box_model = self.loader.loadModel('box') + + for dummy in range(0, 500): + pos = LPoint3((random.random() - 0.5) * 9, + (random.random() - 0.5) * 9, + random.random() * 8) + box = box_model.copy_to(self.render) + box.setScale(random.random() * 0.2 + 0.1) + box.setPos(pos) + box.setHpr(random.random() * 360, + random.random() * 360, + random.random() * 360) + box.reparentTo(self.render) + self.models.append(box) + + self.taskMgr.add(self.update, 'main loop') + + def push_key(self, key, value): + """Stores a value associated with a key.""" + self.keys[key] = value + + def update(self, task): + """Updates the camera based on the keyboard input.""" + delta = globalClock.getDt() + move_x = delta * 3 * -self.keys['a'] + delta * 3 * self.keys['d'] + move_z = delta * 3 * self.keys['s'] + delta * 3 * -self.keys['w'] + self.camera.setPos(self.camera, move_x, -move_z, 0) + self.heading += (delta * 90 * self.keys['arrow_left'] + + delta * 90 * -self.keys['arrow_right']) + self.pitch += (delta * 90 * self.keys['arrow_up'] + + delta * 90 * -self.keys['arrow_down']) + self.camera.setHpr(self.heading, self.pitch, 0) + return task.cont + + def toggle_xray_mode(self): + """Toggle X-ray mode on and off. This is useful for seeing the + effectiveness of the occluder culling.""" + self.xray_mode = not self.xray_mode + if self.xray_mode: + self.level_model.setColorScale((1, 1, 1, 0.5)) + self.level_model.setTransparency(TransparencyAttrib.MDual) + else: + self.level_model.setColorScaleOff() + self.level_model.setTransparency(TransparencyAttrib.MNone) + + def toggle_model_bounds(self): + """Toggle bounding volumes on and off on the models.""" + self.show_model_bounds = not self.show_model_bounds + if self.show_model_bounds: + for model in self.models: + model.showBounds() + else: + for model in self.models: + model.hideBounds() + +game = Game() +game.run() diff --git a/samples/culling/portal_culling.py b/samples/culling/portal_culling.py new file mode 100755 index 0000000000..6f8d8aaf6f --- /dev/null +++ b/samples/culling/portal_culling.py @@ -0,0 +1,306 @@ +#!/usr/bin/env python + +""" +Author: Josh Enes +Last Updated: 2015-03-13 + +This is a demo of Panda's portal-culling system. It demonstrates loading +portals from an EGG file, and shows an example method of selecting the +current cell using geoms and a collision ray. +""" + +# Some config options which can be changed. +ENABLE_PORTALS = True # Set False to disable portal culling and see FPS drop! +DEBUG_PORTALS = False # Set True to see visually which portals are used + +# Load PRC data +from panda3d.core import loadPrcFileData +if ENABLE_PORTALS: + loadPrcFileData('', 'allow-portal-cull true') + if DEBUG_PORTALS: + loadPrcFileData('', 'debug-portal-cull true') +loadPrcFileData('', 'window-title Portal Demo') +loadPrcFileData('', 'sync-video false') +loadPrcFileData('', 'show-frame-rate-meter true') +loadPrcFileData('', 'texture-minfilter linear-mipmap-linear') + +# Import needed modules +import random +from direct.showbase.ShowBase import ShowBase +from direct.gui.OnscreenText import OnscreenText +from panda3d.core import PerspectiveLens, NodePath, LVector3, LPoint3, \ + TexGenAttrib, TextureStage, TransparencyAttrib, CollisionTraverser, \ + CollisionHandlerQueue, TextNode, CollisionRay, CollisionNode + + +def add_instructions(pos, msg): + """Function to put instructions on the screen.""" + return OnscreenText(text=msg, style=1, fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1), + parent=base.a2dTopLeft, align=TextNode.ALeft, + pos=(0.08, -pos - 0.04), scale=.05) + +def add_title(text): + """Function to put title on the screen.""" + return OnscreenText(text=text, style=1, pos=(-0.1, 0.09), scale=.08, + parent=base.a2dBottomRight, align=TextNode.ARight, + fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1)) + + +class Game(ShowBase): + """Sets up the game, camera, controls, and loads models.""" + def __init__(self): + ShowBase.__init__(self) + self.cellmanager = CellManager(self) + self.xray_mode = False + self.show_model_bounds = False + + # Display instructions + add_title("Panda3D Tutorial: Portal Culling") + add_instructions(0.06, "[Esc]: Quit") + add_instructions(0.12, "[W]: Move Forward") + add_instructions(0.18, "[A]: Move Left") + add_instructions(0.24, "[S]: Move Right") + add_instructions(0.30, "[D]: Move Back") + add_instructions(0.36, "Arrow Keys: Look Around") + add_instructions(0.42, "[F]: Toggle Wireframe") + add_instructions(0.48, "[X]: Toggle X-Ray Mode") + add_instructions(0.54, "[B]: Toggle Bounding Volumes") + + # Setup controls + self.keys = {} + for key in ['arrow_left', 'arrow_right', 'arrow_up', 'arrow_down', + 'a', 'd', 'w', 's']: + self.keys[key] = 0 + self.accept(key, self.push_key, [key, 1]) + self.accept('shift-%s' % key, self.push_key, [key, 1]) + self.accept('%s-up' % key, self.push_key, [key, 0]) + self.accept('f', self.toggleWireframe) + self.accept('x', self.toggle_xray_mode) + self.accept('b', self.toggle_model_bounds) + self.accept('escape', __import__('sys').exit, [0]) + self.disableMouse() + + # Setup camera + lens = PerspectiveLens() + lens.setFov(60) + lens.setNear(0.01) + lens.setFar(1000.0) + self.cam.node().setLens(lens) + self.camera.setPos(-9, -0.5, 1) + self.heading = -95.0 + self.pitch = 0.0 + + # Load level geometry + self.level_model = self.loader.loadModel('models/level') + self.level_model.reparentTo(self.render) + self.level_model.setTexGen(TextureStage.getDefault(), + TexGenAttrib.MWorldPosition) + self.level_model.setTexProjector(TextureStage.getDefault(), + self.render, self.level_model) + self.level_model.setTexScale(TextureStage.getDefault(), 4) + tex = self.loader.load3DTexture('models/tex_#.png') + self.level_model.setTexture(tex) + + # Load cells + self.cellmanager.load_cells_from_model('models/cells') + # Load portals + self.cellmanager.load_portals_from_model('models/portals') + + # Randomly spawn some models to test the portals + self.models = [] + for dummy in range(0, 500): + pos = LPoint3((random.random() - 0.5) * 6, + (random.random() - 0.5) * 6, + random.random() * 7) + cell = self.cellmanager.get_cell(pos) + if cell is None: # skip if the random position is not over a cell + continue + dist = self.cellmanager.get_dist_to_cell(pos) + if dist > 1.5: # skip if the random position is too far from ground + continue + box = self.loader.loadModel('box') + box.setScale(random.random() * 0.2 + 0.1) + box.setPos(pos) + box.setHpr(random.random() * 360, + random.random() * 360, + random.random() * 360) + box.reparentTo(cell.nodepath) + self.models.append(box) + self.taskMgr.add(self.update, 'main loop') + + def push_key(self, key, value): + """Stores a value associated with a key.""" + self.keys[key] = value + + def update(self, task): + """Updates the camera based on the keyboard input. Once this is + done, then the CellManager's update function is called.""" + delta = globalClock.getDt() + move_x = delta * 3 * -self.keys['a'] + delta * 3 * self.keys['d'] + move_z = delta * 3 * self.keys['s'] + delta * 3 * -self.keys['w'] + self.camera.setPos(self.camera, move_x, -move_z, 0) + self.heading += (delta * 90 * self.keys['arrow_left'] + + delta * 90 * -self.keys['arrow_right']) + self.pitch += (delta * 90 * self.keys['arrow_up'] + + delta * 90 * -self.keys['arrow_down']) + self.camera.setHpr(self.heading, self.pitch, 0) + if ENABLE_PORTALS: + self.cellmanager.update() + return task.cont + + def toggle_xray_mode(self): + """Toggle X-ray mode on and off. This is useful for seeing the + effectiveness of the portal culling.""" + self.xray_mode = not self.xray_mode + if self.xray_mode: + self.level_model.setColorScale((1, 1, 1, 0.5)) + self.level_model.setTransparency(TransparencyAttrib.MDual) + else: + self.level_model.setColorScaleOff() + self.level_model.setTransparency(TransparencyAttrib.MNone) + + def toggle_model_bounds(self): + """Toggle bounding volumes on and off on the models.""" + self.show_model_bounds = not self.show_model_bounds + if self.show_model_bounds: + for model in self.models: + model.showBounds() + else: + for model in self.models: + model.hideBounds() + + +class CellManager(object): + """Creates a collision ray and collision traverser to use for + selecting the current cell.""" + def __init__(self, game): + self.game = game + self.cells = {} + self.cells_by_collider = {} + self.cell_picker_world = NodePath('cell_picker_world') + self.ray = CollisionRay() + self.ray.setDirection(LVector3.down()) + cnode = CollisionNode('cell_raycast_cnode') + self.ray_nodepath = self.cell_picker_world.attachNewNode(cnode) + self.ray_nodepath.node().addSolid(self.ray) + self.ray_nodepath.node().setIntoCollideMask(0) # not for colliding into + self.ray_nodepath.node().setFromCollideMask(1) + self.traverser = CollisionTraverser('traverser') + self.last_known_cell = None + + def add_cell(self, collider, name): + """Add a new cell.""" + cell = Cell(self, name, collider) + self.cells[name] = cell + self.cells_by_collider[collider.node()] = cell + + def get_cell(self, pos): + """Given a position, return the nearest cell below that position. + If no cell is found, returns None.""" + self.ray.setOrigin(pos) + queue = CollisionHandlerQueue() + self.traverser.addCollider(self.ray_nodepath, queue) + self.traverser.traverse(self.cell_picker_world) + self.traverser.removeCollider(self.ray_nodepath) + queue.sortEntries() + if not queue.getNumEntries(): + return None + entry = queue.getEntry(0) + cnode = entry.getIntoNode() + try: + return self.cells_by_collider[cnode] + except KeyError: + raise Warning('collision ray collided with something ' + 'other than a cell: %s' % cnode) + + def get_dist_to_cell(self, pos): + """Given a position, return the distance to the nearest cell + below that position. If no cell is found, returns None.""" + self.ray.setOrigin(pos) + queue = CollisionHandlerQueue() + self.traverser.addCollider(self.ray_nodepath, queue) + self.traverser.traverse(self.cell_picker_world) + self.traverser.removeCollider(self.ray_nodepath) + queue.sortEntries() + if not queue.getNumEntries(): + return None + entry = queue.getEntry(0) + return (entry.getSurfacePoint(self.cell_picker_world) - pos).length() + + def load_cells_from_model(self, modelpath): + """Loads cells from an EGG file. Cells must be named in the + format "cell#" to be loaded by this function.""" + cell_model = self.game.loader.loadModel(modelpath) + for collider in cell_model.findAllMatches('**/+GeomNode'): + name = collider.getName() + if name.startswith('cell'): + self.add_cell(collider, name[4:]) + cell_model.removeNode() + + def load_portals_from_model(self, modelpath): + """Loads portals from an EGG file. Portals must be named in the + format "portal_#to#_*" to be loaded by this function, whereby the + first # is the from cell, the second # is the into cell, and * can + be anything.""" + portal_model = loader.loadModel(modelpath) + portal_nodepaths = portal_model.findAllMatches('**/+PortalNode') + for portal_nodepath in portal_nodepaths: + name = portal_nodepath.getName() + if name.startswith('portal_'): + from_cell_id, into_cell_id = name.split('_')[1].split('to') + try: + from_cell = self.cells[from_cell_id] + except KeyError: + print ('could not load portal "%s" because cell "%s"' + 'does not exist' % (name, from_cell_id)) + continue + try: + into_cell = self.cells[into_cell_id] + except KeyError: + print ('could not load portal "%s" because cell "%s"' + 'does not exist' % (name, into_cell_id)) + continue + from_cell.add_portal(portal_nodepath, into_cell) + portal_model.removeNode() + + def update(self): + """Show the cell the camera is currently in and hides the rest. + If the camera is not in a cell, use the last known cell that the + camera was in. If the camera has not yet been in a cell, then all + cells will be hidden.""" + camera_pos = self.game.camera.getPos(self.game.render) + for cell in self.cells: + self.cells[cell].nodepath.hide() + current_cell = self.get_cell(camera_pos) + if current_cell is None: + if self.last_known_cell is None: + return + self.last_known_cell.nodepath.show() + else: + self.last_known_cell = current_cell + current_cell.nodepath.show() + + +class Cell(object): + """The Cell class is a handy way to keep an association between + all the related nodes and information of a cell.""" + def __init__(self, cellmanager, name, collider): + self.cellmanager = cellmanager + self.name = name + self.collider = collider + self.collider.reparentTo(self.cellmanager.cell_picker_world) + self.collider.setCollideMask(1) + self.collider.hide() + self.nodepath = NodePath('cell_%s_root' % name) + self.nodepath.reparentTo(self.cellmanager.game.render) + self.portals = [] + + def add_portal(self, portal, cell_out): + """Add a portal from this cell going into another one.""" + portal.reparentTo(self.nodepath) + portal.node().setCellIn(self.nodepath) + portal.node().setCellOut(cell_out.nodepath) + self.portals.append(portal) + +game = Game() +game.run() diff --git a/samples/disco-lights/main.py b/samples/disco-lights/main.py new file mode 100755 index 0000000000..8e3bad3cf6 --- /dev/null +++ b/samples/disco-lights/main.py @@ -0,0 +1,305 @@ +#!/usr/bin/env python + +# Author: Jason Pratt (pratt@andrew.cmu.edu) +# Last Updated: 2015-03-13 +# +# This project demonstrates how to use various types of +# lighting +# +from direct.showbase.ShowBase import ShowBase +from panda3d.core import PerspectiveLens +from panda3d.core import NodePath +from panda3d.core import AmbientLight, DirectionalLight +from panda3d.core import PointLight, Spotlight +from panda3d.core import TextNode +from panda3d.core import Material +from panda3d.core import LVector3 +from direct.gui.OnscreenText import OnscreenText +from direct.showbase.DirectObject import DirectObject +import math +import sys +import colorsys + +# Simple function to keep a value in a given range (by default 0 to 1) +def clamp(i, mn=0, mx=1): + return min(max(i, mn), mx) + + +class DiscoLightsDemo(ShowBase): + + # Macro-like function to reduce the amount of code needed to create the + # onscreen instructions + def makeStatusLabel(self, i): + return OnscreenText( + parent=base.a2dTopLeft, align=TextNode.ALeft, + style=1, fg=(1, 1, 0, 1), shadow=(0, 0, 0, .4), + pos=(0.06, -0.1 -(.06 * i)), scale=.05, mayChange=True) + + def __init__(self): + # Initialize the ShowBase class from which we inherit, which will + # create a window and set up everything we need for rendering into it. + ShowBase.__init__(self) + + # The main initialization of our class + # This creates the on screen title that is in every tutorial + self.title = OnscreenText(text="Panda3D: Tutorial - Lighting", + style=1, fg=(1, 1, 0, 1), shadow=(0, 0, 0, 0.5), + pos=(0.87, -0.95), scale = .07) + + # Creates labels used for onscreen instructions + self.ambientText = self.makeStatusLabel(0) + self.directionalText = self.makeStatusLabel(1) + self.spotlightText = self.makeStatusLabel(2) + self.pointLightText = self.makeStatusLabel(3) + self.spinningText = self.makeStatusLabel(4) + self.ambientBrightnessText = self.makeStatusLabel(5) + self.directionalBrightnessText = self.makeStatusLabel(6) + self.spotlightBrightnessText = self.makeStatusLabel(7) + self.spotlightExponentText = self.makeStatusLabel(8) + self.lightingPerPixelText = self.makeStatusLabel(9) + self.lightingShadowsText = self.makeStatusLabel(10) + + self.disco = loader.loadModel("models/disco_hall") + self.disco.reparentTo(render) + self.disco.setPosHpr(0, 50, -4, 90, 0, 0) + + # First we create an ambient light. All objects are affected by ambient + # light equally + # Create and name the ambient light + self.ambientLight = render.attachNewNode(AmbientLight("ambientLight")) + # Set the color of the ambient light + self.ambientLight.node().setColor((.1, .1, .1, 1)) + # add the newly created light to the lightAttrib + + # Now we create a directional light. Directional lights add shading from a + # given angle. This is good for far away sources like the sun + self.directionalLight = render.attachNewNode( + DirectionalLight("directionalLight")) + self.directionalLight.node().setColor((.35, .35, .35, 1)) + # The direction of a directional light is set as a 3D vector + self.directionalLight.node().setDirection(LVector3(1, 1, -2)) + # These settings are necessary for shadows to work correctly + self.directionalLight.setZ(6) + dlens = self.directionalLight.node().getLens() + dlens.setFilmSize(41, 21) + dlens.setNearFar(50, 75) + # self.directionalLight.node().showFrustum() + + # Now we create a spotlight. Spotlights light objects in a given cone + # They are good for simulating things like flashlights + self.spotlight = camera.attachNewNode(Spotlight("spotlight")) + self.spotlight.node().setColor((.45, .45, .45, 1)) + self.spotlight.node().setSpecularColor((0, 0, 0, 1)) + # The cone of a spotlight is controlled by it's lens. This creates the + # lens + self.spotlight.node().setLens(PerspectiveLens()) + # This sets the Field of View (fov) of the lens, in degrees for width + # and height. The lower the numbers, the tighter the spotlight. + self.spotlight.node().getLens().setFov(16, 16) + # Attenuation controls how the light fades with distance. The three + # values represent the three attenuation constants (constant, linear, + # and quadratic) in the internal lighting equation. The higher the + # numbers the shorter the light goes. + self.spotlight.node().setAttenuation(LVector3(1, 0.0, 0.0)) + # This exponent value sets how soft the edge of the spotlight is. + # 0 means a hard edge. 128 means a very soft edge. + self.spotlight.node().setExponent(60.0) + + # Now we create three colored Point lights. Point lights are lights that + # radiate from a single point, like a light bulb. Like spotlights, they + # are given position by attaching them to NodePaths in the world + self.redHelper = loader.loadModel('models/sphere') + self.redHelper.setColor((1, 0, 0, 1)) + self.redHelper.setPos(-6.5, -3.75, 0) + self.redHelper.setScale(.25) + self.redPointLight = self.redHelper.attachNewNode( + PointLight("redPointLight")) + self.redPointLight.node().setColor((.35, 0, 0, 1)) + self.redPointLight.node().setAttenuation(LVector3(.1, 0.04, 0.0)) + + # The green point light and helper + self.greenHelper = loader.loadModel('models/sphere') + self.greenHelper.setColor((0, 1, 0, 1)) + self.greenHelper.setPos(0, 7.5, 0) + self.greenHelper.setScale(.25) + self.greenPointLight = self.greenHelper.attachNewNode( + PointLight("greenPointLight")) + self.greenPointLight.node().setAttenuation(LVector3(.1, .04, .0)) + self.greenPointLight.node().setColor((0, .35, 0, 1)) + + # The blue point light and helper + self.blueHelper = loader.loadModel('models/sphere') + self.blueHelper.setColor((0, 0, 1, 1)) + self.blueHelper.setPos(6.5, -3.75, 0) + self.blueHelper.setScale(.25) + self.bluePointLight = self.blueHelper.attachNewNode( + PointLight("bluePointLight")) + self.bluePointLight.node().setAttenuation(LVector3(.1, 0.04, 0.0)) + self.bluePointLight.node().setColor((0, 0, .35, 1)) + self.bluePointLight.node().setSpecularColor((1, 1, 1, 1)) + + # Create a dummy node so the lights can be spun with one command + self.pointLightHelper = render.attachNewNode("pointLightHelper") + self.pointLightHelper.setPos(0, 50, 11) + self.redHelper.reparentTo(self.pointLightHelper) + self.greenHelper.reparentTo(self.pointLightHelper) + self.blueHelper.reparentTo(self.pointLightHelper) + + # Finally we store the lights on the root of the scene graph. + # This will cause them to affect everything in the scene. + render.setLight(self.ambientLight) + render.setLight(self.directionalLight) + render.setLight(self.spotlight) + render.setLight(self.redPointLight) + render.setLight(self.greenPointLight) + render.setLight(self.bluePointLight) + + # Create and start interval to spin the lights, and a variable to + # manage them. + self.pointLightsSpin = self.pointLightHelper.hprInterval( + 6, LVector3(360, 0, 0)) + self.pointLightsSpin.loop() + self.arePointLightsSpinning = True + + # Per-pixel lighting and shadows are initially off + self.perPixelEnabled = False + self.shadowsEnabled = False + + # listen to keys for controlling the lights + self.accept("escape", sys.exit) + self.accept("a", self.toggleLights, [[self.ambientLight]]) + self.accept("d", self.toggleLights, [[self.directionalLight]]) + self.accept("s", self.toggleLights, [[self.spotlight]]) + self.accept("p", self.toggleLights, [[self.redPointLight, + self.greenPointLight, + self.bluePointLight]]) + self.accept("r", self.toggleSpinningPointLights) + self.accept("l", self.togglePerPixelLighting) + self.accept("e", self.toggleShadows) + self.accept("z", self.addBrightness, [self.ambientLight, -.05]) + self.accept("x", self.addBrightness, [self.ambientLight, .05]) + self.accept("c", self.addBrightness, [self.directionalLight, -.05]) + self.accept("v", self.addBrightness, [self.directionalLight, .05]) + self.accept("b", self.addBrightness, [self.spotlight, -.05]) + self.accept("n", self.addBrightness, [self.spotlight, .05]) + self.accept("q", self.adjustSpotlightExponent, [self.spotlight, -1]) + self.accept("w", self.adjustSpotlightExponent, [self.spotlight, 1]) + + # Finally call the function that builds the instruction texts + self.updateStatusLabel() + + # This function takes a list of lights and toggles their state. It takes in a + # list so that more than one light can be toggled in a single command + def toggleLights(self, lights): + for light in lights: + # If the given light is in our lightAttrib, remove it. + # This has the effect of turning off the light + if render.hasLight(light): + render.clearLight(light) + # Otherwise, add it back. This has the effect of turning the light + # on + else: + render.setLight(light) + self.updateStatusLabel() + + # This function toggles the spinning of the point intervals by pausing and + # resuming the interval + def toggleSpinningPointLights(self): + if self.arePointLightsSpinning: + self.pointLightsSpin.pause() + else: + self.pointLightsSpin.resume() + self.arePointLightsSpinning = not self.arePointLightsSpinning + self.updateStatusLabel() + + # This function turns per-pixel lighting on or off. + def togglePerPixelLighting(self): + if self.perPixelEnabled: + self.perPixelEnabled = False + render.clearShader() + else: + self.perPixelEnabled = True + render.setShaderAuto() + self.updateStatusLabel() + + # This function turns shadows on or off. + def toggleShadows(self): + if self.shadowsEnabled: + self.shadowsEnabled = False + self.directionalLight.node().setShadowCaster(False) + else: + if not self.perPixelEnabled: + self.togglePerPixelLighting() + self.shadowsEnabled = True + self.directionalLight.node().setShadowCaster(True, 512, 512) + self.updateStatusLabel() + + # This function changes the spotlight's exponent. It is kept to the range + # 0 to 128. Going outside of this range causes an error + def adjustSpotlightExponent(self, spotlight, amount): + e = clamp(spotlight.node().getExponent() + amount, 0, 128) + spotlight.node().setExponent(e) + self.updateStatusLabel() + + # This function reads the color of the light, uses a built-in python function + #(from the library colorsys) to convert from RGB (red, green, blue) color + # representation to HSB (hue, saturation, brightness), so that we can get the + # brighteness of a light, change it, and then convert it back to rgb to chagne + # the light's color + def addBrightness(self, light, amount): + color = light.node().getColor() + h, s, b = colorsys.rgb_to_hsv(color[0], color[1], color[2]) + brightness = clamp(b + amount) + r, g, b = colorsys.hsv_to_rgb(h, s, brightness) + light.node().setColor((r, g, b, 1)) + + self.updateStatusLabel() + + # Builds the onscreen instruction labels + def updateStatusLabel(self): + self.updateLabel(self.ambientText, "(a) ambient is", + render.hasLight(self.ambientLight)) + self.updateLabel(self.directionalText, "(d) directional is", + render.hasLight(self.directionalLight)) + self.updateLabel(self.spotlightText, "(s) spotlight is", + render.hasLight(self.spotlight)) + self.updateLabel(self.pointLightText, "(p) point lights are", + render.hasLight(self.redPointLight)) + self.updateLabel(self.spinningText, "(r) point light spinning is", + self.arePointLightsSpinning) + self.ambientBrightnessText.setText( + "(z,x) Ambient Brightness: " + + self.getBrightnessString(self.ambientLight)) + self.directionalBrightnessText.setText( + "(c,v) Directional Brightness: " + + self.getBrightnessString(self.directionalLight)) + self.spotlightBrightnessText.setText( + "(b,n) Spotlight Brightness: " + + self.getBrightnessString(self.spotlight)) + self.spotlightExponentText.setText( + "(q,w) Spotlight Exponent: " + + str(int(self.spotlight.node().getExponent()))) + self.updateLabel(self.lightingPerPixelText, "(l) Per-pixel lighting is", + self.perPixelEnabled) + self.updateLabel(self.lightingShadowsText, "(e) Shadows are", + self.shadowsEnabled) + + # Appends eitehr (on) or (off) to the base string based on the bassed value + def updateLabel(self, obj, base, var): + if var: + s = " (on)" + else: + s = " (off)" + obj.setText(base + s) + + # Returns the brightness of a light as a string to put it in the instruction + # labels + def getBrightnessString(self, light): + color = light.node().getColor() + h, s, b = colorsys.rgb_to_hsv(color[0], color[1], color[2]) + return "%.2f" % b + + +# Make an instance of our class and run the demo +demo = DiscoLightsDemo() +demo.run() diff --git a/samples/disco-lights/models/disco_hall.egg.pz b/samples/disco-lights/models/disco_hall.egg.pz new file mode 100644 index 0000000000..a02ef2fd46 Binary files /dev/null and b/samples/disco-lights/models/disco_hall.egg.pz differ diff --git a/samples/disco-lights/models/sphere.egg.pz b/samples/disco-lights/models/sphere.egg.pz new file mode 100644 index 0000000000..2257d21365 Binary files /dev/null and b/samples/disco-lights/models/sphere.egg.pz differ diff --git a/samples/distortion/distortion.sha b/samples/distortion/distortion.sha new file mode 100644 index 0000000000..a4c5b081f6 --- /dev/null +++ b/samples/distortion/distortion.sha @@ -0,0 +1,53 @@ +//Cg +// +// time +// +// You need to pass the frame time here. +// +// desat.x +// +// Desaturation level. If zero, the bloom's color is equal to +// the color of the input pixel. If one, the bloom's color is +// white. +// +// trigger.x +// +// Must be equal to mintrigger. +// +// mintrigger is the minimum brightness to trigger a bloom, +// and maxtrigger is the brightness at which the bloom +// reaches maximum intensity. +// +// trigger.y +// +// Must be equal to (1.0/(maxtrigger-mintrigger)) where +// +// mintrigger is the minimum brightness to trigger a bloom, +// and maxtrigger is the brightness at which the bloom +// reaches maximum intensity. +// + +void vshader(float4 vtx_position : POSITION, + uniform float4x4 mat_modelproj, + uniform float4x4 trans_model_to_clip, + out float4 l_position : POSITION, + out float4 l_texcoord0 : TEXCOORD0) +{ + l_position = mul(mat_modelproj, vtx_position); + l_texcoord0 = mul(trans_model_to_clip, vtx_position); + l_texcoord0.z = l_texcoord0.w; +} + +void fshader(float4 l_texcoord0 : TEXCOORD0, + uniform sampler2D k_screen : TEXUNIT1, + uniform sampler2D k_waves : TEXUNIT0, + uniform float4 texpad_screen, + in uniform float sys_time, + out float4 o_color : COLOR) +{ + float3 screen = l_texcoord0.xyz / l_texcoord0.w; + float2 texcoords = float2(screen.xy) * texpad_screen.xy + texpad_screen.xy; + float4 disturbance = tex2D(k_waves, texcoords); + //o_color = tex2D(k_screen, texcoords + disturbance.xy * 0.05 * disturbance.z * sys_time.x * 1); + o_color = tex2D(k_screen, texcoords + disturbance.xy * 0.05 * disturbance.z * sin(sys_time.x) * 1); +} diff --git a/samples/distortion/main.py b/samples/distortion/main.py new file mode 100755 index 0000000000..387156aa25 --- /dev/null +++ b/samples/distortion/main.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python + +# Author: Tree Form starplant@gmail.com + +from direct.showbase.ShowBase import ShowBase +from panda3d.core import FrameBufferProperties, TextNode, BitMask32, LPoint3 +from panda3d.core import WindowProperties, GraphicsOutput, Texture, GraphicsPipe +from direct.showbase.DirectObject import DirectObject +from direct.gui.OnscreenText import OnscreenText +from sys import exit + +# Function to put instructions on the screen. +def addInstructions(pos, msg): + return OnscreenText(text=msg, style=1, fg=(1, 1, 1, 1), + pos=(-1.25, pos), align=TextNode.ALeft, scale=.05) + +# Function to put title on the screen. +def addTitle(text): + return OnscreenText(text=text, style=1, fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1), + pos=(1.25, -0.95), align=TextNode.ARight, scale=.07) + + +class DistortionDemo(ShowBase): + def __init__(self): + # Initialize the ShowBase class from which we inherit, which will + # create a window and set up everything we need for rendering into it. + ShowBase.__init__(self) + + if not base.win.getGsg().getSupportsBasicShaders(): + t = addTitle("Distortion Demo: Video driver says Cg shaders not supported.") + return + + self.disableMouse() + self.setBackgroundColor(0, 0, 0) + + # Show the instructions + self.title = addTitle("Panda3D: Tutorial - Distortion Effect") + self.inst1 = addInstructions(0.92, "ESC: Quit") + self.inst2 = addInstructions(0.86, "Space: Toggle distortion filter On/Off") + self.inst4 = addInstructions(0.80, "V: View the render-to-texture results") + + # Load background + self.seascape = loader.loadModel("models/plane") + self.seascape.reparentTo(render) + self.seascape.setPosHpr(0, 145, 0, 0, 0, 0) + self.seascape.setScale(100) + self.seascape.setTexture(loader.loadTexture("models/ocean.jpg")) + + # Create the distortion buffer. This buffer renders like a normal + # scene, + self.distortionBuffer = self.makeFBO("model buffer") + self.distortionBuffer.setSort(-3) + self.distortionBuffer.setClearColor((0, 0, 0, 0)) + + # We have to attach a camera to the distortion buffer. The distortion camera + # must have the same frustum as the main camera. As long as the aspect + # ratios match, the rest will take care of itself. + distortionCamera = self.makeCamera(self.distortionBuffer, scene=render, + lens=self.cam.node().getLens(), mask=BitMask32.bit(4)) + + # load the object with the distortion + self.distortionObject = loader.loadModel("models/boat") + self.distortionObject.setScale(1) + self.distortionObject.setPos(0, 20, -3) + self.distortionObject.hprInterval(10, LPoint3(360, 0, 0)).loop() + self.distortionObject.reparentTo(render) + + # Create the shader that will determime what parts of the scene will + # distortion + distortionShader = loader.loadShader("distortion.sha") + self.distortionObject.setShader(distortionShader) + self.distortionObject.hide(BitMask32.bit(4)) + + # Textures + tex1 = loader.loadTexture("models/water.png") + self.distortionObject.setShaderInput("waves", tex1) + + self.texDistortion = Texture() + self.distortionBuffer.addRenderTexture( + self.texDistortion, GraphicsOutput.RTMBindOrCopy, GraphicsOutput.RTPColor) + self.distortionObject.setShaderInput("screen", self.texDistortion) + + # Panda contains a built-in viewer that lets you view the results of + # your render-to-texture operations. This code configures the viewer. + self.accept("v", self.bufferViewer.toggleEnable) + self.accept("V", self.bufferViewer.toggleEnable) + self.bufferViewer.setPosition("llcorner") + self.bufferViewer.setLayout("hline") + self.bufferViewer.setCardSize(0.652, 0) + + # event handling + self.accept("space", self.toggleDistortion) + self.accept("escape", exit, [0]) + self.distortionOn = True + + def makeFBO(self, name): + # This routine creates an offscreen buffer. All the complicated + # parameters are basically demanding capabilities from the offscreen + # buffer - we demand that it be able to render to texture on every + # bitplane, that it can support aux bitplanes, that it track + # the size of the host window, that it can render to texture + # cumulatively, and so forth. + winprops = WindowProperties() + props = FrameBufferProperties() + props.setRgbColor(1) + return self.graphicsEngine.makeOutput( + self.pipe, "model buffer", -2, props, winprops, + GraphicsPipe.BFSizeTrackHost | GraphicsPipe.BFRefuseWindow, + self.win.getGsg(), self.win) + + def toggleDistortion(self): + # Toggles the distortion on/off. + if self.distortionOn: + self.distortionObject.hide() + else: + self.distortionObject.show() + self.distortionOn = not(self.distortionOn) + +demo = DistortionDemo() +demo.run() diff --git a/samples/distortion/models/boat.egg.pz b/samples/distortion/models/boat.egg.pz new file mode 100644 index 0000000000..a5604dc525 Binary files /dev/null and b/samples/distortion/models/boat.egg.pz differ diff --git a/samples/distortion/models/ocean.jpg b/samples/distortion/models/ocean.jpg new file mode 100644 index 0000000000..e84a1a91cd Binary files /dev/null and b/samples/distortion/models/ocean.jpg differ diff --git a/samples/distortion/models/plane.egg.pz b/samples/distortion/models/plane.egg.pz new file mode 100644 index 0000000000..0a88c05d92 --- /dev/null +++ b/samples/distortion/models/plane.egg.pz @@ -0,0 +1,2 @@ +xÚ�’Ákƒ0Æïƒþ�Þc»[¶zÒÒÂN#£©˜¼³Q)þï}±Ñ‰l‡…h4ß÷|¿|D¾A´§O-œÜ·�“ª€+¼&Ýbñ@ß RR;Òi°T¢¹¬*0µÐ2Uïá…¤%UøÏøÖâ—) ¢‡>•Þ~sVèæŒVõ}¦U¦/`¡??Jëä¥D¬kÿ!Œdé7M¨ë +`£�déã}ÊF�¿TÔ>WF#a}²àŽƒ>wÛç'/³0«›£ó9:‚̢ȫ 9.3‹Ì¼ž‘#Àÿˆ|Ÿy‰u[¡.~NÿONØèNž½¹¢ýæÔ•‡õ/?T7AùûxÒ³I \ No newline at end of file diff --git a/samples/distortion/models/water.png b/samples/distortion/models/water.png new file mode 100644 index 0000000000..1ba0c0f65e Binary files /dev/null and b/samples/distortion/models/water.png differ diff --git a/samples/fireflies/light.sha b/samples/fireflies/light.sha new file mode 100644 index 0000000000..e074b15abd --- /dev/null +++ b/samples/fireflies/light.sha @@ -0,0 +1,45 @@ +//Cg +// +//Cg profile arbvp1 arbfp1 + +void vshader(float4 vtx_position : POSITION, + out float4 l_position : POSITION, + out float4 l_pos : TEXCOORD0, + uniform float4x4 mat_modelproj, + uniform float4x4 trans_model_to_clip) +{ + l_position=mul(mat_modelproj, vtx_position); + l_pos=mul(trans_model_to_clip, vtx_position); + l_pos.z = l_pos.w; +} + +void fshader(float4 l_pos: TEXCOORD0, + float4 l_scale: TEXCOORD1, + uniform sampler2D k_texnormal : TEXUNIT0, + uniform sampler2D k_texalbedo : TEXUNIT1, + uniform sampler2D k_texdepth : TEXUNIT2, + uniform float4 texpad_texnormal, + uniform float4 k_proj, + uniform float4 vspos_model, + uniform float4 k_lightcolor, + uniform float4 row0_model_to_view, + out float4 o_color: COLOR) +{ + float3 screen = l_pos.xyz / l_pos.w; + float2 texcoords = float2(screen.xy) * texpad_texnormal.xy + texpad_texnormal.xy; + + float4 albedo = tex2D(k_texalbedo, texcoords); + float4 normal = tex2D(k_texnormal, texcoords); + float depth = tex2D(k_texdepth, texcoords); + + float3 view = (screen.xzy * k_proj.xyz) / (depth + k_proj.w); + + float3 lightvec = float3(vspos_model) - view; + float lightdist = length(lightvec); + float3 lightdir = lightvec / lightdist; + float scaledist = (lightdist / row0_model_to_view.x); + float falloff = saturate(1.0 - scaledist); + float brite = falloff * falloff * dot(lightdir, float3(normal)); + o_color = albedo * k_lightcolor * brite; + o_color.a = 1; +} diff --git a/samples/fireflies/main.py b/samples/fireflies/main.py new file mode 100755 index 0000000000..994a7d09ec --- /dev/null +++ b/samples/fireflies/main.py @@ -0,0 +1,416 @@ +#!/usr/bin/env python + +# Author: Josh Yelon +# Date: 7/11/2005 +# +# See the associated manual page for an explanation. +# +from direct.showbase.ShowBase import ShowBase +from panda3d.core import FrameBufferProperties, WindowProperties +from panda3d.core import GraphicsPipe, GraphicsOutput +from panda3d.core import Filename, Texture, Shader +from panda3d.core import RenderState, CardMaker +from panda3d.core import PandaNode, TextNode, NodePath +from panda3d.core import RenderAttrib, AlphaTestAttrib, ColorBlendAttrib +from panda3d.core import CullFaceAttrib, DepthTestAttrib, DepthWriteAttrib +from panda3d.core import LPoint3, LVector3, BitMask32 +from direct.gui.OnscreenText import OnscreenText +from direct.showbase.DirectObject import DirectObject +from direct.interval.MetaInterval import Sequence +from direct.task.Task import Task +from direct.actor.Actor import Actor +import sys +import os +import random + +# Function to put instructions on the screen. +def addInstructions(pos, msg): + return OnscreenText(text=msg, style=1, fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1), + parent=base.a2dTopLeft, align=TextNode.ALeft, + pos=(0.08, -pos - 0.04), scale=.05) + +# Function to put title on the screen. +def addTitle(text): + return OnscreenText(text=text, style=1, pos=(-0.1, 0.09), scale=.08, + parent=base.a2dBottomRight, align=TextNode.ARight, + fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1)) + + +class FireflyDemo(ShowBase): + def __init__(self): + # Initialize the ShowBase class from which we inherit, which will + # create a window and set up everything we need for rendering into it. + ShowBase.__init__(self) + self.setBackgroundColor((0, 0, 0, 0)) + + # Preliminary capabilities check. + + if not self.win.getGsg().getSupportsBasicShaders(): + self.t = addTitle("Firefly Demo: Video driver reports that Cg " + "shaders are not supported.") + return + if not self.win.getGsg().getSupportsDepthTexture(): + self.t = addTitle("Firefly Demo: Video driver reports that depth " + "textures are not supported.") + return + + # This algorithm uses two offscreen buffers, one of which has + # an auxiliary bitplane, and the offscreen buffers share a single + # depth buffer. This is a heck of a complicated buffer setup. + + self.modelbuffer = self.makeFBO("model buffer", 1) + self.lightbuffer = self.makeFBO("light buffer", 0) + + # Creation of a high-powered buffer can fail, if the graphics card + # doesn't support the necessary OpenGL extensions. + + if self.modelbuffer is None or self.lightbuffer is None: + self.t = addTitle("Toon Shader: Video driver does not support " + "multiple render targets") + return + + # Create four render textures: depth, normal, albedo, and final. + # attach them to the various bitplanes of the offscreen buffers. + + self.texDepth = Texture() + self.texDepth.setFormat(Texture.FDepthStencil) + self.texAlbedo = Texture() + self.texNormal = Texture() + self.texFinal = Texture() + + self.modelbuffer.addRenderTexture(self.texDepth, + GraphicsOutput.RTMBindOrCopy, GraphicsOutput.RTPDepthStencil) + self.modelbuffer.addRenderTexture(self.texAlbedo, + GraphicsOutput.RTMBindOrCopy, GraphicsOutput.RTPColor) + self.modelbuffer.addRenderTexture(self.texNormal, + GraphicsOutput.RTMBindOrCopy, GraphicsOutput.RTPAuxRgba0) + + self.lightbuffer.addRenderTexture(self.texFinal, + GraphicsOutput.RTMBindOrCopy, GraphicsOutput.RTPColor) + + # Set the near and far clipping planes. + + self.cam.node().getLens().setNear(50.0) + self.cam.node().getLens().setFar(500.0) + lens = self.cam.node().getLens() + + # This algorithm uses three cameras: one to render the models into the + # model buffer, one to render the lights into the light buffer, and + # one to render "plain" stuff (non-deferred shaded) stuff into the + # light buffer. Each camera has a bitmask to identify it. + + self.modelMask = 1 + self.lightMask = 2 + self.plainMask = 4 + + self.modelcam = self.makeCamera(self.modelbuffer, + lens=lens, scene=render, mask=self.modelMask) + self.lightcam = self.makeCamera(self.lightbuffer, + lens=lens, scene=render, mask=self.lightMask) + self.plaincam = self.makeCamera(self.lightbuffer, + lens=lens, scene=render, mask=self.plainMask) + + # Panda's main camera is not used. + + self.cam.node().setActive(0) + + # Take explicit control over the order in which the three + # buffers are rendered. + + self.modelbuffer.setSort(1) + self.lightbuffer.setSort(2) + self.win.setSort(3) + + # Within the light buffer, control the order of the two cams. + + self.lightcam.node().getDisplayRegion(0).setSort(1) + self.plaincam.node().getDisplayRegion(0).setSort(2) + + # By default, panda usually clears the screen before every + # camera and before every window. Tell it not to do that. + # Then, tell it specifically when to clear and what to clear. + + self.modelcam.node().getDisplayRegion(0).disableClears() + self.lightcam.node().getDisplayRegion(0).disableClears() + self.plaincam.node().getDisplayRegion(0).disableClears() + self.cam.node().getDisplayRegion(0).disableClears() + self.cam2d.node().getDisplayRegion(0).disableClears() + self.modelbuffer.disableClears() + self.win.disableClears() + + self.modelbuffer.setClearColorActive(1) + self.modelbuffer.setClearDepthActive(1) + self.lightbuffer.setClearColorActive(1) + self.lightbuffer.setClearColor((0, 0, 0, 1)) + + # Miscellaneous stuff. + + self.disableMouse() + self.camera.setPos(-9.112, -211.077, 46.951) + self.camera.setHpr(0, -7.5, 2.4) + random.seed() + + # Calculate the projection parameters for the final shader. + # The math here is too complex to explain in an inline comment, + # I've put in a full explanation into the HTML intro. + + proj = self.cam.node().getLens().getProjectionMat() + proj_x = 0.5 * proj.getCell(3, 2) / proj.getCell(0, 0) + proj_y = 0.5 * proj.getCell(3, 2) + proj_z = 0.5 * proj.getCell(3, 2) / proj.getCell(2, 1) + proj_w = -0.5 - 0.5 * proj.getCell(1, 2) + + # Configure the render state of the model camera. + + tempnode = NodePath(PandaNode("temp node")) + tempnode.setAttrib( + AlphaTestAttrib.make(RenderAttrib.MGreaterEqual, 0.5)) + tempnode.setShader(loader.loadShader("model.sha")) + tempnode.setAttrib(DepthTestAttrib.make(RenderAttrib.MLessEqual)) + self.modelcam.node().setInitialState(tempnode.getState()) + + # Configure the render state of the light camera. + + tempnode = NodePath(PandaNode("temp node")) + tempnode.setShader(loader.loadShader("light.sha")) + tempnode.setShaderInput("texnormal", self.texNormal) + tempnode.setShaderInput("texalbedo", self.texAlbedo) + tempnode.setShaderInput("texdepth", self.texDepth) + tempnode.setShaderInput("proj", (proj_x, proj_y, proj_z, proj_w)) + tempnode.setAttrib(ColorBlendAttrib.make(ColorBlendAttrib.MAdd, + ColorBlendAttrib.OOne, ColorBlendAttrib.OOne)) + tempnode.setAttrib( + CullFaceAttrib.make(CullFaceAttrib.MCullCounterClockwise)) + # The next line causes problems on Linux. + # tempnode.setAttrib(DepthTestAttrib.make(RenderAttrib.MGreaterEqual)) + tempnode.setAttrib(DepthWriteAttrib.make(DepthWriteAttrib.MOff)) + self.lightcam.node().setInitialState(tempnode.getState()) + + # Configure the render state of the plain camera. + + rs = RenderState.makeEmpty() + self.plaincam.node().setInitialState(rs) + + # Clear any render attribs on the root node. This is necessary + # because by default, panda assigns some attribs to the root + # node. These default attribs will override the + # carefully-configured render attribs that we just attached + # to the cameras. The simplest solution is to just clear + # them all out. + + render.setState(RenderState.makeEmpty()) + + # My artist created a model in which some of the polygons + # don't have textures. This confuses the shader I wrote. + # This little hack guarantees that everything has a texture. + + white = loader.loadTexture("models/white.jpg") + render.setTexture(white, 0) + + # Create two subroots, to help speed cull traversal. + + self.lightroot = NodePath(PandaNode("lightroot")) + self.lightroot.reparentTo(render) + self.modelroot = NodePath(PandaNode("modelroot")) + self.modelroot.reparentTo(render) + self.lightroot.hide(BitMask32(self.modelMask)) + self.modelroot.hide(BitMask32(self.lightMask)) + self.modelroot.hide(BitMask32(self.plainMask)) + + # Load the model of a forest. Make it visible to the model camera. + # This is a big model, so we load it asynchronously while showing a + # load text. We do this by passing in a callback function. + self.loading = addTitle("Loading models...") + + self.forest = NodePath(PandaNode("Forest Root")) + self.forest.reparentTo(render) + self.forest.hide(BitMask32(self.lightMask | self.plainMask)) + loader.loadModel([ + "models/background", + "models/foliage01", + "models/foliage02", + "models/foliage03", + "models/foliage04", + "models/foliage05", + "models/foliage06", + "models/foliage07", + "models/foliage08", + "models/foliage09"], + callback=self.finishLoading) + + # Cause the final results to be rendered into the main window on a + # card. + + self.card = self.lightbuffer.getTextureCard() + self.card.setTexture(self.texFinal) + self.card.reparentTo(render2d) + + # Panda contains a built-in viewer that lets you view the results of + # your render-to-texture operations. This code configures the viewer. + + self.bufferViewer.setPosition("llcorner") + self.bufferViewer.setCardSize(0, 0.40) + self.bufferViewer.setLayout("vline") + self.toggleCards() + self.toggleCards() + + # Firefly parameters + + self.fireflies = [] + self.sequences = [] + self.scaleseqs = [] + self.glowspheres = [] + self.fireflysize = 1.0 + self.spheremodel = loader.loadModel("misc/sphere") + + # Create the firefly model, a fuzzy dot + dotSize = 1.0 + cm = CardMaker("firefly") + cm.setFrame(-dotSize, dotSize, -dotSize, dotSize) + self.firefly = NodePath(cm.generate()) + self.firefly.setTexture(loader.loadTexture("models/firefly.png")) + self.firefly.setAttrib(ColorBlendAttrib.make(ColorBlendAttrib.M_add, + ColorBlendAttrib.O_incoming_alpha, ColorBlendAttrib.O_one)) + + # these allow you to change parameters in realtime + + self.accept("escape", sys.exit, [0]) + self.accept("arrow_up", self.incFireflyCount, [1.1111111]) + self.accept("arrow_down", self.decFireflyCount, [0.9000000]) + self.accept("arrow_right", self.setFireflySize, [1.1111111]) + self.accept("arrow_left", self.setFireflySize, [0.9000000]) + self.accept("v", self.toggleCards) + self.accept("V", self.toggleCards) + + def finishLoading(self, models): + # This function is used as callback to loader.loadModel, and called + # when all of the models have finished loading. + + # Attach the models to the scene graph. + for model in models: + model.reparentTo(self.forest) + + # Show the instructions. + self.loading.destroy() + self.title = addTitle("Panda3D: Tutorial - Fireflies using Deferred Shading") + self.inst1 = addInstructions(0.06, "ESC: Quit") + self.inst2 = addInstructions(0.12, "Up/Down: More / Fewer Fireflies (Count: unknown)") + self.inst3 = addInstructions(0.18, "Right/Left: Bigger / Smaller Fireflies (Radius: unknown)") + self.inst4 = addInstructions(0.24, "V: View the render-to-texture results") + + self.setFireflySize(25.0) + while len(self.fireflies) < 5: + self.addFirefly() + self.updateReadout() + + self.nextadd = 0 + taskMgr.add(self.spawnTask, "spawner") + + def makeFBO(self, name, auxrgba): + # This routine creates an offscreen buffer. All the complicated + # parameters are basically demanding capabilities from the offscreen + # buffer - we demand that it be able to render to texture on every + # bitplane, that it can support aux bitplanes, that it track + # the size of the host window, that it can render to texture + # cumulatively, and so forth. + winprops = WindowProperties() + props = FrameBufferProperties() + props.setRgbColor(True) + props.setRgbaBits(8, 8, 8, 8) + props.setDepthBits(1) + props.setAuxRgba(auxrgba) + return self.graphicsEngine.makeOutput( + self.pipe, "model buffer", -2, + props, winprops, + GraphicsPipe.BFSizeTrackHost | GraphicsPipe.BFCanBindEvery | + GraphicsPipe.BFRttCumulative | GraphicsPipe.BFRefuseWindow, + self.win.getGsg(), self.win) + + def addFirefly(self): + pos1 = LPoint3(random.uniform(-50, 50), random.uniform(-100, 150), random.uniform(-10, 80)) + dir = LVector3(random.uniform(-1, 1), random.uniform(-1, 1), random.uniform(-1, 1)) + dir.normalize() + pos2 = pos1 + (dir * 20) + fly = self.lightroot.attachNewNode(PandaNode("fly")) + glow = fly.attachNewNode(PandaNode("glow")) + dot = fly.attachNewNode(PandaNode("dot")) + color_r = 1.0 + color_g = random.uniform(0.8, 1.0) + color_b = min(color_g, random.uniform(0.5, 1.0)) + fly.setColor(color_r, color_g, color_b, 1.0) + fly.setShaderInput("lightcolor", color_r, color_g, color_b, 1.0) + int1 = fly.posInterval(random.uniform(7, 12), pos1, pos2) + int2 = fly.posInterval(random.uniform(7, 12), pos2, pos1) + si1 = fly.scaleInterval(random.uniform(0.8, 1.5), + LPoint3(0.2, 0.2, 0.2), LPoint3(0.2, 0.2, 0.2)) + si2 = fly.scaleInterval(random.uniform(1.5, 0.8), + LPoint3(1.0, 1.0, 1.0), LPoint3(0.2, 0.2, 0.2)) + si3 = fly.scaleInterval(random.uniform(1.0, 2.0), + LPoint3(0.2, 0.2, 0.2), LPoint3(1.0, 1.0, 1.0)) + siseq = Sequence(si1, si2, si3) + siseq.loop() + siseq.setT(random.uniform(0, 1000)) + seq = Sequence(int1, int2) + seq.loop() + self.spheremodel.instanceTo(glow) + self.firefly.instanceTo(dot) + glow.setScale(self.fireflysize * 1.1) + glow.hide(BitMask32(self.modelMask | self.plainMask)) + dot.hide(BitMask32(self.modelMask | self.lightMask)) + dot.setColor(color_r, color_g, color_b, 1.0) + self.fireflies.append(fly) + self.sequences.append(seq) + self.glowspheres.append(glow) + self.scaleseqs.append(siseq) + + def updateReadout(self): + self.inst2.destroy() + self.inst2 = addInstructions(0.12, + "Up/Down: More / Fewer Fireflies (Currently: %d)" % len(self.fireflies)) + self.inst3.destroy() + self.inst3 = addInstructions(0.18, + "Right/Left: Bigger / Smaller Fireflies (Radius: %d ft)" % self.fireflysize) + + def toggleCards(self): + self.bufferViewer.toggleEnable() + # When the cards are not visible, I also disable the color clear. + # This color-clear is actually not necessary, the depth-clear is + # sufficient for the purposes of the algorithm. + if (self.bufferViewer.isEnabled()): + self.modelbuffer.setClearColorActive(True) + else: + self.modelbuffer.setClearColorActive(False) + + def incFireflyCount(self, scale): + n = int((len(self.fireflies) * scale) + 1) + while (n > len(self.fireflies)): + self.addFirefly() + self.updateReadout() + + def decFireflyCount(self, scale): + n = int(len(self.fireflies) * scale) + if (n < 1): + n = 1 + while (len(self.fireflies) > n): + self.glowspheres.pop() + self.sequences.pop().finish() + self.scaleseqs.pop().finish() + self.fireflies.pop().removeNode() + self.updateReadout() + + def setFireflySize(self, n): + n = n * self.fireflysize + self.fireflysize = n + for x in self.glowspheres: + x.setScale(self.fireflysize * 1.1) + self.updateReadout() + + def spawnTask(self, task): + if task.time > self.nextadd: + self.nextadd = task.time + 1.0 + if (len(self.fireflies) < 300): + self.incFireflyCount(1.03) + return Task.cont + +demo = FireflyDemo() +demo.run() diff --git a/samples/fireflies/model.sha b/samples/fireflies/model.sha new file mode 100644 index 0000000000..f1867ee5da --- /dev/null +++ b/samples/fireflies/model.sha @@ -0,0 +1,35 @@ +//Cg +// +//Cg profile arbvp1 arbfp1 + +void vshader(float4 vtx_position : POSITION, + float2 vtx_texcoord0 : TEXCOORD0, + float4 vtx_normal : NORMAL, + float4 vtx_color : COLOR, + out float4 l_position : POSITION, + out float2 l_texcoord0 : TEXCOORD0, + out float4 l_color : COLOR, + out float3 l_normal : TEXCOORD1, + uniform float4x4 mat_modelproj, + uniform float4x4 itp_modelview) +{ + l_position=mul(mat_modelproj, vtx_position); + l_texcoord0 = vtx_texcoord0; + l_color = vtx_color; + l_normal = (float3)mul(itp_modelview, vtx_normal); +} + +void fshader(float2 l_texcoord0: TEXCOORD0, + float4 l_color: COLOR, + float3 l_normal: TEXCOORD1, + uniform sampler2D tex_0 : TEXUNIT0, + out float4 o_color: COLOR0, + out float4 o_normal: COLOR1) +{ + l_normal = normalize(l_normal); + o_color = l_color * tex2D(tex_0, l_texcoord0); + o_normal.rgb = (l_normal * 0.5) + float3(0.5, 0.5, 0.5); + o_normal.a = o_color.a; +} + + diff --git a/samples/fireflies/models/Bark.jpg b/samples/fireflies/models/Bark.jpg new file mode 100644 index 0000000000..f20500e6d2 Binary files /dev/null and b/samples/fireflies/models/Bark.jpg differ diff --git a/samples/fireflies/models/Bark03.jpg b/samples/fireflies/models/Bark03.jpg new file mode 100644 index 0000000000..f5a3d982f6 Binary files /dev/null and b/samples/fireflies/models/Bark03.jpg differ diff --git a/samples/fireflies/models/background.egg.pz b/samples/fireflies/models/background.egg.pz new file mode 100644 index 0000000000..b3981f5df6 Binary files /dev/null and b/samples/fireflies/models/background.egg.pz differ diff --git a/samples/fireflies/models/bigleaf3.png b/samples/fireflies/models/bigleaf3.png new file mode 100644 index 0000000000..39ed4c8640 Binary files /dev/null and b/samples/fireflies/models/bigleaf3.png differ diff --git a/samples/fireflies/models/elmleaf.png b/samples/fireflies/models/elmleaf.png new file mode 100644 index 0000000000..c3bc9a742f Binary files /dev/null and b/samples/fireflies/models/elmleaf.png differ diff --git a/samples/fireflies/models/firefly.png b/samples/fireflies/models/firefly.png new file mode 100644 index 0000000000..0e95d39cde Binary files /dev/null and b/samples/fireflies/models/firefly.png differ diff --git a/samples/fireflies/models/foliage01.egg.pz b/samples/fireflies/models/foliage01.egg.pz new file mode 100644 index 0000000000..50249f973e Binary files /dev/null and b/samples/fireflies/models/foliage01.egg.pz differ diff --git a/samples/fireflies/models/foliage02.egg.pz b/samples/fireflies/models/foliage02.egg.pz new file mode 100644 index 0000000000..f8cc0d2957 Binary files /dev/null and b/samples/fireflies/models/foliage02.egg.pz differ diff --git a/samples/fireflies/models/foliage03.egg.pz b/samples/fireflies/models/foliage03.egg.pz new file mode 100644 index 0000000000..764cda7ebc Binary files /dev/null and b/samples/fireflies/models/foliage03.egg.pz differ diff --git a/samples/fireflies/models/foliage04.egg.pz b/samples/fireflies/models/foliage04.egg.pz new file mode 100644 index 0000000000..b0531ee51f Binary files /dev/null and b/samples/fireflies/models/foliage04.egg.pz differ diff --git a/samples/fireflies/models/foliage05.egg.pz b/samples/fireflies/models/foliage05.egg.pz new file mode 100644 index 0000000000..5c8d0a75e6 Binary files /dev/null and b/samples/fireflies/models/foliage05.egg.pz differ diff --git a/samples/fireflies/models/foliage06.egg.pz b/samples/fireflies/models/foliage06.egg.pz new file mode 100644 index 0000000000..ceed26624d Binary files /dev/null and b/samples/fireflies/models/foliage06.egg.pz differ diff --git a/samples/fireflies/models/foliage07.egg.pz b/samples/fireflies/models/foliage07.egg.pz new file mode 100644 index 0000000000..dd7c6909e0 Binary files /dev/null and b/samples/fireflies/models/foliage07.egg.pz differ diff --git a/samples/fireflies/models/foliage08.egg.pz b/samples/fireflies/models/foliage08.egg.pz new file mode 100644 index 0000000000..968a496444 Binary files /dev/null and b/samples/fireflies/models/foliage08.egg.pz differ diff --git a/samples/fireflies/models/foliage09.egg.pz b/samples/fireflies/models/foliage09.egg.pz new file mode 100644 index 0000000000..dfd7583f08 Binary files /dev/null and b/samples/fireflies/models/foliage09.egg.pz differ diff --git a/samples/fireflies/models/indt04S.jpg b/samples/fireflies/models/indt04S.jpg new file mode 100644 index 0000000000..ba52ae94fc Binary files /dev/null and b/samples/fireflies/models/indt04S.jpg differ diff --git a/samples/fireflies/models/noise.jpg b/samples/fireflies/models/noise.jpg new file mode 100644 index 0000000000..12231717db Binary files /dev/null and b/samples/fireflies/models/noise.jpg differ diff --git a/samples/fireflies/models/oakleaf.png b/samples/fireflies/models/oakleaf.png new file mode 100644 index 0000000000..5aa44c1e11 Binary files /dev/null and b/samples/fireflies/models/oakleaf.png differ diff --git a/samples/fireflies/models/shrb03S.jpg b/samples/fireflies/models/shrb03S.jpg new file mode 100644 index 0000000000..3fcffb2896 Binary files /dev/null and b/samples/fireflies/models/shrb03S.jpg differ diff --git a/samples/fireflies/models/white.jpg b/samples/fireflies/models/white.jpg new file mode 100644 index 0000000000..6707c09aa6 Binary files /dev/null and b/samples/fireflies/models/white.jpg differ diff --git a/samples/fireflies/models/wood.jpg b/samples/fireflies/models/wood.jpg new file mode 100644 index 0000000000..3b74af8699 Binary files /dev/null and b/samples/fireflies/models/wood.jpg differ diff --git a/samples/fireflies/models/wood02S.jpg b/samples/fireflies/models/wood02S.jpg new file mode 100644 index 0000000000..5df8ee6a1d Binary files /dev/null and b/samples/fireflies/models/wood02S.jpg differ diff --git a/samples/fractal-plants/barkTexture.jpg b/samples/fractal-plants/barkTexture.jpg new file mode 100644 index 0000000000..85651f1304 Binary files /dev/null and b/samples/fractal-plants/barkTexture.jpg differ diff --git a/samples/fractal-plants/main.py b/samples/fractal-plants/main.py new file mode 100755 index 0000000000..fb16a5b1bc --- /dev/null +++ b/samples/fractal-plants/main.py @@ -0,0 +1,353 @@ +#!/usr/bin/env python + +# Author: Kwasi Mensah (kmensah@andrew.cmu.edu) +# Date: 8/05/2005 +# +# This demo shows how to make quasi-fractal trees in Panda. +# Its primarily meant to be a more complex example on how to use +# Panda's Geom interface. +# +from direct.showbase.ShowBase import ShowBase +from panda3d.core import Filename, InternalName +from panda3d.core import GeomVertexArrayFormat, GeomVertexFormat +from panda3d.core import Geom, GeomNode, GeomTrifans, GeomTristrips +from panda3d.core import GeomVertexReader, GeomVertexWriter +from panda3d.core import GeomVertexRewriter, GeomVertexData +from panda3d.core import PerspectiveLens, TextNode +from panda3d.core import TransformState, CullFaceAttrib +from panda3d.core import Light, AmbientLight, Spotlight +from panda3d.core import NodePath +from panda3d.core import LVector3, LMatrix4 +from direct.task.Task import Task +from direct.gui.OnscreenText import OnscreenText +from direct.showbase.DirectObject import DirectObject +import math +import random +import time +import sys +import os + +random.seed() +base = ShowBase() +base.disableMouse() +base.camera.setPos(0, -180, 30) +numPrimitives = 0 + +title = OnscreenText(text="Panda3D: Tutorial - Procedurally Making a Tree", + style=1, fg=(1, 1, 1, 1), parent=base.a2dBottomCenter, + pos=(0, 0.1), scale=.08) +qEvent = OnscreenText( + text="Q: Start Scene Over", + parent=base.a2dTopLeft, align=TextNode.ALeft, + style=1, fg=(1, 1, 1, 1), pos=(0.06, -0.10), + scale=.05) +wEvent = OnscreenText( + text="W: Add Another Tree", + parent=base.a2dTopLeft, align=TextNode.ALeft, + style=1, fg=(1, 1, 1, 1), pos=(0.06, -0.16), + scale=.05) + + +# this computes the new Axis which we'll make a branch grow alowng when we +# split +def randomAxis(vecList): + fwd = vecList[0] + perp1 = vecList[1] + perp2 = vecList[2] + + nfwd = fwd + perp1 * (2 * random.random() - 1) + \ + perp2 * (2 * random.random() - 1) + nfwd.normalize() + + nperp2 = nfwd.cross(perp1) + nperp2.normalize() + + nperp1 = nfwd.cross(nperp2) + nperp1.normalize() + + return [nfwd, nperp1, nperp2] + + +# this makes smalle variations in direction when we are growing a branch +# but not splitting +def smallRandomAxis(vecList): + fwd = vecList[0] + perp1 = vecList[1] + perp2 = vecList[2] + + nfwd = fwd + perp1 * (1 * random.random() - 0.5) + \ + perp2 * (1 * random.random() - 0.5) + nfwd.normalize() + + nperp2 = nfwd.cross(perp1) + nperp2.normalize() + + nperp1 = nfwd.cross(nperp2) + nperp1.normalize() + + return [nfwd, nperp1, nperp2] + + +# this draws the body of the tree. This draws a ring of vertices and connects the rings with +# triangles to form the body. +# this keepDrawing paramter tells the function wheter or not we're at an end +# if the vertices before you were an end, dont draw branches to it +def drawBody(nodePath, vdata, pos, vecList, radius=1, keepDrawing=True, numVertices=8): + + circleGeom = Geom(vdata) + + vertWriter = GeomVertexWriter(vdata, "vertex") + colorWriter = GeomVertexWriter(vdata, "color") + normalWriter = GeomVertexWriter(vdata, "normal") + drawReWriter = GeomVertexRewriter(vdata, "drawFlag") + texReWriter = GeomVertexRewriter(vdata, "texcoord") + + startRow = vdata.getNumRows() + vertWriter.setRow(startRow) + colorWriter.setRow(startRow) + normalWriter.setRow(startRow) + + sCoord = 0 + + if (startRow != 0): + texReWriter.setRow(startRow - numVertices) + sCoord = texReWriter.getData2f().getX() + 1 + + drawReWriter.setRow(startRow - numVertices) + if(drawReWriter.getData1f() == False): + sCoord -= 1 + + drawReWriter.setRow(startRow) + texReWriter.setRow(startRow) + + angleSlice = 2 * math.pi / numVertices + currAngle = 0 + + #axisAdj=LMatrix4.rotateMat(45, axis)*LMatrix4.scaleMat(radius)*LMatrix4.translateMat(pos) + + perp1 = vecList[1] + perp2 = vecList[2] + + # vertex information is written here + for i in range(numVertices): + adjCircle = pos + \ + (perp1 * math.cos(currAngle) + perp2 * math.sin(currAngle)) * \ + radius + normal = perp1 * math.cos(currAngle) + perp2 * math.sin(currAngle) + normalWriter.addData3f(normal) + vertWriter.addData3f(adjCircle) + texReWriter.addData2f(sCoord, (i + 0.001) / (numVertices - 1)) + colorWriter.addData4f(0.5, 0.5, 0.5, 1) + drawReWriter.addData1f(keepDrawing) + currAngle += angleSlice + + drawReader = GeomVertexReader(vdata, "drawFlag") + drawReader.setRow(startRow - numVertices) + + # we cant draw quads directly so we use Tristrips + if (startRow != 0) & (drawReader.getData1f() != False): + lines = GeomTristrips(Geom.UHStatic) + half = int(numVertices * 0.5) + for i in range(numVertices): + lines.addVertex(i + startRow) + if i < half: + lines.addVertex(i + startRow - half) + else: + lines.addVertex(i + startRow - half - numVertices) + + lines.addVertex(startRow) + lines.addVertex(startRow - half) + lines.closePrimitive() + lines.decompose() + circleGeom.addPrimitive(lines) + + circleGeomNode = GeomNode("Debug") + circleGeomNode.addGeom(circleGeom) + + # I accidentally made the front-face face inwards. Make reverse makes the tree render properly and + # should cause any surprises to any poor programmer that tries to use + # this code + circleGeomNode.setAttrib(CullFaceAttrib.makeReverse(), 1) + global numPrimitives + numPrimitives += numVertices * 2 + + nodePath.attachNewNode(circleGeomNode) + + +# this draws leafs when we reach an end +def drawLeaf(nodePath, vdata, pos=LVector3(0, 0, 0), vecList=[LVector3(0, 0, 1), LVector3(1, 0, 0), LVector3(0, -1, 0)], scale=0.125): + + # use the vectors that describe the direction the branch grows to make the right + # rotation matrix + newCs = LMatrix4(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + newCs.setRow(0, vecList[2]) # right + newCs.setRow(1, vecList[1]) # up + newCs.setRow(2, vecList[0]) # forward + newCs.setRow(3, (0, 0, 0)) + newCs.setCol(3, (0, 0, 0, 1)) + + axisAdj = LMatrix4.scaleMat(scale) * newCs * LMatrix4.translateMat(pos) + + # orginlly made the leaf out of geometry but that didnt look good + # I also think there should be a better way to handle the leaf texture other than + # hardcoding the filename + leafModel = loader.loadModel('models/shrubbery') + leafTexture = loader.loadTexture('models/material-10-cl.png') + + leafModel.reparentTo(nodePath) + leafModel.setTexture(leafTexture, 1) + leafModel.setTransform(TransformState.makeMat(axisAdj)) + + +# recursive algorthim to make the tree +def makeFractalTree(bodydata, nodePath, length, pos=LVector3(0, 0, 0), numIterations=11, numCopies=4, vecList=[LVector3(0, 0, 1), LVector3(1, 0, 0), LVector3(0, -1, 0)]): + if numIterations > 0: + + drawBody(nodePath, bodydata, pos, vecList, length.getX()) + + # move foward along the right axis + newPos = pos + vecList[0] * length.length() + + # only branch every third level (sorta) + if numIterations % 3 == 0: + # decrease dimensions when we branch + length = LVector3( + length.getX() / 2, length.getY() / 2, length.getZ() / 1.1) + for i in range(numCopies): + makeFractalTree(bodydata, nodePath, length, newPos, + numIterations - 1, numCopies, randomAxis(vecList)) + else: + # just make another branch connected to this one with a small + # variation in direction + makeFractalTree(bodydata, nodePath, length, newPos, + numIterations - 1, numCopies, smallRandomAxis(vecList)) + + else: + drawBody(nodePath, bodydata, pos, vecList, length.getX(), False) + drawLeaf(nodePath, bodydata, pos, vecList) + + +alight = AmbientLight('alight') +alight.setColor((0.5, 0.5, 0.5, 1)) +alnp = render.attachNewNode(alight) +render.setLight(alnp) + +slight = Spotlight('slight') +slight.setColor((1, 1, 1, 1)) +lens = PerspectiveLens() +slight.setLens(lens) +slnp = render.attachNewNode(slight) +render.setLight(slnp) + +slnp.setPos(0, 0, 40) + +# rotating light to show that normals are calculated correctly +def updateLight(task): + global slnp + currPos = slnp.getPos() + currPos.setX(100 * math.cos(task.time) / 2) + currPos.setY(100 * math.sin(task.time) / 2) + slnp.setPos(currPos) + + slnp.lookAt(render) + return Task.cont + +taskMgr.add(updateLight, "rotating Light") + + +# add some interactivity to the program +class MyTapper(DirectObject): + + def __init__(self): + formatArray = GeomVertexArrayFormat() + formatArray.addColumn( + InternalName.make("drawFlag"), 1, Geom.NTUint8, Geom.COther) + + format = GeomVertexFormat(GeomVertexFormat.getV3n3cpt2()) + format.addArray(formatArray) + self.format = GeomVertexFormat.registerFormat(format) + + bodydata = GeomVertexData("body vertices", format, Geom.UHStatic) + + self.barkTexture = loader.loadTexture("barkTexture.jpg") + treeNodePath = NodePath("Tree Holder") + makeFractalTree(bodydata, treeNodePath, LVector3(4, 4, 7)) + + treeNodePath.setTexture(self.barkTexture, 1) + treeNodePath.reparentTo(render) + + self.accept("q", self.regenTree) + self.accept("w", self.addTree) + self.accept("arrow_up", self.upIterations) + self.accept("arrow_down", self.downIterations) + self.accept("arrow_right", self.upCopies) + self.accept("arrow_left", self.downCopies) + + self.numIterations = 11 + self.numCopies = 4 + + self.upDownEvent = OnscreenText( + text="Up/Down: Increase/Decrease the number of iterations (" + str( + self.numIterations) + ")", + parent=base.a2dTopLeft, align=TextNode.ALeft, + style=1, fg=(1, 1, 1, 1), pos=(0.06, -0.22), + scale=.05, mayChange=True) + + self.leftRightEvent = OnscreenText( + text="Left/Right: Increase/Decrease branching (" + str( + self.numCopies) + ")", + parent=base.a2dTopLeft, align=TextNode.ALeft, + style=1, fg=(1, 1, 1, 1), pos=(0.06, -0.28), + scale=.05, mayChange=True) + + def upIterations(self): + self.numIterations += 1 + self.upDownEvent.setText( + "Up/Down: Increase/Decrease the number of iterations (" + str(self.numIterations) + ")") + + def downIterations(self): + self.numIterations -= 1 + self.upDownEvent.setText( + "Up/Down: Increase/Decrease the number of iterations (" + str(self.numIterations) + ")") + + def upCopies(self): + self.numCopies += 1 + self.leftRightEvent.setText( + "Left/Right: Increase/Decrease branching (" + str(self.numCopies) + ")") + + def downCopies(self): + self.numCopies -= 1 + self.leftRightEvent.setText( + "Left/Right: Increase/Decrease branching (" + str(self.numCopies) + ")") + + def regenTree(self): + forest = render.findAllMatches("Tree Holder") + forest.detach() + + bodydata = GeomVertexData("body vertices", self.format, Geom.UHStatic) + + treeNodePath = NodePath("Tree Holder") + makeFractalTree(bodydata, treeNodePath, LVector3(4, 4, 7), LVector3( + 0, 0, 0), self.numIterations, self.numCopies) + + treeNodePath.setTexture(self.barkTexture, 1) + treeNodePath.reparentTo(render) + + def addTree(self): + bodydata = GeomVertexData("body vertices", self.format, Geom.UHStatic) + + randomPlace = LVector3( + 200 * random.random() - 100, 200 * random.random() - 100, 0) + # randomPlace.normalize() + + treeNodePath = NodePath("Tree Holder") + makeFractalTree(bodydata, treeNodePath, LVector3( + 4, 4, 7), randomPlace, self.numIterations, self.numCopies) + + treeNodePath.setTexture(self.barkTexture, 1) + treeNodePath.reparentTo(render) + +t = MyTapper() +print(numPrimitives) + +base.run() diff --git a/samples/fractal-plants/models/material-10-cl.png b/samples/fractal-plants/models/material-10-cl.png new file mode 100644 index 0000000000..e4d6ad1d08 Binary files /dev/null and b/samples/fractal-plants/models/material-10-cl.png differ diff --git a/samples/fractal-plants/models/shrubbery.egg.pz b/samples/fractal-plants/models/shrubbery.egg.pz new file mode 100644 index 0000000000..7bfc21da6e Binary files /dev/null and b/samples/fractal-plants/models/shrubbery.egg.pz differ diff --git a/samples/glow-filter/advanced.py b/samples/glow-filter/advanced.py new file mode 100755 index 0000000000..7d74780906 --- /dev/null +++ b/samples/glow-filter/advanced.py @@ -0,0 +1,166 @@ +#!/usr/bin/env python + +# Author: Kwasi Mensah (kmensah@andrew.cmu.edu) +# Date: 7/25/2005 + +from direct.showbase.ShowBase import ShowBase +from panda3d.core import Filename, Shader +from panda3d.core import PandaNode, NodePath +from panda3d.core import ColorBlendAttrib +from panda3d.core import AmbientLight, DirectionalLight +from panda3d.core import TextNode, LPoint3, LVector4 +from direct.showbase.DirectObject import DirectObject +from direct.gui.OnscreenText import OnscreenText +from direct.actor.Actor import Actor +import sys +import os + +# Function to put instructions on the screen. +def addInstructions(pos, msg): + return OnscreenText(text=msg, style=1, fg=(1, 1, 1, 1), + parent=base.a2dTopLeft, align=TextNode.ALeft, + pos=(0.08, -pos - 0.04), scale=.05) + +# Function to put title on the screen. +def addTitle(text): + return OnscreenText(text=text, style=1, fg=(1, 1, 1, 1), + parent=base.a2dBottomRight, align=TextNode.ARight, + pos=(-0.1, 0.09), scale=.08) + + +# This function is responsible for setting up the two blur filters. +# It just makes a temp Buffer, puts a screen aligned card, and then sets +# the appropiate shader to do all the work. Gaussian blurs are decomposable +# into a two-pass algorithm which is faster than the equivalent one-pass +# algorithm, so we do it in two passes: one pass that blurs in the horizontal +# direction, and one in the vertical direction. +def makeFilterBuffer(srcbuffer, name, sort, prog): + blurBuffer = base.win.makeTextureBuffer(name, 512, 512) + blurBuffer.setSort(sort) + blurBuffer.setClearColor(LVector4(1, 0, 0, 1)) + blurCamera = base.makeCamera2d(blurBuffer) + blurScene = NodePath("new Scene") + blurCamera.node().setScene(blurScene) + shader = loader.loadShader(prog) + card = srcbuffer.getTextureCard() + card.reparentTo(blurScene) + card.setShader(shader) + return blurBuffer + + +class GlowDemo(ShowBase): + + def __init__(self): + # Initialize the ShowBase class from which we inherit, which will + # create a window and set up everything we need for rendering into it. + ShowBase.__init__(self) + + base.disableMouse() + base.setBackgroundColor(0, 0, 0) + camera.setPos(0, -50, 0) + + # Check video card capabilities. + if not base.win.getGsg().getSupportsBasicShaders(): + addTitle( + "Glow Filter: Video driver reports that Cg shaders are not supported.") + return + + # Post the instructions + self.title = addTitle("Panda3D: Tutorial - Glow Filter") + self.inst1 = addInstructions(0.06, "ESC: Quit") + self.inst2 = addInstructions(0.12, "Space: Toggle Glow Filter On/Off") + self.inst3 = addInstructions(0.18, "Enter: Toggle Running/Spinning") + self.inst4 = addInstructions(0.24, "V: View the render-to-texture results") + + # Create the shader that will determime what parts of the scene will + # glow + glowShader = loader.loadShader("shaders/glowShader.sha") + + # load our model + self.tron = Actor() + self.tron.loadModel("models/tron") + self.tron.loadAnims({"running": "models/tron_anim"}) + self.tron.reparentTo(render) + self.interval = self.tron.hprInterval(60, LPoint3(360, 0, 0)) + self.interval.loop() + self.isRunning = False + + # put some lighting on the tron model + dlight = DirectionalLight('dlight') + alight = AmbientLight('alight') + dlnp = render.attachNewNode(dlight) + alnp = render.attachNewNode(alight) + dlight.setColor(LVector4(1.0, 0.7, 0.2, 1)) + alight.setColor(LVector4(0.2, 0.2, 0.2, 1)) + dlnp.setHpr(0, -60, 0) + render.setLight(dlnp) + render.setLight(alnp) + + # create the glow buffer. This buffer renders like a normal scene, + # except that only the glowing materials should show up nonblack. + glowBuffer = base.win.makeTextureBuffer("Glow scene", 512, 512) + glowBuffer.setSort(-3) + glowBuffer.setClearColor(LVector4(0, 0, 0, 1)) + + # We have to attach a camera to the glow buffer. The glow camera + # must have the same frustum as the main camera. As long as the aspect + # ratios match, the rest will take care of itself. + glowCamera = base.makeCamera( + glowBuffer, lens=base.cam.node().getLens()) + + # Tell the glow camera to use the glow shader + tempnode = NodePath(PandaNode("temp node")) + tempnode.setShader(glowShader) + glowCamera.node().setInitialState(tempnode.getState()) + + # set up the pipeline: from glow scene to blur x to blur y to main + # window. + blurXBuffer = makeFilterBuffer( + glowBuffer, "Blur X", -2, "shaders/XBlurShader.sha") + blurYBuffer = makeFilterBuffer( + blurXBuffer, "Blur Y", -1, "shaders/YBlurShader.sha") + self.finalcard = blurYBuffer.getTextureCard() + self.finalcard.reparentTo(render2d) + + # This attribute is used to add the results of the post-processing + # effects to the existing framebuffer image, rather than replace it. + # This is mainly useful for glow effects like ours. + self.finalcard.setAttrib(ColorBlendAttrib.make(ColorBlendAttrib.MAdd)) + + # Panda contains a built-in viewer that lets you view the results of + # your render-to-texture operations. This code configures the viewer. + self.accept("v", base.bufferViewer.toggleEnable) + self.accept("V", base.bufferViewer.toggleEnable) + base.bufferViewer.setPosition("llcorner") + base.bufferViewer.setLayout("hline") + base.bufferViewer.setCardSize(0.652, 0) + + # event handling + self.accept("space", self.toggleGlow) + self.accept("enter", self.toggleDisplay) + self.accept("escape", sys.exit, [0]) + + self.glowOn = True + + def toggleGlow(self): + if self.glowOn: + self.finalcard.reparentTo(hidden) + else: + self.finalcard.reparentTo(render2d) + self.glowOn = not(self.glowOn) + + def toggleDisplay(self): + self.isRunning = not(self.isRunning) + if not(self.isRunning): + camera.setPos(0, -50, 0) + self.tron.stop("running") + self.tron.pose("running", 0) + self.interval.loop() + else: + camera.setPos(0, -170, 3) + self.interval.finish() + self.tron.setHpr(0, 0, 0) + self.tron.loop("running") + +demo = GlowDemo() +demo.run() diff --git a/samples/glow-filter/basic.py b/samples/glow-filter/basic.py new file mode 100755 index 0000000000..adba975ce3 --- /dev/null +++ b/samples/glow-filter/basic.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python + +# Author: Kwasi Mensah (kmensah@andrew.cmu.edu) +# Date: 7/25/2005 + +from direct.showbase.ShowBase import ShowBase +from panda3d.core import Filename, Shader +from panda3d.core import PandaNode, NodePath +from panda3d.core import AmbientLight, DirectionalLight +from panda3d.core import TextNode, LPoint3 +from direct.showbase.DirectObject import DirectObject +from direct.filter.CommonFilters import CommonFilters +from direct.gui.OnscreenText import OnscreenText +from direct.actor.Actor import Actor +import sys +import os + +# Function to put instructions on the screen. +def addInstructions(pos, msg): + return OnscreenText(text=msg, style=1, fg=(1, 1, 1, 1), + parent=base.a2dTopLeft, align=TextNode.ALeft, + pos=(0.08, -pos - 0.04), scale=.05) + +# Function to put title on the screen. +def addTitle(text): + return OnscreenText(text=text, style=1, fg=(1, 1, 1, 1), + parent=base.a2dBottomRight, align=TextNode.ARight, + pos=(-0.1, 0.09), scale=.08) + + +class GlowDemo(ShowBase): + def __init__(self): + # Initialize the ShowBase class from which we inherit, which will + # create a window and set up everything we need for rendering into it. + ShowBase.__init__(self) + + base.disableMouse() + base.setBackgroundColor(0, 0, 0) + camera.setPos(0, -50, 0) + + # Check video card capabilities. + if not base.win.getGsg().getSupportsBasicShaders(): + addTitle( + "Glow Filter: Video driver reports that Cg shaders are not supported.") + return + + # Use class 'CommonFilters' to enable a bloom filter. + # The brightness of a pixel is measured using a weighted average + # of R,G,B,A. We put all the weight on Alpha, meaning that for + # us, the framebuffer's alpha channel alpha controls bloom. + + self.filters = CommonFilters(base.win, base.cam) + filterok = self.filters.setBloom( + blend=(0, 0, 0, 1), desat=-0.5, intensity=3.0, size="small") + if (filterok == False): + addTitle( + "Toon Shader: Video card not powerful enough to do image postprocessing") + return + self.glowSize = 1 + + # Post the instructions + self.title = addTitle("Panda3D: Tutorial - Glow Filter") + self.inst1 = addInstructions(0.06, "ESC: Quit") + self.inst2 = addInstructions(0.12, "Space: Toggle Glow Filter Small/Med/Large/Off") + self.inst3 = addInstructions(0.18, "Enter: Toggle Running/Spinning") + self.inst4 = addInstructions(0.24, "V: View the render-to-texture results") + + # load our model + + self.tron = Actor() + self.tron.loadModel("models/tron") + self.tron.loadAnims({"running": "models/tron_anim"}) + self.tron.reparentTo(render) + self.interval = self.tron.hprInterval(60, LPoint3(360, 0, 0)) + self.interval.loop() + self.isRunning = False + + # put some lighting on the model + + dlight = DirectionalLight('dlight') + alight = AmbientLight('alight') + dlnp = render.attachNewNode(dlight) + alnp = render.attachNewNode(alight) + dlight.setColor((1.0, 0.7, 0.2, 1)) + alight.setColor((0.2, 0.2, 0.2, 1)) + dlnp.setHpr(0, -60, 0) + render.setLight(dlnp) + render.setLight(alnp) + + # Panda contains a built-in viewer that lets you view the results of + # your render-to-texture operations. This code configures the viewer. + self.accept("v", base.bufferViewer.toggleEnable) + self.accept("V", base.bufferViewer.toggleEnable) + base.bufferViewer.setPosition("llcorner") + base.bufferViewer.setLayout("hline") + # base.camLens.setFov(100) + # event handling + self.accept("space", self.toggleGlow) + self.accept("enter", self.toggleDisplay) + self.accept("escape", sys.exit, [0]) + + def toggleGlow(self): + self.glowSize = self.glowSize + 1 + if self.glowSize == 4: + self.glowSize = 0 + self.filters.setBloom(blend=(0, 0, 0, 1), desat=-0.5, intensity=3.0, + size=self.glowSize) + + def toggleDisplay(self): + self.isRunning = not self.isRunning + if not self.isRunning: + camera.setPos(0, -50, 0) + self.tron.stop("running") + self.tron.pose("running", 0) + self.interval.loop() + else: + camera.setPos(0, -170, 3) + self.interval.finish() + self.tron.setHpr(0, 0, 0) + self.tron.loop("running") + +demo = GlowDemo() +demo.run() diff --git a/samples/glow-filter/models/tron-color.png b/samples/glow-filter/models/tron-color.png new file mode 100644 index 0000000000..df4bb8fd7e Binary files /dev/null and b/samples/glow-filter/models/tron-color.png differ diff --git a/samples/glow-filter/models/tron-glow.png b/samples/glow-filter/models/tron-glow.png new file mode 100644 index 0000000000..7f8f0cb1cd Binary files /dev/null and b/samples/glow-filter/models/tron-glow.png differ diff --git a/samples/glow-filter/models/tron.egg.pz b/samples/glow-filter/models/tron.egg.pz new file mode 100644 index 0000000000..59b640940d Binary files /dev/null and b/samples/glow-filter/models/tron.egg.pz differ diff --git a/samples/glow-filter/models/tron_anim.egg.pz b/samples/glow-filter/models/tron_anim.egg.pz new file mode 100644 index 0000000000..e31a780bac Binary files /dev/null and b/samples/glow-filter/models/tron_anim.egg.pz differ diff --git a/samples/glow-filter/shaders/XBlurShader.sha b/samples/glow-filter/shaders/XBlurShader.sha new file mode 100644 index 0000000000..08049d83ab --- /dev/null +++ b/samples/glow-filter/shaders/XBlurShader.sha @@ -0,0 +1,28 @@ +//Cg +// +//Cg profile arbvp1 arbfp1 + +void vshader(float4 vtx_position : POSITION, + float2 vtx_texcoord0 : TEXCOORD0, + out float4 l_position : POSITION, + out float2 l_texcoord0 : TEXCOORD0, + uniform float4x4 mat_modelproj) +{ + l_position=mul(mat_modelproj, vtx_position); + l_texcoord0=vtx_texcoord0; +} + + +void fshader(float2 l_texcoord0 : TEXCOORD0, + out float4 o_color : COLOR, + uniform sampler2D tex_0 : TEXUNIT0) +{ + float3 offset = float3(1.0/1024.0, 5.0/1024.0, 9.0/1024.0); + o_color = tex2D(tex_0, float2(l_texcoord0.x - offset.z, l_texcoord0.y)) * 5.0; + o_color += tex2D(tex_0, float2(l_texcoord0.x - offset.y, l_texcoord0.y)) * 8.0; + o_color += tex2D(tex_0, float2(l_texcoord0.x - offset.x, l_texcoord0.y)) * 10.0; + o_color += tex2D(tex_0, float2(l_texcoord0.x + offset.x, l_texcoord0.y)) * 10.0; + o_color += tex2D(tex_0, float2(l_texcoord0.x + offset.y, l_texcoord0.y)) * 8.0; + o_color += tex2D(tex_0, float2(l_texcoord0.x + offset.z, l_texcoord0.y)) * 5.0; + o_color = o_color * 0.030; +} diff --git a/samples/glow-filter/shaders/YBlurShader.sha b/samples/glow-filter/shaders/YBlurShader.sha new file mode 100644 index 0000000000..5a84701035 --- /dev/null +++ b/samples/glow-filter/shaders/YBlurShader.sha @@ -0,0 +1,30 @@ +//Cg +// +//Cg profile arbvp1 arbfp1 + +void vshader(float4 vtx_position : POSITION, + float2 vtx_texcoord0 : TEXCOORD0, + out float4 l_position : POSITION, + out float2 l_texcoord0 : TEXCOORD0, + uniform float4x4 mat_modelproj) +{ + l_position=mul(mat_modelproj, vtx_position); + l_texcoord0=vtx_texcoord0; +} + + +void fshader(float2 l_texcoord0 : TEXCOORD0, + out float4 o_color : COLOR, + uniform sampler2D tex_0 : TEXUNIT0) +{ + float3 offset = float3(1.0/1024.0, 5.0/1024.0, 9.0/1024.0); + o_color = tex2D(tex_0, float2(l_texcoord0.x, l_texcoord0.y - offset.z)) * 5.0; + o_color += tex2D(tex_0, float2(l_texcoord0.x, l_texcoord0.y - offset.y)) * 8.0; + o_color += tex2D(tex_0, float2(l_texcoord0.x, l_texcoord0.y - offset.x)) * 10.0; + o_color += tex2D(tex_0, float2(l_texcoord0.x, l_texcoord0.y + offset.x)) * 10.0; + o_color += tex2D(tex_0, float2(l_texcoord0.x, l_texcoord0.y + offset.y)) * 8.0; + o_color += tex2D(tex_0, float2(l_texcoord0.x, l_texcoord0.y + offset.z)) * 5.0; + o_color = o_color * 0.030; +} + + diff --git a/samples/glow-filter/shaders/glowShader.sha b/samples/glow-filter/shaders/glowShader.sha new file mode 100644 index 0000000000..f94c22cc98 --- /dev/null +++ b/samples/glow-filter/shaders/glowShader.sha @@ -0,0 +1,21 @@ +//Cg +// + +void vshader(float4 vtx_position : POSITION, + float2 vtx_texcoord0 : TEXCOORD0, + uniform float4x4 mat_modelproj, + out float4 l_position : POSITION, + out float2 l_texcoord0 : TEXCOORD0) +{ + l_position=mul(mat_modelproj, vtx_position); + l_texcoord0=vtx_texcoord0; +} + +void fshader(float2 l_texcoord0 : TEXCOORD0, + uniform sampler2D tex_0 : TEXUNIT0, + out float4 o_color : COLOR) +{ + float4 texColor=tex2D(tex_0, l_texcoord0); + o_color=texColor*2*(texColor.w - 0.5); +} + diff --git a/samples/infinite-tunnel/main.py b/samples/infinite-tunnel/main.py new file mode 100755 index 0000000000..bc32fde065 --- /dev/null +++ b/samples/infinite-tunnel/main.py @@ -0,0 +1,211 @@ +#!/usr/bin/env python + +# Author: Shao Zhang and Phil Saltzman +# Last Updated: 2015-03-13 +# +# This tutorial will cover fog and how it can be used to make a finite length +# tunnel seem endless by hiding its endpoint in darkness. Fog in panda works by +# coloring objects based on their distance from the camera. Fog is not a 3D +# volume object like real world fog. +# With the right settings, Fog in panda can mimic the appearence of real world # fog. +# +# The tunnel and texture was originally created by Vamsi Bandaru and Victoria +# Webb for the Entertainment Technology Center class Building Virtual Worlds + +from direct.showbase.ShowBase import ShowBase +from panda3d.core import Fog +from panda3d.core import TextNode +from direct.gui.OnscreenText import OnscreenText +from direct.showbase.DirectObject import DirectObject +from direct.interval.MetaInterval import Sequence +from direct.interval.LerpInterval import LerpFunc +from direct.interval.FunctionInterval import Func +import sys + +# Global variables for the tunnel dimensions and speed of travel +TUNNEL_SEGMENT_LENGTH = 50 +TUNNEL_TIME = 2 # Amount of time for one segment to travel the +# distance of TUNNEL_SEGMENT_LENGTH + + +class FogDemo(ShowBase): + + # Macro-like function used to reduce the amount to code needed to create the + # on screen instructions + def genLabelText(self, i, text): + return OnscreenText(text=text, parent=base.a2dTopLeft, scale=.05, + pos=(0.06, -.065 * i), fg=(1, 1, 1, 1), + align=TextNode.ALeft) + + def __init__(self): + # Initialize the ShowBase class from which we inherit, which will + # create a window and set up everything we need for rendering into it. + ShowBase.__init__(self) + + # Standard initialization stuff + # Standard title that's on screen in every tutorial + self.title = OnscreenText(text="Panda3D: Tutorial - Fog", style=1, + fg=(1, 1, 1, 1), shadow=(0, 0, 0, .5), parent=base.a2dBottomRight, + align=TextNode.ARight, pos=(-0.1, 0.1), scale=.08) + + # Code to generate the on screen instructions + self.escapeEventText = self.genLabelText(1, "ESC: Quit") + self.pkeyEventText = self.genLabelText(2, "[P]: Pause") + self.tkeyEventText = self.genLabelText(3, "[T]: Toggle Fog") + self.dkeyEventText = self.genLabelText(4, "[D]: Make fog color black") + self.sdkeyEventText = self.genLabelText(5, "[SHIFT+D]: Make background color black") + self.rkeyEventText = self.genLabelText(6, "[R]: Make fog color red") + self.srkeyEventText = self.genLabelText(7, "[SHIFT+R]: Make background color red") + self.bkeyEventText = self.genLabelText(8, "[B]: Make fog color blue") + self.sbkeyEventText = self.genLabelText(9, "[SHIFT+B]: Make background color blue") + self.gkeyEventText = self.genLabelText(10, "[G]: Make fog color green") + self.sgkeyEventText = self.genLabelText(11, "[SHIFT+G]: Make background color green") + self.lkeyEventText = self.genLabelText(12, "[L]: Make fog color light grey") + self.slkeyEventText = self.genLabelText(13, "[SHIFT+L]: Make background color light grey") + self.pluskeyEventText = self.genLabelText(14, "[+]: Increase fog density") + self.minuskeyEventText = self.genLabelText(15, "[-]: Decrease fog density") + + # disable mouse control so that we can place the camera + base.disableMouse() + camera.setPosHpr(0, 0, 10, 0, -90, 0) + base.setBackgroundColor(0, 0, 0) # set the background color to black + + # World specific-code + + # Create an instance of fog called 'distanceFog'. + #'distanceFog' is just a name for our fog, not a specific type of fog. + self.fog = Fog('distanceFog') + # Set the initial color of our fog to black. + self.fog.setColor(0, 0, 0) + # Set the density/falloff of the fog. The range is 0-1. + # The higher the numer, the "bigger" the fog effect. + self.fog.setExpDensity(.08) + # We will set fog on render which means that everything in our scene will + # be affected by fog. Alternatively, you could only set fog on a specific + # object/node and only it and the nodes below it would be affected by + # the fog. + render.setFog(self.fog) + + # Define the keyboard input + # Escape closes the demo + self.accept('escape', sys.exit) + # Handle pausing the tunnel + self.accept('p', self.handlePause) + # Handle turning the fog on and off + self.accept('t', toggleFog, [render, self.fog]) + # Sets keys to set the fog to various colors + self.accept('r', self.fog.setColor, [1, 0, 0]) + self.accept('g', self.fog.setColor, [0, 1, 0]) + self.accept('b', self.fog.setColor, [0, 0, 1]) + self.accept('l', self.fog.setColor, [.7, .7, .7]) + self.accept('d', self.fog.setColor, [0, 0, 0]) + # Sets keys to change the background colors + self.accept('shift-r', base.setBackgroundColor, [1, 0, 0]) + self.accept('shift-g', base.setBackgroundColor, [0, 1, 0]) + self.accept('shift-b', base.setBackgroundColor, [0, 0, 1]) + self.accept('shift-l', base.setBackgroundColor, [.7, .7, .7]) + self.accept('shift-d', base.setBackgroundColor, [0, 0, 0]) + # Increases the fog density when "+" key is pressed + self.accept('+', self.addFogDensity, [.01]) + # This is to handle the other "+" key (it's over = on the keyboard) + self.accept('=', self.addFogDensity, [.01]) + self.accept('shift-=', self.addFogDensity, [.01]) + # Decreases the fog density when the "-" key is pressed + self.accept('-', self.addFogDensity, [-.01]) + + # Load the tunel and start the tunnel + self.initTunnel() + self.contTunnel() + + # This function will change the fog density by the amount passed into it + # This function is needed so that it can look up the current value and + # change it when the key is pressed. If you wanted to bind a key to set it + # at a given value you could call self.fog.setExpDensity directly + def addFogDensity(self, change): + # The min() statement makes sure the density is never over 1 + # The max() statement makes sure the density is never below 0 + self.fog.setExpDensity( + min(1, max(0, self.fog.getExpDensity() + change))) + + # Code to initialize the tunnel + def initTunnel(self): + self.tunnel = [None] * 4 + + for x in range(4): + # Load a copy of the tunnel + self.tunnel[x] = loader.loadModel('models/tunnel') + # The front segment needs to be attached to render + if x == 0: + self.tunnel[x].reparentTo(render) + # The rest of the segments parent to the previous one, so that by moving + # the front segement, the entire tunnel is moved + else: + self.tunnel[x].reparentTo(self.tunnel[x - 1]) + # We have to offset each segment by its length so that they stack onto + # each other. Otherwise, they would all occupy the same space. + self.tunnel[x].setPos(0, 0, -TUNNEL_SEGMENT_LENGTH) + # Now we have a tunnel consisting of 4 repeating segments with a + # hierarchy like this: + # render<-tunnel[0]<-tunnel[1]<-tunnel[2]<-tunnel[3] + + # This function is called to snap the front of the tunnel to the back + # to simulate traveling through it + def contTunnel(self): + # This line uses slices to take the front of the list and put it on the + # back. For more information on slices check the Python manual + self.tunnel = self.tunnel[1:] + self.tunnel[0:1] + # Set the front segment (which was at TUNNEL_SEGMENT_LENGTH) to 0, which + # is where the previous segment started + self.tunnel[0].setZ(0) + # Reparent the front to render to preserve the hierarchy outlined above + self.tunnel[0].reparentTo(render) + # Set the scale to be apropriate (since attributes like scale are + # inherited, the rest of the segments have a scale of 1) + self.tunnel[0].setScale(.155, .155, .305) + # Set the new back to the values that the rest of teh segments have + self.tunnel[3].reparentTo(self.tunnel[2]) + self.tunnel[3].setZ(-TUNNEL_SEGMENT_LENGTH) + self.tunnel[3].setScale(1) + + # Set up the tunnel to move one segment and then call contTunnel again + # to make the tunnel move infinitely + self.tunnelMove = Sequence( + LerpFunc(self.tunnel[0].setZ, + duration=TUNNEL_TIME, + fromData=0, + toData=TUNNEL_SEGMENT_LENGTH * .305), + Func(self.contTunnel) + ) + self.tunnelMove.start() + + # This function calls toggle interval to pause or unpause the tunnel. + # Like addFogDensity, toggleInterval could not be passed directly in the + # accept command since the value of self.tunnelMove changes whenever + #self.contTunnel is called + def handlePause(self): + toggleInterval(self.tunnelMove) +# End Class World + + +# This function will toggle any interval passed to it between playing and +# paused +def toggleInterval(interval): + if interval.isPlaying(): + interval.pause() + else: + interval.resume() + + +# This function will toggle fog on a node +def toggleFog(node, fog): + # If the fog attached to the node is equal to the one we passed in, then + # fog is on and we should clear it + if node.getFog() == fog: + node.clearFog() + # Otherwise fog is not set so we should set it + else: + node.setFog(fog) + + +demo = FogDemo() +demo.run() diff --git a/samples/infinite-tunnel/models/tunnel.egg.pz b/samples/infinite-tunnel/models/tunnel.egg.pz new file mode 100644 index 0000000000..bfb460b2a8 Binary files /dev/null and b/samples/infinite-tunnel/models/tunnel.egg.pz differ diff --git a/samples/infinite-tunnel/models/tunnel.jpg b/samples/infinite-tunnel/models/tunnel.jpg new file mode 100644 index 0000000000..870403aa0b Binary files /dev/null and b/samples/infinite-tunnel/models/tunnel.jpg differ diff --git a/samples/looking-and-gripping/main.py b/samples/looking-and-gripping/main.py new file mode 100755 index 0000000000..186073d097 --- /dev/null +++ b/samples/looking-and-gripping/main.py @@ -0,0 +1,146 @@ +#!/usr/bin/env python + +# Author: Shao Zhang and Phil Saltzman +# Models and Textures by: Shaun Budhram, Will Houng, and David Tucker +# Last Updated: 2015-03-13 +# +# This tutorial will cover exposing joints and manipulating them. Specifically, +# we will take control of the neck joint of a humanoid character and rotate that +# joint to always face the mouse cursor. This will in turn make the head of the +# character "look" at the mouse cursor. We will also expose the hand joint and +# use it as a point to "attach" objects that the character can hold. By +# parenting an object to a hand joint, the object will stay in the character's +# hand even if the hand is moving through an animation. + +from direct.showbase.ShowBase import ShowBase +from panda3d.core import AmbientLight, DirectionalLight +from panda3d.core import TextNode, NodePath, LightAttrib +from panda3d.core import LVector3 +from direct.actor.Actor import Actor +from direct.task.Task import Task +from direct.gui.OnscreenText import OnscreenText +from direct.showbase.DirectObject import DirectObject +import sys + +# A simple function to make sure a value is in a given range, -1 to 1 by +# default +def clamp(i, mn=-1, mx=1): + return min(max(i, mn), mx) + +# Macro-like function used to reduce the amount to code needed to create the +# on screen instructions +def genLabelText(text, i): + return OnscreenText(text=text, parent=base.a2dTopLeft, scale=.06, + pos=(0.06, -.08 * i), fg=(1, 1, 1, 1), + shadow=(0, 0, 0, .5), align=TextNode.ALeft) + + +class LookingGrippingDemo(ShowBase): + + def __init__(self): + # Initialize the ShowBase class from which we inherit, which will + # create a window and set up everything we need for rendering into it. + ShowBase.__init__(self) + + # This code puts the standard title and instruction text on screen + self.title = OnscreenText(text="Panda3D: Tutorial - Joint Manipulation", + fg=(1, 1, 1, 1), parent=base.a2dBottomRight, + align=TextNode.ARight, pos=(-0.1, 0.1), + shadow=(0, 0, 0, .5), scale=.08) + + self.onekeyText = genLabelText("ESC: Quit", 1) + self.onekeyText = genLabelText("[1]: Teapot", 2) + self.twokeyText = genLabelText("[2]: Candy cane", 3) + self.threekeyText = genLabelText("[3]: Banana", 4) + self.fourkeyText = genLabelText("[4]: Sword", 5) + + # Set up key input + self.accept('escape', sys.exit) + self.accept('1', self.switchObject, [0]) + self.accept('2', self.switchObject, [1]) + self.accept('3', self.switchObject, [2]) + self.accept('4', self.switchObject, [3]) + + base.disableMouse() # Disable mouse-based camera-control + camera.setPos(0, -15, 2) # Position the camera + + self.eve = Actor("models/eve", # Load our animated charachter + {'walk': "models/eve_walk"}) + self.eve.reparentTo(render) # Put it in the scene + + # Now we use controlJoint to get a NodePath that's in control of her neck + # This must be done before any animations are played + self.eveNeck = self.eve.controlJoint(None, 'modelRoot', 'Neck') + + # We now play an animation. An animation must be played, or at least posed + # for the nodepath we just got from controlJoint to actually effect the + # model + self.eve.actorInterval("walk", playRate=2).loop() + + # Now we add a task that will take care of turning the head + taskMgr.add(self.turnHead, "turnHead") + + # Now we will expose the joint the hand joint. ExposeJoint allows us to + # get the position of a joint while it is animating. This is different than + # controlJonit which stops that joint from animating but lets us move it. + # This is particularly usefull for putting an object (like a weapon) in an + # actor's hand + self.rightHand = self.eve.exposeJoint(None, 'modelRoot', 'RightHand') + + # This is a table with models, positions, rotations, and scales of objects to + # be attached to our exposed joint. These are stock models and so they needed + # to be repositioned to look right. + positions = [("teapot", (0, -.66, -.95), (90, 0, 90), .4), + ("models/candycane", (.15, -.99, -.22), (90, 0, 90), 1), + ("models/banana", (.08, -.1, .09), (0, -90, 0), 1.75), + ("models/sword", (.11, .19, .06), (0, 0, 90), 1)] + + self.models = [] # A list that will store our models objects + for row in positions: + np = loader.loadModel(row[0]) # Load the model + np.setPos(row[1][0], row[1][1], row[1][2]) # Position it + np.setHpr(row[2][0], row[2][1], row[2][2]) # Rotate it + np.setScale(row[3]) # Scale it + # Reparent the model to the exposed joint. That way when the joint moves, + # the model we just loaded will move with it. + np.reparentTo(self.rightHand) + self.models.append(np) # Add it to our models list + + self.switchObject(0) # Make object 0 the first shown + self.setupLights() # Put in some default lighting + + # This is what we use to change which object it being held. It just hides all of + # the objects and then unhides the one that was selected + def switchObject(self, i): + for np in self.models: + np.hide() + self.models[i].show() + + # This task gets the position of mouse each frame, and rotates the neck based + # on it. + def turnHead(self, task): + # Check to make sure the mouse is readable + if base.mouseWatcherNode.hasMouse(): + # get the mouse position as a LVector2. The values for each axis are from -1 to + # 1. The top-left is (-1,-1), the bottom right is (1,1) + mpos = base.mouseWatcherNode.getMouse() + # Here we multiply the values to get the amount of degrees to turn + # Restrain is used to make sure the values returned by getMouse are in the + # valid range. If this particular model were to turn more than this, + # significant tearing would be visable + self.eveNeck.setP(clamp(mpos.getX()) * 50) + self.eveNeck.setH(clamp(mpos.getY()) * 20) + + return Task.cont # Task continues infinitely + + def setupLights(self): # Sets up some default lighting + ambientLight = AmbientLight("ambientLight") + ambientLight.setColor((.4, .4, .35, 1)) + directionalLight = DirectionalLight("directionalLight") + directionalLight.setDirection(LVector3(0, 8, -2.5)) + directionalLight.setColor((0.9, 0.8, 0.9, 1)) + render.setLight(render.attachNewNode(directionalLight)) + render.setLight(render.attachNewNode(ambientLight)) + +demo = LookingGrippingDemo() # Create an instance of our class +demo.run() # Run the simulation diff --git a/samples/looking-and-gripping/models/banana.egg.pz b/samples/looking-and-gripping/models/banana.egg.pz new file mode 100644 index 0000000000..c8081ae403 Binary files /dev/null and b/samples/looking-and-gripping/models/banana.egg.pz differ diff --git a/samples/looking-and-gripping/models/candycane.egg.pz b/samples/looking-and-gripping/models/candycane.egg.pz new file mode 100644 index 0000000000..00fd4d9ee6 Binary files /dev/null and b/samples/looking-and-gripping/models/candycane.egg.pz differ diff --git a/samples/looking-and-gripping/models/eve.egg.pz b/samples/looking-and-gripping/models/eve.egg.pz new file mode 100644 index 0000000000..83ab673c46 Binary files /dev/null and b/samples/looking-and-gripping/models/eve.egg.pz differ diff --git a/samples/looking-and-gripping/models/eve_run.egg.pz b/samples/looking-and-gripping/models/eve_run.egg.pz new file mode 100644 index 0000000000..3ea3950afd Binary files /dev/null and b/samples/looking-and-gripping/models/eve_run.egg.pz differ diff --git a/samples/looking-and-gripping/models/eve_walk.egg.pz b/samples/looking-and-gripping/models/eve_walk.egg.pz new file mode 100644 index 0000000000..ae565590bf Binary files /dev/null and b/samples/looking-and-gripping/models/eve_walk.egg.pz differ diff --git a/samples/looking-and-gripping/models/sword.egg.pz b/samples/looking-and-gripping/models/sword.egg.pz new file mode 100644 index 0000000000..22e204bd34 Binary files /dev/null and b/samples/looking-and-gripping/models/sword.egg.pz differ diff --git a/samples/looking-and-gripping/models/textures/banana.jpg b/samples/looking-and-gripping/models/textures/banana.jpg new file mode 100644 index 0000000000..3473625f85 Binary files /dev/null and b/samples/looking-and-gripping/models/textures/banana.jpg differ diff --git a/samples/looking-and-gripping/models/textures/candycane.jpg b/samples/looking-and-gripping/models/textures/candycane.jpg new file mode 100644 index 0000000000..9d63aec222 Binary files /dev/null and b/samples/looking-and-gripping/models/textures/candycane.jpg differ diff --git a/samples/looking-and-gripping/models/textures/eve.jpg b/samples/looking-and-gripping/models/textures/eve.jpg new file mode 100644 index 0000000000..3c2aad6517 Binary files /dev/null and b/samples/looking-and-gripping/models/textures/eve.jpg differ diff --git a/samples/looking-and-gripping/models/textures/eveface.jpg b/samples/looking-and-gripping/models/textures/eveface.jpg new file mode 100644 index 0000000000..7ae72b80e1 Binary files /dev/null and b/samples/looking-and-gripping/models/textures/eveface.jpg differ diff --git a/samples/looking-and-gripping/models/textures/sword.jpg b/samples/looking-and-gripping/models/textures/sword.jpg new file mode 100644 index 0000000000..eab2267c0d Binary files /dev/null and b/samples/looking-and-gripping/models/textures/sword.jpg differ diff --git a/samples/media-player/PandaSneezes.ogv b/samples/media-player/PandaSneezes.ogv new file mode 100644 index 0000000000..b58e308687 Binary files /dev/null and b/samples/media-player/PandaSneezes.ogv differ diff --git a/samples/media-player/main.py b/samples/media-player/main.py new file mode 100755 index 0000000000..838cb54961 --- /dev/null +++ b/samples/media-player/main.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python + +from panda3d.core import * +# Tell Panda3D to use OpenAL, not FMOD +loadPrcFileData("", "audio-library-name p3openal_audio") + +from direct.showbase.DirectObject import DirectObject +from direct.gui.OnscreenText import OnscreenText +from direct.showbase.ShowBase import ShowBase + +# Function to put instructions on the screen. +def addInstructions(pos, msg): + return OnscreenText(text=msg, style=1, fg=(0, 0, 0, 1), shadow=(1, 1, 1, 1), + parent=base.a2dTopLeft, align=TextNode.ALeft, + pos=(0.08, -pos - 0.04), scale=.06) + +# Function to put title on the screen. +def addTitle(text): + return OnscreenText(text=text, style=1, pos=(-0.1, 0.09), scale=.08, + parent=base.a2dBottomRight, align=TextNode.ARight, + fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1)) + + +class MediaPlayer(ShowBase): + + def __init__(self, media_file): + # Initialize the ShowBase class from which we inherit, which will + # create a window and set up everything we need for rendering into it. + ShowBase.__init__(self) + + self.title = addTitle("Panda3D: Tutorial - Media Player") + self.inst1 = addInstructions(0.06, "P: Play/Pause") + self.inst2 = addInstructions(0.12, "S: Stop and Rewind") + self.inst3 = addInstructions(0.18, + "M: Slow Motion / Normal Motion toggle") + + # Load the texture. We could use loader.loadTexture for this, + # but we want to make sure we get a MovieTexture, since it + # implements synchronizeTo. + self.tex = MovieTexture("name") + assert self.tex.read(media_file), "Failed to load video!" + + # Set up a fullscreen card to set the video texture on. + cm = CardMaker("My Fullscreen Card") + cm.setFrameFullscreenQuad() + + # Tell the CardMaker to create texture coordinates that take into + # account the padding region of the texture. + cm.setUvRange(self.tex) + + # Now place the card in the scene graph and apply the texture to it. + card = NodePath(cm.generate()) + card.reparentTo(self.render2d) + card.setTexture(self.tex) + + self.sound = loader.loadSfx(media_file) + # Synchronize the video to the sound. + self.tex.synchronizeTo(self.sound) + + self.accept('p', self.playpause) + self.accept('P', self.playpause) + self.accept('s', self.stopsound) + self.accept('S', self.stopsound) + self.accept('m', self.fastforward) + self.accept('M', self.fastforward) + + def stopsound(self): + self.sound.stop() + self.sound.setPlayRate(1.0) + + def fastforward(self): + if self.sound.status() == AudioSound.PLAYING: + t = self.sound.getTime() + self.sound.stop() + if self.sound.getPlayRate() == 1.0: + self.sound.setPlayRate(0.5) + else: + self.sound.setPlayRate(1.0) + self.sound.setTime(t) + self.sound.play() + + def playpause(self): + if self.sound.status() == AudioSound.PLAYING: + t = self.sound.getTime() + self.sound.stop() + self.sound.setTime(t) + else: + self.sound.play() + +player = MediaPlayer("PandaSneezes.ogv") +player.run() diff --git a/samples/motion-trails/main.py b/samples/motion-trails/main.py new file mode 100755 index 0000000000..b0764e5cf9 --- /dev/null +++ b/samples/motion-trails/main.py @@ -0,0 +1,210 @@ +#!/usr/bin/env python + +# Author: Josh Yelon +# +# This is a tutorial to show one of the simplest applications +# of copy-to-texture: motion trails. +# + +from direct.showbase.ShowBase import ShowBase +from panda3d.core import GraphicsOutput +from panda3d.core import Filename, Texture +from panda3d.core import CardMaker +from panda3d.core import NodePath, TextNode +from panda3d.core import AmbientLight, DirectionalLight +from direct.showbase.DirectObject import DirectObject +from direct.gui.OnscreenText import OnscreenText +from direct.task.Task import Task +from direct.actor.Actor import Actor +from random import uniform +import sys +import os + +def addInstructions(pos, msg): + return OnscreenText(text=msg, parent=base.a2dTopLeft, + style=1, fg=(1, 1, 1, 1), pos=(0.06, -pos - 0.03), + align=TextNode.ALeft, scale=.05) + + +class MotionTrails(ShowBase): + def __init__(self): + # Initialize the ShowBase class from which we inherit, which will + # create a window and set up everything we need for rendering into it. + ShowBase.__init__(self) + + self.disableMouse() + self.camera.setPos(0, -26, 4) + self.setBackgroundColor(0, 0, 0) + + # Create a texture into which we can copy the main window. + # We set it to RTMTriggeredCopyTexture mode, which tells it that we + # want it to copy the window contents into a texture every time we + # call self.win.triggerCopy(). + self.tex = Texture() + self.tex.setMinfilter(Texture.FTLinear) + self.win.addRenderTexture(self.tex, + GraphicsOutput.RTMTriggeredCopyTexture) + + # Set the initial color to clear the texture to, before rendering it. + # This is necessary because we don't clear the texture while rendering, + # and otherwise the user might see garbled random data from GPU memory. + self.tex.setClearColor((0, 0, 0, 1)) + self.tex.clearImage() + + # Create another 2D camera. Tell it to render before the main camera. + self.backcam = self.makeCamera2d(self.win, sort=-10) + self.background = NodePath("background") + self.backcam.reparentTo(self.background) + self.background.setDepthTest(0) + self.background.setDepthWrite(0) + self.backcam.node().getDisplayRegion(0).setClearDepthActive(0) + + # Obtain two texture cards. One renders before the dragon, the other + # after. + self.bcard = self.win.getTextureCard() + self.bcard.reparentTo(self.background) + self.bcard.setTransparency(1) + self.fcard = self.win.getTextureCard() + self.fcard.reparentTo(self.render2d) + self.fcard.setTransparency(1) + + # Initialize one of the nice effects. + self.chooseEffectGhost() + + # Add the task that initiates the screenshots. + taskMgr.add(self.takeSnapShot, "takeSnapShot") + + # Create some black squares on top of which we will + # place the instructions. + blackmaker = CardMaker("blackmaker") + blackmaker.setColor(0, 0, 0, 1) + blackmaker.setFrame(-1.00, -0.50, 0.65, 1.00) + instcard = NodePath(blackmaker.generate()) + instcard.reparentTo(self.render2d) + blackmaker.setFrame(-0.5, 0.5, -1.00, -0.85) + titlecard = NodePath(blackmaker.generate()) + titlecard.reparentTo(self.render2d) + + # Panda does its best to hide the differences between DirectX and + # OpenGL. But there are a few differences that it cannot hide. + # One such difference is that when OpenGL copies from a + # visible window to a texture, it gets it right-side-up. When + # DirectX does it, it gets it upside-down. There is nothing panda + # can do to compensate except to expose a flag and let the + # application programmer deal with it. You should only do this + # in the rare event that you're copying from a visible window + # to a texture. + if self.win.getGsg().getCopyTextureInverted(): + print("Copy texture is inverted.") + self.bcard.setScale(1, 1, -1) + self.fcard.setScale(1, 1, -1) + + # Put up the instructions + title = OnscreenText(text="Panda3D: Tutorial - Motion Trails", + fg=(1, 1, 1, 1), parent=base.a2dBottomCenter, + pos=(0, 0.1), scale=.08) + + instr0 = addInstructions(0.06, "Press ESC to exit") + instr1 = addInstructions(0.12, "Press 1: Ghost effect") + instr2 = addInstructions(0.18, "Press 2: PaintBrush effect") + instr3 = addInstructions(0.24, "Press 3: Double Vision effect") + instr4 = addInstructions(0.30, "Press 4: Wings of Blue effect") + instr5 = addInstructions(0.36, "Press 5: Whirlpool effect") + + # Enable the key events + self.accept("escape", sys.exit, [0]) + self.accept("1", self.chooseEffectGhost) + self.accept("2", self.chooseEffectPaintBrush) + self.accept("3", self.chooseEffectDoubleVision) + self.accept("4", self.chooseEffectWingsOfBlue) + self.accept("5", self.chooseEffectWhirlpool) + + def takeSnapShot(self, task): + if task.time > self.nextclick: + self.nextclick += 1.0 / self.clickrate + if self.nextclick < task.time: + self.nextclick = task.time + self.win.triggerCopy() + return Task.cont + + def chooseEffectGhost(self): + self.setBackgroundColor(0, 0, 0, 1) + self.bcard.hide() + self.fcard.show() + self.fcard.setColor(1.0, 1.0, 1.0, 0.99) + self.fcard.setScale(1.00) + self.fcard.setPos(0, 0, 0) + self.fcard.setR(0) + self.clickrate = 30 + self.nextclick = 0 + + def chooseEffectPaintBrush(self): + self.setBackgroundColor(0, 0, 0, 1) + self.bcard.show() + self.fcard.hide() + self.bcard.setColor(1, 1, 1, 1) + self.bcard.setScale(1.0) + self.bcard.setPos(0, 0, 0) + self.bcard.setR(0) + self.clickrate = 10000 + self.nextclick = 0 + + def chooseEffectDoubleVision(self): + self.setBackgroundColor(0, 0, 0, 1) + self.bcard.show() + self.bcard.setColor(1, 1, 1, 1) + self.bcard.setScale(1.0) + self.bcard.setPos(-0.05, 0, 0) + self.bcard.setR(0) + self.fcard.show() + self.fcard.setColor(1, 1, 1, 0.60) + self.fcard.setScale(1.0) + self.fcard.setPos(0.05, 0, 0) + self.fcard.setR(0) + self.clickrate = 10000 + self.nextclick = 0 + + def chooseEffectWingsOfBlue(self): + self.setBackgroundColor(0, 0, 0, 1) + self.fcard.hide() + self.bcard.show() + self.bcard.setColor(1.0, 0.90, 1.0, 254.0 / 255.0) + self.bcard.setScale(1.1, 1, 0.95) + self.bcard.setPos(0, 0, 0.05) + self.bcard.setR(0) + self.clickrate = 30 + self.nextclick = 0 + + def chooseEffectWhirlpool(self): + self.setBackgroundColor(0, 0, 0, 1) + self.bcard.show() + self.fcard.hide() + self.bcard.setColor(1, 1, 1, 1) + self.bcard.setScale(0.999) + self.bcard.setPos(0, 0, 0) + self.bcard.setR(1) + self.clickrate = 10000 + self.nextclick = 0 + + +t = MotionTrails() + +character = Actor() +character.loadModel('models/dancer') +character.reparentTo(t.render) +character.loadAnims({'win': 'models/dancer'}) +character.loop('win') +# character.hprInterval(15, LPoint3(360, 0,0)).loop() + +# put some lighting on the model +dlight = DirectionalLight('dlight') +alight = AmbientLight('alight') +dlnp = t.render.attachNewNode(dlight) +alnp = t.render.attachNewNode(alight) +dlight.setColor((1.0, 0.9, 0.8, 1)) +alight.setColor((0.2, 0.3, 0.4, 1)) +dlnp.setHpr(0, -60, 0) +t.render.setLight(dlnp) +t.render.setLight(alnp) + +t.run() diff --git a/samples/motion-trails/models/dancer.egg.pz b/samples/motion-trails/models/dancer.egg.pz new file mode 100644 index 0000000000..bc1260e71f Binary files /dev/null and b/samples/motion-trails/models/dancer.egg.pz differ diff --git a/samples/motion-trails/models/tex_skratixOpt.jpg b/samples/motion-trails/models/tex_skratixOpt.jpg new file mode 100644 index 0000000000..74112ec797 Binary files /dev/null and b/samples/motion-trails/models/tex_skratixOpt.jpg differ diff --git a/samples/music-box/main.py b/samples/music-box/main.py new file mode 100755 index 0000000000..774168f782 --- /dev/null +++ b/samples/music-box/main.py @@ -0,0 +1,175 @@ +#!/usr/bin/env python + +# Author: Shao Zhang, Phil Saltzman, and Elan Ruskin +# Last Updated: 2015-03-13 +# +# This tutorial shows how to load, play, and manipulate sounds +# and sound intervals in a panda project. + +from direct.showbase.ShowBase import ShowBase +from panda3d.core import NodePath, TextNode +from panda3d.core import PointLight, AmbientLight +from direct.gui.OnscreenText import OnscreenText +from direct.showbase.DirectObject import DirectObject +from direct.interval.SoundInterval import SoundInterval +from direct.gui.DirectSlider import DirectSlider +from direct.gui.DirectButton import DirectButton +from direct.interval.MetaInterval import Parallel +from direct.interval.LerpInterval import LerpHprInterval +import sys + +# Create an instance of ShowBase, which will open a window and set up a +# scene graph and camera. +base = ShowBase() + +class MusicBox(DirectObject): + def __init__(self): + # Our standard title and instructions text + self.title = OnscreenText(text="Panda3D: Tutorial - Music Box", + parent=base.a2dBottomCenter, + pos=(0, 0.08), scale=0.08, + fg=(1, 1, 1, 1), shadow=(0, 0, 0, .5)) + self.escapeText = OnscreenText(text="ESC: Quit", parent=base.a2dTopLeft, + fg=(1, 1, 1, 1), pos=(0.06, -0.1), + align=TextNode.ALeft, scale=.05) + + # Set up the key input + self.accept('escape', sys.exit) + + # Fix the camera position + base.disableMouse() + + # Loading sounds is done in a similar way to loading other things + # Loading the main music box song + self.musicBoxSound = base.loadMusic('music/musicbox.ogg') + self.musicBoxSound.setVolume(.5) # Volume is a percentage from 0 to 1 + # 0 means loop forever, 1 (default) means + # play once. 2 or higher means play that many times + self.musicBoxSound.setLoopCount(0) + + # Set up a simple light. + self.plight = PointLight("light") + self.plight.setColor((0.7, 0.7, 0.5, 1)) + light_path = base.render.attachNewNode(self.plight) + light_path.setPos(0, 0, 20) + base.render.setLight(light_path) + + alight = AmbientLight("ambient") + alight.setColor((0.3, 0.3, 0.4, 1)) + base.render.setLight(base.render.attachNewNode(alight)) + + # Enable per-pixel lighting + base.render.setShaderAuto() + + # Sound objects do not have a pause function, just play and stop. So we will + # Use this variable to keep track of where the sound is at when it was stoped + # to impliment pausing + self.musicTime = 0 + + # Loading the open/close effect + # loadSFX and loadMusic are identical. They are often used for organization + #(loadMusic is used for background music, loadSfx is used for other effects) + self.lidSfx = base.loadSfx('music/openclose.ogg') + # The open/close file has both effects in it. Fortunatly we can use intervals + # to easily define parts of a sound file to play + self.lidOpenSfx = SoundInterval(self.lidSfx, duration=2, startTime=0) + self.lidCloseSfx = SoundInterval(self.lidSfx, startTime=5) + + # For this tutorial, it seemed appropriate to have on screen controls. + # The following code creates them. + # This is a label for a slider + self.sliderText = OnscreenText("Volume", pos=(-0.1, 0.87), scale=.07, + fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1)) + # The slider itself. It calls self.setMusicBoxVolume when changed + self.slider = DirectSlider(pos=(-0.1, 0, .75), scale=0.8, value=.50, + command=self.setMusicBoxVolume) + # A button that calls self.toggleMusicBox when pressed + self.button = DirectButton(pos=(.9, 0, .75), text="Open", + scale=.1, pad=(.2, .2), + rolloverSound=None, clickSound=None, + command=self.toggleMusicBox) + + # A variable to represent the state of the simulation. It starts closed + self.boxOpen = False + + # Here we load and set up the music box. It was modeled in a complex way, so + # setting it up will be complicated + self.musicBox = loader.loadModel('models/MusicBox') + self.musicBox.setPos(0, 60, -9) + self.musicBox.reparentTo(render) + # Just like the scene graph contains hierarchies of nodes, so can + # models. You can get the NodePath for the node using the find + # function, and then you can animate the model by moving its parts + # To see the hierarchy of a model, use, the ls function + # self.musicBox.ls() prints out the entire hierarchy of the model + + # Finding pieces of the model + self.Lid = self.musicBox.find('**/lid') + self.Panda = self.musicBox.find('**/turningthing') + + # This model was made with the hinge in the wrong place + # this is here so we have something to turn + self.HingeNode = self.musicBox.find( + '**/box').attachNewNode('nHingeNode') + self.HingeNode.setPos(.8659, 6.5, 5.4) + # WRT - ie with respect to. Reparents the object without changing + # its position, size, or orientation + self.Lid.wrtReparentTo(self.HingeNode) + self.HingeNode.setHpr(0, 90, 0) + + # This sets up an interval to play the close sound and actually close the box + # at the same time. + self.lidClose = Parallel( + self.lidCloseSfx, + LerpHprInterval(self.HingeNode, 2.0, (0, 90, 0), blendType='easeInOut')) + + # Same thing for opening the box + self.lidOpen = Parallel( + self.lidOpenSfx, + LerpHprInterval(self.HingeNode, 2.0, (0, 0, 0), blendType='easeInOut')) + + # The interval for turning the panda + self.PandaTurn = self.Panda.hprInterval(7, (360, 0, 0)) + # Do a quick loop and pause to set it as a looping interval so it can be + # started with resume and loop properly + self.PandaTurn.loop() + self.PandaTurn.pause() + + def setMusicBoxVolume(self): + # Simply reads the current value from the slider and sets it in the + # sound + newVol = self.slider.guiItem.getValue() + self.musicBoxSound.setVolume(newVol) + + def toggleMusicBox(self): + #if self.lidOpen.isPlaying() or self.lidClose.isPlaying(): + # # It's currently already opening or closing + # return + + if self.boxOpen: + self.lidOpen.pause() + + self.lidClose.start() # Start the close box interval + self.PandaTurn.pause() # Pause the figurine turning + # Save the current time of the music + self.musicTime = self.musicBoxSound.getTime() + self.musicBoxSound.stop() # Stop the music + self.button['text'] = "Open" # Prepare to change button label + else: + self.lidClose.pause() + + self.lidOpen.start() # Start the open box interval + self.PandaTurn.resume() # Resume the figuring turning + # Reset the time of the music so it starts where it left off + self.musicBoxSound.setTime(self.musicTime) + self.musicBoxSound.play() # Play the music + self.button['text'] = "Close" # Prepare to change button label + + self.button.setText() # Actually change the button label + # Set our state to opposite what it was + self.boxOpen = not self.boxOpen + #(closed to open or open to closed) + +# and we can run! +mb = MusicBox() +base.run() diff --git a/samples/music-box/models/MusicBox.egg.pz b/samples/music-box/models/MusicBox.egg.pz new file mode 100644 index 0000000000..9eac077186 Binary files /dev/null and b/samples/music-box/models/MusicBox.egg.pz differ diff --git a/samples/music-box/models/box.jpg b/samples/music-box/models/box.jpg new file mode 100644 index 0000000000..4e713dd1bc Binary files /dev/null and b/samples/music-box/models/box.jpg differ diff --git a/samples/music-box/models/panda.jpg b/samples/music-box/models/panda.jpg new file mode 100644 index 0000000000..df6459280a Binary files /dev/null and b/samples/music-box/models/panda.jpg differ diff --git a/samples/music-box/music/musicbox.ogg b/samples/music-box/music/musicbox.ogg new file mode 100755 index 0000000000..cc6b062490 Binary files /dev/null and b/samples/music-box/music/musicbox.ogg differ diff --git a/samples/music-box/music/openclose.ogg b/samples/music-box/music/openclose.ogg new file mode 100644 index 0000000000..46c2bb69ac Binary files /dev/null and b/samples/music-box/music/openclose.ogg differ diff --git a/samples/particles/dust.png b/samples/particles/dust.png new file mode 100644 index 0000000000..2379566221 Binary files /dev/null and b/samples/particles/dust.png differ diff --git a/samples/particles/dust.ptf b/samples/particles/dust.ptf new file mode 100644 index 0000000000..908b56ea08 --- /dev/null +++ b/samples/particles/dust.ptf @@ -0,0 +1,54 @@ + +self.reset() +self.setPos(0.000, 0.000, 0.000) +self.setHpr(0.000, 0.000, 0.000) +self.setScale(1.000, 1.000, 1.000) +p0 = Particles.Particles('particles-1') +# Particles parameters +p0.setFactory("PointParticleFactory") +p0.setRenderer("SpriteParticleRenderer") +p0.setEmitter("SphereVolumeEmitter") +p0.setPoolSize(10000) +p0.setBirthRate(0.0500) +p0.setLitterSize(10) +p0.setLitterSpread(0) +p0.setSystemLifespan(0.0000) +p0.setLocalVelocityFlag(1) +p0.setSystemGrowsOlderFlag(0) +# Factory parameters +p0.factory.setLifespanBase(2.0000) +p0.factory.setLifespanSpread(0.2500) +p0.factory.setMassBase(2.0000) +p0.factory.setMassSpread(0.0100) +p0.factory.setTerminalVelocityBase(400.0000) +p0.factory.setTerminalVelocitySpread(0.0000) +# Point factory parameters +# Renderer parameters +p0.renderer.setAlphaMode(BaseParticleRenderer.PRALPHAOUT) +p0.renderer.setUserAlpha(0.07) +# Sprite parameters +p0.renderer.setTexture(loader.loadTexture('dust.png')) +p0.renderer.setColor(LVector4(1.00, 1.00, 1.00, 1.00)) +p0.renderer.setXScaleFlag(0) +p0.renderer.setYScaleFlag(0) +p0.renderer.setAnimAngleFlag(0) +p0.renderer.setInitialXScale(0.0100) +p0.renderer.setFinalXScale(0.0200) +p0.renderer.setInitialYScale(0.0100) +p0.renderer.setFinalYScale(0.0200) +p0.renderer.setNonanimatedTheta(0.0000) +p0.renderer.setAlphaBlendMethod(BaseParticleRenderer.PPBLENDLINEAR) +p0.renderer.setAlphaDisable(0) +# Emitter parameters +p0.emitter.setEmissionType(BaseParticleEmitter.ETRADIATE) +p0.emitter.setAmplitude(1.0000) +p0.emitter.setAmplitudeSpread(0.0000) +p0.emitter.setOffsetForce(LVector3(0.0000, 0.0000, 0.0000)) +p0.emitter.setExplicitLaunchVector(LVector3(1.0000, 0.0000, 0.0000)) +p0.emitter.setRadiateOrigin(LPoint3(0.0000, 0.0000, 0.0000)) +# Sphere Volume parameters +p0.emitter.setRadius(0.1000) +self.addParticles(p0) +f0 = ForceGroup.ForceGroup('gravity') +# Force parameters +self.addForceGroup(f0) diff --git a/samples/particles/fireish.ptf b/samples/particles/fireish.ptf new file mode 100644 index 0000000000..3e0ba4a631 --- /dev/null +++ b/samples/particles/fireish.ptf @@ -0,0 +1,51 @@ + +self.reset() +self.setPos(0.000, 0.000, 0.000) +self.setHpr(0.000, 0.000, 0.000) +self.setScale(1.000, 1.000, 1.000) +p0 = Particles.Particles('particles-1') +# Particles parameters +p0.setFactory("PointParticleFactory") +p0.setRenderer("SpriteParticleRenderer") +p0.setEmitter("DiscEmitter") +p0.setPoolSize(1024) +p0.setBirthRate(0.0200) +p0.setLitterSize(10) +p0.setLitterSpread(0) +p0.setSystemLifespan(1200.0000) +p0.setLocalVelocityFlag(1) +p0.setSystemGrowsOlderFlag(0) +# Factory parameters +p0.factory.setLifespanBase(0.5000) +p0.factory.setLifespanSpread(0.0000) +p0.factory.setMassBase(1.0000) +p0.factory.setMassSpread(0.0000) +p0.factory.setTerminalVelocityBase(400.0000) +p0.factory.setTerminalVelocitySpread(0.0000) +# Point factory parameters +# Renderer parameters +p0.renderer.setAlphaMode(BaseParticleRenderer.PRALPHAOUT) +p0.renderer.setUserAlpha(0.22) +# Sprite parameters +p0.renderer.setTexture(loader.loadTexture('sparkle.png')) +p0.renderer.setColor(LVector4(1.00, 1.00, 1.00, 1.00)) +p0.renderer.setXScaleFlag(1) +p0.renderer.setYScaleFlag(1) +p0.renderer.setAnimAngleFlag(0) +p0.renderer.setInitialXScale(0.0050) +p0.renderer.setFinalXScale(0.0200) +p0.renderer.setInitialYScale(0.0100) +p0.renderer.setFinalYScale(0.0200) +p0.renderer.setNonanimatedTheta(0.0000) +p0.renderer.setAlphaBlendMethod(BaseParticleRenderer.PPNOBLEND) +p0.renderer.setAlphaDisable(0) +# Emitter parameters +p0.emitter.setEmissionType(BaseParticleEmitter.ETRADIATE) +p0.emitter.setAmplitude(1.0000) +p0.emitter.setAmplitudeSpread(0.0000) +p0.emitter.setOffsetForce(LVector3(0.0000, 0.0000, 3.0000)) +p0.emitter.setExplicitLaunchVector(LVector3(1.0000, 0.0000, 0.0000)) +p0.emitter.setRadiateOrigin(LPoint3(0.0000, 0.0000, 0.0000)) +# Disc parameters +p0.emitter.setRadius(0.5000) +self.addParticles(p0) diff --git a/samples/particles/fountain.ptf b/samples/particles/fountain.ptf new file mode 100644 index 0000000000..19efa0bdc0 --- /dev/null +++ b/samples/particles/fountain.ptf @@ -0,0 +1,58 @@ + +self.reset() +self.setPos(0.000, 0.000, 0.000) +self.setHpr(0.000, 0.000, 0.000) +self.setScale(2.000, 2.000, 2.000) +p0 = Particles.Particles('particles-1') +# Particles parameters +p0.setFactory("PointParticleFactory") +p0.setRenderer("PointParticleRenderer") +p0.setEmitter("DiscEmitter") +p0.setPoolSize(10000) +p0.setBirthRate(0.0200) +p0.setLitterSize(300) +p0.setLitterSpread(100) +p0.setSystemLifespan(0.0000) +p0.setLocalVelocityFlag(1) +p0.setSystemGrowsOlderFlag(0) +# Factory parameters +p0.factory.setLifespanBase(0.5000) +p0.factory.setLifespanSpread(0.2500) +p0.factory.setMassBase(2.0000) +p0.factory.setMassSpread(0.0100) +p0.factory.setTerminalVelocityBase(400.0000) +p0.factory.setTerminalVelocitySpread(0.0000) +# Point factory parameters +# Renderer parameters +p0.renderer.setAlphaMode(BaseParticleRenderer.PRALPHAOUT) +p0.renderer.setUserAlpha(0.45) +# Point parameters +p0.renderer.setPointSize(3.00) +p0.renderer.setStartColor(LVector4(0.25, 0.90, 1.00, 1.00)) +p0.renderer.setEndColor(LVector4(1.00, 1.00, 1.00, 1.00)) +p0.renderer.setBlendType(PointParticleRenderer.PPONECOLOR) +p0.renderer.setBlendMethod(BaseParticleRenderer.PPNOBLEND) +# Emitter parameters +p0.emitter.setEmissionType(BaseParticleEmitter.ETCUSTOM) +p0.emitter.setAmplitude(1.0000) +p0.emitter.setAmplitudeSpread(0.0000) +p0.emitter.setOffsetForce(LVector3(0.0000, 0.0000, 4.0000)) +p0.emitter.setExplicitLaunchVector(LVector3(1.0000, 0.0000, 0.0000)) +p0.emitter.setRadiateOrigin(LPoint3(0.0000, 0.0000, 0.0000)) +# Disc parameters +p0.emitter.setRadius(0.0500) +p0.emitter.setOuterAngle(356.1859) +p0.emitter.setInnerAngle(0.0000) +p0.emitter.setOuterMagnitude(2.0000) +p0.emitter.setInnerMagnitude(1.0000) +p0.emitter.setCubicLerping(0) +self.addParticles(p0) +f0 = ForceGroup.ForceGroup('gravity') +# Force parameters +force0 = LinearVectorForce(LVector3(0.0000, 0.0000, -1.0000), 25.0000, 1) +force0.setActive(1) +f0.addForce(force0) +force1 = LinearJitterForce(3.0000, 1) +force1.setActive(1) +f0.addForce(force1) +self.addForceGroup(f0) diff --git a/samples/particles/particle_panel.py b/samples/particles/particle_panel.py new file mode 100755 index 0000000000..d74e42155c --- /dev/null +++ b/samples/particles/particle_panel.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +# Author: Shao Zhang, Phil Saltzman +# Last Updated: 2015-03-13 +# +# This file contians the minimum code needed to load the particle panel tool +# See readme.txt for more information + +import sys +try: + import _tkinter +except: + sys.exit("Please install python module 'Tkinter'") + +try: + import Pmw +except: + sys.exit("Please install Python megawidgets") + +# Open the Panda window +from direct.showbase.ShowBase import ShowBase +base = ShowBase() + +# Makes sure that Panda is configured to play nice with Tkinter +base.startTk() + +from direct.tkpanels.ParticlePanel import ParticlePanel + +pp = ParticlePanel() # Create the panel +base.disableMouse() # Disable camera control to place it +base.camera.setY(-10) # Place the camera +base.setBackgroundColor(0, 0, 0) # Most particle systems show up better on black backgrounds +base.run() diff --git a/samples/particles/smoke.png b/samples/particles/smoke.png new file mode 100644 index 0000000000..2d4cbfbc1e Binary files /dev/null and b/samples/particles/smoke.png differ diff --git a/samples/particles/smoke.ptf b/samples/particles/smoke.ptf new file mode 100644 index 0000000000..3972c60499 --- /dev/null +++ b/samples/particles/smoke.ptf @@ -0,0 +1,54 @@ + +self.reset() +self.setPos(0.000, 0.000, 0.000) +self.setHpr(0.000, 0.000, 0.000) +self.setScale(1.000, 1.000, 1.000) +p0 = Particles.Particles('particles-1') +# Particles parameters +p0.setFactory("PointParticleFactory") +p0.setRenderer("SpriteParticleRenderer") +p0.setEmitter("SphereSurfaceEmitter") +p0.setPoolSize(10000) +p0.setBirthRate(0.0500) +p0.setLitterSize(10) +p0.setLitterSpread(0) +p0.setSystemLifespan(0.0000) +p0.setLocalVelocityFlag(1) +p0.setSystemGrowsOlderFlag(0) +# Factory parameters +p0.factory.setLifespanBase(2.0000) +p0.factory.setLifespanSpread(0.2500) +p0.factory.setMassBase(2.0000) +p0.factory.setMassSpread(0.0100) +p0.factory.setTerminalVelocityBase(400.0000) +p0.factory.setTerminalVelocitySpread(0.0000) +# Point factory parameters +# Renderer parameters +p0.renderer.setAlphaMode(BaseParticleRenderer.PRALPHAOUT) +p0.renderer.setUserAlpha(0.13) +# Sprite parameters +p0.renderer.setTexture(loader.loadTexture('smoke.png')) +p0.renderer.setColor(LVector4(1.00, 1.00, 1.00, 1.00)) +p0.renderer.setXScaleFlag(0) +p0.renderer.setYScaleFlag(0) +p0.renderer.setAnimAngleFlag(0) +p0.renderer.setInitialXScale(0.0100) +p0.renderer.setFinalXScale(0.0200) +p0.renderer.setInitialYScale(0.0100) +p0.renderer.setFinalYScale(0.0200) +p0.renderer.setNonanimatedTheta(0.0000) +p0.renderer.setAlphaBlendMethod(BaseParticleRenderer.PPBLENDLINEAR) +p0.renderer.setAlphaDisable(0) +# Emitter parameters +p0.emitter.setEmissionType(BaseParticleEmitter.ETRADIATE) +p0.emitter.setAmplitude(1.0000) +p0.emitter.setAmplitudeSpread(0.0000) +p0.emitter.setOffsetForce(LVector3(0.0000, 0.0000, 0.0000)) +p0.emitter.setExplicitLaunchVector(LVector3(1.0000, 0.0000, 0.0000)) +p0.emitter.setRadiateOrigin(LPoint3(0.0000, 0.0000, 0.0000)) +# Sphere Surface parameters +p0.emitter.setRadius(0.0100) +self.addParticles(p0) +f0 = ForceGroup.ForceGroup('gravity') +# Force parameters +self.addForceGroup(f0) diff --git a/samples/particles/smokering.ptf b/samples/particles/smokering.ptf new file mode 100644 index 0000000000..d679afa929 --- /dev/null +++ b/samples/particles/smokering.ptf @@ -0,0 +1,60 @@ + +self.reset() +self.setPos(0.000, 0.000, 0.000) +self.setHpr(0.000, 0.000, 0.000) +self.setScale(1.000, 1.000, 1.000) +p0 = Particles.Particles('particles-1') +# Particles parameters +p0.setFactory("PointParticleFactory") +p0.setRenderer("SpriteParticleRenderer") +p0.setEmitter("DiscEmitter") +p0.setPoolSize(1024) +p0.setBirthRate(0.0200) +p0.setLitterSize(10) +p0.setLitterSpread(0) +p0.setSystemLifespan(1200.0000) +p0.setLocalVelocityFlag(1) +p0.setSystemGrowsOlderFlag(0) +# Factory parameters +p0.factory.setLifespanBase(10.0000) +p0.factory.setLifespanSpread(0.0000) +p0.factory.setMassBase(1.0000) +p0.factory.setMassSpread(0.0000) +p0.factory.setTerminalVelocityBase(400.0000) +p0.factory.setTerminalVelocitySpread(0.0000) +# Point factory parameters +# Renderer parameters +p0.renderer.setAlphaMode(BaseParticleRenderer.PRALPHAOUT) +p0.renderer.setUserAlpha(0.10) +# Sprite parameters +p0.renderer.setTexture(loader.loadTexture('smoke.png')) +p0.renderer.setColor(LVector4(1.00, 1.00, 1.00, 1.00)) +p0.renderer.setXScaleFlag(1) +p0.renderer.setYScaleFlag(1) +p0.renderer.setAnimAngleFlag(0) +p0.renderer.setInitialXScale(0.0050) +p0.renderer.setFinalXScale(0.0400) +p0.renderer.setInitialYScale(0.0100) +p0.renderer.setFinalYScale(0.0400) +p0.renderer.setNonanimatedTheta(0.0000) +p0.renderer.setAlphaBlendMethod(BaseParticleRenderer.PPNOBLEND) +p0.renderer.setAlphaDisable(0) +# Emitter parameters +p0.emitter.setEmissionType(BaseParticleEmitter.ETRADIATE) +p0.emitter.setAmplitude(1.0000) +p0.emitter.setAmplitudeSpread(0.0000) +p0.emitter.setOffsetForce(LVector3(0.1000, 0.0000, 0.1000)) +p0.emitter.setExplicitLaunchVector(LVector3(1.0000, 0.0000, 0.0000)) +p0.emitter.setRadiateOrigin(LPoint3(0.0000, 0.0000, 0.0000)) +# Disc parameters +p0.emitter.setRadius(0.5000) +self.addParticles(p0) +f0 = ForceGroup.ForceGroup('vertex') +# Force parameters +force0 = LinearCylinderVortexForce(4.0000, 1.0000, 1.0000, 1.0000, 0) +force0.setActive(1) +f0.addForce(force0) +force1 = LinearVectorForce(LVector3(0.0000, 0.0000, 1.0000), 0.0500, 0) +force1.setActive(1) +f0.addForce(force1) +self.addForceGroup(f0) diff --git a/samples/particles/sparkle.png b/samples/particles/sparkle.png new file mode 100644 index 0000000000..5f6cde1802 Binary files /dev/null and b/samples/particles/sparkle.png differ diff --git a/samples/particles/steam.png b/samples/particles/steam.png new file mode 100644 index 0000000000..bef6c043b1 Binary files /dev/null and b/samples/particles/steam.png differ diff --git a/samples/particles/steam.ptf b/samples/particles/steam.ptf new file mode 100644 index 0000000000..2fe6b63d0f --- /dev/null +++ b/samples/particles/steam.ptf @@ -0,0 +1,57 @@ + +self.reset() +self.setPos(0.000, 0.000, 0.000) +self.setHpr(0.000, 0.000, 0.000) +self.setScale(1.000, 1.000, 1.000) +p0 = Particles.Particles('particles-1') +# Particles parameters +p0.setFactory("PointParticleFactory") +p0.setRenderer("SpriteParticleRenderer") +p0.setEmitter("DiscEmitter") +p0.setPoolSize(10000) +p0.setBirthRate(0.2500) +p0.setLitterSize(20) +p0.setLitterSpread(0) +p0.setSystemLifespan(0.0000) +p0.setLocalVelocityFlag(1) +p0.setSystemGrowsOlderFlag(0) +# Factory parameters +p0.factory.setLifespanBase(8.0000) +p0.factory.setLifespanSpread(0.0000) +p0.factory.setMassBase(1.0000) +p0.factory.setMassSpread(0.0000) +p0.factory.setTerminalVelocityBase(400.0000) +p0.factory.setTerminalVelocitySpread(0.0000) +# Point factory parameters +# Renderer parameters +p0.renderer.setAlphaMode(BaseParticleRenderer.PRALPHAOUT) +p0.renderer.setUserAlpha(0.10) +# Sprite parameters +p0.renderer.setTexture(loader.loadTexture('steam.png')) +p0.renderer.setColor(LVector4(1.00, 1.00, 1.00, 1.00)) +p0.renderer.setXScaleFlag(1) +p0.renderer.setYScaleFlag(1) +p0.renderer.setAnimAngleFlag(0) +p0.renderer.setInitialXScale(0.0025) +p0.renderer.setFinalXScale(0.0400) +p0.renderer.setInitialYScale(0.0025) +p0.renderer.setFinalYScale(0.0400) +p0.renderer.setNonanimatedTheta(0.0000) +p0.renderer.setAlphaBlendMethod(BaseParticleRenderer.PPNOBLEND) +p0.renderer.setAlphaDisable(0) +# Emitter parameters +p0.emitter.setEmissionType(BaseParticleEmitter.ETEXPLICIT) +p0.emitter.setAmplitude(1.0000) +p0.emitter.setAmplitudeSpread(0.7500) +p0.emitter.setOffsetForce(LVector3(0.0000, 0.0000, 1.0000)) +p0.emitter.setExplicitLaunchVector(LVector3(0.0000, 0.0000, 0.0000)) +p0.emitter.setRadiateOrigin(LPoint3(0.0000, 0.0000, 0.0000)) +# Disc parameters +p0.emitter.setRadius(0.5000) +self.addParticles(p0) +f0 = ForceGroup.ForceGroup('vertex') +# Force parameters +force0 = LinearNoiseForce(0.1500, 0) +force0.setActive(1) +f0.addForce(force0) +self.addForceGroup(f0) diff --git a/samples/particles/steam_example.py b/samples/particles/steam_example.py new file mode 100755 index 0000000000..4a003f5ab0 --- /dev/null +++ b/samples/particles/steam_example.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python + +# Author: Shao Zhang and Phil Saltzman +# Last Updated: 2015-03-13 +# +# This tutorial shows how to take an existing particle effect taken from a +# .ptf file and run it in a general Panda project. + +from direct.showbase.ShowBase import ShowBase +from panda3d.core import TextNode +from panda3d.core import AmbientLight, DirectionalLight +from panda3d.core import LPoint3, LVector3 +from panda3d.core import Filename +from panda3d.physics import BaseParticleEmitter, BaseParticleRenderer +from panda3d.physics import PointParticleFactory, SpriteParticleRenderer +from panda3d.physics import LinearNoiseForce, DiscEmitter +from direct.particles.Particles import Particles +from direct.particles.ParticleEffect import ParticleEffect +from direct.particles.ForceGroup import ForceGroup +from direct.gui.OnscreenText import OnscreenText +import sys + +HELP_TEXT = """ +1: Load Steam +2: Load Dust +3: Load Fountain +4: Load Smoke +5: Load Smokering +6: Load Fireish +ESC: Quit +""" + +class ParticleDemo(ShowBase): + + def __init__(self): + ShowBase.__init__(self) + + # Standard title and instruction text + self.title = OnscreenText( + text="Panda3D: Tutorial - Particles", + parent=base.a2dBottomCenter, + style=1, fg=(1, 1, 1, 1), pos=(0, 0.1), scale=.08) + self.escapeEvent = OnscreenText( + text=HELP_TEXT, parent=base.a2dTopLeft, + style=1, fg=(1, 1, 1, 1), pos=(0.06, -0.06), + align=TextNode.ALeft, scale=.05) + + # More standard initialization + self.accept('escape', sys.exit) + self.accept('1', self.loadParticleConfig, ['steam.ptf']) + self.accept('2', self.loadParticleConfig, ['dust.ptf']) + self.accept('3', self.loadParticleConfig, ['fountain.ptf']) + self.accept('4', self.loadParticleConfig, ['smoke.ptf']) + self.accept('5', self.loadParticleConfig, ['smokering.ptf']) + self.accept('6', self.loadParticleConfig, ['fireish.ptf']) + + self.accept('escape', sys.exit) + base.disableMouse() + base.camera.setPos(0, -20, 2) + base.camLens.setFov(25) + base.setBackgroundColor(0, 0, 0) + + # This command is required for Panda to render particles + base.enableParticles() + self.t = loader.loadModel("teapot") + self.t.setPos(0, 10, 0) + self.t.reparentTo(render) + self.setupLights() + self.p = ParticleEffect() + self.loadParticleConfig('steam.ptf') + + def loadParticleConfig(self, filename): + # Start of the code from steam.ptf + self.p.cleanup() + self.p = ParticleEffect() + self.p.loadConfig(Filename(filename)) + # Sets particles to birth relative to the teapot, but to render at + # toplevel + self.p.start(self.t) + self.p.setPos(3.000, 0.000, 2.250) + + # Setup lighting + def setupLights(self): + ambientLight = AmbientLight("ambientLight") + ambientLight.setColor((.4, .4, .35, 1)) + directionalLight = DirectionalLight("directionalLight") + directionalLight.setDirection(LVector3(0, 8, -2.5)) + directionalLight.setColor((0.9, 0.8, 0.9, 1)) + # Set lighting on teapot so steam doesn't get affected + self.t.setLight(self.t.attachNewNode(directionalLight)) + self.t.setLight(self.t.attachNewNode(ambientLight)) + +demo = ParticleDemo() +demo.run() diff --git a/samples/procedural-cube/main.py b/samples/procedural-cube/main.py new file mode 100755 index 0000000000..2f21cd9a0f --- /dev/null +++ b/samples/procedural-cube/main.py @@ -0,0 +1,182 @@ +#!/usr/bin/env python + +# Author: Kwasi Mensah (kmensah@andrew.cmu.edu) +# Date: 8/02/2005 +# +# This is meant to be a simple example of how to draw a cube +# using Panda's new Geom Interface. Quads arent directly supported +# since they get broken down to trianlges anyway. +# + +from direct.showbase.ShowBase import ShowBase +from direct.showbase.DirectObject import DirectObject +from direct.gui.DirectGui import * +from direct.interval.IntervalGlobal import * +from panda3d.core import lookAt +from panda3d.core import GeomVertexFormat, GeomVertexData +from panda3d.core import Geom, GeomTriangles, GeomVertexWriter +from panda3d.core import Texture, GeomNode +from panda3d.core import PerspectiveLens +from panda3d.core import CardMaker +from panda3d.core import Light, Spotlight +from panda3d.core import TextNode +from panda3d.core import LVector3 +import sys +import os + +base = ShowBase() +base.disableMouse() +base.camera.setPos(0, -10, 0) + +title = OnscreenText(text="Panda3D: Tutorial - Making a Cube Procedurally", + style=1, fg=(1, 1, 1, 1), pos=(-0.1, 0.1), scale=.07, + parent=base.a2dBottomRight, align=TextNode.ARight) +escapeEvent = OnscreenText(text="1: Set a Texture onto the Cube", + style=1, fg=(1, 1, 1, 1), pos=(0.06, -0.08), + align=TextNode.ALeft, scale=.05, + parent=base.a2dTopLeft) +spaceEvent = OnscreenText(text="2: Toggle Light from the front On/Off", + style=1, fg=(1, 1, 1, 1), pos=(0.06, -0.14), + align=TextNode.ALeft, scale=.05, + parent=base.a2dTopLeft) +upDownEvent = OnscreenText(text="3: Toggle Light from on top On/Off", + style=1, fg=(1, 1, 1, 1), pos=(0.06, -0.20), + align=TextNode.ALeft, scale=.05, + parent=base.a2dTopLeft) + + +# You can't normalize inline so this is a helper function +def normalized(*args): + myVec = LVector3(*args) + myVec.normalize() + return myVec + +# helper function to make a square given the Lower-Left-Hand and +# Upper-Right-Hand corners + +def makeSquare(x1, y1, z1, x2, y2, z2): + format = GeomVertexFormat.getV3n3cpt2() + vdata = GeomVertexData('square', format, Geom.UHDynamic) + + vertex = GeomVertexWriter(vdata, 'vertex') + normal = GeomVertexWriter(vdata, 'normal') + color = GeomVertexWriter(vdata, 'color') + texcoord = GeomVertexWriter(vdata, 'texcoord') + + # make sure we draw the sqaure in the right plane + if x1 != x2: + vertex.addData3(x1, y1, z1) + vertex.addData3(x2, y1, z1) + vertex.addData3(x2, y2, z2) + vertex.addData3(x1, y2, z2) + + normal.addData3(normalized(2 * x1 - 1, 2 * y1 - 1, 2 * z1 - 1)) + normal.addData3(normalized(2 * x2 - 1, 2 * y1 - 1, 2 * z1 - 1)) + normal.addData3(normalized(2 * x2 - 1, 2 * y2 - 1, 2 * z2 - 1)) + normal.addData3(normalized(2 * x1 - 1, 2 * y2 - 1, 2 * z2 - 1)) + + else: + vertex.addData3(x1, y1, z1) + vertex.addData3(x2, y2, z1) + vertex.addData3(x2, y2, z2) + vertex.addData3(x1, y1, z2) + + normal.addData3(normalized(2 * x1 - 1, 2 * y1 - 1, 2 * z1 - 1)) + normal.addData3(normalized(2 * x2 - 1, 2 * y2 - 1, 2 * z1 - 1)) + normal.addData3(normalized(2 * x2 - 1, 2 * y2 - 1, 2 * z2 - 1)) + normal.addData3(normalized(2 * x1 - 1, 2 * y1 - 1, 2 * z2 - 1)) + + # adding different colors to the vertex for visibility + color.addData4f(1.0, 0.0, 0.0, 1.0) + color.addData4f(0.0, 1.0, 0.0, 1.0) + color.addData4f(0.0, 0.0, 1.0, 1.0) + color.addData4f(1.0, 0.0, 1.0, 1.0) + + texcoord.addData2f(0.0, 1.0) + texcoord.addData2f(0.0, 0.0) + texcoord.addData2f(1.0, 0.0) + texcoord.addData2f(1.0, 1.0) + + # Quads aren't directly supported by the Geom interface + # you might be interested in the CardMaker class if you are + # interested in rectangle though + tris = GeomTriangles(Geom.UHDynamic) + tris.addVertices(0, 1, 3) + tris.addVertices(1, 2, 3) + + square = Geom(vdata) + square.addPrimitive(tris) + return square + +# Note: it isn't particularly efficient to make every face as a separate Geom. +# instead, it would be better to create one Geom holding all of the faces. +square0 = makeSquare(-1, -1, -1, 1, -1, 1) +square1 = makeSquare(-1, 1, -1, 1, 1, 1) +square2 = makeSquare(-1, 1, 1, 1, -1, 1) +square3 = makeSquare(-1, 1, -1, 1, -1, -1) +square4 = makeSquare(-1, -1, -1, -1, 1, 1) +square5 = makeSquare(1, -1, -1, 1, 1, 1) +snode = GeomNode('square') +snode.addGeom(square0) +snode.addGeom(square1) +snode.addGeom(square2) +snode.addGeom(square3) +snode.addGeom(square4) +snode.addGeom(square5) + +cube = render.attachNewNode(snode) +cube.hprInterval(1.5, (360, 360, 360)).loop() + +# OpenGl by default only draws "front faces" (polygons whose vertices are +# specified CCW). +cube.setTwoSided(True) + + +class MyTapper(DirectObject): + + def __init__(self): + self.testTexture = loader.loadTexture("maps/envir-reeds.png") + self.accept("1", self.toggleTex) + self.accept("2", self.toggleLightsSide) + self.accept("3", self.toggleLightsUp) + + self.LightsOn = False + self.LightsOn1 = False + slight = Spotlight('slight') + slight.setColor((1, 1, 1, 1)) + lens = PerspectiveLens() + slight.setLens(lens) + self.slnp = render.attachNewNode(slight) + self.slnp1 = render.attachNewNode(slight) + + def toggleTex(self): + global cube + if cube.hasTexture(): + cube.setTextureOff(1) + else: + cube.setTexture(self.testTexture) + + def toggleLightsSide(self): + global cube + self.LightsOn = not self.LightsOn + + if self.LightsOn: + render.setLight(self.slnp) + self.slnp.setPos(cube, 10, -400, 0) + self.slnp.lookAt(10, 0, 0) + else: + render.setLightOff(self.slnp) + + def toggleLightsUp(self): + global cube + self.LightsOn1 = not self.LightsOn1 + + if self.LightsOn1: + render.setLight(self.slnp1) + self.slnp1.setPos(cube, 10, 0, 400) + self.slnp1.lookAt(10, 0, 0) + else: + render.setLightOff(self.slnp1) + +t = MyTapper() +base.run() diff --git a/samples/render-to-texture/main.py b/samples/render-to-texture/main.py new file mode 100755 index 0000000000..ec6836bb4d --- /dev/null +++ b/samples/render-to-texture/main.py @@ -0,0 +1,124 @@ +#!/usr/bin/env python + +from direct.showbase.ShowBase import ShowBase +from panda3d.core import Filename, Texture +from panda3d.core import AmbientLight, DirectionalLight, PointLight +from panda3d.core import NodePath, TextNode +from direct.task.Task import Task +from direct.actor.Actor import Actor +from direct.gui.OnscreenText import OnscreenText +import sys +import os +import random + +# Function to put instructions on the screen. +def addInstructions(pos, msg): + return OnscreenText(text=msg, style=1, fg=(1, 1, 1, 1), scale=.05, + shadow=(0, 0, 0, 1), parent=base.a2dTopLeft, + pos=(0.08, -pos - 0.04), align=TextNode.ALeft) + +# Function to put title on the screen. +def addTitle(text): + return OnscreenText(text=text, style=1, fg=(1, 1, 1, 1), scale=.08, + parent=base.a2dBottomRight, align=TextNode.ARight, + pos=(-0.1, 0.09), shadow=(0, 0, 0, 1)) + +random.seed() + +class TeapotOnTVDemo(ShowBase): + + def __init__(self): + ShowBase.__init__(self) + self.disableMouse() + self.setBackgroundColor((0, 0, 0, 1)) + + # Post the instructions. + self.title = addTitle("Panda3D: Tutorial - Using Render-to-Texture") + self.inst1 = addInstructions(0.06, "ESC: Quit") + self.inst2 = addInstructions(0.12, "Up/Down: Zoom in/out on the Teapot") + self.inst3 = addInstructions(0.18, "Left/Right: Move teapot left/right") + self.inst4 = addInstructions(0.24, "V: View the render-to-texture results") + + # we now get buffer thats going to hold the texture of our new scene + altBuffer = self.win.makeTextureBuffer("hello", 256, 256) + + # now we have to setup a new scene graph to make this scene + altRender = NodePath("new render") + + # this takes care of setting up ther camera properly + self.altCam = self.makeCamera(altBuffer) + self.altCam.reparentTo(altRender) + self.altCam.setPos(0, -10, 0) + + # get the teapot and rotates it for a simple animation + self.teapot = loader.loadModel('teapot') + self.teapot.reparentTo(altRender) + self.teapot.setPos(0, 0, -1) + self.teapot.hprInterval(1.5, (360, 360, 360)).loop() + + # put some lighting on the teapot + dlight = DirectionalLight('dlight') + alight = AmbientLight('alight') + dlnp = altRender.attachNewNode(dlight) + alnp = altRender.attachNewNode(alight) + dlight.setColor((0.8, 0.8, 0.5, 1)) + alight.setColor((0.2, 0.2, 0.2, 1)) + dlnp.setHpr(0, -60, 0) + altRender.setLight(dlnp) + altRender.setLight(alnp) + + # Put lighting on the main scene + plight = PointLight('plight') + plnp = render.attachNewNode(plight) + plnp.setPos(0, 0, 10) + render.setLight(plnp) + render.setLight(alnp) + + # Panda contains a built-in viewer that lets you view the results of + # your render-to-texture operations. This code configures the viewer. + + self.accept("v", self.bufferViewer.toggleEnable) + self.accept("V", self.bufferViewer.toggleEnable) + self.bufferViewer.setPosition("llcorner") + self.bufferViewer.setCardSize(1.0, 0.0) + + # Create the tv-men. Each TV-man will display the + # offscreen-texture on his TV screen. + self.tvMen = [] + self.makeTvMan(-5, 30, 1, altBuffer.getTexture(), 0.9) + self.makeTvMan(5, 30, 1, altBuffer.getTexture(), 1.4) + self.makeTvMan(0, 23, -3, altBuffer.getTexture(), 2.0) + self.makeTvMan(-5, 20, -6, altBuffer.getTexture(), 1.1) + self.makeTvMan(5, 18, -5, altBuffer.getTexture(), 1.7) + + self.accept("escape", sys.exit, [0]) + self.accept("arrow_up", self.zoomIn) + self.accept("arrow_down", self.zoomOut) + self.accept("arrow_left", self.moveLeft) + self.accept("arrow_right", self.moveRight) + + def makeTvMan(self, x, y, z, tex, playrate): + man = Actor() + man.loadModel('models/mechman_idle') + man.setPos(x, y, z) + man.reparentTo(render) + faceplate = man.find("**/faceplate") + faceplate.setTexture(tex, 1) + man.setPlayRate(playrate, "mechman_anim") + man.loop("mechman_anim") + self.tvMen.append(man) + + def zoomIn(self): + self.altCam.setY(self.altCam.getY() * 0.9) + + def zoomOut(self): + self.altCam.setY(self.altCam.getY() * 1.2) + + def moveLeft(self): + self.altCam.setX(self.altCam.getX() + 1) + + def moveRight(self): + self.altCam.setX(self.altCam.getX() - 1) + +demo = TeapotOnTVDemo() +demo.run() diff --git a/samples/render-to-texture/models/mechman_idle.egg.pz b/samples/render-to-texture/models/mechman_idle.egg.pz new file mode 100644 index 0000000000..5fa90b3d8e Binary files /dev/null and b/samples/render-to-texture/models/mechman_idle.egg.pz differ diff --git a/samples/render-to-texture/models/mechmanskin.jpg b/samples/render-to-texture/models/mechmanskin.jpg new file mode 100644 index 0000000000..d9160b1065 Binary files /dev/null and b/samples/render-to-texture/models/mechmanskin.jpg differ diff --git a/samples/render-to-texture/models/static.jpg b/samples/render-to-texture/models/static.jpg new file mode 100644 index 0000000000..93739eba8a Binary files /dev/null and b/samples/render-to-texture/models/static.jpg differ diff --git a/samples/roaming-ralph/main.py b/samples/roaming-ralph/main.py new file mode 100755 index 0000000000..0290c3e74b --- /dev/null +++ b/samples/roaming-ralph/main.py @@ -0,0 +1,262 @@ +#!/usr/bin/env python + +# Author: Ryan Myers +# Models: Jeff Styers, Reagan Heller +# +# Last Updated: 2015-03-13 +# +# This tutorial provides an example of creating a character +# and having it walk around on uneven terrain, as well +# as implementing a fully rotatable camera. + +from direct.showbase.ShowBase import ShowBase +from panda3d.core import CollisionTraverser, CollisionNode +from panda3d.core import CollisionHandlerQueue, CollisionRay +from panda3d.core import Filename, AmbientLight, DirectionalLight +from panda3d.core import PandaNode, NodePath, Camera, TextNode +from panda3d.core import CollideMask +from direct.gui.OnscreenText import OnscreenText +from direct.actor.Actor import Actor +import random +import sys +import os +import math + +# Function to put instructions on the screen. +def addInstructions(pos, msg): + return OnscreenText(text=msg, style=1, fg=(1, 1, 1, 1), scale=.05, + shadow=(0, 0, 0, 1), parent=base.a2dTopLeft, + pos=(0.08, -pos - 0.04), align=TextNode.ALeft) + +# Function to put title on the screen. +def addTitle(text): + return OnscreenText(text=text, style=1, fg=(1, 1, 1, 1), scale=.07, + parent=base.a2dBottomRight, align=TextNode.ARight, + pos=(-0.1, 0.09), shadow=(0, 0, 0, 1)) + + +class RoamingRalphDemo(ShowBase): + def __init__(self): + # Set up the window, camera, etc. + ShowBase.__init__(self) + + # Set the background color to black + self.win.setClearColor((0, 0, 0, 1)) + + # This is used to store which keys are currently pressed. + self.keyMap = { + "left": 0, "right": 0, "forward": 0, "cam-left": 0, "cam-right": 0} + + # Post the instructions + self.title = addTitle( + "Panda3D Tutorial: Roaming Ralph (Walking on Uneven Terrain)") + self.inst1 = addInstructions(0.06, "[ESC]: Quit") + self.inst2 = addInstructions(0.12, "[Left Arrow]: Rotate Ralph Left") + self.inst3 = addInstructions(0.18, "[Right Arrow]: Rotate Ralph Right") + self.inst4 = addInstructions(0.24, "[Up Arrow]: Run Ralph Forward") + self.inst6 = addInstructions(0.30, "[A]: Rotate Camera Left") + self.inst7 = addInstructions(0.36, "[S]: Rotate Camera Right") + + # Set up the environment + # + # This environment model contains collision meshes. If you look + # in the egg file, you will see the following: + # + # { Polyset keep descend } + # + # This tag causes the following mesh to be converted to a collision + # mesh -- a mesh which is optimized for collision, not rendering. + # It also keeps the original mesh, so there are now two copies --- + # one optimized for rendering, one for collisions. + + self.environ = loader.loadModel("models/world") + self.environ.reparentTo(render) + + # Create the main character, Ralph + + ralphStartPos = self.environ.find("**/start_point").getPos() + self.ralph = Actor("models/ralph", + {"run": "models/ralph-run", + "walk": "models/ralph-walk"}) + self.ralph.reparentTo(render) + self.ralph.setScale(.2) + self.ralph.setPos(ralphStartPos + (0, 0, 0.5)) + + # Create a floater object, which floats 2 units above ralph. We + # use this as a target for the camera to look at. + + self.floater = NodePath(PandaNode("floater")) + self.floater.reparentTo(self.ralph) + self.floater.setZ(2.0) + + # Accept the control keys for movement and rotation + + self.accept("escape", sys.exit) + self.accept("arrow_left", self.setKey, ["left", True]) + self.accept("arrow_right", self.setKey, ["right", True]) + self.accept("arrow_up", self.setKey, ["forward", True]) + self.accept("a", self.setKey, ["cam-left", True]) + self.accept("s", self.setKey, ["cam-right", True]) + self.accept("arrow_left-up", self.setKey, ["left", False]) + self.accept("arrow_right-up", self.setKey, ["right", False]) + self.accept("arrow_up-up", self.setKey, ["forward", False]) + self.accept("a-up", self.setKey, ["cam-left", False]) + self.accept("s-up", self.setKey, ["cam-right", False]) + + taskMgr.add(self.move, "moveTask") + + # Game state variables + self.isMoving = False + + # Set up the camera + self.disableMouse() + self.camera.setPos(self.ralph.getX(), self.ralph.getY() + 10, 2) + + # We will detect the height of the terrain by creating a collision + # ray and casting it downward toward the terrain. One ray will + # start above ralph's head, and the other will start above the camera. + # A ray may hit the terrain, or it may hit a rock or a tree. If it + # hits the terrain, we can detect the height. If it hits anything + # else, we rule that the move is illegal. + self.cTrav = CollisionTraverser() + + self.ralphGroundRay = CollisionRay() + self.ralphGroundRay.setOrigin(0, 0, 9) + self.ralphGroundRay.setDirection(0, 0, -1) + self.ralphGroundCol = CollisionNode('ralphRay') + self.ralphGroundCol.addSolid(self.ralphGroundRay) + self.ralphGroundCol.setFromCollideMask(CollideMask.bit(0)) + self.ralphGroundCol.setIntoCollideMask(CollideMask.allOff()) + self.ralphGroundColNp = self.ralph.attachNewNode(self.ralphGroundCol) + self.ralphGroundHandler = CollisionHandlerQueue() + self.cTrav.addCollider(self.ralphGroundColNp, self.ralphGroundHandler) + + self.camGroundRay = CollisionRay() + self.camGroundRay.setOrigin(0, 0, 9) + self.camGroundRay.setDirection(0, 0, -1) + self.camGroundCol = CollisionNode('camRay') + self.camGroundCol.addSolid(self.camGroundRay) + self.camGroundCol.setFromCollideMask(CollideMask.bit(0)) + self.camGroundCol.setIntoCollideMask(CollideMask.allOff()) + self.camGroundColNp = self.camera.attachNewNode(self.camGroundCol) + self.camGroundHandler = CollisionHandlerQueue() + self.cTrav.addCollider(self.camGroundColNp, self.camGroundHandler) + + # Uncomment this line to see the collision rays + #self.ralphGroundColNp.show() + #self.camGroundColNp.show() + + # Uncomment this line to show a visual representation of the + # collisions occuring + #self.cTrav.showCollisions(render) + + # Create some lighting + ambientLight = AmbientLight("ambientLight") + ambientLight.setColor((.3, .3, .3, 1)) + directionalLight = DirectionalLight("directionalLight") + directionalLight.setDirection((-5, -5, -5)) + directionalLight.setColor((1, 1, 1, 1)) + directionalLight.setSpecularColor((1, 1, 1, 1)) + render.setLight(render.attachNewNode(ambientLight)) + render.setLight(render.attachNewNode(directionalLight)) + + # Records the state of the arrow keys + def setKey(self, key, value): + self.keyMap[key] = value + + # Accepts arrow keys to move either the player or the menu cursor, + # Also deals with grid checking and collision detection + def move(self, task): + + # Get the time that elapsed since last frame. We multiply this with + # the desired speed in order to find out with which distance to move + # in order to achieve that desired speed. + dt = globalClock.getDt() + + # If the camera-left key is pressed, move camera left. + # If the camera-right key is pressed, move camera right. + + if self.keyMap["cam-left"]: + self.camera.setX(self.camera, -20 * dt) + if self.keyMap["cam-right"]: + self.camera.setX(self.camera, +20 * dt) + + # save ralph's initial position so that we can restore it, + # in case he falls off the map or runs into something. + + startpos = self.ralph.getPos() + + # If a move-key is pressed, move ralph in the specified direction. + + if self.keyMap["left"]: + self.ralph.setH(self.ralph.getH() + 300 * dt) + if self.keyMap["right"]: + self.ralph.setH(self.ralph.getH() - 300 * dt) + if self.keyMap["forward"]: + self.ralph.setY(self.ralph, -25 * dt) + + # If ralph is moving, loop the run animation. + # If he is standing still, stop the animation. + + if self.keyMap["forward"] or self.keyMap["left"] or self.keyMap["right"]: + if self.isMoving is False: + self.ralph.loop("run") + self.isMoving = True + else: + if self.isMoving: + self.ralph.stop() + self.ralph.pose("walk", 5) + self.isMoving = False + + # If the camera is too far from ralph, move it closer. + # If the camera is too close to ralph, move it farther. + + camvec = self.ralph.getPos() - self.camera.getPos() + camvec.setZ(0) + camdist = camvec.length() + camvec.normalize() + if camdist > 10.0: + self.camera.setPos(self.camera.getPos() + camvec * (camdist - 10)) + camdist = 10.0 + if camdist < 5.0: + self.camera.setPos(self.camera.getPos() - camvec * (5 - camdist)) + camdist = 5.0 + + # Normally, we would have to call traverse() to check for collisions. + # However, the class ShowBase that we inherit from has a task to do + # this for us, if we assign a CollisionTraverser to self.cTrav. + #self.cTrav.traverse(render) + + # Adjust ralph's Z coordinate. If ralph's ray hit terrain, + # update his Z. If it hit anything else, or didn't hit anything, put + # him back where he was last frame. + + entries = list(self.ralphGroundHandler.getEntries()) + entries.sort(key=lambda x: x.getSurfacePoint(render).getZ()) + + if len(entries) > 0 and entries[0].getIntoNode().getName() == "terrain": + self.ralph.setZ(entries[0].getSurfacePoint(render).getZ()) + else: + self.ralph.setPos(startpos) + + # Keep the camera at one foot above the terrain, + # or two feet above ralph, whichever is greater. + + entries = list(self.camGroundHandler.getEntries()) + entries.sort(key=lambda x: x.getSurfacePoint(render).getZ()) + + if len(entries) > 0 and entries[0].getIntoNode().getName() == "terrain": + self.camera.setZ(entries[0].getSurfacePoint(render).getZ() + 1.0) + if self.camera.getZ() < self.ralph.getZ() + 2.0: + self.camera.setZ(self.ralph.getZ() + 2.0) + + # The camera should look in ralph's direction, + # but it should also try to stay horizontal, so look at + # a floater which hovers above ralph's head. + self.camera.lookAt(self.floater) + + return task.cont + + +demo = RoamingRalphDemo() +demo.run() diff --git a/samples/roaming-ralph/models/ground.jpg b/samples/roaming-ralph/models/ground.jpg new file mode 100644 index 0000000000..d36aae42fd Binary files /dev/null and b/samples/roaming-ralph/models/ground.jpg differ diff --git a/samples/roaming-ralph/models/hedge.jpg b/samples/roaming-ralph/models/hedge.jpg new file mode 100644 index 0000000000..233dcbdc83 Binary files /dev/null and b/samples/roaming-ralph/models/hedge.jpg differ diff --git a/samples/roaming-ralph/models/ralph-run.egg.pz b/samples/roaming-ralph/models/ralph-run.egg.pz new file mode 100644 index 0000000000..e50ff41d24 Binary files /dev/null and b/samples/roaming-ralph/models/ralph-run.egg.pz differ diff --git a/samples/roaming-ralph/models/ralph-walk.egg.pz b/samples/roaming-ralph/models/ralph-walk.egg.pz new file mode 100644 index 0000000000..955352549c Binary files /dev/null and b/samples/roaming-ralph/models/ralph-walk.egg.pz differ diff --git a/samples/roaming-ralph/models/ralph.egg.pz b/samples/roaming-ralph/models/ralph.egg.pz new file mode 100644 index 0000000000..5749c11650 Binary files /dev/null and b/samples/roaming-ralph/models/ralph.egg.pz differ diff --git a/samples/roaming-ralph/models/ralph.jpg b/samples/roaming-ralph/models/ralph.jpg new file mode 100644 index 0000000000..198b4f5424 Binary files /dev/null and b/samples/roaming-ralph/models/ralph.jpg differ diff --git a/samples/roaming-ralph/models/rock03.jpg b/samples/roaming-ralph/models/rock03.jpg new file mode 100644 index 0000000000..8598e6de36 Binary files /dev/null and b/samples/roaming-ralph/models/rock03.jpg differ diff --git a/samples/roaming-ralph/models/tree.jpg b/samples/roaming-ralph/models/tree.jpg new file mode 100644 index 0000000000..fcdf4c73ca Binary files /dev/null and b/samples/roaming-ralph/models/tree.jpg differ diff --git a/samples/roaming-ralph/models/world.egg.pz b/samples/roaming-ralph/models/world.egg.pz new file mode 100644 index 0000000000..9ab9439f74 Binary files /dev/null and b/samples/roaming-ralph/models/world.egg.pz differ diff --git a/samples/shadows/advanced.py b/samples/shadows/advanced.py new file mode 100755 index 0000000000..6e8fbf5eb2 --- /dev/null +++ b/samples/shadows/advanced.py @@ -0,0 +1,239 @@ +#!/usr/bin/env python + +from panda3d.core import * +import sys +import os + +import direct.directbase.DirectStart +from direct.interval.IntervalGlobal import * +from direct.gui.DirectGui import OnscreenText +from direct.showbase.DirectObject import DirectObject +from direct.actor import Actor +from random import * + +# Function to put instructions on the screen. +def addInstructions(pos, msg): + return OnscreenText(text=msg, style=1, fg=(1, 1, 1, 1), scale=.05, + shadow=(0, 0, 0, 1), parent=base.a2dTopLeft, + pos=(0.08, -pos - 0.04), align=TextNode.ALeft) + +# Function to put title on the screen. +def addTitle(text): + return OnscreenText(text=text, style=1, fg=(1, 1, 1, 1), scale=.07, + parent=base.a2dBottomRight, align=TextNode.ARight, + pos=(-0.1, 0.09), shadow=(0, 0, 0, 1)) + + +class World(DirectObject): + + def __init__(self): + # Preliminary capabilities check. + + if not base.win.getGsg().getSupportsBasicShaders(): + self.t = addTitle( + "Shadow Demo: Video driver reports that shaders are not supported.") + return + if not base.win.getGsg().getSupportsDepthTexture(): + self.t = addTitle( + "Shadow Demo: Video driver reports that depth textures are not supported.") + return + + # creating the offscreen buffer. + + winprops = WindowProperties.size(512, 512) + props = FrameBufferProperties() + props.setRgbColor(1) + props.setAlphaBits(1) + props.setDepthBits(1) + LBuffer = base.graphicsEngine.makeOutput( + base.pipe, "offscreen buffer", -2, + props, winprops, + GraphicsPipe.BFRefuseWindow, + base.win.getGsg(), base.win) + + if not LBuffer: + self.t = addTitle( + "Shadow Demo: Video driver cannot create an offscreen buffer.") + return + + Ldepthmap = Texture() + LBuffer.addRenderTexture(Ldepthmap, GraphicsOutput.RTMBindOrCopy, + GraphicsOutput.RTPDepthStencil) + if base.win.getGsg().getSupportsShadowFilter(): + Ldepthmap.setMinfilter(Texture.FTShadow) + Ldepthmap.setMagfilter(Texture.FTShadow) + + # Adding a color texture is totally unnecessary, but it helps with + # debugging. + Lcolormap = Texture() + LBuffer.addRenderTexture(Lcolormap, GraphicsOutput.RTMBindOrCopy, + GraphicsOutput.RTPColor) + + self.inst_p = addInstructions(0.06, 'P : stop/start the Panda Rotation') + self.inst_w = addInstructions(0.12, 'W : stop/start the Walk Cycle') + self.inst_t = addInstructions(0.18, 'T : stop/start the Teapot') + self.inst_l = addInstructions(0.24, 'L : move light source far or close') + self.inst_v = addInstructions(0.30, 'V: View the Depth-Texture results') + self.inst_x = addInstructions(0.36, 'Left/Right Arrow : switch camera angles') + self.inst_a = addInstructions(0.42, 'Something about A/Z and push bias') + + base.setBackgroundColor(0, 0, 0.2, 1) + + base.camLens.setNearFar(1.0, 10000) + base.camLens.setFov(75) + base.disableMouse() + + # Load the scene. + + floorTex = loader.loadTexture('maps/envir-ground.jpg') + cm = CardMaker('') + cm.setFrame(-2, 2, -2, 2) + floor = render.attachNewNode(PandaNode("floor")) + for y in range(12): + for x in range(12): + nn = floor.attachNewNode(cm.generate()) + nn.setP(-90) + nn.setPos((x - 6) * 4, (y - 6) * 4, 0) + floor.setTexture(floorTex) + floor.flattenStrong() + + self.pandaAxis = render.attachNewNode('panda axis') + self.pandaModel = Actor.Actor('panda-model', {'walk': 'panda-walk4'}) + self.pandaModel.reparentTo(self.pandaAxis) + self.pandaModel.setPos(9, 0, 0) + self.pandaModel.setShaderInput("scale", 0.01, 0.01, 0.01, 1.0) + self.pandaWalk = self.pandaModel.actorInterval('walk', playRate=1.8) + self.pandaWalk.loop() + self.pandaMovement = self.pandaAxis.hprInterval( + 20.0, LPoint3(-360, 0, 0), startHpr=LPoint3(0, 0, 0)) + self.pandaMovement.loop() + + self.teapot = loader.loadModel('teapot') + self.teapot.reparentTo(render) + self.teapot.setPos(0, -20, 10) + self.teapot.setShaderInput("texDisable", 1, 1, 1, 1) + self.teapotMovement = self.teapot.hprInterval(50, LPoint3(0, 360, 360)) + self.teapotMovement.loop() + + self.accept('escape', sys.exit) + + self.accept("arrow_left", self.incrementCameraPosition, [-1]) + self.accept("arrow_right", self.incrementCameraPosition, [1]) + self.accept("p", self.toggleInterval, [self.pandaMovement]) + self.accept("P", self.toggleInterval, [self.pandaMovement]) + self.accept("t", self.toggleInterval, [self.teapotMovement]) + self.accept("T", self.toggleInterval, [self.teapotMovement]) + self.accept("w", self.toggleInterval, [self.pandaWalk]) + self.accept("W", self.toggleInterval, [self.pandaWalk]) + self.accept("v", base.bufferViewer.toggleEnable) + self.accept("V", base.bufferViewer.toggleEnable) + self.accept("l", self.incrementLightPosition, [1]) + self.accept("L", self.incrementLightPosition, [1]) + self.accept("o", base.oobe) + self.accept('a', self.adjustPushBias, [1.1]) + self.accept('A', self.adjustPushBias, [1.1]) + self.accept('z', self.adjustPushBias, [0.9]) + self.accept('Z', self.adjustPushBias, [0.9]) + + self.LCam = base.makeCamera(LBuffer) + self.LCam.node().setScene(render) + self.LCam.node().getLens().setFov(40) + self.LCam.node().getLens().setNearFar(10, 100) + + # default values + self.pushBias = 0.04 + self.ambient = 0.2 + self.cameraSelection = 0 + self.lightSelection = 0 + + # setting up shader + render.setShaderInput('light', self.LCam) + render.setShaderInput('Ldepthmap', Ldepthmap) + render.setShaderInput('ambient', self.ambient, 0, 0, 1.0) + render.setShaderInput('texDisable', 0, 0, 0, 0) + render.setShaderInput('scale', 1, 1, 1, 1) + + # Put a shader on the Light camera. + lci = NodePath(PandaNode("Light Camera Initializer")) + lci.setShader(loader.loadShader('caster.sha')) + self.LCam.node().setInitialState(lci.getState()) + + # Put a shader on the Main camera. + # Some video cards have special hardware for shadow maps. + # If the card has that, use it. If not, use a different + # shader that does not require hardware support. + + mci = NodePath(PandaNode("Main Camera Initializer")) + if base.win.getGsg().getSupportsShadowFilter(): + mci.setShader(loader.loadShader('shadow.sha')) + else: + mci.setShader(loader.loadShader('shadow-nosupport.sha')) + base.cam.node().setInitialState(mci.getState()) + + self.incrementCameraPosition(0) + self.incrementLightPosition(0) + self.adjustPushBias(1.0) + + def toggleInterval(self, ival): + if ival.isPlaying(): + ival.pause() + else: + ival.resume() + + def incrementCameraPosition(self, n): + self.cameraSelection = (self.cameraSelection + n) % 6 + if (self.cameraSelection == 0): + base.cam.reparentTo(render) + base.cam.setPos(30, -45, 26) + base.cam.lookAt(0, 0, 0) + self.LCam.node().hideFrustum() + if (self.cameraSelection == 1): + base.cam.reparentTo(self.pandaModel) + base.cam.setPos(7, -3, 9) + base.cam.lookAt(0, 0, 0) + self.LCam.node().hideFrustum() + if (self.cameraSelection == 2): + base.cam.reparentTo(self.pandaModel) + base.cam.setPos(-7, -3, 9) + base.cam.lookAt(0, 0, 0) + self.LCam.node().hideFrustum() + if (self.cameraSelection == 3): + base.cam.reparentTo(render) + base.cam.setPos(7, -23, 12) + base.cam.lookAt(self.teapot) + self.LCam.node().hideFrustum() + if (self.cameraSelection == 4): + base.cam.reparentTo(render) + base.cam.setPos(-7, -23, 12) + base.cam.lookAt(self.teapot) + self.LCam.node().hideFrustum() + if (self.cameraSelection == 5): + base.cam.reparentTo(render) + base.cam.setPos(1000, 0, 195) + base.cam.lookAt(0, 0, 0) + self.LCam.node().showFrustum() + + def incrementLightPosition(self, n): + self.lightSelection = (self.lightSelection + n) % 2 + if (self.lightSelection == 0): + self.LCam.setPos(0, -40, 25) + self.LCam.lookAt(0, -10, 0) + self.LCam.node().getLens().setNearFar(10, 100) + if (self.lightSelection == 1): + self.LCam.setPos(0, -600, 200) + self.LCam.lookAt(0, -10, 0) + self.LCam.node().getLens().setNearFar(10, 1000) + + def shaderSupported(self): + return base.win.getGsg().getSupportsBasicShaders() and \ + base.win.getGsg().getSupportsDepthTexture() and \ + base.win.getGsg().getSupportsShadowFilter() + + def adjustPushBias(self, inc): + self.pushBias *= inc + self.inst_a.setText( + 'A/Z: Increase/Decrease the Push-Bias [%F]' % self.pushBias) + render.setShaderInput('push', self.pushBias) + +w = World() +base.run() diff --git a/samples/shadows/basic.py b/samples/shadows/basic.py new file mode 100755 index 0000000000..d6ec8671f5 --- /dev/null +++ b/samples/shadows/basic.py @@ -0,0 +1,180 @@ +#!/usr/bin/env python + +from panda3d.core import * +import sys +import os + +import direct.directbase.DirectStart +from direct.interval.IntervalGlobal import * +from direct.gui.DirectGui import OnscreenText +from direct.showbase.DirectObject import DirectObject +from direct.actor import Actor +from random import * + +# Function to put instructions on the screen. +def addInstructions(pos, msg): + return OnscreenText(text=msg, style=1, fg=(1, 1, 1, 1), scale=.05, + shadow=(0, 0, 0, 1), parent=base.a2dTopLeft, + pos=(0.08, -pos - 0.04), align=TextNode.ALeft) + +# Function to put title on the screen. +def addTitle(text): + return OnscreenText(text=text, style=1, fg=(1, 1, 1, 1), scale=.07, + parent=base.a2dBottomRight, align=TextNode.ARight, + pos=(-0.1, 0.09), shadow=(0, 0, 0, 1)) + + +class World(DirectObject): + + def __init__(self): + # Preliminary capabilities check. + + if not base.win.getGsg().getSupportsBasicShaders(): + self.t = addTitle( + "Shadow Demo: Video driver reports that shaders are not supported.") + return + if not base.win.getGsg().getSupportsDepthTexture(): + self.t = addTitle( + "Shadow Demo: Video driver reports that depth textures are not supported.") + return + + self.inst_p = addInstructions(0.06, 'P : stop/start the Panda Rotation') + self.inst_w = addInstructions(0.12, 'W : stop/start the Walk Cycle') + self.inst_t = addInstructions(0.18, 'T : stop/start the Teapot') + self.inst_l = addInstructions(0.24, 'L : move light source far or close') + self.inst_v = addInstructions(0.30, 'V: View the Depth-Texture results') + self.inst_x = addInstructions(0.36, 'Left/Right Arrow : switch camera angles') + + base.setBackgroundColor(0, 0, 0.2, 1) + + base.camLens.setNearFar(1.0, 10000) + base.camLens.setFov(75) + base.disableMouse() + + # Load the scene. + floorTex = loader.loadTexture('maps/envir-ground.jpg') + + cm = CardMaker('') + cm.setFrame(-2, 2, -2, 2) + floor = render.attachNewNode(PandaNode("floor")) + for y in range(12): + for x in range(12): + nn = floor.attachNewNode(cm.generate()) + nn.setP(-90) + nn.setPos((x - 6) * 4, (y - 6) * 4, 0) + floor.setTexture(floorTex) + floor.flattenStrong() + + self.pandaAxis = render.attachNewNode('panda axis') + self.pandaModel = Actor.Actor('panda-model', {'walk': 'panda-walk4'}) + self.pandaModel.reparentTo(self.pandaAxis) + self.pandaModel.setPos(9, 0, 0) + self.pandaModel.setScale(0.01) + self.pandaWalk = self.pandaModel.actorInterval('walk', playRate=1.8) + self.pandaWalk.loop() + self.pandaMovement = self.pandaAxis.hprInterval( + 20.0, LPoint3(-360, 0, 0), startHpr=LPoint3(0, 0, 0)) + self.pandaMovement.loop() + + self.teapot = loader.loadModel('teapot') + self.teapot.reparentTo(render) + self.teapot.setPos(0, -20, 10) + self.teapot.setShaderInput("texDisable", 1, 1, 1, 1) + self.teapotMovement = self.teapot.hprInterval(50, LPoint3(0, 360, 360)) + self.teapotMovement.loop() + + self.accept('escape', sys.exit) + + self.accept("arrow_left", self.incrementCameraPosition, [-1]) + self.accept("arrow_right", self.incrementCameraPosition, [1]) + self.accept("p", self.toggleInterval, [self.pandaMovement]) + self.accept("P", self.toggleInterval, [self.pandaMovement]) + self.accept("t", self.toggleInterval, [self.teapotMovement]) + self.accept("T", self.toggleInterval, [self.teapotMovement]) + self.accept("w", self.toggleInterval, [self.pandaWalk]) + self.accept("W", self.toggleInterval, [self.pandaWalk]) + self.accept("v", base.bufferViewer.toggleEnable) + self.accept("V", base.bufferViewer.toggleEnable) + self.accept("l", self.incrementLightPosition, [1]) + self.accept("L", self.incrementLightPosition, [1]) + self.accept("o", base.oobe) + + self.light = render.attachNewNode(Spotlight("Spot")) + self.light.node().setScene(render) + self.light.node().setShadowCaster(True) + self.light.node().showFrustum() + self.light.node().getLens().setFov(40) + self.light.node().getLens().setNearFar(10, 100) + render.setLight(self.light) + + self.alight = render.attachNewNode(AmbientLight("Ambient")) + self.alight.node().setColor(LVector4(0.2, 0.2, 0.2, 1)) + render.setLight(self.alight) + + # Important! Enable the shader generator. + render.setShaderAuto() + + # default values + self.cameraSelection = 0 + self.lightSelection = 0 + + self.incrementCameraPosition(0) + self.incrementLightPosition(0) + + def toggleInterval(self, ival): + if ival.isPlaying(): + ival.pause() + else: + ival.resume() + + def incrementCameraPosition(self, n): + self.cameraSelection = (self.cameraSelection + n) % 6 + if (self.cameraSelection == 0): + base.cam.reparentTo(render) + base.cam.setPos(30, -45, 26) + base.cam.lookAt(0, 0, 0) + self.light.node().hideFrustum() + if (self.cameraSelection == 1): + base.cam.reparentTo(self.pandaModel) + base.cam.setPos(7, -3, 9) + base.cam.lookAt(0, 0, 0) + self.light.node().hideFrustum() + if (self.cameraSelection == 2): + base.cam.reparentTo(self.pandaModel) + base.cam.setPos(-7, -3, 9) + base.cam.lookAt(0, 0, 0) + self.light.node().hideFrustum() + if (self.cameraSelection == 3): + base.cam.reparentTo(render) + base.cam.setPos(7, -23, 12) + base.cam.lookAt(self.teapot) + self.light.node().hideFrustum() + if (self.cameraSelection == 4): + base.cam.reparentTo(render) + base.cam.setPos(-7, -23, 12) + base.cam.lookAt(self.teapot) + self.light.node().hideFrustum() + if (self.cameraSelection == 5): + base.cam.reparentTo(render) + base.cam.setPos(1000, 0, 195) + base.cam.lookAt(0, 0, 0) + self.light.node().showFrustum() + + def incrementLightPosition(self, n): + self.lightSelection = (self.lightSelection + n) % 2 + if (self.lightSelection == 0): + self.light.setPos(0, -40, 25) + self.light.lookAt(0, -10, 0) + self.light.node().getLens().setNearFar(10, 100) + if (self.lightSelection == 1): + self.light.setPos(0, -600, 200) + self.light.lookAt(0, -10, 0) + self.light.node().getLens().setNearFar(10, 1000) + + def shaderSupported(self): + return base.win.getGsg().getSupportsBasicShaders() and \ + base.win.getGsg().getSupportsDepthTexture() and \ + base.win.getGsg().getSupportsShadowFilter() + +w = World() +base.run() diff --git a/samples/shadows/caster.sha b/samples/shadows/caster.sha new file mode 100644 index 0000000000..ea463d3bd2 --- /dev/null +++ b/samples/shadows/caster.sha @@ -0,0 +1,20 @@ +//Cg + +void vshader(float4 vtx_position : POSITION, + uniform float4x4 mat_modelproj, + uniform float4 k_scale, + out float4 l_position : POSITION, + out float4 l_pos : TEXCOORD0 + ) +{ + float4 position = vtx_position * k_scale; + l_pos = mul(mat_modelproj, position); + l_position = l_pos; +} + +void fshader(in float4 l_pos : TEXCOORD0, + out float4 o_color : COLOR) +{ + float z = (l_pos.z / l_pos.w) * 0.5 + 0.5; + o_color = float4(z, z, z, 1); +} diff --git a/samples/shadows/shadow-nosupport.sha b/samples/shadows/shadow-nosupport.sha new file mode 100644 index 0000000000..a486c91891 --- /dev/null +++ b/samples/shadows/shadow-nosupport.sha @@ -0,0 +1,59 @@ +//Cg + +void vshader(float4 vtx_position : POSITION, + float2 vtx_texcoord0 : TEXCOORD0, + float3 vtx_normal : NORMAL, + + uniform float4x4 trans_model_to_clip_of_light, + uniform float4x4 mat_modelproj, + uniform float4 mspos_light, + uniform float4 k_ambient, + uniform float4 k_scale, + uniform float k_push, + + out float4 l_position : POSITION, + out float2 l_texcoord0 : TEXCOORD0, + out float4 l_shadowcoord : TEXCOORD1, + out float l_smooth : TEXCOORD2, + out float4 l_lightclip : TEXCOORD3) +{ + float4 position = vtx_position * k_scale; + + // vertex position + l_position = mul(mat_modelproj, position); + + // Pass through texture coordinate for main texture. + l_texcoord0 = vtx_texcoord0; + + // Calculate the surface lighting factor. + l_smooth = saturate(dot(vtx_normal, normalize(mspos_light.xyz - position.xyz))); + + // Calculate light-space clip position. + float4 pushed = position + float4(vtx_normal * k_push, 0); + l_lightclip = mul(trans_model_to_clip_of_light, pushed); + + // Calculate shadow-map texture coordinates. + l_shadowcoord = l_lightclip * float4(0.5, 0.5, 0.5, 1.0) + + l_lightclip.w * float4(0.5, 0.5, 0.5, 0.0); +} + + +void fshader(in float2 l_texcoord0 : TEXCOORD0, + in float4 l_shadowcoord : TEXCOORD1, + in float l_smooth : TEXCOORD2, + in float4 l_lightclip : TEXCOORD3, + uniform sampler2D tex_0 : TEXUNIT0, + uniform sampler2D k_Ldepthmap : TEXUNIT1, + uniform float4 k_ambient, + uniform float4 k_texDisable, + out float4 o_color : COLOR) +{ + float3 circleoffs = float3(l_lightclip.xy / l_lightclip.w, 0); + float falloff = saturate(1.0 - dot(circleoffs, circleoffs)); + float4 baseColor = saturate(tex2D(tex_0, l_texcoord0) + k_texDisable); + float4 proj = l_shadowcoord / l_shadowcoord.w; + float mapval = f1tex2D(k_Ldepthmap, proj.xy); + float shade = (mapval > proj.z); + o_color = baseColor * (falloff * shade * l_smooth + k_ambient.x); +} + diff --git a/samples/shadows/shadow.sha b/samples/shadows/shadow.sha new file mode 100644 index 0000000000..b9ada780f5 --- /dev/null +++ b/samples/shadows/shadow.sha @@ -0,0 +1,56 @@ +//Cg + +void vshader(float4 vtx_position : POSITION, + float2 vtx_texcoord0 : TEXCOORD0, + float3 vtx_normal : NORMAL, + + uniform float4x4 trans_model_to_clip_of_light, + uniform float4x4 mat_modelproj, + uniform float4 mspos_light, + uniform float4 k_ambient, + uniform float4 k_scale, + uniform float k_push, + + out float4 l_position : POSITION, + out float2 l_texcoord0 : TEXCOORD0, + out float4 l_shadowcoord : TEXCOORD1, + out float l_smooth : TEXCOORD2, + out float4 l_lightclip : TEXCOORD3) +{ + float4 position = vtx_position * k_scale; + + // vertex position + l_position = mul(mat_modelproj, position); + + // Pass through texture coordinate for main texture. + l_texcoord0 = vtx_texcoord0; + + // Calculate the surface lighting factor. + l_smooth = saturate(dot(vtx_normal, normalize(mspos_light.xyz - position.xyz))); + + // Calculate light-space clip position. + float4 pushed = position + float4(vtx_normal * k_push, 0); + l_lightclip = mul(trans_model_to_clip_of_light, pushed); + + // Calculate shadow-map texture coordinates. + l_shadowcoord = l_lightclip * float4(0.5, 0.5, 0.5, 1.0) + + l_lightclip.w * float4(0.5, 0.5, 0.5, 0.0); +} + + +void fshader(in float2 l_texcoord0 : TEXCOORD0, + in float4 l_shadowcoord : TEXCOORD1, + in float l_smooth : TEXCOORD2, + in float4 l_lightclip : TEXCOORD3, + uniform sampler2D tex_0 : TEXUNIT0, + uniform sampler2DShadow k_Ldepthmap : TEXUNIT1, + uniform float4 k_ambient, + uniform float4 k_texDisable, + out float4 o_color : COLOR) +{ + float3 circleoffs = float3(l_lightclip.xy / l_lightclip.w, 0); + float falloff = saturate(1.0 - dot(circleoffs, circleoffs)); + float4 baseColor = saturate(tex2D(tex_0, l_texcoord0) + k_texDisable); + float shade = shadow2DProj(k_Ldepthmap, l_shadowcoord).r; + o_color = baseColor * (falloff * shade * l_smooth + k_ambient.x); +} diff --git a/samples/solar-system/models/deimos_1k_tex.jpg b/samples/solar-system/models/deimos_1k_tex.jpg new file mode 100644 index 0000000000..9ab0fbee80 Binary files /dev/null and b/samples/solar-system/models/deimos_1k_tex.jpg differ diff --git a/samples/solar-system/models/earth_1k_tex.jpg b/samples/solar-system/models/earth_1k_tex.jpg new file mode 100644 index 0000000000..97bc0662f8 Binary files /dev/null and b/samples/solar-system/models/earth_1k_tex.jpg differ diff --git a/samples/solar-system/models/mars_1k_tex.jpg b/samples/solar-system/models/mars_1k_tex.jpg new file mode 100644 index 0000000000..d78e1e7a05 Binary files /dev/null and b/samples/solar-system/models/mars_1k_tex.jpg differ diff --git a/samples/solar-system/models/mercury_1k_tex.jpg b/samples/solar-system/models/mercury_1k_tex.jpg new file mode 100644 index 0000000000..b971efd382 Binary files /dev/null and b/samples/solar-system/models/mercury_1k_tex.jpg differ diff --git a/samples/solar-system/models/moon_1k_tex.jpg b/samples/solar-system/models/moon_1k_tex.jpg new file mode 100644 index 0000000000..2a0b0d0234 Binary files /dev/null and b/samples/solar-system/models/moon_1k_tex.jpg differ diff --git a/samples/solar-system/models/phobos_1k_tex.jpg b/samples/solar-system/models/phobos_1k_tex.jpg new file mode 100644 index 0000000000..516cbec6d8 Binary files /dev/null and b/samples/solar-system/models/phobos_1k_tex.jpg differ diff --git a/samples/solar-system/models/planet_sphere.egg.pz b/samples/solar-system/models/planet_sphere.egg.pz new file mode 100644 index 0000000000..bc83ac21c1 Binary files /dev/null and b/samples/solar-system/models/planet_sphere.egg.pz differ diff --git a/samples/solar-system/models/solar_sky_sphere.egg.pz b/samples/solar-system/models/solar_sky_sphere.egg.pz new file mode 100644 index 0000000000..3ce49155e8 Binary files /dev/null and b/samples/solar-system/models/solar_sky_sphere.egg.pz differ diff --git a/samples/solar-system/models/stars_1k_tex.jpg b/samples/solar-system/models/stars_1k_tex.jpg new file mode 100644 index 0000000000..07735f1fb1 Binary files /dev/null and b/samples/solar-system/models/stars_1k_tex.jpg differ diff --git a/samples/solar-system/models/sun_1k_tex.jpg b/samples/solar-system/models/sun_1k_tex.jpg new file mode 100644 index 0000000000..42ffcd1339 Binary files /dev/null and b/samples/solar-system/models/sun_1k_tex.jpg differ diff --git a/samples/solar-system/models/venus_1k_tex.jpg b/samples/solar-system/models/venus_1k_tex.jpg new file mode 100644 index 0000000000..865af1a785 Binary files /dev/null and b/samples/solar-system/models/venus_1k_tex.jpg differ diff --git a/samples/solar-system/step1_blank_window.py b/samples/solar-system/step1_blank_window.py new file mode 100755 index 0000000000..a702a382af --- /dev/null +++ b/samples/solar-system/step1_blank_window.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python + +# Author: Shao Zhang and Phil Saltzman +# Last Updated: 2015-03-13 +# +# This tutorial is intended as a initial panda scripting lesson going over +# display initialization, loading models, placing objects, and the scene graph. +# +# Step 1: ShowBase contains the main Panda3D modules. Importing it +# initializes Panda and creates the window. The run() command causes the +# real-time simulation to begin + +from direct.showbase.ShowBase import ShowBase +base = ShowBase() + +base.run() diff --git a/samples/solar-system/step2_basic_setup.py b/samples/solar-system/step2_basic_setup.py new file mode 100755 index 0000000000..0588491b6d --- /dev/null +++ b/samples/solar-system/step2_basic_setup.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python + +# Author: Shao Zhang and Phil Saltzman +# Last Updated: 2015-03-13 +# +# This tutorial is intended as a initial panda scripting lesson going over +# display initialization, loading models, placing objects, and the scene graph. +# +# Step 2: After initializing panda, we define a class called World. We put +# all of our code in a class to provide a convenient way to keep track of +# all of the variables our project will use, and in later tutorials to handle +# keyboard input. +# The code contained in the __init__ method is executed when we instantiate +# the class (at the end of this file). Inside __init__ we will first change +# the background color of the window. We then disable the mouse-based camera +# control and set the camera position. + +# Initialize Panda and create a window +from direct.showbase.ShowBase import ShowBase +base = ShowBase() + +from panda3d.core import * # Contains most of Panda's modules +from direct.gui.DirectGui import * # Imports Gui objects we use for putting +# text on the screen +import sys + + +class World(object): # Our main class + def __init__(self): # The initialization method caused when a + # world object is created + + # Create some text overlayed on our screen. + # We will use similar commands in all of our tutorials to create titles and + # instruction guides. + self.title = OnscreenText( + text="Panda3D: Tutorial 1 - Solar System", + parent=base.a2dBottomRight, align=TextNode.A_right, + style=1, fg=(1, 1, 1, 1), pos=(-0.1, 0.1), scale=.07) + + # Make the background color black (R=0, G=0, B=0) + # instead of the default grey + base.setBackgroundColor(0, 0, 0) + + # By default, the mouse controls the camera. Often, we disable that so that + # the camera can be placed manually (if we don't do this, our placement + # commands will be overridden by the mouse control) + base.disableMouse() + + # Set the camera position (x, y, z) + camera.setPos(0, 0, 45) + + # Set the camera orientation (heading, pitch, roll) in degrees + camera.setHpr(0, -90, 0) +# end class world + +# Now that our class is defined, we create an instance of it. +# Doing so calls the __init__ method set up above +w = World() +# As usual - run() must be called before anything can be shown on screen +base.run() diff --git a/samples/solar-system/step3_load_model.py b/samples/solar-system/step3_load_model.py new file mode 100755 index 0000000000..d60be02c98 --- /dev/null +++ b/samples/solar-system/step3_load_model.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python + +# Author: Shao Zhang and Phil Saltzman +# Last Updated: 2015-03-13 +# +# This tutorial is intended as a initial panda scripting lesson going over +# display initialization, loading models, placing objects, and the scene graph. +# +# Step 3: In this step, we create a function called loadPlanets, which will +# eventually be used to load all of the planets in our simulation. For now +# we will load just the sun and and the sky-sphere we use to create the +# star-field. + +from direct.showbase.ShowBase import ShowBase +base = ShowBase() + +from panda3d.core import NodePath, TextNode +from direct.gui.DirectGui import * +import sys + + +class World(object): + def __init__(self): + # This is the initialization we had before + self.title = OnscreenText( # Create the title + text="Panda3D: Tutorial 1 - Solar System", + parent=base.a2dBottomRight, align=TextNode.A_right, + style=1, fg=(1, 1, 1, 1), pos=(-0.1, 0.1), scale=.07) + + base.setBackgroundColor(0, 0, 0) # Set the background to black + base.disableMouse() # disable mouse control of the camera + camera.setPos(0, 0, 45) # Set the camera position (X, Y, Z) + camera.setHpr(0, -90, 0) # Set the camera orientation + #(heading, pitch, roll) in degrees + + # We will now define a variable to help keep a consistent scale in + # our model. As we progress, we will continue to add variables here as we + # need them + + # The value of this variable scales the size of the planets. True scale size + # would be 1 + self.sizescale = 0.6 + + # Now that we have finished basic initialization, we call loadPlanets which + # will handle actually getting our objects in the world + self.loadPlanets() + + def loadPlanets(self): + # Here, inside our class, is where we are creating the loadPlanets function + # For now we are just loading the star-field and sun. In the next step we + # will load all of the planets + + # Loading objects in Panda is done via the command loader.loadModel, which + # takes one argument, the path to the model file. Models in Panda come in + # two types, .egg (which is readable in a text editor), and .bam (which is + # not readable but makes smaller files). When you load a file you leave the + # extension off so that it can choose the right version + + # Load model returns a NodePath, which you can think of as an object + # containing your model + + # Here we load the sky model. For all the planets we will use the same + # sphere model and simply change textures. However, even though the sky is + # a sphere, it is different from the planet model because its polygons + #(which are always one-sided in Panda) face inside the sphere instead of + # outside (this is known as a model with reversed normals). Because of + # that it has to be a separate model. + self.sky = loader.loadModel("models/solar_sky_sphere") + + # After the object is loaded, it must be placed in the scene. We do this by + # changing the parent of self.sky to render, which is a special NodePath. + # Each frame, Panda starts with render and renders everything attached to + # it. + self.sky.reparentTo(render) + + # You can set the position, orientation, and scale on a NodePath the same + # way that you set those properties on the camera. In fact, the camera is + # just another special NodePath + self.sky.setScale(40) + + # Very often, the egg file will know what textures are needed and load them + # automatically. But sometimes we want to set our textures manually, (for + # instance we want to put different textures on the same planet model) + # Loading textures works the same way as loading models, but instead of + # calling loader.loadModel, we call loader.loadTexture + self.sky_tex = loader.loadTexture("models/stars_1k_tex.jpg") + + # Finally, the following line sets our new sky texture on our sky model. + # The second argument must be one or the command will be ignored. + self.sky.setTexture(self.sky_tex, 1) + + # Now we load the sun. + self.sun = loader.loadModel("models/planet_sphere") + # Now we repeat our other steps + self.sun.reparentTo(render) + self.sun_tex = loader.loadTexture("models/sun_1k_tex.jpg") + self.sun.setTexture(self.sun_tex, 1) + # The sun is really much bigger than + self.sun.setScale(2 * self.sizescale) + # this, but to be able to see the + # planets we're making it smaller + + # end loadPlanets() + +# end class world + +# instantiate the class +w = World() +base.run() diff --git a/samples/solar-system/step4_load_system.py b/samples/solar-system/step4_load_system.py new file mode 100755 index 0000000000..e2e530a868 --- /dev/null +++ b/samples/solar-system/step4_load_system.py @@ -0,0 +1,162 @@ +#!/usr/bin/env python + +# Author: Shao Zhang and Phil Saltzman +# Last Updated: 2015-03-13 +# +# This tutorial is intended as a initial panda scripting lesson going over +# display initialization, loading models, placing objects, and the scene graph. +# +# Step 4: In this step, we will load the rest of the planets up to Mars. +# In addition to loading them, we will organize how the planets are grouped +# hierarchically in the scene. This will help us rotate them in the next step +# to give a rough simulation of the solar system. You can see them move by +# running step_5_complete_solar_system.py. + +from direct.showbase.ShowBase import ShowBase +base = ShowBase() + +from panda3d.core import NodePath, TextNode +from direct.gui.DirectGui import * +import sys + + +class World(object): + + def __init__(self): + # This is the initialization we had before + self.title = OnscreenText( # Create the title + text="Panda3D: Tutorial 1 - Solar System", + parent=base.a2dBottomRight, align=TextNode.A_right, + style=1, fg=(1, 1, 1, 1), pos=(-0.1, 0.1), scale=.07) + + base.setBackgroundColor(0, 0, 0) # Set the background to black + base.disableMouse() # disable mouse control of the camera + camera.setPos(0, 0, 45) # Set the camera position (X, Y, Z) + camera.setHpr(0, -90, 0) # Set the camera orientation + #(heading, pitch, roll) in degrees + + # This section has our variables. This time we are adding a variable to + # control the relative size of the orbits. + self.sizescale = 0.6 # relative size of planets + self.orbitscale = 10 # relative size of orbits + + self.loadPlanets() # Load our models and make them render + + def loadPlanets(self): + # Here is where we load all of the planets, and place them. + # The first thing we do is create a dummy node for each planet. A dummy + # node is simply a node path that does not have any geometry attached to it. + # This is done by .attachNewNode('name_of_new_node') + + # We do this because positioning the planets around a circular orbit could + # be done with a lot of messy sine and cosine operations. Instead, we define + # our planets to be a given distance from a dummy node, and when we turn the + # dummy, the planets will move along with it, kind of like turning the + # center of a disc and having an object at its edge move. Most attributes, + # like position, orientation, scale, texture, color, etc., are inherited + # this way. Panda deals with the fact that the objects are not attached + # directly to render (they are attached through other NodePaths to render), + # and makes sure the attributes inherit. + + # This system of attaching NodePaths to each other is called the Scene + # Graph + self.orbit_root_mercury = render.attachNewNode('orbit_root_mercury') + self.orbit_root_venus = render.attachNewNode('orbit_root_venus') + self.orbit_root_mars = render.attachNewNode('orbit_root_mars') + self.orbit_root_earth = render.attachNewNode('orbit_root_earth') + + # orbit_root_moon is like all the other orbit_root dummy nodes except that + # it will be parented to orbit_root_earth so that the moon will orbit the + # earth instead of the sun. So, the moon will first inherit + # orbit_root_moon's position and then orbit_root_earth's. There is no hard + # limit on how many objects can inherit from each other. + self.orbit_root_moon = ( + self.orbit_root_earth.attachNewNode('orbit_root_moon')) + + ############################################################### + + # These are the same steps used to load the sky model that we used in the + # last step + # Load the model for the sky + self.sky = loader.loadModel("models/solar_sky_sphere") + # Load the texture for the sky. + self.sky_tex = loader.loadTexture("models/stars_1k_tex.jpg") + # Set the sky texture to the sky model + self.sky.setTexture(self.sky_tex, 1) + # Parent the sky model to the render node so that the sky is rendered + self.sky.reparentTo(render) + # Scale the size of the sky. + self.sky.setScale(40) + + # These are the same steps we used to load the sun in the last step. + # Again, we use loader.loadModel since we're using planet_sphere more + # than once. + self.sun = loader.loadModel("models/planet_sphere") + self.sun_tex = loader.loadTexture("models/sun_1k_tex.jpg") + self.sun.setTexture(self.sun_tex, 1) + self.sun.reparentTo(render) + self.sun.setScale(2 * self.sizescale) + + # Now we load the planets, which we load using the same steps we used to + # load the sun. The only difference is that the models are not parented + # directly to render for the reasons described above. + # The values used for scale are the ratio of the planet's radius to Earth's + # radius, multiplied by our global scale variable. In the same way, the + # values used for orbit are the ratio of the planet's orbit to Earth's + # orbit, multiplied by our global orbit scale variable + + # Load mercury + self.mercury = loader.loadModel("models/planet_sphere") + self.mercury_tex = loader.loadTexture("models/mercury_1k_tex.jpg") + self.mercury.setTexture(self.mercury_tex, 1) + self.mercury.reparentTo(self.orbit_root_mercury) + # Set the position of mercury. By default, all nodes are pre assigned the + # position (0, 0, 0) when they are first loaded. We didn't reposition the + # sun and sky because they are centered in the solar system. Mercury, + # however, needs to be offset so we use .setPos to offset the + # position of mercury in the X direction with respect to its orbit radius. + # We will do this for the rest of the planets. + self.mercury.setPos(0.38 * self.orbitscale, 0, 0) + self.mercury.setScale(0.385 * self.sizescale) + + # Load Venus + self.venus = loader.loadModel("models/planet_sphere") + self.venus_tex = loader.loadTexture("models/venus_1k_tex.jpg") + self.venus.setTexture(self.venus_tex, 1) + self.venus.reparentTo(self.orbit_root_venus) + self.venus.setPos(0.72 * self.orbitscale, 0, 0) + self.venus.setScale(0.923 * self.sizescale) + + # Load Mars + self.mars = loader.loadModel("models/planet_sphere") + self.mars_tex = loader.loadTexture("models/mars_1k_tex.jpg") + self.mars.setTexture(self.mars_tex, 1) + self.mars.reparentTo(self.orbit_root_mars) + self.mars.setPos(1.52 * self.orbitscale, 0, 0) + self.mars.setScale(0.515 * self.sizescale) + + # Load Earth + self.earth = loader.loadModel("models/planet_sphere") + self.earth_tex = loader.loadTexture("models/earth_1k_tex.jpg") + self.earth.setTexture(self.earth_tex, 1) + self.earth.reparentTo(self.orbit_root_earth) + self.earth.setScale(self.sizescale) + self.earth.setPos(self.orbitscale, 0, 0) + + # The center of the moon's orbit is exactly the same distance away from + # The sun as the Earth's distance from the sun + self.orbit_root_moon.setPos(self.orbitscale, 0, 0) + + # Load the moon + self.moon = loader.loadModel("models/planet_sphere") + self.moon_tex = loader.loadTexture("models/moon_1k_tex.jpg") + self.moon.setTexture(self.moon_tex, 1) + self.moon.reparentTo(self.orbit_root_moon) + self.moon.setScale(0.1 * self.sizescale) + self.moon.setPos(0.1 * self.orbitscale, 0, 0) + # end loadPlanets() + +# end class world + +w = World() +base.run() diff --git a/samples/solar-system/step5_complete_solar_system.py b/samples/solar-system/step5_complete_solar_system.py new file mode 100755 index 0000000000..3e2a0e2bd1 --- /dev/null +++ b/samples/solar-system/step5_complete_solar_system.py @@ -0,0 +1,174 @@ +#!/usr/bin/env python + +# Author: Shao Zhang and Phil Saltzman +# Last Updated: 2015-03-13 +# +# This tutorial is intended as a initial panda scripting lesson going over +# display initialization, loading models, placing objects, and the scene graph. +# +# Step 5: Here we put the finishing touches on our solar system model by +# making the planets move. The actual code for doing the movement is covered +# in the next tutorial, but watching it move really shows what inheritance on +# the scene graph is all about. + +from direct.showbase.ShowBase import ShowBase +base = ShowBase() + +from direct.gui.DirectGui import * +from panda3d.core import TextNode +import sys + + +class World(object): + + def __init__(self): + # This is the initialization we had before + self.title = OnscreenText( # Create the title + text="Panda3D: Tutorial 1 - Solar System", + parent=base.a2dBottomRight, align=TextNode.A_right, + style=1, fg=(1, 1, 1, 1), pos=(-0.1, 0.1), scale=.07) + + base.setBackgroundColor(0, 0, 0) # Set the background to black + base.disableMouse() # disable mouse control of the camera + camera.setPos(0, 0, 45) # Set the camera position (X, Y, Z) + camera.setHpr(0, -90, 0) # Set the camera orientation + #(heading, pitch, roll) in degrees + + # Here again is where we put our global variables. Added this time are + # variables to control the relative speeds of spinning and orbits in the + # simulation + # Number of seconds a full rotation of Earth around the sun should take + self.yearscale = 60 + # Number of seconds a day rotation of Earth should take. + # It is scaled from its correct value for easier visability + self.dayscale = self.yearscale / 365.0 * 5 + self.orbitscale = 10 # Orbit scale + self.sizescale = 0.6 # Planet size scale + + self.loadPlanets() # Load and position the models + + # Finally, we call the rotatePlanets function which puts the planets, + # sun, and moon into motion. + self.rotatePlanets() + + def loadPlanets(self): + # This is the same function that we completed in the previous step + # It is unchanged in this version + + # Create the dummy nodes + self.orbit_root_mercury = render.attachNewNode('orbit_root_mercury') + self.orbit_root_venus = render.attachNewNode('orbit_root_venus') + self.orbit_root_mars = render.attachNewNode('orbit_root_mars') + self.orbit_root_earth = render.attachNewNode('orbit_root_earth') + + # The moon orbits Earth, not the sun + self.orbit_root_moon = ( + self.orbit_root_earth.attachNewNode('orbit_root_moon')) + + ############################################################### + + # Load the sky + self.sky = loader.loadModel("models/solar_sky_sphere") + self.sky_tex = loader.loadTexture("models/stars_1k_tex.jpg") + self.sky.setTexture(self.sky_tex, 1) + self.sky.reparentTo(render) + self.sky.setScale(40) + + # Load the Sun + self.sun = loader.loadModel("models/planet_sphere") + self.sun_tex = loader.loadTexture("models/sun_1k_tex.jpg") + self.sun.setTexture(self.sun_tex, 1) + self.sun.reparentTo(render) + self.sun.setScale(2 * self.sizescale) + + # Load mercury + self.mercury = loader.loadModel("models/planet_sphere") + self.mercury_tex = loader.loadTexture("models/mercury_1k_tex.jpg") + self.mercury.setTexture(self.mercury_tex, 1) + self.mercury.reparentTo(self.orbit_root_mercury) + self.mercury.setPos(0.38 * self.orbitscale, 0, 0) + self.mercury.setScale(0.385 * self.sizescale) + + # Load Venus + self.venus = loader.loadModel("models/planet_sphere") + self.venus_tex = loader.loadTexture("models/venus_1k_tex.jpg") + self.venus.setTexture(self.venus_tex, 1) + self.venus.reparentTo(self.orbit_root_venus) + self.venus.setPos(0.72 * self.orbitscale, 0, 0) + self.venus.setScale(0.923 * self.sizescale) + + # Load Mars + self.mars = loader.loadModel("models/planet_sphere") + self.mars_tex = loader.loadTexture("models/mars_1k_tex.jpg") + self.mars.setTexture(self.mars_tex, 1) + self.mars.reparentTo(self.orbit_root_mars) + self.mars.setPos(1.52 * self.orbitscale, 0, 0) + self.mars.setScale(0.515 * self.sizescale) + + # Load Earth + self.earth = loader.loadModel("models/planet_sphere") + self.earth_tex = loader.loadTexture("models/earth_1k_tex.jpg") + self.earth.setTexture(self.earth_tex, 1) + self.earth.reparentTo(self.orbit_root_earth) + self.earth.setScale(self.sizescale) + self.earth.setPos(self.orbitscale, 0, 0) + + # Offest the moon dummy node so that it is positioned properly + self.orbit_root_moon.setPos(self.orbitscale, 0, 0) + + # Load the moon + self.moon = loader.loadModel("models/planet_sphere") + self.moon_tex = loader.loadTexture("models/moon_1k_tex.jpg") + self.moon.setTexture(self.moon_tex, 1) + self.moon.reparentTo(self.orbit_root_moon) + self.moon.setScale(0.1 * self.sizescale) + self.moon.setPos(0.1 * self.orbitscale, 0, 0) + # end loadPlanets() + + def rotatePlanets(self): + # rotatePlanets creates intervals to actually use the hierarchy we created + # to turn the sun, planets, and moon to give a rough representation of the + # solar system. The next lesson will go into more depth on intervals. + self.day_period_sun = self.sun.hprInterval(20, (360, 0, 0)) + + self.orbit_period_mercury = self.orbit_root_mercury.hprInterval( + (0.241 * self.yearscale), (360, 0, 0)) + self.day_period_mercury = self.mercury.hprInterval( + (59 * self.dayscale), (360, 0, 0)) + + self.orbit_period_venus = self.orbit_root_venus.hprInterval( + (0.615 * self.yearscale), (360, 0, 0)) + self.day_period_venus = self.venus.hprInterval( + (243 * self.dayscale), (360, 0, 0)) + + self.orbit_period_earth = self.orbit_root_earth.hprInterval( + self.yearscale, (360, 0, 0)) + self.day_period_earth = self.earth.hprInterval( + self.dayscale, (360, 0, 0)) + + self.orbit_period_moon = self.orbit_root_moon.hprInterval( + (.0749 * self.yearscale), (360, 0, 0)) + self.day_period_moon = self.moon.hprInterval( + (.0749 * self.yearscale), (360, 0, 0)) + + self.orbit_period_mars = self.orbit_root_mars.hprInterval( + (1.881 * self.yearscale), (360, 0, 0)) + self.day_period_mars = self.mars.hprInterval( + (1.03 * self.dayscale), (360, 0, 0)) + + self.day_period_sun.loop() + self.orbit_period_mercury.loop() + self.day_period_mercury.loop() + self.orbit_period_venus.loop() + self.day_period_venus.loop() + self.orbit_period_earth.loop() + self.day_period_earth.loop() + self.orbit_period_moon.loop() + self.day_period_moon.loop() + self.orbit_period_mars.loop() + self.day_period_mars.loop() + # end RotatePlanets() +# end class world + +w = World() +base.run() diff --git a/samples/solar-system/step6_controllable_system.py b/samples/solar-system/step6_controllable_system.py new file mode 100755 index 0000000000..554d0f12d0 --- /dev/null +++ b/samples/solar-system/step6_controllable_system.py @@ -0,0 +1,347 @@ +#!/usr/bin/env python + +# Author: Shao Zhang and Phil Saltzman +# Last Updated: 2015-03-13 +# +# This tutorial will cover events and how they can be used in Panda +# Specifically, this lesson will use events to capture keyboard presses and +# mouse clicks to trigger actions in the world. It will also use events +# to count the number of orbits the Earth makes around the sun. This +# tutorial uses the same base code from the solar system tutorial. + +from direct.showbase.ShowBase import ShowBase +base = ShowBase() + +from panda3d.core import TextNode +from direct.interval.IntervalGlobal import * +from direct.gui.DirectGui import * +from direct.showbase.DirectObject import DirectObject +import sys + +# We start this tutorial with the standard class. However, the class is a +# subclass of an object called DirectObject. This gives the class the ability +# to listen for and respond to events. From now on the main class in every +# tutorial will be a subclass of DirectObject + + +class World(DirectObject): + # Macro-like function used to reduce the amount to code needed to create the + # on screen instructions + + def genLabelText(self, text, i): + return OnscreenText(text=text, pos=(0.06, -.06 * (i + 0.5)), fg=(1, 1, 1, 1), + parent=base.a2dTopLeft,align=TextNode.ALeft, scale=.05) + + def __init__(self): + + # The standard camera position and background initialization + base.setBackgroundColor(0, 0, 0) + base.disableMouse() + camera.setPos(0, 0, 45) + camera.setHpr(0, -90, 0) + + # The global variables we used to control the speed and size of objects + self.yearscale = 60 + self.dayscale = self.yearscale / 365.0 * 5 + self.orbitscale = 10 + self.sizescale = 0.6 + + self.loadPlanets() # Load, texture, and position the planets + self.rotatePlanets() # Set up the motion to start them moving + + # The standard title text that's in every tutorial + # Things to note: + #-fg represents the forground color of the text in (r,g,b,a) format + #-pos represents the position of the text on the screen. + # The coordinate system is a x-y based wih 0,0 as the center of the + # screen + #-align sets the alingment of the text relative to the pos argument. + # Default is center align. + #-scale set the scale of the text + #-mayChange argument lets us change the text later in the program. + # By default mayChange is set to 0. Trying to change text when + # mayChange is set to 0 will cause the program to crash. + self.title = OnscreenText( + text="Panda3D: Tutorial 3 - Events", + parent=base.a2dBottomRight, align=TextNode.A_right, + style=1, fg=(1, 1, 1, 1), pos=(-0.1, 0.1), scale=.07) + + self.mouse1EventText = self.genLabelText( + "Mouse Button 1: Toggle entire Solar System [RUNNING]", 1) + self.skeyEventText = self.genLabelText("[S]: Toggle Sun [RUNNING]", 2) + self.ykeyEventText = self.genLabelText("[Y]: Toggle Mercury [RUNNING]", 3) + self.vkeyEventText = self.genLabelText("[V]: Toggle Venus [RUNNING]", 4) + self.ekeyEventText = self.genLabelText("[E]: Toggle Earth [RUNNING]", 5) + self.mkeyEventText = self.genLabelText("[M]: Toggle Mars [RUNNING]", 6) + self.yearCounterText = self.genLabelText("0 Earth years completed", 7) + + self.yearCounter = 0 # year counter for earth years + self.simRunning = True # boolean to keep track of the + # state of the global simulation + + # Events + # Each self.accept statement creates an event handler object that will call + # the specified function when that event occurs. + # Certain events like "mouse1", "a", "b", "c" ... "z", "1", "2", "3"..."0" + # are references to keyboard keys and mouse buttons. You can also define + # your own events to be used within your program. In this tutorial, the + # event "newYear" is not tied to a physical input device, but rather + # is sent by the function that rotates the Earth whenever a revolution + # completes to tell the counter to update + # Exit the program when escape is pressed + self.accept("escape", sys.exit) + self.accept("mouse1", self.handleMouseClick) + self.accept("e", self.handleEarth) + self.accept("s", # message name + self.togglePlanet, # function to call + ["Sun", # arguments to be passed to togglePlanet + # See togglePlanet's definition below for + # an explanation of what they are + self.day_period_sun, + None, + self.skeyEventText]) + # Repeat the structure above for the other planets + self.accept("y", self.togglePlanet, + ["Mercury", self.day_period_mercury, + self.orbit_period_mercury, self.ykeyEventText]) + self.accept("v", self.togglePlanet, + ["Venus", self.day_period_venus, + self.orbit_period_venus, self.vkeyEventText]) + self.accept("m", self.togglePlanet, + ["Mars", self.day_period_mars, + self.orbit_period_mars, self.mkeyEventText]) + self.accept("newYear", self.incYear) + # end __init__ + + def handleMouseClick(self): + # When the mouse is clicked, if the simulation is running pause all the + # planets and sun, otherwise resume it + if self.simRunning: + print("Pausing Simulation") + # changing the text to reflect the change from "RUNNING" to + # "PAUSED" + self.mouse1EventText.setText( + "Mouse Button 1: Toggle entire Solar System [PAUSED]") + # For each planet, check if it is moving and if so, pause it + # Sun + if self.day_period_sun.isPlaying(): + self.togglePlanet("Sun", self.day_period_sun, None, + self.skeyEventText) + if self.day_period_mercury.isPlaying(): + self.togglePlanet("Mercury", self.day_period_mercury, + self.orbit_period_mercury, self.ykeyEventText) + # Venus + if self.day_period_venus.isPlaying(): + self.togglePlanet("Venus", self.day_period_venus, + self.orbit_period_venus, self.vkeyEventText) + #Earth and moon + if self.day_period_earth.isPlaying(): + self.togglePlanet("Earth", self.day_period_earth, + self.orbit_period_earth, self.ekeyEventText) + self.togglePlanet("Moon", self.day_period_moon, + self.orbit_period_moon) + # Mars + if self.day_period_mars.isPlaying(): + self.togglePlanet("Mars", self.day_period_mars, + self.orbit_period_mars, self.mkeyEventText) + else: + #"The simulation is paused, so resume it + print("Resuming Simulation") + self.mouse1EventText.setText( + "Mouse Button 1: Toggle entire Solar System [RUNNING]") + # the not operator does the reverse of the previous code + if not self.day_period_sun.isPlaying(): + self.togglePlanet("Sun", self.day_period_sun, None, + self.skeyEventText) + if not self.day_period_mercury.isPlaying(): + self.togglePlanet("Mercury", self.day_period_mercury, + self.orbit_period_mercury, self.ykeyEventText) + if not self.day_period_venus.isPlaying(): + self.togglePlanet("Venus", self.day_period_venus, + self.orbit_period_venus, self.vkeyEventText) + if not self.day_period_earth.isPlaying(): + self.togglePlanet("Earth", self.day_period_earth, + self.orbit_period_earth, self.ekeyEventText) + self.togglePlanet("Moon", self.day_period_moon, + self.orbit_period_moon) + if not self.day_period_mars.isPlaying(): + self.togglePlanet("Mars", self.day_period_mars, + self.orbit_period_mars, self.mkeyEventText) + # toggle self.simRunning + self.simRunning = not self.simRunning + # end handleMouseClick + + # The togglePlanet function will toggle the intervals that are given to it + # between paused and playing. + # Planet is the name to print + # Day is the interval that spins the planet + # Orbit is the interval that moves around the orbit + # Text is the OnscreenText object that needs to be updated + def togglePlanet(self, planet, day, orbit=None, text=None): + if day.isPlaying(): + print("Pausing " + planet) + state = " [PAUSED]" + else: + print("Resuming " + planet) + state = " [RUNNING]" + + # Update the onscreen text if it is given as an argument + if text: + old = text.getText() + # strip out the last segment of text after the last white space + # and append the string stored in 'state' + text.setText(old[0:old.rfind(' ')] + state) + + # toggle the day interval + self.toggleInterval(day) + # if there is an orbit interval, toggle it + if orbit: + self.toggleInterval(orbit) + # end togglePlanet + + # toggleInterval does exactly as its name implies + # It takes an interval as an argument. Then it checks to see if it is playing. + # If it is, it pauses it, otherwise it resumes it. + def toggleInterval(self, interval): + if interval.isPlaying(): + interval.pause() + else: + interval.resume() + # end toggleInterval + + # Earth needs a special buffer function because the moon is tied to it + # When the "e" key is pressed, togglePlanet is called on both the earth and + # the moon. + def handleEarth(self): + self.togglePlanet("Earth", self.day_period_earth, + self.orbit_period_earth, self.ekeyEventText) + self.togglePlanet("Moon", self.day_period_moon, + self.orbit_period_moon) + # end handleEarth + + # the function incYear increments the variable yearCounter and then updates + # the OnscreenText 'yearCounterText' every time the message "newYear" is + # sent + def incYear(self): + self.yearCounter += 1 + self.yearCounterText.setText( + str(self.yearCounter) + " Earth years completed") + # end incYear + + +######################################################################### +# Except for the one commented line below, this is all as it was before # +# Scroll down to the next comment to see an example of sending messages # +######################################################################### + + def loadPlanets(self): + self.orbit_root_mercury = render.attachNewNode('orbit_root_mercury') + self.orbit_root_venus = render.attachNewNode('orbit_root_venus') + self.orbit_root_mars = render.attachNewNode('orbit_root_mars') + self.orbit_root_earth = render.attachNewNode('orbit_root_earth') + + self.orbit_root_moon = ( + self.orbit_root_earth.attachNewNode('orbit_root_moon')) + + self.sky = loader.loadModel("models/solar_sky_sphere") + + self.sky_tex = loader.loadTexture("models/stars_1k_tex.jpg") + self.sky.setTexture(self.sky_tex, 1) + self.sky.reparentTo(render) + self.sky.setScale(40) + + self.sun = loader.loadModel("models/planet_sphere") + self.sun_tex = loader.loadTexture("models/sun_1k_tex.jpg") + self.sun.setTexture(self.sun_tex, 1) + self.sun.reparentTo(render) + self.sun.setScale(2 * self.sizescale) + + self.mercury = loader.loadModel("models/planet_sphere") + self.mercury_tex = loader.loadTexture("models/mercury_1k_tex.jpg") + self.mercury.setTexture(self.mercury_tex, 1) + self.mercury.reparentTo(self.orbit_root_mercury) + self.mercury.setPos(0.38 * self.orbitscale, 0, 0) + self.mercury.setScale(0.385 * self.sizescale) + + self.venus = loader.loadModel("models/planet_sphere") + self.venus_tex = loader.loadTexture("models/venus_1k_tex.jpg") + self.venus.setTexture(self.venus_tex, 1) + self.venus.reparentTo(self.orbit_root_venus) + self.venus.setPos(0.72 * self.orbitscale, 0, 0) + self.venus.setScale(0.923 * self.sizescale) + + self.mars = loader.loadModel("models/planet_sphere") + self.mars_tex = loader.loadTexture("models/mars_1k_tex.jpg") + self.mars.setTexture(self.mars_tex, 1) + self.mars.reparentTo(self.orbit_root_mars) + self.mars.setPos(1.52 * self.orbitscale, 0, 0) + self.mars.setScale(0.515 * self.sizescale) + + self.earth = loader.loadModel("models/planet_sphere") + self.earth_tex = loader.loadTexture("models/earth_1k_tex.jpg") + self.earth.setTexture(self.earth_tex, 1) + self.earth.reparentTo(self.orbit_root_earth) + self.earth.setScale(self.sizescale) + self.earth.setPos(self.orbitscale, 0, 0) + + self.orbit_root_moon.setPos(self.orbitscale, 0, 0) + + self.moon = loader.loadModel("models/planet_sphere") + self.moon_tex = loader.loadTexture("models/moon_1k_tex.jpg") + self.moon.setTexture(self.moon_tex, 1) + self.moon.reparentTo(self.orbit_root_moon) + self.moon.setScale(0.1 * self.sizescale) + self.moon.setPos(0.1 * self.orbitscale, 0, 0) + + def rotatePlanets(self): + self.day_period_sun = self.sun.hprInterval(20, (360, 0, 0)) + + self.orbit_period_mercury = self.orbit_root_mercury.hprInterval( + (0.241 * self.yearscale), (360, 0, 0)) + self.day_period_mercury = self.mercury.hprInterval( + (59 * self.dayscale), (360, 0, 0)) + + self.orbit_period_venus = self.orbit_root_venus.hprInterval( + (0.615 * self.yearscale), (360, 0, 0)) + self.day_period_venus = self.venus.hprInterval( + (243 * self.dayscale), (360, 0, 0)) + + # Here the earth interval has been changed to rotate like the rest of the + # planets and send a message before it starts turning again. To send a + # message, the call is simply messenger.send("message"). The "newYear" + # message is picked up by the accept("newYear"...) statement earlier, and + # calls the incYear function as a result + self.orbit_period_earth = Sequence( + self.orbit_root_earth.hprInterval( + self.yearscale, (360, 0, 0)), + Func(messenger.send, "newYear")) + self.day_period_earth = self.earth.hprInterval( + self.dayscale, (360, 0, 0)) + + self.orbit_period_moon = self.orbit_root_moon.hprInterval( + (.0749 * self.yearscale), (360, 0, 0)) + self.day_period_moon = self.moon.hprInterval( + (.0749 * self.yearscale), (360, 0, 0)) + + self.orbit_period_mars = self.orbit_root_mars.hprInterval( + (1.881 * self.yearscale), (360, 0, 0)) + self.day_period_mars = self.mars.hprInterval( + (1.03 * self.dayscale), (360, 0, 0)) + + self.day_period_sun.loop() + self.orbit_period_mercury.loop() + self.day_period_mercury.loop() + self.orbit_period_venus.loop() + self.day_period_venus.loop() + self.orbit_period_earth.loop() + self.day_period_earth.loop() + self.orbit_period_moon.loop() + self.day_period_moon.loop() + self.orbit_period_mars.loop() + self.day_period_mars.loop() + # end RotatePlanets() + +# end class world + +w = World() +base.run()