{#
 # Copyright 2016 The Cobalt Authors. All Rights Reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
 #
 #     http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #}
// Copyright {{today.year}} The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// clang-format off

// This file has been auto-generated by {{code_generator}}. DO NOT MODIFY!
// Auto-generated from template: {{template_path}}

{% if conditional %}

// This must be included above the check for {{conditional}}, since
// {{conditional}} may be defined within.
#include "cobalt/bindings/shared/idl_conditional_macros.h"

#if defined({{conditional}})

{% endif %}
{% block includes %}
#include "{{header_file}}"

#include "base/debug/trace_event.h"
#include "cobalt/base/polymorphic_downcast.h"
#include "cobalt/script/global_environment.h"
#include "cobalt/script/script_value.h"
#include "cobalt/script/value_handle.h"
{% for include in implementation_includes %}
#include "{{include}}"
{% endfor %}
{% endblock includes %}

namespace {
{% block using_directives %}
using {{components|join('::')}}::{{impl_class}};
using {{components|join('::')}}::{{binding_class}};
{% for used_class in forward_declarations %}
{% if used_class.conditional %}
#if defined({{used_class.conditional}})
{% endif %}
using {{used_class.fully_qualified_name}};
{% if used_class.conditional %}
#endif  // defined({{used_class.conditional}})
{% endif %}
{% endfor %}
using cobalt::script::CallbackInterfaceTraits;
using cobalt::script::GlobalEnvironment;
using cobalt::script::ScriptValue;
using cobalt::script::ValueHandle;
using cobalt::script::ValueHandle;
using cobalt::script::ValueHandleHolder;
using cobalt::script::Wrappable;
{% endblock using_directives %}
{% block top_level_unnamed_namespace %}
{% endblock top_level_unnamed_namespace %}
}  // namespace

{% for component in components %}
namespace {{component}} {
{% endfor %}

{% block implementation %}
{% endblock implementation %}

{% for component in components|reverse %}
}  // namespace {{component}}
{% endfor %}

{% if is_global_interface %}
{% block create_global_object_impl %}
{% endblock create_global_object_impl %}
{% endif %}

{% if conditional %}
#endif  // defined({{conditional}})
{% endif %}
